3
0

PhysicsSystem.h 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project.
  3. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0 OR MIT
  6. *
  7. */
  8. #pragma once
  9. #include <AzCore/RTTI/RTTI.h>
  10. #include <AzCore/Serialization/SerializeContext.h>
  11. #include <AzFramework/Physics/SystemBus.h>
  12. #include <AzFramework/Physics/PhysicsScene.h>
  13. #include <AzFramework/Physics/PhysicsSystem.h>
  14. #include <gmock/gmock.h>
  15. namespace Physics
  16. {
  17. class MockPhysicsSystem
  18. : public Physics::SystemRequestBus::Handler
  19. , AZ::Interface<Physics::System>::Registrar
  20. {
  21. public:
  22. // This uses the same uuid as the production PhysX::SystemComponent.
  23. // The Ragdoll UI uses this UUID to see if physx is available.
  24. AZ_RTTI(MockPhysicsSystem, "{85F90819-4D9A-4A77-AB89-68035201F34B}");
  25. static void Reflect(AZ::ReflectContext* context)
  26. {
  27. if (auto serializeContext = azrtti_cast<AZ::SerializeContext*>(context))
  28. {
  29. serializeContext->Class<MockPhysicsSystem>()
  30. ->Version(0)
  31. ;
  32. }
  33. }
  34. MockPhysicsSystem()
  35. {
  36. BusConnect();
  37. }
  38. ~MockPhysicsSystem()
  39. {
  40. BusDisconnect();
  41. }
  42. MOCK_METHOD2(CreateShape, AZStd::shared_ptr<Physics::Shape>(const Physics::ColliderConfiguration& colliderConfiguration, const Physics::ShapeConfiguration& configuration));
  43. MOCK_METHOD1(ReleaseNativeMeshObject, void(void* nativeMeshObject));
  44. MOCK_METHOD1(ReleaseNativeHeightfieldObject, void(void* nativeMeshObject));
  45. MOCK_METHOD3(CookConvexMeshToFile, bool(const AZStd::string& filePath, const AZ::Vector3* vertices, AZ::u32 vertexCount));
  46. MOCK_METHOD3(CookConvexMeshToMemory, bool(const AZ::Vector3* vertices, AZ::u32 vertexCount, AZStd::vector<AZ::u8>& result));
  47. MOCK_METHOD5(CookTriangleMeshToFile, bool(const AZStd::string& filePath, const AZ::Vector3* vertices, AZ::u32 vertexCount, const AZ::u32* indices, AZ::u32 indexCount));
  48. MOCK_METHOD5(CookTriangleMeshToMemory, bool(const AZ::Vector3* vertices, AZ::u32 vertexCount, const AZ::u32* indices, AZ::u32 indexCount, AZStd::vector<AZ::u8>& result));
  49. };
  50. //Mocked of the AzPhysics System Interface. To keep things simple just mocked functions that have a return value.
  51. class MockPhysicsInterface
  52. : AZ::Interface<AzPhysics::SystemInterface>::Registrar
  53. {
  54. public:
  55. void Initialize([[maybe_unused]]const AzPhysics::SystemConfiguration* config) override {}
  56. void Reinitialize() override {}
  57. void Shutdown() override {}
  58. void Simulate([[maybe_unused]] float deltaTime) override {}
  59. void UpdateConfiguration([[maybe_unused]] const AzPhysics::SystemConfiguration* newConfig, [[maybe_unused]] bool forceReinitialization = false) override {}
  60. void UpdateDefaultSceneConfiguration([[maybe_unused]] const AzPhysics::SceneConfiguration& sceneConfiguration) override {}
  61. void RemoveScene([[maybe_unused]] AzPhysics::SceneHandle handle) override {}
  62. void RemoveScenes([[maybe_unused]] const AzPhysics::SceneHandleList& handles) override {}
  63. void RemoveAllScenes() override {}
  64. MOCK_METHOD1(AddScene, AzPhysics::SceneHandle(const AzPhysics::SceneConfiguration& config));
  65. MOCK_METHOD1(AddScenes, AzPhysics::SceneHandleList(const AzPhysics::SceneConfigurationList& configs));
  66. MOCK_METHOD1(GetSceneHandle, AzPhysics::SceneHandle(const AZStd::string& sceneName));
  67. MOCK_METHOD1(GetScene, AzPhysics::Scene* (AzPhysics::SceneHandle handle));
  68. MOCK_METHOD1(GetScenes, AzPhysics::SceneList (const AzPhysics::SceneHandleList& handles));
  69. MOCK_METHOD0(GetAllScenes, AzPhysics::SceneList& ());
  70. MOCK_METHOD1(FindAttachedBodyHandleFromEntityId, AZStd::pair<AzPhysics::SceneHandle, AzPhysics::SimulatedBodyHandle>(AZ::EntityId entityId));
  71. MOCK_CONST_METHOD0(GetConfiguration, const AzPhysics::SystemConfiguration* ());
  72. MOCK_CONST_METHOD0(GetDefaultSceneConfiguration, const AzPhysics::SceneConfiguration& ());
  73. };
  74. class MockJointHelpersInterface : AZ::Interface<AzPhysics::JointHelpersInterface>::Registrar
  75. {
  76. public:
  77. MOCK_CONST_METHOD0(GetSupportedJointTypeIds, const AZStd::vector<AZ::TypeId>());
  78. MOCK_CONST_METHOD1(GetSupportedJointTypeId, AZStd::optional<const AZ::TypeId>(AzPhysics::JointType typeEnum));
  79. MOCK_METHOD5(
  80. ComputeInitialJointLimitConfiguration,
  81. AZStd::unique_ptr<AzPhysics::JointConfiguration>(
  82. const AZ::TypeId& jointLimitTypeId,
  83. const AZ::Quaternion& parentWorldRotation,
  84. const AZ::Quaternion& childWorldRotation,
  85. const AZ::Vector3& axis,
  86. const AZStd::vector<AZ::Quaternion>& exampleLocalRotations));
  87. MOCK_METHOD10(
  88. GenerateJointLimitVisualizationData,
  89. void(
  90. const AzPhysics::JointConfiguration& configuration,
  91. const AZ::Quaternion& parentRotation,
  92. const AZ::Quaternion& childRotation,
  93. float scale,
  94. AZ::u32 angularSubdivisions,
  95. AZ::u32 radialSubdivisions,
  96. AZStd::vector<AZ::Vector3>& vertexBufferOut,
  97. AZStd::vector<AZ::u32>& indexBufferOut,
  98. AZStd::vector<AZ::Vector3>& lineBufferOut,
  99. AZStd::vector<bool>& lineValidityBufferOut));
  100. };
  101. //Mocked of the AzPhysics Scene Interface. To keep things simple just mocked functions that have a return value OR required for a test.
  102. class MockPhysicsSceneInterface
  103. : AZ::Interface<AzPhysics::SceneInterface>::Registrar
  104. {
  105. public:
  106. void StartSimulation(
  107. [[maybe_unused]] AzPhysics::SceneHandle sceneHandle,
  108. [[maybe_unused]] float deltatime) override {}
  109. void FinishSimulation([[maybe_unused]] AzPhysics::SceneHandle sceneHandle) override {}
  110. void SetEnabled(
  111. [[maybe_unused]] AzPhysics::SceneHandle sceneHandle,
  112. [[maybe_unused]] bool enable) override {}
  113. void RemoveSimulatedBody(
  114. [[maybe_unused]] AzPhysics::SceneHandle sceneHandle,
  115. [[maybe_unused]] AzPhysics::SimulatedBodyHandle& bodyHandle) override {}
  116. void RemoveSimulatedBodies(
  117. [[maybe_unused]] AzPhysics::SceneHandle sceneHandle,
  118. [[maybe_unused]] AzPhysics::SimulatedBodyHandleList& bodyHandles) override {}
  119. void EnableSimulationOfBody(
  120. [[maybe_unused]] AzPhysics::SceneHandle sceneHandle,
  121. [[maybe_unused]] AzPhysics::SimulatedBodyHandle bodyHandle) override {}
  122. void DisableSimulationOfBody(
  123. [[maybe_unused]] AzPhysics::SceneHandle sceneHandle,
  124. [[maybe_unused]] AzPhysics::SimulatedBodyHandle bodyHandle) override {}
  125. void RemoveJoint(
  126. [[maybe_unused]]AzPhysics::SceneHandle sceneHandle,
  127. [[maybe_unused]] AzPhysics::JointHandle jointHandle) override {}
  128. void SuppressCollisionEvents(
  129. [[maybe_unused]] AzPhysics::SceneHandle sceneHandle,
  130. [[maybe_unused]] const AzPhysics::SimulatedBodyHandle& bodyHandleA,
  131. [[maybe_unused]] const AzPhysics::SimulatedBodyHandle& bodyHandleB) override {}
  132. void UnsuppressCollisionEvents(
  133. [[maybe_unused]] AzPhysics::SceneHandle sceneHandle,
  134. [[maybe_unused]] const AzPhysics::SimulatedBodyHandle& bodyHandleA,
  135. [[maybe_unused]] const AzPhysics::SimulatedBodyHandle& bodyHandleB) override {}
  136. void SetGravity(
  137. [[maybe_unused]] AzPhysics::SceneHandle sceneHandle,
  138. [[maybe_unused]] const AZ::Vector3& gravity) override {}
  139. void RegisterSceneConfigurationChangedEventHandler(
  140. [[maybe_unused]] AzPhysics::SceneHandle sceneHandle,
  141. [[maybe_unused]] AzPhysics::SceneEvents::OnSceneConfigurationChanged::Handler& handler) override {}
  142. void RegisterSimulationBodyAddedHandler(
  143. [[maybe_unused]] AzPhysics::SceneHandle sceneHandle,
  144. [[maybe_unused]] AzPhysics::SceneEvents::OnSimulationBodyAdded::Handler& handler) override {}
  145. void RegisterSimulationBodyRemovedHandler(
  146. [[maybe_unused]] AzPhysics::SceneHandle sceneHandle,
  147. [[maybe_unused]] AzPhysics::SceneEvents::OnSimulationBodyRemoved::Handler& handler) override {}
  148. void RegisterSimulationBodySimulationEnabledHandler(
  149. [[maybe_unused]] AzPhysics::SceneHandle sceneHandle,
  150. [[maybe_unused]] AzPhysics::SceneEvents::OnSimulationBodySimulationEnabled::Handler& handler) override {}
  151. void RegisterSimulationBodySimulationDisabledHandler(
  152. [[maybe_unused]] AzPhysics::SceneHandle sceneHandle,
  153. [[maybe_unused]] AzPhysics::SceneEvents::OnSimulationBodySimulationDisabled::Handler& handler) override {}
  154. void RegisterSceneSimulationStartHandler(
  155. [[maybe_unused]] AzPhysics::SceneHandle sceneHandle,
  156. [[maybe_unused]] AzPhysics::SceneEvents::OnSceneSimulationStartHandler& handler) override {}
  157. void RegisterSceneActiveSimulatedBodiesHandler(
  158. [[maybe_unused]] AzPhysics::SceneHandle sceneHandle,
  159. [[maybe_unused]] AzPhysics::SceneEvents::OnSceneActiveSimulatedBodiesEvent::Handler& handler) override {}
  160. void RegisterSceneCollisionEventHandler(
  161. [[maybe_unused]] AzPhysics::SceneHandle sceneHandle,
  162. [[maybe_unused]] AzPhysics::SceneEvents::OnSceneCollisionsEvent::Handler& handler) override {}
  163. void RegisterSceneTriggersEventHandler(
  164. [[maybe_unused]] AzPhysics::SceneHandle sceneHandle,
  165. [[maybe_unused]] AzPhysics::SceneEvents::OnSceneTriggersEvent::Handler& handler) override {}
  166. void RegisterSceneGravityChangedEvent(
  167. [[maybe_unused]] AzPhysics::SceneHandle sceneHandle,
  168. [[maybe_unused]] AzPhysics::SceneEvents::OnSceneGravityChangedEvent::Handler& handler) override {}
  169. MOCK_METHOD1(GetSceneHandle, AzPhysics::SceneHandle(const AZStd::string& sceneName));
  170. MOCK_METHOD1(GetScene, AzPhysics::Scene*(AzPhysics::SceneHandle));
  171. MOCK_CONST_METHOD1(IsEnabled, bool(AzPhysics::SceneHandle sceneHandle));
  172. MOCK_METHOD2(AddSimulatedBody, AzPhysics::SimulatedBodyHandle(AzPhysics::SceneHandle sceneHandle, const AzPhysics::SimulatedBodyConfiguration* simulatedBodyConfig));
  173. MOCK_METHOD2(AddSimulatedBodies, AzPhysics::SimulatedBodyHandleList(AzPhysics::SceneHandle sceneHandle, const AzPhysics::SimulatedBodyConfigurationList& simulatedBodyConfigs));
  174. MOCK_METHOD2(GetSimulatedBodyFromHandle, AzPhysics::SimulatedBody* (AzPhysics::SceneHandle sceneHandle, AzPhysics::SimulatedBodyHandle bodyHandle));
  175. MOCK_METHOD2(GetSimulatedBodiesFromHandle, AzPhysics::SimulatedBodyList(AzPhysics::SceneHandle sceneHandle, const AzPhysics::SimulatedBodyHandleList& bodyHandles));
  176. MOCK_METHOD4(AddJoint, AzPhysics::JointHandle(AzPhysics::SceneHandle sceneHandle, const AzPhysics::JointConfiguration* jointConfig,
  177. AzPhysics::SimulatedBodyHandle parentBody, AzPhysics::SimulatedBodyHandle childBody));
  178. MOCK_METHOD2(GetJointFromHandle, AzPhysics::Joint* (AzPhysics::SceneHandle sceneHandle, AzPhysics::JointHandle bodyHandle));
  179. MOCK_CONST_METHOD1(GetGravity, AZ::Vector3(AzPhysics::SceneHandle sceneHandle));
  180. MOCK_METHOD2(RegisterSceneSimulationFinishHandler, void(AzPhysics::SceneHandle sceneHandle, AzPhysics::SceneEvents::OnSceneSimulationFinishHandler& handler));
  181. MOCK_CONST_METHOD2(GetLegacyBody, AzPhysics::SimulatedBody* (AzPhysics::SceneHandle sceneHandle, AzPhysics::SimulatedBodyHandle handle));
  182. MOCK_METHOD2(QueryScene, AzPhysics::SceneQueryHits(AzPhysics::SceneHandle sceneHandle, const AzPhysics::SceneQueryRequest* request));
  183. MOCK_METHOD3(QueryScene, bool(AzPhysics::SceneHandle sceneHandle, const AzPhysics::SceneQueryRequest* request, AzPhysics::SceneQueryHits&));
  184. MOCK_METHOD2(QuerySceneBatch, AzPhysics::SceneQueryHitsList(AzPhysics::SceneHandle sceneHandle, const AzPhysics::SceneQueryRequests& requests));
  185. MOCK_METHOD4(QuerySceneAsync, bool(AzPhysics::SceneHandle sceneHandle, AzPhysics::SceneQuery::AsyncRequestId requestId,
  186. const AzPhysics::SceneQueryRequest* request, AzPhysics::SceneQuery::AsyncCallback callback));
  187. MOCK_METHOD4(QuerySceneAsyncBatch, bool(AzPhysics::SceneHandle sceneHandle, AzPhysics::SceneQuery::AsyncRequestId requestId,
  188. const AzPhysics::SceneQueryRequests& requests, AzPhysics::SceneQuery::AsyncBatchCallback callback));
  189. };
  190. } // namespace Physics