KinematicRigTest.cpp 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  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 <Tests/Rig/KinematicRigTest.h>
  6. #include <Jolt/Physics/Collision/Shape/BoxShape.h>
  7. #include <Jolt/Physics/StateRecorder.h>
  8. #include <Jolt/ObjectStream/ObjectStreamIn.h>
  9. #include <Application/DebugUI.h>
  10. #include <Layers.h>
  11. #include <Utils/Log.h>
  12. #include <Utils/AssetStream.h>
  13. JPH_IMPLEMENT_RTTI_VIRTUAL(KinematicRigTest)
  14. {
  15. JPH_ADD_BASE_CLASS(KinematicRigTest, Test)
  16. }
  17. KinematicRigTest::~KinematicRigTest()
  18. {
  19. mRagdoll->RemoveFromPhysicsSystem();
  20. }
  21. void KinematicRigTest::Initialize()
  22. {
  23. // Floor
  24. CreateFloor();
  25. // Wall
  26. RefConst<Shape> box_shape = new BoxShape(Vec3(0.2f, 0.2f, 0.2f), 0.01f);
  27. for (int i = 0; i < 3; ++i)
  28. for (int j = i / 2; j < 10 - (i + 1) / 2; ++j)
  29. {
  30. RVec3 position(-2.0f + j * 0.4f + (i & 1? 0.2f : 0.0f), 0.2f + i * 0.4f, -2.0f);
  31. mBodyInterface->CreateAndAddBody(BodyCreationSettings(box_shape, position, Quat::sIdentity(), EMotionType::Dynamic, Layers::MOVING), EActivation::DontActivate);
  32. }
  33. // Bar to hit head against
  34. // (this should not affect the kinematic ragdoll)
  35. mBodyInterface->CreateAndAddBody(BodyCreationSettings(new BoxShape(Vec3(2.0f, 0.1f, 0.1f), 0.01f), RVec3(0, 1.5f, -2.0f), Quat::sIdentity(), EMotionType::Static, Layers::NON_MOVING), EActivation::DontActivate);
  36. // Load ragdoll
  37. mRagdollSettings = RagdollLoader::sLoad("Human.tof", EMotionType::Kinematic);
  38. // Create ragdoll
  39. mRagdoll = mRagdollSettings->CreateRagdoll(0, 0, mPhysicsSystem);
  40. mRagdoll->AddToPhysicsSystem(EActivation::Activate);
  41. // Load animation
  42. AssetStream stream("Human/walk.tof", std::ios::in);
  43. if (!ObjectStreamIn::sReadObject(stream.Get(), mAnimation))
  44. FatalError("Could not open animation");
  45. // Initialize pose
  46. mPose.SetSkeleton(mRagdollSettings->GetSkeleton());
  47. // Position ragdoll
  48. mAnimation->Sample(0.0f, mPose);
  49. mPose.CalculateJointMatrices();
  50. mRagdoll->SetPose(mPose);
  51. }
  52. void KinematicRigTest::PrePhysicsUpdate(const PreUpdateParams &inParams)
  53. {
  54. // Sample previous pose and draw it (ragdoll should have achieved this position)
  55. mAnimation->Sample(mTime, mPose);
  56. mPose.CalculateJointMatrices();
  57. #ifdef JPH_DEBUG_RENDERER
  58. mPose.Draw(*inParams.mPoseDrawSettings, mDebugRenderer);
  59. #endif // JPH_DEBUG_RENDERER
  60. // Update time
  61. mTime += inParams.mDeltaTime;
  62. // Sample new pose
  63. mAnimation->Sample(mTime, mPose);
  64. mPose.CalculateJointMatrices();
  65. mRagdoll->DriveToPoseUsingKinematics(mPose, inParams.mDeltaTime);
  66. }
  67. void KinematicRigTest::SaveState(StateRecorder &inStream) const
  68. {
  69. inStream.Write(mTime);
  70. }
  71. void KinematicRigTest::RestoreState(StateRecorder &inStream)
  72. {
  73. inStream.Read(mTime);
  74. }