2026-04-03 14:26:36 +08:00
|
|
|
#include "Passes/SceneViewportSelectionOutlinePass.h"
|
|
|
|
|
|
2026-04-09 05:16:04 +08:00
|
|
|
#include "Viewport/ViewportHostRenderTargets.h"
|
|
|
|
|
|
2026-04-03 14:26:36 +08:00
|
|
|
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,
|
2026-04-03 14:26:36 +08:00
|
|
|
std::vector<uint64_t> selectedObjectIds,
|
2026-04-04 16:29:06 +08:00
|
|
|
const SceneViewportSelectionOutlineStyle& style)
|
2026-04-03 14:26:36 +08:00
|
|
|
: m_renderer(renderer)
|
2026-04-09 05:16:04 +08:00
|
|
|
, m_targets(targets)
|
2026-04-03 14:26:36 +08:00
|
|
|
, 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,
|
2026-04-03 14:26:36 +08:00
|
|
|
m_selectedObjectIds,
|
|
|
|
|
m_style);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
SceneViewportSelectionOutlinePassRenderer& m_renderer;
|
2026-04-09 05:16:04 +08:00
|
|
|
ViewportRenderTargets* m_targets = nullptr;
|
2026-04-03 14:26:36 +08:00
|
|
|
std::vector<uint64_t> m_selectedObjectIds = {};
|
2026-04-04 16:29:06 +08:00
|
|
|
SceneViewportSelectionOutlineStyle m_style = {};
|
2026-04-03 14:26:36 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
} // namespace
|
|
|
|
|
|
2026-04-03 15:43:21 +08:00
|
|
|
SceneViewportSelectionOutlinePassRenderer::SceneViewportSelectionOutlinePassRenderer()
|
2026-04-09 05:16:04 +08:00
|
|
|
: m_selectionMaskPass()
|
|
|
|
|
, m_outlinePass() {
|
2026-04-03 15:43:21 +08:00
|
|
|
}
|
|
|
|
|
|
2026-04-03 14:26:36 +08:00
|
|
|
void SceneViewportSelectionOutlinePassRenderer::Shutdown() {
|
2026-04-09 05:16:04 +08:00
|
|
|
m_selectionMaskPass.Shutdown();
|
2026-04-03 14:26:36 +08:00
|
|
|
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,
|
2026-04-03 14:26:36 +08:00
|
|
|
const std::vector<uint64_t>& selectedObjectIds,
|
2026-04-04 16:29:06 +08:00
|
|
|
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;
|
|
|
|
|
|
2026-04-03 14:26:36 +08:00
|
|
|
return m_outlinePass.Render(
|
|
|
|
|
renderContext,
|
|
|
|
|
surface,
|
2026-04-11 22:14:02 +08:00
|
|
|
{
|
|
|
|
|
targets.selectionMaskShaderView,
|
|
|
|
|
targets.selectionMaskState,
|
|
|
|
|
targets.depthShaderView,
|
|
|
|
|
surface.GetDepthStateAfter()
|
|
|
|
|
},
|
2026-04-04 16:29:06 +08:00
|
|
|
ToBuiltinSceneViewportSelectionOutlineStyle(style));
|
2026-04-03 14:26:36 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
std::unique_ptr<Rendering::RenderPass> CreateSceneViewportSelectionOutlinePass(
|
|
|
|
|
SceneViewportSelectionOutlinePassRenderer& renderer,
|
2026-04-09 05:16:04 +08:00
|
|
|
ViewportRenderTargets* targets,
|
2026-04-03 14:26:36 +08:00
|
|
|
const std::vector<uint64_t>& selectedObjectIds,
|
2026-04-04 16:29:06 +08:00
|
|
|
const SceneViewportSelectionOutlineStyle& style) {
|
2026-04-03 14:26:36 +08:00
|
|
|
return std::make_unique<SceneViewportSelectionOutlinePass>(
|
|
|
|
|
renderer,
|
2026-04-09 05:16:04 +08:00
|
|
|
targets,
|
2026-04-03 14:26:36 +08:00
|
|
|
selectedObjectIds,
|
|
|
|
|
style);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
} // namespace Editor
|
|
|
|
|
} // namespace XCEngine
|