Files
XCEngine/editor/src/Viewport/Passes/SceneViewportSelectionOutlinePass.cpp

102 lines
3.0 KiB
C++
Raw Normal View History

#include "Passes/SceneViewportSelectionOutlinePass.h"
2026-04-09 05:16:04 +08:00
#include "Viewport/ViewportHostRenderTargets.h"
namespace XCEngine {
namespace Editor {
namespace {
class SceneViewportSelectionOutlinePass final : public Rendering::RenderPass {
public:
SceneViewportSelectionOutlinePass(
SceneViewportSelectionOutlinePassRenderer& renderer,
2026-04-09 05:16:04 +08:00
ViewportRenderTargets* targets,
std::vector<uint64_t> selectedObjectIds,
const SceneViewportSelectionOutlineStyle& style)
: m_renderer(renderer)
2026-04-09 05:16:04 +08:00
, m_targets(targets)
, m_selectedObjectIds(std::move(selectedObjectIds))
, m_style(style) {
}
const char* GetName() const override {
return "SceneViewportSelectionOutline";
}
bool Execute(const Rendering::RenderPassContext& context) override {
return m_renderer.Render(
context.renderContext,
context.surface,
2026-04-09 05:16:04 +08:00
context.sceneData,
*m_targets,
m_selectedObjectIds,
m_style);
}
private:
SceneViewportSelectionOutlinePassRenderer& m_renderer;
2026-04-09 05:16:04 +08:00
ViewportRenderTargets* m_targets = nullptr;
std::vector<uint64_t> m_selectedObjectIds = {};
SceneViewportSelectionOutlineStyle m_style = {};
};
} // namespace
SceneViewportSelectionOutlinePassRenderer::SceneViewportSelectionOutlinePassRenderer()
2026-04-09 05:16:04 +08:00
: m_selectionMaskPass()
, m_outlinePass() {
}
void SceneViewportSelectionOutlinePassRenderer::Shutdown() {
2026-04-09 05:16:04 +08:00
m_selectionMaskPass.Shutdown();
m_outlinePass.Shutdown();
}
bool SceneViewportSelectionOutlinePassRenderer::Render(
const Rendering::RenderContext& renderContext,
const Rendering::RenderSurface& surface,
2026-04-09 05:16:04 +08:00
const Rendering::RenderSceneData& sceneData,
ViewportRenderTargets& targets,
const std::vector<uint64_t>& selectedObjectIds,
const SceneViewportSelectionOutlineStyle& style) {
2026-04-09 05:16:04 +08:00
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,
{
targets.selectionMaskShaderView,
targets.selectionMaskState,
targets.depthShaderView,
surface.GetDepthStateAfter()
},
ToBuiltinSceneViewportSelectionOutlineStyle(style));
}
std::unique_ptr<Rendering::RenderPass> CreateSceneViewportSelectionOutlinePass(
SceneViewportSelectionOutlinePassRenderer& renderer,
2026-04-09 05:16:04 +08:00
ViewportRenderTargets* targets,
const std::vector<uint64_t>& selectedObjectIds,
const SceneViewportSelectionOutlineStyle& style) {
return std::make_unique<SceneViewportSelectionOutlinePass>(
renderer,
2026-04-09 05:16:04 +08:00
targets,
selectedObjectIds,
style);
}
} // namespace Editor
} // namespace XCEngine