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_CONSTRAINTDESC
00032 #define PX_PHYSICS_NX_CONSTRAINTDESC
00033
00038 #include "PxPhysXConfig.h"
00039 #include "foundation/PxFlags.h"
00040 #include "foundation/PxVec3.h"
00041 #include "common/PxBase.h"
00042
00043 #if !PX_DOXYGEN
00044 namespace physx { namespace pvdsdk {
00045 #endif
00046 class PvdDataStream;
00047 #if !PX_DOXYGEN
00048 }}
00049 #endif
00050
00051 #if !PX_DOXYGEN
00052 namespace physx
00053 {
00054 #endif
00055
00056 class PxConstraintConnector;
00057 class PxRigidActor;
00058 class PxScene;
00059 class PxConstraintConnector;
00060 class PxRenderBuffer;
00061 class PxDeletionListener;
00062
00069 struct Px1DConstraintFlag
00070 {
00071 PX_CUDA_CALLABLE Px1DConstraintFlag(){}
00072
00073 enum Type
00074 {
00075 eSPRING = 1<<0,
00076 eACCELERATION_SPRING = 1<<1,
00077 eRESTITUTION = 1<<2,
00078 eKEEPBIAS = 1<<3,
00079 eOUTPUT_FORCE = 1<<4,
00080 eHAS_DRIVE_LIMIT = 1<<5
00081 };
00082 };
00083
00084 typedef PxFlags<Px1DConstraintFlag::Type, PxU16> Px1DConstraintFlags;
00085 PX_FLAGS_OPERATORS(Px1DConstraintFlag::Type, PxU16)
00086
00087
00091 struct PxConstraintSolveHint
00092 {
00093 enum Enum
00094 {
00095 eNONE = 0,
00096 eACCELERATION1 = 256,
00097 eSLERP_SPRING = 258,
00098 eACCELERATION2 = 512,
00099 eACCELERATION3 = 768,
00100 eEQUALITY = 1024,
00101 eINEQUALITY = 1025
00102 };
00103 };
00104
00141 PX_ALIGN_PREFIX(16)
00142 struct Px1DConstraint
00143 {
00144 PxVec3 linear0;
00145 PxReal geometricError;
00146 PxVec3 angular0;
00147 PxReal velocityTarget;
00148
00149 PxVec3 linear1;
00150 PxReal minImpulse;
00151 PxVec3 angular1;
00152 PxReal maxImpulse;
00153
00154 union
00155 {
00156 struct SpringModifiers
00157 {
00158 PxReal stiffness;
00159 PxReal damping;
00160 } spring;
00161 struct RestitutionModifiers
00162 {
00163 PxReal restitution;
00164 PxReal velocityThreshold;
00165 } bounce;
00166 } mods;
00167
00168 PxReal forInternalUse;
00169 PxU16 flags;
00170 PxU16 solveHint;
00171 }
00172 PX_ALIGN_SUFFIX(16);
00173
00174
00180 struct PxConstraintVisualizationFlag
00181 {
00182 enum Enum
00183 {
00184 eLOCAL_FRAMES = 1,
00185 eLIMITS = 2
00186 };
00187 };
00188
00189 PX_ALIGN_PREFIX(16)
00190 struct PxConstraintInvMassScale
00191 {
00192
00193
00194
00195
00196
00197
00198
00199 PxReal linear0;
00200 PxReal angular0;
00201 PxReal linear1;
00202 PxReal angular1;
00203
00204 PxConstraintInvMassScale(){}
00205 PxConstraintInvMassScale(PxReal lin0, PxReal ang0, PxReal lin1, PxReal ang1) : linear0(lin0), angular0(ang0), linear1(lin1), angular1(ang1){}
00206 }
00207 PX_ALIGN_SUFFIX(16);
00208
00227 typedef PxU32 (*PxConstraintSolverPrep)(Px1DConstraint* constraints,
00228 PxVec3& bodyAWorldOffset,
00229 PxU32 maxConstraints,
00230 PxConstraintInvMassScale& invMassScale,
00231 const void* constantBlock,
00232 const PxTransform& bodyAToWorld,
00233 const PxTransform& bodyBToWorld);
00234
00246 typedef void (*PxConstraintProject)(const void* constantBlock,
00247 PxTransform& bodyAToWorld,
00248 PxTransform& bodyBToWorld,
00249 bool projectToA);
00250
00254 class PxConstraintVisualizer
00255 {
00256 protected:
00257 virtual ~PxConstraintVisualizer(){}
00258 public:
00259 virtual void visualizeJointFrames( const PxTransform& parent, const PxTransform& child ) = 0;
00260
00261 virtual void visualizeLinearLimit( const PxTransform& t0, const PxTransform& t1, PxReal value, bool active ) = 0;
00262
00263 virtual void visualizeAngularLimit( const PxTransform& t0, PxReal lower, PxReal upper, bool active) = 0;
00264
00265 virtual void visualizeLimitCone( const PxTransform& t, PxReal ySwing, PxReal zSwing, bool active) = 0;
00266
00267 virtual void visualizeDoubleCone( const PxTransform& t, PxReal angle, bool active) = 0;
00268 };
00269
00282 typedef void (*PxConstraintVisualize)( PxConstraintVisualizer& visualizer,
00283 const void* constantBlock,
00284 const PxTransform& body0Transform,
00285 const PxTransform& body1Transform,
00286 PxU32 flags );
00287
00288
00289 struct PxPvdUpdateType
00290 {
00291 enum Enum
00292 {
00293 CREATE_INSTANCE,
00294 RELEASE_INSTANCE,
00295 UPDATE_ALL_PROPERTIES,
00296 UPDATE_SIM_PROPERTIES
00297 };
00298 };
00299
00310 class PxConstraintConnector
00311 {
00312 public:
00318 virtual void* prepareData() = 0;
00319
00324 virtual bool updatePvdProperties(physx::pvdsdk::PvdDataStream& pvdConnection,
00325 const PxConstraint* c,
00326 PxPvdUpdateType::Enum updateType) const = 0;
00327
00340 virtual void onConstraintRelease() = 0;
00341
00349 virtual void onComShift(PxU32 actor) = 0;
00350
00363 virtual void onOriginShift(const PxVec3& shift) = 0;
00364
00377 virtual void* getExternalReference(PxU32& typeID) = 0;
00378
00379
00386 virtual PxBase* getSerializable() = 0;
00387
00391 virtual PxConstraintSolverPrep getPrep() const = 0;
00392
00396 virtual const void* getConstantBlock() const = 0;
00397
00398
00402 virtual ~PxConstraintConnector() {}
00403 };
00404
00405 #if !PX_DOXYGEN
00406 }
00407 #endif
00408
00410 #endif