ScaledStaticCompoundShapeTest.cpp 3.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  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/ScaledShapes/ScaledStaticCompoundShapeTest.h>
  6. #include <Jolt/Physics/Collision/Shape/ConvexHullShape.h>
  7. #include <Jolt/Physics/Collision/Shape/StaticCompoundShape.h>
  8. #include <Jolt/Physics/Collision/Shape/ScaledShape.h>
  9. #include <Jolt/Physics/Body/BodyCreationSettings.h>
  10. #include <Layers.h>
  11. JPH_IMPLEMENT_RTTI_VIRTUAL(ScaledStaticCompoundShapeTest)
  12. {
  13. JPH_ADD_BASE_CLASS(ScaledStaticCompoundShapeTest, Test)
  14. }
  15. void ScaledStaticCompoundShapeTest::Initialize()
  16. {
  17. // Floor
  18. CreateFloor();
  19. // Left end
  20. Array<Vec3> end1;
  21. end1.push_back(Vec3(0, 0, 0));
  22. end1.push_back(Vec3(0, 0, 1));
  23. end1.push_back(Vec3(2, 0, 0));
  24. end1.push_back(Vec3(2, 0, 1));
  25. end1.push_back(Vec3(0, 1, 0));
  26. end1.push_back(Vec3(0, 1, 1));
  27. end1.push_back(Vec3(2, 1, 0));
  28. end1.push_back(Vec3(2, 1, 1));
  29. RefConst<ShapeSettings> end1_shape = new ConvexHullShapeSettings(end1);
  30. // Right end
  31. Array<Vec3> end2;
  32. end2.push_back(Vec3(0, 0, 0));
  33. end2.push_back(Vec3(0, 0, 5));
  34. end2.push_back(Vec3(0, 1, 0));
  35. end2.push_back(Vec3(0, 1, 5));
  36. end2.push_back(Vec3(1, 0, 0));
  37. end2.push_back(Vec3(1, 0, 5));
  38. end2.push_back(Vec3(1, 1, 0));
  39. end2.push_back(Vec3(1, 1, 5));
  40. RefConst<ShapeSettings> end2_shape = new ConvexHullShapeSettings(end2);
  41. // Central part
  42. Array<Vec3> center;
  43. center.push_back(Vec3(0, 0, 0));
  44. center.push_back(Vec3(0, 0, 1));
  45. center.push_back(Vec3(0, 1, 0));
  46. center.push_back(Vec3(0, 1, 1));
  47. center.push_back(Vec3(10, 0, 0));
  48. center.push_back(Vec3(10, 0, 1));
  49. center.push_back(Vec3(10, 1, 0));
  50. center.push_back(Vec3(10, 1, 1));
  51. RefConst<ShapeSettings> center_shape = new ConvexHullShapeSettings(center);
  52. // Create compound
  53. Ref<StaticCompoundShapeSettings> compound_shape = new StaticCompoundShapeSettings;
  54. compound_shape->AddShape(Vec3(-5, -1.5f, -0.5f), Quat::sRotation(Vec3::sAxisZ(), 0.5f * JPH_PI), end1_shape);
  55. compound_shape->AddShape(Vec3(5, -0.5f, -0.5f), Quat::sIdentity(), end2_shape);
  56. compound_shape->AddShape(Vec3(-5, -0.5f, -0.5f), Quat::sIdentity(), center_shape);
  57. // Original shape
  58. Body &body1 = *mBodyInterface->CreateBody(BodyCreationSettings(compound_shape, RVec3(-40, 10, 0), Quat::sIdentity(), EMotionType::Dynamic, Layers::MOVING));
  59. mBodyInterface->AddBody(body1.GetID(), EActivation::Activate);
  60. // Uniformly scaled shape
  61. Body &body2 = *mBodyInterface->CreateBody(BodyCreationSettings(new ScaledShapeSettings(compound_shape, Vec3::sReplicate(0.25f)), RVec3(-20, 10, 0), Quat::sIdentity(), EMotionType::Dynamic, Layers::MOVING));
  62. mBodyInterface->AddBody(body2.GetID(), EActivation::Activate);
  63. // Non-uniform scaled shape
  64. Body &body3 = *mBodyInterface->CreateBody(BodyCreationSettings(new ScaledShapeSettings(compound_shape, Vec3(0.25f, 0.5f, 1.5f)), RVec3(0, 10, 0), Quat::sIdentity(), EMotionType::Dynamic, Layers::MOVING));
  65. mBodyInterface->AddBody(body3.GetID(), EActivation::Activate);
  66. // Flipped in 2 axis
  67. Body &body4 = *mBodyInterface->CreateBody(BodyCreationSettings(new ScaledShapeSettings(compound_shape, Vec3(-0.25f, 0.5f, -1.5f)), RVec3(20, 10, 0), Quat::sIdentity(), EMotionType::Dynamic, Layers::MOVING));
  68. mBodyInterface->AddBody(body4.GetID(), EActivation::Activate);
  69. // Inside out
  70. Body &body5 = *mBodyInterface->CreateBody(BodyCreationSettings(new ScaledShapeSettings(compound_shape, Vec3(-0.25f, 0.5f, 1.5f)), RVec3(40, 10, 0), Quat::sIdentity(), EMotionType::Dynamic, Layers::MOVING));
  71. mBodyInterface->AddBody(body5.GetID(), EActivation::Activate);
  72. }