Fix scene selection outline mask path

This commit is contained in:
2026-04-09 05:16:04 +08:00
parent c48311eaaf
commit 2084412010
29 changed files with 1250 additions and 56 deletions

View File

@@ -1,5 +1,7 @@
#include "Passes/SceneViewportSelectionOutlinePass.h"
#include "Viewport/ViewportHostRenderTargets.h"
namespace XCEngine {
namespace Editor {
@@ -9,11 +11,11 @@ class SceneViewportSelectionOutlinePass final : public Rendering::RenderPass {
public:
SceneViewportSelectionOutlinePass(
SceneViewportSelectionOutlinePassRenderer& renderer,
RHI::RHIResourceView* objectIdTextureView,
ViewportRenderTargets* targets,
std::vector<uint64_t> selectedObjectIds,
const SceneViewportSelectionOutlineStyle& style)
: m_renderer(renderer)
, m_objectIdTextureView(objectIdTextureView)
, m_targets(targets)
, m_selectedObjectIds(std::move(selectedObjectIds))
, m_style(style) {
}
@@ -26,14 +28,15 @@ public:
return m_renderer.Render(
context.renderContext,
context.surface,
m_objectIdTextureView,
context.sceneData,
*m_targets,
m_selectedObjectIds,
m_style);
}
private:
SceneViewportSelectionOutlinePassRenderer& m_renderer;
RHI::RHIResourceView* m_objectIdTextureView = nullptr;
ViewportRenderTargets* m_targets = nullptr;
std::vector<uint64_t> m_selectedObjectIds = {};
SceneViewportSelectionOutlineStyle m_style = {};
};
@@ -41,35 +44,51 @@ private:
} // namespace
SceneViewportSelectionOutlinePassRenderer::SceneViewportSelectionOutlinePassRenderer()
: m_outlinePass() {
: m_selectionMaskPass()
, m_outlinePass() {
}
void SceneViewportSelectionOutlinePassRenderer::Shutdown() {
m_selectionMaskPass.Shutdown();
m_outlinePass.Shutdown();
}
bool SceneViewportSelectionOutlinePassRenderer::Render(
const Rendering::RenderContext& renderContext,
const Rendering::RenderSurface& surface,
RHI::RHIResourceView* objectIdTextureView,
const Rendering::RenderSceneData& sceneData,
ViewportRenderTargets& targets,
const std::vector<uint64_t>& selectedObjectIds,
const SceneViewportSelectionOutlineStyle& style) {
Rendering::RenderSurface selectionMaskSurface = BuildViewportSelectionMaskSurface(targets);
selectionMaskSurface.SetRenderArea(surface.GetRenderArea());
if (!m_selectionMaskPass.Render(
renderContext,
selectionMaskSurface,
sceneData,
selectedObjectIds)) {
return false;
}
targets.selectionMaskState = RHI::ResourceStates::PixelShaderResource;
return m_outlinePass.Render(
renderContext,
surface,
objectIdTextureView,
selectedObjectIds,
targets.selectionMaskShaderView,
targets.depthShaderView,
ToBuiltinSceneViewportSelectionOutlineStyle(style));
}
std::unique_ptr<Rendering::RenderPass> CreateSceneViewportSelectionOutlinePass(
SceneViewportSelectionOutlinePassRenderer& renderer,
RHI::RHIResourceView* objectIdTextureView,
ViewportRenderTargets* targets,
const std::vector<uint64_t>& selectedObjectIds,
const SceneViewportSelectionOutlineStyle& style) {
return std::make_unique<SceneViewportSelectionOutlinePass>(
renderer,
objectIdTextureView,
targets,
selectedObjectIds,
style);
}