From 73be3558d713db5409cc0dbff86d87b11abd0670 Mon Sep 17 00:00:00 2001 From: kelvinabrokwa Date: Mon, 11 Jan 2016 10:33:49 -0800 Subject: [PATCH] [core] seamless fill-pattern seamless across dateline upgrade test-suite version --- package.json | 2 +- src/mbgl/renderer/painter_fill.cpp | 22 +++++++++++++++++++++- src/mbgl/shader/pattern.vertex.glsl | 7 +++++-- src/mbgl/shader/pattern_shader.hpp | 2 ++ 4 files changed, 29 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index d40263040..32879c70e 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ ], "devDependencies": { "aws-sdk": "^2.2.21", - "mapbox-gl-test-suite": "mapbox/mapbox-gl-test-suite#4cee4c1369d013d59fe8b453ae3305f9eb057edf", + "mapbox-gl-test-suite": "mapbox/mapbox-gl-test-suite#46c907f48d2b3b8ae6531963cdc40cb07958fd01", "node-gyp": "^3.2.1", "request": "^2.67.0", "tape": "^4.2.2" diff --git a/src/mbgl/renderer/painter_fill.cpp b/src/mbgl/renderer/painter_fill.cpp index 9976d9f6f..38aa92fb0 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 imageSizeScaledA = {{ + (int)((*posA).size[0] * properties.pattern.value.fromScale), + (int)((*posA).size[1] * properties.pattern.value.fromScale) + }}; + std::array 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{{offsetAx, offsetAy}}; + patternShader->u_offset_b = std::array{{offsetBx, offsetBy}}; + MBGL_CHECK_ERROR(glActiveTexture(GL_TEXTURE0)); spriteAtlas->bind(true); diff --git a/src/mbgl/shader/pattern.vertex.glsl b/src/mbgl/shader/pattern.vertex.glsl index dff4469d2..4ff51cad6 100644 --- a/src/mbgl/shader/pattern.vertex.glsl +++ b/src/mbgl/shader/pattern.vertex.glsl @@ -2,6 +2,9 @@ uniform mat4 u_matrix; uniform mat3 u_patternmatrix_a; uniform mat3 u_patternmatrix_b; +uniform vec2 u_offset_a; +uniform vec2 u_offset_b; + attribute vec2 a_pos; varying vec2 v_pos_a; @@ -9,6 +12,6 @@ varying vec2 v_pos_b; void main() { gl_Position = u_matrix * vec4(a_pos, 0, 1); - v_pos_a = (u_patternmatrix_a * vec3(a_pos, 1)).xy; - v_pos_b = (u_patternmatrix_b * vec3(a_pos, 1)).xy; + v_pos_a = (u_patternmatrix_a * vec3(a_pos, 1)).xy + u_offset_a; + v_pos_b = (u_patternmatrix_b * vec3(a_pos, 1)).xy + u_offset_b; } diff --git a/src/mbgl/shader/pattern_shader.hpp b/src/mbgl/shader/pattern_shader.hpp index d47cbfb18..db7901c57 100644 --- a/src/mbgl/shader/pattern_shader.hpp +++ b/src/mbgl/shader/pattern_shader.hpp @@ -22,6 +22,8 @@ public: Uniform u_image = {"u_image", *this}; UniformMatrix<3> u_patternmatrix_a = {"u_patternmatrix_a", *this}; UniformMatrix<3> u_patternmatrix_b = {"u_patternmatrix_b", *this}; + Uniform> u_offset_a = {"u_offset_a", *this}; + Uniform> u_offset_b = {"u_offset_b", *this}; }; } // namespace mbgl