RagdollLoader.cpp 3.7 KB

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