From 73631f53cdf60c9a380bd81fd0d15736f6c3d79c Mon Sep 17 00:00:00 2001 From: Alex Fedosov Date: Wed, 3 Jun 2020 17:44:17 +0700 Subject: [PATCH 1/3] Dont sort symbol features if they dont overlap --- src/data/bucket/symbol_bucket.js | 8 +++++++- src/render/draw_symbol.js | 7 ++++++- src/symbol/symbol_layout.js | 3 +++ 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/data/bucket/symbol_bucket.js b/src/data/bucket/symbol_bucket.js index 02d96009206..e0143df0a98 100644 --- a/src/data/bucket/symbol_bucket.js +++ b/src/data/bucket/symbol_bucket.js @@ -609,6 +609,7 @@ class SymbolBucket implements Bucket { lineOffset: [number, number], alongLine: boolean, feature: SymbolFeature, + layer: SymbolStyleLayer, writingMode: any, labelAnchor: Anchor, lineStartIndex: number, @@ -618,7 +619,12 @@ class SymbolBucket implements Bucket { const indexArray = arrays.indexArray; const layoutVertexArray = arrays.layoutVertexArray; - const segment = arrays.segments.prepareSegment(4 * quads.length, layoutVertexArray, indexArray, feature.sortKey); + const canOverlap = layer.layout.get('icon-ignore-placement') || + layer.layout.get('icon-allow-overlap') || + layer.layout.get('text-ignore-placement') || + layer.layout.get('text-allow-overlap'); + + const segment = arrays.segments.prepareSegment(4 * quads.length, layoutVertexArray, indexArray, canOverlap ? feature.sortKey : undefined); const glyphOffsetArrayStart = this.glyphOffsetArray.length; const vertexStartIndex = segment.vertexLength; diff --git a/src/render/draw_symbol.js b/src/render/draw_symbol.js index 80326f41016..5bc4bc4b860 100644 --- a/src/render/draw_symbol.js +++ b/src/render/draw_symbol.js @@ -236,7 +236,12 @@ function drawLayerSymbols(painter, sourceCache, layer, coords, isText, translate // Unpitched point labels need to have their rotation applied after projection const rotateInShader = rotateWithMap && !pitchWithMap && !alongLine; - const sortFeaturesByKey = layer.layout.get('symbol-sort-key').constantOr(1) !== undefined; + const canOverlap = layer.layout.get('icon-ignore-placement') || + layer.layout.get('icon-allow-overlap') || + layer.layout.get('text-ignore-placement') || + layer.layout.get('text-allow-overlap'); + + const sortFeaturesByKey = canOverlap && layer.layout.get('symbol-sort-key').constantOr(1) !== undefined; const depthMode = painter.depthModeForSublayer(0, DepthMode.ReadOnly); diff --git a/src/symbol/symbol_layout.js b/src/symbol/symbol_layout.js index 990c8417282..b9fd926b5ab 100644 --- a/src/symbol/symbol_layout.js +++ b/src/symbol/symbol_layout.js @@ -518,6 +518,7 @@ function addTextVertices(bucket: SymbolBucket, textOffset, textAlongLine, feature, + layer, writingMode, anchor, lineArray.lineStartIndex, @@ -646,6 +647,7 @@ function addSymbol(bucket: SymbolBucket, iconOffset, iconAlongLine, feature, + layer, false, anchor, lineArray.lineStartIndex, @@ -665,6 +667,7 @@ function addSymbol(bucket: SymbolBucket, iconOffset, iconAlongLine, feature, + layer, WritingMode.vertical, anchor, lineArray.lineStartIndex, From f93d8e7d988a01ab0dba0fbf1b6f2514f31261ea Mon Sep 17 00:00:00 2001 From: Alex Fedosov Date: Sun, 9 Aug 2020 15:43:54 +0700 Subject: [PATCH 2/3] Move canOverlap to SymbolBucket constructor --- src/data/bucket/symbol_bucket.js | 16 ++++++++-------- src/render/draw_symbol.js | 11 ++++------- 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/src/data/bucket/symbol_bucket.js b/src/data/bucket/symbol_bucket.js index e0143df0a98..91f889ed689 100644 --- a/src/data/bucket/symbol_bucket.js +++ b/src/data/bucket/symbol_bucket.js @@ -322,6 +322,7 @@ class SymbolBucket implements Bucket { fadeStartTime: number; sortFeaturesByKey: boolean; sortFeaturesByY: boolean; + canOverlap: boolean; sortedAngle: number; featureSortOrder: Array; @@ -367,10 +368,14 @@ class SymbolBucket implements Bucket { const layout = this.layers[0].layout; const sortKey = layout.get('symbol-sort-key'); const zOrder = layout.get('symbol-z-order'); + this.canOverlap = + layout.get('text-allow-overlap') || + layout.get('icon-allow-overlap') || + layout.get('text-ignore-placement') || + layout.get('icon-ignore-placement'); this.sortFeaturesByKey = zOrder !== 'viewport-y' && sortKey.constantOr(1) !== undefined; const zOrderByViewportY = zOrder === 'viewport-y' || (zOrder === 'auto' && !this.sortFeaturesByKey); - this.sortFeaturesByY = zOrderByViewportY && (layout.get('text-allow-overlap') || layout.get('icon-allow-overlap') || - layout.get('text-ignore-placement') || layout.get('icon-ignore-placement')); + this.sortFeaturesByY = zOrderByViewportY && this.canOverlap; if (layout.get('symbol-placement') === 'point') { this.writingModes = layout.get('text-writing-mode').map(wm => WritingMode[wm]); @@ -619,12 +624,7 @@ class SymbolBucket implements Bucket { const indexArray = arrays.indexArray; const layoutVertexArray = arrays.layoutVertexArray; - const canOverlap = layer.layout.get('icon-ignore-placement') || - layer.layout.get('icon-allow-overlap') || - layer.layout.get('text-ignore-placement') || - layer.layout.get('text-allow-overlap'); - - const segment = arrays.segments.prepareSegment(4 * quads.length, layoutVertexArray, indexArray, canOverlap ? feature.sortKey : undefined); + const segment = arrays.segments.prepareSegment(4 * quads.length, layoutVertexArray, indexArray, this.canOverlap ? feature.sortKey : undefined); const glyphOffsetArrayStart = this.glyphOffsetArray.length; const vertexStartIndex = segment.vertexLength; diff --git a/src/render/draw_symbol.js b/src/render/draw_symbol.js index 5bc4bc4b860..1dd5c4acff0 100644 --- a/src/render/draw_symbol.js +++ b/src/render/draw_symbol.js @@ -236,12 +236,8 @@ function drawLayerSymbols(painter, sourceCache, layer, coords, isText, translate // Unpitched point labels need to have their rotation applied after projection const rotateInShader = rotateWithMap && !pitchWithMap && !alongLine; - const canOverlap = layer.layout.get('icon-ignore-placement') || - layer.layout.get('icon-allow-overlap') || - layer.layout.get('text-ignore-placement') || - layer.layout.get('text-allow-overlap'); - - const sortFeaturesByKey = canOverlap && layer.layout.get('symbol-sort-key').constantOr(1) !== undefined; + const hasSortKey = layer.layout.get('symbol-sort-key').constantOr(1) !== undefined; + let sortFeaturesByKey = false; const depthMode = painter.depthModeForSublayer(0, DepthMode.ReadOnly); @@ -338,7 +334,8 @@ function drawLayerSymbols(painter, sourceCache, layer, coords, isText, translate hasHalo }; - if (sortFeaturesByKey) { + if (hasSortKey && bucket.canOverlap) { + sortFeaturesByKey = true; const oldSegments = buffers.segments.get(); for (const segment of oldSegments) { tileRenderState.push({ From 7f5cfdc34cd2af7bd93ba0139112d7d68b58470b Mon Sep 17 00:00:00 2001 From: Alex Fedosov Date: Tue, 11 Aug 2020 17:09:18 +0700 Subject: [PATCH 3/3] Remove leftover function arguments --- src/data/bucket/symbol_bucket.js | 1 - src/symbol/symbol_layout.js | 3 --- 2 files changed, 4 deletions(-) diff --git a/src/data/bucket/symbol_bucket.js b/src/data/bucket/symbol_bucket.js index 91f889ed689..c534f1888c4 100644 --- a/src/data/bucket/symbol_bucket.js +++ b/src/data/bucket/symbol_bucket.js @@ -614,7 +614,6 @@ class SymbolBucket implements Bucket { lineOffset: [number, number], alongLine: boolean, feature: SymbolFeature, - layer: SymbolStyleLayer, writingMode: any, labelAnchor: Anchor, lineStartIndex: number, diff --git a/src/symbol/symbol_layout.js b/src/symbol/symbol_layout.js index b9fd926b5ab..990c8417282 100644 --- a/src/symbol/symbol_layout.js +++ b/src/symbol/symbol_layout.js @@ -518,7 +518,6 @@ function addTextVertices(bucket: SymbolBucket, textOffset, textAlongLine, feature, - layer, writingMode, anchor, lineArray.lineStartIndex, @@ -647,7 +646,6 @@ function addSymbol(bucket: SymbolBucket, iconOffset, iconAlongLine, feature, - layer, false, anchor, lineArray.lineStartIndex, @@ -667,7 +665,6 @@ function addSymbol(bucket: SymbolBucket, iconOffset, iconAlongLine, feature, - layer, WritingMode.vertical, anchor, lineArray.lineStartIndex,