00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
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
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
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
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 }
00389 #endif
00390
00392 #endif