2
0

DistanceConstraintTest.cpp 1.9 KB

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