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.
This commit is contained in:
Sebastian Krzyszkowiak 2022-07-16 18:35:27 +02:00
parent b806f1b596
commit 1e09583c7e
No known key found for this signature in database
GPG key ID: E8F235CF3BDBC3FF
3 changed files with 22 additions and 3 deletions

View file

@ -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,

View file

@ -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}

View file

@ -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");