From 0ac45e840370950050e777965a338ead142afea9 Mon Sep 17 00:00:00 2001 From: Igor Dykhta Date: Tue, 10 Aug 2021 15:51:24 +0300 Subject: [PATCH 1/3] smooth edges prop --- .../api-reference/layers/scatterplot-layer.md | 7 +++++++ .../layers/src/geojson-layer/sub-layer-map.js | 1 + .../scatterplot-layer-fragment.glsl.js | 5 ++++- .../scatterplot-layer/scatterplot-layer.js | 3 +++ .../scatterplot-lnglat-billboard.png | Bin 45996 -> 11624 bytes test/render/test-cases/core-layers.js | 1 + 6 files changed, 16 insertions(+), 1 deletion(-) diff --git a/docs/api-reference/layers/scatterplot-layer.md b/docs/api-reference/layers/scatterplot-layer.md index 86984c2fc54..8e350910a41 100644 --- a/docs/api-reference/layers/scatterplot-layer.md +++ b/docs/api-reference/layers/scatterplot-layer.md @@ -142,6 +142,13 @@ The maximum line width in pixels. This prop can be used to prevent the path from If `true`, rendered circles always face the camera. If `false` circles face up (i.e. are parallel with the ground plane). +##### `smoothEdges` (Boolean, optional) + +- Default: `true` + +If `true`, circles are rendered with smoothed edges. + + ### Data Accessors ##### `getPosition` ([Function](/docs/developer-guide/using-layers.md#accessors), optional) ![transition-enabled](https://img.shields.io/badge/transition-enabled-green.svg?style=flat-square") diff --git a/modules/layers/src/geojson-layer/sub-layer-map.js b/modules/layers/src/geojson-layer/sub-layer-map.js index 2128bfbb0d0..7166b765a1e 100644 --- a/modules/layers/src/geojson-layer/sub-layer-map.js +++ b/modules/layers/src/geojson-layer/sub-layer-map.js @@ -10,6 +10,7 @@ export const POINT_LAYER = { props: { filled: 'filled', stroked: 'stroked', + smoothEdges: 'smoothEdges', lineWidthMaxPixels: 'lineWidthMaxPixels', lineWidthMinPixels: 'lineWidthMinPixels', diff --git a/modules/layers/src/scatterplot-layer/scatterplot-layer-fragment.glsl.js b/modules/layers/src/scatterplot-layer/scatterplot-layer-fragment.glsl.js index 4b370e85da0..319d7564128 100644 --- a/modules/layers/src/scatterplot-layer/scatterplot-layer-fragment.glsl.js +++ b/modules/layers/src/scatterplot-layer/scatterplot-layer-fragment.glsl.js @@ -25,6 +25,7 @@ precision highp float; uniform bool filled; uniform float stroked; +uniform bool smoothEdges; varying vec4 vFillColor; varying vec4 vLineColor; @@ -36,7 +37,9 @@ void main(void) { geometry.uv = unitPosition; float distToCenter = length(unitPosition) * outerRadiusPixels; - float inCircle = smoothedge(distToCenter, outerRadiusPixels); + float inCircle = smoothEdges ? + smoothedge(distToCenter, outerRadiusPixels) : + distToCenter < outerRadiusPixels ? 1.0 : 0.0; if (inCircle == 0.0) { discard; diff --git a/modules/layers/src/scatterplot-layer/scatterplot-layer.js b/modules/layers/src/scatterplot-layer/scatterplot-layer.js index 32a8426309a..0b6eefd0ec1 100644 --- a/modules/layers/src/scatterplot-layer/scatterplot-layer.js +++ b/modules/layers/src/scatterplot-layer/scatterplot-layer.js @@ -41,6 +41,7 @@ const defaultProps = { stroked: false, filled: true, billboard: false, + smoothEdges: true, getPosition: {type: 'accessor', value: x => x.position}, getRadius: {type: 'accessor', value: 1}, @@ -119,6 +120,7 @@ export default class ScatterplotLayer extends Layer { stroked, filled, billboard, + antialiasing, lineWidthUnits, lineWidthScale, lineWidthMinPixels, @@ -134,6 +136,7 @@ export default class ScatterplotLayer extends Layer { stroked: stroked ? 1 : 0, filled, billboard, + antialiasing, radiusScale: radiusScale * pointRadiusMultiplier, radiusMinPixels, radiusMaxPixels, diff --git a/test/render/golden-images/scatterplot-lnglat-billboard.png b/test/render/golden-images/scatterplot-lnglat-billboard.png index 47d72501bdf48b29fc37da4ec414ec53347e8068..a4b6c5c6ce96ec2cbbdc849bbf104d2ef49b9a67 100644 GIT binary patch literal 11624 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 literal 45996 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 Y>Q0&ke;iWQj6gus(=x`^-M~HhKM$taDgXcg diff --git a/test/render/test-cases/core-layers.js b/test/render/test-cases/core-layers.js index 2cabdaca2a6..012183b14e5 100644 --- a/test/render/test-cases/core-layers.js +++ b/test/render/test-cases/core-layers.js @@ -90,6 +90,7 @@ export default [ getFillColor: d => [255, 128, 0], getRadius: d => d.SPACES, billboard: true, + smoothEdge: false, radiusScale: 30, radiusMinPixels: 1, radiusMaxPixels: 30 From 8bf73fc8cfffb5292cb8805d0ad9810799b38cce Mon Sep 17 00:00:00 2001 From: Igor Dykhta Date: Tue, 10 Aug 2021 16:35:12 +0300 Subject: [PATCH 2/3] not staged part --- modules/layers/src/scatterplot-layer/scatterplot-layer.js | 4 ++-- test/render/test-cases/core-layers.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/layers/src/scatterplot-layer/scatterplot-layer.js b/modules/layers/src/scatterplot-layer/scatterplot-layer.js index 0b6eefd0ec1..432837cab4a 100644 --- a/modules/layers/src/scatterplot-layer/scatterplot-layer.js +++ b/modules/layers/src/scatterplot-layer/scatterplot-layer.js @@ -120,7 +120,7 @@ export default class ScatterplotLayer extends Layer { stroked, filled, billboard, - antialiasing, + smoothEdges, lineWidthUnits, lineWidthScale, lineWidthMinPixels, @@ -136,7 +136,7 @@ export default class ScatterplotLayer extends Layer { stroked: stroked ? 1 : 0, filled, billboard, - antialiasing, + smoothEdges, radiusScale: radiusScale * pointRadiusMultiplier, radiusMinPixels, radiusMaxPixels, diff --git a/test/render/test-cases/core-layers.js b/test/render/test-cases/core-layers.js index 012183b14e5..2ae448e5617 100644 --- a/test/render/test-cases/core-layers.js +++ b/test/render/test-cases/core-layers.js @@ -90,7 +90,7 @@ export default [ getFillColor: d => [255, 128, 0], getRadius: d => d.SPACES, billboard: true, - smoothEdge: false, + smoothEdges: false, radiusScale: 30, radiusMinPixels: 1, radiusMaxPixels: 30 From 57e052e2e684dbcc0fbe0b3d4fcccb93b5ea81ad Mon Sep 17 00:00:00 2001 From: Igor Dykhta Date: Tue, 10 Aug 2021 20:06:15 +0300 Subject: [PATCH 3/3] follow up --- docs/api-reference/layers/geojson-layer.md | 1 + docs/api-reference/layers/scatterplot-layer.md | 5 ++--- modules/layers/src/geojson-layer/sub-layer-map.js | 2 +- .../scatterplot-layer-fragment.glsl.js | 11 +++++++---- .../layers/src/scatterplot-layer/scatterplot-layer.js | 6 +++--- test/render/test-cases/core-layers.js | 2 +- 6 files changed, 15 insertions(+), 12 deletions(-) diff --git a/docs/api-reference/layers/geojson-layer.md b/docs/api-reference/layers/geojson-layer.md index d3e75273901..1fb80818c10 100644 --- a/docs/api-reference/layers/geojson-layer.md +++ b/docs/api-reference/layers/geojson-layer.md @@ -272,6 +272,7 @@ The following props are forwarded to a `ScatterplotLayer` if `pointType` is `'ci | `pointRadiusScale` | `1` | [radiusScale](/docs/api-reference/layers/scatterplot-layer.md#radiusscale) | | `pointRadiusMinPixels` | `0` | [radiusMinPixels](/docs/api-reference/layers/scatterplot-layer.md#radiusminpixels) | | `pointRadiusMaxPixels` | `Number.MAX_SAFE_INTEGER` | [radiusMaxPixels](/docs/api-reference/layers/scatterplot-layer.md#radiusmaxpixels) | +| `pointAntialiasing` | `true` | [antialiasing](/docs/api-reference/layers/scatterplot-layer.md#antialiasing) | ### pointType:icon Options diff --git a/docs/api-reference/layers/scatterplot-layer.md b/docs/api-reference/layers/scatterplot-layer.md index 8e350910a41..342996c15b9 100644 --- a/docs/api-reference/layers/scatterplot-layer.md +++ b/docs/api-reference/layers/scatterplot-layer.md @@ -142,12 +142,11 @@ The maximum line width in pixels. This prop can be used to prevent the path from If `true`, rendered circles always face the camera. If `false` circles face up (i.e. are parallel with the ground plane). -##### `smoothEdges` (Boolean, optional) +##### `antialiasing` (Boolean, optional) - Default: `true` -If `true`, circles are rendered with smoothed edges. - +If `true`, circles are rendered with smoothed edges. If `false`, circles are rendered with rough edges. Antialiasing can cause artifacts on edges of overlapping circles. Also, antialiasing isn't supported in FirstPersonView. ### Data Accessors diff --git a/modules/layers/src/geojson-layer/sub-layer-map.js b/modules/layers/src/geojson-layer/sub-layer-map.js index 7166b765a1e..62e38233716 100644 --- a/modules/layers/src/geojson-layer/sub-layer-map.js +++ b/modules/layers/src/geojson-layer/sub-layer-map.js @@ -10,7 +10,6 @@ export const POINT_LAYER = { props: { filled: 'filled', stroked: 'stroked', - smoothEdges: 'smoothEdges', lineWidthMaxPixels: 'lineWidthMaxPixels', lineWidthMinPixels: 'lineWidthMinPixels', @@ -20,6 +19,7 @@ export const POINT_LAYER = { pointRadiusMinPixels: 'radiusMinPixels', pointRadiusScale: 'radiusScale', pointRadiusUnits: 'radiusUnits', + pointAntialiasing: 'antialiasing', getFillColor: 'getFillColor', getLineColor: 'getLineColor', diff --git a/modules/layers/src/scatterplot-layer/scatterplot-layer-fragment.glsl.js b/modules/layers/src/scatterplot-layer/scatterplot-layer-fragment.glsl.js index 319d7564128..edf09ef7e2f 100644 --- a/modules/layers/src/scatterplot-layer/scatterplot-layer-fragment.glsl.js +++ b/modules/layers/src/scatterplot-layer/scatterplot-layer-fragment.glsl.js @@ -25,7 +25,7 @@ precision highp float; uniform bool filled; uniform float stroked; -uniform bool smoothEdges; +uniform bool antialiasing; varying vec4 vFillColor; varying vec4 vLineColor; @@ -37,16 +37,19 @@ void main(void) { geometry.uv = unitPosition; float distToCenter = length(unitPosition) * outerRadiusPixels; - float inCircle = smoothEdges ? + float inCircle = antialiasing ? smoothedge(distToCenter, outerRadiusPixels) : - distToCenter < outerRadiusPixels ? 1.0 : 0.0; + step(distToCenter, outerRadiusPixels); if (inCircle == 0.0) { discard; } if (stroked > 0.5) { - float isLine = smoothedge(innerUnitRadius * outerRadiusPixels, distToCenter); + float isLine = antialiasing ? + smoothedge(innerUnitRadius * outerRadiusPixels, distToCenter) : + step(innerUnitRadius * outerRadiusPixels, distToCenter); + if (filled) { gl_FragColor = mix(vFillColor, vLineColor, isLine); } else { diff --git a/modules/layers/src/scatterplot-layer/scatterplot-layer.js b/modules/layers/src/scatterplot-layer/scatterplot-layer.js index 432837cab4a..1d5f479639d 100644 --- a/modules/layers/src/scatterplot-layer/scatterplot-layer.js +++ b/modules/layers/src/scatterplot-layer/scatterplot-layer.js @@ -41,7 +41,7 @@ const defaultProps = { stroked: false, filled: true, billboard: false, - smoothEdges: true, + antialiasing: true, getPosition: {type: 'accessor', value: x => x.position}, getRadius: {type: 'accessor', value: 1}, @@ -120,7 +120,7 @@ export default class ScatterplotLayer extends Layer { stroked, filled, billboard, - smoothEdges, + antialiasing, lineWidthUnits, lineWidthScale, lineWidthMinPixels, @@ -136,7 +136,7 @@ export default class ScatterplotLayer extends Layer { stroked: stroked ? 1 : 0, filled, billboard, - smoothEdges, + antialiasing, radiusScale: radiusScale * pointRadiusMultiplier, radiusMinPixels, radiusMaxPixels, diff --git a/test/render/test-cases/core-layers.js b/test/render/test-cases/core-layers.js index 2ae448e5617..1383ee38d1b 100644 --- a/test/render/test-cases/core-layers.js +++ b/test/render/test-cases/core-layers.js @@ -90,7 +90,7 @@ export default [ getFillColor: d => [255, 128, 0], getRadius: d => d.SPACES, billboard: true, - smoothEdges: false, + antialiasing: false, radiusScale: 30, radiusMinPixels: 1, radiusMaxPixels: 30