test_vehicle.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319
  1. // Copyright (c) Amer Koleci and Contributors.
  2. // Licensed under the MIT License (MIT). See LICENSE in the repository root for more information.
  3. #include <gtest/gtest.h>
  4. #include "joltc.h"
  5. namespace BroadPhaseLayers {
  6. static constexpr JPH_BroadPhaseLayer NON_MOVING = 0;
  7. static constexpr JPH_BroadPhaseLayer MOVING = 1;
  8. static constexpr uint32_t NUM_LAYERS = 2;
  9. }
  10. namespace ObjectLayers {
  11. static constexpr JPH_ObjectLayer NON_MOVING = 0;
  12. static constexpr JPH_ObjectLayer MOVING = 1;
  13. static constexpr uint32_t NUM_LAYERS = 2;
  14. }
  15. class VehicleTest : public ::testing::Test {
  16. protected:
  17. JPH_PhysicsSystem* physicsSystem = nullptr;
  18. JPH_BodyInterface* bodyInterface = nullptr;
  19. JPH_BroadPhaseLayerInterface* bpLayer = nullptr;
  20. JPH_ObjectLayerPairFilter* objPairFilter = nullptr;
  21. JPH_ObjectVsBroadPhaseLayerFilter* objVsBpFilter = nullptr;
  22. void SetUp() override {
  23. ASSERT_TRUE(JPH_Init());
  24. bpLayer = JPH_BroadPhaseLayerInterfaceTable_Create(ObjectLayers::NUM_LAYERS, BroadPhaseLayers::NUM_LAYERS);
  25. JPH_BroadPhaseLayerInterfaceTable_MapObjectToBroadPhaseLayer(bpLayer, ObjectLayers::NON_MOVING, BroadPhaseLayers::NON_MOVING);
  26. JPH_BroadPhaseLayerInterfaceTable_MapObjectToBroadPhaseLayer(bpLayer, ObjectLayers::MOVING, BroadPhaseLayers::MOVING);
  27. objPairFilter = JPH_ObjectLayerPairFilterTable_Create(ObjectLayers::NUM_LAYERS);
  28. JPH_ObjectLayerPairFilterTable_EnableCollision(objPairFilter, ObjectLayers::NON_MOVING, ObjectLayers::MOVING);
  29. JPH_ObjectLayerPairFilterTable_EnableCollision(objPairFilter, ObjectLayers::MOVING, ObjectLayers::MOVING);
  30. objVsBpFilter = JPH_ObjectVsBroadPhaseLayerFilterTable_Create(
  31. bpLayer, BroadPhaseLayers::NUM_LAYERS,
  32. objPairFilter, ObjectLayers::NUM_LAYERS);
  33. JPH_PhysicsSystemSettings settings = {};
  34. settings.maxBodies = 1024;
  35. settings.maxBodyPairs = 1024;
  36. settings.maxContactConstraints = 1024;
  37. settings.broadPhaseLayerInterface = bpLayer;
  38. settings.objectVsBroadPhaseLayerFilter = objVsBpFilter;
  39. settings.objectLayerPairFilter = objPairFilter;
  40. physicsSystem = JPH_PhysicsSystem_Create(&settings);
  41. bodyInterface = JPH_PhysicsSystem_GetBodyInterface(physicsSystem);
  42. }
  43. void TearDown() override {
  44. if (physicsSystem) JPH_PhysicsSystem_Destroy(physicsSystem);
  45. JPH_Shutdown();
  46. }
  47. };
  48. // ============================================================================
  49. // WheelSettings Tests
  50. // ============================================================================
  51. TEST_F(VehicleTest, WheelSettings_Create) {
  52. JPH_WheelSettings* settings = JPH_WheelSettings_Create();
  53. ASSERT_NE(settings, nullptr);
  54. JPH_WheelSettings_Destroy(settings);
  55. }
  56. TEST_F(VehicleTest, WheelSettings_Position) {
  57. JPH_WheelSettings* settings = JPH_WheelSettings_Create();
  58. JPH_Vec3 pos = {1.0f, 0.0f, 2.0f};
  59. JPH_WheelSettings_SetPosition(settings, &pos);
  60. JPH_Vec3 result;
  61. JPH_WheelSettings_GetPosition(settings, &result);
  62. EXPECT_FLOAT_EQ(result.x, 1.0f);
  63. EXPECT_FLOAT_EQ(result.z, 2.0f);
  64. JPH_WheelSettings_Destroy(settings);
  65. }
  66. TEST_F(VehicleTest, WheelSettings_Radius) {
  67. JPH_WheelSettings* settings = JPH_WheelSettings_Create();
  68. JPH_WheelSettings_SetRadius(settings, 0.5f);
  69. EXPECT_FLOAT_EQ(JPH_WheelSettings_GetRadius(settings), 0.5f);
  70. JPH_WheelSettings_Destroy(settings);
  71. }
  72. TEST_F(VehicleTest, WheelSettings_Width) {
  73. JPH_WheelSettings* settings = JPH_WheelSettings_Create();
  74. JPH_WheelSettings_SetWidth(settings, 0.3f);
  75. EXPECT_FLOAT_EQ(JPH_WheelSettings_GetWidth(settings), 0.3f);
  76. JPH_WheelSettings_Destroy(settings);
  77. }
  78. TEST_F(VehicleTest, WheelSettings_Suspension) {
  79. JPH_WheelSettings* settings = JPH_WheelSettings_Create();
  80. JPH_WheelSettings_SetSuspensionMinLength(settings, 0.1f);
  81. JPH_WheelSettings_SetSuspensionMaxLength(settings, 0.5f);
  82. EXPECT_FLOAT_EQ(JPH_WheelSettings_GetSuspensionMinLength(settings), 0.1f);
  83. EXPECT_FLOAT_EQ(JPH_WheelSettings_GetSuspensionMaxLength(settings), 0.5f);
  84. JPH_WheelSettings_Destroy(settings);
  85. }
  86. // ============================================================================
  87. // Wheel Tests
  88. // ============================================================================
  89. TEST_F(VehicleTest, Wheel_Create) {
  90. JPH_WheelSettings* settings = JPH_WheelSettings_Create();
  91. JPH_Wheel* wheel = JPH_Wheel_Create(settings);
  92. ASSERT_NE(wheel, nullptr);
  93. JPH_Wheel_Destroy(wheel);
  94. JPH_WheelSettings_Destroy(settings);
  95. }
  96. TEST_F(VehicleTest, Wheel_AngularVelocity) {
  97. JPH_WheelSettings* settings = JPH_WheelSettings_Create();
  98. JPH_Wheel* wheel = JPH_Wheel_Create(settings);
  99. JPH_Wheel_SetAngularVelocity(wheel, 10.0f);
  100. EXPECT_FLOAT_EQ(JPH_Wheel_GetAngularVelocity(wheel), 10.0f);
  101. JPH_Wheel_Destroy(wheel);
  102. JPH_WheelSettings_Destroy(settings);
  103. }
  104. TEST_F(VehicleTest, Wheel_RotationAngle) {
  105. JPH_WheelSettings* settings = JPH_WheelSettings_Create();
  106. JPH_Wheel* wheel = JPH_Wheel_Create(settings);
  107. JPH_Wheel_SetRotationAngle(wheel, JPH_M_PI / 4.0f);
  108. EXPECT_NEAR(JPH_Wheel_GetRotationAngle(wheel), JPH_M_PI / 4.0f, 0.001f);
  109. JPH_Wheel_Destroy(wheel);
  110. JPH_WheelSettings_Destroy(settings);
  111. }
  112. TEST_F(VehicleTest, Wheel_SteerAngle) {
  113. JPH_WheelSettings* settings = JPH_WheelSettings_Create();
  114. JPH_Wheel* wheel = JPH_Wheel_Create(settings);
  115. JPH_Wheel_SetSteerAngle(wheel, 0.1f);
  116. EXPECT_FLOAT_EQ(JPH_Wheel_GetSteerAngle(wheel), 0.1f);
  117. JPH_Wheel_Destroy(wheel);
  118. JPH_WheelSettings_Destroy(settings);
  119. }
  120. // ============================================================================
  121. // VehicleCollisionTester Tests
  122. // ============================================================================
  123. TEST_F(VehicleTest, VehicleCollisionTesterRay_Create) {
  124. JPH_Vec3 up = {0.0f, 1.0f, 0.0f};
  125. JPH_VehicleCollisionTesterRay* tester = JPH_VehicleCollisionTesterRay_Create(ObjectLayers::MOVING, &up, JPH_M_PI / 4.0f);
  126. ASSERT_NE(tester, nullptr);
  127. EXPECT_EQ(JPH_VehicleCollisionTester_GetObjectLayer((JPH_VehicleCollisionTester*)tester), ObjectLayers::MOVING);
  128. JPH_VehicleCollisionTester_Destroy((JPH_VehicleCollisionTester*)tester);
  129. }
  130. TEST_F(VehicleTest, VehicleCollisionTesterCastSphere_Create) {
  131. JPH_Vec3 up = {0.0f, 1.0f, 0.0f};
  132. JPH_VehicleCollisionTesterCastSphere* tester = JPH_VehicleCollisionTesterCastSphere_Create(ObjectLayers::MOVING, 0.1f, &up, JPH_M_PI / 4.0f);
  133. ASSERT_NE(tester, nullptr);
  134. JPH_VehicleCollisionTester_Destroy((JPH_VehicleCollisionTester*)tester);
  135. }
  136. TEST_F(VehicleTest, VehicleCollisionTesterCastCylinder_Create) {
  137. JPH_VehicleCollisionTesterCastCylinder* tester = JPH_VehicleCollisionTesterCastCylinder_Create(ObjectLayers::MOVING, 0.05f);
  138. ASSERT_NE(tester, nullptr);
  139. JPH_VehicleCollisionTester_Destroy((JPH_VehicleCollisionTester*)tester);
  140. }
  141. // ============================================================================
  142. // VehicleEngineSettings Tests
  143. // ============================================================================
  144. TEST_F(VehicleTest, VehicleEngineSettings_Init) {
  145. JPH_VehicleEngineSettings settings;
  146. JPH_VehicleEngineSettings_Init(&settings);
  147. EXPECT_GT(settings.maxRPM, 0.0f);
  148. EXPECT_GT(settings.maxTorque, 0.0f);
  149. }
  150. // ============================================================================
  151. // VehicleDifferentialSettings Tests
  152. // ============================================================================
  153. TEST_F(VehicleTest, VehicleDifferentialSettings_Init) {
  154. JPH_VehicleDifferentialSettings settings;
  155. JPH_VehicleDifferentialSettings_Init(&settings);
  156. // Default values should be set
  157. EXPECT_GE(settings.leftWheel, -1);
  158. }
  159. // ============================================================================
  160. // VehicleTransmissionSettings Tests
  161. // ============================================================================
  162. TEST_F(VehicleTest, VehicleTransmissionSettings_Create) {
  163. JPH_VehicleTransmissionSettings* settings = JPH_VehicleTransmissionSettings_Create();
  164. ASSERT_NE(settings, nullptr);
  165. JPH_VehicleTransmissionSettings_Destroy(settings);
  166. }
  167. TEST_F(VehicleTest, VehicleTransmissionSettings_Mode) {
  168. JPH_VehicleTransmissionSettings* settings = JPH_VehicleTransmissionSettings_Create();
  169. JPH_VehicleTransmissionSettings_SetMode(settings, JPH_TransmissionMode_Manual);
  170. EXPECT_EQ(JPH_VehicleTransmissionSettings_GetMode(settings), JPH_TransmissionMode_Manual);
  171. JPH_VehicleTransmissionSettings_SetMode(settings, JPH_TransmissionMode_Auto);
  172. EXPECT_EQ(JPH_VehicleTransmissionSettings_GetMode(settings), JPH_TransmissionMode_Auto);
  173. JPH_VehicleTransmissionSettings_Destroy(settings);
  174. }
  175. TEST_F(VehicleTest, VehicleTransmissionSettings_GearRatios) {
  176. JPH_VehicleTransmissionSettings* settings = JPH_VehicleTransmissionSettings_Create();
  177. float gears[] = {3.0f, 2.0f, 1.5f, 1.0f, 0.8f};
  178. JPH_VehicleTransmissionSettings_SetGearRatios(settings, gears, 5);
  179. EXPECT_EQ(JPH_VehicleTransmissionSettings_GetGearRatioCount(settings), 5u);
  180. EXPECT_FLOAT_EQ(JPH_VehicleTransmissionSettings_GetGearRatio(settings, 0), 3.0f);
  181. EXPECT_FLOAT_EQ(JPH_VehicleTransmissionSettings_GetGearRatio(settings, 4), 0.8f);
  182. JPH_VehicleTransmissionSettings_Destroy(settings);
  183. }
  184. TEST_F(VehicleTest, VehicleTransmissionSettings_Timing) {
  185. JPH_VehicleTransmissionSettings* settings = JPH_VehicleTransmissionSettings_Create();
  186. JPH_VehicleTransmissionSettings_SetSwitchTime(settings, 0.5f);
  187. EXPECT_FLOAT_EQ(JPH_VehicleTransmissionSettings_GetSwitchTime(settings), 0.5f);
  188. JPH_VehicleTransmissionSettings_SetClutchReleaseTime(settings, 0.3f);
  189. EXPECT_FLOAT_EQ(JPH_VehicleTransmissionSettings_GetClutchReleaseTime(settings), 0.3f);
  190. JPH_VehicleTransmissionSettings_SetShiftUpRPM(settings, 5000.0f);
  191. EXPECT_FLOAT_EQ(JPH_VehicleTransmissionSettings_GetShiftUpRPM(settings), 5000.0f);
  192. JPH_VehicleTransmissionSettings_SetShiftDownRPM(settings, 2000.0f);
  193. EXPECT_FLOAT_EQ(JPH_VehicleTransmissionSettings_GetShiftDownRPM(settings), 2000.0f);
  194. JPH_VehicleTransmissionSettings_Destroy(settings);
  195. }
  196. // ============================================================================
  197. // WheeledVehicleControllerSettings Tests
  198. // ============================================================================
  199. TEST_F(VehicleTest, WheeledVehicleControllerSettings_Create) {
  200. JPH_WheeledVehicleControllerSettings* settings = JPH_WheeledVehicleControllerSettings_Create();
  201. ASSERT_NE(settings, nullptr);
  202. JPH_VehicleControllerSettings_Destroy((JPH_VehicleControllerSettings*)settings);
  203. }
  204. TEST_F(VehicleTest, WheeledVehicleControllerSettings_Engine) {
  205. JPH_WheeledVehicleControllerSettings* settings = JPH_WheeledVehicleControllerSettings_Create();
  206. JPH_VehicleEngineSettings engineSettings;
  207. JPH_VehicleEngineSettings_Init(&engineSettings);
  208. engineSettings.maxRPM = 8000.0f;
  209. engineSettings.maxTorque = 500.0f;
  210. JPH_WheeledVehicleControllerSettings_SetEngine(settings, &engineSettings);
  211. JPH_VehicleEngineSettings result;
  212. JPH_WheeledVehicleControllerSettings_GetEngine(settings, &result);
  213. EXPECT_FLOAT_EQ(result.maxRPM, 8000.0f);
  214. EXPECT_FLOAT_EQ(result.maxTorque, 500.0f);
  215. JPH_VehicleControllerSettings_Destroy((JPH_VehicleControllerSettings*)settings);
  216. }
  217. // ============================================================================
  218. // VehicleAntiRollBar Tests
  219. // ============================================================================
  220. TEST_F(VehicleTest, VehicleAntiRollBar_Init) {
  221. JPH_VehicleAntiRollBar antiRollBar;
  222. JPH_VehicleAntiRollBar_Init(&antiRollBar);
  223. // Default values should be set
  224. EXPECT_GE(antiRollBar.leftWheel, 0);
  225. }
  226. // ============================================================================
  227. // VehicleConstraintSettings Tests
  228. // ============================================================================
  229. TEST_F(VehicleTest, VehicleConstraintSettings_Init) {
  230. JPH_VehicleConstraintSettings settings;
  231. JPH_VehicleConstraintSettings_Init(&settings);
  232. // Default forward should be set
  233. EXPECT_FALSE(settings.forward.x == 0.0f && settings.forward.y == 0.0f && settings.forward.z == 0.0f);
  234. }