aboutsummaryrefslogtreecommitdiff
path: root/src/renderer/opengl/GlVertexBuffer.cpp
blob: f716c50a6ab0790d267e903b76d9dfe609b6353a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <renderer/opengl/GlVertexBuffer.hpp>

#include <GL/glew.h>
#include <string.h>

#include <stdio.h>

void GlVertexBuffer::Init() {
    m_Vertices.reserve(16384);
    glGenBuffers(1, &m_Id);
    glBindBuffer(GL_ARRAY_BUFFER, m_Id);
}

void GlVertexBuffer::Reset() {
    glDisableVertexAttribArray(0);
    glDisableVertexAttribArray(1);
    m_Vertices.clear();
}

float *GlVertexBuffer::GetData() {
    return reinterpret_cast<float*>(m_Vertices.data());
}

uint32_t GlVertexBuffer::GetCount() {
    return static_cast<uint32_t>(m_Vertices.size());
}

void GlVertexBuffer::PushRectangle(V3F32 pos, V2F32 dim, V3F32 color) {
    V3F32 positions[4] = {
        V3F32(pos.x,         pos.y,         pos.z),
        V3F32(pos.x + dim.x, pos.y,         pos.z),
        V3F32(pos.x + dim.x, pos.y + dim.y, pos.z),
        V3F32(pos.x,         pos.y + dim.y, pos.z),
    };

    for (int i = 0; i < 4; i++) {
        GlVertex vertex = {};
        vertex.pos = positions[i];
        vertex.color = color;
        m_Vertices.push_back(vertex);
    }
}

void GlVertexBuffer::TransferData() {
    size_t size = m_Vertices.size() * sizeof(GlVertex);
    GLsizei stride = sizeof(GlVertex);
    const void *offset_color = (const void*)(3*sizeof(float));
    glEnableVertexAttribArray(0);
    glEnableVertexAttribArray(1);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, stride, 0);
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, stride, offset_color);
    glBufferData(GL_ARRAY_BUFFER, size, m_Vertices.data(), GL_STATIC_DRAW);
}