Refactor scene viewport render planning
This commit is contained in:
@@ -1,5 +1,7 @@
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
#include "Viewport/SceneViewportEditorOverlayData.h"
|
||||
#include "Viewport/SceneViewportRenderPlan.h"
|
||||
#include "Viewport/ViewportHostRenderFlowUtils.h"
|
||||
|
||||
#include <memory>
|
||||
@@ -8,16 +10,21 @@
|
||||
namespace {
|
||||
|
||||
using XCEngine::Editor::ApplySceneViewportRenderRequestSetup;
|
||||
using XCEngine::Editor::ApplySceneViewportRenderPlan;
|
||||
using XCEngine::Editor::ApplyViewportFailureStatus;
|
||||
using XCEngine::Editor::BuildGameViewportRenderFailurePolicy;
|
||||
using XCEngine::Editor::BuildSceneViewportBuiltinPostProcess;
|
||||
using XCEngine::Editor::BuildSceneViewportRenderPlan;
|
||||
using XCEngine::Editor::BuildSceneViewportRenderFailurePolicy;
|
||||
using XCEngine::Editor::BuildViewportRenderTargetUnavailablePolicy;
|
||||
using XCEngine::Editor::GameViewportRenderFailure;
|
||||
using XCEngine::Editor::MarkGameViewportRenderSuccess;
|
||||
using XCEngine::Editor::MarkSceneViewportRenderSuccess;
|
||||
using XCEngine::Editor::SceneViewportOverlayFrameData;
|
||||
using XCEngine::Editor::SceneViewportOverlayLinePrimitive;
|
||||
using XCEngine::Editor::SceneViewportRenderFailure;
|
||||
using XCEngine::Editor::SceneViewportOverlayData;
|
||||
using XCEngine::Editor::SceneViewportRenderPlan;
|
||||
using XCEngine::Editor::ViewportRenderTargets;
|
||||
using XCEngine::RHI::Format;
|
||||
using XCEngine::RHI::RHIResourceView;
|
||||
@@ -92,6 +99,20 @@ SceneViewportOverlayData CreateValidOverlay() {
|
||||
return overlay;
|
||||
}
|
||||
|
||||
SceneViewportOverlayFrameData CreateOverlayFrameDataWithLine(
|
||||
const SceneViewportOverlayData& overlay,
|
||||
const XCEngine::Math::Vector3& start,
|
||||
const XCEngine::Math::Vector3& end) {
|
||||
SceneViewportOverlayFrameData frameData = {};
|
||||
frameData.overlay = overlay;
|
||||
|
||||
SceneViewportOverlayLinePrimitive& line = frameData.worldLines.emplace_back();
|
||||
line.startWorld = start;
|
||||
line.endWorld = end;
|
||||
line.color = XCEngine::Math::Color::White();
|
||||
return frameData;
|
||||
}
|
||||
|
||||
TEST(ViewportRenderFlowUtilsTest, BuildFailurePoliciesExposeExpectedStatusAndClearBehavior) {
|
||||
const auto targetUnavailable = BuildViewportRenderTargetUnavailablePolicy();
|
||||
EXPECT_STREQ(targetUnavailable.statusText, "Viewport render target is unavailable");
|
||||
@@ -293,6 +314,80 @@ TEST(ViewportRenderFlowUtilsTest, ApplySceneRenderRequestSetupPreservesBuiltinGr
|
||||
EXPECT_TRUE(request.objectId.IsRequested());
|
||||
}
|
||||
|
||||
TEST(ViewportRenderFlowUtilsTest, BuildSceneViewportRenderPlanCollectsBuiltinAndOverlayPasses) {
|
||||
DummyResourceView objectIdShaderView(ResourceViewType::ShaderResource);
|
||||
|
||||
ViewportRenderTargets targets = {};
|
||||
targets.objectIdShaderView = &objectIdShaderView;
|
||||
|
||||
const SceneViewportOverlayData overlay = CreateValidOverlay();
|
||||
const SceneViewportOverlayFrameData editorOverlayFrameData =
|
||||
CreateOverlayFrameDataWithLine(
|
||||
overlay,
|
||||
XCEngine::Math::Vector3::Zero(),
|
||||
XCEngine::Math::Vector3::Right());
|
||||
const SceneViewportOverlayFrameData transientOverlayFrameData =
|
||||
CreateOverlayFrameDataWithLine(
|
||||
overlay,
|
||||
XCEngine::Math::Vector3::Zero(),
|
||||
XCEngine::Math::Vector3::Up());
|
||||
|
||||
size_t factoryCallCount = 0u;
|
||||
size_t combinedWorldLineCount = 0u;
|
||||
const auto result = BuildSceneViewportRenderPlan(
|
||||
targets,
|
||||
overlay,
|
||||
{ 7u, 11u },
|
||||
editorOverlayFrameData,
|
||||
transientOverlayFrameData,
|
||||
[&factoryCallCount, &combinedWorldLineCount](const SceneViewportOverlayFrameData& frameData) {
|
||||
++factoryCallCount;
|
||||
combinedWorldLineCount = frameData.worldLines.size();
|
||||
return std::make_unique<NoopRenderPass>();
|
||||
},
|
||||
false);
|
||||
|
||||
EXPECT_TRUE(result.plan.builtinPostProcess.IsRequested());
|
||||
EXPECT_EQ(result.plan.overlayPasses.GetPassCount(), 1u);
|
||||
EXPECT_EQ(factoryCallCount, 1u);
|
||||
EXPECT_EQ(combinedWorldLineCount, 2u);
|
||||
EXPECT_EQ(result.warningStatusText, nullptr);
|
||||
}
|
||||
|
||||
TEST(ViewportRenderFlowUtilsTest, ApplySceneViewportRenderPlanAttachesPlannedPassesAndClearState) {
|
||||
DummyResourceView depthView(ResourceViewType::DepthStencil, Format::D24_UNorm_S8_UInt);
|
||||
DummyResourceView objectIdView(ResourceViewType::RenderTarget);
|
||||
DummyResourceView objectIdShaderView(ResourceViewType::ShaderResource);
|
||||
|
||||
ViewportRenderTargets targets = {};
|
||||
targets.width = 800;
|
||||
targets.height = 600;
|
||||
targets.depthView = &depthView;
|
||||
targets.objectIdView = &objectIdView;
|
||||
targets.objectIdShaderView = &objectIdShaderView;
|
||||
|
||||
SceneViewportRenderPlan plan = {};
|
||||
plan.builtinPostProcess.gridPassData.valid = true;
|
||||
plan.postScenePasses.AddPass(std::make_unique<NoopRenderPass>());
|
||||
plan.overlayPasses.AddPass(std::make_unique<NoopRenderPass>());
|
||||
plan.clearColorOverride = XCEngine::Math::Color(0.1f, 0.2f, 0.3f, 1.0f);
|
||||
|
||||
XCEngine::Rendering::CameraRenderRequest request = {};
|
||||
request.surface = RenderSurface(800, 600);
|
||||
request.surface.SetRenderArea(XCEngine::Math::RectInt(10, 20, 300, 200));
|
||||
|
||||
ApplySceneViewportRenderPlan(targets, plan, request);
|
||||
|
||||
EXPECT_EQ(request.postScenePasses, &plan.postScenePasses);
|
||||
EXPECT_EQ(request.overlayPasses, &plan.overlayPasses);
|
||||
EXPECT_TRUE(request.objectId.IsRequested());
|
||||
EXPECT_TRUE(request.builtinPostProcess.IsRequested());
|
||||
EXPECT_TRUE(request.hasClearColorOverride);
|
||||
EXPECT_FLOAT_EQ(request.clearColorOverride.r, 0.1f);
|
||||
EXPECT_FLOAT_EQ(request.clearColorOverride.g, 0.2f);
|
||||
EXPECT_FLOAT_EQ(request.clearColorOverride.b, 0.3f);
|
||||
}
|
||||
|
||||
TEST(ViewportRenderFlowUtilsTest, MarkSceneRenderSuccessMovesTargetsToShaderResourceState) {
|
||||
DummyResourceView depthView(ResourceViewType::DepthStencil, Format::D24_UNorm_S8_UInt);
|
||||
DummyResourceView objectIdView(ResourceViewType::RenderTarget);
|
||||
|
||||
Reference in New Issue
Block a user