#include "client/rendering/Mesh.h"

Mesh::Mesh() : vba(0), vbo(0)
{
    glGenVertexArrays(1, &vba);
    glBindVertexArray(vba);
    
    glGenBuffers(1, &vbo);
    glBindBuffer(GL_ARRAY_BUFFER, vbo);

    glVertexAttribPointer(0, 3, GL_FLOAT, false, sizeof(VertexData), static_cast<GLfloat*>(0));
    glEnableVertexAttribArray(0);

    glVertexAttribPointer(1, 2, GL_FLOAT, false, sizeof(VertexData), static_cast<GLfloat*>(0) + 3);
    glEnableVertexAttribArray(1);  
    
    glVertexAttribPointer(2, 3, GL_FLOAT, false, sizeof(VertexData), static_cast<GLfloat*>(0) + 5);
    glEnableVertexAttribArray(2);
}

Mesh::~Mesh()
{
    glDeleteVertexArrays(1, &vba);
    glDeleteBuffers(1, &vbo);
}

void Mesh::add(const VertexData& data)
{
    buffer.push_back(data);
}

void Mesh::clear()
{
    buffer.clear();
}

void Mesh::build() const
{
    glBindBuffer(GL_ARRAY_BUFFER, vbo);
    glBufferData(GL_ARRAY_BUFFER, sizeof(VertexData) * buffer.size(), buffer.data(), GL_STATIC_DRAW);
}

void Mesh::draw() const
{
    glBindVertexArray(vba);
    glDrawArrays(GL_TRIANGLES, 0, buffer.size());
}