Extract editor-owned scene viewport pass specs

This commit is contained in:
2026-04-04 16:29:06 +08:00
parent 1a236b866d
commit 9f8ab921bc
8 changed files with 87 additions and 24 deletions

View File

@@ -11,7 +11,7 @@ class SceneViewportGridPass final : public Rendering::RenderPass {
public: public:
SceneViewportGridPass( SceneViewportGridPass(
SceneViewportGridPassRenderer& renderer, SceneViewportGridPassRenderer& renderer,
const Rendering::Passes::InfiniteGridPassData& data) const SceneViewportGridPassData& data)
: m_renderer(renderer) : m_renderer(renderer)
, m_data(data) { , m_data(data) {
} }
@@ -29,7 +29,7 @@ public:
private: private:
SceneViewportGridPassRenderer& m_renderer; SceneViewportGridPassRenderer& m_renderer;
Rendering::Passes::InfiniteGridPassData m_data = {}; SceneViewportGridPassData m_data = {};
}; };
} // namespace } // namespace
@@ -45,13 +45,16 @@ void SceneViewportGridPassRenderer::Shutdown() {
bool SceneViewportGridPassRenderer::Render( bool SceneViewportGridPassRenderer::Render(
const Rendering::RenderContext& renderContext, const Rendering::RenderContext& renderContext,
const Rendering::RenderSurface& surface, const Rendering::RenderSurface& surface,
const Rendering::Passes::InfiniteGridPassData& data) { const SceneViewportGridPassData& data) {
return m_gridPass.Render(renderContext, surface, data); return m_gridPass.Render(
renderContext,
surface,
ToBuiltinSceneViewportGridPassData(data));
} }
std::unique_ptr<Rendering::RenderPass> CreateSceneViewportGridPass( std::unique_ptr<Rendering::RenderPass> CreateSceneViewportGridPass(
SceneViewportGridPassRenderer& renderer, SceneViewportGridPassRenderer& renderer,
const Rendering::Passes::InfiniteGridPassData& data) { const SceneViewportGridPassData& data) {
return std::make_unique<SceneViewportGridPass>(renderer, data); return std::make_unique<SceneViewportGridPass>(renderer, data);
} }

View File

@@ -1,5 +1,7 @@
#pragma once #pragma once
#include "Viewport/SceneViewportPassSpecs.h"
#include <XCEngine/Rendering/Passes/BuiltinInfiniteGridPass.h> #include <XCEngine/Rendering/Passes/BuiltinInfiniteGridPass.h>
#include <XCEngine/Rendering/RenderContext.h> #include <XCEngine/Rendering/RenderContext.h>
#include <XCEngine/Rendering/RenderPass.h> #include <XCEngine/Rendering/RenderPass.h>
@@ -20,7 +22,7 @@ public:
bool Render( bool Render(
const Rendering::RenderContext& renderContext, const Rendering::RenderContext& renderContext,
const Rendering::RenderSurface& surface, const Rendering::RenderSurface& surface,
const Rendering::Passes::InfiniteGridPassData& data); const SceneViewportGridPassData& data);
private: private:
Rendering::Passes::BuiltinInfiniteGridPass m_gridPass; Rendering::Passes::BuiltinInfiniteGridPass m_gridPass;
@@ -28,7 +30,7 @@ private:
std::unique_ptr<Rendering::RenderPass> CreateSceneViewportGridPass( std::unique_ptr<Rendering::RenderPass> CreateSceneViewportGridPass(
SceneViewportGridPassRenderer& renderer, SceneViewportGridPassRenderer& renderer,
const Rendering::Passes::InfiniteGridPassData& data); const SceneViewportGridPassData& data);
} // namespace Editor } // namespace Editor
} // namespace XCEngine } // namespace XCEngine

View File

