implement functions for line-image

This commit is contained in:
Ansis Brammanis
2015-02-02 17:08:26 -08:00
parent b3ca6fcca6
commit 322f46a5db
6 changed files with 32 additions and 29 deletions

View File

@@ -427,6 +427,7 @@ void Painter::renderBackground(util::ptr<StyleLayer> layer_desc) {
-scale * state.getHeight() / 2);
patternShader->u_patternmatrix_a = matrixA;
patternShader->u_patternmatrix_b = matrixB;
backgroundBuffer.bind();
patternShader->bind(0);

View File

@@ -112,19 +112,11 @@ void Painter::renderLine(LineBucket& bucket, util::ptr<StyleLayer> 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<StyleLayer> 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));

View File

@@ -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;

View File

@@ -15,9 +15,12 @@ public:
UniformMatrix<4> u_matrix = {"u_matrix", *this};
UniformMatrix<4> u_exmatrix = {"u_exmatrix", *this};
Uniform<std::array<float, 2>> u_linewidth = {"u_linewidth", *this};
Uniform<std::array<float, 2>> u_pattern_size = {"u_pattern_size", *this};
Uniform<std::array<float, 2>> u_pattern_tl = {"u_pattern_tl", *this};
Uniform<std::array<float, 2>> u_pattern_br = {"u_pattern_br", *this};
Uniform<std::array<float, 2>> u_pattern_size_a = {"u_pattern_size_a", *this};
Uniform<std::array<float, 2>> u_pattern_tl_a = {"u_pattern_tl_a", *this};
Uniform<std::array<float, 2>> u_pattern_br_a = {"u_pattern_br_a", *this};
Uniform<std::array<float, 2>> u_pattern_size_b = {"u_pattern_size_b", *this};
Uniform<std::array<float, 2>> u_pattern_tl_b = {"u_pattern_tl_b", *this};
Uniform<std::array<float, 2>> u_pattern_br_b = {"u_pattern_br_b", *this};
Uniform<float> u_ratio = {"u_ratio", *this};
Uniform<float> u_point = {"u_point", *this};
Uniform<float> u_blur = {"u_blur", *this};

View File

@@ -653,7 +653,7 @@ void StyleParser::parsePaint(JSVal value, ClassProperties &klass) {
parseOptionalProperty<Function<float>>("line-blur", Key::LineBlur, klass, value);
parseOptionalProperty<PropertyTransition>("line-blur-transition", Key::LineBlur, klass, value);
parseOptionalProperty<Function<std::vector<float>>>("line-dasharray", Key::LineDashArray, klass, value);
parseOptionalProperty<std::string>("line-image", Key::LineImage, klass, value);
parseOptionalProperty<FadedStopsFunction<Faded<std::string>>>("line-image", Key::LineImage, klass, value);
parseOptionalProperty<Function<float>>("icon-opacity", Key::IconOpacity, klass, value);
parseOptionalProperty<PropertyTransition>("icon-opacity-transition", Key::IconOpacity, klass, value);

View File

@@ -39,7 +39,7 @@ struct LineProperties {
float blur = 0;
std::vector<float> dash_array;
float dash_line_width = 1;
std::string image;
Faded<std::string> image;
inline bool isVisible() const {
return opacity > 0 && color[3] > 0 && width > 0;