diff --git a/CMakeLists.txt b/CMakeLists.txt index 96d9750..649275b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -18,4 +18,6 @@ add_subdirectory(cosets) if (NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE Release) endif () + +set(CMAKE_CXX_FLAGS_DEBUG "-O2") set(CMAKE_CXX_FLAGS_RELEASE "-O3") diff --git a/cosets/src/main.cpp b/cosets/src/main.cpp index d52c1f7..9d934fc 100644 --- a/cosets/src/main.cpp +++ b/cosets/src/main.cpp @@ -29,6 +29,13 @@ class CosetsWindow : public Window { public: void init() override { + std::cout + << "Graphics Information:" << std::endl + << "Vendor: " << glGetString(GL_VENDOR) << std::endl + << "Renderer: " << glGetString(GL_RENDERER) << std::endl + << "Version: " << glGetString(GL_VERSION) << std::endl + << "Shading version: " << glGetString(GL_SHADING_LANGUAGE_VERSION) << std::endl; + auto vs = build_shader_file( GL_VERTEX_SHADER, "vertex", @@ -45,30 +52,47 @@ public: u_view = glGetUniformLocation(program, "view"); u_color = glGetUniformLocation(program, "color"); - const Mults &mults = schlafli({4, 3}); - std::cout << mults.num_gens << std::endl; + const Mults &mults = schlafli({16, 2, 16}); +// const glm::vec4 ident = center(mults); + const glm::vec4 ident = identity(mults, {1, 1, 1, 1}); + std::cout << "Dimension: " << mults.num_gens << std::endl; std::cout << "Generation times: " << std::endl; auto gen_start = std::chrono::high_resolution_clock::now(); - vert_data = vertices(mults, {1, .1, .1, .1}); + vert_data = vertices(mults, ident); auto gen_vert = std::chrono::high_resolution_clock::now(); std::chrono::duration vert_time = gen_vert - gen_start; - std::cout << "Vertices: " << vert_time.count() << std::endl; + std::cout + << "Vertices: " + << std::setw(5) << std::setprecision(3) << vert_time.count() + << " (" << vert_data.size() << ")" + << std::endl; edge_data = edges(mults); auto gen_edge = std::chrono::high_resolution_clock::now(); std::chrono::duration edge_time = gen_edge - gen_vert; - std::cout << " Edges: " << edge_time.count() << std::endl; + std::cout + << " Edges: " + << std::setw(5) << std::setprecision(3) << edge_time.count() + << " (" << edge_data.size() / 2 << ")" + << std::endl; face_data = faces(mults); auto gen_face = std::chrono::high_resolution_clock::now(); std::chrono::duration face_time = gen_face - gen_edge; - std::cout << " Faces: " << face_time.count() << std::endl; + std::cout + << " Faces: " + << std::setw(5) << std::setprecision(3) << face_time.count() + << " (" << face_data.size() / 3 << ")" + << std::endl; std::chrono::duration full_time = gen_face - gen_start; - std::cout << " Total: " << full_time.count() << std::endl; + std::cout + << " Total: " + << std::setw(5) << std::setprecision(3) << full_time.count() + << std::endl; glGenBuffers(1, &verts_buf); glBindBuffer(GL_ARRAY_BUFFER, verts_buf); @@ -106,11 +130,6 @@ public: glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, faces_buf); glBindVertexArray(0); - - std::cout << "vendor: " << glGetString(GL_VENDOR) << std::endl - << "renderer: " << glGetString(GL_RENDERER) << std::endl - << "version: " << glGetString(GL_VERSION) << std::endl - << "shading version: " << glGetString(GL_SHADING_LANGUAGE_VERSION) << std::endl; } void render() override { @@ -156,7 +175,7 @@ public: glBindVertexArray(face_vao); glCullFace(GL_FRONT); glUniform4f(u_color, 1, 1, 1, 1); -// glDrawElements(GL_TRIANGLES, face_data.size(), GL_UNSIGNED_INT, 0); + glDrawElements(GL_TRIANGLES, face_data.size(), GL_UNSIGNED_INT, 0); swapbuffers(); } diff --git a/cosets/src/util/mesh.hpp b/cosets/src/util/mesh.hpp index 7511bf6..d860af5 100644 --- a/cosets/src/util/mesh.hpp +++ b/cosets/src/util/mesh.hpp @@ -19,13 +19,31 @@ glm::vec4 identity(const std::vector &normals, const std::vector &coords) { + const std::vector normals = mirror(mults); + return identity(normals, coords); +} + +glm::vec4 center(const Mults &mults) { + const std::vector normals = mirror(mults); + const std::vector corners = plane_intersections(normals); + std::vector coords{}; + for (int i = 0; i < corners.size(); ++i) { + const auto u = (i + 2) % corners.size(); + const auto v = (i + 1) % corners.size(); + const auto &d = corners[u] - corners[v]; + coords.push_back(glm::length(d)); + } + const glm::vec4 identity = barycentric(corners, coords); + return glm::normalize(identity); +} + std::vector -vertices(const Mults &mults, std::vector coords) { +vertices(const Mults &mults, const glm::vec4 ident) { int N = mults.num_gens; Table *table = solve(all_gens(N), {}, mults); const std::vector normals = mirror(mults); - glm::vec4 ident = identity(normals, coords); std::vector verts{}; for (const auto &word : table->words()) { @@ -43,14 +61,16 @@ std::vector edges(const Mults &mults) { std::vector res{}; int N = mults.num_gens; - Table *t_vert = solve(all_gens(N), {}, mults); + const std::vector &gens = all_gens(N); + + Table *t_vert = solve(gens, {}, mults); for (const auto &subgens : combinations(N, 1)) { Table *t_edge = solve(subgens, {}, mults); std::vector edge = t_vert->apply_each(t_edge->words()); - Table *c_edge = solve(all_gens(N), subgens, mults); + Table *c_edge = solve(gens, subgens, mults); for (const auto &coset : c_edge->words()) { for (const auto &e : edge) { @@ -65,12 +85,22 @@ std::vector edges(const Mults &mults) { std::vector faces(const Mults &mults) { std::vector res{}; int N = mults.num_gens; + const std::vector &gens = all_gens(N); - Table *t_vert = solve(all_gens(N), {}, mults); + Table *t_vert = solve(gens, {}, mults); // for each *kind* of face for (const auto &sg_face : combinations(N, 2)) { - Table *cs_face = solve(all_gens(N), sg_face, mults); + if (sg_face[0] == 0 and sg_face[1] == 1) continue; +// if (sg_face[0] == 0 and sg_face[1] == 2) continue; + if (sg_face[0] == 0 and sg_face[1] == 3) continue; + + if (sg_face[0] == 1 and sg_face[1] == 2) continue; +// if (sg_face[0] == 1 and sg_face[1] == 3) continue; + + if (sg_face[0] == 2 and sg_face[1] == 3) continue; + + Table *cs_face = solve(gens, sg_face, mults); // for each *kind* of edge for (const auto &sg_edge : combinations(sg_face, 1)) { @@ -109,4 +139,4 @@ std::vector faces(const Mults &mults) { } return res; -} \ No newline at end of file +}