PxQueryReport.h

Go to the documentation of this file.
00001 // This code contains NVIDIA Confidential Information and is disclosed to you
00002 // under a form of NVIDIA software license agreement provided separately to you.
00003 //
00004 // Notice
00005 // NVIDIA Corporation and its licensors retain all intellectual property and
00006 // proprietary rights in and to this software and related documentation and
00007 // any modifications thereto. Any use, reproduction, disclosure, or
00008 // distribution of this software and related documentation without an express
00009 // license agreement from NVIDIA Corporation is strictly prohibited.
00010 //
00011 // ALL NVIDIA DESIGN SPECIFICATIONS, CODE ARE PROVIDED "AS IS.". NVIDIA MAKES
00012 // NO WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO
00013 // THE MATERIALS, AND EXPRESSLY DISCLAIMS ALL IMPLIED WARRANTIES OF NONINFRINGEMENT,
00014 // MERCHANTABILITY, AND FITNESS FOR A PARTICULAR PURPOSE.
00015 //
00016 // Information and code furnished is believed to be accurate and reliable.
00017 // However, NVIDIA Corporation assumes no responsibility for the consequences of use of such
00018 // information or for any infringement of patents or other rights of third parties that may
00019 // result from its use. No license is granted by implication or otherwise under any patent
00020 // or patent rights of NVIDIA Corporation. Details are subject to change without notice.
00021 // This code supersedes and replaces all information previously supplied.
00022 // NVIDIA Corporation products are not authorized for use as critical
00023 // components in life support devices or systems without express written approval of
00024 // NVIDIA Corporation.
00025 //
00026 // Copyright (c) 2008-2017 NVIDIA Corporation. All rights reserved.
00027 // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved.
00028 // Copyright (c) 2001-2004 NovodeX AG. All rights reserved.  
00029 
00030 
00031 #ifndef PX_PHYSICS_NX_SCENEQUERYREPORT
00032 #define PX_PHYSICS_NX_SCENEQUERYREPORT
00033 
00036 #include "PxPhysXConfig.h"
00037 #include "foundation/PxVec3.h"
00038 #include "foundation/PxFlags.h"
00039 
00040 #if !PX_DOXYGEN
00041 namespace physx
00042 {
00043 #endif
00044 
00045 class PxShape;
00046 class PxRigidActor;
00047 
00061 struct PxHitFlag
00062 {
00063     enum Enum
00064     {
00065         ePOSITION                   = (1<<0),   
00066         eNORMAL                     = (1<<1),   
00067         PX_DEPRECATED eDISTANCE     = (1<<2),   
00068         eUV                         = (1<<3),   
00069         eASSUME_NO_INITIAL_OVERLAP  = (1<<4),   
00070 
00071         eMESH_MULTIPLE              = (1<<5),   
00072         eMESH_ANY                   = (1<<6),   
00073 
00074         eMESH_BOTH_SIDES            = (1<<7),   
00075 
00076 
00077         ePRECISE_SWEEP              = (1<<8),   
00078 
00079         eMTD                        = (1<<9),   
00080         eFACE_INDEX                 = (1<<10),  
00081 
00082         eDEFAULT                    = ePOSITION|eNORMAL|eDISTANCE|eFACE_INDEX,
00083 
00085         eMODIFIABLE_FLAGS           = eMESH_MULTIPLE|eMESH_BOTH_SIDES|eASSUME_NO_INITIAL_OVERLAP|ePRECISE_SWEEP
00086     };
00087 };
00088 
00089 
00095 PX_FLAGS_TYPEDEF(PxHitFlag, PxU16)
00096 
00097 
00104 struct PxActorShape
00105 {
00106     PX_INLINE PxActorShape() : actor(NULL), shape(NULL) {}
00107     PX_INLINE PxActorShape(PxRigidActor* a, PxShape* s) : actor(a), shape(s) {}
00108 
00109     PxRigidActor*   actor;
00110     PxShape*        shape;
00111 };
00112 
00113 
00117 struct PxQueryHit : public PxActorShape
00118 {
00119     PX_INLINE           PxQueryHit() : faceIndex(0xFFFFffff) {}
00120 
00129     PxU32               faceIndex;
00130 };
00131 
00138 struct PxLocationHit : public PxQueryHit
00139 {
00140     PX_INLINE           PxLocationHit() : flags(0), position(PxVec3(0)), normal(PxVec3(0)), distance(PX_MAX_REAL)   {}
00141 
00148     PX_INLINE bool      hadInitialOverlap() const { return (distance <= 0.0f); }
00149 
00150     // the following fields are set in accordance with the #PxHitFlags
00151     PxHitFlags          flags;      
00152     PxVec3              position;   
00153 
00154     PxVec3              normal;     
00155 
00160     PxF32               distance;
00161 };
00162 
00163 
00175 struct PxRaycastHit : public PxLocationHit
00176 {
00177     PX_INLINE           PxRaycastHit() : u(0.0f), v(0.0f)   {}
00178 
00179     // the following fields are set in accordance with the #PxHitFlags
00180 
00181     PxReal  u, v;           
00182 #if !PX_P64_FAMILY
00183     PxU32   padTo16Bytes[3];
00184 #endif
00185 };
00186 
00187 
00193 struct PxOverlapHit: public PxQueryHit { PxU32 padTo16Bytes; };
00194 
00195 
00201 struct PxSweepHit : public PxLocationHit
00202 {
00203     PX_INLINE           PxSweepHit() {}
00204 
00205     PxU32               padTo16Bytes;
00206 };
00207 
00208 
00217 typedef bool PxAgain;
00218 
00219 
00233 template<typename HitType>
00234 struct PxHitCallback
00235 {
00236     HitType     block;          
00237     bool        hasBlock;       
00238 
00239     HitType*    touches;        
00240 
00245     PxU32       maxNbTouches;
00246 
00250     PxU32       nbTouches;
00251 
00263     PxHitCallback(HitType* aTouches, PxU32 aMaxNbTouches)
00264         : hasBlock(false), touches(aTouches), maxNbTouches(aMaxNbTouches), nbTouches(0)
00265     {}
00266 
00287     virtual PxAgain processTouches(const HitType* buffer, PxU32 nbHits) = 0;
00288 
00289     virtual void finalizeQuery() {} 
00290 
00291     virtual ~PxHitCallback() {}
00292 
00294     PX_FORCE_INLINE bool hasAnyHits() { return (hasBlock || (nbTouches > 0)); }
00295 };
00296 
00297 
00311 template<typename HitType>
00312 struct PxHitBuffer : public PxHitCallback<HitType>
00313 {
00324     PxHitBuffer(HitType* aTouches = NULL, PxU32 aMaxNbTouches = 0) : PxHitCallback<HitType>(aTouches, aMaxNbTouches) {}
00325 
00327     PX_INLINE PxU32             getNbAnyHits() const                { return getNbTouches() + PxU32(this->hasBlock); }
00329     PX_INLINE const HitType&    getAnyHit(const PxU32 index) const  { PX_ASSERT(index < getNbTouches() + PxU32(this->hasBlock));
00330                                                                         return index < getNbTouches() ? getTouches()[index] : this->block; }
00331 
00332     PX_INLINE PxU32             getNbTouches() const                { return this->nbTouches; }
00333     PX_INLINE const HitType*    getTouches() const                  { return this->touches; }
00334     PX_INLINE const HitType&    getTouch(const PxU32 index) const   { PX_ASSERT(index < getNbTouches()); return getTouches()[index]; }
00335     PX_INLINE PxU32             getMaxNbTouches() const             { return this->maxNbTouches; }
00336 
00337     virtual ~PxHitBuffer() {}
00338 
00339 protected:
00340     // stops after the first callback
00341     virtual PxAgain processTouches(const HitType* buffer, PxU32 nbHits) { PX_UNUSED(buffer); PX_UNUSED(nbHits); return false; }
00342 };
00343 
00344 
00346 typedef PxHitCallback<PxRaycastHit> PxRaycastCallback;
00347 
00349 typedef PxHitCallback<PxOverlapHit> PxOverlapCallback;
00350 
00352 typedef PxHitCallback<PxSweepHit> PxSweepCallback;
00353 
00355 typedef PxHitBuffer<PxRaycastHit> PxRaycastBuffer;
00356 
00358 typedef PxHitBuffer<PxOverlapHit> PxOverlapBuffer;
00359 
00361 typedef PxHitBuffer<PxSweepHit> PxSweepBuffer;
00362 
00364 template <int N>
00365 struct PxRaycastBufferN : public PxHitBuffer<PxRaycastHit>
00366 {
00367     PxRaycastHit hits[N];
00368     PxRaycastBufferN() : PxHitBuffer<PxRaycastHit>(hits, N) {}
00369 };
00370 
00372 template <int N>
00373 struct PxOverlapBufferN : public PxHitBuffer<PxOverlapHit>
00374 {
00375     PxOverlapHit hits[N];
00376     PxOverlapBufferN() : PxHitBuffer<PxOverlapHit>(hits, N) {}
00377 };
00378 
00380 template <int N>
00381 struct PxSweepBufferN : public PxHitBuffer<PxSweepHit>
00382 {
00383     PxSweepHit hits[N];
00384     PxSweepBufferN() : PxHitBuffer<PxSweepHit>(hits, N) {}
00385 };
00386 
00387 #if !PX_DOXYGEN
00388 } // namespace physx
00389 #endif
00390 
00392 #endif


Copyright © 2008-2017 NVIDIA Corporation, 2701 San Tomas Expressway, Santa Clara, CA 95050 U.S.A. All rights reserved. www.nvidia.com