33#include "extensions/PxConstraintExt.h"
34#include "PxRigidStatic.h"
35#include "PxRigidDynamic.h"
36#include "PxArticulationLink.h"
37#include "PxArticulationReducedCoordinate.h"
40#include "foundation/PxAllocator.h"
41#include "foundation/PxMathUtils.h"
43#include "ExtJointData.h"
46 #include "pvd/PxPvdSceneClient.h"
48 #include "PxPvdClient.h"
51#if PX_SUPPORT_OMNI_PVD
52# include "omnipvd/OmniPvdPxExtensionsSampler.h"
58 class PxDeserializationContext;
60PxConstraint* resolveConstraintPtr(PxDeserializationContext& v, PxConstraint* old, PxConstraintConnector* connector, PxConstraintShaderTable& shaders);
68 return 4.0f *
PxAtan2(swingYZ, 1.0f + swingW);
71 template<
class Jo
intType,
class DataType>
72 PX_FORCE_INLINE JointType* createJointT(PxPhysics& physics, PxRigidActor* actor0,
const PxTransform& localFrame0, PxRigidActor* actor1,
const PxTransform& localFrame1,
const PxConstraintShaderTable& shaders)
75 PX_NEW_SERIALIZED(j, JointType)(physics.getTolerancesScale(), actor0, localFrame0, actor1, localFrame1);
77 if(!physics.createConstraint(actor0, actor1, *j, shaders,
sizeof(DataType)))
80#if PX_SUPPORT_OMNI_PVD
83 omniPvdCreateJoint(j);
92 template<
class Jo
intType>
95 JointType* obj = PX_PLACEMENT_NEW(address, JointType(PxBaseFlag::eIS_RELEASABLE));
96 address +=
sizeof(JointType);
98 obj->resolveReferences(
context);
103 template <
class Base,
class DataClass,
class ValueStruct>
115 stream.
writeData(mData,
sizeof(DataClass));
123 mData =
context.readExtraData<DataClass, PX_SERIAL_ALIGN>();
127 virtual void preExportDataReset(){}
130 c.process(*mPxConstraint);
155 Ext::Pvd::simUpdate<Base>(pvdConnection, *
this);
160 Ext::Pvd::updatePvdProperties<Base, ValueStruct>(pvdConnection, *
this);
165 Ext::Pvd::createPvdInstance<Base>(pvdConnection, *c, *
this);
170 Ext::Pvd::releasePvdInstance(pvdConnection, *c, *
this);
193 PX_CHECK_AND_RETURN(actor0 != actor1,
"PxJoint::setActors: actors must be different");
194 PX_CHECK_AND_RETURN((actor0 && !actor0->is<
PxRigidStatic>()) || (actor1 && !actor1->is<
PxRigidStatic>()),
"PxJoint::setActors: at least one actor must be non-static");
212 mPxConstraint->
setActors(actor0, actor1);
213 mData->c2b[0] = getCom(actor0).transformInv(mLocalPose[0]);
214 mData->c2b[1] = getCom(actor1).transformInv(mLocalPose[1]);
217#if PX_SUPPORT_OMNI_PVD
218 OMNI_PVD_SET(joint, actor0,
static_cast<PxJoint&
>(*
this), actor0)
219 OMNI_PVD_SET(joint, actor1,
static_cast<PxJoint&
>(*
this), actor1)
224 virtual void getActors(PxRigidActor*& actor0, PxRigidActor*& actor1)
const PX_OVERRIDE
239 virtual void setLocalPose(PxJointActorIndex::Enum actor,
const PxTransform& pose)
PX_OVERRIDE
241 PX_CHECK_AND_RETURN(pose.isSane(),
"PxJoint::setLocalPose: transform is invalid");
242 const PxTransform p = pose.getNormalized();
243 mLocalPose[actor] = p;
244 mData->c2b[actor] = getCom(actor).transformInv(p);
247#if PX_SUPPORT_OMNI_PVD
248 OMNI_PVD_SET(joint, actor0LocalPose,
static_cast<PxJoint&
>(*
this), mLocalPose[0])
249 OMNI_PVD_SET(joint, actor1LocalPose,
static_cast<PxJoint&
>(*
this), mLocalPose[1])
254 virtual PxTransform getLocalPose(PxJointActorIndex::Enum actor)
const PX_OVERRIDE
256 return mLocalPose[actor];
259 static PxTransform getGlobalPose(
const PxRigidActor* actor)
262 return PxTransform(PxIdentity);
263 return actor->getGlobalPose();
266 static void getActorVelocity(
const PxRigidActor* actor, PxVec3& linear, PxVec3& angular)
268 if(!actor || actor->is<PxRigidStatic>())
270 linear = angular = PxVec3(0.0f);
274 linear =
static_cast<const PxRigidBody*
>(actor)->getLinearVelocity();
275 angular =
static_cast<const PxRigidBody*
>(actor)->getAngularVelocity();
279 virtual PxTransform getRelativeTransform() const
PX_OVERRIDE
281 PxRigidActor* actor0, * actor1;
282 mPxConstraint->
getActors(actor0, actor1);
283 const PxTransform t0 = getGlobalPose(actor0) * mLocalPose[0];
284 const PxTransform t1 = getGlobalPose(actor1) * mLocalPose[1];
285 return t0.transformInv(t1);
289 virtual PxVec3 getRelativeLinearVelocity() const
PX_OVERRIDE
291 PxRigidActor* actor0, * actor1;
292 PxVec3 l0, a0, l1, a1;
293 mPxConstraint->
getActors(actor0, actor1);
295 PxTransform t0 = getCom(actor0), t1 = getCom(actor1);
296 getActorVelocity(actor0, l0, a0);
297 getActorVelocity(actor1, l1, a1);
299 PxVec3 p0 = t0.q.rotate(mLocalPose[0].p),
300 p1 = t1.q.rotate(mLocalPose[1].p);
301 return t0.transformInv(l1 - a1.cross(p1) - l0 + a0.cross(p0));
305 virtual PxVec3 getRelativeAngularVelocity() const
PX_OVERRIDE
307 PxRigidActor* actor0, * actor1;
308 PxVec3 l0, a0, l1, a1;
309 mPxConstraint->
getActors(actor0, actor1);
311 PxTransform t0 = getCom(actor0);
312 getActorVelocity(actor0, l0, a0);
313 getActorVelocity(actor1, l1, a1);
315 return t0.transformInv(a1 - a0);
319 virtual void setBreakForce(PxReal force, PxReal torque)
PX_OVERRIDE
321 PX_CHECK_AND_RETURN(
PxIsFinite(force) &&
PxIsFinite(torque),
"PxJoint::setBreakForce: invalid float");
323#if PX_SUPPORT_OMNI_PVD
324 OMNI_PVD_SET(joint, breakForce,
static_cast<PxJoint&
>(*
this), force)
325 OMNI_PVD_SET(joint, breakTorque,
static_cast<PxJoint&
>(*
this), torque)
330 virtual void getBreakForce(PxReal& force, PxReal& torque)
const PX_OVERRIDE
339#if PX_SUPPORT_OMNI_PVD
340 OMNI_PVD_SET(joint, constraintFlags,
static_cast<PxJoint&
>(*
this), flags)
347 mPxConstraint->
setFlag(flag, value);
348#if PX_SUPPORT_OMNI_PVD
349 OMNI_PVD_SET(joint, constraintFlags,
static_cast<PxJoint&
>(*
this), getConstraintFlags())
360 virtual void setInvMassScale0(PxReal invMassScale)
PX_OVERRIDE
362 PX_CHECK_AND_RETURN(
PxIsFinite(invMassScale) && invMassScale>=0,
"PxJoint::setInvMassScale0: scale must be non-negative");
363 mData->invMassScale.
linear0 = invMassScale;
365#if PX_SUPPORT_OMNI_PVD
366 OMNI_PVD_SET(joint, invMassScale0,
static_cast<PxJoint&
>(*
this), invMassScale)
371 virtual PxReal getInvMassScale0() const
PX_OVERRIDE
373 return mData->invMassScale.
linear0;
377 virtual void setInvInertiaScale0(PxReal invInertiaScale)
PX_OVERRIDE
379 PX_CHECK_AND_RETURN(
PxIsFinite(invInertiaScale) && invInertiaScale>=0,
"PxJoint::setInvInertiaScale0: scale must be non-negative");
380 mData->invMassScale.
angular0 = invInertiaScale;
382#if PX_SUPPORT_OMNI_PVD
383 OMNI_PVD_SET(joint, invInertiaScale0,
static_cast<PxJoint&
>(*
this), invInertiaScale)
388 virtual PxReal getInvInertiaScale0() const
PX_OVERRIDE
390 return mData->invMassScale.
angular0;
394 virtual void setInvMassScale1(PxReal invMassScale)
PX_OVERRIDE
396 PX_CHECK_AND_RETURN(
PxIsFinite(invMassScale) && invMassScale>=0,
"PxJoint::setInvMassScale1: scale must be non-negative");
397 mData->invMassScale.
linear1 = invMassScale;
399#if PX_SUPPORT_OMNI_PVD
400 OMNI_PVD_SET(joint, invMassScale1,
static_cast<PxJoint&
>(*
this), invMassScale)
405 virtual PxReal getInvMassScale1() const
PX_OVERRIDE
407 return mData->invMassScale.
linear1;
411 virtual void setInvInertiaScale1(PxReal invInertiaScale)
PX_OVERRIDE
413 PX_CHECK_AND_RETURN(
PxIsFinite(invInertiaScale) && invInertiaScale>=0,
"PxJoint::setInvInertiaScale: scale must be non-negative");
414 mData->invMassScale.
angular1 = invInertiaScale;
416#if PX_SUPPORT_OMNI_PVD
417 OMNI_PVD_SET(joint, invInertiaScale1,
static_cast<PxJoint&
>(*
this), invInertiaScale)
422 virtual PxReal getInvInertiaScale1() const
PX_OVERRIDE
424 return mData->invMassScale.
angular1;
428 virtual PxConstraint* getConstraint() const
PX_OVERRIDE
430 return mPxConstraint;
437#if PX_SUPPORT_OMNI_PVD
438 const char* n = name ? name :
"";
439 PxU32 nLen = PxU32(strlen(n)) + 1;
440 OMNI_PVD_SETB(joint, name,
static_cast<PxJoint&
>(*
this), n, nLen)
459 return mPxConstraint ? mPxConstraint->
getScene() : NULL;
465 mData->c2b[actor] = getCom(actor).transformInv(mLocalPose[actor]);
477 mLocalPose[0].p -= shift;
478 mData->c2b[0].p -= shift;
483 mLocalPose[1].p -= shift;
484 mData->c2b[1].p -= shift;
498 typeID = PxConstraintExtIDs::eJOINT;
499 return static_cast<PxJoint*
>( this );
531 return getCom(a[index]);
539 return static_cast<PxRigidBody*
>(actor)->getCMassLocalPose();
543 return static_cast<PxRigidStatic*
>(actor)->getGlobalPose().getInverse();
549 JointT(PxType concreteType, PxRigidActor* actor0,
const PxTransform& localFrame0, PxRigidActor* actor1,
const PxTransform& localFrame1,
const char* name) :
550 Base (concreteType, PxBaseFlag::eOWNS_MEMORY | PxBaseFlag::eIS_RELEASABLE),
555 Base::userData = NULL;
557 const PxU32 size =
sizeof(DataClass);
558 JointData* data =
reinterpret_cast<JointData*
>(PX_ALLOC(size, name));
563 data->c2b[0] = getCom(actor0).transformInv(mLocalPose[0]);
564 data->c2b[1] = getCom(actor1).transformInv(mLocalPose[1]);
565 data->invMassScale.linear0 = 1.0f;
566 data->invMassScale.angular0 = 1.0f;
567 data->invMassScale.linear1 = 1.0f;
568 data->invMassScale.angular1 = 1.0f;
575 if(Base::getBaseFlags() & PxBaseFlag::eOWNS_MEMORY)
578#if PX_SUPPORT_OMNI_PVD
579 OMNI_PVD_DESTROY(joint,
static_cast<PxJoint&
>(*
this))
585 return *
static_cast<DataClass*
>(mData);
597 for(PxU32 i = 0; i < 2; i++)
599 if(a[i] && a[i]->getScene())
603 PxRigidDynamic* rd =
static_cast<PxRigidDynamic*
>(a[i]);
606 const PxScene* scene = rd->getScene();
607 const PxReal wakeCounterResetValue = scene->getWakeCounterResetValue();
608 const PxReal wakeCounter = rd->getWakeCounter();
609 if(wakeCounter < wakeCounterResetValue)
617 PxArticulationLink* link =
reinterpret_cast<PxArticulationLink*
>(a[i]);
618 PxArticulationReducedCoordinate& articulation = link->getArticulation();
619 const PxReal wakeCounter = articulation.getWakeCounter();
620 const PxScene* scene = link->getScene();
621 const PxReal wakeCounterResetValue = scene->getWakeCounterResetValue();
622 if(wakeCounter < wakeCounterResetValue)
624 articulation.wakeUp();
633 const PxQuat q = getRelativeTransform().q;
637 return needTwist ? twist : swing;
640 PxReal getTwistAngle_Internal()
const
642 const PxQuat twist = getTwistOrSwing(
true);
666 PxReal
angle = twist.getAngle();
674 PxReal getSwingYAngle_Internal()
const
676 PxQuat swing = getTwistOrSwing(
false);
681 const PxReal
angle = computeSwingAngle(swing.y, swing.w);
682 PX_ASSERT(angle>-PxPi && angle<=PxPi);
686 PxReal getSwingZAngle_Internal()
const
688 PxQuat swing = getTwistOrSwing(
false);
693 const PxReal
angle = computeSwingAngle(swing.z, swing.w);
694 PX_ASSERT(angle>-PxPi && angle <= PxPi);
699 PxTransform mLocalPose[2];
700 PxConstraint* mPxConstraint;
704 PX_FORCE_INLINE bool isLimitActive(
const PxJointLimitParameters& limit, PxReal pad, PxReal angle, PxReal low, PxReal high)
710 if(angle < low + pad)
712 if(angle > high - pad)
717#if PX_SUPPORT_OMNI_PVD
718 void omniPvdCreateJoint(PxJoint* joint);
719 template<
typename Jo
intType>
void omniPvdInitJoint(JointType* joint);
Definition ExtJoint.h:105
virtual void updateOmniPvdProperties() const PX_OVERRIDE
this function is called by the SDK to update OmniPVD's view of it
Definition ExtJoint.h:183
virtual bool updatePvdProperties(physx::pvdsdk::PvdDataStream &, const PxConstraint *, PxPvdUpdateType::Enum) const PX_OVERRIDE
this function is called by the SDK to update PVD's view of it
Definition ExtJoint.h:176
virtual PxBase * getSerializable() PX_OVERRIDE
Obtain a reference to a PxBase interface if the constraint has one.
Definition ExtJoint.h:503
virtual void connectToConstraint(PxConstraint *c) PX_OVERRIDE
Let the connector know it has been connected to a constraint.
Definition ExtJoint.h:521
virtual const void * getConstantBlock() const PX_OVERRIDE
Obtain the pointer to the constraint's constant data.
Definition ExtJoint.h:516
virtual void * prepareData() PX_OVERRIDE
Pre-simulation data preparation when the constraint is marked dirty, this function is called at the s...
Definition ExtJoint.h:490
virtual void onOriginShift(const PxVec3 &shift) PX_OVERRIDE
Origin shift callback.
Definition ExtJoint.h:470
virtual void onConstraintRelease() PX_OVERRIDE
Constraint release callback.
Definition ExtJoint.h:509
virtual void onComShift(PxU32 actor) PX_OVERRIDE
Center-of-mass shift callback.
Definition ExtJoint.h:463
virtual void * getExternalReference(PxU32 &typeID) PX_OVERRIDE
Fetches external data for a constraint.
Definition ExtJoint.h:496
Base class for objects that can be members of a PxCollection.
Definition PxBase.h:73
This class connects a custom constraint to the SDK.
Definition PxConstraintDesc.h:354
A plugin class for implementing constraints.
Definition PxConstraint.h:100
virtual void getBreakForce(PxReal &linear, PxReal &angular) const =0
Retrieve the constraint break force and torque thresholds.
virtual void setFlag(PxConstraintFlag::Enum flag, bool value)=0
Set a flag for this constraint.
virtual void setFlags(PxConstraintFlags flags)=0
Set the flags for this constraint.
virtual PxConstraintFlags getFlags() const =0
Retrieve the flags for this constraint.
virtual void setActors(PxRigidActor *actor0, PxRigidActor *actor1)=0
Sets the actors for this constraint.
virtual PxScene * getScene() const =0
Retrieves the scene which this constraint belongs to.
virtual void release()=0
Releases a PxConstraint instance.
virtual void setBreakForce(PxReal linear, PxReal angular)=0
Set the break force and torque thresholds for this constraint.
virtual void markDirty()=0
Notify the scene that the constraint shader data has been updated by the application.
virtual void getActors(PxRigidActor *&actor0, PxRigidActor *&actor1) const =0
Retrieves the actors for this constraint.
Binary deserialization context class.
Definition PxSerialFramework.h:174
a base interface providing common functionality for PhysX joints
Definition PxJoint.h:105
Callback class used to process PxBase objects.
Definition PxSerialFramework.h:81
virtual physx::pvdsdk::PvdClient * getClientInternal()=0
PxRigidActor represents a base class shared between dynamic and static rigid bodies in the physics SD...
Definition PxRigidActor.h:53
PxRigidBody is a base class shared between dynamic rigid body objects.
Definition PxRigidBody.h:199
PxRigidStatic represents a static rigid body simulation object in the physics SDK.
Definition PxRigidStatic.h:58
A scene is a collection of bodies and constraints which can interact.
Definition PxScene.h:178
virtual PxPvdSceneClient * getScenePvdClient()=0
Returns the Pvd client associated with the scene.
Binary serialization context class.
Definition PxSerialFramework.h:99
virtual void alignData(PxU32 alignment=PX_SERIAL_ALIGN)=0
Aligns the serialized data.
virtual void writeData(const void *data, PxU32 size)=0
Serializes object data and object extra data.
virtual void writeName(const char *name)=0
Helper function to write a name to the extraData if serialization is configured to save names.
Definition PxUserAllocated.h:43
3 Element vector class.
Definition PxVec3.h:50
Definition PxPvdDataStream.h:241
GLM_FUNC_DECL T angle(qua< T, Q > const &x)
Definition quaternion_trigonometric.inl:6
#define PX_FORCE_INLINE
Definition PxPreprocessor.h:335
#define PX_OVERRIDE
Definition PxPreprocessor.h:375
Sorts an array of objects in ascending order, assuming that the predicate implements the < operator:
Definition PxBoxController.h:39
PX_CUDA_CALLABLE PX_FORCE_INLINE void PxSeparateSwingTwist(const PxQuat &q, PxQuat &swing, PxQuat &twist)
Compute from an input quaternion q a pair of quaternions (swing, twist) such that q = swing * twist w...
Definition PxMathUtils.h:246
PX_CUDA_CALLABLE PX_FORCE_INLINE float PxAtan2(float x, float y)
Arctangent of (x/y) with correct sign. Returns angle between -PI and PI in radians Unit: Radians.
Definition PxMath.h:302
PX_CUDA_CALLABLE PX_FORCE_INLINE bool PxIsFinite(float f)
returns true if the passed number is a finite floating point number as opposed to INF,...
Definition PxMath.h:326
PX_INLINE void PxMarkSerializedMemory(void *ptr, PxU32 byteSize)
Definition PxMemory.h:111
PxFlags< PxConstraintFlag::Enum, PxU16 > PxConstraintFlags
constraint flags
Definition PxConstraint.h:78
@ eARTICULATION_LINK
An articulation link.
Definition PxActor.h:138
@ eRIGID_STATIC
A static rigid body.
Definition PxActor.h:126
@ eRIGID_DYNAMIC
A dynamic rigid body.
Definition PxActor.h:132
Enum
Definition PxConstraint.h:57
PxReal angular1
multiplier for inverse MoI of body1
Definition PxConstraintDesc.h:195
PxReal linear0
multiplier for inverse mass of body0
Definition PxConstraintDesc.h:192
PxReal angular0
multiplier for inverse MoI of body0
Definition PxConstraintDesc.h:193
PxReal linear1
multiplier for inverse mass of body1
Definition PxConstraintDesc.h:194
Enum
Definition PxConstraintDesc.h:337
@ RELEASE_INSTANCE
triggers releasePvdInstance call, releases an instance of a constraint
Definition PxConstraintDesc.h:339
@ UPDATE_ALL_PROPERTIES
triggers updatePvdProperties call, updates all properties of a constraint
Definition PxConstraintDesc.h:340
@ CREATE_INSTANCE
triggers createPvdInstance call, creates an instance of a constraint
Definition PxConstraintDesc.h:338
@ UPDATE_SIM_PROPERTIES
triggers simUpdate call, updates all simulation properties of a constraint
Definition PxConstraintDesc.h:341
@ eKINEMATIC
Enables kinematic mode for the actor.
Definition PxRigidBody.h:74