@@ -1,3 +1,5 @@
#include <XCEngine/Core/Asset/ResourceManager.h>
#include "Passes/SceneViewportSelectionOutlinePass.h" #include "Passes/SceneViewportSelectionOutlinePass.h"
#include "Viewport/SceneViewportShaderPaths.h" #include "Viewport/SceneViewportShaderPaths.h"
@@ -13,7 +15,7 @@ public:
SceneViewportSelectionOutlinePassRenderer& renderer, SceneViewportSelectionOutlinePassRenderer& renderer,
RHI::RHIResourceView* objectIdTextureView, RHI::RHIResourceView* objectIdTextureView,
std::vector<uint64_t> selectedObjectIds, std::vector<uint64_t> selectedObjectIds,
const Rendering::Passes::ObjectIdOutlineStyle& style) const SceneViewportSelectionOutlineStyle& style)
: m_renderer(renderer) : m_renderer(renderer)
, m_objectIdTextureView(objectIdTextureView) , m_objectIdTextureView(objectIdTextureView)
, m_selectedObjectIds(std::move(selectedObjectIds)) , m_selectedObjectIds(std::move(selectedObjectIds))
@@ -37,7 +39,7 @@ private:
SceneViewportSelectionOutlinePassRenderer& m_renderer; SceneViewportSelectionOutlinePassRenderer& m_renderer;
RHI::RHIResourceView* m_objectIdTextureView = nullptr; RHI::RHIResourceView* m_objectIdTextureView = nullptr;
std::vector<uint64_t> m_selectedObjectIds = {}; std::vector<uint64_t> m_selectedObjectIds = {};
Rendering::Passes::ObjectIdOutlineStyle m_style = {}; SceneViewportSelectionOutlineStyle m_style = {};
}; };
} // namespace } // namespace
@@ -55,20 +57,20 @@ bool SceneViewportSelectionOutlinePassRenderer::Render(
const Rendering::RenderSurface& surface, const Rendering::RenderSurface& surface,
RHI::RHIResourceView* objectIdTextureView, RHI::RHIResourceView* objectIdTextureView,
const std::vector<uint64_t>& selectedObjectIds, const std::vector<uint64_t>& selectedObjectIds,
const Rendering::Passes::ObjectIdOutlineStyle& style) { const SceneViewportSelectionOutlineStyle& style) {
return m_outlinePass.Render( return m_outlinePass.Render(
renderContext, renderContext,
surface, surface,
objectIdTextureView, objectIdTextureView,
selectedObjectIds, selectedObjectIds,
style); ToBuiltinSceneViewportSelectionOutlineStyle(style));
} }
std::unique_ptr<Rendering::RenderPass> CreateSceneViewportSelectionOutlinePass( std::unique_ptr<Rendering::RenderPass> CreateSceneViewportSelectionOutlinePass(
SceneViewportSelectionOutlinePassRenderer& renderer, SceneViewportSelectionOutlinePassRenderer& renderer,
RHI::RHIResourceView* objectIdTextureView, RHI::RHIResourceView* objectIdTextureView,
const std::vector<uint64_t>& selectedObjectIds, const std::vector<uint64_t>& selectedObjectIds,
const Rendering::Passes::ObjectIdOutlineStyle& style) { const SceneViewportSelectionOutlineStyle& style) {
return std::make_unique<SceneViewportSelectionOutlinePass>( return std::make_unique<SceneViewportSelectionOutlinePass>(
renderer, renderer,
objectIdTextureView, objectIdTextureView,

View File

@@ -1,5 +1,7 @@
#pragma once #pragma once
#include "Viewport/SceneViewportPassSpecs.h"
#include <XCEngine/Rendering/Passes/BuiltinObjectIdOutlinePass.h> #include <XCEngine/Rendering/Passes/BuiltinObjectIdOutlinePass.h>
#include <XCEngine/Rendering/RenderContext.h> #include <XCEngine/Rendering/RenderContext.h>
#include <XCEngine/Rendering/RenderPass.h> #include <XCEngine/Rendering/RenderPass.h>
@@ -24,7 +26,7 @@ public:
const Rendering::RenderSurface& surface, const Rendering::RenderSurface& surface,
RHI::RHIResourceView* objectIdTextureView, RHI::RHIResourceView* objectIdTextureView,
const std::vector<uint64_t>& selectedObjectIds, const std::vector<uint64_t>& selectedObjectIds,
const Rendering::Passes::ObjectIdOutlineStyle& style); const SceneViewportSelectionOutlineStyle& style);
private: private:
Rendering::Passes::BuiltinObjectIdOutlinePass m_outlinePass; Rendering::Passes::BuiltinObjectIdOutlinePass m_outlinePass;
@@ -34,7 +36,7 @@ std::unique_ptr<Rendering::RenderPass> CreateSceneViewportSelectionOutlinePass(
SceneViewportSelectionOutlinePassRenderer& renderer, SceneViewportSelectionOutlinePassRenderer& renderer,
RHI::RHIResourceView* objectIdTextureView, RHI::RHIResourceView* objectIdTextureView,
const std::vector<uint64_t>& selectedObjectIds, const std::vector<uint64_t>& selectedObjectIds,
const Rendering::Passes::ObjectIdOutlineStyle& style); const SceneViewportSelectionOutlineStyle& style);
} // namespace Editor } // namespace Editor
} // namespace XCEngine } // namespace XCEngine

