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
4#ifndef DYNAMICRIGIDBODY_H
5#define DYNAMICRIGIDBODY_H
6
7//
8// W A R N I N G
9// -------------
10//
11// This file is not part of the Qt API. It exists purely as an
12// implementation detail. This header file may change from version to
13// version without notice, or even be removed.
14//
15// We mean it.
16//
17
18#include <QtQuick3DPhysics/private/qabstractphysicsbody_p.h>
19#include <QtQml/QQmlEngine>
20
21#include <QtCore/QQueue>
22#include <QtQuick3DUtils/private/qssgutils_p.h>
23
24#include <QtGui/qquaternion.h>
25
27
28class QPhysicsCommand;
29
30class Q_QUICK3DPHYSICS_EXPORT QDynamicRigidBody : public QAbstractPhysicsBody
31{
32public:
33 enum class MassMode {
34 DefaultDensity,
35 CustomDensity,
36 Mass,
37 MassAndInertiaTensor,
38 MassAndInertiaMatrix,
39 };
40 Q_ENUM(MassMode)
41
42 enum AxisLock {
43 LockNone = 0,
44 LockX = 1,
45 LockY = 2,
46 LockZ = 4,
47 };
48 Q_ENUM(AxisLock)
49
50 Q_OBJECT
51 Q_PROPERTY(float mass READ mass WRITE setMass NOTIFY massChanged)
52 Q_PROPERTY(float density READ density WRITE setDensity NOTIFY densityChanged)
53
54 Q_PROPERTY(AxisLock linearAxisLock READ linearAxisLock WRITE setLinearAxisLock NOTIFY
55 linearAxisLockChanged REVISION(6, 5))
56 Q_PROPERTY(AxisLock angularAxisLock READ angularAxisLock WRITE setAngularAxisLock NOTIFY
57 angularAxisLockChanged REVISION(6, 5))
58
59 Q_PROPERTY(bool isKinematic READ isKinematic WRITE setIsKinematic NOTIFY isKinematicChanged)
60 Q_PROPERTY(bool gravityEnabled READ gravityEnabled WRITE setGravityEnabled NOTIFY
61 gravityEnabledChanged)
62
63 Q_PROPERTY(MassMode massMode READ massMode WRITE setMassMode NOTIFY massModeChanged)
64 Q_PROPERTY(QVector3D inertiaTensor READ inertiaTensor WRITE setInertiaTensor NOTIFY
65 inertiaTensorChanged)
66 Q_PROPERTY(QVector3D centerOfMassPosition READ centerOfMassPosition WRITE
67 setCenterOfMassPosition NOTIFY centerOfMassPositionChanged)
68 Q_PROPERTY(QQuaternion centerOfMassRotation READ centerOfMassRotation WRITE
69 setCenterOfMassRotation NOTIFY centerOfMassRotationChanged)
70 Q_PROPERTY(QList<float> inertiaMatrix READ readInertiaMatrix WRITE setInertiaMatrix NOTIFY
71 inertiaMatrixChanged);
72
73 Q_PROPERTY(QVector3D kinematicPosition READ kinematicPosition WRITE setKinematicPosition NOTIFY
74 kinematicPositionChanged REVISION(6, 5));
75 Q_PROPERTY(QVector3D kinematicEulerRotation READ kinematicEulerRotation WRITE
76 setKinematicEulerRotation NOTIFY kinematicEulerRotationChanged REVISION(6,
77 5));
78 Q_PROPERTY(QQuaternion kinematicRotation READ kinematicRotation WRITE setKinematicRotation
79 NOTIFY kinematicRotationChanged REVISION(6, 5));
80 Q_PROPERTY(QVector3D kinematicPivot READ kinematicPivot WRITE setKinematicPivot NOTIFY
81 kinematicPivotChanged REVISION(6, 5));
82
83 Q_PROPERTY(bool isSleeping READ isSleeping WRITE setIsSleeping NOTIFY isSleepingChanged
84 REVISION(6, 9));
85
86 // clang-format off
87// // ??? separate simulation control object? --- some of these have default values in the engine, so we need tristate
88// Q_PROPERTY(float sleepThreshold READ sleepThreshold WRITE setSleepThreshold NOTIFY sleepThresholdChanged)
89// Q_PROPERTY(float stabilizationThreshold READ stabilizationThreshold WRITE setStabilizationThreshold NOTIFY stabilizationThresholdChanged)
90// Q_PROPERTY(float contactReportThreshold READ contactReportThreshold WRITE setContactReportThreshold NOTIFY contactReportThresholdChanged)
91// Q_PROPERTY(float maxContactImpulse READ maxContactImpulse WRITE setMaxContactImpulse NOTIFY maxContactImpulseChanged)
92// Q_PROPERTY(float maxDepenetrationVelocity READ maxDepenetrationVelocity WRITE setMaxDepenetrationVelocity NOTIFY maxDepenetrationVelocityChanged)
93// Q_PROPERTY(float maxAngularVelocity READ maxAngularVelocity WRITE setMaxAngularVelocity NOTIFY maxAngularVelocityChanged)
94// Q_PROPERTY(int minPositionIterationCount READ minPositionIterationCount WRITE setMinPositionIterationCount NOTIFY minPositionIterationCountChanged)
95// Q_PROPERTY(int minVelocityIterationCount READ minVelocityIterationCount WRITE setMinVelocityIterationCount NOTIFY minVelocityIterationCountChanged)
96 // clang-format on
97 QML_NAMED_ELEMENT(DynamicRigidBody)
98
99public:
100 QDynamicRigidBody();
101 ~QDynamicRigidBody();
102
103 float mass() const;
104 void setMass(float mass);
105
106 float density() const;
107 void setDensity(float density);
108
109 bool isKinematic() const;
110 void setIsKinematic(bool isKinematic);
111
112 Q_REVISION(6, 5) AxisLock linearAxisLock() const;
113 Q_REVISION(6, 5) void setLinearAxisLock(AxisLock newAxisLockLinear);
114
115 Q_REVISION(6, 5) AxisLock angularAxisLock() const;
116 Q_REVISION(6, 5) void setAngularAxisLock(AxisLock newAxisLockAngular);
117
118 bool gravityEnabled() const;
119 void setGravityEnabled(bool gravityEnabled);
120
121 Q_INVOKABLE void applyCentralForce(const QVector3D &force);
122 Q_INVOKABLE void applyForce(const QVector3D &force, const QVector3D &position);
123 Q_INVOKABLE void applyTorque(const QVector3D &torque);
124 Q_INVOKABLE void applyCentralImpulse(const QVector3D &impulse);
125 Q_INVOKABLE void applyImpulse(const QVector3D &impulse, const QVector3D &position);
126 Q_INVOKABLE void applyTorqueImpulse(const QVector3D &impulse);
127 Q_INVOKABLE void setAngularVelocity(const QVector3D &angularVelocity);
128 Q_INVOKABLE void setLinearVelocity(const QVector3D &linearVelocity);
129 Q_INVOKABLE void reset(const QVector3D &position, const QVector3D &eulerRotation);
130
131 // Internal
132 QQueue<QPhysicsCommand *> &commandQueue();
133
134 void updateDefaultDensity(float defaultDensity);
135
136 MassMode massMode() const;
137 void setMassMode(const MassMode newMassMode);
138
139 const QVector3D &inertiaTensor() const;
140 void setInertiaTensor(const QVector3D &newInertiaTensor);
141
142 const QVector3D &centerOfMassPosition() const;
143 void setCenterOfMassPosition(const QVector3D &newCenterOfMassPosition);
144
145 const QQuaternion &centerOfMassRotation() const;
146 void setCenterOfMassRotation(const QQuaternion &newCenterOfMassRotation);
147
148 const QList<float> &readInertiaMatrix() const;
149 void setInertiaMatrix(const QList<float> &newInertiaMatrix);
150 const QMatrix3x3 &inertiaMatrix() const;
151
152 Q_REVISION(6, 5) void setKinematicPosition(const QVector3D &position);
153 Q_REVISION(6, 5) QVector3D kinematicPosition() const;
154
155 Q_REVISION(6, 5) void setKinematicRotation(const QQuaternion &rotation);
156 Q_REVISION(6, 5) QQuaternion kinematicRotation() const;
157
158 Q_REVISION(6, 5) void setKinematicEulerRotation(const QVector3D &rotation);
159 Q_REVISION(6, 5) QVector3D kinematicEulerRotation() const;
160
161 Q_REVISION(6, 5) void setKinematicPivot(const QVector3D &pivot);
162 Q_REVISION(6, 5) QVector3D kinematicPivot() const;
163
164 Q_REVISION(6, 9) void setIsSleeping(bool newIsSleeping);
165 Q_REVISION(6, 9) bool isSleeping() const;
166
167 QAbstractPhysXNode *createPhysXBackend() final;
168
169Q_SIGNALS:
170 void massChanged(float mass);
171 void densityChanged(float density);
172 void isKinematicChanged(bool isKinematic);
173 Q_REVISION(6, 5) void linearAxisLockChanged();
174 Q_REVISION(6, 5) void angularAxisLockChanged();
175 void gravityEnabledChanged();
176 void massModeChanged();
177 void inertiaTensorChanged();
178 void centerOfMassPositionChanged();
179 void centerOfMassRotationChanged();
180 void inertiaMatrixChanged();
181 Q_REVISION(6, 5) void kinematicPositionChanged(const QVector3D &kinematicPosition);
182 Q_REVISION(6, 5) void kinematicRotationChanged(const QQuaternion &kinematicRotation);
183 Q_REVISION(6, 5) void kinematicEulerRotationChanged(const QVector3D &kinematicEulerRotation);
184 Q_REVISION(6, 5) void kinematicPivotChanged(const QVector3D &kinematicPivot);
185 Q_REVISION(6, 9) void isSleepingChanged(bool isSleeping);
186
187private:
188 float m_mass = 1.f;
189 float m_density = 0.001f;
190 QVector3D m_centerOfMassPosition;
191 QQuaternion m_centerOfMassRotation;
192 QList<float> m_inertiaMatrixList;
193 QMatrix3x3 m_inertiaMatrix;
194 QVector3D m_inertiaTensor;
195
196 bool m_isKinematic = false;
197 AxisLock m_linearAxisLock = AxisLock::LockNone;
198 AxisLock m_angularAxisLock = AxisLock::LockNone;
199 QQueue<QPhysicsCommand *> m_commandQueue;
200 bool m_gravityEnabled = true;
201 MassMode m_massMode = MassMode::DefaultDensity;
202
203 QVector3D m_kinematicPosition;
204 RotationData m_kinematicRotation;
205 QVector3D m_kinematicPivot;
206 bool m_isSleeping = false;
207};
208
210
211#endif // DYNAMICRIGIDBODY_H
void setShapesDirty(bool dirty)
void buildShapes(QPhysXWorld *physX)
physx::PxRigidActor * actor
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
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)
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