diff --git a/engine/engine.h b/engine/engine.h index 65d3be7..95dfdb1 100644 --- a/engine/engine.h +++ b/engine/engine.h @@ -21,17 +21,11 @@ typedef struct SceneNode { Scene_t* next; } SceneNode_t; -typedef struct SceneManager { - Scene_t **scenes; // Array of all possible scenes - unsigned int max_scenes; - SceneNode_t* active; // Scenes to update. This allows multiple scene updates - SceneNode_t* to_render; // Scenes to render. This allows duplicate rendering -} SceneManger_t; - typedef struct GameEngine { Scene_t **scenes; unsigned int max_scenes; unsigned int curr_scene; + Scene_t* scenes_render_order[MAX_SCENES_TO_RENDER]; Assets_t assets; SFXList_t sfx_list; // Maintain own queue to handle key presses @@ -42,20 +36,22 @@ typedef struct GameEngine { Vector2 intended_window_size; } GameEngine_t; -//typedef enum SceneType { -// LEVEL_SCENE = 0, -// MENU_SCENE, -//}SceneType_t; - typedef enum SceneState { - SCENE_PLAYING = 0, - SCENE_SUSPENDED, + SCENE_PLAYING = 0, // All Systems Active + SCENE_SUSPENDED, // SCENE_ENDED, }SceneState_t; -typedef void(*render_func_t)(Scene_t*); +#define SCENE_ACTIVE_BIT (1 << 0) // Systems Active +#define SCENE_RENDER_BIT (1 << 1) // Whether to render + +typedef enum ActionResult { + ACTION_PROPAGATE = 0, + ACTION_CONSUMED, +} ActionResult; + typedef void(*system_func_t)(Scene_t*); -typedef void(*action_func_t)(Scene_t*, ActionType_t, bool); +typedef ActionResult(*action_func_t)(Scene_t*, ActionType_t, bool); sc_array_def(system_func_t, systems); typedef struct RenderLayer { @@ -69,20 +65,23 @@ typedef struct SceneRenderLayers { } SceneRenderLayers_t; struct Scene { + // Not all scene needs an entity manager + // but too late to change this + EntityManager_t ent_manager; + Scene_t* parent_scene; struct sc_map_64 action_map; // key -> actions struct sc_array_systems systems; SceneRenderLayers_t layers; Color bg_colour; action_func_t action_function; - EntityManager_t ent_manager; // TODO: need move in data, Not all scene need this float delta_time; float time_scale; Vector2 mouse_pos; - //SceneType_t scene_type; SceneState_t state; ParticleSystem_t part_sys; GameEngine_t *engine; int8_t depth_index; + SceneNode_t child_scene; // Intrusive Linked List for children scene }; diff --git a/engine/engine_conf.h b/engine/engine_conf.h index 3986128..033f26f 100644 --- a/engine/engine_conf.h +++ b/engine/engine_conf.h @@ -1,6 +1,7 @@ #ifndef _ENGINE_CONF_H #define _ENGINE_CONF_H +#define MAX_SCENES_TO_RENDER 16 #define MAX_RENDER_LAYERS 4 #define MAX_ENTITIES 2048 #define MAX_TEXTURES 16 diff --git a/scenes/assets_tag.h b/scenes/assets_tag.h index 520dba5..15cee3e 100644 --- a/scenes/assets_tag.h +++ b/scenes/assets_tag.h @@ -34,4 +34,10 @@ typedef enum SFXTag { BUBBLE_SFX, COIN_SFX, } SFXTag_t; + +//typedef enum SceneType { +// LEVEL_SCENE = 0, +// MENU_SCENE, +//}SceneType_t; + #endif diff --git a/scenes/editor_scene.c b/scenes/editor_scene.c index 9234f6f..b7c86a3 100644 --- a/scenes/editor_scene.c +++ b/scenes/editor_scene.c @@ -797,7 +797,7 @@ static void restart_editor_level(Scene_t* scene) } } -static void level_do_action(Scene_t* scene, ActionType_t action, bool pressed) +static ActionResult level_do_action(Scene_t* scene, ActionType_t action, bool pressed) { LevelSceneData_t* data = &(CONTAINER_OF(scene, LevelScene_t, scene)->data); Entity_t* p_player; @@ -1002,6 +1002,7 @@ static void level_do_action(Scene_t* scene, ActionType_t action, bool pressed) break; } } + return ACTION_PROPAGATE; } void init_sandbox_scene(LevelScene_t* scene) diff --git a/scenes/game_scene.c b/scenes/game_scene.c index e78498a..b68ecdc 100644 --- a/scenes/game_scene.c +++ b/scenes/game_scene.c @@ -45,7 +45,7 @@ static void level_scene_render_func(Scene_t* scene) EndTextureMode(); } -static void level_do_action(Scene_t* scene, ActionType_t action, bool pressed) +static ActionResult level_do_action(Scene_t* scene, ActionType_t action, bool pressed) { CPlayerState_t* p_playerstate; sc_map_foreach_value(&scene->ent_manager.component_map[CPLAYERSTATE_T], p_playerstate) @@ -96,6 +96,7 @@ static void level_do_action(Scene_t* scene, ActionType_t action, bool pressed) break; } } + return ACTION_PROPAGATE; } static void render_regular_game_scene(Scene_t* scene) diff --git a/scenes/menu_scene.c b/scenes/menu_scene.c index ccecfd4..4874c9f 100644 --- a/scenes/menu_scene.c +++ b/scenes/menu_scene.c @@ -34,7 +34,7 @@ static void exec_component_function(Scene_t* scene, int sel) } } -static void menu_do_action(Scene_t* scene, ActionType_t action, bool pressed) +static ActionResult menu_do_action(Scene_t* scene, ActionType_t action, bool pressed) { MenuSceneData_t* data = &(CONTAINER_OF(scene, MenuScene_t, scene)->data); unsigned int new_selection = data->selected_comp; @@ -83,6 +83,7 @@ static void menu_do_action(Scene_t* scene, ActionType_t action, bool pressed) exec_component_function(scene, data->selected_comp); } } + return ACTION_PROPAGATE; } static void gui_loop(Scene_t* scene)