From 0de861b2b90367ee48621dafb233a9917bbb3775 Mon Sep 17 00:00:00 2001 From: sz Date: Fri, 19 Feb 2021 20:50:10 -0600 Subject: [PATCH] quick WIP for GLSL transpose for the shakycam effect --- src/lib/gui/gl_2d_display.h | 32 +++++++++++++++++++++++++++----- src/lib/gui/window_glfw.h | 6 ++++++ 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/src/lib/gui/gl_2d_display.h b/src/lib/gui/gl_2d_display.h index 3a4cf5e5..c806500b 100644 --- a/src/lib/gui/gl_2d_display.h +++ b/src/lib/gui/gl_2d_display.h @@ -60,8 +60,13 @@ class gl_2d_display // pass in rotation matrix GLuint rotateUniform = glGetUniformLocation(prog, "rot"); - std::array vals = rotation_matrix(); - glUniformMatrix2fv(rotateUniform, 1, false, vals.data()); + std::array rot = rotation_matrix(); + glUniformMatrix2fv(rotateUniform, 1, false, rot.data()); + + // pass in transform vector + GLuint transformUniform = glGetUniformLocation(prog, "tform"); + std::pair tform = shake_transform(); + glUniform2f(transformUniform, tform.first, tform.second); // Draw glDrawArrays(GL_TRIANGLES, 0, 6); @@ -87,6 +92,12 @@ class gl_2d_display _rotation = 0; } + void shake(unsigned i=1) + { + if (i == 0 or ++_shake >= 8) + _shake = 0; + } + std::array rotation_matrix() const { // just using sin and cos is probably better? @@ -95,15 +106,23 @@ class gl_2d_display default: case 0: return {-1, 0, 0, 1}; - case 1: // right 90 - return {0, 1, 1, 0}; - case 2: // right 180 + case 1: // right 180 return {1, 0, 0, -1}; + case 2: // right 90 + return {0, 1, 1, 0}; case 3: // right 270 return {0, -1, -1, 0}; } } + std::pair shake_transform() const + { + static constexpr std::array, 8> SHAKE_POS = {{ + {0, 0}, {-.008, -.008}, {0, 0}, {.008, .008}, {0, 0}, {-.008, .008}, {0, 0}, {.008, -.008} + }}; + return SHAKE_POS[_shake]; + } + protected: static std::shared_ptr create() { @@ -116,6 +135,7 @@ class gl_2d_display */ static const std::string VERTEX_SHADER_SRC = R"(#version 300 es uniform mat2 rot; + uniform vec2 tform; in vec4 vert; out vec2 texCoord; void main() { @@ -123,6 +143,7 @@ class gl_2d_display vec2 ori = vec2(vert.x, vert.y); ori *= rot; texCoord = vec2(1.0f - ori.x, 1.0f - ori.y) / 2.0; + texCoord += tform; })"; static const std::string FRAGMENT_SHADER_SRC = R"(#version 300 es @@ -145,6 +166,7 @@ class gl_2d_display GLuint _vao; unsigned _i = 0; unsigned _rotation = 0; + unsigned _shake = 0; }; } diff --git a/src/lib/gui/window_glfw.h b/src/lib/gui/window_glfw.h index d3cb358b..57a4df6a 100644 --- a/src/lib/gui/window_glfw.h +++ b/src/lib/gui/window_glfw.h @@ -61,6 +61,12 @@ class window_glfw : public window_interface _display->rotate(i); } + void shake(unsigned i=1) + { + if (_display) + _display->shake(i); + } + void clear() { if (_display)