summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorkelvinabrokwa <kelvinabrokwa@gmail.com>2016-01-11 10:33:49 -0800
committerkelvinabrokwa <kelvinabrokwa@gmail.com>2016-01-12 16:18:24 -0800
commit73be3558d713db5409cc0dbff86d87b11abd0670 (patch)
tree309b6498e39b8bb5d2f17549d86f21da88d6acab /src
parent11062a01b40cb64c57d1b7b2ef8c0fc39c11d159 (diff)
downloadqtlocation-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.cpp22
-rw-r--r--src/mbgl/shader/pattern.vertex.glsl7
-rw-r--r--src/mbgl/shader/pattern_shader.hpp2
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