Files
XCEngine/tests/Rendering/unit/test_render_scene_extractor.cpp

102 lines
3.8 KiB
C++

#include <gtest/gtest.h>
#include <XCEngine/Components/CameraComponent.h>
#include <XCEngine/Components/GameObject.h>
#include <XCEngine/Components/MeshFilterComponent.h>
#include <XCEngine/Components/MeshRendererComponent.h>
#include <XCEngine/Core/Asset/IResource.h>
#include <XCEngine/Core/Math/Vector3.h>
#include <XCEngine/Rendering/RenderSceneExtractor.h>
#include <XCEngine/Scene/Scene.h>
#include <XCEngine/Resources/Mesh/Mesh.h>
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<CameraComponent>();
cameraA->SetPrimary(true);
cameraA->SetDepth(0.0f);
GameObject* cameraObjectB = scene.CreateGameObject("CameraB");
auto* cameraB = cameraObjectB->AddComponent<CameraComponent>();
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<MeshFilterComponent>();
visibleObject->AddComponent<MeshRendererComponent>();
Mesh* visibleMesh = CreateTestMesh("Meshes/visible.mesh");
meshFilter->SetMesh(visibleMesh);
GameObject* hiddenObject = scene.CreateGameObject("HiddenQuad");
hiddenObject->SetActive(false);
auto* hiddenMeshFilter = hiddenObject->AddComponent<MeshFilterComponent>();
hiddenObject->AddComponent<MeshRendererComponent>();
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<CameraComponent>();
primaryCamera->SetPrimary(true);
primaryCamera->SetDepth(10.0f);
GameObject* overrideObject = scene.CreateGameObject("OverrideCamera");
auto* overrideCamera = overrideObject->AddComponent<CameraComponent>();
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