#include #include #include #include #include #include #include #include #include #include using namespace XCEngine::Components; using namespace XCEngine::Math; using namespace XCEngine::Rendering; using namespace XCEngine::Resources; namespace { Mesh* CreateTestMesh(const char* path) { auto* mesh = new Mesh(); IResource::ConstructParams params = {}; params.name = "TestMesh"; params.path = path; params.guid = ResourceGUID::Generate(path); mesh->Initialize(params); return mesh; } TEST(RenderSceneExtractor_Test, SelectsHighestDepthPrimaryCameraAndVisibleObjects) { Scene scene("RenderScene"); GameObject* cameraObjectA = scene.CreateGameObject("CameraA"); auto* cameraA = cameraObjectA->AddComponent(); cameraA->SetPrimary(true); cameraA->SetDepth(0.0f); GameObject* cameraObjectB = scene.CreateGameObject("CameraB"); auto* cameraB = cameraObjectB->AddComponent(); cameraB->SetPrimary(true); cameraB->SetDepth(5.0f); cameraObjectB->GetTransform()->SetLocalPosition(Vector3(2.0f, 3.0f, 4.0f)); GameObject* visibleObject = scene.CreateGameObject("VisibleQuad"); visibleObject->GetTransform()->SetLocalPosition(Vector3(1.0f, 2.0f, 3.0f)); auto* meshFilter = visibleObject->AddComponent(); visibleObject->AddComponent(); Mesh* visibleMesh = CreateTestMesh("Meshes/visible.mesh"); meshFilter->SetMesh(visibleMesh); GameObject* hiddenObject = scene.CreateGameObject("HiddenQuad"); hiddenObject->SetActive(false); auto* hiddenMeshFilter = hiddenObject->AddComponent(); hiddenObject->AddComponent(); Mesh* hiddenMesh = CreateTestMesh("Meshes/hidden.mesh"); hiddenMeshFilter->SetMesh(hiddenMesh); RenderSceneExtractor extractor; const RenderSceneData sceneData = extractor.Extract(scene, nullptr, 1280, 720); ASSERT_TRUE(sceneData.HasCamera()); EXPECT_EQ(sceneData.camera, cameraB); EXPECT_EQ(sceneData.cameraData.viewportWidth, 1280u); EXPECT_EQ(sceneData.cameraData.viewportHeight, 720u); EXPECT_EQ(sceneData.cameraData.worldPosition, Vector3(2.0f, 3.0f, 4.0f)); ASSERT_EQ(sceneData.visibleObjects.size(), 1u); EXPECT_EQ(sceneData.visibleObjects[0].gameObject, visibleObject); EXPECT_EQ(sceneData.visibleObjects[0].mesh, visibleMesh); EXPECT_EQ(sceneData.visibleObjects[0].localToWorld.GetTranslation(), Vector3(1.0f, 2.0f, 3.0f)); meshFilter->ClearMesh(); hiddenMeshFilter->ClearMesh(); delete visibleMesh; delete hiddenMesh; } TEST(RenderSceneExtractor_Test, OverrideCameraTakesPriority) { Scene scene("OverrideScene"); GameObject* primaryObject = scene.CreateGameObject("PrimaryCamera"); auto* primaryCamera = primaryObject->AddComponent(); primaryCamera->SetPrimary(true); primaryCamera->SetDepth(10.0f); GameObject* overrideObject = scene.CreateGameObject("OverrideCamera"); auto* overrideCamera = overrideObject->AddComponent(); overrideCamera->SetPrimary(false); overrideCamera->SetDepth(-1.0f); RenderSceneExtractor extractor; const RenderSceneData sceneData = extractor.Extract(scene, overrideCamera, 640, 480); ASSERT_TRUE(sceneData.HasCamera()); EXPECT_EQ(sceneData.camera, overrideCamera); EXPECT_NE(sceneData.camera, primaryCamera); EXPECT_EQ(sceneData.cameraData.viewportWidth, 640u); EXPECT_EQ(sceneData.cameraData.viewportHeight, 480u); } } // namespace