From 10d48c1d70815da911bfb458ebd34d25a4c9a290 Mon Sep 17 00:00:00 2001 From: En Yi Date: Sat, 24 Aug 2024 14:42:11 +0800 Subject: [PATCH] Allow optional inits for scene Particle system and entity management are now optional during scene init. --- engine/engine.c | 30 ++++++++++++++++++++++++------ engine/engine.h | 6 +++++- scene_man_test.c | 2 +- scenes/editor_scene.c | 2 +- scenes/game_scene.c | 2 +- scenes/level_select_scene.c | 2 +- scenes/menu_scene.c | 2 +- water_test.c | 2 +- 8 files changed, 35 insertions(+), 13 deletions(-) diff --git a/engine/engine.c b/engine/engine.c index e7d3eda..24b787f 100644 --- a/engine/engine.c +++ b/engine/engine.c @@ -150,13 +150,20 @@ void update_sfx_list(GameEngine_t* engine) engine->sfx_list.played_sfx = 0; } -void init_scene(Scene_t* scene, action_func_t action_func) +void init_scene(Scene_t* scene, action_func_t action_func, uint32_t subsystem_init) { sc_map_init_64(&scene->action_map, 32, 0); sc_array_init(&scene->systems); - init_entity_manager(&scene->ent_manager); - init_particle_system(&scene->part_sys); + if (subsystem_init & ENABLE_ENTITY_MANAGEMENT_SYSTEM) + { + init_entity_manager(&scene->ent_manager); + } + if (subsystem_init & ENABLE_PARTICLE_SYSTEM) + { + init_particle_system(&scene->part_sys); + } + scene->subsystem_init = subsystem_init; //scene->scene_type = scene_type; scene->layers.n_layers = 0; scene->bg_colour = WHITE; @@ -184,8 +191,16 @@ void free_scene(Scene_t* scene) { UnloadRenderTexture(scene->layers.render_layers[i].layer_tex); } - free_entity_manager(&scene->ent_manager); - deinit_particle_system(&scene->part_sys); + + if (scene->subsystem_init & ENABLE_ENTITY_MANAGEMENT_SYSTEM) + { + free_entity_manager(&scene->ent_manager); + } + + if (scene->subsystem_init & ENABLE_PARTICLE_SYSTEM) + { + deinit_particle_system(&scene->part_sys); + } } inline void update_scene(Scene_t* scene, float delta_time) @@ -198,7 +213,10 @@ inline void update_scene(Scene_t* scene, float delta_time) { sys(scene); } - update_particle_system(&scene->part_sys, scene->delta_time); + if (scene->subsystem_init & ENABLE_PARTICLE_SYSTEM) + { + update_particle_system(&scene->part_sys, scene->delta_time); + } } static void _internal_render_scene(Scene_t* scene) diff --git a/engine/engine.h b/engine/engine.h index a205116..cfafc5b 100644 --- a/engine/engine.h +++ b/engine/engine.h @@ -60,6 +60,7 @@ typedef struct SceneRenderLayers { struct Scene { // Not all scene needs an entity manager // but too late to change this + uint32_t subsystem_init; EntityManager_t ent_manager; Scene_t* parent_scene; struct sc_map_64 action_map; // key -> actions @@ -99,7 +100,10 @@ extern void update_scene(Scene_t* scene, float delta_time); extern void render_scene(Scene_t* scene); extern void do_action(Scene_t* scene, ActionType_t action, bool pressed); -void init_scene(Scene_t* scene, action_func_t action_func); +//void init_scene(Scene_t* scene, action_func_t action_func); +#define ENABLE_ENTITY_MANAGEMENT_SYSTEM (1) +#define ENABLE_PARTICLE_SYSTEM (1 << 1) +void init_scene(Scene_t* scene, action_func_t action_func, uint32_t subsystem_init); bool add_scene_layer(Scene_t* scene, int width, int height, Rectangle render_area); void free_scene(Scene_t* scene); void add_child_scene(GameEngine_t* engine, unsigned int child_idx, unsigned int parent_idx); diff --git a/scene_man_test.c b/scene_man_test.c index f242e78..bb585ad 100644 --- a/scene_man_test.c +++ b/scene_man_test.c @@ -109,7 +109,7 @@ int main(void) for (uint8_t i = 0; i < 6; ++i) { scenes[i] = &dummy_scenes[i].scene; - init_scene(&dummy_scenes[i].scene, &level_do_action); + init_scene(&dummy_scenes[i].scene, &level_do_action, 0); dummy_scenes[i].scene.engine = &engine; dummy_scenes[i].number = i; add_scene_layer( diff --git a/scenes/editor_scene.c b/scenes/editor_scene.c index f3e5cb9..2bad01e 100644 --- a/scenes/editor_scene.c +++ b/scenes/editor_scene.c @@ -1146,7 +1146,7 @@ static void at_level_complete(Scene_t* scene) void init_sandbox_scene(LevelScene_t* scene) { - init_scene(&scene->scene, &level_do_action); + init_scene(&scene->scene, &level_do_action, ENABLE_ENTITY_MANAGEMENT_SYSTEM | ENABLE_PARTICLE_SYSTEM); 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); diff --git a/scenes/game_scene.c b/scenes/game_scene.c index 32cae12..95f3b28 100644 --- a/scenes/game_scene.c +++ b/scenes/game_scene.c @@ -478,7 +478,7 @@ static void at_level_complete(Scene_t* scene) void init_game_scene(LevelScene_t* scene) { - init_scene(&scene->scene, &level_do_action); + init_scene(&scene->scene, &level_do_action, ENABLE_ENTITY_MANAGEMENT_SYSTEM | ENABLE_PARTICLE_SYSTEM); 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); diff --git a/scenes/level_select_scene.c b/scenes/level_select_scene.c index d043b8a..8b1af86 100644 --- a/scenes/level_select_scene.c +++ b/scenes/level_select_scene.c @@ -104,7 +104,7 @@ static void level_select_do_action(Scene_t* scene, ActionType_t action, bool pre #define SCROLL_TOTAL_HEIGHT 800 void init_level_select_scene(LevelSelectScene_t* scene) { - init_scene(&scene->scene, &level_select_do_action); + init_scene(&scene->scene, &level_select_do_action, 0); add_scene_layer( &scene->scene, 400, 800, (Rectangle){START_X, START_Y, 400, 800} diff --git a/scenes/menu_scene.c b/scenes/menu_scene.c index d1b8e5c..a776f16 100644 --- a/scenes/menu_scene.c +++ b/scenes/menu_scene.c @@ -138,7 +138,7 @@ static void gui_loop(Scene_t* scene) void init_menu_scene(MenuScene_t* scene) { - init_scene(&scene->scene, &menu_do_action); + init_scene(&scene->scene, &menu_do_action, 0); sc_array_add(&scene->scene.systems, &gui_loop); sc_array_add(&scene->scene.systems, &menu_scene_render_func); diff --git a/water_test.c b/water_test.c index 31637dd..309cfb6 100644 --- a/water_test.c +++ b/water_test.c @@ -400,7 +400,7 @@ int main(void) LevelScene_t scene; scene.scene.engine = &engine; - init_scene(&scene.scene, &level_do_action); + init_scene(&scene.scene, &level_do_action, ENABLE_ENTITY_MANAGEMENT_SYSTEM); init_entity_tag_map(&scene.scene.ent_manager, PLAYER_ENT_TAG, 4); init_entity_tag_map(&scene.scene.ent_manager, DYNMEM_ENT_TAG, 16); init_level_scene_data(