#ifndef TWN_TEXTURES_H #define TWN_TEXTURES_H #include "twn_util.h" #include "twn_texture_modes.h" #include "twn_engine_api.h" #include "twn_gpu_texture.h" #include #include #include struct texture { t_frect srcrect; /* position in atlas */ SDL_Surface *data; /* original image data */ int atlas_index; gpu_texture loner_texture; /* stored directly for loners, == 0 means atlas_index should be used */ gpu_texture repeating_texture; /* separately allocated texture, for loners == loner_texture */ enum texture_mode mode; }; struct texture_cache_item { char *key; struct texture value; }; struct texture_cache { SDL_Window *window; /* from context */ struct texture_cache_item *hash; stbrp_node *node_buffer; /* used internally by stb_rect_pack */ SDL_Surface **atlas_surfaces; gpu_texture *atlas_textures; /* shared by atlas textures */ int atlas_index; /* atlas that is currently being built */ bool is_dirty; /* current atlas needs to be recreated */ }; /* type safe structure for persistent texture handles */ typedef struct { uint16_t id; } t_texture_key; /* tests whether given key structure corresponds to any texture */ #define m_texture_key_is_valid(p_key) ((p_key).id != (uint16_t)-1) 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 */ // void textures_load(struct texture_cache *cache, const char *path); /* repacks the current texture atlas based on the texture cache if needed */ /* any previously returned srcrect results are invalidated after that */ /* call it every time before rendering */ void textures_update_atlas(struct texture_cache *cache); /* returns a persistent handle to some texture in cache, loading it if needed */ /* check the result with m_texture_key_is_valid() */ t_texture_key textures_get_key(struct texture_cache *cache, const char *path); /* returns a rect in a texture cache of the given key */ t_frect textures_get_srcrect(const struct texture_cache *cache, t_texture_key key); /* returns a rect of dimensions of the whole texture (whole atlas) */ t_frect textures_get_dims(const struct texture_cache *cache, t_texture_key key); /* returns an identifier that is equal for all textures placed in the same atlas */ int32_t textures_get_atlas_id(const struct texture_cache *cache, t_texture_key key); void textures_bind(const struct texture_cache *cache, t_texture_key key); void textures_bind_repeating(const struct texture_cache *cache, t_texture_key key); /* returns helpful information about contents of alpha channel in given texture */ enum texture_mode textures_get_mode(const struct texture_cache *cache, t_texture_key key); /* returns the number of atlases in the cache */ size_t textures_get_num_atlases(const struct texture_cache *cache); /* TODO: should recieve texture_cache, get_key optimization cache should be cleared some other way */ void textures_reset_state(void); #endif