summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/context.h4
-rw-r--r--src/engine.cc1
-rw-r--r--src/engine.h1
-rw-r--r--src/gl.cc11
-rw-r--r--src/gl.h1
-rw-r--r--src/mauri.cc2
-rw-r--r--src/objects/effect.cc2
-rw-r--r--src/objects/object.cc2
-rw-r--r--src/objects/pass.cc18
-rw-r--r--src/objects/pass.h4
-rw-r--r--src/shader.cc27
11 files changed, 67 insertions, 6 deletions
diff --git a/src/context.h b/src/context.h
index ab27cb2..dce9d5e 100644
--- a/src/context.h
+++ b/src/context.h
@@ -35,7 +35,8 @@ class Context
this->window->pointer_pos_callback = pointer_pos_callback;
this->window->should_close_callback = should_close_callback;
this->window->userdata = this;
- s32 flags = STELA_WINDOW_VSYNC | (monitor.empty() ? 0 : STELA_WINDOW_WALLPAPER);
+ s32 flags = STELA_WINDOW_VSYNC;
+ if (!monitor.empty()) flags |= STELA_WINDOW_WALLPAPER;
if (!this->window->create_window(this->window, width, height, monitor.c_str(), name.c_str(), flags)) {
return false;
}
@@ -44,7 +45,6 @@ class Context
return false;
}
glEnable(GL_BLEND);
- glEnable(GL_MULTISAMPLE);
return true;
}
diff --git a/src/engine.cc b/src/engine.cc
index 1943357..d4424a7 100644
--- a/src/engine.cc
+++ b/src/engine.cc
@@ -66,6 +66,7 @@ Engine::Engine(Scene *scene, f32 rate, bool audio)
this->default_mat = glm::ortho(-1.f, 1.f, -1.f, 1.f, -3.f, 1.f);
this->default_mat = glm::scale(this->default_mat, vec3{1.f, 1.f, 0.001f});
+ this->default_mat_inverse = glm::inverse(this->default_mat);
this->default_object = new RenderObject(DEFAULT);
this->flipped_object = new RenderObject(DEFAULT_FLIPPED);
diff --git a/src/engine.h b/src/engine.h
index 991c226..4b90dbf 100644
--- a/src/engine.h
+++ b/src/engine.h
@@ -53,6 +53,7 @@ class Engine
View view;
mat4x4 default_mat;
+ mat4x4 default_mat_inverse;
RenderObject *default_object;
RenderObject *flipped_object;
diff --git a/src/gl.cc b/src/gl.cc
index 9cf1b2d..2570c61 100644
--- a/src/gl.cc
+++ b/src/gl.cc
@@ -496,7 +496,9 @@ auto RenderFramebuffer::clear(vec4 color) -> void
{
if (!context()->is_draw_enabled()) return;
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, this->id);
- glClearBufferfv(GL_COLOR | GL_DEPTH, 0, glm::value_ptr(color));
+ glClearBufferfv(GL_COLOR, 0, glm::value_ptr(color));
+ GLfloat depth = 0.f;
+ glClearBufferfv(GL_DEPTH, 0, &depth);
}
RenderFramebuffer::~RenderFramebuffer()
@@ -518,6 +520,13 @@ auto Render::color_mask(f32 r, f32 g, f32 b, f32 a) -> void
glColorMask(r, g, b, a);
}
+auto Render::depth_test(bool enabled) -> void
+{
+ if (!context()->is_draw_enabled()) return;
+ if (enabled) glEnable(GL_DEPTH_TEST);
+ else glDisable(GL_DEPTH_TEST);
+}
+
auto Render::bind_framebuffer(s32 id) -> void
{
if (!context()->is_draw_enabled()) return;
diff --git a/src/gl.h b/src/gl.h
index 47c5f8a..0c6450b 100644
--- a/src/gl.h
+++ b/src/gl.h
@@ -126,6 +126,7 @@ class Render
public:
static auto blend_func(s32 sfactor, s32 dfactor) -> void;
static auto color_mask(f32 r, f32 g, f32 b, f32 a) -> void;
+ static auto depth_test(bool enabled) -> void;
static auto bind_framebuffer(s32 id) -> void;
static auto set_viewport(s32 x, s32 y, s32 width, s32 height) -> void;
};
diff --git a/src/mauri.cc b/src/mauri.cc
index 6e0bcbf..7cb1476 100644
--- a/src/mauri.cc
+++ b/src/mauri.cc
@@ -138,7 +138,7 @@ auto main(s32 argc, char *argv[]) -> s32
auto wmain(s32 argc, wchar_t **argv) -> s32
#endif
{
- if (!nn_common_init()) return EXIT_FAILURE;
+ if (!nn_common_init(NULL)) return EXIT_FAILURE;
janus::ArgParser args(HELP_TEXT, "0.13");
args.newString("package p", "");
diff --git a/src/objects/effect.cc b/src/objects/effect.cc
index 2a6960f..75b7187 100644
--- a/src/objects/effect.cc
+++ b/src/objects/effect.cc
@@ -1,3 +1,5 @@
+#include "../log.h"
+
#include "effect.h"
#include "pass.h"
diff --git a/src/objects/object.cc b/src/objects/object.cc
index 6240c30..4e710ee 100644
--- a/src/objects/object.cc
+++ b/src/objects/object.cc
@@ -51,7 +51,7 @@ auto Object::parse(Parser &pr, const json &root) -> Object *
warn("non 0 origin[2]");
object->origin[2] = 0.f;
}
- pr.map_value<vec3>(root, "color", &object->color, vec3(0.f));
+ pr.map_value<vec3>(root, "color", &object->color, vec3(1.f));
pr.map_value<f32>(root, "alpha", &object->alpha, 1.f);
pr.map_value<s32>(root, "colorBlendMode", &object->color_blend_mode, 0);
diff --git a/src/objects/pass.cc b/src/objects/pass.cc
index e2dc02d..b07e98f 100644
--- a/src/objects/pass.cc
+++ b/src/objects/pass.cc
@@ -1,6 +1,7 @@
#include "../gl.h"
//#define AL_LOG_ENABLE_TRACE
#include "../log.h"
+#include "../context.h"
#include "pass.h"
@@ -45,6 +46,8 @@ auto Pass::parse(Parser &pr, const json &root, PassStage stage) -> Pass *
if (pass->shader == "genericimage4") {
pass->shader = "genericimage2";
}
+ pass->depthtest = root["depthtest"] != "disabled";
+ pass->depthwrite = root["depthwrite"] != "disabled";
break;
}
@@ -130,6 +133,8 @@ auto Pass::load(Engine *engine, PassStage stage, Pass *pass) -> void
case MATERIAL_ONLY_PASS:
case MATERIAL_PASS:
pass->shader = this->shader;
+ pass->depthtest = this->depthtest;
+ pass->depthwrite = this->depthwrite;
break;
}
}
@@ -163,6 +168,11 @@ RenderPass::RenderPass(Engine *engine, Pass *pass)
this->model = pass->model;
this->combine = pass->combine;
+ this->depth = pass->depthtest;
+ if (pass->depthtest || pass->depthwrite)
+ {
+ warn("depth test support incomplete");
+ }
this->shader = get_shader(pass->shader);
@@ -213,6 +223,10 @@ RenderPass::RenderPass(Engine *engine, Pass *pass)
for (Uniform *uniform : this->shader->uniforms)
{
+ if (uniform->uname == "g_Color4")
+ {
+ uniform->value = &this->object->color4;
+ }
for (UniformOverride *uniform_override : pass->uniforms)
{
if (uniform->name.empty()) continue;
@@ -334,6 +348,8 @@ auto RenderPass::draw(Engine *engine) -> void
if (!this->target) this->object->swap_buffers();
+ if (this->depth) Render::depth_test(true);
+
if (this->combine) Render::blend_func(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
else Render::blend_func(GL_ONE, GL_ZERO);
@@ -344,6 +360,8 @@ auto RenderPass::draw(Engine *engine) -> void
this->render_object->draw();
+ if (this->depth) Render::depth_test(false);
+
#ifdef FRAME_STEP
adjusted_target->buffer->blit(0, context()->width(), context()->height());
context()->swap_buffers();
diff --git a/src/objects/pass.h b/src/objects/pass.h
index fdec680..6d91a03 100644
--- a/src/objects/pass.h
+++ b/src/objects/pass.h
@@ -50,6 +50,9 @@ class Pass
Object *object;
Effect *effect;
+ bool depthtest;
+ bool depthwrite;
+
std::string shader;
std::array<std::string, MAX_TEXTURES> binds = {};
@@ -77,6 +80,7 @@ class RenderPass
bool model;
bool combine;
+ bool depth;
Shader *shader = nullptr;
diff --git a/src/shader.cc b/src/shader.cc
index 71597da..878f5b2 100644
--- a/src/shader.cc
+++ b/src/shader.cc
@@ -126,10 +126,30 @@ static auto bokeh_blur_hack(std::string_view &line) -> const std::string_view
return line;
}
+static auto hlsl_hack(std::string_view &line) -> const std::string_view
+{
+ // https://learn.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-per-component-math#the-vector-type
+ // HLSL would take the first components in these situations (I think).
+ if (line == " float pointer = g_PointerPosition.xy * u_pointerSpeed;\r\n")
+ {
+ return " float pointer = g_PointerPosition.x * u_pointerSpeed;\r\n";
+ }
+ if (line == "vec3 albedo = texSample2D(g_Texture0, v_TexCoord.xy);\r\n")
+ {
+ return "vec3 albedo = texSample2D(g_Texture0, v_TexCoord.xy).xyz;\r\n";
+ }
+ if (line == "float scale = pow(length(abs(v_TexCoord - CAST2(u_offset)) * 1.0), 3.0) * u_scale;\r\n")
+ {
+ return "float scale = pow(length(abs(v_TexCoord.xy - CAST2(u_offset)) * 1.0), 3.0) * u_scale;\r\n";
+ }
+ return line;
+}
+
static auto apply_hacks(std::string_view line) -> const std::string_view
{
line = simple_audio_bars_hack(line);
line = bokeh_blur_hack(line);
+ line = hlsl_hack(line);
return line;
}
@@ -421,6 +441,10 @@ auto Shader::bind(RenderShader *shader, Engine *engine, Object *object, mat4x4 *
shader->set_uniform("g_ModelViewProjectionMatrix", TYPE_MAT4, glm::value_ptr(*model));
shader->set_uniform("g_ModelViewProjectionMatrixInverse", TYPE_MAT4, glm::value_ptr(inverse));
shader->set_uniform("g_EffectModelViewProjectionMatrix", TYPE_MAT4, glm::value_ptr(engine->default_mat));
+ shader->set_uniform("g_EffectModelViewProjectionMatrixInverse", TYPE_MAT4, glm::value_ptr(engine->default_mat_inverse));
+ shader->set_uniform("g_EffectTextureProjectionMatrix", TYPE_MAT4, glm::value_ptr(engine->default_mat));
+ shader->set_uniform("g_EffectTextureProjectionMatrixInverse", TYPE_MAT4, glm::value_ptr(engine->default_mat_inverse));
+
shader->set_uniform("g_ModelMatrix", TYPE_MAT4, glm::value_ptr(engine->default_mat));
}
@@ -434,10 +458,11 @@ auto Shader::bind(RenderShader *shader, Engine *engine, Object *object, mat4x4 *
}
cursor_pos[0] /= engine->view.width;
cursor_pos[1] /= engine->view.height;
+ //cursor_pos[1] = -cursor_pos[1];
shader->set_uniform("g_PointerPosition", TYPE_VEC2, glm::value_ptr(cursor_pos));
shader->set_uniform("g_Alpha", TYPE_FLOAT, &object->alpha);
shader->set_uniform("g_Color", TYPE_VEC3, glm::value_ptr(object->color));
- shader->set_uniform("g_Color4", TYPE_VEC4, glm::value_ptr(object->color4));
+ //shader->set_uniform("g_Color4", TYPE_VEC4, glm::value_ptr(object->color4));
}
static const std::array<f32, 64> empty_bars = {};