HATPC/scenes/engine/assets.c

164 lines
4.3 KiB
C

#include "assets.h"
#include "assert.h"
#define MAX_TEXTURES 16
#define MAX_SPRITES 16
#define MAX_SOUNDS 16
#define MAX_FONTS 4
#define MAX_NAME_LEN 32
uint8_t free_idx[4] = {0};
// Hard limit number of
typedef struct TextureData
{
Texture2D texture;
char name[MAX_NAME_LEN];
}TextureData_t;
typedef struct SpriteData
{
Sprite_t sprite;
char name[MAX_NAME_LEN];
}SpriteData_t;
typedef struct FontData
{
Font font;
char name[MAX_NAME_LEN];
}FontData_t;
typedef struct SoundData
{
Sound sound;
char name[MAX_NAME_LEN];
}SoundData_t;
static TextureData_t textures[MAX_TEXTURES];
static FontData_t fonts[MAX_FONTS];
static SoundData_t sfx[MAX_SOUNDS];
static SpriteData_t sprites[MAX_SPRITES];
// Maybe need a circular buffer??
Texture2D* add_texture(Assets_t* assets, const char* name, const char* path)
{
uint8_t tex_idx = free_idx[0];
assert(tex_idx < MAX_TEXTURES);
Texture2D tex = LoadTexture(path);
if (tex.width == 0 || tex.height == 0) return NULL;
textures[tex_idx].texture = tex;
strncpy(textures[tex_idx].name, name, MAX_NAME_LEN);
sc_map_put_s64(&assets->m_textures, textures[tex_idx].name, tex_idx);
free_idx[0]++;
return &textures[tex_idx].texture;
}
Sprite_t* add_sprite(Assets_t* assets, const char* name, Texture2D* texture)
{
uint8_t spr_idx = free_idx[1];
assert(spr_idx < MAX_SPRITES);
memset(sprites + spr_idx, 0, sizeof(Sprite_t));
sprites[spr_idx].sprite.texture = texture;
strncpy(sprites[spr_idx].name, name, MAX_NAME_LEN);
sc_map_put_s64(&assets->m_sprites, sprites[spr_idx].name, spr_idx);
free_idx[1]++;
return &sprites[spr_idx].sprite;
}
Sound* add_sound(Assets_t* assets, const char* name, const char* path)
{
uint8_t snd_idx = free_idx[2];
assert(snd_idx < MAX_SOUNDS);
sfx[snd_idx].sound = LoadSound(path);
strncpy(sfx[snd_idx].name, name, MAX_NAME_LEN);
sc_map_put_s64(&assets->m_sounds, sfx[snd_idx].name, snd_idx);
free_idx[2]++;
return &sfx[snd_idx].sound;
}
Font* add_font(Assets_t* assets, const char* name, const char* path)
{
uint8_t fnt_idx = free_idx[3];
assert(fnt_idx < MAX_FONTS);
fonts[fnt_idx].font = LoadFont(path);
strncpy(fonts[fnt_idx].name, name, MAX_NAME_LEN);
sc_map_put_s64(&assets->m_fonts, fonts[fnt_idx].name, fnt_idx);
free_idx[3]++;
return &fonts[fnt_idx].font;
}
void init_assets(Assets_t* assets)
{
sc_map_init_s64(&assets->m_fonts, MAX_FONTS, 0);
sc_map_init_s64(&assets->m_sprites, MAX_SPRITES, 0);
sc_map_init_s64(&assets->m_textures, MAX_TEXTURES, 0);
sc_map_init_s64(&assets->m_sounds, MAX_SOUNDS, 0);
}
void free_all_assets(Assets_t* assets)
{
sc_map_clear_s64(&assets->m_textures);
sc_map_clear_s64(&assets->m_fonts);
sc_map_clear_s64(&assets->m_sounds);
sc_map_clear_s64(&assets->m_sprites);
memset(free_idx, 0, sizeof(free_idx));
}
void term_assets(Assets_t* assets)
{
free_all_assets(assets);
sc_map_term_s64(&assets->m_textures);
sc_map_term_s64(&assets->m_fonts);
sc_map_term_s64(&assets->m_sounds);
sc_map_term_s64(&assets->m_sprites);
}
Texture2D* get_texture(Assets_t* assets, const char* name)
{
uint8_t tex_idx = sc_map_get_s64(&assets->m_textures, name);
if (sc_map_found(&assets->m_textures))
{
return &textures[tex_idx].texture;
}
return NULL;
}
Sprite_t* get_sprite(Assets_t* assets, const char* name)
{
uint8_t spr_idx = sc_map_get_s64(&assets->m_sprites, name);
if (sc_map_found(&assets->m_sprites))
{
return &sprites[spr_idx].sprite;
}
return NULL;
}
Sound* get_sound(Assets_t* assets, const char* name)
{
uint8_t snd_idx = sc_map_get_s64(&assets->m_sounds, name);
if (sc_map_found(&assets->m_sounds))
{
return &sfx[snd_idx].sound;
}
return NULL;
}
Font* get_font(Assets_t* assets, const char* name)
{
uint8_t fnt_idx = sc_map_get_s64(&assets->m_fonts, name);
if (sc_map_found(&assets->m_fonts))
{
return &fonts[fnt_idx].font;
}
return NULL;
}
void draw_sprite(Sprite_t* spr, Vector2 pos, bool flip_x)
{
Rectangle rec = {
spr->origin.x + spr->frame_size.x * spr->current_frame,
spr->origin.y,
spr->frame_size.x * (flip_x ? -1:1),
spr->frame_size.y
};
DrawTextureRec(*spr->texture, rec, pos, WHITE);
}