BsPhysXHingeJoint.cpp 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  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. mInternal = bs_new<FPhysXJoint>(joint);
  23. }
  24. PhysXHingeJoint::~PhysXHingeJoint()
  25. {
  26. bs_delete(mInternal);
  27. }
  28. Radian PhysXHingeJoint::getAngle() const
  29. {
  30. return Radian(getInternal()->getAngle());
  31. }
  32. float PhysXHingeJoint::getSpeed() const
  33. {
  34. return getInternal()->getVelocity();
  35. }
  36. LimitAngular PhysXHingeJoint::getLimit() const
  37. {
  38. PxJointAngularLimitPair pxLimit = getInternal()->getLimit();
  39. LimitAngular limit;
  40. limit.lower = pxLimit.lower;
  41. limit.upper = pxLimit.upper;
  42. limit.contactDist = pxLimit.contactDistance;
  43. limit.spring.stiffness = pxLimit.stiffness;
  44. limit.spring.damping = pxLimit.damping;
  45. return limit;
  46. }
  47. void PhysXHingeJoint::setLimit(const LimitAngular& limit) const
  48. {
  49. PxJointAngularLimitPair pxLimit(limit.lower.valueRadians(), limit.upper.valueRadians(), limit.contactDist);
  50. pxLimit.stiffness = limit.spring.stiffness;
  51. pxLimit.damping = limit.spring.damping;
  52. getInternal()->setLimit(pxLimit);
  53. }
  54. PhysXHingeJoint::Drive PhysXHingeJoint::getDrive() const
  55. {
  56. Drive drive;
  57. drive.speed = getInternal()->getDriveVelocity();
  58. drive.forceLimit = getInternal()->getDriveForceLimit();
  59. drive.gearRatio = getInternal()->getDriveGearRatio();
  60. drive.freeSpin = getInternal()->getRevoluteJointFlags() & PxRevoluteJointFlag::eDRIVE_FREESPIN;
  61. return drive;
  62. }
  63. void PhysXHingeJoint::setDrive(const Drive& drive) const
  64. {
  65. getInternal()->setDriveVelocity(drive.speed);
  66. getInternal()->setDriveForceLimit(drive.forceLimit);
  67. getInternal()->setDriveGearRatio(drive.gearRatio);
  68. getInternal()->setRevoluteJointFlag(PxRevoluteJointFlag::eDRIVE_FREESPIN, drive.freeSpin);
  69. }
  70. void PhysXHingeJoint::setFlag(Flag flag, bool enabled)
  71. {
  72. getInternal()->setRevoluteJointFlag(toPxFlag(flag), enabled);
  73. }
  74. bool PhysXHingeJoint::hasFlag(Flag flag)
  75. {
  76. return getInternal()->getRevoluteJointFlags() & toPxFlag(flag);
  77. }
  78. PxRevoluteJoint* PhysXHingeJoint::getInternal() const
  79. {
  80. FPhysXJoint* internal = static_cast<FPhysXJoint*>(mInternal);
  81. return static_cast<PxRevoluteJoint*>(internal->_getInternal());
  82. }
  83. }