summaryrefslogtreecommitdiff
path: root/src/objects
diff options
context:
space:
mode:
Diffstat (limited to 'src/objects')
-rw-r--r--src/objects/effect.cc64
-rw-r--r--src/objects/effect.h2
-rw-r--r--src/objects/material.cc12
-rw-r--r--src/objects/object.c1
-rw-r--r--src/objects/object.cc79
-rw-r--r--src/objects/object.h12
-rw-r--r--src/objects/pass.cc160
-rw-r--r--src/objects/pass.h17
-rw-r--r--src/objects/scene.cc7
-rw-r--r--src/objects/scene.h5
10 files changed, 185 insertions, 174 deletions
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<u32>(root, "id", &id, 0);
-
- p.get_value<bool>(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<u32>(root, "id", &id, 0);
+ p.get_value<bool>(root, "visible", &visible, true);
p.get_value<std::string>(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<vec2>(root, "size", &size, vec2(0.f));
p.get_value<vec3>(root, "scale", &scale, vec3(0.f));
p.get_value<vec3>(root, "origin", &origin, vec3(0.f));
+ origin[2] = 0.f;
- p.get_value<u32>(root, "colorblendmode", &color_blend_mode, 0);
+ p.get_value<s32>(root, "colorBlendMode", &color_blend_mode, 0);
p.get_value<bool>(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<RenderPass *> 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<std::string, 8> textures;
- std::array<std::string, 8> binds;
+ std::array<std::string, MAX_TEXTURES> textures;
+ std::array<std::string, MAX_TEXTURES> 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<Texture *, 8> textures = {0};
+ std::array<Texture *, MAX_TEXTURES> 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<Object *> objects;
-
- private:
- std::vector<RenderPass *> passes;
};
} // namespace Mauri