make textures_dump_atlases work again and expose it as a utility function
This commit is contained in:
		| @@ -23,6 +23,9 @@ void game_tick(void) { | |||||||
|         input_add_action(&ctx.input, "debug_toggle"); |         input_add_action(&ctx.input, "debug_toggle"); | ||||||
|         input_bind_action_scancode(&ctx.input, "debug_toggle", SDL_SCANCODE_BACKSPACE); |         input_bind_action_scancode(&ctx.input, "debug_toggle", SDL_SCANCODE_BACKSPACE); | ||||||
|  |  | ||||||
|  |         input_add_action(&ctx.input, "debug_dump_atlases"); | ||||||
|  |         input_bind_action_scancode(&ctx.input, "debug_dump_atlases", SDL_SCANCODE_HOME); | ||||||
|  |  | ||||||
|         input_add_action(&ctx.input, "player_left"); |         input_add_action(&ctx.input, "player_left"); | ||||||
|         input_bind_action_scancode(&ctx.input, "player_left", SDL_SCANCODE_A); |         input_bind_action_scancode(&ctx.input, "player_left", SDL_SCANCODE_A); | ||||||
|  |  | ||||||
| @@ -54,6 +57,10 @@ void game_tick(void) { | |||||||
|         ctx.debug = !ctx.debug; |         ctx.debug = !ctx.debug; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     if (input_is_action_just_pressed(&ctx.input, "debug_dump_atlases")) { | ||||||
|  |         textures_dump_atlases(); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     state->scene->tick(state); |     state->scene->tick(state); | ||||||
|  |  | ||||||
|     /* there's a scene switch pending, we can do it now that the tick is done */ |     /* there's a scene switch pending, we can do it now that the tick is done */ | ||||||
|   | |||||||
| @@ -23,6 +23,9 @@ void game_tick(void) { | |||||||
|         input_add_action(&ctx.input, "debug_toggle"); |         input_add_action(&ctx.input, "debug_toggle"); | ||||||
|         input_bind_action_scancode(&ctx.input, "debug_toggle", SDL_SCANCODE_BACKSPACE); |         input_bind_action_scancode(&ctx.input, "debug_toggle", SDL_SCANCODE_BACKSPACE); | ||||||
|  |  | ||||||
|  |         input_add_action(&ctx.input, "debug_dump_atlases"); | ||||||
|  |         input_bind_action_scancode(&ctx.input, "debug_dump_atlases", SDL_SCANCODE_HOME); | ||||||
|  |  | ||||||
|         input_add_action(&ctx.input, "player_left"); |         input_add_action(&ctx.input, "player_left"); | ||||||
|         input_bind_action_scancode(&ctx.input, "player_left", SDL_SCANCODE_A); |         input_bind_action_scancode(&ctx.input, "player_left", SDL_SCANCODE_A); | ||||||
|  |  | ||||||
| @@ -54,6 +57,10 @@ void game_tick(void) { | |||||||
|         ctx.debug = !ctx.debug; |         ctx.debug = !ctx.debug; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     if (input_is_action_just_pressed(&ctx.input, "debug_dump_atlases")) { | ||||||
|  |         textures_dump_atlases(); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     state->scene->tick(state); |     state->scene->tick(state); | ||||||
|  |  | ||||||
|     /* there's a scene switch pending, we can do it now that the tick is done */ |     /* there's a scene switch pending, we can do it now that the tick is done */ | ||||||
|   | |||||||
| @@ -68,6 +68,10 @@ TWN_API int64_t file_to_bytes(const char *path, unsigned char **buf_out); | |||||||
| TWN_API char *file_to_str(const char *path); | TWN_API char *file_to_str(const char *path); | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /* saves all texture atlases as BMP files in the write directory */ | ||||||
|  | TWN_API void textures_dump_atlases(void); | ||||||
|  |  | ||||||
|  |  | ||||||
| /* returns true if str ends with suffix */ | /* returns true if str ends with suffix */ | ||||||
| TWN_API TWN_API bool strends(const char *str, const char *suffix); | TWN_API TWN_API bool strends(const char *str, const char *suffix); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -300,31 +300,6 @@ void textures_cache_deinit(TextureCache *cache) { | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| void textures_dump_atlases(TextureCache *cache) { |  | ||||||
|     PHYSFS_mkdir("/dump"); |  | ||||||
|  |  | ||||||
|     const char string_template[] = "/dump/atlas%zd.png"; |  | ||||||
|     char buf[2048]; /* larger than will ever be necessary */ |  | ||||||
|  |  | ||||||
|     size_t i = 0; |  | ||||||
|     for (; i < arrlenu(cache->atlas_surfaces); ++i) { |  | ||||||
|         SDL_snprintf(buf, sizeof buf, string_template, i); |  | ||||||
|  |  | ||||||
|         SDL_RWops *handle = PHYSFSRWOPS_openWrite(buf); |  | ||||||
|  |  | ||||||
|         if (handle == NULL) { |  | ||||||
|             CRY("Texture atlas dump failed.", "File could not be opened"); |  | ||||||
|             return; |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         /* TODO: */ |  | ||||||
|         // IMG_SavePNG_RW(cache->atlas_surfaces[i], handle, true); |  | ||||||
|         CRY("Unimplemented", "textures_dump_atlases dumping is not there, sorry"); |  | ||||||
|         log_info("Dumped atlas %s", buf); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
|  |  | ||||||
| static enum TextureMode infer_texture_mode(SDL_Surface *surface) { | static enum TextureMode infer_texture_mode(SDL_Surface *surface) { | ||||||
|     const uint32_t amask = surface->format->Amask; |     const uint32_t amask = surface->format->Amask; | ||||||
|     if (amask == 0) |     if (amask == 0) | ||||||
|   | |||||||
| @@ -50,9 +50,6 @@ typedef struct TextureKey { uint16_t id; } TextureKey; | |||||||
| void textures_cache_init(struct TextureCache *cache, SDL_Window *window); | void textures_cache_init(struct TextureCache *cache, SDL_Window *window); | ||||||
| void textures_cache_deinit(struct TextureCache *cache); | void textures_cache_deinit(struct TextureCache *cache); | ||||||
|  |  | ||||||
| /* for debugging */ |  | ||||||
| void textures_dump_atlases(struct TextureCache *cache); |  | ||||||
|  |  | ||||||
| /* loads an image if it isn't in the cache, otherwise a no-op. */ | /* loads an image if it isn't in the cache, otherwise a no-op. */ | ||||||
| /* can be called from anywhere at any time after init, useful if you want to */ | /* can be called from anywhere at any time after init, useful if you want to */ | ||||||
| /* preload textures you know will definitely be used */ | /* preload textures you know will definitely be used */ | ||||||
|   | |||||||
| @@ -165,6 +165,30 @@ char *file_to_str(const char *path) { | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void textures_dump_atlases(void) { | ||||||
|  |     PHYSFS_mkdir("/dump"); | ||||||
|  |  | ||||||
|  |     /* TODO: png instead of bmp */ | ||||||
|  |     const char string_template[] = "/dump/atlas%zd.bmp"; | ||||||
|  |  | ||||||
|  |     size_t i = 0; | ||||||
|  |     for (; i < arrlenu(ctx.texture_cache.atlas_surfaces); ++i) { | ||||||
|  |         char *buf = NULL; | ||||||
|  |         SDL_asprintf(&buf, string_template, i); | ||||||
|  |  | ||||||
|  |         SDL_RWops *handle = PHYSFSRWOPS_openWrite(buf); | ||||||
|  |  | ||||||
|  |         if (handle == NULL) { | ||||||
|  |             CRY("Texture atlas dump failed.", "File could not be opened"); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         SDL_SaveBMP_RW(ctx.texture_cache.atlas_surfaces[i], handle, true); | ||||||
|  |         log_info("Dumped atlas %zu to %s", i, buf); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
| bool strends(const char *str, const char *suffix) { | bool strends(const char *str, const char *suffix) { | ||||||
|     size_t str_length = SDL_strlen(str); |     size_t str_length = SDL_strlen(str); | ||||||
|     size_t suffix_length = SDL_strlen(suffix); |     size_t suffix_length = SDL_strlen(suffix); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user