6#include "PxRigidDynamic.h"
19 for (
auto command : commandQueue) {
20 command->execute(rigidBody, body);
28 QHash<QQuick3DNode *, QMatrix4x4> &transformCache)
31 if (transformCache.contains(node))
32 return transformCache[node];
37 if (
auto drb = qobject_cast<const QDynamicRigidBody *>(node); drb !=
nullptr) {
38 if (!drb->isKinematic()) {
39 qWarning() <<
"Non-kinematic body as a parent of a kinematic body is unsupported";
42 drb->kinematicPosition(), drb->scale(), drb->kinematicPivot(),
43 drb->kinematicRotation());
51 return localTransform;
66 ? physx::PxRigidDynamicLockFlag::eLOCK_ANGULAR_X
69 ? physx::PxRigidDynamicLockFlag::eLOCK_ANGULAR_Y
72 ? physx::PxRigidDynamicLockFlag::eLOCK_ANGULAR_Z
75 ? physx::PxRigidDynamicLockFlag::eLOCK_LINEAR_X
78 ? physx::PxRigidDynamicLockFlag::eLOCK_LINEAR_Y
81 ? physx::PxRigidDynamicLockFlag::eLOCK_LINEAR_Z
83 return static_cast<physx::PxRigidDynamicLockFlags
>(
flags);
101 auto dynamicActor =
static_cast<physx::PxRigidDynamic *
>(
actor);
112 auto *dynamicActor =
static_cast<physx::PxRigidDynamic *
>(
actor);
114 if (dynamicRigidBody->isKinematic()) {
121 dynamicActor->setRigidDynamicLockFlags(
getLockFlags(dynamicRigidBody));
124 const bool disabledPrevious =
actor->getActorFlags() & physx::PxActorFlag::eDISABLE_SIMULATION;
125 const bool disabled = !dynamicRigidBody->simulationEnabled();
127 actor->setActorFlag(physx::PxActorFlag::eDISABLE_SIMULATION,
disabled);
128 if (!
disabled && !dynamicRigidBody->isKinematic())
129 dynamicActor->wakeUp();
145 if (!drb->hasStaticShapes()) {
148 switch (drb->massMode()) {
158 const float mass =
qMax(drb->mass(), 0.f);
163 const float mass =
qMax(drb->mass(), 0.f);
168 const float mass =
qMax(drb->mass(), 0.f);
174 drb->commandQueue().enqueue(command);
175 }
else if (!drb->isKinematic()) {
177 qWarning() <<
"Cannot make body containing trimesh/heightfield/plane non-kinematic, "
178 "forcing kinematic.";
179 drb->setIsKinematic(
true);
182 auto *dynamicBody =
static_cast<physx::PxRigidDynamic *
>(
actor);
183 dynamicBody->setRigidBodyFlag(physx::PxRigidBodyFlag::eKINEMATIC, drb->isKinematic());
185 if (
world->enableCCD() && !drb->isKinematic())
186 dynamicBody->setRigidBodyFlag(physx::PxRigidBodyFlag::eENABLE_CCD,
true);
QAbstractPhysicsNode * frontendNode
void setShapesDirty(bool dirty)
void updateFromPhysicsTransform(const physx::PxTransform &transform)
void updateDefaultDensity(float defaultDensity)
The QMatrix4x4 class represents a 4x4 transformation matrix in 3D space.
void buildShapes(QPhysXWorld *physX)
physx::PxRigidActor * actor
void sync(float deltaTime, QHash< QQuick3DNode *, QMatrix4x4 > &transformCache) override
void updateDefaultDensity(float density) override
QPhysXDynamicBody(QDynamicRigidBody *frontEnd)
DebugDrawBodyType getDebugDrawBodyType() override
void sync(float deltaTime, QHash< QQuick3DNode *, QMatrix4x4 > &transformCache) override
void rebuildDirtyShapes(QPhysicsWorld *world, QPhysXWorld *physX) override
QQuick3DNode * parentNode() const
The QVector3D class represents a vector or vertex in 3D space.
Q_ALWAYS_INLINE physx::PxVec3 toPhysXType(const QVector3D &qvec)
QMatrix3x3 Q_QUICK3DUTILS_EXPORT getUpper3x3(const QMatrix4x4 &m)
void Q_QUICK3DUTILS_EXPORT normalize(QMatrix4x4 &m)
QVector3D Q_QUICK3DUTILS_EXPORT getPosition(const QMatrix4x4 &m)
Combined button and popup list for selecting options.
constexpr const T & qMax(const T &a, const T &b)
GLuint GLenum GLenum transform
static QMatrix4x4 calculateKinematicNodeTransform(QQuick3DNode *node, QHash< QQuick3DNode *, QMatrix4x4 > &transformCache)
static physx::PxTransform getPhysXWorldTransform(const QMatrix4x4 transform)
static physx::PxRigidDynamicLockFlags getLockFlags(QDynamicRigidBody *body)
static QT_BEGIN_NAMESPACE void processCommandQueue(QQueue< QPhysicsCommand * > &commandQueue, const QDynamicRigidBody &rigidBody, physx::PxRigidBody &body)
rect sceneTransform().map(QPointF(0
QLatin1StringView world("world")
static QMatrix4x4 calculateTransformMatrix(QVector3D position, QVector3D scale, QVector3D pivot, QQuaternion rotation)