#ifndef TEXTURE_H #define TEXTURE_H #include "cglm/struct/vec4.h" #include #include #define INVALID_TEXTURE_ID UINT16_MAX typedef enum { REPEAT, CLAMP, } wrap_mode_t; typedef enum { NEAREST, LINEAR, } filter_mode_t; typedef struct { uint32_t width; uint32_t height; wrap_mode_t wrap_mode; filter_mode_t filter_mode; uint8_t channel_count; uint8_t* data; } texture_t; typedef struct { char* full_name; texture_t texture; } texture_asset_t; typedef struct { uint16_t count; uint16_t size; texture_asset_t* buffer; } texture_collection_t; typedef struct { uint16_t id; } texture_entity_t; bool texture_collection_init(uint16_t size, texture_collection_t* textures); void texture_collection_resize(texture_collection_t* textures, uint16_t size); void texture_collection_free(texture_collection_t* textures); texture_entity_t texture_load(const char* filename, bool srgb, texture_collection_t* textures); vec4s texture_sample(const texture_t* texture, float u, float v); void texture_free(texture_t* texture); inline texture_entity_t invalid_texture_entity() { return (texture_entity_t){.id = INVALID_TEXTURE_ID}; } inline bool is_texture_entity_valid(texture_entity_t entity) { return entity.id != INVALID_TEXTURE_ID; } inline texture_t* get_texture(const texture_collection_t* textures, texture_entity_t entity) { if (entity.id >= textures->count || !is_texture_entity_valid(entity)) { return NULL; } return &textures->buffer[entity.id].texture; } #endif // TEXTURE_H