diff options
Diffstat (limited to 'src/mbgl/renderer/layers/render_line_layer.cpp')
-rw-r--r-- | src/mbgl/renderer/layers/render_line_layer.cpp | 43 |
1 files changed, 40 insertions, 3 deletions
diff --git a/src/mbgl/renderer/layers/render_line_layer.cpp b/src/mbgl/renderer/layers/render_line_layer.cpp index 1b4a1c0ff7..04d300dd1f 100644 --- a/src/mbgl/renderer/layers/render_line_layer.cpp +++ b/src/mbgl/renderer/layers/render_line_layer.cpp @@ -18,7 +18,7 @@ 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 { @@ -61,12 +61,12 @@ void RenderLineLayer::render(PaintParameters& parameters, RenderSource*) { assert(dynamic_cast<LineBucket*>(tile.tile.getBucket(*baseImpl))); LineBucket& bucket = *reinterpret_cast<LineBucket*>(tile.tile.getBucket(*baseImpl)); - auto draw = [&] (auto& program, auto&& uniformValues) { + auto draw = [&] (auto& program, const auto& stencilMode, auto&& uniformValues) { program.get(evaluated).draw( parameters.context, gl::Triangles(), parameters.depthModeForSublayer(0, gl::DepthMode::ReadOnly), - parameters.stencilModeForClipping(tile.clip), + stencilMode, parameters.colorModeForRenderPass(), std::move(uniformValues), *bucket.vertexBuffer, @@ -88,6 +88,7 @@ void RenderLineLayer::render(PaintParameters& parameters, RenderSource*) { parameters.lineAtlas.bind(parameters.context, 0); draw(parameters.programs.lineSDF, + parameters.stencilModeForClipping(tile.clip), LineSDFProgram::uniformValues( evaluated, parameters.pixelRatio, @@ -108,6 +109,7 @@ void RenderLineLayer::render(PaintParameters& parameters, RenderSource*) { parameters.imageManager.bind(parameters.context, 0); draw(parameters.programs.linePattern, + parameters.stencilModeForClipping(tile.clip), LinePatternProgram::uniformValues( evaluated, tile, @@ -117,8 +119,22 @@ void RenderLineLayer::render(PaintParameters& parameters, RenderSource*) { *posA, *posB)); + } else if (!unevaluated.get<LineGradient>().getValue().isUndefined()) { + if (!colorRampTexture) { + colorRampTexture = parameters.context.createTexture(colorRamp); + } + + draw(parameters.programs.lineGradient, + gl::StencilMode::disabled(), + LineGradientProgram::uniformValues( + evaluated, + tile, + parameters.state, + parameters.pixelsToGLUnits)); + } else { draw(parameters.programs.line, + parameters.stencilModeForClipping(tile.clip), LineProgram::uniformValues( evaluated, tile, @@ -158,6 +174,27 @@ optional<GeometryCollection> offsetLine(const GeometryCollection& rings, const d return newRings; } +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 + 0] = 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; + } +} + bool RenderLineLayer::queryIntersectsFeature( const GeometryCoordinates& queryGeometry, const GeometryTileFeature& feature, |