Inverted some resource flags
Preparing to remove directory scanning
This commit is contained in:
parent
8d601fe2e1
commit
915c15c766
16 changed files with 89 additions and 71 deletions
|
@ -49,12 +49,12 @@ void reset_sounds(void) {
|
|||
}
|
||||
|
||||
Sound* get_sound(const char *name) {
|
||||
Resource *res = get_resource(RES_SFX, name, 0);
|
||||
Resource *res = get_resource(RES_SFX, name, RESF_OPTIONAL);
|
||||
return res ? res->sound : NULL;
|
||||
}
|
||||
|
||||
Music* get_music(const char *name) {
|
||||
Resource *res = get_resource(RES_BGM, name, 0);
|
||||
Resource *res = get_resource(RES_BGM, name, RESF_OPTIONAL);
|
||||
return res ? res->music : NULL;
|
||||
}
|
||||
|
||||
|
|
|
@ -26,7 +26,7 @@ void taisei_shutdown(void) {
|
|||
printf("\nshutdown:\n");
|
||||
|
||||
free_all_refs();
|
||||
free_resources(0);
|
||||
free_resources(true);
|
||||
audio_shutdown();
|
||||
video_shutdown();
|
||||
gamepad_shutdown();
|
||||
|
|
|
@ -66,7 +66,7 @@ troll2:
|
|||
goto troll2;
|
||||
}
|
||||
|
||||
free_resources(RESF_TRANSIENT);
|
||||
free_resources(false);
|
||||
|
||||
if(global.replay_stage) {
|
||||
switch(config_get_int(CONFIG_SAVE_RPY)) {
|
||||
|
|
|
@ -673,7 +673,7 @@ void replay_play(Replay *rpy, int firststage) {
|
|||
global.replaymode = REPLAY_RECORD;
|
||||
replay_destroy(&global.replay);
|
||||
global.replay_stage = NULL;
|
||||
free_resources(RESF_TRANSIENT);
|
||||
free_resources(false);
|
||||
}
|
||||
|
||||
void replay_play_path(const char *path, int firststage) {
|
||||
|
|
|
@ -105,7 +105,7 @@ void* load_animation(const char *filename) {
|
|||
}
|
||||
|
||||
Animation *get_ani(const char *name) {
|
||||
return get_resource(RES_ANIM, name, RESF_REQUIRED)->animation;
|
||||
return get_resource(RES_ANIM, name, RESF_DEFAULT)->animation;
|
||||
}
|
||||
|
||||
void draw_animation(float x, float y, int row, const char *name) {
|
||||
|
|
|
@ -196,7 +196,7 @@ static void parse_obj(const char *filename, ObjFileData *data) {
|
|||
}
|
||||
|
||||
Model* get_model(const char *name) {
|
||||
return get_resource(RES_MODEL, name, RESF_REQUIRED)->model;
|
||||
return get_resource(RES_MODEL, name, RESF_DEFAULT)->model;
|
||||
}
|
||||
|
||||
void draw_model_p(Model *model) {
|
||||
|
|
|
@ -67,6 +67,11 @@ Resource* insert_resource(ResourceType type, const char *name, void *data, Resou
|
|||
Resource *oldres = hashtable_get_string(handler->mapping, name);
|
||||
Resource *res = malloc(sizeof(Resource));
|
||||
|
||||
if(type == RES_MODEL) {
|
||||
// FIXME: models can't be safely unloaded at runtime
|
||||
flags |= RESF_PERMANENT;
|
||||
}
|
||||
|
||||
res->type = handler->type;
|
||||
res->flags = flags;
|
||||
res->data = data;
|
||||
|
@ -104,7 +109,7 @@ static Resource* load_resource(ResourceHandler *handler, const char *path, const
|
|||
path = allocated_path = handler->find(name);
|
||||
|
||||
if(!path) {
|
||||
if(flags & RESF_REQUIRED) {
|
||||
if(!(flags & RESF_OPTIONAL)) {
|
||||
errx(-1, "load_resource(): required %s '%s' couldn't be located", typename, name);
|
||||
} else {
|
||||
warnx("load_resource(): failed to locate %s '%s'", typename, name);
|
||||
|
@ -134,7 +139,7 @@ static Resource* load_resource(ResourceHandler *handler, const char *path, const
|
|||
name = name ? name : "<name unknown>";
|
||||
path = path ? path : "<path unknown>";
|
||||
|
||||
if(flags & RESF_REQUIRED) {
|
||||
if(!(flags & RESF_OPTIONAL)) {
|
||||
errx(-1, "load_resource(): required %s '%s' couldn't be loaded (%s)", typename, name, path);
|
||||
} else {
|
||||
warnx("load_resource(): failed to load %s '%s' (%s)", typename, name, path);
|
||||
|
@ -162,6 +167,10 @@ Resource* get_resource(ResourceType type, const char *name, ResourceFlags flags)
|
|||
res = load_resource(handler, NULL, name, flags);
|
||||
}
|
||||
|
||||
if(flags & RESF_PERMANENT) {
|
||||
res->flags |= RESF_PERMANENT;
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
|
@ -308,7 +317,7 @@ void load_resources(void) {
|
|||
init_fbo(&resources.fsec);
|
||||
}
|
||||
|
||||
void free_resources(ResourceFlags flags) {
|
||||
void free_resources(bool all) {
|
||||
for(ResourceType type = 0; type < RES_NUMTYPES; ++type) {
|
||||
ResourceHandler *handler = get_handler(type);
|
||||
|
||||
|
@ -319,20 +328,27 @@ void free_resources(ResourceFlags flags) {
|
|||
Resource *res;
|
||||
|
||||
for(HashtableIterator *i = hashtable_iter(handler->mapping); hashtable_iter_next(i, (void**)&name, (void**)&res);) {
|
||||
if ((flags & RESF_TRANSIENT) && !(res->flags & RESF_TRANSIENT)) continue;
|
||||
if(!all && res->flags & RESF_PERMANENT)
|
||||
continue;
|
||||
|
||||
unload_resource(res);
|
||||
printf("Unloaded %s '%s'\n", resource_type_names[type], name);
|
||||
if (flags & RESF_TRANSIENT) hashtable_unset_deferred(handler->mapping, name);
|
||||
|
||||
if(!all) {
|
||||
hashtable_unset_deferred(handler->mapping, name);
|
||||
}
|
||||
}
|
||||
|
||||
if (flags & RESF_TRANSIENT) {
|
||||
if(all) {
|
||||
hashtable_free(handler->mapping);
|
||||
} else {
|
||||
hashtable_unset_deferred_now(handler->mapping);
|
||||
}
|
||||
else {
|
||||
hashtable_free(handler->mapping);
|
||||
}
|
||||
}
|
||||
if (flags & RESF_TRANSIENT) return;
|
||||
|
||||
if(!all) {
|
||||
return;
|
||||
}
|
||||
|
||||
delete_vbo(&_vbo);
|
||||
|
||||
|
|
|
@ -32,11 +32,13 @@ typedef enum ResourceType {
|
|||
} ResourceType;
|
||||
|
||||
typedef enum ResourceFlags {
|
||||
RESF_REQUIRED = 1,
|
||||
RESF_OVERRIDE = 2,
|
||||
RESF_TRANSIENT = 4
|
||||
RESF_OVERRIDE = 1,
|
||||
RESF_OPTIONAL = 2,
|
||||
RESF_PERMANENT = 4,
|
||||
} ResourceFlags;
|
||||
|
||||
#define RESF_DEFAULT 0
|
||||
|
||||
// All paths are relative to the current working directory, which can assumed to be the resources directory,
|
||||
// unless mentioned otherwise.
|
||||
|
||||
|
@ -107,7 +109,7 @@ extern Resources resources;
|
|||
|
||||
void init_resources(void);
|
||||
void load_resources(void);
|
||||
void free_resources(ResourceFlags flags);
|
||||
void free_resources(bool all);
|
||||
|
||||
Resource* get_resource(ResourceType type, const char *name, ResourceFlags flags);
|
||||
Resource* insert_resource(ResourceType type, const char *name, void *data, ResourceFlags flags, const char *source);
|
||||
|
|
|
@ -265,5 +265,5 @@ int uniloc(Shader *sha, const char *name) {
|
|||
}
|
||||
|
||||
Shader* get_shader(const char *name) {
|
||||
return get_resource(RES_SHADER, name, RESF_REQUIRED)->shader;
|
||||
return get_resource(RES_SHADER, name, RESF_DEFAULT)->shader;
|
||||
}
|
||||
|
|
|
@ -42,7 +42,7 @@ void* load_texture(const char *path) {
|
|||
}
|
||||
|
||||
Texture* get_tex(const char *name) {
|
||||
return get_resource(RES_TEXTURE, name, RESF_REQUIRED)->texture;
|
||||
return get_resource(RES_TEXTURE, name, RESF_DEFAULT)->texture;
|
||||
}
|
||||
|
||||
Texture* prefix_get_tex(const char *name, const char *prefix) {
|
||||
|
|
|
@ -160,11 +160,11 @@ void stage1_start(void) {
|
|||
}
|
||||
|
||||
void stage1_preload(void) {
|
||||
get_resource(RES_BGM, "bgm_stage1", RESF_TRANSIENT);
|
||||
get_resource(RES_BGM, "bgm_stage1boss", RESF_TRANSIENT);
|
||||
get_resource(RES_TEXTURE, "stage1/cirnobg", RESF_REQUIRED | RESF_TRANSIENT);
|
||||
get_resource(RES_TEXTURE, "stage1/fog", RESF_REQUIRED | RESF_TRANSIENT);
|
||||
get_resource(RES_TEXTURE, "stage1/snowlayer", RESF_REQUIRED | RESF_TRANSIENT);
|
||||
get_resource(RES_BGM, "bgm_stage1", RESF_OPTIONAL);
|
||||
get_resource(RES_BGM, "bgm_stage1boss", RESF_OPTIONAL);
|
||||
get_resource(RES_TEXTURE, "stage1/cirnobg", RESF_DEFAULT);
|
||||
get_resource(RES_TEXTURE, "stage1/fog", RESF_DEFAULT);
|
||||
get_resource(RES_TEXTURE, "stage1/snowlayer", RESF_DEFAULT);
|
||||
}
|
||||
|
||||
void stage1_end(void) {
|
||||
|
|
|
@ -174,14 +174,14 @@ void stage2_start(void) {
|
|||
}
|
||||
|
||||
void stage2_preload(void) {
|
||||
get_resource(RES_BGM, "bgm_stage2", RESF_TRANSIENT);
|
||||
get_resource(RES_BGM, "bgm_stage2boss", RESF_TRANSIENT);
|
||||
get_resource(RES_TEXTURE, "stage2/border", RESF_REQUIRED | RESF_TRANSIENT);
|
||||
get_resource(RES_TEXTURE, "stage2/leaves", RESF_REQUIRED | RESF_TRANSIENT);
|
||||
get_resource(RES_TEXTURE, "stage2/roadgrass", RESF_REQUIRED | RESF_TRANSIENT);
|
||||
get_resource(RES_TEXTURE, "stage2/roadstones", RESF_REQUIRED | RESF_TRANSIENT);
|
||||
get_resource(RES_TEXTURE, "stage2/spellbg1", RESF_REQUIRED | RESF_TRANSIENT);
|
||||
get_resource(RES_TEXTURE, "stage2/spellbg2", RESF_REQUIRED | RESF_TRANSIENT);
|
||||
get_resource(RES_BGM, "bgm_stage2", RESF_OPTIONAL);
|
||||
get_resource(RES_BGM, "bgm_stage2boss", RESF_OPTIONAL);
|
||||
get_resource(RES_TEXTURE, "stage2/border", RESF_DEFAULT);
|
||||
get_resource(RES_TEXTURE, "stage2/leaves", RESF_DEFAULT);
|
||||
get_resource(RES_TEXTURE, "stage2/roadgrass", RESF_DEFAULT);
|
||||
get_resource(RES_TEXTURE, "stage2/roadstones", RESF_DEFAULT);
|
||||
get_resource(RES_TEXTURE, "stage2/spellbg1", RESF_DEFAULT);
|
||||
get_resource(RES_TEXTURE, "stage2/spellbg2", RESF_DEFAULT);
|
||||
}
|
||||
|
||||
void stage2_end(void) {
|
||||
|
|
|
@ -117,13 +117,13 @@ void stage3_start(void) {
|
|||
}
|
||||
|
||||
void stage3_preload(void) {
|
||||
get_resource(RES_BGM, "bgm_stage3", RESF_TRANSIENT);
|
||||
get_resource(RES_BGM, "bgm_stage3boss", RESF_TRANSIENT);
|
||||
get_resource(RES_TEXTURE, "stage3/border", RESF_REQUIRED | RESF_TRANSIENT);
|
||||
get_resource(RES_TEXTURE, "stage3/spellbg1", RESF_REQUIRED | RESF_TRANSIENT);
|
||||
get_resource(RES_TEXTURE, "stage3/wspellbg", RESF_REQUIRED | RESF_TRANSIENT);
|
||||
get_resource(RES_TEXTURE, "stage3/wspellclouds", RESF_REQUIRED | RESF_TRANSIENT);
|
||||
get_resource(RES_TEXTURE, "stage3/wspellswarm", RESF_REQUIRED | RESF_TRANSIENT);
|
||||
get_resource(RES_BGM, "bgm_stage3", RESF_OPTIONAL);
|
||||
get_resource(RES_BGM, "bgm_stage3boss", RESF_OPTIONAL);
|
||||
get_resource(RES_TEXTURE, "stage3/border", RESF_DEFAULT);
|
||||
get_resource(RES_TEXTURE, "stage3/spellbg1", RESF_DEFAULT);
|
||||
get_resource(RES_TEXTURE, "stage3/wspellbg", RESF_DEFAULT);
|
||||
get_resource(RES_TEXTURE, "stage3/wspellclouds", RESF_DEFAULT);
|
||||
get_resource(RES_TEXTURE, "stage3/wspellswarm", RESF_DEFAULT);
|
||||
}
|
||||
|
||||
void stage3_end(void) {
|
||||
|
|
|
@ -209,15 +209,15 @@ void stage4_start(void) {
|
|||
}
|
||||
|
||||
void stage4_preload(void) {
|
||||
get_resource(RES_BGM, "bgm_stage4", RESF_TRANSIENT);
|
||||
get_resource(RES_BGM, "bgm_stage4boss", RESF_TRANSIENT);
|
||||
get_resource(RES_TEXTURE, "stage2/border", RESF_REQUIRED | RESF_TRANSIENT); // Stage 2 is intentional!
|
||||
get_resource(RES_TEXTURE, "stage4/kurumibg1", RESF_REQUIRED | RESF_TRANSIENT);
|
||||
get_resource(RES_TEXTURE, "stage4/kurumibg2", RESF_REQUIRED | RESF_TRANSIENT);
|
||||
get_resource(RES_TEXTURE, "stage4/lake", RESF_REQUIRED | RESF_TRANSIENT);
|
||||
get_resource(RES_TEXTURE, "stage4/mansion", RESF_REQUIRED | RESF_TRANSIENT);
|
||||
get_resource(RES_TEXTURE, "stage4/planks", RESF_REQUIRED | RESF_TRANSIENT);
|
||||
get_resource(RES_TEXTURE, "stage4/wall", RESF_REQUIRED | RESF_TRANSIENT);
|
||||
get_resource(RES_BGM, "bgm_stage4", RESF_OPTIONAL);
|
||||
get_resource(RES_BGM, "bgm_stage4boss", RESF_OPTIONAL);
|
||||
get_resource(RES_TEXTURE, "stage2/border", RESF_DEFAULT); // Stage 2 is intentional!
|
||||
get_resource(RES_TEXTURE, "stage4/kurumibg1", RESF_DEFAULT);
|
||||
get_resource(RES_TEXTURE, "stage4/kurumibg2", RESF_DEFAULT);
|
||||
get_resource(RES_TEXTURE, "stage4/lake", RESF_DEFAULT);
|
||||
get_resource(RES_TEXTURE, "stage4/mansion", RESF_DEFAULT);
|
||||
get_resource(RES_TEXTURE, "stage4/planks", RESF_DEFAULT);
|
||||
get_resource(RES_TEXTURE, "stage4/wall", RESF_DEFAULT);
|
||||
}
|
||||
|
||||
void stage4_end(void) {
|
||||
|
|
|
@ -123,13 +123,13 @@ void stage5_start(void) {
|
|||
}
|
||||
|
||||
void stage5_preload(void) {
|
||||
get_resource(RES_BGM, "bgm_stage5", RESF_TRANSIENT);
|
||||
get_resource(RES_BGM, "bgm_stage5boss", RESF_TRANSIENT);
|
||||
get_resource(RES_TEXTURE, "stage5/noise", RESF_REQUIRED | RESF_TRANSIENT);
|
||||
get_resource(RES_TEXTURE, "stage5/spell_bg", RESF_REQUIRED | RESF_TRANSIENT);
|
||||
get_resource(RES_TEXTURE, "stage5/spell_clouds", RESF_REQUIRED | RESF_TRANSIENT);
|
||||
get_resource(RES_TEXTURE, "stage5/spell_lightning", RESF_REQUIRED | RESF_TRANSIENT);
|
||||
get_resource(RES_TEXTURE, "stage5/tower", RESF_REQUIRED | RESF_TRANSIENT);
|
||||
get_resource(RES_BGM, "bgm_stage5", RESF_OPTIONAL);
|
||||
get_resource(RES_BGM, "bgm_stage5boss", RESF_OPTIONAL);
|
||||
get_resource(RES_TEXTURE, "stage5/noise", RESF_DEFAULT);
|
||||
get_resource(RES_TEXTURE, "stage5/spell_bg", RESF_DEFAULT);
|
||||
get_resource(RES_TEXTURE, "stage5/spell_clouds", RESF_DEFAULT);
|
||||
get_resource(RES_TEXTURE, "stage5/spell_lightning", RESF_DEFAULT);
|
||||
get_resource(RES_TEXTURE, "stage5/tower", RESF_DEFAULT);
|
||||
}
|
||||
|
||||
void stage5_end(void) {
|
||||
|
|
|
@ -168,18 +168,18 @@ void stage6_start(void) {
|
|||
}
|
||||
|
||||
void stage6_preload(void) {
|
||||
get_resource(RES_BGM, "bgm_stage6", RESF_TRANSIENT);
|
||||
get_resource(RES_BGM, "bgm_stage6boss", RESF_TRANSIENT);
|
||||
get_resource(RES_TEXTURE, "stage6/baryon_connector", RESF_REQUIRED | RESF_TRANSIENT);
|
||||
get_resource(RES_TEXTURE, "stage6/baryon", RESF_REQUIRED | RESF_TRANSIENT);
|
||||
get_resource(RES_TEXTURE, "stage6/scythecircle", RESF_REQUIRED | RESF_TRANSIENT);
|
||||
get_resource(RES_TEXTURE, "stage6/scythe", RESF_REQUIRED | RESF_TRANSIENT);
|
||||
get_resource(RES_TEXTURE, "stage6/sky", RESF_REQUIRED | RESF_TRANSIENT);
|
||||
get_resource(RES_TEXTURE, "stage6/spellbg_chalk", RESF_REQUIRED | RESF_TRANSIENT);
|
||||
get_resource(RES_TEXTURE, "stage6/spellbg_classic", RESF_REQUIRED | RESF_TRANSIENT);
|
||||
get_resource(RES_TEXTURE, "stage6/spellbg_modern", RESF_REQUIRED | RESF_TRANSIENT);
|
||||
get_resource(RES_TEXTURE, "stage6/towertop", RESF_REQUIRED | RESF_TRANSIENT);
|
||||
get_resource(RES_TEXTURE, "stage6/towerwall", RESF_REQUIRED | RESF_TRANSIENT);
|
||||
get_resource(RES_BGM, "bgm_stage6", RESF_OPTIONAL);
|
||||
get_resource(RES_BGM, "bgm_stage6boss", RESF_OPTIONAL);
|
||||
get_resource(RES_TEXTURE, "stage6/baryon_connector", RESF_DEFAULT);
|
||||
get_resource(RES_TEXTURE, "stage6/baryon", RESF_DEFAULT);
|
||||
get_resource(RES_TEXTURE, "stage6/scythecircle", RESF_DEFAULT);
|
||||
get_resource(RES_TEXTURE, "stage6/scythe", RESF_DEFAULT);
|
||||
get_resource(RES_TEXTURE, "stage6/sky", RESF_DEFAULT);
|
||||
get_resource(RES_TEXTURE, "stage6/spellbg_chalk", RESF_DEFAULT);
|
||||
get_resource(RES_TEXTURE, "stage6/spellbg_classic", RESF_DEFAULT);
|
||||
get_resource(RES_TEXTURE, "stage6/spellbg_modern", RESF_DEFAULT);
|
||||
get_resource(RES_TEXTURE, "stage6/towertop", RESF_DEFAULT);
|
||||
get_resource(RES_TEXTURE, "stage6/towerwall", RESF_DEFAULT);
|
||||
}
|
||||
|
||||
void stage6_end(void) {
|
||||
|
|
Loading…
Reference in a new issue