8#include "PxRigidDynamic.h"
9#include "PxRigidActor.h"
12#include "physxnode/qphysxworld_p.h"
19#include <QtGui/qquaternion.h>
21#define PHYSX_RELEASE(x)
32 if (qobject_cast<
const QPlaneShape *>(node) !=
nullptr) {
34 const QQuaternion rotation = QPhysicsUtils::kMinus90YawRotation * node->rotation();
35 return physx::PxTransform(QPhysicsUtils::toPhysXType(node->position()),
36 QPhysicsUtils::toPhysXType(rotation));
37 }
else if (
auto *hf = qobject_cast<
const QHeightFieldShape *>(node)) {
39 return physx::PxTransform(QPhysicsUtils::toPhysXType(node->position() + hf->hfOffset()),
40 QPhysicsUtils::toPhysXType(node->rotation()));
43 const QQuaternion &rotation = node->rotation();
44 const QVector3D &localPosition = node->position();
45 const QVector3D &scale = node->sceneScale();
46 return physx::PxTransform(QPhysicsUtils::toPhysXType(localPosition * scale),
47 QPhysicsUtils::toPhysXType(rotation));
74 QHash<QQuick3DNode *, QMatrix4x4> & )
76 auto *body =
static_cast<QAbstractPhysicsBody *>(frontendNode);
77 if (QPhysicsMaterial *qtMaterial = body->physicsMaterial()) {
78 const float staticFriction = qtMaterial->staticFriction();
79 const float dynamicFriction = qtMaterial->dynamicFriction();
80 const float restitution = qtMaterial->restitution();
81 if (
material->getStaticFriction() != staticFriction)
82 material->setStaticFriction(staticFriction);
83 if (
material->getDynamicFriction() != dynamicFriction)
84 material->setDynamicFriction(dynamicFriction);
85 if (
material->getRestitution() != restitution)
86 material->setRestitution(restitution);
99 const auto &collisionShapes =
frontendNode->getCollisionShapesList();
100 const auto &physXShapes = shapes;
102 const int len = collisionShapes.size();
103 if (physXShapes.size() != len) {
107 for (
int i = 0; i < len; i++) {
108 auto poseNew = getPhysXLocalTransform(collisionShapes[i]);
109 auto poseOld = physXShapes[i]->getLocalPose();
111 if (!QPhysicsUtils::fuzzyEquals(poseNew, poseOld)) {
131 const physx::PxTransform trf = QPhysicsUtils::toPhysXTransform(frontendNode->scenePosition(),
132 frontendNode->sceneRotation());
133 actor = s_physx.physics->createRigidDynamic(trf);
143 return actor->getGlobalPose();
149 for (
auto *shape : shapes) {
150 body->detachShape(*shape);
157 for (
const auto &collisionShape : frontendNode->getCollisionShapesList()) {
160 auto *geom = collisionShape->getPhysXGeometry();
161 if (!geom || !material)
164 auto &s_physx = StaticPhysXObjects::getReference();
165 auto physXShape = s_physx.physics->createShape(*geom, *material);
167 if (useTriggerFlag()) {
168 physXShape->setFlag(physx::PxShapeFlag::eSIMULATION_SHAPE,
false);
169 physXShape->setFlag(physx::PxShapeFlag::eTRIGGER_SHAPE,
true);
173 physx::PxFilterData filterData;
174 filterData.word0 = frontendNode->filterGroup();
175 filterData.word1 = frontendNode->filterIgnoreGroups();
176 physXShape->setSimulationFilterData(filterData);
179 shapes.push_back(physXShape);
180 physXShape->setLocalPose(getPhysXLocalTransform(collisionShape));
181 body->attachShape(*physXShape);
195 for (
auto &physXShape : shapes) {
196 physx::PxFilterData filterData;
197 filterData.word0 = frontendNode->filterGroup();
198 filterData.word1 = frontendNode->filterIgnoreGroups();
199 physXShape->setSimulationFilterData(filterData);
QAbstractPhysicsNode * frontendNode
bool filtersDirty() const
virtual void cleanup(QPhysXWorld *)
physx::PxMaterial * material
QAbstractPhysXNode(QAbstractPhysicsNode *node)
void setShapesDirty(bool dirty)
void setFiltersDirty(bool dirty)
virtual void createMaterial(QPhysXWorld *physX)
void markDirtyShapes() override
void buildShapes(QPhysXWorld *physX)
void rebuildDirtyShapes(QPhysicsWorld *world, QPhysXWorld *physX) override
void init(QPhysicsWorld *world, QPhysXWorld *physX) override
bool debugGeometryCapability() override
QPhysXActorBody(QAbstractPhysicsNode *frontEnd)
void cleanup(QPhysXWorld *physX) override
physx::PxRigidActor * actor
virtual void createActor(QPhysXWorld *physX)
void sync(float deltaTime, QHash< QQuick3DNode *, QMatrix4x4 > &transformCache) override
void updateFilters() override
physx::PxTransform getGlobalPose() override
The QVector3D class represents a vector or vertex in 3D space.
static QT_BEGIN_NAMESPACE physx::PxTransform getPhysXLocalTransform(const QQuick3DNode *node)
#define QT_BEGIN_NAMESPACE
static StaticPhysXObjects & getReference()