mirror of
https://gitlab.com/dosowisko.net/libsuperderpy.git
synced 2025-02-07 21:56:44 +01:00
threaded screenshoting (now with gamestates redraw!)
This commit is contained in:
parent
450e33b2e3
commit
a906b14e08
3 changed files with 40 additions and 8 deletions
|
@ -163,6 +163,20 @@ SYMBOL_INTERNAL void* GamestateLoadingThread(void *arg) {
|
|||
return NULL;
|
||||
}
|
||||
|
||||
SYMBOL_INTERNAL void* ScreenshotThread(void *arg) {
|
||||
struct ScreenshotThreadData *data = arg;
|
||||
ALLEGRO_PATH *path = al_get_standard_path(ALLEGRO_USER_DOCUMENTS_PATH);
|
||||
char filename[255];
|
||||
snprintf(filename, 255, "%s_%ju_%ju.png", data->game->name, (uintmax_t)time(NULL), (uintmax_t)clock());
|
||||
al_set_path_filename(path, filename);
|
||||
al_save_bitmap(al_path_cstr(path, ALLEGRO_NATIVE_PATH_SEP), data->bitmap);
|
||||
PrintConsole(data->game, "Screenshot stored in %s", al_path_cstr(path, ALLEGRO_NATIVE_PATH_SEP));
|
||||
al_destroy_path(path);
|
||||
al_destroy_bitmap(data->bitmap);
|
||||
free(data);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
SYMBOL_INTERNAL void GamestateProgress(struct Game *game) {
|
||||
struct Gamestate *tmp = game->_priv.loading.current;
|
||||
game->_priv.loading.progress++;
|
||||
|
|
|
@ -48,6 +48,11 @@ struct GamestateLoadingThreadData {
|
|||
int bitmap_flags;
|
||||
};
|
||||
|
||||
struct ScreenshotThreadData {
|
||||
struct Game *game;
|
||||
ALLEGRO_BITMAP *bitmap;
|
||||
};
|
||||
|
||||
void DrawGamestates(struct Game *game);
|
||||
void LogicGamestates(struct Game *game);
|
||||
void EventGamestates(struct Game *game, ALLEGRO_EVENT *ev);
|
||||
|
@ -58,6 +63,7 @@ void DrawConsole(struct Game *game);
|
|||
void Console_Load(struct Game *game);
|
||||
void Console_Unload(struct Game *game);
|
||||
void* GamestateLoadingThread(void *arg);
|
||||
void* ScreenshotThread(void *arg);
|
||||
void GamestateProgress(struct Game *game);
|
||||
void* AddGarbage(struct Game *game, void* data);
|
||||
void ClearGarbage(struct Game *game);
|
||||
|
|
|
@ -145,7 +145,7 @@ SYMBOL_EXPORT struct Game* libsuperderpy_init(int argc, char** argv, const char*
|
|||
|
||||
al_install_joystick();
|
||||
|
||||
al_set_new_display_flags(ALLEGRO_OPENGL_ES_PROFILE | ALLEGRO_PROGRAMMABLE_PIPELINE | (game->config.fullscreen ? ALLEGRO_FULLSCREEN_WINDOW : ALLEGRO_WINDOWED) | ALLEGRO_RESIZABLE | ALLEGRO_OPENGL);
|
||||
al_set_new_display_flags(ALLEGRO_PROGRAMMABLE_PIPELINE | (game->config.fullscreen ? ALLEGRO_FULLSCREEN_WINDOW : ALLEGRO_WINDOWED) | ALLEGRO_RESIZABLE | ALLEGRO_OPENGL);
|
||||
#ifdef __EMSCRIPTEN__
|
||||
al_set_new_display_flags((al_get_new_display_flags() | ALLEGRO_WINDOWED) ^ ALLEGRO_FULLSCREEN_WINDOW);
|
||||
#endif
|
||||
|
@ -502,13 +502,25 @@ SYMBOL_INTERNAL void libsuperderpy_mainloop(void *g) {
|
|||
game->_priv.showconsole = true;
|
||||
PrintConsole(game, "DEBUG: Gameplay speed: %.2fx", speed/60.0);
|
||||
} else if ((ev.type == ALLEGRO_EVENT_KEY_DOWN) && (ev.keyboard.keycode == ALLEGRO_KEY_F12)) {
|
||||
ALLEGRO_PATH *path = al_get_standard_path(ALLEGRO_USER_DOCUMENTS_PATH);
|
||||
char filename[255] = { };
|
||||
snprintf(filename, 255, "%s_%lld_%ld.png", game->name, (long long)time(NULL), clock());
|
||||
al_set_path_filename(path, filename);
|
||||
al_save_bitmap(al_path_cstr(path, ALLEGRO_NATIVE_PATH_SEP), al_get_backbuffer(game->display));
|
||||
PrintConsole(game, "Screenshot stored in %s", al_path_cstr(path, ALLEGRO_NATIVE_PATH_SEP));
|
||||
al_destroy_path(path);
|
||||
DrawGamestates(game);
|
||||
int flags = al_get_new_bitmap_flags();
|
||||
al_set_new_bitmap_flags(ALLEGRO_MEMORY_BITMAP);
|
||||
ALLEGRO_BITMAP *bitmap = al_create_bitmap(al_get_display_width(game->display), al_get_display_height(game->display));
|
||||
al_set_new_bitmap_flags(flags);
|
||||
ALLEGRO_BITMAP *target = al_get_target_bitmap();
|
||||
al_set_target_bitmap(bitmap);
|
||||
al_draw_bitmap(al_get_backbuffer(game->display), 0, 0, 0);
|
||||
al_set_target_bitmap(target);
|
||||
PrintConsole(game, "Screenshot made! Storing...");
|
||||
|
||||
struct ScreenshotThreadData *data = malloc(sizeof(struct ScreenshotThreadData));
|
||||
data->game = game;
|
||||
data->bitmap = bitmap;
|
||||
#ifndef LIBSUPERDERPY_SINGLE_THREAD
|
||||
al_run_detached_thread(ScreenshotThread, data);
|
||||
#else
|
||||
ScreenshotThread(data);
|
||||
#endif
|
||||
}
|
||||
EventGamestates(game, &ev);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue