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
qphysicsworld_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 PHYSICSWORLD_H
6#define PHYSICSWORLD_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/qtquick3dphysicsglobal.h>
20
21#include <QtCore/QLoggingCategory>
22#include <QtCore/QObject>
23#include <QtCore/QTimerEvent>
24#include <QtCore/QElapsedTimer>
25#include <QtGui/QVector3D>
26#include <QtQml/qqml.h>
27#include <QBasicTimer>
28
29#include <QtQuick3D/private/qquick3dviewport_p.h>
30
31namespace physx {
32class PxMaterial;
33class PxPhysics;
34class PxShape;
35class PxRigidDynamic;
36class PxRigidActor;
37class PxRigidStatic;
38class PxCooking;
39class PxControllerManager;
40class PxConvexMesh;
41class PxTriangleMesh;
42class PxHeightField;
43}
44
46
48
49class QAbstractPhysicsNode;
50class QAbstractCollisionShape;
51class QAbstractRigidBody;
53class QQuick3DModel;
54class QQuick3DGeometry;
55class QQuick3DPrincipledMaterial;
56class QPhysXWorld;
57class FrameAnimator;
58
59class Q_QUICK3DPHYSICS_EXPORT QPhysicsWorld : public QObject, public QQmlParserStatus
60{
61 Q_OBJECT
62 Q_INTERFACES(QQmlParserStatus)
63 Q_PROPERTY(QVector3D gravity READ gravity WRITE setGravity NOTIFY gravityChanged)
64 Q_PROPERTY(bool running READ running WRITE setRunning NOTIFY runningChanged)
65 Q_PROPERTY(bool forceDebugDraw READ forceDebugDraw WRITE setForceDebugDraw NOTIFY
66 forceDebugDrawChanged)
67 Q_PROPERTY(bool enableCCD READ enableCCD WRITE setEnableCCD NOTIFY enableCCDChanged)
68 Q_PROPERTY(float typicalLength READ typicalLength WRITE setTypicalLength NOTIFY
69 typicalLengthChanged)
70 Q_PROPERTY(
71 float typicalSpeed READ typicalSpeed WRITE setTypicalSpeed NOTIFY typicalSpeedChanged)
72 Q_PROPERTY(float defaultDensity READ defaultDensity WRITE setDefaultDensity NOTIFY
73 defaultDensityChanged)
74 Q_PROPERTY(QQuick3DNode *viewport READ viewport WRITE setViewport NOTIFY viewportChanged
75 REVISION(6, 5))
76 Q_PROPERTY(float minimumTimestep READ minimumTimestep WRITE setMinimumTimestep NOTIFY
77 minimumTimestepChanged REVISION(6, 5))
78 Q_PROPERTY(float maximumTimestep READ maximumTimestep WRITE setMaximumTimestep NOTIFY
79 maximumTimestepChanged REVISION(6, 5))
80 Q_PROPERTY(QQuick3DNode *scene READ scene WRITE setScene NOTIFY sceneChanged REVISION(6, 5))
81 Q_PROPERTY(int numThreads READ numThreads WRITE setNumThreads NOTIFY numThreadsChanged
82 REVISION(6, 7))
83 Q_PROPERTY(bool reportKinematicKinematicCollisions READ reportKinematicKinematicCollisions WRITE
84 setReportKinematicKinematicCollisions NOTIFY
85 reportKinematicKinematicCollisionsChanged FINAL REVISION(6, 7))
86 Q_PROPERTY(bool reportStaticKinematicCollisions READ reportStaticKinematicCollisions WRITE
87 setReportStaticKinematicCollisions NOTIFY
88 reportStaticKinematicCollisionsChanged FINAL REVISION(6, 7))
89
90 QML_NAMED_ELEMENT(PhysicsWorld)
91
92public:
93 explicit QPhysicsWorld(QObject *parent = nullptr);
94 ~QPhysicsWorld();
95
96 void classBegin() override;
97 void componentComplete() override;
99 QVector3D gravity() const;
100
101 bool running() const;
102 bool forceDebugDraw() const;
103 bool enableCCD() const;
104 float typicalLength() const;
105 float typicalSpeed() const;
106 float defaultDensity() const;
107 Q_REVISION(6, 5) float minimumTimestep() const;
108 Q_REVISION(6, 5) float maximumTimestep() const;
109
110 bool isNodeRemoved(QAbstractPhysicsNode *object);
112 static QPhysicsWorld *getWorld(QQuick3DNode *node);
113
114 static void registerNode(QAbstractPhysicsNode *physicsNode);
115 static void deregisterNode(QAbstractPhysicsNode *physicsNode);
117 void registerContact(QAbstractPhysicsNode *sender, QAbstractPhysicsNode *receiver,
118 const QVector<QVector3D> &positions, const QVector<QVector3D> &impulses,
119 const QVector<QVector3D> &normals);
120
121 Q_REVISION(6, 5) QQuick3DNode *viewport() const;
122 void setHasIndividualDebugDraw();
123 physx::PxControllerManager *controllerManager();
124 Q_REVISION(6, 5) QQuick3DNode *scene() const;
125 Q_REVISION(6, 7) int numThreads() const;
126 Q_REVISION(6, 7) bool reportKinematicKinematicCollisions() const;
127 Q_REVISION(6, 7)
128 void setReportKinematicKinematicCollisions(bool newReportKinematicKinematicCollisions);
129 Q_REVISION(6, 7) bool reportStaticKinematicCollisions() const;
130 Q_REVISION(6, 7)
131 void setReportStaticKinematicCollisions(bool newReportStaticKinematicCollisions);
133public slots:
134 void setGravity(QVector3D gravity);
135 void setRunning(bool running);
136 void setForceDebugDraw(bool forceDebugDraw);
137 void setEnableCCD(bool enableCCD);
138 void setTypicalLength(float typicalLength);
139 void setTypicalSpeed(float typicalSpeed);
140 void setDefaultDensity(float defaultDensity);
141 Q_REVISION(6, 5) void setViewport(QQuick3DNode *viewport);
142 Q_REVISION(6, 5) void setMinimumTimestep(float minTimestep);
143 Q_REVISION(6, 5) void setMaximumTimestep(float maxTimestep);
144 Q_REVISION(6, 5) void setScene(QQuick3DNode *newScene);
145 Q_REVISION(6, 7) void setNumThreads(int newNumThreads);
147signals:
148 void gravityChanged(QVector3D gravity);
149 void runningChanged(bool running);
150 void enableCCDChanged(bool enableCCD);
151 void forceDebugDrawChanged(bool forceDebugDraw);
152 void typicalLengthChanged(float typicalLength);
153 void typicalSpeedChanged(float typicalSpeed);
154 void defaultDensityChanged(float defaultDensity);
155 Q_REVISION(6, 5) void viewportChanged(QQuick3DNode *viewport);
156 Q_REVISION(6, 5) void minimumTimestepChanged(float minimumTimestep);
157 Q_REVISION(6, 5) void maximumTimestepChanged(float maxTimestep);
158 Q_REVISION(6, 5) void frameDone(float timestep);
159 Q_REVISION(6, 5) void sceneChanged();
160 Q_REVISION(6, 7) void numThreadsChanged();
161 Q_REVISION(6, 7) void reportKinematicKinematicCollisionsChanged();
162 Q_REVISION(6, 7) void reportStaticKinematicCollisionsChanged();
163
164private:
165 void simulateFrame();
166 void frameFinished(float deltaTime);
167 void frameFinishedDesignStudio();
168 void initPhysics();
169 void cleanupRemovedNodes();
170 void updateDebugDraw();
171 void updateDebugDrawDesignStudio();
172 void setupDebugMaterials(QQuick3DNode *sceneNode);
173 void disableDebugDraw();
174 void matchOrphanNodes();
175 void findPhysicsNodes();
176 void emitContactCallbacks();
177
178 struct BodyContact
179 {
180 QAbstractPhysicsNode *sender = nullptr;
181 QAbstractPhysicsNode *receiver = nullptr;
182 QVector<QVector3D> positions;
183 QVector<QVector3D> impulses;
184 QVector<QVector3D> normals;
185 };
186
187 struct DebugModelHolder
188 {
189 QQuick3DModel *model = nullptr;
190 QQuick3DGeometry *geometry = nullptr;
191 QVector3D data;
192 void *ptr = nullptr;
193
194 void releaseMeshPointer();
195
196 const QVector3D &halfExtents() const;
197 void setHalfExtents(const QVector3D &halfExtents);
198
199 float radius() const;
200 void setRadius(float radius);
201
202 float heightScale() const;
203 void setHeightScale(float heightScale);
204
205 float halfHeight() const;
206 void setHalfHeight(float halfHeight);
207
208 float rowScale() const;
209 void setRowScale(float rowScale);
210
211 float columnScale() const;
212 void setColumnScale(float columnScale);
213
214 physx::PxConvexMesh *getConvexMesh();
215 void setConvexMesh(physx::PxConvexMesh *mesh);
216
217 physx::PxTriangleMesh *getTriangleMesh();
218 void setTriangleMesh(physx::PxTriangleMesh *mesh);
219
220 physx::PxHeightField *getHeightField();
221 void setHeightField(physx::PxHeightField *hf);
222 };
223
224 QList<QAbstractPhysXNode *> m_physXBodies;
225 QList<QAbstractPhysicsNode *> m_newPhysicsNodes;
226 QHash<QPair<QAbstractCollisionShape *, QAbstractPhysicsNode *>, DebugModelHolder>
227 m_DesignStudioDebugModels;
228 QHash<QPair<QAbstractCollisionShape *, QAbstractPhysXNode *>, DebugModelHolder>
229 m_collisionShapeDebugModels;
230 QSet<QAbstractPhysicsNode *> m_removedPhysicsNodes;
231 QMutex m_removedPhysicsNodesMutex;
232 QList<BodyContact> m_registeredContacts;
233
234 QVector3D m_gravity = QVector3D(0.f, -981.f, 0.f);
235 float m_typicalLength = 100.f; // 100 cm
236 float m_typicalSpeed = 1000.f; // 1000 cm/s
237 float m_defaultDensity = 0.001f; // 1 g/cm^3
238 float m_minTimestep = 1.0f; // 1000 fps
239 float m_maxTimestep = 33.333f; // 30 fps
240
241 bool m_running = true;
242 bool m_forceDebugDraw = false;
243 // For performance, used to keep track if we have indiviually enabled debug drawing for any
244 // collision shape
245 bool m_hasIndividualDebugDraw = false;
246 bool m_physicsInitialized = false;
247 bool m_enableCCD = false;
249 QPhysXWorld *m_physx = nullptr;
250 QQuick3DNode *m_viewport = nullptr;
251 QVector<QQuick3DPrincipledMaterial *> m_debugMaterials;
252
253 friend class QQuick3DPhysicsMesh; // TODO: better internal API
254 friend class QTriangleMeshShape; //####
255 friend class QHeightFieldShape;
256 friend class QQuick3DPhysicsHeightField;
257 friend class SimulationEventCallback;
258 friend class ControllerCallback;
259 static physx::PxPhysics *getPhysics();
260 static physx::PxCooking *getCooking();
261 FrameAnimator *m_frameAnimator = nullptr;
262 QQuick3DNode *m_scene = nullptr;
263 bool m_inDesignStudio = false;
264 int m_numThreads = -1;
265 bool m_reportKinematicKinematicCollisions = false;
266 bool m_reportStaticKinematicCollisions = false;
267 QElapsedTimer m_timer;
268 float m_currTimeStep = 0.f;
269 QList<float> m_frameTimings;
270 bool m_frameFetched = false;
271};
272
274
275#endif // PHYSICSWORLD_H
virtual void cleanup(QPhysXWorld *)
void createMaterialFromQtMaterial(QPhysXWorld *physX, QPhysicsMaterial *qtMaterial)
QPhysXCharacterController(QCharacterController *frontEnd)
DebugDrawBodyType getDebugDrawBodyType() override
void init(QPhysicsWorld *world, QPhysXWorld *physX) override
void cleanup(QPhysXWorld *physX) override
void createMaterial(QPhysXWorld *physX) override
void sync(float deltaTime, QHash< QQuick3DNode *, QMatrix4x4 > &transformCache) override
#define PHYSX_RELEASE(x)
DebugDrawBodyType
QT_BEGIN_NAMESPACE Q_DECLARE_LOGGING_CATEGORY(lcQuick3dPhysics)
#define QT_BEGIN_NAMESPACE
#define QT_END_NAMESPACE