diff options
| author | 2020-10-22 23:00:02 -0400 | |
|---|---|---|
| committer | 2020-10-22 23:00:02 -0400 | |
| commit | b66ba3884135ec746a84a78c38d4fb2fdc0c98a4 (patch) | |
| tree | 780f4c5ab3b6999acd4fa6cbdda15553533738ff /src/objects | |
| parent | f3a2a07b3bd7984f851f9f4816e115043b76e923 (diff) | |
| download | mauri-b66ba3884135ec746a84a78c38d4fb2fdc0c98a4.tar.gz mauri-b66ba3884135ec746a84a78c38d4fb2fdc0c98a4.tar.bz2 mauri-b66ba3884135ec746a84a78c38d4fb2fdc0c98a4.zip | |
fix object/effect load order, visualizer memory leak
Diffstat (limited to 'src/objects')
| -rw-r--r-- | src/objects/effect.cc | 5 | ||||
| -rw-r--r-- | src/objects/material.cc | 3 | ||||
| -rw-r--r-- | src/objects/object.cc | 71 | ||||
| -rw-r--r-- | src/objects/object.h | 7 | ||||
| -rw-r--r-- | src/objects/pass.h | 4 | ||||
| -rw-r--r-- | src/objects/scene.cc | 2 |
6 files changed, 64 insertions, 28 deletions
diff --git a/src/objects/effect.cc b/src/objects/effect.cc index fe3fbbe..283d764 100644 --- a/src/objects/effect.cc +++ b/src/objects/effect.cc @@ -50,8 +50,7 @@ void Effect::load(Engine *engine, Object *object, bool last) for (auto &fbo : fbos) { - engine->create_framebuffer(fbo.name + buffer_id, object->size[0], - object->size[1], fbo.scale); + engine->create_framebuffer(fbo.name + buffer_id, object->size[0], object->size[1], fbo.scale); } u32 index = 0; @@ -63,7 +62,7 @@ void Effect::load(Engine *engine, Object *object, bool last) pass.object = object; pass.effect = this; - pass.combine = i == (passes1.size() - 1) && last; + pass.combine = object->visible && i == (passes1.size() - 1) && last; if (passes1[i]->command != COPY) { diff --git a/src/objects/material.cc b/src/objects/material.cc index 6efa2d0..8b6f493 100644 --- a/src/objects/material.cc +++ b/src/objects/material.cc @@ -42,7 +42,8 @@ void Material::load(Engine *engine, Object *object, MaterialType type, Pass *pas _pass.object = object; _pass.effect = nullptr; - if (object->effects.size() == 0 && !object->passthrough) + if (object->effects.size() == 0 + && !object->passthrough && object->visible) _pass.combine = true; else _pass.combine = false; diff --git a/src/objects/object.cc b/src/objects/object.cc index 8e6cc3d..a0e4485 100644 --- a/src/objects/object.cc +++ b/src/objects/object.cc @@ -1,3 +1,5 @@ +#include <cstdlib> +#include <forward_list> #include <glm/fwd.hpp> #include <glm/trigonometric.hpp> @@ -25,6 +27,32 @@ Object::Object(Parser &p, json &root) for (auto &id : root["dependencies"]) deps.push_back(id); + // Filter deps that are either the same as this objects + // id or repeated. This could be handled be sorting objects + // on the scene in order of deps but I'm not sure if that would + // break other things. + for (auto it = deps.begin(); it != deps.end();) + { + bool remove = false; + + if (*it == id) + { + remove = true; + } + + for (auto rt = deps.begin(); rt != deps.end(); ++rt) + { + if (rt != it && *rt == *it) + { + remove = true; + break; + } + } + + if (remove) deps.erase(it); + else it++; + } + p.get_value<vec3>(root, "angles", &angles, vec3(0.f)); p.get_value<vec3>(root, "color", &color, vec3(0.f)); p.get_value<vec2>(root, "size", &size, vec2(0.f)); @@ -67,7 +95,6 @@ void Object::get_model(f32 width, f32 height, bool flip) model = glm::scale(model, scale); - //mat4x4 _ortho = glm::ortho(-width, width, height, -height, 0.0099999997764825821f, 10000.f); mat4x4 _ortho = glm::ortho(-width, width, height, -height, 0.f, 1.f); if (flip) @@ -80,25 +107,27 @@ void Object::get_model(f32 width, f32 height, bool flip) void Object::load(Engine *engine) { - if (loaded) + if (loaded_as_dep) return; - + for (auto &dep : deps) { - if (dep == id) - continue; - auto dep_object = engine->scene->get_object_by_id(dep); - if (dep_object != nullptr) - dep_object->load(engine); + auto object = engine->scene->get_object_by_id(dep); + object->load(engine); + object->loaded_as_dep = true; } if (image != nullptr) { if (image->passthrough) + { passthrough = true; + } if (image->fullscreen) + { fullscreen = true; + } if (image->width != 0.f && image->height != 0.f) { @@ -143,7 +172,7 @@ void Object::load(Engine *engine) { // Get last effect that is visible // to know when to make a combine pass. - Effect *last_effect = effects[0]; + Effect *last_effect = nullptr; for (auto &effect : effects) { @@ -153,26 +182,32 @@ void Object::load(Engine *engine) } } - for (auto &effect : effects) + if (last_effect != nullptr) + { + for (auto &effect : effects) + { + effect->load(engine, this, effect == last_effect); + } + } + else if (visible) { - effect->load(engine, this, effect == last_effect); + // If there are effects but no visible effects, make sure + // combine is set on the background pass. + this->passes.back()->combine = true; } } - - loaded = true; } void Object::update(Engine *engine) { - //if (engine->time > this->shake_tick) - //{ - //} } void Object::draw(Engine *engine) { - if (!visible) - return; + for (auto &dep : deps) + { + engine->scene->get_object_by_id(dep)->draw(engine); + } #if FRAME_STEP std::cout << name << " (model):\n"; diff --git a/src/objects/object.h b/src/objects/object.h index 47fe2cc..5ca7702 100644 --- a/src/objects/object.h +++ b/src/objects/object.h @@ -67,15 +67,14 @@ class Object std::vector<Effect *> effects; + bool loaded_as_dep = false; + void load(Engine *engine); void update(Engine *engine); void draw(Engine *engine); private: - Model *image = nullptr; - vec3 angles; - vec3 origin; vec3 scale; @@ -84,7 +83,7 @@ class Object bool buffer_switch = false; - bool loaded = false; + Model *image = nullptr; }; } // namespace Mauri diff --git a/src/objects/pass.h b/src/objects/pass.h index b84fbf3..75e5563 100644 --- a/src/objects/pass.h +++ b/src/objects/pass.h @@ -77,6 +77,8 @@ class RenderPass RenderPass(Engine *engine, Pass *pass); ~RenderPass(); + bool combine; + Shader *shader = nullptr; void draw(Engine *engine); @@ -92,8 +94,6 @@ class RenderPass mat4x4 *model; RenderObject *robject; - bool combine; - std::array<Texture *, MAX_TEXTURES> textures = {0}; }; diff --git a/src/objects/scene.cc b/src/objects/scene.cc index d3819dc..97b9f58 100644 --- a/src/objects/scene.cc +++ b/src/objects/scene.cc @@ -75,6 +75,8 @@ void Scene::draw(Engine *engine) { for (auto &object : objects) { + if (object->loaded_as_dep) + continue; object->draw(engine); } } |