From b66ba3884135ec746a84a78c38d4fb2fdc0c98a4 Mon Sep 17 00:00:00 2001 From: Andrew Opalach Date: Thu, 22 Oct 2020 23:00:02 -0400 Subject: fix object/effect load order, visualizer memory leak --- src/engine.cc | 1 - src/gl.cc | 1 - src/objects/effect.cc | 5 ++-- src/objects/material.cc | 3 ++- src/objects/object.cc | 71 ++++++++++++++++++++++++++++++++++++------------- src/objects/object.h | 7 +++-- src/objects/pass.h | 4 +-- src/objects/scene.cc | 2 ++ src/texture.cc | 17 +++++------- src/visualizer.cc | 3 +++ 10 files changed, 73 insertions(+), 41 deletions(-) (limited to 'src') diff --git a/src/engine.cc b/src/engine.cc index a49851d..c52a6de 100644 --- a/src/engine.cc +++ b/src/engine.cc @@ -117,7 +117,6 @@ void Engine::create_framebuffer(const std::string &name, f32 width, f32 height, void Engine::update() { context->process_input(); - time = context->current_time(); context->cursor_pos(&view.cursor_pos[0], &view.cursor_pos[1]); diff --git a/src/gl.cc b/src/gl.cc index 627a763..53d8d59 100644 --- a/src/gl.cc +++ b/src/gl.cc @@ -76,7 +76,6 @@ RenderObject::RenderObject(RenderObjType type, f32 width, f32 height) // the UV cuts out the padding used to make the texture dimensions powers of two. f32 x_scale = width / (f32)next_power_of_two(width); f32 y_scale = height / (f32)next_power_of_two(height); - f32 vertices[] = { -width, height, 0.f, 0.f, y_scale, width, -height, 0.f, x_scale, 0.f, 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 +#include #include #include @@ -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(root, "angles", &angles, vec3(0.f)); p.get_value(root, "color", &color, vec3(0.f)); p.get_value(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 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 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); } } diff --git a/src/texture.cc b/src/texture.cc index 8ef1ae3..f147472 100644 --- a/src/texture.cc +++ b/src/texture.cc @@ -26,8 +26,10 @@ Texture::Texture(Asset *asset) { hash = asset->hash; - auto type = asset->reads(9); - auto itype = asset->reads(9); + //auto type = asset->reads(9); + //auto itype = asset->reads(9); + + asset->seek(18); auto format = (TextureFormat)asset->read(); @@ -116,9 +118,10 @@ Texture::Texture(Asset *asset) { switch (format) { - case RGBA8888: + case RGBA8888: { _texture->upload(buffer, mwidth, mheight, i, GL_RGBA, true); break; + } case DXT5: { auto decompressed = new u32[decompressed_byte_count]; BlockDecompressImageDXT5(mwidth, mheight, buffer, decompressed); @@ -199,14 +202,6 @@ Texture::Texture(Asset *asset) } } - for (auto &frame : frames) - { - //std::cout << frame.id << "\n"; - //std::cout << frame.x << " " << frame.y << "\n"; - //std::cout << frame.frame_time << "\n"; - //std::cout << frame.unknown0 << " " << frame.unknown1 << "\n"; - } - asset->reset(); } diff --git a/src/visualizer.cc b/src/visualizer.cc index a76c613..e4da2bf 100644 --- a/src/visualizer.cc +++ b/src/visualizer.cc @@ -6,6 +6,7 @@ #include #include "assets.h" +#include "gst/gstbuffer.h" #include "gst/gstcaps.h" #include "gst/gstelement.h" #include "gst/gstmemory.h" @@ -190,6 +191,8 @@ void Visualizer::update_sample() fftw_execute(p_left); fftw_execute(p_right); + gst_sample_unref(sample); + g_mutex_unlock(&mutex); } -- cgit v1.2.3-101-g0448