9#include "PxPhysicsAPI.h"
11#include <QtGui/qquaternion.h>
17 return static_cast<
bool>(body.getRigidBodyFlags() & physx::PxRigidBodyFlag::eKINEMATIC);
21 bool isKinematic,
bool worldEnableCCD)
24 case QDynamicRigidBody::CCDType::SweepBasedCCD: {
26 body.setRigidBodyFlag(physx::PxRigidBodyFlag::eENABLE_CCD, !isKinematic);
27 body.setRigidBodyFlag(physx::PxRigidBodyFlag::eENABLE_SPECULATIVE_CCD, isKinematic);
31 case QDynamicRigidBody::CCDType::SpeculativeCCD: {
32 body.setRigidBodyFlag(physx::PxRigidBodyFlag::eENABLE_SPECULATIVE_CCD,
true);
36 case QDynamicRigidBody::CCDType::None: {
39 body.setRigidBodyFlag(physx::PxRigidBodyFlag::eENABLE_CCD, !isKinematic);
40 body.setRigidBodyFlag(physx::PxRigidBodyFlag::eENABLE_SPECULATIVE_CCD, isKinematic);
59 physx::PxRigidBody &body)
64 body.addForce(QPhysicsUtils::toPhysXType(force));
68 const QVector3D &inPosition)
77 physx::PxRigidBody &body)
82 physx::PxRigidBodyExt::addForceAtPos(body, QPhysicsUtils::toPhysXType(force),
83 QPhysicsUtils::toPhysXType(position));
95 physx::PxRigidBody &body)
100 body.addTorque(QPhysicsUtils::toPhysXType(torque));
112 physx::PxRigidBody &body)
117 body.addForce(QPhysicsUtils::toPhysXType(impulse), physx::PxForceMode::eIMPULSE);
121 const QVector3D &inPosition)
130 physx::PxRigidBody &body)
135 physx::PxRigidBodyExt::addForceAtPos(body, QPhysicsUtils::toPhysXType(impulse),
136 QPhysicsUtils::toPhysXType(position),
137 physx::PxForceMode::eIMPULSE);
149 physx::PxRigidBody &body)
155 body.addTorque(QPhysicsUtils::toPhysXType(impulse), physx::PxForceMode::eIMPULSE);
159 const QVector3D &inAngularVelocity)
168 physx::PxRigidBody &body)
171 body.setAngularVelocity(QPhysicsUtils::toPhysXType(angularVelocity));
175 const QVector3D &inLinearVelocity)
184 physx::PxRigidBody &body)
187 body.setLinearVelocity(QPhysicsUtils::toPhysXType(linearVelocity));
197 if (rigidBody.hasStaticShapes()) {
198 qWarning() <<
"Cannot set mass or density on a body containing trimesh/heightfield/plane, "
203 physx::PxRigidBodyExt::setMassAndUpdateInertia(body, mass);
207 physx::PxRigidBody &body)
209 if (rigidBody.hasStaticShapes()) {
210 qWarning() <<
"Cannot set mass or density on a body containing trimesh/heightfield/plane, "
216 body.setCMassLocalPose(
217 physx::PxTransform(QPhysicsUtils::toPhysXType(rigidBody.centerOfMassPosition()),
218 QPhysicsUtils::toPhysXType(rigidBody.centerOfMassRotation())));
219 body.setMassSpaceInertiaTensor(QPhysicsUtils::toPhysXType(inertia));
223 float inMass,
const QMatrix3x3 &inInertia)
232 physx::PxRigidBody &body)
234 if (rigidBody.hasStaticShapes()) {
235 qWarning() <<
"Cannot set mass or density on a body containing trimesh/heightfield/plane, "
240 physx::PxQuat massFrame;
241 physx::PxVec3 diagTensor = physx::PxDiagonalize(QPhysicsUtils::toPhysXType(inertia), massFrame);
242 if ((diagTensor.x <= 0.0f) || (diagTensor.y <= 0.0f) || (diagTensor.z <= 0.0f))
245 body.setCMassLocalPose(physx::PxTransform(
246 QPhysicsUtils::toPhysXType(rigidBody.centerOfMassPosition()), massFrame));
248 body.setMassSpaceInertiaTensor(diagTensor);
260 physx::PxRigidBody &body)
262 if (rigidBody.hasStaticShapes()) {
263 qWarning() <<
"Cannot set mass or density on a body containing trimesh/heightfield/plane, "
268 physx::PxRigidBodyExt::updateMassAndInertia(body, density);
273 :
QPhysicsCommand(), isKinematic(inIsKinematic), worldEnableCCD(worldEnableCCD)
281 physx::PxRigidBody &body)
283 if (rigidBody.hasStaticShapes() && !isKinematic) {
284 qWarning() <<
"Cannot make a body containing trimesh/heightfield/plane non-kinematic, "
292 body.setRigidBodyFlag(physx::PxRigidBodyFlag::eENABLE_CCD,
false);
293 body.setRigidBodyFlag(physx::PxRigidBodyFlag::eENABLE_SPECULATIVE_CCD,
false);
294 body.setRigidBodyFlag(physx::PxRigidBodyFlag::eKINEMATIC, isKinematic);
297 resolveCCDFlags(body, rigidBody.ccd(), isKinematic, worldEnableCCD);
313 body.setRigidBodyFlag(physx::PxRigidBodyFlag::eENABLE_CCD,
false);
314 body.setRigidBodyFlag(physx::PxRigidBodyFlag::eENABLE_SPECULATIVE_CCD,
false);
316 resolveCCDFlags(body, ccdType, rigidBody.isKinematic(), worldEnableCCD);
328 physx::PxRigidBody &body)
331 body.setActorFlag(physx::PxActorFlag::eDISABLE_GRAVITY, !gravityEnabled);
345 body.setLinearVelocity(physx::PxVec3(0, 0, 0));
346 body.setAngularVelocity(physx::PxVec3(0, 0, 0));
348 auto *parentNode = rigidBody.parentNode();
349 QVector3D scenePosition = parentNode ? parentNode->mapPositionToScene(position) : position;
352 body.setGlobalPose(physx::PxTransform(
353 QPhysicsUtils::toPhysXType(scenePosition),
354 QPhysicsUtils::toPhysXType(QQuaternion::fromEulerAngles(eulerRotation))));
358 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 QT_BEGIN_NAMESPACE bool isKinematicBody(physx::PxRigidBody &body)
static void resolveCCDFlags(physx::PxRigidBody &body, QDynamicRigidBody::CCDType ccd, bool isKinematic, bool worldEnableCCD)