Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qdynamicrigidbody_p.h
Go to the documentation of this file.
1// Copyright (C) 2021 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
3// Qt-Security score:significant reason:default
4
5#ifndef DYNAMICRIGIDBODY_H
6#define DYNAMICRIGIDBODY_H
7
8//
9// W A R N I N G
10// -------------
11//
12// This file is not part of the Qt API. It exists purely as an
13// implementation detail. This header file may change from version to
14// version without notice, or even be removed.
15//
16// We mean it.
17//
18
19#include <QtQuick3DPhysics/private/qabstractphysicsbody_p.h>
20#include <QtQml/QQmlEngine>
21
22#include <QtCore/QQueue>
23#include <QtQuick3DUtils/private/qssgutils_p.h>
24
25#include <QtGui/qquaternion.h>
26
28
29class QPhysicsCommand;
30
31class Q_QUICK3DPHYSICS_EXPORT QDynamicRigidBody : public QAbstractPhysicsBody
32{
33public:
34 enum class MassMode {
35 DefaultDensity,
36 CustomDensity,
37 Mass,
38 MassAndInertiaTensor,
39 MassAndInertiaMatrix,
40 };
41 Q_ENUM(MassMode)
42
43 enum class CCDType {
44 None,
45 SpeculativeCCD,
46 SweepBasedCCD,
47 };
48 Q_ENUM(CCDType)
49
50 enum AxisLock {
51 LockNone = 0,
52 LockX = 1,
53 LockY = 2,
54 LockZ = 4,
55 };
56 Q_ENUM(AxisLock)
57
58 Q_OBJECT
59 Q_PROPERTY(float mass READ mass WRITE setMass NOTIFY massChanged)
60 Q_PROPERTY(float density READ density WRITE setDensity NOTIFY densityChanged)
61
62 Q_PROPERTY(AxisLock linearAxisLock READ linearAxisLock WRITE setLinearAxisLock NOTIFY
63 linearAxisLockChanged REVISION(6, 5))
64 Q_PROPERTY(AxisLock angularAxisLock READ angularAxisLock WRITE setAngularAxisLock NOTIFY
65 angularAxisLockChanged REVISION(6, 5))
66
67 Q_PROPERTY(CCDType ccd READ ccd WRITE setCCD NOTIFY ccdChanged REVISION(6, 13))
69 Q_PROPERTY(bool isKinematic READ isKinematic WRITE setIsKinematic NOTIFY isKinematicChanged)
70 Q_PROPERTY(bool gravityEnabled READ gravityEnabled WRITE setGravityEnabled NOTIFY
71 gravityEnabledChanged)
73 Q_PROPERTY(MassMode massMode READ massMode WRITE setMassMode NOTIFY massModeChanged)
74 Q_PROPERTY(QVector3D inertiaTensor READ inertiaTensor WRITE setInertiaTensor NOTIFY
75 inertiaTensorChanged)
76 Q_PROPERTY(QVector3D centerOfMassPosition READ centerOfMassPosition WRITE
77 setCenterOfMassPosition NOTIFY centerOfMassPositionChanged)
78 Q_PROPERTY(QQuaternion centerOfMassRotation READ centerOfMassRotation WRITE
79 setCenterOfMassRotation NOTIFY centerOfMassRotationChanged)
80 Q_PROPERTY(QList<float> inertiaMatrix READ readInertiaMatrix WRITE setInertiaMatrix NOTIFY
81 inertiaMatrixChanged);
83 Q_PROPERTY(QVector3D kinematicPosition READ kinematicPosition WRITE setKinematicPosition NOTIFY
84 kinematicPositionChanged REVISION(6, 5));
85 Q_PROPERTY(QVector3D kinematicEulerRotation READ kinematicEulerRotation WRITE
86 setKinematicEulerRotation NOTIFY kinematicEulerRotationChanged REVISION(6,
87 5));
88 Q_PROPERTY(QQuaternion kinematicRotation READ kinematicRotation WRITE setKinematicRotation
89 NOTIFY kinematicRotationChanged REVISION(6, 5));
90 Q_PROPERTY(QVector3D kinematicPivot READ kinematicPivot WRITE setKinematicPivot NOTIFY
91 kinematicPivotChanged REVISION(6, 5));
92
93 Q_PROPERTY(bool isSleeping READ isSleeping WRITE setIsSleeping NOTIFY isSleepingChanged
94 REVISION(6, 9));
95 Q_PROPERTY(QVector3D linearVelocity READ linearVelocity NOTIFY linearVelocityChanged
96 REVISION(6, 13))
97 Q_PROPERTY(QVector3D angularVelocity READ angularVelocity NOTIFY angularVelocityChanged
98 REVISION(6, 13))
99
100 // clang-format off
101// // ??? separate simulation control object? --- some of these have default values in the engine, so we need tristate
102// Q_PROPERTY(float sleepThreshold READ sleepThreshold WRITE setSleepThreshold NOTIFY sleepThresholdChanged)
103// Q_PROPERTY(float stabilizationThreshold READ stabilizationThreshold WRITE setStabilizationThreshold NOTIFY stabilizationThresholdChanged)
104// Q_PROPERTY(float contactReportThreshold READ contactReportThreshold WRITE setContactReportThreshold NOTIFY contactReportThresholdChanged)
105// Q_PROPERTY(float maxContactImpulse READ maxContactImpulse WRITE setMaxContactImpulse NOTIFY maxContactImpulseChanged)
106// Q_PROPERTY(float maxDepenetrationVelocity READ maxDepenetrationVelocity WRITE setMaxDepenetrationVelocity NOTIFY maxDepenetrationVelocityChanged)
107// Q_PROPERTY(float maxAngularVelocity READ maxAngularVelocity WRITE setMaxAngularVelocity NOTIFY maxAngularVelocityChanged)
108// Q_PROPERTY(int minPositionIterationCount READ minPositionIterationCount WRITE setMinPositionIterationCount NOTIFY minPositionIterationCountChanged)
109// Q_PROPERTY(int minVelocityIterationCount READ minVelocityIterationCount WRITE setMinVelocityIterationCount NOTIFY minVelocityIterationCountChanged)
110 // clang-format on
111 QML_NAMED_ELEMENT(DynamicRigidBody)
112
113public:
114 QDynamicRigidBody();
115 ~QDynamicRigidBody();
117 float mass() const;
118 void setMass(float mass);
120 float density() const;
121 void setDensity(float density);
123 bool isKinematic() const;
124 void setIsKinematic(bool isKinematic);
125
126 Q_REVISION(6, 13) CCDType ccd() const;
127 Q_REVISION(6, 13) void setCCD(CCDType newCCD);
128
129 Q_REVISION(6, 5) AxisLock linearAxisLock() const;
130 Q_REVISION(6, 5) void setLinearAxisLock(AxisLock newAxisLockLinear);
131
132 Q_REVISION(6, 5) AxisLock angularAxisLock() const;
133 Q_REVISION(6, 5) void setAngularAxisLock(AxisLock newAxisLockAngular);
134
135 bool gravityEnabled() const;
136 void setGravityEnabled(bool gravityEnabled);
137
138 Q_INVOKABLE void applyCentralForce(const QVector3D &force);
139 Q_INVOKABLE void applyForce(const QVector3D &force, const QVector3D &position);
140 Q_INVOKABLE void applyTorque(const QVector3D &torque);
141 Q_INVOKABLE void applyCentralImpulse(const QVector3D &impulse);
142 Q_INVOKABLE void applyImpulse(const QVector3D &impulse, const QVector3D &position);
143 Q_INVOKABLE void applyTorqueImpulse(const QVector3D &impulse);
144 Q_INVOKABLE void setAngularVelocity(const QVector3D &angularVelocity);
145 Q_INVOKABLE void setLinearVelocity(const QVector3D &linearVelocity);
146 Q_INVOKABLE void reset(const QVector3D &position, const QVector3D &eulerRotation);
147
148 // Internal
149 QQueue<QPhysicsCommand *> &commandQueue();
150
151 void updateDefaultDensity(float defaultDensity);
152
153 MassMode massMode() const;
154 void setMassMode(const MassMode newMassMode);
155
156 const QVector3D &inertiaTensor() const;
157 void setInertiaTensor(const QVector3D &newInertiaTensor);
159 const QVector3D &centerOfMassPosition() const;
160 void setCenterOfMassPosition(const QVector3D &newCenterOfMassPosition);
162 const QQuaternion &centerOfMassRotation() const;
163 void setCenterOfMassRotation(const QQuaternion &newCenterOfMassRotation);
165 const QList<float> &readInertiaMatrix() const;
166 void setInertiaMatrix(const QList<float> &newInertiaMatrix);
167 const QMatrix3x3 &inertiaMatrix() const;
169 Q_REVISION(6, 5) void setKinematicPosition(const QVector3D &position);
170 Q_REVISION(6, 5) QVector3D kinematicPosition() const;
172 Q_REVISION(6, 5) void setKinematicRotation(const QQuaternion &rotation);
173 Q_REVISION(6, 5) QQuaternion kinematicRotation() const;
175 Q_REVISION(6, 5) void setKinematicEulerRotation(const QVector3D &rotation);
176 Q_REVISION(6, 5) QVector3D kinematicEulerRotation() const;
177
178 Q_REVISION(6, 5) void setKinematicPivot(const QVector3D &pivot);
179 Q_REVISION(6, 5) QVector3D kinematicPivot() const;
180
181 Q_REVISION(6, 9) void setIsSleeping(bool newIsSleeping);
182 Q_REVISION(6, 9) bool isSleeping() const;
184 Q_REVISION(6, 13) QVector3D linearVelocity() const;
185 Q_REVISION(6, 13) QVector3D angularVelocity() const;
186
187 void updateLinearVelocity(const QVector3D &velocity);
188 void updateAngularVelocity(const QVector3D &velocity);
190 QAbstractPhysXNode *createPhysXBackend() final;
192Q_SIGNALS:
193 void massChanged(float mass);
194 void densityChanged(float density);
195 void isKinematicChanged(bool isKinematic);
196 Q_REVISION(6, 13) void ccdChanged();
198 Q_REVISION(6, 5) void linearAxisLockChanged();
199 Q_REVISION(6, 5) void angularAxisLockChanged();
200 void gravityEnabledChanged();
201 void massModeChanged();
202 void inertiaTensorChanged();
203 void centerOfMassPositionChanged();
204 void centerOfMassRotationChanged();
205 void inertiaMatrixChanged();
206 Q_REVISION(6, 5) void kinematicPositionChanged(const QVector3D &kinematicPosition);
207 Q_REVISION(6, 5) void kinematicRotationChanged(const QQuaternion &kinematicRotation);
208 Q_REVISION(6, 5) void kinematicEulerRotationChanged(const QVector3D &kinematicEulerRotation);
209 Q_REVISION(6, 5) void kinematicPivotChanged(const QVector3D &kinematicPivot);
210 Q_REVISION(6, 9) void isSleepingChanged(bool isSleeping);
211 Q_REVISION(6, 13) void linearVelocityChanged(const QVector3D &linearVelocity);
212 Q_REVISION(6, 13) void angularVelocityChanged(const QVector3D &angularVelocity);
213
214private:
215 float m_mass = 1.f;
216 float m_density = 0.001f;
217 QVector3D m_centerOfMassPosition;
218 QQuaternion m_centerOfMassRotation;
219 QList<float> m_inertiaMatrixList;
220 QMatrix3x3 m_inertiaMatrix;
221 QVector3D m_inertiaTensor;
222
223 CCDType m_CCD = CCDType::None;
224 bool m_isKinematic = false;
225 AxisLock m_linearAxisLock = AxisLock::LockNone;
226 AxisLock m_angularAxisLock = AxisLock::LockNone;
227 QQueue<QPhysicsCommand *> m_commandQueue;
228 bool m_gravityEnabled = true;
229 MassMode m_massMode = MassMode::DefaultDensity;
230
231 QVector3D m_kinematicPosition;
232 RotationData m_kinematicRotation;
233 QVector3D m_kinematicPivot;
234 bool m_isSleeping = false;
235 QVector3D m_linearVelocity;
236 QVector3D m_angularVelocity;
237};
238
240
241#endif // DYNAMICRIGIDBODY_H
void setShapesDirty(bool dirty)
void buildShapes(QPhysXWorld *physX)
virtual void createActor(QPhysXWorld *physX)
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
void createActor(QPhysXWorld *physX) override
QPhysXRigidBody(QAbstractPhysicsBody *frontEnd)
QPhysicsMaterial * qtMaterial() const override
QPhysicsCommandApplyCentralForce(const QVector3D &inForce)
void execute(const QDynamicRigidBody &rigidBody, physx::PxRigidDynamic &body) override
QPhysicsCommandApplyCentralImpulse(const QVector3D &inImpulse)
void execute(const QDynamicRigidBody &rigidBody, physx::PxRigidDynamic &body) override
void execute(const QDynamicRigidBody &rigidBody, physx::PxRigidDynamic &body) override
QPhysicsCommandApplyForce(const QVector3D &inForce, const QVector3D &inPosition)
~QPhysicsCommandApplyForce() override
~QPhysicsCommandApplyImpulse() override
QPhysicsCommandApplyImpulse(const QVector3D &inImpulse, const QVector3D &inPosition)
void execute(const QDynamicRigidBody &rigidBody, physx::PxRigidDynamic &body) override
QPhysicsCommandApplyTorqueImpulse(const QVector3D &inImpulse)
void execute(const QDynamicRigidBody &rigidBody, physx::PxRigidDynamic &body) override
void execute(const QDynamicRigidBody &rigidBody, physx::PxRigidDynamic &body) override
~QPhysicsCommandApplyTorque() override
QPhysicsCommandApplyTorque(const QVector3D &inTorque)
~QPhysicsCommandReset() override
QPhysicsCommandReset(QVector3D inPosition, QVector3D inEulerRotation)
void execute(const QDynamicRigidBody &rigidBody, physx::PxRigidDynamic &body) override
void execute(const QDynamicRigidBody &rigidBody, physx::PxRigidDynamic &body) override
QPhysicsCommandSetAngularVelocity(const QVector3D &inAngularVelocity)
QPhysicsCommandSetCCD(QDynamicRigidBody::CCDType ccdType, bool worldEnableCCD)
~QPhysicsCommandSetCCD() override
void execute(const QDynamicRigidBody &rigidBody, physx::PxRigidDynamic &body) override
QPhysicsCommandSetDensity(float inDensity)
~QPhysicsCommandSetDensity() override
void execute(const QDynamicRigidBody &rigidBody, physx::PxRigidDynamic &body) override
QPhysicsCommandSetGravityEnabled(bool inGravityEnabled)
void execute(const QDynamicRigidBody &rigidBody, physx::PxRigidDynamic &body) override
~QPhysicsCommandSetIsKinematic() override
void execute(const QDynamicRigidBody &rigidBody, physx::PxRigidDynamic &body) override
QPhysicsCommandSetIsKinematic(bool inIsKinematic, bool worldEnableCCD)
void execute(const QDynamicRigidBody &rigidBody, physx::PxRigidDynamic &body) override
QPhysicsCommandSetLinearVelocity(const QVector3D &inLinearVelocity)
void execute(const QDynamicRigidBody &rigidBody, physx::PxRigidDynamic &body) override
QPhysicsCommandSetMassAndInertiaMatrix(float inMass, const QMatrix3x3 &inInertia)
void execute(const QDynamicRigidBody &rigidBody, physx::PxRigidDynamic &body) override
QPhysicsCommandSetMassAndInertiaTensor(float inMass, const QVector3D &inInertia)
QPhysicsCommandSetMass(float inMass)
void execute(const QDynamicRigidBody &rigidBody, physx::PxRigidDynamic &body) override
~QPhysicsCommandSetMass() override
virtual void execute(const QDynamicRigidBody &rigidBody, physx::PxRigidDynamic &body)=0
virtual ~QPhysicsCommand()
PxTransformT< float > PxTransform
DebugDrawBodyType
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::PxRigidDynamic &body)
#define QT_BEGIN_NAMESPACE
#define QT_END_NAMESPACE
static StaticPhysXObjects & getReference()