This commit is contained in:
2020-03-10 08:04:36 -04:00
parent 099d26c03a
commit a0803a3727

View File

@@ -28,49 +28,37 @@ struct Matrices {
} }
}; };
template<unsigned N> template<unsigned N, class V>
struct DirectMesh { struct BufferMesh {
cgl::buffer<Primitive<N>> ibo;
GLenum mode; GLenum mode;
std::shared_ptr<cgl::vertexarray> vao;
std::shared_ptr<cgl::buffer<Primitive<N>>> ibo;
std::shared_ptr<cgl::buffer<V>> vbo;
explicit DirectMesh(GLenum mode, const Mesh<N> &mesh) BufferMesh() = delete;
: ibo(), mode(mode) {
ibo.put(mesh.prims); BufferMesh(BufferMesh &) = delete;
}
void draw() const { BufferMesh(BufferMesh &&) = delete;
ibo.bound(GL_ELEMENT_ARRAY_BUFFER, [&]() {
glDrawElements(mode, ibo.count() * N, GL_UNSIGNED_INT, nullptr);
});
}
};
template<unsigned N> explicit BufferMesh(
struct DeferredMesh { GLenum mode,
cgl::vertexarray vao; std::shared_ptr<cgl::vertexarray> vao,
cgl::buffer<Primitive<N>> ibo; std::shared_ptr<cgl::buffer<Primitive<N>>> ibo,
std::shared_ptr<cgl::buffer<V>> vbo
) : mode(mode), vao(vao), ibo(ibo), vbo(vbo) {}
explicit DeferredMesh(const Mesh<N> &mesh, const cgl::buffer<glm::vec4> &color) void draw_deferred() {
: ibo(), vao() { vao->bound([&]() {
glDrawArrays(GL_POINTS, 0, ibo->count() * N);
ibo.put(mesh.prims);
vao.bound([&]() {
ibo.bound(GL_ARRAY_BUFFER, [&]() {
glEnableVertexAttribArray(0);
glVertexAttribIPointer(0, N, GL_INT, 0, nullptr);
});
color.bound(GL_ARRAY_BUFFER, [&]() {
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 0, nullptr);
});
}); });
} }
void draw() const { void draw_direct() {
vao.bound([&]() { vao->bound([&]() {
glDrawArrays(GL_POINTS, 0, ibo.count() * N); ibo->bound(GL_ELEMENT_ARRAY_BUFFER, [&]() {
glDrawElements(mode, ibo->count() * N, GL_UNSIGNED_INT, nullptr);
});
}); });
} }
}; };
@@ -113,6 +101,41 @@ std::vector<Mesh<N>> poly_parts(const tc::Group &group) {
return parts; return parts;
} }
class Shaders {
public:
cgl::pgm::vert defer = cgl::pgm::vert::file(
"shaders/slice/deferred.vs.glsl");
cgl::pgm::vert direct_ortho = cgl::pgm::vert::file(
"shaders/direct-ortho.vs.glsl");
cgl::pgm::vert direct_stereo = cgl::pgm::vert::file(
"shaders/direct-stereo.vs.glsl");
cgl::pgm::geom slice = cgl::pgm::geom::file(
"shaders/slice/slice.gm.glsl");
cgl::pgm::geom curve_stereo = cgl::pgm::geom::file(
"shaders/curve-stereo.gm.glsl");
cgl::pgm::geom curve_ortho = cgl::pgm::geom::file(
"shaders/curve-ortho.gm.glsl");
cgl::pgm::frag solid = cgl::pgm::frag::file(
"shaders/solid.fs.glsl");
cgl::pgm::frag diffuse = cgl::pgm::frag::file(
"shaders/diffuse.fs.glsl");
};
std::vector<glm::vec4> points(const tc::Group &group) {
auto cosets = group.solve();
auto mirrors = mirror(group);
auto corners = plane_intersections(mirrors);
// auto start = barycentric(corners, {1.0f, 1.0f, 1.0f, 1.0f});
auto start = barycentric(corners, {1.00f, 0.2f, 0.1f, 0.05f});
// auto start = barycentric(corners, {0.05f, 0.1f, 0.2f, 1.00f});
return cosets.path.walk<glm::vec4, glm::vec4>(start, mirrors, reflect);
}
void run(GLFWwindow *window) { void run(GLFWwindow *window) {
glEnable(GL_PROGRAM_POINT_SIZE); glEnable(GL_PROGRAM_POINT_SIZE);
glEnable(GL_POINT_SMOOTH); glEnable(GL_POINT_SMOOTH);
@@ -120,49 +143,36 @@ void run(GLFWwindow *window) {
// glEnable(GL_CULL_FACE); // glEnable(GL_CULL_FACE);
glCullFace(GL_BACK); glCullFace(GL_BACK);
auto defer = cgl::pgm::vert::file("shaders/slice/deferred.vs.glsl"); Shaders sh;
auto direct_ortho = cgl::pgm::vert::file("shaders/direct-ortho.vs.glsl");
auto direct_stereo = cgl::pgm::vert::file("shaders/direct-stereo.vs.glsl");
auto slice = cgl::pgm::geom::file("shaders/slice/slice.gm.glsl");
auto curve_stereo = cgl::pgm::geom::file("shaders/curve-stereo.gm.glsl");
auto curve_ortho = cgl::pgm::geom::file("shaders/curve-ortho.gm.glsl");
auto solid = cgl::pgm::frag::file("shaders/solid.fs.glsl");
auto diffuse = cgl::pgm::frag::file("shaders/diffuse.fs.glsl");
auto proj_pipe = cgl::pipeline(); auto proj_pipe = cgl::pipeline();
proj_pipe proj_pipe
.stage(direct_stereo) .stage(sh.direct_stereo)
.stage(solid); .stage(sh.solid);
auto slice_pipe = cgl::pipeline(); auto slice_pipe = cgl::pipeline();
slice_pipe slice_pipe
.stage(defer) .stage(sh.defer)
.stage(slice) .stage(sh.slice)
.stage(diffuse); .stage(sh.diffuse);
//region points
auto group = tc::group::F4(); auto group = tc::group::F4();
auto res = group.solve();
auto mirrors = mirror(group);
auto corners = plane_intersections(mirrors);
// auto start = barycentric(corners, {1.0f, 1.0f, 1.0f, 1.0f});
auto start = barycentric(corners, {1.00f, 0.2f, 0.1f, 0.05f});
// auto start = barycentric(corners, {0.05f, 0.1f, 0.2f, 1.00f});
auto points = res.path.walk<glm::vec4, glm::vec4>(start, mirrors, reflect);
auto g_gens = gens(group);
auto wire_data = merge(poly_parts<2>(group)); auto wire_data = merge(poly_parts<2>(group));
DirectMesh<2> wires(GL_LINES, wire_data); BufferMesh<2, float> wires(
GL_LINES,
std::make_shared<cgl::vertexarray>(),
std::make_shared<cgl::buffer<Primitive<2>>(wire_data.prims()),
std::make_shared<cgl::buffer<float>>()
);
// DirectMesh<2> wires(GL_LINES, wire_data);
const auto slice_dark = glm::vec3(.5, .3, .7); const auto slice_dark = glm::vec3(.5, .3, .7);
const auto slice_light = glm::vec3(.9, .9, .95); const auto slice_light = glm::vec3(.9, .9, .95);
const auto slice_parts = poly_parts<4>(group); const auto slice_parts = poly_parts<4>(group);
auto slice_data = merge(slice_parts); auto slice_data = merge(slice_parts);
auto slice_colors = std::vector<glm::vec4>(slice_data.size()); auto slice_colors = std::vector<glm::vec4>(slice_data.size());
for (int i = 0, k = 0; i < slice_parts.size(); ++i) { for (int i = 0, k = 0; i < slice_parts.size(); ++i) {
auto fac = factor(i, slice_parts.size()); auto fac = factor(i, slice_parts.size());
@@ -173,15 +183,13 @@ void run(GLFWwindow *window) {
} }
} }
cgl::buffer<glm::vec4> slice_colors_buf(slice_colors); cgl::buffer<glm::vec4> slice_colors_buf(slice_colors);
DeferredMesh<4> slices(slice_data, slice_colors_buf);
//endregion // DeferredMesh<4> slices(slice_data, slice_colors_buf);
cgl::buffer<glm::vec4> vbo(points);
cgl::buffer<Matrices> ubo;
auto vbo = cgl::buffer<glm::vec4>(points(group));
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 1, vbo); glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 1, vbo);
auto ubo = cgl::buffer<Matrices>();
glBindBufferBase(GL_UNIFORM_BUFFER, 1, ubo); glBindBufferBase(GL_UNIFORM_BUFFER, 1, ubo);
while (!glfwWindowShouldClose(window)) { while (!glfwWindowShouldClose(window)) {
@@ -197,14 +205,14 @@ void run(GLFWwindow *window) {
glLineWidth(1.5); glLineWidth(1.5);
glProgramUniform3f(solid, 2, 0.3, 0.3, 0.3); glProgramUniform3f(sh.solid, 2, 0.3, 0.3, 0.3);
proj_pipe.bound([&]() { proj_pipe.bound([&]() {
wires.draw(); wires.draw();
}); });
slice_pipe.bound([&]() { // slice_pipe.bound([&]() {
slices.draw(); // slices.draw();
}); // });
glfwSwapInterval(2); glfwSwapInterval(2);
glfwSwapBuffers(window); glfwSwapBuffers(window);