mirror of
https://github.com/allemangD/toddcox-visualize.git
synced 2025-11-10 12:02:47 -05:00
separate vao for each kind of slice
This commit is contained in:
72
vis/include/combo_iterator.hpp
Normal file
72
vis/include/combo_iterator.hpp
Normal file
@@ -0,0 +1,72 @@
|
||||
#pragma once
|
||||
|
||||
#include <vector>
|
||||
#include <algorithm>
|
||||
#include <stdexcept>
|
||||
|
||||
template<class T>
|
||||
struct ComboIterator {
|
||||
const std::vector<T> &vals;
|
||||
const size_t k;
|
||||
size_t n;
|
||||
std::vector<bool> bits;
|
||||
std::vector<T> curr;
|
||||
|
||||
ComboIterator(ComboIterator &) = default;
|
||||
|
||||
ComboIterator(const std::vector<T> &vals, const size_t k, const size_t n)
|
||||
: vals(vals), k(k), n(n), curr(k), bits(vals.size()) {
|
||||
for (size_t i = 0; i < vals.size(); ++i) {
|
||||
bits[i] = i < k;
|
||||
}
|
||||
std::reverse(bits.begin(), bits.end());
|
||||
set_curr();
|
||||
}
|
||||
|
||||
void set_curr() {
|
||||
for (size_t i = 0, j = 0; i < vals.size(); ++i) {
|
||||
if (bits[i]) curr[j++] = vals[i];
|
||||
}
|
||||
}
|
||||
|
||||
const std::vector<T> &operator*() const {
|
||||
return curr;
|
||||
}
|
||||
|
||||
void operator++() {
|
||||
std::next_permutation(bits.begin(), bits.end());
|
||||
set_curr();
|
||||
++n;
|
||||
}
|
||||
|
||||
[[nodiscard]] bool operator!=(const ComboIterator<T> &o) const {
|
||||
return n != o.n;
|
||||
}
|
||||
|
||||
[[nodiscard]] bool operator==(const ComboIterator<T> &o) const {
|
||||
return n == o.n;
|
||||
}
|
||||
};
|
||||
|
||||
size_t choose(size_t n, size_t k) {
|
||||
if (k == 0) return 1;
|
||||
return n * choose(n - 1, k - 1) / k;
|
||||
}
|
||||
|
||||
template<class T>
|
||||
struct Combos {
|
||||
const std::vector<T> &vals;
|
||||
size_t k;
|
||||
|
||||
Combos(const std::vector<T> &vals, size_t k) : vals(vals), k(k) {
|
||||
}
|
||||
|
||||
[[nodiscard]] ComboIterator<T> begin() const {
|
||||
return ComboIterator(vals, k, 0);
|
||||
}
|
||||
|
||||
[[nodiscard]] ComboIterator<T> end() const {
|
||||
int j = choose(vals.size(), k);
|
||||
return ComboIterator(vals, k, j);
|
||||
}
|
||||
};
|
||||
@@ -4,6 +4,7 @@
|
||||
#include <cmath>
|
||||
#include <optional>
|
||||
#include <iostream>
|
||||
#include "combo_iterator.hpp"
|
||||
|
||||
size_t get_key_from_gens(std::vector<int> &gens) {
|
||||
size_t key = 0;
|
||||
@@ -229,14 +230,7 @@ struct GeomGen {
|
||||
S.vals.push_back(0);
|
||||
return S;
|
||||
}
|
||||
std::vector<int> sg_gens(g_gens.size()-1);
|
||||
for (int i = 0; i < g_gens.size(); i++) {
|
||||
int k = 0;
|
||||
for (int j = 0; j < g_gens.size(); j++) {
|
||||
if (j != i) {
|
||||
sg_gens[k++] = g_gens[j];
|
||||
}
|
||||
}
|
||||
for (std::vector<int> sg_gens : Combos(g_gens, g_gens.size() - 1)) {
|
||||
auto sub_simps = triangulate(sg_gens);
|
||||
int start = sub_simps.size();
|
||||
sub_simps = tile(g_gens, sg_gens, sub_simps);
|
||||
|
||||
@@ -139,3 +139,23 @@ GLuint utilCreateShaderProgramFile(GLenum type, const std::vector<std::string> &
|
||||
std::transform(files.begin(), files.end(), sources.begin(), utilReadFile);
|
||||
return utilCreateShaderProgram(type, sources);
|
||||
}
|
||||
|
||||
std::vector<GLuint> utilCreateVertexArrays(int n) {
|
||||
std::vector<GLuint> res(n);
|
||||
glCreateVertexArrays(n, &res[0]);
|
||||
return res;
|
||||
}
|
||||
|
||||
GLuint utilCreateVertexArray() {
|
||||
return utilCreateVertexArrays(1)[0];
|
||||
}
|
||||
|
||||
std::vector<GLuint> utilCreateBuffers(int n) {
|
||||
std::vector<GLuint> res(n);
|
||||
glCreateBuffers(n, &res[0]);
|
||||
return res;
|
||||
}
|
||||
|
||||
GLuint utilCreateBuffer() {
|
||||
return utilCreateBuffers(1)[0];
|
||||
}
|
||||
Reference in New Issue
Block a user