summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndrew Opalach <andrew@akon.city> 2020-10-01 17:29:09 -0400
committerAndrew Opalach <andrew@akon.city> 2020-10-01 17:29:09 -0400
commit420e3acf230fe57a3c9722bad45553214f9ff7ed (patch)
tree4b74808b7d1912e39fd0b8e97343a00c365556b9 /src
parent5e981cd004ac092f35588ebdc4e58e03131296b3 (diff)
downloadmauri-420e3acf230fe57a3c9722bad45553214f9ff7ed.tar.gz
mauri-420e3acf230fe57a3c9722bad45553214f9ff7ed.tar.bz2
mauri-420e3acf230fe57a3c9722bad45553214f9ff7ed.zip
refactor render pass creation
Diffstat (limited to 'src')
-rw-r--r--src/context_x11.cc42
-rw-r--r--src/mauri.cc6
-rw-r--r--src/objects/effect.cc25
-rw-r--r--src/objects/effect.h4
-rw-r--r--src/objects/material.cc8
-rw-r--r--src/objects/material.h2
-rw-r--r--src/objects/model.cc4
-rw-r--r--src/objects/model.h2
-rw-r--r--src/objects/object.cc12
-rw-r--r--src/objects/object.h5
-rw-r--r--src/objects/pass.cc125
-rw-r--r--src/objects/pass.h30
-rw-r--r--src/objects/scene.cc6
13 files changed, 138 insertions, 133 deletions
diff --git a/src/context_x11.cc b/src/context_x11.cc
index 347bbe4..70f8b9f 100644
--- a/src/context_x11.cc
+++ b/src/context_x11.cc
@@ -144,35 +144,37 @@ ContextX11::ContextX11(int width, int height, std::string name, bool wallpaper)
XChangeProperty(x11_d, window, XInternAtom(x11_d, "_NET_WM_WINDOW_TYPE", false),
XA_ATOM, 32, PropModeReplace, (unsigned char*)&desktop_type, 1);
- //XEvent event;
- //event.xclient.type = ClientMessage;
- //event.xclient.serial = 0;
- //event.xclient.send_event = True;
- //event.xclient.display = x11_d;
- //event.xclient.window = window;
- //event.xclient.message_type = XInternAtom(x11_d, "_NET_WM_STATE", false);
- //event.xclient.format = 32;
+ /*
+ XEvent event;
+ event.xclient.type = ClientMessage;
+ event.xclient.serial = 0;
+ event.xclient.send_event = True;
+ event.xclient.display = x11_d;
+ event.xclient.window = window;
+ event.xclient.message_type = XInternAtom(x11_d, "_NET_WM_STATE", false);
+ event.xclient.format = 32;
- //event.xclient.data.l[0] = _NET_WM_STATE_ADD;
- //event.xclient.data.l[1] = XInternAtom(x11_d, "_NET_WM_STATE_BELOW", false);
- //event.xclient.data.l[2] = 0; //unused.
- //event.xclient.data.l[3] = 0;
- //event.xclient.data.l[4] = 0;
+ event.xclient.data.l[0] = _NET_WM_STATE_ADD;
+ event.xclient.data.l[1] = XInternAtom(x11_d, "_NET_WM_STATE_BELOW", false);
+ event.xclient.data.l[2] = 0; //unused.
+ event.xclient.data.l[3] = 0;
+ event.xclient.data.l[4] = 0;
- //XSendEvent(x11_d, root, false,
- // SubstructureRedirectMask|SubstructureNotifyMask, &event);
+ XSendEvent(x11_d, root, false,
+ SubstructureRedirectMask|SubstructureNotifyMask, &event);
- //event.xclient.data.l[1] = XInternAtom(x11_d, "_NET_WM_STATE_STICKY", false);
+ event.xclient.data.l[1] = XInternAtom(x11_d, "_NET_WM_STATE_STICKY", false);
- //XSendEvent(x11_d, root, false,
- // SubstructureRedirectMask|SubstructureNotifyMask, &event);
+ XSendEvent(x11_d, root, false,
+ SubstructureRedirectMask|SubstructureNotifyMask, &event);
- //event.xclient.data.l[1] = XInternAtom(x11_d, "_NET_WM_STATE_FULLSCREEN", false);
+ event.xclient.data.l[1] = XInternAtom(x11_d, "_NET_WM_STATE_FULLSCREEN", false);
+ */
}
XSetWMProtocols(x11_d, window, &ATOM_WM_DELETE_WINDOW, 1);
- XMoveWindow(x11_d, window, 1080, 0);
+ XMoveWindow(x11_d, window, 0, 0);
XMapWindow(x11_d, window);
XFlush(x11_d);
diff --git a/src/mauri.cc b/src/mauri.cc
index f6f6703..5a969dd 100644
--- a/src/mauri.cc
+++ b/src/mauri.cc
@@ -23,9 +23,9 @@ s32 main(s32 argc, char *argv[])
gl_initialized = true;
#endif
- //Context *context = new ContextX11(2560, 1440, "mauri", true);
- Context *context = new ContextGLFW(720, 1280, "mauri", false);
- //Context *context = new ContextGLFW(1920, 1080, "mauri", false);
+ //Context *context = new ContextX11(1080, 1920, "mauri", true);
+ //Context *context = new ContextGLFW(720, 1280, "mauri", false);
+ Context *context = new ContextGLFW(1920, 1080, "mauri", false);
if (argc == 2)
{
diff --git a/src/objects/effect.cc b/src/objects/effect.cc
index cde37e6..a56bd75 100644
--- a/src/objects/effect.cc
+++ b/src/objects/effect.cc
@@ -56,8 +56,7 @@ void Effect::load(Engine *engine, Object *object, bool last_effect)
for (auto &fbo : fbos)
{
- fbo.name.append(buffer_id);
- engine->new_framebuffer(fbo.name, object->size[0], object->size[1], fbo.scale);
+ engine->new_framebuffer(fbo.name + buffer_id, object->size[0], object->size[1], fbo.scale);
}
for (int i = 0; i < passes0.size(); i++)
@@ -69,10 +68,21 @@ void Effect::load(Engine *engine, Object *object, bool last_effect)
pass->object = object;
pass->effect = this;
- passes0[i]->load(EFFECT0_PASS, pass);
- passes1[i]->load(EFFECT1_PASS, pass);
+ passes0[i]->load(engine, EFFECT0_PASS, pass);
+ passes1[i]->load(engine, EFFECT1_PASS, pass);
- object->passes.push_back(pass);
+ this->passes.push_back(new RenderPass(engine, pass));
+ }
+}
+
+void Effect::draw(Engine *engine)
+{
+ if (!visible)
+ return;
+
+ for (auto &pass : passes)
+ {
+ pass->draw(engine);
}
}
@@ -87,4 +97,9 @@ Effect::~Effect()
{
delete pass1;
}
+
+ for (auto &pass : passes)
+ {
+ delete pass;
+ }
}
diff --git a/src/objects/effect.h b/src/objects/effect.h
index 9edeea7..c3eddba 100644
--- a/src/objects/effect.h
+++ b/src/objects/effect.h
@@ -9,6 +9,7 @@ namespace Mauri
{
class Pass;
+class RenderPass;
struct EffectBuffer
{
@@ -28,6 +29,7 @@ class Effect
std::string buffer_id;
void load(Engine *engine, Object *object, bool last_effect);
+ void draw(Engine *engine);
private:
bool visible;
@@ -35,6 +37,8 @@ class Effect
std::vector<Pass *> passes0;
std::vector<Pass *> passes1;
+ std::vector<RenderPass *> passes;
+
std::vector<EffectBuffer> fbos;
};
diff --git a/src/objects/material.cc b/src/objects/material.cc
index 59ac759..a1c2146 100644
--- a/src/objects/material.cc
+++ b/src/objects/material.cc
@@ -29,14 +29,14 @@ Material::Material(std::string path)
}
}
-void Material::load(Object *object, MaterialType type, Pass *pass, bool no_effects)
+void Material::load(Engine *engine, Object *object, MaterialType type, Pass *pass, bool no_effects)
{
for (auto &pass0 : passes0)
{
switch (type)
{
case MATERIAL_EFFECT:
- pass0->load(MATERIAL_PASS, pass);
+ pass0->load(engine, MATERIAL_PASS, pass);
break;
case MATERIAL_MODEL:
Pass *pass = new Pass();
@@ -46,9 +46,9 @@ void Material::load(Object *object, MaterialType type, Pass *pass, bool no_effec
pass->object = object;
pass->effect = nullptr;
- pass0->load(MATERIAL_ONLY_PASS, pass);
+ pass0->load(engine, MATERIAL_ONLY_PASS, pass);
- object->passes.push_back(pass);
+ object->passes.push_back(new RenderPass(engine, pass));
break;
}
diff --git a/src/objects/material.h b/src/objects/material.h
index 31b3be0..23aa06b 100644
--- a/src/objects/material.h
+++ b/src/objects/material.h
@@ -22,7 +22,7 @@ class Material
Material(std::string path);
~Material();
- void load(Object *object, MaterialType type, Pass *pass, bool no_effects);
+ void load(Engine *engine, Object *object, MaterialType type, Pass *pass, bool no_effects);
std::vector<Pass *> passes0;
};
diff --git a/src/objects/model.cc b/src/objects/model.cc
index 322c188..c45ac12 100644
--- a/src/objects/model.cc
+++ b/src/objects/model.cc
@@ -28,9 +28,9 @@ Model::Model(std::string path)
material = new Material(root["material"].asString());
}
-void Model::load(Object *object, bool no_effects)
+void Model::load(Engine *engine, Object *object, bool no_effects)
{
- material->load(object, MATERIAL_MODEL, NULL, no_effects);
+ material->load(engine, object, MATERIAL_MODEL, NULL, no_effects);
}
Model::~Model()
diff --git a/src/objects/model.h b/src/objects/model.h
index e25a592..bc6ea93 100644
--- a/src/objects/model.h
+++ b/src/objects/model.h
@@ -20,7 +20,7 @@ class Model
bool fullscreen;
bool passthrough;
- void load(Object *object, bool no_effects);
+ void load(Engine *engine, Object *object, bool no_effects);
private:
Material *material = nullptr;
diff --git a/src/objects/object.cc b/src/objects/object.cc
index 6cc775f..71a8b28 100644
--- a/src/objects/object.cc
+++ b/src/objects/object.cc
@@ -99,7 +99,7 @@ void Object::load(Engine *engine)
if (image != nullptr)
{
- image->load(this, effects.size() == 0);
+ image->load(engine, this, effects.size() == 0);
if (image->fullscreen)
{
@@ -138,6 +138,11 @@ void Object::draw(Engine *engine)
{
pass->draw(engine);
}
+
+ for (auto &effect : effects)
+ {
+ effect->draw(engine);
+ }
}
std::string Object::get_target_buffer() const
@@ -161,6 +166,11 @@ Object::~Object()
if (gl_uv_object != nullptr)
delete gl_uv_object;
+ for (auto &pass : passes)
+ {
+ delete pass;
+ }
+
for (auto &effect : effects)
{
delete effect;
diff --git a/src/objects/object.h b/src/objects/object.h
index fe44e03..0b22122 100644
--- a/src/objects/object.h
+++ b/src/objects/object.h
@@ -58,7 +58,8 @@ class Object
this->buffer_switch = !this->buffer_switch;
}
- std::vector<Pass *> passes;
+ std::vector<RenderPass *> passes;
+ std::vector<Effect *> effects;
void load(Engine *engine);
void update(Engine *engine);
@@ -81,8 +82,6 @@ class Object
bool buffer_switch = false;
bool loaded = false;
-
- std::vector<Effect *> effects;
};
} // namespace Mauri
diff --git a/src/objects/pass.cc b/src/objects/pass.cc
index cb3a3c0..6334641 100644
--- a/src/objects/pass.cc
+++ b/src/objects/pass.cc
@@ -24,15 +24,15 @@ Pass::Pass(Json::Value root, PassStage stage)
switch (stage)
{
case EFFECT0_PASS: {
- auto shader_values = root["constantshadervalues"];
+ auto _uniforms = root["constantshadervalues"];
- for (auto &name : shader_values.getMemberNames())
+ for (auto &name : _uniforms.getMemberNames())
{
auto uniform = Uniform();
uniform.name = name;
- json_number(json_user_value(shader_values[name]),
+ json_number(json_user_value(_uniforms[name]),
glm::value_ptr(uniform.value));
uniforms.push_back(uniform);
@@ -41,10 +41,10 @@ Pass::Pass(Json::Value root, PassStage stage)
break;
}
case EFFECT1_PASS: {
- auto pass_material = root["material"];
+ auto _material = root["material"];
- if (pass_material.isString())
- material = new Material(pass_material.asString());
+ if (_material.isString())
+ material = new Material(_material.asString());
target = root.get("target", "previous").asString();
@@ -62,35 +62,35 @@ Pass::Pass(Json::Value root, PassStage stage)
case MATERIAL_PASS: {
shader = root["shader"].asString();
- auto blending = root.get("blending", "normal").asString();
+ //auto blending = root.get("blending", "normal").asString();
- if (blending == "normal")
- blend = NORMAL;
- else if (blending == "translucent")
- blend = TRANSLUCENT;
+ //if (blending == "normal")
+ // blend = NORMAL;
+ //else if (blending == "translucent")
+ // blend = TRANSLUCENT;
break;
}
}
- auto pass_textures = root["textures"];
+ auto _textures = root["textures"];
- for (int i = 0; i < pass_textures.size(); i++)
+ for (int i = 0; i < _textures.size(); i++)
{
- auto texture = pass_textures[i];
+ auto texture = _textures[i];
if (texture.isString())
textures[i] = texture.asString();
}
- auto pass_combos = root["combos"];
+ auto _combos = root["combos"];
- for (auto &name : pass_combos.getMemberNames())
+ for (auto &name : _combos.getMemberNames())
{
- combos.emplace_back((Combo){name, pass_combos[name].asInt()});
+ combos.emplace_back((Combo){name, _combos[name].asInt()});
}
}
-void Pass::load(PassStage stage, Pass *pass)
+void Pass::load(Engine *engine, PassStage stage, Pass *pass)
{
for (int i = 0; i < 8; i++)
{
@@ -143,7 +143,7 @@ void Pass::load(PassStage stage, Pass *pass)
pass->object->swap_buffer();
if (material != nullptr)
- material->load(pass->object, MATERIAL_EFFECT, pass, false);
+ material->load(engine, pass->object, MATERIAL_EFFECT, pass, false);
break;
case MATERIAL_ONLY_PASS:
@@ -161,34 +161,36 @@ void Pass::load(PassStage stage, Pass *pass)
}
}
-void Pass::generate_pass(Engine *engine)
+Pass::~Pass()
{
- rpass = new RenderPass();
-
- rpass->combine = combine;
- rpass->combine_blend = object->color_blend_mode;
+ if (material != nullptr)
+ delete material;
+}
- rpass->shader = new Shader(shader);
+RenderPass::RenderPass(Engine *engine, Pass *pass)
+{
+ combine = pass->combine;
+ combine_blend = pass->object->color_blend_mode;
- auto rshader = rpass->shader;
+ shader = new Shader(pass->shader);
for (int i = 0; i < 8; i++)
{
- if (textures[i].empty() && !rshader->textures[i].empty())
- textures[i] = rshader->textures[i];
+ if (pass->textures[i].empty() && !shader->textures[i].empty())
+ pass->textures[i] = shader->textures[i];
- if (textures[i].empty())
+ if (pass->textures[i].empty())
continue;
- auto asset = asset_manager()->get_file(textures[i], TEXTURE);
+ auto asset = asset_manager()->get_file(pass->textures[i], TEXTURE);
if (asset->type != ASSET_VOID)
- rpass->textures[i] = new Texture(asset);
+ textures[i] = new Texture(asset);
else
- rpass->textures[i] = engine->get_framebuffer_texture(textures[i]);
+ textures[i] = engine->get_framebuffer_texture(pass->textures[i]);
}
- for (auto &uniform : rshader->uniforms)
+ for (auto &uniform : shader->uniforms)
{
// ex: g_Texture2Resolution (vec4)
// ^ index
@@ -196,14 +198,14 @@ void Pass::generate_pass(Engine *engine)
uniform.uname.compare(10, 10, "Resolution") == 0)
{
auto index = uniform.uname[9] - '0';
- if (rpass->textures[index] != nullptr)
- uniform.value = rpass->textures[index]->texture_resolution;
+ if (textures[index] != nullptr)
+ uniform.value = textures[index]->texture_resolution;
}
}
- for (auto &pass_uniform : uniforms)
+ for (auto &pass_uniform : pass->uniforms)
{
- for (auto &shader_uniform : rshader->uniforms)
+ for (auto &shader_uniform : shader->uniforms)
{
if (shader_uniform.name.empty())
continue;
@@ -215,7 +217,7 @@ void Pass::generate_pass(Engine *engine)
}
}
- for (auto &combo : rshader->combos)
+ for (auto &combo : shader->combos)
{
if (combo.name == "AUDIOPROCESSING")
{
@@ -224,10 +226,10 @@ void Pass::generate_pass(Engine *engine)
}
}
- for (auto &pass_combo : combos)
+ for (auto &pass_combo : pass->combos)
{
auto add = true;
- for (auto &shader_combo : rshader->combos)
+ for (auto &shader_combo : shader->combos)
{
if (pass_combo.name == shader_combo.name)
{
@@ -237,55 +239,40 @@ void Pass::generate_pass(Engine *engine)
}
}
if (add)
- rshader->combos.push_back(pass_combo);
+ shader->combos.push_back(pass_combo);
}
- rpass->shader->compile();
+ shader->compile();
- rpass->target = engine->get_framebuffer(target);
+ target = engine->get_framebuffer(pass->target);
- if (effect == nullptr)
+ if (pass->effect == nullptr)
{
- if (object->passthrough || combine)
- rpass->model = &object->model;
+ if (pass->object->passthrough || combine)
+ model = &pass->object->model;
else
- rpass->model = &object->ortho;
+ model = &pass->object->ortho;
- if (object->passthrough)
- rpass->robject = object->gl_object;
+ if (pass->object->passthrough)
+ robject = pass->object->gl_object;
else
- rpass->robject = object->gl_uv_object;
+ robject = pass->object->gl_uv_object;
}
else
{
if (combine)
{
- rpass->robject = object->gl_object;
- rpass->model = &object->model;
+ robject = pass->object->gl_object;
+ model = &pass->object->model;
}
else
{
- rpass->robject = engine->default_object;
- rpass->model = &engine->identity;
+ robject = engine->default_object;
+ model = &engine->identity;
}
}
}
-void Pass::draw(Engine *engine)
-{
- if (rpass != nullptr)
- rpass->draw(engine);
-}
-
-Pass::~Pass()
-{
- if (material != nullptr)
- delete material;
-
- if (rpass != nullptr)
- delete rpass;
-}
-
void RenderPass::draw(Engine *engine)
{
target->buffer->bind();
diff --git a/src/objects/pass.h b/src/objects/pass.h
index f7d5129..563900f 100644
--- a/src/objects/pass.h
+++ b/src/objects/pass.h
@@ -23,7 +23,7 @@ enum PassStage
MATERIAL_ONLY_PASS
};
-struct RenderPass;
+class RenderPass;
class Pass
{
@@ -38,34 +38,31 @@ class Pass
Object *object;
Effect *effect;
- bool combine;
-
- void load(PassStage stage, Pass *pass);
- void draw(Engine *engine);
-
- void generate_pass(Engine *engine);
-
- private:
std::string shader;
- Material *material = nullptr;
-
std::array<std::string, 8> textures;
std::array<std::string, 8> binds;
- BlendMode blend;
+ bool combine;
std::vector<Uniform> uniforms;
std::vector<Combo> combos;
- RenderPass *rpass = nullptr;
+ void load(Engine *engine, PassStage stage, Pass *pass);
+
+ private:
+ Material *material = nullptr;
};
-struct RenderPass
+class RenderPass
{
- RenderPass() {};
+public:
+ RenderPass(Engine *engine, Pass *pass);
~RenderPass();
+ void draw(Engine *engine);
+
+private:
Shader *shader;
Framebuffer *target;
@@ -73,12 +70,9 @@ struct RenderPass
RenderObject *robject;
bool combine;
-
BlendMode combine_blend;
std::array<Texture *, 8> textures = {0};
-
- void draw(Engine *engine);
};
} // namespace Mauri
diff --git a/src/objects/scene.cc b/src/objects/scene.cc
index 2bedb54..83b7be6 100644
--- a/src/objects/scene.cc
+++ b/src/objects/scene.cc
@@ -74,12 +74,6 @@ void Scene::load(Engine *engine)
object->load(engine);
}
-
- for (auto &object : objects)
- {
- for (auto &pass : object->passes)
- pass->generate_pass(engine);
- }
}
void Scene::draw(Engine *engine)