correctly generate and render edges
This commit is contained in:
@@ -13,11 +13,14 @@ using namespace std;
|
||||
|
||||
class CosetsWindow : public Window {
|
||||
GLint program;
|
||||
GLuint tri;
|
||||
GLuint points_vao, edges_vao;
|
||||
|
||||
GLuint verts;
|
||||
GLuint verts_buf;
|
||||
std::vector<glm::vec4> verts_data;
|
||||
|
||||
GLuint edges_buf;
|
||||
std::vector<int> edge_data;
|
||||
|
||||
public:
|
||||
void init() override {
|
||||
auto vs = build_shader_file(
|
||||
@@ -32,21 +35,34 @@ public:
|
||||
|
||||
program = build_program("main", vs, fs);
|
||||
|
||||
verts_data = vertices<3>(
|
||||
schlafli<3>({5, 3}),
|
||||
{10, 1, 1});
|
||||
const Mults &mults = schlafli<4>({3, 4, 3});
|
||||
verts_data = vertices<4>(mults, {10, 1, 1, 1});
|
||||
edge_data = edges<4>(mults);
|
||||
|
||||
glGenBuffers(1, &verts);
|
||||
glBindBuffer(GL_ARRAY_BUFFER, verts);
|
||||
glGenBuffers(1, &verts_buf);
|
||||
glBindBuffer(GL_ARRAY_BUFFER, verts_buf);
|
||||
glBufferData(GL_ARRAY_BUFFER, sizeof(glm::vec4) * verts_data.size(), &verts_data[0], GL_STATIC_DRAW);
|
||||
|
||||
glGenBuffers(1, &edges_buf);
|
||||
glBindBuffer(GL_ARRAY_BUFFER, edges_buf);
|
||||
glBufferData(GL_ARRAY_BUFFER, sizeof(int) * edge_data.size(), &edge_data[0], GL_STATIC_DRAW);
|
||||
|
||||
glGenVertexArrays(1, &tri);
|
||||
glBindVertexArray(tri);
|
||||
glBindBuffer(GL_ARRAY_BUFFER, verts);
|
||||
glGenVertexArrays(1, &points_vao);
|
||||
glBindVertexArray(points_vao);
|
||||
glBindBuffer(GL_ARRAY_BUFFER, verts_buf);
|
||||
glEnableVertexAttribArray(0);
|
||||
glVertexAttribPointer(0, 4, GL_FLOAT, false, 0, nullptr);
|
||||
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||||
|
||||
glGenVertexArrays(1, &edges_vao);
|
||||
glBindVertexArray(edges_vao);
|
||||
glBindBuffer(GL_ARRAY_BUFFER, verts_buf);
|
||||
glEnableVertexAttribArray(0);
|
||||
glVertexAttribPointer(0, 4, GL_FLOAT, false, 0, nullptr);
|
||||
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, edges_buf);
|
||||
|
||||
glBindVertexArray(0);
|
||||
}
|
||||
|
||||
void render() override {
|
||||
@@ -66,26 +82,30 @@ public:
|
||||
|
||||
const glm::mat4 proj = glm::ortho(-ar * sc, ar * sc, -sc, sc, -10.f, 10.f);
|
||||
const glm::mat4 view = glm::rotate(id, angle, ax_1) * glm::rotate(id, angle, ax_2);
|
||||
const glm::mat4 mat = proj * view;
|
||||
|
||||
glUseProgram(program);
|
||||
glUniformMatrix4fv(1, 1, false, glm::value_ptr(mat));
|
||||
glUniformMatrix4fv(1, 1, false, glm::value_ptr(proj));
|
||||
glUniformMatrix4fv(2, 1, false, glm::value_ptr(view));
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
glEnable(GL_POINT_SMOOTH);
|
||||
glEnable(GL_BLEND);
|
||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||
glPointSize(10.f);
|
||||
|
||||
glBindVertexArray(tri);
|
||||
glBindVertexArray(points_vao);
|
||||
glUniform4f(0, 1, 1, 1, 1);
|
||||
glDrawArrays(GL_POINTS, 0, verts_data.size());
|
||||
|
||||
glBindVertexArray(edges_vao);
|
||||
glUniform4f(0, 1, 1, 0, 1);
|
||||
glDrawElements(GL_LINES, edge_data.size(), GL_UNSIGNED_INT, 0);
|
||||
|
||||
swapbuffers();
|
||||
}
|
||||
|
||||
void deinit() override {
|
||||
glDeleteProgram(program);
|
||||
glDeleteVertexArrays(1, &tri);
|
||||
glDeleteVertexArrays(1, &points_vao);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user