2026-10-25 23:27:19 +01:00

135 lines
2.7 KiB
C++

#include <deerith/client/graphics/mesh.h>
#include <glad/gl.h>
deerith::mesh_2d_t::mesh_2d_t(
const glm::vec2 *vertices,
std::size_t vertex_count,
const unsigned int *indices,
std::size_t index_count)
: index_count(index_count)
{
glGenVertexArrays(1, &vao);
glGenBuffers(1, &vbo);
glGenBuffers(1, &ebo);
glBindVertexArray(vao);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(
GL_ARRAY_BUFFER,
vertex_count * sizeof(glm::vec2),
vertices,
GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);
glBufferData(
GL_ELEMENT_ARRAY_BUFFER,
index_count * sizeof(unsigned int),
indices,
GL_STATIC_DRAW);
// Position: vec2
glVertexAttribPointer(
0,
2,
GL_FLOAT,
GL_FALSE,
2 * sizeof(float),
nullptr);
glEnableVertexAttribArray(0);
glBindVertexArray(0);
}
deerith::mesh_2d_t::~mesh_2d_t()
{
glDeleteVertexArrays(1, &vao);
glDeleteBuffers(1, &vbo);
glDeleteBuffers(1, &ebo);
}
void deerith::mesh_2d_t::bind() const
{
glBindVertexArray(vao);
}
void deerith::mesh_2d_t::draw() const
{
glBindVertexArray(vao);
glDrawElements(
GL_TRIANGLES,
static_cast<GLsizei>(index_count),
GL_UNSIGNED_INT,
nullptr);
}
deerith::mesh_3d_t::mesh_3d_t(
const glm::vec3 *vertices,
std::size_t _vertex_count,
const unsigned int *indices,
std::size_t _index_count)
: index_count(_index_count), vertex_count(_vertex_count)
{
glGenVertexArrays(1, &vao);
glGenBuffers(1, &vbo);
glGenBuffers(1, &ebo);
glBindVertexArray(vao);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(
GL_ARRAY_BUFFER,
vertex_count * sizeof(glm::vec3),
vertices,
GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);
glBufferData(
GL_ELEMENT_ARRAY_BUFFER,
index_count * sizeof(unsigned int),
indices,
GL_STATIC_DRAW);
// Position: vec2
glVertexAttribPointer(
0,
3,
GL_FLOAT,
GL_FALSE,
3 * sizeof(float),
nullptr);
glEnableVertexAttribArray(0);
glBindVertexArray(0);
}
deerith::mesh_3d_t::~mesh_3d_t()
{
glDeleteVertexArrays(1, &vao);
glDeleteBuffers(1, &vbo);
glDeleteBuffers(1, &ebo);
}
void deerith::mesh_3d_t::bind() const
{
glBindVertexArray(vao);
}
void deerith::mesh_3d_t::draw() const
{
glBindVertexArray(vao);
glDrawElements(
GL_TRIANGLES,
static_cast<GLsizei>(index_count),
GL_UNSIGNED_INT,
nullptr);
}
void deerith::mesh_3d_t::draw_lines() const
{
glBindVertexArray(vao);
glDrawArrays(GL_LINES, 0, vertex_count);
}