diff options
Diffstat (limited to 'src/mbgl/renderer')
-rw-r--r-- | src/mbgl/renderer/painter.cpp | 19 | ||||
-rw-r--r-- | src/mbgl/renderer/painter_fill.cpp | 24 | ||||
-rw-r--r-- | src/mbgl/renderer/painter_line.cpp | 19 | ||||
-rw-r--r-- | src/mbgl/renderer/symbol_bucket.cpp | 8 |
4 files changed, 37 insertions, 33 deletions
diff --git a/src/mbgl/renderer/painter.cpp b/src/mbgl/renderer/painter.cpp index 70d2c75c0d..49b4526f58 100644 --- a/src/mbgl/renderer/painter.cpp +++ b/src/mbgl/renderer/painter.cpp @@ -276,19 +276,20 @@ void Painter::renderBackground(const BackgroundLayer& layer) { const BackgroundPaintProperties& properties = layer.paint; if (!properties.pattern.value.to.empty()) { - if ((properties.opacity >= 1.0f) != (pass == RenderPass::Opaque)) + mapbox::util::optional<SpriteAtlasPosition> imagePosA = spriteAtlas->getPosition(properties.pattern.value.from, true); + mapbox::util::optional<SpriteAtlasPosition> imagePosB = spriteAtlas->getPosition(properties.pattern.value.to, true); + + if ((properties.opacity >= 1.0f) != (pass == RenderPass::Opaque) || !imagePosA || !imagePosB) return; - SpriteAtlasPosition imagePosA = spriteAtlas->getPosition(properties.pattern.value.from, true); - SpriteAtlasPosition imagePosB = spriteAtlas->getPosition(properties.pattern.value.to, true); float zoomFraction = state.getZoomFraction(); config.program = patternShader->program; patternShader->u_matrix = identityMatrix; - patternShader->u_pattern_tl_a = imagePosA.tl; - patternShader->u_pattern_br_a = imagePosA.br; - patternShader->u_pattern_tl_b = imagePosB.tl; - patternShader->u_pattern_br_b = imagePosB.br; + patternShader->u_pattern_tl_a = (*imagePosA).tl; + patternShader->u_pattern_br_a = (*imagePosA).br; + patternShader->u_pattern_tl_b = (*imagePosB).tl; + patternShader->u_pattern_br_b = (*imagePosB).br; patternShader->u_mix = properties.pattern.value.t; patternShader->u_opacity = properties.opacity; @@ -296,7 +297,7 @@ void Painter::renderBackground(const BackgroundLayer& layer) { PrecisionPoint center = state.latLngToPoint(latLng); float scale = 1 / std::pow(2, zoomFraction); - std::array<float, 2> sizeA = imagePosA.size; + std::array<float, 2> sizeA = (*imagePosA).size; mat3 matrixA; matrix::identity(matrixA); matrix::scale(matrixA, matrixA, @@ -310,7 +311,7 @@ void Painter::renderBackground(const BackgroundLayer& layer) { scale * state.getWidth() / 2, -scale * state.getHeight() / 2); - std::array<float, 2> sizeB = imagePosB.size; + std::array<float, 2> sizeB = (*imagePosB).size; mat3 matrixB; matrix::identity(matrixB); matrix::scale(matrixB, matrixB, diff --git a/src/mbgl/renderer/painter_fill.cpp b/src/mbgl/renderer/painter_fill.cpp index 4bee5b6d1e..beebdfcf83 100644 --- a/src/mbgl/renderer/painter_fill.cpp +++ b/src/mbgl/renderer/painter_fill.cpp @@ -59,30 +59,30 @@ void Painter::renderFill(FillBucket& bucket, const FillLayer& layer, const TileI } if (pattern) { - // Image fill. - if (pass == RenderPass::Translucent) { + mapbox::util::optional<SpriteAtlasPosition> posA = spriteAtlas->getPosition(properties.pattern.value.from, true); + mapbox::util::optional<SpriteAtlasPosition> posB = spriteAtlas->getPosition(properties.pattern.value.to, true); - const SpriteAtlasPosition posA = spriteAtlas->getPosition(properties.pattern.value.from, true); - const SpriteAtlasPosition posB = spriteAtlas->getPosition(properties.pattern.value.to, true); + // Image fill. + if (pass == RenderPass::Translucent && posA && posB) { float factor = 8.0 / std::pow(2, state.getIntegerZoom() - id.z) / id.overscaling; mat3 patternMatrixA; matrix::identity(patternMatrixA); matrix::scale(patternMatrixA, patternMatrixA, - 1.0f / (posA.size[0] * factor * properties.pattern.value.fromScale), - 1.0f / (posA.size[1] * factor * properties.pattern.value.fromScale)); + 1.0f / ((*posA).size[0] * factor * properties.pattern.value.fromScale), + 1.0f / ((*posA).size[1] * factor * properties.pattern.value.fromScale)); mat3 patternMatrixB; matrix::identity(patternMatrixB); matrix::scale(patternMatrixB, patternMatrixB, - 1.0f / (posB.size[0] * factor * properties.pattern.value.toScale), - 1.0f / (posB.size[1] * factor * properties.pattern.value.toScale)); + 1.0f / ((*posB).size[0] * factor * properties.pattern.value.toScale), + 1.0f / ((*posB).size[1] * factor * properties.pattern.value.toScale)); config.program = patternShader->program; patternShader->u_matrix = vtxMatrix; - patternShader->u_pattern_tl_a = posA.tl; - patternShader->u_pattern_br_a = posA.br; - patternShader->u_pattern_tl_b = posB.tl; - patternShader->u_pattern_br_b = posB.br; + patternShader->u_pattern_tl_a = (*posA).tl; + patternShader->u_pattern_br_a = (*posA).br; + patternShader->u_pattern_tl_b = (*posB).tl; + patternShader->u_pattern_br_b = (*posB).br; patternShader->u_opacity = properties.opacity; patternShader->u_image = 0; patternShader->u_mix = properties.pattern.value.t; diff --git a/src/mbgl/renderer/painter_line.cpp b/src/mbgl/renderer/painter_line.cpp index e33864622e..30f03ff030 100644 --- a/src/mbgl/renderer/painter_line.cpp +++ b/src/mbgl/renderer/painter_line.cpp @@ -102,8 +102,11 @@ void Painter::renderLine(LineBucket& bucket, const LineLayer& layer, const TileI bucket.drawLineSDF(*linesdfShader); } else if (!properties.pattern.value.from.empty()) { - SpriteAtlasPosition imagePosA = spriteAtlas->getPosition(properties.pattern.value.from, true); - SpriteAtlasPosition imagePosB = spriteAtlas->getPosition(properties.pattern.value.to, true); + mapbox::util::optional<SpriteAtlasPosition> imagePosA = spriteAtlas->getPosition(properties.pattern.value.from, true); + mapbox::util::optional<SpriteAtlasPosition> imagePosB = spriteAtlas->getPosition(properties.pattern.value.to, true); + + if (!imagePosA || !imagePosB) + return; float factor = 8.0 / std::pow(2, state.getIntegerZoom() - id.z) * id.overscaling; @@ -115,12 +118,12 @@ void Painter::renderLine(LineBucket& bucket, const LineLayer& layer, const TileI linepatternShader->u_ratio = ratio; linepatternShader->u_blur = blur; - linepatternShader->u_pattern_size_a = {{imagePosA.size[0] * factor * properties.pattern.value.fromScale, imagePosA.size[1]}}; - linepatternShader->u_pattern_tl_a = imagePosA.tl; - linepatternShader->u_pattern_br_a = imagePosA.br; - linepatternShader->u_pattern_size_b = {{imagePosB.size[0] * factor * properties.pattern.value.toScale, imagePosB.size[1]}}; - linepatternShader->u_pattern_tl_b = imagePosB.tl; - linepatternShader->u_pattern_br_b = imagePosB.br; + linepatternShader->u_pattern_size_a = {{(*imagePosA).size[0] * factor * properties.pattern.value.fromScale, (*imagePosA).size[1]}}; + linepatternShader->u_pattern_tl_a = (*imagePosA).tl; + linepatternShader->u_pattern_br_a = (*imagePosA).br; + linepatternShader->u_pattern_size_b = {{(*imagePosB).size[0] * factor * properties.pattern.value.toScale, (*imagePosB).size[1]}}; + linepatternShader->u_pattern_tl_b = (*imagePosB).tl; + linepatternShader->u_pattern_br_b = (*imagePosB).br; linepatternShader->u_fade = properties.pattern.value.t; linepatternShader->u_opacity = properties.opacity; linepatternShader->u_extra = extra; diff --git a/src/mbgl/renderer/symbol_bucket.cpp b/src/mbgl/renderer/symbol_bucket.cpp index 1f2ad96bf2..f5737d7430 100644 --- a/src/mbgl/renderer/symbol_bucket.cpp +++ b/src/mbgl/renderer/symbol_bucket.cpp @@ -247,10 +247,10 @@ void SymbolBucket::addFeatures(uintptr_t tileUID, // if feature has icon, get sprite atlas position if (feature.sprite.length()) { auto image = spriteAtlas.getImage(feature.sprite, false); - if (image.pos.hasArea() && image.texture) { - shapedIcon = shapeIcon(image.pos, layout); - assert(image.texture); - if (image.texture->sdf) { + if (image) { + shapedIcon = shapeIcon((*image).pos, layout); + assert((*image).texture); + if ((*image).texture->sdf) { sdfIcons = true; } } |