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 AxisLock {
44 LockNone = 0,
45 LockX = 1,
46 LockY = 2,
47 LockZ = 4,
48 };
49 Q_ENUM(AxisLock)
50
51 Q_OBJECT
52 Q_PROPERTY(float mass READ mass WRITE setMass NOTIFY massChanged)
53 Q_PROPERTY(float density READ density WRITE setDensity NOTIFY densityChanged)
54
55 Q_PROPERTY(AxisLock linearAxisLock READ linearAxisLock WRITE setLinearAxisLock NOTIFY
56 linearAxisLockChanged REVISION(6, 5))
57 Q_PROPERTY(AxisLock angularAxisLock READ angularAxisLock WRITE setAngularAxisLock NOTIFY
58 angularAxisLockChanged REVISION(6, 5))
60 Q_PROPERTY(bool isKinematic READ isKinematic WRITE setIsKinematic NOTIFY isKinematicChanged)
61 Q_PROPERTY(bool gravityEnabled READ gravityEnabled WRITE setGravityEnabled NOTIFY
62 gravityEnabledChanged)
64 Q_PROPERTY(MassMode massMode READ massMode WRITE setMassMode NOTIFY massModeChanged)
65 Q_PROPERTY(QVector3D inertiaTensor READ inertiaTensor WRITE setInertiaTensor NOTIFY
66 inertiaTensorChanged)
67 Q_PROPERTY(QVector3D centerOfMassPosition READ centerOfMassPosition WRITE
68 setCenterOfMassPosition NOTIFY centerOfMassPositionChanged)
69 Q_PROPERTY(QQuaternion centerOfMassRotation READ centerOfMassRotation WRITE
70 setCenterOfMassRotation NOTIFY centerOfMassRotationChanged)
71 Q_PROPERTY(QList<float> inertiaMatrix READ readInertiaMatrix WRITE setInertiaMatrix NOTIFY
72 inertiaMatrixChanged);
74 Q_PROPERTY(QVector3D kinematicPosition READ kinematicPosition WRITE setKinematicPosition NOTIFY
75 kinematicPositionChanged REVISION(6, 5));
76 Q_PROPERTY(QVector3D kinematicEulerRotation READ kinematicEulerRotation WRITE
77 setKinematicEulerRotation NOTIFY kinematicEulerRotationChanged REVISION(6,
78 5));
79 Q_PROPERTY(QQuaternion kinematicRotation READ kinematicRotation WRITE setKinematicRotation
80 NOTIFY kinematicRotationChanged REVISION(6, 5));
81 Q_PROPERTY(QVector3D kinematicPivot READ kinematicPivot WRITE setKinematicPivot NOTIFY
82 kinematicPivotChanged REVISION(6, 5));
83
84 Q_PROPERTY(bool isSleeping READ isSleeping WRITE setIsSleeping NOTIFY isSleepingChanged
85 REVISION(6, 9));
86
87 // clang-format off
88// // ??? separate simulation control object? --- some of these have default values in the engine, so we need tristate
89// Q_PROPERTY(float sleepThreshold READ sleepThreshold WRITE setSleepThreshold NOTIFY sleepThresholdChanged)
90// Q_PROPERTY(float stabilizationThreshold READ stabilizationThreshold WRITE setStabilizationThreshold NOTIFY stabilizationThresholdChanged)
91// Q_PROPERTY(float contactReportThreshold READ contactReportThreshold WRITE setContactReportThreshold NOTIFY contactReportThresholdChanged)
92// Q_PROPERTY(float maxContactImpulse READ maxContactImpulse WRITE setMaxContactImpulse NOTIFY maxContactImpulseChanged)
93// Q_PROPERTY(float maxDepenetrationVelocity READ maxDepenetrationVelocity WRITE setMaxDepenetrationVelocity NOTIFY maxDepenetrationVelocityChanged)
94// Q_PROPERTY(float maxAngularVelocity READ maxAngularVelocity WRITE setMaxAngularVelocity NOTIFY maxAngularVelocityChanged)
95// Q_PROPERTY(int minPositionIterationCount READ minPositionIterationCount WRITE setMinPositionIterationCount NOTIFY minPositionIterationCountChanged)
96// Q_PROPERTY(int minVelocityIterationCount READ minVelocityIterationCount WRITE setMinVelocityIterationCount NOTIFY minVelocityIterationCountChanged)
97 // clang-format on
98 QML_NAMED_ELEMENT(DynamicRigidBody)
99
100public:
101 QDynamicRigidBody();
102 ~QDynamicRigidBody();
104 float mass() const;
105 void setMass(float mass);
107 float density() const;
108 void setDensity(float density);
109
110 bool isKinematic() const;
111 void setIsKinematic(bool isKinematic);
112
113 Q_REVISION(6, 5) AxisLock linearAxisLock() const;
114 Q_REVISION(6, 5) void setLinearAxisLock(AxisLock newAxisLockLinear);
115
116 Q_REVISION(6, 5) AxisLock angularAxisLock() const;
117 Q_REVISION(6, 5) void setAngularAxisLock(AxisLock newAxisLockAngular);
118
119 bool gravityEnabled() const;
120 void setGravityEnabled(bool gravityEnabled);
121
122 Q_INVOKABLE void applyCentralForce(const QVector3D &force);
123 Q_INVOKABLE void applyForce(const QVector3D &force, const QVector3D &position);
124 Q_INVOKABLE void applyTorque(const QVector3D &torque);
125 Q_INVOKABLE void applyCentralImpulse(const QVector3D &impulse);
126 Q_INVOKABLE void applyImpulse(const QVector3D &impulse, const QVector3D &position);
127 Q_INVOKABLE void applyTorqueImpulse(const QVector3D &impulse);
128 Q_INVOKABLE void setAngularVelocity(const QVector3D &angularVelocity);
129 Q_INVOKABLE void setLinearVelocity(const QVector3D &linearVelocity);
130 Q_INVOKABLE void reset(const QVector3D &position, const QVector3D &eulerRotation);
131
132 // Internal
133 QQueue<QPhysicsCommand *> &commandQueue();
134
135 void updateDefaultDensity(float defaultDensity);
136
137 MassMode massMode() const;
138 void setMassMode(const MassMode newMassMode);
139
140 const QVector3D &inertiaTensor() const;
141 void setInertiaTensor(const QVector3D &newInertiaTensor);
143 const QVector3D &centerOfMassPosition() const;
144 void setCenterOfMassPosition(const QVector3D &newCenterOfMassPosition);
146 const QQuaternion &centerOfMassRotation() const;
147 void setCenterOfMassRotation(const QQuaternion &newCenterOfMassRotation);
149 const QList<float> &readInertiaMatrix() const;
150 void setInertiaMatrix(const QList<float> &newInertiaMatrix);
151 const QMatrix3x3 &inertiaMatrix() const;
153 Q_REVISION(6, 5) void setKinematicPosition(const QVector3D &position);
154 Q_REVISION(6, 5) QVector3D kinematicPosition() const;
156 Q_REVISION(6, 5) void setKinematicRotation(const QQuaternion &rotation);
157 Q_REVISION(6, 5) QQuaternion kinematicRotation() const;
158
159 Q_REVISION(6, 5) void setKinematicEulerRotation(const QVector3D &rotation);
160 Q_REVISION(6, 5) QVector3D kinematicEulerRotation() const;
162 Q_REVISION(6, 5) void setKinematicPivot(const QVector3D &pivot);
163 Q_REVISION(6, 5) QVector3D kinematicPivot() const;
165 Q_REVISION(6, 9) void setIsSleeping(bool newIsSleeping);
166 Q_REVISION(6, 9) bool isSleeping() const;
168 QAbstractPhysXNode *createPhysXBackend() final;
170Q_SIGNALS:
171 void massChanged(float mass);
172 void densityChanged(float density);
173 void isKinematicChanged(bool isKinematic);
174 Q_REVISION(6, 5) void linearAxisLockChanged();
175 Q_REVISION(6, 5) void angularAxisLockChanged();
176 void gravityEnabledChanged();
177 void massModeChanged();
178 void inertiaTensorChanged();
179 void centerOfMassPositionChanged();
180 void centerOfMassRotationChanged();
181 void inertiaMatrixChanged();
182 Q_REVISION(6, 5) void kinematicPositionChanged(const QVector3D &kinematicPosition);
183 Q_REVISION(6, 5) void kinematicRotationChanged(const QQuaternion &kinematicRotation);
184 Q_REVISION(6, 5) void kinematicEulerRotationChanged(const QVector3D &kinematicEulerRotation);
185 Q_REVISION(6, 5) void kinematicPivotChanged(const QVector3D &kinematicPivot);
186 Q_REVISION(6, 9) void isSleepingChanged(bool isSleeping);
187
188private:
189 float m_mass = 1.f;
190 float m_density = 0.001f;
191 QVector3D m_centerOfMassPosition;
192 QQuaternion m_centerOfMassRotation;
193 QList<float> m_inertiaMatrixList;
194 QMatrix3x3 m_inertiaMatrix;
195 QVector3D m_inertiaTensor;
196
197 bool m_isKinematic = false;
198 AxisLock m_linearAxisLock = AxisLock::LockNone;
199 AxisLock m_angularAxisLock = AxisLock::LockNone;
200 QQueue<QPhysicsCommand *> m_commandQueue;
201 bool m_gravityEnabled = true;
202 MassMode m_massMode = MassMode::DefaultDensity;
203
204 QVector3D m_kinematicPosition;
205 RotationData m_kinematicRotation;
206 QVector3D m_kinematicPivot;
207 bool m_isSleeping = false;
208};
209
211
212#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
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