diff --git a/include/mbgl/gfx/drawable_builder.hpp b/include/mbgl/gfx/drawable_builder.hpp index 7f1dee837..3047274b4 100644 --- a/include/mbgl/gfx/drawable_builder.hpp +++ b/include/mbgl/gfx/drawable_builder.hpp @@ -136,6 +136,7 @@ public: std::size_t vertexLength); void setSegments(gfx::DrawMode, std::vector indexes, const std::vector&); + void setSegments(gfx::DrawMode, std::vector indexes, const SegmentBase*, std::size_t segmentCount); /// Add lines based on existing vertices void addLines(const std::vector& indexes, diff --git a/src/mbgl/gfx/drawable_builder.cpp b/src/mbgl/gfx/drawable_builder.cpp index c27bb080d..a7a134bbe 100644 --- a/src/mbgl/gfx/drawable_builder.cpp +++ b/src/mbgl/gfx/drawable_builder.cpp @@ -181,8 +181,16 @@ std::size_t DrawableBuilder::addVertices(const std::vector indexes, const std::vector& segments) { + setSegments(mode, indexes, segments.data(), segments.size()); +} + +void DrawableBuilder::setSegments(gfx::DrawMode mode, + std::vector indexes, + const SegmentBase* segments, + std::size_t segmentCount) { impl->indexes = std::move(indexes); - for (const auto& seg : segments) { + for (std::size_t i = 0; i < segmentCount; ++i) { + const auto& seg = segments[i]; #if !defined(NDEBUG) if (mode.type == DrawModeType::Triangles) { assert(seg.indexLength % 3 == 0); @@ -191,8 +199,8 @@ void DrawableBuilder::setSegments(gfx::DrawMode mode, } assert(seg.vertexOffset + seg.vertexLength <= impl->vertices.elements()); assert(seg.indexOffset + seg.indexLength <= impl->indexes.size()); - for (decltype(seg.indexLength) i = 0; i < seg.indexLength; ++i) { - assert(impl->indexes[seg.indexOffset + i] < impl->vertices.elements()); + for (decltype(seg.indexLength) j = 0; j < seg.indexLength; ++j) { + assert(impl->indexes[seg.indexOffset + j] < impl->vertices.elements()); } #endif diff --git a/src/mbgl/renderer/layers/render_circle_layer.cpp b/src/mbgl/renderer/layers/render_circle_layer.cpp index b26e49662..58b681b86 100644 --- a/src/mbgl/renderer/layers/render_circle_layer.cpp +++ b/src/mbgl/renderer/layers/render_circle_layer.cpp @@ -410,7 +410,8 @@ void RenderCircleLayer::update(gfx::ShaderRegistry& shaders, circleBuilder->setSegments(gfx::Triangles(), bucket.triangles.vector(), - reinterpret_cast&>(bucket.segments)); + bucket.segments.data(), + bucket.segments.size()); circleBuilder->flush(); diff --git a/src/mbgl/renderer/layers/render_fill_layer.cpp b/src/mbgl/renderer/layers/render_fill_layer.cpp index a2f40aba7..b6c69b2bb 100644 --- a/src/mbgl/renderer/layers/render_fill_layer.cpp +++ b/src/mbgl/renderer/layers/render_fill_layer.cpp @@ -493,7 +493,8 @@ void RenderFillLayer::update(gfx::ShaderRegistry& shaders, fillBuilder->addVertices(rawVerts, 0, rawVerts.size()); fillBuilder->setSegments(gfx::Triangles(), bucket.triangles.vector(), - reinterpret_cast&>(bucket.triangleSegments)); + bucket.triangleSegments.data(), + bucket.triangleSegments.size()); finish(*fillBuilder, tileID, interpolateUBO, tileProps); } if (outlineBuilder) { @@ -503,7 +504,8 @@ void RenderFillLayer::update(gfx::ShaderRegistry& shaders, outlineBuilder->addVertices(rawVerts, 0, rawVerts.size()); outlineBuilder->setSegments(gfx::Lines(2), bucket.lines.vector(), - reinterpret_cast&>(bucket.lineSegments)); + bucket.lineSegments.data(), + bucket.lineSegments.size()); finish(*outlineBuilder, tileID, interpolateUBO, tileProps); } } else { // FillPattern is defined @@ -549,7 +551,8 @@ void RenderFillLayer::update(gfx::ShaderRegistry& shaders, patternBuilder->addVertices(rawVerts, 0, rawVerts.size()); patternBuilder->setSegments(gfx::Triangles(), bucket.triangles.vector(), - reinterpret_cast&>(bucket.triangleSegments)); + bucket.triangleSegments.data(), + bucket.triangleSegments.size()); if (const auto& atlases = tile.getAtlasTextures()) { if (const auto samplerLocation = fillShader->getSamplerLocation("u_image")) { @@ -568,7 +571,8 @@ void RenderFillLayer::update(gfx::ShaderRegistry& shaders, outlinePatternBuilder->setSegments( gfx::Lines(2), bucket.lines.vector(), - reinterpret_cast&>(bucket.lineSegments)); + bucket.lineSegments.data(), + bucket.lineSegments.size()); if (const auto& atlases = tile.getAtlasTextures()) { if (const auto samplerLocation = outlineShader->getSamplerLocation("u_image")) { diff --git a/src/mbgl/renderer/layers/render_raster_layer.cpp b/src/mbgl/renderer/layers/render_raster_layer.cpp index 0c0303648..30b4ad3d7 100644 --- a/src/mbgl/renderer/layers/render_raster_layer.cpp +++ b/src/mbgl/renderer/layers/render_raster_layer.cpp @@ -370,7 +370,8 @@ void RenderRasterLayer::update(gfx::ShaderRegistry& shaders, builder->setSegments(gfx::Triangles(), bucket.indices.vector(), - reinterpret_cast&>(bucket.segments)); + bucket.segments.data(), + bucket.segments.size()); // attributes {