summaryrefslogtreecommitdiff
path: root/src/objects
diff options
context:
space:
mode:
authorAndrew Opalach <andrew@akon.city> 2020-09-08 19:42:50 -0400
committerAndrew Opalach <andrew@akon.city> 2020-09-08 19:42:50 -0400
commit433efa3dc837e3ac40f40fe3fef9ba97fead10cd (patch)
treee835c3a6b9816b6ef74815a9a553333b0ceec6bf /src/objects
parentb3f5067447bacba0b68e6cfbe3752ee0a064f5ae (diff)
downloadmauri-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.c12
-rw-r--r--src/objects/object.c25
-rw-r--r--src/objects/object.h5
-rw-r--r--src/objects/pass.c45
-rw-r--r--src/objects/pass.h3
-rw-r--r--src/objects/scene.c24
-rw-r--r--src/objects/scene.h3
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);