diff options
author | kelvinabrokwa <kelvinabrokwa@gmail.com> | 2016-01-11 10:33:49 -0800 |
---|---|---|
committer | kelvinabrokwa <kelvinabrokwa@gmail.com> | 2016-01-12 16:18:24 -0800 |
commit | 73be3558d713db5409cc0dbff86d87b11abd0670 (patch) | |
tree | 309b6498e39b8bb5d2f17549d86f21da88d6acab /src | |
parent | 11062a01b40cb64c57d1b7b2ef8c0fc39c11d159 (diff) | |
download | qtlocation-mapboxgl-73be3558d713db5409cc0dbff86d87b11abd0670.tar.gz |
[core] seamless fill-pattern
seamless across dateline
upgrade test-suite version
Diffstat (limited to 'src')
-rw-r--r-- | src/mbgl/renderer/painter_fill.cpp | 22 | ||||
-rw-r--r-- | src/mbgl/shader/pattern.vertex.glsl | 7 | ||||
-rw-r--r-- | src/mbgl/shader/pattern_shader.hpp | 2 |
3 files changed, 28 insertions, 3 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); diff --git a/src/mbgl/shader/pattern.vertex.glsl b/src/mbgl/shader/pattern.vertex.glsl index dff4469d2b..4ff51cad64 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 d47cbfb182..db7901c578 100644 --- a/src/mbgl/shader/pattern_shader.hpp +++ b/src/mbgl/shader/pattern_shader.hpp @@ -22,6 +22,8 @@ public: Uniform<GLint> u_image = {"u_image", *this}; UniformMatrix<3> u_patternmatrix_a = {"u_patternmatrix_a", *this}; UniformMatrix<3> u_patternmatrix_b = {"u_patternmatrix_b", *this}; + Uniform<std::array<GLfloat, 2>> u_offset_a = {"u_offset_a", *this}; + Uniform<std::array<GLfloat, 2>> u_offset_b = {"u_offset_b", *this}; }; } // namespace mbgl |