#include "Rendering/Passes/BuiltinSelectionMaskPass.h" #include "Components/GameObject.h" #include "Resources/BuiltinResources.h" #include #include #include namespace XCEngine { namespace Rendering { namespace Passes { BuiltinSelectionMaskPass::BuiltinSelectionMaskPass() : BuiltinDepthStylePassBase( BuiltinMaterialPass::SelectionMask, Resources::GetBuiltinSelectionMaskShaderPath()) { } RHI::InputLayoutDesc BuiltinSelectionMaskPass::BuildInputLayout() { return BuildCommonInputLayout(); } const char* BuiltinSelectionMaskPass::GetName() const { return "BuiltinSelectionMaskPass"; } bool BuiltinSelectionMaskPass::Render( const RenderContext& context, const RenderSurface& surface, const RenderSceneData& sceneData, const std::vector& selectedObjectIds) { m_selectedObjectIds.clear(); m_selectedObjectIds.reserve(selectedObjectIds.size()); for (uint64_t selectedObjectId : selectedObjectIds) { RenderObjectId renderObjectId = kInvalidRenderObjectId; if (TryConvertRuntimeObjectIdToRenderObjectId(selectedObjectId, renderObjectId)) { m_selectedObjectIds.push_back(renderObjectId); } } if (m_selectedObjectIds.empty()) { return false; } RenderSceneData selectionMaskSceneData = sceneData; selectionMaskSceneData.cameraData.clearFlags = RenderClearFlags::Color; selectionMaskSceneData.cameraData.clearColor = Math::Color::Black(); const RenderPassContext passContext = { context, surface, selectionMaskSceneData, nullptr, nullptr, RHI::ResourceStates::Common }; return Execute(passContext); } bool BuiltinSelectionMaskPass::ShouldRenderVisibleItem(const VisibleRenderItem& visibleItem) const { if (!IsValidRenderObjectId(visibleItem.renderObjectId)) { return false; } return std::find(m_selectedObjectIds.begin(), m_selectedObjectIds.end(), visibleItem.renderObjectId) != m_selectedObjectIds.end(); } } // namespace Passes } // namespace Rendering } // namespace XCEngine