misc table solution optimizations

This commit is contained in:
2019-09-20 15:44:13 -04:00
parent 583f6fef71
commit 3a96d4a875
6 changed files with 128 additions and 104 deletions

View File

@@ -15,15 +15,13 @@ glm::vec4 identity(const std::vector<glm::vec4> &normals, const std::vector<floa
}
template<int NGENS>
glm::vec4 identity(const Mults<NGENS> &mults, const std::vector<float> &coords) {
glm::vec4 identity(const Mults &mults, const std::vector<float> &coords) {
const std::vector<glm::vec4> normals = mirror(mults);
return identity(normals, coords);
}
template<int NGENS>
glm::vec4 center(const Mults<NGENS> &mults) {
glm::vec4 center(const Mults &mults) {
const std::vector<glm::vec4> normals = mirror(mults);
const std::vector<glm::vec4> corners = plane_intersections(normals);
std::vector<float> coords{};
@@ -43,10 +41,9 @@ struct Buffer {
unsigned size = 0;
};
template<int NGENS>
struct Mesh {
const Mults<NGENS> mults;
const Table<NGENS> *t_vert;
const Mults mults;
const Table *t_vert;
const std::vector<glm::vec4> normals;
glm::vec4 *vert_data;
@@ -55,11 +52,12 @@ struct Mesh {
Buffer edge;
Buffer face;
explicit Mesh(Mults<NGENS> mults) : mults(mults), normals(mirror(mults)) {
explicit Mesh(const Mults &mults) : mults(mults), normals(mirror(mults)) {
auto a = std::chrono::high_resolution_clock::now();
t_vert = mults.isolve({});
auto b = std::chrono::high_resolution_clock::now();
std::cout << "time to solve: " << ((std::chrono::duration<double>) (b - a)).count() << std::endl;
auto delta = (std::chrono::duration<double>) (b - a);
std::cout << "time to solve verts: " << delta.count() << std::endl;
vert.size = t_vert->size();
vert_data = new glm::vec4[vert.size];
@@ -71,19 +69,18 @@ struct Mesh {
gen_indices();
}
explicit Mesh(Mults<NGENS> mults, const glm::vec4 root) {
this(mults);
gen_vertices(root);
}
void gen_vertices(const glm::vec4 root) {
auto a = std::chrono::high_resolution_clock::now();
vert_data[0] = root;
for (unsigned from = 0; from < vert.size; ++from) {
for (unsigned gen = 0; gen < NGENS; ++gen) {
for (unsigned gen = 0; gen < mults.dim; ++gen) {
int to = t_vert->iget((int) from, (int) gen);
vert_data[to] = reflect(vert_data[from], normals[gen]);
}
}
auto b = std::chrono::high_resolution_clock::now();
auto delta = (std::chrono::duration<double>) (b - a);
std::cout << "time to build verts: " << delta.count() << std::endl;
glBindBuffer(GL_ARRAY_BUFFER, vert.name);
glBufferData(GL_ARRAY_BUFFER, sizeof(glm::vec4) * vert.size, vert_data, GL_STATIC_DRAW);
@@ -91,11 +88,37 @@ struct Mesh {
}
void gen_indices() {
std::vector<int> edges;
std::vector<int> faces;
std::vector<int> edge_data;
auto e_table = mults.sub({0, 1}).isolve({});
// std::cout << "building gens" << std::endl;
// const std::vector<int> gens{0, 1};
// std::cout << "built gens" << std::endl;
// const std::vector<int> &igens = gens;
// Mults<2> res{};
// for (int a = 0; a < 2; ++a) {
// for (int b = a + 1; b < 2; ++b) {
// res.set(a, b, t_vert->mults.get(igens[a], igens[b]));
// }
// }
// const auto &mults = res;
// std::cout << "built mults" << std::endl;
// auto *e_table = mults.isolve({});
// std::cout << "built table" << std::endl;
// std::cout << "edge verts:" << e_table->size() << std::endl;
//
//// for (int i = 0; i < e_table->size(); ++i) {
//// edge_data.push_back(i);
//// }
//
// delete e_table;
edge.size = edge_data.size();
glBindBuffer(GL_ARRAY_BUFFER, edge.name);
// glBufferData(GL_ARRAY_BUFFER, sizeof(int) * edge.size, edge_data, GL_STATIC_DRAW);
glBufferData(GL_ARRAY_BUFFER, sizeof(int) * edge.size, &edge_data[0], GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
}
@@ -103,9 +126,9 @@ struct Mesh {
delete t_vert;
delete[] vert_data;
glDeleteBuffers(1, &vert.name);
glDeleteBuffers(1, &edge.name);
glDeleteBuffers(1, &face.name);
// glDeleteBuffers(1, &vert.name);
// glDeleteBuffers(1, &edge.name);
// glDeleteBuffers(1, &face.name);
}
};