summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/engine.cc1
-rw-r--r--src/gl.cc1
-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
-rw-r--r--src/texture.cc17
-rw-r--r--src/visualizer.cc3
10 files changed, 73 insertions, 41 deletions
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 <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);
}
}
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<u32>();
@@ -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 <utility>
#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);
}