9#include "PxPhysicsAPI.h"
11#include <QtGui/qquaternion.h>
17 return static_cast<
bool>(body.getRigidBodyFlags() & physx::PxRigidBodyFlag::eKINEMATIC);
26 return static_cast<
bool>(body.getActorFlags() & physx::PxActorFlag::eDISABLE_SIMULATION);
30 bool isKinematic,
bool worldEnableCCD)
33 case QDynamicRigidBody::CCDType::SweepBasedCCD: {
35 body.setRigidBodyFlag(physx::PxRigidBodyFlag::eENABLE_CCD, !isKinematic);
36 body.setRigidBodyFlag(physx::PxRigidBodyFlag::eENABLE_SPECULATIVE_CCD, isKinematic);
40 case QDynamicRigidBody::CCDType::SpeculativeCCD: {
41 body.setRigidBodyFlag(physx::PxRigidBodyFlag::eENABLE_SPECULATIVE_CCD,
true);
45 case QDynamicRigidBody::CCDType::None: {
48 body.setRigidBodyFlag(physx::PxRigidBodyFlag::eENABLE_CCD, !isKinematic);
49 body.setRigidBodyFlag(physx::PxRigidBodyFlag::eENABLE_SPECULATIVE_CCD, isKinematic);
68 physx::PxRigidDynamic &body)
73 body.addForce(QPhysicsUtils::toPhysXType(force));
77 const QVector3D &inPosition)
86 physx::PxRigidDynamic &body)
91 physx::PxRigidBodyExt::addForceAtPos(body, QPhysicsUtils::toPhysXType(force),
92 QPhysicsUtils::toPhysXType(position));
104 physx::PxRigidDynamic &body)
109 body.addTorque(QPhysicsUtils::toPhysXType(torque));
121 physx::PxRigidDynamic &body)
126 body.addForce(QPhysicsUtils::toPhysXType(impulse), physx::PxForceMode::eIMPULSE);
130 const QVector3D &inPosition)
139 physx::PxRigidDynamic &body)
144 physx::PxRigidBodyExt::addForceAtPos(body, QPhysicsUtils::toPhysXType(impulse),
145 QPhysicsUtils::toPhysXType(position),
146 physx::PxForceMode::eIMPULSE);
158 physx::PxRigidDynamic &body)
164 body.addTorque(QPhysicsUtils::toPhysXType(impulse), physx::PxForceMode::eIMPULSE);
168 const QVector3D &inAngularVelocity)
177 physx::PxRigidDynamic &body)
180 body.setAngularVelocity(QPhysicsUtils::toPhysXType(angularVelocity));
184 const QVector3D &inLinearVelocity)
193 physx::PxRigidDynamic &body)
196 body.setLinearVelocity(QPhysicsUtils::toPhysXType(linearVelocity));
206 if (rigidBody.hasStaticShapes()) {
207 qWarning() <<
"Cannot set mass or density on a body containing trimesh/heightfield/plane, "
212 physx::PxRigidBodyExt::setMassAndUpdateInertia(body, mass);
216 physx::PxRigidDynamic &body)
218 if (rigidBody.hasStaticShapes()) {
219 qWarning() <<
"Cannot set mass or density on a body containing trimesh/heightfield/plane, "
225 body.setCMassLocalPose(
226 physx::PxTransform(QPhysicsUtils::toPhysXType(rigidBody.centerOfMassPosition()),
227 QPhysicsUtils::toPhysXType(rigidBody.centerOfMassRotation())));
228 body.setMassSpaceInertiaTensor(QPhysicsUtils::toPhysXType(inertia));
232 float inMass,
const QMatrix3x3 &inInertia)
241 physx::PxRigidDynamic &body)
243 if (rigidBody.hasStaticShapes()) {
244 qWarning() <<
"Cannot set mass or density on a body containing trimesh/heightfield/plane, "
249 physx::PxQuat massFrame;
250 physx::PxVec3 diagTensor = physx::PxDiagonalize(QPhysicsUtils::toPhysXType(inertia), massFrame);
251 if (!QPhysicsUtils::isFinite(diagTensor) || diagTensor.x <= 0.0f || diagTensor.y <= 0.0f
252 || diagTensor.z <= 0.0f) {
253 qWarning() <<
"Invalid inertiaMatrix, does not diagonalize to a positive-definite "
258 body.setCMassLocalPose(physx::PxTransform(
259 QPhysicsUtils::toPhysXType(rigidBody.centerOfMassPosition()), massFrame));
261 body.setMassSpaceInertiaTensor(diagTensor);
273 physx::PxRigidDynamic &body)
275 if (rigidBody.hasStaticShapes()) {
276 qWarning() <<
"Cannot set mass or density on a body containing trimesh/heightfield/plane, "
281 physx::PxRigidBodyExt::updateMassAndInertia(body, density);
286 :
QPhysicsCommand(), isKinematic(inIsKinematic), worldEnableCCD(worldEnableCCD)
294 physx::PxRigidDynamic &body)
296 if (rigidBody.hasStaticShapes() && !isKinematic) {
297 qWarning() <<
"Cannot make a body containing trimesh/heightfield/plane non-kinematic, "
305 body.setRigidBodyFlag(physx::PxRigidBodyFlag::eENABLE_CCD,
false);
306 body.setRigidBodyFlag(physx::PxRigidBodyFlag::eENABLE_SPECULATIVE_CCD,
false);
307 body.setRigidBodyFlag(physx::PxRigidBodyFlag::eKINEMATIC, isKinematic);
310 resolveCCDFlags(body, rigidBody.ccd(), isKinematic, worldEnableCCD);
326 body.setRigidBodyFlag(physx::PxRigidBodyFlag::eENABLE_CCD,
false);
327 body.setRigidBodyFlag(physx::PxRigidBodyFlag::eENABLE_SPECULATIVE_CCD,
false);
329 resolveCCDFlags(body, ccdType, rigidBody.isKinematic(), worldEnableCCD);
341 physx::PxRigidDynamic &body)
344 body.setActorFlag(physx::PxActorFlag::eDISABLE_GRAVITY, !gravityEnabled);
358 body.setLinearVelocity(physx::PxVec3(0, 0, 0));
359 body.setAngularVelocity(physx::PxVec3(0, 0, 0));
361 auto *parentNode = rigidBody.parentNode();
362 QVector3D scenePosition = parentNode ? parentNode->mapPositionToScene(position) : position;
365 body.setGlobalPose(physx::PxTransform(
366 QPhysicsUtils::toPhysXType(scenePosition),
367 QPhysicsUtils::toPhysXType(QQuaternion::fromEulerAngles(eulerRotation))));
371 float inMass,
const QVector3D &inInertia)
QPhysicsCommandApplyCentralForce(const QVector3D &inForce)
~QPhysicsCommandApplyCentralForce() override
QPhysicsCommandApplyCentralImpulse(const QVector3D &inImpulse)
~QPhysicsCommandApplyCentralImpulse() override
QPhysicsCommandApplyForce(const QVector3D &inForce, const QVector3D &inPosition)
~QPhysicsCommandApplyForce() override
~QPhysicsCommandApplyImpulse() override
QPhysicsCommandApplyImpulse(const QVector3D &inImpulse, const QVector3D &inPosition)
~QPhysicsCommandApplyTorqueImpulse() override
QPhysicsCommandApplyTorqueImpulse(const QVector3D &inImpulse)
~QPhysicsCommandApplyTorque() override
QPhysicsCommandApplyTorque(const QVector3D &inTorque)
~QPhysicsCommandReset() override
QPhysicsCommandReset(QVector3D inPosition, QVector3D inEulerRotation)
QPhysicsCommandSetAngularVelocity(const QVector3D &inAngularVelocity)
~QPhysicsCommandSetAngularVelocity() override
QPhysicsCommandSetCCD(QDynamicRigidBody::CCDType ccdType, bool worldEnableCCD)
~QPhysicsCommandSetCCD() override
QPhysicsCommandSetDensity(float inDensity)
~QPhysicsCommandSetDensity() override
QPhysicsCommandSetGravityEnabled(bool inGravityEnabled)
~QPhysicsCommandSetGravityEnabled() override
~QPhysicsCommandSetIsKinematic() override
QPhysicsCommandSetIsKinematic(bool inIsKinematic, bool worldEnableCCD)
~QPhysicsCommandSetLinearVelocity() override
QPhysicsCommandSetLinearVelocity(const QVector3D &inLinearVelocity)
~QPhysicsCommandSetMassAndInertiaMatrix() override
QPhysicsCommandSetMassAndInertiaMatrix(float inMass, const QMatrix3x3 &inInertia)
QPhysicsCommandSetMassAndInertiaTensor(float inMass, const QVector3D &inInertia)
~QPhysicsCommandSetMassAndInertiaTensor() override
QPhysicsCommandSetMass(float inMass)
~QPhysicsCommandSetMass() override
virtual ~QPhysicsCommand()
static void resolveCCDFlags(physx::PxRigidBody &body, QDynamicRigidBody::CCDType ccd, bool isKinematic, bool worldEnableCCD)
static bool isSimulationDisabled(physx::PxRigidBody &body)
static QT_BEGIN_NAMESPACE bool isKinematicBody(physx::PxRigidDynamic &body)