From 420e3acf230fe57a3c9722bad45553214f9ff7ed Mon Sep 17 00:00:00 2001 From: Andrew Opalach Date: Thu, 1 Oct 2020 17:29:09 -0400 Subject: refactor render pass creation --- src/objects/effect.cc | 25 ++++++++-- src/objects/effect.h | 4 ++ src/objects/material.cc | 8 ++-- src/objects/material.h | 2 +- src/objects/model.cc | 4 +- src/objects/model.h | 2 +- src/objects/object.cc | 12 ++++- src/objects/object.h | 5 +- src/objects/pass.cc | 125 ++++++++++++++++++++++-------------------------- src/objects/pass.h | 30 +++++------- src/objects/scene.cc | 6 --- 11 files changed, 113 insertions(+), 110 deletions(-) (limited to 'src/objects') diff --git a/src/objects/effect.cc b/src/objects/effect.cc index cde37e6..a56bd75 100644 --- a/src/objects/effect.cc +++ b/src/objects/effect.cc @@ -56,8 +56,7 @@ void Effect::load(Engine *engine, Object *object, bool last_effect) for (auto &fbo : fbos) { - fbo.name.append(buffer_id); - engine->new_framebuffer(fbo.name, object->size[0], object->size[1], fbo.scale); + engine->new_framebuffer(fbo.name + buffer_id, object->size[0], object->size[1], fbo.scale); } for (int i = 0; i < passes0.size(); i++) @@ -69,10 +68,21 @@ void Effect::load(Engine *engine, Object *object, bool last_effect) pass->object = object; pass->effect = this; - passes0[i]->load(EFFECT0_PASS, pass); - passes1[i]->load(EFFECT1_PASS, pass); + passes0[i]->load(engine, EFFECT0_PASS, pass); + passes1[i]->load(engine, EFFECT1_PASS, pass); - object->passes.push_back(pass); + this->passes.push_back(new RenderPass(engine, pass)); + } +} + +void Effect::draw(Engine *engine) +{ + if (!visible) + return; + + for (auto &pass : passes) + { + pass->draw(engine); } } @@ -87,4 +97,9 @@ Effect::~Effect() { delete pass1; } + + for (auto &pass : passes) + { + delete pass; + } } diff --git a/src/objects/effect.h b/src/objects/effect.h index 9edeea7..c3eddba 100644 --- a/src/objects/effect.h +++ b/src/objects/effect.h @@ -9,6 +9,7 @@ namespace Mauri { class Pass; +class RenderPass; struct EffectBuffer { @@ -28,6 +29,7 @@ class Effect std::string buffer_id; void load(Engine *engine, Object *object, bool last_effect); + void draw(Engine *engine); private: bool visible; @@ -35,6 +37,8 @@ class Effect std::vector passes0; std::vector passes1; + std::vector passes; + std::vector fbos; }; diff --git a/src/objects/material.cc b/src/objects/material.cc index 59ac759..a1c2146 100644 --- a/src/objects/material.cc +++ b/src/objects/material.cc @@ -29,14 +29,14 @@ Material::Material(std::string path) } } -void Material::load(Object *object, MaterialType type, Pass *pass, bool no_effects) +void Material::load(Engine *engine, Object *object, MaterialType type, Pass *pass, bool no_effects) { for (auto &pass0 : passes0) { switch (type) { case MATERIAL_EFFECT: - pass0->load(MATERIAL_PASS, pass); + pass0->load(engine, MATERIAL_PASS, pass); break; case MATERIAL_MODEL: Pass *pass = new Pass(); @@ -46,9 +46,9 @@ void Material::load(Object *object, MaterialType type, Pass *pass, bool no_effec pass->object = object; pass->effect = nullptr; - pass0->load(MATERIAL_ONLY_PASS, pass); + pass0->load(engine, MATERIAL_ONLY_PASS, pass); - object->passes.push_back(pass); + object->passes.push_back(new RenderPass(engine, pass)); break; } diff --git a/src/objects/material.h b/src/objects/material.h index 31b3be0..23aa06b 100644 --- a/src/objects/material.h +++ b/src/objects/material.h @@ -22,7 +22,7 @@ class Material Material(std::string path); ~Material(); - void load(Object *object, MaterialType type, Pass *pass, bool no_effects); + void load(Engine *engine, Object *object, MaterialType type, Pass *pass, bool no_effects); std::vector passes0; }; diff --git a/src/objects/model.cc b/src/objects/model.cc index 322c188..c45ac12 100644 --- a/src/objects/model.cc +++ b/src/objects/model.cc @@ -28,9 +28,9 @@ Model::Model(std::string path) material = new Material(root["material"].asString()); } -void Model::load(Object *object, bool no_effects) +void Model::load(Engine *engine, Object *object, bool no_effects) { - material->load(object, MATERIAL_MODEL, NULL, no_effects); + material->load(engine, object, MATERIAL_MODEL, NULL, no_effects); } Model::~Model() diff --git a/src/objects/model.h b/src/objects/model.h index e25a592..bc6ea93 100644 --- a/src/objects/model.h +++ b/src/objects/model.h @@ -20,7 +20,7 @@ class Model bool fullscreen; bool passthrough; - void load(Object *object, bool no_effects); + void load(Engine *engine, Object *object, bool no_effects); private: Material *material = nullptr; diff --git a/src/objects/object.cc b/src/objects/object.cc index 6cc775f..71a8b28 100644 --- a/src/objects/object.cc +++ b/src/objects/object.cc @@ -99,7 +99,7 @@ void Object::load(Engine *engine) if (image != nullptr) { - image->load(this, effects.size() == 0); + image->load(engine, this, effects.size() == 0); if (image->fullscreen) { @@ -138,6 +138,11 @@ void Object::draw(Engine *engine) { pass->draw(engine); } + + for (auto &effect : effects) + { + effect->draw(engine); + } } std::string Object::get_target_buffer() const @@ -161,6 +166,11 @@ Object::~Object() if (gl_uv_object != nullptr) delete gl_uv_object; + for (auto &pass : passes) + { + delete pass; + } + for (auto &effect : effects) { delete effect; diff --git a/src/objects/object.h b/src/objects/object.h index fe44e03..0b22122 100644 --- a/src/objects/object.h +++ b/src/objects/object.h @@ -58,7 +58,8 @@ class Object this->buffer_switch = !this->buffer_switch; } - std::vector passes; + std::vector passes; + std::vector effects; void load(Engine *engine); void update(Engine *engine); @@ -81,8 +82,6 @@ class Object bool buffer_switch = false; bool loaded = false; - - std::vector effects; }; } // namespace Mauri diff --git a/src/objects/pass.cc b/src/objects/pass.cc index cb3a3c0..6334641 100644 --- a/src/objects/pass.cc +++ b/src/objects/pass.cc @@ -24,15 +24,15 @@ Pass::Pass(Json::Value root, PassStage stage) switch (stage) { case EFFECT0_PASS: { - auto shader_values = root["constantshadervalues"]; + auto _uniforms = root["constantshadervalues"]; - for (auto &name : shader_values.getMemberNames()) + for (auto &name : _uniforms.getMemberNames()) { auto uniform = Uniform(); uniform.name = name; - json_number(json_user_value(shader_values[name]), + json_number(json_user_value(_uniforms[name]), glm::value_ptr(uniform.value)); uniforms.push_back(uniform); @@ -41,10 +41,10 @@ Pass::Pass(Json::Value root, PassStage stage) break; } case EFFECT1_PASS: { - auto pass_material = root["material"]; + auto _material = root["material"]; - if (pass_material.isString()) - material = new Material(pass_material.asString()); + if (_material.isString()) + material = new Material(_material.asString()); target = root.get("target", "previous").asString(); @@ -62,35 +62,35 @@ Pass::Pass(Json::Value root, PassStage stage) case MATERIAL_PASS: { shader = root["shader"].asString(); - auto blending = root.get("blending", "normal").asString(); + //auto blending = root.get("blending", "normal").asString(); - if (blending == "normal") - blend = NORMAL; - else if (blending == "translucent") - blend = TRANSLUCENT; + //if (blending == "normal") + // blend = NORMAL; + //else if (blending == "translucent") + // blend = TRANSLUCENT; break; } } - auto pass_textures = root["textures"]; + auto _textures = root["textures"]; - for (int i = 0; i < pass_textures.size(); i++) + for (int i = 0; i < _textures.size(); i++) { - auto texture = pass_textures[i]; + auto texture = _textures[i]; if (texture.isString()) textures[i] = texture.asString(); } - auto pass_combos = root["combos"]; + auto _combos = root["combos"]; - for (auto &name : pass_combos.getMemberNames()) + for (auto &name : _combos.getMemberNames()) { - combos.emplace_back((Combo){name, pass_combos[name].asInt()}); + combos.emplace_back((Combo){name, _combos[name].asInt()}); } } -void Pass::load(PassStage stage, Pass *pass) +void Pass::load(Engine *engine, PassStage stage, Pass *pass) { for (int i = 0; i < 8; i++) { @@ -143,7 +143,7 @@ void Pass::load(PassStage stage, Pass *pass) pass->object->swap_buffer(); if (material != nullptr) - material->load(pass->object, MATERIAL_EFFECT, pass, false); + material->load(engine, pass->object, MATERIAL_EFFECT, pass, false); break; case MATERIAL_ONLY_PASS: @@ -161,34 +161,36 @@ void Pass::load(PassStage stage, Pass *pass) } } -void Pass::generate_pass(Engine *engine) +Pass::~Pass() { - rpass = new RenderPass(); - - rpass->combine = combine; - rpass->combine_blend = object->color_blend_mode; + if (material != nullptr) + delete material; +} - rpass->shader = new Shader(shader); +RenderPass::RenderPass(Engine *engine, Pass *pass) +{ + combine = pass->combine; + combine_blend = pass->object->color_blend_mode; - auto rshader = rpass->shader; + shader = new Shader(pass->shader); for (int i = 0; i < 8; i++) { - if (textures[i].empty() && !rshader->textures[i].empty()) - textures[i] = rshader->textures[i]; + if (pass->textures[i].empty() && !shader->textures[i].empty()) + pass->textures[i] = shader->textures[i]; - if (textures[i].empty()) + if (pass->textures[i].empty()) continue; - auto asset = asset_manager()->get_file(textures[i], TEXTURE); + auto asset = asset_manager()->get_file(pass->textures[i], TEXTURE); if (asset->type != ASSET_VOID) - rpass->textures[i] = new Texture(asset); + textures[i] = new Texture(asset); else - rpass->textures[i] = engine->get_framebuffer_texture(textures[i]); + textures[i] = engine->get_framebuffer_texture(pass->textures[i]); } - for (auto &uniform : rshader->uniforms) + for (auto &uniform : shader->uniforms) { // ex: g_Texture2Resolution (vec4) // ^ index @@ -196,14 +198,14 @@ void Pass::generate_pass(Engine *engine) uniform.uname.compare(10, 10, "Resolution") == 0) { auto index = uniform.uname[9] - '0'; - if (rpass->textures[index] != nullptr) - uniform.value = rpass->textures[index]->texture_resolution; + if (textures[index] != nullptr) + uniform.value = textures[index]->texture_resolution; } } - for (auto &pass_uniform : uniforms) + for (auto &pass_uniform : pass->uniforms) { - for (auto &shader_uniform : rshader->uniforms) + for (auto &shader_uniform : shader->uniforms) { if (shader_uniform.name.empty()) continue; @@ -215,7 +217,7 @@ void Pass::generate_pass(Engine *engine) } } - for (auto &combo : rshader->combos) + for (auto &combo : shader->combos) { if (combo.name == "AUDIOPROCESSING") { @@ -224,10 +226,10 @@ void Pass::generate_pass(Engine *engine) } } - for (auto &pass_combo : combos) + for (auto &pass_combo : pass->combos) { auto add = true; - for (auto &shader_combo : rshader->combos) + for (auto &shader_combo : shader->combos) { if (pass_combo.name == shader_combo.name) { @@ -237,55 +239,40 @@ void Pass::generate_pass(Engine *engine) } } if (add) - rshader->combos.push_back(pass_combo); + shader->combos.push_back(pass_combo); } - rpass->shader->compile(); + shader->compile(); - rpass->target = engine->get_framebuffer(target); + target = engine->get_framebuffer(pass->target); - if (effect == nullptr) + if (pass->effect == nullptr) { - if (object->passthrough || combine) - rpass->model = &object->model; + if (pass->object->passthrough || combine) + model = &pass->object->model; else - rpass->model = &object->ortho; + model = &pass->object->ortho; - if (object->passthrough) - rpass->robject = object->gl_object; + if (pass->object->passthrough) + robject = pass->object->gl_object; else - rpass->robject = object->gl_uv_object; + robject = pass->object->gl_uv_object; } else { if (combine) { - rpass->robject = object->gl_object; - rpass->model = &object->model; + robject = pass->object->gl_object; + model = &pass->object->model; } else { - rpass->robject = engine->default_object; - rpass->model = &engine->identity; + robject = engine->default_object; + model = &engine->identity; } } } -void Pass::draw(Engine *engine) -{ - if (rpass != nullptr) - rpass->draw(engine); -} - -Pass::~Pass() -{ - if (material != nullptr) - delete material; - - if (rpass != nullptr) - delete rpass; -} - void RenderPass::draw(Engine *engine) { target->buffer->bind(); diff --git a/src/objects/pass.h b/src/objects/pass.h index f7d5129..563900f 100644 --- a/src/objects/pass.h +++ b/src/objects/pass.h @@ -23,7 +23,7 @@ enum PassStage MATERIAL_ONLY_PASS }; -struct RenderPass; +class RenderPass; class Pass { @@ -38,34 +38,31 @@ class Pass Object *object; Effect *effect; - bool combine; - - void load(PassStage stage, Pass *pass); - void draw(Engine *engine); - - void generate_pass(Engine *engine); - - private: std::string shader; - Material *material = nullptr; - std::array textures; std::array binds; - BlendMode blend; + bool combine; std::vector uniforms; std::vector combos; - RenderPass *rpass = nullptr; + void load(Engine *engine, PassStage stage, Pass *pass); + + private: + Material *material = nullptr; }; -struct RenderPass +class RenderPass { - RenderPass() {}; +public: + RenderPass(Engine *engine, Pass *pass); ~RenderPass(); + void draw(Engine *engine); + +private: Shader *shader; Framebuffer *target; @@ -73,12 +70,9 @@ struct RenderPass RenderObject *robject; bool combine; - BlendMode combine_blend; std::array textures = {0}; - - void draw(Engine *engine); }; } // namespace Mauri diff --git a/src/objects/scene.cc b/src/objects/scene.cc index 2bedb54..83b7be6 100644 --- a/src/objects/scene.cc +++ b/src/objects/scene.cc @@ -74,12 +74,6 @@ void Scene::load(Engine *engine) object->load(engine); } - - for (auto &object : objects) - { - for (auto &pass : object->passes) - pass->generate_pass(engine); - } } void Scene::draw(Engine *engine) -- cgit v1.2.3-101-g0448