refactor: move scene view post-pass planning into renderer
This commit is contained in:
@@ -1,65 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
#include <cstdint>
|
||||
#include <vector>
|
||||
|
||||
namespace XCEngine {
|
||||
namespace Editor {
|
||||
|
||||
enum class SceneViewportPostPassStep : uint8_t {
|
||||
ColorToRenderTarget,
|
||||
InfiniteGrid,
|
||||
SelectionOutline,
|
||||
ColorToShaderResource,
|
||||
SelectionMaskDebug
|
||||
};
|
||||
|
||||
struct SceneViewportPostPassPlanInput {
|
||||
bool overlayValid = false;
|
||||
bool hasSelection = false;
|
||||
bool debugSelectionMask = false;
|
||||
bool hasObjectIdShaderView = false;
|
||||
};
|
||||
|
||||
struct SceneViewportPostPassPlan {
|
||||
bool valid = false;
|
||||
std::vector<SceneViewportPostPassStep> steps;
|
||||
};
|
||||
|
||||
inline SceneViewportPostPassPlan BuildSceneViewportPostPassPlan(
|
||||
const SceneViewportPostPassPlanInput& input) {
|
||||
SceneViewportPostPassPlan plan = {};
|
||||
if (!input.overlayValid) {
|
||||
return plan;
|
||||
}
|
||||
|
||||
plan.valid = true;
|
||||
|
||||
if (input.debugSelectionMask) {
|
||||
plan.steps.push_back(SceneViewportPostPassStep::ColorToRenderTarget);
|
||||
if (input.hasSelection && input.hasObjectIdShaderView) {
|
||||
plan.steps.push_back(SceneViewportPostPassStep::SelectionMaskDebug);
|
||||
}
|
||||
plan.steps.push_back(SceneViewportPostPassStep::ColorToShaderResource);
|
||||
return plan;
|
||||
}
|
||||
|
||||
plan.steps.push_back(SceneViewportPostPassStep::ColorToRenderTarget);
|
||||
plan.steps.push_back(SceneViewportPostPassStep::InfiniteGrid);
|
||||
|
||||
if (input.hasSelection && input.hasObjectIdShaderView) {
|
||||
plan.steps = {
|
||||
SceneViewportPostPassStep::ColorToRenderTarget,
|
||||
SceneViewportPostPassStep::InfiniteGrid,
|
||||
SceneViewportPostPassStep::SelectionOutline,
|
||||
SceneViewportPostPassStep::ColorToShaderResource
|
||||
};
|
||||
return plan;
|
||||
}
|
||||
|
||||
plan.steps.push_back(SceneViewportPostPassStep::ColorToShaderResource);
|
||||
return plan;
|
||||
}
|
||||
|
||||
} // namespace Editor
|
||||
} // namespace XCEngine
|
||||
@@ -6,7 +6,6 @@
|
||||
#include "IViewportHostService.h"
|
||||
#include "SceneViewportPicker.h"
|
||||
#include "SceneViewportCameraController.h"
|
||||
#include "SceneViewportPostPassPlan.h"
|
||||
#include "UI/ImGuiBackendBridge.h"
|
||||
|
||||
#include <XCEngine/Components/CameraComponent.h>
|
||||
@@ -18,6 +17,7 @@
|
||||
#include <XCEngine/RHI/RHITexture.h>
|
||||
#include <XCEngine/Rendering/ObjectIdEncoding.h>
|
||||
#include <XCEngine/Rendering/Passes/BuiltinInfiniteGridPass.h>
|
||||
#include <XCEngine/Rendering/Passes/BuiltinSceneViewPostPassPlan.h>
|
||||
#include <XCEngine/Rendering/Passes/BuiltinObjectIdOutlinePass.h>
|
||||
#include <XCEngine/Rendering/RenderContext.h>
|
||||
#include <XCEngine/Rendering/RenderSurface.h>
|
||||
@@ -688,25 +688,25 @@ private:
|
||||
}
|
||||
|
||||
void AddSceneViewPostPassStep(
|
||||
SceneViewportPostPassStep step,
|
||||
Rendering::Passes::BuiltinSceneViewPostPassStep step,
|
||||
ViewportEntry& entry,
|
||||
const SceneViewportOverlayData& overlay,
|
||||
const std::vector<uint64_t>& selectedObjectIds,
|
||||
Rendering::RenderPassSequence& outPostPasses) {
|
||||
switch (step) {
|
||||
case SceneViewportPostPassStep::ColorToRenderTarget:
|
||||
case Rendering::Passes::BuiltinSceneViewPostPassStep::ColorToRenderTarget:
|
||||
AddSceneColorToRenderTargetPass(entry, outPostPasses);
|
||||
break;
|
||||
case SceneViewportPostPassStep::InfiniteGrid:
|
||||
case Rendering::Passes::BuiltinSceneViewPostPassStep::InfiniteGrid:
|
||||
AddSceneInfiniteGridPass(entry, overlay, outPostPasses);
|
||||
break;
|
||||
case SceneViewportPostPassStep::SelectionOutline:
|
||||
case Rendering::Passes::BuiltinSceneViewPostPassStep::SelectionOutline:
|
||||
AddSceneSelectionOutlinePass(entry, selectedObjectIds, outPostPasses);
|
||||
break;
|
||||
case SceneViewportPostPassStep::ColorToShaderResource:
|
||||
case Rendering::Passes::BuiltinSceneViewPostPassStep::ColorToShaderResource:
|
||||
AddSceneColorToShaderResourcePass(entry, outPostPasses);
|
||||
break;
|
||||
case SceneViewportPostPassStep::SelectionMaskDebug:
|
||||
case Rendering::Passes::BuiltinSceneViewPostPassStep::SelectionMaskDebug:
|
||||
AddSceneSelectionMaskDebugPass(
|
||||
entry,
|
||||
selectedObjectIds,
|
||||
@@ -731,7 +731,8 @@ private:
|
||||
SetViewportStatusIfEmpty(entry.statusText, "Scene object id shader view is unavailable");
|
||||
}
|
||||
|
||||
const SceneViewportPostPassPlan plan = BuildSceneViewportPostPassPlan({
|
||||
const Rendering::Passes::BuiltinSceneViewPostPassPlan plan =
|
||||
Rendering::Passes::BuildBuiltinSceneViewPostPassPlan({
|
||||
overlay.valid,
|
||||
hasSelection,
|
||||
kDebugSceneSelectionMask,
|
||||
@@ -741,7 +742,7 @@ private:
|
||||
return false;
|
||||
}
|
||||
|
||||
for (const SceneViewportPostPassStep step : plan.steps) {
|
||||
for (const Rendering::Passes::BuiltinSceneViewPostPassStep step : plan.steps) {
|
||||
AddSceneViewPostPassStep(
|
||||
step,
|
||||
entry,
|
||||
|
||||
@@ -346,6 +346,7 @@ add_library(XCEngine STATIC
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/include/XCEngine/Rendering/SceneRenderer.h
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/include/XCEngine/Rendering/Passes/BuiltinObjectIdPass.h
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/include/XCEngine/Rendering/Passes/BuiltinInfiniteGridPass.h
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/include/XCEngine/Rendering/Passes/BuiltinSceneViewPostPassPlan.h
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/include/XCEngine/Rendering/Passes/BuiltinObjectIdOutlinePass.h
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/include/XCEngine/Rendering/Pipelines/BuiltinForwardPipeline.h
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/src/Rendering/CameraRenderer.cpp
|
||||
|
||||
@@ -0,0 +1,67 @@
|
||||
#pragma once
|
||||
|
||||
#include <cstdint>
|
||||
#include <vector>
|
||||
|
||||
namespace XCEngine {
|
||||
namespace Rendering {
|
||||
namespace Passes {
|
||||
|
||||
enum class BuiltinSceneViewPostPassStep : uint8_t {
|
||||
ColorToRenderTarget,
|
||||
InfiniteGrid,
|
||||
SelectionOutline,
|
||||
ColorToShaderResource,
|
||||
SelectionMaskDebug
|
||||
};
|
||||
|
||||
struct BuiltinSceneViewPostPassPlanInput {
|
||||
bool overlayValid = false;
|
||||
bool hasSelection = false;
|
||||
bool debugSelectionMask = false;
|
||||
bool hasObjectIdShaderView = false;
|
||||
};
|
||||
|
||||
struct BuiltinSceneViewPostPassPlan {
|
||||
bool valid = false;
|
||||
std::vector<BuiltinSceneViewPostPassStep> steps;
|
||||
};
|
||||
|
||||
inline BuiltinSceneViewPostPassPlan BuildBuiltinSceneViewPostPassPlan(
|
||||
const BuiltinSceneViewPostPassPlanInput& input) {
|
||||
BuiltinSceneViewPostPassPlan plan = {};
|
||||
if (!input.overlayValid) {
|
||||
return plan;
|
||||
}
|
||||
|
||||
plan.valid = true;
|
||||
|
||||
if (input.debugSelectionMask) {
|
||||
plan.steps.push_back(BuiltinSceneViewPostPassStep::ColorToRenderTarget);
|
||||
if (input.hasSelection && input.hasObjectIdShaderView) {
|
||||
plan.steps.push_back(BuiltinSceneViewPostPassStep::SelectionMaskDebug);
|
||||
}
|
||||
plan.steps.push_back(BuiltinSceneViewPostPassStep::ColorToShaderResource);
|
||||
return plan;
|
||||
}
|
||||
|
||||
plan.steps.push_back(BuiltinSceneViewPostPassStep::ColorToRenderTarget);
|
||||
plan.steps.push_back(BuiltinSceneViewPostPassStep::InfiniteGrid);
|
||||
|
||||
if (input.hasSelection && input.hasObjectIdShaderView) {
|
||||
plan.steps = {
|
||||
BuiltinSceneViewPostPassStep::ColorToRenderTarget,
|
||||
BuiltinSceneViewPostPassStep::InfiniteGrid,
|
||||
BuiltinSceneViewPostPassStep::SelectionOutline,
|
||||
BuiltinSceneViewPostPassStep::ColorToShaderResource
|
||||
};
|
||||
return plan;
|
||||
}
|
||||
|
||||
plan.steps.push_back(BuiltinSceneViewPostPassStep::ColorToShaderResource);
|
||||
return plan;
|
||||
}
|
||||
|
||||
} // namespace Passes
|
||||
} // namespace Rendering
|
||||
} // namespace XCEngine
|
||||
@@ -5,6 +5,7 @@ project(XCEngine_RenderingUnitTests)
|
||||
set(RENDERING_UNIT_TEST_SOURCES
|
||||
test_render_pass.cpp
|
||||
test_builtin_forward_pipeline.cpp
|
||||
test_builtin_scene_view_post_pass_plan.cpp
|
||||
test_camera_scene_renderer.cpp
|
||||
test_render_scene_extractor.cpp
|
||||
)
|
||||
|
||||
108
tests/Rendering/unit/test_builtin_scene_view_post_pass_plan.cpp
Normal file
108
tests/Rendering/unit/test_builtin_scene_view_post_pass_plan.cpp
Normal file
@@ -0,0 +1,108 @@
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
#include <XCEngine/Rendering/Passes/BuiltinSceneViewPostPassPlan.h>
|
||||
|
||||
#include <vector>
|
||||
|
||||
namespace {
|
||||
|
||||
using XCEngine::Rendering::Passes::BuildBuiltinSceneViewPostPassPlan;
|
||||
using XCEngine::Rendering::Passes::BuiltinSceneViewPostPassPlanInput;
|
||||
using XCEngine::Rendering::Passes::BuiltinSceneViewPostPassStep;
|
||||
|
||||
TEST(BuiltinSceneViewPostPassPlan_Test, ReturnsInvalidPlanWhenOverlayIsUnavailable) {
|
||||
const auto plan = BuildBuiltinSceneViewPostPassPlan({});
|
||||
|
||||
EXPECT_FALSE(plan.valid);
|
||||
EXPECT_TRUE(plan.steps.empty());
|
||||
}
|
||||
|
||||
TEST(BuiltinSceneViewPostPassPlan_Test, BuildsGridOnlyPlanWhenNothingIsSelected) {
|
||||
BuiltinSceneViewPostPassPlanInput input = {};
|
||||
input.overlayValid = true;
|
||||
|
||||
const auto plan = BuildBuiltinSceneViewPostPassPlan(input);
|
||||
|
||||
ASSERT_TRUE(plan.valid);
|
||||
EXPECT_EQ(
|
||||
plan.steps,
|
||||
(std::vector<BuiltinSceneViewPostPassStep>{
|
||||
BuiltinSceneViewPostPassStep::ColorToRenderTarget,
|
||||
BuiltinSceneViewPostPassStep::InfiniteGrid,
|
||||
BuiltinSceneViewPostPassStep::ColorToShaderResource
|
||||
}));
|
||||
}
|
||||
|
||||
TEST(BuiltinSceneViewPostPassPlan_Test, BuildsSelectionOutlinePlanWhenObjectIdShaderViewExists) {
|
||||
BuiltinSceneViewPostPassPlanInput input = {};
|
||||
input.overlayValid = true;
|
||||
input.hasSelection = true;
|
||||
input.hasObjectIdShaderView = true;
|
||||
|
||||
const auto plan = BuildBuiltinSceneViewPostPassPlan(input);
|
||||
|
||||
ASSERT_TRUE(plan.valid);
|
||||
EXPECT_EQ(
|
||||
plan.steps,
|
||||
(std::vector<BuiltinSceneViewPostPassStep>{
|
||||
BuiltinSceneViewPostPassStep::ColorToRenderTarget,
|
||||
BuiltinSceneViewPostPassStep::InfiniteGrid,
|
||||
BuiltinSceneViewPostPassStep::SelectionOutline,
|
||||
BuiltinSceneViewPostPassStep::ColorToShaderResource
|
||||
}));
|
||||
}
|
||||
|
||||
TEST(BuiltinSceneViewPostPassPlan_Test, SkipsSelectionOutlineWhenObjectIdShaderViewIsMissing) {
|
||||
BuiltinSceneViewPostPassPlanInput input = {};
|
||||
input.overlayValid = true;
|
||||
input.hasSelection = true;
|
||||
|
||||
const auto plan = BuildBuiltinSceneViewPostPassPlan(input);
|
||||
|
||||
ASSERT_TRUE(plan.valid);
|
||||
EXPECT_EQ(
|
||||
plan.steps,
|
||||
(std::vector<BuiltinSceneViewPostPassStep>{
|
||||
BuiltinSceneViewPostPassStep::ColorToRenderTarget,
|
||||
BuiltinSceneViewPostPassStep::InfiniteGrid,
|
||||
BuiltinSceneViewPostPassStep::ColorToShaderResource
|
||||
}));
|
||||
}
|
||||
|
||||
TEST(BuiltinSceneViewPostPassPlan_Test, BuildsDebugMaskPlanFromObjectIdShaderView) {
|
||||
BuiltinSceneViewPostPassPlanInput input = {};
|
||||
input.overlayValid = true;
|
||||
input.hasSelection = true;
|
||||
input.debugSelectionMask = true;
|
||||
input.hasObjectIdShaderView = true;
|
||||
|
||||
const auto plan = BuildBuiltinSceneViewPostPassPlan(input);
|
||||
|
||||
ASSERT_TRUE(plan.valid);
|
||||
EXPECT_EQ(
|
||||
plan.steps,
|
||||
(std::vector<BuiltinSceneViewPostPassStep>{
|
||||
BuiltinSceneViewPostPassStep::ColorToRenderTarget,
|
||||
BuiltinSceneViewPostPassStep::SelectionMaskDebug,
|
||||
BuiltinSceneViewPostPassStep::ColorToShaderResource
|
||||
}));
|
||||
}
|
||||
|
||||
TEST(BuiltinSceneViewPostPassPlan_Test, DebugMaskPlanFallsBackWhenObjectIdShaderViewIsMissing) {
|
||||
BuiltinSceneViewPostPassPlanInput input = {};
|
||||
input.overlayValid = true;
|
||||
input.hasSelection = true;
|
||||
input.debugSelectionMask = true;
|
||||
|
||||
const auto plan = BuildBuiltinSceneViewPostPassPlan(input);
|
||||
|
||||
ASSERT_TRUE(plan.valid);
|
||||
EXPECT_EQ(
|
||||
plan.steps,
|
||||
(std::vector<BuiltinSceneViewPostPassStep>{
|
||||
BuiltinSceneViewPostPassStep::ColorToRenderTarget,
|
||||
BuiltinSceneViewPostPassStep::ColorToShaderResource
|
||||
}));
|
||||
}
|
||||
|
||||
} // namespace
|
||||
@@ -8,7 +8,6 @@ set(EDITOR_TEST_SOURCES
|
||||
test_scene_viewport_move_gizmo.cpp
|
||||
test_scene_viewport_rotate_gizmo.cpp
|
||||
test_scene_viewport_scale_gizmo.cpp
|
||||
test_scene_viewport_post_pass_plan.cpp
|
||||
test_scene_viewport_picker.cpp
|
||||
test_scene_viewport_overlay_renderer.cpp
|
||||
test_scene_viewport_selection_utils.cpp
|
||||
|
||||
@@ -1,108 +0,0 @@
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
#include "Viewport/SceneViewportPostPassPlan.h"
|
||||
|
||||
#include <vector>
|
||||
|
||||
namespace {
|
||||
|
||||
using XCEngine::Editor::BuildSceneViewportPostPassPlan;
|
||||
using XCEngine::Editor::SceneViewportPostPassPlanInput;
|
||||
using XCEngine::Editor::SceneViewportPostPassStep;
|
||||
|
||||
TEST(SceneViewportPostPassPlan_Test, ReturnsInvalidPlanWhenOverlayIsUnavailable) {
|
||||
const auto plan = BuildSceneViewportPostPassPlan({});
|
||||
|
||||
EXPECT_FALSE(plan.valid);
|
||||
EXPECT_TRUE(plan.steps.empty());
|
||||
}
|
||||
|
||||
TEST(SceneViewportPostPassPlan_Test, BuildsGridOnlyPlanWhenNothingIsSelected) {
|
||||
SceneViewportPostPassPlanInput input = {};
|
||||
input.overlayValid = true;
|
||||
|
||||
const auto plan = BuildSceneViewportPostPassPlan(input);
|
||||
|
||||
ASSERT_TRUE(plan.valid);
|
||||
EXPECT_EQ(
|
||||
plan.steps,
|
||||
(std::vector<SceneViewportPostPassStep>{
|
||||
SceneViewportPostPassStep::ColorToRenderTarget,
|
||||
SceneViewportPostPassStep::InfiniteGrid,
|
||||
SceneViewportPostPassStep::ColorToShaderResource
|
||||
}));
|
||||
}
|
||||
|
||||
TEST(SceneViewportPostPassPlan_Test, BuildsSelectionOutlinePlanWhenObjectIdShaderViewExists) {
|
||||
SceneViewportPostPassPlanInput input = {};
|
||||
input.overlayValid = true;
|
||||
input.hasSelection = true;
|
||||
input.hasObjectIdShaderView = true;
|
||||
|
||||
const auto plan = BuildSceneViewportPostPassPlan(input);
|
||||
|
||||
ASSERT_TRUE(plan.valid);
|
||||
EXPECT_EQ(
|
||||
plan.steps,
|
||||
(std::vector<SceneViewportPostPassStep>{
|
||||
SceneViewportPostPassStep::ColorToRenderTarget,
|
||||
SceneViewportPostPassStep::InfiniteGrid,
|
||||
SceneViewportPostPassStep::SelectionOutline,
|
||||
SceneViewportPostPassStep::ColorToShaderResource
|
||||
}));
|
||||
}
|
||||
|
||||
TEST(SceneViewportPostPassPlan_Test, SkipsSelectionOutlineWhenObjectIdShaderViewIsMissing) {
|
||||
SceneViewportPostPassPlanInput input = {};
|
||||
input.overlayValid = true;
|
||||
input.hasSelection = true;
|
||||
|
||||
const auto plan = BuildSceneViewportPostPassPlan(input);
|
||||
|
||||
ASSERT_TRUE(plan.valid);
|
||||
EXPECT_EQ(
|
||||
plan.steps,
|
||||
(std::vector<SceneViewportPostPassStep>{
|
||||
SceneViewportPostPassStep::ColorToRenderTarget,
|
||||
SceneViewportPostPassStep::InfiniteGrid,
|
||||
SceneViewportPostPassStep::ColorToShaderResource
|
||||
}));
|
||||
}
|
||||
|
||||
TEST(SceneViewportPostPassPlan_Test, BuildsDebugMaskPlanFromObjectIdShaderView) {
|
||||
SceneViewportPostPassPlanInput input = {};
|
||||
input.overlayValid = true;
|
||||
input.hasSelection = true;
|
||||
input.debugSelectionMask = true;
|
||||
input.hasObjectIdShaderView = true;
|
||||
|
||||
const auto plan = BuildSceneViewportPostPassPlan(input);
|
||||
|
||||
ASSERT_TRUE(plan.valid);
|
||||
EXPECT_EQ(
|
||||
plan.steps,
|
||||
(std::vector<SceneViewportPostPassStep>{
|
||||
SceneViewportPostPassStep::ColorToRenderTarget,
|
||||
SceneViewportPostPassStep::SelectionMaskDebug,
|
||||
SceneViewportPostPassStep::ColorToShaderResource
|
||||
}));
|
||||
}
|
||||
|
||||
TEST(SceneViewportPostPassPlan_Test, DebugMaskPlanFallsBackWhenObjectIdShaderViewIsMissing) {
|
||||
SceneViewportPostPassPlanInput input = {};
|
||||
input.overlayValid = true;
|
||||
input.hasSelection = true;
|
||||
input.debugSelectionMask = true;
|
||||
|
||||
const auto plan = BuildSceneViewportPostPassPlan(input);
|
||||
|
||||
ASSERT_TRUE(plan.valid);
|
||||
EXPECT_EQ(
|
||||
plan.steps,
|
||||
(std::vector<SceneViewportPostPassStep>{
|
||||
SceneViewportPostPassStep::ColorToRenderTarget,
|
||||
SceneViewportPostPassStep::ColorToShaderResource
|
||||
}));
|
||||
}
|
||||
|
||||
} // namespace
|
||||
Reference in New Issue
Block a user