summaryrefslogtreecommitdiff
path: root/src/objects
diff options
context:
space:
mode:
Diffstat (limited to 'src/objects')
-rw-r--r--src/objects/effect.c2
-rw-r--r--src/objects/effect.h2
-rw-r--r--src/objects/object.c4
-rw-r--r--src/objects/object.h2
-rw-r--r--src/objects/pass.c37
-rw-r--r--src/objects/pass.h3
-rw-r--r--src/objects/scene.c18
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);
}
}