BsPhysXDistanceJoint.cpp 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "BsPhysXDistanceJoint.h"
  4. #include "BsFPhysxJoint.h"
  5. #include "BsPhysXRigidbody.h"
  6. #include "PxRigidDynamic.h"
  7. using namespace physx;
  8. namespace bs
  9. {
  10. PxDistanceJointFlag::Enum toPxFlag(PhysXDistanceJoint::Flag flag)
  11. {
  12. switch (flag)
  13. {
  14. case PhysXDistanceJoint::Flag::MaxDistance:
  15. return PxDistanceJointFlag::eMAX_DISTANCE_ENABLED;
  16. case PhysXDistanceJoint::Flag::MinDistance:
  17. return PxDistanceJointFlag::eMIN_DISTANCE_ENABLED;
  18. default:
  19. case PhysXDistanceJoint::Flag::Spring:
  20. return PxDistanceJointFlag::eSPRING_ENABLED;
  21. }
  22. }
  23. PhysXDistanceJoint::PhysXDistanceJoint(PxPhysics* physx, const DISTANCE_JOINT_DESC& desc)
  24. :DistanceJoint(desc)
  25. {
  26. PxRigidActor* actor0 = nullptr;
  27. if (desc.bodies[0].body != nullptr)
  28. actor0 = static_cast<PhysXRigidbody*>(desc.bodies[0].body)->_getInternal();
  29. PxRigidActor* actor1 = nullptr;
  30. if (desc.bodies[1].body != nullptr)
  31. actor1 = static_cast<PhysXRigidbody*>(desc.bodies[1].body)->_getInternal();
  32. PxTransform tfrm0 = toPxTransform(desc.bodies[0].position, desc.bodies[0].rotation);
  33. PxTransform tfrm1 = toPxTransform(desc.bodies[1].position, desc.bodies[1].rotation);
  34. PxDistanceJoint* joint = PxDistanceJointCreate(*physx, actor0, tfrm0, actor1, tfrm1);
  35. joint->userData = this;
  36. mInternal = bs_new<FPhysXJoint>(joint, desc);
  37. // Calls to virtual methods are okay here
  38. setMinDistance(desc.minDistance);
  39. setMaxDistance(desc.maxDistance);
  40. setTolerance(desc.tolerance);
  41. setSpring(desc.spring);
  42. PxDistanceJointFlags flags;
  43. if(((UINT32)desc.flag & (UINT32)Flag::MaxDistance) != 0)
  44. flags |= PxDistanceJointFlag::eMAX_DISTANCE_ENABLED;
  45. if (((UINT32)desc.flag & (UINT32)Flag::MinDistance) != 0)
  46. flags |= PxDistanceJointFlag::eMIN_DISTANCE_ENABLED;
  47. if (((UINT32)desc.flag & (UINT32)Flag::Spring) != 0)
  48. flags |= PxDistanceJointFlag::eSPRING_ENABLED;
  49. joint->setDistanceJointFlags(flags);
  50. }
  51. PhysXDistanceJoint::~PhysXDistanceJoint()
  52. {
  53. bs_delete(mInternal);
  54. }
  55. float PhysXDistanceJoint::getDistance() const
  56. {
  57. return getInternal()->getDistance();
  58. }
  59. float PhysXDistanceJoint::getMinDistance() const
  60. {
  61. return getInternal()->getMinDistance();
  62. }
  63. void PhysXDistanceJoint::setMinDistance(float value)
  64. {
  65. getInternal()->setMinDistance(value);
  66. }
  67. float PhysXDistanceJoint::getMaxDistance() const
  68. {
  69. return getInternal()->getMaxDistance();
  70. }
  71. void PhysXDistanceJoint::setMaxDistance(float value)
  72. {
  73. getInternal()->setMaxDistance(value);
  74. }
  75. float PhysXDistanceJoint::getTolerance() const
  76. {
  77. return getInternal()->getTolerance();
  78. }
  79. void PhysXDistanceJoint::setTolerance(float value)
  80. {
  81. getInternal()->setTolerance(value);
  82. }
  83. Spring PhysXDistanceJoint::getSpring() const
  84. {
  85. float damping = getInternal()->getDamping();
  86. float stiffness = getInternal()->getStiffness();
  87. return Spring(stiffness, damping);
  88. }
  89. void PhysXDistanceJoint::setSpring(const Spring& value)
  90. {
  91. getInternal()->setDamping(value.damping);
  92. getInternal()->setStiffness(value.stiffness);
  93. }
  94. void PhysXDistanceJoint::setFlag(Flag flag, bool enabled)
  95. {
  96. getInternal()->setDistanceJointFlag(toPxFlag(flag), enabled);
  97. }
  98. bool PhysXDistanceJoint::hasFlag(Flag flag) const
  99. {
  100. return getInternal()->getDistanceJointFlags() & toPxFlag(flag);
  101. }
  102. PxDistanceJoint* PhysXDistanceJoint::getInternal() const
  103. {
  104. FPhysXJoint* internal = static_cast<FPhysXJoint*>(mInternal);
  105. return static_cast<PxDistanceJoint*>(internal->_getInternal());
  106. }
  107. }