diff --git a/src/mbgl/renderer/painter.cpp b/src/mbgl/renderer/painter.cpp index f8347123c..84bd24c5e 100644 --- a/src/mbgl/renderer/painter.cpp +++ b/src/mbgl/renderer/painter.cpp @@ -427,6 +427,7 @@ void Painter::renderBackground(util::ptr layer_desc) { -scale * state.getHeight() / 2); patternShader->u_patternmatrix_a = matrixA; + patternShader->u_patternmatrix_b = matrixB; backgroundBuffer.bind(); patternShader->bind(0); diff --git a/src/mbgl/renderer/painter_line.cpp b/src/mbgl/renderer/painter_line.cpp index 3951f2e7c..b26f1cfa5 100644 --- a/src/mbgl/renderer/painter_line.cpp +++ b/src/mbgl/renderer/painter_line.cpp @@ -112,19 +112,11 @@ void Painter::renderLine(LineBucket& bucket, util::ptr layer_desc, c bucket.drawLineSDF(*linesdfShader); - } else if (properties.image.size()) { - SpriteAtlasPosition imagePos = spriteAtlas.getPosition(properties.image, true); + } else if (properties.image.low.size()) { + SpriteAtlasPosition imagePosA = spriteAtlas.getPosition(properties.image.low, true); + SpriteAtlasPosition imagePosB = spriteAtlas.getPosition(properties.image.high, true); float factor = 8.0 / std::pow(2, state.getIntegerZoom() - id.z); - float fade; - if (state.getZoom() > lastIntegerZoom) { - // zooming in - fade = fraction + (1.0f - fraction) * t; - factor *= 2.0; - } else { - // zooming out - fade = fraction - fraction * t; - } useProgram(linepatternShader->program); @@ -134,10 +126,13 @@ void Painter::renderLine(LineBucket& bucket, util::ptr layer_desc, c linepatternShader->u_ratio = ratio; linepatternShader->u_blur = blur; - linepatternShader->u_pattern_size = {{imagePos.size[0] * factor, imagePos.size[1]}}; - linepatternShader->u_pattern_tl = imagePos.tl; - linepatternShader->u_pattern_br = imagePos.br; - linepatternShader->u_fade = fade; + linepatternShader->u_pattern_size_a = {{imagePosA.size[0] * factor * properties.image.lowScale, 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.image.highScale, imagePosB.size[1]}}; + linepatternShader->u_pattern_tl_b = imagePosB.tl; + linepatternShader->u_pattern_br_b = imagePosB.br; + linepatternShader->u_fade = properties.image.t; linepatternShader->u_opacity = properties.opacity; MBGL_CHECK_ERROR(glActiveTexture(GL_TEXTURE0)); diff --git a/src/mbgl/shader/linepattern.fragment.glsl b/src/mbgl/shader/linepattern.fragment.glsl index 45be7c8c2..08feff439 100644 --- a/src/mbgl/shader/linepattern.fragment.glsl +++ b/src/mbgl/shader/linepattern.fragment.glsl @@ -2,9 +2,12 @@ uniform vec2 u_linewidth; uniform float u_point; uniform float u_blur; -uniform vec2 u_pattern_size; -uniform vec2 u_pattern_tl; -uniform vec2 u_pattern_br; +uniform vec2 u_pattern_size_a; +uniform vec2 u_pattern_tl_a; +uniform vec2 u_pattern_br_a; +uniform vec2 u_pattern_size_b; +uniform vec2 u_pattern_tl_b; +uniform vec2 u_pattern_br_b; uniform float u_fade; uniform float u_opacity; @@ -24,13 +27,14 @@ void main() { // (v_linewidth.s) float alpha = clamp(min(dist - (u_linewidth.t - u_blur), u_linewidth.s - dist) / u_blur, 0.0, 1.0); - float x = mod(v_linesofar / u_pattern_size.x, 1.0); - float y = 0.5 + (v_normal.y * u_linewidth.s / u_pattern_size.y); - vec2 pos = mix(u_pattern_tl, u_pattern_br, vec2(x, y)); - float x2 = mod(x * 2.0, 1.0); - vec2 pos2 = mix(u_pattern_tl, u_pattern_br, vec2(x2, y)); + float x_a = mod(v_linesofar / u_pattern_size_a.x, 1.0); + float y_a = 0.5 + (v_normal.y * u_linewidth.s / u_pattern_size_a.y); + vec2 pos_a = mix(u_pattern_tl_a, u_pattern_br_a, vec2(x_a, y_a)); + float x_b = mod(v_linesofar / u_pattern_size_b.x, 1.0); + float y_b = 0.5 + (v_normal.y * u_linewidth.s / u_pattern_size_b.y); + vec2 pos_b = mix(u_pattern_tl_b, u_pattern_br_b, vec2(x_b, y_b)); - vec4 color = texture2D(u_image, pos) * (1.0 - u_fade) + u_fade * texture2D(u_image, pos2); + vec4 color = mix(texture2D(u_image, pos_a), texture2D(u_image, pos_b), u_fade); alpha *= u_opacity; diff --git a/src/mbgl/shader/linepattern_shader.hpp b/src/mbgl/shader/linepattern_shader.hpp index 388cff17d..16d9ff8be 100644 --- a/src/mbgl/shader/linepattern_shader.hpp +++ b/src/mbgl/shader/linepattern_shader.hpp @@ -15,9 +15,12 @@ public: UniformMatrix<4> u_matrix = {"u_matrix", *this}; UniformMatrix<4> u_exmatrix = {"u_exmatrix", *this}; Uniform> u_linewidth = {"u_linewidth", *this}; - Uniform> u_pattern_size = {"u_pattern_size", *this}; - Uniform> u_pattern_tl = {"u_pattern_tl", *this}; - Uniform> u_pattern_br = {"u_pattern_br", *this}; + Uniform> u_pattern_size_a = {"u_pattern_size_a", *this}; + Uniform> u_pattern_tl_a = {"u_pattern_tl_a", *this}; + Uniform> u_pattern_br_a = {"u_pattern_br_a", *this}; + Uniform> u_pattern_size_b = {"u_pattern_size_b", *this}; + Uniform> u_pattern_tl_b = {"u_pattern_tl_b", *this}; + Uniform> u_pattern_br_b = {"u_pattern_br_b", *this}; Uniform u_ratio = {"u_ratio", *this}; Uniform u_point = {"u_point", *this}; Uniform u_blur = {"u_blur", *this}; diff --git a/src/mbgl/style/style_parser.cpp b/src/mbgl/style/style_parser.cpp index 1cf8d2e35..5dcf3b114 100644 --- a/src/mbgl/style/style_parser.cpp +++ b/src/mbgl/style/style_parser.cpp @@ -653,7 +653,7 @@ void StyleParser::parsePaint(JSVal value, ClassProperties &klass) { parseOptionalProperty>("line-blur", Key::LineBlur, klass, value); parseOptionalProperty("line-blur-transition", Key::LineBlur, klass, value); parseOptionalProperty>>("line-dasharray", Key::LineDashArray, klass, value); - parseOptionalProperty("line-image", Key::LineImage, klass, value); + parseOptionalProperty>>("line-image", Key::LineImage, klass, value); parseOptionalProperty>("icon-opacity", Key::IconOpacity, klass, value); parseOptionalProperty("icon-opacity-transition", Key::IconOpacity, klass, value); diff --git a/src/mbgl/style/style_properties.hpp b/src/mbgl/style/style_properties.hpp index d2c134e8d..178421010 100644 --- a/src/mbgl/style/style_properties.hpp +++ b/src/mbgl/style/style_properties.hpp @@ -39,7 +39,7 @@ struct LineProperties { float blur = 0; std::vector dash_array; float dash_line_width = 1; - std::string image; + Faded image; inline bool isVisible() const { return opacity > 0 && color[3] > 0 && width > 0;