diff --git a/scenes/engine/EC/components.h b/scenes/engine/EC/components.h index e23458a..6ea9b7c 100644 --- a/scenes/engine/EC/components.h +++ b/scenes/engine/EC/components.h @@ -5,7 +5,6 @@ #include "entity.h" // TODO: Look at sc to use macros to auto generate functions -#define N_COMPONENTS 10 typedef enum ComponentEnum { CBBOX_COMP_T, CTRANSFORM_COMP_T, diff --git a/scenes/engine/EC/entManager.c b/scenes/engine/EC/entManager.c index fc2dae1..72a3036 100644 --- a/scenes/engine/EC/entManager.c +++ b/scenes/engine/EC/entManager.c @@ -21,20 +21,19 @@ void update_entity_manager(EntityManager_t* p_manager) // It does not make new entities, but will free entity // New entities are assigned during add_entity unsigned long e_idx; - unsigned long comp_type_idx; - unsigned long comp_idx; sc_queue_foreach (&p_manager->to_remove, e_idx) { Entity_t *p_entity = (Entity_t *)sc_map_get_64v(&p_manager->entities, e_idx); if (!p_entity) continue; - sc_map_foreach (&p_entity->components, comp_type_idx, comp_idx) + for (size_t i = 0; i < N_COMPONENTS; ++i) { - free_component_to_mempool((ComponentEnum_t)comp_type_idx, comp_idx); - sc_map_del_64v(&p_manager->component_map[comp_type_idx], e_idx); + if (p_entity->components[i] == MAX_COMP_POOL_SIZE) continue; + + free_component_to_mempool((ComponentEnum_t)i, p_entity->components[i]); + sc_map_del_64v(&p_manager->component_map[i], e_idx); sc_map_del_64v(&p_manager->entities_map[p_entity->m_tag], e_idx); } - sc_map_clear_64(&p_entity->components); free_entity_to_mempool(e_idx); sc_map_del_64v(&p_manager->entities, e_idx); } @@ -116,7 +115,7 @@ void* add_component(EntityManager_t* p_manager, Entity_t* p_entity, ComponentEnu void* p_comp = new_component_from_mempool(comp_type, &comp_idx); if (p_comp) { - sc_map_put_64(&p_entity->components, comp_type_idx, comp_idx); + p_entity->components[comp_type] = comp_idx; sc_map_put_64v(&p_manager->component_map[comp_type_idx], p_entity->m_id, p_comp); } return p_comp; @@ -126,7 +125,6 @@ void* get_component(EntityManager_t *p_manager, Entity_t *p_entity, ComponentEnu { unsigned long comp_type_idx = (unsigned long)comp_type; void * p_comp = sc_map_get_64v(&p_manager->component_map[comp_type_idx], p_entity->m_id); - //unsigned long comp_idx = sc_map_get_64(&p_entity->components, comp_type_idx); if (!sc_map_found(&p_manager->component_map[comp_type_idx])) return NULL; return p_comp; } @@ -134,8 +132,7 @@ void* get_component(EntityManager_t *p_manager, Entity_t *p_entity, ComponentEnu void remove_component(EntityManager_t *p_manager, Entity_t *p_entity, ComponentEnum_t comp_type) { unsigned long comp_type_idx = (unsigned long)comp_type; - unsigned long comp_idx = sc_map_del_64(&p_entity->components, comp_type_idx); - if (!sc_map_found(&p_entity->components)) return; + if (p_entity->components[comp_type] == MAX_COMP_POOL_SIZE) return; sc_map_del_64v(&p_manager->component_map[comp_type_idx], p_entity->m_id); - free_component_to_mempool(comp_type, comp_idx); + free_component_to_mempool(comp_type, p_entity->components[comp_type]); } diff --git a/scenes/engine/EC/entity.h b/scenes/engine/EC/entity.h index 2d94629..e8356c2 100644 --- a/scenes/engine/EC/entity.h +++ b/scenes/engine/EC/entity.h @@ -1,9 +1,9 @@ #ifndef __ENTITY_H #define __ENTITY_H #include -#include "sc/map/sc_map.h" #define N_TAGS 4 +#define N_COMPONENTS 10 typedef enum EntityTag { NO_ENT_TAG, PLAYER_ENT_TAG, @@ -15,6 +15,7 @@ typedef struct Entity { unsigned long m_id; EntityTag_t m_tag; bool m_alive; - struct sc_map_64 components; + unsigned long components[N_COMPONENTS]; + } Entity_t; #endif // __ENTITY_H diff --git a/scenes/engine/EC/mempool.c b/scenes/engine/EC/mempool.c index a34bff7..815281c 100644 --- a/scenes/engine/EC/mempool.c +++ b/scenes/engine/EC/mempool.c @@ -3,6 +3,7 @@ #include #include #include +#include // Static allocate buffers static Entity_t entity_buffer[MAX_COMP_POOL_SIZE]; @@ -118,7 +119,6 @@ void init_memory_pools(void) for (size_t i = 0; i < ent_mempool.max_size; ++i) { entity_buffer[i].m_id = i; - sc_map_init_64(&entity_buffer[i].components, 16 ,0); ent_mempool.free_list.buffer[i] = i; } ent_mempool.free_list.count = ent_mempool.max_size; @@ -138,10 +138,6 @@ void free_memory_pools(void) free(ent_mempool.use_list); cb_free(&ent_mempool.free_list); - for (int i = 0; i < MAX_COMP_POOL_SIZE; ++i) - { - sc_map_term_64(&entity_buffer[i].components); - } pool_inited = false; } } @@ -154,7 +150,10 @@ Entity_t* new_entity_from_mempool(unsigned long* e_idx_ptr) *e_idx_ptr = e_idx; ent_mempool.use_list[e_idx] = true; Entity_t* ent = entity_buffer + e_idx; - sc_map_clear_64(&ent->components); + for (size_t j = 0; j< N_COMPONENTS; j++) + { + ent->components[j] = MAX_COMP_POOL_SIZE; + } ent->m_alive = true; ent->m_tag = NO_ENT_TAG; return ent;