@deck.gl/arcgis 9.3.7 → 9.4.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/index.ts", "../src/deck-props.ts", "../src/deck-layer.ts", "../src/commons.ts", "../src/deck-layer-view-2d.ts", "../../core/src/utils/positions.ts", "../../core/src/utils/deep-equal.ts", "../../core/src/utils/deep-merge.ts", "../../core/src/views/view.ts", "../../core/src/utils/log.ts", "../../core/src/utils/math-utils.ts", "../../core/src/viewports/viewport.ts", "../../core/src/lib/constants.ts", "../../core/src/viewports/web-mercator-viewport.ts", "../../core/src/controllers/map-controller.ts", "../../core/src/transitions/transition.ts", "../../core/src/controllers/transition-manager.ts", "../../core/src/transitions/transition-interpolator.ts", "../../core/src/utils/assert.ts", "../../core/src/transitions/linear-interpolator.ts", "../../core/src/viewports/globe-viewport.ts", "../../core/src/controllers/controller.ts", "../../core/src/controllers/view-state.ts", "../../core/src/views/map-view.ts", "../src/deck-renderer.ts", "../src/load-modules.ts"],
4
- "sourcesContent": ["// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport createDeckProps from './deck-props';\nimport createDeckLayer from './deck-layer';\nimport createDeckLayerView2D from './deck-layer-view-2d';\nimport createDeckRenderer from './deck-renderer';\n\nimport Accessor from '@arcgis/core/core/Accessor';\nimport Layer from '@arcgis/core/layers/Layer';\nimport BaseLayerViewGL2D from '@arcgis/core/views/2d/layers/BaseLayerViewGL2D';\nimport RenderNode from '@arcgis/core/views/3d/webgl/RenderNode';\n\n// require-style loader\nexport {loadArcGISModules} from './load-modules';\n\n// ESM-style classes\nconst DeckProps = createDeckProps(Accessor);\nconst DeckLayerView2D = createDeckLayerView2D(BaseLayerViewGL2D);\nexport const DeckLayer = createDeckLayer(DeckProps, Layer, DeckLayerView2D);\nexport const DeckRenderer = createDeckRenderer(DeckProps, RenderNode);\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nconst properties = {\n layers: {},\n layerFilter: {},\n parameters: {},\n effects: {},\n pickingRadius: {},\n onBeforeRender: {},\n onAfterRender: {},\n onClick: {},\n onHover: {},\n onDragStart: {},\n onDrag: {},\n onDragEnd: {},\n onError: {},\n debug: {},\n drawPickingColors: {},\n getCursor: {},\n getTooltip: {}\n};\n\n/* eslint-disable callback-return */\nexport default function createDeckProps(Accessor) {\n const DeckProps = Accessor.createSubclass({\n properties,\n\n constructor() {\n this._callbacks = {};\n\n this.watch(Object.keys(properties), (newValue, oldValue, propName) => {\n this.emit('change', {[propName]: newValue});\n });\n },\n\n on(eventName, cb) {\n this._callbacks[eventName] = this._callbacks[eventName] || [];\n this._callbacks[eventName].push(cb);\n },\n\n emit(eventName, details) {\n const callbacks = this._callbacks[eventName];\n if (callbacks) {\n for (const cb of callbacks) {\n cb(details);\n }\n }\n },\n\n toJSON() {\n const result = {};\n for (const key of this.keys()) {\n if (this[key] !== undefined) {\n result[key] = this[key];\n }\n }\n return result;\n }\n });\n\n return DeckProps;\n}\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nexport default function createDeckLayer(DeckProps, Layer, DeckLayerView2D) {\n // A layer that displays inside a MapView using an instance\n // of the layer view defined above.\n return Layer.createSubclass({\n properties: {\n deck: {},\n blendMode: {},\n effect: {}\n },\n\n constructor() {\n this.deck = new DeckProps();\n },\n\n // Called by the MapView whenever a layer view\n // needs to be created for a given layer.\n createLayerView(view) {\n if (view.type === '2d') {\n return new DeckLayerView2D({\n view,\n layer: this\n });\n }\n\n // eslint-disable-next-line\n console.error(\n 'DeckLayer does not support SceneView at the moment. Use DeckRenderer instead.'\n );\n\n return null;\n }\n });\n}\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n/* eslint-disable no-invalid-this */\n\nimport type {Device, Texture, Framebuffer} from '@luma.gl/core';\nimport {Deck} from '@deck.gl/core';\nimport {Model, Geometry} from '@luma.gl/engine';\nimport {GL} from '@luma.gl/webgl/constants';\nimport {WebGLDevice} from '@luma.gl/webgl';\n\ninterface Renderer {\n redraw: () => void;\n}\n\nexport type RenderResources = {\n deck: Deck;\n texture: Texture;\n model: Model;\n fbo: Framebuffer;\n};\n\nasync function createDeckInstance(gl: WebGL2RenderingContext): Promise<{\n deckInstance: Deck;\n device: Device;\n}> {\n return new Promise(resolve => {\n const deckInstance = new Deck({\n // Input is handled by the ArcGIS API for JavaScript.\n controller: false,\n\n // We use the same WebGL context as the ArcGIS API for JavaScript.\n gl,\n\n // We need depth testing in general; we don't know what layers might be added to the deck.\n parameters: {\n depthCompare: 'less-equal'\n },\n\n // To disable canvas resizing, since the FBO is owned by the ArcGIS API for JavaScript.\n width: null,\n height: null,\n\n onDeviceInitialized: (device: Device) => {\n resolve({deckInstance, device});\n }\n });\n });\n}\n\nexport async function initializeResources(\n this: Renderer,\n gl: WebGL2RenderingContext\n): Promise<RenderResources> {\n const {deckInstance, device} = await createDeckInstance(gl);\n\n const texture = device.createTexture({\n format: 'rgba8unorm',\n width: 1,\n height: 1,\n sampler: {\n minFilter: 'linear',\n magFilter: 'linear',\n addressModeU: 'clamp-to-edge',\n addressModeV: 'clamp-to-edge'\n }\n });\n\n const model = new Model(device, {\n vs: `\\\n#version 300 es\nin vec2 pos;\nout vec2 v_texcoord;\nvoid main(void) {\n gl_Position = vec4(pos, 0.0, 1.0);\n v_texcoord = (pos + 1.0) / 2.0;\n}\n `,\n fs: `\\\n#version 300 es\nprecision mediump float;\nuniform sampler2D deckglTexture;\nin vec2 v_texcoord;\nout vec4 fragColor;\n\nvoid main(void) {\n vec4 imageColor = texture(deckglTexture, v_texcoord);\n // FBO stores premultiplied RGBA (rgb already multiplied by alpha).\n // The composite blend (ONE, ONE_MINUS_SRC_ALPHA) handles premultiplied\n // input correctly; multiplying again here would darken overlays.\n fragColor = imageColor;\n}\n `,\n bindings: {\n deckglTexture: texture\n },\n parameters: {\n depthWriteEnabled: false,\n depthCompare: 'always',\n blendColorSrcFactor: 'one',\n blendColorDstFactor: 'one-minus-src-alpha',\n blendAlphaSrcFactor: 'one',\n blendAlphaDstFactor: 'one-minus-src-alpha',\n blendColorOperation: 'add',\n blendAlphaOperation: 'add'\n },\n geometry: new Geometry({\n topology: 'triangle-strip',\n attributes: {\n pos: {size: 2, value: new Int8Array([-1, -1, 1, -1, -1, 1, -1, 1, 1, 1, 1, -1])}\n }\n }),\n vertexCount: 6,\n disableWarnings: true\n });\n\n const fbo = device.createFramebuffer({\n id: 'deckfbo',\n width: 1,\n height: 1,\n colorAttachments: [texture],\n depthStencilAttachment: 'depth16unorm'\n });\n\n deckInstance.setProps({\n // This deck renders into an auxiliary framebuffer.\n _framebuffer: fbo,\n\n _customRender: redrawReason => {\n if (redrawReason === 'arcgis') {\n // ArcGIS renders with alphaSrc=ZERO (preserves destination alpha for its\n // own compositing pipeline). Without resetting this, deck layers inherit\n // that blend state and write alpha=0 into the FBO, making the composite\n // shader output (0,0,0,0) everywhere. Reset to standard premultiplied-alpha\n // blend so the FBO stores correct RGBA for the composite pass.\n const glCtx = (device as WebGLDevice).gl;\n glCtx.blendFuncSeparate(\n glCtx.ONE,\n glCtx.ONE_MINUS_SRC_ALPHA,\n glCtx.ONE,\n glCtx.ONE_MINUS_SRC_ALPHA\n );\n deckInstance._drawLayers(redrawReason);\n } else {\n this.redraw();\n }\n }\n });\n\n return {deck: deckInstance, texture, fbo, model};\n}\n\nexport function render(\n resources: RenderResources,\n viewport: {\n width: number;\n height: number;\n longitude: number;\n latitude: number;\n zoom: number;\n altitude?: number;\n pitch: number;\n bearing: number;\n views?: unknown;\n viewState?: unknown;\n }\n) {\n const {model, deck, fbo} = resources;\n const device = model.device;\n if (device instanceof WebGLDevice) {\n // @ts-ignore device.getParametersWebGL should return `any` not `void`?\n const rawScreenFbo: WebGLFramebuffer | null = device.getParametersWebGL(GL.FRAMEBUFFER_BINDING);\n const {width, height, views, viewState, ...defaultViewState} = viewport;\n\n /* global window */\n const dpr = window.devicePixelRatio;\n const pixelWidth = Math.round(width * dpr);\n const pixelHeight = Math.round(height * dpr);\n\n fbo.resize({width: pixelWidth, height: pixelHeight});\n\n // luma's Framebuffer.resize() clones and destroys the color attachment texture when\n // dimensions change, leaving the cached texture reference and the model sampler binding\n // pointing at a destroyed GPU handle. Re-sync if the attachment was replaced.\n const currentTexture =\n (fbo.colorAttachments[0] as any).texture ?? (fbo.colorAttachments[0] as unknown as Texture);\n if (currentTexture !== resources.texture) {\n resources.texture = currentTexture;\n (model as any).setBindings({deckglTexture: currentTexture});\n }\n\n // Pass CSS pixel dimensions \u2014 deck handles DPR internally. Passing physical\n // pixels would double-apply DPR and project layer geometry off-screen.\n // Without width/height, deck's viewport aspect diverges from ArcGIS's,\n // causing the overlay to drift off the ground plane under tilt/rotation.\n const deckProps: any = {\n width,\n height,\n viewState: viewState || defaultViewState\n };\n if (views) {\n deckProps.views = views;\n }\n deck.setProps(deckProps);\n // redraw deck immediately into deckFbo\n deck.redraw('arcgis');\n\n // We overlay the texture on top of the map using the full-screen quad.\n const {gl} = device;\n\n // drawBuffers is per-FBO state not tracked by luma's state cache;\n // restore it for the screen FBO after rendering to the offscreen FBO.\n if (rawScreenFbo) {\n gl.bindFramebuffer(GL.FRAMEBUFFER, rawScreenFbo);\n gl.drawBuffers([GL.COLOR_ATTACHMENT0]);\n } else {\n gl.drawBuffers([GL.BACK]);\n }\n\n // The model sets blend factors but not blend:true, so\n // setDeviceParameters won't enable blending on its own.\n gl.enable(GL.BLEND);\n gl.blendFuncSeparate(GL.ONE, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA);\n gl.blendEquationSeparate(GL.FUNC_ADD, GL.FUNC_ADD);\n\n // luma's WEBGLRenderPass duck-types the framebuffer prop, reading `.handle`, `.width`,\n // `.height`, and `.colorAttachments`. A raw WebGLFramebuffer has none of those, which\n // breaks viewport auto-setup and draw-buffer selection. Build a minimal adapter that\n // luma's state tracker accepts; `'handle' in obj` is true, so the raw FBO is bound.\n const screenFboAdapter = {\n handle: rawScreenFbo,\n width: pixelWidth,\n height: pixelHeight,\n colorAttachments: [null]\n };\n\n const textureToScreenPass = device.beginRenderPass({\n framebuffer: screenFboAdapter as any,\n parameters: {viewport: [0, 0, pixelWidth, pixelHeight]},\n clearColor: false,\n clearDepth: false\n });\n try {\n model.draw(textureToScreenPass);\n } finally {\n textureToScreenPass.end();\n }\n }\n}\n\nexport function finalizeResources(resources: RenderResources) {\n resources.deck.finalize();\n resources.model.destroy();\n resources.fbo.destroy();\n resources.texture.destroy();\n}\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {initializeResources, render, finalizeResources} from './commons';\n\nexport default function createDeckLayerView2D(BaseLayerViewGL2D) {\n return BaseLayerViewGL2D.createSubclass({\n properties: {\n cancelInitialization: null,\n resources: null\n },\n\n // Attach is called as soon as the layer view is ready to start rendering.\n async attach() {\n // We use a full-screen quad and shaders to composite the frame rendered\n // with deck.gl on top of the MapView. Composition uses the MapView context.\n const gl = this.context;\n\n let cancelled = false;\n this.cancelInitialization = () => (cancelled = true);\n const resources = await initializeResources.call(this, gl);\n // If the layer got detached while awaiting, do not proceed\n if (cancelled) {\n finalizeResources(resources);\n return;\n }\n this.resources = resources;\n\n // Update deck props\n this.layer.deck.on('change', props => resources.deck.setProps(props));\n\n // We need to start drawing the deck.gl layer immediately.\n resources.deck.setProps(this.layer.deck.toJSON());\n },\n\n redraw() {\n this.requestRender();\n },\n\n // Called when the layer must be destroyed.\n detach() {\n this.cancelInitialization?.();\n if (this.resources) {\n finalizeResources(this.resources);\n this.resources = null;\n }\n },\n\n // Called every time that the layer view must be rendered.\n render(renderParameters) {\n if (!this.resources) {\n return;\n }\n\n const [width, height] = this.view.state.size;\n // The view state must be kept in-sync with the MapView of the ArcGIS API.\n const state = renderParameters.state;\n\n render(this.resources, {\n width,\n height,\n latitude: this.view.center.latitude,\n longitude: this.view.center.longitude,\n zoom: this.view.featuresTilingScheme.scaleToLevel(state.scale),\n bearing: -state.rotation,\n pitch: 0\n });\n }\n });\n}\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nexport type LayoutExpression =\n | {type: 'literal'; value: number}\n | {type: 'percentage'; value: number}\n | {type: 'binary'; operator: '+' | '-'; left: LayoutExpression; right: LayoutExpression};\n\ntype Token =\n | {type: 'number'; value: number}\n | {type: 'word'; value: string}\n | {type: 'symbol'; value: string};\n\nconst NUMBER_REGEX = /^(?:\\d+\\.?\\d*|\\.\\d+)$/;\n\n// Takes a number or a string expression that may include numbers, percentages, `px` units or\n// CSS-style `calc()` expressions containing `+`/`-` operations and parentheses.\nexport function parsePosition(value: number | string): LayoutExpression {\n switch (typeof value) {\n case 'number':\n if (!Number.isFinite(value)) {\n throw new Error(`Could not parse position string ${value}`);\n }\n return {type: 'literal', value};\n\n case 'string':\n try {\n const tokens = tokenize(value);\n const parser = new LayoutExpressionParser(tokens);\n return parser.parseExpression();\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n throw new Error(`Could not parse position string ${value}: ${reason}`);\n }\n\n default:\n throw new Error(`Could not parse position string ${value}`);\n }\n}\n\nexport function evaluateLayoutExpression(expression: LayoutExpression, extent: number): number {\n switch (expression.type) {\n case 'literal':\n return expression.value;\n case 'percentage':\n return Math.round(expression.value * extent);\n case 'binary':\n const left = evaluateLayoutExpression(expression.left, extent);\n const right = evaluateLayoutExpression(expression.right, extent);\n return expression.operator === '+' ? left + right : left - right;\n default:\n throw new Error('Unknown layout expression type');\n }\n}\n\nexport function getPosition(expression: LayoutExpression, extent: number): number {\n return evaluateLayoutExpression(expression, extent);\n}\n\nfunction tokenize(input: string): Token[] {\n const tokens: Token[] = [];\n let index = 0;\n while (index < input.length) {\n const char = input[index];\n if (/\\s/.test(char)) {\n index++;\n continue;\n }\n if (char === '+' || char === '-' || char === '(' || char === ')' || char === '%') {\n tokens.push({type: 'symbol', value: char});\n index++;\n continue;\n }\n if (isDigit(char) || char === '.') {\n const start = index;\n let hasDecimal = char === '.';\n index++;\n while (index < input.length) {\n const next = input[index];\n if (isDigit(next)) {\n index++;\n continue;\n }\n if (next === '.' && !hasDecimal) {\n hasDecimal = true;\n index++;\n continue;\n }\n break;\n }\n const numberString = input.slice(start, index);\n if (!NUMBER_REGEX.test(numberString)) {\n throw new Error('Invalid number token');\n }\n tokens.push({type: 'number', value: parseFloat(numberString)});\n continue;\n }\n if (isAlpha(char)) {\n const start = index;\n while (index < input.length && isAlpha(input[index])) {\n index++;\n }\n const word = input.slice(start, index).toLowerCase();\n tokens.push({type: 'word', value: word});\n continue;\n }\n throw new Error('Invalid token in position string');\n }\n return tokens;\n}\n\nclass LayoutExpressionParser {\n private tokens: Token[];\n private index = 0;\n\n constructor(tokens: Token[]) {\n this.tokens = tokens;\n }\n\n parseExpression(): LayoutExpression {\n const expression = this.parseBinaryExpression();\n if (this.index < this.tokens.length) {\n throw new Error('Unexpected token at end of expression');\n }\n return expression;\n }\n\n private parseBinaryExpression(): LayoutExpression {\n let expression = this.parseFactor();\n let token = this.peek();\n while (isAddSubSymbol(token)) {\n this.index++;\n const right = this.parseFactor();\n expression = {type: 'binary', operator: token.value, left: expression, right};\n token = this.peek();\n }\n return expression;\n }\n\n private parseFactor(): LayoutExpression {\n const token = this.peek();\n if (!token) {\n throw new Error('Unexpected end of expression');\n }\n\n if (token.type === 'symbol' && token.value === '+') {\n this.index++;\n return this.parseFactor();\n }\n if (token.type === 'symbol' && token.value === '-') {\n this.index++;\n const factor = this.parseFactor();\n return {type: 'binary', operator: '-', left: {type: 'literal', value: 0}, right: factor};\n }\n if (token.type === 'symbol' && token.value === '(') {\n this.index++;\n const expression = this.parseBinaryExpression();\n if (!this.consumeSymbol(')')) {\n throw new Error('Missing closing parenthesis');\n }\n return expression;\n }\n if (token.type === 'word' && token.value === 'calc') {\n this.index++;\n if (!this.consumeSymbol('(')) {\n throw new Error('Missing opening parenthesis after calc');\n }\n const expression = this.parseBinaryExpression();\n if (!this.consumeSymbol(')')) {\n throw new Error('Missing closing parenthesis');\n }\n return expression;\n }\n if (token.type === 'number') {\n this.index++;\n const numberValue = token.value;\n const nextToken = this.peek();\n if (nextToken && nextToken.type === 'symbol' && nextToken.value === '%') {\n this.index++;\n return {type: 'percentage', value: numberValue / 100};\n }\n if (nextToken && nextToken.type === 'word' && nextToken.value === 'px') {\n this.index++;\n return {type: 'literal', value: numberValue};\n }\n return {type: 'literal', value: numberValue};\n }\n\n throw new Error('Unexpected token in expression');\n }\n\n private consumeSymbol(value: string): boolean {\n const token = this.peek();\n if (token && token.type === 'symbol' && token.value === value) {\n this.index++;\n return true;\n }\n return false;\n }\n\n private peek(): Token | null {\n return this.tokens[this.index] || null;\n }\n}\n\nfunction isDigit(char: string): boolean {\n return char >= '0' && char <= '9';\n}\n\nfunction isAlpha(char: string): boolean {\n return (char >= 'a' && char <= 'z') || (char >= 'A' && char <= 'Z');\n}\n\nfunction isAddSubSymbol(token: Token | null): token is Token & {type: 'symbol'; value: '+' | '-'} {\n return Boolean(token && token.type === 'symbol' && (token.value === '+' || token.value === '-'));\n}\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n/**\n * Fast partial deep equal for prop.\n *\n * @param a Prop\n * @param b Prop to compare against `a`\n * @param depth Depth to which to recurse in nested Objects/Arrays. Use 0 (default) for shallow comparison, -1 for infinite depth\n */\n/* eslint-disable complexity */\nexport function deepEqual(a: any, b: any, depth: number): boolean {\n if (a === b) {\n return true;\n }\n if (!depth || !a || !b) {\n return false;\n }\n if (Array.isArray(a)) {\n if (!Array.isArray(b) || a.length !== b.length) {\n return false;\n }\n for (let i = 0; i < a.length; i++) {\n if (!deepEqual(a[i], b[i], depth - 1)) {\n return false;\n }\n }\n return true;\n }\n if (Array.isArray(b)) {\n return false;\n }\n if (typeof a === 'object' && typeof b === 'object') {\n const aKeys = Object.keys(a);\n const bKeys = Object.keys(b);\n if (aKeys.length !== bKeys.length) {\n return false;\n }\n for (const key of aKeys) {\n if (!b.hasOwnProperty(key)) {\n return false;\n }\n if (!deepEqual(a[key], b[key], depth - 1)) {\n return false;\n }\n }\n return true;\n }\n return false;\n}\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n/** Merge two viewstates, except `id`\n * For position arrays such as `target`, only override the components that are defined.\n */\nexport function deepMergeViewState<ViewStateT extends Record<string, any>>(\n a: ViewStateT,\n b: ViewStateT\n): ViewStateT {\n const result = {...a};\n for (const key in b) {\n if (key === 'id') continue;\n if (Array.isArray(result[key]) && Array.isArray(b[key])) {\n result[key] = mergeNumericArray(result[key], b[key]) as any;\n } else {\n result[key] = b[key];\n }\n }\n return result;\n}\n\nfunction mergeNumericArray(target: number[], source: number[]): number[] {\n target = target.slice();\n for (let i = 0; i < source.length; i++) {\n const v = source[i];\n if (Number.isFinite(v)) {\n target[i] = v;\n }\n }\n return target;\n}\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport Viewport from '../viewports/viewport';\nimport {parsePosition, getPosition, LayoutExpression} from '../utils/positions';\nimport {deepEqual} from '../utils/deep-equal';\nimport {deepMergeViewState} from '../utils/deep-merge';\nimport type Controller from '../controllers/controller';\nimport type {ControllerOptions} from '../controllers/controller';\nimport type {TransitionProps} from '../controllers/transition-manager';\nimport type {Padding} from '../viewports/viewport';\nimport type {ConstructorOf} from '../types/types';\nimport type {Parameters} from '@luma.gl/core';\n\nexport type CommonViewState = TransitionProps;\n\nexport type CommonViewProps<ViewState> = {\n /** A unique id of the view. In a multi-view use case, this is important for matching view states and place contents into this view. */\n id?: string;\n /** A relative (e.g. `'50%'`) or absolute position. Default `0`. */\n x?: number | string;\n /** A relative (e.g. `'50%'`) or absolute position. Default `0`. */\n y?: number | string;\n /** A relative (e.g. `'50%'`) or absolute extent. Default `'100%'`. */\n width?: number | string;\n /** A relative (e.g. `'50%'`) or absolute extent. Default `'100%'`. */\n height?: number | string;\n /** Padding around the view, expressed in either relative (e.g. `'50%'`) or absolute pixels. Default `null`. */\n padding?: {\n left?: number | string;\n right?: number | string;\n top?: number | string;\n bottom?: number | string;\n } | null;\n /** When using multiple views, set this flag to wipe the pixels drawn by other overlapping views. Default `false` */\n clear?: boolean;\n /** Color to clear the viewport with, in RGBA format [r, g, b, a?]. Values are 0-255. Default `[0, 0, 0, 0]` (transparent). */\n clearColor?: number[] | false;\n /** Depth buffer value to clear the viewport with, between 0.0 - 1.0. Default `1.0` (far plane). */\n clearDepth?: number | false;\n /** Stencil buffer Value to clear the viewport with, between 0 - 255. Default `0` (clear). */\n clearStencil?: number | false;\n /** Override the GPU parameters used to draw layers in this view. */\n parameters?: Parameters;\n /** State of the view */\n viewState?:\n | string\n | ({\n id?: string;\n } & Partial<ViewState>);\n /** Options for viewport interactivity. */\n controller?:\n | null\n | boolean\n | ConstructorOf<Controller<any>>\n | (ControllerOptions & {\n type?: ConstructorOf<Controller<any>>;\n });\n};\n\nexport default abstract class View<\n ViewState extends CommonViewState = CommonViewState,\n ViewProps extends CommonViewProps<ViewState> = CommonViewProps<ViewState>\n> {\n id: string;\n abstract getViewportType(viewState: ViewState): ConstructorOf<Viewport>;\n protected abstract get ControllerType(): ConstructorOf<Controller<any>>;\n\n private _x: LayoutExpression;\n private _y: LayoutExpression;\n private _width: LayoutExpression;\n private _height: LayoutExpression;\n private _padding: {\n left: LayoutExpression;\n right: LayoutExpression;\n top: LayoutExpression;\n bottom: LayoutExpression;\n } | null;\n\n readonly props: ViewProps;\n\n constructor(props: ViewProps) {\n const {id, x = 0, y = 0, width = '100%', height = '100%', padding = null} = props;\n\n // @ts-ignore\n this.id = id || this.constructor.displayName || 'view';\n\n this.props = {...props, id: this.id};\n\n // Extents\n this._x = parsePosition(x);\n this._y = parsePosition(y);\n this._width = parsePosition(width);\n this._height = parsePosition(height);\n this._padding = padding && {\n left: parsePosition(padding.left || 0),\n right: parsePosition(padding.right || 0),\n top: parsePosition(padding.top || 0),\n bottom: parsePosition(padding.bottom || 0)\n };\n\n // Bind methods for easy access\n this.equals = this.equals.bind(this);\n\n Object.seal(this);\n }\n\n equals(view: this): boolean {\n if (this === view) {\n return true;\n }\n\n // To correctly compare padding use depth=2\n return this.constructor === view.constructor && deepEqual(this.props, view.props, 2);\n }\n\n /** Clone this view with modified props */\n clone(newProps: Partial<ViewProps>): this {\n const ViewConstructor = this.constructor as new (props: ViewProps) => this;\n return new ViewConstructor({...this.props, ...newProps});\n }\n\n /** Make viewport from canvas dimensions and view state */\n makeViewport({width, height, viewState}: {width: number; height: number; viewState: ViewState}) {\n viewState = this.filterViewState(viewState);\n\n // Resolve relative viewport dimensions\n const viewportDimensions = this.getDimensions({width, height});\n if (!viewportDimensions.height || !viewportDimensions.width) {\n return null;\n }\n const ViewportType = this.getViewportType(viewState);\n return new ViewportType({...viewState, ...this.props, ...viewportDimensions});\n }\n\n getViewStateId(): string {\n const {viewState} = this.props;\n if (typeof viewState === 'string') {\n // if View.viewState is a string, return it\n return viewState;\n }\n return viewState?.id || this.id;\n }\n\n // Allows view to override (or completely define) viewState\n filterViewState(viewState: ViewState): ViewState {\n if (this.props.viewState && typeof this.props.viewState === 'object') {\n // If we have specified an id, then intent is to override,\n // If not, completely specify the view state\n if (!this.props.viewState.id) {\n return this.props.viewState as ViewState;\n }\n\n return deepMergeViewState<ViewState>(viewState, this.props.viewState as ViewState);\n }\n\n return viewState;\n }\n\n /** Resolve the dimensions of the view from overall canvas dimensions */\n getDimensions({width, height}: {width: number; height: number}): {\n x: number;\n y: number;\n width: number;\n height: number;\n padding?: Padding;\n } {\n const dimensions: {\n x: number;\n y: number;\n width: number;\n height: number;\n padding?: Padding;\n } = {\n x: getPosition(this._x, width),\n y: getPosition(this._y, height),\n width: getPosition(this._width, width),\n height: getPosition(this._height, height)\n };\n\n if (this._padding) {\n dimensions.padding = {\n left: getPosition(this._padding.left, width),\n top: getPosition(this._padding.top, height),\n right: getPosition(this._padding.right, width),\n bottom: getPosition(this._padding.bottom, height)\n };\n }\n return dimensions;\n }\n\n // Used by sub classes to resolve controller props\n get controller(): (ControllerOptions & {type: ConstructorOf<Controller<any>>}) | null {\n const opts = this.props.controller;\n\n if (!opts) {\n return null;\n }\n if (opts === true) {\n return {type: this.ControllerType};\n }\n if (typeof opts === 'function') {\n return {type: opts};\n }\n return {type: this.ControllerType, ...opts};\n }\n}\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {Log} from '@probe.gl/log';\n\nconst defaultLogger: Log = new Log({id: 'deck'});\n\nexport default defaultLogger;\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n// Extensions to math.gl library. Intended to be folded back.\nimport typedArrayManager from './typed-array-manager';\nimport {Vector3, NumericArray} from '@math.gl/core';\n\nimport type {Matrix4} from '@math.gl/core';\n\n// Helper, avoids low-precision 32 bit matrices from gl-matrix mat4.create()\nexport function createMat4(): number[] {\n return [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1];\n}\n\nexport function mod(value: number, divisor: number): number {\n const modulus = value % divisor;\n return modulus < 0 ? divisor + modulus : modulus;\n}\n\n// Extract camera vectors (move to math library?)\nexport function getCameraPosition(\n viewMatrixInverse: Matrix4 | NumericArray\n): [number, number, number] {\n // Read the translation from the inverse view matrix\n return [viewMatrixInverse[12], viewMatrixInverse[13], viewMatrixInverse[14]];\n}\n\nexport function getProjectionParameters(projectionMatrix: Matrix4 | NumericArray): {\n near: number;\n far: number;\n} {\n const m22 = projectionMatrix[10];\n const m23 = projectionMatrix[14];\n return {\n near: m23 / (m22 - 1),\n far: m23 / (m22 + 1)\n };\n}\n\nexport type FrustumPlane = {\n distance: number;\n normal: Vector3;\n};\n\n// https://www.gamedevs.org/uploads/fast-extraction-viewing-frustum-planes-from-world-view-projection-matrix.pdf\nexport function getFrustumPlanes(viewProjectionMatrix: Matrix4 | NumericArray): {\n left: FrustumPlane;\n right: FrustumPlane;\n top: FrustumPlane;\n bottom: FrustumPlane;\n near: FrustumPlane;\n far: FrustumPlane;\n} {\n return {\n left: getFrustumPlane(\n viewProjectionMatrix[3] + viewProjectionMatrix[0],\n viewProjectionMatrix[7] + viewProjectionMatrix[4],\n viewProjectionMatrix[11] + viewProjectionMatrix[8],\n viewProjectionMatrix[15] + viewProjectionMatrix[12]\n ),\n right: getFrustumPlane(\n viewProjectionMatrix[3] - viewProjectionMatrix[0],\n viewProjectionMatrix[7] - viewProjectionMatrix[4],\n viewProjectionMatrix[11] - viewProjectionMatrix[8],\n viewProjectionMatrix[15] - viewProjectionMatrix[12]\n ),\n bottom: getFrustumPlane(\n viewProjectionMatrix[3] + viewProjectionMatrix[1],\n viewProjectionMatrix[7] + viewProjectionMatrix[5],\n viewProjectionMatrix[11] + viewProjectionMatrix[9],\n viewProjectionMatrix[15] + viewProjectionMatrix[13]\n ),\n top: getFrustumPlane(\n viewProjectionMatrix[3] - viewProjectionMatrix[1],\n viewProjectionMatrix[7] - viewProjectionMatrix[5],\n viewProjectionMatrix[11] - viewProjectionMatrix[9],\n viewProjectionMatrix[15] - viewProjectionMatrix[13]\n ),\n near: getFrustumPlane(\n viewProjectionMatrix[3] + viewProjectionMatrix[2],\n viewProjectionMatrix[7] + viewProjectionMatrix[6],\n viewProjectionMatrix[11] + viewProjectionMatrix[10],\n viewProjectionMatrix[15] + viewProjectionMatrix[14]\n ),\n far: getFrustumPlane(\n viewProjectionMatrix[3] - viewProjectionMatrix[2],\n viewProjectionMatrix[7] - viewProjectionMatrix[6],\n viewProjectionMatrix[11] - viewProjectionMatrix[10],\n viewProjectionMatrix[15] - viewProjectionMatrix[14]\n )\n };\n}\n\nconst scratchVector = new Vector3();\n\nfunction getFrustumPlane(a: number, b: number, c: number, d: number): FrustumPlane {\n scratchVector.set(a, b, c);\n const L = scratchVector.len();\n return {distance: d / L, normal: new Vector3(-a / L, -b / L, -c / L)};\n}\n\n/**\n * Calculate the low part of a WebGL 64 bit float\n * @param x {number} - the input float number\n * @returns {number} - the lower 32 bit of the number\n */\nexport function fp64LowPart(x: number): number {\n return x - Math.fround(x);\n}\n\nlet scratchArray;\n\n/**\n * Split a Float64Array into a double-length Float32Array\n * @param typedArray\n * @param options\n * @param options.size - per attribute size\n * @param options.startIndex - start index in the source array\n * @param options.endIndex - end index in the source array\n * @returns {} - high part, low part for each attribute:\n [1xHi, 1yHi, 1zHi, 1xLow, 1yLow, 1zLow, 2xHi, ...]\n */\nexport function toDoublePrecisionArray(\n typedArray: Float64Array,\n options: {size?: number; startIndex?: number; endIndex?: number}\n): Float32Array {\n const {size = 1, startIndex = 0} = options;\n\n const endIndex = options.endIndex !== undefined ? options.endIndex : typedArray.length;\n\n const count = (endIndex - startIndex) / size;\n scratchArray = typedArrayManager.allocate(scratchArray, count, {\n type: Float32Array,\n size: size * 2\n });\n\n let sourceIndex = startIndex;\n let targetIndex = 0;\n while (sourceIndex < endIndex) {\n for (let j = 0; j < size; j++) {\n const value = typedArray[sourceIndex++];\n scratchArray[targetIndex + j] = value;\n scratchArray[targetIndex + j + size] = fp64LowPart(value);\n }\n targetIndex += size * 2;\n }\n\n return scratchArray.subarray(0, count * size * 2);\n}\n\ntype LayerBounds = [number[], number[]];\nexport function mergeBounds(boundsList: (LayerBounds | null)[]): LayerBounds | null {\n let mergedBounds: LayerBounds | null = null;\n let isMerged = false;\n\n for (const bounds of boundsList) {\n /* eslint-disable-next-line no-continue */\n if (!bounds) continue;\n if (!mergedBounds) {\n mergedBounds = bounds;\n } else {\n if (!isMerged) {\n // Copy to avoid mutating input bounds\n mergedBounds = [\n [mergedBounds[0][0], mergedBounds[0][1]],\n [mergedBounds[1][0], mergedBounds[1][1]]\n ];\n isMerged = true;\n }\n\n mergedBounds[0][0] = Math.min(mergedBounds[0][0], bounds[0][0]);\n mergedBounds[0][1] = Math.min(mergedBounds[0][1], bounds[0][1]);\n mergedBounds[1][0] = Math.max(mergedBounds[1][0], bounds[1][0]);\n mergedBounds[1][1] = Math.max(mergedBounds[1][1], bounds[1][1]);\n }\n }\n\n return mergedBounds;\n}\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport log from '../utils/log';\nimport {createMat4, getCameraPosition, getFrustumPlanes, FrustumPlane} from '../utils/math-utils';\n\nimport {Matrix4, Vector3, equals, clamp, mat4} from '@math.gl/core';\n\nimport {\n getDistanceScales,\n getMeterZoom,\n lngLatToWorld,\n worldToLngLat,\n worldToPixels,\n pixelsToWorld\n} from '@math.gl/web-mercator';\n\nimport {PROJECTION_MODE} from '../lib/constants';\n\nexport type DistanceScales = {\n unitsPerMeter: number[];\n metersPerUnit: number[];\n};\n\nexport type Padding = {\n left?: number;\n right?: number;\n top?: number;\n bottom?: number;\n};\n\nexport type ViewportOptions = {\n /** Name of the viewport */\n id?: string;\n /** Left offset from the canvas edge, in pixels */\n x?: number;\n /** Top offset from the canvas edge, in pixels */\n y?: number;\n /** Viewport width in pixels */\n width?: number;\n /** Viewport height in pixels */\n height?: number;\n /** Longitude in degrees (geospatial only) */\n longitude?: number;\n /** Latitude in degrees (geospatial only) */\n latitude?: number;\n /** Viewport center in world space. If geospatial, refers to meter offsets from lng, lat, elevation */\n position?: number[];\n /** Zoom level */\n zoom?: number;\n /** Padding around the viewport, in pixels. */\n padding?: Padding | null;\n distanceScales?: DistanceScales;\n /** Model matrix of viewport center */\n modelMatrix?: number[] | null;\n /** Custom view matrix */\n viewMatrix?: number[];\n /** Custom projection matrix */\n projectionMatrix?: number[];\n /** Modifier of viewport scale. Corresponds to the number of pixels per common unit at zoom 0. */\n focalDistance?: number;\n /** Use orthographic projection */\n orthographic?: boolean;\n /** fovy in radians. If supplied, overrides fovy */\n fovyRadians?: number;\n /** fovy in degrees. */\n fovy?: number;\n /** Near plane of the projection matrix */\n near?: number;\n /** Far plane of the projection matrix */\n far?: number;\n};\n\nconst DEGREES_TO_RADIANS = Math.PI / 180;\n\nconst IDENTITY = createMat4();\n\nconst ZERO_VECTOR = [0, 0, 0];\n\nconst DEFAULT_DISTANCE_SCALES: DistanceScales = {\n unitsPerMeter: [1, 1, 1],\n metersPerUnit: [1, 1, 1]\n};\n\n// / Helpers\nfunction createProjectionMatrix({\n width,\n height,\n orthographic,\n fovyRadians,\n focalDistance,\n padding,\n near,\n far\n}: {\n width: number;\n height: number;\n orthographic: boolean;\n fovyRadians: number;\n focalDistance: number;\n padding: Padding | null;\n near: number;\n far: number;\n}) {\n const aspect = width / height;\n const matrix = orthographic\n ? new Matrix4().orthographic({fovy: fovyRadians, aspect, focalDistance, near, far})\n : new Matrix4().perspective({fovy: fovyRadians, aspect, near, far});\n if (padding) {\n const {left = 0, right = 0, top = 0, bottom = 0} = padding;\n const offsetX = clamp((left + width - right) / 2, 0, width) - width / 2;\n const offsetY = clamp((top + height - bottom) / 2, 0, height) - height / 2;\n // pixels to clip space\n matrix[8] -= (offsetX * 2) / width;\n matrix[9] += (offsetY * 2) / height;\n }\n return matrix;\n}\n\n/**\n * Manages coordinate system transformations.\n *\n * Note: The Viewport is immutable in the sense that it only has accessors.\n * A new viewport instance should be created if any parameters have changed.\n */\nexport default class Viewport {\n static displayName = 'Viewport';\n\n /** Init parameters */\n\n id: string;\n x: number;\n y: number;\n width: number;\n height: number;\n padding?: Padding | null;\n isGeospatial: boolean;\n zoom: number;\n focalDistance: number;\n position: number[];\n modelMatrix: number[] | null;\n\n /** Derived parameters */\n\n // `!` post-fix expression operator asserts that its operand is non-null and non-undefined in contexts\n // where the type checker is unable to conclude that fact.\n\n distanceScales: DistanceScales; /** scale factors between world space and common space */\n scale!: number; /** scale factor, equals 2^zoom */\n center!: number[]; /** viewport center in common space */\n cameraPosition!: number[]; /** Camera position in common space */\n projectionMatrix!: number[];\n viewMatrix!: number[];\n viewMatrixUncentered!: number[];\n viewMatrixInverse!: number[];\n viewProjectionMatrix!: number[];\n pixelProjectionMatrix!: number[];\n pixelUnprojectionMatrix!: number[];\n resolution?: number;\n\n private _frustumPlanes: {[name: string]: FrustumPlane} = {};\n\n // eslint-disable-next-line complexity\n constructor(opts: ViewportOptions = {}) {\n // @ts-ignore\n this.id = opts.id || this.constructor.displayName || 'viewport';\n\n this.x = opts.x || 0;\n this.y = opts.y || 0;\n // Silently allow apps to send in w,h = 0,0\n this.width = opts.width || 1;\n this.height = opts.height || 1;\n this.zoom = opts.zoom || 0;\n this.padding = opts.padding;\n this.distanceScales = opts.distanceScales || DEFAULT_DISTANCE_SCALES;\n this.focalDistance = opts.focalDistance || 1;\n this.position = opts.position || ZERO_VECTOR;\n this.modelMatrix = opts.modelMatrix || null;\n\n const {longitude, latitude} = opts;\n this.isGeospatial = Number.isFinite(latitude) && Number.isFinite(longitude);\n\n this._initProps(opts);\n this._initMatrices(opts);\n\n // Bind methods for easy access\n this.equals = this.equals.bind(this);\n this.project = this.project.bind(this);\n this.unproject = this.unproject.bind(this);\n this.projectPosition = this.projectPosition.bind(this);\n this.unprojectPosition = this.unprojectPosition.bind(this);\n this.projectFlat = this.projectFlat.bind(this);\n this.unprojectFlat = this.unprojectFlat.bind(this);\n }\n\n get subViewports(): Viewport[] | null {\n return null;\n }\n\n get metersPerPixel(): number {\n return this.distanceScales.metersPerUnit[2] / this.scale;\n }\n\n get projectionMode(): number {\n if (this.isGeospatial) {\n return this.zoom < 12\n ? PROJECTION_MODE.WEB_MERCATOR\n : PROJECTION_MODE.WEB_MERCATOR_AUTO_OFFSET;\n }\n return PROJECTION_MODE.IDENTITY;\n }\n\n // Two viewports are equal if width and height are identical, and if\n // their view and projection matrices are (approximately) equal.\n equals(viewport: Viewport): boolean {\n if (!(viewport instanceof Viewport)) {\n return false;\n }\n if (this === viewport) {\n return true;\n }\n\n return (\n viewport.width === this.width &&\n viewport.height === this.height &&\n viewport.scale === this.scale &&\n equals(viewport.projectionMatrix, this.projectionMatrix) &&\n equals(viewport.viewMatrix, this.viewMatrix)\n );\n // TODO - check distance scales?\n }\n\n /**\n * Projects xyz (possibly latitude and longitude) to pixel coordinates in window\n * using viewport projection parameters\n * - [longitude, latitude] to [x, y]\n * - [longitude, latitude, Z] => [x, y, z]\n * Note: By default, returns top-left coordinates for canvas/SVG type render\n *\n * @param {Array} lngLatZ - [lng, lat] or [lng, lat, Z]\n * @param {Object} opts - options\n * @param {Object} opts.topLeft=true - Whether projected coords are top left\n * @return {Array} - [x, y] or [x, y, z] in top left coords\n */\n project(xyz: number[], {topLeft = true}: {topLeft?: boolean} = {}): number[] {\n const worldPosition = this.projectPosition(xyz);\n const coord = worldToPixels(worldPosition, this.pixelProjectionMatrix);\n\n const [x, y] = coord;\n const y2 = topLeft ? y : this.height - y;\n return xyz.length === 2 ? [x, y2] : [x, y2, coord[2]];\n }\n\n /**\n * Unproject pixel coordinates on screen onto world coordinates,\n * (possibly [lon, lat]) on map.\n * - [x, y] => [lng, lat]\n * - [x, y, z] => [lng, lat, Z]\n * @param {Array} xyz -\n * @param {Object} opts - options\n * @param {Object} opts.topLeft=true - Whether origin is top left\n * @return {Array|null} - [lng, lat, Z] or [X, Y, Z]\n */\n unproject(\n xyz: number[],\n {topLeft = true, targetZ}: {topLeft?: boolean; targetZ?: number} = {}\n ): number[] {\n const [x, y, z] = xyz;\n\n const y2 = topLeft ? y : this.height - y;\n const targetZWorld = targetZ && targetZ * this.distanceScales.unitsPerMeter[2];\n const coord = pixelsToWorld([x, y2, z], this.pixelUnprojectionMatrix, targetZWorld);\n const [X, Y, Z] = this.unprojectPosition(coord);\n\n if (Number.isFinite(z)) {\n return [X, Y, Z];\n }\n return Number.isFinite(targetZ) ? [X, Y, targetZ as number] : [X, Y];\n }\n\n // NON_LINEAR PROJECTION HOOKS\n // Used for web meractor projection\n\n projectPosition(xyz: number[]): [number, number, number] {\n const [X, Y] = this.projectFlat(xyz);\n const Z = (xyz[2] || 0) * this.distanceScales.unitsPerMeter[2];\n return [X, Y, Z];\n }\n\n unprojectPosition(xyz: number[]): [number, number, number] {\n const [X, Y] = this.unprojectFlat(xyz);\n const Z = (xyz[2] || 0) * this.distanceScales.metersPerUnit[2];\n return [X, Y, Z];\n }\n\n /**\n * Project [lng,lat] on sphere onto [x,y] on 512*512 Mercator Zoom 0 tile.\n * Performs the nonlinear part of the web mercator projection.\n * Remaining projection is done with 4x4 matrices which also handles\n * perspective.\n * @param {Array} lngLat - [lng, lat] coordinates\n * Specifies a point on the sphere to project onto the map.\n * @return {Array} [x,y] coordinates.\n */\n projectFlat(xyz: number[]): [number, number] {\n if (this.isGeospatial) {\n // Shader clamps latitude to +-89.9, see /shaderlib/project/project.glsl.js\n // lngLatToWorld([0, -89.9])[1] = -317.9934163758329\n // lngLatToWorld([0, 89.9])[1] = 829.9934163758271\n const result = lngLatToWorld(xyz);\n result[1] = clamp(result[1], -318, 830);\n return result;\n }\n return xyz as [number, number];\n }\n\n /**\n * Unproject world point [x,y] on map onto {lat, lon} on sphere\n * @param {object|Vector} xy - object with {x,y} members\n * representing point on projected map plane\n * @return {GeoCoordinates} - object with {lat,lon} of point on sphere.\n * Has toArray method if you need a GeoJSON Array.\n * Per cartographic tradition, lat and lon are specified as degrees.\n */\n unprojectFlat(xyz: number[]): [number, number] {\n if (this.isGeospatial) {\n return worldToLngLat(xyz);\n }\n return xyz as [number, number];\n }\n\n /**\n * Get bounds of the current viewport\n * @return {Array} - [minX, minY, maxX, maxY]\n */\n getBounds(options: {z?: number} = {}): [number, number, number, number] {\n const unprojectOption = {targetZ: options.z || 0};\n\n const topLeft = this.unproject([0, 0], unprojectOption);\n const topRight = this.unproject([this.width, 0], unprojectOption);\n const bottomLeft = this.unproject([0, this.height], unprojectOption);\n const bottomRight = this.unproject([this.width, this.height], unprojectOption);\n\n return [\n Math.min(topLeft[0], topRight[0], bottomLeft[0], bottomRight[0]),\n Math.min(topLeft[1], topRight[1], bottomLeft[1], bottomRight[1]),\n Math.max(topLeft[0], topRight[0], bottomLeft[0], bottomRight[0]),\n Math.max(topLeft[1], topRight[1], bottomLeft[1], bottomRight[1])\n ];\n }\n\n getDistanceScales(coordinateOrigin?: number[]): DistanceScales {\n if (coordinateOrigin && this.isGeospatial) {\n return getDistanceScales({\n longitude: coordinateOrigin[0],\n latitude: coordinateOrigin[1],\n highPrecision: true\n });\n }\n return this.distanceScales;\n }\n\n containsPixel({\n x,\n y,\n width = 1,\n height = 1\n }: {\n x: number;\n y: number;\n width?: number;\n height?: number;\n }): boolean {\n return (\n x < this.x + this.width &&\n this.x < x + width &&\n y < this.y + this.height &&\n this.y < y + height\n );\n }\n\n // Extract frustum planes in common space\n getFrustumPlanes(): {\n left: FrustumPlane;\n right: FrustumPlane;\n bottom: FrustumPlane;\n top: FrustumPlane;\n near: FrustumPlane;\n far: FrustumPlane;\n } {\n if (this._frustumPlanes.near) {\n // @ts-ignore\n return this._frustumPlanes;\n }\n\n Object.assign(this._frustumPlanes, getFrustumPlanes(this.viewProjectionMatrix));\n\n // @ts-ignore\n return this._frustumPlanes;\n }\n\n // EXPERIMENTAL METHODS\n\n /**\n * Needed by panning and linear transition\n * Pan the viewport to place a given world coordinate at screen point [x, y]\n *\n * @param {Array} coords - world coordinates\n * @param {Array} pixel - [x,y] coordinates on screen\n * @param {Array} startPixel - [x,y] screen position where pan started (optional, for delta-based panning)\n * @return {Object} props of the new viewport\n */\n panByPosition(coords: number[], pixel: number[], startPixel?: number[]): any {\n return null;\n }\n\n // INTERNAL METHODS\n\n /* eslint-disable complexity, max-statements */\n private _initProps(opts: ViewportOptions) {\n const longitude = opts.longitude as number;\n const latitude = opts.latitude as number;\n\n if (this.isGeospatial) {\n if (!Number.isFinite(opts.zoom)) {\n this.zoom = getMeterZoom({latitude}) + Math.log2(this.focalDistance);\n }\n this.distanceScales = opts.distanceScales || getDistanceScales({latitude, longitude});\n }\n const scale = Math.pow(2, this.zoom);\n this.scale = scale;\n\n const {position, modelMatrix} = opts;\n let meterOffset: number[] = ZERO_VECTOR;\n if (position) {\n meterOffset = modelMatrix\n ? (new Matrix4(modelMatrix).transformAsVector(position, []) as number[])\n : position;\n }\n\n if (this.isGeospatial) {\n // Determine camera center in common space\n const center = this.projectPosition([longitude, latitude, 0]);\n\n this.center = new Vector3(meterOffset)\n // Convert to pixels in current zoom\n .scale(this.distanceScales.unitsPerMeter)\n .add(center);\n } else {\n this.center = this.projectPosition(meterOffset);\n }\n }\n /* eslint-enable complexity, max-statements */\n\n private _initMatrices(opts: ViewportOptions) {\n const {\n // View matrix\n viewMatrix = IDENTITY,\n // Projection matrix\n projectionMatrix = null,\n\n // Projection matrix parameters, used if projectionMatrix not supplied\n orthographic = false,\n fovyRadians,\n fovy = 75,\n near = 0.1, // Distance of near clipping plane\n far = 1000, // Distance of far clipping plane\n padding = null, // Center offset in pixels\n focalDistance = 1\n } = opts;\n\n this.viewMatrixUncentered = viewMatrix;\n // Make a centered version of the matrix for projection modes without an offset\n this.viewMatrix = new Matrix4()\n // Apply the uncentered view matrix\n .multiplyRight(viewMatrix)\n // And center it\n .translate(new Vector3(this.center).negate());\n\n this.projectionMatrix =\n projectionMatrix ||\n createProjectionMatrix({\n width: this.width,\n height: this.height,\n orthographic,\n fovyRadians: fovyRadians || fovy * DEGREES_TO_RADIANS,\n focalDistance,\n padding,\n near,\n far\n });\n\n // Note: As usual, matrix operations should be applied in \"reverse\" order\n // since vectors will be multiplied in from the right during transformation\n const vpm = createMat4();\n mat4.multiply(vpm, vpm, this.projectionMatrix);\n mat4.multiply(vpm, vpm, this.viewMatrix);\n this.viewProjectionMatrix = vpm;\n\n // console.log('VPM', this.viewMatrix, this.projectionMatrix, this.viewProjectionMatrix);\n\n // Calculate inverse view matrix\n this.viewMatrixInverse = mat4.invert([], this.viewMatrix) || this.viewMatrix;\n\n // Decompose camera parameters\n this.cameraPosition = getCameraPosition(this.viewMatrixInverse);\n\n /*\n * Builds matrices that converts preprojected lngLats to screen pixels\n * and vice versa.\n * Note: Currently returns bottom-left coordinates!\n * Note: Starts with the GL projection matrix and adds steps to the\n * scale and translate that matrix onto the window.\n * Note: WebGL controls clip space to screen projection with gl.viewport\n * and does not need this step.\n */\n\n // matrix for conversion from world location to screen (pixel) coordinates\n const viewportMatrix = createMat4(); // matrix from NDC to viewport.\n const pixelProjectionMatrix = createMat4(); // matrix from world space to viewport.\n mat4.scale(viewportMatrix, viewportMatrix, [this.width / 2, -this.height / 2, 1]);\n mat4.translate(viewportMatrix, viewportMatrix, [1, -1, 0]);\n mat4.multiply(pixelProjectionMatrix, viewportMatrix, this.viewProjectionMatrix);\n this.pixelProjectionMatrix = pixelProjectionMatrix;\n\n this.pixelUnprojectionMatrix = mat4.invert(createMat4(), this.pixelProjectionMatrix);\n if (!this.pixelUnprojectionMatrix) {\n log.warn('Pixel project matrix not invertible')();\n // throw new Error('Pixel project matrix not invertible');\n }\n }\n}\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport log from '../utils/log';\nimport {Pan, InputDirection, Pinch, Tap} from 'mjolnir.js';\nimport type {PanRecognizerOptions, PinchRecognizerOptions, TapRecognizerOptions} from 'mjolnir.js';\n\n/**\n * The coordinate system that positions/dimensions are defined in.\n */\nexport type CoordinateSystem =\n | 'default'\n | 'lnglat'\n | 'meter-offsets'\n | 'lnglat-offsets'\n | 'cartesian';\n\n/**\n * The coordinate system that positions/dimensions are defined in.\n * String constants are the public API.\n * @deprecated Use string constants directly.\n */\nexport const COORDINATE_SYSTEM = {\n /**\n * `LNGLAT` if rendering into a geospatial viewport, `CARTESIAN` otherwise\n */\n DEFAULT: 'default',\n /**\n * Positions are interpreted as [longitude, latitude, elevation]\n * longitude/latitude are in degrees, elevation is in meters.\n * Dimensions are in meters.\n */\n LNGLAT: 'lnglat',\n\n /**\n * Positions are interpreted as [x, y, z] in meter offsets from the coordinate origin.\n * Dimensions are in meters.\n */\n METER_OFFSETS: 'meter-offsets',\n\n /**\n * Positions are interpreted as [deltaLng, deltaLat, elevation] from the coordinate origin.\n * deltaLng/deltaLat are in degrees, elevation is in meters.\n * Dimensions are in meters.\n */\n LNGLAT_OFFSETS: 'lnglat-offsets',\n\n /**\n * Positions and dimensions are in the common units of the viewport.\n */\n CARTESIAN: 'cartesian'\n} as const;\n\n// Deprecated\n/* eslint-disable accessor-pairs */\nObject.defineProperty(COORDINATE_SYSTEM, 'IDENTITY', {\n get: () => {\n log.deprecated('COORDINATE_SYSTEM.IDENTITY', 'COORDINATE_SYSTEM.CARTESIAN')();\n return COORDINATE_SYSTEM.CARTESIAN;\n }\n});\n/* eslint-enable accessor-pairs */\n\n/**\n * How coordinates are transformed from the world space into the common space.\n */\nexport const PROJECTION_MODE = {\n /**\n * Render geospatial data in Web Mercator projection\n */\n WEB_MERCATOR: 1,\n /**\n * Render geospatial data as a 3D globe\n */\n GLOBE: 2,\n\n /**\n * (Internal use only) Web Mercator projection at high zoom\n */\n WEB_MERCATOR_AUTO_OFFSET: 4,\n\n /**\n * No transformation\n */\n IDENTITY: 0\n} as const;\n\nexport const UNIT = {\n common: 0,\n meters: 1,\n pixels: 2\n} as const;\n\nexport const EVENT_HANDLERS = {\n click: 'onClick',\n dblclick: 'onClick',\n panstart: 'onDragStart',\n panmove: 'onDrag',\n panend: 'onDragEnd'\n} as const satisfies {[eventName: string]: string};\n\nexport const RECOGNIZERS = {\n multipan: [Pan, {threshold: 10, direction: InputDirection.Vertical, pointers: 2}],\n pinch: [Pinch, {}, null, ['multipan']],\n pan: [Pan, {threshold: 1}, ['pinch'], ['multipan']],\n dblclick: [Tap, {event: 'dblclick', taps: 2}],\n click: [Tap, {event: 'click'}, null, ['dblclick']]\n} as const;\n\nexport type RecognizerOptions = {\n pinch?: Omit<PinchRecognizerOptions, 'event' | 'enable'>;\n multipan?: Omit<PanRecognizerOptions, 'event' | 'enable'>;\n pan?: Omit<PanRecognizerOptions, 'event' | 'enable'>;\n dblclick?: Omit<TapRecognizerOptions, 'event' | 'enable'>;\n click?: Omit<TapRecognizerOptions, 'event' | 'enable'>;\n};\n\n/**\n * @deprecated Use string constants directly\n */\nexport const OPERATION = {\n DRAW: 'draw',\n MASK: 'mask',\n TERRAIN: 'terrain'\n} as const;\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n// View and Projection Matrix calculations for mapbox-js style\n// map view properties\nimport Viewport from './viewport';\n\nimport {\n pixelsToWorld,\n getViewMatrix,\n addMetersToLngLat,\n unitsPerMeter,\n getProjectionParameters,\n altitudeToFovy,\n fovyToAltitude,\n fitBounds,\n getBounds\n} from '@math.gl/web-mercator';\nimport {Padding} from './viewport';\n\nimport {Matrix4, clamp, vec2} from '@math.gl/core';\n\nexport type WebMercatorViewportOptions = {\n /** Name of the viewport */\n id?: string;\n /** Left offset from the canvas edge, in pixels */\n x?: number;\n /** Top offset from the canvas edge, in pixels */\n y?: number;\n /** Viewport width in pixels */\n width?: number;\n /** Viewport height in pixels */\n height?: number;\n /** Longitude in degrees */\n longitude?: number;\n /** Latitude in degrees */\n latitude?: number;\n /** Tilt of the camera in degrees */\n pitch?: number;\n /** Heading of the camera in degrees */\n bearing?: number;\n /** Camera altitude relative to the viewport height, legacy property used to control the FOV. Default `1.5` */\n altitude?: number;\n /** Camera fovy in degrees. If provided, overrides `altitude` */\n fovy?: number;\n /** Viewport center in world space. If geospatial, refers to meter offsets from lng, lat, elevation */\n position?: number[];\n /** Zoom level */\n zoom?: number;\n /** Padding around the viewport, in pixels. */\n padding?: Padding | null;\n /** Model matrix of viewport center */\n modelMatrix?: number[] | null;\n /** Custom projection matrix */\n projectionMatrix?: number[];\n /** Use orthographic projection */\n orthographic?: boolean;\n /** Scaler for the near plane, 1 unit equals to the height of the viewport. Default `0.1` */\n nearZMultiplier?: number;\n /** Scaler for the far plane, 1 unit equals to the distance from the camera to the edge of the screen. Default `1.01` */\n farZMultiplier?: number;\n /** Optionally override the near plane position. `nearZMultiplier` is ignored if `nearZ` is supplied. */\n nearZ?: number;\n /** Optionally override the far plane position. `farZMultiplier` is ignored if `farZ` is supplied. */\n farZ?: number;\n /** Render multiple copies of the world */\n repeat?: boolean;\n /** Internal use */\n worldOffset?: number;\n /** @deprecated Revert to approximated meter size calculation prior to v8.5 */\n legacyMeterSizes?: boolean;\n};\n\n/**\n * Manages transformations to/from WGS84 coordinates using the Web Mercator Projection.\n */\nexport default class WebMercatorViewport extends Viewport {\n static displayName = 'WebMercatorViewport';\n\n longitude: number;\n latitude: number;\n pitch: number;\n bearing: number;\n altitude: number;\n fovy: number;\n orthographic: boolean;\n\n /** Each sub viewport renders one copy of the world if repeat:true. The list is generated and cached on first request. */\n private _subViewports: WebMercatorViewport[] | null;\n /** @deprecated Revert to approximated meter size calculation prior to v8.5 */\n private _pseudoMeters: boolean;\n\n /* eslint-disable complexity, max-statements */\n constructor(opts: WebMercatorViewportOptions = {}) {\n const {\n latitude = 0,\n longitude = 0,\n zoom = 0,\n pitch = 0,\n bearing = 0,\n nearZMultiplier = 0.1,\n farZMultiplier = 1.01,\n nearZ,\n farZ,\n orthographic = false,\n projectionMatrix,\n\n repeat = false,\n worldOffset = 0,\n position,\n padding,\n\n // backward compatibility\n // TODO: remove in v9\n legacyMeterSizes = false\n } = opts;\n\n let {width, height, altitude = 1.5} = opts;\n const scale = Math.pow(2, zoom);\n\n // Silently allow apps to send in 0,0 to facilitate isomorphic render etc\n width = width || 1;\n height = height || 1;\n\n let fovy;\n let projectionParameters: any = null;\n if (projectionMatrix) {\n altitude = projectionMatrix[5] / 2;\n fovy = altitudeToFovy(altitude);\n } else {\n if (opts.fovy) {\n fovy = opts.fovy;\n altitude = fovyToAltitude(fovy);\n } else {\n fovy = altitudeToFovy(altitude);\n }\n\n let offset: [number, number] | undefined;\n if (padding) {\n const {top = 0, bottom = 0} = padding;\n offset = [0, clamp((top + height - bottom) / 2, 0, height) - height / 2];\n }\n\n projectionParameters = getProjectionParameters({\n width,\n height,\n scale,\n center: position && [0, 0, position[2] * unitsPerMeter(latitude)],\n offset,\n pitch,\n fovy,\n nearZMultiplier,\n farZMultiplier\n });\n\n if (Number.isFinite(nearZ)) {\n projectionParameters.near = nearZ;\n }\n if (Number.isFinite(farZ)) {\n projectionParameters.far = farZ;\n }\n }\n\n // The uncentered matrix allows us two move the center addition to the\n // shader (cheap) which gives a coordinate system that has its center in\n // the layer's center position. This makes rotations and other modelMatrx\n // transforms much more useful.\n let viewMatrixUncentered = getViewMatrix({\n height,\n pitch,\n bearing,\n scale,\n altitude\n });\n\n if (worldOffset) {\n const viewOffset = new Matrix4().translate([512 * worldOffset, 0, 0]);\n viewMatrixUncentered = viewOffset.multiplyLeft(viewMatrixUncentered);\n }\n\n super({\n ...opts,\n // x, y,\n width,\n height,\n\n // view matrix\n viewMatrix: viewMatrixUncentered,\n longitude,\n latitude,\n zoom,\n\n // projection matrix parameters\n ...projectionParameters,\n fovy,\n focalDistance: altitude\n });\n\n // Save parameters\n this.latitude = latitude;\n this.longitude = longitude;\n this.zoom = zoom;\n this.pitch = pitch;\n this.bearing = bearing;\n this.altitude = altitude;\n this.fovy = fovy;\n\n this.orthographic = orthographic;\n\n this._subViewports = repeat ? [] : null;\n this._pseudoMeters = legacyMeterSizes;\n\n Object.freeze(this);\n }\n /* eslint-enable complexity, max-statements */\n\n get subViewports(): WebMercatorViewport[] | null {\n if (this._subViewports && !this._subViewports.length) {\n // Cache sub viewports so that we only calculate them once\n const bounds = this.getBounds();\n\n const minOffset = Math.floor((bounds[0] + 180) / 360);\n const maxOffset = Math.ceil((bounds[2] - 180) / 360);\n\n for (let x = minOffset; x <= maxOffset; x++) {\n const offsetViewport = x\n ? new WebMercatorViewport({\n ...this,\n worldOffset: x\n })\n : this;\n this._subViewports.push(offsetViewport);\n }\n }\n return this._subViewports;\n }\n\n projectPosition(xyz: number[]): [number, number, number] {\n if (this._pseudoMeters) {\n // Backward compatibility\n return super.projectPosition(xyz);\n }\n const [X, Y] = this.projectFlat(xyz);\n const Z = (xyz[2] || 0) * unitsPerMeter(xyz[1]);\n return [X, Y, Z];\n }\n\n unprojectPosition(xyz: number[]): [number, number, number] {\n if (this._pseudoMeters) {\n // Backward compatibility\n return super.unprojectPosition(xyz);\n }\n const [X, Y] = this.unprojectFlat(xyz);\n const Z = (xyz[2] || 0) / unitsPerMeter(Y);\n return [X, Y, Z];\n }\n\n /**\n * Add a meter delta to a base lnglat coordinate, returning a new lnglat array\n *\n * Note: Uses simple linear approximation around the viewport center\n * Error increases with size of offset (roughly 1% per 100km)\n *\n * @param {[Number,Number]|[Number,Number,Number]) lngLatZ - base coordinate\n * @param {[Number,Number]|[Number,Number,Number]) xyz - array of meter deltas\n * @return {[Number,Number]|[Number,Number,Number]) array of [lng,lat,z] deltas\n */\n addMetersToLngLat(lngLatZ: number[], xyz: number[]): number[] {\n return addMetersToLngLat(lngLatZ, xyz);\n }\n\n panByPosition(\n coords: number[],\n pixel: number[],\n startPixel?: number[]\n ): WebMercatorViewportOptions {\n const fromLocation = pixelsToWorld(pixel, this.pixelUnprojectionMatrix);\n const toLocation = this.projectFlat(coords);\n\n const translate = vec2.add([], toLocation, vec2.negate([], fromLocation));\n const newCenter = vec2.add([], this.center, translate);\n\n const [longitude, latitude] = this.unprojectFlat(newCenter);\n return {longitude, latitude};\n }\n\n /**\n * Returns a new longitude and latitude that keeps a 3D world coordinate at a given screen pixel\n * This version handles the z-component (altitude) properly for cameras positioned above ground\n */\n panByPosition3D(coords: number[], pixel: number[]): WebMercatorViewportOptions {\n const targetZ = coords[2] || 0;\n const deltaLngLat = vec2.sub([], coords, this.unproject(pixel, {targetZ}));\n return {longitude: this.longitude + deltaLngLat[0], latitude: this.latitude + deltaLngLat[1]};\n }\n\n getBounds(options: {z?: number} = {}): [number, number, number, number] {\n // @ts-ignore\n const corners = getBounds(this, options.z || 0);\n\n return [\n Math.min(corners[0][0], corners[1][0], corners[2][0], corners[3][0]),\n Math.min(corners[0][1], corners[1][1], corners[2][1], corners[3][1]),\n Math.max(corners[0][0], corners[1][0], corners[2][0], corners[3][0]),\n Math.max(corners[0][1], corners[1][1], corners[2][1], corners[3][1])\n ];\n }\n\n /**\n * Returns a new viewport that fit around the given rectangle.\n * Only supports non-perspective mode.\n */\n fitBounds(\n /** [[lon, lat], [lon, lat]] */\n bounds: [[number, number], [number, number]],\n options: {\n /** If not supplied, will use the current width of the viewport (default `1`) */\n width?: number;\n /** If not supplied, will use the current height of the viewport (default `1`) */\n height?: number;\n /** In degrees, 0.01 would be about 1000 meters */\n minExtent?: number;\n /** Max zoom level */\n maxZoom?: number;\n /** Extra padding in pixels */\n padding?: number | Required<Padding>;\n /** Center shift in pixels */\n offset?: number[];\n } = {}\n ) {\n const {width, height} = this;\n const {longitude, latitude, zoom} = fitBounds({width, height, bounds, ...options});\n return new WebMercatorViewport({width, height, longitude, latitude, zoom});\n }\n}\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {clamp} from '@math.gl/core';\nimport Controller, {ControllerProps, InteractionState} from './controller';\nimport ViewState from './view-state';\nimport {worldToLngLat, lngLatToWorld as _lngLatToWorld} from '@math.gl/web-mercator';\nimport assert from '../utils/assert';\nimport {mod} from '../utils/math-utils';\n\nimport LinearInterpolator from '../transitions/linear-interpolator';\nimport type Viewport from '../viewports/viewport';\n\nconst PITCH_MOUSE_THRESHOLD = 5;\nconst PITCH_ACCEL = 1.2;\nconst WEB_MERCATOR_TILE_SIZE = 512;\nconst WEB_MERCATOR_MAX_BOUNDS = [\n [-Infinity, -90],\n [Infinity, 90]\n] satisfies ControllerProps['maxBounds'];\n\n/** The web mercator utility `lngLatToWorld` throws if invalid coordinates are provided.\n * This wrapper clamps user input to calculate common positions safely. */\nfunction lngLatToWorld([lng, lat]: number[]): number[] {\n if (Math.abs(lat) > 90) {\n lat = Math.sign(lat) * 90;\n }\n if (Number.isFinite(lng)) {\n const [x, y] = _lngLatToWorld([lng, lat]);\n return [x, clamp(y, 0, WEB_MERCATOR_TILE_SIZE)];\n }\n const [, y] = _lngLatToWorld([0, lat]);\n return [lng, clamp(y, 0, WEB_MERCATOR_TILE_SIZE)];\n}\n\nexport type MapStateProps = {\n /** Mapbox viewport properties */\n /** The width of the viewport */\n width: number;\n /** The height of the viewport */\n height: number;\n /** The latitude at the center of the viewport */\n latitude: number;\n /** The longitude at the center of the viewport */\n longitude: number;\n /** The tile zoom level of the map. */\n zoom: number;\n /** The bearing of the viewport in degrees */\n bearing?: number;\n /** The pitch of the viewport in degrees */\n pitch?: number;\n /**\n * Specify the altitude of the viewport camera\n * Unit: map heights, default 1.5\n * Non-public API, see https://github.com/mapbox/mapbox-gl-js/issues/1137\n */\n altitude?: number;\n /** Viewport position */\n position?: [number, number, number];\n\n /** Viewport constraints */\n maxZoom?: number;\n minZoom?: number;\n maxPitch?: number;\n minPitch?: number;\n\n /** Normalize viewport props to fit map height into viewport. Default `true` */\n normalize?: boolean;\n\n maxBounds?: ControllerProps['maxBounds'];\n};\n\nexport type MapStateInternal = {\n /** Interaction states, required to calculate change during transform */\n /* The point on map being grabbed when the operation first started */\n startPanLngLat?: [number, number];\n /* Center of the zoom when the operation first started */\n startZoomLngLat?: [number, number];\n /* Pointer position when rotation started */\n startRotatePos?: [number, number];\n /* The lng/lat/altitude point at the rotation pivot (where rotation started) */\n startRotateLngLat?: [number, number, number];\n /** Bearing when current perspective rotate operation started */\n startBearing?: number;\n /** Pitch when current perspective rotate operation started */\n startPitch?: number;\n /** Zoom when current zoom operation started */\n startZoom?: number;\n};\n\n/* Utils */\n\nexport class MapState extends ViewState<MapState, MapStateProps, MapStateInternal> {\n /* get optional altitude for rotation pivot\n * - undefined: rotate around viewport center (no pivot point)\n * - 0: rotate around pointer position at ground level\n * - other value: rotate around pointer position at specified altitude\n */\n getAltitude?: (pos: [number, number]) => number | undefined;\n\n constructor(\n options: MapStateProps &\n MapStateInternal & {\n makeViewport: (props: Record<string, any>) => Viewport;\n getAltitude?: (pos: [number, number]) => number | undefined;\n }\n ) {\n const {\n /** Mapbox viewport properties */\n /** The width of the viewport */\n width,\n /** The height of the viewport */\n height,\n /** The latitude at the center of the viewport */\n latitude,\n /** The longitude at the center of the viewport */\n longitude,\n /** The tile zoom level of the map. */\n zoom,\n /** The bearing of the viewport in degrees */\n bearing = 0,\n /** The pitch of the viewport in degrees */\n pitch = 0,\n /**\n * Specify the altitude of the viewport camera\n * Unit: map heights, default 1.5\n * Non-public API, see https://github.com/mapbox/mapbox-gl-js/issues/1137\n */\n altitude = 1.5,\n /** Viewport position */\n position = [0, 0, 0],\n\n /** Viewport constraints */\n maxZoom = 20,\n minZoom = 0,\n maxPitch = 60,\n minPitch = 0,\n\n /** Interaction states, required to calculate change during transform */\n /* The point on map being grabbed when the operation first started */\n startPanLngLat,\n /* Center of the zoom when the operation first started */\n startZoomLngLat,\n /* Pointer position when rotation started */\n startRotatePos,\n /* The lng/lat point at the rotation pivot (where rotation started) */\n startRotateLngLat,\n /** Bearing when current perspective rotate operation started */\n startBearing,\n /** Pitch when current perspective rotate operation started */\n startPitch,\n /** Zoom when current zoom operation started */\n startZoom,\n\n /** Normalize viewport props to fit map height into viewport */\n normalize = true\n } = options;\n\n assert(Number.isFinite(longitude)); // `longitude` must be supplied\n assert(Number.isFinite(latitude)); // `latitude` must be supplied\n assert(Number.isFinite(zoom)); // `zoom` must be supplied\n\n const maxBounds = options.maxBounds || (normalize ? WEB_MERCATOR_MAX_BOUNDS : null);\n\n super(\n {\n width,\n height,\n latitude,\n longitude,\n zoom,\n bearing,\n pitch,\n altitude,\n maxZoom,\n minZoom,\n maxPitch,\n minPitch,\n normalize,\n position,\n maxBounds\n },\n {\n startPanLngLat,\n startZoomLngLat,\n startRotatePos,\n startRotateLngLat,\n startBearing,\n startPitch,\n startZoom\n },\n options.makeViewport\n );\n\n this.getAltitude = options.getAltitude;\n }\n\n /**\n * Start panning\n * @param {[Number, Number]} pos - position on screen where the pointer grabs\n */\n panStart({pos}: {pos: [number, number]}): MapState {\n return this._getUpdatedState({\n startPanLngLat: this._unproject(pos)\n });\n }\n\n /**\n * Pan\n * @param {[Number, Number]} pos - position on screen where the pointer is\n * @param {[Number, Number], optional} startPos - where the pointer grabbed at\n * the start of the operation. Must be supplied of `panStart()` was not called\n */\n pan({pos, startPos}: {pos: [number, number]; startPos?: [number, number]}): MapState {\n const startPanLngLat = this.getState().startPanLngLat || this._unproject(startPos);\n\n if (!startPanLngLat) {\n return this;\n }\n\n const viewport = this.makeViewport(this.getViewportProps());\n const newProps = viewport.panByPosition(startPanLngLat, pos);\n\n return this._getUpdatedState(newProps);\n }\n\n /**\n * End panning\n * Must call if `panStart()` was called\n */\n panEnd(): MapState {\n return this._getUpdatedState({\n startPanLngLat: null\n });\n }\n\n /**\n * Start rotating\n * @param {[Number, Number]} pos - position on screen where the center is\n */\n rotateStart({pos}: {pos: [number, number]}): MapState {\n const altitude = this.getAltitude?.(pos);\n\n return this._getUpdatedState({\n startRotatePos: pos,\n startRotateLngLat: altitude !== undefined ? this._unproject3D(pos, altitude) : undefined,\n startBearing: this.getViewportProps().bearing,\n startPitch: this.getViewportProps().pitch\n });\n }\n\n /**\n * Rotate\n * @param {[Number, Number]} pos - position on screen where the center is\n */\n rotate({\n pos,\n deltaAngleX = 0,\n deltaAngleY = 0\n }: {\n pos?: [number, number];\n deltaAngleX?: number;\n deltaAngleY?: number;\n }): MapState {\n const {startRotatePos, startRotateLngLat, startBearing, startPitch} = this.getState();\n\n if (!startRotatePos || startBearing === undefined || startPitch === undefined) {\n return this;\n }\n let newRotation;\n if (pos) {\n newRotation = this._getNewRotation(pos, startRotatePos, startPitch, startBearing);\n } else {\n newRotation = {\n bearing: startBearing + deltaAngleX,\n pitch: startPitch + deltaAngleY\n };\n }\n\n // If we have a pivot point, adjust the camera position to keep the pivot point fixed\n if (startRotateLngLat) {\n const rotatedViewport = this.makeViewport({\n ...this.getViewportProps(),\n ...newRotation\n });\n // Use panByPosition3D if available (WebMercatorViewport), otherwise fall back to panByPosition\n const panMethod = 'panByPosition3D' in rotatedViewport ? 'panByPosition3D' : 'panByPosition';\n return this._getUpdatedState({\n ...newRotation,\n ...rotatedViewport[panMethod](startRotateLngLat, startRotatePos)\n });\n }\n\n return this._getUpdatedState(newRotation);\n }\n\n /**\n * End rotating\n * Must call if `rotateStart()` was called\n */\n rotateEnd(): MapState {\n return this._getUpdatedState({\n startRotatePos: null,\n startRotateLngLat: null,\n startBearing: null,\n startPitch: null\n });\n }\n\n /**\n * Start zooming\n * @param {[Number, Number]} pos - position on screen where the center is\n */\n zoomStart({pos}: {pos: [number, number]}): MapState {\n return this._getUpdatedState({\n startZoomLngLat: this._unproject(pos),\n startZoom: this.getViewportProps().zoom\n });\n }\n\n /**\n * Zoom\n * @param {[Number, Number]} pos - position on screen where the current center is\n * @param {[Number, Number]} startPos - the center position at\n * the start of the operation. Must be supplied of `zoomStart()` was not called\n * @param {Number} scale - a number between [0, 1] specifying the accumulated\n * relative scale.\n */\n zoom({\n pos,\n startPos,\n scale\n }: {\n pos: [number, number];\n startPos?: [number, number];\n scale: number;\n }): MapState {\n // Make sure we zoom around the current mouse position rather than map center\n let {startZoom, startZoomLngLat} = this.getState();\n\n if (!startZoomLngLat) {\n // We have two modes of zoom:\n // scroll zoom that are discrete events (transform from the current zoom level),\n // and pinch zoom that are continuous events (transform from the zoom level when\n // pinch started).\n // If startZoom state is defined, then use the startZoom state;\n // otherwise assume discrete zooming\n startZoom = this.getViewportProps().zoom;\n startZoomLngLat = this._unproject(startPos) || this._unproject(pos);\n }\n if (!startZoomLngLat) {\n return this;\n }\n\n const zoom = this._constrainZoom((startZoom as number) + Math.log2(scale));\n const zoomedViewport = this.makeViewport({...this.getViewportProps(), zoom});\n\n return this._getUpdatedState({\n zoom,\n ...zoomedViewport.panByPosition(startZoomLngLat, pos)\n });\n }\n\n /**\n * End zooming\n * Must call if `zoomStart()` was called\n */\n zoomEnd(): MapState {\n return this._getUpdatedState({\n startZoomLngLat: null,\n startZoom: null\n });\n }\n\n zoomIn(speed: number = 2): MapState {\n return this._zoomFromCenter(speed);\n }\n\n zoomOut(speed: number = 2): MapState {\n return this._zoomFromCenter(1 / speed);\n }\n\n moveLeft(speed: number = 100): MapState {\n return this._panFromCenter([speed, 0]);\n }\n\n moveRight(speed: number = 100): MapState {\n return this._panFromCenter([-speed, 0]);\n }\n\n moveUp(speed: number = 100): MapState {\n return this._panFromCenter([0, speed]);\n }\n\n moveDown(speed: number = 100): MapState {\n return this._panFromCenter([0, -speed]);\n }\n\n rotateLeft(speed: number = 15): MapState {\n return this._getUpdatedState({\n bearing: this.getViewportProps().bearing - speed\n });\n }\n\n rotateRight(speed: number = 15): MapState {\n return this._getUpdatedState({\n bearing: this.getViewportProps().bearing + speed\n });\n }\n\n rotateUp(speed: number = 10): MapState {\n return this._getUpdatedState({\n pitch: this.getViewportProps().pitch + speed\n });\n }\n\n rotateDown(speed: number = 10): MapState {\n return this._getUpdatedState({\n pitch: this.getViewportProps().pitch - speed\n });\n }\n\n shortestPathFrom(viewState: MapState): MapStateProps {\n // const endViewStateProps = new this.ControllerState(endProps).shortestPathFrom(startViewstate);\n const fromProps = viewState.getViewportProps();\n const props = {...this.getViewportProps()};\n const {bearing, longitude} = props;\n\n if (Math.abs(bearing - fromProps.bearing) > 180) {\n props.bearing = bearing < 0 ? bearing + 360 : bearing - 360;\n }\n if (Math.abs(longitude - fromProps.longitude) > 180) {\n props.longitude = longitude < 0 ? longitude + 360 : longitude - 360;\n }\n return props;\n }\n\n // Apply any constraints (mathematical or defined by _viewportProps) to map state\n applyConstraints(props: Required<MapStateProps>): Required<MapStateProps> {\n // Ensure pitch is within specified range\n const {maxPitch, minPitch, pitch, longitude, bearing, normalize, maxBounds} = props;\n\n if (normalize) {\n if (longitude < -180 || longitude > 180) {\n props.longitude = mod(longitude + 180, 360) - 180;\n }\n if (bearing < -180 || bearing > 180) {\n props.bearing = mod(bearing + 180, 360) - 180;\n }\n }\n props.pitch = clamp(pitch, minPitch, maxPitch);\n\n props.zoom = this._constrainZoom(props.zoom, props);\n\n if (maxBounds) {\n const bl = lngLatToWorld(maxBounds[0]);\n const tr = lngLatToWorld(maxBounds[1]);\n // calculate center and zoom ranges at pitch=0 and bearing=0\n // to maintain visual stability when rotating\n const scale = 2 ** props.zoom;\n const halfWidth = props.width / 2 / scale;\n const halfHeight = props.height / 2 / scale;\n const [minLng, minLat] = worldToLngLat([bl[0] + halfWidth, bl[1] + halfHeight]);\n const [maxLng, maxLat] = worldToLngLat([tr[0] - halfWidth, tr[1] - halfHeight]);\n props.longitude = clamp(props.longitude, minLng, maxLng);\n props.latitude = clamp(props.latitude, minLat, maxLat);\n }\n\n return props;\n }\n\n /* Private methods */\n\n _constrainZoom(zoom: number, props?: Required<MapStateProps>): number {\n props ||= this.getViewportProps();\n const {maxZoom, maxBounds} = props;\n\n const shouldApplyMaxBounds = maxBounds !== null && props.width > 0 && props.height > 0;\n let {minZoom} = props;\n\n if (shouldApplyMaxBounds) {\n const bl = lngLatToWorld(maxBounds[0]);\n const tr = lngLatToWorld(maxBounds[1]);\n const w = tr[0] - bl[0];\n const h = tr[1] - bl[1];\n // ignore bound size of 0 or Infinity\n if (Number.isFinite(w) && w > 0) {\n minZoom = Math.max(minZoom, Math.log2(props.width / w));\n }\n if (Number.isFinite(h) && h > 0) {\n minZoom = Math.max(minZoom, Math.log2(props.height / h));\n }\n if (minZoom > maxZoom) minZoom = maxZoom;\n }\n return clamp(zoom, minZoom, maxZoom);\n }\n\n _zoomFromCenter(scale) {\n const {width, height} = this.getViewportProps();\n return this.zoom({\n pos: [width / 2, height / 2],\n scale\n });\n }\n\n _panFromCenter(offset) {\n const {width, height} = this.getViewportProps();\n return this.pan({\n startPos: [width / 2, height / 2],\n pos: [width / 2 + offset[0], height / 2 + offset[1]]\n });\n }\n\n _getUpdatedState(newProps): MapState {\n // @ts-ignore\n return new this.constructor({\n makeViewport: this.makeViewport,\n ...this.getViewportProps(),\n ...this.getState(),\n ...newProps\n });\n }\n\n _unproject(pos?: [number, number]): [number, number] | undefined {\n const viewport = this.makeViewport(this.getViewportProps());\n // @ts-ignore\n return pos && viewport.unproject(pos);\n }\n\n _unproject3D(pos: [number, number], altitude: number): [number, number, number] {\n const viewport = this.makeViewport(this.getViewportProps());\n return viewport.unproject(pos, {targetZ: altitude}) as [number, number, number];\n }\n\n _getNewRotation(\n pos: [number, number],\n startPos: [number, number],\n startPitch: number,\n startBearing: number\n ): {\n pitch: number;\n bearing: number;\n } {\n const deltaX = pos[0] - startPos[0];\n const deltaY = pos[1] - startPos[1];\n const centerY = pos[1];\n const startY = startPos[1];\n const {width, height} = this.getViewportProps();\n\n const deltaScaleX = deltaX / width;\n let deltaScaleY = 0;\n\n if (deltaY > 0) {\n if (Math.abs(height - startY) > PITCH_MOUSE_THRESHOLD) {\n // Move from 0 to -1 as we drag upwards\n deltaScaleY = (deltaY / (startY - height)) * PITCH_ACCEL;\n }\n } else if (deltaY < 0) {\n if (startY > PITCH_MOUSE_THRESHOLD) {\n // Move from 0 to 1 as we drag upwards\n deltaScaleY = 1 - centerY / startY;\n }\n }\n // clamp deltaScaleY to [-1, 1] so that rotation is constrained between minPitch and maxPitch.\n // deltaScaleX does not need to be clamped as bearing does not have constraints.\n deltaScaleY = clamp(deltaScaleY, -1, 1);\n\n const {minPitch, maxPitch} = this.getViewportProps();\n\n const bearing = startBearing + 180 * deltaScaleX;\n let pitch = startPitch;\n if (deltaScaleY > 0) {\n // Gradually increase pitch\n pitch = startPitch + deltaScaleY * (maxPitch - startPitch);\n } else if (deltaScaleY < 0) {\n // Gradually decrease pitch\n pitch = startPitch - deltaScaleY * (minPitch - startPitch);\n }\n\n return {\n pitch,\n bearing\n };\n }\n}\n\nexport default class MapController extends Controller<MapState> {\n ControllerState = MapState;\n\n transition = {\n transitionDuration: 300,\n transitionInterpolator: new LinearInterpolator({\n transitionProps: {\n compare: ['longitude', 'latitude', 'zoom', 'bearing', 'pitch', 'position'],\n required: ['longitude', 'latitude', 'zoom']\n }\n })\n };\n\n dragMode: 'pan' | 'rotate' = 'pan';\n\n /**\n * Rotation pivot behavior:\n * - 'center': Rotate around viewport center (default)\n * - '2d': Rotate around pointer position at ground level (z=0)\n * - '3d': Rotate around 3D picked point (requires pickPosition callback)\n */\n protected rotationPivot: 'center' | '2d' | '3d' = 'center';\n\n setProps(\n props: ControllerProps &\n MapStateProps & {\n rotationPivot?: 'center' | '2d' | '3d';\n getAltitude?: (pos: [number, number]) => number | undefined;\n }\n ) {\n if ('rotationPivot' in props) {\n this.rotationPivot = props.rotationPivot || 'center';\n }\n // this will be passed to MapState constructor\n props.getAltitude = this._getAltitude;\n props.position = props.position || [0, 0, 0];\n props.maxBounds =\n props.maxBounds || (props.normalize === false ? null : WEB_MERCATOR_MAX_BOUNDS);\n\n super.setProps(props);\n }\n\n protected updateViewport(\n newControllerState: MapState,\n extraProps: Record<string, any> | null = null,\n interactionState: InteractionState = {}\n ): void {\n // Inject rotation pivot position during rotation for visual feedback\n const state = newControllerState.getState();\n if (interactionState.isDragging && state.startRotateLngLat) {\n interactionState = {\n ...interactionState,\n rotationPivotPosition: state.startRotateLngLat\n };\n } else if (interactionState.isDragging === false) {\n // Clear pivot when drag ends\n interactionState = {...interactionState, rotationPivotPosition: undefined};\n }\n\n super.updateViewport(newControllerState, extraProps, interactionState);\n }\n\n /** Add altitude to rotateStart params based on rotationPivot mode */\n protected _getAltitude = (pos: [number, number]): number | undefined => {\n if (this.rotationPivot === '2d') {\n return 0;\n } else if (this.rotationPivot === '3d') {\n if (this.pickPosition) {\n const {x, y} = this.props;\n const pickResult = this.pickPosition(x + pos[0], y + pos[1]);\n if (pickResult && pickResult.coordinate && pickResult.coordinate.length >= 3) {\n return pickResult.coordinate[2];\n }\n }\n }\n return undefined;\n };\n}\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {Timeline} from '@luma.gl/engine';\n\nexport type TransitionSettings = {\n duration: number;\n onStart?: (transition: Transition) => void;\n onUpdate?: (transition: Transition) => void;\n onInterrupt?: (transition: Transition) => void;\n onEnd?: (transition: Transition) => void;\n};\n\nexport default class Transition {\n private _inProgress: boolean = false;\n private _handle: number | null = null;\n private _timeline: Timeline;\n\n time: number = 0;\n // @ts-expect-error\n settings: TransitionSettings & {fromValue; toValue; duration; easing; damping; stiffness} = {\n duration: 0\n };\n\n /**\n * @params timeline {Timeline}\n */\n constructor(timeline: Timeline) {\n this._timeline = timeline;\n }\n\n /* Public API */\n get inProgress(): boolean {\n return this._inProgress;\n }\n\n /**\n * (re)start this transition.\n * @params props {object} - optional overriding props. see constructor\n */\n start(settings: TransitionSettings) {\n this.cancel();\n // @ts-expect-error\n this.settings = settings;\n this._inProgress = true;\n this.settings.onStart?.(this);\n }\n\n /**\n * end this transition if it is in progress.\n */\n end() {\n if (this._inProgress) {\n this._timeline.removeChannel(this._handle as number);\n this._handle = null;\n this._inProgress = false;\n this.settings.onEnd?.(this);\n }\n }\n\n /**\n * cancel this transition if it is in progress.\n */\n cancel() {\n if (this._inProgress) {\n this.settings.onInterrupt?.(this);\n this._timeline.removeChannel(this._handle as number);\n this._handle = null;\n this._inProgress = false;\n }\n }\n\n /**\n * update this transition. Returns `true` if updated.\n */\n update() {\n if (!this._inProgress) {\n return false;\n }\n\n // It is important to initialize the handle during `update` instead of `start`.\n // The CPU time that the `start` frame takes should not be counted towards the duration.\n // On the other hand, `update` always happens during a render cycle. The clock starts when the\n // transition is rendered for the first time.\n if (this._handle === null) {\n const {_timeline: timeline, settings} = this;\n this._handle = timeline.addChannel({\n delay: timeline.getTime(),\n duration: settings.duration\n });\n }\n\n this.time = this._timeline.getTime(this._handle);\n // Call subclass method\n this._onUpdate();\n // Call user callback\n this.settings.onUpdate?.(this);\n\n // This only works if `settings.duration` is set\n // Spring transition must call `end` manually\n if (this._timeline.isFinished(this._handle)) {\n this.end();\n }\n return true;\n }\n\n /* Private API */\n\n protected _onUpdate() {\n // for subclass override\n }\n}\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport Transition, {TransitionSettings as BaseTransitionSettings} from '../transitions/transition';\nimport TransitionInterpolator from '../transitions/transition-interpolator';\nimport type {IViewState} from './view-state';\n\nimport type {Timeline} from '@luma.gl/engine';\nimport type {InteractionState} from './controller';\n\nconst noop = () => {};\n\n// Enums cannot be directly exported as they are not transpiled correctly into ES5, see https://github.com/visgl/deck.gl/issues/7130\nexport const TRANSITION_EVENTS = {\n BREAK: 1,\n SNAP_TO_END: 2,\n IGNORE: 3\n} as const;\n\ntype TransitionEvent = 1 | 2 | 3;\n\nexport type TransitionProps = {\n /** Transition duration in milliseconds, default value 0, implies no transition. When using `FlyToInterpolator`, it can also be set to `'auto'`. */\n transitionDuration?: number | 'auto';\n /** An interpolator object that defines the transition behavior between two viewports. */\n transitionInterpolator?: TransitionInterpolator;\n /** Easing function that can be used to achieve effects like \"Ease-In-Cubic\", \"Ease-Out-Cubic\", etc. Default value performs Linear easing. */\n transitionEasing?: (t: number) => number;\n /** Controls how to process a new view state change that occurs during an existing transition. */\n transitionInterruption?: TransitionEvent;\n /** Callback fired when requested transition starts. */\n onTransitionStart?: (transition: Transition) => void;\n /** Callback fired when requested transition is interrupted. */\n onTransitionInterrupt?: (transition: Transition) => void;\n /** Callback fired when requested transition ends. */\n onTransitionEnd?: (transition: Transition) => void;\n};\n\nconst DEFAULT_EASING = t => t;\nconst DEFAULT_INTERRUPTION = TRANSITION_EVENTS.BREAK;\n\ntype TransitionSettings = BaseTransitionSettings & {\n interpolator: TransitionInterpolator;\n easing: (t: number) => number;\n interruption: TransitionEvent;\n startProps: Record<string, any>;\n endProps: Record<string, any>;\n};\n\nexport default class TransitionManager<ControllerState extends IViewState<ControllerState>> {\n getControllerState: (props: any) => ControllerState;\n props?: TransitionProps;\n propsInTransition: Record<string, any> | null;\n transition: Transition;\n onViewStateChange: (params: {\n viewState: Record<string, any>;\n oldViewState: Record<string, any>;\n }) => void;\n onStateChange: (state: InteractionState) => void;\n\n constructor(opts: {\n timeline: Timeline;\n getControllerState: (props: any) => ControllerState;\n onViewStateChange?: (params: {\n viewState: Record<string, any>;\n oldViewState: Record<string, any>;\n }) => void;\n onStateChange?: (state: InteractionState) => void;\n }) {\n this.getControllerState = opts.getControllerState;\n this.propsInTransition = null;\n this.transition = new Transition(opts.timeline);\n\n this.onViewStateChange = opts.onViewStateChange || noop;\n this.onStateChange = opts.onStateChange || noop;\n }\n\n finalize(): void {\n this.transition.cancel();\n }\n\n // Returns current transitioned viewport.\n getViewportInTransition(): Record<string, any> | null {\n return this.propsInTransition;\n }\n\n // Process the vewiport change, either ignore or trigger a new transition.\n // Return true if a new transition is triggered, false otherwise.\n processViewStateChange(nextProps: TransitionProps) {\n let transitionTriggered = false;\n const currentProps = this.props;\n // Set this.props here as '_triggerTransition' calls '_updateViewport' that uses this.props.\n this.props = nextProps;\n\n // NOTE: Be cautious re-ordering statements in this function.\n if (!currentProps || this._shouldIgnoreViewportChange(currentProps, nextProps)) {\n return false;\n }\n\n if (this._isTransitionEnabled(nextProps)) {\n let startProps = currentProps;\n if (this.transition.inProgress) {\n // @ts-expect-error\n const {interruption, endProps} = this.transition.settings as TransitionSettings;\n startProps = {\n ...currentProps,\n ...(interruption === TRANSITION_EVENTS.SNAP_TO_END\n ? endProps\n : this.propsInTransition || currentProps)\n };\n }\n\n this._triggerTransition(startProps, nextProps);\n\n transitionTriggered = true;\n } else {\n this.transition.cancel();\n }\n\n return transitionTriggered;\n }\n\n updateTransition() {\n this.transition.update();\n }\n\n // Helper methods\n\n _isTransitionEnabled(props: TransitionProps): boolean {\n const {transitionDuration, transitionInterpolator} = props;\n return (\n ((transitionDuration as number) > 0 || transitionDuration === 'auto') &&\n Boolean(transitionInterpolator)\n );\n }\n\n _isUpdateDueToCurrentTransition(props: TransitionProps): boolean {\n if (this.transition.inProgress && this.propsInTransition) {\n // @ts-expect-error\n return (this.transition.settings as TransitionSettings).interpolator.arePropsEqual(\n props,\n this.propsInTransition\n );\n }\n return false;\n }\n\n _shouldIgnoreViewportChange(currentProps: TransitionProps, nextProps: TransitionProps): boolean {\n if (this.transition.inProgress) {\n // @ts-expect-error\n const transitionSettings = this.transition.settings as TransitionSettings;\n // Ignore update if it is requested to be ignored\n return (\n transitionSettings.interruption === TRANSITION_EVENTS.IGNORE ||\n // Ignore update if it is due to current active transition.\n this._isUpdateDueToCurrentTransition(nextProps)\n );\n }\n if (this._isTransitionEnabled(nextProps)) {\n // Ignore if none of the viewport props changed.\n return (nextProps.transitionInterpolator as TransitionInterpolator).arePropsEqual(\n currentProps,\n nextProps\n );\n }\n return true;\n }\n\n _triggerTransition(startProps: TransitionProps, endProps: TransitionProps): void {\n const startViewstate = this.getControllerState(startProps);\n const endViewStateProps = this.getControllerState(endProps).shortestPathFrom(startViewstate);\n\n // update transitionDuration for 'auto' mode\n const transitionInterpolator = endProps.transitionInterpolator as TransitionInterpolator;\n const duration = transitionInterpolator.getDuration\n ? transitionInterpolator.getDuration(startProps, endProps)\n : (endProps.transitionDuration as number);\n\n if (duration === 0) {\n return;\n }\n\n const initialProps = transitionInterpolator.initializeProps(startProps, endViewStateProps);\n\n this.propsInTransition = {};\n const transitionSettings: TransitionSettings = {\n duration,\n easing: endProps.transitionEasing || DEFAULT_EASING,\n interpolator: transitionInterpolator,\n interruption: endProps.transitionInterruption || DEFAULT_INTERRUPTION,\n\n startProps: initialProps.start,\n endProps: initialProps.end,\n\n onStart: endProps.onTransitionStart,\n onUpdate: this._onTransitionUpdate,\n onInterrupt: this._onTransitionEnd(endProps.onTransitionInterrupt),\n onEnd: this._onTransitionEnd(endProps.onTransitionEnd)\n };\n this.transition.start(transitionSettings);\n\n this.onStateChange({inTransition: true});\n\n this.updateTransition();\n }\n\n _onTransitionEnd(callback?: (transition: Transition) => void) {\n return transition => {\n this.propsInTransition = null;\n\n this.onStateChange({\n inTransition: false,\n isZooming: false,\n isPanning: false,\n isRotating: false\n });\n\n callback?.(transition);\n };\n }\n\n _onTransitionUpdate = transition => {\n // NOTE: Be cautious re-ordering statements in this function.\n const {\n time,\n settings: {interpolator, startProps, endProps, duration, easing}\n } = transition;\n const t = easing(time / duration);\n const viewport = interpolator.interpolateProps(startProps, endProps, t);\n\n // This gurantees all props (e.g. bearing, longitude) are normalized\n // So when viewports are compared they are in same range.\n this.propsInTransition = this.getControllerState({\n ...this.props,\n ...viewport\n }).getViewportProps();\n\n this.onViewStateChange({\n viewState: this.propsInTransition,\n oldViewState: this.props as TransitionProps\n });\n };\n}\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {equals} from '@math.gl/core';\nimport assert from '../utils/assert';\n\nexport default abstract class TransitionInterpolator {\n protected _propsToCompare: string[];\n protected _propsToExtract: string[];\n protected _requiredProps?: string[];\n\n /**\n * @param opts {array|object}\n * @param opts.compare {array} - prop names used in equality check\n * @param opts.extract {array} - prop names needed for interpolation\n * @param opts.required {array} - prop names that must be supplied\n * alternatively, supply one list of prop names as `opts` if all of the above are the same.\n */\n constructor(opts: {compare: string[]; extract?: string[]; required?: string[]}) {\n const {compare, extract, required} = opts;\n\n this._propsToCompare = compare;\n this._propsToExtract = extract || compare;\n this._requiredProps = required;\n }\n\n /**\n * Checks if two sets of props need transition in between\n * @param currentProps {object} - a list of viewport props\n * @param nextProps {object} - a list of viewport props\n * @returns {bool} - true if two props are equivalent\n */\n arePropsEqual(currentProps: Record<string, any>, nextProps: Record<string, any>): boolean {\n for (const key of this._propsToCompare) {\n if (\n !(key in currentProps) ||\n !(key in nextProps) ||\n !equals(currentProps[key], nextProps[key])\n ) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * Called before transition starts to validate/pre-process start and end props\n * @param startProps {object} - a list of starting viewport props\n * @param endProps {object} - a list of target viewport props\n * @returns {Object} {start, end} - start and end props to be passed\n * to `interpolateProps`\n */\n initializeProps(\n startProps: Record<string, any>,\n endProps: Record<string, any>\n ): {\n start: Record<string, any>;\n end: Record<string, any>;\n } {\n const startViewStateProps = {};\n const endViewStateProps = {};\n\n for (const key of this._propsToExtract) {\n if (key in startProps || key in endProps) {\n startViewStateProps[key] = startProps[key];\n endViewStateProps[key] = endProps[key];\n }\n }\n\n this._checkRequiredProps(startViewStateProps);\n this._checkRequiredProps(endViewStateProps);\n\n return {start: startViewStateProps, end: endViewStateProps};\n }\n\n /**\n * Returns viewport props in transition\n * @param startProps {object} - a list of starting viewport props\n * @param endProps {object} - a list of target viewport props\n * @param t {number} - a time factor between [0, 1]\n * @returns {object} - a list of interpolated viewport props\n */\n abstract interpolateProps(\n startProps: Record<string, any>,\n endProps: Record<string, any>,\n t: number\n ): Record<string, any>;\n\n /**\n * Returns transition duration\n * @param startProps {object} - a list of starting viewport props\n * @param endProps {object} - a list of target viewport props\n * @returns {Number} - transition duration in milliseconds\n */\n getDuration(startProps: Record<string, any>, endProps: Record<string, any>): number {\n return endProps.transitionDuration;\n }\n\n _checkRequiredProps(props) {\n if (!this._requiredProps) {\n return;\n }\n\n this._requiredProps.forEach(propName => {\n const value = props[propName];\n assert(\n Number.isFinite(value) || Array.isArray(value),\n `${propName} is required for transition`\n );\n });\n }\n}\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n// Replacement for the external assert method to reduce bundle size\n// Note: We don't use the second \"message\" argument in calling code,\n// so no need to support it here\nexport default function assert(condition: any, message?: string): asserts condition {\n if (!condition) {\n throw new Error(message || 'deck.gl: assertion failed.');\n }\n}\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport TransitionInterpolator from './transition-interpolator';\nimport {lerp} from '@math.gl/core';\n\nimport log from '../utils/log';\nimport type Viewport from '../viewports/viewport';\nimport GlobeViewport from '../viewports/globe-viewport';\n\nconst DEFAULT_PROPS = ['longitude', 'latitude', 'zoom', 'bearing', 'pitch'];\nconst DEFAULT_REQUIRED_PROPS = ['longitude', 'latitude', 'zoom'];\n\ntype PropsWithAnchor = {\n around?: number[];\n aroundPosition?: number[];\n [key: string]: any;\n};\n\n/**\n * Performs linear interpolation of two view states.\n */\nexport default class LinearInterpolator extends TransitionInterpolator {\n opts: {\n around?: number[];\n makeViewport?: (props: Record<string, any>) => Viewport;\n };\n\n /**\n * @param {Object} opts\n * @param {Array} opts.transitionProps - list of props to apply linear transition to.\n * @param {Array} opts.around - a screen point to zoom/rotate around.\n * @param {Function} opts.makeViewport - construct a viewport instance with given props.\n */\n constructor(\n opts:\n | string[]\n | {\n transitionProps?:\n | string[]\n | {\n compare: string[];\n extract?: string[];\n required?: string[];\n };\n around?: number[];\n makeViewport?: (props: Record<string, any>) => Viewport;\n } = {}\n ) {\n // Backward compatibility\n const transitionProps = Array.isArray(opts) ? opts : opts.transitionProps;\n\n const normalizedOpts = Array.isArray(opts) ? {} : opts;\n normalizedOpts.transitionProps = Array.isArray(transitionProps)\n ? {\n compare: transitionProps,\n required: transitionProps\n }\n : transitionProps || {\n compare: DEFAULT_PROPS,\n required: DEFAULT_REQUIRED_PROPS\n };\n\n super(normalizedOpts.transitionProps);\n this.opts = normalizedOpts;\n }\n\n initializeProps(\n startProps: Record<string, any>,\n endProps: Record<string, any>\n ): {\n start: PropsWithAnchor;\n end: PropsWithAnchor;\n } {\n const result = super.initializeProps(startProps, endProps);\n\n const {makeViewport, around} = this.opts;\n\n if (makeViewport && around) {\n const TestViewport = makeViewport(startProps);\n if (TestViewport instanceof GlobeViewport) {\n log.warn('around not supported in GlobeView')();\n } else {\n const startViewport = makeViewport(startProps);\n const endViewport = makeViewport(endProps);\n const aroundPosition = startViewport.unproject(around);\n result.start.around = around;\n Object.assign(result.end, {\n around: endViewport.project(aroundPosition),\n aroundPosition,\n width: endProps.width,\n height: endProps.height\n });\n }\n }\n\n return result;\n }\n\n interpolateProps(\n startProps: PropsWithAnchor,\n endProps: PropsWithAnchor,\n t: number\n ): Record<string, any> {\n const propsInTransition = {};\n for (const key of this._propsToExtract) {\n propsInTransition[key] = lerp(startProps[key] || 0, endProps[key] || 0, t);\n }\n\n if (endProps.aroundPosition && this.opts.makeViewport) {\n // Linear transition should be performed in common space\n const viewport = this.opts.makeViewport({...endProps, ...propsInTransition});\n Object.assign(\n propsInTransition,\n viewport.panByPosition(\n endProps.aroundPosition,\n // anchor point in current screen coordinates\n lerp(startProps.around as number[], endProps.around as number[], t) as number[]\n )\n );\n }\n return propsInTransition;\n }\n}\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {Matrix4} from '@math.gl/core';\nimport Viewport from './viewport';\nimport {PROJECTION_MODE} from '../lib/constants';\nimport {altitudeToFovy, fovyToAltitude} from '@math.gl/web-mercator';\nimport {MAX_LATITUDE} from '@math.gl/web-mercator';\n\nimport {vec3, vec4} from '@math.gl/core';\n\nconst DEGREES_TO_RADIANS = Math.PI / 180;\nconst RADIANS_TO_DEGREES = 180 / Math.PI;\nconst EARTH_RADIUS = 6370972;\nexport const GLOBE_RADIUS = 256;\n\nfunction getDistanceScales() {\n const unitsPerMeter = GLOBE_RADIUS / EARTH_RADIUS;\n const unitsPerDegree = (Math.PI / 180) * GLOBE_RADIUS;\n\n return {\n unitsPerMeter: [unitsPerMeter, unitsPerMeter, unitsPerMeter],\n unitsPerMeter2: [0, 0, 0],\n metersPerUnit: [1 / unitsPerMeter, 1 / unitsPerMeter, 1 / unitsPerMeter],\n unitsPerDegree: [unitsPerDegree, unitsPerDegree, unitsPerMeter],\n unitsPerDegree2: [0, 0, 0],\n degreesPerUnit: [1 / unitsPerDegree, 1 / unitsPerDegree, 1 / unitsPerMeter]\n };\n}\n\nexport type GlobeViewportOptions = {\n /** Name of the viewport */\n id?: string;\n /** Left offset from the canvas edge, in pixels */\n x?: number;\n /** Top offset from the canvas edge, in pixels */\n y?: number;\n /** Viewport width in pixels */\n width?: number;\n /** Viewport height in pixels */\n height?: number;\n /** Longitude in degrees */\n longitude?: number;\n /** Latitude in degrees */\n latitude?: number;\n /** Camera altitude relative to the viewport height, used to control the FOV. Default `1.5` */\n altitude?: number;\n /* Meter offsets of the viewport center from lng, lat, elevation */\n position?: number[];\n /** Zoom level */\n zoom?: number;\n /** Use orthographic projection */\n orthographic?: boolean;\n /** Camera fovy in degrees. If provided, overrides `altitude` */\n fovy?: number;\n /** Scaler for the near plane, 1 unit equals to the height of the viewport. Default `0.5` */\n nearZMultiplier?: number;\n /** Scaler for the far plane, 1 unit equals to the distance from the camera to the edge of the screen. Default `1` */\n farZMultiplier?: number;\n /** Optionally override the near plane position. `nearZMultiplier` is ignored if `nearZ` is supplied. */\n nearZ?: number;\n /** Optionally override the far plane position. `farZMultiplier` is ignored if `farZ` is supplied. */\n farZ?: number;\n /** The resolution at which to turn flat features into 3D meshes, in degrees. Smaller numbers will generate more detailed mesh. Default `10` */\n resolution?: number;\n};\n\nexport default class GlobeViewport extends Viewport {\n static displayName = 'GlobeViewport';\n\n longitude: number;\n latitude: number;\n fovy: number;\n resolution: number;\n\n constructor(opts: GlobeViewportOptions = {}) {\n const {\n longitude = 0,\n zoom = 0,\n // Matches Maplibre defaults\n // https://github.com/maplibre/maplibre-gl-js/blob/f8ab4b48d59ab8fe7b068b102538793bbdd4c848/src/geo/projection/globe_transform.ts#L632-L633\n nearZMultiplier = 0.5,\n farZMultiplier = 1,\n resolution = 10\n } = opts;\n\n let {latitude = 0, height, altitude = 1.5, fovy} = opts;\n\n // Clamp to web mercator limit to prevent bad inputs\n latitude = Math.max(Math.min(latitude, MAX_LATITUDE), -MAX_LATITUDE);\n\n height = height || 1;\n if (fovy) {\n altitude = fovyToAltitude(fovy);\n } else {\n fovy = altitudeToFovy(altitude);\n }\n // Exagerate distance by latitude to match the Web Mercator distortion\n // The goal is that globe and web mercator projection results converge at high zoom\n // https://github.com/maplibre/maplibre-gl-js/blob/f8ab4b48d59ab8fe7b068b102538793bbdd4c848/src/geo/projection/globe_transform.ts#L575-L577\n const scale = Math.pow(2, zoom - zoomAdjust(latitude));\n const nearZ = opts.nearZ ?? nearZMultiplier;\n const farZ = opts.farZ ?? (altitude + (GLOBE_RADIUS * 2 * scale) / height) * farZMultiplier;\n\n // Calculate view matrix\n const viewMatrix = new Matrix4().lookAt({eye: [0, -altitude, 0], up: [0, 0, 1]});\n viewMatrix.rotateX(latitude * DEGREES_TO_RADIANS);\n viewMatrix.rotateZ(-longitude * DEGREES_TO_RADIANS);\n viewMatrix.scale(scale / height);\n\n super({\n ...opts,\n // x, y, width,\n height,\n\n // view matrix\n viewMatrix,\n longitude,\n latitude,\n zoom,\n\n // projection matrix parameters\n distanceScales: getDistanceScales(),\n fovy,\n focalDistance: altitude,\n near: nearZ,\n far: farZ\n });\n\n this.scale = scale;\n this.latitude = latitude;\n this.longitude = longitude;\n this.fovy = fovy;\n this.resolution = resolution;\n }\n\n get projectionMode() {\n return PROJECTION_MODE.GLOBE;\n }\n\n getDistanceScales() {\n return this.distanceScales;\n }\n\n getBounds(options: {z?: number} = {}): [number, number, number, number] {\n const unprojectOption = {targetZ: options.z || 0};\n\n const left = this.unproject([0, this.height / 2], unprojectOption);\n const top = this.unproject([this.width / 2, 0], unprojectOption);\n const right = this.unproject([this.width, this.height / 2], unprojectOption);\n const bottom = this.unproject([this.width / 2, this.height], unprojectOption);\n\n if (right[0] < this.longitude) right[0] += 360;\n if (left[0] > this.longitude) left[0] -= 360;\n\n return [\n Math.min(left[0], right[0], top[0], bottom[0]),\n Math.min(left[1], right[1], top[1], bottom[1]),\n Math.max(left[0], right[0], top[0], bottom[0]),\n Math.max(left[1], right[1], top[1], bottom[1])\n ];\n }\n\n unproject(\n xyz: number[],\n {topLeft = true, targetZ}: {topLeft?: boolean; targetZ?: number} = {}\n ): number[] {\n const [x, y, z] = xyz;\n\n const y2 = topLeft ? y : this.height - y;\n const {pixelUnprojectionMatrix} = this;\n\n let coord;\n if (Number.isFinite(z)) {\n // Has depth component\n coord = transformVector(pixelUnprojectionMatrix, [x, y2, z, 1]);\n } else {\n // since we don't know the correct projected z value for the point,\n // unproject two points to get a line and then find the point on that line that intersects with the sphere\n const coord0 = transformVector(pixelUnprojectionMatrix, [x, y2, -1, 1]);\n const coord1 = transformVector(pixelUnprojectionMatrix, [x, y2, 1, 1]);\n\n const lt = ((targetZ || 0) / EARTH_RADIUS + 1) * GLOBE_RADIUS;\n const lSqr = vec3.sqrLen(vec3.sub([], coord0, coord1));\n const l0Sqr = vec3.sqrLen(coord0);\n const l1Sqr = vec3.sqrLen(coord1);\n const sSqr = (4 * l0Sqr * l1Sqr - (lSqr - l0Sqr - l1Sqr) ** 2) / 16;\n const dSqr = (4 * sSqr) / lSqr;\n const r0 = Math.sqrt(l0Sqr - dSqr);\n const dr = Math.sqrt(Math.max(0, lt * lt - dSqr));\n const t = (r0 - dr) / Math.sqrt(lSqr);\n\n coord = vec3.lerp([], coord0, coord1, t);\n }\n const [X, Y, Z] = this.unprojectPosition(coord);\n\n if (Number.isFinite(z)) {\n return [X, Y, Z];\n }\n return Number.isFinite(targetZ) ? [X, Y, targetZ as number] : [X, Y];\n }\n\n projectPosition(xyz: number[]): [number, number, number] {\n const [lng, lat, Z = 0] = xyz;\n const lambda = lng * DEGREES_TO_RADIANS;\n const phi = lat * DEGREES_TO_RADIANS;\n const cosPhi = Math.cos(phi);\n const D = (Z / EARTH_RADIUS + 1) * GLOBE_RADIUS;\n\n return [Math.sin(lambda) * cosPhi * D, -Math.cos(lambda) * cosPhi * D, Math.sin(phi) * D];\n }\n\n unprojectPosition(xyz: number[]): [number, number, number] {\n const [x, y, z] = xyz;\n const D = vec3.len(xyz);\n const phi = Math.asin(z / D);\n const lambda = Math.atan2(x, -y);\n\n const lng = lambda * RADIANS_TO_DEGREES;\n const lat = phi * RADIANS_TO_DEGREES;\n const Z = (D / GLOBE_RADIUS - 1) * EARTH_RADIUS;\n return [lng, lat, Z];\n }\n\n projectFlat(xyz: number[]): [number, number] {\n return xyz as [number, number];\n }\n\n unprojectFlat(xyz: number[]): [number, number] {\n return xyz as [number, number];\n }\n\n /**\n * Pan the globe using delta-based movement\n * @param coords - the geographic coordinates where the pan started\n * @param pixel - the current screen position\n * @param startPixel - the screen position where the pan started\n * @returns updated viewport options with new longitude/latitude\n */\n panByPosition(\n [startLng, startLat, startZoom]: number[],\n pixel: number[],\n startPixel: number[]\n ): GlobeViewportOptions {\n // Scale rotation speed inversely with zoom, to approximate constant panning speed\n const scale = Math.pow(2, this.zoom - zoomAdjust(this.latitude));\n const rotationSpeed = 0.25 / scale;\n\n const longitude = startLng + rotationSpeed * (startPixel[0] - pixel[0]);\n let latitude = startLat - rotationSpeed * (startPixel[1] - pixel[1]);\n latitude = Math.max(Math.min(latitude, MAX_LATITUDE), -MAX_LATITUDE);\n const out = {longitude, latitude, zoom: startZoom - zoomAdjust(startLat)};\n out.zoom += zoomAdjust(out.latitude);\n return out;\n }\n}\n\nexport function zoomAdjust(latitude: number): number {\n const scaleAdjust = Math.PI * Math.cos((latitude * Math.PI) / 180);\n return Math.log2(scaleAdjust);\n}\n\nfunction transformVector(matrix: number[], vector: number[]): number[] {\n const result = vec4.transformMat4([], vector, matrix);\n vec4.scale(result, result, 1 / result[3]);\n return result;\n}\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n/* eslint-disable max-statements, complexity */\nimport TransitionManager, {TransitionProps} from './transition-manager';\nimport LinearInterpolator from '../transitions/linear-interpolator';\nimport {IViewState} from './view-state';\nimport {ConstructorOf} from '../types/types';\nimport {deepEqual} from '../utils/deep-equal';\n\nimport type Viewport from '../viewports/viewport';\n\nimport type {EventManager, MjolnirEvent, MjolnirGestureEvent, MjolnirWheelEvent, MjolnirKeyEvent} from 'mjolnir.js';\nimport type {Timeline} from '@luma.gl/engine';\n\nconst NO_TRANSITION_PROPS = {\n transitionDuration: 0\n} as const;\n\nconst DEFAULT_INERTIA = 300;\nconst INERTIA_EASING = t => 1 - (1 - t) * (1 - t);\n\nconst EVENT_TYPES = {\n WHEEL: ['wheel'],\n PAN: ['panstart', 'panmove', 'panend'],\n PINCH: ['pinchstart', 'pinchmove', 'pinchend'],\n MULTI_PAN: ['multipanstart', 'multipanmove', 'multipanend'],\n DOUBLE_CLICK: ['dblclick'],\n KEYBOARD: ['keydown']\n} as const;\n\n/** Configuration of how user input is handled */\nexport type ControllerOptions = {\n /** Enable zooming with mouse wheel. Default `true`. */\n scrollZoom?: boolean | {\n /** Scaler that translates wheel delta to the change of viewport scale. Default `0.01`. */\n speed?: number;\n /** Smoothly transition to the new zoom. If enabled, will provide a slightly lagged but smoother experience. Default `false`. */\n smooth?: boolean\n };\n /** Enable panning with pointer drag. Default `true` */\n dragPan?: boolean;\n /** Enable rotating with pointer drag. Default `true` */\n dragRotate?: boolean;\n /** Enable zooming with double click. Default `true` */\n doubleClickZoom?: boolean;\n /** Enable zooming with multi-touch. Default `true` */\n touchZoom?: boolean;\n /** Enable rotating with multi-touch. Use two-finger rotating gesture for horizontal and three-finger swiping gesture for vertical rotation. Default `false` */\n touchRotate?: boolean;\n /** Enable interaction with keyboard. Default `true`. */\n keyboard?:\n | boolean\n | {\n /** Speed of zoom using +/- keys. Default `2` */\n zoomSpeed?: number;\n /** Speed of movement using arrow keys, in pixels. */\n moveSpeed?: number;\n /** Speed of rotation using shift + left/right arrow keys, in degrees. Default 15. */\n rotateSpeedX?: number;\n /** Speed of rotation using shift + up/down arrow keys, in degrees. Default 10. */\n rotateSpeedY?: number;\n };\n /** Drag behavior without pressing function keys, one of `pan` and `rotate`. */\n dragMode?: 'pan' | 'rotate';\n /** Enable inertia after panning/pinching. If a number is provided, indicates the duration of time over which the velocity reduces to zero, in milliseconds. Default `false`. */\n inertia?: boolean | number;\n /** Bounding box of content that the controller is constrained in */\n maxBounds?: [min: [number, number], max: [number, number]] | [min: [number, number, number], max: [number, number, number]] | null;\n};\n\nexport type ControllerProps = {\n /** Identifier of the controller */\n id: string;\n /** Viewport x position */\n x: number;\n /** Viewport y position */\n y: number;\n /** Viewport width */\n width: number;\n /** Viewport height */\n height: number;\n} & ControllerOptions & TransitionProps;\n\n/** The state of a controller */\nexport type InteractionState = {\n /** If the view state is in transition */\n inTransition?: boolean;\n /** If the user is dragging */\n isDragging?: boolean;\n /** If the view is being panned, either from user input or transition */\n isPanning?: boolean;\n /** If the view is being rotated, either from user input or transition */\n isRotating?: boolean;\n /** If the view is being zoomed, either from user input or transition */\n isZooming?: boolean;\n /** World coordinate [lng, lat, altitude] of rotation pivot point when rotating */\n rotationPivotPosition?: [number, number, number];\n}\n\n/** Parameters passed to the onViewStateChange callback */\nexport type ViewStateChangeParameters<ViewStateT = any> = {\n viewId: string;\n /** The next view state, either from user input or transition */\n viewState: ViewStateT;\n /** Object describing the nature of the view state change */\n interactionState: InteractionState;\n /** The current view state */\n oldViewState?: ViewStateT;\n}\n\nconst pinchEventWorkaround: any = {};\n\nexport default abstract class Controller<ControllerState extends IViewState<ControllerState>> {\n abstract get ControllerState(): ConstructorOf<ControllerState>;\n abstract get transition(): TransitionProps;\n\n // @ts-expect-error (2564) - not assigned in the constructor\n protected props: ControllerProps;\n protected state: Record<string, any> = {};\n\n protected transitionManager: TransitionManager<ControllerState>;\n protected eventManager: EventManager;\n protected onViewStateChange: (params: ViewStateChangeParameters) => void;\n protected onStateChange: (state: InteractionState) => void;\n protected makeViewport: (opts: Record<string, any>) => Viewport;\n protected pickPosition?: (x: number, y: number) => {coordinate?: number[]} | null;\n\n private _controllerState?: ControllerState;\n private _events: Record<string, boolean> = {};\n private _interactionState: InteractionState = {\n isDragging: false\n };\n private _customEvents: string[] = [];\n private _eventStartBlocked: any = null;\n private _panMove: boolean = false;\n\n protected invertPan: boolean = false;\n protected dragMode: 'pan' | 'rotate' = 'rotate';\n protected inertia: number = 0;\n protected scrollZoom: boolean | {speed?: number; smooth?: boolean} = true;\n protected dragPan: boolean = true;\n protected dragRotate: boolean = true;\n protected doubleClickZoom: boolean = true;\n protected touchZoom: boolean = true;\n protected touchRotate: boolean = false;\n protected keyboard:\n | boolean\n | {\n zoomSpeed?: number; // speed of zoom using +/- keys. Default 2.\n moveSpeed?: number; // speed of movement using arrow keys, in pixels.\n rotateSpeedX?: number; // speed of rotation using shift + left/right arrow keys, in degrees. Default 15.\n rotateSpeedY?: number; // speed of rotation using shift + up/down arrow keys, in degrees. Default 10.\n } = true;\n\n constructor(opts: {\n timeline: Timeline,\n eventManager: EventManager;\n makeViewport: (opts: Record<string, any>) => Viewport;\n onViewStateChange: (params: ViewStateChangeParameters) => void;\n onStateChange: (state: InteractionState) => void;\n pickPosition?: (x: number, y: number) => {coordinate?: number[]} | null;\n }) {\n this.transitionManager = new TransitionManager<ControllerState>({\n ...opts,\n getControllerState: props => new this.ControllerState(props),\n onViewStateChange: this._onTransition.bind(this),\n onStateChange: this._setInteractionState.bind(this)\n });\n\n this.handleEvent = this.handleEvent.bind(this);\n\n this.eventManager = opts.eventManager;\n this.onViewStateChange = opts.onViewStateChange || (() => {});\n this.onStateChange = opts.onStateChange || (() => {});\n this.makeViewport = opts.makeViewport;\n this.pickPosition = opts.pickPosition;\n }\n\n set events(customEvents) {\n this.toggleEvents(this._customEvents, false);\n this.toggleEvents(customEvents, true);\n this._customEvents = customEvents;\n // Make sure default events are not overwritten\n if (this.props) {\n this.setProps(this.props);\n }\n }\n\n finalize() {\n for (const eventName in this._events) {\n if (this._events[eventName]) {\n // @ts-ignore (2345) event type string cannot be assifned to enum\n // eslint-disable-next-line @typescript-eslint/unbound-method\n this.eventManager?.off(eventName, this.handleEvent);\n }\n }\n this.transitionManager.finalize();\n }\n\n /**\n * Callback for events\n */\n handleEvent(event: MjolnirEvent) {\n // Force recalculate controller state\n this._controllerState = undefined;\n const eventStartBlocked = this._eventStartBlocked;\n\n switch (event.type) {\n case 'panstart':\n return eventStartBlocked ? false : this._onPanStart(event);\n case 'panmove':\n return this._onPan(event);\n case 'panend':\n return this._onPanEnd(event);\n case 'pinchstart':\n return eventStartBlocked ? false : this._onPinchStart(event);\n case 'pinchmove':\n return this._onPinch(event);\n case 'pinchend':\n return this._onPinchEnd(event);\n case 'multipanstart':\n return eventStartBlocked ? false : this._onMultiPanStart(event);\n case 'multipanmove':\n return this._onMultiPan(event);\n case 'multipanend':\n return this._onMultiPanEnd(event);\n case 'dblclick':\n return this._onDoubleClick(event);\n case 'wheel':\n return this._onWheel(event as MjolnirWheelEvent);\n case 'keydown':\n return this._onKeyDown(event as MjolnirKeyEvent);\n default:\n return false;\n }\n }\n\n /* Event utils */\n // Event object: http://hammerjs.github.io/api/#event-object\n get controllerState(): ControllerState {\n this._controllerState = this._controllerState || new this.ControllerState({\n makeViewport: this.makeViewport,\n ...this.props,\n ...this.state\n });\n return this._controllerState;\n }\n\n getCenter(event: MjolnirGestureEvent | MjolnirWheelEvent) : [number, number] {\n const {x, y} = this.props;\n const {offsetCenter} = event;\n return [offsetCenter.x - x, offsetCenter.y - y];\n }\n\n isPointInBounds(pos: [number, number], event: MjolnirEvent): boolean {\n const {width, height} = this.props;\n if (event && event.handled) {\n return false;\n }\n\n const inside = pos[0] >= 0 && pos[0] <= width && pos[1] >= 0 && pos[1] <= height;\n if (inside && event) {\n event.stopPropagation();\n }\n return inside;\n }\n\n isFunctionKeyPressed(event: MjolnirEvent): boolean {\n const {srcEvent} = event;\n return Boolean(srcEvent.metaKey || srcEvent.altKey || srcEvent.ctrlKey || srcEvent.shiftKey);\n }\n\n isDragging(): boolean {\n return this._interactionState.isDragging || false;\n }\n\n // When a multi-touch event ends, e.g. pinch, not all pointers are lifted at the same time.\n // This triggers a brief `pan` event.\n // Calling this method will temporarily disable *start events to avoid conflicting transitions.\n blockEvents(timeout: number): void {\n /* global setTimeout */\n const timer = setTimeout(() => {\n if (this._eventStartBlocked === timer) {\n this._eventStartBlocked = null;\n }\n }, timeout);\n this._eventStartBlocked = timer;\n }\n\n /**\n * Extract interactivity options\n */\n setProps(props: ControllerProps) {\n if (props.dragMode) {\n this.dragMode = props.dragMode;\n }\n const oldProps = this.props;\n this.props = props;\n\n if (!('transitionInterpolator' in props)) {\n // Add default transition interpolator\n props.transitionInterpolator = this._getTransitionProps().transitionInterpolator;\n }\n\n this.transitionManager.processViewStateChange(props);\n\n const {inertia} = props;\n this.inertia = Number.isFinite(inertia) ? (inertia as number) : (inertia === true ? DEFAULT_INERTIA : 0);\n\n // TODO - make sure these are not reset on every setProps\n const {\n scrollZoom = true,\n dragPan = true,\n dragRotate = true,\n doubleClickZoom = true,\n touchZoom = true,\n touchRotate = false,\n keyboard = true\n } = props;\n\n // Register/unregister events\n const isInteractive = Boolean(this.onViewStateChange);\n this.toggleEvents(EVENT_TYPES.WHEEL, isInteractive && scrollZoom);\n // We always need the pan events to set the correct isDragging state, even if dragPan & dragRotate are both false\n this.toggleEvents(EVENT_TYPES.PAN, isInteractive);\n this.toggleEvents(EVENT_TYPES.PINCH, isInteractive && (touchZoom || touchRotate));\n this.toggleEvents(EVENT_TYPES.MULTI_PAN, isInteractive && touchRotate);\n this.toggleEvents(EVENT_TYPES.DOUBLE_CLICK, isInteractive && doubleClickZoom);\n this.toggleEvents(EVENT_TYPES.KEYBOARD, isInteractive && keyboard);\n\n // Interaction toggles\n this.scrollZoom = scrollZoom;\n this.dragPan = dragPan;\n this.dragRotate = dragRotate;\n this.doubleClickZoom = doubleClickZoom;\n this.touchZoom = touchZoom;\n this.touchRotate = touchRotate;\n this.keyboard = keyboard;\n\n // Normalize view state if maxBounds is defined\n const dimensionChanged = !oldProps || oldProps.height !== props.height || oldProps.width !== props.width || oldProps.maxBounds !== props.maxBounds;\n if (dimensionChanged && props.maxBounds) {\n // Dimensions changed, try re-normalize the props\n const controllerState = new this.ControllerState({...props, makeViewport: this.makeViewport});\n const normalizedProps = controllerState.getViewportProps();\n const changed = Object.keys(normalizedProps).some(key => !deepEqual(normalizedProps[key], props[key], 1));\n if (changed) {\n // some props are updated after normalization\n this.updateViewport(controllerState);\n }\n }\n }\n\n updateTransition() {\n this.transitionManager.updateTransition();\n }\n\n toggleEvents(eventNames, enabled) {\n if (this.eventManager) {\n eventNames.forEach(eventName => {\n if (this._events[eventName] !== enabled) {\n this._events[eventName] = enabled;\n if (enabled) {\n // eslint-disable-next-line @typescript-eslint/unbound-method\n this.eventManager.on(eventName, this.handleEvent);\n } else {\n // eslint-disable-next-line @typescript-eslint/unbound-method\n this.eventManager.off(eventName, this.handleEvent);\n }\n }\n });\n }\n }\n\n // Private Methods\n\n /* Callback util */\n // formats map state and invokes callback function\n protected updateViewport(newControllerState: ControllerState, extraProps: Record<string, any> | null = null, interactionState: InteractionState = {}) {\n const viewState = {...newControllerState.getViewportProps(), ...extraProps};\n\n // TODO - to restore diffing, we need to include interactionState\n const changed = this.controllerState !== newControllerState;\n // const oldViewState = this.controllerState.getViewportProps();\n // const changed = Object.keys(viewState).some(key => oldViewState[key] !== viewState[key]);\n\n this.state = newControllerState.getState();\n this._setInteractionState(interactionState);\n\n if (changed) {\n const oldViewState = this.controllerState && this.controllerState.getViewportProps();\n if (this.onViewStateChange) {\n this.onViewStateChange({viewState, interactionState: this._interactionState, oldViewState, viewId: this.props.id});\n }\n }\n }\n\n private _onTransition(params: {viewState: Record<string, any>, oldViewState: Record<string, any>}) {\n this.onViewStateChange({...params, interactionState: this._interactionState, viewId: this.props.id});\n }\n\n private _setInteractionState(newStates: InteractionState) {\n Object.assign(this._interactionState, newStates);\n this.onStateChange(this._interactionState);\n }\n\n /* Event handlers */\n // Default handler for the `panstart` event.\n protected _onPanStart(event: MjolnirGestureEvent): boolean {\n const pos = this.getCenter(event);\n if (!this.isPointInBounds(pos, event)) {\n return false;\n }\n let alternateMode = this.isFunctionKeyPressed(event) || event.rightButton || false;\n if (this.invertPan || this.dragMode === 'pan') {\n // invertPan is replaced by props.dragMode, keeping for backward compatibility\n alternateMode = !alternateMode;\n }\n\n const newControllerState = this.controllerState[alternateMode ? 'panStart' : 'rotateStart']({\n pos\n });\n this._panMove = alternateMode;\n this.updateViewport(newControllerState, NO_TRANSITION_PROPS, {isDragging: true});\n return true;\n }\n\n // Default handler for the `panmove` and `panend` event.\n protected _onPan(event: MjolnirGestureEvent): boolean {\n if (!this.isDragging()) {\n return false;\n }\n return this._panMove ? this._onPanMove(event) : this._onPanRotate(event);\n }\n\n protected _onPanEnd(event: MjolnirGestureEvent): boolean {\n if (!this.isDragging()) {\n return false;\n }\n return this._panMove ? this._onPanMoveEnd(event) : this._onPanRotateEnd(event);\n }\n\n // Default handler for panning to move.\n // Called by `_onPan` when panning without function key pressed.\n protected _onPanMove(event: MjolnirGestureEvent): boolean {\n if (!this.dragPan) {\n return false;\n }\n const pos = this.getCenter(event);\n const newControllerState = this.controllerState.pan({pos});\n this.updateViewport(newControllerState, NO_TRANSITION_PROPS, {\n isDragging: true,\n isPanning: true\n });\n return true;\n }\n\n protected _onPanMoveEnd(event: MjolnirGestureEvent): boolean {\n const {inertia} = this;\n if (this.dragPan && inertia && event.velocity) {\n const pos = this.getCenter(event);\n const endPos: [number, number] = [\n pos[0] + (event.velocityX * inertia) / 2,\n pos[1] + (event.velocityY * inertia) / 2\n ];\n const newControllerState = this.controllerState.pan({pos: endPos}).panEnd();\n this.updateViewport(\n newControllerState,\n {\n ...this._getTransitionProps(),\n transitionDuration: inertia,\n transitionEasing: INERTIA_EASING\n },\n {\n isDragging: false,\n isPanning: true\n }\n );\n } else {\n const newControllerState = this.controllerState.panEnd();\n this.updateViewport(newControllerState, null, {\n isDragging: false,\n isPanning: false\n });\n }\n return true;\n }\n\n // Default handler for panning to rotate.\n // Called by `_onPan` when panning with function key pressed.\n protected _onPanRotate(event: MjolnirGestureEvent): boolean {\n if (!this.dragRotate) {\n return false;\n }\n\n const pos = this.getCenter(event);\n const newControllerState = this.controllerState.rotate({pos});\n this.updateViewport(newControllerState, NO_TRANSITION_PROPS, {\n isDragging: true,\n isRotating: true\n });\n return true;\n }\n\n protected _onPanRotateEnd(event): boolean {\n const {inertia} = this;\n if (this.dragRotate && inertia && event.velocity) {\n const pos = this.getCenter(event);\n const endPos: [number, number] = [\n pos[0] + (event.velocityX * inertia) / 2,\n pos[1] + (event.velocityY * inertia) / 2\n ];\n const newControllerState = this.controllerState.rotate({pos: endPos}).rotateEnd();\n this.updateViewport(\n newControllerState,\n {\n ...this._getTransitionProps(),\n transitionDuration: inertia,\n transitionEasing: INERTIA_EASING\n },\n {\n isDragging: false,\n isRotating: true\n }\n );\n } else {\n const newControllerState = this.controllerState.rotateEnd();\n this.updateViewport(newControllerState, null, {\n isDragging: false,\n isRotating: false\n });\n }\n return true;\n }\n\n // Default handler for the `wheel` event.\n protected _onWheel(event: MjolnirWheelEvent): boolean {\n if (!this.scrollZoom) {\n return false;\n }\n\n const pos = this.getCenter(event);\n if (!this.isPointInBounds(pos, event)) {\n return false;\n }\n event.srcEvent.preventDefault();\n\n const {speed = 0.01, smooth = false} = this.scrollZoom === true ? {} : this.scrollZoom;\n const {delta} = event;\n\n // Map wheel delta to relative scale\n let scale = 2 / (1 + Math.exp(-Math.abs(delta * speed)));\n if (delta < 0 && scale !== 0) {\n scale = 1 / scale;\n }\n\n const transitionProps = smooth\n ? {...this._getTransitionProps({around: pos}), transitionDuration: 250}\n : NO_TRANSITION_PROPS;\n\n const newControllerState = this.controllerState.zoom({pos, scale});\n this.updateViewport(\n newControllerState,\n transitionProps,\n {\n isZooming: true,\n isPanning: true\n }\n );\n\n // When there's no transition (duration = 0), immediately reset interaction state\n // since _onTransitionEnd callback won't fire\n if (!smooth) {\n this._setInteractionState({isZooming: false, isPanning: false});\n }\n return true;\n }\n\n protected _onMultiPanStart(event: MjolnirGestureEvent): boolean {\n const pos = this.getCenter(event);\n if (!this.isPointInBounds(pos, event)) {\n return false;\n }\n const newControllerState = this.controllerState.rotateStart({pos});\n this.updateViewport(newControllerState, NO_TRANSITION_PROPS, {isDragging: true});\n return true;\n }\n\n protected _onMultiPan(event: MjolnirGestureEvent): boolean {\n if (!this.touchRotate) {\n return false;\n }\n if (!this.isDragging()) {\n return false;\n }\n\n const pos = this.getCenter(event);\n pos[0] -= event.deltaX;\n\n const newControllerState = this.controllerState.rotate({pos});\n this.updateViewport(newControllerState, NO_TRANSITION_PROPS, {\n isDragging: true,\n isRotating: true\n });\n return true;\n }\n\n protected _onMultiPanEnd(event: MjolnirGestureEvent): boolean {\n if (!this.isDragging()) {\n return false;\n }\n const {inertia} = this;\n if (this.touchRotate && inertia && event.velocityY) {\n const pos = this.getCenter(event);\n const endPos: [number, number] = [pos[0], (pos[1] += (event.velocityY * inertia) / 2)];\n const newControllerState = this.controllerState.rotate({pos: endPos});\n this.updateViewport(\n newControllerState,\n {\n ...this._getTransitionProps(),\n transitionDuration: inertia,\n transitionEasing: INERTIA_EASING\n },\n {\n isDragging: false,\n isRotating: true\n }\n );\n this.blockEvents(inertia);\n } else {\n const newControllerState = this.controllerState.rotateEnd();\n this.updateViewport(newControllerState, null, {\n isDragging: false,\n isRotating: false\n });\n }\n return true;\n }\n\n // Default handler for the `pinchstart` event.\n protected _onPinchStart(event: MjolnirGestureEvent): boolean {\n const pos = this.getCenter(event);\n if (!this.isPointInBounds(pos, event)) {\n return false;\n }\n\n const newControllerState = this.controllerState.zoomStart({pos}).rotateStart({pos});\n // hack - hammer's `rotation` field doesn't seem to produce the correct angle\n pinchEventWorkaround._startPinchRotation = event.rotation;\n pinchEventWorkaround._lastPinchEvent = event;\n this.updateViewport(newControllerState, NO_TRANSITION_PROPS, {isDragging: true});\n return true;\n }\n\n // Default handler for the `pinchmove` and `pinchend` events.\n protected _onPinch(event: MjolnirGestureEvent): boolean {\n if (!this.touchZoom && !this.touchRotate) {\n return false;\n }\n if (!this.isDragging()) {\n return false;\n }\n\n let newControllerState = this.controllerState;\n if (this.touchZoom) {\n const {scale} = event;\n const pos = this.getCenter(event);\n newControllerState = newControllerState.zoom({pos, scale});\n }\n if (this.touchRotate) {\n const {rotation} = event;\n newControllerState = newControllerState.rotate({\n deltaAngleX: pinchEventWorkaround._startPinchRotation - rotation\n });\n }\n\n this.updateViewport(newControllerState, NO_TRANSITION_PROPS, {\n isDragging: true,\n isPanning: this.touchZoom,\n isZooming: this.touchZoom,\n isRotating: this.touchRotate\n });\n pinchEventWorkaround._lastPinchEvent = event;\n return true;\n }\n\n protected _onPinchEnd(event: MjolnirGestureEvent): boolean {\n if (!this.isDragging()) {\n return false;\n }\n const {inertia} = this;\n const {_lastPinchEvent} = pinchEventWorkaround;\n if (this.touchZoom && inertia && _lastPinchEvent && event.scale !== _lastPinchEvent.scale) {\n const pos = this.getCenter(event);\n let newControllerState = this.controllerState.rotateEnd();\n const z = Math.log2(event.scale);\n const velocityZ =\n (z - Math.log2(_lastPinchEvent.scale)) / (event.deltaTime - _lastPinchEvent.deltaTime);\n const endScale = Math.pow(2, z + (velocityZ * inertia) / 2);\n newControllerState = newControllerState.zoom({pos, scale: endScale}).zoomEnd();\n\n this.updateViewport(\n newControllerState,\n {\n ...this._getTransitionProps({around: pos}),\n transitionDuration: inertia,\n transitionEasing: INERTIA_EASING\n },\n {\n isDragging: false,\n isPanning: this.touchZoom,\n isZooming: this.touchZoom,\n isRotating: false\n }\n );\n this.blockEvents(inertia);\n } else {\n const newControllerState = this.controllerState.zoomEnd().rotateEnd();\n this.updateViewport(newControllerState, null, {\n isDragging: false,\n isPanning: false,\n isZooming: false,\n isRotating: false\n });\n }\n pinchEventWorkaround._startPinchRotation = null;\n pinchEventWorkaround._lastPinchEvent = null;\n return true;\n }\n\n // Default handler for the `dblclick` event.\n protected _onDoubleClick(event: MjolnirGestureEvent): boolean {\n if (!this.doubleClickZoom) {\n return false;\n }\n const pos = this.getCenter(event);\n if (!this.isPointInBounds(pos, event)) {\n return false;\n }\n\n const isZoomOut = this.isFunctionKeyPressed(event);\n\n const newControllerState = this.controllerState.zoom({pos, scale: isZoomOut ? 0.5 : 2});\n this.updateViewport(newControllerState, this._getTransitionProps({around: pos}), {\n isZooming: true,\n isPanning: true\n });\n this.blockEvents(100);\n return true;\n }\n\n // Default handler for the `keydown` event\n protected _onKeyDown(event: MjolnirKeyEvent): boolean {\n if (!this.keyboard) {\n return false;\n }\n const funcKey = this.isFunctionKeyPressed(event);\n // @ts-ignore\n const {zoomSpeed, moveSpeed, rotateSpeedX, rotateSpeedY} = this.keyboard === true ? {} : this.keyboard;\n const {controllerState} = this;\n let newControllerState;\n const interactionState: InteractionState = {};\n\n switch (event.srcEvent.code) {\n case 'Minus':\n newControllerState = funcKey\n ? controllerState.zoomOut(zoomSpeed).zoomOut(zoomSpeed)\n : controllerState.zoomOut(zoomSpeed);\n interactionState.isZooming = true;\n break;\n case 'Equal':\n newControllerState = funcKey\n ? controllerState.zoomIn(zoomSpeed).zoomIn(zoomSpeed)\n : controllerState.zoomIn(zoomSpeed);\n interactionState.isZooming = true;\n break;\n case 'ArrowLeft':\n if (funcKey) {\n newControllerState = controllerState.rotateLeft(rotateSpeedX);\n interactionState.isRotating = true;\n } else {\n newControllerState = controllerState.moveLeft(moveSpeed);\n interactionState.isPanning = true;\n }\n break;\n case 'ArrowRight':\n if (funcKey) {\n newControllerState = controllerState.rotateRight(rotateSpeedX);\n interactionState.isRotating = true;\n } else {\n newControllerState = controllerState.moveRight(moveSpeed);\n interactionState.isPanning = true;\n }\n break;\n case 'ArrowUp':\n if (funcKey) {\n newControllerState = controllerState.rotateUp(rotateSpeedY);\n interactionState.isRotating = true;\n } else {\n newControllerState = controllerState.moveUp(moveSpeed);\n interactionState.isPanning = true;\n }\n break;\n case 'ArrowDown':\n if (funcKey) {\n newControllerState = controllerState.rotateDown(rotateSpeedY);\n interactionState.isRotating = true;\n } else {\n newControllerState = controllerState.moveDown(moveSpeed);\n interactionState.isPanning = true;\n }\n break;\n default:\n return false;\n }\n this.updateViewport(newControllerState, this._getTransitionProps(), interactionState);\n return true;\n }\n\n protected _getTransitionProps(opts?: any): TransitionProps {\n const {transition} = this;\n\n if (!transition || !transition.transitionInterpolator) {\n return NO_TRANSITION_PROPS;\n }\n\n // Enables Transitions on double-tap and key-down events.\n return opts\n ? {\n ...transition,\n transitionInterpolator: new LinearInterpolator({\n ...opts,\n ...(transition.transitionInterpolator as LinearInterpolator).opts,\n makeViewport: this.controllerState.makeViewport\n })\n }\n : transition;\n }\n}\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type Viewport from '../viewports/viewport';\n\nexport default abstract class ViewState<\n T,\n Props extends Record<string, any>,\n State extends Record<string, any>\n> implements IViewState<T>\n{\n private _viewportProps: Required<Props>;\n private _state: State;\n\n makeViewport: (props: Record<string, any>) => Viewport;\n\n constructor(\n props: Required<Props>,\n state: State,\n makeViewport: (props: Record<string, any>) => Viewport\n ) {\n this.makeViewport = makeViewport;\n this._viewportProps = this.applyConstraints(props);\n this._state = state;\n }\n\n getViewportProps(): Required<Props> {\n return this._viewportProps;\n }\n\n getState(): State {\n return this._state;\n }\n\n abstract applyConstraints(props: Required<Props>): Required<Props>;\n\n abstract shortestPathFrom(viewState: T): Props;\n\n abstract panStart(params: {pos: [number, number]}): T;\n abstract pan({pos, startPos}: {pos: [number, number]; startPos?: [number, number]}): T;\n abstract panEnd(): T;\n\n abstract rotateStart(params: {pos: [number, number]; altitude?: number}): T;\n abstract rotate(params: {pos?: [number, number]; deltaAngleX?: number; deltaAngleY: number}): T;\n abstract rotateEnd(): T;\n\n abstract zoomStart({pos}: {pos: [number, number]}): T;\n abstract zoom({\n pos,\n startPos,\n scale\n }: {\n pos: [number, number];\n startPos?: [number, number];\n scale: number;\n }): T;\n abstract zoomEnd(): T;\n\n abstract zoomIn(speed?: number): T;\n abstract zoomOut(speed?: number): T;\n\n abstract moveLeft(speed?: number): T;\n abstract moveRight(speed?: number): T;\n abstract moveUp(speed?: number): T;\n abstract moveDown(speed?: number): T;\n\n abstract rotateLeft(speed?: number): T;\n abstract rotateRight(speed?: number): T;\n abstract rotateUp(speed?: number): T;\n abstract rotateDown(speed?: number): T;\n}\n\nexport interface IViewState<T> {\n makeViewport?: (props: Record<string, any>) => Viewport;\n\n getViewportProps(): Record<string, any>;\n\n getState(): Record<string, any>;\n\n shortestPathFrom(viewState: T): Record<string, any>;\n\n panStart(params: {pos: [number, number]}): T;\n pan({pos, startPos}: {pos: [number, number]; startPos?: [number, number]}): T;\n panEnd(): T;\n\n rotateStart(params: {pos: [number, number]; altitude?: number}): T;\n rotate(params: {pos?: [number, number]; deltaAngleX?: number; deltaAngleY?: number}): T;\n rotateEnd(): T;\n\n zoomStart({pos}: {pos: [number, number]}): T;\n zoom({\n pos,\n startPos,\n scale\n }: {\n pos: [number, number];\n startPos?: [number, number];\n scale: number;\n }): T;\n zoomEnd(): T;\n\n zoomIn(speed?: number): T;\n zoomOut(speed?: number): T;\n\n moveLeft(speed?: number): T;\n moveRight(speed?: number): T;\n moveUp(speed?: number): T;\n moveDown(speed?: number): T;\n\n rotateLeft(speed?: number): T;\n rotateRight(speed?: number): T;\n rotateUp(speed?: number): T;\n rotateDown(speed?: number): T;\n}\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport View, {CommonViewState, CommonViewProps} from './view';\nimport WebMercatorViewport from '../viewports/web-mercator-viewport';\nimport MapController from '../controllers/map-controller';\n\nimport type {NumericArray} from '../types/types';\n\nexport type MapViewState = {\n /** Longitude of the map center */\n longitude: number;\n /** Latitude of the map center */\n latitude: number;\n /** Zoom level */\n zoom: number;\n /** Pitch (tilt) of the map, in degrees. `0` looks top down */\n pitch?: number;\n /** Bearing (rotation) of the map, in degrees. `0` is north up */\n bearing?: number;\n /** Min zoom, default `0` */\n minZoom?: number;\n /** Max zoom, default `20` */\n maxZoom?: number;\n /** Min pitch, default `0` */\n minPitch?: number;\n /** Max pitch, default `60` */\n maxPitch?: number;\n /** Viewport center offsets from lng, lat in meters */\n position?: number[];\n /** The near plane position */\n nearZ?: number;\n /** The far plane position */\n farZ?: number;\n} & CommonViewState;\n\nexport type MapViewProps = {\n /** Whether to render multiple copies of the map at low zoom levels. Default `false`. */\n repeat?: boolean;\n /** Scaler for the near plane, 1 unit equals to the height of the viewport. Default to `0.1`. Overwrites the `near` parameter. */\n nearZMultiplier?: number;\n /** Scaler for the far plane, 1 unit equals to the distance from the camera to the top edge of the screen. Default to `1.01`. Overwrites the `far` parameter. */\n farZMultiplier?: number;\n /** Custom projection matrix */\n projectionMatrix?: NumericArray;\n /** Field of view covered by the camera, in the perspective case. In degrees. If not supplied, will be calculated from `altitude`. */\n fovy?: number;\n /** Distance of the camera relative to viewport height. Default `1.5`. */\n altitude?: number;\n /** Whether to create an orthographic or perspective projection matrix. Default is `false` (perspective projection). */\n orthographic?: boolean;\n} & CommonViewProps<MapViewState>;\n\nexport default class MapView extends View<MapViewState, MapViewProps> {\n static displayName = 'MapView';\n\n constructor(props: MapViewProps = {}) {\n super(props);\n }\n\n getViewportType() {\n return WebMercatorViewport;\n }\n\n get ControllerType() {\n return MapController;\n }\n}\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n/* eslint-disable no-invalid-this */\nimport {initializeResources, render, finalizeResources, RenderResources} from './commons';\n\nimport SceneView from '@arcgis/core/views/SceneView';\nimport type {DeckProps} from '@deck.gl/core';\nimport MapView from '../../core/src/views/map-view';\n\n// Web Mercator scale at zoom 0 for 256 px tiles; deck.gl uses 512 px tiles,\n// so the final zoom is shifted by -1.\nconst ARCGIS_WEB_MERCATOR_SCALE_AT_ZOOM_0 = 591657550.5;\nconst DECK_GROUND_MPP_AT_ZOOM_0 = 78271.484;\nconst METERS_PER_DEG_LAT = 111320;\nconst ARCGIS_DIAGONAL_FOV_RADIANS = (55 * Math.PI) / 180;\nconst ALTITUDE_BLEND_START_TILT = 65;\nconst ALTITUDE_BLEND_END_TILT = 80;\n\nfunction getDistanceMeters(a, b) {\n const midLatRad = (((a.latitude + b.latitude) / 2) * Math.PI) / 180;\n const dLatM = (a.latitude - b.latitude) * METERS_PER_DEG_LAT;\n const dLngM = (a.longitude - b.longitude) * METERS_PER_DEG_LAT * Math.cos(midLatRad);\n\n return Math.sqrt(dLatM * dLatM + dLngM * dLngM);\n}\n\nfunction getZoom(\n view: SceneView,\n longitude: number,\n latitude: number,\n width: number,\n height: number\n) {\n const focalPoint = view.toMap({x: width / 2, y: height / 2} as any);\n const focalPointRight = view.toMap({x: width / 2 + 1, y: height / 2} as any);\n\n if (focalPoint && focalPointRight) {\n const horizontalMetersPerPixel = getDistanceMeters(focalPoint, focalPointRight);\n\n if (horizontalMetersPerPixel > 0) {\n const latitudeRad = (latitude * Math.PI) / 180;\n return Math.log2(\n (DECK_GROUND_MPP_AT_ZOOM_0 * Math.cos(latitudeRad)) / horizontalMetersPerPixel\n );\n }\n }\n\n return Math.log2(ARCGIS_WEB_MERCATOR_SCALE_AT_ZOOM_0 / view.scale) - 1;\n}\n\nfunction smoothstep(edge0: number, edge1: number, value: number) {\n const t = Math.max(0, Math.min(1, (value - edge0) / (edge1 - edge0)));\n return t * t * (3 - 2 * t);\n}\n\nfunction getFovMatchedAltitude(width: number, height: number) {\n const aspect = width / height;\n const verticalTan = Math.tan(ARCGIS_DIAGONAL_FOV_RADIANS / 2) / Math.sqrt(1 + aspect * aspect);\n\n return 0.5 / verticalTan;\n}\n\nfunction getAltitude(tilt: number, slantAltitude: number, width: number, height: number) {\n const fovAltitude = getFovMatchedAltitude(width, height);\n const blend = smoothstep(ALTITUDE_BLEND_START_TILT, ALTITUDE_BLEND_END_TILT, tilt);\n\n return slantAltitude * (1 - blend) + fovAltitude * blend;\n}\n\nfunction getArcGISMatrixViewState(\n view: SceneView,\n longitude: number,\n latitude: number,\n zoom: number,\n resolution: number,\n altitude: number\n) {\n return {\n views: new MapView({id: 'arcgis-scene'}),\n viewState: {\n 'arcgis-scene': {\n id: 'arcgis-scene',\n longitude,\n latitude,\n zoom,\n pitch: view.camera.tilt,\n bearing: view.camera.heading,\n altitude,\n position: [0, 0, 0],\n resolution\n }\n }\n };\n}\n\nexport default function createDeckRenderer(DeckProps, RenderNode) {\n class DeckRenderer {\n view: SceneView;\n deck: any;\n resources: RenderResources | null = null;\n cancelInitialization: (() => void) | null = null;\n renderNode: any = null;\n\n constructor(viewOrProps: SceneView | ({view: SceneView} & DeckProps), props?: DeckProps) {\n if (viewOrProps && typeof viewOrProps === 'object' && 'view' in viewOrProps) {\n const {view, ...deckProps} = viewOrProps;\n this.view = view;\n this.deck = new DeckProps(deckProps);\n } else {\n this.view = viewOrProps;\n this.deck = new DeckProps(props);\n }\n\n let isInitializing = false;\n\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const self = this;\n const DeckRenderNode = RenderNode.createSubclass({\n consumes: {required: ['composite-color']},\n produces: 'composite-color',\n\n initialize() {},\n\n render(inputs: Array<{name: string}>) {\n // biome-ignore lint/complexity/noThisInStatic: RenderNode render is an instance method\n // eslint-disable-next-line @typescript-eslint/no-this-alias, consistent-this\n const renderNode: any = this;\n const passthrough = inputs.find(i => i.name === 'composite-color');\n\n if (!self.resources && !isInitializing) {\n const gl = renderNode.gl;\n if (gl) {\n isInitializing = true;\n let cancelled = false;\n self.cancelInitialization = () => {\n cancelled = true;\n };\n initializeResources\n .call(self, gl)\n .then(resources => {\n isInitializing = false;\n if (cancelled) {\n finalizeResources(resources);\n return;\n }\n self.deck.on('change', deckProps => resources.deck.setProps(deckProps));\n resources.deck.setProps(self.deck.toJSON());\n self.resources = resources;\n renderNode.requestRender();\n })\n .catch(err => {\n isInitializing = false;\n // eslint-disable-next-line no-console\n console.error('DeckRenderer: failed to initialize resources', err);\n });\n }\n return passthrough;\n }\n if (!self.resources) {\n return passthrough;\n }\n\n const output = renderNode.bindRenderTarget();\n const gl = renderNode.gl as WebGL2RenderingContext;\n\n const dpr = window.devicePixelRatio || 1;\n const width = gl.drawingBufferWidth / dpr;\n const height = gl.drawingBufferHeight / dpr;\n\n // Keep deck.gl's SceneView approximation anchored at the ArcGIS\n // focal point every frame. Zoom comes from the actual horizontal\n // ground meters-per-pixel at screen center (`toMap(center)` and\n // `toMap(center + 1px)`), which stays stable under tilt in local\n // SceneView. We keep the older `view.scale` formula only as a\n // fallback when focal-point sampling is unavailable.\n //\n // deck.gl's `altitude` still couples camera distance and FOV, while\n // ArcGIS keeps them separate. We therefore compute a slant-distance\n // altitude from the live camera position and focal point, then only\n // at high tilt blend toward the ArcGIS fixed-FOV altitude. That\n // preserves the better mid-tilt camera match while reducing the\n // remaining extreme-angle drift.\n const cameraPos = self.view.camera.position;\n const focalPoint = self.view.toMap({x: width / 2, y: height / 2} as any);\n const latitude = focalPoint ? focalPoint.latitude : self.view.center.latitude;\n const longitude = focalPoint ? focalPoint.longitude : self.view.center.longitude;\n\n const midLatRad = (((latitude + cameraPos.latitude) / 2) * Math.PI) / 180;\n const dLatM = (cameraPos.latitude - latitude) * METERS_PER_DEG_LAT;\n const dLngM =\n (cameraPos.longitude - longitude) * METERS_PER_DEG_LAT * Math.cos(midLatRad);\n const horizM = Math.sqrt(dLatM * dLatM + dLngM * dLngM);\n const slantM = Math.sqrt(horizM * horizM + cameraPos.z * cameraPos.z);\n\n const zoom = getZoom(self.view, longitude, latitude, width, height);\n\n const viewportHeightM = height * self.view.resolution;\n const slantAltitude = slantM / viewportHeightM;\n const altitude = getAltitude(self.view.camera.tilt, slantAltitude, width, height);\n const arcgisMatrixView = getArcGISMatrixViewState(\n self.view,\n longitude,\n latitude,\n zoom,\n self.view.resolution,\n altitude\n );\n\n try {\n if (arcgisMatrixView) {\n render(self.resources, {\n width,\n height,\n latitude,\n longitude,\n altitude,\n zoom,\n bearing: self.view.camera.heading,\n pitch: self.view.camera.tilt,\n ...arcgisMatrixView\n });\n } else {\n render(self.resources, {\n width,\n height,\n latitude,\n longitude,\n altitude,\n zoom,\n bearing: self.view.camera.heading,\n pitch: self.view.camera.tilt\n });\n }\n } catch (e) {\n // eslint-disable-next-line no-console\n console.error('DeckRenderer: render error', e);\n }\n\n return output;\n }\n });\n\n this.renderNode = new DeckRenderNode({view: this.view});\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n async setup(_context?: unknown) {}\n\n dispose() {\n this.cancelInitialization?.();\n if (this.resources) {\n finalizeResources(this.resources);\n this.resources = null;\n }\n this.renderNode = null;\n }\n\n redraw() {\n this.renderNode?.requestRender();\n }\n\n render() {\n this.renderNode?.requestRender();\n }\n }\n\n return DeckRenderer;\n}\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport createDeckProps from './deck-props';\nimport createDeckLayer from './deck-layer';\nimport createDeckLayerView2D from './deck-layer-view-2d';\nimport createDeckRenderer from './deck-renderer';\nimport {loadModules as esriLoaderLoadModules, ILoadScriptOptions} from 'esri-loader';\n\ntype LoadedModules = {\n DeckLayer: any;\n DeckRenderer: any;\n modules?: unknown[];\n};\n\nlet arcGIS: LoadedModules;\n\nexport async function loadArcGISModules(\n modules: string[],\n loadScriptOptions: ILoadScriptOptions\n): Promise<LoadedModules> {\n const namespace = Array.isArray(modules) ? null : modules;\n await loadArcGISModule(namespace, loadScriptOptions);\n\n if (Array.isArray(modules)) {\n return esriLoaderLoadModules(modules, loadScriptOptions).then(array => {\n return {...arcGIS, modules: array};\n });\n }\n return arcGIS;\n}\n\nasync function loadArcGISModule(\n esri,\n loadScriptOptions: ILoadScriptOptions\n): Promise<LoadedModules> {\n if (arcGIS) {\n // Already loaded\n return arcGIS;\n }\n if (esri) {\n // Using user-provided dependencies\n // Right now this object has to be manually assembled - let @arcgis/webpack-plugin handle this?\n const Layer = esri.layers.Layer;\n const Accessor = esri.core.Accessor;\n const BaseLayerViewGL2D = esri.views['2d'].layers.BaseLayerViewGL2D;\n const RenderNode = esri.views['3d'].webgl.RenderNode;\n\n return initialize(Layer, Accessor, BaseLayerViewGL2D, RenderNode);\n }\n\n const [Layer, Accessor, BaseLayerViewGL2D, RenderNode] = await esriLoaderLoadModules(\n [\n 'esri/layers/Layer',\n 'esri/core/Accessor',\n 'esri/views/2d/layers/BaseLayerViewGL2D',\n 'esri/views/3d/webgl/RenderNode'\n ],\n loadScriptOptions\n );\n return initialize(Layer, Accessor, BaseLayerViewGL2D, RenderNode);\n}\n\nfunction initialize(Layer, Accessor, BaseLayerViewGL2D, RenderNode): LoadedModules {\n const DeckProps = createDeckProps(Accessor);\n const DeckLayerView2D = createDeckLayerView2D(BaseLayerViewGL2D);\n const DeckLayer = createDeckLayer(DeckProps, Layer, DeckLayerView2D);\n const DeckRenderer = createDeckRenderer(DeckProps, RenderNode);\n\n arcGIS = {DeckLayer, DeckRenderer};\n return arcGIS;\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport createDeckProps from './deck-props';\nimport createDeckLayer from './deck-layer';\nimport createDeckLayerView2D from './deck-layer-view-2d';\nimport createDeckRenderer from './deck-renderer';\n\nimport Accessor from '@arcgis/core/core/Accessor';\nimport Layer from '@arcgis/core/layers/Layer';\nimport BaseLayerViewGL2D from '@arcgis/core/views/2d/layers/BaseLayerViewGL2D';\nimport RenderNode from '@arcgis/core/views/3d/webgl/RenderNode';\n\n// require-style loader\nexport {loadArcGISModules} from './load-modules';\n\n// ESM-style classes\nconst DeckProps = createDeckProps(Accessor);\nconst DeckLayerView2D = createDeckLayerView2D(BaseLayerViewGL2D);\nexport const DeckLayer = createDeckLayer(DeckProps, Layer, DeckLayerView2D);\nexport const DeckRenderer = createDeckRenderer(DeckProps, RenderNode);\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nconst properties = {\n layers: {},\n layerFilter: {},\n parameters: {},\n effects: {},\n pickingRadius: {},\n onBeforeRender: {},\n onAfterRender: {},\n onClick: {},\n onHover: {},\n onDragStart: {},\n onDrag: {},\n onDragEnd: {},\n onError: {},\n debug: {},\n drawPickingColors: {},\n getCursor: {},\n getTooltip: {}\n};\n\n/* eslint-disable callback-return */\nexport default function createDeckProps(Accessor) {\n const DeckProps = Accessor.createSubclass({\n properties,\n\n constructor() {\n this._callbacks = {};\n\n this.watch(Object.keys(properties), (newValue, oldValue, propName) => {\n this.emit('change', {[propName]: newValue});\n });\n },\n\n on(eventName, cb) {\n this._callbacks[eventName] = this._callbacks[eventName] || [];\n this._callbacks[eventName].push(cb);\n },\n\n emit(eventName, details) {\n const callbacks = this._callbacks[eventName];\n if (callbacks) {\n for (const cb of callbacks) {\n cb(details);\n }\n }\n },\n\n toJSON() {\n const result = {};\n for (const key of this.keys()) {\n if (this[key] !== undefined) {\n result[key] = this[key];\n }\n }\n return result;\n }\n });\n\n return DeckProps;\n}\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nexport default function createDeckLayer(DeckProps, Layer, DeckLayerView2D) {\n // A layer that displays inside a MapView using an instance\n // of the layer view defined above.\n return Layer.createSubclass({\n properties: {\n deck: {},\n blendMode: {},\n effect: {}\n },\n\n constructor() {\n this.deck = new DeckProps();\n },\n\n // Called by the MapView whenever a layer view\n // needs to be created for a given layer.\n createLayerView(view) {\n if (view.type === '2d') {\n return new DeckLayerView2D({\n view,\n layer: this\n });\n }\n\n // eslint-disable-next-line\n console.error(\n 'DeckLayer does not support SceneView at the moment. Use DeckRenderer instead.'\n );\n\n return null;\n }\n });\n}\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n/* eslint-disable no-invalid-this */\n\nimport type {Device, Texture, Framebuffer} from '@luma.gl/core';\nimport {Deck} from '@deck.gl/core';\nimport {Model, Geometry} from '@luma.gl/engine';\nimport {GL} from '@luma.gl/webgl/constants';\nimport {WebGLDevice} from '@luma.gl/webgl';\n\ninterface Renderer {\n redraw: () => void;\n}\n\nexport type RenderResources = {\n deck: Deck;\n texture: Texture;\n model: Model;\n fbo: Framebuffer;\n};\n\nasync function createDeckInstance(gl: WebGL2RenderingContext): Promise<{\n deckInstance: Deck;\n device: Device;\n}> {\n return new Promise(resolve => {\n const deckInstance = new Deck({\n // Input is handled by the ArcGIS API for JavaScript.\n controller: false,\n\n // We use the same WebGL context as the ArcGIS API for JavaScript.\n gl,\n\n // We need depth testing in general; we don't know what layers might be added to the deck.\n parameters: {\n depthCompare: 'less-equal'\n },\n\n // To disable canvas resizing, since the FBO is owned by the ArcGIS API for JavaScript.\n width: null,\n height: null,\n\n onDeviceInitialized: (device: Device) => {\n resolve({deckInstance, device});\n }\n });\n });\n}\n\nexport async function initializeResources(\n this: Renderer,\n gl: WebGL2RenderingContext\n): Promise<RenderResources> {\n const {deckInstance, device} = await createDeckInstance(gl);\n\n const texture = device.createTexture({\n format: 'rgba8unorm',\n width: 1,\n height: 1,\n sampler: {\n minFilter: 'linear',\n magFilter: 'linear',\n addressModeU: 'clamp-to-edge',\n addressModeV: 'clamp-to-edge'\n }\n });\n\n const model = new Model(device, {\n vs: `\\\n#version 300 es\nin vec2 pos;\nout vec2 v_texcoord;\nvoid main(void) {\n gl_Position = vec4(pos, 0.0, 1.0);\n v_texcoord = (pos + 1.0) / 2.0;\n}\n `,\n fs: `\\\n#version 300 es\nprecision mediump float;\nuniform sampler2D deckglTexture;\nin vec2 v_texcoord;\nout vec4 fragColor;\n\nvoid main(void) {\n vec4 imageColor = texture(deckglTexture, v_texcoord);\n // FBO stores premultiplied RGBA (rgb already multiplied by alpha).\n // The composite blend (ONE, ONE_MINUS_SRC_ALPHA) handles premultiplied\n // input correctly; multiplying again here would darken overlays.\n fragColor = imageColor;\n}\n `,\n bindings: {\n deckglTexture: texture\n },\n parameters: {\n depthWriteEnabled: false,\n depthCompare: 'always',\n blendColorSrcFactor: 'one',\n blendColorDstFactor: 'one-minus-src-alpha',\n blendAlphaSrcFactor: 'one',\n blendAlphaDstFactor: 'one-minus-src-alpha',\n blendColorOperation: 'add',\n blendAlphaOperation: 'add'\n },\n geometry: new Geometry({\n topology: 'triangle-strip',\n attributes: {\n pos: {size: 2, value: new Int8Array([-1, -1, 1, -1, -1, 1, -1, 1, 1, 1, 1, -1])}\n }\n }),\n vertexCount: 6,\n disableWarnings: true\n });\n\n const fbo = device.createFramebuffer({\n id: 'deckfbo',\n width: 1,\n height: 1,\n colorAttachments: [texture],\n depthStencilAttachment: 'depth16unorm'\n });\n\n deckInstance.setProps({\n // This deck renders into an auxiliary framebuffer.\n _framebuffer: fbo,\n\n _customRender: redrawReason => {\n if (redrawReason === 'arcgis') {\n // ArcGIS renders with alphaSrc=ZERO (preserves destination alpha for its\n // own compositing pipeline). Without resetting this, deck layers inherit\n // that blend state and write alpha=0 into the FBO, making the composite\n // shader output (0,0,0,0) everywhere. Reset to standard premultiplied-alpha\n // blend so the FBO stores correct RGBA for the composite pass.\n const glCtx = (device as WebGLDevice).gl;\n glCtx.blendFuncSeparate(\n glCtx.ONE,\n glCtx.ONE_MINUS_SRC_ALPHA,\n glCtx.ONE,\n glCtx.ONE_MINUS_SRC_ALPHA\n );\n deckInstance._drawLayers(redrawReason);\n } else {\n this.redraw();\n }\n }\n });\n\n return {deck: deckInstance, texture, fbo, model};\n}\n\nexport function render(\n resources: RenderResources,\n viewport: {\n width: number;\n height: number;\n longitude: number;\n latitude: number;\n zoom: number;\n altitude?: number;\n pitch: number;\n bearing: number;\n views?: unknown;\n viewState?: unknown;\n }\n) {\n const {model, deck, fbo} = resources;\n const device = model.device;\n if (device instanceof WebGLDevice) {\n // @ts-ignore device.getParametersWebGL should return `any` not `void`?\n const rawScreenFbo: WebGLFramebuffer | null = device.getParametersWebGL(GL.FRAMEBUFFER_BINDING);\n const {width, height, views, viewState, ...defaultViewState} = viewport;\n\n /* global window */\n const dpr = window.devicePixelRatio;\n const pixelWidth = Math.round(width * dpr);\n const pixelHeight = Math.round(height * dpr);\n\n fbo.resize({width: pixelWidth, height: pixelHeight});\n\n // luma's Framebuffer.resize() clones and destroys the color attachment texture when\n // dimensions change, leaving the cached texture reference and the model sampler binding\n // pointing at a destroyed GPU handle. Re-sync if the attachment was replaced.\n const currentTexture =\n (fbo.colorAttachments[0] as any).texture ?? (fbo.colorAttachments[0] as unknown as Texture);\n if (currentTexture !== resources.texture) {\n resources.texture = currentTexture;\n (model as any).setBindings({deckglTexture: currentTexture});\n }\n\n // Pass CSS pixel dimensions \u2014 deck handles DPR internally. Passing physical\n // pixels would double-apply DPR and project layer geometry off-screen.\n // Without width/height, deck's viewport aspect diverges from ArcGIS's,\n // causing the overlay to drift off the ground plane under tilt/rotation.\n const deckProps: any = {\n width,\n height,\n viewState: viewState || defaultViewState\n };\n if (views) {\n deckProps.views = views;\n }\n deck.setProps(deckProps);\n // redraw deck immediately into deckFbo\n deck.redraw('arcgis');\n\n // We overlay the texture on top of the map using the full-screen quad.\n const {gl} = device;\n\n // drawBuffers is per-FBO state not tracked by luma's state cache;\n // restore it for the screen FBO after rendering to the offscreen FBO.\n if (rawScreenFbo) {\n gl.bindFramebuffer(GL.FRAMEBUFFER, rawScreenFbo);\n gl.drawBuffers([GL.COLOR_ATTACHMENT0]);\n } else {\n gl.drawBuffers([GL.BACK]);\n }\n\n // The model sets blend factors but not blend:true, so\n // setDeviceParameters won't enable blending on its own.\n gl.enable(GL.BLEND);\n gl.blendFuncSeparate(GL.ONE, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA);\n gl.blendEquationSeparate(GL.FUNC_ADD, GL.FUNC_ADD);\n\n // luma's WEBGLRenderPass duck-types the framebuffer prop, reading `.handle`, `.width`,\n // `.height`, and `.colorAttachments`. A raw WebGLFramebuffer has none of those, which\n // breaks viewport auto-setup and draw-buffer selection. Build a minimal adapter that\n // luma's state tracker accepts; `'handle' in obj` is true, so the raw FBO is bound.\n const screenFboAdapter = {\n handle: rawScreenFbo,\n width: pixelWidth,\n height: pixelHeight,\n colorAttachments: [null]\n };\n\n const textureToScreenPass = device.beginRenderPass({\n framebuffer: screenFboAdapter as any,\n parameters: {viewport: [0, 0, pixelWidth, pixelHeight]},\n clearColor: false,\n clearDepth: false\n });\n try {\n model.draw(textureToScreenPass);\n } finally {\n textureToScreenPass.end();\n }\n }\n}\n\nexport function finalizeResources(resources: RenderResources) {\n resources.deck.finalize();\n resources.model.destroy();\n resources.fbo.destroy();\n resources.texture.destroy();\n}\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {initializeResources, render, finalizeResources} from './commons';\n\nexport default function createDeckLayerView2D(BaseLayerViewGL2D) {\n return BaseLayerViewGL2D.createSubclass({\n properties: {\n cancelInitialization: null,\n resources: null\n },\n\n // Attach is called as soon as the layer view is ready to start rendering.\n async attach() {\n // We use a full-screen quad and shaders to composite the frame rendered\n // with deck.gl on top of the MapView. Composition uses the MapView context.\n const gl = this.context;\n\n let cancelled = false;\n this.cancelInitialization = () => (cancelled = true);\n const resources = await initializeResources.call(this, gl);\n // If the layer got detached while awaiting, do not proceed\n if (cancelled) {\n finalizeResources(resources);\n return;\n }\n this.resources = resources;\n\n // Update deck props\n this.layer.deck.on('change', props => resources.deck.setProps(props));\n\n // We need to start drawing the deck.gl layer immediately.\n resources.deck.setProps(this.layer.deck.toJSON());\n },\n\n redraw() {\n this.requestRender();\n },\n\n // Called when the layer must be destroyed.\n detach() {\n this.cancelInitialization?.();\n if (this.resources) {\n finalizeResources(this.resources);\n this.resources = null;\n }\n },\n\n // Called every time that the layer view must be rendered.\n render(renderParameters) {\n if (!this.resources) {\n return;\n }\n\n const [width, height] = this.view.state.size;\n // The view state must be kept in-sync with the MapView of the ArcGIS API.\n const state = renderParameters.state;\n\n render(this.resources, {\n width,\n height,\n latitude: this.view.center.latitude,\n longitude: this.view.center.longitude,\n zoom: this.view.featuresTilingScheme.scaleToLevel(state.scale),\n bearing: -state.rotation,\n pitch: 0\n });\n }\n });\n}\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nexport type LayoutExpression =\n | {type: 'literal'; value: number}\n | {type: 'percentage'; value: number}\n | {type: 'binary'; operator: '+' | '-'; left: LayoutExpression; right: LayoutExpression};\n\ntype Token =\n | {type: 'number'; value: number}\n | {type: 'word'; value: string}\n | {type: 'symbol'; value: string};\n\nconst NUMBER_REGEX = /^(?:\\d+\\.?\\d*|\\.\\d+)$/;\n\n// Takes a number or a string expression that may include numbers, percentages, `px` units or\n// CSS-style `calc()` expressions containing `+`/`-` operations and parentheses.\nexport function parsePosition(value: number | string): LayoutExpression {\n switch (typeof value) {\n case 'number':\n if (!Number.isFinite(value)) {\n throw new Error(`Could not parse position string ${value}`);\n }\n return {type: 'literal', value};\n\n case 'string':\n try {\n const tokens = tokenize(value);\n const parser = new LayoutExpressionParser(tokens);\n return parser.parseExpression();\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n throw new Error(`Could not parse position string ${value}: ${reason}`);\n }\n\n default:\n throw new Error(`Could not parse position string ${value}`);\n }\n}\n\nexport function evaluateLayoutExpression(expression: LayoutExpression, extent: number): number {\n switch (expression.type) {\n case 'literal':\n return expression.value;\n case 'percentage':\n return Math.round(expression.value * extent);\n case 'binary':\n const left = evaluateLayoutExpression(expression.left, extent);\n const right = evaluateLayoutExpression(expression.right, extent);\n return expression.operator === '+' ? left + right : left - right;\n default:\n throw new Error('Unknown layout expression type');\n }\n}\n\nexport function getPosition(expression: LayoutExpression, extent: number): number {\n return evaluateLayoutExpression(expression, extent);\n}\n\nfunction tokenize(input: string): Token[] {\n const tokens: Token[] = [];\n let index = 0;\n while (index < input.length) {\n const char = input[index];\n if (/\\s/.test(char)) {\n index++;\n continue;\n }\n if (char === '+' || char === '-' || char === '(' || char === ')' || char === '%') {\n tokens.push({type: 'symbol', value: char});\n index++;\n continue;\n }\n if (isDigit(char) || char === '.') {\n const start = index;\n let hasDecimal = char === '.';\n index++;\n while (index < input.length) {\n const next = input[index];\n if (isDigit(next)) {\n index++;\n continue;\n }\n if (next === '.' && !hasDecimal) {\n hasDecimal = true;\n index++;\n continue;\n }\n break;\n }\n const numberString = input.slice(start, index);\n if (!NUMBER_REGEX.test(numberString)) {\n throw new Error('Invalid number token');\n }\n tokens.push({type: 'number', value: parseFloat(numberString)});\n continue;\n }\n if (isAlpha(char)) {\n const start = index;\n while (index < input.length && isAlpha(input[index])) {\n index++;\n }\n const word = input.slice(start, index).toLowerCase();\n tokens.push({type: 'word', value: word});\n continue;\n }\n throw new Error('Invalid token in position string');\n }\n return tokens;\n}\n\nclass LayoutExpressionParser {\n private tokens: Token[];\n private index = 0;\n\n constructor(tokens: Token[]) {\n this.tokens = tokens;\n }\n\n parseExpression(): LayoutExpression {\n const expression = this.parseBinaryExpression();\n if (this.index < this.tokens.length) {\n throw new Error('Unexpected token at end of expression');\n }\n return expression;\n }\n\n private parseBinaryExpression(): LayoutExpression {\n let expression = this.parseFactor();\n let token = this.peek();\n while (isAddSubSymbol(token)) {\n this.index++;\n const right = this.parseFactor();\n expression = {type: 'binary', operator: token.value, left: expression, right};\n token = this.peek();\n }\n return expression;\n }\n\n private parseFactor(): LayoutExpression {\n const token = this.peek();\n if (!token) {\n throw new Error('Unexpected end of expression');\n }\n\n if (token.type === 'symbol' && token.value === '+') {\n this.index++;\n return this.parseFactor();\n }\n if (token.type === 'symbol' && token.value === '-') {\n this.index++;\n const factor = this.parseFactor();\n return {type: 'binary', operator: '-', left: {type: 'literal', value: 0}, right: factor};\n }\n if (token.type === 'symbol' && token.value === '(') {\n this.index++;\n const expression = this.parseBinaryExpression();\n if (!this.consumeSymbol(')')) {\n throw new Error('Missing closing parenthesis');\n }\n return expression;\n }\n if (token.type === 'word' && token.value === 'calc') {\n this.index++;\n if (!this.consumeSymbol('(')) {\n throw new Error('Missing opening parenthesis after calc');\n }\n const expression = this.parseBinaryExpression();\n if (!this.consumeSymbol(')')) {\n throw new Error('Missing closing parenthesis');\n }\n return expression;\n }\n if (token.type === 'number') {\n this.index++;\n const numberValue = token.value;\n const nextToken = this.peek();\n if (nextToken && nextToken.type === 'symbol' && nextToken.value === '%') {\n this.index++;\n return {type: 'percentage', value: numberValue / 100};\n }\n if (nextToken && nextToken.type === 'word' && nextToken.value === 'px') {\n this.index++;\n return {type: 'literal', value: numberValue};\n }\n return {type: 'literal', value: numberValue};\n }\n\n throw new Error('Unexpected token in expression');\n }\n\n private consumeSymbol(value: string): boolean {\n const token = this.peek();\n if (token && token.type === 'symbol' && token.value === value) {\n this.index++;\n return true;\n }\n return false;\n }\n\n private peek(): Token | null {\n return this.tokens[this.index] || null;\n }\n}\n\nfunction isDigit(char: string): boolean {\n return char >= '0' && char <= '9';\n}\n\nfunction isAlpha(char: string): boolean {\n return (char >= 'a' && char <= 'z') || (char >= 'A' && char <= 'Z');\n}\n\nfunction isAddSubSymbol(token: Token | null): token is Token & {type: 'symbol'; value: '+' | '-'} {\n return Boolean(token && token.type === 'symbol' && (token.value === '+' || token.value === '-'));\n}\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n/**\n * Fast partial deep equal for prop.\n *\n * @param a Prop\n * @param b Prop to compare against `a`\n * @param depth Depth to which to recurse in nested Objects/Arrays. Use 0 (default) for shallow comparison, -1 for infinite depth\n */\n/* eslint-disable complexity */\nexport function deepEqual(a: any, b: any, depth: number): boolean {\n if (a === b) {\n return true;\n }\n if (!depth || !a || !b) {\n return false;\n }\n if (Array.isArray(a)) {\n if (!Array.isArray(b) || a.length !== b.length) {\n return false;\n }\n for (let i = 0; i < a.length; i++) {\n if (!deepEqual(a[i], b[i], depth - 1)) {\n return false;\n }\n }\n return true;\n }\n if (Array.isArray(b)) {\n return false;\n }\n if (typeof a === 'object' && typeof b === 'object') {\n const aKeys = Object.keys(a);\n const bKeys = Object.keys(b);\n if (aKeys.length !== bKeys.length) {\n return false;\n }\n for (const key of aKeys) {\n if (!b.hasOwnProperty(key)) {\n return false;\n }\n if (!deepEqual(a[key], b[key], depth - 1)) {\n return false;\n }\n }\n return true;\n }\n return false;\n}\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n/** Merge two viewstates, except `id`\n * For position arrays such as `target`, only override the components that are defined.\n */\nexport function deepMergeViewState<ViewStateT extends Record<string, any>>(\n a: ViewStateT,\n b: ViewStateT\n): ViewStateT {\n const result = {...a};\n for (const key in b) {\n if (key === 'id') continue;\n if (Array.isArray(result[key]) && Array.isArray(b[key])) {\n result[key] = mergeNumericArray(result[key], b[key]) as any;\n } else {\n result[key] = b[key];\n }\n }\n return result;\n}\n\nfunction mergeNumericArray(target: number[], source: number[]): number[] {\n target = target.slice();\n for (let i = 0; i < source.length; i++) {\n const v = source[i];\n if (Number.isFinite(v)) {\n target[i] = v;\n }\n }\n return target;\n}\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport Viewport from '../viewports/viewport';\nimport {parsePosition, getPosition, LayoutExpression} from '../utils/positions';\nimport {deepEqual} from '../utils/deep-equal';\nimport {deepMergeViewState} from '../utils/deep-merge';\nimport type Controller from '../controllers/controller';\nimport type {ControllerOptions} from '../controllers/controller';\nimport type {TransitionProps} from '../controllers/transition-manager';\nimport type {Padding} from '../viewports/viewport';\nimport type {ConstructorOf} from '../types/types';\nimport type {Parameters} from '@luma.gl/core';\n\nexport type CommonViewState = TransitionProps;\n\nexport type CommonViewProps<ViewState> = {\n /** A unique id of the view. In a multi-view use case, this is important for matching view states and place contents into this view. */\n id?: string;\n /**\n * Optional id of the presentation canvas associated with this view.\n * Integrations that render views into multiple canvases can use this id to route view-scoped\n * resources such as event managers.\n */\n canvasId?: string;\n /** A relative (e.g. `'50%'`) or absolute position. Default `0`. */\n x?: number | string;\n /** A relative (e.g. `'50%'`) or absolute position. Default `0`. */\n y?: number | string;\n /** A relative (e.g. `'50%'`) or absolute extent. Default `'100%'`. */\n width?: number | string;\n /** A relative (e.g. `'50%'`) or absolute extent. Default `'100%'`. */\n height?: number | string;\n /** Padding around the view, expressed in either relative (e.g. `'50%'`) or absolute pixels. Default `null`. */\n padding?: {\n left?: number | string;\n right?: number | string;\n top?: number | string;\n bottom?: number | string;\n } | null;\n /** When using multiple views, set this flag to wipe the pixels drawn by other overlapping views. Default `false` */\n clear?: boolean;\n /** Color to clear the viewport with, in RGBA format [r, g, b, a?]. Values are 0-255. Default `[0, 0, 0, 0]` (transparent). */\n clearColor?: number[] | false;\n /** Depth buffer value to clear the viewport with, between 0.0 - 1.0. Default `1.0` (far plane). */\n clearDepth?: number | false;\n /** Stencil buffer Value to clear the viewport with, between 0 - 255. Default `0` (clear). */\n clearStencil?: number | false;\n /** Override the GPU parameters used to draw layers in this view. */\n parameters?: Parameters;\n /** State of the view */\n viewState?:\n | string\n | ({\n id?: string;\n } & Partial<ViewState>);\n /** Options for viewport interactivity. */\n controller?:\n | null\n | boolean\n | ConstructorOf<Controller<any>>\n | (ControllerOptions & {\n type?: ConstructorOf<Controller<any>>;\n });\n};\n\nexport default abstract class View<\n ViewState extends CommonViewState = CommonViewState,\n ViewProps extends CommonViewProps<ViewState> = CommonViewProps<ViewState>\n> {\n id: string;\n abstract getViewportType(viewState: ViewState): ConstructorOf<Viewport>;\n protected abstract get ControllerType(): ConstructorOf<Controller<any>>;\n\n private _x: LayoutExpression;\n private _y: LayoutExpression;\n private _width: LayoutExpression;\n private _height: LayoutExpression;\n private _padding: {\n left: LayoutExpression;\n right: LayoutExpression;\n top: LayoutExpression;\n bottom: LayoutExpression;\n } | null;\n\n readonly props: ViewProps;\n\n constructor(props: ViewProps) {\n const {id, x = 0, y = 0, width = '100%', height = '100%', padding = null} = props;\n\n // @ts-ignore\n this.id = id || this.constructor.displayName || 'view';\n\n this.props = {...props, id: this.id};\n\n // Extents\n this._x = parsePosition(x);\n this._y = parsePosition(y);\n this._width = parsePosition(width);\n this._height = parsePosition(height);\n this._padding = padding && {\n left: parsePosition(padding.left || 0),\n right: parsePosition(padding.right || 0),\n top: parsePosition(padding.top || 0),\n bottom: parsePosition(padding.bottom || 0)\n };\n\n // Bind methods for easy access\n this.equals = this.equals.bind(this);\n\n Object.seal(this);\n }\n\n equals(view: this): boolean {\n if (this === view) {\n return true;\n }\n\n // To correctly compare padding use depth=2\n return this.constructor === view.constructor && deepEqual(this.props, view.props, 2);\n }\n\n /** Clone this view with modified props */\n clone(newProps: Partial<ViewProps>): this {\n const ViewConstructor = this.constructor as new (props: ViewProps) => this;\n return new ViewConstructor({...this.props, ...newProps});\n }\n\n /** Make viewport from canvas dimensions and view state */\n makeViewport({width, height, viewState}: {width: number; height: number; viewState: ViewState}) {\n viewState = this.filterViewState(viewState);\n\n // Resolve relative viewport dimensions\n const viewportDimensions = this.getDimensions({width, height});\n if (!viewportDimensions.height || !viewportDimensions.width) {\n return null;\n }\n const ViewportType = this.getViewportType(viewState);\n return new ViewportType({...viewState, ...this.props, ...viewportDimensions});\n }\n\n getViewStateId(): string {\n const {viewState} = this.props;\n if (typeof viewState === 'string') {\n // if View.viewState is a string, return it\n return viewState;\n }\n return viewState?.id || this.id;\n }\n\n // Allows view to override (or completely define) viewState\n filterViewState(viewState: ViewState): ViewState {\n if (this.props.viewState && typeof this.props.viewState === 'object') {\n // If we have specified an id, then intent is to override,\n // If not, completely specify the view state\n if (!this.props.viewState.id) {\n return this.props.viewState as ViewState;\n }\n\n return deepMergeViewState<ViewState>(viewState, this.props.viewState as ViewState);\n }\n\n return viewState;\n }\n\n /** Resolve the dimensions of the view from overall canvas dimensions */\n getDimensions({width, height}: {width: number; height: number}): {\n x: number;\n y: number;\n width: number;\n height: number;\n padding?: Padding;\n } {\n const dimensions: {\n x: number;\n y: number;\n width: number;\n height: number;\n padding?: Padding;\n } = {\n x: getPosition(this._x, width),\n y: getPosition(this._y, height),\n width: getPosition(this._width, width),\n height: getPosition(this._height, height)\n };\n\n if (this._padding) {\n dimensions.padding = {\n left: getPosition(this._padding.left, width),\n top: getPosition(this._padding.top, height),\n right: getPosition(this._padding.right, width),\n bottom: getPosition(this._padding.bottom, height)\n };\n }\n return dimensions;\n }\n\n // Used by sub classes to resolve controller props\n get controller(): (ControllerOptions & {type: ConstructorOf<Controller<any>>}) | null {\n const opts = this.props.controller;\n\n if (!opts) {\n return null;\n }\n if (opts === true) {\n return {type: this.ControllerType};\n }\n if (typeof opts === 'function') {\n return {type: opts};\n }\n return {type: this.ControllerType, ...opts};\n }\n}\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {Log} from '@probe.gl/log';\n\nconst defaultLogger: Log = new Log({id: 'deck'});\n\nexport default defaultLogger;\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n// Extensions to math.gl library. Intended to be folded back.\nimport typedArrayManager from './typed-array-manager';\nimport {Vector3, NumericArray} from '@math.gl/core';\n\nimport type {Matrix4} from '@math.gl/core';\n\n// Helper, avoids low-precision 32 bit matrices from gl-matrix mat4.create()\nexport function createMat4(): number[] {\n return [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1];\n}\n\nexport function mod(value: number, divisor: number): number {\n const modulus = value % divisor;\n return modulus < 0 ? divisor + modulus : modulus;\n}\n\n// Extract camera vectors (move to math library?)\nexport function getCameraPosition(\n viewMatrixInverse: Matrix4 | NumericArray\n): [number, number, number] {\n // Read the translation from the inverse view matrix\n return [viewMatrixInverse[12], viewMatrixInverse[13], viewMatrixInverse[14]];\n}\n\nexport function getProjectionParameters(projectionMatrix: Matrix4 | NumericArray): {\n near: number;\n far: number;\n} {\n const m22 = projectionMatrix[10];\n const m23 = projectionMatrix[14];\n return {\n near: m23 / (m22 - 1),\n far: m23 / (m22 + 1)\n };\n}\n\nexport type FrustumPlane = {\n distance: number;\n normal: Vector3;\n};\n\n// https://www.gamedevs.org/uploads/fast-extraction-viewing-frustum-planes-from-world-view-projection-matrix.pdf\nexport function getFrustumPlanes(viewProjectionMatrix: Matrix4 | NumericArray): {\n left: FrustumPlane;\n right: FrustumPlane;\n top: FrustumPlane;\n bottom: FrustumPlane;\n near: FrustumPlane;\n far: FrustumPlane;\n} {\n return {\n left: getFrustumPlane(\n viewProjectionMatrix[3] + viewProjectionMatrix[0],\n viewProjectionMatrix[7] + viewProjectionMatrix[4],\n viewProjectionMatrix[11] + viewProjectionMatrix[8],\n viewProjectionMatrix[15] + viewProjectionMatrix[12]\n ),\n right: getFrustumPlane(\n viewProjectionMatrix[3] - viewProjectionMatrix[0],\n viewProjectionMatrix[7] - viewProjectionMatrix[4],\n viewProjectionMatrix[11] - viewProjectionMatrix[8],\n viewProjectionMatrix[15] - viewProjectionMatrix[12]\n ),\n bottom: getFrustumPlane(\n viewProjectionMatrix[3] + viewProjectionMatrix[1],\n viewProjectionMatrix[7] + viewProjectionMatrix[5],\n viewProjectionMatrix[11] + viewProjectionMatrix[9],\n viewProjectionMatrix[15] + viewProjectionMatrix[13]\n ),\n top: getFrustumPlane(\n viewProjectionMatrix[3] - viewProjectionMatrix[1],\n viewProjectionMatrix[7] - viewProjectionMatrix[5],\n viewProjectionMatrix[11] - viewProjectionMatrix[9],\n viewProjectionMatrix[15] - viewProjectionMatrix[13]\n ),\n near: getFrustumPlane(\n viewProjectionMatrix[3] + viewProjectionMatrix[2],\n viewProjectionMatrix[7] + viewProjectionMatrix[6],\n viewProjectionMatrix[11] + viewProjectionMatrix[10],\n viewProjectionMatrix[15] + viewProjectionMatrix[14]\n ),\n far: getFrustumPlane(\n viewProjectionMatrix[3] - viewProjectionMatrix[2],\n viewProjectionMatrix[7] - viewProjectionMatrix[6],\n viewProjectionMatrix[11] - viewProjectionMatrix[10],\n viewProjectionMatrix[15] - viewProjectionMatrix[14]\n )\n };\n}\n\nconst scratchVector = new Vector3();\n\nfunction getFrustumPlane(a: number, b: number, c: number, d: number): FrustumPlane {\n scratchVector.set(a, b, c);\n const L = scratchVector.len();\n return {distance: d / L, normal: new Vector3(-a / L, -b / L, -c / L)};\n}\n\n/**\n * Calculate the low part of a WebGL 64 bit float\n * @param x {number} - the input float number\n * @returns {number} - the lower 32 bit of the number\n */\nexport function fp64LowPart(x: number): number {\n return x - Math.fround(x);\n}\n\nlet scratchArray;\n\n/**\n * Split a Float64Array into a double-length Float32Array\n * @param typedArray\n * @param options\n * @param options.size - per attribute size\n * @param options.startIndex - start index in the source array\n * @param options.endIndex - end index in the source array\n * @returns {} - high part, low part for each attribute:\n [1xHi, 1yHi, 1zHi, 1xLow, 1yLow, 1zLow, 2xHi, ...]\n */\nexport function toDoublePrecisionArray(\n typedArray: Float64Array,\n options: {size?: number; startIndex?: number; endIndex?: number}\n): Float32Array {\n const {size = 1, startIndex = 0} = options;\n\n const endIndex = options.endIndex !== undefined ? options.endIndex : typedArray.length;\n\n const count = (endIndex - startIndex) / size;\n scratchArray = typedArrayManager.allocate(scratchArray, count, {\n type: Float32Array,\n size: size * 2\n });\n\n let sourceIndex = startIndex;\n let targetIndex = 0;\n while (sourceIndex < endIndex) {\n for (let j = 0; j < size; j++) {\n const value = typedArray[sourceIndex++];\n scratchArray[targetIndex + j] = value;\n scratchArray[targetIndex + j + size] = fp64LowPart(value);\n }\n targetIndex += size * 2;\n }\n\n return scratchArray.subarray(0, count * size * 2);\n}\n\ntype LayerBounds = [number[], number[]];\nexport function mergeBounds(boundsList: (LayerBounds | null)[]): LayerBounds | null {\n let mergedBounds: LayerBounds | null = null;\n let isMerged = false;\n\n for (const bounds of boundsList) {\n /* eslint-disable-next-line no-continue */\n if (!bounds) continue;\n if (!mergedBounds) {\n mergedBounds = bounds;\n } else {\n if (!isMerged) {\n // Copy to avoid mutating input bounds\n mergedBounds = [\n [mergedBounds[0][0], mergedBounds[0][1]],\n [mergedBounds[1][0], mergedBounds[1][1]]\n ];\n isMerged = true;\n }\n\n mergedBounds[0][0] = Math.min(mergedBounds[0][0], bounds[0][0]);\n mergedBounds[0][1] = Math.min(mergedBounds[0][1], bounds[0][1]);\n mergedBounds[1][0] = Math.max(mergedBounds[1][0], bounds[1][0]);\n mergedBounds[1][1] = Math.max(mergedBounds[1][1], bounds[1][1]);\n }\n }\n\n return mergedBounds;\n}\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport log from '../utils/log';\nimport {createMat4, getCameraPosition, getFrustumPlanes, FrustumPlane} from '../utils/math-utils';\n\nimport {Matrix4, Vector3, equals, clamp, mat4} from '@math.gl/core';\n\nimport {\n getDistanceScales,\n getMeterZoom,\n lngLatToWorld,\n worldToLngLat,\n worldToPixels,\n pixelsToWorld\n} from '@math.gl/web-mercator';\n\nimport {PROJECTION_MODE} from '../lib/constants';\n\nexport type DistanceScales = {\n unitsPerMeter: number[];\n metersPerUnit: number[];\n};\n\nexport type Padding = {\n left?: number;\n right?: number;\n top?: number;\n bottom?: number;\n};\n\nexport type ViewportOptions = {\n /** Name of the viewport */\n id?: string;\n /** Left offset from the canvas edge, in pixels */\n x?: number;\n /** Top offset from the canvas edge, in pixels */\n y?: number;\n /** Viewport width in pixels */\n width?: number;\n /** Viewport height in pixels */\n height?: number;\n /** Longitude in degrees (geospatial only) */\n longitude?: number;\n /** Latitude in degrees (geospatial only) */\n latitude?: number;\n /** Viewport center in world space. If geospatial, refers to meter offsets from lng, lat, elevation */\n position?: number[];\n /** Zoom level */\n zoom?: number;\n /** Padding around the viewport, in pixels. */\n padding?: Padding | null;\n distanceScales?: DistanceScales;\n /** Model matrix of viewport center */\n modelMatrix?: number[] | null;\n /** Custom view matrix */\n viewMatrix?: number[];\n /** Custom projection matrix */\n projectionMatrix?: number[];\n /** Modifier of viewport scale. Corresponds to the number of pixels per common unit at zoom 0. */\n focalDistance?: number;\n /** Use orthographic projection */\n orthographic?: boolean;\n /** fovy in radians. If supplied, overrides fovy */\n fovyRadians?: number;\n /** fovy in degrees. */\n fovy?: number;\n /** Near plane of the projection matrix */\n near?: number;\n /** Far plane of the projection matrix */\n far?: number;\n};\n\nconst DEGREES_TO_RADIANS = Math.PI / 180;\n\nconst IDENTITY = createMat4();\n\nconst ZERO_VECTOR = [0, 0, 0];\n\nconst DEFAULT_DISTANCE_SCALES: DistanceScales = {\n unitsPerMeter: [1, 1, 1],\n metersPerUnit: [1, 1, 1]\n};\n\n// / Helpers\nfunction createProjectionMatrix({\n width,\n height,\n orthographic,\n fovyRadians,\n focalDistance,\n padding,\n near,\n far\n}: {\n width: number;\n height: number;\n orthographic: boolean;\n fovyRadians: number;\n focalDistance: number;\n padding: Padding | null;\n near: number;\n far: number;\n}) {\n const aspect = width / height;\n const matrix = orthographic\n ? new Matrix4().orthographic({fovy: fovyRadians, aspect, focalDistance, near, far})\n : new Matrix4().perspective({fovy: fovyRadians, aspect, near, far});\n if (padding) {\n const {left = 0, right = 0, top = 0, bottom = 0} = padding;\n const offsetX = clamp((left + width - right) / 2, 0, width) - width / 2;\n const offsetY = clamp((top + height - bottom) / 2, 0, height) - height / 2;\n // pixels to clip space\n matrix[8] -= (offsetX * 2) / width;\n matrix[9] += (offsetY * 2) / height;\n }\n return matrix;\n}\n\n/**\n * Manages coordinate system transformations.\n *\n * Note: The Viewport is immutable in the sense that it only has accessors.\n * A new viewport instance should be created if any parameters have changed.\n */\nexport default class Viewport {\n static displayName = 'Viewport';\n\n /** Init parameters */\n\n id: string;\n x: number;\n y: number;\n width: number;\n height: number;\n padding?: Padding | null;\n isGeospatial: boolean;\n zoom: number;\n focalDistance: number;\n position: number[];\n modelMatrix: number[] | null;\n\n /** Derived parameters */\n\n // `!` post-fix expression operator asserts that its operand is non-null and non-undefined in contexts\n // where the type checker is unable to conclude that fact.\n\n distanceScales: DistanceScales; /** scale factors between world space and common space */\n scale!: number; /** scale factor, equals 2^zoom */\n center!: number[]; /** viewport center in common space */\n cameraPosition!: number[]; /** Camera position in common space */\n projectionMatrix!: number[];\n viewMatrix!: number[];\n viewMatrixUncentered!: number[];\n viewMatrixInverse!: number[];\n viewProjectionMatrix!: number[];\n pixelProjectionMatrix!: number[];\n pixelUnprojectionMatrix!: number[];\n resolution?: number;\n\n private _frustumPlanes: {[name: string]: FrustumPlane} = {};\n\n // eslint-disable-next-line complexity\n constructor(opts: ViewportOptions = {}) {\n // @ts-ignore\n this.id = opts.id || this.constructor.displayName || 'viewport';\n\n this.x = opts.x || 0;\n this.y = opts.y || 0;\n // Silently allow apps to send in w,h = 0,0\n this.width = opts.width || 1;\n this.height = opts.height || 1;\n this.zoom = opts.zoom || 0;\n this.padding = opts.padding;\n this.distanceScales = opts.distanceScales || DEFAULT_DISTANCE_SCALES;\n this.focalDistance = opts.focalDistance || 1;\n this.position = opts.position || ZERO_VECTOR;\n this.modelMatrix = opts.modelMatrix || null;\n\n const {longitude, latitude} = opts;\n this.isGeospatial = Number.isFinite(latitude) && Number.isFinite(longitude);\n\n this._initProps(opts);\n this._initMatrices(opts);\n\n // Bind methods for easy access\n this.equals = this.equals.bind(this);\n this.project = this.project.bind(this);\n this.unproject = this.unproject.bind(this);\n this.projectPosition = this.projectPosition.bind(this);\n this.unprojectPosition = this.unprojectPosition.bind(this);\n this.projectFlat = this.projectFlat.bind(this);\n this.unprojectFlat = this.unprojectFlat.bind(this);\n }\n\n get subViewports(): Viewport[] | null {\n return null;\n }\n\n get metersPerPixel(): number {\n return this.distanceScales.metersPerUnit[2] / this.scale;\n }\n\n get projectionMode(): number {\n if (this.isGeospatial) {\n return this.zoom < 12\n ? PROJECTION_MODE.WEB_MERCATOR\n : PROJECTION_MODE.WEB_MERCATOR_AUTO_OFFSET;\n }\n return PROJECTION_MODE.IDENTITY;\n }\n\n // Two viewports are equal if width and height are identical, and if\n // their view and projection matrices are (approximately) equal.\n equals(viewport: Viewport): boolean {\n if (!(viewport instanceof Viewport)) {\n return false;\n }\n if (this === viewport) {\n return true;\n }\n\n return (\n viewport.width === this.width &&\n viewport.height === this.height &&\n viewport.scale === this.scale &&\n equals(viewport.projectionMatrix, this.projectionMatrix) &&\n equals(viewport.viewMatrix, this.viewMatrix)\n );\n // TODO - check distance scales?\n }\n\n /**\n * Projects xyz (possibly latitude and longitude) to pixel coordinates in window\n * using viewport projection parameters\n * - [longitude, latitude] to [x, y]\n * - [longitude, latitude, Z] => [x, y, z]\n * Note: By default, returns top-left coordinates for canvas/SVG type render\n *\n * @param {Array} lngLatZ - [lng, lat] or [lng, lat, Z]\n * @param {Object} opts - options\n * @param {Object} opts.topLeft=true - Whether projected coords are top left\n * @return {Array} - [x, y] or [x, y, z] in top left coords\n */\n project(xyz: number[], {topLeft = true}: {topLeft?: boolean} = {}): number[] {\n const worldPosition = this.projectPosition(xyz);\n const coord = worldToPixels(worldPosition, this.pixelProjectionMatrix);\n\n const [x, y] = coord;\n const y2 = topLeft ? y : this.height - y;\n return xyz.length === 2 ? [x, y2] : [x, y2, coord[2]];\n }\n\n /**\n * Unproject pixel coordinates on screen onto world coordinates,\n * (possibly [lon, lat]) on map.\n * - [x, y] => [lng, lat]\n * - [x, y, z] => [lng, lat, Z]\n * @param {Array} xyz -\n * @param {Object} opts - options\n * @param {Object} opts.topLeft=true - Whether origin is top left\n * @return {Array|null} - [lng, lat, Z] or [X, Y, Z]\n */\n unproject(\n xyz: number[],\n {topLeft = true, targetZ}: {topLeft?: boolean; targetZ?: number} = {}\n ): number[] {\n const [x, y, z] = xyz;\n\n const y2 = topLeft ? y : this.height - y;\n const targetZWorld = targetZ && targetZ * this.distanceScales.unitsPerMeter[2];\n const coord = pixelsToWorld([x, y2, z], this.pixelUnprojectionMatrix, targetZWorld);\n const [X, Y, Z] = this.unprojectPosition(coord);\n\n if (Number.isFinite(z)) {\n return [X, Y, Z];\n }\n return Number.isFinite(targetZ) ? [X, Y, targetZ as number] : [X, Y];\n }\n\n // NON_LINEAR PROJECTION HOOKS\n // Used for web meractor projection\n\n projectPosition(xyz: number[]): [number, number, number] {\n const [X, Y] = this.projectFlat(xyz);\n const Z = (xyz[2] || 0) * this.distanceScales.unitsPerMeter[2];\n return [X, Y, Z];\n }\n\n unprojectPosition(xyz: number[]): [number, number, number] {\n const [X, Y] = this.unprojectFlat(xyz);\n const Z = (xyz[2] || 0) * this.distanceScales.metersPerUnit[2];\n return [X, Y, Z];\n }\n\n /**\n * Project [lng,lat] on sphere onto [x,y] on 512*512 Mercator Zoom 0 tile.\n * Performs the nonlinear part of the web mercator projection.\n * Remaining projection is done with 4x4 matrices which also handles\n * perspective.\n * @param {Array} lngLat - [lng, lat] coordinates\n * Specifies a point on the sphere to project onto the map.\n * @return {Array} [x,y] coordinates.\n */\n projectFlat(xyz: number[]): [number, number] {\n if (this.isGeospatial) {\n // Shader clamps latitude to +-89.9, see /shaderlib/project/project.glsl.js\n // lngLatToWorld([0, -89.9])[1] = -317.9934163758329\n // lngLatToWorld([0, 89.9])[1] = 829.9934163758271\n const result = lngLatToWorld(xyz);\n result[1] = clamp(result[1], -318, 830);\n return result;\n }\n return xyz as [number, number];\n }\n\n /**\n * Unproject world point [x,y] on map onto {lat, lon} on sphere\n * @param {object|Vector} xy - object with {x,y} members\n * representing point on projected map plane\n * @return {GeoCoordinates} - object with {lat,lon} of point on sphere.\n * Has toArray method if you need a GeoJSON Array.\n * Per cartographic tradition, lat and lon are specified as degrees.\n */\n unprojectFlat(xyz: number[]): [number, number] {\n if (this.isGeospatial) {\n return worldToLngLat(xyz);\n }\n return xyz as [number, number];\n }\n\n /**\n * Get bounds of the current viewport\n * @return {Array} - [minX, minY, maxX, maxY]\n */\n getBounds(options: {z?: number} = {}): [number, number, number, number] {\n const unprojectOption = {targetZ: options.z || 0};\n\n const topLeft = this.unproject([0, 0], unprojectOption);\n const topRight = this.unproject([this.width, 0], unprojectOption);\n const bottomLeft = this.unproject([0, this.height], unprojectOption);\n const bottomRight = this.unproject([this.width, this.height], unprojectOption);\n\n return [\n Math.min(topLeft[0], topRight[0], bottomLeft[0], bottomRight[0]),\n Math.min(topLeft[1], topRight[1], bottomLeft[1], bottomRight[1]),\n Math.max(topLeft[0], topRight[0], bottomLeft[0], bottomRight[0]),\n Math.max(topLeft[1], topRight[1], bottomLeft[1], bottomRight[1])\n ];\n }\n\n getDistanceScales(coordinateOrigin?: number[]): DistanceScales {\n if (coordinateOrigin && this.isGeospatial) {\n return getDistanceScales({\n longitude: coordinateOrigin[0],\n latitude: coordinateOrigin[1],\n highPrecision: true\n });\n }\n return this.distanceScales;\n }\n\n containsPixel({\n x,\n y,\n width = 1,\n height = 1\n }: {\n x: number;\n y: number;\n width?: number;\n height?: number;\n }): boolean {\n return (\n x < this.x + this.width &&\n this.x < x + width &&\n y < this.y + this.height &&\n this.y < y + height\n );\n }\n\n // Extract frustum planes in common space\n getFrustumPlanes(): {\n left: FrustumPlane;\n right: FrustumPlane;\n bottom: FrustumPlane;\n top: FrustumPlane;\n near: FrustumPlane;\n far: FrustumPlane;\n } {\n if (this._frustumPlanes.near) {\n // @ts-ignore\n return this._frustumPlanes;\n }\n\n Object.assign(this._frustumPlanes, getFrustumPlanes(this.viewProjectionMatrix));\n\n // @ts-ignore\n return this._frustumPlanes;\n }\n\n // EXPERIMENTAL METHODS\n\n /**\n * Needed by panning and linear transition\n * Pan the viewport to place a given world coordinate at screen point [x, y]\n *\n * @param {Array} coords - world coordinates\n * @param {Array} pixel - [x,y] coordinates on screen\n * @param {Array} startPixel - [x,y] screen position where pan started (optional, for delta-based panning)\n * @return {Object} props of the new viewport\n */\n panByPosition(coords: number[], pixel: number[], startPixel?: number[]): any {\n return null;\n }\n\n // INTERNAL METHODS\n\n /* eslint-disable complexity, max-statements */\n private _initProps(opts: ViewportOptions) {\n const longitude = opts.longitude as number;\n const latitude = opts.latitude as number;\n\n if (this.isGeospatial) {\n if (!Number.isFinite(opts.zoom)) {\n this.zoom = getMeterZoom({latitude}) + Math.log2(this.focalDistance);\n }\n this.distanceScales = opts.distanceScales || getDistanceScales({latitude, longitude});\n }\n const scale = Math.pow(2, this.zoom);\n this.scale = scale;\n\n const {position, modelMatrix} = opts;\n let meterOffset: number[] = ZERO_VECTOR;\n if (position) {\n meterOffset = modelMatrix\n ? (new Matrix4(modelMatrix).transformAsVector(position, []) as number[])\n : position;\n }\n\n if (this.isGeospatial) {\n // Determine camera center in common space\n const center = this.projectPosition([longitude, latitude, 0]);\n\n this.center = new Vector3(meterOffset)\n // Convert to pixels in current zoom\n .scale(this.distanceScales.unitsPerMeter)\n .add(center);\n } else {\n this.center = this.projectPosition(meterOffset);\n }\n }\n /* eslint-enable complexity, max-statements */\n\n private _initMatrices(opts: ViewportOptions) {\n const {\n // View matrix\n viewMatrix = IDENTITY,\n // Projection matrix\n projectionMatrix = null,\n\n // Projection matrix parameters, used if projectionMatrix not supplied\n orthographic = false,\n fovyRadians,\n fovy = 75,\n near = 0.1, // Distance of near clipping plane\n far = 1000, // Distance of far clipping plane\n padding = null, // Center offset in pixels\n focalDistance = 1\n } = opts;\n\n this.viewMatrixUncentered = viewMatrix;\n // Make a centered version of the matrix for projection modes without an offset\n this.viewMatrix = new Matrix4()\n // Apply the uncentered view matrix\n .multiplyRight(viewMatrix)\n // And center it\n .translate(new Vector3(this.center).negate());\n\n this.projectionMatrix =\n projectionMatrix ||\n createProjectionMatrix({\n width: this.width,\n height: this.height,\n orthographic,\n fovyRadians: fovyRadians || fovy * DEGREES_TO_RADIANS,\n focalDistance,\n padding,\n near,\n far\n });\n\n // Note: As usual, matrix operations should be applied in \"reverse\" order\n // since vectors will be multiplied in from the right during transformation\n const vpm = createMat4();\n mat4.multiply(vpm, vpm, this.projectionMatrix);\n mat4.multiply(vpm, vpm, this.viewMatrix);\n this.viewProjectionMatrix = vpm;\n\n // console.log('VPM', this.viewMatrix, this.projectionMatrix, this.viewProjectionMatrix);\n\n // Calculate inverse view matrix\n this.viewMatrixInverse = mat4.invert([], this.viewMatrix) || this.viewMatrix;\n\n // Decompose camera parameters\n this.cameraPosition = getCameraPosition(this.viewMatrixInverse);\n\n /*\n * Builds matrices that converts preprojected lngLats to screen pixels\n * and vice versa.\n * Note: Currently returns bottom-left coordinates!\n * Note: Starts with the GL projection matrix and adds steps to the\n * scale and translate that matrix onto the window.\n * Note: WebGL controls clip space to screen projection with gl.viewport\n * and does not need this step.\n */\n\n // matrix for conversion from world location to screen (pixel) coordinates\n const viewportMatrix = createMat4(); // matrix from NDC to viewport.\n const pixelProjectionMatrix = createMat4(); // matrix from world space to viewport.\n mat4.scale(viewportMatrix, viewportMatrix, [this.width / 2, -this.height / 2, 1]);\n mat4.translate(viewportMatrix, viewportMatrix, [1, -1, 0]);\n mat4.multiply(pixelProjectionMatrix, viewportMatrix, this.viewProjectionMatrix);\n this.pixelProjectionMatrix = pixelProjectionMatrix;\n\n this.pixelUnprojectionMatrix = mat4.invert(createMat4(), this.pixelProjectionMatrix);\n if (!this.pixelUnprojectionMatrix) {\n log.warn('Pixel project matrix not invertible')();\n // throw new Error('Pixel project matrix not invertible');\n }\n }\n}\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport log from '../utils/log';\nimport {Pan, DoubleClickDrag, InputDirection, Pinch, Tap} from 'mjolnir.js';\nimport type {PanRecognizerOptions, PinchRecognizerOptions, TapRecognizerOptions} from 'mjolnir.js';\n\n/**\n * The coordinate system that positions/dimensions are defined in.\n */\nexport type CoordinateSystem =\n | 'default'\n | 'lnglat'\n | 'meter-offsets'\n | 'lnglat-offsets'\n | 'cartesian';\n\n/**\n * The coordinate system that positions/dimensions are defined in.\n * String constants are the public API.\n * @deprecated Use string constants directly.\n */\nexport const COORDINATE_SYSTEM = {\n /**\n * `LNGLAT` if rendering into a geospatial viewport, `CARTESIAN` otherwise\n */\n DEFAULT: 'default',\n /**\n * Positions are interpreted as [longitude, latitude, elevation]\n * longitude/latitude are in degrees, elevation is in meters.\n * Dimensions are in meters.\n */\n LNGLAT: 'lnglat',\n\n /**\n * Positions are interpreted as [x, y, z] in meter offsets from the coordinate origin.\n * Dimensions are in meters.\n */\n METER_OFFSETS: 'meter-offsets',\n\n /**\n * Positions are interpreted as [deltaLng, deltaLat, elevation] from the coordinate origin.\n * deltaLng/deltaLat are in degrees, elevation is in meters.\n * Dimensions are in meters.\n */\n LNGLAT_OFFSETS: 'lnglat-offsets',\n\n /**\n * Positions and dimensions are in the common units of the viewport.\n */\n CARTESIAN: 'cartesian'\n} as const;\n\n// Deprecated\n/* eslint-disable accessor-pairs */\nObject.defineProperty(COORDINATE_SYSTEM, 'IDENTITY', {\n get: () => {\n log.deprecated('COORDINATE_SYSTEM.IDENTITY', 'COORDINATE_SYSTEM.CARTESIAN')();\n return COORDINATE_SYSTEM.CARTESIAN;\n }\n});\n/* eslint-enable accessor-pairs */\n\n/**\n * How coordinates are transformed from the world space into the common space.\n */\nexport const PROJECTION_MODE = {\n /**\n * Render geospatial data in Web Mercator projection\n */\n WEB_MERCATOR: 1,\n /**\n * Render geospatial data as a 3D globe\n */\n GLOBE: 2,\n\n /**\n * (Internal use only) Web Mercator projection at high zoom\n */\n WEB_MERCATOR_AUTO_OFFSET: 4,\n\n /**\n * No transformation\n */\n IDENTITY: 0\n} as const;\n\nexport const UNIT = {\n common: 0,\n meters: 1,\n pixels: 2\n} as const;\n\nexport const EVENT_HANDLERS = {\n click: 'onClick',\n dblclick: 'onClick',\n panstart: 'onDragStart',\n panmove: 'onDrag',\n panend: 'onDragEnd'\n} as const satisfies {[eventName: string]: string};\n\n// Order matters: recognizeWith/requireFailure resolve by name, so a recognizer\n// must be registered before any later entry can reference it.\nexport const RECOGNIZERS = {\n multipan: [Pan, {threshold: 10, direction: InputDirection.Vertical, pointers: 2}],\n pinch: [Pinch, {}, null, ['multipan']],\n pan: [Pan, {threshold: 1}, ['pinch'], ['multipan']],\n dblclick: [Tap, {event: 'dblclick', taps: 2, enable: false}],\n dblclickdrag: [DoubleClickDrag, {event: 'dblclickdrag', enable: false}, ['dblclick'], null],\n click: [Tap, {event: 'click'}, ['dblclickdrag'], ['dblclick', 'dblclickdrag']]\n} as const;\n\nexport type RecognizerOptions = {\n pinch?: Omit<PinchRecognizerOptions, 'event' | 'enable'>;\n multipan?: Omit<PanRecognizerOptions, 'event' | 'enable'>;\n pan?: Omit<PanRecognizerOptions, 'event' | 'enable'>;\n dblclick?: Omit<TapRecognizerOptions, 'event' | 'enable'>;\n click?: Omit<TapRecognizerOptions, 'event' | 'enable'>;\n};\n\n/**\n * @deprecated Use string constants directly\n */\nexport const OPERATION = {\n DRAW: 'draw',\n MASK: 'mask',\n TERRAIN: 'terrain'\n} as const;\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n// View and Projection Matrix calculations for mapbox-js style\n// map view properties\nimport Viewport from './viewport';\n\nimport {\n pixelsToWorld,\n getViewMatrix,\n addMetersToLngLat,\n unitsPerMeter,\n getProjectionParameters,\n altitudeToFovy,\n fovyToAltitude,\n fitBounds,\n getBounds\n} from '@math.gl/web-mercator';\nimport {Padding} from './viewport';\n\nimport {Matrix4, clamp, vec2} from '@math.gl/core';\n\nexport type WebMercatorViewportOptions = {\n /** Name of the viewport */\n id?: string;\n /** Left offset from the canvas edge, in pixels */\n x?: number;\n /** Top offset from the canvas edge, in pixels */\n y?: number;\n /** Viewport width in pixels */\n width?: number;\n /** Viewport height in pixels */\n height?: number;\n /** Longitude in degrees */\n longitude?: number;\n /** Latitude in degrees */\n latitude?: number;\n /** Tilt of the camera in degrees */\n pitch?: number;\n /** Heading of the camera in degrees */\n bearing?: number;\n /** Camera altitude relative to the viewport height, legacy property used to control the FOV. Default `1.5` */\n altitude?: number;\n /** Camera fovy in degrees. If provided, overrides `altitude` */\n fovy?: number;\n /** Viewport center in world space. If geospatial, refers to meter offsets from lng, lat, elevation */\n position?: number[];\n /** Zoom level */\n zoom?: number;\n /** Padding around the viewport, in pixels. */\n padding?: Padding | null;\n /** Model matrix of viewport center */\n modelMatrix?: number[] | null;\n /** Custom projection matrix */\n projectionMatrix?: number[];\n /** Use orthographic projection */\n orthographic?: boolean;\n /** Scaler for the near plane, 1 unit equals to the height of the viewport. Default `0.1` */\n nearZMultiplier?: number;\n /** Scaler for the far plane, 1 unit equals to the distance from the camera to the edge of the screen. Default `1.01` */\n farZMultiplier?: number;\n /** Optionally override the near plane position. `nearZMultiplier` is ignored if `nearZ` is supplied. */\n nearZ?: number;\n /** Optionally override the far plane position. `farZMultiplier` is ignored if `farZ` is supplied. */\n farZ?: number;\n /** Render multiple copies of the world */\n repeat?: boolean;\n /** Internal use */\n worldOffset?: number;\n /** @deprecated Revert to approximated meter size calculation prior to v8.5 */\n legacyMeterSizes?: boolean;\n};\n\n/**\n * Manages transformations to/from WGS84 coordinates using the Web Mercator Projection.\n */\nexport default class WebMercatorViewport extends Viewport {\n static displayName = 'WebMercatorViewport';\n\n longitude: number;\n latitude: number;\n pitch: number;\n bearing: number;\n altitude: number;\n fovy: number;\n orthographic: boolean;\n\n /** Each sub viewport renders one copy of the world if repeat:true. The list is generated and cached on first request. */\n private _subViewports: WebMercatorViewport[] | null;\n /** @deprecated Revert to approximated meter size calculation prior to v8.5 */\n private _pseudoMeters: boolean;\n\n /* eslint-disable complexity, max-statements */\n constructor(opts: WebMercatorViewportOptions = {}) {\n const {\n latitude = 0,\n longitude = 0,\n zoom = 0,\n pitch = 0,\n bearing = 0,\n nearZMultiplier = 0.1,\n farZMultiplier = 1.01,\n nearZ,\n farZ,\n orthographic = false,\n projectionMatrix,\n\n repeat = false,\n worldOffset = 0,\n position,\n padding,\n\n // backward compatibility\n // TODO: remove in v9\n legacyMeterSizes = false\n } = opts;\n\n let {width, height, altitude = 1.5} = opts;\n const scale = Math.pow(2, zoom);\n\n // Silently allow apps to send in 0,0 to facilitate isomorphic render etc\n width = width || 1;\n height = height || 1;\n\n let fovy;\n let projectionParameters: any = null;\n if (projectionMatrix) {\n altitude = projectionMatrix[5] / 2;\n fovy = altitudeToFovy(altitude);\n } else {\n if (opts.fovy) {\n fovy = opts.fovy;\n altitude = fovyToAltitude(fovy);\n } else {\n fovy = altitudeToFovy(altitude);\n }\n\n let offset: [number, number] | undefined;\n if (padding) {\n const {top = 0, bottom = 0} = padding;\n offset = [0, clamp((top + height - bottom) / 2, 0, height) - height / 2];\n }\n\n projectionParameters = getProjectionParameters({\n width,\n height,\n scale,\n center: position && [0, 0, position[2] * unitsPerMeter(latitude)],\n offset,\n pitch,\n fovy,\n nearZMultiplier,\n farZMultiplier\n });\n\n if (Number.isFinite(nearZ)) {\n projectionParameters.near = nearZ;\n }\n if (Number.isFinite(farZ)) {\n projectionParameters.far = farZ;\n }\n }\n\n // The uncentered matrix allows us two move the center addition to the\n // shader (cheap) which gives a coordinate system that has its center in\n // the layer's center position. This makes rotations and other modelMatrx\n // transforms much more useful.\n let viewMatrixUncentered = getViewMatrix({\n height,\n pitch,\n bearing,\n scale,\n altitude\n });\n\n if (worldOffset) {\n const viewOffset = new Matrix4().translate([512 * worldOffset, 0, 0]);\n viewMatrixUncentered = viewOffset.multiplyLeft(viewMatrixUncentered);\n }\n\n super({\n ...opts,\n // x, y,\n width,\n height,\n\n // view matrix\n viewMatrix: viewMatrixUncentered,\n longitude,\n latitude,\n zoom,\n\n // projection matrix parameters\n ...projectionParameters,\n fovy,\n focalDistance: altitude\n });\n\n // Save parameters\n this.latitude = latitude;\n this.longitude = longitude;\n this.zoom = zoom;\n this.pitch = pitch;\n this.bearing = bearing;\n this.altitude = altitude;\n this.fovy = fovy;\n\n this.orthographic = orthographic;\n\n this._subViewports = repeat ? [] : null;\n this._pseudoMeters = legacyMeterSizes;\n\n Object.freeze(this);\n }\n /* eslint-enable complexity, max-statements */\n\n get subViewports(): WebMercatorViewport[] | null {\n if (this._subViewports && !this._subViewports.length) {\n // Cache sub viewports so that we only calculate them once\n const bounds = this.getBounds();\n\n const minOffset = Math.floor((bounds[0] + 180) / 360);\n const maxOffset = Math.ceil((bounds[2] - 180) / 360);\n\n for (let x = minOffset; x <= maxOffset; x++) {\n const offsetViewport = x\n ? new WebMercatorViewport({\n ...this,\n worldOffset: x\n })\n : this;\n this._subViewports.push(offsetViewport);\n }\n }\n return this._subViewports;\n }\n\n projectPosition(xyz: number[]): [number, number, number] {\n if (this._pseudoMeters) {\n // Backward compatibility\n return super.projectPosition(xyz);\n }\n const [X, Y] = this.projectFlat(xyz);\n const Z = (xyz[2] || 0) * unitsPerMeter(xyz[1]);\n return [X, Y, Z];\n }\n\n unprojectPosition(xyz: number[]): [number, number, number] {\n if (this._pseudoMeters) {\n // Backward compatibility\n return super.unprojectPosition(xyz);\n }\n const [X, Y] = this.unprojectFlat(xyz);\n const Z = (xyz[2] || 0) / unitsPerMeter(Y);\n return [X, Y, Z];\n }\n\n /**\n * Add a meter delta to a base lnglat coordinate, returning a new lnglat array\n *\n * Note: Uses simple linear approximation around the viewport center\n * Error increases with size of offset (roughly 1% per 100km)\n *\n * @param {[Number,Number]|[Number,Number,Number]) lngLatZ - base coordinate\n * @param {[Number,Number]|[Number,Number,Number]) xyz - array of meter deltas\n * @return {[Number,Number]|[Number,Number,Number]) array of [lng,lat,z] deltas\n */\n addMetersToLngLat(lngLatZ: number[], xyz: number[]): number[] {\n return addMetersToLngLat(lngLatZ, xyz);\n }\n\n panByPosition(\n coords: number[],\n pixel: number[],\n startPixel?: number[]\n ): WebMercatorViewportOptions {\n const fromLocation = pixelsToWorld(pixel, this.pixelUnprojectionMatrix);\n const toLocation = this.projectFlat(coords);\n\n const translate = vec2.add([], toLocation, vec2.negate([], fromLocation));\n const newCenter = vec2.add([], this.center, translate);\n\n const [longitude, latitude] = this.unprojectFlat(newCenter);\n return {longitude, latitude};\n }\n\n /**\n * Returns a new longitude and latitude that keeps a 3D world coordinate at a given screen pixel\n * This version handles the z-component (altitude) properly for cameras positioned above ground\n */\n panByPosition3D(coords: number[], pixel: number[]): WebMercatorViewportOptions {\n const targetZ = coords[2] || 0;\n const deltaLngLat = vec2.sub([], coords, this.unproject(pixel, {targetZ}));\n return {longitude: this.longitude + deltaLngLat[0], latitude: this.latitude + deltaLngLat[1]};\n }\n\n getBounds(options: {z?: number} = {}): [number, number, number, number] {\n // @ts-ignore\n const corners = getBounds(this, options.z || 0);\n\n return [\n Math.min(corners[0][0], corners[1][0], corners[2][0], corners[3][0]),\n Math.min(corners[0][1], corners[1][1], corners[2][1], corners[3][1]),\n Math.max(corners[0][0], corners[1][0], corners[2][0], corners[3][0]),\n Math.max(corners[0][1], corners[1][1], corners[2][1], corners[3][1])\n ];\n }\n\n /**\n * Returns a new viewport that fit around the given rectangle.\n * Only supports non-perspective mode.\n */\n fitBounds(\n /** [[lon, lat], [lon, lat]] */\n bounds: [[number, number], [number, number]],\n options: {\n /** If not supplied, will use the current width of the viewport (default `1`) */\n width?: number;\n /** If not supplied, will use the current height of the viewport (default `1`) */\n height?: number;\n /** In degrees, 0.01 would be about 1000 meters */\n minExtent?: number;\n /** Max zoom level */\n maxZoom?: number;\n /** Extra padding in pixels */\n padding?: number | Required<Padding>;\n /** Center shift in pixels */\n offset?: number[];\n } = {}\n ) {\n const {width, height} = this;\n const {longitude, latitude, zoom} = fitBounds({width, height, bounds, ...options});\n return new WebMercatorViewport({width, height, longitude, latitude, zoom});\n }\n}\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {clamp} from '@math.gl/core';\nimport Controller, {ControllerProps, InteractionState} from './controller';\nimport ViewState from './view-state';\nimport {worldToLngLat, lngLatToWorld as _lngLatToWorld} from '@math.gl/web-mercator';\nimport assert from '../utils/assert';\nimport {mod} from '../utils/math-utils';\n\nimport LinearInterpolator from '../transitions/linear-interpolator';\nimport type Viewport from '../viewports/viewport';\n\nconst PITCH_MOUSE_THRESHOLD = 5;\nconst PITCH_ACCEL = 1.2;\nconst WEB_MERCATOR_TILE_SIZE = 512;\nconst WEB_MERCATOR_MAX_BOUNDS = [\n [-Infinity, -90],\n [Infinity, 90]\n] satisfies ControllerProps['maxBounds'];\n\n/** The web mercator utility `lngLatToWorld` throws if invalid coordinates are provided.\n * This wrapper clamps user input to calculate common positions safely. */\nfunction lngLatToWorld([lng, lat]: number[]): number[] {\n if (Math.abs(lat) > 90) {\n lat = Math.sign(lat) * 90;\n }\n if (Number.isFinite(lng)) {\n const [x, y] = _lngLatToWorld([lng, lat]);\n return [x, clamp(y, 0, WEB_MERCATOR_TILE_SIZE)];\n }\n const [, y] = _lngLatToWorld([0, lat]);\n return [lng, clamp(y, 0, WEB_MERCATOR_TILE_SIZE)];\n}\n\nexport type MapStateProps = {\n /** Mapbox viewport properties */\n /** The width of the viewport */\n width: number;\n /** The height of the viewport */\n height: number;\n /** The latitude at the center of the viewport */\n latitude: number;\n /** The longitude at the center of the viewport */\n longitude: number;\n /** The tile zoom level of the map. */\n zoom: number;\n /** The bearing of the viewport in degrees */\n bearing?: number;\n /** The pitch of the viewport in degrees */\n pitch?: number;\n /**\n * Specify the altitude of the viewport camera\n * Unit: map heights, default 1.5\n * Non-public API, see https://github.com/mapbox/mapbox-gl-js/issues/1137\n */\n altitude?: number;\n /** Viewport position */\n position?: [number, number, number];\n\n /** Viewport constraints */\n maxZoom?: number;\n minZoom?: number;\n maxPitch?: number;\n minPitch?: number;\n\n /** Normalize viewport props to fit map height into viewport. Default `true` */\n normalize?: boolean;\n\n maxBounds?: ControllerProps['maxBounds'];\n};\n\nexport type MapStateInternal = {\n /** Interaction states, required to calculate change during transform */\n /* The point on map being grabbed when the operation first started */\n startPanLngLat?: [number, number];\n /* Center of the zoom when the operation first started */\n startZoomLngLat?: [number, number];\n /* Pointer position when rotation started */\n startRotatePos?: [number, number];\n /* The lng/lat/altitude point at the rotation pivot (where rotation started) */\n startRotateLngLat?: [number, number, number];\n /** Bearing when current perspective rotate operation started */\n startBearing?: number;\n /** Pitch when current perspective rotate operation started */\n startPitch?: number;\n /** Zoom when current zoom operation started */\n startZoom?: number;\n};\n\n/* Utils */\n\nexport class MapState extends ViewState<MapState, MapStateProps, MapStateInternal> {\n /* get optional altitude for rotation pivot\n * - undefined: rotate around viewport center (no pivot point)\n * - 0: rotate around pointer position at ground level\n * - other value: rotate around pointer position at specified altitude\n */\n getAltitude?: (pos: [number, number]) => number | undefined;\n\n constructor(\n options: MapStateProps &\n MapStateInternal & {\n makeViewport: (props: Record<string, any>) => Viewport;\n getAltitude?: (pos: [number, number]) => number | undefined;\n }\n ) {\n const {\n /** Mapbox viewport properties */\n /** The width of the viewport */\n width,\n /** The height of the viewport */\n height,\n /** The latitude at the center of the viewport */\n latitude,\n /** The longitude at the center of the viewport */\n longitude,\n /** The tile zoom level of the map. */\n zoom,\n /** The bearing of the viewport in degrees */\n bearing = 0,\n /** The pitch of the viewport in degrees */\n pitch = 0,\n /**\n * Specify the altitude of the viewport camera\n * Unit: map heights, default 1.5\n * Non-public API, see https://github.com/mapbox/mapbox-gl-js/issues/1137\n */\n altitude = 1.5,\n /** Viewport position */\n position = [0, 0, 0],\n\n /** Viewport constraints */\n maxZoom = 20,\n minZoom = 0,\n maxPitch = 60,\n minPitch = 0,\n\n /** Interaction states, required to calculate change during transform */\n /* The point on map being grabbed when the operation first started */\n startPanLngLat,\n /* Center of the zoom when the operation first started */\n startZoomLngLat,\n /* Pointer position when rotation started */\n startRotatePos,\n /* The lng/lat point at the rotation pivot (where rotation started) */\n startRotateLngLat,\n /** Bearing when current perspective rotate operation started */\n startBearing,\n /** Pitch when current perspective rotate operation started */\n startPitch,\n /** Zoom when current zoom operation started */\n startZoom,\n\n /** Normalize viewport props to fit map height into viewport */\n normalize = true\n } = options;\n\n assert(Number.isFinite(longitude)); // `longitude` must be supplied\n assert(Number.isFinite(latitude)); // `latitude` must be supplied\n assert(Number.isFinite(zoom)); // `zoom` must be supplied\n\n const maxBounds = options.maxBounds || (normalize ? WEB_MERCATOR_MAX_BOUNDS : null);\n\n super(\n {\n width,\n height,\n latitude,\n longitude,\n zoom,\n bearing,\n pitch,\n altitude,\n maxZoom,\n minZoom,\n maxPitch,\n minPitch,\n normalize,\n position,\n maxBounds\n },\n {\n startPanLngLat,\n startZoomLngLat,\n startRotatePos,\n startRotateLngLat,\n startBearing,\n startPitch,\n startZoom\n },\n options.makeViewport\n );\n\n this.getAltitude = options.getAltitude;\n }\n\n /**\n * Start panning\n * @param {[Number, Number]} pos - position on screen where the pointer grabs\n */\n panStart({pos}: {pos: [number, number]}): MapState {\n return this._getUpdatedState({\n startPanLngLat: this._unproject(pos)\n });\n }\n\n /**\n * Pan\n * @param {[Number, Number]} pos - position on screen where the pointer is\n * @param {[Number, Number], optional} startPos - where the pointer grabbed at\n * the start of the operation. Must be supplied of `panStart()` was not called\n */\n pan({pos, startPos}: {pos: [number, number]; startPos?: [number, number]}): MapState {\n const startPanLngLat = this.getState().startPanLngLat || this._unproject(startPos);\n\n if (!startPanLngLat) {\n return this;\n }\n\n const viewport = this.makeViewport(this.getViewportProps());\n const newProps = viewport.panByPosition(startPanLngLat, pos);\n\n return this._getUpdatedState(newProps);\n }\n\n /**\n * End panning\n * Must call if `panStart()` was called\n */\n panEnd(): MapState {\n return this._getUpdatedState({\n startPanLngLat: null\n });\n }\n\n /**\n * Start rotating\n * @param {[Number, Number]} pos - position on screen where the center is\n */\n rotateStart({pos}: {pos: [number, number]}): MapState {\n const altitude = this.getAltitude?.(pos);\n\n return this._getUpdatedState({\n startRotatePos: pos,\n startRotateLngLat: altitude !== undefined ? this._unproject3D(pos, altitude) : undefined,\n startBearing: this.getViewportProps().bearing,\n startPitch: this.getViewportProps().pitch\n });\n }\n\n /**\n * Rotate\n * @param {[Number, Number]} pos - position on screen where the center is\n */\n rotate({\n pos,\n deltaAngleX = 0,\n deltaAngleY = 0\n }: {\n pos?: [number, number];\n deltaAngleX?: number;\n deltaAngleY?: number;\n }): MapState {\n const {startRotatePos, startRotateLngLat, startBearing, startPitch} = this.getState();\n\n if (!startRotatePos || startBearing === undefined || startPitch === undefined) {\n return this;\n }\n let newRotation;\n if (pos) {\n newRotation = this._getNewRotation(pos, startRotatePos, startPitch, startBearing);\n } else {\n newRotation = {\n bearing: startBearing + deltaAngleX,\n pitch: startPitch + deltaAngleY\n };\n }\n\n // If we have a pivot point, adjust the camera position to keep the pivot point fixed\n if (startRotateLngLat) {\n const rotatedViewport = this.makeViewport({\n ...this.getViewportProps(),\n ...newRotation\n });\n // Use panByPosition3D if available (WebMercatorViewport), otherwise fall back to panByPosition\n const panMethod = 'panByPosition3D' in rotatedViewport ? 'panByPosition3D' : 'panByPosition';\n return this._getUpdatedState({\n ...newRotation,\n ...rotatedViewport[panMethod](startRotateLngLat, startRotatePos)\n });\n }\n\n return this._getUpdatedState(newRotation);\n }\n\n /**\n * End rotating\n * Must call if `rotateStart()` was called\n */\n rotateEnd(): MapState {\n return this._getUpdatedState({\n startRotatePos: null,\n startRotateLngLat: null,\n startBearing: null,\n startPitch: null\n });\n }\n\n /**\n * Start zooming\n * @param {[Number, Number]} pos - position on screen where the center is\n */\n zoomStart({pos}: {pos: [number, number]}): MapState {\n return this._getUpdatedState({\n startZoomLngLat: this._unproject(pos),\n startZoom: this.getViewportProps().zoom\n });\n }\n\n /**\n * Zoom\n * @param {[Number, Number]} pos - position on screen where the current center is\n * @param {[Number, Number]} startPos - the center position at\n * the start of the operation. Must be supplied of `zoomStart()` was not called\n * @param {Number} scale - a number between [0, 1] specifying the accumulated\n * relative scale.\n */\n zoom({\n pos,\n startPos,\n scale\n }: {\n pos: [number, number];\n startPos?: [number, number];\n scale: number;\n }): MapState {\n // Make sure we zoom around the current mouse position rather than map center\n let {startZoom, startZoomLngLat} = this.getState();\n\n if (!startZoomLngLat) {\n // We have two modes of zoom:\n // scroll zoom that are discrete events (transform from the current zoom level),\n // and pinch zoom that are continuous events (transform from the zoom level when\n // pinch started).\n // If startZoom state is defined, then use the startZoom state;\n // otherwise assume discrete zooming\n startZoom = this.getViewportProps().zoom;\n startZoomLngLat = this._unproject(startPos) || this._unproject(pos);\n }\n if (!startZoomLngLat) {\n return this;\n }\n\n const zoom = this._constrainZoom((startZoom as number) + Math.log2(scale));\n const zoomedViewport = this.makeViewport({...this.getViewportProps(), zoom});\n\n return this._getUpdatedState({\n zoom,\n ...zoomedViewport.panByPosition(startZoomLngLat, pos)\n });\n }\n\n /**\n * End zooming\n * Must call if `zoomStart()` was called\n */\n zoomEnd(): MapState {\n return this._getUpdatedState({\n startZoomLngLat: null,\n startZoom: null\n });\n }\n\n zoomIn(speed: number = 2): MapState {\n return this._zoomFromCenter(speed);\n }\n\n zoomOut(speed: number = 2): MapState {\n return this._zoomFromCenter(1 / speed);\n }\n\n moveLeft(speed: number = 100): MapState {\n return this._panFromCenter([speed, 0]);\n }\n\n moveRight(speed: number = 100): MapState {\n return this._panFromCenter([-speed, 0]);\n }\n\n moveUp(speed: number = 100): MapState {\n return this._panFromCenter([0, speed]);\n }\n\n moveDown(speed: number = 100): MapState {\n return this._panFromCenter([0, -speed]);\n }\n\n rotateLeft(speed: number = 15): MapState {\n return this._getUpdatedState({\n bearing: this.getViewportProps().bearing - speed\n });\n }\n\n rotateRight(speed: number = 15): MapState {\n return this._getUpdatedState({\n bearing: this.getViewportProps().bearing + speed\n });\n }\n\n rotateUp(speed: number = 10): MapState {\n return this._getUpdatedState({\n pitch: this.getViewportProps().pitch + speed\n });\n }\n\n rotateDown(speed: number = 10): MapState {\n return this._getUpdatedState({\n pitch: this.getViewportProps().pitch - speed\n });\n }\n\n shortestPathFrom(viewState: MapState): MapStateProps {\n // const endViewStateProps = new this.ControllerState(endProps).shortestPathFrom(startViewstate);\n const fromProps = viewState.getViewportProps();\n const props = {...this.getViewportProps()};\n const {bearing, longitude} = props;\n\n if (Math.abs(bearing - fromProps.bearing) > 180) {\n props.bearing = bearing < 0 ? bearing + 360 : bearing - 360;\n }\n if (Math.abs(longitude - fromProps.longitude) > 180) {\n props.longitude = longitude < 0 ? longitude + 360 : longitude - 360;\n }\n return props;\n }\n\n // Apply any constraints (mathematical or defined by _viewportProps) to map state\n applyConstraints(props: Required<MapStateProps>): Required<MapStateProps> {\n // Ensure pitch is within specified range\n const {maxPitch, minPitch, pitch, longitude, bearing, normalize, maxBounds} = props;\n\n if (normalize) {\n if (longitude < -180 || longitude > 180) {\n props.longitude = mod(longitude + 180, 360) - 180;\n }\n if (bearing < -180 || bearing > 180) {\n props.bearing = mod(bearing + 180, 360) - 180;\n }\n }\n props.pitch = clamp(pitch, minPitch, maxPitch);\n\n props.zoom = this._constrainZoom(props.zoom, props);\n\n if (maxBounds) {\n const bl = lngLatToWorld(maxBounds[0]);\n const tr = lngLatToWorld(maxBounds[1]);\n // calculate center and zoom ranges at pitch=0 and bearing=0\n // to maintain visual stability when rotating\n const scale = 2 ** props.zoom;\n const halfWidth = props.width / 2 / scale;\n const halfHeight = props.height / 2 / scale;\n const [minLng, minLat] = worldToLngLat([bl[0] + halfWidth, bl[1] + halfHeight]);\n const [maxLng, maxLat] = worldToLngLat([tr[0] - halfWidth, tr[1] - halfHeight]);\n props.longitude = clamp(props.longitude, minLng, maxLng);\n props.latitude = clamp(props.latitude, minLat, maxLat);\n }\n\n return props;\n }\n\n /* Private methods */\n\n _constrainZoom(zoom: number, props?: Required<MapStateProps>): number {\n props ||= this.getViewportProps();\n const {maxZoom, maxBounds} = props;\n\n const shouldApplyMaxBounds = maxBounds !== null && props.width > 0 && props.height > 0;\n let {minZoom} = props;\n\n if (shouldApplyMaxBounds) {\n const bl = lngLatToWorld(maxBounds[0]);\n const tr = lngLatToWorld(maxBounds[1]);\n const w = tr[0] - bl[0];\n const h = tr[1] - bl[1];\n // ignore bound size of 0 or Infinity\n if (Number.isFinite(w) && w > 0) {\n minZoom = Math.max(minZoom, Math.log2(props.width / w));\n }\n if (Number.isFinite(h) && h > 0) {\n minZoom = Math.max(minZoom, Math.log2(props.height / h));\n }\n if (minZoom > maxZoom) minZoom = maxZoom;\n }\n return clamp(zoom, minZoom, maxZoom);\n }\n\n _zoomFromCenter(scale) {\n const {width, height} = this.getViewportProps();\n return this.zoom({\n pos: [width / 2, height / 2],\n scale\n });\n }\n\n _panFromCenter(offset) {\n const {width, height} = this.getViewportProps();\n return this.pan({\n startPos: [width / 2, height / 2],\n pos: [width / 2 + offset[0], height / 2 + offset[1]]\n });\n }\n\n _getUpdatedState(newProps): MapState {\n // @ts-ignore\n return new this.constructor({\n makeViewport: this.makeViewport,\n ...this.getViewportProps(),\n ...this.getState(),\n ...newProps\n });\n }\n\n _unproject(pos?: [number, number]): [number, number] | undefined {\n const viewport = this.makeViewport(this.getViewportProps());\n // @ts-ignore\n return pos && viewport.unproject(pos);\n }\n\n _unproject3D(pos: [number, number], altitude: number): [number, number, number] {\n const viewport = this.makeViewport(this.getViewportProps());\n return viewport.unproject(pos, {targetZ: altitude}) as [number, number, number];\n }\n\n _getNewRotation(\n pos: [number, number],\n startPos: [number, number],\n startPitch: number,\n startBearing: number\n ): {\n pitch: number;\n bearing: number;\n } {\n const deltaX = pos[0] - startPos[0];\n const deltaY = pos[1] - startPos[1];\n const centerY = pos[1];\n const startY = startPos[1];\n const {width, height} = this.getViewportProps();\n\n const deltaScaleX = deltaX / width;\n let deltaScaleY = 0;\n\n if (deltaY > 0) {\n if (Math.abs(height - startY) > PITCH_MOUSE_THRESHOLD) {\n // Move from 0 to -1 as we drag upwards\n deltaScaleY = (deltaY / (startY - height)) * PITCH_ACCEL;\n }\n } else if (deltaY < 0) {\n if (startY > PITCH_MOUSE_THRESHOLD) {\n // Move from 0 to 1 as we drag upwards\n deltaScaleY = 1 - centerY / startY;\n }\n }\n // clamp deltaScaleY to [-1, 1] so that rotation is constrained between minPitch and maxPitch.\n // deltaScaleX does not need to be clamped as bearing does not have constraints.\n deltaScaleY = clamp(deltaScaleY, -1, 1);\n\n const {minPitch, maxPitch} = this.getViewportProps();\n\n const bearing = startBearing + 180 * deltaScaleX;\n let pitch = startPitch;\n if (deltaScaleY > 0) {\n // Gradually increase pitch\n pitch = startPitch + deltaScaleY * (maxPitch - startPitch);\n } else if (deltaScaleY < 0) {\n // Gradually decrease pitch\n pitch = startPitch - deltaScaleY * (minPitch - startPitch);\n }\n\n return {\n pitch,\n bearing\n };\n }\n}\n\nexport default class MapController extends Controller<MapState> {\n ControllerState = MapState;\n\n transition = {\n transitionDuration: 300,\n transitionInterpolator: new LinearInterpolator({\n transitionProps: {\n compare: ['longitude', 'latitude', 'zoom', 'bearing', 'pitch', 'position'],\n required: ['longitude', 'latitude', 'zoom']\n }\n })\n };\n\n dragMode: 'pan' | 'rotate' = 'pan';\n\n /**\n * Rotation pivot behavior:\n * - 'center': Rotate around viewport center (default)\n * - '2d': Rotate around pointer position at ground level (z=0)\n * - '3d': Rotate around 3D picked point (requires pickPosition callback)\n */\n protected rotationPivot: 'center' | '2d' | '3d' = 'center';\n\n setProps(\n props: ControllerProps &\n MapStateProps & {\n rotationPivot?: 'center' | '2d' | '3d';\n getAltitude?: (pos: [number, number]) => number | undefined;\n }\n ) {\n if ('rotationPivot' in props) {\n this.rotationPivot = props.rotationPivot || 'center';\n }\n // this will be passed to MapState constructor\n props.getAltitude = this._getAltitude;\n props.position = props.position || [0, 0, 0];\n props.maxBounds =\n props.maxBounds || (props.normalize === false ? null : WEB_MERCATOR_MAX_BOUNDS);\n\n super.setProps(props);\n }\n\n protected updateViewport(\n newControllerState: MapState,\n extraProps: Record<string, any> | null = null,\n interactionState: InteractionState = {}\n ): void {\n // Inject rotation pivot position during rotation for visual feedback\n const state = newControllerState.getState();\n if (interactionState.isDragging && state.startRotateLngLat) {\n interactionState = {\n ...interactionState,\n rotationPivotPosition: state.startRotateLngLat\n };\n } else if (interactionState.isDragging === false) {\n // Clear pivot when drag ends\n interactionState = {...interactionState, rotationPivotPosition: undefined};\n }\n\n super.updateViewport(newControllerState, extraProps, interactionState);\n }\n\n /** Add altitude to rotateStart params based on rotationPivot mode */\n protected _getAltitude = (pos: [number, number]): number | undefined => {\n if (this.rotationPivot === '2d') {\n return 0;\n } else if (this.rotationPivot === '3d') {\n if (this.pickPosition) {\n const {x, y} = this.props;\n const pickResult = this.pickPosition(x + pos[0], y + pos[1]);\n if (pickResult && pickResult.coordinate && pickResult.coordinate.length >= 3) {\n return pickResult.coordinate[2];\n }\n }\n }\n return undefined;\n };\n}\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {Timeline} from '@luma.gl/engine';\n\nexport type TransitionSettings = {\n duration: number;\n onStart?: (transition: Transition) => void;\n onUpdate?: (transition: Transition) => void;\n onInterrupt?: (transition: Transition) => void;\n onEnd?: (transition: Transition) => void;\n};\n\nexport default class Transition {\n private _inProgress: boolean = false;\n private _handle: number | null = null;\n private _timeline: Timeline;\n\n time: number = 0;\n // @ts-expect-error\n settings: TransitionSettings & {fromValue; toValue; duration; easing; damping; stiffness} = {\n duration: 0\n };\n\n /**\n * @params timeline {Timeline}\n */\n constructor(timeline: Timeline) {\n this._timeline = timeline;\n }\n\n /* Public API */\n get inProgress(): boolean {\n return this._inProgress;\n }\n\n /**\n * (re)start this transition.\n * @params props {object} - optional overriding props. see constructor\n */\n start(settings: TransitionSettings) {\n this.cancel();\n // @ts-expect-error\n this.settings = settings;\n this._inProgress = true;\n this.settings.onStart?.(this);\n }\n\n /**\n * end this transition if it is in progress.\n */\n end() {\n if (this._inProgress) {\n this._timeline.removeChannel(this._handle as number);\n this._handle = null;\n this._inProgress = false;\n this.settings.onEnd?.(this);\n }\n }\n\n /**\n * cancel this transition if it is in progress.\n */\n cancel() {\n if (this._inProgress) {\n this.settings.onInterrupt?.(this);\n this._timeline.removeChannel(this._handle as number);\n this._handle = null;\n this._inProgress = false;\n }\n }\n\n /**\n * update this transition. Returns `true` if updated.\n */\n update() {\n if (!this._inProgress) {\n return false;\n }\n\n // It is important to initialize the handle during `update` instead of `start`.\n // The CPU time that the `start` frame takes should not be counted towards the duration.\n // On the other hand, `update` always happens during a render cycle. The clock starts when the\n // transition is rendered for the first time.\n if (this._handle === null) {\n const {_timeline: timeline, settings} = this;\n this._handle = timeline.addChannel({\n delay: timeline.getTime(),\n duration: settings.duration\n });\n }\n\n this.time = this._timeline.getTime(this._handle);\n // Call subclass method\n this._onUpdate();\n // Call user callback\n this.settings.onUpdate?.(this);\n\n // This only works if `settings.duration` is set\n // Spring transition must call `end` manually\n if (this._timeline.isFinished(this._handle)) {\n this.end();\n }\n return true;\n }\n\n /* Private API */\n\n protected _onUpdate() {\n // for subclass override\n }\n}\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport Transition, {TransitionSettings as BaseTransitionSettings} from '../transitions/transition';\nimport TransitionInterpolator from '../transitions/transition-interpolator';\nimport type {IViewState} from './view-state';\n\nimport type {Timeline} from '@luma.gl/engine';\nimport type {InteractionState} from './controller';\n\nconst noop = () => {};\n\n// Enums cannot be directly exported as they are not transpiled correctly into ES5, see https://github.com/visgl/deck.gl/issues/7130\nexport const TRANSITION_EVENTS = {\n BREAK: 1,\n SNAP_TO_END: 2,\n IGNORE: 3\n} as const;\n\ntype TransitionEvent = 1 | 2 | 3;\n\nexport type TransitionProps = {\n /** Transition duration in milliseconds, default value 0, implies no transition. When using `FlyToInterpolator`, it can also be set to `'auto'`. */\n transitionDuration?: number | 'auto';\n /** An interpolator object that defines the transition behavior between two viewports. */\n transitionInterpolator?: TransitionInterpolator;\n /** Easing function that can be used to achieve effects like \"Ease-In-Cubic\", \"Ease-Out-Cubic\", etc. Default value performs Linear easing. */\n transitionEasing?: (t: number) => number;\n /** Controls how to process a new view state change that occurs during an existing transition. */\n transitionInterruption?: TransitionEvent;\n /** Callback fired when requested transition starts. */\n onTransitionStart?: (transition: Transition) => void;\n /** Callback fired when requested transition is interrupted. */\n onTransitionInterrupt?: (transition: Transition) => void;\n /** Callback fired when requested transition ends. */\n onTransitionEnd?: (transition: Transition) => void;\n};\n\nconst DEFAULT_EASING = t => t;\nconst DEFAULT_INTERRUPTION = TRANSITION_EVENTS.BREAK;\n\ntype TransitionSettings = BaseTransitionSettings & {\n interpolator: TransitionInterpolator;\n easing: (t: number) => number;\n interruption: TransitionEvent;\n startProps: Record<string, any>;\n endProps: Record<string, any>;\n};\n\nexport default class TransitionManager<ControllerState extends IViewState<ControllerState>> {\n getControllerState: (props: any) => ControllerState;\n props?: TransitionProps;\n propsInTransition: Record<string, any> | null;\n transition: Transition;\n onViewStateChange: (params: {\n viewState: Record<string, any>;\n oldViewState: Record<string, any>;\n }) => void;\n onStateChange: (state: InteractionState) => void;\n\n constructor(opts: {\n timeline: Timeline;\n getControllerState: (props: any) => ControllerState;\n onViewStateChange?: (params: {\n viewState: Record<string, any>;\n oldViewState: Record<string, any>;\n }) => void;\n onStateChange?: (state: InteractionState) => void;\n }) {\n this.getControllerState = opts.getControllerState;\n this.propsInTransition = null;\n this.transition = new Transition(opts.timeline);\n\n this.onViewStateChange = opts.onViewStateChange || noop;\n this.onStateChange = opts.onStateChange || noop;\n }\n\n finalize(): void {\n this.transition.cancel();\n }\n\n // Returns current transitioned viewport.\n getViewportInTransition(): Record<string, any> | null {\n return this.propsInTransition;\n }\n\n // Process the vewiport change, either ignore or trigger a new transition.\n // Return true if a new transition is triggered, false otherwise.\n processViewStateChange(nextProps: TransitionProps) {\n let transitionTriggered = false;\n const currentProps = this.props;\n // Set this.props here as '_triggerTransition' calls '_updateViewport' that uses this.props.\n this.props = nextProps;\n\n // NOTE: Be cautious re-ordering statements in this function.\n if (!currentProps || this._shouldIgnoreViewportChange(currentProps, nextProps)) {\n return false;\n }\n\n if (this._isTransitionEnabled(nextProps)) {\n let startProps = currentProps;\n if (this.transition.inProgress) {\n // @ts-expect-error\n const {interruption, endProps} = this.transition.settings as TransitionSettings;\n startProps = {\n ...currentProps,\n ...(interruption === TRANSITION_EVENTS.SNAP_TO_END\n ? endProps\n : this.propsInTransition || currentProps)\n };\n }\n\n this._triggerTransition(startProps, nextProps);\n\n transitionTriggered = true;\n } else {\n this.transition.cancel();\n }\n\n return transitionTriggered;\n }\n\n updateTransition() {\n this.transition.update();\n }\n\n // Helper methods\n\n _isTransitionEnabled(props: TransitionProps): boolean {\n const {transitionDuration, transitionInterpolator} = props;\n return (\n ((transitionDuration as number) > 0 || transitionDuration === 'auto') &&\n Boolean(transitionInterpolator)\n );\n }\n\n _isUpdateDueToCurrentTransition(props: TransitionProps): boolean {\n if (this.transition.inProgress && this.propsInTransition) {\n // @ts-expect-error\n return (this.transition.settings as TransitionSettings).interpolator.arePropsEqual(\n props,\n this.propsInTransition\n );\n }\n return false;\n }\n\n _shouldIgnoreViewportChange(currentProps: TransitionProps, nextProps: TransitionProps): boolean {\n if (this.transition.inProgress) {\n // @ts-expect-error\n const transitionSettings = this.transition.settings as TransitionSettings;\n // Ignore update if it is requested to be ignored\n return (\n transitionSettings.interruption === TRANSITION_EVENTS.IGNORE ||\n // Ignore update if it is due to current active transition.\n this._isUpdateDueToCurrentTransition(nextProps)\n );\n }\n if (this._isTransitionEnabled(nextProps)) {\n // Ignore if none of the viewport props changed.\n return (nextProps.transitionInterpolator as TransitionInterpolator).arePropsEqual(\n currentProps,\n nextProps\n );\n }\n return true;\n }\n\n _triggerTransition(startProps: TransitionProps, endProps: TransitionProps): void {\n const startViewstate = this.getControllerState(startProps);\n const endViewStateProps = this.getControllerState(endProps).shortestPathFrom(startViewstate);\n\n // update transitionDuration for 'auto' mode\n const transitionInterpolator = endProps.transitionInterpolator as TransitionInterpolator;\n const duration = transitionInterpolator.getDuration\n ? transitionInterpolator.getDuration(startProps, endProps)\n : (endProps.transitionDuration as number);\n\n if (duration === 0) {\n return;\n }\n\n const initialProps = transitionInterpolator.initializeProps(startProps, endViewStateProps);\n\n this.propsInTransition = {};\n const transitionSettings: TransitionSettings = {\n duration,\n easing: endProps.transitionEasing || DEFAULT_EASING,\n interpolator: transitionInterpolator,\n interruption: endProps.transitionInterruption || DEFAULT_INTERRUPTION,\n\n startProps: initialProps.start,\n endProps: initialProps.end,\n\n onStart: endProps.onTransitionStart,\n onUpdate: this._onTransitionUpdate,\n onInterrupt: this._onTransitionEnd(endProps.onTransitionInterrupt),\n onEnd: this._onTransitionEnd(endProps.onTransitionEnd)\n };\n this.transition.start(transitionSettings);\n\n this.onStateChange({inTransition: true});\n\n this.updateTransition();\n }\n\n _onTransitionEnd(callback?: (transition: Transition) => void) {\n return transition => {\n this.propsInTransition = null;\n\n this.onStateChange({\n inTransition: false,\n isZooming: false,\n isPanning: false,\n isRotating: false\n });\n\n callback?.(transition);\n };\n }\n\n _onTransitionUpdate = transition => {\n // NOTE: Be cautious re-ordering statements in this function.\n const {\n time,\n settings: {interpolator, startProps, endProps, duration, easing}\n } = transition;\n const t = easing(time / duration);\n const viewport = interpolator.interpolateProps(startProps, endProps, t);\n\n // This gurantees all props (e.g. bearing, longitude) are normalized\n // So when viewports are compared they are in same range.\n this.propsInTransition = this.getControllerState({\n ...this.props,\n ...viewport\n }).getViewportProps();\n\n this.onViewStateChange({\n viewState: this.propsInTransition,\n oldViewState: this.props as TransitionProps\n });\n };\n}\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {equals} from '@math.gl/core';\nimport assert from '../utils/assert';\n\nexport default abstract class TransitionInterpolator {\n protected _propsToCompare: string[];\n protected _propsToExtract: string[];\n protected _requiredProps?: string[];\n\n /**\n * @param opts {array|object}\n * @param opts.compare {array} - prop names used in equality check\n * @param opts.extract {array} - prop names needed for interpolation\n * @param opts.required {array} - prop names that must be supplied\n * alternatively, supply one list of prop names as `opts` if all of the above are the same.\n */\n constructor(opts: {compare: string[]; extract?: string[]; required?: string[]}) {\n const {compare, extract, required} = opts;\n\n this._propsToCompare = compare;\n this._propsToExtract = extract || compare;\n this._requiredProps = required;\n }\n\n /**\n * Checks if two sets of props need transition in between\n * @param currentProps {object} - a list of viewport props\n * @param nextProps {object} - a list of viewport props\n * @returns {bool} - true if two props are equivalent\n */\n arePropsEqual(currentProps: Record<string, any>, nextProps: Record<string, any>): boolean {\n for (const key of this._propsToCompare) {\n if (\n !(key in currentProps) ||\n !(key in nextProps) ||\n !equals(currentProps[key], nextProps[key])\n ) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * Called before transition starts to validate/pre-process start and end props\n * @param startProps {object} - a list of starting viewport props\n * @param endProps {object} - a list of target viewport props\n * @returns {Object} {start, end} - start and end props to be passed\n * to `interpolateProps`\n */\n initializeProps(\n startProps: Record<string, any>,\n endProps: Record<string, any>\n ): {\n start: Record<string, any>;\n end: Record<string, any>;\n } {\n const startViewStateProps = {};\n const endViewStateProps = {};\n\n for (const key of this._propsToExtract) {\n if (key in startProps || key in endProps) {\n startViewStateProps[key] = startProps[key];\n endViewStateProps[key] = endProps[key];\n }\n }\n\n this._checkRequiredProps(startViewStateProps);\n this._checkRequiredProps(endViewStateProps);\n\n return {start: startViewStateProps, end: endViewStateProps};\n }\n\n /**\n * Returns viewport props in transition\n * @param startProps {object} - a list of starting viewport props\n * @param endProps {object} - a list of target viewport props\n * @param t {number} - a time factor between [0, 1]\n * @returns {object} - a list of interpolated viewport props\n */\n abstract interpolateProps(\n startProps: Record<string, any>,\n endProps: Record<string, any>,\n t: number\n ): Record<string, any>;\n\n /**\n * Returns transition duration\n * @param startProps {object} - a list of starting viewport props\n * @param endProps {object} - a list of target viewport props\n * @returns {Number} - transition duration in milliseconds\n */\n getDuration(startProps: Record<string, any>, endProps: Record<string, any>): number {\n return endProps.transitionDuration;\n }\n\n _checkRequiredProps(props) {\n if (!this._requiredProps) {\n return;\n }\n\n this._requiredProps.forEach(propName => {\n const value = props[propName];\n assert(\n Number.isFinite(value) || Array.isArray(value),\n `${propName} is required for transition`\n );\n });\n }\n}\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n// Replacement for the external assert method to reduce bundle size\n// Note: We don't use the second \"message\" argument in calling code,\n// so no need to support it here\nexport default function assert(condition: any, message?: string): asserts condition {\n if (!condition) {\n throw new Error(message || 'deck.gl: assertion failed.');\n }\n}\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport TransitionInterpolator from './transition-interpolator';\nimport {lerp} from '@math.gl/core';\n\nimport log from '../utils/log';\nimport type Viewport from '../viewports/viewport';\nimport GlobeViewport from '../viewports/globe-viewport';\n\nconst DEFAULT_PROPS = ['longitude', 'latitude', 'zoom', 'bearing', 'pitch'];\nconst DEFAULT_REQUIRED_PROPS = ['longitude', 'latitude', 'zoom'];\n\ntype PropsWithAnchor = {\n around?: number[];\n aroundPosition?: number[];\n [key: string]: any;\n};\n\n/**\n * Performs linear interpolation of two view states.\n */\nexport default class LinearInterpolator extends TransitionInterpolator {\n opts: {\n around?: number[];\n makeViewport?: (props: Record<string, any>) => Viewport;\n };\n\n /**\n * @param {Object} opts\n * @param {Array} opts.transitionProps - list of props to apply linear transition to.\n * @param {Array} opts.around - a screen point to zoom/rotate around.\n * @param {Function} opts.makeViewport - construct a viewport instance with given props.\n */\n constructor(\n opts:\n | string[]\n | {\n transitionProps?:\n | string[]\n | {\n compare: string[];\n extract?: string[];\n required?: string[];\n };\n around?: number[];\n makeViewport?: (props: Record<string, any>) => Viewport;\n } = {}\n ) {\n // Backward compatibility\n const transitionProps = Array.isArray(opts) ? opts : opts.transitionProps;\n\n const normalizedOpts = Array.isArray(opts) ? {} : opts;\n normalizedOpts.transitionProps = Array.isArray(transitionProps)\n ? {\n compare: transitionProps,\n required: transitionProps\n }\n : transitionProps || {\n compare: DEFAULT_PROPS,\n required: DEFAULT_REQUIRED_PROPS\n };\n\n super(normalizedOpts.transitionProps);\n this.opts = normalizedOpts;\n }\n\n initializeProps(\n startProps: Record<string, any>,\n endProps: Record<string, any>\n ): {\n start: PropsWithAnchor;\n end: PropsWithAnchor;\n } {\n const result = super.initializeProps(startProps, endProps);\n\n const {makeViewport, around} = this.opts;\n\n if (makeViewport && around) {\n const TestViewport = makeViewport(startProps);\n if (TestViewport instanceof GlobeViewport) {\n log.warn('around not supported in GlobeView')();\n } else {\n const startViewport = makeViewport(startProps);\n const endViewport = makeViewport(endProps);\n const aroundPosition = startViewport.unproject(around);\n result.start.around = around;\n Object.assign(result.end, {\n around: endViewport.project(aroundPosition),\n aroundPosition,\n width: endProps.width,\n height: endProps.height\n });\n }\n }\n\n return result;\n }\n\n interpolateProps(\n startProps: PropsWithAnchor,\n endProps: PropsWithAnchor,\n t: number\n ): Record<string, any> {\n const propsInTransition = {};\n for (const key of this._propsToExtract) {\n propsInTransition[key] = lerp(startProps[key] || 0, endProps[key] || 0, t);\n }\n\n if (endProps.aroundPosition && this.opts.makeViewport) {\n // Linear transition should be performed in common space\n const viewport = this.opts.makeViewport({...endProps, ...propsInTransition});\n Object.assign(\n propsInTransition,\n viewport.panByPosition(\n endProps.aroundPosition,\n // anchor point in current screen coordinates\n lerp(startProps.around as number[], endProps.around as number[], t) as number[]\n )\n );\n }\n return propsInTransition;\n }\n}\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {Matrix4} from '@math.gl/core';\nimport Viewport from './viewport';\nimport {PROJECTION_MODE} from '../lib/constants';\nimport {altitudeToFovy, fovyToAltitude} from '@math.gl/web-mercator';\n\nimport {vec3, vec4} from '@math.gl/core';\n\nconst DEGREES_TO_RADIANS = Math.PI / 180;\nconst RADIANS_TO_DEGREES = 180 / Math.PI;\nconst EARTH_RADIUS = 6370972;\nexport const GLOBE_RADIUS = 256;\nimport {MAX_LATITUDE} from '@math.gl/web-mercator';\n\nfunction getDistanceScales() {\n const unitsPerMeter = GLOBE_RADIUS / EARTH_RADIUS;\n const unitsPerDegree = (Math.PI / 180) * GLOBE_RADIUS;\n\n return {\n unitsPerMeter: [unitsPerMeter, unitsPerMeter, unitsPerMeter],\n unitsPerMeter2: [0, 0, 0],\n metersPerUnit: [1 / unitsPerMeter, 1 / unitsPerMeter, 1 / unitsPerMeter],\n unitsPerDegree: [unitsPerDegree, unitsPerDegree, unitsPerMeter],\n unitsPerDegree2: [0, 0, 0],\n degreesPerUnit: [1 / unitsPerDegree, 1 / unitsPerDegree, 1 / unitsPerMeter]\n };\n}\n\nexport type GlobeViewportOptions = {\n /** Name of the viewport */\n id?: string;\n /** Left offset from the canvas edge, in pixels */\n x?: number;\n /** Top offset from the canvas edge, in pixels */\n y?: number;\n /** Viewport width in pixels */\n width?: number;\n /** Viewport height in pixels */\n height?: number;\n /** Longitude in degrees */\n longitude?: number;\n /** Latitude in degrees */\n latitude?: number;\n /** Bearing in degrees. Default `0` */\n bearing?: number;\n /** Pitch in degrees. Default `0` */\n pitch?: number;\n /** Camera altitude relative to the viewport height, used to control the FOV. Default `1.5` */\n altitude?: number;\n /* Meter offsets of the viewport center from lng, lat, elevation */\n position?: number[];\n /** Zoom level */\n zoom?: number;\n /** Use orthographic projection */\n orthographic?: boolean;\n /** Camera fovy in degrees. If provided, overrides `altitude` */\n fovy?: number;\n /** Scaler for the near plane, 1 unit equals to the height of the viewport. Default `0.5` */\n nearZMultiplier?: number;\n /** Scaler for the far plane, 1 unit equals to the distance from the camera to the edge of the screen. Default `1` */\n farZMultiplier?: number;\n /** Optionally override the near plane position. `nearZMultiplier` is ignored if `nearZ` is supplied. */\n nearZ?: number;\n /** Optionally override the far plane position. `farZMultiplier` is ignored if `farZ` is supplied. */\n farZ?: number;\n /** The resolution at which to turn flat features into 3D meshes, in degrees. Smaller numbers will generate more detailed mesh. Default `10` */\n resolution?: number;\n};\n\nexport default class GlobeViewport extends Viewport {\n static displayName = 'GlobeViewport';\n\n longitude: number;\n latitude: number;\n bearing: number;\n pitch: number;\n fovy: number;\n resolution: number;\n\n constructor(opts: GlobeViewportOptions = {}) {\n const {\n longitude = 0,\n bearing = 0,\n pitch = 0,\n zoom = 0,\n // Matches Maplibre defaults\n // https://github.com/maplibre/maplibre-gl-js/blob/f8ab4b48d59ab8fe7b068b102538793bbdd4c848/src/geo/projection/globe_transform.ts#L632-L633\n nearZMultiplier = 0.5,\n farZMultiplier = 1,\n resolution = 10\n } = opts;\n\n let {latitude = 0, height, altitude = 1.5, fovy} = opts;\n\n // Clamp to valid range\n latitude = Math.max(Math.min(latitude, 90), -90);\n\n height = height || 1;\n if (fovy) {\n altitude = fovyToAltitude(fovy);\n } else {\n fovy = altitudeToFovy(altitude);\n }\n // Exagerate distance by latitude to match the Web Mercator distortion\n // The goal is that globe and web mercator projection results converge at high zoom\n // https://github.com/maplibre/maplibre-gl-js/blob/f8ab4b48d59ab8fe7b068b102538793bbdd4c848/src/geo/projection/globe_transform.ts#L575-L577\n // Cap latitude for scale calculation to avoid the singularity at the poles\n // where cos(90\u00B0)=0 \u2192 scale\u2192\u221E. GlobeController applies the same cap when\n // compensating zoom during pan (MAX_LATITUDE).\n const scaleLatitude = Math.max(Math.min(latitude, MAX_LATITUDE), -MAX_LATITUDE);\n const scale = Math.pow(2, zoom - zoomAdjust(scaleLatitude));\n // Adjust far plane for pitch \u2014 tilted camera can see further across the globe\n const pitchRadians = pitch * DEGREES_TO_RADIANS;\n const nearZ = opts.nearZ ?? nearZMultiplier;\n const farZ =\n opts.farZ ??\n (altitude + (GLOBE_RADIUS * 2 * scale) / height / Math.max(Math.cos(pitchRadians), 0.1)) *\n farZMultiplier;\n\n // Calculate view matrix\n // The lookAt places the camera along -Y looking toward origin.\n // After the globe rotation (Rx(lat) * Rz(-lng)), the surface normal at the target\n // aligns with -Y, East with +X, and North with +Z.\n const viewMatrix = new Matrix4()\n .lookAt({eye: [0, -altitude, 0], up: [0, 0, 1]})\n // Pitch: tilt the camera away from straight-down\n .rotateX(-pitchRadians)\n // Bearing: rotate around the surface normal.\n // Negative sign matches the WebMercator convention (bearing > 0 = clockwise from North).\n .rotateY(-bearing * DEGREES_TO_RADIANS)\n // Globe orientation: position the target's surface at the top\n .rotateX(latitude * DEGREES_TO_RADIANS)\n .rotateZ(-longitude * DEGREES_TO_RADIANS)\n .scale(scale / height);\n\n super({\n ...opts,\n // x, y, width,\n height,\n\n // view matrix\n viewMatrix,\n longitude,\n latitude,\n zoom,\n\n // projection matrix parameters\n distanceScales: getDistanceScales(),\n fovy,\n focalDistance: altitude,\n near: nearZ,\n far: farZ\n });\n\n this.scale = scale;\n this.latitude = latitude;\n this.longitude = longitude;\n this.bearing = bearing;\n this.pitch = pitch;\n this.fovy = fovy;\n this.resolution = resolution;\n }\n\n get projectionMode() {\n return PROJECTION_MODE.GLOBE;\n }\n\n getDistanceScales() {\n return this.distanceScales;\n }\n\n getBounds(options: {z?: number} = {}): [number, number, number, number] {\n const unprojectOption = {targetZ: options.z || 0};\n\n const left = this.unproject([0, this.height / 2], unprojectOption);\n const top = this.unproject([this.width / 2, 0], unprojectOption);\n const right = this.unproject([this.width, this.height / 2], unprojectOption);\n const bottom = this.unproject([this.width / 2, this.height], unprojectOption);\n\n if (right[0] < this.longitude) right[0] += 360;\n if (left[0] > this.longitude) left[0] -= 360;\n\n return [\n Math.min(left[0], right[0], top[0], bottom[0]),\n Math.min(left[1], right[1], top[1], bottom[1]),\n Math.max(left[0], right[0], top[0], bottom[0]),\n Math.max(left[1], right[1], top[1], bottom[1])\n ];\n }\n\n unproject(\n xyz: number[],\n {topLeft = true, targetZ}: {topLeft?: boolean; targetZ?: number} = {}\n ): number[] {\n const [x, y, z] = xyz;\n\n const y2 = topLeft ? y : this.height - y;\n const {pixelUnprojectionMatrix} = this;\n\n let coord;\n if (Number.isFinite(z)) {\n // Has depth component\n coord = transformVector(pixelUnprojectionMatrix, [x, y2, z, 1]);\n } else {\n // since we don't know the correct projected z value for the point,\n // unproject two points to get a line and then find the point on that line that intersects with the sphere\n const coord0 = transformVector(pixelUnprojectionMatrix, [x, y2, -1, 1]);\n const coord1 = transformVector(pixelUnprojectionMatrix, [x, y2, 1, 1]);\n\n const lt = ((targetZ || 0) / EARTH_RADIUS + 1) * GLOBE_RADIUS;\n const lSqr = vec3.sqrLen(vec3.sub([], coord0, coord1));\n const l0Sqr = vec3.sqrLen(coord0);\n const l1Sqr = vec3.sqrLen(coord1);\n const sSqr = (4 * l0Sqr * l1Sqr - (lSqr - l0Sqr - l1Sqr) ** 2) / 16;\n const dSqr = (4 * sSqr) / lSqr;\n const r0 = Math.sqrt(l0Sqr - dSqr);\n const dr = Math.sqrt(Math.max(0, lt * lt - dSqr));\n const t = (r0 - dr) / Math.sqrt(lSqr);\n\n coord = vec3.lerp([], coord0, coord1, t);\n }\n const [X, Y, Z] = this.unprojectPosition(coord);\n\n if (Number.isFinite(z)) {\n return [X, Y, Z];\n }\n return Number.isFinite(targetZ) ? [X, Y, targetZ as number] : [X, Y];\n }\n\n projectPosition(xyz: number[]): [number, number, number] {\n const [lng, lat, Z = 0] = xyz;\n const lambda = lng * DEGREES_TO_RADIANS;\n const phi = lat * DEGREES_TO_RADIANS;\n const cosPhi = Math.cos(phi);\n const D = (Z / EARTH_RADIUS + 1) * GLOBE_RADIUS;\n\n return [Math.sin(lambda) * cosPhi * D, -Math.cos(lambda) * cosPhi * D, Math.sin(phi) * D];\n }\n\n unprojectPosition(xyz: number[]): [number, number, number] {\n const [x, y, z] = xyz;\n const D = vec3.len(xyz);\n const phi = Math.asin(z / D);\n const lambda = Math.atan2(x, -y);\n\n const lng = lambda * RADIANS_TO_DEGREES;\n const lat = phi * RADIANS_TO_DEGREES;\n const Z = (D / GLOBE_RADIUS - 1) * EARTH_RADIUS;\n return [lng, lat, Z];\n }\n\n projectFlat(xyz: number[]): [number, number] {\n return xyz as [number, number];\n }\n\n unprojectFlat(xyz: number[]): [number, number] {\n return xyz as [number, number];\n }\n\n /**\n * Pan the globe using delta-based movement\n * @param coords - the geographic coordinates where the pan started\n * @param pixel - the current screen position\n * @param startPixel - the screen position where the pan started\n * @returns updated viewport options with new longitude/latitude\n */\n panByPosition(\n [startLng, startLat, startZoom]: number[],\n pixel: number[],\n startPixel: number[]\n ): GlobeViewportOptions {\n // Scale rotation speed inversely with zoom, to approximate constant panning speed\n const scale = Math.pow(2, this.zoom - zoomAdjust(this.latitude));\n const rotationSpeed = 0.25 / scale;\n\n const longitude = startLng + rotationSpeed * (startPixel[0] - pixel[0]);\n let latitude = startLat - rotationSpeed * (startPixel[1] - pixel[1]);\n latitude = Math.max(Math.min(latitude, 90), -90);\n const out = {longitude, latitude, zoom: startZoom - zoomAdjust(startLat)};\n out.zoom += zoomAdjust(out.latitude);\n return out;\n }\n}\n\nexport function zoomAdjust(latitude: number, clampToPoles?: boolean): number {\n if (clampToPoles) {\n latitude = Math.max(Math.min(latitude, MAX_LATITUDE), -MAX_LATITUDE);\n }\n const scaleAdjust = Math.PI * Math.cos((latitude * Math.PI) / 180);\n return Math.log2(scaleAdjust);\n}\n\nfunction transformVector(matrix: number[], vector: number[]): number[] {\n const result = vec4.transformMat4([], vector, matrix);\n vec4.scale(result, result, 1 / result[3]);\n return result;\n}\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n/* eslint-disable max-statements, complexity */\nimport TransitionManager, {TransitionProps} from './transition-manager';\nimport LinearInterpolator from '../transitions/linear-interpolator';\nimport {IViewState} from './view-state';\nimport {ConstructorOf} from '../types/types';\nimport {deepEqual} from '../utils/deep-equal';\n\nimport type Viewport from '../viewports/viewport';\n\nimport type {EventManager, MjolnirEvent, MjolnirGestureEvent, MjolnirWheelEvent, MjolnirKeyEvent} from 'mjolnir.js';\nimport type {Timeline} from '@luma.gl/engine';\n\nconst NO_TRANSITION_PROPS = {\n transitionDuration: 0\n} as const;\n\nconst DEFAULT_INERTIA = 300;\nconst INERTIA_EASING = t => 1 - (1 - t) * (1 - t);\nconst EVENT_TYPES = {\n WHEEL: ['wheel'],\n PAN: ['panstart', 'panmove', 'panend'],\n PINCH: ['pinchstart', 'pinchmove', 'pinchend'],\n MULTI_PAN: ['multipanstart', 'multipanmove', 'multipanend'],\n DOUBLE_CLICK: ['dblclick'],\n DOUBLE_CLICK_DRAG: ['dblclickdragstart', 'dblclickdragmove', 'dblclickdragend', 'dblclickdragcancel'],\n KEYBOARD: ['keydown']\n} as const;\n\n/** Configuration of how user input is handled */\nexport type ControllerOptions = {\n /** Enable zooming with mouse wheel. Default `true`. */\n scrollZoom?: boolean | {\n /** Scaler that translates wheel delta to the change of viewport scale. Default `0.01`. */\n speed?: number;\n /** Smoothly transition to the new zoom. If enabled, will provide a slightly lagged but smoother experience. Default `false`. */\n smooth?: boolean\n };\n /** Enable panning with pointer drag. Default `true` */\n dragPan?: boolean;\n /** Enable rotating with pointer drag. Default `true` */\n dragRotate?: boolean;\n /** Enable zooming with double click. Default `false`. Enabling adds ~300ms latency to click events. */\n doubleClickZoom?: boolean;\n /** Enable zooming with double click/tap and drag. Default `false`. Enabling adds ~300ms latency to click events. */\n doubleClickDragZoom?: boolean;\n /** Enable zooming with multi-touch pinch. Default `true` */\n touchZoom?: boolean;\n /** Enable rotating with multi-touch. Use two-finger rotating gesture for horizontal and three-finger swiping gesture for vertical rotation. Default `false` */\n touchRotate?: boolean;\n /** Enable interaction with keyboard. Default `true`. */\n keyboard?:\n | boolean\n | {\n /** Speed of zoom using +/- keys. Default `2` */\n zoomSpeed?: number;\n /** Speed of movement using arrow keys, in pixels. */\n moveSpeed?: number;\n /** Speed of rotation using shift + left/right arrow keys, in degrees. Default 15. */\n rotateSpeedX?: number;\n /** Speed of rotation using shift + up/down arrow keys, in degrees. Default 10. */\n rotateSpeedY?: number;\n };\n /** Drag behavior without pressing function keys, one of `pan` and `rotate`. */\n dragMode?: 'pan' | 'rotate';\n /** Enable inertia after panning/pinching. If a number is provided, indicates the duration of time over which the velocity reduces to zero, in milliseconds. Default `false`. */\n inertia?: boolean | number;\n /** Bounding box of content that the controller is constrained in */\n maxBounds?: [min: [number, number], max: [number, number]] | [min: [number, number, number], max: [number, number, number]] | null;\n};\n\nexport type ControllerProps = {\n /** Identifier of the controller */\n id: string;\n /** Viewport x position */\n x: number;\n /** Viewport y position */\n y: number;\n /** Viewport width */\n width: number;\n /** Viewport height */\n height: number;\n} & ControllerOptions & TransitionProps;\n\n/** The state of a controller */\nexport type InteractionState = {\n /** If the view state is in transition */\n inTransition?: boolean;\n /** If the user is dragging */\n isDragging?: boolean;\n /** If the view is being panned, either from user input or transition */\n isPanning?: boolean;\n /** If the view is being rotated, either from user input or transition */\n isRotating?: boolean;\n /** If the view is being zoomed, either from user input or transition */\n isZooming?: boolean;\n /** World coordinate [lng, lat, altitude] of rotation pivot point when rotating */\n rotationPivotPosition?: [number, number, number];\n}\n\n/** Parameters passed to the onViewStateChange callback */\nexport type ViewStateChangeParameters<ViewStateT = any> = {\n viewId: string;\n /** The next view state, either from user input or transition */\n viewState: ViewStateT;\n /** Object describing the nature of the view state change */\n interactionState: InteractionState;\n /** The current view state */\n oldViewState?: ViewStateT;\n}\n\nconst pinchEventWorkaround: any = {};\n\nexport default abstract class Controller<ControllerState extends IViewState<ControllerState>> {\n abstract get ControllerState(): ConstructorOf<ControllerState>;\n abstract get transition(): TransitionProps;\n\n // @ts-expect-error (2564) - not assigned in the constructor\n protected props: ControllerProps;\n protected state: Record<string, any> = {};\n\n protected transitionManager: TransitionManager<ControllerState>;\n protected eventManager: EventManager;\n protected onViewStateChange: (params: ViewStateChangeParameters) => void;\n protected onStateChange: (state: InteractionState) => void;\n protected makeViewport: (opts: Record<string, any>) => Viewport;\n protected pickPosition?: (x: number, y: number) => {coordinate?: number[]} | null;\n\n private _controllerState?: ControllerState;\n private _events: Record<string, boolean> = {};\n private _interactionState: InteractionState = {\n isDragging: false\n };\n private _customEvents: string[] = [];\n private _eventStartBlocked: any = null;\n private _panMove: boolean = false;\n private _doubleClickDragAnchor: [number, number] | null = null;\n private _suppressDoubleClickUntil: number = 0;\n\n protected invertPan: boolean = false;\n protected dragMode: 'pan' | 'rotate' = 'rotate';\n protected inertia: number = 0;\n protected scrollZoom: boolean | {speed?: number; smooth?: boolean} = true;\n protected dragPan: boolean = true;\n protected dragRotate: boolean = true;\n protected doubleClickZoom: boolean = true;\n protected doubleClickDragZoom: boolean = true;\n protected touchZoom: boolean = true;\n protected touchRotate: boolean = false;\n protected keyboard:\n | boolean\n | {\n zoomSpeed?: number; // speed of zoom using +/- keys. Default 2.\n moveSpeed?: number; // speed of movement using arrow keys, in pixels.\n rotateSpeedX?: number; // speed of rotation using shift + left/right arrow keys, in degrees. Default 15.\n rotateSpeedY?: number; // speed of rotation using shift + up/down arrow keys, in degrees. Default 10.\n } = true;\n\n constructor(opts: {\n timeline: Timeline,\n eventManager: EventManager;\n makeViewport: (opts: Record<string, any>) => Viewport;\n onViewStateChange: (params: ViewStateChangeParameters) => void;\n onStateChange: (state: InteractionState) => void;\n pickPosition?: (x: number, y: number) => {coordinate?: number[]} | null;\n }) {\n this.transitionManager = new TransitionManager<ControllerState>({\n ...opts,\n getControllerState: props => new this.ControllerState(props),\n onViewStateChange: this._onTransition.bind(this),\n onStateChange: this._setInteractionState.bind(this)\n });\n\n this.handleEvent = this.handleEvent.bind(this);\n\n this.eventManager = opts.eventManager;\n this.onViewStateChange = opts.onViewStateChange || (() => {});\n this.onStateChange = opts.onStateChange || (() => {});\n this.makeViewport = opts.makeViewport;\n this.pickPosition = opts.pickPosition;\n }\n\n set events(customEvents) {\n this.toggleEvents(this._customEvents, false);\n this.toggleEvents(customEvents, true);\n this._customEvents = customEvents;\n // Make sure default events are not overwritten\n if (this.props) {\n this.setProps(this.props);\n }\n }\n\n finalize() {\n for (const eventName in this._events) {\n if (this._events[eventName]) {\n // @ts-ignore (2345) event type string cannot be assifned to enum\n // eslint-disable-next-line @typescript-eslint/unbound-method\n this.eventManager?.off(eventName, this.handleEvent);\n }\n }\n this.transitionManager.finalize();\n }\n\n /**\n * Callback for events\n */\n handleEvent(event: MjolnirEvent) {\n // Force recalculate controller state\n this._controllerState = undefined;\n const eventStartBlocked = this._eventStartBlocked;\n\n switch (event.type) {\n case 'panstart':\n return eventStartBlocked ? false : this._onPanStart(event);\n case 'panmove':\n return this._onPan(event);\n case 'panend':\n return this._onPanEnd(event);\n case 'pinchstart':\n return eventStartBlocked ? false : this._onPinchStart(event);\n case 'pinchmove':\n return this._onPinch(event);\n case 'pinchend':\n return this._onPinchEnd(event);\n case 'multipanstart':\n return eventStartBlocked ? false : this._onMultiPanStart(event);\n case 'multipanmove':\n return this._onMultiPan(event);\n case 'multipanend':\n return this._onMultiPanEnd(event);\n case 'dblclick':\n return this._onDoubleClick(event);\n case 'dblclickdragstart':\n return eventStartBlocked ? false : this._onDoubleClickDragStart(event);\n case 'dblclickdragmove':\n return this._onDoubleClickDrag(event);\n case 'dblclickdragend':\n case 'dblclickdragcancel':\n return this._onDoubleClickDragEnd(event);\n case 'wheel':\n return this._onWheel(event as MjolnirWheelEvent);\n case 'keydown':\n return this._onKeyDown(event as MjolnirKeyEvent);\n default:\n return false;\n }\n }\n\n /* Event utils */\n // Event object: http://hammerjs.github.io/api/#event-object\n get controllerState(): ControllerState {\n this._controllerState = this._controllerState || new this.ControllerState({\n makeViewport: this.makeViewport,\n ...this.props,\n ...this.state\n });\n return this._controllerState;\n }\n\n getCenter(event: MjolnirGestureEvent | MjolnirWheelEvent) : [number, number] {\n const {x, y} = this.props;\n const {offsetCenter} = event;\n return [offsetCenter.x - x, offsetCenter.y - y];\n }\n\n isPointInBounds(pos: [number, number], event: MjolnirEvent): boolean {\n const {width, height} = this.props;\n if (event && event.handled) {\n return false;\n }\n\n const inside = pos[0] >= 0 && pos[0] <= width && pos[1] >= 0 && pos[1] <= height;\n if (inside && event) {\n event.stopPropagation();\n }\n return inside;\n }\n\n isFunctionKeyPressed(event: MjolnirEvent): boolean {\n const {srcEvent} = event;\n return Boolean(srcEvent.metaKey || srcEvent.altKey || srcEvent.ctrlKey || srcEvent.shiftKey);\n }\n\n isDragging(): boolean {\n return this._interactionState.isDragging || false;\n }\n\n // When a multi-touch event ends, e.g. pinch, not all pointers are lifted at the same time.\n // This triggers a brief `pan` event.\n // Calling this method will temporarily disable *start events to avoid conflicting transitions.\n blockEvents(timeout: number): void {\n /* global setTimeout */\n const timer = setTimeout(() => {\n if (this._eventStartBlocked === timer) {\n this._eventStartBlocked = null;\n }\n }, timeout);\n this._eventStartBlocked = timer;\n }\n\n /**\n * Extract interactivity options\n */\n setProps(props: ControllerProps) {\n if (props.dragMode) {\n this.dragMode = props.dragMode;\n }\n const oldProps = this.props;\n this.props = props;\n\n if (!('transitionInterpolator' in props)) {\n // Add default transition interpolator\n props.transitionInterpolator = this._getTransitionProps().transitionInterpolator;\n }\n\n this.transitionManager.processViewStateChange(props);\n\n const {inertia} = props;\n this.inertia = Number.isFinite(inertia) ? (inertia as number) : (inertia === true ? DEFAULT_INERTIA : 0);\n\n // TODO - make sure these are not reset on every setProps\n const {\n scrollZoom = true,\n dragPan = true,\n dragRotate = true,\n doubleClickZoom = true,\n doubleClickDragZoom = false,\n touchZoom = true,\n touchRotate = false,\n keyboard = true\n } = props;\n\n // Register/unregister events\n const isInteractive = Boolean(this.onViewStateChange);\n this.toggleEvents(EVENT_TYPES.WHEEL, isInteractive && scrollZoom);\n // We always need the pan events to set the correct isDragging state, even if dragPan & dragRotate are both false\n this.toggleEvents(EVENT_TYPES.PAN, isInteractive);\n this.toggleEvents(EVENT_TYPES.PINCH, isInteractive && (touchZoom || touchRotate));\n this.toggleEvents(EVENT_TYPES.MULTI_PAN, isInteractive && touchRotate);\n this.toggleEvents(EVENT_TYPES.DOUBLE_CLICK, isInteractive && doubleClickZoom);\n this.toggleEvents(EVENT_TYPES.DOUBLE_CLICK_DRAG, isInteractive && doubleClickDragZoom);\n this.toggleEvents(EVENT_TYPES.KEYBOARD, isInteractive && keyboard);\n\n // Interaction toggles\n this.scrollZoom = scrollZoom;\n this.dragPan = dragPan;\n this.dragRotate = dragRotate;\n this.doubleClickZoom = doubleClickZoom;\n this.doubleClickDragZoom = doubleClickDragZoom;\n this.touchZoom = touchZoom;\n this.touchRotate = touchRotate;\n this.keyboard = keyboard;\n\n // Normalize view state if maxBounds is defined\n const dimensionChanged = !oldProps || oldProps.height !== props.height || oldProps.width !== props.width || oldProps.maxBounds !== props.maxBounds;\n if (dimensionChanged && props.maxBounds) {\n // Dimensions changed, try re-normalize the props\n const controllerState = new this.ControllerState({...props, makeViewport: this.makeViewport});\n const normalizedProps = controllerState.getViewportProps();\n const changed = Object.keys(normalizedProps).some(key => !deepEqual(normalizedProps[key], props[key], 1));\n if (changed) {\n // some props are updated after normalization\n this.updateViewport(controllerState);\n }\n }\n }\n\n updateTransition() {\n this.transitionManager.updateTransition();\n }\n\n toggleEvents(eventNames, enabled) {\n if (this.eventManager) {\n eventNames.forEach(eventName => {\n if (this._events[eventName] !== enabled) {\n this._events[eventName] = enabled;\n if (enabled) {\n // eslint-disable-next-line @typescript-eslint/unbound-method\n this.eventManager.on(eventName, this.handleEvent);\n } else {\n // eslint-disable-next-line @typescript-eslint/unbound-method\n this.eventManager.off(eventName, this.handleEvent);\n }\n }\n });\n }\n }\n\n // Private Methods\n\n /* Callback util */\n // formats map state and invokes callback function\n protected updateViewport(newControllerState: ControllerState, extraProps: Record<string, any> | null = null, interactionState: InteractionState = {}) {\n const viewState = {...newControllerState.getViewportProps(), ...extraProps};\n\n // TODO - to restore diffing, we need to include interactionState\n const changed = this.controllerState !== newControllerState;\n // const oldViewState = this.controllerState.getViewportProps();\n // const changed = Object.keys(viewState).some(key => oldViewState[key] !== viewState[key]);\n\n this.state = newControllerState.getState();\n this._setInteractionState(interactionState);\n\n if (changed) {\n const oldViewState = this.controllerState && this.controllerState.getViewportProps();\n if (this.onViewStateChange) {\n this.onViewStateChange({viewState, interactionState: this._interactionState, oldViewState, viewId: this.props.id});\n }\n }\n }\n\n private _onTransition(params: {viewState: Record<string, any>, oldViewState: Record<string, any>}) {\n this.onViewStateChange({...params, interactionState: this._interactionState, viewId: this.props.id});\n }\n\n private _setInteractionState(newStates: InteractionState) {\n Object.assign(this._interactionState, newStates);\n this.onStateChange(this._interactionState);\n }\n\n /* Event handlers */\n // Default handler for the `panstart` event.\n protected _onPanStart(event: MjolnirGestureEvent): boolean {\n const pos = this.getCenter(event);\n if (!this.isPointInBounds(pos, event)) {\n return false;\n }\n let alternateMode = this.isFunctionKeyPressed(event) || event.rightButton || false;\n if (this.invertPan || this.dragMode === 'pan') {\n // invertPan is replaced by props.dragMode, keeping for backward compatibility\n alternateMode = !alternateMode;\n }\n\n const newControllerState = this.controllerState[alternateMode ? 'panStart' : 'rotateStart']({\n pos\n });\n this._panMove = alternateMode;\n this.updateViewport(newControllerState, NO_TRANSITION_PROPS, {isDragging: true});\n return true;\n }\n\n // Default handler for the `panmove` and `panend` event.\n protected _onPan(event: MjolnirGestureEvent): boolean {\n if (!this.isDragging()) {\n return false;\n }\n return this._panMove ? this._onPanMove(event) : this._onPanRotate(event);\n }\n\n protected _onPanEnd(event: MjolnirGestureEvent): boolean {\n if (!this.isDragging()) {\n return false;\n }\n return this._panMove ? this._onPanMoveEnd(event) : this._onPanRotateEnd(event);\n }\n\n // Default handler for panning to move.\n // Called by `_onPan` when panning without function key pressed.\n protected _onPanMove(event: MjolnirGestureEvent): boolean {\n if (!this.dragPan) {\n return false;\n }\n const pos = this.getCenter(event);\n const newControllerState = this.controllerState.pan({pos});\n this.updateViewport(newControllerState, NO_TRANSITION_PROPS, {\n isDragging: true,\n isPanning: true\n });\n return true;\n }\n\n protected _onPanMoveEnd(event: MjolnirGestureEvent): boolean {\n const {inertia} = this;\n if (this.dragPan && inertia && event.velocity) {\n const pos = this.getCenter(event);\n const endPos: [number, number] = [\n pos[0] + (event.velocityX * inertia) / 2,\n pos[1] + (event.velocityY * inertia) / 2\n ];\n const newControllerState = this.controllerState.pan({pos: endPos}).panEnd();\n this.updateViewport(\n newControllerState,\n {\n ...this._getTransitionProps(),\n transitionDuration: inertia,\n transitionEasing: INERTIA_EASING\n },\n {\n isDragging: false,\n isPanning: true\n }\n );\n } else {\n const newControllerState = this.controllerState.panEnd();\n this.updateViewport(newControllerState, null, {\n isDragging: false,\n isPanning: false\n });\n }\n return true;\n }\n\n // Default handler for panning to rotate.\n // Called by `_onPan` when panning with function key pressed.\n protected _onPanRotate(event: MjolnirGestureEvent): boolean {\n if (!this.dragRotate) {\n return false;\n }\n\n const pos = this.getCenter(event);\n const newControllerState = this.controllerState.rotate({pos});\n this.updateViewport(newControllerState, NO_TRANSITION_PROPS, {\n isDragging: true,\n isRotating: true\n });\n return true;\n }\n\n protected _onPanRotateEnd(event): boolean {\n const {inertia} = this;\n if (this.dragRotate && inertia && event.velocity) {\n const pos = this.getCenter(event);\n const endPos: [number, number] = [\n pos[0] + (event.velocityX * inertia) / 2,\n pos[1] + (event.velocityY * inertia) / 2\n ];\n const newControllerState = this.controllerState.rotate({pos: endPos}).rotateEnd();\n this.updateViewport(\n newControllerState,\n {\n ...this._getTransitionProps(),\n transitionDuration: inertia,\n transitionEasing: INERTIA_EASING\n },\n {\n isDragging: false,\n isRotating: true\n }\n );\n } else {\n const newControllerState = this.controllerState.rotateEnd();\n this.updateViewport(newControllerState, null, {\n isDragging: false,\n isRotating: false\n });\n }\n return true;\n }\n\n // Default handler for the `wheel` event.\n protected _onWheel(event: MjolnirWheelEvent): boolean {\n if (!this.scrollZoom) {\n return false;\n }\n\n const pos = this.getCenter(event);\n if (!this.isPointInBounds(pos, event)) {\n return false;\n }\n event.srcEvent.preventDefault();\n\n const {speed = 0.01, smooth = false} = this.scrollZoom === true ? {} : this.scrollZoom;\n const {delta} = event;\n\n // Map wheel delta to relative scale\n let scale = 2 / (1 + Math.exp(-Math.abs(delta * speed)));\n if (delta < 0 && scale !== 0) {\n scale = 1 / scale;\n }\n\n const transitionProps = smooth\n ? {...this._getTransitionProps({around: pos}), transitionDuration: 250}\n : NO_TRANSITION_PROPS;\n\n const newControllerState = this.controllerState.zoom({pos, scale});\n this.updateViewport(\n newControllerState,\n transitionProps,\n {\n isZooming: true,\n isPanning: true\n }\n );\n\n // When there's no transition (duration = 0), immediately reset interaction state\n // since _onTransitionEnd callback won't fire\n if (!smooth) {\n this._setInteractionState({isZooming: false, isPanning: false});\n }\n return true;\n }\n\n protected _onMultiPanStart(event: MjolnirGestureEvent): boolean {\n const pos = this.getCenter(event);\n if (!this.isPointInBounds(pos, event)) {\n return false;\n }\n const newControllerState = this.controllerState.rotateStart({pos});\n this.updateViewport(newControllerState, NO_TRANSITION_PROPS, {isDragging: true});\n return true;\n }\n\n protected _onMultiPan(event: MjolnirGestureEvent): boolean {\n if (!this.touchRotate) {\n return false;\n }\n if (!this.isDragging()) {\n return false;\n }\n\n const pos = this.getCenter(event);\n pos[0] -= event.deltaX;\n\n const newControllerState = this.controllerState.rotate({pos});\n this.updateViewport(newControllerState, NO_TRANSITION_PROPS, {\n isDragging: true,\n isRotating: true\n });\n return true;\n }\n\n protected _onMultiPanEnd(event: MjolnirGestureEvent): boolean {\n if (!this.isDragging()) {\n return false;\n }\n const {inertia} = this;\n if (this.touchRotate && inertia && event.velocityY) {\n const pos = this.getCenter(event);\n const endPos: [number, number] = [pos[0], (pos[1] += (event.velocityY * inertia) / 2)];\n const newControllerState = this.controllerState.rotate({pos: endPos});\n this.updateViewport(\n newControllerState,\n {\n ...this._getTransitionProps(),\n transitionDuration: inertia,\n transitionEasing: INERTIA_EASING\n },\n {\n isDragging: false,\n isRotating: true\n }\n );\n this.blockEvents(inertia);\n } else {\n const newControllerState = this.controllerState.rotateEnd();\n this.updateViewport(newControllerState, null, {\n isDragging: false,\n isRotating: false\n });\n }\n return true;\n }\n\n // Default handler for the `pinchstart` event.\n protected _onPinchStart(event: MjolnirGestureEvent): boolean {\n this._doubleClickDragAnchor = null;\n const pos = this.getCenter(event);\n if (!this.isPointInBounds(pos, event)) {\n return false;\n }\n\n const newControllerState = this.controllerState.zoomStart({pos}).rotateStart({pos});\n // hack - hammer's `rotation` field doesn't seem to produce the correct angle\n pinchEventWorkaround._startPinchRotation = event.rotation;\n pinchEventWorkaround._lastPinchEvent = event;\n this.updateViewport(newControllerState, NO_TRANSITION_PROPS, {isDragging: true});\n return true;\n }\n\n // Default handler for the `pinchmove` and `pinchend` events.\n protected _onPinch(event: MjolnirGestureEvent): boolean {\n if (!this.touchZoom && !this.touchRotate) {\n return false;\n }\n if (!this.isDragging()) {\n return false;\n }\n\n let newControllerState = this.controllerState;\n if (this.touchZoom) {\n const {scale} = event;\n const pos = this.getCenter(event);\n newControllerState = newControllerState.zoom({pos, scale});\n }\n if (this.touchRotate) {\n const {rotation} = event;\n newControllerState = newControllerState.rotate({\n deltaAngleX: pinchEventWorkaround._startPinchRotation - rotation\n });\n }\n\n this.updateViewport(newControllerState, NO_TRANSITION_PROPS, {\n isDragging: true,\n isPanning: this.touchZoom,\n isZooming: this.touchZoom,\n isRotating: this.touchRotate\n });\n pinchEventWorkaround._lastPinchEvent = event;\n return true;\n }\n\n protected _onPinchEnd(event: MjolnirGestureEvent): boolean {\n if (!this.isDragging()) {\n return false;\n }\n const {inertia} = this;\n const {_lastPinchEvent} = pinchEventWorkaround;\n if (this.touchZoom && inertia && _lastPinchEvent && event.scale !== _lastPinchEvent.scale) {\n const pos = this.getCenter(event);\n let newControllerState = this.controllerState.rotateEnd();\n const z = Math.log2(event.scale);\n const velocityZ =\n (z - Math.log2(_lastPinchEvent.scale)) / (event.deltaTime - _lastPinchEvent.deltaTime);\n const endScale = Math.pow(2, z + (velocityZ * inertia) / 2);\n newControllerState = newControllerState.zoom({pos, scale: endScale}).zoomEnd();\n\n this.updateViewport(\n newControllerState,\n {\n ...this._getTransitionProps({around: pos}),\n transitionDuration: inertia,\n transitionEasing: INERTIA_EASING\n },\n {\n isDragging: false,\n isPanning: this.touchZoom,\n isZooming: this.touchZoom,\n isRotating: false\n }\n );\n this.blockEvents(inertia);\n } else {\n const newControllerState = this.controllerState.zoomEnd().rotateEnd();\n this.updateViewport(newControllerState, null, {\n isDragging: false,\n isPanning: false,\n isZooming: false,\n isRotating: false\n });\n }\n pinchEventWorkaround._startPinchRotation = null;\n pinchEventWorkaround._lastPinchEvent = null;\n return true;\n }\n\n // Default handler for the `dblclick` event.\n protected _onDoubleClick(event: MjolnirGestureEvent): boolean {\n if (!this.doubleClickZoom) {\n return false;\n }\n if (Date.now() < this._suppressDoubleClickUntil) {\n return false;\n }\n const pos = this.getCenter(event);\n if (!this.isPointInBounds(pos, event)) {\n return false;\n }\n\n const isZoomOut = this.isFunctionKeyPressed(event);\n\n const newControllerState = this.controllerState.zoom({pos, scale: isZoomOut ? 0.5 : 2});\n this.updateViewport(newControllerState, this._getTransitionProps({around: pos}), {\n isZooming: true,\n isPanning: true\n });\n this.blockEvents(100);\n return true;\n }\n\n protected _onDoubleClickDragStart(event: MjolnirGestureEvent): boolean {\n if (!this.doubleClickDragZoom) {\n this._doubleClickDragAnchor = null;\n return false;\n }\n\n const pos = this.getCenter(event);\n if (!this.isPointInBounds(pos, event)) {\n this._doubleClickDragAnchor = null;\n return false;\n }\n\n this._doubleClickDragAnchor = pos;\n let newControllerState = this.controllerState.zoomStart({pos});\n if (event.scale !== 1) {\n newControllerState = newControllerState.zoom({pos, scale: event.scale});\n }\n this.updateViewport(newControllerState, NO_TRANSITION_PROPS, {\n isDragging: true,\n isPanning: true,\n isZooming: true\n });\n return true;\n }\n\n protected _onDoubleClickDrag(event: MjolnirGestureEvent): boolean {\n const pos = this._doubleClickDragAnchor;\n if (!pos) {\n return false;\n }\n\n const newControllerState = this.controllerState.zoom({pos, scale: event.scale});\n this.updateViewport(newControllerState, NO_TRANSITION_PROPS, {\n isDragging: true,\n isPanning: true,\n isZooming: true\n });\n return true;\n }\n\n protected _onDoubleClickDragEnd(_event: MjolnirGestureEvent): boolean {\n if (!this._doubleClickDragAnchor) {\n return false;\n }\n\n this._doubleClickDragAnchor = null;\n const newControllerState = this.controllerState.zoomEnd();\n this.updateViewport(newControllerState, null, {\n isDragging: false,\n isPanning: false,\n isZooming: false\n });\n this._suppressDoubleClickUntil = Date.now() + 100;\n this.blockEvents(100);\n return true;\n }\n\n // Default handler for the `keydown` event\n protected _onKeyDown(event: MjolnirKeyEvent): boolean {\n if (!this.keyboard) {\n return false;\n }\n const funcKey = this.isFunctionKeyPressed(event);\n // @ts-ignore\n const {zoomSpeed, moveSpeed, rotateSpeedX, rotateSpeedY} = this.keyboard === true ? {} : this.keyboard;\n const {controllerState} = this;\n let newControllerState;\n const interactionState: InteractionState = {};\n\n switch (event.srcEvent.code) {\n case 'Minus':\n newControllerState = funcKey\n ? controllerState.zoomOut(zoomSpeed).zoomOut(zoomSpeed)\n : controllerState.zoomOut(zoomSpeed);\n interactionState.isZooming = true;\n break;\n case 'Equal':\n newControllerState = funcKey\n ? controllerState.zoomIn(zoomSpeed).zoomIn(zoomSpeed)\n : controllerState.zoomIn(zoomSpeed);\n interactionState.isZooming = true;\n break;\n case 'ArrowLeft':\n if (funcKey) {\n newControllerState = controllerState.rotateLeft(rotateSpeedX);\n interactionState.isRotating = true;\n } else {\n newControllerState = controllerState.moveLeft(moveSpeed);\n interactionState.isPanning = true;\n }\n break;\n case 'ArrowRight':\n if (funcKey) {\n newControllerState = controllerState.rotateRight(rotateSpeedX);\n interactionState.isRotating = true;\n } else {\n newControllerState = controllerState.moveRight(moveSpeed);\n interactionState.isPanning = true;\n }\n break;\n case 'ArrowUp':\n if (funcKey) {\n newControllerState = controllerState.rotateUp(rotateSpeedY);\n interactionState.isRotating = true;\n } else {\n newControllerState = controllerState.moveUp(moveSpeed);\n interactionState.isPanning = true;\n }\n break;\n case 'ArrowDown':\n if (funcKey) {\n newControllerState = controllerState.rotateDown(rotateSpeedY);\n interactionState.isRotating = true;\n } else {\n newControllerState = controllerState.moveDown(moveSpeed);\n interactionState.isPanning = true;\n }\n break;\n default:\n return false;\n }\n this.updateViewport(newControllerState, this._getTransitionProps(), interactionState);\n return true;\n }\n\n protected _getTransitionProps(opts?: any): TransitionProps {\n const {transition} = this;\n\n if (!transition || !transition.transitionInterpolator) {\n return NO_TRANSITION_PROPS;\n }\n\n // Enables Transitions on double-click/tap and key-down events.\n return opts\n ? {\n ...transition,\n transitionInterpolator: new LinearInterpolator({\n ...opts,\n ...(transition.transitionInterpolator as LinearInterpolator).opts,\n makeViewport: this.controllerState.makeViewport\n })\n }\n : transition;\n }\n}\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type Viewport from '../viewports/viewport';\n\nexport default abstract class ViewState<\n T,\n Props extends Record<string, any>,\n State extends Record<string, any>\n> implements IViewState<T>\n{\n private _viewportProps: Required<Props>;\n private _state: State;\n\n makeViewport: (props: Record<string, any>) => Viewport;\n\n constructor(\n props: Required<Props>,\n state: State,\n makeViewport: (props: Record<string, any>) => Viewport\n ) {\n this.makeViewport = makeViewport;\n this._viewportProps = this.applyConstraints(props);\n this._state = state;\n }\n\n getViewportProps(): Required<Props> {\n return this._viewportProps;\n }\n\n getState(): State {\n return this._state;\n }\n\n abstract applyConstraints(props: Required<Props>): Required<Props>;\n\n abstract shortestPathFrom(viewState: T): Props;\n\n abstract panStart(params: {pos: [number, number]}): T;\n abstract pan({pos, startPos}: {pos: [number, number]; startPos?: [number, number]}): T;\n abstract panEnd(): T;\n\n abstract rotateStart(params: {pos: [number, number]; altitude?: number}): T;\n abstract rotate(params: {pos?: [number, number]; deltaAngleX?: number; deltaAngleY: number}): T;\n abstract rotateEnd(): T;\n\n abstract zoomStart({pos}: {pos: [number, number]}): T;\n abstract zoom({\n pos,\n startPos,\n scale\n }: {\n pos: [number, number];\n startPos?: [number, number];\n scale: number;\n }): T;\n abstract zoomEnd(): T;\n\n abstract zoomIn(speed?: number): T;\n abstract zoomOut(speed?: number): T;\n\n abstract moveLeft(speed?: number): T;\n abstract moveRight(speed?: number): T;\n abstract moveUp(speed?: number): T;\n abstract moveDown(speed?: number): T;\n\n abstract rotateLeft(speed?: number): T;\n abstract rotateRight(speed?: number): T;\n abstract rotateUp(speed?: number): T;\n abstract rotateDown(speed?: number): T;\n}\n\nexport interface IViewState<T> {\n makeViewport?: (props: Record<string, any>) => Viewport;\n\n getViewportProps(): Record<string, any>;\n\n getState(): Record<string, any>;\n\n shortestPathFrom(viewState: T): Record<string, any>;\n\n panStart(params: {pos: [number, number]}): T;\n pan({pos, startPos}: {pos: [number, number]; startPos?: [number, number]}): T;\n panEnd(): T;\n\n rotateStart(params: {pos: [number, number]; altitude?: number}): T;\n rotate(params: {pos?: [number, number]; deltaAngleX?: number; deltaAngleY?: number}): T;\n rotateEnd(): T;\n\n zoomStart({pos}: {pos: [number, number]}): T;\n zoom({\n pos,\n startPos,\n scale\n }: {\n pos: [number, number];\n startPos?: [number, number];\n scale: number;\n }): T;\n zoomEnd(): T;\n\n zoomIn(speed?: number): T;\n zoomOut(speed?: number): T;\n\n moveLeft(speed?: number): T;\n moveRight(speed?: number): T;\n moveUp(speed?: number): T;\n moveDown(speed?: number): T;\n\n rotateLeft(speed?: number): T;\n rotateRight(speed?: number): T;\n rotateUp(speed?: number): T;\n rotateDown(speed?: number): T;\n}\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport View, {CommonViewState, CommonViewProps} from './view';\nimport WebMercatorViewport from '../viewports/web-mercator-viewport';\nimport MapController from '../controllers/map-controller';\n\nimport type {NumericArray} from '../types/types';\n\nexport type MapViewState = {\n /** Longitude of the map center */\n longitude: number;\n /** Latitude of the map center */\n latitude: number;\n /** Zoom level */\n zoom: number;\n /** Pitch (tilt) of the map, in degrees. `0` looks top down */\n pitch?: number;\n /** Bearing (rotation) of the map, in degrees. `0` is north up */\n bearing?: number;\n /** Min zoom, default `0` */\n minZoom?: number;\n /** Max zoom, default `20` */\n maxZoom?: number;\n /** Min pitch, default `0` */\n minPitch?: number;\n /** Max pitch, default `60` */\n maxPitch?: number;\n /** Viewport center offsets from lng, lat in meters */\n position?: number[];\n /** The near plane position */\n nearZ?: number;\n /** The far plane position */\n farZ?: number;\n} & CommonViewState;\n\nexport type MapViewProps = {\n /** Whether to render multiple copies of the map at low zoom levels. Default `false`. */\n repeat?: boolean;\n /** Scaler for the near plane, 1 unit equals to the height of the viewport. Default to `0.1`. Overwrites the `near` parameter. */\n nearZMultiplier?: number;\n /** Scaler for the far plane, 1 unit equals to the distance from the camera to the top edge of the screen. Default to `1.01`. Overwrites the `far` parameter. */\n farZMultiplier?: number;\n /** Custom projection matrix */\n projectionMatrix?: NumericArray;\n /** Field of view covered by the camera, in the perspective case. In degrees. If not supplied, will be calculated from `altitude`. */\n fovy?: number;\n /** Distance of the camera relative to viewport height. Default `1.5`. */\n altitude?: number;\n /** Whether to create an orthographic or perspective projection matrix. Default is `false` (perspective projection). */\n orthographic?: boolean;\n} & CommonViewProps<MapViewState>;\n\nexport default class MapView extends View<MapViewState, MapViewProps> {\n static displayName = 'MapView';\n\n constructor(props: MapViewProps = {}) {\n super(props);\n }\n\n getViewportType() {\n return WebMercatorViewport;\n }\n\n get ControllerType() {\n return MapController;\n }\n}\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n/* eslint-disable no-invalid-this */\nimport {initializeResources, render, finalizeResources, RenderResources} from './commons';\n\nimport SceneView from '@arcgis/core/views/SceneView';\nimport type {DeckProps} from '@deck.gl/core';\nimport MapView from '../../core/src/views/map-view';\n\n// Web Mercator scale at zoom 0 for 256 px tiles; deck.gl uses 512 px tiles,\n// so the final zoom is shifted by -1.\nconst ARCGIS_WEB_MERCATOR_SCALE_AT_ZOOM_0 = 591657550.5;\nconst DECK_GROUND_MPP_AT_ZOOM_0 = 78271.484;\nconst METERS_PER_DEG_LAT = 111320;\nconst ARCGIS_DIAGONAL_FOV_RADIANS = (55 * Math.PI) / 180;\nconst ALTITUDE_BLEND_START_TILT = 65;\nconst ALTITUDE_BLEND_END_TILT = 80;\n\nfunction getDistanceMeters(a, b) {\n const midLatRad = (((a.latitude + b.latitude) / 2) * Math.PI) / 180;\n const dLatM = (a.latitude - b.latitude) * METERS_PER_DEG_LAT;\n const dLngM = (a.longitude - b.longitude) * METERS_PER_DEG_LAT * Math.cos(midLatRad);\n\n return Math.sqrt(dLatM * dLatM + dLngM * dLngM);\n}\n\nfunction getZoom(\n view: SceneView,\n longitude: number,\n latitude: number,\n width: number,\n height: number\n) {\n const focalPoint = view.toMap({x: width / 2, y: height / 2} as any);\n const focalPointRight = view.toMap({x: width / 2 + 1, y: height / 2} as any);\n\n if (focalPoint && focalPointRight) {\n const horizontalMetersPerPixel = getDistanceMeters(focalPoint, focalPointRight);\n\n if (horizontalMetersPerPixel > 0) {\n const latitudeRad = (latitude * Math.PI) / 180;\n return Math.log2(\n (DECK_GROUND_MPP_AT_ZOOM_0 * Math.cos(latitudeRad)) / horizontalMetersPerPixel\n );\n }\n }\n\n return Math.log2(ARCGIS_WEB_MERCATOR_SCALE_AT_ZOOM_0 / view.scale) - 1;\n}\n\nfunction smoothstep(edge0: number, edge1: number, value: number) {\n const t = Math.max(0, Math.min(1, (value - edge0) / (edge1 - edge0)));\n return t * t * (3 - 2 * t);\n}\n\nfunction getFovMatchedAltitude(width: number, height: number) {\n const aspect = width / height;\n const verticalTan = Math.tan(ARCGIS_DIAGONAL_FOV_RADIANS / 2) / Math.sqrt(1 + aspect * aspect);\n\n return 0.5 / verticalTan;\n}\n\nfunction getAltitude(tilt: number, slantAltitude: number, width: number, height: number) {\n const fovAltitude = getFovMatchedAltitude(width, height);\n const blend = smoothstep(ALTITUDE_BLEND_START_TILT, ALTITUDE_BLEND_END_TILT, tilt);\n\n return slantAltitude * (1 - blend) + fovAltitude * blend;\n}\n\nfunction getArcGISMatrixViewState(\n view: SceneView,\n longitude: number,\n latitude: number,\n zoom: number,\n resolution: number,\n altitude: number\n) {\n return {\n views: new MapView({id: 'arcgis-scene'}),\n viewState: {\n 'arcgis-scene': {\n id: 'arcgis-scene',\n longitude,\n latitude,\n zoom,\n pitch: view.camera.tilt,\n bearing: view.camera.heading,\n altitude,\n position: [0, 0, 0],\n resolution\n }\n }\n };\n}\n\nexport default function createDeckRenderer(DeckProps, RenderNode) {\n class DeckRenderer {\n view: SceneView;\n deck: any;\n resources: RenderResources | null = null;\n cancelInitialization: (() => void) | null = null;\n renderNode: any = null;\n\n constructor(viewOrProps: SceneView | ({view: SceneView} & DeckProps), props?: DeckProps) {\n if (viewOrProps && typeof viewOrProps === 'object' && 'view' in viewOrProps) {\n const {view, ...deckProps} = viewOrProps;\n this.view = view;\n this.deck = new DeckProps(deckProps);\n } else {\n this.view = viewOrProps;\n this.deck = new DeckProps(props);\n }\n\n let isInitializing = false;\n\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const self = this;\n const DeckRenderNode = RenderNode.createSubclass({\n consumes: {required: ['composite-color']},\n produces: 'composite-color',\n\n initialize() {},\n\n render(inputs: Array<{name: string}>) {\n // biome-ignore lint/complexity/noThisInStatic: RenderNode render is an instance method\n // eslint-disable-next-line @typescript-eslint/no-this-alias, consistent-this\n const renderNode: any = this;\n const passthrough = inputs.find(i => i.name === 'composite-color');\n\n if (!self.resources && !isInitializing) {\n const gl = renderNode.gl;\n if (gl) {\n isInitializing = true;\n let cancelled = false;\n self.cancelInitialization = () => {\n cancelled = true;\n };\n initializeResources\n .call(self, gl)\n .then(resources => {\n isInitializing = false;\n if (cancelled) {\n finalizeResources(resources);\n return;\n }\n self.deck.on('change', deckProps => resources.deck.setProps(deckProps));\n resources.deck.setProps(self.deck.toJSON());\n self.resources = resources;\n renderNode.requestRender();\n })\n .catch(err => {\n isInitializing = false;\n // eslint-disable-next-line no-console\n console.error('DeckRenderer: failed to initialize resources', err);\n });\n }\n return passthrough;\n }\n if (!self.resources) {\n return passthrough;\n }\n\n const output = renderNode.bindRenderTarget();\n const gl = renderNode.gl as WebGL2RenderingContext;\n\n const dpr = window.devicePixelRatio || 1;\n const width = gl.drawingBufferWidth / dpr;\n const height = gl.drawingBufferHeight / dpr;\n\n // Keep deck.gl's SceneView approximation anchored at the ArcGIS\n // focal point every frame. Zoom comes from the actual horizontal\n // ground meters-per-pixel at screen center (`toMap(center)` and\n // `toMap(center + 1px)`), which stays stable under tilt in local\n // SceneView. We keep the older `view.scale` formula only as a\n // fallback when focal-point sampling is unavailable.\n //\n // deck.gl's `altitude` still couples camera distance and FOV, while\n // ArcGIS keeps them separate. We therefore compute a slant-distance\n // altitude from the live camera position and focal point, then only\n // at high tilt blend toward the ArcGIS fixed-FOV altitude. That\n // preserves the better mid-tilt camera match while reducing the\n // remaining extreme-angle drift.\n const cameraPos = self.view.camera.position;\n const focalPoint = self.view.toMap({x: width / 2, y: height / 2} as any);\n const latitude = focalPoint ? focalPoint.latitude : self.view.center.latitude;\n const longitude = focalPoint ? focalPoint.longitude : self.view.center.longitude;\n\n const midLatRad = (((latitude + cameraPos.latitude) / 2) * Math.PI) / 180;\n const dLatM = (cameraPos.latitude - latitude) * METERS_PER_DEG_LAT;\n const dLngM =\n (cameraPos.longitude - longitude) * METERS_PER_DEG_LAT * Math.cos(midLatRad);\n const horizM = Math.sqrt(dLatM * dLatM + dLngM * dLngM);\n const slantM = Math.sqrt(horizM * horizM + cameraPos.z * cameraPos.z);\n\n const zoom = getZoom(self.view, longitude, latitude, width, height);\n\n const viewportHeightM = height * self.view.resolution;\n const slantAltitude = slantM / viewportHeightM;\n const altitude = getAltitude(self.view.camera.tilt, slantAltitude, width, height);\n const arcgisMatrixView = getArcGISMatrixViewState(\n self.view,\n longitude,\n latitude,\n zoom,\n self.view.resolution,\n altitude\n );\n\n try {\n if (arcgisMatrixView) {\n render(self.resources, {\n width,\n height,\n latitude,\n longitude,\n altitude,\n zoom,\n bearing: self.view.camera.heading,\n pitch: self.view.camera.tilt,\n ...arcgisMatrixView\n });\n } else {\n render(self.resources, {\n width,\n height,\n latitude,\n longitude,\n altitude,\n zoom,\n bearing: self.view.camera.heading,\n pitch: self.view.camera.tilt\n });\n }\n } catch (e) {\n // eslint-disable-next-line no-console\n console.error('DeckRenderer: render error', e);\n }\n\n return output;\n }\n });\n\n this.renderNode = new DeckRenderNode({view: this.view});\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n async setup(_context?: unknown) {}\n\n dispose() {\n this.cancelInitialization?.();\n if (this.resources) {\n finalizeResources(this.resources);\n this.resources = null;\n }\n this.renderNode = null;\n }\n\n redraw() {\n this.renderNode?.requestRender();\n }\n\n render() {\n this.renderNode?.requestRender();\n }\n }\n\n return DeckRenderer;\n}\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport createDeckProps from './deck-props';\nimport createDeckLayer from './deck-layer';\nimport createDeckLayerView2D from './deck-layer-view-2d';\nimport createDeckRenderer from './deck-renderer';\nimport {loadModules as esriLoaderLoadModules, ILoadScriptOptions} from 'esri-loader';\n\ntype LoadedModules = {\n DeckLayer: any;\n DeckRenderer: any;\n modules?: unknown[];\n};\n\nlet arcGIS: LoadedModules;\n\nexport async function loadArcGISModules(\n modules: string[],\n loadScriptOptions: ILoadScriptOptions\n): Promise<LoadedModules> {\n const namespace = Array.isArray(modules) ? null : modules;\n await loadArcGISModule(namespace, loadScriptOptions);\n\n if (Array.isArray(modules)) {\n return esriLoaderLoadModules(modules, loadScriptOptions).then(array => {\n return {...arcGIS, modules: array};\n });\n }\n return arcGIS;\n}\n\nasync function loadArcGISModule(\n esri,\n loadScriptOptions: ILoadScriptOptions\n): Promise<LoadedModules> {\n if (arcGIS) {\n // Already loaded\n return arcGIS;\n }\n if (esri) {\n // Using user-provided dependencies\n // Right now this object has to be manually assembled - let @arcgis/webpack-plugin handle this?\n const Layer = esri.layers.Layer;\n const Accessor = esri.core.Accessor;\n const BaseLayerViewGL2D = esri.views['2d'].layers.BaseLayerViewGL2D;\n const RenderNode = esri.views['3d'].webgl.RenderNode;\n\n return initialize(Layer, Accessor, BaseLayerViewGL2D, RenderNode);\n }\n\n const [Layer, Accessor, BaseLayerViewGL2D, RenderNode] = await esriLoaderLoadModules(\n [\n 'esri/layers/Layer',\n 'esri/core/Accessor',\n 'esri/views/2d/layers/BaseLayerViewGL2D',\n 'esri/views/3d/webgl/RenderNode'\n ],\n loadScriptOptions\n );\n return initialize(Layer, Accessor, BaseLayerViewGL2D, RenderNode);\n}\n\nfunction initialize(Layer, Accessor, BaseLayerViewGL2D, RenderNode): LoadedModules {\n const DeckProps = createDeckProps(Accessor);\n const DeckLayerView2D = createDeckLayerView2D(BaseLayerViewGL2D);\n const DeckLayer = createDeckLayer(DeckProps, Layer, DeckLayerView2D);\n const DeckRenderer = createDeckRenderer(DeckProps, RenderNode);\n\n arcGIS = {DeckLayer, DeckRenderer};\n return arcGIS;\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["Accessor", "DeckProps", "DeckProps", "Layer", "DeckLayerView2D", "BaseLayerViewGL2D", "import_core", "import_core", "import_web_mercator", "import_core", "import_core", "import_core", "import_core", "import_core", "import_web_mercator", "import_core", "DEGREES_TO_RADIANS", "getDistanceScales", "unitsPerMeter", "import_web_mercator", "lngLatToWorld", "y", "_lngLatToWorld", "DeckProps", "RenderNode", "DeckRenderer", "gl", "esriLoaderLoadModules", "Layer", "Accessor", "BaseLayerViewGL2D", "RenderNode", "DeckProps", "DeckLayerView2D", "DeckLayer", "DeckRenderer", "Accessor", "BaseLayerViewGL2D", "Layer", "RenderNode"]
7
7
  }