Replace component data struct to use array
This will use more memory from the get go. I just prefer to statically allocate memory.scene_man
parent
b0e1d33ad6
commit
e1a7774bfb
|
@ -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,
|
||||
|
|
|
@ -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]);
|
||||
}
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
#ifndef __ENTITY_H
|
||||
#define __ENTITY_H
|
||||
#include <stdbool.h>
|
||||
#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
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
|
||||
// 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;
|
||||
|
|
Loading…
Reference in New Issue