From 73f118641b2c05148eab673b2fbcf9b4e155411d Mon Sep 17 00:00:00 2001 From: Andrew Opalach Date: Mon, 12 Oct 2020 22:34:41 -0400 Subject: misc render stuff, add visualizer --- src/objects/effect.cc | 64 ++++++++----------- src/objects/effect.h | 2 +- src/objects/material.cc | 12 ++-- src/objects/object.c | 1 + src/objects/object.cc | 79 ++++++++++++++++-------- src/objects/object.h | 12 +++- src/objects/pass.cc | 160 +++++++++++++++++++++++------------------------- src/objects/pass.h | 17 +++-- src/objects/scene.cc | 7 +++ src/objects/scene.h | 5 -- 10 files changed, 185 insertions(+), 174 deletions(-) create mode 100644 src/objects/object.c (limited to 'src/objects') diff --git a/src/objects/effect.cc b/src/objects/effect.cc index fb1f4e3..33b72aa 100644 --- a/src/objects/effect.cc +++ b/src/objects/effect.cc @@ -18,15 +18,6 @@ using namespace Mauri; Effect::Effect(Parser &p, json &root) { - p.get_value(root, "id", &id, 0); - - p.get_value(root, "visible", &visible, true); - - for (auto &pass0 : root["passes"]) - { - passes0.emplace_back(new Pass(p, pass0, EFFECT0_PASS)); - } - auto asset = asset_manager()->get_file(root["file"], NONE); if (asset->type == ASSET_VOID) @@ -34,8 +25,15 @@ Effect::Effect(Parser &p, json &root) auto file = json::parse(asset->as_string()); + p.get_value(root, "id", &id, 0); + p.get_value(root, "visible", &visible, true); p.get_value(file, "name", &name, ""); + for (auto &pass0 : root["passes"]) + { + passes0.emplace_back(new Pass(p, pass0, EFFECT0_PASS)); + } + for (auto &pass1 : file["passes"]) { passes1.emplace_back(new Pass(p, pass1, EFFECT1_PASS)); @@ -47,7 +45,7 @@ Effect::Effect(Parser &p, json &root) } } -void Effect::load(Engine *engine, Object *object, bool last_effect) +void Effect::load(Engine *engine, Object *object, bool last) { buffer_id = fmt::format("_{}_{}", object->id, id); @@ -57,44 +55,26 @@ void Effect::load(Engine *engine, Object *object, bool last_effect) object->size[1], fbo.scale); } - /* - for (u32 i = 0; i < passes0.size(); i++) - { - Pass *pass = new Pass(); - - pass->combine = (i == (passes0.size() - 1)) && last_effect; - - pass->object = object; - pass->effect = this; - - passes0[i]->load(engine, EFFECT0_PASS, pass); - passes1[i]->load(engine, EFFECT1_PASS, pass); - - this->passes.push_back(new RenderPass(engine, pass)); - } - */ - u32 index = 0; for (u32 i = 0; i < passes1.size(); i++) { - Pass *pass = new Pass(); - - pass->combine = (i == (passes1.size() - 1)) && last_effect; + Pass pass; - pass->object = object; - pass->effect = this; + pass.object = object; + pass.effect = this; - if (passes1[i]->command == COPY) - passes1[i]->load(engine, EFFECT1_PASS, pass); - else + pass.combine = i == (passes1.size() - 1) && last; + + if (passes1[i]->command != COPY) { - passes0[index]->load(engine, EFFECT0_PASS, pass); - passes1[i]->load(engine, EFFECT1_PASS, pass); + passes0[index]->load(engine, EFFECT0_PASS, &pass); index++; } - this->passes.push_back(new RenderPass(engine, pass)); + passes1[i]->load(engine, EFFECT1_PASS, &pass); + + this->passes.push_back(new RenderPass(engine, &pass)); } } @@ -102,9 +82,17 @@ void Effect::draw(Engine *engine) { if (!visible) return; + +#ifdef _DEBUG_ + //std::cout << name << ":\n"; +#endif for (auto &pass : passes) { +#ifdef _DEBUG_ + //if (pass->shader != nullptr) + // std::cout << "\t" << pass->shader->name << "\n"; +#endif pass->draw(engine); } } diff --git a/src/objects/effect.h b/src/objects/effect.h index 713c36f..40110a8 100644 --- a/src/objects/effect.h +++ b/src/objects/effect.h @@ -29,7 +29,7 @@ class Effect std::string buffer_id; - void load(Engine *engine, Object *object, bool last_effect); + void load(Engine *engine, Object *object, bool last); void draw(Engine *engine); private: diff --git a/src/objects/material.cc b/src/objects/material.cc index ae25cee..465fab1 100644 --- a/src/objects/material.cc +++ b/src/objects/material.cc @@ -39,16 +39,16 @@ void Material::load(Engine *engine, Object *object, MaterialType type, Pass *pas pass0->load(engine, MATERIAL_PASS, pass); break; case MATERIAL_MODEL: - Pass *pass = new Pass(); + Pass _pass; - pass->combine = no_effects; + _pass.object = object; + _pass.effect = nullptr; - pass->object = object; - pass->effect = nullptr; + _pass.combine = no_effects && !object->passthrough && !object->fullscreen; - pass0->load(engine, MATERIAL_ONLY_PASS, pass); + pass0->load(engine, MATERIAL_ONLY_PASS, &_pass); - object->passes.push_back(new RenderPass(engine, pass)); + object->passes.push_back(new RenderPass(engine, &_pass)); break; } diff --git a/src/objects/object.c b/src/objects/object.c new file mode 100644 index 0000000..b498fd4 --- /dev/null +++ b/src/objects/object.c @@ -0,0 +1 @@ +/ diff --git a/src/objects/object.cc b/src/objects/object.cc index efd3155..18bfdf0 100644 --- a/src/objects/object.cc +++ b/src/objects/object.cc @@ -34,8 +34,9 @@ Object::Object(Parser &p, json &root) p.get_value(root, "size", &size, vec2(0.f)); p.get_value(root, "scale", &scale, vec3(0.f)); p.get_value(root, "origin", &origin, vec3(0.f)); + origin[2] = 0.f; - p.get_value(root, "colorblendmode", &color_blend_mode, 0); + p.get_value(root, "colorBlendMode", &color_blend_mode, 0); p.get_value(root, "visible", &visible, true); @@ -63,12 +64,12 @@ void Object::get_model(f32 width, f32 height, bool flip) model = glm::translate(model, origin * 2.f); - model = glm::scale(model, scale); - model = glm::rotate(model, angles[0], (vec3){1.f, 0.f, 0.f}); model = glm::rotate(model, angles[1], (vec3){0.f, 1.f, 0.f}); model = glm::rotate(model, angles[2], (vec3){0.f, 0.f, 1.f}); + model = glm::scale(model, scale); + mat4x4 _ortho = glm::ortho(-width, width, height, -height, 0.f, 1.f); if (flip) @@ -92,7 +93,6 @@ void Object::load(Engine *engine) if (dep_object != nullptr) dep_object->load(engine); } - if (image != nullptr) { @@ -117,26 +117,28 @@ void Object::load(Engine *engine) origin[1] = size[1] / 2.f; } - auto width = size[0]; - auto height = size[1]; - buffer_a = fmt::format("_rt_imageLayerComposite_{}_a", id); buffer_b = fmt::format("_rt_imageLayerComposite_{}_b", id); - engine->create_framebuffer(buffer_a, width, height, 1.f); - engine->create_framebuffer(buffer_b, width, height, 1.f); + engine->create_framebuffer(buffer_a, size[0], size[1], 1.f); + engine->create_framebuffer(buffer_b, size[0], size[1], 1.f); get_model(engine->view.width, engine->view.height, effects.size() == 0); - ortho = glm::ortho(-width, width, -height, height, 0.f, 1.f); + ortho = glm::ortho(-size[0], size[0], -size[1], size[1], 0.f, 1.f); - gl_object = new RenderObject(OBJECT, width, height); - gl_uv_object = new RenderObject(UV_SCALE, width, height); + gl_object = new RenderObject(OBJECT, size[0], size[1]); + gl_uv_object = new RenderObject(UV_SCALE, size[0], size[1]); + + //blend_shader = new Shader(engine->parser, "passthroughblend"); + //blend_shader->combos.push_back((Combo) { "TRANSFORM", 1 }); + //blend_shader->combos.push_back((Combo) { "BLENDMODE", color_blend_mode }); + //blend_shader->compile(); if (image != nullptr) image->load(engine, this, effects.size() == 0); - for (u32 i = 0; i < effects.size(); i++) + for (s32 i = 0; i < effects.size(); i++) { effects[i]->load(engine, this, i == (effects.size() - 1)); } @@ -146,31 +148,55 @@ void Object::load(Engine *engine) void Object::update(Engine *engine) { - //if (engine->time > this->shake_tick) + //if (engine->time > this->shake_tick) //{ //} } void Object::draw(Engine *engine) { - //for (auto &dep : deps) - //{ - // if (dep == id) - // continue; - // auto dep_object = engine->scene->get_object_by_id(dep); - // if (dep_object != nullptr) - // dep_object->draw(engine); - //} + if (!visible) + return; + +#ifdef _DEBUG_ + //std::cout << name << " (model):\n"; +#endif for (auto &pass : passes) { +#ifdef _DEBUG_ + //std::cout << "\t" << pass->shader->name << "\n";; +#endif pass->draw(engine); } - + for (auto &effect : effects) { effect->draw(engine); } + + //if (!visible) + // return; + + //engine->combine_buffer_a->buffer->bind(); + + //blend_shader->bind(engine, &model); + //gl_object->bind(); + + //engine->get_framebuffer_texture(get_texture_buffer())->bind(0); + + //engine->combine_buffer_b->texture->bind(1); + + //Render::blend_func(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + //Render::color_mask(1.f, 1.f, 1.f, 1.f); + + //engine->view.default_viewport(engine->scene->width, engine->scene->height); + + //gl_object->draw(); + + //engine->combine_buffer_a->buffer->blit(engine->combine_buffer_b->buffer->id, + // engine->combine_buffer_a->buffer->width, + // engine->combine_buffer_a->buffer->height); } std::string Object::get_target_buffer() const @@ -188,11 +214,10 @@ Object::~Object() if (image != nullptr) delete image; - if (gl_object != nullptr) - delete gl_object; + delete gl_object; + delete gl_uv_object; - if (gl_uv_object != nullptr) - delete gl_uv_object; + //delete blend_shader; for (auto &pass : passes) { diff --git a/src/objects/object.h b/src/objects/object.h index 37dd2df..2ce7347 100644 --- a/src/objects/object.h +++ b/src/objects/object.h @@ -51,13 +51,17 @@ class Object RenderObject *gl_uv_object = nullptr; RenderObject *gl_object = nullptr; - u32 color_blend_mode; + s32 color_blend_mode; std::string get_target_buffer() const; std::string get_texture_buffer() const; - void swap_buffer() { - this->buffer_switch = !this->buffer_switch; + Framebuffer *previous_buffer; + Texture *previous_texture; + + void swap_buffer() + { + buffer_switch = !buffer_switch; } std::vector passes; @@ -70,6 +74,8 @@ class Object private: Model *image = nullptr; + Shader *blend_shader; + vec3 angles; vec3 color; diff --git a/src/objects/pass.cc b/src/objects/pass.cc index 24fc868..38e68e3 100644 --- a/src/objects/pass.cc +++ b/src/objects/pass.cc @@ -31,7 +31,6 @@ Pass::Pass(Parser &p, json &root, PassStage stage) for (auto &value : _uniforms.items()) { - // Type and uname don't matter because they are stored on the shader. uniforms.emplace_back( new UniformOverride({ vec4(0.f), value.key() }) ); @@ -80,13 +79,13 @@ Pass::Pass(Parser &p, json &root, PassStage stage) break; } - auto _textures = root["textures"]; - - for (int i = 0; i < _textures.size(); i++) + for (int i = 0; i < MAX_TEXTURES; i++) { - auto _texture = _textures[i]; - if (_texture.is_string()) - textures[i] = _texture; + auto texture = root["textures"][i]; + if (texture.is_string()) + { + textures[i] = texture; + } } for (auto &combo : root["combos"].items()) @@ -97,14 +96,12 @@ Pass::Pass(Parser &p, json &root, PassStage stage) void Pass::load(Engine *engine, PassStage stage, Pass *pass) { - for (int i = 0; i < 8; i++) + for (int i = 0; i < MAX_TEXTURES; i++) { if (textures[i].empty()) continue; pass->textures[i] = textures[i]; - - //engine->max_texture_count++; } for (auto &combo : combos) @@ -128,17 +125,13 @@ void Pass::load(Engine *engine, PassStage stage, Pass *pass) if (pass->target == "previous") { - if (pass->combine) - pass->target = COMBINE_BUFFER; - else - pass->target = pass->object->get_target_buffer(); - + pass->target = pass->object->get_target_buffer(); pass->textures[0] = pass->object->get_texture_buffer(); } else pass->target.append(pass->effect->buffer_id); - for (int i = 0; i < 8; i++) + for (int i = 0; i < MAX_TEXTURES; i++) { if (binds[i].empty()) continue; @@ -157,13 +150,8 @@ void Pass::load(Engine *engine, PassStage stage, Pass *pass) break; case MATERIAL_ONLY_PASS: - if (pass->combine) - pass->target = COMBINE_BUFFER; - else - { - pass->target = pass->object->get_target_buffer(); - pass->object->swap_buffer(); - } + pass->target = pass->object->get_target_buffer(); + pass->object->swap_buffer(); [[fallthrough]]; case MATERIAL_PASS: pass->shader = shader; @@ -175,12 +163,19 @@ Pass::~Pass() { if (material != nullptr) delete material; + + //for (auto &uniform : uniforms) + //{ + // delete uniform; + //} } RenderPass::RenderPass(Engine *engine, Pass *pass) { command = pass->command; + combine = pass->combine; + if (command == COPY) { target = engine->get_framebuffer(pass->target); @@ -189,14 +184,11 @@ RenderPass::RenderPass(Engine *engine, Pass *pass) return; } - object = pass->object; - - combine = pass->combine; - combine_blend = (BlendMode)pass->object->color_blend_mode; + target = engine->get_framebuffer(pass->target); shader = new Shader(engine->parser, pass->shader); - for (int i = 0; i < 8; i++) + for (int i = 0; i < MAX_TEXTURES; i++) { if (pass->textures[i].empty() && !shader->textures[i].empty()) pass->textures[i] = shader->textures[i]; @@ -230,28 +222,6 @@ RenderPass::RenderPass(Engine *engine, Pass *pass) shader_uniform->value = &shader_uniform->default_value; } - /* - for (auto &shader_uniform : shader->uniforms) - { - auto add = true; - for (auto &pass_uniform : pass->uniforms) - { - if (shader_uniform->name.empty()) - continue; - if (pass_uniform->name == shader_uniform->name) - { - pass_uniform->uname = shader_uniform->uname; - pass_uniform->type = shader_uniform->type; - add = false; - delete shader_uniform; - break; - } - } - if (add) - pass->uniforms.push_back(shader_uniform); - } - */ - for (auto &uniform : shader->uniforms) { // ex: g_Texture2Resolution (vec4) @@ -261,16 +231,7 @@ RenderPass::RenderPass(Engine *engine, Pass *pass) { auto index = uniform->uname[9] - '0'; if (textures[index] != nullptr) - uniform->value = &textures[index]->texture_resolution; - } - } - - for (auto &combo : shader->combos) - { - if (combo.name == "AUDIOPROCESSING") - { - combo.value = 0; - break; + uniform->value = &textures[index]->texture_res; } } @@ -290,9 +251,15 @@ RenderPass::RenderPass(Engine *engine, Pass *pass) shader->combos.push_back(pass_combo); } - shader->compile(); + /* + for (auto &combo : shader->combos) + { + if (combo.name == "AUDIOPROCESSING") + combo.value = 0; + } + */ - target = engine->get_framebuffer(pass->target); + shader->compile(); if (pass->effect == nullptr) { @@ -323,13 +290,47 @@ RenderPass::RenderPass(Engine *engine, Pass *pass) model = &engine->default_model; } } + + /* + // TODO fix this + if (pass->effect == nullptr) + { + if (pass->object->passthrough) + { + robject = pass->object->gl_object; + model = &pass->object->model; + } + else if (pass->object->fullscreen) + { + robject = engine->default_object; + model = &engine->default_model; + } + else + { + robject = pass->object->gl_uv_object; + model = &pass->object->ortho; + } + } + else + { + robject = engine->default_object; + model = &engine->default_model; + } + */ } void RenderPass::draw(Engine *engine) { switch (command) { case DRAW: { - target->buffer->bind(); + Framebuffer *_target; + + if (combine) + _target = engine->combine_buffer; + else + _target = target; + + _target->buffer->bind(); shader->bind(engine, model); robject->bind(); @@ -340,35 +341,24 @@ void RenderPass::draw(Engine *engine) textures[i]->bind(i); } - BlendMode blend; - if (combine) - blend = combine_blend; + { + Render::blend_func(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + Render::color_mask(1.f, 1.f, 1.f, 0.f); + } else - blend = NORMAL; - - switch (blend) { - case NORMAL: - glBlendFunc(GL_ONE, GL_ZERO); - glColorMask(1.f, 1.f, 1.f, 1.f); - break; - case TRANSLUCENT: - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glColorMask(1.f, 1.f, 1.f, 0.f); - break; + Render::blend_func(GL_ONE, GL_ZERO); + Render::color_mask(1.f, 1.f, 1.f, 1.f); } - engine->view.default_viewport(target->buffer->width, target->buffer->height); + engine->view.default_viewport(_target->buffer->width, _target->buffer->height); - glDrawArrays(GL_TRIANGLES, 0, 6); + robject->draw(); -#if 0 - target->buffer->blit(0, engine->context->width, engine->context->height); - - engine->context->swap_buffers(); - std::this_thread::sleep_for(std::chrono::seconds(1)); -#endif + //_target->buffer->blit(0, engine->context->width, engine->context->height); + //engine->context->swap_buffers(); + //std::this_thread::sleep_for(std::chrono::seconds(2)); break; } diff --git a/src/objects/pass.h b/src/objects/pass.h index ff03a05..0211596 100644 --- a/src/objects/pass.h +++ b/src/objects/pass.h @@ -13,6 +13,8 @@ #include "objects/object.h" +#define MAX_TEXTURES 8 + namespace Mauri { @@ -56,8 +58,8 @@ class Pass std::string shader; - std::array textures; - std::array binds; + std::array textures; + std::array binds; bool combine; @@ -76,14 +78,14 @@ class RenderPass RenderPass(Engine *engine, Pass *pass); ~RenderPass(); + Shader *shader = nullptr; + void draw(Engine *engine); private: PassCommand command; - Object *object; - - Shader *shader = nullptr; + bool combine; Framebuffer *target; Framebuffer *source; @@ -91,10 +93,7 @@ class RenderPass mat4x4 *model; RenderObject *robject; - bool combine; - BlendMode combine_blend; - - std::array textures = {0}; + std::array textures = {0}; }; } // namespace Mauri diff --git a/src/objects/scene.cc b/src/objects/scene.cc index afb1e69..8bb2d70 100644 --- a/src/objects/scene.cc +++ b/src/objects/scene.cc @@ -41,6 +41,13 @@ Scene::Scene(Parser &p, const std::string &path) for (auto &object : root["objects"]) { + if (object["image"].is_null()) + continue; + if (object["name"] == "Compose") + { + //std::cout << "Skiped\n"; + //continue; + } objects.emplace_back(new Object(p, object)); } } diff --git a/src/objects/scene.h b/src/objects/scene.h index bd8d1b1..5c2b3a0 100644 --- a/src/objects/scene.h +++ b/src/objects/scene.h @@ -42,14 +42,9 @@ class Scene void load(Engine *engine); void draw(Engine *engine); - s32 estimated_buffer_count(); - Object *get_object_by_id(u32 id); std::vector objects; - - private: - std::vector passes; }; } // namespace Mauri -- cgit v1.2.3-101-g0448