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

View File

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

View File

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

View File

@@ -1,5 +1,7 @@
#pragma once
#include "Viewport/SceneViewportPassSpecs.h"
#include <XCEngine/Rendering/Passes/BuiltinObjectIdOutlinePass.h>
#include <XCEngine/Rendering/RenderContext.h>
#include <XCEngine/Rendering/RenderPass.h>
@@ -24,7 +26,7 @@ public:
const Rendering::RenderSurface& surface,
RHI::RHIResourceView* objectIdTextureView,
const std::vector<uint64_t>& selectedObjectIds,
const Rendering::Passes::ObjectIdOutlineStyle& style);
const SceneViewportSelectionOutlineStyle& style);
private:
Rendering::Passes::BuiltinObjectIdOutlinePass m_outlinePass;
@@ -34,7 +36,7 @@ std::unique_ptr<Rendering::RenderPass> CreateSceneViewportSelectionOutlinePass(
SceneViewportSelectionOutlinePassRenderer& renderer,
RHI::RHIResourceView* objectIdTextureView,
const std::vector<uint64_t>& selectedObjectIds,
const Rendering::Passes::ObjectIdOutlineStyle& style);
const SceneViewportSelectionOutlineStyle& style);
} // namespace Editor
} // 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 =
std::function<std::unique_ptr<Rendering::RenderPass>(const SceneViewportOverlayFrameData&)>;
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>(
RHI::RHIResourceView*,
const std::vector<uint64_t>&,
const Rendering::Passes::ObjectIdOutlineStyle&)>;
const SceneViewportSelectionOutlineStyle&)>;
struct SceneViewportRenderPlanBuildResult {
SceneViewportRenderPlan plan = {};
@@ -60,7 +60,7 @@ inline SceneViewportRenderPlanBuildResult BuildSceneViewportRenderPlan(
return result;
}
const Rendering::Passes::InfiniteGridPassData gridPassData = BuildSceneViewportGridPassData(overlay);
const SceneViewportGridPassData gridPassData = BuildSceneViewportGridPassData(overlay);
if (gridPassData.valid && gridPassFactory != nullptr) {
std::unique_ptr<Rendering::RenderPass> gridPass = gridPassFactory(gridPassData);
if (gridPass != nullptr) {

View File

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

View File

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