fix: ResourceContainer name field is now a manually allocated string

This commit is contained in:
Sara 2024-09-25 17:37:07 +02:00
parent d44f10c87b
commit 029888c548

View file

@ -15,7 +15,7 @@ typedef enum ResourceType {
typedef struct ResourceContainer {
char const *path;
char const *name;
char *name;
unsigned use_counter;
bool is_loaded;
ResourceType type;
@ -88,13 +88,15 @@ void Internal_IndexResourceDirectory() {
g_resource_map = hash_map_from_types(char const *, ResourceContainer, HashMapHashString);
ResourceContainer placeholder;
for(size_t i = 0; i < g_resource_files.count; ++i) {
char const *name = GetFileNameWithoutExt(g_resource_files.paths[i]);
placeholder = (ResourceContainer){
.is_loaded = false,
.use_counter = 0,
.path = g_resource_files.paths[i],
.name = GetFileNameWithoutExt(g_resource_files.paths[i]),
.name = malloc(strlen(name) + 1),
.type = ResourceGetTypeFromPath(g_resource_files.paths[i])
};
strcpy(placeholder.name, name);
// only index resources that the engine knows how to load
// shaders are made up of two files, so their paths are treated differently
if(placeholder.type == RESOURCE_SHADER) {
@ -117,9 +119,11 @@ void InitializeResourceSubsystem() {
void CleanResourceSubsystem() {
List resources = hash_map_values(&g_resource_map);
list_foreach(ResourceContainer **,resource, &resources)
list_foreach(ResourceContainer **,resource, &resources) {
if((*resource)->is_loaded)
g_unload_functions[(*resource)->type](*resource);
free((*resource)->name);
}
hash_map_empty(&g_resource_map);
UnloadDirectoryFiles(g_resource_files);
}
@ -156,6 +160,7 @@ bool GetShaderResource(char const *path, ShaderResource *out) {
*out = ResourceEmpty(Shader);
ASSERT_RETURN(container != NULL, false, "GetShaderResource: Resource %s not in index.", path);
ASSERT_RETURN(container->type == RESOURCE_SHADER, false, "GetShaderResource: Resource %s is not a Shader.", path);
ASSERT_RETURN(strcmp(container->name, path) == 0, false, "GetShaderResource: Shader resource found name %s instead of %s", container->name, path);
*out = (ShaderResource) {
.handle = container,
.resource = &container->shader
@ -209,6 +214,7 @@ static
void Internal_LoadShaderResource(ResourceContainer *resource) {
char const *vs = TextFormat("%s/%s.vs", resource->path, resource->name);
char const *fs = TextFormat("%s/%s.fs", resource->path, resource->name);
ASSERT_RETURN(resource->type == RESOURCE_SHADER,, "Internal_LoadShaderResource: Attempting to load non-shader resource as shader.");
resource->shader = LoadShader(vs, fs);
ASSERT_RETURN(IsShaderReady(resource->shader),, "Internal_LoadShaderResource: Shader failed to load.");
Internal_OnShaderLoaded((ShaderResource){.resource = &resource->shader, .handle = resource});