summaryrefslogtreecommitdiff
path: root/src/geometry/fill_buffer.cpp
blob: 4894361c36a2c0b12f7569cb04a1f4344c38bef2 (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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include <llmr/geometry/fill_buffer.hpp>
#include <llmr/platform/gl.hpp>
// #include <cmath>

using namespace llmr;

FillBuffer::FillBuffer()
    : vertex_buffer(0),
      element_buffer(0),
      dirty(true) {

}

FillBuffer::~FillBuffer() {
    if (vertex_buffer != 0) {
        glDeleteBuffers(1, &vertex_buffer);
        vertex_buffer = 0;
    }
    if (element_buffer != 0) {
        glDeleteBuffers(1, &element_buffer);
        element_buffer = 0;
    }
}

uint32_t FillBuffer::vertex_length() const {
    // We store 2 coordinates per vertex
    return vertices.size() / 2;
}

uint32_t FillBuffer::elements_length() const {
    // A triangle has 3 indices
    return elements.size() / 3;
}

void FillBuffer::addDegenerate() {
    vertices.push_back(32767);
    vertices.push_back(0);
}

void FillBuffer::addCoordinate(int16_t x, int16_t y) {
    vertices.push_back(x);
    vertices.push_back(y);
}

void FillBuffer::addElements(uint16_t a, uint16_t b, uint16_t c) {
    elements.push_back(a);
    elements.push_back(b);
    elements.push_back(c);
}

void FillBuffer::bind() {
    if (vertex_buffer == 0) {
        glGenBuffers(1, &vertex_buffer);
        glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);
    } else {
        glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);
    }

    if (element_buffer == 0) {
        glGenBuffers(1, &element_buffer);
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, element_buffer);
    } else {
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, element_buffer);
    }

    if (dirty) {
        glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(uint16_t), vertices.data(), GL_STATIC_DRAW);
        glBufferData(GL_ELEMENT_ARRAY_BUFFER, elements.size() * sizeof(uint16_t), elements.data(), GL_STATIC_DRAW);
        dirty = false;
    }
}