| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311 |
- //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
- //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
- #include "BsPhysXD6Joint.h"
- #include "BsFPhysXJoint.h"
- #include "BsPhysX.h"
- #include "BsPhysXRigidbody.h"
- #include "PxRigidDynamic.h"
- using namespace physx;
- namespace bs
- {
- PxD6Axis::Enum toPxAxis(D6JointAxis axis)
- {
- switch(axis)
- {
- default:
- case D6JointAxis::X:
- return PxD6Axis::eX;
- case D6JointAxis::Y:
- return PxD6Axis::eY;
- case D6JointAxis::Z:
- return PxD6Axis::eZ;
- case D6JointAxis::Twist:
- return PxD6Axis::eTWIST;
- case D6JointAxis::SwingY:
- return PxD6Axis::eSWING1;
- case D6JointAxis::SwingZ:
- return PxD6Axis::eSWING2;
- }
- }
- PxD6Motion::Enum toPxMotion(D6JointMotion motion)
- {
- switch(motion)
- {
- default:
- case D6JointMotion::Free:
- return PxD6Motion::eFREE;
- case D6JointMotion::Limited:
- return PxD6Motion::eLIMITED;
- case D6JointMotion::Locked:
- return PxD6Motion::eLOCKED;
- }
- }
- PxD6Drive::Enum toPxDrive(D6JointDriveType drive)
- {
- switch(drive)
- {
- default:
- case D6JointDriveType::X:
- return PxD6Drive::eX;
- case D6JointDriveType::Y:
- return PxD6Drive::eY;
- case D6JointDriveType::Z:
- return PxD6Drive::eZ;
- case D6JointDriveType::Swing:
- return PxD6Drive::eSWING;
- case D6JointDriveType::Twist:
- return PxD6Drive::eTWIST;
- case D6JointDriveType::SLERP:
- return PxD6Drive::eSLERP;
- }
- }
- D6JointMotion fromPxMotion(PxD6Motion::Enum motion)
- {
- switch (motion)
- {
- default:
- case PxD6Motion::eFREE:
- return D6JointMotion::Free;
- case PxD6Motion::eLIMITED:
- return D6JointMotion::Limited;
- case PxD6Motion::eLOCKED:
- return D6JointMotion::Locked;
- }
- }
- D6JointDriveType fromPxDrive(PxD6Drive::Enum drive)
- {
- switch (drive)
- {
- default:
- case PxD6Drive::eX:
- return D6JointDriveType::X;
- case PxD6Drive::eY:
- return D6JointDriveType::Y;
- case PxD6Drive::eZ:
- return D6JointDriveType::Z;
- case PxD6Drive::eSWING:
- return D6JointDriveType::Swing;
- case PxD6Drive::eTWIST:
- return D6JointDriveType::Twist;
- case PxD6Drive::eSLERP:
- return D6JointDriveType::SLERP;
- }
- }
- 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);
- }
- PhysXD6Joint::~PhysXD6Joint()
- {
- bs_delete(mInternal);
- }
- D6JointMotion PhysXD6Joint::getMotion(D6JointAxis axis) const
- {
- return fromPxMotion(getInternal()->getMotion(toPxAxis(axis)));
- }
- void PhysXD6Joint::setMotion(D6JointAxis axis, D6JointMotion motion)
- {
- getInternal()->setMotion(toPxAxis(axis), toPxMotion(motion));
- }
- Radian PhysXD6Joint::getTwist() const
- {
- return Radian(getInternal()->getTwist());
- }
- Radian PhysXD6Joint::getSwingY() const
- {
- return Radian(getInternal()->getSwingYAngle());
- }
- Radian PhysXD6Joint::getSwingZ() const
- {
- return Radian(getInternal()->getSwingZAngle());
- }
- LimitLinear PhysXD6Joint::getLimitLinear() const
- {
- PxJointLinearLimit pxLimit = getInternal()->getLinearLimit();
- LimitLinear limit;
- limit.extent = pxLimit.value;
- limit.contactDist = pxLimit.contactDistance;
- limit.restitution = pxLimit.restitution;
- limit.spring.stiffness = pxLimit.stiffness;
- limit.spring.damping = pxLimit.damping;
- return limit;
- }
- void PhysXD6Joint::setLimitLinear(const LimitLinear& limit)
- {
- PxJointLinearLimit pxLimit(gPhysX().getScale(), limit.extent, limit.contactDist);
- pxLimit.stiffness = limit.spring.stiffness;
- pxLimit.damping = limit.spring.damping;
- pxLimit.restitution = limit.restitution;
- getInternal()->setLinearLimit(pxLimit);
- }
- LimitAngularRange PhysXD6Joint::getLimitTwist() const
- {
- PxJointAngularLimitPair pxLimit = getInternal()->getTwistLimit();
- LimitAngularRange limit;
- limit.lower = pxLimit.lower;
- limit.upper = pxLimit.upper;
- limit.contactDist = pxLimit.contactDistance;
- limit.restitution = pxLimit.restitution;
- limit.spring.stiffness = pxLimit.stiffness;
- limit.spring.damping = pxLimit.damping;
- return limit;
- }
- void PhysXD6Joint::setLimitTwist(const LimitAngularRange& limit)
- {
- PxJointAngularLimitPair pxLimit(limit.lower.valueRadians(), limit.upper.valueRadians(), limit.contactDist);
- pxLimit.stiffness = limit.spring.stiffness;
- pxLimit.damping = limit.spring.damping;
- pxLimit.restitution = limit.restitution;
- getInternal()->setTwistLimit(pxLimit);
- }
- LimitConeRange PhysXD6Joint::getLimitSwing() const
- {
- PxJointLimitCone pxLimit = getInternal()->getSwingLimit();
- LimitConeRange limit;
- limit.yLimitAngle = pxLimit.yAngle;
- limit.zLimitAngle = pxLimit.zAngle;
- limit.contactDist = pxLimit.contactDistance;
- limit.restitution = pxLimit.restitution;
- limit.spring.stiffness = pxLimit.stiffness;
- limit.spring.damping = pxLimit.damping;
- return limit;
- }
- void PhysXD6Joint::setLimitSwing(const LimitConeRange& limit)
- {
- PxJointLimitCone pxLimit(limit.yLimitAngle.valueRadians(), limit.zLimitAngle.valueRadians(), limit.contactDist);
- pxLimit.stiffness = limit.spring.stiffness;
- pxLimit.damping = limit.spring.damping;
- pxLimit.restitution = limit.restitution;
- getInternal()->setSwingLimit(pxLimit);
- }
- D6JointDrive PhysXD6Joint::getDrive(D6JointDriveType type) const
- {
- PxD6JointDrive pxDrive = getInternal()->getDrive(toPxDrive(type));
- D6JointDrive drive;
- drive.acceleration = pxDrive.flags & PxD6JointDriveFlag::eACCELERATION;
- drive.stiffness = pxDrive.stiffness;
- drive.damping = pxDrive.damping;
- drive.forceLimit = pxDrive.forceLimit;
- return drive;
- }
- void PhysXD6Joint::setDrive(D6JointDriveType type, const D6JointDrive& drive)
- {
- PxD6JointDrive pxDrive;
- if(drive.acceleration)
- pxDrive.flags = PxD6JointDriveFlag::eACCELERATION;
- pxDrive.stiffness = drive.stiffness;
- pxDrive.damping = drive.damping;
- pxDrive.forceLimit = drive.forceLimit;
- getInternal()->setDrive(toPxDrive(type), pxDrive);
- }
- Vector3 PhysXD6Joint::getDrivePosition() const
- {
- return fromPxVector(getInternal()->getDrivePosition().p);
- }
- Quaternion PhysXD6Joint::getDriveRotation() const
- {
- return fromPxQuaternion(getInternal()->getDrivePosition().q);
- }
- void PhysXD6Joint::setDriveTransform(const Vector3& position, const Quaternion& rotation)
- {
- getInternal()->setDrivePosition(toPxTransform(position, rotation));
- }
- Vector3 PhysXD6Joint::getDriveLinearVelocity() const
- {
- PxVec3 linear;
- PxVec3 angular;
- getInternal()->getDriveVelocity(linear, angular);
- return fromPxVector(linear);
- }
- Vector3 PhysXD6Joint::getDriveAngularVelocity() const
- {
- PxVec3 linear;
- PxVec3 angular;
- getInternal()->getDriveVelocity(linear, angular);
- return fromPxVector(angular);
- }
- void PhysXD6Joint::setDriveVelocity(const Vector3& linear, const Vector3& angular)
- {
- getInternal()->setDriveVelocity(toPxVector(linear), toPxVector(angular));
- }
- PxD6Joint* PhysXD6Joint::getInternal() const
- {
- FPhysXJoint* internal = static_cast<FPhysXJoint*>(mInternal);
- return static_cast<PxD6Joint*>(internal->_getInternal());
- }
- }
|