6#include "physxnode/qabstractphysxnode_p.h"
7#include "physxnode/qphysxactorbody_p.h"
13#include <extensions/PxJoint.h>
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
39
40
41
42
43
44
47
48
49
50
51
52
55
56
57
58
59
60
63
64
65
66
67
68
71
72
73
74
75
76
79
80
81
82
83
84
86QPhysicsJoint::QPhysicsJoint()
88 QPhysicsWorld::registerJoint(
this);
91QPhysicsJoint::~QPhysicsJoint()
93 QPhysicsWorld::deregisterJoint(
this);
96QAbstractPhysicsBody *QPhysicsJoint::bodyA()
const
101void QPhysicsJoint::setBodyA(QAbstractPhysicsBody *newBodyA)
103 if (m_bodyA == newBodyA)
107 m_bodyA->disconnect(
this);
109 connect(newBodyA, &QAbstractPhysicsBody::destroyed,
this, &QPhysicsJoint::onBodyDestroyed);
112 m_needsRebuild =
true;
116QAbstractPhysicsBody *QPhysicsJoint::bodyB()
const
121void QPhysicsJoint::setBodyB(QAbstractPhysicsBody *newBodyB)
123 if (m_bodyB == newBodyB)
127 m_bodyB->disconnect(
this);
129 connect(newBodyB, &QAbstractPhysicsBody::destroyed,
this, &QPhysicsJoint::onBodyDestroyed);
132 m_needsRebuild =
true;
136QVector3D QPhysicsJoint::positionA()
const
141void QPhysicsJoint::setPositionA(
const QVector3D &newPositionA)
143 if (m_positionA == newPositionA)
145 m_positionA = newPositionA;
146 m_needsRebuild =
true;
147 emit positionAChanged();
150QVector3D QPhysicsJoint::positionB()
const
155void QPhysicsJoint::setPositionB(
const QVector3D &newPositionB)
157 if (m_positionB == newPositionB)
159 m_positionB = newPositionB;
160 m_needsRebuild =
true;
161 emit positionBChanged();
164QQuaternion QPhysicsJoint::orientationA()
const
166 return m_orientationA;
169void QPhysicsJoint::setOrientationA(
const QQuaternion &newOrientationA)
171 if (m_orientationA == newOrientationA)
173 m_orientationA = newOrientationA;
174 m_needsRebuild =
true;
175 emit orientationAChanged();
178QQuaternion QPhysicsJoint::orientationB()
const
180 return m_orientationB;
183void QPhysicsJoint::setOrientationB(
const QQuaternion &newOrientationB)
185 if (m_orientationB == newOrientationB)
187 m_orientationB = newOrientationB;
188 m_needsRebuild =
true;
189 emit orientationBChanged();
192physx::PxJoint *QPhysicsJoint::getPhysXBackend()
const
197void QPhysicsJoint::onBodyDestroyed(QObject *body)
201 body->disconnect(
this);
208void QPhysicsJoint::updatePhysXBackend()
210 if (!m_dirtyProperties && !m_needsRebuild)
213 if (m_joint && m_needsRebuild) {
218 if (!m_bodyA && !m_bodyB)
221 QPhysXActorBody *actorBodyA = m_bodyA && m_bodyA->m_backendObject
222 ? qobject_cast<QPhysXActorBody *>(m_bodyA->m_backendObject)
224 QPhysXActorBody *actorBodyB = m_bodyB && m_bodyB->m_backendObject
225 ? qobject_cast<QPhysXActorBody *>(m_bodyB->m_backendObject)
227 physx::PxRigidActor *actorA = actorBodyA ? actorBodyA->actor :
nullptr;
228 physx::PxRigidActor *actorB = actorBodyB ? actorBodyB->actor :
nullptr;
230 if (!actorA && !actorB)
233 Q_ASSERT(StaticPhysXObjects::getReference().physicsCreated);
234 Q_ASSERT(StaticPhysXObjects::getReference().physics);
237 const bool compatibleTypes =
238 (actorA && actorA->getType() == physx::PxActorType::Enum::eRIGID_DYNAMIC)
239 || (actorB && actorB->getType() == physx::PxActorType::Enum::eRIGID_DYNAMIC);
241 if (!compatibleTypes) {
242 qWarning() <<
"QPhysicsJoint: Incompatible body types used for joint.";
245 if (m_needsRebuild && compatibleTypes) {
246 const auto trfA = physx::PxTransform(QPhysicsUtils::toPhysXType(m_positionA),
247 QPhysicsUtils::toPhysXType(m_orientationA));
248 const auto trfB = physx::PxTransform(QPhysicsUtils::toPhysXType(m_positionB),
249 QPhysicsUtils::toPhysXType(m_orientationB));
250 m_joint = createPhysxJoint(actorA, actorB, trfA, trfB);
253 if (m_joint && (m_dirtyProperties || m_needsRebuild)) {
254 setJointProperties();
257 m_dirtyProperties =
false;
258 m_needsRebuild =
false;
#define QT_BEGIN_NAMESPACE