Test.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. // SPDX-FileCopyrightText: 2021 Jorrit Rouwe
  2. // SPDX-License-Identifier: MIT
  3. #include <TestFramework.h>
  4. #include <Tests/Test.h>
  5. #include <Math/Perlin.h>
  6. #include <Jolt/Physics/Collision/Shape/BoxShape.h>
  7. #include <Jolt/Physics/Collision/Shape/MeshShape.h>
  8. #include <Jolt/Physics/Collision/Shape/HeightFieldShape.h>
  9. #include <Jolt/Physics/Body/BodyCreationSettings.h>
  10. #include <Layers.h>
  11. JPH_IMPLEMENT_RTTI_ABSTRACT(Test)
  12. {
  13. }
  14. Body &Test::CreateFloor(float inSize)
  15. {
  16. const float scale = GetWorldScale();
  17. Body &floor = *mBodyInterface->CreateBody(BodyCreationSettings(new BoxShape(scale * Vec3(0.5f * inSize, 1.0f, 0.5f * inSize), 0.0f), scale * Vec3(0.0f, -1.0f, 0.0f), Quat::sIdentity(), EMotionType::Static, Layers::NON_MOVING));
  18. mBodyInterface->AddBody(floor.GetID(), EActivation::DontActivate);
  19. return floor;
  20. }
  21. Body &Test::CreateLargeTriangleFloor()
  22. {
  23. TriangleList triangles = {
  24. Triangle(Float3(427.941376f, 0.000027f, -456.470642f), Float3(427.941376f, 0.000024f, -399.411774f), Float3(512.0f, 0.000031f, -511.999969f)),
  25. Triangle(Float3(0.0f, 0.000031f, -511.999969f), Float3(28.529310f, 0.000027f, -456.470642f), Float3(427.941376f, 0.000027f, -456.470642f)),
  26. Triangle(Float3(427.941376f, 0.000027f, -456.470642f), Float3(512.0f, 0.000031f, -511.999969f), Float3(0.0f, 0.000031f, -511.999969f)),
  27. Triangle(Float3(285.294067f, 0.000027f, -456.470642f), Float3(399.411804f, 0.000024f, -399.411774f), Float3(313.823395f, 0.000027f, -456.470642f)),
  28. Triangle(Float3(313.823395f, 0.000027f, -456.470642f), Float3(399.411804f, 0.000024f, -399.411774f), Float3(342.352936f, 0.000027f, -456.470642f)),
  29. Triangle(Float3(342.352936f, 0.000027f, -456.470642f), Float3(399.411804f, 0.000024f, -399.411774f), Float3(370.882507f, 0.000027f, -456.470642f)),
  30. Triangle(Float3(399.411804f, 0.000024f, -399.411774f), Float3(427.941376f, 0.000024f, -399.411774f), Float3(370.882507f, 0.000027f, -456.470642f)),
  31. Triangle(Float3(370.882507f, 0.000027f, -456.470642f), Float3(427.941376f, 0.000024f, -399.411774f), Float3(399.411804f, 0.000027f, -456.470642f)),
  32. Triangle(Float3(399.411804f, 0.000027f, -456.470642f), Float3(427.941376f, 0.000024f, -399.411774f), Float3(427.941376f, 0.000027f, -456.470642f)),
  33. Triangle(Float3(256.764771f, 0.000027f, -456.470642f), Float3(399.411804f, 0.000024f, -399.411774f), Float3(285.294067f, 0.000027f, -456.470642f)),
  34. Triangle(Float3(85.588173f, 0.000027f, -456.470642f), Float3(399.411804f, 0.000024f, -399.411774f), Float3(114.117729f, 0.000027f, -456.470642f)),
  35. Triangle(Float3(114.117729f, 0.000027f, -456.470642f), Float3(399.411804f, 0.000024f, -399.411774f), Float3(142.647034f, 0.000027f, -456.470642f)),
  36. Triangle(Float3(142.647034f, 0.000027f, -456.470642f), Float3(399.411804f, 0.000024f, -399.411774f), Float3(171.176590f, 0.000027f, -456.470642f)),
  37. Triangle(Float3(171.176590f, 0.000027f, -456.470642f), Float3(399.411804f, 0.000024f, -399.411774f), Float3(199.705902f, 0.000027f, -456.470642f)),
  38. Triangle(Float3(199.705902f, 0.000027f, -456.470642f), Float3(399.411804f, 0.000024f, -399.411774f), Float3(228.235214f, 0.000027f, -456.470642f)),
  39. Triangle(Float3(228.235214f, 0.000027f, -456.470642f), Float3(399.411804f, 0.000024f, -399.411774f), Float3(256.764771f, 0.000027f, -456.470642f)),
  40. Triangle(Float3(85.588173f, 0.000024f, -399.411774f), Float3(399.411804f, 0.000024f, -399.411774f), Float3(85.588173f, 0.000027f, -456.470642f)),
  41. Triangle(Float3(427.941376f, 0.000024f, -399.411774f), Float3(512.0f, 0.000019f, -313.823364f), Float3(512.0f, 0.000031f, -511.999969f)),
  42. Triangle(Float3(399.411804f, 0.000024f, -399.411774f), Float3(512.0f, 0.000019f, -313.823364f), Float3(427.941376f, 0.000024f, -399.411774f)),
  43. Triangle(Float3(285.294067f, 0.000024f, -399.411774f), Float3(512.0f, 0.000019f, -313.823364f), Float3(313.823395f, 0.000024f, -399.411774f)),
  44. Triangle(Float3(313.823395f, 0.000024f, -399.411774f), Float3(512.0f, 0.000019f, -313.823364f), Float3(342.352936f, 0.000024f, -399.411774f)),
  45. Triangle(Float3(342.352936f, 0.000024f, -399.411774f), Float3(512.0f, 0.000019f, -313.823364f), Float3(370.882507f, 0.000024f, -399.411774f)),
  46. Triangle(Float3(370.882507f, 0.000024f, -399.411774f), Float3(512.0f, 0.000019f, -313.823364f), Float3(399.411804f, 0.000024f, -399.411774f)),
  47. Triangle(Float3(256.764771f, 0.000024f, -399.411774f), Float3(512.0f, 0.000019f, -313.823364f), Float3(285.294067f, 0.000024f, -399.411774f)),
  48. Triangle(Float3(228.235214f, 0.000024f, -399.411774f), Float3(512.0f, 0.000019f, -313.823364f), Float3(256.764771f, 0.000024f, -399.411774f)),
  49. Triangle(Float3(199.705902f, 0.000024f, -399.411774f), Float3(512.0f, 0.000019f, -313.823364f), Float3(228.235214f, 0.000024f, -399.411774f)),
  50. Triangle(Float3(228.235214f, 0.000019f, -313.823364f), Float3(512.0f, 0.000019f, -313.823364f), Float3(199.705902f, 0.000024f, -399.411774f)),
  51. Triangle(Float3(142.647034f, 0.000024f, -399.411774f), Float3(228.235214f, 0.000019f, -313.823364f), Float3(171.176590f, 0.000024f, -399.411774f)),
  52. Triangle(Float3(171.176590f, 0.000024f, -399.411774f), Float3(228.235214f, 0.000019f, -313.823364f), Float3(199.705902f, 0.000024f, -399.411774f)),
  53. Triangle(Float3(85.588173f, 0.000022f, -370.882477f), Float3(228.235214f, 0.000019f, -313.823364f), Float3(142.647034f, 0.000024f, -399.411774f)),
  54. Triangle(Float3(85.588173f, 0.000022f, -370.882477f), Float3(199.705902f, 0.000019f, -313.823364f), Float3(228.235214f, 0.000019f, -313.823364f)),
  55. Triangle(Float3(114.117729f, 0.000024f, -399.411774f), Float3(85.588173f, 0.000022f, -370.882477f), Float3(142.647034f, 0.000024f, -399.411774f)),
  56. Triangle(Float3(85.588173f, 0.000024f, -399.411774f), Float3(85.588173f, 0.000022f, -370.882477f), Float3(114.117729f, 0.000024f, -399.411774f)),
  57. Triangle(Float3(28.529310f, 0.000019f, -313.823364f), Float3(199.705902f, 0.000019f, -313.823364f), Float3(85.588173f, 0.000022f, -370.882477f)),
  58. Triangle(Float3(57.058865f, 0.000019f, -313.823364f), Float3(0.0f, 0.000017f, -285.294037f), Float3(85.588173f, 0.000019f, -313.823364f)),
  59. Triangle(Float3(28.529310f, 0.000019f, -313.823364f), Float3(0.0f, 0.000017f, -285.294037f), Float3(57.058865f, 0.000019f, -313.823364f)),
  60. Triangle(Float3(28.529310f, 0.000027f, -456.470642f), Float3(0.0f, 0.000017f, -285.294037f), Float3(57.058865f, 0.000027f, -456.470642f)),
  61. Triangle(Float3(0.0f, 0.000017f, -285.294037f), Float3(28.529310f, 0.000027f, -456.470642f), Float3(0.0f, 0.000031f, -511.999969f)),
  62. Triangle(Float3(0.0f, 0.000017f, -285.294037f), Float3(85.588173f, 0.000022f, -370.882477f), Float3(85.588173f, 0.000024f, -399.411774f)),
  63. Triangle(Float3(0.0f, 0.000017f, -285.294037f), Float3(85.588173f, 0.000024f, -399.411774f), Float3(57.058865f, 0.000027f, -456.470642f)),
  64. Triangle(Float3(57.058865f, 0.000027f, -456.470642f), Float3(85.588173f, 0.000024f, -399.411774f), Float3(85.588173f, 0.000027f, -456.470642f)),
  65. Triangle(Float3(399.411804f, 0.000019f, -313.823364f), Float3(512.0f, 0.000003f, -57.058861f), Float3(456.470673f, 0.000019f, -313.823364f)),
  66. Triangle(Float3(456.470673f, 0.000019f, -313.823364f), Float3(512.0f, 0.000003f, -57.058861f), Float3(512.0f, 0.000019f, -313.823364f)),
  67. Triangle(Float3(228.235214f, 0.000019f, -313.823364f), Float3(512.0f, 0.000003f, -57.058861f), Float3(256.764771f, 0.000019f, -313.823364f)),
  68. Triangle(Float3(256.764771f, 0.000019f, -313.823364f), Float3(512.0f, 0.000003f, -57.058861f), Float3(285.294067f, 0.000019f, -313.823364f)),
  69. Triangle(Float3(285.294067f, 0.000019f, -313.823364f), Float3(512.0f, 0.000003f, -57.058861f), Float3(313.823395f, 0.000019f, -313.823364f)),
  70. Triangle(Float3(313.823395f, 0.000019f, -313.823364f), Float3(512.0f, 0.000003f, -57.058861f), Float3(342.352936f, 0.000019f, -313.823364f)),
  71. Triangle(Float3(342.352936f, 0.000019f, -313.823364f), Float3(512.0f, 0.000003f, -57.058861f), Float3(370.882507f, 0.000019f, -313.823364f)),
  72. Triangle(Float3(370.882507f, 0.000019f, -313.823364f), Float3(512.0f, 0.000003f, -57.058861f), Float3(399.411804f, 0.000019f, -313.823364f)),
  73. Triangle(Float3(0.0f, 0.000017f, -285.294037f), Float3(0.0f, 0.000009f, -142.647018f), Float3(512.0f, 0.000003f, -57.058861f)),
  74. Triangle(Float3(199.705902f, 0.000019f, -313.823364f), Float3(512.0f, 0.000003f, -57.058861f), Float3(228.235214f, 0.000019f, -313.823364f)),
  75. Triangle(Float3(171.176590f, 0.000019f, -313.823364f), Float3(512.0f, 0.000003f, -57.058861f), Float3(199.705902f, 0.000019f, -313.823364f)),
  76. Triangle(Float3(0.0f, 0.000017f, -285.294037f), Float3(512.0f, 0.000003f, -57.058861f), Float3(85.588173f, 0.000019f, -313.823364f)),
  77. Triangle(Float3(85.588173f, 0.000019f, -313.823364f), Float3(512.0f, 0.000003f, -57.058861f), Float3(142.647034f, 0.000019f, -313.823364f)),
  78. Triangle(Float3(142.647034f, 0.000019f, -313.823364f), Float3(512.0f, 0.000003f, -57.058861f), Float3(171.176590f, 0.000019f, -313.823364f)),
  79. Triangle(Float3(485.0f, 0.000002f, -28.529308f), Float3(512.0f, 0.0f, 0.0f), Float3(512.0f, 0.000002f, -28.529308f)),
  80. Triangle(Float3(512.0f, 0.0f, 0.0f), Float3(427.941376f, 0.000002f, -28.529308f), Float3(285.294067f, 0.000002f, -28.529308f)),
  81. Triangle(Float3(456.470673f, 0.000002f, -28.529308f), Float3(512.0f, 0.0f, 0.0f), Float3(485.0f, 0.000002f, -28.529308f)),
  82. Triangle(Float3(427.941376f, 0.000002f, -28.529308f), Float3(512.0f, 0.0f, 0.0f), Float3(456.470673f, 0.000002f, -28.529308f)),
  83. Triangle(Float3(171.176590f, 0.0f, 0.0f), Float3(512.0f, 0.0f, 0.0f), Float3(285.294067f, 0.000002f, -28.529308f)),
  84. Triangle(Float3(285.294067f, 0.000002f, -28.529308f), Float3(512.0f, 0.000002f, -28.529308f), Float3(512.0f, 0.000003f, -57.058861f)),
  85. Triangle(Float3(0.0f, 0.000009f, -142.647018f), Float3(285.294067f, 0.000002f, -28.529308f), Float3(512.0f, 0.000003f, -57.058861f)),
  86. Triangle(Float3(0.0f, 0.000007f, -114.117722f), Float3(171.176590f, 0.0f, 0.0f), Float3(0.0f, 0.000009f, -142.647018f)),
  87. Triangle(Float3(0.0f, 0.0f, 0.0f), Float3(171.176590f, 0.0f, 0.0f), Float3(0.0f, 0.000007f, -114.117722f)),
  88. Triangle(Float3(0.0f, 0.000009f, -142.647018f), Float3(171.176590f, 0.0f, 0.0f), Float3(285.294067f, 0.000002f, -28.529308f))
  89. };
  90. MeshShapeSettings mesh_settings(triangles);
  91. mesh_settings.SetEmbedded();
  92. BodyCreationSettings floor_settings(&mesh_settings, Vec3(-256.0f, 0.0f, 256.0f), Quat::sIdentity(), EMotionType::Static, Layers::NON_MOVING);
  93. Body &floor = *mBodyInterface->CreateBody(floor_settings);
  94. mBodyInterface->AddBody(floor.GetID(), EActivation::DontActivate);
  95. return floor;
  96. }
  97. Body &Test::CreateMeshTerrain()
  98. {
  99. const float scale = GetWorldScale();
  100. #ifdef _DEBUG
  101. const int n = 50;
  102. const float cell_size = scale * 2.0f;
  103. #else
  104. const int n = 100;
  105. const float cell_size = scale * 1.0f;
  106. #endif
  107. const float max_height = scale * 3.0f;
  108. // Create heights
  109. float heights[n + 1][n + 1];
  110. for (int x = 0; x <= n; ++x)
  111. for (int z = 0; z <= n; ++z)
  112. heights[x][z] = max_height * PerlinNoise3(float(x) * 8.0f / n, 0, float(z) * 8.0f / n, 256, 256, 256);
  113. // Create regular grid of triangles
  114. TriangleList triangles;
  115. for (int x = 0; x < n; ++x)
  116. for (int z = 0; z < n; ++z)
  117. {
  118. float center = n * cell_size / 2;
  119. float x1 = cell_size * x - center;
  120. float z1 = cell_size * z - center;
  121. float x2 = x1 + cell_size;
  122. float z2 = z1 + cell_size;
  123. Float3 v1 = Float3(x1, heights[x][z], z1);
  124. Float3 v2 = Float3(x2, heights[x + 1][z], z1);
  125. Float3 v3 = Float3(x1, heights[x][z + 1], z2);
  126. Float3 v4 = Float3(x2, heights[x + 1][z + 1], z2);
  127. triangles.push_back(Triangle(v1, v3, v4));
  128. triangles.push_back(Triangle(v1, v4, v2));
  129. }
  130. // Floor
  131. Body &floor = *mBodyInterface->CreateBody(BodyCreationSettings(new MeshShapeSettings(triangles), Vec3::sZero(), Quat::sIdentity(), EMotionType::Static, Layers::NON_MOVING));
  132. mBodyInterface->AddBody(floor.GetID(), EActivation::DontActivate);
  133. return floor;
  134. }
  135. Body &Test::CreateHeightFieldTerrain()
  136. {
  137. const float scale = GetWorldScale();
  138. const int n = 128;
  139. const float cell_size = scale * 1.0f;
  140. const float max_height = scale * 5.0f;
  141. // Create height samples
  142. float heights[n * n];
  143. for (int y = 0; y < n; ++y)
  144. for (int x = 0; x < n; ++x)
  145. heights[y * n + x] = max_height * PerlinNoise3(float(x) * 8.0f / n, 0, float(y) * 8.0f / n, 256, 256, 256);
  146. // Create height field
  147. RefConst<ShapeSettings> height_field = new HeightFieldShapeSettings(heights, Vec3(-0.5f * cell_size * n, 0.0f, -0.5f * cell_size * n), Vec3(cell_size, 1.0f, cell_size), n);
  148. // Floor
  149. Body &floor = *mBodyInterface->CreateBody(BodyCreationSettings(height_field, Vec3::sZero(), Quat::sIdentity(), EMotionType::Static, Layers::NON_MOVING));
  150. mBodyInterface->AddBody(floor.GetID(), EActivation::DontActivate);
  151. return floor;
  152. }