diff options
Diffstat (limited to 'src/mbgl/renderer/layers/render_line_layer.cpp')
-rw-r--r-- | src/mbgl/renderer/layers/render_line_layer.cpp | 37 |
1 files changed, 35 insertions, 2 deletions
diff --git a/src/mbgl/renderer/layers/render_line_layer.cpp b/src/mbgl/renderer/layers/render_line_layer.cpp index 4b6ea35e67..f204c909e1 100644 --- a/src/mbgl/renderer/layers/render_line_layer.cpp +++ b/src/mbgl/renderer/layers/render_line_layer.cpp @@ -18,7 +18,8 @@ using namespace style; RenderLineLayer::RenderLineLayer(Immutable<style::LineLayer::Impl> _impl) : RenderLayer(style::LayerType::Line, _impl), - unevaluated(impl().paint.untransitioned()) { + unevaluated(impl().paint.untransitioned()), + colorRamp({256, 1}) { } const style::LineLayer::Impl& RenderLineLayer::impl() const { @@ -134,7 +135,18 @@ void RenderLineLayer::render(PaintParameters& parameters, RenderSource*) { parameters.imageManager.getPixelSize(), *posA, *posB)); - + } else if (!unevaluated.get<LineGradient>().getValue().isUndefined()) { + if (!colorRampTexture) { + colorRampTexture = parameters.context.createTexture(colorRamp); + } + parameters.context.bindTexture(*colorRampTexture, 0, gl::TextureFilter::Linear); + + draw(parameters.programs.lineGradient, + LineGradientProgram::uniformValues( + evaluated, + tile, + parameters.state, + parameters.pixelsToGLUnits)); } else { draw(parameters.programs.line, LineProgram::uniformValues( @@ -207,6 +219,27 @@ bool RenderLineLayer::queryIntersectsFeature( halfWidth); } +void RenderLineLayer::updateColorRamp() { + auto colorValue = unevaluated.get<LineGradient>().getValue(); + if (colorValue.isUndefined()) { + return; + } + + const auto length = colorRamp.bytes(); + + for (uint32_t i = 0; i < length; i += 4) { + const auto color = colorValue.evaluate(static_cast<double>(i) / length); + colorRamp.data[i] = std::floor(color.r * 255); + colorRamp.data[i + 1] = std::floor(color.g * 255); + colorRamp.data[i + 2] = std::floor(color.b * 255); + colorRamp.data[i + 3] = std::floor(color.a * 255); + } + + if (colorRampTexture) { + colorRampTexture = nullopt; + } +} + float RenderLineLayer::getLineWidth(const GeometryTileFeature& feature, const float zoom) const { float lineWidth = evaluated.get<style::LineWidth>() .evaluate(feature, zoom, style::LineWidth::defaultValue()); |