10#include <core/serialize/JsonSerializer.h>
11#include <core/serialize/Serializable.h>
12#include <core/register/ComponentRegistry.h>
21 class Entity :
public cme::Serializable,
public std::enable_shared_from_this<Entity>
24 Entity(ent::groupID groupID, cme::Scene* _scenePtr, std::string name)
27 , _groupID(ec::ent::None)
29 , _updateComponents(0, nullptr)
30 , _renderComponents(0, nullptr)
31 , _components(ec::comp::NUM_COMPONENTS, nullptr)
35 LOG_INFO(
"Creating entity");
43 for (
auto c : _components) {
delete c; }
44 _updateComponents.clear();
45 _renderComponents.clear();
50 Entity(
const Entity&) =
delete;
53 Entity& operator=(
const Entity&) =
delete;
57 ec::ent::groupID _groupID;
67 std::vector<UpdateComponent*> _updateComponents;
70 std::vector<RenderComponent*> _renderComponents;
73 std::vector<Component*> _components;
75 std::string& name() {
return _name; }
77 inline void update() {
78 for (
auto* comp : _updateComponents) {
84 for (
auto* comp : _renderComponents) {
89 void serialize(cme::JsonSerializer& s)
const {
93 s.
write(
"name", this->_name);
96 for (
auto component : _components) {
97 if (!component)
continue;
100 s.
write(
"type", component->serializeID());
103 component->serialize(s);
113 void deserialize(cme::JsonSerializer& s) {
116 for (
size_t k = 0; k < numComp; k++) {
121 LOG_ERROR(std::format(
"El componente es nulo, la key no existe. KEY: {}", compKey));
125 this->addComponent(comp);
127 comp->deserialize(s);
141 template<
typename T,
typename... Ts>
142 inline T* addComponent(Ts&&... args)
145 static_assert(std::is_base_of<Component, T>::value,
"No es un componente");
148 constexpr comp::cmpID
id =
static_cast<comp::cmpID
>(ec::getComponentID<T>);
151 removeComponent<T>();
154 T* component =
new T(std::forward<Ts>(args)...);
155 _components[id] = component;
158 if constexpr (std::is_base_of_v<RenderComponent, T>) {
159 _renderComponents.push_back(
static_cast<RenderComponent*
>(component));
162 if constexpr (std::is_base_of_v<UpdateComponent, T>) {
163 _updateComponents.push_back(
static_cast<UpdateComponent*
>(component));
164 component->setUpdateIterator(std::prev(_updateComponents.end()));
169 component->setContext(shared_from_this());
172 component->initComponent();
180 void addComponent(ec::Component* component) {
181 if (!component)
return;
183 ec::cmpID_t
id = component->getID();
186 delete _components[id];
187 _components[id] = component;
190 if (
auto* r = component->getAsRender()) {
191 _renderComponents.push_back(r);
193 if (
auto* u = component->getAsUpdate()) {
194 _updateComponents.push_back(u);
195 u->setUpdateIterator(std::prev(_updateComponents.end()));
199 component->initComponent();
205 inline void removeComponent()
208 static_assert(std::is_base_of<Component, T>::value,
"No es un componente");
211 constexpr comp::cmpID
id =
static_cast<comp::cmpID
>(ec::getComponentID<T>);
213 auto component = _components[id];
226 delete _components[id];
227 _components[id] =
nullptr;
234 inline bool hasComponent()
236 static_assert(std::is_base_of<Component, T>::value,
"No es un componente");
237 constexpr comp::cmpID
id =
static_cast<comp::cmpID
>(ec::getComponentID<T>);
238 return _components[id] !=
nullptr;
245 inline T* getComponent()
247 static_assert(std::is_base_of<Component, T>::value,
"No es un componente");
248 constexpr comp::cmpID
id =
static_cast<comp::cmpID
>(ec::getComponentID<T>);
249 return static_cast<T*
>(_components[id]);
254 inline void setGroup(ec::ent::groupID
id) { _groupID = id; }
256 inline cme::Scene* getScene() {
262 bool isAlive() {
return _alive; }
266 bool& active() {
return _active; }
270 std::vector<UpdateComponent*>& getUpdateComponent() {
271 return _updateComponents;
276 std::vector<RenderComponent*>& getRenderComponent() {
277 return _renderComponents;
static ec::Component * create(const std::string &name)
Crea un componente dado su tipo.
Definition ComponentRegistry.h:30
void beginScope(const std::string &key)
Cambia de scope para leer o escribir en el json.
Definition JsonSerializer.cpp:11
void pushObjectToArray()
Agrega un nuevo objeto al array en el scope actual y entra en ese nuevo objeto, permitiendo agregar p...
Definition JsonSerializer.cpp:37
std::string readString(const std::string &key) const
Lee y devuelve un valor de tipo string asociado a la clave especificada.
Definition JsonSerializer.cpp:127
void enterElement(size_t index)
Entra en un elemento específico del array en el scope actual.
Definition JsonSerializer.cpp:55
void endScope()
Vuelve al scope anterior.
Definition JsonSerializer.cpp:20
void write(const std::string &key, float value)
Escribe un valor en el scope actual.
Definition JsonSerializer.cpp:83
void beginArray(const std::string &key)
Inicia un nuevo array en el scope actual con la clave dada, permitiendo agregar elementos a ese array...
Definition JsonSerializer.cpp:27
size_t getArraySize() const
Obtiene el tamaño del array en el scope actual.
Definition JsonSerializer.cpp:48
void setContext(std::weak_ptr< ec::Entity > ent)
Hacer saber al componente quien le controla.
Definition component.h:42