DistanceConstraintTest.cpp 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. // SPDX-FileCopyrightText: 2021 Jorrit Rouwe
  2. // SPDX-License-Identifier: MIT
  3. #include <TestFramework.h>
  4. #include <Tests/Constraints/DistanceConstraintTest.h>
  5. #include <Jolt/Physics/Collision/Shape/CapsuleShape.h>
  6. #include <Jolt/Physics/Constraints/DistanceConstraint.h>
  7. #include <Jolt/Physics/Body/BodyCreationSettings.h>
  8. #include <Layers.h>
  9. JPH_IMPLEMENT_RTTI_VIRTUAL(DistanceConstraintTest)
  10. {
  11. JPH_ADD_BASE_CLASS(DistanceConstraintTest, Test)
  12. }
  13. void DistanceConstraintTest::Initialize()
  14. {
  15. // Floor
  16. CreateFloor();
  17. float half_cylinder_height = 2.5f;
  18. // Variation 0: Fixed distance
  19. // Variation 1: Min/max distance
  20. for (int variation = 0; variation < 2; ++variation)
  21. {
  22. // Bodies attached through distance constraints
  23. Quat rotation = Quat::sRotation(Vec3::sAxisZ(), 0.5f * JPH_PI);
  24. Vec3 position(0, 75, 10.0f * variation);
  25. Body &top = *mBodyInterface->CreateBody(BodyCreationSettings(new CapsuleShape(half_cylinder_height, 1), position, rotation, EMotionType::Static, Layers::NON_MOVING));
  26. mBodyInterface->AddBody(top.GetID(), EActivation::DontActivate);
  27. Body *prev = &top;
  28. for (int i = 1; i < 15; ++i)
  29. {
  30. position += Vec3(5.0f + 2.0f * half_cylinder_height, 0, 0);
  31. Body &segment = *mBodyInterface->CreateBody(BodyCreationSettings(new CapsuleShape(half_cylinder_height, 1), position, rotation, EMotionType::Dynamic, Layers::MOVING));
  32. mBodyInterface->AddBody(segment.GetID(), EActivation::Activate);
  33. DistanceConstraintSettings settings;
  34. settings.mPoint1 = position - Vec3(5.0f + half_cylinder_height, 0, 0);
  35. settings.mPoint2 = position - Vec3(half_cylinder_height, 0, 0);
  36. if (variation == 1)
  37. {
  38. // Default distance is 5, override min/max range
  39. settings.mMinDistance = 4.0f;
  40. settings.mMaxDistance = 8.0f;
  41. }
  42. mPhysicsSystem->AddConstraint(settings.Create(*prev, segment));
  43. prev = &segment;
  44. }
  45. }
  46. }