Extract scene viewport render pass bundle
This commit is contained in:
@@ -90,6 +90,7 @@ add_executable(${PROJECT_NAME} WIN32
|
|||||||
src/Viewport/SceneViewportOrientationGizmo.cpp
|
src/Viewport/SceneViewportOrientationGizmo.cpp
|
||||||
src/Viewport/SceneViewportOverlayBuilder.cpp
|
src/Viewport/SceneViewportOverlayBuilder.cpp
|
||||||
src/Viewport/SceneViewportOverlayFrameCache.cpp
|
src/Viewport/SceneViewportOverlayFrameCache.cpp
|
||||||
|
src/Viewport/SceneViewportRenderPassBundle.cpp
|
||||||
src/Viewport/SceneViewportOverlaySpriteResources.cpp
|
src/Viewport/SceneViewportOverlaySpriteResources.cpp
|
||||||
src/Viewport/SceneViewportOverlayProviders.cpp
|
src/Viewport/SceneViewportOverlayProviders.cpp
|
||||||
src/Viewport/Passes/SceneViewportEditorOverlayPass.cpp
|
src/Viewport/Passes/SceneViewportEditorOverlayPass.cpp
|
||||||
|
|||||||
43
editor/src/Viewport/SceneViewportRenderPassBundle.cpp
Normal file
43
editor/src/Viewport/SceneViewportRenderPassBundle.cpp
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
#include "Viewport/SceneViewportRenderPassBundle.h"
|
||||||
|
|
||||||
|
namespace XCEngine {
|
||||||
|
namespace Editor {
|
||||||
|
|
||||||
|
void SceneViewportRenderPassBundle::Shutdown() {
|
||||||
|
m_overlayRenderer.Shutdown();
|
||||||
|
m_selectionOutlineRenderer.Shutdown();
|
||||||
|
m_gridRenderer.Shutdown();
|
||||||
|
}
|
||||||
|
|
||||||
|
SceneViewportRenderPlanBuildResult SceneViewportRenderPassBundle::BuildRenderPlan(
|
||||||
|
const ViewportRenderTargets& targets,
|
||||||
|
const SceneViewportOverlayData& overlay,
|
||||||
|
const std::vector<uint64_t>& selectedObjectIds,
|
||||||
|
const SceneViewportOverlayFrameData& editorOverlayFrameData,
|
||||||
|
bool debugSelectionMask) {
|
||||||
|
return BuildSceneViewportRenderPlan(
|
||||||
|
targets,
|
||||||
|
overlay,
|
||||||
|
selectedObjectIds,
|
||||||
|
editorOverlayFrameData,
|
||||||
|
[this](const SceneViewportGridPassData& data) {
|
||||||
|
return CreateSceneViewportGridPass(m_gridRenderer, data);
|
||||||
|
},
|
||||||
|
[this](
|
||||||
|
RHI::RHIResourceView* objectIdTextureView,
|
||||||
|
const std::vector<uint64_t>& selectionIds,
|
||||||
|
const SceneViewportSelectionOutlineStyle& style) {
|
||||||
|
return CreateSceneViewportSelectionOutlinePass(
|
||||||
|
m_selectionOutlineRenderer,
|
||||||
|
objectIdTextureView,
|
||||||
|
selectionIds,
|
||||||
|
style);
|
||||||
|
},
|
||||||
|
[this](const SceneViewportOverlayFrameData& frameData) {
|
||||||
|
return CreateSceneViewportEditorOverlayPass(m_overlayRenderer, frameData);
|
||||||
|
},
|
||||||
|
debugSelectionMask);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace Editor
|
||||||
|
} // namespace XCEngine
|
||||||
31
editor/src/Viewport/SceneViewportRenderPassBundle.h
Normal file
31
editor/src/Viewport/SceneViewportRenderPassBundle.h
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "Passes/SceneViewportEditorOverlayPass.h"
|
||||||
|
#include "Passes/SceneViewportGridPass.h"
|
||||||
|
#include "Passes/SceneViewportSelectionOutlinePass.h"
|
||||||
|
#include "SceneViewportRenderPlan.h"
|
||||||
|
|
||||||
|
namespace XCEngine {
|
||||||
|
namespace Editor {
|
||||||
|
|
||||||
|
class SceneViewportRenderPassBundle {
|
||||||
|
public:
|
||||||
|
~SceneViewportRenderPassBundle() = default;
|
||||||
|
|
||||||
|
void Shutdown();
|
||||||
|
|
||||||
|
SceneViewportRenderPlanBuildResult BuildRenderPlan(
|
||||||
|
const ViewportRenderTargets& targets,
|
||||||
|
const SceneViewportOverlayData& overlay,
|
||||||
|
const std::vector<uint64_t>& selectedObjectIds,
|
||||||
|
const SceneViewportOverlayFrameData& editorOverlayFrameData,
|
||||||
|
bool debugSelectionMask = false);
|
||||||
|
|
||||||
|
private:
|
||||||
|
SceneViewportGridPassRenderer m_gridRenderer;
|
||||||
|
SceneViewportSelectionOutlinePassRenderer m_selectionOutlineRenderer;
|
||||||
|
SceneViewportEditorOverlayPassRenderer m_overlayRenderer;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace Editor
|
||||||
|
} // namespace XCEngine
|
||||||
@@ -4,14 +4,12 @@
|
|||||||
#include "Core/ISceneManager.h"
|
#include "Core/ISceneManager.h"
|
||||||
#include "Core/ISelectionManager.h"
|
#include "Core/ISelectionManager.h"
|
||||||
#include "IViewportHostService.h"
|
#include "IViewportHostService.h"
|
||||||
#include "Passes/SceneViewportEditorOverlayPass.h"
|
|
||||||
#include "Passes/SceneViewportGridPass.h"
|
|
||||||
#include "Passes/SceneViewportSelectionOutlinePass.h"
|
|
||||||
#include "SceneViewportCameraController.h"
|
#include "SceneViewportCameraController.h"
|
||||||
#include "SceneViewportEditorOverlayData.h"
|
#include "SceneViewportEditorOverlayData.h"
|
||||||
#include "SceneViewportOverlayFrameCache.h"
|
#include "SceneViewportOverlayFrameCache.h"
|
||||||
#include "SceneViewportOverlayHandleBuilder.h"
|
#include "SceneViewportOverlayHandleBuilder.h"
|
||||||
#include "SceneViewportOverlayBuilder.h"
|
#include "SceneViewportOverlayBuilder.h"
|
||||||
|
#include "SceneViewportRenderPassBundle.h"
|
||||||
#include "SceneViewportRenderPlan.h"
|
#include "SceneViewportRenderPlan.h"
|
||||||
#include "ViewportHostRenderFlowUtils.h"
|
#include "ViewportHostRenderFlowUtils.h"
|
||||||
#include "ViewportHostRenderTargets.h"
|
#include "ViewportHostRenderTargets.h"
|
||||||
@@ -78,9 +76,7 @@ public:
|
|||||||
entry = {};
|
entry = {};
|
||||||
}
|
}
|
||||||
|
|
||||||
m_sceneViewportSelectionOutlineRenderer.Shutdown();
|
m_sceneViewportRenderPassBundle.Shutdown();
|
||||||
m_sceneViewportGridRenderer.Shutdown();
|
|
||||||
m_sceneViewportEditorOverlayRenderer.Shutdown();
|
|
||||||
m_sceneViewCamera = {};
|
m_sceneViewCamera = {};
|
||||||
ResetSceneViewportOverlayFrameCacheState(m_sceneViewEditorOverlayFrameCache);
|
ResetSceneViewportOverlayFrameCacheState(m_sceneViewEditorOverlayFrameCache);
|
||||||
m_sceneViewTransformGizmoOverlayState = {};
|
m_sceneViewTransformGizmoOverlayState = {};
|
||||||
@@ -507,31 +503,11 @@ private:
|
|||||||
const SceneViewportOverlayFrameData& editorOverlayFrameData =
|
const SceneViewportOverlayFrameData& editorOverlayFrameData =
|
||||||
GetSceneViewEditorOverlayFrameData(context);
|
GetSceneViewEditorOverlayFrameData(context);
|
||||||
SceneViewportRenderPlanBuildResult renderPlan =
|
SceneViewportRenderPlanBuildResult renderPlan =
|
||||||
BuildSceneViewportRenderPlan(
|
m_sceneViewportRenderPassBundle.BuildRenderPlan(
|
||||||
entry.renderTargets,
|
entry.renderTargets,
|
||||||
outState.overlay,
|
outState.overlay,
|
||||||
selectedObjectIds,
|
selectedObjectIds,
|
||||||
editorOverlayFrameData,
|
editorOverlayFrameData,
|
||||||
[this](const SceneViewportGridPassData& data) {
|
|
||||||
return CreateSceneViewportGridPass(
|
|
||||||
m_sceneViewportGridRenderer,
|
|
||||||
data);
|
|
||||||
},
|
|
||||||
[this](
|
|
||||||
RHI::RHIResourceView* objectIdTextureView,
|
|
||||||
const std::vector<uint64_t>& selectedObjectIds,
|
|
||||||
const SceneViewportSelectionOutlineStyle& style) {
|
|
||||||
return CreateSceneViewportSelectionOutlinePass(
|
|
||||||
m_sceneViewportSelectionOutlineRenderer,
|
|
||||||
objectIdTextureView,
|
|
||||||
selectedObjectIds,
|
|
||||||
style);
|
|
||||||
},
|
|
||||||
[this](const SceneViewportOverlayFrameData& frameData) {
|
|
||||||
return CreateSceneViewportEditorOverlayPass(
|
|
||||||
m_sceneViewportEditorOverlayRenderer,
|
|
||||||
frameData);
|
|
||||||
},
|
|
||||||
kDebugSceneSelectionMask);
|
kDebugSceneSelectionMask);
|
||||||
outState.renderPlan = std::move(renderPlan.plan);
|
outState.renderPlan = std::move(renderPlan.plan);
|
||||||
if (renderPlan.warningStatusText != nullptr) {
|
if (renderPlan.warningStatusText != nullptr) {
|
||||||
@@ -732,9 +708,7 @@ private:
|
|||||||
SceneViewportTransformGizmoOverlayState m_sceneViewTransformGizmoOverlayState = {};
|
SceneViewportTransformGizmoOverlayState m_sceneViewTransformGizmoOverlayState = {};
|
||||||
SceneViewportOverlayFrameCacheState m_sceneViewEditorOverlayFrameCache = {};
|
SceneViewportOverlayFrameCacheState m_sceneViewEditorOverlayFrameCache = {};
|
||||||
bool m_sceneViewTransformGizmoOverlayDirty = false;
|
bool m_sceneViewTransformGizmoOverlayDirty = false;
|
||||||
SceneViewportGridPassRenderer m_sceneViewportGridRenderer;
|
SceneViewportRenderPassBundle m_sceneViewportRenderPassBundle;
|
||||||
SceneViewportSelectionOutlinePassRenderer m_sceneViewportSelectionOutlineRenderer;
|
|
||||||
SceneViewportEditorOverlayPassRenderer m_sceneViewportEditorOverlayRenderer;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Editor
|
} // namespace Editor
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ set(EDITOR_TEST_SOURCES
|
|||||||
test_scene_viewport_transform_gizmo_coordinator.cpp
|
test_scene_viewport_transform_gizmo_coordinator.cpp
|
||||||
test_scene_viewport_shader_paths.cpp
|
test_scene_viewport_shader_paths.cpp
|
||||||
test_scene_viewport_overlay_frame_cache.cpp
|
test_scene_viewport_overlay_frame_cache.cpp
|
||||||
|
test_scene_viewport_render_pass_bundle.cpp
|
||||||
test_scene_viewport_overlay_sprite_resources.cpp
|
test_scene_viewport_overlay_sprite_resources.cpp
|
||||||
test_scene_viewport_overlay_renderer.cpp
|
test_scene_viewport_overlay_renderer.cpp
|
||||||
test_scene_viewport_overlay_providers.cpp
|
test_scene_viewport_overlay_providers.cpp
|
||||||
@@ -52,8 +53,12 @@ set(EDITOR_TEST_SOURCES
|
|||||||
${CMAKE_SOURCE_DIR}/editor/src/Viewport/SceneViewportOrientationGizmo.cpp
|
${CMAKE_SOURCE_DIR}/editor/src/Viewport/SceneViewportOrientationGizmo.cpp
|
||||||
${CMAKE_SOURCE_DIR}/editor/src/Viewport/SceneViewportOverlayBuilder.cpp
|
${CMAKE_SOURCE_DIR}/editor/src/Viewport/SceneViewportOverlayBuilder.cpp
|
||||||
${CMAKE_SOURCE_DIR}/editor/src/Viewport/SceneViewportOverlayFrameCache.cpp
|
${CMAKE_SOURCE_DIR}/editor/src/Viewport/SceneViewportOverlayFrameCache.cpp
|
||||||
|
${CMAKE_SOURCE_DIR}/editor/src/Viewport/SceneViewportRenderPassBundle.cpp
|
||||||
${CMAKE_SOURCE_DIR}/editor/src/Viewport/SceneViewportOverlaySpriteResources.cpp
|
${CMAKE_SOURCE_DIR}/editor/src/Viewport/SceneViewportOverlaySpriteResources.cpp
|
||||||
${CMAKE_SOURCE_DIR}/editor/src/Viewport/SceneViewportOverlayProviders.cpp
|
${CMAKE_SOURCE_DIR}/editor/src/Viewport/SceneViewportOverlayProviders.cpp
|
||||||
|
${CMAKE_SOURCE_DIR}/editor/src/Viewport/Passes/SceneViewportGridPass.cpp
|
||||||
|
${CMAKE_SOURCE_DIR}/editor/src/Viewport/Passes/SceneViewportSelectionOutlinePass.cpp
|
||||||
|
${CMAKE_SOURCE_DIR}/editor/src/Viewport/Passes/SceneViewportEditorOverlayPass.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
if(XCENGINE_ENABLE_MONO_SCRIPTING AND TARGET xcengine_managed_assemblies)
|
if(XCENGINE_ENABLE_MONO_SCRIPTING AND TARGET xcengine_managed_assemblies)
|
||||||
@@ -82,6 +87,7 @@ target_link_libraries(editor_tests PRIVATE
|
|||||||
target_include_directories(editor_tests PRIVATE
|
target_include_directories(editor_tests PRIVATE
|
||||||
${CMAKE_SOURCE_DIR}/engine/include
|
${CMAKE_SOURCE_DIR}/engine/include
|
||||||
${CMAKE_SOURCE_DIR}/editor/src
|
${CMAKE_SOURCE_DIR}/editor/src
|
||||||
|
${CMAKE_SOURCE_DIR}/editor/src/Viewport
|
||||||
${CMAKE_BINARY_DIR}/_deps/imgui-src
|
${CMAKE_BINARY_DIR}/_deps/imgui-src
|
||||||
${CMAKE_BINARY_DIR}/_deps/imgui-src/backends
|
${CMAKE_BINARY_DIR}/_deps/imgui-src/backends
|
||||||
)
|
)
|
||||||
|
|||||||
119
tests/editor/test_scene_viewport_render_pass_bundle.cpp
Normal file
119
tests/editor/test_scene_viewport_render_pass_bundle.cpp
Normal file
@@ -0,0 +1,119 @@
|
|||||||
|
#include <gtest/gtest.h>
|
||||||
|
|
||||||
|
#include "Viewport/SceneViewportEditorOverlayData.h"
|
||||||
|
#include "Viewport/SceneViewportRenderPassBundle.h"
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
using XCEngine::Editor::SceneViewportOverlayData;
|
||||||
|
using XCEngine::Editor::SceneViewportOverlayFrameData;
|
||||||
|
using XCEngine::Editor::SceneViewportOverlayLinePrimitive;
|
||||||
|
using XCEngine::Editor::SceneViewportRenderPassBundle;
|
||||||
|
using XCEngine::Editor::ViewportRenderTargets;
|
||||||
|
using XCEngine::RHI::Format;
|
||||||
|
using XCEngine::RHI::RHIResourceView;
|
||||||
|
using XCEngine::RHI::ResourceViewDimension;
|
||||||
|
using XCEngine::RHI::ResourceViewType;
|
||||||
|
|
||||||
|
class DummyResourceView final : public RHIResourceView {
|
||||||
|
public:
|
||||||
|
explicit DummyResourceView(
|
||||||
|
ResourceViewType viewType = ResourceViewType::RenderTarget,
|
||||||
|
Format format = Format::R8G8B8A8_UNorm)
|
||||||
|
: m_viewType(viewType)
|
||||||
|
, m_format(format) {
|
||||||
|
}
|
||||||
|
|
||||||
|
void Shutdown() override {
|
||||||
|
}
|
||||||
|
|
||||||
|
void* GetNativeHandle() override {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool IsValid() const override {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
ResourceViewType GetViewType() const override {
|
||||||
|
return m_viewType;
|
||||||
|
}
|
||||||
|
|
||||||
|
ResourceViewDimension GetDimension() const override {
|
||||||
|
return ResourceViewDimension::Texture2D;
|
||||||
|
}
|
||||||
|
|
||||||
|
Format GetFormat() const override {
|
||||||
|
return m_format;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
ResourceViewType m_viewType = ResourceViewType::RenderTarget;
|
||||||
|
Format m_format = Format::R8G8B8A8_UNorm;
|
||||||
|
};
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
SceneViewportOverlayFrameData CreateOverlayFrameDataWithLine(const SceneViewportOverlayData& overlay) {
|
||||||
|
SceneViewportOverlayFrameData frameData = {};
|
||||||
|
frameData.overlay = overlay;
|
||||||
|
|
||||||
|
SceneViewportOverlayLinePrimitive& line = frameData.worldLines.emplace_back();
|
||||||
|
line.startWorld = XCEngine::Math::Vector3::Zero();
|
||||||
|
line.endWorld = XCEngine::Math::Vector3::Right();
|
||||||
|
line.color = XCEngine::Math::Color::White();
|
||||||
|
return frameData;
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(SceneViewportRenderPassBundleTest, BuildRenderPlanCreatesGridOutlineAndOverlayPasses) {
|
||||||
|
DummyResourceView objectIdShaderView(ResourceViewType::ShaderResource);
|
||||||
|
|
||||||
|
ViewportRenderTargets targets = {};
|
||||||
|
targets.objectIdShaderView = &objectIdShaderView;
|
||||||
|
|
||||||
|
const SceneViewportOverlayData overlay = CreateValidOverlay();
|
||||||
|
const SceneViewportOverlayFrameData editorOverlayFrameData =
|
||||||
|
CreateOverlayFrameDataWithLine(overlay);
|
||||||
|
|
||||||
|
SceneViewportRenderPassBundle bundle;
|
||||||
|
const auto result = bundle.BuildRenderPlan(
|
||||||
|
targets,
|
||||||
|
overlay,
|
||||||
|
{ 7u, 11u },
|
||||||
|
editorOverlayFrameData,
|
||||||
|
false);
|
||||||
|
|
||||||
|
EXPECT_EQ(result.plan.postScenePasses.GetPassCount(), 2u);
|
||||||
|
EXPECT_EQ(result.plan.overlayPasses.GetPassCount(), 1u);
|
||||||
|
EXPECT_EQ(result.warningStatusText, nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(SceneViewportRenderPassBundleTest, BuildRenderPlanReportsMissingObjectIdShaderView) {
|
||||||
|
const SceneViewportOverlayData overlay = CreateValidOverlay();
|
||||||
|
|
||||||
|
SceneViewportRenderPassBundle bundle;
|
||||||
|
const auto result = bundle.BuildRenderPlan(
|
||||||
|
{},
|
||||||
|
overlay,
|
||||||
|
{ 42u },
|
||||||
|
{},
|
||||||
|
false);
|
||||||
|
|
||||||
|
EXPECT_EQ(result.plan.postScenePasses.GetPassCount(), 1u);
|
||||||
|
EXPECT_EQ(result.plan.overlayPasses.GetPassCount(), 0u);
|
||||||
|
EXPECT_STREQ(result.warningStatusText, "Scene object id shader view is unavailable");
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace
|
||||||
Reference in New Issue
Block a user