jubilant-funicular
InstanceBatch.cpp
1 #include "nta/InstanceBatch.h"
2 
3 namespace nta {
5  for (auto& glyph : m_glyphs) {
6  if (!glyph.vbos.empty()) {
7  glDeleteBuffers(glyph.vbos.size(), &glyph.vbos[0]);
8  }
9  glDeleteVertexArrays(1, &glyph.vao);
10  }
11  m_glyphs.clear();
12  }
13  void InstanceBatch::add_glyph(crvec4 posRect, GLuint texture, crvec4 uvRect,
14  crvec4 color) {
15  m_glyphs.emplace_back(texture);
16  GLuint vbo = m_glyphs.back().gen_vbo();
17 
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();
23  }
24 
25  Glyph temp(posRect, uvRect, texture, NTA_DEFAULT_DEPTH, color, 0);
26  Vertex2D vertices[6] = {
27  temp.topLeft, temp.topRight, temp.botLeft,
28  temp.topRight, temp.botLeft, temp.botRight
29  };
30  glBufferData(GL_ARRAY_BUFFER, 6*sizeof(Vertex2D), vertices, GL_STREAM_DRAW);
31  glBindVertexArray(0);
32  }
33  void InstanceBatch::add_instance_data(const VertexAttrib* attribs, std::size_t num_attribs,
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;
39 
40  if (m_glyphs.back().count == 1) {
41  m_glyphs.back().count = new_count;
42  } else {
44  assert(m_glyphs.back().count == new_count);
45  }
46 
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);
51  attribs[i].setup();
52  glVertexAttribDivisor(attribs[i].index, divisor);
53  }
54  glBufferData(GL_ARRAY_BUFFER, size, data, GL_STREAM_DRAW);
55  glBindVertexArray(0);
56  }
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);
62  glBindVertexArray(0);
63  }
64  }
65 }
nta::InstanceBatch::add_instance_data
void add_instance_data(const VertexAttrib *attribs, std::size_t num_attribs, void *data, GLsizeiptr size, GLuint divisor=1)
Definition: InstanceBatch.cpp:33
nta::InstanceBatch::begin
void begin()
Clears out data from the previous frame.
Definition: InstanceBatch.cpp:4
nta::VertexAttrib
represents an attribute of a vertex (e.g. a call to glVertexAttribPointer)
Definition: Vertex.h:13
nta
Definition: Animation2D.h:6
nta::InstanceBatch::add_glyph
void add_glyph(crvec4 posRect, GLuint texture=0, crvec4 uvRect=glm::vec4(0, 0, 1, 1), crvec4 color=glm::vec4(1))
Definition: InstanceBatch.cpp:13
nta::Glyph
represents what is essentially a sprite
Definition: SpriteBatch.h:13
nta::Glyph::topLeft
Vertex2D topLeft
the vertices of the four corners of the glyph
Definition: SpriteBatch.h:62
nta::Vertex2D
represents a vertex in 2 dimensions
Definition: Vertex.h:26