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
qphysicscommands.cpp
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
9#include "PxPhysicsAPI.h"
10
11#include <QtGui/qquaternion.h>
12
14
15static bool isKinematicBody(physx::PxRigidBody &body)
16{
17 return static_cast<bool>(body.getRigidBodyFlags() & physx::PxRigidBodyFlag::eKINEMATIC);
18}
19
20
22 = default;
23
28
30 = default;
31
32void QPhysicsCommandApplyCentralForce::execute(const QDynamicRigidBody &rigidBody,
33 physx::PxRigidBody &body)
34{
35 Q_UNUSED(rigidBody)
36 if (isKinematicBody(body))
37 return;
38 body.addForce(QPhysicsUtils::toPhysXType(force));
39}
40
42 const QVector3D &inPosition)
44{
45}
46
48 = default;
49
50void QPhysicsCommandApplyForce::execute(const QDynamicRigidBody &rigidBody,
51 physx::PxRigidBody &body)
52{
53 Q_UNUSED(rigidBody)
54 if (isKinematicBody(body))
55 return;
56 physx::PxRigidBodyExt::addForceAtPos(body, QPhysicsUtils::toPhysXType(force),
57 QPhysicsUtils::toPhysXType(position));
58}
59
64
66 = default;
67
68void QPhysicsCommandApplyTorque::execute(const QDynamicRigidBody &rigidBody,
69 physx::PxRigidBody &body)
70{
71 Q_UNUSED(rigidBody)
72 if (isKinematicBody(body))
73 return;
74 body.addTorque(QPhysicsUtils::toPhysXType(torque));
75}
76
81
83 = default;
84
85void QPhysicsCommandApplyCentralImpulse::execute(const QDynamicRigidBody &rigidBody,
86 physx::PxRigidBody &body)
87{
88 Q_UNUSED(rigidBody)
89 if (isKinematicBody(body))
90 return;
91 body.addForce(QPhysicsUtils::toPhysXType(impulse), physx::PxForceMode::eIMPULSE);
92}
93
95 const QVector3D &inPosition)
97{
98}
99
101 = default;
102
103void QPhysicsCommandApplyImpulse::execute(const QDynamicRigidBody &rigidBody,
104 physx::PxRigidBody &body)
105{
106 Q_UNUSED(rigidBody)
107 if (isKinematicBody(body))
108 return;
109 physx::PxRigidBodyExt::addForceAtPos(body, QPhysicsUtils::toPhysXType(impulse),
110 QPhysicsUtils::toPhysXType(position),
111 physx::PxForceMode::eIMPULSE);
112}
113
118
120 = default;
121
122void QPhysicsCommandApplyTorqueImpulse::execute(const QDynamicRigidBody &rigidBody,
123 physx::PxRigidBody &body)
124{
125 Q_UNUSED(rigidBody)
126 if (isKinematicBody(body))
127 return;
128
129 body.addTorque(QPhysicsUtils::toPhysXType(impulse), physx::PxForceMode::eIMPULSE);
130}
131
137
139 = default;
140
141void QPhysicsCommandSetAngularVelocity::execute(const QDynamicRigidBody &rigidBody,
142 physx::PxRigidBody &body)
143{
144 Q_UNUSED(rigidBody)
145 body.setAngularVelocity(QPhysicsUtils::toPhysXType(angularVelocity));
146}
147
153
155 = default;
156
157void QPhysicsCommandSetLinearVelocity::execute(const QDynamicRigidBody &rigidBody,
158 physx::PxRigidBody &body)
159{
160 Q_UNUSED(rigidBody)
161 body.setLinearVelocity(QPhysicsUtils::toPhysXType(linearVelocity));
162}
163
165
167 = default;
168
169void QPhysicsCommandSetMass::execute(const QDynamicRigidBody &rigidBody, physx::PxRigidBody &body)
170{
171 if (rigidBody.hasStaticShapes()) {
172 qWarning() << "Cannot set mass or density on a body containing trimesh/heightfield/plane, "
173 "ignoring.";
174 return;
175 }
176
177 physx::PxRigidBodyExt::setMassAndUpdateInertia(body, mass);
178}
179
180void QPhysicsCommandSetMassAndInertiaTensor::execute(const QDynamicRigidBody &rigidBody,
181 physx::PxRigidBody &body)
182{
183 if (rigidBody.hasStaticShapes()) {
184 qWarning() << "Cannot set mass or density on a body containing trimesh/heightfield/plane, "
185 "ignoring.";
186 return;
187 }
188
189 body.setMass(mass);
190 body.setCMassLocalPose(
191 physx::PxTransform(QPhysicsUtils::toPhysXType(rigidBody.centerOfMassPosition()),
192 QPhysicsUtils::toPhysXType(rigidBody.centerOfMassRotation())));
193 body.setMassSpaceInertiaTensor(QPhysicsUtils::toPhysXType(inertia));
194}
195
197 float inMass, const QMatrix3x3 &inInertia)
198 : QPhysicsCommand(), mass(inMass), inertia(inInertia)
199{
200}
201
203 = default;
204
205void QPhysicsCommandSetMassAndInertiaMatrix::execute(const QDynamicRigidBody &rigidBody,
206 physx::PxRigidBody &body)
207{
208 if (rigidBody.hasStaticShapes()) {
209 qWarning() << "Cannot set mass or density on a body containing trimesh/heightfield/plane, "
210 "ignoring.";
211 return;
212 }
213
214 physx::PxQuat massFrame;
215 physx::PxVec3 diagTensor = physx::PxDiagonalize(QPhysicsUtils::toPhysXType(inertia), massFrame);
216 if ((diagTensor.x <= 0.0f) || (diagTensor.y <= 0.0f) || (diagTensor.z <= 0.0f))
217 return; // FIXME: print error?
218
219 body.setCMassLocalPose(physx::PxTransform(
220 QPhysicsUtils::toPhysXType(rigidBody.centerOfMassPosition()), massFrame));
221 body.setMass(mass);
222 body.setMassSpaceInertiaTensor(diagTensor);
223}
224
226 : QPhysicsCommand(), density(inDensity)
227{
228}
229
231 = default;
232
233void QPhysicsCommandSetDensity::execute(const QDynamicRigidBody &rigidBody,
234 physx::PxRigidBody &body)
235{
236 if (rigidBody.hasStaticShapes()) {
237 qWarning() << "Cannot set mass or density on a body containing trimesh/heightfield/plane, "
238 "ignoring.";
239 return;
240 }
241
242 const float clampedDensity = qMax(0.0000001, density);
243 if (clampedDensity != density) {
244 qWarning() << "Clamping density " << density;
245 return;
246 }
247
248 physx::PxRigidBodyExt::updateMassAndInertia(body, clampedDensity);
249}
250
252 : QPhysicsCommand(), isKinematic(inIsKinematic)
253{
254}
255
257 = default;
258
259void QPhysicsCommandSetIsKinematic::execute(const QDynamicRigidBody &rigidBody,
260 physx::PxRigidBody &body)
261{
262 if (rigidBody.hasStaticShapes() && !isKinematic) {
263 qWarning() << "Cannot make a body containing trimesh/heightfield/plane non-kinematic, "
264 "ignoring.";
265 return;
266 }
267
268 body.setRigidBodyFlag(physx::PxRigidBodyFlag::eKINEMATIC, isKinematic);
269}
270
272 : QPhysicsCommand(), gravityEnabled(inGravityEnabled)
273{
274}
275
277 = default;
278
279void QPhysicsCommandSetGravityEnabled::execute(const QDynamicRigidBody &rigidBody,
280 physx::PxRigidBody &body)
281{
282 Q_UNUSED(rigidBody)
283 body.setActorFlag(physx::PxActorFlag::eDISABLE_GRAVITY, !gravityEnabled);
284}
285
286QPhysicsCommandReset::QPhysicsCommandReset(QVector3D inPosition, QVector3D inEulerRotation)
288{
289}
290
292 = default;
293
294void QPhysicsCommandReset::execute(const QDynamicRigidBody &rigidBody, physx::PxRigidBody &body)
295{
296 Q_UNUSED(rigidBody)
297 body.setLinearVelocity(physx::PxVec3(0, 0, 0));
298 body.setAngularVelocity(physx::PxVec3(0, 0, 0));
299
300 auto *parentNode = rigidBody.parentNode();
301 QVector3D scenePosition = parentNode ? parentNode->mapPositionToScene(position) : position;
302 // TODO: rotation also needs to be mapped
303
304 body.setGlobalPose(physx::PxTransform(
305 QPhysicsUtils::toPhysXType(scenePosition),
306 QPhysicsUtils::toPhysXType(QQuaternion::fromEulerAngles(eulerRotation))));
307}
308
310 float inMass, const QVector3D &inInertia)
311 : QPhysicsCommand(), mass(inMass), inertia(inInertia)
312{
313}
314
316 = default;
317
318QT_END_NAMESPACE
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 ~QPhysicsCommand()
Combined button and popup list for selecting options.
static QT_BEGIN_NAMESPACE bool isKinematicBody(physx::PxRigidBody &body)