diff options
| author | 2020-09-08 19:42:50 -0400 | |
|---|---|---|
| committer | 2020-09-08 19:42:50 -0400 | |
| commit | 433efa3dc837e3ac40f40fe3fef9ba97fead10cd (patch) | |
| tree | e835c3a6b9816b6ef74815a9a553333b0ceec6bf /src/objects | |
| parent | b3f5067447bacba0b68e6cfbe3752ee0a064f5ae (diff) | |
| download | mauri-433efa3dc837e3ac40f40fe3fef9ba97fead10cd.tar.gz mauri-433efa3dc837e3ac40f40fe3fef9ba97fead10cd.tar.bz2 mauri-433efa3dc837e3ac40f40fe3fef9ba97fead10cd.zip | |
implement framebuffer handleing and pass targets
Diffstat (limited to 'src/objects')
| -rw-r--r-- | src/objects/effect.c | 12 | ||||
| -rw-r--r-- | src/objects/object.c | 25 | ||||
| -rw-r--r-- | src/objects/object.h | 5 | ||||
| -rw-r--r-- | src/objects/pass.c | 45 | ||||
| -rw-r--r-- | src/objects/pass.h | 3 | ||||
| -rw-r--r-- | src/objects/scene.c | 24 | ||||
| -rw-r--r-- | src/objects/scene.h | 3 |
7 files changed, 92 insertions, 25 deletions
diff --git a/src/objects/effect.c b/src/objects/effect.c index 1ab6df3..7458f62 100644 --- a/src/objects/effect.c +++ b/src/objects/effect.c @@ -30,16 +30,10 @@ void mri_effect_parse(mri_effect *effect, json_t *root) { void mri_effect_load(mri_engine *engine, mri_effect *effect) { mri_engine_next_effect(engine); - - mri_pass *pass; - - mvec_loop_ptr(effect->passes0, pass, i) { + for (int i = 0; i < mvec_size(effect->passes0); i++) { mri_engine_next_pass(engine); - mri_pass_load(engine, pass, EFFECT0_PASS); - } - - mvec_loop_ptr(effect->passes1, pass, i) { - mri_pass_load(engine, pass, EFFECT1_PASS); + mri_pass_load(engine, mvec_at(effect->passes0, i), EFFECT0_PASS); + mri_pass_load(engine, mvec_at(effect->passes1, i), EFFECT1_PASS); } } diff --git a/src/objects/object.c b/src/objects/object.c index 55ed1c9..ee96a9e 100644 --- a/src/objects/object.c +++ b/src/objects/object.c @@ -32,8 +32,6 @@ void mri_object_parse(mri_object *object, json_t *root) { json_get_int(&object->color_blend_mode, root, "colorblendmode"); json_get_bool(&object->copy_background, root, "copybackground"); - mri_model_parse(&object->image, json_object_get(root, "image")); - json_get_bool(&object->visible, root, "visible"); json_t *config = json_object_get(root, "config"); @@ -41,6 +39,26 @@ void mri_object_parse(mri_object *object, json_t *root) { json_get_bool(&object->passthrough, config, "passthrough"); } + char *abuffer, *bbuffer; + + asprintf(&abuffer, "_rt_imageLayerComposite_%i_a", object->id); + asprintf(&bbuffer, "_rt_imageLayerComposite_%i_b", object->id); + + object->abuffer = mstr_from(abuffer); + object->bbuffer = mstr_from(bbuffer); + + free(abuffer); + free(bbuffer); + + json_t *image = json_object_get(root, "image"); + + if (json_is_string(image)) { + mri_model_parse(&object->image, image); + object->has_image = true; + } else { + object->has_image = false; + } + mvec_init(object->effects); json_t *effect; @@ -105,6 +123,9 @@ void mri_object_unload(mri_object *object) { mvec_free(object->effects); mvec_free(object->deps); + mstr_free(object->abuffer); + mstr_free(object->bbuffer); + mri_model_unload(&object->image); } diff --git a/src/objects/object.h b/src/objects/object.h index 6965224..7c6969b 100644 --- a/src/objects/object.h +++ b/src/objects/object.h @@ -19,7 +19,6 @@ typedef enum { struct mri_object { int id; - char *name; mvec(int) deps; @@ -35,6 +34,7 @@ struct mri_object { bool copy_background; mri_model image; + bool has_image; vec2 size; vec3 origin; @@ -45,6 +45,9 @@ struct mri_object { bool passthrough; bool fullscreen; + mstr *abuffer; + mstr *bbuffer; + mvec(mri_effect) effects; }; diff --git a/src/objects/pass.c b/src/objects/pass.c index 942ea5e..809fde5 100644 --- a/src/objects/pass.c +++ b/src/objects/pass.c @@ -51,13 +51,15 @@ void mri_pass_parse(mri_pass *pass, json_t *root, mri_pass_stage stage) { json_t *target = json_object_get(root, "target"); if (json_is_string(target)) { - printf("%s\n", json_string_value(target)); + pass->target = mstr_from(json_string_value(target)); } - json_t *binds = json_object_get(root, "binds"); + json_t *bind; + json_t *binds = json_object_get(root, "bind"); - if (json_is_array(binds)) { - printf("%li\n", json_array_size(binds)); + json_array(bind, binds) { + int index = json_integer_value(json_object_get(bind, "index")); + pass->binds[index] = mstr_from(json_string_value(json_object_get(bind, "name"))); } break; @@ -133,18 +135,36 @@ void mri_pass_load(mri_engine *engine, mri_pass *pass, mri_pass_stage stage) { break; } case EFFECT1_PASS: - if (!robject->buffer_switch) { - rpass->target = robject->buffer_b; - rpass->textures[0] = &robject->buffer_a->texture; + if (pass->target) { + rpass->target = mri_engine_get_or_new_framebuffer(engine, + pass->target, engine->width, engine->height, 2.f, + (vec4){0.f, 0.f, 0.f, 1.0f}); } else { - rpass->target = robject->buffer_a; - rpass->textures[0] = &robject->buffer_b->texture; + if (!robject->buffer_switch) { + rpass->target = robject->bbuffer; + rpass->textures[0] = &robject->abuffer->texture; + } else { + rpass->target = robject->abuffer; + rpass->textures[0] = &robject->bbuffer->texture; + } + robject->buffer_switch = !robject->buffer_switch; + } + for (int i = 0; i < 7; i++) { + if (!pass->binds[i]) continue; + if (mstr_eq(pass->binds[i], mstr_c("previous"))) { + if (!robject->buffer_switch) { + rpass->textures[i] = &robject->bbuffer->texture; + } else { + rpass->textures[i] = &robject->abuffer->texture; + } + } else { + rpass->textures[i] = &mri_engine_get_framebuffer(engine, pass->binds[i])->texture; + } } - robject->buffer_switch = !robject->buffer_switch; mri_material_load(engine, pass->material, MATERIAL_EFFECT); break; case MATERIAL_ONLY_PASS: - rpass->target = robject->buffer_a; + rpass->target = robject->abuffer; rpass->textures[0] = pass->textures[0]; case MATERIAL_PASS: { memcpy(&rpass->shader, pass->shader, sizeof(mri_shader)); @@ -218,4 +238,7 @@ void mri_pass_unload(mri_pass *pass) { mri_material_unload(pass->material); free(pass->material); } + + if (pass->target) + mstr_free(pass->target); } diff --git a/src/objects/pass.h b/src/objects/pass.h index 94bad25..116f91d 100644 --- a/src/objects/pass.h +++ b/src/objects/pass.h @@ -16,6 +16,9 @@ struct mri_pass { mri_shader *shader; mri_texture *textures[7]; + mstr *target; + mstr *binds[7]; + mvec(mri_uniform) uniforms; mvec(mri_combo) combos; }; diff --git a/src/objects/scene.c b/src/objects/scene.c index 2448659..f887f13 100644 --- a/src/objects/scene.c +++ b/src/objects/scene.c @@ -27,7 +27,9 @@ void mri_scene_parse(mri_scene *scene) { json_get_bool(&scene->clear_enabled, general, "clearenabled"); - json_get_vec3(&scene->clear_color, general, "clearcolor"); + json_get_vec3((vec3 *)&scene->clear_color, general, "clearcolor"); + scene->clear_color[3] = 1.f; + json_get_vec3(&scene->ambient_color, general, "ambientcolor"); json_get_vec3(&scene->skylight_color, general, "skylightcolor"); @@ -48,6 +50,26 @@ void mri_scene_parse(mri_scene *scene) { json_decref(root); } +int mri_scene_framebuffer_count(mri_scene *scene) { + int total = 0; + + mri_object *object; + mvec_loop_ptr(scene->objects, object, i) { + mri_effect *effect; + mvec_loop_ptr(object->effects, effect, s) { + mri_pass *pass; + mvec_loop_ptr(effect->passes1, pass, j) { + if (pass->target) { + total++; + } + } + } + total += 2; + } + + return total; +} + void mri_scene_load(mri_engine *engine, mri_scene *scene) { engine->width = scene->width; engine->height = scene->height; diff --git a/src/objects/scene.h b/src/objects/scene.h index ff0464b..dee6d50 100644 --- a/src/objects/scene.h +++ b/src/objects/scene.h @@ -25,7 +25,7 @@ struct mri_scene { bool clear_enabled; - vec3 clear_color; + vec4 clear_color; vec3 ambient_color; vec3 skylight_color; @@ -38,6 +38,7 @@ struct mri_scene { }; void mri_scene_parse(mri_scene *scene); +int mri_scene_framebuffer_count(mri_scene *scene); void mri_scene_load(mri_engine *engine, mri_scene *scene); void mri_scene_unload(mri_scene *scene); |