diff --git a/src/data/bucket/line_bucket.js b/src/data/bucket/line_bucket.js index 0d9f04716c8..5f3cf2977de 100644 --- a/src/data/bucket/line_bucket.js +++ b/src/data/bucket/line_bucket.js @@ -104,6 +104,7 @@ class LineBucket implements Bucket { layoutVertexBuffer2: VertexBuffer; gradientTexture: ?Texture; gradient: ?RGBAImage; + gradientVersion: number; indexArray: TriangleIndexArray; indexBuffer: IndexBuffer; diff --git a/src/render/draw_line.js b/src/render/draw_line.js index a6f4243af67..323780486b6 100644 --- a/src/render/draw_line.js +++ b/src/render/draw_line.js @@ -81,7 +81,7 @@ export default function drawLine(painter: Painter, sourceCache: SourceCache, lay painter.lineAtlas.bind(context); } else if (gradient) { let gradientTexture = bucket.gradientTexture; - if (!gradientTexture || layer.gradientTextureInvalidated) { + if (!gradientTexture || (gradientTexture && layer.gradientVersion !== bucket.gradientVersion)) { const sourceMaxZoom = sourceCache.getSource().maxzoom; const potentialOverzoom = coord.canonical.z === sourceMaxZoom ? Math.ceil(1 << (painter.transform.maxZoom - coord.canonical.z)) : 1; @@ -99,6 +99,7 @@ export default function drawLine(painter: Painter, sourceCache: SourceCache, lay clips: bucket.lineClipsArray }; bucket.gradient = renderColorRamp(renderGradientParams); + bucket.gradientVersion = layer.gradientVersion; gradientTexture = bucket.gradientTexture = new Texture(context, bucket.gradient, gl.RGBA); } context.activeTexture.set(gl.TEXTURE0); @@ -113,6 +114,4 @@ export default function drawLine(painter: Painter, sourceCache: SourceCache, lay firstTile = false; // once refactored so that bound texture state is managed, we'll also be able to remove this firstTile/programChanged logic } - - layer.gradientTextureInvalidated = false; } diff --git a/src/style/style_layer/line_style_layer.js b/src/style/style_layer/line_style_layer.js index fa08fed7008..480975c7428 100644 --- a/src/style/style_layer/line_style_layer.js +++ b/src/style/style_layer/line_style_layer.js @@ -7,7 +7,7 @@ import LineBucket from '../../data/bucket/line_bucket'; import {polygonIntersectsBufferedMultiLine} from '../../util/intersection_tests'; import {getMaximumPaintValue, translateDistance, translate} from '../query_utils'; import properties from './line_style_layer_properties'; -import {extend} from '../../util/util'; +import {extend, MAX_SAFE_INTEGER} from '../../util/util'; import EvaluationParameters from '../evaluation_parameters'; import {Transitionable, Transitioning, Layout, PossiblyEvaluated, DataDrivenProperty} from '../properties'; @@ -44,7 +44,7 @@ class LineStyleLayer extends StyleLayer { _unevaluatedLayout: Layout; layout: PossiblyEvaluated; - gradientTextureInvalidated: boolean; + gradientVersion: number; stepInterpolant: boolean; _transitionablePaint: Transitionable; @@ -53,13 +53,14 @@ class LineStyleLayer extends StyleLayer { constructor(layer: LayerSpecification) { super(layer, properties); + this.gradientVersion = 0; } _handleSpecialPaintPropertyUpdate(name: string) { if (name === 'line-gradient') { const expression: ZoomConstantExpression<'source'> = ((this._transitionablePaint._values['line-gradient'].value.expression): any); this.stepInterpolant = expression._styleExpression.expression instanceof Step; - this.gradientTextureInvalidated = true; + this.gradientVersion = (this.gradientVersion + 1) % MAX_SAFE_INTEGER; } } diff --git a/src/util/util.js b/src/util/util.js index 0c84381662b..90f4ff02ed1 100644 --- a/src/util/util.js +++ b/src/util/util.js @@ -7,6 +7,9 @@ import window from './window'; import type {Callback} from '../types/callback'; +// Number.MAX_SAFE_INTEGER not available in IE +export const MAX_SAFE_INTEGER = Math.pow(2, 53) - 1; + /** * @module util * @private