View File

@@ -0,0 +1,54 @@
#pragma once
#include <XCEngine/Core/Math/Color.h>
#include <XCEngine/Core/Math/Vector3.h>
#include <XCEngine/Rendering/Passes/BuiltinInfiniteGridPass.h>
#include <XCEngine/Rendering/Passes/BuiltinObjectIdOutlinePass.h>
namespace XCEngine {
namespace Editor {
struct SceneViewportGridPassData {
bool valid = false;
Math::Vector3 cameraPosition = Math::Vector3::Zero();
Math::Vector3 cameraForward = Math::Vector3::Forward();
Math::Vector3 cameraRight = Math::Vector3::Right();
Math::Vector3 cameraUp = Math::Vector3::Up();
float verticalFovDegrees = 60.0f;
float nearClipPlane = 0.03f;
float farClipPlane = 2000.0f;
float orbitDistance = 6.0f;
};
inline Rendering::Passes::InfiniteGridPassData ToBuiltinSceneViewportGridPassData(
const SceneViewportGridPassData& data) {
Rendering::Passes::InfiniteGridPassData builtinData = {};
builtinData.valid = data.valid;
builtinData.cameraPosition = data.cameraPosition;
builtinData.cameraForward = data.cameraForward;
builtinData.cameraRight = data.cameraRight;
builtinData.cameraUp = data.cameraUp;
builtinData.verticalFovDegrees = data.verticalFovDegrees;
builtinData.nearClipPlane = data.nearClipPlane;
builtinData.farClipPlane = data.farClipPlane;
builtinData.orbitDistance = data.orbitDistance;
return builtinData;
}
struct SceneViewportSelectionOutlineStyle {
Math::Color outlineColor = Math::Color(1.0f, 0.4f, 0.0f, 1.0f);
float outlineWidthPixels = 2.0f;
bool debugSelectionMask = false;
};
inline Rendering::Passes::ObjectIdOutlineStyle ToBuiltinSceneViewportSelectionOutlineStyle(
const SceneViewportSelectionOutlineStyle& style) {
Rendering::Passes::ObjectIdOutlineStyle builtinStyle = {};
builtinStyle.outlineColor = style.outlineColor;
builtinStyle.outlineWidthPixels = style.outlineWidthPixels;
builtinStyle.debugSelectionMask = style.debugSelectionMask;
return builtinStyle;
}
} // namespace Editor
} // namespace XCEngine

View File

