2
0

RagdollLoader.cpp 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. // Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)
  2. // SPDX-FileCopyrightText: 2021 Jorrit Rouwe
  3. // SPDX-License-Identifier: MIT
  4. #include <TestFramework.h>
  5. #include <Utils/RagdollLoader.h>
  6. #include <Jolt/Physics/Ragdoll/Ragdoll.h>
  7. #include <Jolt/Physics/Constraints/PointConstraint.h>
  8. #include <Jolt/Physics/Constraints/FixedConstraint.h>
  9. #include <Jolt/Physics/Constraints/HingeConstraint.h>
  10. #include <Jolt/Physics/Constraints/SliderConstraint.h>
  11. #include <Jolt/Physics/Constraints/ConeConstraint.h>
  12. #include <Jolt/Physics/Constraints/SwingTwistConstraint.h>
  13. #include <Jolt/ObjectStream/ObjectStreamIn.h>
  14. #include <Jolt/ObjectStream/ObjectStreamOut.h>
  15. #include <Layers.h>
  16. #include <Utils/Log.h>
  17. RagdollSettings *RagdollLoader::sLoad(const char *inFileName, EMotionType inMotionType, EConstraintOverride inConstraintOverride)
  18. {
  19. // Read the ragdoll
  20. RagdollSettings *ragdoll = nullptr;
  21. if (!ObjectStreamIn::sReadObject(inFileName, ragdoll))
  22. FatalError("Unable to read ragdoll");
  23. for (RagdollSettings::Part &p : ragdoll->mParts)
  24. {
  25. // Update motion type
  26. p.mMotionType = inMotionType;
  27. // Override layer
  28. p.mObjectLayer = Layers::MOVING;
  29. // Create new constraint
  30. Ref<SwingTwistConstraintSettings> original = DynamicCast<SwingTwistConstraintSettings>(p.mToParent);
  31. if (original != nullptr)
  32. switch (inConstraintOverride)
  33. {
  34. case EConstraintOverride::TypeFixed:
  35. {
  36. FixedConstraintSettings *settings = new FixedConstraintSettings();
  37. settings->mPoint1 = settings->mPoint2 = original->mPosition1;
  38. p.mToParent = settings;
  39. break;
  40. }
  41. case EConstraintOverride::TypePoint:
  42. {
  43. PointConstraintSettings *settings = new PointConstraintSettings();
  44. settings->mPoint1 = settings->mPoint2 = original->mPosition1;
  45. p.mToParent = settings;
  46. break;
  47. }
  48. case EConstraintOverride::TypeHinge:
  49. {
  50. HingeConstraintSettings *settings = new HingeConstraintSettings();
  51. settings->mPoint1 = original->mPosition1;
  52. settings->mHingeAxis1 = original->mPlaneAxis1;
  53. settings->mNormalAxis1 = original->mTwistAxis1;
  54. settings->mPoint2 = original->mPosition2;
  55. settings->mHingeAxis2 = original->mPlaneAxis2;
  56. settings->mNormalAxis2 = original->mTwistAxis2;
  57. settings->mLimitsMin = -original->mNormalHalfConeAngle;
  58. settings->mLimitsMax = original->mNormalHalfConeAngle;
  59. settings->mMaxFrictionTorque = original->mMaxFrictionTorque;
  60. p.mToParent = settings;
  61. break;
  62. }
  63. case EConstraintOverride::TypeSlider:
  64. {
  65. SliderConstraintSettings *settings = new SliderConstraintSettings();
  66. settings->mPoint1 = settings->mPoint2 = original->mPosition1;
  67. settings->mSliderAxis1 = settings->mSliderAxis2 = original->mTwistAxis1;
  68. settings->mNormalAxis1 = settings->mNormalAxis2 = original->mTwistAxis1.GetNormalizedPerpendicular();
  69. settings->mLimitsMin = -1.0f;
  70. settings->mLimitsMax = 1.0f;
  71. settings->mMaxFrictionForce = original->mMaxFrictionTorque;
  72. p.mToParent = settings;
  73. break;
  74. }
  75. case EConstraintOverride::TypeCone:
  76. {
  77. ConeConstraintSettings *settings = new ConeConstraintSettings();
  78. settings->mPoint1 = original->mPosition1;
  79. settings->mTwistAxis1 = original->mTwistAxis1;
  80. settings->mPoint2 = original->mPosition2;
  81. settings->mTwistAxis2 = original->mTwistAxis2;
  82. settings->mHalfConeAngle = original->mNormalHalfConeAngle;
  83. p.mToParent = settings;
  84. break;
  85. }
  86. case EConstraintOverride::TypeRagdoll:
  87. break;
  88. }
  89. }
  90. // Initialize the skeleton
  91. ragdoll->GetSkeleton()->CalculateParentJointIndices();
  92. // Stabilize the constraints of the ragdoll
  93. ragdoll->Stabilize();
  94. // Calculate body <-> constraint map
  95. ragdoll->CalculateBodyIndexToConstraintIndex();
  96. ragdoll->CalculateConstraintIndexToBodyIdxPair();
  97. return ragdoll;
  98. }