102 lines
3.8 KiB
C++
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
|