From 57c9eb02161a05258551eb860b3acf550e80d165 Mon Sep 17 00:00:00 2001 From: En Yi Date: Sat, 20 May 2023 16:09:00 +0800 Subject: [PATCH] Fix incorrect usage of s64 map Changelog: - Turns out, the map doesnt make a copy of the string for storage. Therefore, need to store the name somewhere before inserting into the map. - Add struct for each assets to retain the name. - Update assets functions to maintain interface --- scenes/engine/assets.c | 70 ++++++++++++++++++++++++++++++------------ 1 file changed, 50 insertions(+), 20 deletions(-) diff --git a/scenes/engine/assets.c b/scenes/engine/assets.c index 98f39ac..1aca17c 100644 --- a/scenes/engine/assets.c +++ b/scenes/engine/assets.c @@ -5,23 +5,50 @@ #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 -static Texture2D textures[MAX_TEXTURES]; -static Font fonts[MAX_FONTS]; -static Sound sfx[MAX_SOUNDS]; -static Sprite_t sprites[MAX_SPRITES]; +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); - textures[tex_idx] = LoadTexture(path); - sc_map_put_s64(&assets->m_textures, name, tex_idx); + 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; + return &textures[tex_idx].texture; } Sprite_t* add_sprite(Assets_t* assets, const char* name, Texture2D* texture) @@ -29,30 +56,33 @@ 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].texture = texture; - sc_map_put_s64(&assets->m_sprites, name, spr_idx); + 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; + 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] = LoadSound(path); - sc_map_put_s64(&assets->m_sounds, name, snd_idx); + 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; + 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] = LoadFont(path); - sc_map_put_s64(&assets->m_fonts, name, fnt_idx); + 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; + return &fonts[fnt_idx].font; } void init_assets(Assets_t* assets) @@ -86,7 +116,7 @@ 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; + return &textures[tex_idx].texture; } return NULL; } @@ -96,7 +126,7 @@ 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; + return &sprites[spr_idx].sprite; } return NULL; } @@ -106,7 +136,7 @@ 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; + return &sfx[snd_idx].sound; } return NULL; } @@ -116,7 +146,7 @@ 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; + return &fonts[fnt_idx].font; } return NULL; }