2024-07-08 00:44:20 +00:00
|
|
|
#ifndef TEXTURES_H
|
|
|
|
#define TEXTURES_H
|
|
|
|
|
|
|
|
|
|
|
|
#include <SDL2/SDL.h>
|
|
|
|
#include <stb_rect_pack.h>
|
|
|
|
|
|
|
|
#include <stdbool.h>
|
|
|
|
|
|
|
|
|
|
|
|
struct texture {
|
|
|
|
SDL_Rect srcrect; /* position in atlas */
|
|
|
|
SDL_Surface *data; /* original image data */
|
|
|
|
SDL_Texture *loner_data; /* loner textures store their data directly */
|
|
|
|
int atlas_index; /* which atlas the texture is in */
|
|
|
|
int8_t layer;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
struct texture_cache_item {
|
|
|
|
char *key;
|
|
|
|
struct texture value;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
/* use the public API to create and manipulate instances of this structure */
|
|
|
|
struct texture_cache {
|
|
|
|
/* from context */
|
|
|
|
SDL_Window *window;
|
|
|
|
SDL_Renderer *renderer;
|
|
|
|
|
|
|
|
struct texture_cache_item *hash;
|
|
|
|
struct texture_cache_item *loner_hash;
|
|
|
|
|
|
|
|
stbrp_node *node_buffer; /* used internally by stb_rect_pack */
|
|
|
|
|
|
|
|
SDL_Surface **atlas_surfaces;
|
|
|
|
SDL_Texture **atlas_textures;
|
|
|
|
int atlas_index;
|
|
|
|
|
|
|
|
bool is_dirty; /* current atlas needs to be recreated */
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
void textures_cache_init(struct texture_cache *cache, SDL_Window *window);
|
|
|
|
void textures_cache_deinit(struct texture_cache *cache);
|
|
|
|
|
|
|
|
/* for debugging */
|
|
|
|
void textures_dump_atlases(struct texture_cache *cache);
|
|
|
|
|
|
|
|
/* 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 */
|
|
|
|
/* preload textures you know will definitely be used */
|
2024-07-10 16:15:28 +00:00
|
|
|
void textures_load(struct texture_cache *cache, const char *path);
|
2024-07-08 00:44:20 +00:00
|
|
|
|
|
|
|
/* repacks the current texture atlas based on the texture cache */
|
|
|
|
void textures_update_current_atlas(struct texture_cache *cache);
|
|
|
|
|
|
|
|
/* returns a rect in a texture cache atlas based on a path, for drawing */
|
|
|
|
/* if the texture is not found, returns a zero-filled rect (so check w or h) */
|
2024-07-10 16:15:28 +00:00
|
|
|
SDL_Rect textures_get_srcrect(struct texture_cache *cache, const char *path);
|
2024-07-08 00:44:20 +00:00
|
|
|
|
|
|
|
/* returns which atlas the texture in the path is in, starting from 0 */
|
|
|
|
/* if the texture is not found, returns INT_MIN */
|
2024-07-10 16:15:28 +00:00
|
|
|
int textures_get_atlas_index(struct texture_cache *cache, const char *path);
|
2024-07-08 00:44:20 +00:00
|
|
|
|
|
|
|
/* returns a pointer to the atlas at `index` */
|
|
|
|
/* if the index is out of bounds, returns NULL. */
|
|
|
|
/* you can get the index via texture_get_atlas_index */
|
|
|
|
SDL_Texture *textures_get_atlas(struct texture_cache *cache, int index);
|
|
|
|
|
2024-07-10 16:15:28 +00:00
|
|
|
SDL_Texture *textures_get_loner(struct texture_cache *cache, const char *path);
|
2024-07-08 00:44:20 +00:00
|
|
|
|
|
|
|
/* returns the number of atlases in the cache */
|
|
|
|
size_t textures_get_num_atlases(struct texture_cache *cache);
|
|
|
|
|
|
|
|
|
|
|
|
#endif
|