diff options
Diffstat (limited to 'src/mbgl/renderer/painter_fill.cpp')
-rw-r--r-- | src/mbgl/renderer/painter_fill.cpp | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/src/mbgl/renderer/painter_fill.cpp b/src/mbgl/renderer/painter_fill.cpp index 9976d9f6f0..38aa92fb0e 100644 --- a/src/mbgl/renderer/painter_fill.cpp +++ b/src/mbgl/renderer/painter_fill.cpp @@ -65,7 +65,7 @@ void Painter::renderFill(FillBucket& bucket, const FillLayer& layer, const TileI // Image fill. if (pass == RenderPass::Translucent && posA && posB) { - float factor = 8.0 / std::pow(2, state.getIntegerZoom() - id.z) / id.overscaling; + float factor = (8.0 / std::pow(2, state.getIntegerZoom() - id.z)) / id.overscaling; mat3 patternMatrixA; matrix::identity(patternMatrixA); @@ -90,6 +90,26 @@ void Painter::renderFill(FillBucket& bucket, const FillLayer& layer, const TileI patternShader->u_patternmatrix_a = patternMatrixA; patternShader->u_patternmatrix_b = patternMatrixB; + std::array<int, 2> imageSizeScaledA = {{ + (int)((*posA).size[0] * properties.pattern.value.fromScale), + (int)((*posA).size[1] * properties.pattern.value.fromScale) + }}; + std::array<int, 2> imageSizeScaledB = {{ + (int)((*posB).size[0] * properties.pattern.value.toScale), + (int)((*posB).size[1] * properties.pattern.value.toScale) + }}; + + int tileSize = 512; + + float offsetAx = ((tileSize % imageSizeScaledA[0]) * id.x) / (float)imageSizeScaledA[0]; + float offsetAy = ((tileSize % imageSizeScaledA[1]) * id.y) / (float)imageSizeScaledA[1]; + + float offsetBx = ((tileSize % imageSizeScaledB[0]) * id.x) / (float)imageSizeScaledB[0]; + float offsetBy = ((tileSize % imageSizeScaledB[1]) * id.y) / (float)imageSizeScaledB[1]; + + patternShader->u_offset_a = std::array<float, 2>{{offsetAx, offsetAy}}; + patternShader->u_offset_b = std::array<float, 2>{{offsetBx, offsetBy}}; + MBGL_CHECK_ERROR(glActiveTexture(GL_TEXTURE0)); spriteAtlas->bind(true); |