1 #include "nta/InstanceBatch.h"
5 for (
auto& glyph : m_glyphs) {
6 if (!glyph.vbos.empty()) {
7 glDeleteBuffers(glyph.vbos.size(), &glyph.vbos[0]);
9 glDeleteVertexArrays(1, &glyph.vao);
15 m_glyphs.emplace_back(texture);
16 GLuint vbo = m_glyphs.back().gen_vbo();
18 glBindVertexArray(m_glyphs.back().vao);
19 glBindBuffer(GL_ARRAY_BUFFER, vbo);
20 for (
int i = 0; i < NUM_VERTEX_ATTRIBS; i++) {
21 glEnableVertexAttribArray(i);
22 Vertex2D::attribs[i].setup();
25 Glyph temp(posRect, uvRect, texture, NTA_DEFAULT_DEPTH, color, 0);
27 temp.
topLeft, temp.topRight, temp.botLeft,
28 temp.topRight, temp.botLeft, temp.botRight
30 glBufferData(GL_ARRAY_BUFFER, 6*
sizeof(
Vertex2D), vertices, GL_STREAM_DRAW);
34 void* data, GLsizeiptr size, GLuint divisor) {
35 assert(num_attribs > 0);
36 assert(m_glyphs.size() > 0);
37 GLuint vbo = m_glyphs.back().gen_vbo();
38 GLsizei new_count = size/attribs[0].stride;
40 if (m_glyphs.back().count == 1) {
41 m_glyphs.back().count = new_count;
44 assert(m_glyphs.back().count == new_count);
47 glBindVertexArray(m_glyphs.back().vao);
48 glBindBuffer(GL_ARRAY_BUFFER, vbo);
49 for (
int i = 0; i < num_attribs; i++) {
50 glEnableVertexAttribArray(attribs[i].index);
52 glVertexAttribDivisor(attribs[i].index, divisor);
54 glBufferData(GL_ARRAY_BUFFER, size, data, GL_STREAM_DRAW);
57 void InstanceBatch::render()
const {
58 for (
const auto& glyph : m_glyphs) {
59 glBindVertexArray(glyph.vao);
60 glBindTexture(GL_TEXTURE_2D, glyph.tex);
61 glDrawArraysInstanced(GL_TRIANGLES, 0, 6, glyph.count);