28 template <
typename T,
typename = std::enable_if_t<std::is_convertible_v<T*, Subrender*>>>
31 return subrenders_.count(std::type_index(
typeid(T))) != 0;
34 template <
typename T,
typename = std::enable_if_t<std::is_convertible_v<T*, Subrender*>>>
37 auto it = subrenders_.find(std::type_index(
typeid(T)));
38 return (it != subrenders_.end()) ?
static_cast<T*
>(it->second.get()) :
nullptr;
41 template <
typename T,
typename = std::enable_if_t<std::is_convertible_v<T*, Subrender*>>>
44 const auto typeId = std::type_index(
typeid(T));
45 stages_.emplace(StageIndex(stage, subrenders_.size()), typeId);
46 subrenders_[typeId] = std::move(subrender);
47 return static_cast<T*
>(subrenders_[typeId].get());
50 template <
typename T,
typename = std::enable_if_t<std::is_convertible_v<T*, Subrender*>>>
53 const auto typeId = std::type_index(
typeid(T));
54 RemoveSubrenderStage(typeId);
55 subrenders_.erase(typeId);
65 using StageIndex = std::pair<Pipeline::Stage, std::size_t>;
67 void RemoveSubrenderStage(std::type_index
id)
69 for (
auto it = stages_.begin(); it != stages_.end();)
73 it = stages_.erase(it);
84 for (
auto const& [stageIdx, typeId] : stages_)
86 if (stageIdx.first != stage)
91 auto& sr = subrenders_[typeId];
92 if (sr && sr->IsEnabled())
94 sr->Render(commandBuffer);
99 std::unordered_map<std::type_index, std::unique_ptr<Subrender>> subrenders_;
100 std::multimap<StageIndex, std::type_index> stages_;