PixelBullet  0.0.1
A C++ game engine
Loading...
Searching...
No Matches
subrender_holder.h
1#pragma once
2
3#include "pixelbullet/graphics/pipelines/pipeline.h"
4#include "pixelbullet/graphics/subrender.h"
5
6#include <map>
7#include <typeindex>
8#include <unordered_map>
9
10namespace pixelbullet
11{
16{
17 friend class Graphics;
18
19public:
20 SubrenderHolder() = default;
21 ~SubrenderHolder() = default;
22
23 SubrenderHolder(const SubrenderHolder&) = delete;
24 SubrenderHolder& operator=(const SubrenderHolder&) = delete;
25 SubrenderHolder(SubrenderHolder&&) noexcept = default;
26 SubrenderHolder& operator=(SubrenderHolder&&) noexcept = default;
27
28 template <typename T, typename = std::enable_if_t<std::is_convertible_v<T*, Subrender*>>>
29 bool Has() const
30 {
31 return subrenders_.count(std::type_index(typeid(T))) != 0;
32 }
33
34 template <typename T, typename = std::enable_if_t<std::is_convertible_v<T*, Subrender*>>>
35 T* Get() const
36 {
37 auto it = subrenders_.find(std::type_index(typeid(T)));
38 return (it != subrenders_.end()) ? static_cast<T*>(it->second.get()) : nullptr;
39 }
40
41 template <typename T, typename = std::enable_if_t<std::is_convertible_v<T*, Subrender*>>>
42 T* Add(const Pipeline::Stage& stage, std::unique_ptr<T>&& subrender)
43 {
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());
48 }
49
50 template <typename T, typename = std::enable_if_t<std::is_convertible_v<T*, Subrender*>>>
51 void Remove()
52 {
53 const auto typeId = std::type_index(typeid(T));
54 RemoveSubrenderStage(typeId);
55 subrenders_.erase(typeId);
56 }
57
58 void Clear()
59 {
60 stages_.clear();
61 subrenders_.clear();
62 }
63
64private:
65 using StageIndex = std::pair<Pipeline::Stage, std::size_t>;
66
67 void RemoveSubrenderStage(std::type_index id)
68 {
69 for (auto it = stages_.begin(); it != stages_.end();)
70 {
71 if (it->second == id)
72 {
73 it = stages_.erase(it);
74 }
75 else
76 {
77 ++it;
78 }
79 }
80 }
81
82 void RenderStage(const Pipeline::Stage& stage, const CommandBuffer& commandBuffer)
83 {
84 for (auto const& [stageIdx, typeId] : stages_)
85 {
86 if (stageIdx.first != stage)
87 {
88 continue;
89 }
90
91 auto& sr = subrenders_[typeId];
92 if (sr && sr->IsEnabled())
93 {
94 sr->Render(commandBuffer);
95 }
96 }
97 }
98
99 std::unordered_map<std::type_index, std::unique_ptr<Subrender>> subrenders_;
100 std::multimap<StageIndex, std::type_index> stages_;
101};
102} // namespace pixelbullet
Class that represents a command buffer.
Definition command_buffer.h:16
Module that manages the Vulkan instance_, Surface, Window and the renderpass structure.
Definition graphics.h:35
std::pair< uint32_t, uint32_t > Stage
Definition pipeline.h:20
Definition render_stage.h:209
Manages all registered Subrender instances by stage.
Definition subrender_holder.h:16