diff options
| author | 2020-09-14 19:26:57 -0400 | |
|---|---|---|
| committer | 2020-09-14 19:26:57 -0400 | |
| commit | f114f3ad193313676be1de0d9388b9062a8559ab (patch) | |
| tree | f4a81614c1ca3a929461375354cc5a024f7fa4b4 /src/objects | |
| parent | da365bc0afed532c20f7a3f1492708035fee4236 (diff) | |
| download | mauri-f114f3ad193313676be1de0d9388b9062a8559ab.tar.gz mauri-f114f3ad193313676be1de0d9388b9062a8559ab.tar.bz2 mauri-f114f3ad193313676be1de0d9388b9062a8559ab.zip | |
texture cache, load objects in order of dependencies
Diffstat (limited to 'src/objects')
| -rw-r--r-- | src/objects/effect.c | 2 | ||||
| -rw-r--r-- | src/objects/effect.h | 2 | ||||
| -rw-r--r-- | src/objects/object.c | 4 | ||||
| -rw-r--r-- | src/objects/object.h | 2 | ||||
| -rw-r--r-- | src/objects/pass.c | 37 | ||||
| -rw-r--r-- | src/objects/pass.h | 3 | ||||
| -rw-r--r-- | src/objects/scene.c | 18 |
7 files changed, 49 insertions, 19 deletions
diff --git a/src/objects/effect.c b/src/objects/effect.c index cb37281..d5fb747 100644 --- a/src/objects/effect.c +++ b/src/objects/effect.c @@ -18,6 +18,8 @@ void mri_effect_parse(mri_effect *effect, json_t *root) { json_get_int(&effect->id, root, "id"); + json_get_bool(&effect->visible, root, "visible"); + json_t *pass0; json_t *passes0 = json_object_get(root, "passes"); json_array(pass0, passes0) { diff --git a/src/objects/effect.h b/src/objects/effect.h index 374a39f..4d31081 100644 --- a/src/objects/effect.h +++ b/src/objects/effect.h @@ -15,6 +15,8 @@ struct mri_effect { mstr *name; int id; + bool visible; + mvec(mri_pass) passes0; mvec(mri_pass) passes1; mvec(mri_render_pass) passes; diff --git a/src/objects/object.c b/src/objects/object.c index 6a67bea..431852e 100644 --- a/src/objects/object.c +++ b/src/objects/object.c @@ -79,6 +79,8 @@ void mri_object_get_model(mri_object *object, mat4 model, float width, float hei } void mri_object_load(mri_engine *engine, mri_object *object) { + if (object->loaded) return; + engine->current_object = object; float width = object->size[0]; @@ -128,6 +130,8 @@ void mri_object_load(mri_engine *engine, mri_object *object) { mvec_loop_ptr(object->effects, effect, i) { mri_effect_load(engine, effect, i == (mvec_size(object->effects) - 1)); } + + object->loaded = true; } void mri_object_switch_buffer(mri_object *object) { diff --git a/src/objects/object.h b/src/objects/object.h index 6431237..fbaae60 100644 --- a/src/objects/object.h +++ b/src/objects/object.h @@ -57,6 +57,8 @@ struct mri_object { bool buffer_switch; + bool loaded; + mvec(mri_effect) effects; }; diff --git a/src/objects/pass.c b/src/objects/pass.c index 4820065..df3b70d 100644 --- a/src/objects/pass.c +++ b/src/objects/pass.c @@ -36,6 +36,10 @@ void mri_pass_parse(mri_pass *pass, json_t *root, mri_pass_stage stage) { .name = mstr_from(json_object_iter_key(iter)) }; + if (json_is_object(uniform)) { + uniform = json_object_get(uniform, "value"); + } + if (json_is_number(uniform)) { u.value[0] = json_number_value(uniform); } else if (json_is_string(uniform)) { @@ -95,11 +99,7 @@ void mri_pass_parse(mri_pass *pass, json_t *root, mri_pass_stage stage) { json_t *textures = json_object_get(root, "textures"); json_array(texture, textures) { if (json_is_string(texture)) { - mri_asset *texture_asset = mri_asset_manager_get( - mstr_c(json_string_value(texture)), TEXTURE); - if (texture_asset->type != ASSET_VOID) { - pass->textures[i] = mri_texture_load(texture_asset); - } + pass->textures[i] = mstr_from(json_string_value(texture)); } } @@ -131,7 +131,19 @@ void mri_pass_load(mri_engine *engine, mri_pass *pass, mri_pass_stage stage, mri mri_object *object = engine->current_object; for (int i = 0; i < 7; i++) { - if (pass->textures[i]) rpass->textures[i] = pass->textures[i]; + if (pass->textures[i]) { + mri_asset *texture_asset = mri_asset_manager_get( + pass->textures[i], TEXTURE); + if (texture_asset->type != ASSET_VOID) { + rpass->textures[i] = mri_texture_load(engine, texture_asset); + } else { + mri_framebuffer *buffer = mri_engine_get_framebuffer( + engine, pass->textures[i]); + if (buffer) { + rpass->textures[i] = &buffer->texture; + } + } + } } mri_combo *combo; @@ -160,6 +172,7 @@ void mri_pass_load(mri_engine *engine, mri_pass *pass, mri_pass_stage stage, mri rpass->textures[0] = mri_object_get_texture_buffer(object); } else { mstr *effect_buffer_id = mstr_sprintf("%i_%i", rpass->effect->id, rpass->object->id); + mstr_cat(pass->target, effect_buffer_id); mstr_free(effect_buffer_id); @@ -173,6 +186,7 @@ void mri_pass_load(mri_engine *engine, mri_pass *pass, mri_pass_stage stage, mri rpass->textures[i] = mri_object_get_texture_buffer(object); } else { mstr *effect_buffer_id = mstr_sprintf("%i_%i", rpass->effect->id, rpass->object->id); + mstr_cat(pass->binds[i], effect_buffer_id); mstr_free(effect_buffer_id); @@ -207,7 +221,11 @@ void mri_pass_load(mri_engine *engine, mri_pass *pass, mri_pass_stage stage, mri // As the last step for shaders, set any unset texture slots // with the default textures from the shader is there is any. if (!rpass->textures[i] && rpass->shader.textures[i]) { - rpass->textures[i] = rpass->shader.textures[i]; + mri_asset *texture_asset = mri_asset_manager_get( + rpass->shader.textures[i], TEXTURE); + if (texture_asset->type != ASSET_VOID) { + rpass->textures[i] = mri_texture_load(engine, texture_asset); + } } // Set TEX0FORMAT in-case extra steps are needed when sampling, @@ -330,7 +348,8 @@ void mri_render_pass_draw(mri_engine *engine, mri_render_pass *pass) { viewport_default(pass->target->width, pass->target->height); } - glDrawArrays(GL_TRIANGLES, 0, 6); + if (pass->object->visible) + glDrawArrays(GL_TRIANGLES, 0, 6); for (int i = 0; i < pass->shader.texture_count; i++) { glActiveTexture(GL_TEXTURE0 + i); @@ -355,7 +374,7 @@ void mri_pass_unload(mri_pass *pass) { // TODO render pass unloading for (int i = 0; i < 7; i++) { - if (pass->textures[i]) mri_texture_unload(pass->textures[i]); + if (pass->textures[i]) mstr_free(pass->textures[i]); } mri_uniform *uniform; diff --git a/src/objects/pass.h b/src/objects/pass.h index 64947c9..59dcdba 100644 --- a/src/objects/pass.h +++ b/src/objects/pass.h @@ -36,7 +36,8 @@ struct mri_pass { mri_material *material; mri_shader *shader; - mri_texture *textures[7]; + + mstr *textures[7]; mstr *target; mstr *binds[7]; diff --git a/src/objects/scene.c b/src/objects/scene.c index 62c70b2..3bcd6ac 100644 --- a/src/objects/scene.c +++ b/src/objects/scene.c @@ -75,6 +75,15 @@ void mri_scene_load(mri_engine *engine, mri_scene *scene) { mri_object *object; mvec_loop_ptr(scene->objects, object, i) { + int dep; + mvec_loop(object->deps, dep, s) { + mri_object *dep_object; + mvec_loop_ptr(scene->objects, dep_object, j) { + if (dep_object->id == dep) { + mri_object_load(engine, dep_object); + } + } + } mri_object_load(engine, object); } } @@ -82,15 +91,6 @@ void mri_scene_load(mri_engine *engine, mri_scene *scene) { void mri_scene_draw(mri_engine *engine, mri_scene *scene) { mri_object *object; mvec_loop_ptr(scene->objects, object, i) { - //int dep; - //mvec_loop(object->deps, dep, s) { - // mri_object *dep_object; - // mvec_loop_ptr(scene->objects, dep_object, j) { - // if (dep_object->id == dep) { - // mri_object_draw(engine, dep_object); - // } - // } - //} mri_object_draw(engine, object); } } |