test_character.cpp 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  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 CharacterTest : public ::testing::Test {
  16. protected:
  17. JPH_PhysicsSystem* physicsSystem = nullptr;
  18. JPH_BroadPhaseLayerInterface* bpLayer = nullptr;
  19. JPH_ObjectLayerPairFilter* objPairFilter = nullptr;
  20. JPH_ObjectVsBroadPhaseLayerFilter* objVsBpFilter = nullptr;
  21. void SetUp() override {
  22. ASSERT_TRUE(JPH_Init());
  23. bpLayer = JPH_BroadPhaseLayerInterfaceTable_Create(ObjectLayers::NUM_LAYERS, BroadPhaseLayers::NUM_LAYERS);
  24. JPH_BroadPhaseLayerInterfaceTable_MapObjectToBroadPhaseLayer(bpLayer, ObjectLayers::NON_MOVING, BroadPhaseLayers::NON_MOVING);
  25. JPH_BroadPhaseLayerInterfaceTable_MapObjectToBroadPhaseLayer(bpLayer, ObjectLayers::MOVING, BroadPhaseLayers::MOVING);
  26. objPairFilter = JPH_ObjectLayerPairFilterTable_Create(ObjectLayers::NUM_LAYERS);
  27. JPH_ObjectLayerPairFilterTable_EnableCollision(objPairFilter, ObjectLayers::NON_MOVING, ObjectLayers::MOVING);
  28. JPH_ObjectLayerPairFilterTable_EnableCollision(objPairFilter, ObjectLayers::MOVING, ObjectLayers::MOVING);
  29. objVsBpFilter = JPH_ObjectVsBroadPhaseLayerFilterTable_Create(
  30. bpLayer, BroadPhaseLayers::NUM_LAYERS,
  31. objPairFilter, ObjectLayers::NUM_LAYERS);
  32. JPH_PhysicsSystemSettings settings = {};
  33. settings.maxBodies = 1024;
  34. settings.maxBodyPairs = 1024;
  35. settings.maxContactConstraints = 1024;
  36. settings.broadPhaseLayerInterface = bpLayer;
  37. settings.objectVsBroadPhaseLayerFilter = objVsBpFilter;
  38. settings.objectLayerPairFilter = objPairFilter;
  39. physicsSystem = JPH_PhysicsSystem_Create(&settings);
  40. }
  41. void TearDown() override {
  42. if (physicsSystem) JPH_PhysicsSystem_Destroy(physicsSystem);
  43. JPH_Shutdown();
  44. }
  45. };
  46. TEST_F(CharacterTest, CharacterSettings_Init) {
  47. JPH_CharacterSettings settings;
  48. JPH_CharacterSettings_Init(&settings);
  49. EXPECT_NE(settings.base.up.y, 0.0f);
  50. }
  51. TEST_F(CharacterTest, Character_Create) {
  52. JPH_CapsuleShape* shape = JPH_CapsuleShape_Create(0.5f, 0.3f);
  53. ASSERT_NE(shape, nullptr);
  54. JPH_CharacterSettings settings;
  55. JPH_CharacterSettings_Init(&settings);
  56. settings.base.shape = (JPH_Shape*)shape;
  57. JPH_RVec3 position = {0.0f, 1.0f, 0.0f};
  58. JPH_Quat rotation = {0.0f, 0.0f, 0.0f, 1.0f};
  59. JPH_Character* character = JPH_Character_Create(&settings, &position, &rotation, 0, physicsSystem);
  60. ASSERT_NE(character, nullptr);
  61. JPH_Character_AddToPhysicsSystem(character, JPH_Activation_Activate, true);
  62. JPH_BodyID bodyId = JPH_Character_GetBodyID(character);
  63. EXPECT_NE(bodyId, 0xFFFFFFFF);
  64. JPH_Character_RemoveFromPhysicsSystem(character, true);
  65. JPH_CharacterBase_Destroy((JPH_CharacterBase*)character);
  66. JPH_Shape_Destroy((JPH_Shape*)shape);
  67. }
  68. TEST_F(CharacterTest, Character_PositionAndRotation) {
  69. JPH_CapsuleShape* shape = JPH_CapsuleShape_Create(0.5f, 0.3f);
  70. JPH_CharacterSettings settings;
  71. JPH_CharacterSettings_Init(&settings);
  72. settings.base.shape = (JPH_Shape*)shape;
  73. JPH_RVec3 position = {1.0f, 2.0f, 3.0f};
  74. JPH_Quat rotation = {0.0f, 0.0f, 0.0f, 1.0f};
  75. JPH_Character* character = JPH_Character_Create(&settings, &position, &rotation, 0, physicsSystem);
  76. JPH_Character_AddToPhysicsSystem(character, JPH_Activation_Activate, true);
  77. JPH_RVec3 resultPos;
  78. JPH_Character_GetPosition(character, &resultPos, true);
  79. EXPECT_FLOAT_EQ(resultPos.x, 1.0f);
  80. EXPECT_FLOAT_EQ(resultPos.y, 2.0f);
  81. EXPECT_FLOAT_EQ(resultPos.z, 3.0f);
  82. JPH_RVec3 newPos = {5.0f, 6.0f, 7.0f};
  83. JPH_Character_SetPosition(character, &newPos, JPH_Activation_Activate, true);
  84. JPH_Character_GetPosition(character, &resultPos, true);
  85. EXPECT_FLOAT_EQ(resultPos.x, 5.0f);
  86. EXPECT_FLOAT_EQ(resultPos.y, 6.0f);
  87. EXPECT_FLOAT_EQ(resultPos.z, 7.0f);
  88. JPH_Character_RemoveFromPhysicsSystem(character, true);
  89. JPH_CharacterBase_Destroy((JPH_CharacterBase*)character);
  90. JPH_Shape_Destroy((JPH_Shape*)shape);
  91. }
  92. TEST_F(CharacterTest, Character_Velocity) {
  93. JPH_CapsuleShape* shape = JPH_CapsuleShape_Create(0.5f, 0.3f);
  94. JPH_CharacterSettings settings;
  95. JPH_CharacterSettings_Init(&settings);
  96. settings.base.shape = (JPH_Shape*)shape;
  97. JPH_RVec3 position = {0.0f, 1.0f, 0.0f};
  98. JPH_Quat rotation = {0.0f, 0.0f, 0.0f, 1.0f};
  99. JPH_Character* character = JPH_Character_Create(&settings, &position, &rotation, 0, physicsSystem);
  100. JPH_Character_AddToPhysicsSystem(character, JPH_Activation_Activate, true);
  101. JPH_Vec3 velocity = {1.0f, 0.0f, 0.0f};
  102. JPH_Character_SetLinearVelocity(character, &velocity, true);
  103. JPH_Vec3 resultVel;
  104. JPH_Character_GetLinearVelocity(character, &resultVel);
  105. EXPECT_FLOAT_EQ(resultVel.x, 1.0f);
  106. JPH_Character_RemoveFromPhysicsSystem(character, true);
  107. JPH_CharacterBase_Destroy((JPH_CharacterBase*)character);
  108. JPH_Shape_Destroy((JPH_Shape*)shape);
  109. }
  110. TEST_F(CharacterTest, CharacterVirtualSettings_Init) {
  111. JPH_CharacterVirtualSettings settings;
  112. JPH_CharacterVirtualSettings_Init(&settings);
  113. EXPECT_GT(settings.mass, 0.0f);
  114. }
  115. // Note: CharacterVirtual tests are disabled due to crashes in JPH_CharacterVirtual_Create
  116. // This appears to be a bug in the joltc library that needs investigation