test: close renderer phase boundary
This commit is contained in:
@@ -10,12 +10,14 @@ namespace {
|
||||
using XCEngine::Editor::ApplySceneViewportRenderRequestSetup;
|
||||
using XCEngine::Editor::ApplyViewportFailureStatus;
|
||||
using XCEngine::Editor::BuildGameViewportRenderFailurePolicy;
|
||||
using XCEngine::Editor::BuildSceneViewportBuiltinPostProcess;
|
||||
using XCEngine::Editor::BuildSceneViewportRenderFailurePolicy;
|
||||
using XCEngine::Editor::BuildViewportRenderTargetUnavailablePolicy;
|
||||
using XCEngine::Editor::GameViewportRenderFailure;
|
||||
using XCEngine::Editor::MarkGameViewportRenderSuccess;
|
||||
using XCEngine::Editor::MarkSceneViewportRenderSuccess;
|
||||
using XCEngine::Editor::SceneViewportRenderFailure;
|
||||
using XCEngine::Editor::SceneViewportOverlayData;
|
||||
using XCEngine::Editor::ViewportRenderTargets;
|
||||
using XCEngine::RHI::Format;
|
||||
using XCEngine::RHI::RHIResourceView;
|
||||
@@ -76,6 +78,20 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
SceneViewportOverlayData CreateValidOverlay() {
|
||||
SceneViewportOverlayData overlay = {};
|
||||
overlay.valid = true;
|
||||
overlay.cameraPosition = XCEngine::Math::Vector3(1.0f, 2.0f, 3.0f);
|
||||
overlay.cameraForward = XCEngine::Math::Vector3::Forward();
|
||||
overlay.cameraRight = XCEngine::Math::Vector3::Right();
|
||||
overlay.cameraUp = XCEngine::Math::Vector3::Up();
|
||||
overlay.verticalFovDegrees = 70.0f;
|
||||
overlay.nearClipPlane = 0.1f;
|
||||
overlay.farClipPlane = 500.0f;
|
||||
overlay.orbitDistance = 9.0f;
|
||||
return overlay;
|
||||
}
|
||||
|
||||
TEST(ViewportRenderFlowUtilsTest, BuildFailurePoliciesExposeExpectedStatusAndClearBehavior) {
|
||||
const auto targetUnavailable = BuildViewportRenderTargetUnavailablePolicy();
|
||||
EXPECT_STREQ(targetUnavailable.statusText, "Viewport render target is unavailable");
|
||||
@@ -125,6 +141,58 @@ TEST(ViewportRenderFlowUtilsTest, ApplyViewportFailureStatusRespectsSetIfEmptyBe
|
||||
EXPECT_EQ(statusText, "No active scene");
|
||||
}
|
||||
|
||||
TEST(ViewportRenderFlowUtilsTest, BuildSceneViewportBuiltinPostProcessReturnsEmptyRequestWhenOverlayIsInvalid) {
|
||||
const auto result = BuildSceneViewportBuiltinPostProcess({}, {}, true, false);
|
||||
|
||||
EXPECT_FALSE(result.request.IsRequested());
|
||||
EXPECT_EQ(result.warningStatusText, nullptr);
|
||||
}
|
||||
|
||||
TEST(ViewportRenderFlowUtilsTest, BuildSceneViewportBuiltinPostProcessConfiguresGridAndOutlineDefaults) {
|
||||
const auto result = BuildSceneViewportBuiltinPostProcess(
|
||||
CreateValidOverlay(),
|
||||
{ 7u, 11u },
|
||||
true,
|
||||
false);
|
||||
|
||||
EXPECT_TRUE(result.request.IsRequested());
|
||||
EXPECT_TRUE(result.request.gridPassData.valid);
|
||||
EXPECT_EQ(result.request.selectedObjectIds.size(), 2u);
|
||||
EXPECT_EQ(result.request.selectedObjectIds[0], 7u);
|
||||
EXPECT_EQ(result.request.selectedObjectIds[1], 11u);
|
||||
EXPECT_FLOAT_EQ(result.request.outlineStyle.outlineColor.r, 1.0f);
|
||||
EXPECT_FLOAT_EQ(result.request.outlineStyle.outlineColor.g, 0.4f);
|
||||
EXPECT_FLOAT_EQ(result.request.outlineStyle.outlineColor.b, 0.0f);
|
||||
EXPECT_FLOAT_EQ(result.request.outlineStyle.outlineWidthPixels, 2.0f);
|
||||
EXPECT_FALSE(result.request.outlineStyle.debugSelectionMask);
|
||||
EXPECT_EQ(result.warningStatusText, nullptr);
|
||||
}
|
||||
|
||||
TEST(ViewportRenderFlowUtilsTest, BuildSceneViewportBuiltinPostProcessReportsMissingObjectIdShaderViewForSelectionOutline) {
|
||||
const auto result = BuildSceneViewportBuiltinPostProcess(
|
||||
CreateValidOverlay(),
|
||||
{ 42u },
|
||||
false,
|
||||
false);
|
||||
|
||||
EXPECT_TRUE(result.request.IsRequested());
|
||||
EXPECT_TRUE(result.request.gridPassData.valid);
|
||||
EXPECT_EQ(result.request.selectedObjectIds.size(), 1u);
|
||||
EXPECT_STREQ(result.warningStatusText, "Scene object id shader view is unavailable");
|
||||
}
|
||||
|
||||
TEST(ViewportRenderFlowUtilsTest, BuildSceneViewportBuiltinPostProcessDoesNotWarnWhenDebugMaskDisablesSelectionOutlineFallback) {
|
||||
const auto result = BuildSceneViewportBuiltinPostProcess(
|
||||
CreateValidOverlay(),
|
||||
{ 42u },
|
||||
false,
|
||||
true);
|
||||
|
||||
EXPECT_TRUE(result.request.IsRequested());
|
||||
EXPECT_TRUE(result.request.outlineStyle.debugSelectionMask);
|
||||
EXPECT_EQ(result.warningStatusText, nullptr);
|
||||
}
|
||||
|
||||
TEST(ViewportRenderFlowUtilsTest, ApplySceneRenderRequestSetupAttachesOptionalPassesAndObjectIdSurface) {
|
||||
DummyResourceView depthView(ResourceViewType::DepthStencil, Format::D24_UNorm_S8_UInt);
|
||||
DummyResourceView objectIdView(ResourceViewType::RenderTarget);
|
||||
@@ -194,6 +262,37 @@ TEST(ViewportRenderFlowUtilsTest, ApplySceneRenderRequestSetupSkipsUnavailableOp
|
||||
EXPECT_FALSE(request.builtinPostProcess.IsRequested());
|
||||
}
|
||||
|
||||
TEST(ViewportRenderFlowUtilsTest, ApplySceneRenderRequestSetupPreservesBuiltinGridFallbackWhenObjectIdShaderViewIsUnavailable) {
|
||||
DummyResourceView depthView(ResourceViewType::DepthStencil, Format::D24_UNorm_S8_UInt);
|
||||
DummyResourceView objectIdView(ResourceViewType::RenderTarget);
|
||||
|
||||
ViewportRenderTargets targets = {};
|
||||
targets.width = 800;
|
||||
targets.height = 600;
|
||||
targets.depthView = &depthView;
|
||||
targets.objectIdView = &objectIdView;
|
||||
|
||||
const auto builtinPostProcess = BuildSceneViewportBuiltinPostProcess(
|
||||
CreateValidOverlay(),
|
||||
{ 99u },
|
||||
false,
|
||||
false);
|
||||
|
||||
XCEngine::Rendering::CameraRenderRequest request = {};
|
||||
request.surface = RenderSurface(800, 600);
|
||||
|
||||
ApplySceneViewportRenderRequestSetup(
|
||||
targets,
|
||||
&builtinPostProcess.request,
|
||||
nullptr,
|
||||
request);
|
||||
|
||||
EXPECT_TRUE(request.builtinPostProcess.IsRequested());
|
||||
EXPECT_EQ(request.builtinPostProcess.objectIdTextureView, nullptr);
|
||||
EXPECT_EQ(request.builtinPostProcess.selectedObjectIds.size(), 1u);
|
||||
EXPECT_TRUE(request.objectId.IsRequested());
|
||||
}
|
||||
|
||||
TEST(ViewportRenderFlowUtilsTest, MarkSceneRenderSuccessMovesTargetsToShaderResourceState) {
|
||||
DummyResourceView depthView(ResourceViewType::DepthStencil, Format::D24_UNorm_S8_UInt);
|
||||
DummyResourceView objectIdView(ResourceViewType::RenderTarget);
|
||||
|
||||
Reference in New Issue
Block a user