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
00032 #ifndef PX_PHYSICS_CCT_CONTROLLER
00033 #define PX_PHYSICS_CCT_CONTROLLER
00034
00038 #include "characterkinematic/PxCharacter.h"
00039 #include "characterkinematic/PxExtended.h"
00040 #include "characterkinematic/PxControllerObstacles.h"
00041 #include "PxQueryFiltering.h"
00042 #include "foundation/PxErrorCallback.h"
00043
00044 #if !PX_DOXYGEN
00045 namespace physx
00046 {
00047 #endif
00048
00052 struct PxControllerShapeType
00053 {
00054 enum Enum
00055 {
00061 eBOX,
00062
00068 eCAPSULE,
00069
00070 eFORCE_DWORD = 0x7fffffff
00071 };
00072 };
00073
00074 class PxShape;
00075 class PxScene;
00076 class PxController;
00077 class PxRigidDynamic;
00078 class PxMaterial;
00079 struct PxFilterData;
00080 class PxQueryFilterCallback;
00081 class PxControllerBehaviorCallback;
00082 class PxObstacleContext;
00083 class PxObstacle;
00084
00090 struct PxControllerNonWalkableMode
00091 {
00092 enum Enum
00093 {
00094 ePREVENT_CLIMBING,
00095 ePREVENT_CLIMBING_AND_FORCE_SLIDING
00096 };
00097 };
00098
00102 struct PxControllerCollisionFlag
00103 {
00104 enum Enum
00105 {
00106 eCOLLISION_SIDES = (1<<0),
00107 eCOLLISION_UP = (1<<1),
00108 eCOLLISION_DOWN = (1<<2)
00109 };
00110 };
00111
00117 typedef PxFlags<PxControllerCollisionFlag::Enum, PxU8> PxControllerCollisionFlags;
00118 PX_FLAGS_OPERATORS(PxControllerCollisionFlag::Enum, PxU8)
00119
00120
00121
00124 struct PxControllerState
00125 {
00126 PxVec3 deltaXP;
00127 PxShape* touchedShape;
00128 PxRigidActor* touchedActor;
00129 ObstacleHandle touchedObstacleHandle;
00130 PxU32 collisionFlags;
00131 bool standOnAnotherCCT;
00132 bool standOnObstacle;
00133 bool isMovingUp;
00134 };
00135
00139 struct PxControllerStats
00140 {
00141 PxU16 nbIterations;
00142 PxU16 nbFullUpdates;
00143 PxU16 nbPartialUpdates;
00144 PxU16 nbTessellation;
00145 };
00146
00150 struct PxControllerHit
00151 {
00152 PxController* controller;
00153 PxExtendedVec3 worldPos;
00154 PxVec3 worldNormal;
00155 PxVec3 dir;
00156 PxF32 length;
00157 };
00158
00164 struct PxControllerShapeHit : public PxControllerHit
00165 {
00166 PxShape* shape;
00167 PxRigidActor* actor;
00168 PxU32 triangleIndex;
00169 };
00170
00176 struct PxControllersHit : public PxControllerHit
00177 {
00178 PxController* other;
00179 };
00180
00186 struct PxControllerObstacleHit : public PxControllerHit
00187 {
00188 const void* userData;
00189 };
00190
00198 class PxUserControllerHitReport
00199 {
00200 public:
00201
00211 virtual void onShapeHit(const PxControllerShapeHit& hit) = 0;
00212
00220 virtual void onControllerHit(const PxControllersHit& hit) = 0;
00221
00229 virtual void onObstacleHit(const PxControllerObstacleHit& hit) = 0;
00230
00231 protected:
00232 virtual ~PxUserControllerHitReport(){}
00233 };
00234
00235
00247 class PxControllerFilterCallback
00248 {
00249 public:
00250 virtual ~PxControllerFilterCallback(){}
00251
00259 virtual bool filter(const PxController& a, const PxController& b) = 0;
00260 };
00261
00279 class PxControllerFilters
00280 {
00281 public:
00282
00283 PX_INLINE PxControllerFilters(const PxFilterData* filterData=NULL, PxQueryFilterCallback* cb=NULL, PxControllerFilterCallback* cctFilterCb=NULL) :
00284 mFilterData (filterData),
00285 mFilterCallback (cb),
00286 mFilterFlags (PxQueryFlag::eSTATIC|PxQueryFlag::eDYNAMIC|PxQueryFlag::ePREFILTER),
00287 mCCTFilterCallback (cctFilterCb)
00288 {}
00289
00290
00291 const PxFilterData* mFilterData;
00292
00293 PxQueryFilterCallback* mFilterCallback;
00294 PxQueryFlags mFilterFlags;
00295
00296 PxControllerFilterCallback* mCCTFilterCallback;
00297 };
00298
00304 class PxControllerDesc
00305 {
00306 public:
00307
00313 PX_INLINE virtual bool isValid() const;
00314
00322 PX_INLINE PxControllerShapeType::Enum getType() const { return mType; }
00323
00331 PxExtendedVec3 position;
00332
00341 PxVec3 upDirection;
00342
00357 PxF32 slopeLimit;
00358
00370 PxF32 invisibleWallHeight;
00371
00395 PxF32 maxJumpHeight;
00396
00408 PxF32 contactOffset;
00409
00421 PxF32 stepOffset;
00422
00430 PxF32 density;
00431
00440 PxF32 scaleCoeff;
00441
00450 PxF32 volumeGrowth;
00451
00463 PxUserControllerHitReport* reportCallback;
00464
00476 PxControllerBehaviorCallback* behaviorCallback;
00477
00487 PxControllerNonWalkableMode::Enum nonWalkableMode;
00488
00498 PxMaterial* material;
00499
00511 bool registerDeletionListener;
00512
00518 void* userData;
00519
00520 protected:
00521 const PxControllerShapeType::Enum mType;
00522
00526 PX_INLINE PxControllerDesc(PxControllerShapeType::Enum);
00527 PX_INLINE virtual ~PxControllerDesc();
00528
00532 PX_INLINE PxControllerDesc(const PxControllerDesc&);
00533
00537 PX_INLINE PxControllerDesc& operator=(const PxControllerDesc&);
00538
00539 PX_INLINE void copy(const PxControllerDesc&);
00540 };
00541
00542 PX_INLINE PxControllerDesc::PxControllerDesc(PxControllerShapeType::Enum t) : mType(t)
00543 {
00544 upDirection = PxVec3(0.0f, 1.0f, 0.0f);
00545 slopeLimit = 0.707f;
00546 contactOffset = 0.1f;
00547 stepOffset = 0.5f;
00548 density = 10.0f;
00549 scaleCoeff = 0.8f;
00550 volumeGrowth = 1.5f;
00551 reportCallback = NULL;
00552 behaviorCallback = NULL;
00553 userData = NULL;
00554 nonWalkableMode = PxControllerNonWalkableMode::ePREVENT_CLIMBING;
00555 position.x = PxExtended(0.0);
00556 position.y = PxExtended(0.0);
00557 position.z = PxExtended(0.0);
00558 material = NULL;
00559 invisibleWallHeight = 0.0f;
00560 maxJumpHeight = 0.0f;
00561 registerDeletionListener = true;
00562 }
00563
00564 PX_INLINE PxControllerDesc::PxControllerDesc(const PxControllerDesc& other) : mType(other.mType)
00565 {
00566 copy(other);
00567 }
00568
00569 PX_INLINE PxControllerDesc& PxControllerDesc::operator=(const PxControllerDesc& other)
00570 {
00571 copy(other);
00572 return *this;
00573 }
00574
00575 PX_INLINE void PxControllerDesc::copy(const PxControllerDesc& other)
00576 {
00577 upDirection = other.upDirection;
00578 slopeLimit = other.slopeLimit;
00579 contactOffset = other.contactOffset;
00580 stepOffset = other.stepOffset;
00581 density = other.density;
00582 scaleCoeff = other.scaleCoeff;
00583 volumeGrowth = other.volumeGrowth;
00584 reportCallback = other.reportCallback;
00585 behaviorCallback = other.behaviorCallback;
00586 userData = other.userData;
00587 nonWalkableMode = other.nonWalkableMode;
00588 position.x = other.position.x;
00589 position.y = other.position.y;
00590 position.z = other.position.z;
00591 material = other.material;
00592 invisibleWallHeight = other.invisibleWallHeight;
00593 maxJumpHeight = other.maxJumpHeight;
00594 registerDeletionListener = other.registerDeletionListener;
00595 }
00596
00597 PX_INLINE PxControllerDesc::~PxControllerDesc()
00598 {
00599 }
00600
00601 PX_INLINE bool PxControllerDesc::isValid() const
00602 {
00603 if( mType!=PxControllerShapeType::eBOX
00604 && mType!=PxControllerShapeType::eCAPSULE)
00605 return false;
00606 if(scaleCoeff<0.0f) return false;
00607 if(volumeGrowth<1.0f) return false;
00608 if(density<0.0f) return false;
00609 if(slopeLimit<0.0f) return false;
00610 if(stepOffset<0.0f) return false;
00611 if(contactOffset<=0.0f) return false;
00612 if(!material) return false;
00613
00614 return true;
00615 }
00616
00617
00623 class PxController
00624 {
00625 public:
00626
00627
00628
00629
00630
00631
00632
00633
00634
00635
00636
00637
00638
00639
00645 virtual PxControllerShapeType::Enum getType() const = 0;
00646
00650 virtual void release() = 0;
00651
00663 virtual PxControllerCollisionFlags move(const PxVec3& disp, PxF32 minDist, PxF32 elapsedTime, const PxControllerFilters& filters, const PxObstacleContext* obstacles=NULL) = 0;
00664
00680 virtual bool setPosition(const PxExtendedVec3& position) = 0;
00681
00695 virtual const PxExtendedVec3& getPosition() const = 0;
00696
00713 virtual bool setFootPosition(const PxExtendedVec3& position) = 0;
00714
00724 virtual PxExtendedVec3 getFootPosition() const = 0;
00725
00733 virtual PxRigidDynamic* getActor() const = 0;
00734
00742 virtual void setStepOffset(const PxF32 offset) =0;
00743
00751 virtual PxF32 getStepOffset() const =0;
00752
00760 virtual void setNonWalkableMode(PxControllerNonWalkableMode::Enum flag) = 0;
00761
00769 virtual PxControllerNonWalkableMode::Enum getNonWalkableMode() const = 0;
00770
00778 virtual PxF32 getContactOffset() const =0;
00779
00787 virtual void setContactOffset(PxF32 offset) =0;
00788
00796 virtual PxVec3 getUpDirection() const =0;
00797
00805 virtual void setUpDirection(const PxVec3& up) =0;
00806
00814 virtual PxF32 getSlopeLimit() const =0;
00815
00827 virtual void setSlopeLimit(PxF32 slopeLimit) =0;
00828
00844 virtual void invalidateCache() = 0;
00845
00851 virtual PxScene* getScene() = 0;
00852
00860 virtual void* getUserData() const = 0;
00861
00869 virtual void setUserData(void* userData) = 0;
00870
00878 virtual void getState(PxControllerState& state) const = 0;
00879
00887 virtual void getStats(PxControllerStats& stats) const = 0;
00888
00899 virtual void resize(PxReal height) = 0;
00900
00901 protected:
00902 PX_INLINE PxController() {}
00903 virtual ~PxController() {}
00904 };
00905
00906 #if !PX_DOXYGEN
00907 }
00908 #endif
00909
00911 #endif