summaryrefslogtreecommitdiff
path: root/src/mbgl/renderer/layers/render_line_layer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mbgl/renderer/layers/render_line_layer.cpp')
-rw-r--r--src/mbgl/renderer/layers/render_line_layer.cpp43
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,