BsCHingeJoint.cpp 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "Components/BsCHingeJoint.h"
  4. #include "Scene/BsSceneObject.h"
  5. #include "RTTI/BsCHingeJointRTTI.h"
  6. namespace bs
  7. {
  8. CHingeJoint::CHingeJoint()
  9. : CJoint(mDesc)
  10. { }
  11. CHingeJoint::CHingeJoint(const HSceneObject& parent)
  12. : CJoint(parent, mDesc)
  13. {
  14. setName("HingeJoint");
  15. }
  16. Radian CHingeJoint::getAngle() const
  17. {
  18. if (mInternal == nullptr)
  19. return Radian(0.0f);
  20. return _getInternal()->getAngle();
  21. }
  22. float CHingeJoint::getSpeed() const
  23. {
  24. if (mInternal == nullptr)
  25. return 0.0f;
  26. return _getInternal()->getSpeed();
  27. }
  28. LimitAngularRange CHingeJoint::getLimit() const
  29. {
  30. return mDesc.limit;
  31. }
  32. void CHingeJoint::setLimit(const LimitAngularRange& limit)
  33. {
  34. if (limit == mDesc.limit)
  35. return;
  36. mDesc.limit = limit;
  37. if (mInternal != nullptr)
  38. _getInternal()->setLimit(limit);
  39. }
  40. HingeJointDrive CHingeJoint::getDrive() const
  41. {
  42. return mDesc.drive;
  43. }
  44. void CHingeJoint::setDrive(const HingeJointDrive& drive)
  45. {
  46. if (drive == mDesc.drive)
  47. return;
  48. mDesc.drive = drive;
  49. if (mInternal != nullptr)
  50. _getInternal()->setDrive(drive);
  51. }
  52. void CHingeJoint::setFlag(HingeJointFlag flag, bool enabled)
  53. {
  54. bool isEnabled = ((UINT32)mDesc.flag & (UINT32)flag) != 0;
  55. if (isEnabled == enabled)
  56. return;
  57. if (enabled)
  58. mDesc.flag = (HingeJointFlag)((UINT32)mDesc.flag | (UINT32)flag);
  59. else
  60. mDesc.flag = (HingeJointFlag)((UINT32)mDesc.flag & ~(UINT32)flag);
  61. if (mInternal != nullptr)
  62. _getInternal()->setFlag(flag, enabled);
  63. }
  64. bool CHingeJoint::hasFlag(HingeJointFlag flag) const
  65. {
  66. return ((UINT32)mDesc.flag & (UINT32)flag) != 0;
  67. }
  68. SPtr<Joint> CHingeJoint::createInternal()
  69. {
  70. SPtr<Joint> joint = HingeJoint::create(mDesc);
  71. joint->_setOwner(PhysicsOwnerType::Component, this);
  72. return joint;
  73. }
  74. RTTITypeBase* CHingeJoint::getRTTIStatic()
  75. {
  76. return CHingeJointRTTI::instance();
  77. }
  78. RTTITypeBase* CHingeJoint::getRTTI() const
  79. {
  80. return CHingeJoint::getRTTIStatic();
  81. }
  82. }