14 manager(em), entities(dense_entities), index(
idx) {
56 "View has no valid component pools - scene may be empty or missing components");
71template<
typename Component>
86template<
typename ExtraComponents>
87template<
typename T,
typename...
Args>
90 "Error: Component type is not registered, register it");
93 while (m_component_pools.count <= type_id)
96 auto&
node = m_component_pools[type_id];
99 pool->
arena = m_pool_arena;
107 node.deserialize_fn = [](
void*
p, Serializer&
s) {
113 if (m_entity_masks.get(
e)->test(type_id))
114 log::engine::warn(
"Overwriting already existing component: {}, id: {} ",
115 component_info<T>::name,
118 m_entity_masks.get(
e)->set(type_id);
119 pool->add(
e, std::forward<Args>(
args)...);
123template<
typename ExtraComponents>
127 "Error: Component type is not registered, register it");
130 if (type_id >= m_component_pools.count || !m_component_pools[type_id].pool ||
131 !m_entity_masks.get(
e)->test(type_id))
138template<
typename ExtraComponents>
145 return *pool->
get(
e);
148template<
typename ExtraComponents>
155 return *pool->
get(
e);
158template<
typename ExtraComponents>
162 "Error: Can't remove component type that isn't registered");
165 if (type_id >= m_component_pools.count || !m_component_pools[type_id].pool ||
166 !m_entity_masks.get(
e)->test(type_id))
171 m_entity_masks.get(
e)->reset(type_id);
175template<
typename ExtraComponents>
176template<
typename...
Args>
178 if constexpr (
sizeof...(Args) == 1) {
179 using T = std::tuple_element_t<0, std::tuple<
Args...>>;
190template<
typename ExtraComponents>
193 if (
e.index >= m_entity_masks.get_dense_entities().count)
197 auto mask = m_entity_masks.get(
e);
201template<
typename ExtraComponents>
207template<
typename ExtraComponents>
214template<
typename ExtraComponents>
219 if (type_id >= m_component_pools.count || !m_component_pools[type_id].pool)
225template<
typename ExtraComponents>
230 return type_id < m_component_pools.count && m_component_pools[type_id].pool;
233template<
typename ExtraComponents>
236 m_free_list.count == 0 ?
static_cast<U32>(m_generations.count) + 1 : pop_free_list();
238 if (
idx >= m_generations.count)
239 m_generations.push(m_pool_arena, 0);
243 m_entity_masks.arena = m_pool_arena;
248template<
typename ExtraComponents>
256 for (
U64 i = 0;
i < m_component_pools.count; ++
i) {
257 auto&
node = m_component_pools[
i];
262 m_generations[
e.index]++;
263 m_free_list.push(m_pool_arena,
e.index);
266template<
typename ExtraComponents>
268 return e.index < m_generations.count && m_generations[
e.index] ==
e.generation;
271template<
typename ExtraComponents>
273 const auto idx = m_free_list[m_free_list.count - 1];
278template<
typename ExtraComponents>
280 s.write(
static_cast<U32>(m_generations.count));
281 for (
U64 i = 0;
i < m_generations.count; ++
i)
282 s.write(m_generations[
i]);
284 s.write(
static_cast<U32>(m_free_list.count));
285 for (
U64 i = 0;
i < m_free_list.count; ++
i)
286 s.write(m_free_list[
i]);
288 const auto&
mask_entities = m_entity_masks.get_dense_entities();
302 s.write(
e.generation);
315 s.write(
static_cast<U64>(0));
320 for (
U64 i = 0;
i < m_component_pools.count; ++
i) {
326 for (
U64 i = 0;
i < m_component_pools.count; ++
i) {
328 s.write(
static_cast<U32>(
i));
329 m_component_pools[
i].serialize_fn(m_component_pools[
i].pool,
s);
334template<
typename ExtraComponents>
338 for (
U32 i = 0;
i < count; ++
i)
339 m_generations.push(m_pool_arena,
s.read<
U32>());
344 for (
U32 i = 0;
i < count; ++
i)
345 m_free_list.push(m_pool_arena,
s.read<
U32>());
349 m_entity_masks.arena = m_pool_arena;
352 U32 generation =
s.read<
U32>();
370 for (
U32 i = 0;
i < m_free_list.count; ++
i) {
371 assert(m_generations[m_free_list[
i]] > 0 &&
"Freelist index has generation 0");
372 Entity e{m_free_list[
i], m_generations[m_free_list[
i]] - 1};
377 m_component_pools.clear();
Definition arena_vec.hpp:6
static bool is_registered(U32 component_id)
Definition ComponentFactory.cpp:20
static ComponentPoolNode create(U32 component_id, Arena *arena)
Definition ComponentFactory.cpp:14
Definition ComponentPoolNode.hpp:9
Definition component_registration.hpp:19
Definition EntityManager.hpp:116
Definition EntityManager.hpp:64
T * add_component(Entity e, Args &&... args)
void serialize(Serializer &s) const
Definition EntityManager.inl:279
bool is_alive(Entity e) const
Definition EntityManager.inl:267
std::tuple< Components &... > get_component_group(Entity e)
Entity create()
Definition EntityManager.inl:234
std::bitset< 256 > ComponentMask
Definition EntityManager.hpp:158
bool has_component(Entity e) const
U32 pop_free_list()
Definition EntityManager.inl:272
void deserialize(Serializer &s)
Definition EntityManager.inl:335
void destroy(Entity e)
Definition EntityManager.inl:249
T * try_get_component(Entity e)
SparseEntitySet< T > * get_component_pool()
bool has_component_pool()
bool try_remove_component(Entity e)
T & get_component(Entity e)
Definition serialization.hpp:38
Definition SparseEntitySet.hpp:12
bool remove(Entity entity)
Definition SparseEntitySet.hpp:66
T * get(Entity entity)
Definition SparseEntitySet.hpp:96
Arena * arena
Definition SparseEntitySet.hpp:17
Definition EntityManager.hpp:29
Iterator(manager_type &em, const ArenaVec< Entity > *dense_entities, USize idx)
Definition EntityManager.inl:11
bool is_valid() const
Definition EntityManager.inl:44
Iterator & operator++()
Definition EntityManager.inl:21
void next()
Definition EntityManager.inl:35
const ArenaVec< Entity > * entities
Definition EntityManager.hpp:31
std::tuple< Entity, Components &... > operator*() const
Definition EntityManager.inl:28
Definition EntityManager.hpp:20
manager_type & m_manager
Definition EntityManager.hpp:24
const ArenaVec< Entity > * m_smallest_pool
Definition EntityManager.hpp:25
void check_size(USize &minSize)
Iterator end()
Definition EntityManager.inl:64
Iterator begin()
Definition EntityManager.inl:53
consteval U64 type_id_of()
Definition type_id.hpp:6
std::uint32_t U32
Definition types.hpp:15
std::size_t USize
Definition types.hpp:18
std::uint64_t U64
Definition types.hpp:16