PhysXHingeJoint::PhysXHingeJoint(PxPhysics* physx, const HINGE_JOINT_DESC& desc) :HingeJoint(desc) { PxRigidActor* actor0 = nullptr; if (desc.bodies[0].body != nullptr) actor0 = static_cast<PhysXRigidbody*>(desc.bodies[0].body)->_getInternal(); PxRigidActor* actor1 = nullptr; if (desc.bodies[1].body != nullptr) actor1 = static_cast<PhysXRigidbody*>(desc.bodies[1].body)->_getInternal(); PxTransform tfrm0 = toPxTransform(desc.bodies[0].position, desc.bodies[0].rotation); PxTransform tfrm1 = toPxTransform(desc.bodies[1].position, desc.bodies[1].rotation); PxRevoluteJoint* joint = PxRevoluteJointCreate(*physx, actor0, tfrm0, actor1, tfrm1); joint->userData = this; mInternal = bs_new<FPhysXJoint>(joint, desc); PxRevoluteJointFlags flags; if (((UINT32)desc.flag & (UINT32)Flag::Limit) != 0) flags |= PxRevoluteJointFlag::eLIMIT_ENABLED; if (((UINT32)desc.flag & (UINT32)Flag::Drive) != 0) flags |= PxRevoluteJointFlag::eDRIVE_ENABLED; joint->setRevoluteJointFlags(flags); // Must be set after global flags, as it will append to them. // Calls to virtual methods are okay here. setLimit(desc.limit); setDrive(desc.drive); }
PhysXD6Joint::PhysXD6Joint(PxPhysics* physx, const D6_JOINT_DESC& desc) :D6Joint(desc) { PxRigidActor* actor0 = nullptr; if (desc.bodies[0].body != nullptr) actor0 = static_cast<PhysXRigidbody*>(desc.bodies[0].body)->_getInternal(); PxRigidActor* actor1 = nullptr; if (desc.bodies[1].body != nullptr) actor1 = static_cast<PhysXRigidbody*>(desc.bodies[1].body)->_getInternal(); PxTransform tfrm0 = toPxTransform(desc.bodies[0].position, desc.bodies[0].rotation); PxTransform tfrm1 = toPxTransform(desc.bodies[1].position, desc.bodies[1].rotation); PxD6Joint* joint = PxD6JointCreate(*physx, actor0, tfrm0, actor1, tfrm1); joint->userData = this; mInternal = bs_new<FPhysXJoint>(joint, desc); // Calls to virtual methods are okay here for (UINT32 i = 0; i < (UINT32)D6JointAxis::Count; i++) setMotion((D6JointAxis)i, desc.motion[i]); for (UINT32 i = 0; i < (UINT32)D6JointDriveType::Count; i++) setDrive((D6JointDriveType)i, desc.drive[i]); setLimitLinear(desc.limitLinear); setLimitTwist(desc.limitTwist); setLimitSwing(desc.limitSwing); setDriveTransform(desc.drivePosition, desc.driveRotation); setDriveVelocity(desc.driveLinearVelocity, desc.driveAngularVelocity); }
PhysXSphericalJoint::PhysXSphericalJoint(PxPhysics* physx, const SPHERICAL_JOINT_DESC& desc) :SphericalJoint(desc) { PxRigidActor* actor0 = nullptr; if (desc.bodies[0].body != nullptr) actor0 = static_cast<PhysXRigidbody*>(desc.bodies[0].body)->_getInternal(); PxRigidActor* actor1 = nullptr; if (desc.bodies[1].body != nullptr) actor1 = static_cast<PhysXRigidbody*>(desc.bodies[1].body)->_getInternal(); PxTransform tfrm0 = toPxTransform(desc.bodies[0].position, desc.bodies[0].rotation); PxTransform tfrm1 = toPxTransform(desc.bodies[1].position, desc.bodies[1].rotation); PxSphericalJoint* joint = PxSphericalJointCreate(*physx, actor0, tfrm0, actor1, tfrm1); joint->userData = this; mInternal = bs_new<FPhysXJoint>(joint, desc); PxSphericalJointFlags flags; if (((UINT32)desc.flag & (UINT32)Flag::Limit) != 0) flags |= PxSphericalJointFlag::eLIMIT_ENABLED; joint->setSphericalJointFlags(flags); // Calls to virtual methods are okay here setLimit(desc.limit); }
PhysXMeshCollider::PhysXMeshCollider(PxPhysics* physx, const Vector3& position, const Quaternion& rotation) { PxSphereGeometry geometry(0.01f); // Dummy PxShape* shape = physx->createShape(geometry, *gPhysX().getDefaultMaterial(), true); shape->setLocalPose(toPxTransform(position, rotation)); shape->userData = this; mInternal = bs_new<FPhysXCollider>(shape); }
PhysXRigidbody::PhysXRigidbody(PxPhysics* physx, PxScene* scene, const HSceneObject& linkedSO) :Rigidbody(linkedSO) { PxTransform tfrm = toPxTransform(linkedSO->getWorldPosition(), linkedSO->getWorldRotation()); mInternal = physx->createRigidDynamic(tfrm); mInternal->userData = this; scene->addActor(*mInternal); }
void PhysXRigidbody::setCenterOfMass(const Vector3& position, const Quaternion& rotation) { if (((UINT32)mFlags & (UINT32)Flag::AutoTensors) != 0) { LOGWRN("Attempting to set Rigidbody center of mass, but it has automatic tensor calculation turned on."); return; } mInternal->setCMassLocalPose(toPxTransform(position, rotation)); }
PhysXSphereCollider::PhysXSphereCollider(PxPhysics* physx, const Vector3& position, const Quaternion& rotation, float radius) :mRadius(radius) { PxSphereGeometry geometry(radius); PxShape* shape = physx->createShape(geometry, *gPhysX().getDefaultMaterial(), true); shape->setLocalPose(toPxTransform(position, rotation)); shape->userData = this; mInternal = bs_new<FPhysXCollider>(shape); applyGeometry(); }
PhysXBoxCollider::PhysXBoxCollider(PxPhysics* physx, const Vector3& position, const Quaternion& rotation, const Vector3& extents) :mExtents(extents) { PxBoxGeometry geometry(extents.x, extents.y, extents.z); PxShape* shape = physx->createShape(geometry, *gPhysX().getDefaultMaterial(), true); shape->setLocalPose(toPxTransform(position, rotation)); shape->userData = this; mInternal = bs_new<FPhysXCollider>(shape); applyGeometry(); }
void PhysXRigidbody::setTransform(const Vector3& pos, const Quaternion& rot) { mInternal->setGlobalPose(toPxTransform(pos, rot)); }
void PhysXD6Joint::setDriveTransform(const Vector3& position, const Quaternion& rotation) { getInternal()->setDrivePosition(toPxTransform(position, rotation)); }
void FPhysXJoint::setTransform(JointBody body, const Vector3& position, const Quaternion& rotation) { PxTransform transform = toPxTransform(position, rotation); mJoint->setLocalPose(toJointActor(body), transform); }