64class Q_QUICK3DPHYSICS_EXPORT
QPhysicsWorld :
public QObject,
public QQmlParserStatus
68 Q_PROPERTY(QVector3D gravity READ gravity WRITE setGravity NOTIFY gravityChanged)
69 Q_PROPERTY(
bool running READ running WRITE setRunning NOTIFY runningChanged)
70 Q_PROPERTY(
bool forceDebugDraw READ forceDebugDraw WRITE setForceDebugDraw NOTIFY
71 forceDebugDrawChanged)
72 Q_PROPERTY(
bool enableCCD READ enableCCD WRITE setEnableCCD NOTIFY enableCCDChanged)
73 Q_PROPERTY(
float typicalLength READ typicalLength WRITE setTypicalLength NOTIFY
76 float typicalSpeed READ typicalSpeed WRITE setTypicalSpeed NOTIFY typicalSpeedChanged)
77 Q_PROPERTY(
float defaultDensity READ defaultDensity WRITE setDefaultDensity NOTIFY
78 defaultDensityChanged)
79 Q_PROPERTY(QQuick3DNode *viewport READ viewport WRITE setViewport NOTIFY viewportChanged
81 Q_PROPERTY(
float minimumTimestep READ minimumTimestep WRITE setMinimumTimestep NOTIFY
82 minimumTimestepChanged REVISION(6, 5))
83 Q_PROPERTY(
float maximumTimestep READ maximumTimestep WRITE setMaximumTimestep NOTIFY
84 maximumTimestepChanged REVISION(6, 5))
85 Q_PROPERTY(QQuick3DNode *scene READ scene WRITE setScene NOTIFY sceneChanged REVISION(6, 5))
86 Q_PROPERTY(
int numThreads READ numThreads WRITE setNumThreads NOTIFY numThreadsChanged
88 Q_PROPERTY(
bool reportKinematicKinematicCollisions READ reportKinematicKinematicCollisions WRITE
89 setReportKinematicKinematicCollisions NOTIFY
90 reportKinematicKinematicCollisionsChanged FINAL REVISION(6, 7))
91 Q_PROPERTY(
bool reportStaticKinematicCollisions READ reportStaticKinematicCollisions WRITE
92 setReportStaticKinematicCollisions NOTIFY
93 reportStaticKinematicCollisionsChanged FINAL REVISION(6, 7))
95 Q_PROPERTY(QueryStructure staticQueryStructure READ staticQueryStructure WRITE
96 setStaticQueryStructure NOTIFY staticQueryStructureChanged FINAL REVISION(6, 13))
98 Q_PROPERTY(QueryStructure dynamicQueryStructure READ dynamicQueryStructure WRITE
99 setDynamicQueryStructure NOTIFY dynamicQueryStructureChanged FINAL REVISION(6, 13))
104 enum class QueryStructure {
111 explicit QPhysicsWorld(QObject *parent =
nullptr);
114 void classBegin() override;
115 void componentComplete() override;
117 QVector3D gravity()
const;
119 bool running()
const;
120 bool forceDebugDraw()
const;
121 bool enableCCD()
const;
122 float typicalLength()
const;
123 float typicalSpeed()
const;
124 float defaultDensity()
const;
125 Q_REVISION(6, 5)
float minimumTimestep()
const;
126 Q_REVISION(6, 5)
float maximumTimestep()
const;
128 bool isNodeRemoved(QAbstractPhysicsNode *object);
130 static QPhysicsWorld *getWorld(QQuick3DNode *node);
131 static QPhysicsWorld *getWorld(QPhysicsJoint *joint);
133 static void registerNode(QAbstractPhysicsNode *physicsNode);
134 static void deregisterNode(QAbstractPhysicsNode *physicsNode);
136 static void registerJoint(QPhysicsJoint *joint);
137 static void deregisterJoint(QPhysicsJoint *joint);
139 void registerContact(QAbstractPhysicsNode *sender, QAbstractPhysicsNode *receiver,
140 const QVector<QVector3D> &positions,
const QVector<QVector3D> &impulses,
141 const QVector<QVector3D> &normals);
143 Q_REVISION(6, 5) QQuick3DNode *viewport()
const;
144 void setHasIndividualDebugDraw();
145 physx::PxControllerManager *controllerManager();
148 Q_REVISION(6, 7)
bool reportKinematicKinematicCollisions()
const;
150 void setReportKinematicKinematicCollisions(
bool newReportKinematicKinematicCollisions);
151 Q_REVISION(6, 7)
bool reportStaticKinematicCollisions()
const;
153 void setReportStaticKinematicCollisions(
bool newReportStaticKinematicCollisions);
155 void cleanupRemovedJoints();
157 Q_REVISION(6, 13) QueryStructure staticQueryStructure()
const;
158 Q_REVISION(6, 13)
void setStaticQueryStructure(QueryStructure newStaticQueryStructure);
160 Q_REVISION(6, 13) QueryStructure dynamicQueryStructure()
const;
161 Q_REVISION(6, 13)
void setDynamicQueryStructure(QueryStructure newDynamicQueryStructure);
164 const QVector3D &direction,
166 bool includeStatic =
true,
167 bool includeDynamic =
true)
const;
170 const QVector3D &direction,
172 bool includeStatic =
true,
173 bool includeDynamic =
true)
const;
176 const QVector3D &direction,
178 bool includeStatic =
true,
179 bool includeDynamic =
true)
const;
182 const QVector3D &direction,
184 bool includeStatic =
true,
185 bool includeDynamic =
true)
const;
188 const QVector3D &direction,
190 bool includeStatic =
true,
191 bool includeDynamic =
true)
const;
193 Q_REVISION(6, 13)
Q_INVOKABLE QList<QQuick3DPhysicsLocationHit> multiSweepQuery(QAbstractCollisionShape *shape,
194 const QVector3D &direction,
196 bool includeStatic =
true,
197 bool includeDynamic =
true)
const;
200 bool includeStatic =
true,
201 bool includeDynamic =
true)
const;
204 bool includeStatic =
true,
205 bool includeDynamic =
true)
const;
208 void setGravity(QVector3D gravity);
209 void setRunning(
bool running);
210 void setForceDebugDraw(
bool forceDebugDraw);
211 void setEnableCCD(
bool enableCCD);
212 void setTypicalLength(
float typicalLength);
213 void setTypicalSpeed(
float typicalSpeed);
214 void setDefaultDensity(
float defaultDensity);
222 void gravityChanged(QVector3D gravity);
223 void runningChanged(
bool running);
224 void enableCCDChanged(
bool enableCCD);
225 void forceDebugDrawChanged(
bool forceDebugDraw);
226 void typicalLengthChanged(
float typicalLength);
227 void typicalSpeedChanged(
float typicalSpeed);
228 void defaultDensityChanged(
float defaultDensity);
229 Q_REVISION(6, 5)
void viewportChanged(QQuick3DNode *viewport);
230 Q_REVISION(6, 5)
void minimumTimestepChanged(
float minimumTimestep);
231 Q_REVISION(6, 5)
void maximumTimestepChanged(
float maxTimestep);
232 Q_REVISION(6, 5)
void frameDone(
float timestep);
235 Q_REVISION(6, 7)
void reportKinematicKinematicCollisionsChanged();
236 Q_REVISION(6, 7)
void reportStaticKinematicCollisionsChanged();
238 Q_REVISION(6, 13)
void staticQueryStructureChanged();
239 Q_REVISION(6, 13)
void dynamicQueryStructureChanged();
242 static void registerRaycaster(QRaycaster *raycaster);
243 static void deregisterRaycaster(QRaycaster *raycaster);
245 QQuick3DPhysicsLocationHit
246 closestRaycastHit(
const QVector3D &origin,
const QVector3D &direction,
float maxDistance,
247 bool includeStatic,
bool includeDynamic,
248 QSpan<
const QAbstractPhysicsNode *
const> excludedBodies)
const;
250 void simulateFrame();
251 void frameFinished(
float deltaTime);
252 void frameFinishedDesignStudio();
254 void invalidateTriggerOverlaps(QSpan<QAbstractPhysXNode *
const> rebuiltBodies);
255 void dropUnreportedTriggerOverlaps();
256 void cleanupRemovedNodes();
257 void updateDebugDraw();
258 void updateDebugDrawDesignStudio();
259 void setupDebugMaterials(QQuick3DNode *sceneNode);
260 void disableDebugDraw();
261 void matchOrphanNodes();
262 void matchOrphanJoints();
263 void matchOrphanRaycasters();
264 void findPhysicsNodes();
265 void emitContactCallbacks();
269 QAbstractPhysicsNode *sender =
nullptr;
270 QAbstractPhysicsNode *receiver =
nullptr;
271 QVector<QVector3D> positions;
272 QVector<QVector3D> impulses;
273 QVector<QVector3D> normals;
276 struct DebugModelHolder
278 QQuick3DModel *model =
nullptr;
279 QQuick3DGeometry *geometry =
nullptr;
283 void releaseMeshPointer();
285 const QVector3D &halfExtents()
const;
286 void setHalfExtents(
const QVector3D &halfExtents);
288 float radius()
const;
289 void setRadius(
float radius);
291 float heightScale()
const;
292 void setHeightScale(
float heightScale);
294 float halfHeight()
const;
295 void setHalfHeight(
float halfHeight);
297 float rowScale()
const;
298 void setRowScale(
float rowScale);
300 float columnScale()
const;
301 void setColumnScale(
float columnScale);
303 physx::PxConvexMesh *getConvexMesh();
304 void setConvexMesh(physx::PxConvexMesh *mesh);
306 physx::PxTriangleMesh *getTriangleMesh();
307 void setTriangleMesh(physx::PxTriangleMesh *mesh);
309 physx::PxHeightField *getHeightField();
310 void setHeightField(physx::PxHeightField *hf);
313 QList<QAbstractPhysXNode *> m_physXBodies;
314 QList<QPhysicsJoint *> m_joints;
315 QList<QRaycaster *> m_raycasters;
316 QList<QAbstractPhysicsNode *> m_newPhysicsNodes;
317 QHash<QPair<QAbstractCollisionShape *, QAbstractPhysicsNode *>, DebugModelHolder>
318 m_DesignStudioDebugModels;
319 QHash<QPair<QAbstractCollisionShape *, QAbstractPhysXNode *>, DebugModelHolder>
320 m_collisionShapeDebugModels;
321 QSet<QAbstractPhysicsNode *> m_removedPhysicsNodes;
322 QSet<physx::PxJoint *> m_removedJoints;
325 bool m_triggerOverlapsInvalidated =
false;
326 QList<BodyContact> m_registeredContacts;
328 QVector3D m_gravity = QVector3D(0.f, -981.f, 0.f);
329 float m_typicalLength = 100.f;
330 float m_typicalSpeed = 1000.f;
331 float m_defaultDensity = 0.001f;
332 float m_minTimestep = 1.0f;
333 float m_maxTimestep = 33.333f;
335 bool m_running =
true;
336 bool m_forceDebugDraw =
false;
339 bool m_hasIndividualDebugDraw =
false;
340 bool m_physicsInitialized =
false;
341 bool m_enableCCD =
false;
343 QPhysXWorld *m_physx =
nullptr;
344 QQuick3DNode *m_viewport =
nullptr;
345 QVector<QQuick3DPrincipledMaterial *> m_debugMaterials;
347 friend class QQuick3DPhysicsMesh;
348 friend class QTriangleMeshShape;
349 friend class QHeightFieldShape;
350 friend class QQuick3DPhysicsHeightField;
351 friend class SimulationEventCallback;
352 friend class ControllerCallback;
353 static physx::PxPhysics *getPhysics();
354 static const physx::PxCookingParams *getCookingParams();
355 FrameAnimator *m_frameAnimator =
nullptr;
356 QQuick3DNode *m_scene =
nullptr;
357 bool m_inDesignStudio =
false;
358 int m_numThreads = -1;
359 bool m_reportKinematicKinematicCollisions =
false;
360 bool m_reportStaticKinematicCollisions =
false;
361 QElapsedTimer m_timer;
362 float m_currTimeStep = 0.f;
363 QList<
float> m_frameTimings;
364 bool m_frameFetched =
false;
365 QueryStructure m_staticQueryStructure = QueryStructure::DynamicTree;
366 QueryStructure m_dynamicQueryStructure = QueryStructure::DynamicTree;
368 friend class QRaycaster;