/
RenderableCharacterBatch.cpp
91 lines (67 loc) · 2.17 KB
/
RenderableCharacterBatch.cpp
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#include "RenderableCharacterBatch.h"
#include "render.h"
#include "debugging/gl.h"
#define BUFFER_OFFSET(i) ((char *)NULL + (i))
namespace gui
{
RenderableCharacterBatch::RenderableCharacterBatch()
{
#ifdef RENDERABLE_CHARACTER_BATCH_USE_VBO
// Allocate a vertex buffer object
glGenBuffersARB(1, &_vboData);
debug::assertNoGlErrors();
#endif
}
RenderableCharacterBatch::~RenderableCharacterBatch()
{
#ifdef RENDERABLE_CHARACTER_BATCH_USE_VBO
glDeleteBuffersARB(1, &_vboData);
#endif
}
void RenderableCharacterBatch::addGlyph(const TextChar& ch)
{
_verts.push_back(ch.coords[0]);
_verts.push_back(ch.coords[1]);
_verts.push_back(ch.coords[2]);
_verts.push_back(ch.coords[3]);
}
void RenderableCharacterBatch::compile()
{
#ifdef RENDERABLE_CHARACTER_BATCH_USE_VBO
// Space needed for geometry
std::size_t dataSize = sizeof(Vertex2D) * _verts.size();
// Initialise the vertex buffer
glBindBuffer(GL_ARRAY_BUFFER, _vboData);
// Allocate space for vertices
glBufferData(GL_ARRAY_BUFFER, dataSize, NULL, GL_STATIC_DRAW);
debug::assertNoGlErrors();
// Upload the data
glBufferSubData(GL_ARRAY_BUFFER, 0, dataSize, &_verts.front());
debug::assertNoGlErrors();
glBindBuffer(GL_ARRAY_BUFFER, 0);
debug::assertNoGlErrors();
#endif
}
void RenderableCharacterBatch::render() const
{
#ifdef RENDERABLE_CHARACTER_BATCH_USE_VBO
// Bind the VBO buffer and submit the draw call
glBindBuffer(GL_ARRAY_BUFFER, _vboData);
glClientActiveTexture(GL_TEXTURE0);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(2, GL_DOUBLE, sizeof(Vertex2D), BUFFER_OFFSET(sizeof(double)*2));
glVertexPointer(2, GL_DOUBLE, sizeof(Vertex2D), BUFFER_OFFSET(0));
glDrawArrays(GL_QUADS, 0, static_cast<GLsizei>(_verts.size()));
debug::assertNoGlErrors();
glBindBuffer(GL_ARRAY_BUFFER, 0);
#else
// Regular array draw call
glVertexPointer(2, GL_DOUBLE, sizeof(Vertex2D), &(_verts.front().vertex));
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(2, GL_DOUBLE, sizeof(Vertex2D), &(_verts.front().texcoord));
glDrawArrays(GL_QUADS, 0, static_cast<GLsizei>(_verts.size()));
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
debug::assertNoGlErrors();
#endif
}
} // namespace