Shkyera Engine
Easy to use, game engine for Python
Loading...
Searching...
No Matches
RegistryViewer.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <Common/TypeInfo.hpp>
4#include <Common/Types.hpp>
6#include <ECS/Registry.hpp>
8#include <optional>
9#include <utility>
10
11namespace shkyera {
12
13template <typename... Resources>
22
23template <typename... Resources>
32
33struct Policy {
37
39 : read(std::move(readSet)), write(std::move(writeSet)), onlyMainThread(mainThread) {}
40
41 template <typename Type>
42 bool canRead() const {
43 return read.contains(TypeInfo<Type>::ID) || write.contains(TypeInfo<Type>::ID);
44 }
45 template <typename Type>
46 bool canWrite() const {
47 return write.contains(TypeInfo<Type>::ID);
48 }
49};
50
52 public:
53 template <typename... Resources>
55 : _registry(std::move(registry)), _policy(std::move(read.resources), {}, read.onlyMainThread) {}
56
57 template <typename... Resources>
59 : _registry(std::move(registry)), _policy({}, std::move(read.resources), read.onlyMainThread) {}
60
61 template <typename... ReadResources, typename... WriteResources>
65 _policy(std::move(read.resources), std::move(write.resources), read.onlyMainThread || write.onlyMainThread) {}
66
67 const Policy& getPolicy() const { return _policy; }
68
69 template <typename Component, typename... Args>
71 SHKYERA_ASSERT(_policy.canWrite<Component>(), "Cannot write {}. Policy does not allow it",
72 typeid(Component).name());
73
74 return _registry->addComponent<Component>(entity, std::forward<Args>(args)...);
75 }
76
77 template <typename Component>
78 void clear() {
79 SHKYERA_ASSERT(_policy.canWrite<Component>(), "Cannot write {}. Policy does not allow it",
80 typeid(Component).name());
81
82 return _registry->clearComponents<Component>();
83 }
84
85 template <typename Component>
86 bool has(Entity entity) const {
87 SHKYERA_ASSERT(_policy.canRead<Component>(), "Cannot write {}. Policy does not allow it", typeid(Component).name());
88
89 return _registry->hasComponent<Component>(entity);
90 }
91
92 template <typename Component>
94 SHKYERA_ASSERT(_policy.canWrite<Component>(), "Cannot write {}. Policy does not allow it",
95 typeid(Component).name());
96
97 return _registry->getComponent<Component>(entity);
98 }
99
100 template <typename Component>
101 const Component& read(Entity entity) const {
102 SHKYERA_ASSERT(_policy.canRead<Component>(), "Cannot read {}. Policy does not allow it", typeid(Component).name());
103
104 return _registry->getComponent<Component>(entity);
105 }
106
107 template <NonSingletonComponentType Component>
108 const auto& read() const {
109 SHKYERA_ASSERT(_policy.canRead<Component>(), "Cannot read {}. Policy does not allow it", typeid(Component).name());
110
111 return _registry->getComponents<Component>();
112 }
113
114 template <SingletonComponentType Component>
115 const auto* read() const {
116 SHKYERA_ASSERT(_policy.canRead<Component>(), "Cannot read {}. Policy does not allow it", typeid(Component).name());
117
118 return _registry->getComponent<Component>();
119 }
120
121 template <NonSingletonComponentType Component>
122 auto& write() {
123 SHKYERA_ASSERT(_policy.canWrite<Component>(), "Cannot write {}. Policy does not allow it",
124 typeid(Component).name());
125
126 return _registry->getComponents<Component>();
127 }
128
129 template <SingletonComponentType Component>
130 auto* write() {
131 SHKYERA_ASSERT(_policy.canRead<Component>(), "Cannot write {}. Policy does not allow it", typeid(Component).name());
132
133 return _registry->getComponent<Component>();
134 }
135
136 template <SingletonComponentType Component>
137 std::optional<Entity> getEntity() const {
138 return _registry->getEntity<Component>();
139 }
140
141 const std::optional<Entity> getParent(Entity entity) const {
142 SHKYERA_ASSERT(_policy.canRead<EntityHierarchy>(), "Cannot get parent of {}. Policy does not allow it",
143 typeid(EntityHierarchy).name());
144
145 return _registry->getHierarchy().getParent(entity);
146 }
147
148 template <typename Component>
150 SHKYERA_ASSERT(_policy.canWrite<Component>(), "Cannot write {}. Policy does not allow it",
151 typeid(Component).name());
152
153 return _registry->getComponentSet<Component>();
154 }
155
156 template <typename Component>
158 SHKYERA_ASSERT(_policy.canRead<Component>(), "Cannot write {}. Policy does not allow it", typeid(Component).name());
159
160 return _registry->getComponentSet<Component>();
161 }
162
163 private:
164 std::shared_ptr<Registry> _registry;
166};
167
168} // namespace shkyera
#define SHKYERA_ASSERT(predicate,...)
Definition Assert.hpp:7
Definition EntityHierarchy.hpp:20
Definition RegistryViewer.hpp:51
Policy _policy
Definition RegistryViewer.hpp:165
RegistryViewer(std::shared_ptr< Registry > registry, ReadAccess< Resources... > read)
Definition RegistryViewer.hpp:54
void clear()
Definition RegistryViewer.hpp:78
Component & write(Entity entity)
Definition RegistryViewer.hpp:93
const std::optional< Entity > getParent(Entity entity) const
Definition RegistryViewer.hpp:141
const Component & read(Entity entity) const
Definition RegistryViewer.hpp:101
bool has(Entity entity) const
Definition RegistryViewer.hpp:86
auto & write()
Definition RegistryViewer.hpp:122
auto * write()
Definition RegistryViewer.hpp:130
RegistryViewer(std::shared_ptr< Registry > registry, WriteAccess< Resources... > read)
Definition RegistryViewer.hpp:58
Component & add(Entity entity, Args &&... args)
Definition RegistryViewer.hpp:70
const auto & read() const
Definition RegistryViewer.hpp:108
SparseSet< Component > & writeAll()
Definition RegistryViewer.hpp:149
const Policy & getPolicy() const
Definition RegistryViewer.hpp:67
std::optional< Entity > getEntity() const
Definition RegistryViewer.hpp:137
RegistryViewer(std::shared_ptr< Registry > registry, ReadAccess< ReadResources... > read, WriteAccess< WriteResources... > write)
Definition RegistryViewer.hpp:62
std::shared_ptr< Registry > _registry
Definition RegistryViewer.hpp:164
const auto * read() const
Definition RegistryViewer.hpp:115
const SparseSet< Component > & readAll() const
Definition RegistryViewer.hpp:157
Definition Asset.hpp:6
std::set< TypeID > TypeSet
Definition TypeInfo.hpp:28
Definition Mesh.cpp:16
Definition Clock.hpp:9
Definition RegistryViewer.hpp:33
bool onlyMainThread
Definition RegistryViewer.hpp:36
TypeSet write
Definition RegistryViewer.hpp:35
TypeSet read
Definition RegistryViewer.hpp:34
bool canRead() const
Definition RegistryViewer.hpp:42
Policy(TypeSet readSet, TypeSet writeSet, bool mainThread)
Definition RegistryViewer.hpp:38
bool canWrite() const
Definition RegistryViewer.hpp:46
Definition RegistryViewer.hpp:14
bool onlyMainThread
Definition RegistryViewer.hpp:20
ReadAccess()
Definition RegistryViewer.hpp:15
TypeSet resources
Definition RegistryViewer.hpp:19
Definition TypeInfo.hpp:22
Definition RegistryViewer.hpp:24
TypeSet resources
Definition RegistryViewer.hpp:29
WriteAccess()
Definition RegistryViewer.hpp:25
bool onlyMainThread
Definition RegistryViewer.hpp:30