10#include <unordered_map>
36 template<
typename,
typename = std::
void_t<>>
37 struct HasBaseType : std::false_type {};
40 struct HasBaseType<T, std::void_t<typename T::BaseType>> : std::true_type {};
42 template<typename T, bool = HasBaseType<T>::value>
48 struct BaseOrSelf<T, true> {
49 using type =
typename T::BaseType;
57 std::unordered_map<size_t, IComponentStorage*> mStorages;
59 std::unordered_map<EntityID, std::set<std::string>> mTags;
66 std::queue<EntityID> mAvailableEntityIDs;
71 std::set<EntityID> mLivingEntities;
80 ComponentStorage<T>* GetOrCreateStorage() {
83 if(mStorages.find(tid) == mStorages.end()) {
84 mStorages[tid] =
new ComponentStorage<T>();
87 return static_cast<ComponentStorage<T>*
>(mStorages[tid]);
97 ComponentStorage<T>* GetStorage() {
100 if(mStorages.find(tid) != mStorages.end()) {
101 return static_cast<ComponentStorage<T>*
>(mStorages[tid]);
143 template<
typename... Components>
183 template <
typename... TComponents>
185 std::vector<EntityID> result;
187 if(
sizeof...(TComponents) == 0)
return result;
190 auto* baseStorage = GetStorage<std::tuple_element_t<0, std::tuple<TComponents...>>>();
191 if(!baseStorage)
return result;
193 for (
const auto& [entityID, _] : baseStorage->GetRaw()) {
195 result.push_back(entityID);
227 template <
typename T,
typename... Args>
229 using Base =
typename BaseOrSelf<T>::type;
231 GetOrCreateStorage<Base>()->Add(entityID,
new T(std::forward<Args>(args)...));
240 template <
typename T>
242 using Base =
typename BaseOrSelf<T>::type;
244 auto storage = GetStorage<Base>();
246 storage->Remove(entityID);
259 template <
typename T>
272 template <
typename T>
274 using Base =
typename BaseOrSelf<T>::type;
276 auto* storage = GetStorage<Base>();
277 if(!storage)
throw std::runtime_error(
"Registry::GetComponent<T>: no storage for component type");
278 return static_cast<T&
>(storage->GetRef(entityID));
290 using Base =
typename BaseOrSelf<T>::type;
292 auto* storage = GetStorage<Base>();
293 if(!storage)
throw std::runtime_error(
"Registry::GetComponents<T>: no storage for component type");
294 return (storage->GetMany(entityID));
305 template <
typename T>
307 using Base =
typename BaseOrSelf<T>::type;
309 auto *storage = GetStorage<Base>();
310 return storage && !!storage->Get(entityID);
void DestroyEntity(EntityID entityID)
Supprime l'entité référencée par l'identifiant donné
Definition registry.cpp:31
std::vector< T * > GetComponents(EntityID entityID)
Renvoie un vector de pointeurs vers tous les composants du type donné présents.
Definition registry.hpp:289
std::vector< EntityID > GetEntityIDsWith()
Renvoie un tableau d'EntityIDs sous condition.
Definition registry.hpp:184
void AddChild(EntityID parentID, EntityID childID)
Ajoute les composants Parent/Children de manière automatique pour créer une relation parent/enfant.
Definition registry.cpp:91
T & GetComponent(EntityID entityID)
Renvoie le component référencé par l'EntityID donné
Definition registry.hpp:273
bool HasComponent(EntityID entityID)
Vérifie si une entité possède un component.
Definition registry.hpp:306
EntityID CreateEntity()
Créé une nouvelle entité et renvoie l'identifiant qui lui a été attribué
Definition registry.cpp:22
EntityID CreateEntityWith()
Créé une nouvelle entité avec les composants voulus.
Definition registry.hpp:144
void Print()
Affiche un print du registre dans la console.
Definition registry.cpp:12
size_t GetComponentTypeID()
Renvoie une identifiant unique pour chaque type de composant.
Definition registry.hpp:260
Registry()
Créé un objet Registry.
Definition registry.cpp:5
void RemoveComponent(EntityID entityID)
Supprime le composant de type T associé à l'entité à l'EntityID donné
Definition registry.hpp:241
std::set< std::string > GetTags(EntityID entityID)
Renvoie les tags associés à une entité donnée.
Definition registry.cpp:67
bool IsValidEntity(EntityID entityID)
Renvoie true si l'entité est valide et utilisable, false sinon.
Definition registry.cpp:41
EntityID GetEntityIDWithTag(std::string targetTag)
Renvoie le premier EntityID trouvé pour le tag donné
Definition registry.cpp:71
friend class Scene::Scene
Definition registry.hpp:33
void Clear()
Nettoie le registre dans son entiereté.
Definition registry.cpp:45
bool HasTag(EntityID entityID, std::string tag)
Vérifie si une entité possède un tag.
Definition registry.cpp:63
std::vector< EntityID > GetEntityIDsWithTag(std::string targetTag)
Renvoie une liste d'entityID qui possèdent le tag donné
Definition registry.cpp:80
Scene::Scene & GetScene()
Renvoie la scène courante.
Definition registry.cpp:18
void AddComponent(EntityID entityID, Args &&... args)
Ajoute un nouveau component.
Definition registry.hpp:228
void AddTag(EntityID entityID, std::string tag)
Ajoute un tag à une entité
Definition registry.cpp:59
void RemoveChild(EntityID parentID, EntityID childID, bool removeComponents=true)
Brise la relation parent/enfant entre deux entités, si elle existe.
Definition registry.cpp:103
Classe qui encapsule un registre de composants ECS, et des fonctions de lifcecycle.
Definition scene.hpp:36
Définit des constantes utilisables un peu partout dans le code du moteur.
Définit des types de données utilisés dans le moteur.
Système de logs console/fichier.
Definition component.hpp:11
size_t nextComponentTypeId
Le prochain identifiant de composant pour les storages.
Definition registry.hpp:27
Definition registry.hpp:23
std::uint32_t EntityID
Définition de type pour mieux identifier les EntityID.
Definition defs.hpp:13