RagdollLoader.cpp 3.3 KB

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