From 841da657265749648578b0a647f4822c2a70dcb3 Mon Sep 17 00:00:00 2001 From: Xiaoji Chen Date: Wed, 1 May 2024 10:21:16 -0700 Subject: [PATCH] Simplify ArcLayer --- .../src/arc-layer/arc-layer-vertex.glsl.ts | 15 ++++++++---- modules/layers/src/arc-layer/arc-layer.ts | 24 ++++--------------- 2 files changed, 16 insertions(+), 23 deletions(-) diff --git a/modules/layers/src/arc-layer/arc-layer-vertex.glsl.ts b/modules/layers/src/arc-layer/arc-layer-vertex.glsl.ts index a01c41fb017..f666ea49e30 100644 --- a/modules/layers/src/arc-layer/arc-layer-vertex.glsl.ts +++ b/modules/layers/src/arc-layer/arc-layer-vertex.glsl.ts @@ -22,7 +22,6 @@ export default `\ #version 300 es #define SHADER_NAME arc-layer-vertex-shader -in vec3 positions; in vec4 instanceSourceColors; in vec4 instanceTargetColors; in vec3 instanceSourcePositions; @@ -137,7 +136,15 @@ void main(void) { geometry.worldPosition = instanceSourcePositions; geometry.worldPositionAlt = instanceTargetPositions; - float segmentIndex = positions.x; + /* + * --(i, -1)-----------_(i+1, -1)-- + * | _,-" | + * o _,-" o + * | _,-" | + * --(i, 1)"-------------(i+1, 1)-- + */ + float segmentIndex = float(gl_VertexID / 2); + float segmentSide = mod(float(gl_VertexID), 2.) == 0. ? -1. : 1.; float segmentRatio = getSegmentRatio(segmentIndex); float prevSegmentRatio = getSegmentRatio(max(0.0, segmentIndex - 1.0)); float nextSegmentRatio = getSegmentRatio(min(numSegments - 1.0, segmentIndex + 1.0)); @@ -147,7 +154,7 @@ void main(void) { float indexDir = mix(-1.0, 1.0, step(segmentIndex, 0.0)); isValid = 1.0; - uv = vec2(segmentRatio, positions.y); + uv = vec2(segmentRatio, segmentSide); geometry.uv = uv; geometry.pickingColor = instancePickingColors; @@ -244,7 +251,7 @@ void main(void) { // extrude vec3 offset = vec3( - getExtrusionOffset((next.xy - curr.xy) * indexDir, positions.y, widthPixels), + getExtrusionOffset((next.xy - curr.xy) * indexDir, segmentSide, widthPixels), 0.0); DECKGL_FILTER_SIZE(offset, geometry); DECKGL_FILTER_GL_POSITION(curr, geometry); diff --git a/modules/layers/src/arc-layer/arc-layer.ts b/modules/layers/src/arc-layer/arc-layer.ts index 3d21382c9c8..97cf59c2736 100644 --- a/modules/layers/src/arc-layer/arc-layer.ts +++ b/modules/layers/src/arc-layer/arc-layer.ts @@ -34,7 +34,6 @@ import { DefaultProps } from '@deck.gl/core'; -import {Geometry} from '@luma.gl/engine'; import {Model} from '@luma.gl/engine'; import vs from './arc-layer-vertex.glsl'; @@ -231,11 +230,14 @@ export default class ArcLayer extends super.updateState(opts); const {props, oldProps, changeFlags} = opts; // Re-generate model if geometry changed - if (changeFlags.extensionsChanged || props.numSegments !== oldProps.numSegments) { + if (changeFlags.extensionsChanged) { this.state.model?.destroy(); this.state.model = this._getModel(); this.getAttributeManager()!.invalidateAll(); } + if (props.numSegments !== oldProps.numSegments) { + this.state.model!.setVertexCount(props.numSegments * 2); + } } draw({uniforms}) { @@ -257,28 +259,12 @@ export default class ArcLayer extends protected _getModel(): Model { const {numSegments} = this.props; - let positions: number[] = []; - /* - * (0, -1)-------------_(1, -1) - * | _,-" | - * o _,-" o - * | _,-" | - * (0, 1)"-------------(1, 1) - */ - for (let i = 0; i < numSegments; i++) { - positions = positions.concat([i, 1, 0, i, -1, 0]); - } const model = new Model(this.context.device, { ...this.getShaders(), id: this.props.id, bufferLayout: this.getAttributeManager()!.getBufferLayouts(), - geometry: new Geometry({ - topology: 'triangle-strip', - attributes: { - positions: {size: 3, value: new Float32Array(positions)} - } - }), + topology: 'triangle-strip', isInstanced: true });