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