59class Q_QUICK3DPHYSICS_EXPORT
QPhysicsWorld :
public QObject,
public QQmlParserStatus
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
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
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
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))
90 QML_NAMED_ELEMENT(PhysicsWorld)
93 explicit QPhysicsWorld(QObject *parent =
nullptr);
96 void classBegin() override;
97 void componentComplete() override;
99 QVector3D gravity()
const;
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;
110 bool isNodeRemoved(QAbstractPhysicsNode *object);
112 static QPhysicsWorld *getWorld(QQuick3DNode *node);
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);
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;
128 void setReportKinematicKinematicCollisions(
bool newReportKinematicKinematicCollisions);
129 Q_REVISION(6, 7)
bool reportStaticKinematicCollisions()
const;
131 void setReportStaticKinematicCollisions(
bool newReportStaticKinematicCollisions);
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);
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();
165 void simulateFrame();
166 void frameFinished(
float deltaTime);
167 void frameFinishedDesignStudio();
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();
180 QAbstractPhysicsNode *sender =
nullptr;
181 QAbstractPhysicsNode *receiver =
nullptr;
182 QVector<QVector3D> positions;
183 QVector<QVector3D> impulses;
184 QVector<QVector3D> normals;
187 struct DebugModelHolder
189 QQuick3DModel *model =
nullptr;
190 QQuick3DGeometry *geometry =
nullptr;
194 void releaseMeshPointer();
196 const QVector3D &halfExtents()
const;
197 void setHalfExtents(
const QVector3D &halfExtents);
199 float radius()
const;
200 void setRadius(
float radius);
202 float heightScale()
const;
203 void setHeightScale(
float heightScale);
205 float halfHeight()
const;
206 void setHalfHeight(
float halfHeight);
208 float rowScale()
const;
209 void setRowScale(
float rowScale);
211 float columnScale()
const;
212 void setColumnScale(
float columnScale);
214 physx::PxConvexMesh *getConvexMesh();
215 void setConvexMesh(physx::PxConvexMesh *mesh);
217 physx::PxTriangleMesh *getTriangleMesh();
218 void setTriangleMesh(physx::PxTriangleMesh *mesh);
220 physx::PxHeightField *getHeightField();
221 void setHeightField(physx::PxHeightField *hf);
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;
234 QVector3D m_gravity = QVector3D(0.f, -981.f, 0.f);
235 float m_typicalLength = 100.f;
236 float m_typicalSpeed = 1000.f;
237 float m_defaultDensity = 0.001f;
238 float m_minTimestep = 1.0f;
239 float m_maxTimestep = 33.333f;
241 bool m_running =
true;
242 bool m_forceDebugDraw =
false;
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;
253 friend class QQuick3DPhysicsMesh;
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;