PxController.h
Go to the documentation of this file.
1 //
2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions
4 // are met:
5 // * Redistributions of source code must retain the above copyright
6 // notice, this list of conditions and the following disclaimer.
7 // * Redistributions in binary form must reproduce the above copyright
8 // notice, this list of conditions and the following disclaimer in the
9 // documentation and/or other materials provided with the distribution.
10 // * Neither the name of NVIDIA CORPORATION nor the names of its
11 // contributors may be used to endorse or promote products derived
12 // from this software without specific prior written permission.
13 //
14 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
15 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
18 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
21 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
22 // OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 //
26 // Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved.
27 // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved.
28 // Copyright (c) 2001-2004 NovodeX AG. All rights reserved.
29 
30 
31 
32 #ifndef PX_PHYSICS_CCT_CONTROLLER
33 #define PX_PHYSICS_CCT_CONTROLLER
34 
40 #include "PxQueryFiltering.h"
42 
43 #if !PX_DOXYGEN
44 namespace physx
45 {
46 #endif
47 
52 {
53  enum Enum
54  {
61 
68 
69  eFORCE_DWORD = 0x7fffffff
70  };
71 };
72 
73 class PxShape;
74 class PxScene;
75 class PxController;
76 class PxRigidDynamic;
77 class PxMaterial;
78 struct PxFilterData;
81 class PxObstacleContext;
82 class PxObstacle;
83 
90 {
91  enum Enum
92  {
94  ePREVENT_CLIMBING_AND_FORCE_SLIDING
95  };
96 };
97 
102 {
103  enum Enum
104  {
105  eCOLLISION_SIDES = (1<<0),
106  eCOLLISION_UP = (1<<1),
107  eCOLLISION_DOWN = (1<<2)
108  };
109 };
110 
117 PX_FLAGS_OPERATORS(PxControllerCollisionFlag::Enum, PxU8)
118 
119 
120 
124 {
128  ObstacleHandle touchedObstacleHandle; // Obstacle on which the CCT is standing
132  bool isMovingUp;
133 };
134 
139 {
144 };
145 
150 {
156 };
157 
164 {
168 };
169 
176 {
178 };
179 
186 {
187  const void* userData;
188 };
189 
198 {
199 public:
200 
210  virtual void onShapeHit(const PxControllerShapeHit& hit) = 0;
211 
219  virtual void onControllerHit(const PxControllersHit& hit) = 0;
220 
228  virtual void onObstacleHit(const PxControllerObstacleHit& hit) = 0;
229 
230 protected:
232 };
233 
234 
247 {
248 public:
250 
258  virtual bool filter(const PxController& a, const PxController& b) = 0;
259 };
260 
279 {
280  public:
281 
282  PX_INLINE PxControllerFilters(const PxFilterData* filterData=NULL, PxQueryFilterCallback* cb=NULL, PxControllerFilterCallback* cctFilterCb=NULL) :
283  mFilterData (filterData),
284  mFilterCallback (cb),
285  mFilterFlags (PxQueryFlag::eSTATIC|PxQueryFlag::eDYNAMIC|PxQueryFlag::ePREFILTER),
286  mCCTFilterCallback (cctFilterCb)
287  {}
288 
289  // CCT-vs-shapes:
291  PxQueryFilterCallback* mFilterCallback;
294  // CCT-vs-CCT:
296 };
297 
304 {
305 public:
306 
312  PX_INLINE virtual bool isValid() const;
313 
322 
331 
341 
357 
370 
395 
408 
421 
430 
440 
450 
463 
476 
487 
498 
511 
517  void* userData;
518 
519 protected:
521 
526  PX_INLINE virtual ~PxControllerDesc();
527 
532 
536  PX_INLINE PxControllerDesc& operator=(const PxControllerDesc&);
537 
538  PX_INLINE void copy(const PxControllerDesc&);
539 };
540 
542 {
543  upDirection = PxVec3(0.0f, 1.0f, 0.0f);
544  slopeLimit = 0.707f;
545  contactOffset = 0.1f;
546  stepOffset = 0.5f;
547  density = 10.0f;
548  scaleCoeff = 0.8f;
549  volumeGrowth = 1.5f;
550  reportCallback = NULL;
551  behaviorCallback = NULL;
552  userData = NULL;
554  position.x = PxExtended(0.0);
555  position.y = PxExtended(0.0);
556  position.z = PxExtended(0.0);
557  material = NULL;
558  invisibleWallHeight = 0.0f;
559  maxJumpHeight = 0.0f;
561 }
562 
564 {
565  copy(other);
566 }
567 
569 {
570  copy(other);
571  return *this;
572 }
573 
575 {
576  upDirection = other.upDirection;
577  slopeLimit = other.slopeLimit;
579  stepOffset = other.stepOffset;
580  density = other.density;
581  scaleCoeff = other.scaleCoeff;
582  volumeGrowth = other.volumeGrowth;
585  userData = other.userData;
587  position.x = other.position.x;
588  position.y = other.position.y;
589  position.z = other.position.z;
590  material = other.material;
594 }
595 
597 {
598 }
599 
601 {
604  return false;
605  if(scaleCoeff<0.0f) return false;
606  if(volumeGrowth<1.0f) return false;
607  if(density<0.0f) return false;
608  if(slopeLimit<0.0f) return false;
609  if(stepOffset<0.0f) return false;
610  if(contactOffset<=0.0f) return false;
611  if(!material) return false;
612  if (!toVec3(position).isFinite())return false; //the float version needs to be finite otherwise actor creation will fail.
613 
614 
615  return true;
616 }
617 
618 
625 {
626 public:
627  //*********************************************************************
628  // DEPRECATED FUNCTIONS:
629  //
630  // PX_DEPRECATED virtual void setInteraction(PxCCTInteractionMode::Enum flag) = 0;
631  // PX_DEPRECATED virtual PxCCTInteractionMode::Enum getInteraction() const = 0;
632  // PX_DEPRECATED virtual void setGroupsBitmask(PxU32 bitmask) = 0;
633  // PX_DEPRECATED virtual PxU32 getGroupsBitmask() const = 0;
634  //
635  // => replaced with:
636  //
637  // PxControllerFilters::mCCTFilterCallback. Please define a PxControllerFilterCallback object and emulate the old interaction mode there.
638  //
639  //*********************************************************************
640 
646  virtual PxControllerShapeType::Enum getType() const = 0;
647 
651  virtual void release() = 0;
652 
664  virtual PxControllerCollisionFlags move(const PxVec3& disp, PxF32 minDist, PxF32 elapsedTime, const PxControllerFilters& filters, const PxObstacleContext* obstacles=NULL) = 0;
665 
681  virtual bool setPosition(const PxExtendedVec3& position) = 0;
682 
696  virtual const PxExtendedVec3& getPosition() const = 0;
697 
714  virtual bool setFootPosition(const PxExtendedVec3& position) = 0;
715 
725  virtual PxExtendedVec3 getFootPosition() const = 0;
726 
734  virtual PxRigidDynamic* getActor() const = 0;
735 
743  virtual void setStepOffset(const PxF32 offset) =0;
744 
752  virtual PxF32 getStepOffset() const =0;
753 
762 
771 
779  virtual PxF32 getContactOffset() const =0;
780 
788  virtual void setContactOffset(PxF32 offset) =0;
789 
797  virtual PxVec3 getUpDirection() const =0;
798 
806  virtual void setUpDirection(const PxVec3& up) =0;
807 
815  virtual PxF32 getSlopeLimit() const =0;
816 
828  virtual void setSlopeLimit(PxF32 slopeLimit) =0;
829 
845  virtual void invalidateCache() = 0;
846 
852  virtual PxScene* getScene() = 0;
853 
861  virtual void* getUserData() const = 0;
862 
870  virtual void setUserData(void* userData) = 0;
871 
879  virtual void getState(PxControllerState& state) const = 0;
880 
888  virtual void getStats(PxControllerStats& stats) const = 0;
889 
900  virtual void resize(PxReal height) = 0;
901 
902 protected:
904  virtual ~PxController() {}
905 };
906 
907 #if !PX_DOXYGEN
908 } // namespace physx
909 #endif
910 
912 #endif
bool standOnObstacle
Are we standing on a user-defined obstacle?
Definition: PxController.h:131
PxVec3 deltaXP
delta position vector for the object the CCT is standing/riding on. Not always match the CCT delta wh...
Definition: PxController.h:125
Definition: GuContactBuffer.h:37
PxF32 volumeGrowth
Cached volume growth.
Definition: PxController.h:449
PxExtendedVec3 worldPos
Contact position in world space.
Definition: PxController.h:152
PxControllerBehaviorCallback * behaviorCallback
Specifies a user behavior callback.
Definition: PxController.h:475
virtual PxF32 getStepOffset() const =0
Retrieve the step height.
A scene is a collection of bodies and constraints which can interact.
Definition: PxScene.h:169
PxController * other
Touched controller.
Definition: PxController.h:177
const void * userData
Definition: PxController.h:187
PxU32 collisionFlags
Last known collision flags (PxControllerCollisionFlag)
Definition: PxController.h:129
Scene query filtering callbacks.
Definition: PxQueryFiltering.h:169
PxControllerFilterCallback * mCCTFilterCallback
CCT-vs-CCT filter callback. If NULL, all CCT-vs-CCT collisions are kept.
Definition: PxController.h:295
PxControllerNonWalkableMode::Enum nonWalkableMode
The non-walkable mode controls if a character controller slides or not on a non-walkable part...
Definition: PxController.h:486
PxRigidDynamic represents a dynamic rigid simulation object in the physics SDK.
Definition: PxRigidDynamic.h:83
float PxF32
Definition: PxSimpleTypes.h:76
PxFilterData is user-definable data which gets passed into the collision filtering shader and/or call...
Definition: PxFiltering.h:366
PxRigidActor * actor
Touched actor.
Definition: PxController.h:166
virtual PX_INLINE bool isValid() const
returns true if the current settings are valid
Definition: PxController.h:600
Abstract class for collision shapes.
Definition: PxShape.h:142
float PxReal
Definition: PxSimpleTypes.h:78
A box controller.
Definition: PxController.h:60
PX_INLINE PxControllerDesc(PxControllerShapeType::Enum)
constructor sets to default.
Definition: PxController.h:541
Stops character from climbing up non-walkable slopes, but doesn&#39;t move it otherwise.
Definition: PxController.h:93
Describes a generic CCT hit.
Definition: PxController.h:149
PxQueryFlags mFilterFlags
Flags for internal PxQueryFilterData structure. Passed to PxScene::overlap() call.
Definition: PxController.h:293
PxVec3 upDirection
Specifies the &#39;up&#39; direction.
Definition: PxController.h:340
virtual void getStats(PxControllerStats &stats) const =0
Returns the controller&#39;s internal statistics.
PxExtended y
Definition: PxExtended.h:253
virtual void invalidateCache()=0
Flushes internal geometry cache.
virtual void setContactOffset(PxF32 offset)=0
Sets the contact offset.
User callback class for character controller events.
Definition: PxController.h:197
PX_INLINE PxControllerFilters(const PxFilterData *filterData=NULL, PxQueryFilterCallback *cb=NULL, PxControllerFilterCallback *cctFilterCb=NULL)
Definition: PxController.h:282
PX_INLINE PxController()
Definition: PxController.h:903
PxF32 scaleCoeff
Scale coefficient for underlying kinematic actor.
Definition: PxController.h:439
PxF32 slopeLimit
The maximum slope which the character can walk up.
Definition: PxController.h:356
virtual ~PxUserControllerHitReport()
Definition: PxController.h:231
PxF32 stepOffset
Defines the maximum height of an obstacle which the character can climb.
Definition: PxController.h:420
virtual PxControllerCollisionFlags move(const PxVec3 &disp, PxF32 minDist, PxF32 elapsedTime, const PxControllerFilters &filters, const PxObstacleContext *obstacles=NULL)=0
Moves the character using a "collide-and-slide" algorithm.
PxF32 invisibleWallHeight
Height of invisible walls created around non-walkable triangles.
Definition: PxController.h:369
virtual ~PxController()
Definition: PxController.h:904
virtual void * getUserData() const =0
Returns the user data associated with this controller.
PxU16 nbPartialUpdates
Definition: PxController.h:142
PX_CUDA_CALLABLE PX_FORCE_INLINE bool isFinite(float a)
platform-specific finiteness check (not INF or NAN)
Definition: PxUnixIntrinsics.h:127
virtual PxF32 getContactOffset() const =0
Retrieve the contact offset.
virtual PxControllerShapeType::Enum getType() const =0
Return the type of controller.
virtual void setUserData(void *userData)=0
Sets the user data associated with this controller.
virtual PxF32 getSlopeLimit() const =0
Retrieve the slope limit.
PxMaterial * material
The material for the actor associated with the controller.
Definition: PxController.h:497
PxRigidActor represents a base class shared between dynamic and static rigid bodies in the physics SD...
Definition: PxRigidActor.h:58
virtual ~PxControllerFilterCallback()
Definition: PxController.h:249
virtual void setStepOffset(const PxF32 offset)=0
The step height.
virtual const PxExtendedVec3 & getPosition() const =0
Retrieve the raw position of the controller.
Enum
Definition: PxController.h:91
Dedicated filtering callback for CCT vs CCT.
Definition: PxController.h:246
virtual PX_INLINE ~PxControllerDesc()
Definition: PxController.h:596
Context class for obstacles.
Definition: PxControllerObstacles.h:114
PxF32 length
Motion length.
Definition: PxController.h:155
PxF32 density
Density of underlying kinematic actor.
Definition: PxController.h:429
PxExtended x
Definition: PxExtended.h:253
PxU16 nbIterations
Definition: PxController.h:140
const PxControllerShapeType::Enum mType
The type of the controller. This gets set by the derived class&#39; ctor, the user should not have to cha...
Definition: PxController.h:520
PxShape * touchedShape
Shape on which the CCT is standing.
Definition: PxController.h:126
virtual void setNonWalkableMode(PxControllerNonWalkableMode::Enum flag)=0
Sets the non-walkable mode for the CCT.
Base class for character controllers.
Definition: PxController.h:624
A capsule controller.
Definition: PxController.h:67
PX_INLINE PxControllerShapeType::Enum getType() const
Returns the character controller type.
Definition: PxController.h:321
bool standOnAnotherCCT
Are we standing on another CCT?
Definition: PxController.h:130
PX_INLINE PxControllerDesc & operator=(const PxControllerDesc &)
assignment operator.
Definition: PxController.h:568
virtual void setUpDirection(const PxVec3 &up)=0
Sets the &#39;up&#39; direction.
PxF32 maxJumpHeight
Maximum height a jumping character can reach.
Definition: PxController.h:394
PxExtended z
Definition: PxExtended.h:253
PxVec3 worldNormal
Contact normal in world space.
Definition: PxController.h:153
uint8_t PxU8
Definition: PxSimpleTypes.h:75
virtual bool setPosition(const PxExtendedVec3 &position)=0
Sets controller&#39;s position.
Base class for obstacles.
Definition: PxControllerObstacles.h:53
PxU16 nbFullUpdates
Definition: PxController.h:141
PxShape * shape
Touched shape.
Definition: PxController.h:165
void * userData
User specified data associated with the controller.
Definition: PxController.h:517
PxU32 ObstacleHandle
Definition: PxControllerObstacles.h:105
virtual void release()=0
Releases the controller.
double PxExtended
Definition: PxExtended.h:52
PxU16 nbTessellation
Definition: PxController.h:143
PxRigidActor * touchedActor
Actor owning &#39;touchedShape&#39;.
Definition: PxController.h:127
specifies which sides a character is colliding with.
Definition: PxController.h:101
virtual bool setFootPosition(const PxExtendedVec3 &position)=0
Set controller&#39;s foot position.
bool isMovingUp
is CCT moving up or not? (i.e. explicit jumping)
Definition: PxController.h:132
virtual PxRigidDynamic * getActor() const =0
Get the rigid body actor associated with this controller (see PhysX documentation). The behavior upon manually altering this actor is undefined, you should primarily use it for reading const properties.
The type of controller, eg box, sphere or capsule.
Definition: PxController.h:51
User behavior callback.
Definition: PxControllerBehavior.h:73
virtual void getState(PxControllerState &state) const =0
Returns information about the controller&#39;s internal state.
specifies how a CCT interacts with non-walkable parts.
Definition: PxController.h:89
virtual PxScene * getScene()=0
Retrieve the scene associated with the controller.
Filtering flags for scene queries.
Definition: PxQueryFiltering.h:57
PxVec3 dir
Motion direction.
Definition: PxController.h:154
virtual void resize(PxReal height)=0
Resizes the controller.
Describes a hit between a CCT and a shape. Passed to onShapeHit()
Definition: PxController.h:163
Material class to represent a set of surface properties.
Definition: PxMaterial.h:143
ObstacleHandle touchedObstacleHandle
Definition: PxController.h:128
virtual PxExtendedVec3 getFootPosition() const =0
Retrieve the "foot" position of the controller, i.e. the position of the bottom of the CCT&#39;s shape...
Container for bitfield flag variables associated with a specific enum type.
Definition: PxFlags.h:73
Describes a hit between a CCT and a user-defined obstacle. Passed to onObstacleHit().
Definition: PxController.h:185
Enum
Definition: PxController.h:103
PxF32 contactOffset
The contact offset used by the controller.
Definition: PxController.h:407
PxController * controller
Current controller.
Definition: PxController.h:151
Filtering data for "move" call.
Definition: PxController.h:278
uint16_t PxU16
Definition: PxSimpleTypes.h:73
uint32_t PxU32
Definition: Px.h:48
Describes a controller&#39;s internal state.
Definition: PxController.h:123
virtual void setSlopeLimit(PxF32 slopeLimit)=0
Sets the slope limit.
PxExtendedVec3 position
The position of the character.
Definition: PxController.h:330
virtual PxControllerNonWalkableMode::Enum getNonWalkableMode() const =0
Retrieves the non-walkable mode for the CCT.
PX_FORCE_INLINE PxVec3 toVec3(const PxExtendedVec3 &v)
Definition: PxExtended.h:256
Descriptor class for a character controller.
Definition: PxController.h:303
Describes a controller&#39;s internal statistics.
Definition: PxController.h:138
const PxFilterData * mFilterData
Definition: PxController.h:290
PxFlags< PxControllerCollisionFlag::Enum, PxU8 > PxControllerCollisionFlags
Bitfield that contains a set of raised flags defined in PxControllerCollisionFlag.
Definition: PxController.h:116
#define PX_INLINE
Definition: PxPreprocessor.h:324
virtual PxVec3 getUpDirection() const =0
Retrieve the &#39;up&#39; direction.
Enum
Definition: PxController.h:53
bool registerDeletionListener
Use a deletion listener to get informed about released objects and clear internal caches if needed...
Definition: PxController.h:510
3 Element vector class.
Definition: PxVec3.h:49
PX_INLINE void copy(const PxControllerDesc &)
Definition: PxController.h:574
Describes a hit between a CCT and another CCT. Passed to onControllerHit().
Definition: PxController.h:175
PxU32 triangleIndex
touched triangle index (only for meshes/heightfields)
Definition: PxController.h:167
PxUserControllerHitReport * reportCallback
Specifies a user report callback.
Definition: PxController.h:462
Definition: PxExtended.h:56