refactor: route scene view passes through camera renderer

This commit is contained in:
2026-04-02 12:47:06 +08:00
parent 0d3851204f
commit 697deb4e41
6 changed files with 107 additions and 29 deletions

View File

@@ -114,15 +114,23 @@ inline ViewportRenderFallbackPolicy BuildGameViewportRenderFailurePolicy(
inline void ApplySceneViewportRenderRequestSetup(
const ViewportRenderTargets& targets,
const Rendering::BuiltinSceneViewPostProcessRequest* builtinSceneViewPostProcess,
Rendering::RenderPassSequence* postPasses,
Rendering::CameraRenderRequest& request) {
request.postScenePasses = nullptr;
request.objectId = {};
request.builtinSceneViewPostProcess = {};
if (postPasses != nullptr && postPasses->GetPassCount() > 0) {
request.postScenePasses = postPasses;
}
if (builtinSceneViewPostProcess != nullptr &&
builtinSceneViewPostProcess->IsRequested()) {
request.builtinSceneViewPostProcess = *builtinSceneViewPostProcess;
request.builtinSceneViewPostProcess.objectIdTextureView = targets.objectIdShaderView;
}
if (targets.objectIdView == nullptr) {
return;
}

View File

@@ -19,7 +19,6 @@
#include <XCEngine/RHI/RHIResourceView.h>
#include <XCEngine/RHI/RHITexture.h>
#include <XCEngine/Rendering/Passes/BuiltinInfiniteGridPass.h>
#include <XCEngine/Rendering/Passes/BuiltinSceneViewPostPassSequenceBuilder.h>
#include <XCEngine/Rendering/RenderContext.h>
#include <XCEngine/Rendering/RenderSurface.h>
#include <XCEngine/Rendering/SceneRenderer.h>
@@ -92,7 +91,6 @@ public:
m_sceneViewLastRenderContext = {};
m_device = nullptr;
m_backend = nullptr;
m_sceneViewPostPassBuilder.Shutdown();
m_sceneRenderer.reset();
}
@@ -280,7 +278,7 @@ private:
struct SceneViewportRenderState {
SceneViewportOverlayData overlay = {};
Rendering::RenderPassSequence postPasses;
Rendering::BuiltinSceneViewPostProcessRequest builtinSceneViewPostProcess = {};
std::vector<uint64_t> selectedObjectIds;
};
@@ -412,32 +410,28 @@ private:
policy.clearColor.a);
}
bool BuildSceneViewPostPassSequence(
void BuildSceneViewBuiltinPostProcessRequest(
ViewportEntry& entry,
const SceneViewportOverlayData& overlay,
const std::vector<uint64_t>& selectedObjectIds,
Rendering::RenderPassSequence& outPostPasses) {
Rendering::Passes::ObjectIdOutlineStyle outlineStyle = {};
outlineStyle.outlineColor = Math::Color(1.0f, 0.4f, 0.0f, 1.0f);
outlineStyle.outlineWidthPixels = 2.0f;
outlineStyle.debugSelectionMask = kDebugSceneSelectionMask;
const Rendering::Passes::BuiltinSceneViewPostPassSequenceBuildResult result =
m_sceneViewPostPassBuilder.Build(
{
BuildInfiniteGridPassData(overlay),
entry.renderTargets.objectIdShaderView,
selectedObjectIds,
outlineStyle
},
outPostPasses);
if (result.missingObjectIdTextureViewForSelection &&
!kDebugSceneSelectionMask) {
SetViewportStatusIfEmpty(entry.statusText, "Scene object id shader view is unavailable");
Rendering::BuiltinSceneViewPostProcessRequest& outRequest) {
if (!overlay.valid) {
outRequest = {};
return;
}
return result.valid;
outRequest.gridPassData = BuildInfiniteGridPassData(overlay);
outRequest.selectedObjectIds = selectedObjectIds;
outRequest.outlineStyle = {};
outRequest.outlineStyle.outlineColor = Math::Color(1.0f, 0.4f, 0.0f, 1.0f);
outRequest.outlineStyle.outlineWidthPixels = 2.0f;
outRequest.outlineStyle.debugSelectionMask = kDebugSceneSelectionMask;
if (!selectedObjectIds.empty() &&
!kDebugSceneSelectionMask &&
entry.renderTargets.objectIdShaderView == nullptr) {
SetViewportStatusIfEmpty(entry.statusText, "Scene object id shader view is unavailable");
}
}
void BuildSceneViewportRenderState(
@@ -452,12 +446,11 @@ private:
}
outState.selectedObjectIds = context.GetSelectionManager().GetSelectedEntities();
BuildSceneViewPostPassSequence(
BuildSceneViewBuiltinPostProcessRequest(
entry,
outState.overlay,
outState.selectedObjectIds,
outState.postPasses);
outState.builtinSceneViewPostProcess);
}
bool RenderSceneViewportEntry(
@@ -502,7 +495,8 @@ private:
ApplySceneViewportRenderRequestSetup(
entry.renderTargets,
&sceneState.postPasses,
&sceneState.builtinSceneViewPostProcess,
nullptr,
requests[0]);
requests[0].hasClearColorOverride = true;
requests[0].clearColorOverride = Math::Color(0.27f, 0.27f, 0.27f, 1.0f);
@@ -657,7 +651,6 @@ private:
Rendering::RenderContext m_sceneViewLastRenderContext = {};
std::array<ViewportEntry, 2> m_entries = {};
SceneViewCameraState m_sceneViewCamera;
Rendering::Passes::BuiltinSceneViewPostPassSequenceBuilder m_sceneViewPostPassBuilder;
};
} // namespace Editor