SDEngine
Game Engine
Loading...
Searching...
No Matches
EntityManager.inl
Go to the documentation of this file.
1#pragma once
2template<typename... Components>
3ViewImpl<Components...>::ViewImpl(EntityManager& manager) : m_manager(manager) {
4 usize min_size = std::numeric_limits<usize>::max();
5
7}
8template<typename... Components>
10 const std::vector<Entity>* dense_entities, usize idx) :
11 manager(em), entities(dense_entities), index(idx) {
12 if (entities && index < entities->size() && !is_valid()) {
13 next();
14 }
15}
16template<typename... Components>
18 next();
19 return *this;
20}
21template<typename... Components>
23 Entity current_entity = (*entities)[index];
24 return std::tuple_cat(std::make_tuple(current_entity),
25 manager.get_component_group<Components...>(current_entity));
26}
27template<typename... Components>
29 if (!entities)
30 return;
31 do {
32 index++;
33 } while (index < entities->size() && !is_valid());
34}
35template<typename... Components>
37 if (!entities)
38 return false;
39 Entity current_entity = (*entities)[index];
40 return (manager.has_component<Components>(current_entity) && ...);
41}
42template<typename... Components>
44 if (!m_smallest_pool) {
45 log::engine::warn(
46 "View has no valid component pools - scene may be empty or missing components");
47 return end();
48 }
50}
51template<typename... Components>
53 if (!m_smallest_pool) {
54 return Iterator(m_manager, nullptr, 0);
55 }
57}
58template<typename... Components>
59template<typename Component>
62 minSize = 0;
63 m_smallest_pool = nullptr;
64 return;
65 }
66
68 if (pool->size() < minSize) {
69 minSize = pool->size();
70 m_smallest_pool = &pool->get_dense_entities();
71 }
72}
73
74
75template<typename T, typename... Args>
78 "Error: Component type is not registered, register it");
80
81
82 if (type_id >= m_component_pools.size())
83 m_component_pools.resize(type_id + 1);
84 if (!m_component_pools[type_id])
85 m_component_pools[type_id] = std::make_unique<SparseEntitySet<T>>(); // TODO: arena here
86
87 // add data
88 if (m_entity_masks[e]->test(type_id)) {
89 log::engine::warn("Overwriting already existing component: {}, id: {} ",
91 }
92 auto* pool = static_cast<SparseEntitySet<T>*>(m_component_pools[type_id].get());
93 m_entity_masks[e]->set(type_id);
94 pool->add(e, std::forward<Args>(args)...);
95
96 return pool->get(e);
97}
98template<typename T>
101 "Error: Component type is not registered, register it");
102
104 if (type_id >= m_component_pools.size() || !m_component_pools[type_id] ||
105 !m_entity_masks[e]->test(type_id))
106 return nullptr;
107
108 auto* pool = static_cast<SparseEntitySet<T>*>(m_component_pools[type_id].get());
109 return pool->get(e);
110}
111template<typename T>
114 assert(has_component<T>(e) && "Entity doesnt have component");
115
116 auto* pool = static_cast<SparseEntitySet<T>*>(m_component_pools[typeId].get());
117 return *pool->get(e);
118}
119template<typename T>
122 assert(has_component<T>(e) && "Entity doesnt have component");
123
124 auto* pool = static_cast<const SparseEntitySet<T>*>(m_component_pools[type_id].get());
125 return *pool->get(e);
126}
127
128template<typename T>
131 "Error: Can't remove component type that isn't registered");
132
134 if (type_id >= m_component_pools.size() || !m_component_pools[type_id] ||
135 !m_entity_masks[e]->test(type_id))
136 return false;
137
138 auto* pool = static_cast<SparseEntitySet<T>*>(m_component_pools[type_id].get());
139 pool->remove(e);
140 m_entity_masks[e]->reset(type_id);
141 return true;
142}
143
144
145template<typename... Args>
147 if constexpr (sizeof...(Args) == 1) {
148 using T = std::tuple_element_t<0, std::tuple<Args...>>;
149 if constexpr (UnpackGroup<T>::is_group) {
150 return typename UnpackGroup<T>::type(*this);
151 } else {
152 return ViewImpl<T>(*this);
153 }
154 } else {
155 return ViewImpl<Args...>(*this);
156 }
157}
158template<typename T>
160 if (e.index >= m_entity_masks.get_dense_entities().size())
161 return false;
162
163 if (!is_alive(e))
164 return false;
165
166 auto mask = m_entity_masks.get(e);
167 return mask && mask->test(ComponentTraits<T>::id);
168}
169template<typename... Components>
171 return std::forward_as_tuple(get_component<Components>(e)...);
172}
173template<typename... Components>
175 return std::forward_as_tuple(*get_component<Components>(e)...);
176}
177template<typename T>
179 static_assert(ComponentTraits<T>::s_is_registered != false, "Unregistered Component");
181 if (type_id >= m_component_pools.size() || !m_component_pools[type_id])
182 return nullptr;
183
184 return static_cast<SparseEntitySet<T>*>(m_component_pools[type_id].get());
185}
186template<typename T>
188 static_assert(ComponentTraits<T>::s_is_registered != false, "Unregistered Component");
190 return type_id < m_component_pools.size() && m_component_pools[type_id];
191}
193 const uint32_t idx = m_free_list.empty() ? m_generations.size() : pop_free_list();
194
195 if (idx >= m_generations.size()) {
196 m_generations.resize(idx + 1, 0);
197 }
198 Entity e = {idx, m_generations[idx]};
199
200 m_entity_masks.add(e, ComponentMask{});
201#ifndef NDEBUG
202 ValidateInvariants();
203#endif
204 return e;
205}
206inline void EntityManager::destroy(const Entity e) {
207 if (!is_alive(e))
208 return;
209
210
211 // TODO: Ranges?
212 ComponentMask* mask = m_entity_masks[e];
213 assert(mask);
214
215 for (usize i = 0; i < mask->size(); ++i) {
216 if (mask->test(i)) {
217 if (m_component_pools[i])
218 m_component_pools[i]->remove(e);
219 }
220 }
221 mask->reset();
222 m_generations[e.index]++;
223 m_free_list.push_back(e.index);
224#ifndef NDEBUG
225 ValidateInvariants();
226#endif
227}
228inline std::vector<ComponentDebugInfo> EntityManager::get_all_component_info(Entity e) const {
229 std::vector<ComponentDebugInfo> components;
230 if (!is_alive(e))
231 return {};
232 for (auto& pool : m_component_pools) {
233 if (!pool)
234 continue;
235
236 if (auto info = pool->get_debug_info(e)) {
237 components.push_back(info.value()); // arena
238 }
239 }
240 return components;
241}
242inline bool EntityManager::is_alive(const Entity e) const {
243 return e.index < m_generations.size() && m_generations[e.index] == e.generation;
244}
246 const auto idx = m_free_list.back();
247 m_free_list.pop_back();
248 return idx;
249}
250
252 s.write(m_generations);
253 s.write(m_free_list);
254
255 // Serialize entity masks - only serialize alive entities
256 const auto& mask_entities = m_entity_masks.get_dense_entities();
257 u32 aliveCount = 0;
258 for (Entity e : mask_entities) {
259 if (is_alive(e))
260 aliveCount++;
261 }
262 s.write(aliveCount);
263
264 for (Entity e : mask_entities) {
265 if (!is_alive(e))
266 continue;
267
268 s.write(e.index);
269 s.write(e.generation);
270 const ComponentMask* mask = m_entity_masks.get(e);
271 // Pack 256-bit mask into 4 x u64 values (instead of 256 x u64)
272 if (mask) {
273 for (usize word = 0; word < 4; ++word) {
274 u64 packed = 0;
275 for (usize bit = 0; bit < 64; ++bit) {
276 if (mask->test(word * 64 + bit)) {
277 packed |= (u64(1) << bit);
278 }
279 }
280 s.write(packed);
281 }
282 } else {
283 for (usize i = 0; i < 4; ++i) {
284 s.write(static_cast<u64>(0));
285 }
286 }
287 }
288
289 // Serialize component pools - only registered serializable ones
291 for (u32 i = 0; i < m_component_pools.size(); ++i) {
292 if (m_component_pools[i] && sd::ComponentFactory::is_registered(i)) {
294 }
295 }
296 s.write(serializable_count);
297
298 for (u32 i = 0; i < m_component_pools.size(); ++i) {
299 if (m_component_pools[i] && sd::ComponentFactory::is_registered(i)) {
300 s.write(i); // component type ID
301 m_component_pools[i]->serialize(s);
302 }
303 }
304}
305
307 s.read(m_generations);
308 s.read(m_free_list);
309
310 // Deserialize alive entity masks
311 u32 maskCount = s.read<u32>();
312 for (u32 i = 0; i < maskCount; ++i) {
313 u32 index = s.read<u32>();
314 u32 generation = s.read<u32>();
315 Entity e{index, generation};
316 m_entity_masks.add(e, ComponentMask{});
317 ComponentMask* mask = m_entity_masks.get(e);
318 // Read 4 x u64 values and unpack to 256-bit mask
319 if (mask) {
320 for (usize word = 0; word < 4; ++word) {
321 u64 packed = s.read<u64>();
322 for (usize bit = 0; bit < 64; ++bit) {
323 if (packed & (static_cast<u64>(1) << bit)) {
324 mask->set(word * 64 + bit);
325 }
326 }
327 }
328 } else {
329 for (usize j = 0; j < 4; ++j) {
330 s.read<u64>();
331 }
332 }
333 }
334
335 // Reconstruct mask entries for destroyed entities (needed for invariants)
336 for (u32 idx : m_free_list) {
337 assert(m_generations[idx] > 0 && "Freelist index has generation 0");
338 Entity e{idx, m_generations[idx] - 1};
339 m_entity_masks.add(e, ComponentMask{});
340 }
341
342 // Deserialize component pools
343 u32 serializable_count = s.read<u32>();
344 m_component_pools.resize(16); // Basic size, expand as needed
345
346 for (u32 i = 0; i < serializable_count; ++i) {
347 u32 componentId = s.read<u32>();
349 if (pool) {
350 pool->deserialize(s);
351 if (componentId < m_component_pools.size()) {
352 m_component_pools[componentId] = std::move(pool);
353 }
354 }
355 }
356}
static std::unique_ptr< SparseEntitySetBase > create(u32 component_id)
Definition ComponentFactory.cpp:12
static bool is_registered(u32 component_id)
Definition ComponentFactory.cpp:19
Definition EntityManager.hpp:83
bool has_component_pool()
bool is_alive(Entity e) const
Definition EntityManager.inl:242
Entity create()
Definition EntityManager.inl:192
void serialize(Serializer &s) const override
Definition EntityManager.inl:251
std::bitset< 256 > ComponentMask
Definition EntityManager.hpp:164
bool has_component(Entity e) const
u32 pop_free_list()
Definition EntityManager.inl:245
std::tuple< Components &... > get_component_group(Entity e)
T * add_component(Entity e, Args &&... args)
bool try_remove_component(Entity e)
void destroy(Entity e)
Definition EntityManager.inl:206
T * try_get_component(Entity e)
SparseEntitySet< T > * get_component_pool()
void deserialize(Serializer &s) override
Definition EntityManager.inl:306
T & get_component(Entity e)
See TryGetComponent for safe pointer version.
std::vector< ComponentDebugInfo > get_all_component_info(Entity e) const
Definition EntityManager.inl:228
Definition serialization.hpp:36
Definition SparseEntitySet.hpp:42
bool remove(Entity entity) override
Definition SparseEntitySet.inl:35
T * get(Entity entity)
Definition SparseEntitySet.inl:74
void add(Entity entity, Args &&... args)
Definition EntityManager.hpp:27
Iterator begin()
Definition EntityManager.inl:43
void check_size(usize &minSize)
const std::vector< Entity > * m_smallest_pool
Definition EntityManager.hpp:29
Iterator end()
Definition EntityManager.inl:52
EntityManager & m_manager
Definition EntityManager.hpp:28
static consteval usize bit(usize idx)
Definition Event.hpp:16
Definition component_registration.hpp:71
Definition EntityManager.hpp:124
Definition Entity.hpp:18
Definition EntityManager.hpp:33
bool is_valid() const
Definition EntityManager.inl:36
void next()
Definition EntityManager.inl:28
Iterator & operator++()
Definition EntityManager.inl:17
const std::vector< Entity > * entities
Definition EntityManager.hpp:35
std::tuple< Entity, Components &... > operator*() const
Definition EntityManager.inl:22
Iterator(EntityManager &em, const std::vector< Entity > *dense_entities, usize idx)
Definition EntityManager.inl:9
std::uint32_t u32
Definition types.hpp:15
std::uint64_t u64
Definition types.hpp:16
constexpr T g_type_max
Definition types.hpp:21
std::size_t usize
Definition types.hpp:18