refactor: route renderer defaults through pipeline assets
This commit is contained in:
@@ -2,6 +2,7 @@
|
||||
|
||||
#include <XCEngine/Components/CameraComponent.h>
|
||||
#include <XCEngine/Rendering/CameraRenderer.h>
|
||||
#include <XCEngine/Rendering/RenderPipelineAsset.h>
|
||||
#include <XCEngine/Rendering/RenderSurface.h>
|
||||
#include <XCEngine/Rendering/SceneRenderer.h>
|
||||
#include <XCEngine/Scene/Scene.h>
|
||||
@@ -30,6 +31,11 @@ struct MockPipelineState {
|
||||
std::vector<std::string> eventLog;
|
||||
};
|
||||
|
||||
struct MockPipelineAssetState {
|
||||
int createCalls = 0;
|
||||
std::shared_ptr<MockPipelineState> lastCreatedPipelineState;
|
||||
};
|
||||
|
||||
class MockPipeline final : public RenderPipeline {
|
||||
public:
|
||||
explicit MockPipeline(std::shared_ptr<MockPipelineState> state)
|
||||
@@ -65,6 +71,22 @@ private:
|
||||
std::shared_ptr<MockPipelineState> m_state;
|
||||
};
|
||||
|
||||
class MockPipelineAsset final : public RenderPipelineAsset {
|
||||
public:
|
||||
explicit MockPipelineAsset(std::shared_ptr<MockPipelineAssetState> state)
|
||||
: m_state(std::move(state)) {
|
||||
}
|
||||
|
||||
std::unique_ptr<RenderPipeline> CreatePipeline() const override {
|
||||
++m_state->createCalls;
|
||||
m_state->lastCreatedPipelineState = std::make_shared<MockPipelineState>();
|
||||
return std::make_unique<MockPipeline>(m_state->lastCreatedPipelineState);
|
||||
}
|
||||
|
||||
private:
|
||||
std::shared_ptr<MockPipelineAssetState> m_state;
|
||||
};
|
||||
|
||||
class TrackingPass final : public RenderPass {
|
||||
public:
|
||||
TrackingPass(
|
||||
@@ -321,6 +343,44 @@ TEST(SceneRenderer_Test, ForwardsPipelineLifetimeAndRenderCallsToCameraRenderer)
|
||||
EXPECT_EQ(replacementState->shutdownCalls, 1);
|
||||
}
|
||||
|
||||
TEST(SceneRenderer_Test, CreatesPipelineInstancesFromPipelineAssetsAndShutsDownReplacedPipelines) {
|
||||
Scene scene("SceneRendererAssetScene");
|
||||
|
||||
GameObject* cameraObject = scene.CreateGameObject("Camera");
|
||||
auto* camera = cameraObject->AddComponent<CameraComponent>();
|
||||
camera->SetPrimary(true);
|
||||
camera->SetDepth(2.0f);
|
||||
|
||||
auto initialAssetState = std::make_shared<MockPipelineAssetState>();
|
||||
auto replacementAssetState = std::make_shared<MockPipelineAssetState>();
|
||||
|
||||
{
|
||||
SceneRenderer renderer(std::make_shared<MockPipelineAsset>(initialAssetState));
|
||||
ASSERT_NE(renderer.GetPipeline(), nullptr);
|
||||
ASSERT_NE(renderer.GetPipelineAsset(), nullptr);
|
||||
EXPECT_EQ(initialAssetState->createCalls, 1);
|
||||
|
||||
const RenderSurface surface(800, 600);
|
||||
ASSERT_TRUE(renderer.Render(scene, nullptr, CreateValidContext(), surface));
|
||||
ASSERT_NE(initialAssetState->lastCreatedPipelineState, nullptr);
|
||||
EXPECT_EQ(initialAssetState->lastCreatedPipelineState->renderCalls, 1);
|
||||
EXPECT_EQ(initialAssetState->lastCreatedPipelineState->lastCamera, camera);
|
||||
|
||||
renderer.SetPipelineAsset(std::make_shared<MockPipelineAsset>(replacementAssetState));
|
||||
ASSERT_NE(initialAssetState->lastCreatedPipelineState, nullptr);
|
||||
EXPECT_EQ(initialAssetState->lastCreatedPipelineState->shutdownCalls, 1);
|
||||
EXPECT_EQ(replacementAssetState->createCalls, 1);
|
||||
|
||||
ASSERT_TRUE(renderer.Render(scene, nullptr, CreateValidContext(), surface));
|
||||
ASSERT_NE(replacementAssetState->lastCreatedPipelineState, nullptr);
|
||||
EXPECT_EQ(replacementAssetState->lastCreatedPipelineState->renderCalls, 1);
|
||||
EXPECT_EQ(replacementAssetState->lastCreatedPipelineState->lastCamera, camera);
|
||||
}
|
||||
|
||||
ASSERT_NE(replacementAssetState->lastCreatedPipelineState, nullptr);
|
||||
EXPECT_EQ(replacementAssetState->lastCreatedPipelineState->shutdownCalls, 1);
|
||||
}
|
||||
|
||||
TEST(SceneRenderer_Test, SortsManualCameraRequestsByDepthBeforeRendering) {
|
||||
Scene scene("SceneRendererManualRequests");
|
||||
|
||||
|
||||
Reference in New Issue
Block a user