OGL Engine 1.2.0-dev
Loading...
Searching...
No Matches
componentstorage.hpp
Go to the documentation of this file.
1
5#pragma once
6
7#include <unordered_map>
8#include <vector>
9
10#include "../defs.hpp"
11
12namespace Engine::ECS {
23 virtual void Remove(EntityID id) = 0;
24
29 virtual void Clear() = 0;
30
31 virtual ~IComponentStorage() = default;
32 };
33
39 template<typename T>
41 private:
43 std::unordered_map<EntityID, std::vector<T*>> mComponents;
44
45 public:
52 void Add(EntityID entityID, T* component) {
53 mComponents[entityID].push_back(component);
54 }
55
61 void Remove(EntityID entityID) override {
62 mComponents.erase(entityID);
63 }
64
69 void Clear() override {
70 for(auto [_, list] : mComponents) {
71 for(auto t : list) delete t;
72 }
73 mComponents.clear();
74 }
75
82 T* Get(EntityID entityID, int index = 0) {
83 auto it = mComponents.find(entityID);
84 return (it != mComponents.end() && index < it->second.size()) ? it->second[index] : nullptr;
85 }
86
93 std::vector<T*> GetMany(EntityID entityID) {
94 auto it = mComponents.find(entityID);
95 return (it != mComponents.end()) ? it->second : std::vector<T*>();
96 }
97
104 T& GetRef(EntityID entityID, int index = 0) {
105 auto it = mComponents.find(entityID);
106 if(it == mComponents.end() || (it->second.size() < index)) throw std::runtime_error("this entity does not have such a component");
107 return *(mComponents.at(entityID)[index]);
108 }
109
115 const std::unordered_map<EntityID, std::vector<T*>>& GetRaw() const {
116 return mComponents;
117 }
118 };
119}
Stockage de composant typé selon template, basé sur l'interface générique.
Definition componentstorage.hpp:40
void Add(EntityID entityID, T *component)
Ajoute un nouveau composant au stockage, associé à l'entityID donné
Definition componentstorage.hpp:52
const std::unordered_map< EntityID, std::vector< T * > > & GetRaw() const
Renvoie une réfèrence vers la table entière de stockage de composants.
Definition componentstorage.hpp:115
T * Get(EntityID entityID, int index=0)
Récupère un pointeur vers le composant associé à l'entityID.
Definition componentstorage.hpp:82
T & GetRef(EntityID entityID, int index=0)
Renvoie une référence vers le composant associé à l'entityID.
Definition componentstorage.hpp:104
void Clear() override
Nettoye le stockage de composants.
Definition componentstorage.hpp:69
std::vector< T * > GetMany(EntityID entityID)
Récupère un tableau de composants du type donné, associé à l'entityID.
Definition componentstorage.hpp:93
void Remove(EntityID entityID) override
Supprime le composant associé à l'entityID donné
Definition componentstorage.hpp:61
Définit des types de données utilisés dans le moteur.
Definition component.hpp:11
std::uint32_t EntityID
Définition de type pour mieux identifier les EntityID.
Definition defs.hpp:13
Interface pour le système de stockage de composants.
Definition componentstorage.hpp:17
virtual ~IComponentStorage()=default
virtual void Clear()=0
Nettoye un stockage de composant tout entier, sans distinction d'entityID.
virtual void Remove(EntityID id)=0
Interface pour supprimer un composant attaché à l'entité avec l'id donné