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
96 // clang-format off
97// // ??? separate simulation control object? --- some of these have default values in the engine, so we need tristate
98// Q_PROPERTY(float sleepThreshold READ sleepThreshold WRITE setSleepThreshold NOTIFY sleepThresholdChanged)
99// Q_PROPERTY(float stabilizationThreshold READ stabilizationThreshold WRITE setStabilizationThreshold NOTIFY stabilizationThresholdChanged)
100// Q_PROPERTY(float contactReportThreshold READ contactReportThreshold WRITE setContactReportThreshold NOTIFY contactReportThresholdChanged)
101// Q_PROPERTY(float maxContactImpulse READ maxContactImpulse WRITE setMaxContactImpulse NOTIFY maxContactImpulseChanged)
102// Q_PROPERTY(float maxDepenetrationVelocity READ maxDepenetrationVelocity WRITE setMaxDepenetrationVelocity NOTIFY maxDepenetrationVelocityChanged)
103// Q_PROPERTY(float maxAngularVelocity READ maxAngularVelocity WRITE setMaxAngularVelocity NOTIFY maxAngularVelocityChanged)
104// Q_PROPERTY(int minPositionIterationCount READ minPositionIterationCount WRITE setMinPositionIterationCount NOTIFY minPositionIterationCountChanged)
105// Q_PROPERTY(int minVelocityIterationCount READ minVelocityIterationCount WRITE setMinVelocityIterationCount NOTIFY minVelocityIterationCountChanged)
106 // clang-format on
107 QML_NAMED_ELEMENT(DynamicRigidBody)
108
109public:
110 QDynamicRigidBody();
111 ~QDynamicRigidBody();
113 float mass() const;
114 void setMass(float mass);
116 float density() const;
117 void setDensity(float density);
119 bool isKinematic() const;
120 void setIsKinematic(bool isKinematic);
121
122 Q_REVISION(6, 13) CCDType ccd() const;
123 Q_REVISION(6, 13) void setCCD(CCDType newCCD);
124
125 Q_REVISION(6, 5) AxisLock linearAxisLock() const;
126 Q_REVISION(6, 5) void setLinearAxisLock(AxisLock newAxisLockLinear);
127
128 Q_REVISION(6, 5) AxisLock angularAxisLock() const;
129 Q_REVISION(6, 5) void setAngularAxisLock(AxisLock newAxisLockAngular);
130
131 bool gravityEnabled() const;
132 void setGravityEnabled(bool gravityEnabled);
133
134 Q_INVOKABLE void applyCentralForce(const QVector3D &force);
135 Q_INVOKABLE void applyForce(const QVector3D &force, const QVector3D &position);
136 Q_INVOKABLE void applyTorque(const QVector3D &torque);
137 Q_INVOKABLE void applyCentralImpulse(const QVector3D &impulse);
138 Q_INVOKABLE void applyImpulse(const QVector3D &impulse, const QVector3D &position);
139 Q_INVOKABLE void applyTorqueImpulse(const QVector3D &impulse);
140 Q_INVOKABLE void setAngularVelocity(const QVector3D &angularVelocity);
141 Q_INVOKABLE void setLinearVelocity(const QVector3D &linearVelocity);
142 Q_INVOKABLE void reset(const QVector3D &position, const QVector3D &eulerRotation);
143
144 // Internal
145 QQueue<QPhysicsCommand *> &commandQueue();
146
147 void updateDefaultDensity(float defaultDensity);
148
149 MassMode massMode() const;
150 void setMassMode(const MassMode newMassMode);
151
152 const QVector3D &inertiaTensor() const;
153 void setInertiaTensor(const QVector3D &newInertiaTensor);
155 const QVector3D &centerOfMassPosition() const;
156 void setCenterOfMassPosition(const QVector3D &newCenterOfMassPosition);
158 const QQuaternion &centerOfMassRotation() const;
159 void setCenterOfMassRotation(const QQuaternion &newCenterOfMassRotation);
161 const QList<float> &readInertiaMatrix() const;
162 void setInertiaMatrix(const QList<float> &newInertiaMatrix);
163 const QMatrix3x3 &inertiaMatrix() const;
165 Q_REVISION(6, 5) void setKinematicPosition(const QVector3D &position);
166 Q_REVISION(6, 5) QVector3D kinematicPosition() const;
168 Q_REVISION(6, 5) void setKinematicRotation(const QQuaternion &rotation);
169 Q_REVISION(6, 5) QQuaternion kinematicRotation() const;
170
171 Q_REVISION(6, 5) void setKinematicEulerRotation(const QVector3D &rotation);
172 Q_REVISION(6, 5) QVector3D kinematicEulerRotation() const;
174 Q_REVISION(6, 5) void setKinematicPivot(const QVector3D &pivot);
175 Q_REVISION(6, 5) QVector3D kinematicPivot() const;
176
177 Q_REVISION(6, 9) void setIsSleeping(bool newIsSleeping);
178 Q_REVISION(6, 9) bool isSleeping() const;
180 QAbstractPhysXNode *createPhysXBackend() final;
182Q_SIGNALS:
183 void massChanged(float mass);
184 void densityChanged(float density);
185 void isKinematicChanged(bool isKinematic);
186 Q_REVISION(6, 13) void ccdChanged();
188 Q_REVISION(6, 5) void linearAxisLockChanged();
189 Q_REVISION(6, 5) void angularAxisLockChanged();
190 void gravityEnabledChanged();
191 void massModeChanged();
192 void inertiaTensorChanged();
193 void centerOfMassPositionChanged();
194 void centerOfMassRotationChanged();
195 void inertiaMatrixChanged();
196 Q_REVISION(6, 5) void kinematicPositionChanged(const QVector3D &kinematicPosition);
197 Q_REVISION(6, 5) void kinematicRotationChanged(const QQuaternion &kinematicRotation);
198 Q_REVISION(6, 5) void kinematicEulerRotationChanged(const QVector3D &kinematicEulerRotation);
199 Q_REVISION(6, 5) void kinematicPivotChanged(const QVector3D &kinematicPivot);
200 Q_REVISION(6, 9) void isSleepingChanged(bool isSleeping);
201
202private:
203 float m_mass = 1.f;
204 float m_density = 0.001f;
205 QVector3D m_centerOfMassPosition;
206 QQuaternion m_centerOfMassRotation;
207 QList<float> m_inertiaMatrixList;
208 QMatrix3x3 m_inertiaMatrix;
209 QVector3D m_inertiaTensor;
210
211 CCDType m_CCD = CCDType::None;
212 bool m_isKinematic = false;
213 AxisLock m_linearAxisLock = AxisLock::LockNone;
214 AxisLock m_angularAxisLock = AxisLock::LockNone;
215 QQueue<QPhysicsCommand *> m_commandQueue;
216 bool m_gravityEnabled = true;
217 MassMode m_massMode = MassMode::DefaultDensity;
218
219 QVector3D m_kinematicPosition;
220 RotationData m_kinematicRotation;
221 QVector3D m_kinematicPivot;
222 bool m_isSleeping = false;
223};
224
226
227#endif // DYNAMICRIGIDBODY_H
void setShapesDirty(bool dirty)
void buildShapes(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
QPhysXRigidBody(QAbstractPhysicsBody *frontEnd)
void createMaterial(QPhysXWorld *physX) override
QPhysicsCommandApplyCentralForce(const QVector3D &inForce)
void execute(const QDynamicRigidBody &rigidBody, physx::PxRigidBody &body) override
QPhysicsCommandApplyCentralImpulse(const QVector3D &inImpulse)
void execute(const QDynamicRigidBody &rigidBody, physx::PxRigidBody &body) override
QPhysicsCommandApplyForce(const QVector3D &inForce, const QVector3D &inPosition)
~QPhysicsCommandApplyForce() override
void execute(const QDynamicRigidBody &rigidBody, physx::PxRigidBody &body) override
void execute(const QDynamicRigidBody &rigidBody, physx::PxRigidBody &body) override
~QPhysicsCommandApplyImpulse() override
QPhysicsCommandApplyImpulse(const QVector3D &inImpulse, const QVector3D &inPosition)
QPhysicsCommandApplyTorqueImpulse(const QVector3D &inImpulse)
void execute(const QDynamicRigidBody &rigidBody, physx::PxRigidBody &body) override
void execute(const QDynamicRigidBody &rigidBody, physx::PxRigidBody &body) override
~QPhysicsCommandApplyTorque() override
QPhysicsCommandApplyTorque(const QVector3D &inTorque)
void execute(const QDynamicRigidBody &rigidBody, physx::PxRigidBody &body) override
~QPhysicsCommandReset() override
QPhysicsCommandReset(QVector3D inPosition, QVector3D inEulerRotation)
QPhysicsCommandSetAngularVelocity(const QVector3D &inAngularVelocity)
void execute(const QDynamicRigidBody &rigidBody, physx::PxRigidBody &body) override
QPhysicsCommandSetCCD(QDynamicRigidBody::CCDType ccdType, bool worldEnableCCD)
void execute(const QDynamicRigidBody &rigidBody, physx::PxRigidBody &body) override
~QPhysicsCommandSetCCD() override
QPhysicsCommandSetDensity(float inDensity)
~QPhysicsCommandSetDensity() override
void execute(const QDynamicRigidBody &rigidBody, physx::PxRigidBody &body) override
QPhysicsCommandSetGravityEnabled(bool inGravityEnabled)
void execute(const QDynamicRigidBody &rigidBody, physx::PxRigidBody &body) override
void execute(const QDynamicRigidBody &rigidBody, physx::PxRigidBody &body) override
~QPhysicsCommandSetIsKinematic() override
QPhysicsCommandSetIsKinematic(bool inIsKinematic, bool worldEnableCCD)
void execute(const QDynamicRigidBody &rigidBody, physx::PxRigidBody &body) override
QPhysicsCommandSetLinearVelocity(const QVector3D &inLinearVelocity)
QPhysicsCommandSetMassAndInertiaMatrix(float inMass, const QMatrix3x3 &inInertia)
void execute(const QDynamicRigidBody &rigidBody, physx::PxRigidBody &body) override
void execute(const QDynamicRigidBody &rigidBody, physx::PxRigidBody &body) override
QPhysicsCommandSetMassAndInertiaTensor(float inMass, const QVector3D &inInertia)
QPhysicsCommandSetMass(float inMass)
~QPhysicsCommandSetMass() override
void execute(const QDynamicRigidBody &rigidBody, physx::PxRigidBody &body) override
virtual void execute(const QDynamicRigidBody &rigidBody, physx::PxRigidBody &body)=0
virtual ~QPhysicsCommand()
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::PxRigidBody &body)
#define QT_BEGIN_NAMESPACE
#define QT_END_NAMESPACE