LoadSaveBinaryRigTest.cpp 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  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/LoadSaveBinaryRigTest.h>
  6. #include <Jolt/Core/StreamWrapper.h>
  7. #include <Jolt/Physics/Constraints/DistanceConstraint.h>
  8. #include <Utils/Log.h>
  9. #include <Utils/RagdollLoader.h>
  10. JPH_IMPLEMENT_RTTI_VIRTUAL(LoadSaveBinaryRigTest)
  11. {
  12. JPH_ADD_BASE_CLASS(LoadSaveBinaryRigTest, Test)
  13. }
  14. LoadSaveBinaryRigTest::~LoadSaveBinaryRigTest()
  15. {
  16. mRagdoll->RemoveFromPhysicsSystem();
  17. }
  18. void LoadSaveBinaryRigTest::Initialize()
  19. {
  20. // Floor
  21. CreateFloor();
  22. stringstream data;
  23. {
  24. // Load ragdoll
  25. Ref<RagdollSettings> settings = RagdollLoader::sLoad("Assets/Human.tof", EMotionType::Dynamic);
  26. // Add an additional constraint between the left and right arm to test loading/saving of additional constraints
  27. const Skeleton *skeleton = settings->GetSkeleton();
  28. int left_arm = skeleton->GetJointIndex("L_Wrist_sjnt_0");
  29. int right_arm = skeleton->GetJointIndex("R_Wrist_sjnt_0");
  30. Ref<DistanceConstraintSettings> constraint = new DistanceConstraintSettings;
  31. constraint->mSpace = EConstraintSpace::LocalToBodyCOM;
  32. constraint->mMaxDistance = 0.1f;
  33. constraint->mMinDistance = 0.1f;
  34. settings->mAdditionalConstraints.push_back(RagdollSettings::AdditionalConstraint(left_arm, right_arm , constraint));
  35. // Save it to a binary stream
  36. StreamOutWrapper stream_out(data);
  37. settings->SaveBinaryState(stream_out, true /* Save shape */, true /* Save group filter */);
  38. }
  39. StreamInWrapper stream_in(data);
  40. RagdollSettings::RagdollResult result = RagdollSettings::sRestoreFromBinaryState(stream_in);
  41. if (result.HasError())
  42. FatalError(result.GetError().c_str());
  43. // Create ragdoll
  44. mRagdoll = result.Get()->CreateRagdoll(0, 0, mPhysicsSystem);
  45. mRagdoll->AddToPhysicsSystem(EActivation::Activate);
  46. }