drop templates in favor of vector sizes

This commit is contained in:
2019-09-16 00:49:18 -04:00
parent cddb3b56dc
commit 02611be11a
7 changed files with 28 additions and 18 deletions

View File

@@ -14,3 +14,8 @@ option(GLM_TEST_ENABLE OFF)
add_subdirectory(vendor/glm) add_subdirectory(vendor/glm)
add_subdirectory(cosets) add_subdirectory(cosets)
if (NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Release)
endif ()
set(CMAKE_CXX_FLAGS_RELEASE "-O3")

View File

@@ -17,5 +17,3 @@ add_dependencies(cosets shaders)
target_link_libraries(${PROJECT_NAME} target_link_libraries(${PROJECT_NAME}
PRIVATE glad glm glfw) PRIVATE glad glm glfw)
target_compile_options(${PROJECT_NAME} PRIVATE -O3)

View File

@@ -9,8 +9,11 @@ struct Table;
struct IRow; struct IRow;
struct Mults { struct Mults {
int num_gens;
std::map<std::tuple<int, int>, int> mults; std::map<std::tuple<int, int>, int> mults;
Mults();
void set(int a, int b, int mult); void set(int a, int b, int mult);
[[nodiscard]] int get(int a, int b) const; [[nodiscard]] int get(int a, int b) const;

View File

@@ -45,23 +45,24 @@ public:
u_view = glGetUniformLocation(program, "view"); u_view = glGetUniformLocation(program, "view");
u_color = glGetUniformLocation(program, "color"); u_color = glGetUniformLocation(program, "color");
const int N = 4; const Mults &mults = schlafli({4, 3});
const Mults &mults = schlafli({3, 4, 3}); std::cout << mults.num_gens << std::endl;
std::cout << "Generation times: " << std::endl; std::cout << "Generation times: " << std::endl;
auto gen_start = std::chrono::high_resolution_clock::now(); auto gen_start = std::chrono::high_resolution_clock::now();
vert_data = vertices<N>(mults, {5, .1, .1}); vert_data = vertices(mults, {1, .1, .1, .1});
auto gen_vert = std::chrono::high_resolution_clock::now(); auto gen_vert = std::chrono::high_resolution_clock::now();
std::chrono::duration<double> vert_time = gen_vert - gen_start; std::chrono::duration<double> vert_time = gen_vert - gen_start;
std::cout << "Vertices: " << vert_time.count() << std::endl; std::cout << "Vertices: " << vert_time.count() << std::endl;
edge_data = edges<N>(mults); edge_data = edges(mults);
auto gen_edge = std::chrono::high_resolution_clock::now(); auto gen_edge = std::chrono::high_resolution_clock::now();
std::chrono::duration<double> edge_time = gen_edge - gen_vert; std::chrono::duration<double> edge_time = gen_edge - gen_vert;
std::cout << " Edges: " << edge_time.count() << std::endl; std::cout << " Edges: " << edge_time.count() << std::endl;
face_data = faces<N>(mults); face_data = faces(mults);
auto gen_face = std::chrono::high_resolution_clock::now(); auto gen_face = std::chrono::high_resolution_clock::now();
std::chrono::duration<double> face_time = gen_face - gen_edge; std::chrono::duration<double> face_time = gen_face - gen_edge;
std::cout << " Faces: " << face_time.count() << std::endl; std::cout << " Faces: " << face_time.count() << std::endl;

View File

@@ -1,7 +1,13 @@
#include "coxeter.hpp" #include "coxeter.hpp"
Mults::Mults() {
num_gens = 0;
mults = std::map<std::tuple<int, int>, int>();
}
void Mults::set(int a, int b, int mult) { void Mults::set(int a, int b, int mult) {
if (a > b) std::swap(a, b); if (a > b) std::swap(a, b);
if (b + 1 > num_gens) num_gens = b + 1;
mults[std::make_tuple(a, b)] = mult; mults[std::make_tuple(a, b)] = mult;
} }

View File

@@ -13,20 +13,18 @@ std::vector<std::vector<int>> coxeter_rels() {
return rels; return rels;
} }
template<int N> glm::vec4 identity(const std::vector<glm::vec4> &normals, const std::vector<float> &coords) {
glm::vec4 identity(const std::vector<glm::vec4> &normals, const float(&coords)[N]) {
const std::vector<glm::vec4> corners = plane_intersections(normals); const std::vector<glm::vec4> corners = plane_intersections(normals);
const std::vector<float> coords_vec(coords, coords + N); const glm::vec4 identity = barycentric(corners, coords);
const glm::vec4 identity = barycentric(corners, coords_vec);
return glm::normalize(identity); return glm::normalize(identity);
} }
template<int N>
std::vector<glm::vec4> std::vector<glm::vec4>
vertices(const Mults &mults, const float (&coords)[N]) { vertices(const Mults &mults, std::vector<float> coords) {
int N = mults.num_gens;
Table *table = solve(all_gens(N), {}, mults); Table *table = solve(all_gens(N), {}, mults);
const std::vector<glm::vec4> normals = mirror<N>(mults); const std::vector<glm::vec4> normals = mirror(mults);
glm::vec4 ident = identity(normals, coords); glm::vec4 ident = identity(normals, coords);
std::vector<glm::vec4> verts{}; std::vector<glm::vec4> verts{};
@@ -41,10 +39,10 @@ vertices(const Mults &mults, const float (&coords)[N]) {
return verts; return verts;
} }
template<int N>
std::vector<int> edges(const Mults &mults) { std::vector<int> edges(const Mults &mults) {
std::vector<int> res{}; std::vector<int> res{};
int N = mults.num_gens;
Table *t_vert = solve(all_gens(N), {}, mults); Table *t_vert = solve(all_gens(N), {}, mults);
for (const auto &subgens : combinations(N, 1)) { for (const auto &subgens : combinations(N, 1)) {
@@ -64,9 +62,9 @@ std::vector<int> edges(const Mults &mults) {
return res; return res;
} }
template<int N>
std::vector<int> faces(const Mults &mults) { std::vector<int> faces(const Mults &mults) {
std::vector<int> res{}; std::vector<int> res{};
int N = mults.num_gens;
Table *t_vert = solve(all_gens(N), {}, mults); Table *t_vert = solve(all_gens(N), {}, mults);

View File

@@ -10,9 +10,8 @@
#include "numeric.hpp" #include "numeric.hpp"
#include "coxeter.hpp" #include "coxeter.hpp"
template<int N>
std::vector<glm::vec4> mirror(const Mults &mults) { std::vector<glm::vec4> mirror(const Mults &mults) {
static_assert(1 <= N and N <= 4, "Vector size is unsupported"); int N = mults.num_gens;
std::vector<glm::vec4> mirrors{}; std::vector<glm::vec4> mirrors{};
for (int p = 0; p < N; ++p) { for (int p = 0; p < N; ++p) {