summaryrefslogtreecommitdiff
path: root/src/objects
diff options
context:
space:
mode:
authorAndrew Opalach <andrew@akon.city> 2020-10-22 23:00:02 -0400
committerAndrew Opalach <andrew@akon.city> 2020-10-22 23:00:02 -0400
commitb66ba3884135ec746a84a78c38d4fb2fdc0c98a4 (patch)
tree780f4c5ab3b6999acd4fa6cbdda15553533738ff /src/objects
parentf3a2a07b3bd7984f851f9f4816e115043b76e923 (diff)
downloadmauri-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.cc5
-rw-r--r--src/objects/material.cc3
-rw-r--r--src/objects/object.cc71
-rw-r--r--src/objects/object.h7
-rw-r--r--src/objects/pass.h4
-rw-r--r--src/objects/scene.cc2
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);
}
}