74 lines
2.2 KiB
C++
74 lines
2.2 KiB
C++
#include "Rendering/Passes/BuiltinSelectionMaskPass.h"
|
|
|
|
#include "Components/GameObject.h"
|
|
#include "Resources/BuiltinResources.h"
|
|
|
|
#include <XCEngine/Rendering/FrameData/RenderSceneData.h>
|
|
#include <XCEngine/Rendering/FrameData/VisibleRenderItem.h>
|
|
|
|
#include <algorithm>
|
|
|
|
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<uint64_t>& 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
|