BsPhysXHingeJoint.cpp 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "BsPhysXHingeJoint.h"
  4. #include "BsFPhysxJoint.h"
  5. using namespace physx;
  6. namespace BansheeEngine
  7. {
  8. PxRevoluteJointFlag::Enum toPxFlag(PhysXHingeJoint::Flag flag)
  9. {
  10. switch (flag)
  11. {
  12. case PhysXHingeJoint::Flag::Limit:
  13. return PxRevoluteJointFlag::eLIMIT_ENABLED;
  14. default:
  15. case PhysXHingeJoint::Flag::Drive:
  16. return PxRevoluteJointFlag::eDRIVE_ENABLED;
  17. }
  18. }
  19. PhysXHingeJoint::PhysXHingeJoint(PxPhysics* physx)
  20. {
  21. PxRevoluteJoint* joint = PxRevoluteJointCreate(*physx, nullptr, PxTransform(), nullptr, PxTransform());
  22. joint->userData = this;
  23. mInternal = bs_new<FPhysXJoint>(joint);
  24. }
  25. PhysXHingeJoint::~PhysXHingeJoint()
  26. {
  27. bs_delete(mInternal);
  28. }
  29. Radian PhysXHingeJoint::getAngle() const
  30. {
  31. return Radian(getInternal()->getAngle());
  32. }
  33. float PhysXHingeJoint::getSpeed() const
  34. {
  35. return getInternal()->getVelocity();
  36. }
  37. LimitAngularRange PhysXHingeJoint::getLimit() const
  38. {
  39. PxJointAngularLimitPair pxLimit = getInternal()->getLimit();
  40. LimitAngularRange limit;
  41. limit.lower = pxLimit.lower;
  42. limit.upper = pxLimit.upper;
  43. limit.contactDist = pxLimit.contactDistance;
  44. limit.restitution = pxLimit.restitution;
  45. limit.spring.stiffness = pxLimit.stiffness;
  46. limit.spring.damping = pxLimit.damping;
  47. return limit;
  48. }
  49. void PhysXHingeJoint::setLimit(const LimitAngularRange& limit)
  50. {
  51. PxJointAngularLimitPair pxLimit(limit.lower.valueRadians(), limit.upper.valueRadians(), limit.contactDist);
  52. pxLimit.stiffness = limit.spring.stiffness;
  53. pxLimit.damping = limit.spring.damping;
  54. pxLimit.restitution = limit.restitution;
  55. getInternal()->setLimit(pxLimit);
  56. }
  57. PhysXHingeJoint::Drive PhysXHingeJoint::getDrive() const
  58. {
  59. Drive drive;
  60. drive.speed = getInternal()->getDriveVelocity();
  61. drive.forceLimit = getInternal()->getDriveForceLimit();
  62. drive.gearRatio = getInternal()->getDriveGearRatio();
  63. drive.freeSpin = getInternal()->getRevoluteJointFlags() & PxRevoluteJointFlag::eDRIVE_FREESPIN;
  64. return drive;
  65. }
  66. void PhysXHingeJoint::setDrive(const Drive& drive)
  67. {
  68. getInternal()->setDriveVelocity(drive.speed);
  69. getInternal()->setDriveForceLimit(drive.forceLimit);
  70. getInternal()->setDriveGearRatio(drive.gearRatio);
  71. getInternal()->setRevoluteJointFlag(PxRevoluteJointFlag::eDRIVE_FREESPIN, drive.freeSpin);
  72. }
  73. void PhysXHingeJoint::setFlag(Flag flag, bool enabled)
  74. {
  75. getInternal()->setRevoluteJointFlag(toPxFlag(flag), enabled);
  76. }
  77. bool PhysXHingeJoint::hasFlag(Flag flag) const
  78. {
  79. return getInternal()->getRevoluteJointFlags() & toPxFlag(flag);
  80. }
  81. PxRevoluteJoint* PhysXHingeJoint::getInternal() const
  82. {
  83. FPhysXJoint* internal = static_cast<FPhysXJoint*>(mInternal);
  84. return static_cast<PxRevoluteJoint*>(internal->_getInternal());
  85. }
  86. }