51 lines
1.2 KiB
C++

#include "Mesh.h"
#include <GL/glew.h>
Mesh::Mesh(const float* buffer, size_t vertices, const int* attrs) : vertices(vertices){
vertexSize = 0;
for (int i = 0; attrs[i]; i++){
vertexSize += attrs[i];
}
glGenVertexArrays(1, &vao);
glGenBuffers(1, &vbo);
glBindVertexArray(vao);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
if (buffer){
glBufferData(GL_ARRAY_BUFFER, sizeof(float) * vertexSize * vertices, buffer, GL_STATIC_DRAW);
} else {
glBufferData(GL_ARRAY_BUFFER, 0, {}, GL_STATIC_DRAW);
}
// attributes
int offset = 0;
for (int i = 0; attrs[i]; i++){
int size = attrs[i];
glVertexAttribPointer(i, size, GL_FLOAT, GL_FALSE, vertexSize * sizeof(float), (GLvoid*)(offset * sizeof(float)));
glEnableVertexAttribArray(i);
offset += size;
}
glBindVertexArray(0);
}
Mesh::~Mesh(){
glDeleteVertexArrays(1, &vao);
glDeleteBuffers(1, &vbo);
}
void Mesh::reload(const float* buffer, size_t vertices){
glBindVertexArray(vao);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(float) * vertexSize * vertices, buffer, GL_STATIC_DRAW);
this->vertices = vertices;
}
void Mesh::draw() const{
glBindVertexArray(vao);
glDrawArrays(GL_TRIANGLES, 0, vertices);
glBindVertexArray(0);
}