From d2ea30bb35549b51d6a2cef39712de97024d3e8d Mon Sep 17 00:00:00 2001 From: Ansis Brammanis Date: Mon, 12 Jun 2017 11:40:03 -0400 Subject: [PATCH] pack symbol data into 8 attributes to fit within the minimum number of supported vertex attributes --- src/data/bucket/symbol_bucket.js | 81 +++++------------- src/shaders/symbol_icon.vertex.glsl | 12 +-- src/shaders/symbol_sdf.vertex.glsl | 10 ++- src/symbol/projection.js | 18 ++-- .../icon-text-fit/placement-line/expected.png | Bin 27429 -> 27511 bytes 5 files changed, 40 insertions(+), 81 deletions(-) diff --git a/src/data/bucket/symbol_bucket.js b/src/data/bucket/symbol_bucket.js index afb5deb3887..8802b0e84a4 100644 --- a/src/data/bucket/symbol_bucket.js +++ b/src/data/bucket/symbol_bucket.js @@ -104,7 +104,7 @@ const symbolInterfaces = { } }; -function addVertex(array, anchorX, anchorY, ox, oy, tx, ty, sizeVertex, labelminzoom) { +function addVertex(array, anchorX, anchorY, ox, oy, tx, ty, sizeVertex) { array.emplaceBack( // a_pos_offset anchorX, @@ -115,18 +115,22 @@ function addVertex(array, anchorX, anchorY, ox, oy, tx, ty, sizeVertex, labelmin // a_data tx, // x coordinate of symbol on glyph atlas texture ty, // y coordinate of symbol on glyph atlas texture - packUint8ToFloat( - (labelminzoom || 0) * 10, // labelminzoom - 0 // unused 8 bits - ), - 0, // unused 16 bits - - // a_size sizeVertex ? sizeVertex[0] : undefined, sizeVertex ? sizeVertex[1] : undefined ); } +function addDynamicAttributes(dynamicLayoutVertexArray, p, angle, placementZoom) { + const twoPi = Math.PI * 2; + const angleAndZoom = packUint8ToFloat( + ((angle + twoPi) % twoPi) / twoPi * 255, + placementZoom * 10); + dynamicLayoutVertexArray.emplaceBack(p.x, p.y, angleAndZoom); + dynamicLayoutVertexArray.emplaceBack(p.x, p.y, angleAndZoom); + dynamicLayoutVertexArray.emplaceBack(p.x, p.y, angleAndZoom); + dynamicLayoutVertexArray.emplaceBack(p.x, p.y, angleAndZoom); +} + function addCollisionBoxVertex(layoutVertexArray, point, anchor, extrude, maxZoom, placementZoom) { return layoutVertexArray.emplaceBack( // pos @@ -184,25 +188,7 @@ class SymbolBucket { // Set up 'program interfaces' dynamically based on the layer's style // properties (specifically its text-size properties). const layer = this.layers[0]; - this.symbolInterfaces = { - glyph: util.extend({}, symbolInterfaces.glyph, { - layoutAttributes: [].concat( - symbolInterfaces.glyph.layoutAttributes, - getSizeAttributeDeclarations(layer, 'text-size') - ) - }), - icon: util.extend({}, symbolInterfaces.icon, { - layoutAttributes: [].concat( - symbolInterfaces.icon.layoutAttributes, - getSizeAttributeDeclarations(layer, 'icon-size') - ) - }), - collisionBox: util.extend({}, symbolInterfaces.collisionBox, { - layoutAttributes: [].concat( - symbolInterfaces.collisionBox.layoutAttributes - ) - }) - }; + this.symbolInterfaces = symbolInterfaces; // deserializing a bucket created on a worker thread if (options.arrays) { @@ -743,15 +729,12 @@ class SymbolBucket { const index = segment.vertexLength; const y = symbol.glyphOffsetY; - addVertex(layoutVertexArray, labelAnchor.x, labelAnchor.y, tl.x, y + tl.y, tex.x, tex.y, sizeVertex, placementZoom); - addVertex(layoutVertexArray, labelAnchor.x, labelAnchor.y, tr.x, y + tr.y, tex.x + tex.w, tex.y, sizeVertex, placementZoom); - addVertex(layoutVertexArray, labelAnchor.x, labelAnchor.y, bl.x, y + bl.y, tex.x, tex.y + tex.h, sizeVertex, placementZoom); - addVertex(layoutVertexArray, labelAnchor.x, labelAnchor.y, br.x, y + br.y, tex.x + tex.w, tex.y + tex.h, sizeVertex, placementZoom); + addVertex(layoutVertexArray, labelAnchor.x, labelAnchor.y, tl.x, y + tl.y, tex.x, tex.y, sizeVertex); + addVertex(layoutVertexArray, labelAnchor.x, labelAnchor.y, tr.x, y + tr.y, tex.x + tex.w, tex.y, sizeVertex); + addVertex(layoutVertexArray, labelAnchor.x, labelAnchor.y, bl.x, y + bl.y, tex.x, tex.y + tex.h, sizeVertex); + addVertex(layoutVertexArray, labelAnchor.x, labelAnchor.y, br.x, y + br.y, tex.x + tex.w, tex.y + tex.h, sizeVertex); - dynamicLayoutVertexArray.emplaceBack(labelAnchor.x, labelAnchor.y, 0); - dynamicLayoutVertexArray.emplaceBack(labelAnchor.x, labelAnchor.y, 0); - dynamicLayoutVertexArray.emplaceBack(labelAnchor.x, labelAnchor.y, 0); - dynamicLayoutVertexArray.emplaceBack(labelAnchor.x, labelAnchor.y, 0); + addDynamicAttributes(dynamicLayoutVertexArray, labelAnchor, 0, placementZoom); elementArray.emplaceBack(index, index + 1, index + 2); elementArray.emplaceBack(index + 1, index + 2, index + 3); @@ -942,32 +925,6 @@ function getSizeData(tileZoom, layer, sizeProperty) { return sizeData; } -function getSizeAttributeDeclarations(layer, sizeProperty) { - // The contents of the a_size vertex attribute depend on the type of - // property value for {text,icon}-size. - if ( - layer.isLayoutValueZoomConstant(sizeProperty) && - !layer.isLayoutValueFeatureConstant(sizeProperty) - ) { - // source function: one size value per vertex - return [{ - name: 'a_size', components: 1, type: 'Uint16' - }]; - } else if ( - !layer.isLayoutValueZoomConstant(sizeProperty) && - !layer.isLayoutValueFeatureConstant(sizeProperty) - ) { - // composite function: - // [ text-size(lowerZoomStop, feature), - // text-size(upperZoomStop, feature)] - return [{ - name: 'a_size', components: 2, type: 'Uint16' - }]; - } - // constant or camera function - return []; -} - function getSizeVertexData(layer, tileZoom, stopZoomLevels, sizeProperty, featureProperties) { if ( layer.isLayoutValueZoomConstant(sizeProperty) && @@ -998,4 +955,6 @@ SymbolBucket.programInterfaces = symbolInterfaces; // eg the max valid UInt16 is 65,535 SymbolBucket.MAX_INSTANCES = 65535; +SymbolBucket.addDynamicAttributes = addDynamicAttributes; + module.exports = SymbolBucket; diff --git a/src/shaders/symbol_icon.vertex.glsl b/src/shaders/symbol_icon.vertex.glsl index ef5cf2a184e..4d59bb64e8b 100644 --- a/src/shaders/symbol_icon.vertex.glsl +++ b/src/shaders/symbol_icon.vertex.glsl @@ -1,9 +1,9 @@ +const float PI = 3.141592653589793; + attribute vec4 a_pos_offset; attribute vec4 a_data; attribute vec3 a_projected_pos; -// icon-size data (see symbol_sdf.vertex.glsl for more) -attribute vec2 a_size; uniform bool u_is_size_zoom_constant; uniform bool u_is_size_feature_constant; uniform highp float u_size_t; // used to interpolate between zoom stops when size is a composite function @@ -33,8 +33,11 @@ void main() { vec2 a_offset = a_pos_offset.zw; vec2 a_tex = a_data.xy; - mediump vec2 label_data = unpack_float(a_data[2]); - mediump float a_labelminzoom = label_data[0]; + vec2 a_size = a_data.zw; + + highp vec2 angle_labelminzoom = unpack_float(a_projected_pos[2]); + highp float segment_angle = -angle_labelminzoom[0] / 255.0 * 2.0 * PI; + mediump float a_labelminzoom = angle_labelminzoom[1]; float size; if (!u_is_size_zoom_constant && !u_is_size_feature_constant) { @@ -59,7 +62,6 @@ void main() { float fontScale = u_is_text ? size / 24.0 : size; - highp float segment_angle = -a_projected_pos[2]; highp float angle_sin = sin(segment_angle); highp float angle_cos = cos(segment_angle); mat2 rotation_matrix = mat2(angle_cos, -1.0 * angle_sin, angle_sin, angle_cos); diff --git a/src/shaders/symbol_sdf.vertex.glsl b/src/shaders/symbol_sdf.vertex.glsl index ac196bae4f9..006e22aa456 100644 --- a/src/shaders/symbol_sdf.vertex.glsl +++ b/src/shaders/symbol_sdf.vertex.glsl @@ -1,3 +1,5 @@ +const float PI = 3.141592653589793; + // NOTE: the a_data attribute in this shader is manually bound (see https://github.com/mapbox/mapbox-gl-js/issues/4607). // If removing or renaming a_data, revisit the manual binding in painter.js accordingly. attribute vec4 a_pos_offset; @@ -11,7 +13,6 @@ attribute vec3 a_projected_pos; // For composite functions: // [ text-size(lowerZoomStop, feature), // text-size(upperZoomStop, feature) ] -attribute vec2 a_size; uniform bool u_is_size_zoom_constant; uniform bool u_is_size_feature_constant; uniform highp float u_size_t; // used to interpolate between zoom stops when size is a composite function @@ -51,9 +52,11 @@ void main() { vec2 a_offset = a_pos_offset.zw; vec2 a_tex = a_data.xy; + vec2 a_size = a_data.zw; - mediump vec2 label_data = unpack_float(a_data[2]); - mediump float a_labelminzoom = label_data[0]; + highp vec2 angle_labelminzoom = unpack_float(a_projected_pos[2]); + highp float segment_angle = -angle_labelminzoom[0] / 255.0 * 2.0 * PI; + mediump float a_labelminzoom = angle_labelminzoom[1]; if (!u_is_size_zoom_constant && !u_is_size_feature_constant) { v_size = mix(a_size[0], a_size[1], u_size_t) / 10.0; @@ -82,7 +85,6 @@ void main() { float fontScale = u_is_text ? v_size / 24.0 : v_size; - highp float segment_angle = -a_projected_pos[2]; highp float angle_sin = sin(segment_angle); highp float angle_cos = cos(segment_angle); mat2 rotation_matrix = mat2(angle_cos, -1.0 * angle_sin, angle_sin, angle_cos); diff --git a/src/symbol/projection.js b/src/symbol/projection.js index 177b81528b6..1acbc41d352 100644 --- a/src/symbol/projection.js +++ b/src/symbol/projection.js @@ -5,6 +5,7 @@ const assert = require('assert'); const mat4 = require('@mapbox/gl-matrix').mat4; const vec4 = require('@mapbox/gl-matrix').vec4; const symbolSize = require('./symbol_size'); +const addDynamicAttributes = require('../data/bucket/symbol_bucket').addDynamicAttributes; module.exports = { updateLineLabels: updateLineLabels, @@ -101,7 +102,7 @@ function project(point, matrix) { return new Point(pos[0] / pos[3], pos[1] / pos[3]); } -function isVisible(anchorPos, symbol, clippingBuffer, painter) { +function isVisible(anchorPos, placementZoom, clippingBuffer, painter) { const x = anchorPos[0] / anchorPos[3]; const y = anchorPos[1] / anchorPos[3]; const inPaddedViewport = ( @@ -109,7 +110,7 @@ function isVisible(anchorPos, symbol, clippingBuffer, painter) { x <= clippingBuffer[0] && y >= -clippingBuffer[1] && y <= clippingBuffer[1]); - return inPaddedViewport && painter.frameHistory.isVisible(symbol.placementZoom); + return inPaddedViewport && painter.frameHistory.isVisible(placementZoom); } /* @@ -133,12 +134,13 @@ function updateLineLabels(bucket, posMatrix, painter, isText, labelPlaneMatrix, for (let s = 0; s < placedSymbols.length; s++) { const symbol = placedSymbols.get(s); + const placementZoom = symbol.placementZoom; const anchorPos = [symbol.anchorX, symbol.anchorY, 0, 1]; vec4.transformMat4(anchorPos, anchorPos, posMatrix); // Don't bother calculating the correct point for invisible labels. - if (!isVisible(anchorPos, symbol, clippingBuffer, painter)) { + if (!isVisible(anchorPos, placementZoom, clippingBuffer, painter)) { hideGlyphs(symbol.numGlyphs, dynamicLayoutVertexArray); continue; } @@ -178,7 +180,7 @@ function updateLineLabels(bucket, posMatrix, painter, isText, labelPlaneMatrix, processDirection(returnGlyphs, glyphsForward, 1, flip, symbol, lineVertexArray, labelPlaneMatrix, fontScale) && processDirection(returnGlyphs, glyphsBackward, -1, flip, symbol, lineVertexArray, labelPlaneMatrix, fontScale)) { for (const glyph of returnGlyphs) { - addGlyph(glyph.point, glyph.angle, dynamicLayoutVertexArray); + addDynamicAttributes(dynamicLayoutVertexArray, glyph.point, glyph.angle, placementZoom); } } else { hideGlyphs(symbol.numGlyphs, dynamicLayoutVertexArray); @@ -253,12 +255,6 @@ const offscreenPoint = new Point(-Infinity, -Infinity); // because the dynamic buffer is paired with a static buffer that doesn't get updated. function hideGlyphs(num, dynamicLayoutVertexArray) { for (let i = 0; i < num; i++) { - addGlyph(offscreenPoint, 0, dynamicLayoutVertexArray); + addDynamicAttributes(dynamicLayoutVertexArray, offscreenPoint, 0, 25); } } -function addGlyph(p, angle, dynamicLayoutVertexArray) { - dynamicLayoutVertexArray.emplaceBack(p.x, p.y, angle); - dynamicLayoutVertexArray.emplaceBack(p.x, p.y, angle); - dynamicLayoutVertexArray.emplaceBack(p.x, p.y, angle); - dynamicLayoutVertexArray.emplaceBack(p.x, p.y, angle); -} diff --git a/test/integration/render-tests/icon-text-fit/placement-line/expected.png b/test/integration/render-tests/icon-text-fit/placement-line/expected.png index f65ef8f89a2dddd87ffe2773483c61a24d128442..0bf2f3ccd53c58e82dfbd311143dcf5e5a195a72 100644 GIT binary patch literal 27511 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 literal 27429 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