@@ -35,11 +35,11 @@ struct SceneViewportRenderPlan {
using SceneViewportOverlayPassFactory = using SceneViewportOverlayPassFactory =
std::function<std::unique_ptr<Rendering::RenderPass>(const SceneViewportOverlayFrameData&)>; std::function<std::unique_ptr<Rendering::RenderPass>(const SceneViewportOverlayFrameData&)>;
using SceneViewportGridPassFactory = using SceneViewportGridPassFactory =
std::function<std::unique_ptr<Rendering::RenderPass>(const Rendering::Passes::InfiniteGridPassData&)>; std::function<std::unique_ptr<Rendering::RenderPass>(const SceneViewportGridPassData&)>;
using SceneViewportSelectionOutlinePassFactory = std::function<std::unique_ptr<Rendering::RenderPass>( using SceneViewportSelectionOutlinePassFactory = std::function<std::unique_ptr<Rendering::RenderPass>(
RHI::RHIResourceView*, RHI::RHIResourceView*,
const std::vector<uint64_t>&, const std::vector<uint64_t>&,
const Rendering::Passes::ObjectIdOutlineStyle&)>; const SceneViewportSelectionOutlineStyle&)>;
struct SceneViewportRenderPlanBuildResult { struct SceneViewportRenderPlanBuildResult {
SceneViewportRenderPlan plan = {}; SceneViewportRenderPlan plan = {};
@@ -60,7 +60,7 @@ inline SceneViewportRenderPlanBuildResult BuildSceneViewportRenderPlan(
return result; return result;
} }
const Rendering::Passes::InfiniteGridPassData gridPassData = BuildSceneViewportGridPassData(overlay); const SceneViewportGridPassData gridPassData = BuildSceneViewportGridPassData(overlay);
if (gridPassData.valid && gridPassFactory != nullptr) { if (gridPassData.valid && gridPassFactory != nullptr) {
std::unique_ptr<Rendering::RenderPass> gridPass = gridPassFactory(gridPassData); std::unique_ptr<Rendering::RenderPass> gridPass = gridPassFactory(gridPassData);
if (gridPass != nullptr) { if (gridPass != nullptr) {

View File

@@ -1,10 +1,10 @@
#pragma once #pragma once
#include "IViewportHostService.h" #include "IViewportHostService.h"
#include "SceneViewportPassSpecs.h"
#include "ViewportHostRenderTargets.h" #include "ViewportHostRenderTargets.h"
#include <XCEngine/Core/Math/Color.h> #include <XCEngine/Core/Math/Color.h>
#include <XCEngine/Rendering/Passes/BuiltinInfiniteGridPass.h>
#include <XCEngine/Rendering/CameraRenderRequest.h> #include <XCEngine/Rendering/CameraRenderRequest.h>
#include <string> #include <string>
@@ -115,9 +115,9 @@ inline ViewportRenderFallbackPolicy BuildGameViewportRenderFailurePolicy(
return policy; return policy;
} }
inline Rendering::Passes::InfiniteGridPassData BuildSceneViewportGridPassData( inline SceneViewportGridPassData BuildSceneViewportGridPassData(
const SceneViewportOverlayData& overlay) { const SceneViewportOverlayData& overlay) {
Rendering::Passes::InfiniteGridPassData data = {}; SceneViewportGridPassData data = {};
data.valid = overlay.valid; data.valid = overlay.valid;
data.cameraPosition = overlay.cameraPosition; data.cameraPosition = overlay.cameraPosition;
data.cameraForward = overlay.cameraForward; data.cameraForward = overlay.cameraForward;
@@ -130,9 +130,9 @@ inline Rendering::Passes::InfiniteGridPassData BuildSceneViewportGridPassData(
return data; return data;
} }
inline Rendering::Passes::ObjectIdOutlineStyle BuildSceneViewportSelectionOutlineStyle( inline SceneViewportSelectionOutlineStyle BuildSceneViewportSelectionOutlineStyle(
bool debugSelectionMask = false) { bool debugSelectionMask = false) {
Rendering::Passes::ObjectIdOutlineStyle style = {}; SceneViewportSelectionOutlineStyle style = {};
style.outlineColor = Math::Color(1.0f, 0.4f, 0.0f, 1.0f); style.outlineColor = Math::Color(1.0f, 0.4f, 0.0f, 1.0f);
style.outlineWidthPixels = 2.0f; style.outlineWidthPixels = 2.0f;
style.debugSelectionMask = debugSelectionMask; style.debugSelectionMask = debugSelectionMask;

View File

@@ -644,7 +644,7 @@ private:
outState.overlay, outState.overlay,
selectedObjectIds, selectedObjectIds,
editorOverlayFrameData, editorOverlayFrameData,
[this](const Rendering::Passes::InfiniteGridPassData& data) { [this](const SceneViewportGridPassData& data) {
return CreateSceneViewportGridPass( return CreateSceneViewportGridPass(
m_sceneViewportGridRenderer, m_sceneViewportGridRenderer,
data); data);
@@ -652,7 +652,7 @@ private:
[this]( [this](
RHI::RHIResourceView* objectIdTextureView, RHI::RHIResourceView* objectIdTextureView,
const std::vector<uint64_t>& selectedObjectIds, const std::vector<uint64_t>& selectedObjectIds,
const Rendering::Passes::ObjectIdOutlineStyle& style) { const SceneViewportSelectionOutlineStyle& style) {
return CreateSceneViewportSelectionOutlinePass( return CreateSceneViewportSelectionOutlinePass(
m_sceneViewportSelectionOutlineRenderer, m_sceneViewportSelectionOutlineRenderer,
objectIdTextureView, objectIdTextureView,