summaryrefslogtreecommitdiff
path: root/src/mbgl/renderer/symbol_bucket.cpp
diff options
context:
space:
mode:
authorJohn Firebaugh <john.firebaugh@gmail.com>2016-10-03 11:48:50 -0700
committerJohn Firebaugh <john.firebaugh@gmail.com>2016-10-05 10:52:19 -0700
commit9cf57e7142f0e7b599de0f851cd6178d5a6a4c25 (patch)
tree185fbfaf15cc55a996731060b92bb24c87ad4378 /src/mbgl/renderer/symbol_bucket.cpp
parente4310aa87489c2db52d7ff65f71e51cc6c9700b6 (diff)
downloadqtlocation-mapboxgl-9cf57e7142f0e7b599de0f851cd6178d5a6a4c25.tar.gz
[core] Make ElementGroup safer
Template on shader types, rather than count. This allows the compiler to enforce using the correct VAO for the shader and PaintMode. This fixes OverdrawMode with circle layers. While here, avoid using unique_ptrs for groups. Instead, ensure ElementGroup is movable.
Diffstat (limited to 'src/mbgl/renderer/symbol_bucket.cpp')
-rw-r--r--src/mbgl/renderer/symbol_bucket.cpp32
1 files changed, 15 insertions, 17 deletions
diff --git a/src/mbgl/renderer/symbol_bucket.cpp b/src/mbgl/renderer/symbol_bucket.cpp
index 0c41031c93..ba064e4cc3 100644
--- a/src/mbgl/renderer/symbol_bucket.cpp
+++ b/src/mbgl/renderer/symbol_bucket.cpp
@@ -72,13 +72,12 @@ void SymbolBucket::drawGlyphs(SDFShader& shader,
GLbyte* vertex_index = BUFFER_OFFSET_0;
GLbyte* elements_index = BUFFER_OFFSET_0;
for (auto& group : text.groups) {
- assert(group);
- group->array[paintMode == PaintMode::Overdraw ? 1 : 0].bind(
+ group.getVAO(shader, paintMode).bind(
shader, *text.vertexBuffer, *text.indexBuffer, vertex_index, context);
- MBGL_CHECK_ERROR(glDrawElements(GL_TRIANGLES, group->elements_length * 3, GL_UNSIGNED_SHORT,
+ MBGL_CHECK_ERROR(glDrawElements(GL_TRIANGLES, static_cast<GLsizei>(group.indexLength * 3), GL_UNSIGNED_SHORT,
elements_index));
- vertex_index += group->vertex_length * text.vertexBuffer->vertexSize;
- elements_index += group->elements_length * text.indexBuffer->primitiveSize;
+ vertex_index += group.vertexLength * text.vertexBuffer->vertexSize;
+ elements_index += group.indexLength * text.indexBuffer->primitiveSize;
}
}
@@ -88,13 +87,12 @@ void SymbolBucket::drawIcons(SDFShader& shader,
GLbyte* vertex_index = BUFFER_OFFSET_0;
GLbyte* elements_index = BUFFER_OFFSET_0;
for (auto& group : icon.groups) {
- assert(group);
- group->array[paintMode == PaintMode::Overdraw ? 1 : 0].bind(
+ group.getVAO(shader, paintMode).bind(
shader, *icon.vertexBuffer, *icon.indexBuffer, vertex_index, context);
- MBGL_CHECK_ERROR(glDrawElements(GL_TRIANGLES, group->elements_length * 3, GL_UNSIGNED_SHORT,
+ MBGL_CHECK_ERROR(glDrawElements(GL_TRIANGLES, static_cast<GLsizei>(group.indexLength * 3), GL_UNSIGNED_SHORT,
elements_index));
- vertex_index += group->vertex_length * icon.vertexBuffer->vertexSize;
- elements_index += group->elements_length * icon.indexBuffer->primitiveSize;
+ vertex_index += group.vertexLength * icon.vertexBuffer->vertexSize;
+ elements_index += group.indexLength * icon.indexBuffer->primitiveSize;
}
}
@@ -104,13 +102,12 @@ void SymbolBucket::drawIcons(IconShader& shader,
GLbyte* vertex_index = BUFFER_OFFSET_0;
GLbyte* elements_index = BUFFER_OFFSET_0;
for (auto& group : icon.groups) {
- assert(group);
- group->array[paintMode == PaintMode::Overdraw ? 3 : 2].bind(
+ group.getVAO(shader, paintMode).bind(
shader, *icon.vertexBuffer, *icon.indexBuffer, vertex_index, context);
- MBGL_CHECK_ERROR(glDrawElements(GL_TRIANGLES, group->elements_length * 3, GL_UNSIGNED_SHORT,
+ MBGL_CHECK_ERROR(glDrawElements(GL_TRIANGLES, static_cast<GLsizei>(group.indexLength * 3), GL_UNSIGNED_SHORT,
elements_index));
- vertex_index += group->vertex_length * icon.vertexBuffer->vertexSize;
- elements_index += group->elements_length * icon.indexBuffer->primitiveSize;
+ vertex_index += group.vertexLength * icon.vertexBuffer->vertexSize;
+ elements_index += group.indexLength * icon.indexBuffer->primitiveSize;
}
}
@@ -118,8 +115,9 @@ void SymbolBucket::drawCollisionBoxes(CollisionBoxShader& shader,
gl::Context& context) {
GLbyte* vertex_index = BUFFER_OFFSET_0;
for (auto& group : collisionBox.groups) {
- group->array[0].bind(shader, *collisionBox.vertexBuffer, vertex_index, context);
- MBGL_CHECK_ERROR(glDrawArrays(GL_LINES, 0, group->vertex_length));
+ group.getVAO(shader, PaintMode::Regular).bind(
+ shader, *collisionBox.vertexBuffer, vertex_index, context);
+ MBGL_CHECK_ERROR(glDrawArrays(GL_LINES, 0, static_cast<GLsizei>(group.vertexLength)));
}
}