From 181bf0cf19a6b49d246bfe9bbaaccacd95c8c649 Mon Sep 17 00:00:00 2001 From: David Allemang Date: Mon, 10 Oct 2022 15:33:38 -0400 Subject: [PATCH] pointrenderer class --- vis/res/shaders/main.vert.glsl | 10 ++--- vis/src/main.cpp | 70 ++++++++++------------------------ vis/src/render/pointrender.hpp | 53 +++++++++++++++++++++++++ 3 files changed, 77 insertions(+), 56 deletions(-) create mode 100644 vis/src/render/pointrender.hpp diff --git a/vis/res/shaders/main.vert.glsl b/vis/res/shaders/main.vert.glsl index 243ae8d..fb1f8b2 100644 --- a/vis/res/shaders/main.vert.glsl +++ b/vis/res/shaders/main.vert.glsl @@ -1,15 +1,13 @@ #version 440 -//layout(location=1) uniform float time; +layout(location=1) uniform float time; layout(location=2) uniform mat4 proj; -//layout(location=3) uniform mat4 rot; +layout(location=3) uniform mat4 view; layout(location=0) in vec4 pos; void main() { -// mat3 rot3 = mat3(rot); -// vec3 pos3 = rot3 * pos; - - vec3 pos3 = pos.xyz; + vec3 pos3 = (view * pos).xyz; + gl_Position = proj * vec4(pos3, 1.0); } diff --git a/vis/src/main.cpp b/vis/src/main.cpp index 1873a64..f329443 100644 --- a/vis/src/main.cpp +++ b/vis/src/main.cpp @@ -19,20 +19,7 @@ #include -struct State { - Eigen::Vector4f bg{0.169f, 0.169f, 0.169f, 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::Vector4f R{1.00f, 0.00f, 0.00f, 1.00f}; - Eigen::Vector4f G{0.00f, 1.00f, 0.00f, 1.00f}; - Eigen::Vector4f B{0.00f, 0.00f, 1.00f, 1.00f}; - Eigen::Vector4f Y{1.20f, 1.20f, 0.00f, 1.00f}; - - Eigen::Matrix4f rot = Eigen::Matrix4f::Identity(); - - bool color_axes = false; -}; +#include "render/pointrender.hpp" Eigen::Matrix4f rotor(int u, int v, float rad) { Eigen::Matrix4f res = Eigen::Matrix4f::Identity(); @@ -89,9 +76,9 @@ void show_overlay(State &state) { ImGui::ColorEdit3("Background", state.bg.data(), ImGuiColorEditFlags_Float); ImGui::ColorEdit3("Foreground", state.fg.data(), ImGuiColorEditFlags_Float); - ImGui::ColorEdit3("Wireframe", state.wf.data(), ImGuiColorEditFlags_Float); +// ImGui::ColorEdit3("Wireframe", state.wf.data(), ImGuiColorEditFlags_Float); - ImGui::Checkbox("Show RGBY axis colors", &state.color_axes); +// ImGui::Checkbox("Show RGBY axis colors", &state.color_axes); if (io.MouseDown[0] && !io.WantCaptureMouse) { Eigen::Matrix4f rot = Eigen::Matrix4f::Identity(); @@ -112,7 +99,7 @@ void show_overlay(State &state) { rot = rx * ry; } - state.rot = rot * state.rot; + state.view = rot * state.view; } ImGui::End(); @@ -131,37 +118,28 @@ void set_style() { int run(GLFWwindow *window, ImGuiContext *context) { State state; -// Buffer ind_buf; - Buffer vert_buf; + PointRenderer point_render; - VertexArray vao(vert_buf); -// glVertexArrayElementBuffer(vao, ind_buf); + { + tc::Group group = tc::coxeter("3 4 3"); + Eigen::Vector4f coords{1, 1, 1, 1}; - tc::Group group = tc::coxeter("3 4 3"); + auto cosets = tc::solve(group, {}, 1000000); + + auto mirrors = mirror<4>(group); - auto cosets = solve(group, {}, 1000000); - vec4 coords {1, 1, 1, 1}; + auto corners = plane_intersections(mirrors); + auto start = barycentric(corners, coords); + start.normalize(); + + auto points = cosets.path.walk(start, mirrors, reflect); - auto mirrors = mirror<4>(group); - - auto corners = plane_intersections(mirrors); - auto start = barycentric(corners, coords); - start.normalize(); - - auto points = cosets.path.walk(start, mirrors, reflect); - - vert_buf.upload(points); - - VertexShader vs(std::ifstream("res/shaders/main.vert.glsl")); - FragmentShader fs(std::ifstream("res/shaders/main.frag.glsl")); - - Program pgm(vs, fs); + point_render.upload(points); + } glEnable(GL_DEPTH_TEST); glPointSize(2); - Eigen::Projective3f proj; - while (!glfwWindowShouldClose(window)) { glfwPollEvents(); @@ -178,17 +156,9 @@ int run(GLFWwindow *window, ImGuiContext *context) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); auto aspect = (float) display_h / (float) display_w; - proj = Eigen::AlignedScaling3f(aspect, 1.0, -0.6); + state.proj = Eigen::AlignedScaling3f(aspect, 1.0, -0.6); - glUseProgram(pgm); - glBindVertexArray(vao); - glUniform4fv(0, 1, state.fg.data()); - glUniform1f(1, (GLfloat) glfwGetTime()); - glUniformMatrix4fv(2, 1, false, proj.data()); - glUniformMatrix4fv(3, 1, false, state.rot.data()); - glDrawArrays(GL_POINTS, 0, points.size()); - glBindVertexArray(0); - glUseProgram(0); + point_render.draw(state); ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData()); glfwSwapBuffers(window); diff --git a/vis/src/render/pointrender.hpp b/vis/src/render/pointrender.hpp new file mode 100644 index 0000000..a950172 --- /dev/null +++ b/vis/src/render/pointrender.hpp @@ -0,0 +1,53 @@ +#pragma once + +#include +#include +#include +#include + +#include + +struct State { + Eigen::Vector4f bg{0.16, 0.16, 0.16, 1.00}; + Eigen::Vector4f fg{0.71, 0.53, 0.94, 1.00}; + + float time = 0; + + Eigen::Projective3f proj = Eigen::Projective3f::Identity(); + Eigen::Projective3f view = Eigen::Projective3f::Identity(); +}; + +template +struct PointRenderer { + using Vertex = V_; + + VertexShader vs{std::ifstream("res/shaders/main.vert.glsl")}; + FragmentShader fs{std::ifstream("res/shaders/main.frag.glsl")}; + + Program pgm{vs, fs}; + + Buffer vbo; + VertexArray vao{vbo}; + + GLuint count; + + template + void upload(const T &points) { + count = vbo.upload(points); + +// Buffer ind_buf; +// glVertexArrayElementBuffer(vao, ind_buf); + } + + void draw(const State &state) { + glUseProgram(pgm); + glBindVertexArray(vao); + glUniform4fv(0, 1, state.fg.data()); + glUniform1f(1, state.time); + glUniformMatrix4fv(2, 1, false, state.proj.data()); + glUniformMatrix4fv(3, 1, false, state.view.data()); + glDrawArrays(GL_POINTS, 0, count); + glBindVertexArray(0); + glUseProgram(0); + } +};