RenderBackendManagerTests.cpp 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  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. #include <gtest/gtest.h>
  9. #include <EMotionFX/Source/EMotionFXManager.h>
  10. #include <Integration/Assets/ActorAsset.h>
  11. #include <Integration/Rendering/RenderBackend.h>
  12. #include <Integration/Rendering/RenderActor.h>
  13. #include <Integration/Rendering/RenderFlag.h>
  14. #include <Integration/Rendering/RenderActorInstance.h>
  15. #include <Integration/Rendering/RenderBackendManager.h>
  16. #include <Integration/System/SystemCommon.h>
  17. #include <Tests/SystemComponentFixture.h>
  18. #include <Tests/TestAssetCode/ActorFactory.h>
  19. #include <Tests/TestAssetCode/JackActor.h>
  20. #include <Tests/TestAssetCode/TestActorAssets.h>
  21. namespace EMotionFX
  22. {
  23. namespace Integration
  24. {
  25. class TestRenderActor
  26. : public RenderActor
  27. {
  28. public:
  29. AZ_RTTI(TestRenderActor, "{560849A4-7767-4654-8C61-EDA9A0059BE1}", RenderActor)
  30. AZ_CLASS_ALLOCATOR(TestRenderActor, EMotionFXAllocator)
  31. TestRenderActor(ActorAsset* actorAsset)
  32. : RenderActor()
  33. , m_actorAsset(actorAsset)
  34. {
  35. }
  36. public:
  37. ActorAsset* m_actorAsset = nullptr;
  38. };
  39. class TestRenderActorInstance
  40. : public RenderActorInstance
  41. {
  42. public:
  43. AZ_RTTI(TestRenderActorInstance, "{8F5CD404-9661-4A71-9583-EB8E66F3C0E8}", RenderActorInstance)
  44. AZ_CLASS_ALLOCATOR(TestRenderActorInstance, EMotionFXAllocator)
  45. TestRenderActorInstance(AZ::EntityId entityId,
  46. const EMotionFXPtr<EMotionFX::ActorInstance>& actorInstance,
  47. const AZ::Data::Asset<ActorAsset>& asset,
  48. SkinningMethod skinningMethod,
  49. const AZ::Transform& worldTransform,
  50. bool rayTracingEnabled)
  51. : RenderActorInstance(asset, actorInstance.get(), entityId)
  52. , m_entityId(entityId)
  53. , m_actorAsset(asset)
  54. , m_actorInstance(actorInstance)
  55. , m_skinningMethod(skinningMethod)
  56. , m_worldTransform(worldTransform)
  57. , m_rayTracingEnabled(rayTracingEnabled)
  58. {
  59. }
  60. MOCK_METHOD1(OnTick, void(float));
  61. MOCK_METHOD1(DebugDraw, void(const EMotionFX::ActorRenderFlags&));
  62. MOCK_METHOD1(SetRayTracingEnabled, void(bool));
  63. MOCK_CONST_METHOD0(IsVisible, bool());
  64. MOCK_METHOD1(SetIsVisible, void(bool));
  65. MOCK_METHOD0(UpdateBounds, void());
  66. MOCK_METHOD0(GetWorldBounds, AZ::Aabb());
  67. MOCK_METHOD0(GetLocalBounds, AZ::Aabb());
  68. MOCK_METHOD1(SetExcludeFromReflectionCubeMaps, void(bool));
  69. public:
  70. AZ::EntityId m_entityId;
  71. AZ::Data::Asset<ActorAsset> m_actorAsset;
  72. EMotionFXPtr<EMotionFX::ActorInstance> m_actorInstance;
  73. SkinningMethod m_skinningMethod = SkinningMethod::Linear;
  74. AZ::Transform m_worldTransform = AZ::Transform::CreateIdentity();
  75. bool m_rayTracingEnabled = true;
  76. };
  77. class TestRenderBackend
  78. : public RenderBackend
  79. {
  80. public:
  81. AZ_RTTI(TestRenderBackend, "{22CC2C55-8019-4302-8DFD-E08E0CA48114}", RenderBackend)
  82. AZ_CLASS_ALLOCATOR(TestRenderBackend, EMotionFXAllocator)
  83. RenderActor* CreateActor(ActorAsset* actorAsset) override
  84. {
  85. return aznew TestRenderActor(actorAsset);
  86. }
  87. RenderActorInstance* CreateActorInstance(AZ::EntityId entityId,
  88. const EMotionFXPtr<EMotionFX::ActorInstance>& actorInstance,
  89. const AZ::Data::Asset<ActorAsset>& asset,
  90. SkinningMethod skinningMethod,
  91. const AZ::Transform& worldTransform,
  92. bool rayTracingEnabled) override
  93. {
  94. return aznew TestRenderActorInstance(entityId, actorInstance, asset, skinningMethod, worldTransform, rayTracingEnabled);
  95. }
  96. };
  97. class RenderBackendManagerFixture
  98. : public SystemComponentFixture
  99. {
  100. public:
  101. void SetUp() override
  102. {
  103. SystemComponentFixture::SetUp();
  104. EXPECT_NE(AZ::Interface<RenderBackendManager>::Get(), nullptr);
  105. }
  106. public:
  107. TestRenderBackend* m_renderBackend = nullptr;
  108. };
  109. TEST_F(RenderBackendManagerFixture, AdjustRenderBackend)
  110. {
  111. RenderBackendManager* renderBackendManager = AZ::Interface<RenderBackendManager>::Get();
  112. EXPECT_NE(renderBackendManager, nullptr);
  113. m_renderBackend = aznew TestRenderBackend();
  114. AZ::Interface<RenderBackendManager>::Get()->SetRenderBackend(m_renderBackend);
  115. RenderBackend* renderBackend = renderBackendManager->GetRenderBackend();
  116. EXPECT_NE(renderBackend, nullptr);
  117. EXPECT_EQ(renderBackend->RTTI_GetType(), azrtti_typeid<TestRenderBackend>());
  118. }
  119. class RenderBackendActorTestComponent
  120. : public AZ::Component
  121. {
  122. public:
  123. AZ_COMPONENT(RenderBackendActorTestComponent, "{699DE64B-ADD1-4B27-AC54-3D041AF82938}");
  124. RenderBackendActorTestComponent()
  125. : AZ::Component()
  126. {
  127. }
  128. static void Reflect(AZ::ReflectContext* context)
  129. {
  130. auto* serializeContext = azrtti_cast<AZ::SerializeContext*>(context);
  131. if (serializeContext)
  132. {
  133. serializeContext->Class<RenderBackendActorTestComponent, AZ::Component>()
  134. ->Version(1);
  135. }
  136. }
  137. void Activate() override
  138. {
  139. m_actorInstance = m_actorAsset->CreateInstance(GetEntity());
  140. EXPECT_NE(m_actorInstance, nullptr);
  141. RenderBackend* renderBackend = AZ::Interface<RenderBackendManager>::Get()->GetRenderBackend();
  142. m_renderActorInstance.reset(renderBackend->CreateActorInstance(GetEntityId(),
  143. m_actorInstance,
  144. m_actorAsset,
  145. SkinningMethod::Linear,
  146. /*transform=*/{},
  147. /*rayTracingEnabled*/true));
  148. }
  149. void Deactivate() override
  150. {
  151. m_actorAsset.Release();
  152. m_actorInstance.reset();
  153. m_renderActorInstance.reset();
  154. }
  155. public:
  156. AZ::Data::Asset<ActorAsset> m_actorAsset;
  157. ActorAsset::ActorInstancePtr m_actorInstance;
  158. AZStd::unique_ptr<RenderActorInstance> m_renderActorInstance;
  159. };
  160. TEST_F(RenderBackendManagerFixture, RenderActorComponentTest)
  161. {
  162. m_app.RegisterComponentDescriptor(RenderBackendActorTestComponent::CreateDescriptor());
  163. RenderBackendManager* renderBackendManager = AZ::Interface<RenderBackendManager>::Get();
  164. ASSERT_NE(renderBackendManager, nullptr);
  165. m_renderBackend = aznew TestRenderBackend();
  166. AZ::Interface<RenderBackendManager>::Get()->SetRenderBackend(m_renderBackend);
  167. RenderBackend* renderBackend = renderBackendManager->GetRenderBackend();
  168. ASSERT_NE(renderBackend, nullptr);
  169. EXPECT_EQ(renderBackend->RTTI_GetType(), azrtti_typeid<TestRenderBackend>());
  170. AZ::Data::AssetId actorAssetId("{D568F319-49E9-47BA-9E1C-24F949EF28DD}");
  171. AZStd::unique_ptr<Actor> actor = ActorFactory::CreateAndInit<JackNoMeshesActor>();
  172. AZ::Data::Asset<Integration::ActorAsset> actorAsset = TestActorAssets::GetAssetFromActor(actorAssetId, AZStd::move(actor));
  173. // Create render actor.
  174. AZStd::unique_ptr<RenderActor> renderActor(renderBackend->CreateActor(actorAsset.Get()));
  175. EXPECT_EQ(renderActor->RTTI_GetType(), azrtti_typeid<TestRenderActor>());
  176. TestRenderActor* testRenderActor = azdynamic_cast<TestRenderActor*>(renderActor.get());
  177. ASSERT_NE(testRenderActor, nullptr);
  178. // Create entity with a test actor component (that creates a render actor instance).
  179. AZ::EntityId entityId(42);
  180. auto gameEntity = AZStd::make_unique<AZ::Entity>();
  181. gameEntity->SetId(entityId);
  182. auto testActorComponent = gameEntity->CreateComponent<RenderBackendActorTestComponent>();
  183. testActorComponent->m_actorAsset = actorAsset;
  184. gameEntity->Init();
  185. gameEntity->Activate();
  186. EXPECT_EQ(testActorComponent->m_actorAsset, actorAsset);
  187. EXPECT_NE(testActorComponent->m_actorInstance, nullptr);
  188. TestRenderActorInstance* renderActorInstance = azdynamic_cast<TestRenderActorInstance*>(testActorComponent->m_renderActorInstance.get());
  189. ASSERT_NE(renderActorInstance, nullptr);
  190. EXPECT_EQ(renderActorInstance->RTTI_GetType(), azrtti_typeid<TestRenderActorInstance>());
  191. EXPECT_EQ(renderActorInstance->m_entityId, entityId);
  192. EXPECT_EQ(renderActorInstance->m_actorInstance, testActorComponent->m_actorInstance);
  193. EXPECT_EQ(renderActorInstance->GetActor(), actorAsset->GetActor());
  194. EXPECT_EQ(renderActorInstance->m_rayTracingEnabled, true);
  195. }
  196. } // namespace Integration
  197. } // namespace EMotionFX