Change to manual init for entity tag map

The entity tag mapping is not that used often enough.

So, change it to manual init.
scene_man
En Yi 2023-11-11 11:14:22 +08:00
parent 029415e19f
commit b150b3ad38
4 changed files with 31 additions and 9 deletions

View File

@ -252,6 +252,7 @@ struct EntityManager {
// All fields are Read-Only
struct sc_map_64v entities; // ent id : entity
struct sc_map_64v entities_map[N_TAGS]; // [{ent id: ent}]
bool tag_map_inited[N_TAGS];
struct sc_map_64v component_map[N_COMPONENTS]; // [{ent id: comp}, ...]
struct sc_queue_uint to_add;
struct sc_queue_uint to_remove;
@ -259,6 +260,7 @@ struct EntityManager {
};
void init_entity_manager(EntityManager_t* p_manager);
void init_entity_tag_map(EntityManager_t* p_manager, unsigned int tag_number, unsigned int initial_size);
void update_entity_manager(EntityManager_t* p_manager);
void clear_entity_manager(EntityManager_t* p_manager);
void free_entity_manager(EntityManager_t* p_manager);

View File

@ -7,15 +7,20 @@ void init_entity_manager(EntityManager_t* p_manager)
{
sc_map_init_64v(p_manager->component_map + i, MAX_COMP_POOL_SIZE, 0);
}
for (size_t i = 0; i < N_TAGS; ++i)
{
sc_map_init_64v(p_manager->entities_map + i, MAX_COMP_POOL_SIZE, 0);
}
memset(p_manager->tag_map_inited, 0, sizeof(p_manager->tag_map_inited));
sc_queue_init(&p_manager->to_add);
sc_queue_init(&p_manager->to_remove);
sc_queue_init(&p_manager->to_update);
}
void init_entity_tag_map(EntityManager_t* p_manager, unsigned int tag_number, unsigned int initial_size)
{
if (tag_number >= N_TAGS) return;
sc_map_init_64v(p_manager->entities_map + tag_number, initial_size, 0);
p_manager->tag_map_inited[tag_number] = true;
}
void update_entity_manager(EntityManager_t* p_manager)
{
// This will only update the entity map of the manager
@ -27,7 +32,10 @@ void update_entity_manager(EntityManager_t* p_manager)
{
Entity_t *p_entity = get_entity_wtih_id(e_idx);
sc_map_put_64v(&p_manager->entities, e_idx, (void *)p_entity);
sc_map_put_64v(&p_manager->entities_map[p_entity->m_tag], e_idx, (void *)p_entity);
if (p_manager->tag_map_inited[p_entity->m_tag])
{
sc_map_put_64v(&p_manager->entities_map[p_entity->m_tag], e_idx, (void *)p_entity);
}
}
sc_queue_clear(&p_manager->to_add);
@ -42,7 +50,10 @@ void update_entity_manager(EntityManager_t* p_manager)
sc_map_del_64v(&p_manager->component_map[i], e_idx);
p_entity->components[i] = MAX_COMP_POOL_SIZE;
}
sc_map_del_64v(&p_manager->entities_map[p_entity->m_tag], e_idx);
if (p_manager->tag_map_inited[p_entity->m_tag])
{
sc_map_del_64v(&p_manager->entities_map[p_entity->m_tag], e_idx);
}
free_entity_to_mempool(e_idx);
sc_map_del_64v(&p_manager->entities, e_idx);
}
@ -88,7 +99,10 @@ void free_entity_manager(EntityManager_t* p_manager)
}
for (size_t i = 0; i < N_TAGS; ++i)
{
sc_map_term_64v(p_manager->entities_map + i);
if (p_manager->tag_map_inited[i])
{
sc_map_term_64v(p_manager->entities_map + i);
}
}
sc_queue_term(&p_manager->to_add);
sc_queue_term(&p_manager->to_remove);

View File

@ -883,8 +883,11 @@ static void level_do_action(Scene_t* scene, ActionType_t action, bool pressed)
void init_sandbox_scene(LevelScene_t* scene)
{
//init_scene(&scene->scene, LEVEL_SCENE, &level_scene_render_func, &level_do_action);
init_scene(&scene->scene, &level_scene_render_func, &level_do_action);
init_entity_tag_map(&scene->scene.ent_manager, PLAYER_ENT_TAG, 4);
init_entity_tag_map(&scene->scene.ent_manager, BOULDER_ENT_TAG, MAX_COMP_POOL_SIZE);
init_entity_tag_map(&scene->scene.ent_manager, LEVEL_END_TAG, 16);
init_entity_tag_map(&scene->scene.ent_manager, DYNMEM_ENT_TAG, 16);
scene->data.tilemap.tiles = all_tiles;
init_level_scene_data(

View File

@ -345,8 +345,11 @@ static void render_regular_game_scene(Scene_t* scene)
void init_game_scene(LevelScene_t* scene)
{
//init_scene(&scene->scene, LEVEL_SCENE, &level_scene_render_func, &level_do_action);
init_scene(&scene->scene, &level_scene_render_func, &level_do_action);
init_entity_tag_map(&scene->scene.ent_manager, PLAYER_ENT_TAG, 4);
init_entity_tag_map(&scene->scene.ent_manager, BOULDER_ENT_TAG, MAX_COMP_POOL_SIZE);
init_entity_tag_map(&scene->scene.ent_manager, LEVEL_END_TAG, 16);
init_entity_tag_map(&scene->scene.ent_manager, DYNMEM_ENT_TAG, 16);
scene->data.tilemap.tiles = all_tiles;
init_level_scene_data(