diff --git a/res/shaders/4d.vert.glsl b/res/shaders/4d.vert.glsl index 2e5912c..208c23b 100644 --- a/res/shaders/4d.vert.glsl +++ b/res/shaders/4d.vert.glsl @@ -2,39 +2,11 @@ layout(location=1) uniform float time; layout(location=2) uniform mat4 proj; +layout(location=3) uniform mat4 rot; layout(location=0) in vec4 pos; void main() { - float c2 = cos(time * 0.2); - float s2 = sin(time * 0.2); - float c3 = cos(time * 0.3); - float s3 = sin(time * 0.3); - float c4 = cos(time * 0.25); - float s4 = sin(time * 0.25); - - mat4 r1 = mat4( - c2, -s2, 0.0, 0.0, - s2, c2, 0.0, 0.0, - 0.0, 0.0, 1.0, 0.0, - 0.0, 0.0, 0.0, 1.0 - ); - - mat4 r2 = mat4( - c3, 0.0, -s3, 0.0, - 0.0, 1.0, 0.0, 0.0, - s3, 0.0, c3, 0.0, - 0.0, 0.0, 0.0, 1.0 - ); - - mat4 r3 = mat4( - 1.0, 0.0, 0.0, 0.0, - 0.0, c4, 0.0, -s4, - 0.0, 0.0, 1.0, 0.0, - 0.0, s4, 0.0, c4 - ); - - vec4 pos = r2 * r1 * r3 * pos; - + vec4 pos = rot * pos; gl_Position = proj * vec4(pos.xyz / (1 - pos.w), 1.0); } diff --git a/res/shaders/main.vert.glsl b/res/shaders/main.vert.glsl index 898467d..ca74f76 100644 --- a/res/shaders/main.vert.glsl +++ b/res/shaders/main.vert.glsl @@ -2,17 +2,12 @@ layout(location=1) uniform float time; layout(location=2) uniform mat4 proj; +layout(location=3) uniform mat4 rot; layout(location=0) in vec3 pos; void main() { - float c2 = cos(time * 0.2); - float s2 = sin(time * 0.2); - float c3 = cos(time * 0.3); - float s3 = sin(time * 0.3); + mat3 rot3 = mat3(rot); + vec3 pos3 = rot3 * pos; - mat4 r1 = mat4(c2, -s2, 0.0, 0.0, s2, c2, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0); - - mat4 r2 = mat4(c3, 0.0, -s3, 0.0, 0.0, 1.0, 0.0, 0.0, s3, 0.0, c3, 0.0, 0.0, 0.0, 0.0, 1.0); - - gl_Position = proj * r2 * r1 * vec4(pos, 1.0); + gl_Position = proj * vec4(pos3, 1.0); } diff --git a/src/main.cpp b/src/main.cpp index 0dd3c51..c910bd6 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -12,10 +12,21 @@ #include struct State { - float bg[4] = {0.45f, 0.55f, 0.60f, 1.00f}; - float fg[4] = {0.19f, 0.86f, 0.33f, 1.00f}; + Eigen::Vector4f bg{0.45f, 0.55f, 0.60f, 1.00f}; + Eigen::Vector4f fg{0.71f, 0.53f, 0.94f, 1.00f}; + Eigen::Vector4f wf{0.95f, 0.95f, 0.95f, 1.00f}; + + Eigen::Matrix4f rot = Eigen::Matrix4f::Identity(); }; +Eigen::Matrix4f rotor(int u, int v, float rad) { + Eigen::Matrix4f res = Eigen::Matrix4f::Identity(); + res(u, u) = res(v, v) = cosf(rad); + res(u, v) = res(v, u) = sinf(rad); + res(u, v) *= -1; + return res; +} + void show_overlay(State &state) { static std::string gl_vendor = (const char *) glGetString(GL_VENDOR); static std::string gl_renderer = (const char *) glGetString(GL_RENDERER); @@ -24,11 +35,11 @@ void show_overlay(State &state) { ImGuiWindowFlags window_flags = ImGuiWindowFlags_AlwaysAutoResize | - ImGuiWindowFlags_NoSavedSettings | - ImGuiWindowFlags_NoFocusOnAppearing | - ImGuiWindowFlags_NoNav | - ImGuiWindowFlags_NoBringToFrontOnFocus | - ImGuiWindowFlags_NoMove; + ImGuiWindowFlags_NoSavedSettings | + ImGuiWindowFlags_NoFocusOnAppearing | + ImGuiWindowFlags_NoNav | + ImGuiWindowFlags_NoBringToFrontOnFocus | + ImGuiWindowFlags_NoMove; ImGuiStyle &style = ImGui::GetStyle(); const auto PAD = style.DisplaySafeAreaPadding; @@ -56,8 +67,31 @@ void show_overlay(State &state) { ImGui::Separator(); - ImGui::ColorEdit3("Background", state.bg, ImGuiColorEditFlags_Float); - ImGui::ColorEdit3("Foreground", state.fg, ImGuiColorEditFlags_Float); + ImGui::ColorEdit3("Background", state.bg.data(), ImGuiColorEditFlags_Float); + ImGui::ColorEdit3("Foreground", state.fg.data(), ImGuiColorEditFlags_Float); + ImGui::ColorEdit3("Wireframe", state.wf.data(), ImGuiColorEditFlags_Float); + + if (io.MouseDown[0] && !io.WantCaptureMouse) { + Eigen::Matrix4f rot = Eigen::Matrix4f::Identity(); + Eigen::Vector2f del{io.MouseDelta.x, io.MouseDelta.y}; + del /= 200.0f; + + if (io.KeyShift) { + del /= 5.0f; + } + + if (io.KeyCtrl) { + Eigen::Matrix4f rx = rotor(0, 3, -del.x()); + Eigen::Matrix4f ry = rotor(1, 3, del.y()); + rot = rx * ry; + } else { + Eigen::Matrix4f rx = rotor(0, 2, -del.x()); + Eigen::Matrix4f ry = rotor(1, 2, del.y()); + rot = rx * ry; + } + + state.rot = rot * state.rot; + } ImGui::End(); } @@ -239,9 +273,10 @@ int run(GLFWwindow *window, ImGuiContext *context) { glUseProgram(pgm); glBindVertexArray(vao); - glUniform4fv(0, 1, state.fg); + glUniform4fv(0, 1, state.fg.data()); glUniform1f(1, (GLfloat) glfwGetTime()); glUniformMatrix4fv(2, 1, false, proj.data()); + glUniformMatrix4fv(3, 1, false, state.rot.data()); glDrawElements(GL_TRIANGLES, (GLsizei) dynamic.cells().size(), GL_UNSIGNED_INT, nullptr); glBindVertexArray(0); glUseProgram(0); @@ -251,6 +286,7 @@ int run(GLFWwindow *window, ImGuiContext *context) { glUniform4fv(0, 1, state.fg); glUniform1f(1, (GLfloat) glfwGetTime()); glUniformMatrix4fv(2, 1, false, proj.data()); + glUniformMatrix4fv(3, 1, false, state.rot.data()); glDrawElements(GL_LINES, (GLsizei) wire_dynamic.cells().size(), GL_UNSIGNED_INT, nullptr); glBindVertexArray(0); glUseProgram(0);