From 1e09583c7e12578cea66b336ad4e875ab515888c Mon Sep 17 00:00:00 2001 From: Sebastian Krzyszkowiak Date: Sat, 16 Jul 2022 18:35:27 +0200 Subject: [PATCH] gamestate: Add Gamestate_PreDraw call Meant to be used to draw into auxiliary bitmaps. Separating it from Gamestate_Draw allows for better render target scheduling. --- src/gamestate.h | 6 ++++-- src/gamestates-stub.c.in | 2 ++ src/internal.c | 17 ++++++++++++++++- 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/gamestate.h b/src/gamestate.h index 87957e3..1e40712 100644 --- a/src/gamestate.h +++ b/src/gamestate.h @@ -26,7 +26,7 @@ struct GamestateAPI { void (*draw)(struct Game* game, void* data); void (*logic)(struct Game* game, void* data, double delta); void (*tick)(struct Game* game, void* data); - + void (*predraw)(struct Game* game, void* data); void* (*load)(struct Game* game, void (*progress)(struct Game* game)); void (*post_load)(struct Game* game, void* data); void (*start)(struct Game* game, void* data); @@ -34,7 +34,6 @@ struct GamestateAPI { void (*resume)(struct Game* game, void* data); void (*stop)(struct Game* game, void* data); void (*unload)(struct Game* game, void* data); - void (*process_event)(struct Game* game, void* data, ALLEGRO_EVENT* ev); void (*reload)(struct Game* game, void* data); @@ -77,6 +76,7 @@ bool IsGamestateVisible(struct Game* game, struct Gamestate* gamestate); #define Gamestate_Draw GAMESTATE_CONCAT(LIBSUPERDERPY_GAMESTATE, _Gamestate_Draw) #define Gamestate_Logic GAMESTATE_CONCAT(LIBSUPERDERPY_GAMESTATE, _Gamestate_Logic) #define Gamestate_Tick GAMESTATE_CONCAT(LIBSUPERDERPY_GAMESTATE, _Gamestate_Tick) +#define Gamestate_PreDraw GAMESTATE_CONCAT(LIBSUPERDERPY_GAMESTATE, _Gamestate_PreDraw) #define Gamestate_Load GAMESTATE_CONCAT(LIBSUPERDERPY_GAMESTATE, _Gamestate_Load) #define Gamestate_PostLoad GAMESTATE_CONCAT(LIBSUPERDERPY_GAMESTATE, _Gamestate_PostLoad) #define Gamestate_Start GAMESTATE_CONCAT(LIBSUPERDERPY_GAMESTATE, _Gamestate_Start) @@ -93,6 +93,7 @@ extern int Gamestate_ProgressCount; __attribute__((used)) void Gamestate_Draw(struct Game* game, struct GamestateResources* data); __attribute__((used)) void Gamestate_Logic(struct Game* game, struct GamestateResources* data, double delta); __attribute__((used)) void Gamestate_Tick(struct Game* game, struct GamestateResources* data); +__attribute__((used)) void Gamestate_PreDraw(struct Game* game, struct GamestateResources* data); __attribute__((used)) void* Gamestate_Load(struct Game* game, void (*progress)(struct Game*)); __attribute__((used)) void Gamestate_PostLoad(struct Game* game, struct GamestateResources* data); __attribute__((used)) void Gamestate_Start(struct Game* game, struct GamestateResources* data); @@ -117,6 +118,7 @@ void GAMESTATE_INIT_NAME(LIBSUPERDERPY_GAMESTATE)(void) { .draw = (void*)Gamestate_Draw, .logic = (void*)Gamestate_Logic, .tick = (void*)Gamestate_Tick, + .predraw = (void*)Gamestate_PreDraw, .load = (void*)Gamestate_Load, .post_load = (void*)Gamestate_PostLoad, .start = (void*)Gamestate_Start, diff --git a/src/gamestates-stub.c.in b/src/gamestates-stub.c.in index a2b4fcb..6574727 100644 --- a/src/gamestates-stub.c.in +++ b/src/gamestates-stub.c.in @@ -24,11 +24,13 @@ __attribute__((used)) void GAMESTATES_STUB_CONCAT(name, _Gamestate_PostLoad)(); __attribute__((used)) void GAMESTATES_STUB_CONCAT(name, _Gamestate_Pause)(); \ __attribute__((used)) void GAMESTATES_STUB_CONCAT(name, _Gamestate_Resume)(); \ __attribute__((used)) void GAMESTATES_STUB_CONCAT(name, _Gamestate_Reload)(); \ +__attribute__((used)) void GAMESTATES_STUB_CONCAT(name, _Gamestate_PreDraw)(); \ void GAMESTATES_STUB_CONCAT(name, _Gamestate_Tick)() {} \ void GAMESTATES_STUB_CONCAT(name, _Gamestate_PostLoad)() {} \ void GAMESTATES_STUB_CONCAT(name, _Gamestate_Pause)() {} \ void GAMESTATES_STUB_CONCAT(name, _Gamestate_Resume)() {} \ void GAMESTATES_STUB_CONCAT(name, _Gamestate_Reload)() {} +void GAMESTATES_STUB_CONCAT(name, _Gamestate_PreDraw)() {} ${LIBSUPERDERPY_GAMESTATES_STUB} diff --git a/src/internal.c b/src/internal.c index f12bcf8..09551d3 100644 --- a/src/internal.c +++ b/src/internal.c @@ -46,13 +46,27 @@ SYMBOL_INTERNAL void SimpleCompositor(struct Game* game) { } SYMBOL_INTERNAL void DrawGamestates(struct Game* game) { + struct Gamestate* tmp = game->_priv.gamestates; + while (tmp) { + if (tmp->loaded && tmp->started && tmp->api->predraw) { + game->_priv.current_gamestate = tmp; + tmp->api->predraw(game, tmp->data); + } + tmp = tmp->next; + } + if (game->loading.shown && game->_priv.loading.gamestate->api->predraw) { + game->_priv.loading.gamestate->api->predraw(game, game->_priv.loading.gamestate->data); + } + if (!game->_priv.params.disable_bg_clear && !game->_priv.params.handlers.compositor) { ClearScreen(game); } - struct Gamestate* tmp = game->_priv.gamestates; + if (game->_priv.params.handlers.predraw) { game->_priv.params.handlers.predraw(game); } + + tmp = game->_priv.gamestates; while (tmp) { if ((tmp->loaded) && (tmp->started)) { game->_priv.current_gamestate = tmp; @@ -405,6 +419,7 @@ SYMBOL_INTERNAL bool LinkGamestate(struct Game* game, struct Gamestate* gamestat if (!(gamestate->api->process_event = dlsym(gamestate->handle, "Gamestate_ProcessEvent"))) { GS_ERROR; } // optional + gamestate->api->predraw = dlsym(gamestate->handle, "Gamestate_PreDraw"); gamestate->api->tick = dlsym(gamestate->handle, "Gamestate_Tick"); gamestate->api->post_load = dlsym(gamestate->handle, "Gamestate_PostLoad"); gamestate->api->pause = dlsym(gamestate->handle, "Gamestate_Pause");