ScaledMutableCompoundShapeTest.cpp 3.5 KB

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