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_CONSTRAINT
00032 #define PX_PHYSICS_NX_CONSTRAINT
00033
00038 #include "PxPhysXConfig.h"
00039 #include "PxConstraintDesc.h"
00040 #include "common/PxBase.h"
00041
00042 #if !PX_DOXYGEN
00043 namespace physx
00044 {
00045 #endif
00046
00047 class PxRigidActor;
00048 class PxScene;
00049 class PxConstraintConnector;
00050
00063 struct PxConstraintFlag
00064 {
00065 enum Enum
00066 {
00067 eBROKEN = 1<<0,
00068 ePROJECT_TO_ACTOR0 = 1<<1,
00069 ePROJECT_TO_ACTOR1 = 1<<2,
00070 ePROJECTION = ePROJECT_TO_ACTOR0 | ePROJECT_TO_ACTOR1,
00071 eCOLLISION_ENABLED = 1<<3,
00072 eVISUALIZATION = 1<<4,
00073 eDRIVE_LIMITS_ARE_FORCES = 1<<5,
00074 eIMPROVED_SLERP = 1<<7,
00075 eDISABLE_PREPROCESSING = 1<<8,
00076 eGPU_COMPATIBLE = 1<<9
00077 };
00078 };
00079
00085 typedef PxFlags<PxConstraintFlag::Enum, PxU16> PxConstraintFlags;
00086 PX_FLAGS_OPERATORS(PxConstraintFlag::Enum, PxU16)
00087
00088
00089 struct PxConstraintShaderTable
00090 {
00091 enum
00092 {
00093 eMAX_SOLVERPRPEP_DATASIZE=400
00094 };
00095
00096 PxConstraintSolverPrep solverPrep;
00097 PxConstraintProject project;
00098 PxConstraintVisualize visualize;
00099 PxConstraintFlag::Enum flag;
00100 };
00101
00102
00109 class PxConstraint : public PxBase
00110 {
00111 public:
00112
00120 virtual void release() = 0;
00121
00129 virtual PxScene* getScene() const = 0;
00130
00140 virtual void getActors(PxRigidActor*& actor0, PxRigidActor*& actor1) const = 0;
00141
00142
00152 virtual void setActors(PxRigidActor* actor0, PxRigidActor* actor1) = 0;
00153
00158 virtual void markDirty() = 0;
00159
00170 virtual void setFlags(PxConstraintFlags flags) = 0;
00171
00179 virtual PxConstraintFlags getFlags() const = 0;
00180
00181
00191 virtual void setFlag(PxConstraintFlag::Enum flag, bool value) = 0;
00192
00199 virtual void getForce(PxVec3& linear, PxVec3& angular) const = 0;
00200
00201
00212 virtual bool isValid() const = 0;
00213
00224 virtual void setBreakForce(PxReal linear, PxReal angular) = 0;
00225
00233 virtual void getBreakForce(PxReal& linear, PxReal& angular) const = 0;
00234
00235
00250 virtual void setMinResponseThreshold(PxReal threshold) = 0;
00251
00258 virtual PxReal getMinResponseThreshold() const = 0;
00259
00260
00271 virtual void* getExternalReference(PxU32& typeID) = 0;
00272
00281 virtual void setConstraintFunctions(PxConstraintConnector& connector,
00282 const PxConstraintShaderTable& shaders) = 0;
00283
00284 virtual const char* getConcreteTypeName() const { return "PxConstraint"; }
00285
00286 protected:
00287 PX_INLINE PxConstraint(PxType concreteType, PxBaseFlags baseFlags) : PxBase(concreteType, baseFlags) {}
00288 PX_INLINE PxConstraint(PxBaseFlags baseFlags) : PxBase(baseFlags) {}
00289 virtual ~PxConstraint() {}
00290 virtual bool isKindOf(const char* name) const { return !::strcmp("PxConstraint", name) || PxBase::isKindOf(name); }
00291
00292 };
00293
00294 #if !PX_DOXYGEN
00295 }
00296 #endif
00297
00299 #endif