17 friend class Graphics;
20 SubrenderHolder() =
default;
21 ~SubrenderHolder() =
default;
23 SubrenderHolder(
const SubrenderHolder&) =
delete;
24 SubrenderHolder& operator=(
const SubrenderHolder&) =
delete;
25 SubrenderHolder(SubrenderHolder&&)
noexcept =
default;
26 SubrenderHolder& operator=(SubrenderHolder&&)
noexcept =
default;
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*>>>
42 T* Add(
const Subrender::Stage& stage, std::unique_ptr<T>&& subrender)
44 const auto type_id = std::type_index(
typeid(T));
45 stages_.emplace(StageIndex(stage, subrenders_.size()), type_id);
46 subrenders_[type_id] = std::move(subrender);
47 return static_cast<T*
>(subrenders_[type_id].get());
50 template <
typename T,
typename = std::enable_if_t<std::is_convertible_v<T*, Subrender*>>>
53 const auto type_id = std::type_index(
typeid(T));
54 RemoveSubrenderStage(type_id);
55 subrenders_.erase(type_id);
65 friend class GraphicsState;
66 friend class RendererRuntimeAccess;
68 using StageIndex = std::pair<Subrender::Stage, std::size_t>;
70 void RemoveSubrenderStage(std::type_index
id)
72 for (
auto it = stages_.begin(); it != stages_.end();)
76 it = stages_.erase(it);
85 void RenderStage(
const Subrender::Stage& stage,
const RenderFrameContext& frame_context)
87 for (
auto const& [stage_idx, type_id] : stages_)
89 if (stage_idx.first != stage)
94 auto& subrender = subrenders_[type_id];
95 if (subrender && subrender->IsEnabled())
97 subrender->Render(frame_context);
102 std::unordered_map<std::type_index, std::unique_ptr<Subrender>> subrenders_;
103 std::multimap<StageIndex, std::type_index> stages_;
Definition render_frame_context.h:15