Inverted some resource flags

Preparing to remove directory scanning
This commit is contained in:
Andrei "Akari" Alexeyev 2017-03-11 04:51:56 +02:00
parent 8d601fe2e1
commit 915c15c766
16 changed files with 89 additions and 71 deletions

View file

@ -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;
}

View file

@ -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();

View file

@ -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)) {

View file

@ -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) {

View file

@ -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) {

View file

@ -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) {

View file

@ -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);

View file

@ -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);

View file

@ -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;
}

View file

@ -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) {

View file

@ -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) {

View file

@ -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) {

View file

@ -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) {

View file

@ -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) {

View file

@ -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) {

View file

@ -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) {