SDEngine
Game Engine
Loading...
Searching...
No Matches
EntityManager.hpp
Go to the documentation of this file.
1#pragma once
2#include <bitset>
3#include <vector>
4
7#include "Entity.hpp"
8#include "SD/arena.hpp"
9#include "SD/core/logging.hpp"
10#include "SparseEntitySet.hpp"
12#include "components.hpp"
13
14namespace sd {
15
16template<typename ExtraComponents>
17struct EntityManager;
18
19template<typename ExtraComponents = ComponentGroup<>, typename... Components>
20struct ViewImpl {
23
26
27 explicit ViewImpl(manager_type& manager);
28
29 struct Iterator {
33
34 using iterator_category = std::forward_iterator_tag;
35 using value_type = std::tuple<Entity, Components&...>;
36 using difference_type = std::ptrdiff_t;
37 using pointer = void;
39
40 Iterator(manager_type& em, const ArenaVec<Entity>* dense_entities, USize idx);
42
43 bool operator==(const Iterator& other) const {
44 return index == other.index && entities == other.entities;
45 }
46
47 bool operator!=(const Iterator& other) const { return !(*this == other); }
48
49 std::tuple<Entity, Components&...> operator*() const;
50
51 void next();
52
53 [[nodiscard]] bool is_valid() const;
54 };
55
56 Iterator begin();
57 Iterator end();
58
59 template<typename Component>
61};
62
63template<typename ExtraComponents>
66
67 template<typename T>
69
71 "Duplicate component type in ECS schema");
72 Entity create();
73
74 template<typename T, typename... Args>
76
77 template<typename T>
79
80 template<typename T>
82
83 template<typename T>
84 const T& get_component(Entity e) const;
85
86 void serialize(Serializer& s) const;
88
89 template<typename T>
91
92 void destroy(Entity e);
93
94 void clear() {
95 m_component_pools.clear();
99 if (m_pool_arena)
101 }
102
103 [[nodiscard]] bool is_alive(Entity e) const;
104 [[nodiscard]] int get_entity_count() const { return m_entity_masks.size(); }
106 int alive = 0;
107 for (U64 i = 0; i < m_entity_masks.get_dense_entities().count; ++i) {
109 if (e.index < m_generations.count && is_alive(e))
110 ++alive;
111 }
112 return alive;
113 }
114
115 template<typename T>
116 struct UnpackGroup {
117 static constexpr bool is_group = false;
118 };
119
120 template<typename... Ts>
121 struct UnpackGroup<std::tuple<Ts...>> {
123 static constexpr bool is_group = true;
124 };
125
126 template<typename... Ts>
129 static constexpr bool is_group = true;
130 };
131
132 template<typename... Args>
133 auto view();
134
135 template<typename T>
137
138 template<typename... Components>
140
141 template<typename... Components>
142 std::tuple<const Components&...> get_component_group(Entity e) const;
143
144 template<typename T>
146
147 template<typename T>
149
150 Arena* m_pool_arena = nullptr;
152
155
157
158 using ComponentMask = std::bitset<256>;
160
162};
163
164#include "impl/EntityManager.inl"
165} // namespace sd
Definition Application.hpp:22
typename ConcatComponentGroups< A, B >::type ConcatComponentGroups_t
Definition component_registration.hpp:30
Definition arena_vec.hpp:6
U64 count
Definition arena_vec.hpp:8
void clear()
Definition arena_vec.hpp:22
Definition arena.hpp:85
void clear(this Arena &arena)
Definition arena.cpp:242
Definition component_registration.hpp:12
Definition component_registration.hpp:19
Definition EntityManager.hpp:116
static constexpr bool is_group
Definition EntityManager.hpp:117
Definition EntityManager.hpp:64
ArenaVec< U32 > m_free_list
Definition EntityManager.hpp:154
const T & get_component(Entity e) const
T * add_component(Entity e, Args &&... args)
void serialize(Serializer &s) const
Definition EntityManager.inl:279
ArenaVec< U32 > m_generations
Definition EntityManager.hpp:153
bool is_alive(Entity e) const
Definition EntityManager.inl:267
std::tuple< Components &... > get_component_group(Entity e)
std::tuple< const Components &... > get_component_group(Entity e) const
SparseEntitySet< ComponentMask > m_entity_masks
Definition EntityManager.hpp:159
Entity create()
Definition EntityManager.inl:234
int get_entity_count() const
Definition EntityManager.hpp:104
ArenaVec< ComponentPoolNode > m_component_pools
Definition EntityManager.hpp:156
std::bitset< 256 > ComponentMask
Definition EntityManager.hpp:158
int get_alive_entity_count() const
Definition EntityManager.hpp:105
bool has_component(Entity e) const
U32 pop_free_list()
Definition EntityManager.inl:272
void deserialize(Serializer &s)
Definition EntityManager.inl:335
Arena * m_pool_arena
Definition EntityManager.hpp:150
void destroy(Entity e)
Definition EntityManager.inl:249
T * try_get_component(Entity e)
SparseEntitySet< T > * get_component_pool()
ConcatComponentGroups_t< components::EngineComponents, ExtraComponents > all_components
Definition EntityManager.hpp:65
bool has_component_pool()
bool try_remove_component(Entity e)
T & get_component(Entity e)
void clear()
Definition EntityManager.hpp:94
Definition Entity.hpp:18
Definition component_registration.hpp:33
Definition RuntimeStateManager.hpp:24
Definition serialization.hpp:38
Definition SparseEntitySet.hpp:12
const ArenaVec< Entity > & get_dense_entities() const
Definition SparseEntitySet.hpp:130
void clear()
Definition SparseEntitySet.hpp:134
USize size() const
Definition SparseEntitySet.hpp:132
Definition EntityManager.hpp:29
std::ptrdiff_t difference_type
Definition EntityManager.hpp:36
bool is_valid() const
Definition EntityManager.inl:44
Iterator & operator++()
Definition EntityManager.inl:21
manager_type & manager
Definition EntityManager.hpp:30
void next()
Definition EntityManager.inl:35
std::forward_iterator_tag iterator_category
Definition EntityManager.hpp:34
bool operator==(const Iterator &other) const
Definition EntityManager.hpp:43
USize index
Definition EntityManager.hpp:32
bool operator!=(const Iterator &other) const
Definition EntityManager.hpp:47
value_type reference
Definition EntityManager.hpp:38
const ArenaVec< Entity > * entities
Definition EntityManager.hpp:31
std::tuple< Entity, Components &... > operator*() const
Definition EntityManager.inl:28
void pointer
Definition EntityManager.hpp:37
std::tuple< Entity, Components &... > value_type
Definition EntityManager.hpp:35
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
ConcatComponentGroups_t< components::EngineComponents, ExtraComponents > all_components
Definition EntityManager.hpp:22
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