@luma.gl/engine 9.2.4 → 9.2.5

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/animation/timeline.ts", "../src/animation/key-frames.ts", "../src/animation-loop/animation-loop-template.ts", "../src/animation-loop/animation-loop.ts", "../src/animation-loop/request-animation-frame.ts", "../src/animation-loop/make-animation-loop.ts", "../src/model/model.ts", "../src/geometry/gpu-geometry.ts", "../src/utils/uid.ts", "../src/factories/pipeline-factory.ts", "../src/factories/shader-factory.ts", "../src/debug/debug-shader-layout.ts", "../src/debug/debug-framebuffer.ts", "../src/utils/deep-equal.ts", "../src/utils/buffer-layout-helper.ts", "../src/utils/buffer-layout-order.ts", "../src/shader-inputs.ts", "../src/model/split-uniforms-and-bindings.ts", "../src/async-texture/async-texture.ts", "../src/application-utils/load-file.ts", "../src/compute/buffer-transform.ts", "../src/compute/texture-transform.ts", "../src/geometry/geometry.ts", "../src/models/clip-space.ts", "../src/models/billboard-texture-model.ts", "../src/scenegraph/scenegraph-node.ts", "../src/scenegraph/group-node.ts", "../src/scenegraph/model-node.ts", "../src/geometries/truncated-cone-geometry.ts", "../src/geometries/cone-geometry.ts", "../src/geometries/cube-geometry.ts", "../src/geometries/cylinder-geometry.ts", "../src/geometries/ico-sphere-geometry.ts", "../src/geometry/geometry-utils.ts", "../src/geometries/plane-geometry.ts", "../src/geometries/sphere-geometry.ts", "../src/application-utils/random.ts", "../src/passes/shader-pass-renderer.ts", "../src/compute/swap.ts", "../src/passes/get-fragment-shader.ts", "../src/compute/computation.ts", "../src/modules/picking/picking-uniforms.ts", "../src/modules/picking/picking-manager.ts", "../src/modules/picking/index-picking.ts", "../src/modules/picking/color-picking.ts", "../src/modules/picking/legacy-picking-manager.ts"],
4
- "sourcesContent": ["// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n// luma.gl Engine API\n\n// Animation\nexport {Timeline} from './animation/timeline';\nexport {KeyFrames} from './animation/key-frames';\nexport type {AnimationProps} from './animation-loop/animation-props';\n\nexport {AnimationLoopTemplate} from './animation-loop/animation-loop-template';\n\nexport type {AnimationLoopProps} from './animation-loop/animation-loop';\nexport {AnimationLoop} from './animation-loop/animation-loop';\n\nexport type {MakeAnimationLoopProps} from './animation-loop/make-animation-loop';\nexport {makeAnimationLoop} from './animation-loop/make-animation-loop';\n\nexport type {ModelProps} from './model/model';\nexport {Model} from './model/model';\n\n// Transforms\nexport type {BufferTransformProps} from './compute/buffer-transform';\nexport {BufferTransform} from './compute/buffer-transform';\nexport type {TextureTransformProps} from './compute/texture-transform';\nexport {TextureTransform} from './compute/texture-transform';\n\nexport {PipelineFactory} from './factories/pipeline-factory';\nexport {ShaderFactory} from './factories/shader-factory';\n\n// Models\nexport type {ClipSpaceProps} from './models/clip-space';\nexport {ClipSpace} from './models/clip-space';\nexport type {BackgroundTextureModelProps} from './models/billboard-texture-model';\nexport {BackgroundTextureModel} from './models/billboard-texture-model';\n\n// Scenegraph Core nodes\nexport {ScenegraphNode} from './scenegraph/scenegraph-node';\nexport {GroupNode} from './scenegraph/group-node';\nexport type {ModelNodeProps} from './scenegraph/model-node';\nexport {ModelNode} from './scenegraph/model-node';\n\n// Geometries\nexport type {GeometryProps, GeometryAttribute} from './geometry/geometry';\nexport {Geometry} from './geometry/geometry';\nexport type {GPUGeometryProps} from './geometry/gpu-geometry';\nexport {GPUGeometry} from './geometry/gpu-geometry';\n\n// Primitives\nexport type {ConeGeometryProps} from './geometries/cone-geometry';\nexport {ConeGeometry} from './geometries/cone-geometry';\nexport type {CubeGeometryProps} from './geometries/cube-geometry';\nexport {CubeGeometry} from './geometries/cube-geometry';\nexport type {CylinderGeometryProps} from './geometries/cylinder-geometry';\nexport {CylinderGeometry} from './geometries/cylinder-geometry';\nexport type {IcoSphereGeometryProps} from './geometries/ico-sphere-geometry';\nexport {IcoSphereGeometry} from './geometries/ico-sphere-geometry';\nexport type {PlaneGeometryProps} from './geometries/plane-geometry';\nexport {PlaneGeometry} from './geometries/plane-geometry';\nexport type {SphereGeometryProps} from './geometries/sphere-geometry';\nexport {SphereGeometry} from './geometries/sphere-geometry';\nexport type {TruncatedConeGeometryProps} from './geometries/truncated-cone-geometry';\nexport {TruncatedConeGeometry} from './geometries/truncated-cone-geometry';\n\nexport {ShaderInputs} from './shader-inputs';\n\n// Application Utilities\nexport {makeRandomGenerator} from './application-utils/random';\nexport {setPathPrefix, loadImage, loadImageBitmap} from './application-utils/load-file';\n\n// EXPERIMENTAL\nexport type {ShaderPassRendererProps} from './passes/shader-pass-renderer';\nexport {ShaderPassRenderer} from './passes/shader-pass-renderer';\n\nexport {Swap} from './compute/swap';\nexport {SwapBuffers} from './compute/swap';\nexport {SwapFramebuffers} from './compute/swap';\n\nexport type {ComputationProps} from './compute/computation';\nexport {Computation} from './compute/computation';\n\nexport type {\n TextureCubeFace,\n TextureImageData,\n TextureData,\n Texture1DData,\n Texture2DData,\n Texture3DData,\n TextureCubeData,\n TextureArrayData,\n TextureCubeArrayData\n} from './async-texture/async-texture';\n\nexport type {AsyncTextureProps} from './async-texture/async-texture';\nexport {AsyncTexture} from './async-texture/async-texture';\n\nexport {PickingManager} from './modules/picking/picking-manager';\nexport {picking as indexPicking} from './modules/picking/index-picking';\nexport {picking as colorPicking} from './modules/picking/color-picking';\n\nexport {\n requestAnimationFramePolyfill,\n cancelAnimationFramePolyfill\n} from './animation-loop/request-animation-frame';\n\n// DEPRECATED\n\nexport {LegacyPickingManager} from './modules/picking/legacy-picking-manager';\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n/**\n * Timeline channel properties\n * @param delay = 0;\n * @param duration = Number.POSITIVE_INFINITY;\n * @param rate = 1\n * @param repeat = 1\n */\nexport type ChannelOptions = {\n delay?: number;\n duration?: number;\n rate?: number;\n repeat?: number;\n};\n\nexport type AnimationOptions = {\n setTime: (time: number) => void;\n};\n\ntype Channel = {\n time: number;\n delay: number;\n duration: number;\n rate: number;\n repeat: number;\n};\n\ntype Animation = {\n channel?: number;\n animation: {\n setTime: (time: number) => void;\n };\n};\n\nlet channelHandles = 1;\nlet animationHandles = 1;\n\nexport class Timeline {\n time: number = 0;\n channels = new Map<number, Channel>();\n animations = new Map<number, Animation>();\n playing: boolean = false;\n lastEngineTime: number = -1;\n\n constructor() {}\n\n addChannel(props: ChannelOptions): number {\n const {delay = 0, duration = Number.POSITIVE_INFINITY, rate = 1, repeat = 1} = props;\n\n const channelId = channelHandles++;\n const channel: Channel = {\n time: 0,\n delay,\n duration,\n rate,\n repeat\n };\n this._setChannelTime(channel, this.time);\n this.channels.set(channelId, channel);\n\n return channelId;\n }\n\n removeChannel(channelId: number): void {\n this.channels.delete(channelId);\n\n for (const [animationHandle, animation] of this.animations) {\n if (animation.channel === channelId) {\n this.detachAnimation(animationHandle);\n }\n }\n }\n\n isFinished(channelId: number): boolean {\n const channel = this.channels.get(channelId);\n if (channel === undefined) {\n return false;\n }\n\n return this.time >= channel.delay + channel.duration * channel.repeat;\n }\n\n getTime(channelId?: number): number {\n if (channelId === undefined) {\n return this.time;\n }\n\n const channel = this.channels.get(channelId);\n\n if (channel === undefined) {\n return -1;\n }\n\n return channel.time;\n }\n\n setTime(time: number): void {\n this.time = Math.max(0, time);\n\n const channels = this.channels.values();\n for (const channel of channels) {\n this._setChannelTime(channel, this.time);\n }\n\n const animations = this.animations.values();\n for (const animationData of animations) {\n const {animation, channel} = animationData;\n animation.setTime(this.getTime(channel));\n }\n }\n\n play(): void {\n this.playing = true;\n }\n\n pause(): void {\n this.playing = false;\n this.lastEngineTime = -1;\n }\n\n reset(): void {\n this.setTime(0);\n }\n\n attachAnimation(animation: AnimationOptions, channelHandle?: number): number {\n const animationHandle = animationHandles++;\n\n this.animations.set(animationHandle, {\n animation,\n channel: channelHandle\n });\n\n animation.setTime(this.getTime(channelHandle));\n\n return animationHandle;\n }\n\n detachAnimation(channelId: number): void {\n this.animations.delete(channelId);\n }\n\n update(engineTime: number): void {\n if (this.playing) {\n if (this.lastEngineTime === -1) {\n this.lastEngineTime = engineTime;\n }\n this.setTime(this.time + (engineTime - this.lastEngineTime));\n this.lastEngineTime = engineTime;\n }\n }\n\n _setChannelTime(channel: Channel, time: number): void {\n const offsetTime = time - channel.delay;\n const totalDuration = channel.duration * channel.repeat;\n // Note(Tarek): Don't loop on final repeat.\n if (offsetTime >= totalDuration) {\n channel.time = channel.duration * channel.rate;\n } else {\n channel.time = Math.max(0, offsetTime) % channel.duration;\n channel.time *= channel.rate;\n }\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n// keyframes\nexport type KeyFrame<T> = [number, T];\n\n/** Holds a list of key frames (timestamped values) */\nexport class KeyFrames<T = number> {\n startIndex: number = -1;\n endIndex: number = -1;\n factor: number = 0;\n times: number[] = [];\n values: T[] = [];\n private _lastTime = -1;\n\n constructor(keyFrames: KeyFrame<T>[]) {\n this.setKeyFrames(keyFrames);\n this.setTime(0);\n }\n\n setKeyFrames(keyFrames: KeyFrame<T>[]): void {\n const numKeys = keyFrames.length;\n this.times.length = numKeys;\n this.values.length = numKeys;\n\n for (let i = 0; i < numKeys; ++i) {\n this.times[i] = keyFrames[i][0];\n this.values[i] = keyFrames[i][1];\n }\n\n this._calculateKeys(this._lastTime);\n }\n\n setTime(time: number): void {\n time = Math.max(0, time);\n\n if (time !== this._lastTime) {\n this._calculateKeys(time);\n this._lastTime = time;\n }\n }\n\n getStartTime(): number {\n return this.times[this.startIndex];\n }\n\n getEndTime(): number {\n return this.times[this.endIndex];\n }\n\n getStartData(): T {\n return this.values[this.startIndex];\n }\n\n getEndData(): T {\n return this.values[this.endIndex];\n }\n\n _calculateKeys(time: number): void {\n let index = 0;\n const numKeys = this.times.length;\n\n for (index = 0; index < numKeys - 2; ++index) {\n if (this.times[index + 1] > time) {\n break;\n }\n }\n\n this.startIndex = index;\n this.endIndex = index + 1;\n\n const startTime = this.times[this.startIndex];\n const endTime = this.times[this.endIndex];\n this.factor = Math.min(Math.max(0, (time - startTime) / (endTime - startTime)), 1);\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {AnimationProps} from './animation-props';\n\n/**\n * Minimal class that represents a \"componentized\" rendering life cycle\n * (resource construction, repeated rendering, resource destruction)\n *\n * @note A motivation for this class compared to the raw animation loop is\n * that it simplifies TypeScript code by allowing resources to be typed unconditionally\n * since they are allocated in the constructor rather than in onInitialized\n *\n * @note Introduced in luma.gl v9\n *\n * @example AnimationLoopTemplate is intended to be subclassed,\n * but the subclass should not be instantiated directly. Instead the subclass\n * (i.e. the constructor of the subclass) should be used\n * as an argument to create an AnimationLoop.\n */\nexport abstract class AnimationLoopTemplate {\n constructor(animationProps?: AnimationProps) {}\n async onInitialize(animationProps: AnimationProps): Promise<unknown> {\n return null;\n }\n abstract onRender(animationProps: AnimationProps): unknown;\n abstract onFinalize(animationProps: AnimationProps): void;\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {luma, Device} from '@luma.gl/core';\nimport {\n requestAnimationFramePolyfill,\n cancelAnimationFramePolyfill\n} from './request-animation-frame';\nimport {Timeline} from '../animation/timeline';\nimport {AnimationProps} from './animation-props';\nimport {Stats, Stat} from '@probe.gl/stats';\n\nlet statIdCounter = 0;\n\n/** AnimationLoop properties */\nexport type AnimationLoopProps = {\n device: Device | Promise<Device>;\n\n onAddHTML?: (div: HTMLDivElement) => string; // innerHTML\n onInitialize?: (animationProps: AnimationProps) => Promise<unknown>;\n onRender?: (animationProps: AnimationProps) => unknown;\n onFinalize?: (animationProps: AnimationProps) => void;\n onError?: (reason: Error) => void;\n\n stats?: Stats;\n\n // view parameters - TODO move to CanvasContext?\n autoResizeViewport?: boolean;\n};\n\nexport type MutableAnimationLoopProps = {\n // view parameters\n autoResizeViewport?: boolean;\n};\n\n/** Convenient animation loop */\nexport class AnimationLoop {\n static defaultAnimationLoopProps = {\n device: null!,\n\n onAddHTML: () => '',\n onInitialize: async () => null,\n onRender: () => {},\n onFinalize: () => {},\n onError: error => console.error(error), // eslint-disable-line no-console\n\n stats: luma.stats.get(`animation-loop-${statIdCounter++}`),\n\n // view parameters\n autoResizeViewport: false\n } as const satisfies Readonly<Required<AnimationLoopProps>>;\n\n device: Device | null = null;\n canvas: HTMLCanvasElement | OffscreenCanvas | null = null;\n\n props: Required<AnimationLoopProps>;\n animationProps: AnimationProps | null = null;\n timeline: Timeline | null = null;\n stats: Stats;\n cpuTime: Stat;\n gpuTime: Stat;\n frameRate: Stat;\n\n display: any;\n\n needsRedraw: string | false = 'initialized';\n\n _initialized: boolean = false;\n _running: boolean = false;\n _animationFrameId: any = null;\n _nextFramePromise: Promise<AnimationLoop> | null = null;\n _resolveNextFrame: ((animationLoop: AnimationLoop) => void) | null = null;\n _cpuStartTime: number = 0;\n _error: Error | null = null;\n\n // _gpuTimeQuery: Query | null = null;\n\n /*\n * @param {HTMLCanvasElement} canvas - if provided, width and height will be passed to context\n */\n constructor(props: AnimationLoopProps) {\n this.props = {...AnimationLoop.defaultAnimationLoopProps, ...props};\n props = this.props;\n\n if (!props.device) {\n throw new Error('No device provided');\n }\n\n // state\n this.stats = props.stats || new Stats({id: 'animation-loop-stats'});\n this.cpuTime = this.stats.get('CPU Time');\n this.gpuTime = this.stats.get('GPU Time');\n this.frameRate = this.stats.get('Frame Rate');\n\n this.setProps({autoResizeViewport: props.autoResizeViewport});\n\n // Bind methods\n this.start = this.start.bind(this);\n this.stop = this.stop.bind(this);\n\n this._onMousemove = this._onMousemove.bind(this);\n this._onMouseleave = this._onMouseleave.bind(this);\n }\n\n destroy(): void {\n this.stop();\n this._setDisplay(null);\n }\n\n /** @deprecated Use .destroy() */\n delete(): void {\n this.destroy();\n }\n\n reportError(error: Error): void {\n this.props.onError(error);\n this._error = error;\n }\n\n /** Flags this animation loop as needing redraw */\n setNeedsRedraw(reason: string): this {\n this.needsRedraw = this.needsRedraw || reason;\n return this;\n }\n\n setProps(props: MutableAnimationLoopProps): this {\n if ('autoResizeViewport' in props) {\n this.props.autoResizeViewport = props.autoResizeViewport || false;\n }\n return this;\n }\n\n /** Starts a render loop if not already running */\n async start() {\n if (this._running) {\n return this;\n }\n this._running = true;\n\n try {\n let appContext;\n if (!this._initialized) {\n this._initialized = true;\n // Create the WebGL context\n await this._initDevice();\n this._initialize();\n\n // Note: onIntialize can return a promise (e.g. in case app needs to load resources)\n await this.props.onInitialize(this._getAnimationProps());\n }\n\n // check that we haven't been stopped\n if (!this._running) {\n return null;\n }\n\n // Start the loop\n if (appContext !== false) {\n // cancel any pending renders to ensure only one loop can ever run\n this._cancelAnimationFrame();\n this._requestAnimationFrame();\n }\n\n return this;\n } catch (err: unknown) {\n const error = err instanceof Error ? err : new Error('Unknown error');\n this.props.onError(error);\n // this._running = false; // TODO\n throw error;\n }\n }\n\n /** Stops a render loop if already running, finalizing */\n stop() {\n // console.debug(`Stopping ${this.constructor.name}`);\n if (this._running) {\n // call callback\n // If stop is called immediately, we can end up in a state where props haven't been initialized...\n if (this.animationProps && !this._error) {\n this.props.onFinalize(this.animationProps);\n }\n\n this._cancelAnimationFrame();\n this._nextFramePromise = null;\n this._resolveNextFrame = null;\n this._running = false;\n }\n return this;\n }\n\n /** Explicitly draw a frame */\n redraw(): this {\n if (this.device?.isLost || this._error) {\n return this;\n }\n\n this._beginFrameTimers();\n\n this._setupFrame();\n this._updateAnimationProps();\n\n this._renderFrame(this._getAnimationProps());\n\n // clear needsRedraw flag\n this._clearNeedsRedraw();\n\n if (this._resolveNextFrame) {\n this._resolveNextFrame(this);\n this._nextFramePromise = null;\n this._resolveNextFrame = null;\n }\n\n this._endFrameTimers();\n\n return this;\n }\n\n /** Add a timeline, it will be automatically updated by the animation loop. */\n attachTimeline(timeline: Timeline): Timeline {\n this.timeline = timeline;\n return this.timeline;\n }\n\n /** Remove a timeline */\n detachTimeline(): void {\n this.timeline = null;\n }\n\n /** Wait until a render completes */\n waitForRender(): Promise<AnimationLoop> {\n this.setNeedsRedraw('waitForRender');\n\n if (!this._nextFramePromise) {\n this._nextFramePromise = new Promise(resolve => {\n this._resolveNextFrame = resolve;\n });\n }\n return this._nextFramePromise;\n }\n\n /** TODO - should use device.deviceContext */\n async toDataURL(): Promise<string> {\n this.setNeedsRedraw('toDataURL');\n await this.waitForRender();\n if (this.canvas instanceof HTMLCanvasElement) {\n return this.canvas.toDataURL();\n }\n throw new Error('OffscreenCanvas');\n }\n\n // PRIVATE METHODS\n\n _initialize(): void {\n this._startEventHandling();\n\n // Initialize the callback data\n this._initializeAnimationProps();\n this._updateAnimationProps();\n\n // Default viewport setup, in case onInitialize wants to render\n this._resizeViewport();\n\n // this._gpuTimeQuery = Query.isSupported(this.gl, ['timers']) ? new Query(this.gl) : null;\n }\n\n _setDisplay(display: any): void {\n if (this.display) {\n this.display.destroy();\n this.display.animationLoop = null;\n }\n\n // store animation loop on the display\n if (display) {\n display.animationLoop = this;\n }\n\n this.display = display;\n }\n\n _requestAnimationFrame(): void {\n if (!this._running) {\n return;\n }\n\n // VR display has a separate animation frame to sync with headset\n // TODO WebVR API discontinued, replaced by WebXR: https://immersive-web.github.io/webxr/\n // See https://developer.mozilla.org/en-US/docs/Web/API/VRDisplay/requestAnimationFrame\n // if (this.display && this.display.requestAnimationFrame) {\n // this._animationFrameId = this.display.requestAnimationFrame(this._animationFrame.bind(this));\n // }\n this._animationFrameId = requestAnimationFramePolyfill(this._animationFrame.bind(this));\n }\n\n _cancelAnimationFrame(): void {\n if (this._animationFrameId === null) {\n return;\n }\n\n // VR display has a separate animation frame to sync with headset\n // TODO WebVR API discontinued, replaced by WebXR: https://immersive-web.github.io/webxr/\n // See https://developer.mozilla.org/en-US/docs/Web/API/VRDisplay/requestAnimationFrame\n // if (this.display && this.display.cancelAnimationFramePolyfill) {\n // this.display.cancelAnimationFrame(this._animationFrameId);\n // }\n cancelAnimationFramePolyfill(this._animationFrameId);\n this._animationFrameId = null;\n }\n\n _animationFrame(): void {\n if (!this._running) {\n return;\n }\n this.redraw();\n this._requestAnimationFrame();\n }\n\n // Called on each frame, can be overridden to call onRender multiple times\n // to support e.g. stereoscopic rendering\n _renderFrame(animationProps: AnimationProps): void {\n // Allow e.g. VR display to render multiple frames.\n if (this.display) {\n this.display._renderFrame(animationProps);\n return;\n }\n\n // call callback\n this.props.onRender(this._getAnimationProps());\n // end callback\n\n // Submit commands (necessary on WebGPU)\n this.device?.submit();\n }\n\n _clearNeedsRedraw(): void {\n this.needsRedraw = false;\n }\n\n _setupFrame(): void {\n this._resizeViewport();\n }\n\n // Initialize the object that will be passed to app callbacks\n _initializeAnimationProps(): void {\n const canvasContext = this.device?.getDefaultCanvasContext();\n if (!this.device || !canvasContext) {\n throw new Error('loop');\n }\n\n const canvas = canvasContext?.canvas;\n const useDevicePixels = canvasContext.props.useDevicePixels;\n\n this.animationProps = {\n animationLoop: this,\n\n device: this.device,\n canvasContext,\n canvas,\n // @ts-expect-error Deprecated\n useDevicePixels,\n\n timeline: this.timeline,\n\n needsRedraw: false,\n\n // Placeholders\n width: 1,\n height: 1,\n aspect: 1,\n\n // Animation props\n time: 0,\n startTime: Date.now(),\n engineTime: 0,\n tick: 0,\n tock: 0,\n\n // Experimental\n _mousePosition: null // Event props\n };\n }\n\n _getAnimationProps(): AnimationProps {\n if (!this.animationProps) {\n throw new Error('animationProps');\n }\n return this.animationProps;\n }\n\n // Update the context object that will be passed to app callbacks\n _updateAnimationProps(): void {\n if (!this.animationProps) {\n return;\n }\n\n // Can this be replaced with canvas context?\n const {width, height, aspect} = this._getSizeAndAspect();\n if (width !== this.animationProps.width || height !== this.animationProps.height) {\n this.setNeedsRedraw('drawing buffer resized');\n }\n if (aspect !== this.animationProps.aspect) {\n this.setNeedsRedraw('drawing buffer aspect changed');\n }\n\n this.animationProps.width = width;\n this.animationProps.height = height;\n this.animationProps.aspect = aspect;\n\n this.animationProps.needsRedraw = this.needsRedraw;\n\n // Update time properties\n this.animationProps.engineTime = Date.now() - this.animationProps.startTime;\n\n if (this.timeline) {\n this.timeline.update(this.animationProps.engineTime);\n }\n\n this.animationProps.tick = Math.floor((this.animationProps.time / 1000) * 60);\n this.animationProps.tock++;\n\n // For back compatibility\n this.animationProps.time = this.timeline\n ? this.timeline.getTime()\n : this.animationProps.engineTime;\n }\n\n /** Wait for supplied device */\n async _initDevice() {\n this.device = await this.props.device;\n if (!this.device) {\n throw new Error('No device provided');\n }\n this.canvas = this.device.getDefaultCanvasContext().canvas || null;\n // this._createInfoDiv();\n }\n\n _createInfoDiv(): void {\n if (this.canvas && this.props.onAddHTML) {\n const wrapperDiv = document.createElement('div');\n document.body.appendChild(wrapperDiv);\n wrapperDiv.style.position = 'relative';\n const div = document.createElement('div');\n div.style.position = 'absolute';\n div.style.left = '10px';\n div.style.bottom = '10px';\n div.style.width = '300px';\n div.style.background = 'white';\n if (this.canvas instanceof HTMLCanvasElement) {\n wrapperDiv.appendChild(this.canvas);\n }\n wrapperDiv.appendChild(div);\n const html = this.props.onAddHTML(div);\n if (html) {\n div.innerHTML = html;\n }\n }\n }\n\n _getSizeAndAspect(): {width: number; height: number; aspect: number} {\n if (!this.device) {\n return {width: 1, height: 1, aspect: 1};\n }\n // https://webglfundamentals.org/webgl/lessons/webgl-resizing-the-canvas.html\n const [width, height] = this.device?.getDefaultCanvasContext().getDevicePixelSize() || [1, 1];\n\n // https://webglfundamentals.org/webgl/lessons/webgl-anti-patterns.html\n let aspect = 1;\n const canvas = this.device?.getDefaultCanvasContext().canvas;\n\n // @ts-expect-error\n if (canvas && canvas.clientHeight) {\n // @ts-expect-error\n aspect = canvas.clientWidth / canvas.clientHeight;\n } else if (width > 0 && height > 0) {\n aspect = width / height;\n }\n\n return {width, height, aspect};\n }\n\n /** @deprecated Default viewport setup */\n _resizeViewport(): void {\n // TODO can we use canvas context to code this in a portable way?\n // @ts-expect-error Expose on canvasContext\n if (this.props.autoResizeViewport && this.device.gl) {\n // @ts-expect-error Expose canvasContext\n this.device.gl.viewport(\n 0,\n 0,\n // @ts-expect-error Expose canvasContext\n this.device.gl.drawingBufferWidth,\n // @ts-expect-error Expose canvasContext\n this.device.gl.drawingBufferHeight\n );\n }\n }\n\n _beginFrameTimers() {\n this.frameRate.timeEnd();\n this.frameRate.timeStart();\n\n // Check if timer for last frame has completed.\n // GPU timer results are never available in the same\n // frame they are captured.\n // if (\n // this._gpuTimeQuery &&\n // this._gpuTimeQuery.isResultAvailable() &&\n // !this._gpuTimeQuery.isTimerDisjoint()\n // ) {\n // this.stats.get('GPU Time').addTime(this._gpuTimeQuery.getTimerMilliseconds());\n // }\n\n // if (this._gpuTimeQuery) {\n // // GPU time query start\n // this._gpuTimeQuery.beginTimeElapsedQuery();\n // }\n\n this.cpuTime.timeStart();\n }\n\n _endFrameTimers() {\n this.cpuTime.timeEnd();\n\n // if (this._gpuTimeQuery) {\n // // GPU time query end. Results will be available on next frame.\n // this._gpuTimeQuery.end();\n // }\n }\n\n // Event handling\n\n _startEventHandling() {\n if (this.canvas) {\n this.canvas.addEventListener('mousemove', this._onMousemove.bind(this));\n this.canvas.addEventListener('mouseleave', this._onMouseleave.bind(this));\n }\n }\n\n _onMousemove(event: Event) {\n if (event instanceof MouseEvent) {\n this._getAnimationProps()._mousePosition = [event.offsetX, event.offsetY];\n }\n }\n\n _onMouseleave(event: Event) {\n this._getAnimationProps()._mousePosition = null;\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n/* global window, setTimeout, clearTimeout */\n\n/** Node.js polyfill for requestAnimationFrame */\n// / <reference types=\"@types/node\" />\nexport function requestAnimationFramePolyfill(callback: (time?: any) => void): any {\n return typeof window !== 'undefined' && window.requestAnimationFrame\n ? window.requestAnimationFrame(callback)\n : setTimeout(callback, 1000 / 60);\n}\n\n/** Node.js polyfill for cancelAnimationFrame */\nexport function cancelAnimationFramePolyfill(timerId: any): void {\n return typeof window !== 'undefined' && window.cancelAnimationFrame\n ? window.cancelAnimationFrame(timerId)\n : clearTimeout(timerId);\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {luma, Adapter, Device} from '@luma.gl/core';\nimport {AnimationLoopTemplate} from './animation-loop-template';\nimport {AnimationLoop, AnimationLoopProps} from './animation-loop';\nimport type {AnimationProps} from './animation-props';\n\nexport type MakeAnimationLoopProps = Omit<\n AnimationLoopProps,\n 'onCreateDevice' | 'onInitialize' | 'onRedraw' | 'onFinalize'\n> & {\n /** List of adapters to use when creating the device */\n adapters?: Adapter[];\n};\n\n/**\n * Instantiates an animation loop and initializes it with the template.\n * @note The application needs to call `start()` on the returned animation loop to start the rendering loop.\n */\nexport function makeAnimationLoop(\n AnimationLoopTemplateCtor: typeof AnimationLoopTemplate,\n props?: MakeAnimationLoopProps\n): AnimationLoop {\n let renderLoop: AnimationLoopTemplate | null = null;\n\n const device =\n props?.device ||\n luma.createDevice({id: 'animation-loop', adapters: props?.adapters, createCanvasContext: true});\n\n // Create an animation loop;\n const animationLoop = new AnimationLoop({\n ...props,\n\n device,\n\n async onInitialize(animationProps: AnimationProps): Promise<unknown> {\n clearError(animationProps.animationLoop.device!);\n try {\n // @ts-expect-error abstract to prevent instantiation\n renderLoop = new AnimationLoopTemplateCtor(animationProps);\n // Any async loading can be handled here\n return await renderLoop?.onInitialize(animationProps);\n } catch (error) {\n setError(animationProps.animationLoop.device!, error as Error);\n return null;\n }\n },\n\n onRender: (animationProps: AnimationProps) => renderLoop?.onRender(animationProps),\n\n onFinalize: (animationProps: AnimationProps) => renderLoop?.onFinalize(animationProps)\n });\n\n // @ts-expect-error Hack: adds info for the website to find\n animationLoop.getInfo = () => {\n // @ts-ignore\n // eslint-disable-next-line no-invalid-this\n return this.AnimationLoopTemplateCtor.info;\n };\n\n return animationLoop;\n}\n\nfunction setError(device: Device, error: Error): void {\n const canvas = device?.getDefaultCanvasContext().canvas;\n if (canvas instanceof HTMLCanvasElement) {\n canvas.style.overflow = 'visible';\n let errorDiv = document.getElementById('animation-loop-error');\n errorDiv?.remove();\n errorDiv = document.createElement('h1');\n errorDiv.id = 'animation-loop-error';\n errorDiv.innerHTML = error.message;\n errorDiv.style.position = 'absolute';\n errorDiv.style.top = '10px'; // left: 50%; transform: translate(-50%, -50%);';\n errorDiv.style.left = '10px';\n errorDiv.style.color = 'black';\n errorDiv.style.backgroundColor = 'red';\n canvas.parentElement?.appendChild(errorDiv);\n // canvas.style.position = 'absolute';\n }\n}\n\nfunction clearError(device: Device): void {\n const errorDiv = document.getElementById('animation-loop-error');\n if (errorDiv) {\n errorDiv.remove();\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n// A lot of imports, but then Model is where it all comes together...\nimport type {TypedArray} from '@math.gl/types';\nimport type {\n RenderPipelineProps,\n RenderPipelineParameters,\n BufferLayout,\n Shader,\n VertexArray,\n TransformFeedback,\n AttributeInfo,\n Binding,\n PrimitiveTopology\n} from '@luma.gl/core';\nimport {\n Device,\n DeviceFeature,\n Buffer,\n Texture,\n TextureView,\n Sampler,\n RenderPipeline,\n RenderPass,\n UniformStore,\n log,\n getTypedArrayConstructor,\n getAttributeInfosFromLayouts\n} from '@luma.gl/core';\n\nimport type {ShaderModule, PlatformInfo} from '@luma.gl/shadertools';\nimport {ShaderAssembler, getShaderLayoutFromWGSL} from '@luma.gl/shadertools';\n\nimport type {Geometry} from '../geometry/geometry';\nimport {GPUGeometry, makeGPUGeometry} from '../geometry/gpu-geometry';\nimport {PipelineFactory} from '../factories/pipeline-factory';\nimport {ShaderFactory} from '../factories/shader-factory';\nimport {getDebugTableForShaderLayout} from '../debug/debug-shader-layout';\nimport {debugFramebuffer} from '../debug/debug-framebuffer';\nimport {deepEqual} from '../utils/deep-equal';\nimport {BufferLayoutHelper} from '../utils/buffer-layout-helper';\nimport {sortedBufferLayoutByShaderSourceLocations} from '../utils/buffer-layout-order';\nimport {uid} from '../utils/uid';\nimport {ShaderInputs} from '../shader-inputs';\nimport {AsyncTexture} from '../async-texture/async-texture';\n\nconst LOG_DRAW_PRIORITY = 2;\nconst LOG_DRAW_TIMEOUT = 10000;\n\nexport type ModelProps = Omit<RenderPipelineProps, 'vs' | 'fs' | 'bindings'> & {\n source?: string;\n vs?: string | null;\n fs?: string | null;\n\n /** shadertool shader modules (added to shader code) */\n modules?: ShaderModule[];\n /** Shadertool module defines (configures shader code)*/\n defines?: Record<string, boolean>;\n // TODO - injections, hooks etc?\n\n /** Shader inputs, used to generated uniform buffers and bindings */\n shaderInputs?: ShaderInputs;\n /** Bindings */\n bindings?: Record<string, Binding | AsyncTexture>;\n /** Parameters that are built into the pipeline */\n parameters?: RenderPipelineParameters;\n\n /** Geometry */\n geometry?: GPUGeometry | Geometry | null;\n\n /** @deprecated Use instanced rendering? Will be auto-detected in 9.1 */\n isInstanced?: boolean;\n /** instance count */\n instanceCount?: number;\n /** Vertex count */\n vertexCount?: number;\n\n indexBuffer?: Buffer | null;\n /** @note this is really a map of buffers, not a map of attributes */\n attributes?: Record<string, Buffer>;\n /** */\n constantAttributes?: Record<string, TypedArray>;\n\n /** Some applications intentionally supply unused attributes and bindings, and want to disable warnings */\n disableWarnings?: boolean;\n\n /** @internal For use with {@link TransformFeedback}, WebGL only. */\n varyings?: string[];\n\n transformFeedback?: TransformFeedback;\n\n /** Show shader source in browser? */\n debugShaders?: 'never' | 'errors' | 'warnings' | 'always';\n\n /** Factory used to create a {@link RenderPipeline}. Defaults to {@link Device} default factory. */\n pipelineFactory?: PipelineFactory;\n /** Factory used to create a {@link Shader}. Defaults to {@link Device} default factory. */\n shaderFactory?: ShaderFactory;\n /** Shader assembler. Defaults to the ShaderAssembler.getShaderAssembler() */\n shaderAssembler?: ShaderAssembler;\n};\n\n/**\n * v9 Model API\n * A model\n * - automatically reuses pipelines (programs) when possible\n * - automatically rebuilds pipelines if necessary to accommodate changed settings\n * shadertools integration\n * - accepts modules and performs shader transpilation\n */\nexport class Model {\n static defaultProps: Required<ModelProps> = {\n ...RenderPipeline.defaultProps,\n source: undefined!,\n vs: null,\n fs: null,\n id: 'unnamed',\n handle: undefined,\n userData: {},\n defines: {},\n modules: [],\n geometry: null,\n indexBuffer: null,\n attributes: {},\n constantAttributes: {},\n varyings: [],\n\n isInstanced: undefined!,\n instanceCount: 0,\n vertexCount: 0,\n\n shaderInputs: undefined!,\n pipelineFactory: undefined!,\n shaderFactory: undefined!,\n transformFeedback: undefined!,\n shaderAssembler: ShaderAssembler.getDefaultShaderAssembler(),\n\n debugShaders: undefined!,\n disableWarnings: undefined!\n };\n\n readonly device: Device;\n readonly id: string;\n // @ts-expect-error assigned in function called from constructor\n readonly source: string;\n // @ts-expect-error assigned in function called from constructor\n readonly vs: string;\n // @ts-expect-error assigned in function called from constructor\n readonly fs: string;\n readonly pipelineFactory: PipelineFactory;\n readonly shaderFactory: ShaderFactory;\n userData: {[key: string]: any} = {};\n\n // Fixed properties (change can trigger pipeline rebuild)\n\n /** The render pipeline GPU parameters, depth testing etc */\n parameters: RenderPipelineParameters;\n\n /** The primitive topology */\n topology: PrimitiveTopology;\n /** Buffer layout */\n bufferLayout: BufferLayout[];\n\n // Dynamic properties\n\n /** Use instanced rendering */\n isInstanced: boolean | undefined = undefined;\n /** instance count. `undefined` means not instanced */\n instanceCount: number = 0;\n /** Vertex count */\n vertexCount: number;\n\n /** Index buffer */\n indexBuffer: Buffer | null = null;\n /** Buffer-valued attributes */\n bufferAttributes: Record<string, Buffer> = {};\n /** Constant-valued attributes */\n constantAttributes: Record<string, TypedArray> = {};\n /** Bindings (textures, samplers, uniform buffers) */\n bindings: Record<string, Binding | AsyncTexture> = {};\n\n /**\n * VertexArray\n * @note not implemented: if bufferLayout is updated, vertex array has to be rebuilt!\n * @todo - allow application to define multiple vertex arrays?\n * */\n vertexArray: VertexArray;\n\n /** TransformFeedback, WebGL 2 only. */\n transformFeedback: TransformFeedback | null = null;\n\n /** The underlying GPU \"program\". @note May be recreated if parameters change */\n pipeline: RenderPipeline;\n\n /** ShaderInputs instance */\n // @ts-expect-error Assigned in function called by constructor\n shaderInputs: ShaderInputs;\n // @ts-expect-error Assigned in function called by constructor\n _uniformStore: UniformStore;\n\n _attributeInfos: Record<string, AttributeInfo> = {};\n _gpuGeometry: GPUGeometry | null = null;\n private props: Required<ModelProps>;\n\n _pipelineNeedsUpdate: string | false = 'newly created';\n private _needsRedraw: string | false = 'initializing';\n private _destroyed = false;\n\n /** \"Time\" of last draw. Monotonically increasing timestamp */\n _lastDrawTimestamp: number = -1;\n\n get [Symbol.toStringTag](): string {\n return 'Model';\n }\n\n toString(): string {\n return `Model(${this.id})`;\n }\n\n constructor(device: Device, props: ModelProps) {\n this.props = {...Model.defaultProps, ...props};\n props = this.props;\n this.id = props.id || uid('model');\n this.device = device;\n\n Object.assign(this.userData, props.userData);\n\n // Setup shader module inputs\n const moduleMap = Object.fromEntries(\n this.props.modules?.map(module => [module.name, module]) || []\n );\n\n const shaderInputs =\n props.shaderInputs ||\n new ShaderInputs(moduleMap, {disableWarnings: this.props.disableWarnings});\n // @ts-ignore\n this.setShaderInputs(shaderInputs);\n\n // Setup shader assembler\n const platformInfo = getPlatformInfo(device);\n\n // Extract modules from shader inputs if not supplied\n const modules =\n // @ts-ignore shaderInputs is assigned in setShaderInputs above.\n (this.props.modules?.length > 0 ? this.props.modules : this.shaderInputs?.getModules()) || [];\n\n const isWebGPU = this.device.type === 'webgpu';\n\n // WebGPU\n // TODO - hack to support unified WGSL shader\n // TODO - this is wrong, compile a single shader\n if (isWebGPU && this.props.source) {\n // WGSL\n const {source, getUniforms} = this.props.shaderAssembler.assembleWGSLShader({\n platformInfo,\n ...this.props,\n modules\n });\n this.source = source;\n // @ts-expect-error\n this._getModuleUniforms = getUniforms;\n // Extract shader layout after modules have been added to WGSL source, to include any bindings added by modules\n this.props.shaderLayout ||= getShaderLayoutFromWGSL(this.source);\n } else {\n // GLSL\n const {vs, fs, getUniforms} = this.props.shaderAssembler.assembleGLSLShaderPair({\n platformInfo,\n ...this.props,\n modules\n });\n\n this.vs = vs;\n this.fs = fs;\n // @ts-expect-error\n this._getModuleUniforms = getUniforms;\n }\n\n this.vertexCount = this.props.vertexCount;\n this.instanceCount = this.props.instanceCount;\n\n this.topology = this.props.topology;\n this.bufferLayout = this.props.bufferLayout;\n this.parameters = this.props.parameters;\n\n // Geometry, if provided, sets topology and vertex cound\n if (props.geometry) {\n this.setGeometry(props.geometry);\n }\n\n this.pipelineFactory =\n props.pipelineFactory || PipelineFactory.getDefaultPipelineFactory(this.device);\n this.shaderFactory = props.shaderFactory || ShaderFactory.getDefaultShaderFactory(this.device);\n\n // Create the pipeline\n // @note order is important\n this.pipeline = this._updatePipeline();\n\n this.vertexArray = device.createVertexArray({\n shaderLayout: this.pipeline.shaderLayout,\n bufferLayout: this.pipeline.bufferLayout\n });\n\n // Now we can apply geometry attributes\n if (this._gpuGeometry) {\n this._setGeometryAttributes(this._gpuGeometry);\n }\n\n // Apply any dynamic settings that will not trigger pipeline change\n if ('isInstanced' in props) {\n this.isInstanced = props.isInstanced;\n }\n\n if (props.instanceCount) {\n this.setInstanceCount(props.instanceCount);\n }\n if (props.vertexCount) {\n this.setVertexCount(props.vertexCount);\n }\n if (props.indexBuffer) {\n this.setIndexBuffer(props.indexBuffer);\n }\n if (props.attributes) {\n this.setAttributes(props.attributes);\n }\n if (props.constantAttributes) {\n this.setConstantAttributes(props.constantAttributes);\n }\n if (props.bindings) {\n this.setBindings(props.bindings);\n }\n if (props.transformFeedback) {\n this.transformFeedback = props.transformFeedback;\n }\n\n // Catch any access to non-standard props\n Object.seal(this);\n }\n\n destroy(): void {\n if (!this._destroyed) {\n // Release pipeline before we destroy the shaders used by the pipeline\n this.pipelineFactory.release(this.pipeline);\n // Release the shaders\n this.shaderFactory.release(this.pipeline.vs);\n if (this.pipeline.fs) {\n this.shaderFactory.release(this.pipeline.fs);\n }\n this._uniformStore.destroy();\n // TODO - mark resource as managed and destroyIfManaged() ?\n this._gpuGeometry?.destroy();\n this._destroyed = true;\n }\n }\n\n // Draw call\n\n /** Query redraw status. Clears the status. */\n needsRedraw(): false | string {\n // Catch any writes to already bound resources\n if (this._getBindingsUpdateTimestamp() > this._lastDrawTimestamp) {\n this.setNeedsRedraw('contents of bound textures or buffers updated');\n }\n const needsRedraw = this._needsRedraw;\n this._needsRedraw = false;\n return needsRedraw;\n }\n\n /** Mark the model as needing a redraw */\n setNeedsRedraw(reason: string): void {\n this._needsRedraw ||= reason;\n }\n\n predraw(): void {\n // Update uniform buffers if needed\n this.updateShaderInputs();\n // Check if the pipeline is invalidated\n this.pipeline = this._updatePipeline();\n }\n\n draw(renderPass: RenderPass): boolean {\n const loadingBinding = this._areBindingsLoading();\n if (loadingBinding) {\n log.info(LOG_DRAW_PRIORITY, `>>> DRAWING ABORTED ${this.id}: ${loadingBinding} not loaded`)();\n return false;\n }\n\n try {\n renderPass.pushDebugGroup(`${this}.predraw(${renderPass})`);\n this.predraw();\n } finally {\n renderPass.popDebugGroup();\n }\n\n let drawSuccess: boolean;\n try {\n renderPass.pushDebugGroup(`${this}.draw(${renderPass})`);\n this._logDrawCallStart();\n\n // Update the pipeline if invalidated\n // TODO - inside RenderPass is likely the worst place to do this from performance perspective.\n // Application can call Model.predraw() to avoid this.\n this.pipeline = this._updatePipeline();\n\n // Set pipeline state, we may be sharing a pipeline so we need to set all state on every draw\n // Any caching needs to be done inside the pipeline functions\n // TODO this is a busy initialized check for all bindings every frame\n\n const syncBindings = this._getBindings();\n this.pipeline.setBindings(syncBindings, {\n disableWarnings: this.props.disableWarnings\n });\n\n const {indexBuffer} = this.vertexArray;\n const indexCount = indexBuffer\n ? indexBuffer.byteLength / (indexBuffer.indexType === 'uint32' ? 4 : 2)\n : undefined;\n\n drawSuccess = this.pipeline.draw({\n renderPass,\n vertexArray: this.vertexArray,\n isInstanced: this.isInstanced,\n vertexCount: this.vertexCount,\n instanceCount: this.instanceCount,\n indexCount,\n transformFeedback: this.transformFeedback || undefined,\n // WebGL shares underlying cached pipelines even for models that have different parameters and topology,\n // so we must provide our unique parameters to each draw\n // (In WebGPU most parameters are encoded in the pipeline and cannot be changed per draw call)\n parameters: this.parameters,\n topology: this.topology\n });\n } finally {\n renderPass.popDebugGroup();\n this._logDrawCallEnd();\n }\n this._logFramebuffer(renderPass);\n\n // Update needsRedraw flag\n if (drawSuccess) {\n this._lastDrawTimestamp = this.device.timestamp;\n this._needsRedraw = false;\n } else {\n this._needsRedraw = 'waiting for resource initialization';\n }\n return drawSuccess;\n }\n\n // Update fixed fields (can trigger pipeline rebuild)\n\n /**\n * Updates the optional geometry\n * Geometry, set topology and bufferLayout\n * @note Can trigger a pipeline rebuild / pipeline cache fetch on WebGPU\n */\n setGeometry(geometry: GPUGeometry | Geometry | null): void {\n this._gpuGeometry?.destroy();\n const gpuGeometry = geometry && makeGPUGeometry(this.device, geometry);\n if (gpuGeometry) {\n this.setTopology(gpuGeometry.topology || 'triangle-list');\n const bufferLayoutHelper = new BufferLayoutHelper(this.bufferLayout);\n this.bufferLayout = bufferLayoutHelper.mergeBufferLayouts(\n gpuGeometry.bufferLayout,\n this.bufferLayout\n );\n if (this.vertexArray) {\n this._setGeometryAttributes(gpuGeometry);\n }\n }\n this._gpuGeometry = gpuGeometry;\n }\n\n /**\n * Updates the primitive topology ('triangle-list', 'triangle-strip' etc).\n * @note Triggers a pipeline rebuild / pipeline cache fetch on WebGPU\n */\n setTopology(topology: PrimitiveTopology): void {\n if (topology !== this.topology) {\n this.topology = topology;\n this._setPipelineNeedsUpdate('topology');\n }\n }\n\n /**\n * Updates the buffer layout.\n * @note Triggers a pipeline rebuild / pipeline cache fetch\n */\n setBufferLayout(bufferLayout: BufferLayout[]): void {\n const bufferLayoutHelper = new BufferLayoutHelper(this.bufferLayout);\n this.bufferLayout = this._gpuGeometry\n ? bufferLayoutHelper.mergeBufferLayouts(bufferLayout, this._gpuGeometry.bufferLayout)\n : bufferLayout;\n this._setPipelineNeedsUpdate('bufferLayout');\n\n // Recreate the pipeline\n this.pipeline = this._updatePipeline();\n\n // vertex array needs to be updated if we update buffer layout,\n // but not if we update parameters\n this.vertexArray = this.device.createVertexArray({\n shaderLayout: this.pipeline.shaderLayout,\n bufferLayout: this.pipeline.bufferLayout\n });\n\n // Reapply geometry attributes to the new vertex array\n if (this._gpuGeometry) {\n this._setGeometryAttributes(this._gpuGeometry);\n }\n }\n\n /**\n * Set GPU parameters.\n * @note Can trigger a pipeline rebuild / pipeline cache fetch.\n * @param parameters\n */\n setParameters(parameters: RenderPipelineParameters) {\n if (!deepEqual(parameters, this.parameters, 2)) {\n this.parameters = parameters;\n this._setPipelineNeedsUpdate('parameters');\n }\n }\n\n // Update dynamic fields\n\n /**\n * Updates the instance count (used in draw calls)\n * @note Any attributes with stepMode=instance need to be at least this big\n */\n setInstanceCount(instanceCount: number): void {\n this.instanceCount = instanceCount;\n // luma.gl examples don't set props.isInstanced and rely on auto-detection\n // but deck.gl sets instanceCount even for models that are not instanced.\n if (this.isInstanced === undefined && instanceCount > 0) {\n this.isInstanced = true;\n }\n this.setNeedsRedraw('instanceCount');\n }\n\n /**\n * Updates the vertex count (used in draw calls)\n * @note Any attributes with stepMode=vertex need to be at least this big\n */\n setVertexCount(vertexCount: number): void {\n this.vertexCount = vertexCount;\n this.setNeedsRedraw('vertexCount');\n }\n\n /** Set the shader inputs */\n setShaderInputs(shaderInputs: ShaderInputs): void {\n this.shaderInputs = shaderInputs;\n this._uniformStore = new UniformStore(this.shaderInputs.modules);\n // Create uniform buffer bindings for all modules that actually have uniforms\n for (const [moduleName, module] of Object.entries(this.shaderInputs.modules)) {\n if (shaderModuleHasUniforms(module)) {\n const uniformBuffer = this._uniformStore.getManagedUniformBuffer(this.device, moduleName);\n this.bindings[`${moduleName}Uniforms`] = uniformBuffer;\n }\n }\n this.setNeedsRedraw('shaderInputs');\n }\n\n /** Update uniform buffers from the model's shader inputs */\n updateShaderInputs(): void {\n this._uniformStore.setUniforms(this.shaderInputs.getUniformValues());\n this.setBindings(this.shaderInputs.getBindingValues());\n // TODO - this is already tracked through buffer/texture update times?\n this.setNeedsRedraw('shaderInputs');\n }\n\n /**\n * Sets bindings (textures, samplers, uniform buffers)\n */\n setBindings(bindings: Record<string, Binding | AsyncTexture>): void {\n Object.assign(this.bindings, bindings);\n this.setNeedsRedraw('bindings');\n }\n\n /**\n * Updates optional transform feedback. WebGL only.\n */\n setTransformFeedback(transformFeedback: TransformFeedback | null): void {\n this.transformFeedback = transformFeedback;\n this.setNeedsRedraw('transformFeedback');\n }\n\n /**\n * Sets the index buffer\n * @todo - how to unset it if we change geometry?\n */\n setIndexBuffer(indexBuffer: Buffer | null): void {\n this.vertexArray.setIndexBuffer(indexBuffer);\n this.setNeedsRedraw('indexBuffer');\n }\n\n /**\n * Sets attributes (buffers)\n * @note Overrides any attributes previously set with the same name\n */\n setAttributes(buffers: Record<string, Buffer>, options?: {disableWarnings?: boolean}): void {\n const disableWarnings = options?.disableWarnings ?? this.props.disableWarnings;\n if (buffers['indices']) {\n log.warn(\n `Model:${this.id} setAttributes() - indexBuffer should be set using setIndexBuffer()`\n )();\n }\n\n // ensure bufferLayout order matches source layout so we bind\n // the correct buffers to the correct indices in webgpu.\n this.bufferLayout = sortedBufferLayoutByShaderSourceLocations(\n this.pipeline.shaderLayout,\n this.bufferLayout\n );\n const bufferLayoutHelper = new BufferLayoutHelper(this.bufferLayout);\n\n // Check if all buffers have a layout\n for (const [bufferName, buffer] of Object.entries(buffers)) {\n const bufferLayout = bufferLayoutHelper.getBufferLayout(bufferName);\n if (!bufferLayout) {\n if (!disableWarnings) {\n log.warn(`Model(${this.id}): Missing layout for buffer \"${bufferName}\".`)();\n }\n continue; // eslint-disable-line no-continue\n }\n\n // In WebGL, for an interleaved attribute we may need to set multiple attributes\n // but in WebGPU, we set it according to the buffer's position in the vertexArray\n const attributeNames = bufferLayoutHelper.getAttributeNamesForBuffer(bufferLayout);\n let set = false;\n for (const attributeName of attributeNames) {\n const attributeInfo = this._attributeInfos[attributeName];\n if (attributeInfo) {\n const location =\n this.device.type === 'webgpu'\n ? bufferLayoutHelper.getBufferIndex(attributeInfo.bufferName)\n : attributeInfo.location;\n\n this.vertexArray.setBuffer(location, buffer);\n set = true;\n }\n }\n if (!set && !disableWarnings) {\n log.warn(\n `Model(${this.id}): Ignoring buffer \"${buffer.id}\" for unknown attribute \"${bufferName}\"`\n )();\n }\n }\n this.setNeedsRedraw('attributes');\n }\n\n /**\n * Sets constant attributes\n * @note Overrides any attributes previously set with the same name\n * Constant attributes are only supported in WebGL, not in WebGPU\n * Any attribute that is disabled in the current vertex array object\n * is read from the context's global constant value for that attribute location.\n * @param constantAttributes\n */\n setConstantAttributes(\n attributes: Record<string, TypedArray>,\n options?: {disableWarnings?: boolean}\n ): void {\n for (const [attributeName, value] of Object.entries(attributes)) {\n const attributeInfo = this._attributeInfos[attributeName];\n if (attributeInfo) {\n this.vertexArray.setConstantWebGL(attributeInfo.location, value);\n } else if (!(options?.disableWarnings ?? this.props.disableWarnings)) {\n log.warn(\n `Model \"${this.id}: Ignoring constant supplied for unknown attribute \"${attributeName}\"`\n )();\n }\n }\n this.setNeedsRedraw('constants');\n }\n\n // INTERNAL METHODS\n\n /** Check that bindings are loaded. Returns id of first binding that is still loading. */\n _areBindingsLoading(): string | false {\n for (const binding of Object.values(this.bindings)) {\n if (binding instanceof AsyncTexture && !binding.isReady) {\n return binding.id;\n }\n }\n return false;\n }\n\n /** Extracts texture view from loaded async textures. Returns null if any textures have not yet been loaded. */\n _getBindings(): Record<string, Binding> {\n const validBindings: Record<string, Binding> = {};\n\n for (const [name, binding] of Object.entries(this.bindings)) {\n if (binding instanceof AsyncTexture) {\n // Check that async textures are loaded\n if (binding.isReady) {\n validBindings[name] = binding.texture;\n }\n } else {\n validBindings[name] = binding;\n }\n }\n\n return validBindings;\n }\n\n /** Get the timestamp of the latest updated bound GPU memory resource (buffer/texture). */\n _getBindingsUpdateTimestamp(): number {\n let timestamp = 0;\n for (const binding of Object.values(this.bindings)) {\n if (binding instanceof TextureView) {\n timestamp = Math.max(timestamp, binding.texture.updateTimestamp);\n } else if (binding instanceof Buffer || binding instanceof Texture) {\n timestamp = Math.max(timestamp, binding.updateTimestamp);\n } else if (binding instanceof AsyncTexture) {\n timestamp = binding.texture\n ? Math.max(timestamp, binding.texture.updateTimestamp)\n : // The texture will become available in the future\n Infinity;\n } else if (!(binding instanceof Sampler)) {\n timestamp = Math.max(timestamp, binding.buffer.updateTimestamp);\n }\n }\n return timestamp;\n }\n\n /**\n * Updates the optional geometry attributes\n * Geometry, sets several attributes, indexBuffer, and also vertex count\n * @note Can trigger a pipeline rebuild / pipeline cache fetch on WebGPU\n */\n _setGeometryAttributes(gpuGeometry: GPUGeometry): void {\n // Filter geometry attribute so that we don't issue warnings for unused attributes\n const attributes = {...gpuGeometry.attributes};\n for (const [attributeName] of Object.entries(attributes)) {\n if (\n !this.pipeline.shaderLayout.attributes.find(layout => layout.name === attributeName) &&\n attributeName !== 'positions'\n ) {\n delete attributes[attributeName];\n }\n }\n\n // TODO - delete previous geometry?\n this.vertexCount = gpuGeometry.vertexCount;\n this.setIndexBuffer(gpuGeometry.indices || null);\n this.setAttributes(gpuGeometry.attributes, {disableWarnings: true});\n this.setAttributes(attributes, {disableWarnings: this.props.disableWarnings});\n\n this.setNeedsRedraw('geometry attributes');\n }\n\n /** Mark pipeline as needing update */\n _setPipelineNeedsUpdate(reason: string): void {\n this._pipelineNeedsUpdate ||= reason;\n this.setNeedsRedraw(reason);\n }\n\n /** Update pipeline if needed */\n _updatePipeline(): RenderPipeline {\n if (this._pipelineNeedsUpdate) {\n let prevShaderVs: Shader | null = null;\n let prevShaderFs: Shader | null = null;\n if (this.pipeline) {\n log.log(\n 1,\n `Model ${this.id}: Recreating pipeline because \"${this._pipelineNeedsUpdate}\".`\n )();\n prevShaderVs = this.pipeline.vs;\n prevShaderFs = this.pipeline.fs;\n }\n\n this._pipelineNeedsUpdate = false;\n\n const vs = this.shaderFactory.createShader({\n id: `${this.id}-vertex`,\n stage: 'vertex',\n source: this.source || this.vs,\n debugShaders: this.props.debugShaders\n });\n\n let fs: Shader | null = null;\n if (this.source) {\n fs = vs;\n } else if (this.fs) {\n fs = this.shaderFactory.createShader({\n id: `${this.id}-fragment`,\n stage: 'fragment',\n source: this.source || this.fs,\n debugShaders: this.props.debugShaders\n });\n }\n\n this.pipeline = this.pipelineFactory.createRenderPipeline({\n ...this.props,\n bufferLayout: this.bufferLayout,\n topology: this.topology,\n parameters: this.parameters,\n // TODO - why set bindings here when we reset them every frame?\n // Should we expose a BindGroup abstraction?\n bindings: this._getBindings(),\n vs,\n fs\n });\n\n this._attributeInfos = getAttributeInfosFromLayouts(\n this.pipeline.shaderLayout,\n this.bufferLayout\n );\n\n if (prevShaderVs) this.shaderFactory.release(prevShaderVs);\n if (prevShaderFs) this.shaderFactory.release(prevShaderFs);\n }\n return this.pipeline;\n }\n\n /** Throttle draw call logging */\n _lastLogTime = 0;\n _logOpen = false;\n\n _logDrawCallStart(): void {\n // IF level is 4 or higher, log every frame.\n const logDrawTimeout = log.level > 3 ? 0 : LOG_DRAW_TIMEOUT;\n if (log.level < 2 || Date.now() - this._lastLogTime < logDrawTimeout) {\n return;\n }\n\n this._lastLogTime = Date.now();\n this._logOpen = true;\n\n log.group(LOG_DRAW_PRIORITY, `>>> DRAWING MODEL ${this.id}`, {collapsed: log.level <= 2})();\n }\n\n _logDrawCallEnd(): void {\n if (this._logOpen) {\n const shaderLayoutTable = getDebugTableForShaderLayout(this.pipeline.shaderLayout, this.id);\n\n // log.table(logLevel, attributeTable)();\n // log.table(logLevel, uniformTable)();\n log.table(LOG_DRAW_PRIORITY, shaderLayoutTable)();\n\n const uniformTable = this.shaderInputs.getDebugTable();\n log.table(LOG_DRAW_PRIORITY, uniformTable)();\n\n const attributeTable = this._getAttributeDebugTable();\n log.table(LOG_DRAW_PRIORITY, this._attributeInfos)();\n log.table(LOG_DRAW_PRIORITY, attributeTable)();\n\n log.groupEnd(LOG_DRAW_PRIORITY)();\n this._logOpen = false;\n }\n }\n\n protected _drawCount = 0;\n _logFramebuffer(renderPass: RenderPass): void {\n const debugFramebuffers = this.device.props.debugFramebuffers;\n this._drawCount++;\n // Update first 3 frames and then every 60 frames\n if (!debugFramebuffers) {\n // } || (this._drawCount++ > 3 && this._drawCount % 60)) {\n return;\n }\n // TODO - display framebuffer output in debug window\n const framebuffer = renderPass.props.framebuffer;\n if (framebuffer) {\n debugFramebuffer(framebuffer, {id: framebuffer.id, minimap: true});\n // log.image({logLevel: LOG_DRAW_PRIORITY, message: `${framebuffer.id} %c sup?`, image})();\n }\n }\n\n _getAttributeDebugTable(): Record<string, Record<string, unknown>> {\n const table: Record<string, Record<string, unknown>> = {};\n for (const [name, attributeInfo] of Object.entries(this._attributeInfos)) {\n const values = this.vertexArray.attributes[attributeInfo.location];\n table[attributeInfo.location] = {\n name,\n type: attributeInfo.shaderType,\n values: values\n ? this._getBufferOrConstantValues(values, attributeInfo.bufferDataType)\n : 'null'\n };\n }\n if (this.vertexArray.indexBuffer) {\n const {indexBuffer} = this.vertexArray;\n const values =\n indexBuffer.indexType === 'uint32'\n ? new Uint32Array(indexBuffer.debugData)\n : new Uint16Array(indexBuffer.debugData);\n table['indices'] = {\n name: 'indices',\n type: indexBuffer.indexType,\n values: values.toString()\n };\n }\n return table;\n }\n\n // TODO - fix typing of luma data types\n _getBufferOrConstantValues(attribute: Buffer | TypedArray, dataType: any): string {\n const TypedArrayConstructor = getTypedArrayConstructor(dataType);\n const typedArray =\n attribute instanceof Buffer ? new TypedArrayConstructor(attribute.debugData) : attribute;\n return typedArray.toString();\n }\n}\n\nfunction shaderModuleHasUniforms(module: ShaderModule): boolean {\n return Boolean(module.uniformTypes && !isObjectEmpty(module.uniformTypes));\n}\n\n// HELPERS\n\n/** Create a shadertools platform info from the Device */\nexport function getPlatformInfo(device: Device): PlatformInfo {\n return {\n type: device.type,\n shaderLanguage: device.info.shadingLanguage,\n shaderLanguageVersion: device.info.shadingLanguageVersion as 100 | 300,\n gpu: device.info.gpu,\n // HACK - we pretend that the DeviceFeatures is a Set, it has a similar API\n features: device.features as unknown as Set<DeviceFeature>\n };\n}\n\n/** Returns true if given object is empty, false otherwise. */\nfunction isObjectEmpty(obj: object): boolean {\n // @ts-ignore key is unused\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n for (const key in obj) {\n return false;\n }\n return true;\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {PrimitiveTopology, BufferLayout} from '@luma.gl/core';\nimport {Device, Buffer, getVertexFormatFromAttribute} from '@luma.gl/core';\nimport type {Geometry} from '../geometry/geometry';\nimport {uid} from '../utils/uid';\n\nexport type GPUGeometryProps = {\n id?: string;\n /** Determines how vertices are read from the 'vertex' attributes */\n topology: 'point-list' | 'line-list' | 'line-strip' | 'triangle-list' | 'triangle-strip';\n /** Auto calculated from attributes if not provided */\n vertexCount: number;\n bufferLayout: BufferLayout[];\n indices?: Buffer | null;\n attributes: Record<string, Buffer>;\n};\n\nexport class GPUGeometry {\n readonly id: string;\n userData: Record<string, unknown> = {};\n\n /** Determines how vertices are read from the 'vertex' attributes */\n readonly topology?: PrimitiveTopology;\n readonly bufferLayout: BufferLayout[] = [];\n\n readonly vertexCount: number;\n readonly indices?: Buffer | null;\n readonly attributes: Record<string, Buffer>;\n\n constructor(props: GPUGeometryProps) {\n this.id = props.id || uid('geometry');\n this.topology = props.topology;\n this.indices = props.indices || null;\n this.attributes = props.attributes;\n\n this.vertexCount = props.vertexCount;\n\n this.bufferLayout = props.bufferLayout || [];\n\n if (this.indices) {\n if (!(this.indices.usage & Buffer.INDEX)) {\n throw new Error('Index buffer must have INDEX usage');\n }\n }\n }\n\n destroy(): void {\n this.indices?.destroy();\n for (const attribute of Object.values(this.attributes)) {\n attribute.destroy();\n }\n }\n\n getVertexCount(): number {\n return this.vertexCount;\n }\n\n getAttributes(): Record<string, Buffer> {\n return this.attributes;\n }\n\n getIndexes(): Buffer | null {\n return this.indices || null;\n }\n\n _calculateVertexCount(positions: Buffer): number {\n // Assume that positions is a fully packed float32x3 buffer\n const vertexCount = positions.byteLength / 12;\n return vertexCount;\n }\n}\n\nexport function makeGPUGeometry(device: Device, geometry: Geometry | GPUGeometry): GPUGeometry {\n if (geometry instanceof GPUGeometry) {\n return geometry;\n }\n\n const indices = getIndexBufferFromGeometry(device, geometry);\n const {attributes, bufferLayout} = getAttributeBuffersFromGeometry(device, geometry);\n return new GPUGeometry({\n topology: geometry.topology || 'triangle-list',\n bufferLayout,\n vertexCount: geometry.vertexCount,\n indices,\n attributes\n });\n}\n\nexport function getIndexBufferFromGeometry(device: Device, geometry: Geometry): Buffer | undefined {\n if (!geometry.indices) {\n return undefined;\n }\n const data = geometry.indices.value;\n return device.createBuffer({usage: Buffer.INDEX, data});\n}\n\nexport function getAttributeBuffersFromGeometry(\n device: Device,\n geometry: Geometry\n): {attributes: Record<string, Buffer>; bufferLayout: BufferLayout[]; vertexCount: number} {\n const bufferLayout: BufferLayout[] = [];\n\n const attributes: Record<string, Buffer> = {};\n for (const [attributeName, attribute] of Object.entries(geometry.attributes)) {\n let name: string = attributeName;\n // TODO Map some GLTF attribute names (is this still needed?)\n switch (attributeName) {\n case 'POSITION':\n name = 'positions';\n break;\n case 'NORMAL':\n name = 'normals';\n break;\n case 'TEXCOORD_0':\n name = 'texCoords';\n break;\n case 'COLOR_0':\n name = 'colors';\n break;\n }\n if (attribute) {\n attributes[name] = device.createBuffer({\n data: attribute.value,\n id: `${attributeName}-buffer`\n });\n const {value, size, normalized} = attribute;\n // @ts-expect-error\n bufferLayout.push({name, format: getVertexFormatFromAttribute(value, size, normalized)});\n }\n }\n\n const vertexCount = geometry._calculateVertexCount(geometry.attributes, geometry.indices);\n\n return {attributes, bufferLayout, vertexCount};\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nconst uidCounters: Record<string, number> = {};\n\n/**\n * Returns a UID.\n * @param id= - Identifier base name\n * @return uid\n **/\nexport function uid(id: string = 'id'): string {\n uidCounters[id] = uidCounters[id] || 1;\n const count = uidCounters[id]++;\n return `${id}-${count}`;\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {RenderPipelineProps, ComputePipelineProps} from '@luma.gl/core';\nimport {Device, RenderPipeline, ComputePipeline, log} from '@luma.gl/core';\nimport {uid} from '../utils/uid';\n\nexport type PipelineFactoryProps = RenderPipelineProps;\n\ntype RenderPipelineCacheItem = {pipeline: RenderPipeline; useCount: number};\ntype ComputePipelineCacheItem = {pipeline: ComputePipeline; useCount: number};\n\n/**\n * Efficiently creates / caches pipelines\n */\nexport class PipelineFactory {\n static defaultProps: Required<PipelineFactoryProps> = {...RenderPipeline.defaultProps};\n\n /** Get the singleton default pipeline factory for the specified device */\n static getDefaultPipelineFactory(device: Device): PipelineFactory {\n device._lumaData['defaultPipelineFactory'] =\n device._lumaData['defaultPipelineFactory'] || new PipelineFactory(device);\n return device._lumaData['defaultPipelineFactory'] as PipelineFactory;\n }\n\n readonly device: Device;\n readonly cachingEnabled: boolean;\n readonly destroyPolicy: 'unused' | 'never';\n readonly debug: boolean;\n\n private _hashCounter: number = 0;\n private readonly _hashes: Record<string, number> = {};\n private readonly _renderPipelineCache: Record<string, RenderPipelineCacheItem> = {};\n private readonly _computePipelineCache: Record<string, ComputePipelineCacheItem> = {};\n\n get [Symbol.toStringTag](): string {\n return 'PipelineFactory';\n }\n\n toString(): string {\n return `PipelineFactory(${this.device.id})`;\n }\n\n constructor(device: Device) {\n this.device = device;\n this.cachingEnabled = device.props._cachePipelines;\n this.destroyPolicy = device.props._cacheDestroyPolicy;\n this.debug = device.props.debugFactories;\n }\n\n /** Return a RenderPipeline matching supplied props. Reuses an equivalent pipeline if already created. */\n createRenderPipeline(props: RenderPipelineProps): RenderPipeline {\n if (!this.cachingEnabled) {\n return this.device.createRenderPipeline(props);\n }\n\n const allProps: Required<RenderPipelineProps> = {...RenderPipeline.defaultProps, ...props};\n\n const cache = this._renderPipelineCache;\n const hash = this._hashRenderPipeline(allProps);\n\n let pipeline: RenderPipeline = cache[hash]?.pipeline;\n if (!pipeline) {\n pipeline = this.device.createRenderPipeline({\n ...allProps,\n id: allProps.id ? `${allProps.id}-cached` : uid('unnamed-cached')\n });\n pipeline.hash = hash;\n cache[hash] = {pipeline, useCount: 1};\n if (this.debug) {\n log.warn(`${this}: ${pipeline} created, count=${cache[hash].useCount}`)();\n }\n } else {\n cache[hash].useCount++;\n if (this.debug) {\n log.warn(\n `${this}: ${cache[hash].pipeline} reused, count=${cache[hash].useCount}, (id=${props.id})`\n )();\n }\n }\n\n return pipeline;\n }\n\n /** Return a ComputePipeline matching supplied props. Reuses an equivalent pipeline if already created. */\n createComputePipeline(props: ComputePipelineProps): ComputePipeline {\n if (!this.cachingEnabled) {\n return this.device.createComputePipeline(props);\n }\n\n const allProps: Required<ComputePipelineProps> = {...ComputePipeline.defaultProps, ...props};\n\n const cache = this._computePipelineCache;\n const hash = this._hashComputePipeline(allProps);\n\n let pipeline: ComputePipeline = cache[hash]?.pipeline;\n if (!pipeline) {\n pipeline = this.device.createComputePipeline({\n ...allProps,\n id: allProps.id ? `${allProps.id}-cached` : undefined\n });\n pipeline.hash = hash;\n cache[hash] = {pipeline, useCount: 1};\n if (this.debug) {\n log.warn(`${this}: ${pipeline} created, count=${cache[hash].useCount}`)();\n }\n } else {\n cache[hash].useCount++;\n if (this.debug) {\n log.warn(\n `${this}: ${cache[hash].pipeline} reused, count=${cache[hash].useCount}, (id=${props.id})`\n )();\n }\n }\n\n return pipeline;\n }\n\n release(pipeline: RenderPipeline | ComputePipeline): void {\n if (!this.cachingEnabled) {\n pipeline.destroy();\n return;\n }\n\n const cache = this._getCache(pipeline);\n const hash = pipeline.hash;\n\n cache[hash].useCount--;\n if (cache[hash].useCount === 0) {\n this._destroyPipeline(pipeline);\n if (this.debug) {\n log.warn(`${this}: ${pipeline} released and destroyed`)();\n }\n } else if (cache[hash].useCount < 0) {\n log.error(`${this}: ${pipeline} released, useCount < 0, resetting`)();\n cache[hash].useCount = 0;\n } else if (this.debug) {\n log.warn(`${this}: ${pipeline} released, count=${cache[hash].useCount}`)();\n }\n }\n\n // PRIVATE\n\n /** Destroy a cached pipeline, removing it from the cache (depending on destroy policy) */\n private _destroyPipeline(pipeline: RenderPipeline | ComputePipeline): boolean {\n const cache = this._getCache(pipeline);\n\n switch (this.destroyPolicy) {\n case 'never':\n return false;\n case 'unused':\n delete cache[pipeline.hash];\n pipeline.destroy();\n return true;\n }\n }\n\n /** Get the appropriate cache for the type of pipeline */\n private _getCache(\n pipeline: RenderPipeline | ComputePipeline\n ): Record<string, RenderPipelineCacheItem> | Record<string, ComputePipelineCacheItem> {\n let cache:\n | Record<string, RenderPipelineCacheItem>\n | Record<string, ComputePipelineCacheItem>\n | undefined;\n if (pipeline instanceof ComputePipeline) {\n cache = this._computePipelineCache;\n }\n if (pipeline instanceof RenderPipeline) {\n cache = this._renderPipelineCache;\n }\n if (!cache) {\n throw new Error(`${this}`);\n }\n if (!cache[pipeline.hash]) {\n throw new Error(`${this}: ${pipeline} matched incorrect entry`);\n }\n return cache;\n }\n\n /** Calculate a hash based on all the inputs for a compute pipeline */\n private _hashComputePipeline(props: ComputePipelineProps): string {\n const {type} = this.device;\n const shaderHash = this._getHash(props.shader.source);\n return `${type}/C/${shaderHash}`;\n }\n\n /** Calculate a hash based on all the inputs for a render pipeline */\n private _hashRenderPipeline(props: RenderPipelineProps): string {\n const vsHash = props.vs ? this._getHash(props.vs.source) : 0;\n const fsHash = props.fs ? this._getHash(props.fs.source) : 0;\n\n // WebGL specific\n // const {varyings = [], bufferMode = {}} = props;\n // const varyingHashes = varyings.map((v) => this._getHash(v));\n const varyingHash = '-'; // `${varyingHashes.join('/')}B${bufferMode}`\n const bufferLayoutHash = this._getHash(JSON.stringify(props.bufferLayout));\n\n const {type} = this.device;\n switch (type) {\n case 'webgl':\n // WebGL is more dynamic\n return `${type}/R/${vsHash}/${fsHash}V${varyingHash}BL${bufferLayoutHash}`;\n\n case 'webgpu':\n default:\n // On WebGPU we need to rebuild the pipeline if topology, parameters or bufferLayout change\n const parameterHash = this._getHash(JSON.stringify(props.parameters));\n // TODO - Can json.stringify() generate different strings for equivalent objects if order of params is different?\n // create a deepHash() to deduplicate?\n return `${type}/R/${vsHash}/${fsHash}V${varyingHash}T${props.topology}P${parameterHash}BL${bufferLayoutHash}`;\n }\n }\n\n private _getHash(key: string): number {\n if (this._hashes[key] === undefined) {\n this._hashes[key] = this._hashCounter++;\n }\n return this._hashes[key];\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {Device, Shader, ShaderProps, log} from '@luma.gl/core';\n\n/** Manages a cached pool of Shaders for reuse. */\nexport class ShaderFactory {\n static readonly defaultProps: Required<ShaderProps> = {...Shader.defaultProps};\n\n /** Returns the default ShaderFactory for the given {@link Device}, creating one if necessary. */\n static getDefaultShaderFactory(device: Device): ShaderFactory {\n device._lumaData['defaultShaderFactory'] ||= new ShaderFactory(device);\n return device._lumaData['defaultShaderFactory'] as ShaderFactory;\n }\n\n public readonly device: Device;\n readonly cachingEnabled: boolean;\n readonly destroyPolicy: 'unused' | 'never';\n readonly debug: boolean;\n\n private readonly _cache: Record<string, {shader: Shader; useCount: number}> = {};\n\n get [Symbol.toStringTag](): string {\n return 'ShaderFactory';\n }\n\n toString(): string {\n return `${this[Symbol.toStringTag]}(${this.device.id})`;\n }\n\n /** @internal */\n constructor(device: Device) {\n this.device = device;\n this.cachingEnabled = device.props._cacheShaders;\n this.destroyPolicy = device.props._cacheDestroyPolicy;\n this.debug = true; // device.props.debugFactories;\n }\n\n /** Requests a {@link Shader} from the cache, creating a new Shader only if necessary. */\n createShader(props: ShaderProps): Shader {\n if (!this.cachingEnabled) {\n return this.device.createShader(props);\n }\n\n const key = this._hashShader(props);\n\n let cacheEntry = this._cache[key];\n if (!cacheEntry) {\n const shader = this.device.createShader({\n ...props,\n id: props.id ? `${props.id}-cached` : undefined\n });\n this._cache[key] = cacheEntry = {shader, useCount: 1};\n if (this.debug) {\n log.warn(`${this}: Created new shader ${shader.id}`)();\n }\n } else {\n cacheEntry.useCount++;\n if (this.debug) {\n log.warn(`${this}: Reusing shader ${cacheEntry.shader.id} count=${cacheEntry.useCount}`)();\n }\n }\n\n return cacheEntry.shader;\n }\n\n /** Releases a previously-requested {@link Shader}, destroying it if no users remain. */\n release(shader: Shader): void {\n if (!this.cachingEnabled) {\n shader.destroy();\n return;\n }\n\n const key = this._hashShader(shader);\n const cacheEntry = this._cache[key];\n if (cacheEntry) {\n cacheEntry.useCount--;\n if (cacheEntry.useCount === 0) {\n if (this.destroyPolicy === 'unused') {\n delete this._cache[key];\n cacheEntry.shader.destroy();\n if (this.debug) {\n log.warn(`${this}: Releasing shader ${shader.id}, destroyed`)();\n }\n }\n } else if (cacheEntry.useCount < 0) {\n throw new Error(`ShaderFactory: Shader ${shader.id} released too many times`);\n } else if (this.debug) {\n log.warn(`${this}: Releasing shader ${shader.id} count=${cacheEntry.useCount}`)();\n }\n }\n }\n\n // PRIVATE\n\n protected _hashShader(value: Shader | ShaderProps): string {\n return `${value.stage}:${value.source}`;\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {ShaderLayout} from '@luma.gl/core';\n\n/**\n * Extracts a table suitable for `console.table()` from a shader layout to assist in debugging.\n * @param layout shader layout\n * @param name app should provide the most meaningful name, usually the model or pipeline name / id.\n * @returns\n */\nexport function getDebugTableForShaderLayout(\n layout: ShaderLayout,\n name: string\n): Record<string, Record<string, string>> {\n const table: Record<string, Record<string, string>> = {};\n\n const header = 'Values'; // '`Shader Layout for ${name}`;\n\n if (layout.attributes.length === 0 && !layout.varyings?.length) {\n return {'No attributes or varyings': {[header]: 'N/A'}};\n }\n\n for (const attributeDeclaration of layout.attributes) {\n if (attributeDeclaration) {\n const glslDeclaration = `${attributeDeclaration.location} ${attributeDeclaration.name}: ${attributeDeclaration.type}`;\n table[`in ${glslDeclaration}`] = {[header]: attributeDeclaration.stepMode || 'vertex'};\n }\n }\n\n for (const varyingDeclaration of layout.varyings || []) {\n const glslDeclaration = `${varyingDeclaration.location} ${varyingDeclaration.name}`;\n table[`out ${glslDeclaration}`] = {[header]: JSON.stringify(varyingDeclaration)};\n }\n\n return table;\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {Framebuffer, Texture} from '@luma.gl/core';\n// import {copyTextureToImage} from '../debug/copy-texture-to-image';\n\n/** Only works with 1st device? */\nlet canvas: HTMLCanvasElement | null = null;\nlet ctx: CanvasRenderingContext2D | null = null;\n// let targetImage: HTMLImageElement | null = null;\n\n/** Debug utility to draw FBO contents onto screen */\n// eslint-disable-next-line\nexport function debugFramebuffer(\n fbo: Framebuffer | Texture,\n {\n id,\n minimap,\n opaque,\n top = '0',\n left = '0',\n rgbaScale = 1\n }: {\n id: string;\n minimap?: boolean;\n opaque?: boolean;\n top?: string;\n left?: string;\n rgbaScale?: number;\n }\n) {\n if (!canvas) {\n canvas = document.createElement('canvas');\n canvas.id = id;\n canvas.title = id;\n canvas.style.zIndex = '100';\n canvas.style.position = 'absolute';\n canvas.style.top = top; // \u26A0\uFE0F\n canvas.style.left = left; // \u26A0\uFE0F\n canvas.style.border = 'blue 5px solid';\n canvas.style.transform = 'scaleY(-1)';\n document.body.appendChild(canvas);\n\n ctx = canvas.getContext('2d');\n // targetImage = new Image();\n }\n\n // const canvasHeight = (minimap ? 2 : 1) * fbo.height;\n if (canvas.width !== fbo.width || canvas.height !== fbo.height) {\n canvas.width = fbo.width / 2;\n canvas.height = fbo.height / 2;\n canvas.style.width = '400px';\n canvas.style.height = '400px';\n }\n\n // const image = copyTextureToImage(fbo, {targetMaxHeight: 100, targetImage});\n // ctx.drawImage(image, 0, 0);\n\n const color = fbo.device.readPixelsToArrayWebGL(fbo);\n const imageData = ctx?.createImageData(fbo.width, fbo.height);\n if (imageData) {\n // Full map\n const offset = 0;\n // if (color.some((v) => v > 0)) {\n // console.error('THERE IS NON-ZERO DATA IN THE FBO!');\n // }\n for (let i = 0; i < color.length; i += 4) {\n imageData.data[offset + i + 0] = color[i + 0] * rgbaScale;\n imageData.data[offset + i + 1] = color[i + 1] * rgbaScale;\n imageData.data[offset + i + 2] = color[i + 2] * rgbaScale;\n imageData.data[offset + i + 3] = opaque ? 255 : color[i + 3] * rgbaScale;\n }\n ctx?.putImageData(imageData, 0, 0);\n }\n}\n", "// luma.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", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {log, type BufferLayout} from '@luma.gl/core';\n\n/** BufferLayoutHelper is a helper class that should not be used directly by applications */\nexport class BufferLayoutHelper {\n bufferLayouts: BufferLayout[];\n\n constructor(bufferLayouts: BufferLayout[]) {\n this.bufferLayouts = bufferLayouts;\n }\n\n getBufferLayout(name: string): BufferLayout | null {\n return this.bufferLayouts.find(layout => layout.name === name) || null;\n }\n\n /** Get attribute names from a BufferLayout */\n getAttributeNamesForBuffer(bufferLayout: BufferLayout): string[] {\n return bufferLayout.attributes\n ? bufferLayout.attributes?.map(layout => layout.attribute)\n : [bufferLayout.name];\n }\n\n mergeBufferLayouts(\n bufferLayouts1: BufferLayout[],\n bufferLayouts2: BufferLayout[]\n ): BufferLayout[] {\n const mergedLayouts = [...bufferLayouts1];\n for (const attribute of bufferLayouts2) {\n const index = mergedLayouts.findIndex(attribute2 => attribute2.name === attribute.name);\n if (index < 0) {\n mergedLayouts.push(attribute);\n } else {\n mergedLayouts[index] = attribute;\n }\n }\n return mergedLayouts;\n }\n\n getBufferIndex(bufferName: string): number {\n const bufferIndex = this.bufferLayouts.findIndex(layout => layout.name === bufferName);\n\n if (bufferIndex === -1) {\n log.warn(`BufferLayout: Missing buffer for \"${bufferName}\".`)();\n }\n\n return bufferIndex;\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {type BufferLayout, type ShaderLayout} from '@luma.gl/core';\n\nexport function sortedBufferLayoutByShaderSourceLocations(\n shaderLayout: ShaderLayout,\n bufferLayout: BufferLayout[]\n): BufferLayout[] {\n const shaderLayoutMap = Object.fromEntries(\n shaderLayout.attributes.map(attr => [attr.name, attr.location])\n );\n\n const sortedLayout = bufferLayout.slice();\n sortedLayout.sort((a, b) => {\n const attributeNamesA = a.attributes ? a.attributes.map(attr => attr.attribute) : [a.name];\n const attributeNamesB = b.attributes ? b.attributes.map(attr => attr.attribute) : [b.name];\n const minLocationA = Math.min(...attributeNamesA.map(name => shaderLayoutMap[name]));\n const minLocationB = Math.min(...attributeNamesB.map(name => shaderLayoutMap[name]));\n\n return minLocationA - minLocationB;\n });\n\n return sortedLayout;\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {Binding, UniformValue} from '@luma.gl/core';\nimport {log} from '@luma.gl/core';\n// import type {VariableShaderType, UniformValue, UniformFormat, UniformInfoDevice, Texture, Sampler} from '@luma.gl/core';\nimport {getShaderModuleDependencies, ShaderModule} from '@luma.gl/shadertools';\nimport {splitUniformsAndBindings} from './model/split-uniforms-and-bindings';\n\nexport type ShaderInputsOptions = {\n disableWarnings?: boolean;\n};\n\n/**\n * ShaderInputs holds uniform and binding values for one or more shader modules,\n * - It can generate binary data for any uniform buffer\n * - It can manage a uniform buffer for each block\n * - It can update managed uniform buffers with a single call\n * - It performs some book keeping on what has changed to minimize unnecessary writes to uniform buffers.\n */\nexport class ShaderInputs<\n ShaderPropsT extends Partial<Record<string, Record<string, unknown>>> = Partial<\n Record<string, Record<string, unknown>>\n >\n> {\n options: Required<ShaderInputsOptions> = {\n disableWarnings: false\n };\n\n /**\n * The map of modules\n * @todo should should this include the resolved dependencies?\n */\n // @ts-ignore Fix typings\n modules: Readonly<{[P in keyof ShaderPropsT]: ShaderModule<ShaderPropsT[P]>}>;\n\n /** Stores the uniform values for each module */\n moduleUniforms: Record<keyof ShaderPropsT, Record<string, UniformValue>>;\n /** Stores the uniform bindings for each module */\n moduleBindings: Record<keyof ShaderPropsT, Record<string, Binding>>;\n /** Tracks if uniforms have changed */\n // moduleUniformsChanged: Record<keyof ShaderPropsT, false | string>;\n\n /**\n * Create a new UniformStore instance\n * @param modules\n */\n constructor(\n // @ts-ignore Fix typings\n modules: {[P in keyof ShaderPropsT]?: ShaderModule<ShaderPropsT[P], any>},\n options?: ShaderInputsOptions\n ) {\n Object.assign(this.options, options);\n\n // Extract modules with dependencies\n const resolvedModules = getShaderModuleDependencies(\n Object.values(modules).filter(module => module.dependencies)\n );\n for (const resolvedModule of resolvedModules) {\n // @ts-ignore\n modules[resolvedModule.name] = resolvedModule;\n }\n\n log.log(1, 'Creating ShaderInputs with modules', Object.keys(modules))();\n\n // Store the module definitions and create storage for uniform values and binding values, per module\n // @ts-ignore Fix typings\n this.modules = modules as {[P in keyof ShaderPropsT]: ShaderModule<ShaderPropsT[P]>};\n this.moduleUniforms = {} as Record<keyof ShaderPropsT, Record<string, UniformValue>>;\n this.moduleBindings = {} as Record<keyof ShaderPropsT, Record<string, Binding>>;\n\n // Initialize the modules\n for (const [name, module] of Object.entries(modules)) {\n this._addModule(module);\n if (module.name && name !== module.name && !this.options.disableWarnings) {\n log.warn(`Module name: ${name} vs ${module.name}`)();\n }\n }\n }\n\n /** Destroy */\n destroy(): void {}\n\n /**\n * Set module props\n */\n setProps(props: Partial<{[P in keyof ShaderPropsT]?: Partial<ShaderPropsT[P]>}>): void {\n for (const name of Object.keys(props)) {\n const moduleName = name as keyof ShaderPropsT;\n const moduleProps = props[moduleName] || {};\n const module = this.modules[moduleName];\n if (!module) {\n // Ignore props for unregistered modules\n if (!this.options.disableWarnings) {\n log.warn(`Module ${name} not found`)();\n }\n continue; // eslint-disable-line no-continue\n }\n\n const oldUniforms = this.moduleUniforms[moduleName] as (typeof module)['uniforms'];\n const oldBindings = this.moduleBindings[moduleName];\n const uniformsAndBindings =\n module.getUniforms?.(moduleProps, oldUniforms) || (moduleProps as any);\n\n const {uniforms, bindings} = splitUniformsAndBindings(uniformsAndBindings);\n this.moduleUniforms[moduleName] = {...oldUniforms, ...uniforms};\n this.moduleBindings[moduleName] = {...oldBindings, ...bindings};\n // this.moduleUniformsChanged ||= moduleName;\n\n // console.log(`setProps(${String(moduleName)}`, moduleName, this.moduleUniforms[moduleName])\n }\n }\n\n /**\n * Return the map of modules\n * @todo should should this include the resolved dependencies?\n */\n getModules(): ShaderModule[] {\n return Object.values(this.modules);\n }\n\n /** Get all uniform values for all modules */\n getUniformValues(): Partial<Record<keyof ShaderPropsT, Record<string, UniformValue>>> {\n return this.moduleUniforms;\n }\n\n /** Merges all bindings for the shader (from the various modules) */\n getBindingValues(): Record<string, Binding> {\n const bindings = {} as Record<string, Binding>;\n for (const moduleBindings of Object.values(this.moduleBindings)) {\n Object.assign(bindings, moduleBindings);\n }\n return bindings;\n }\n\n // INTERNAL\n\n /** Return a debug table that can be used for console.table() or log.table() */\n getDebugTable(): Record<string, Record<string, unknown>> {\n const table: Record<string, Record<string, unknown>> = {};\n for (const [moduleName, module] of Object.entries(this.moduleUniforms)) {\n for (const [key, value] of Object.entries(module)) {\n table[`${moduleName}.${key}`] = {\n type: this.modules[moduleName].uniformTypes?.[key as keyof ShaderPropsT],\n value: String(value)\n };\n }\n }\n return table;\n }\n\n _addModule(module: ShaderModule): void {\n const moduleName = module.name as keyof ShaderPropsT;\n // Get default uniforms from module\n this.moduleUniforms[moduleName] = module.defaultUniforms || {};\n this.moduleBindings[moduleName] = {};\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {UniformValue, Binding} from '@luma.gl/core';\nimport {isNumericArray} from '@math.gl/types';\n\nexport function isUniformValue(value: unknown): value is UniformValue {\n return isNumericArray(value) || typeof value === 'number' || typeof value === 'boolean';\n}\n\ntype UniformsAndBindings = {\n bindings: Record<string, Binding>;\n uniforms: Record<string, UniformValue>;\n};\n\nexport function splitUniformsAndBindings(\n uniforms: Record<string, Binding | UniformValue>\n): UniformsAndBindings {\n const result: UniformsAndBindings = {bindings: {}, uniforms: {}};\n Object.keys(uniforms).forEach(name => {\n const uniform = uniforms[name];\n if (isUniformValue(uniform)) {\n result.uniforms[name] = uniform;\n } else {\n result.bindings[name] = uniform;\n }\n });\n\n return result;\n}\n", "// luma.gl, MIT license\n// Copyright (c) vis.gl contributors\n\nimport type {\n TextureProps,\n SamplerProps,\n TextureView,\n Device,\n TypedArray,\n TextureFormat,\n ExternalImage\n} from '@luma.gl/core';\n\nimport {Texture, Sampler, log} from '@luma.gl/core';\n\nimport {loadImageBitmap} from '../application-utils/load-file';\nimport {uid} from '../utils/uid';\n\ntype AsyncTextureDataProps =\n | AsyncTexture1DProps\n | AsyncTexture2DProps\n | AsyncTexture3DProps\n | AsyncTextureArrayProps\n | AsyncTextureCubeProps\n | AsyncTextureCubeArrayProps;\n\ntype AsyncTexture1DProps = {dimension: '1d'; data: Promise<Texture1DData> | Texture1DData | null};\ntype AsyncTexture2DProps = {dimension?: '2d'; data: Promise<Texture2DData> | Texture2DData | null};\ntype AsyncTexture3DProps = {dimension: '3d'; data: Promise<Texture3DData> | Texture3DData | null};\ntype AsyncTextureArrayProps = {\n dimension: '2d-array';\n data: Promise<TextureArrayData> | TextureArrayData | null;\n};\ntype AsyncTextureCubeProps = {\n dimension: 'cube';\n data: Promise<TextureCubeData> | TextureCubeData | null;\n};\ntype AsyncTextureCubeArrayProps = {\n dimension: 'cube-array';\n data: Promise<TextureCubeArrayData> | TextureCubeArrayData | null;\n};\n\ntype AsyncTextureData = AsyncTextureProps['data'];\n\n/** Names of cube texture faces */\nexport type TextureCubeFace = '+X' | '-X' | '+Y' | '-Y' | '+Z' | '-Z';\nexport const TextureCubeFaces: TextureCubeFace[] = ['+X', '-X', '+Y', '-Y', '+Z', '-Z'];\n// prettier-ignore\nexport const TextureCubeFaceMap = {'+X': 0, '-X': 1, '+Y': 2, '-Y': 3, '+Z': 4, '-Z': 5};\n\n/**\n * One mip level\n * Basic data structure is similar to `ImageData`\n * additional optional fields can describe compressed texture data.\n */\nexport type TextureImageData = {\n /** WebGPU style format string. Defaults to 'rgba8unorm' */\n format?: TextureFormat;\n data: TypedArray;\n width: number;\n height: number;\n\n compressed?: boolean;\n byteLength?: number;\n hasAlpha?: boolean;\n};\n\nexport type TextureLevelSource = TextureImageData | ExternalImage;\n\n/** Texture data can be one or more mip levels */\nexport type TextureData = TextureImageData | ExternalImage | (TextureImageData | ExternalImage)[];\n\n/** @todo - define what data type is supported for 1D textures */\nexport type Texture1DData = TypedArray | TextureImageData;\n\n/** Texture data can be one or more mip levels */\nexport type Texture2DData =\n | TypedArray\n | TextureImageData\n | ExternalImage\n | (TextureImageData | ExternalImage)[];\n\n/** 6 face textures */\nexport type TextureCubeData = Record<TextureCubeFace, TextureData>;\n\n/** Array of textures */\nexport type Texture3DData = TextureData[];\n\n/** Array of textures */\nexport type TextureArrayData = TextureData[];\n\n/** Array of 6 face textures */\nexport type TextureCubeArrayData = Record<TextureCubeFace, TextureData>[];\n\nexport const CubeFaces: TextureCubeFace[] = ['+X', '-X', '+Y', '-Y', '+Z', '-Z'];\n\n/** Properties for an async texture */\nexport type AsyncTextureProps = Omit<TextureProps, 'data' | 'mipLevels' | 'width' | 'height'> &\n AsyncTextureDataProps & {\n /** Generate mipmaps after creating textures and setting data */\n mipmaps?: boolean;\n /** nipLevels can be set to 'auto' to generate max number of mipLevels */\n mipLevels?: number | 'auto';\n /** Width - can be auto-calculated when initializing from ExternalImage */\n width?: number;\n /** Height - can be auto-calculated when initializing from ExternalImage */\n height?: number;\n };\n\n/**\n * It is very convenient to be able to initialize textures with promises\n * This can add considerable complexity to the Texture class, and doesn't\n * fit with the immutable nature of WebGPU resources.\n * Instead, luma.gl offers async textures as a separate class.\n */\nexport class AsyncTexture {\n readonly device: Device;\n readonly id: string;\n props: Required<Omit<AsyncTextureProps, 'data'>>;\n\n // TODO - should we type these as possibly `null`? It will make usage harder?\n // @ts-expect-error\n texture: Texture;\n // @ts-expect-error\n sampler: Sampler;\n // @ts-expect-error\n view: TextureView;\n\n readonly ready: Promise<void>;\n isReady: boolean = false;\n destroyed: boolean = false;\n\n protected resolveReady: () => void = () => {};\n protected rejectReady: (error: Error) => void = () => {};\n\n get [Symbol.toStringTag]() {\n return 'AsyncTexture';\n }\n\n toString(): string {\n return `AsyncTexture:\"${this.id}\"(${this.isReady ? 'ready' : 'loading'})`;\n }\n\n constructor(device: Device, props: AsyncTextureProps) {\n this.device = device;\n\n // TODO - if we support URL strings as data...\n const id = uid('async-texture'); // typeof props?.data === 'string' ? props.data.slice(-20) : uid('async-texture');\n this.props = {...AsyncTexture.defaultProps, id, ...props};\n this.id = this.props.id;\n\n props = {...props};\n // Signature: new AsyncTexture(device, {data: url})\n if (typeof props?.data === 'string' && props.dimension === '2d') {\n props.data = loadImageBitmap(props.data);\n }\n\n // If mipmaps are requested, we need to allocate space for them\n if (props.mipmaps) {\n props.mipLevels = 'auto';\n }\n\n this.ready = new Promise<void>((resolve, reject) => {\n this.resolveReady = () => {\n this.isReady = true;\n resolve();\n };\n this.rejectReady = reject;\n });\n\n this.initAsync(props);\n }\n\n async initAsync(props: AsyncTextureProps): Promise<void> {\n const asyncData: AsyncTextureData = props.data;\n // @ts-expect-error not clear how to convince TS that null will be returned\n const data: TextureData | null = await awaitAllPromises(asyncData).then(\n undefined,\n this.rejectReady\n );\n\n // Check that we haven't been destroyed while waiting for texture data to load\n if (this.destroyed) {\n return;\n }\n\n // Now we can actually create the texture\n\n // Auto-deduce width and height if not supplied\n const size =\n this.props.width && this.props.height\n ? {width: this.props.width, height: this.props.height}\n : this.getTextureDataSize(data);\n if (!size) {\n throw new Error('Texture size could not be determined');\n }\n const syncProps: TextureProps = {...size, ...props, data: undefined, mipLevels: 1};\n\n // Auto-calculate the number of mip levels as a convenience\n // TODO - Should we clamp to 1-getMipLevelCount?\n const maxMips = this.device.getMipLevelCount(syncProps.width, syncProps.height);\n syncProps.mipLevels =\n this.props.mipLevels === 'auto' ? maxMips : Math.min(maxMips, this.props.mipLevels);\n\n this.texture = this.device.createTexture(syncProps);\n this.sampler = this.texture.sampler;\n this.view = this.texture.view;\n\n if (props.data) {\n switch (this.props.dimension) {\n case '1d':\n this._setTexture1DData(this.texture, data as Texture1DData);\n break;\n case '2d':\n this._setTexture2DData(data as Texture2DData);\n break;\n case '3d':\n this._setTexture3DData(this.texture, data as Texture3DData);\n break;\n case '2d-array':\n this._setTextureArrayData(this.texture, data as TextureArrayData);\n break;\n case 'cube':\n this._setTextureCubeData(this.texture, data as unknown as TextureCubeData);\n break;\n case 'cube-array':\n this._setTextureCubeArrayData(this.texture, data as unknown as TextureCubeArrayData);\n break;\n }\n }\n\n // Do we need to generate mipmaps?\n if (this.props.mipmaps) {\n this.generateMipmaps();\n }\n\n log.info(1, `${this} loaded`);\n this.resolveReady();\n }\n\n destroy(): void {\n if (this.texture) {\n this.texture.destroy();\n // @ts-expect-error\n this.texture = null;\n }\n this.destroyed = true;\n }\n\n generateMipmaps(): void {\n // if (this.device.type === 'webgl') {\n this.texture.generateMipmapsWebGL();\n // }\n }\n\n /** Set sampler or create and set new Sampler from SamplerProps */\n setSampler(sampler: Sampler | SamplerProps = {}): void {\n this.texture.setSampler(\n sampler instanceof Sampler ? sampler : this.device.createSampler(sampler)\n );\n }\n\n /**\n * Textures are immutable and cannot be resized after creation,\n * but we can create a similar texture with the same parameters but a new size.\n * @note Does not copy contents of the texture\n * @note Mipmaps may need to be regenerated after resizing / setting new data\n * @todo Abort pending promise and create a texture with the new size?\n */\n resize(size: {width: number; height: number}): boolean {\n if (!this.isReady) {\n throw new Error('Cannot resize texture before it is ready');\n }\n\n if (size.width === this.texture.width && size.height === this.texture.height) {\n return false;\n }\n\n if (this.texture) {\n const texture = this.texture;\n this.texture = texture.clone(size);\n texture.destroy();\n }\n\n return true;\n }\n\n /** Check if texture data is a typed array */\n isTextureLevelData(data: TextureData): data is TextureImageData {\n const typedArray = (data as TextureImageData)?.data;\n return ArrayBuffer.isView(typedArray);\n }\n\n /** Get the size of the texture described by the provided TextureData */\n getTextureDataSize(\n data:\n | TextureData\n | TextureCubeData\n | TextureArrayData\n | TextureCubeArrayData\n | TypedArray\n | null\n ): {width: number; height: number} | null {\n if (!data) {\n return null;\n }\n if (ArrayBuffer.isView(data)) {\n return null;\n }\n // Recurse into arrays (array of miplevels)\n if (Array.isArray(data)) {\n return this.getTextureDataSize(data[0]);\n }\n if (this.device.isExternalImage(data)) {\n return this.device.getExternalImageSize(data);\n }\n if (data && typeof data === 'object' && data.constructor === Object) {\n const textureDataArray = Object.values(data);\n const untypedData = textureDataArray[0];\n return {width: untypedData.width, height: untypedData.height};\n }\n throw new Error('texture size deduction failed');\n }\n\n /** Convert luma.gl cubemap face constants to depth index */\n getCubeFaceDepth(face: TextureCubeFace): number {\n // prettier-ignore\n switch (face) {\n case '+X': return 0;\n case '-X': return 1;\n case '+Y': return 2;\n case '-Y': return 3;\n case '+Z': return 4;\n case '-Z': return 5;\n default: throw new Error(face);\n }\n }\n\n // EXPERIMENTAL\n\n setTextureData(data: TextureData) {}\n\n /** Experimental: Set multiple mip levels */\n _setTexture1DData(texture: Texture, data: Texture1DData): void {\n throw new Error('setTexture1DData not supported in WebGL.');\n }\n\n /** Experimental: Set multiple mip levels */\n _setTexture2DData(lodData: Texture2DData, depth = 0): void {\n if (!this.texture) {\n throw new Error('Texture not initialized');\n }\n\n const lodArray = this._normalizeTextureData(lodData);\n\n // If the user provides multiple LODs, then automatic mipmap\n // generation generateMipmap() should be disabled to avoid overwriting them.\n if (lodArray.length > 1 && this.props.mipmaps !== false) {\n log.warn(`Texture ${this.id} mipmap and multiple LODs.`)();\n }\n\n for (let mipLevel = 0; mipLevel < lodArray.length; mipLevel++) {\n const imageData = lodArray[mipLevel];\n if (this.device.isExternalImage(imageData)) {\n this.texture.copyExternalImage({image: imageData, depth, mipLevel, flipY: true});\n } else {\n this.texture.copyImageData({data: imageData.data /* , depth */, mipLevel});\n }\n }\n }\n\n /**\n * Experimental: Sets 3D texture data: multiple depth slices, multiple mip levels\n * @param data\n */\n _setTexture3DData(texture: Texture, data: Texture3DData): void {\n if (this.texture?.props.dimension !== '3d') {\n throw new Error(this.id);\n }\n for (let depth = 0; depth < data.length; depth++) {\n this._setTexture2DData(data[depth], depth);\n }\n }\n\n /**\n * Experimental: Set Cube texture data, multiple faces, multiple mip levels\n * @todo - could support TextureCubeArray with depth\n * @param data\n * @param index\n */\n _setTextureCubeData(texture: Texture, data: TextureCubeData): void {\n if (this.texture?.props.dimension !== 'cube') {\n throw new Error(this.id);\n }\n for (const [face, faceData] of Object.entries(data)) {\n const faceDepth = CubeFaces.indexOf(face as TextureCubeFace);\n this._setTexture2DData(faceData, faceDepth);\n }\n }\n\n /**\n * Experimental: Sets texture array data, multiple levels, multiple depth slices\n * @param data\n */\n _setTextureArrayData(texture: Texture, data: TextureArrayData): void {\n if (this.texture?.props.dimension !== '2d-array') {\n throw new Error(this.id);\n }\n for (let depth = 0; depth < data.length; depth++) {\n this._setTexture2DData(data[depth], depth);\n }\n }\n\n /**\n * Experimental: Sets texture cube array, multiple faces, multiple levels, multiple mip levels\n * @param data\n */\n _setTextureCubeArrayData(texture: Texture, data: TextureCubeArrayData): void {\n throw new Error('setTextureCubeArrayData not supported in WebGL2.');\n }\n\n /** Experimental */\n _setTextureCubeFaceData(\n texture: Texture,\n lodData: Texture2DData,\n face: TextureCubeFace,\n depth: number = 0\n ): void {\n // assert(this.props.dimension === 'cube');\n\n // If the user provides multiple LODs, then automatic mipmap\n // generation generateMipmap() should be disabled to avoid overwriting them.\n if (Array.isArray(lodData) && lodData.length > 1 && this.props.mipmaps !== false) {\n log.warn(`${this.id} has mipmap and multiple LODs.`)();\n }\n\n const faceDepth = TextureCubeFaces.indexOf(face);\n this._setTexture2DData(lodData, faceDepth);\n }\n\n /**\n * Normalize TextureData to an array of TextureImageData / ExternalImages\n * @param data\n * @param options\n * @returns array of TextureImageData / ExternalImages\n */\n _normalizeTextureData(data: Texture2DData): (TextureImageData | ExternalImage)[] {\n const options: {width: number; height: number; depth: number} = this.texture;\n let mipLevelArray: (TextureImageData | ExternalImage)[];\n if (ArrayBuffer.isView(data)) {\n mipLevelArray = [\n {\n // ts-expect-error does data really need to be Uint8ClampedArray?\n data,\n width: options.width,\n height: options.height\n // depth: options.depth\n }\n ];\n } else if (!Array.isArray(data)) {\n mipLevelArray = [data];\n } else {\n mipLevelArray = data;\n }\n return mipLevelArray;\n }\n\n static defaultProps: Required<AsyncTextureProps> = {\n ...Texture.defaultProps,\n data: null,\n mipmaps: false\n };\n}\n\n// TODO - Remove when texture refactor is complete\n\n/*\nsetCubeMapData(options: {\n width: number;\n height: number;\n data: Record<GL, Texture2DData> | Record<TextureCubeFace, Texture2DData>;\n format?: any;\n type?: any;\n /** @deprecated Use .data *\n pixels: any;\n}): void {\n const {gl} = this;\n\n const {width, height, pixels, data, format = GL.RGBA, type = GL.UNSIGNED_BYTE} = options;\n\n // pixel data (imageDataMap) is an Object from Face to Image or Promise.\n // For example:\n // {\n // GL.TEXTURE_CUBE_MAP_POSITIVE_X : Image-or-Promise,\n // GL.TEXTURE_CUBE_MAP_NEGATIVE_X : Image-or-Promise,\n // ... }\n // To provide multiple level-of-details (LODs) this can be Face to Array\n // of Image or Promise, like this\n // {\n // GL.TEXTURE_CUBE_MAP_POSITIVE_X : [Image-or-Promise-LOD-0, Image-or-Promise-LOD-1],\n // GL.TEXTURE_CUBE_MAP_NEGATIVE_X : [Image-or-Promise-LOD-0, Image-or-Promise-LOD-1],\n // ... }\n\n const imageDataMap = this._getImageDataMap(pixels || data);\n\n const resolvedFaces = WEBGLTexture.FACES.map(face => {\n const facePixels = imageDataMap[face];\n return Array.isArray(facePixels) ? facePixels : [facePixels];\n });\n this.bind();\n\n WEBGLTexture.FACES.forEach((face, index) => {\n if (resolvedFaces[index].length > 1 && this.props.mipmaps !== false) {\n // If the user provides multiple LODs, then automatic mipmap\n // generation generateMipmaps() should be disabled to avoid overwritting them.\n log.warn(`${this.id} has mipmap and multiple LODs.`)();\n }\n resolvedFaces[index].forEach((image, lodLevel) => {\n // TODO: adjust width & height for LOD!\n if (width && height) {\n gl.texImage2D(face, lodLevel, format, width, height, 0 /* border*, format, type, image);\n } else {\n gl.texImage2D(face, lodLevel, format, format, type, image);\n }\n });\n });\n\n this.unbind();\n}\n*/\n\n// HELPERS\n\n/** Resolve all promises in a nested data structure */\nasync function awaitAllPromises(x: any): Promise<any> {\n x = await x;\n if (Array.isArray(x)) {\n return await Promise.all(x.map(awaitAllPromises));\n }\n if (x && typeof x === 'object' && x.constructor === Object) {\n const object: Record<string, any> = x;\n const values = await Promise.all(Object.values(object));\n const keys = Object.keys(object);\n const resolvedObject: Record<string, any> = {};\n for (let i = 0; i < keys.length; i++) {\n resolvedObject[keys[i]] = values[i];\n }\n return resolvedObject;\n }\n return x;\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nlet pathPrefix = '';\n\n/**\n * Set a relative path prefix\n */\nexport function setPathPrefix(prefix: string) {\n pathPrefix = prefix;\n}\n\n/**\n * Loads ImageBitmap asynchronously. Respects setPathPrefix.\n * image.crossOrigin can be set via opts.crossOrigin, default to 'anonymous'\n * @returns a promise tracking the load\n */\nexport async function loadImageBitmap(\n url: string,\n opts?: {crossOrigin?: string} & ImageBitmapOptions\n): Promise<ImageBitmap> {\n const image = new Image();\n image.crossOrigin = opts?.crossOrigin || 'anonymous';\n image.src = url.startsWith('http') ? url : pathPrefix + url;\n await image.decode();\n return opts ? await createImageBitmap(image, opts) : await createImageBitmap(image);\n}\n\n/**\n * Loads image asynchronously. Respects setPathPrefix.\n * image.crossOrigin can be set via opts.crossOrigin, default to 'anonymous'\n * @returns a promise tracking the load\n * @deprecated Use `loadImageBitmap()` unless you are supporting old versions of Safari.\n */\nexport async function loadImage(\n url: string,\n opts?: {crossOrigin?: string}\n): Promise<HTMLImageElement> {\n return await new Promise((resolve, reject) => {\n try {\n const image = new Image();\n image.onload = () => resolve(image);\n image.onerror = () => reject(new Error(`Could not load image ${url}.`));\n image.crossOrigin = opts?.crossOrigin || 'anonymous';\n image.src = url.startsWith('http') ? url : pathPrefix + url;\n } catch (error) {\n reject(error);\n }\n });\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {Device, Buffer, BufferRange, TransformFeedback, RenderPassProps} from '@luma.gl/core';\nimport {getPassthroughFS} from '@luma.gl/shadertools';\nimport {Model} from '../model/model';\nimport type {ModelProps} from '../model/model';\n\n/**\n * Properties for creating a {@link BufferTransform}\n * @note Only works under WebGL2.\n */\nexport type BufferTransformProps = Omit<ModelProps, 'fs'> & {\n /** Optional fragment shader - normally not used in transforms */\n fs?: ModelProps['fs']; // override as optional\n /** A list of named outputs corresponding to shader declarations (varyings in WebGL) */\n outputs?: string[];\n /** @deprecated Use run({outputBuffers}) instead - Map of output buffers that the shaders will write results of computations to */\n feedbackBuffers?: Record<string, Buffer | BufferRange>;\n};\n\n/**\n * Manages a WebGL program (pipeline) for buffer\u2192buffer transforms.\n * @note Only works under WebGL2.\n */\nexport class BufferTransform {\n readonly device: Device;\n readonly model: Model;\n readonly transformFeedback: TransformFeedback;\n\n static defaultProps: Required<BufferTransformProps> = {\n ...Model.defaultProps,\n outputs: undefined!,\n feedbackBuffers: undefined!\n };\n\n static isSupported(device: Device): boolean {\n return device?.info?.type === 'webgl';\n }\n\n constructor(device: Device, props: BufferTransformProps = BufferTransform.defaultProps) {\n if (!BufferTransform.isSupported(device)) {\n throw new Error('BufferTransform not yet implemented on WebGPU');\n }\n\n this.device = device;\n\n this.model = new Model(this.device, {\n id: props.id || 'buffer-transform-model',\n fs: props.fs || getPassthroughFS(),\n topology: props.topology || 'point-list',\n varyings: props.outputs || props.varyings,\n ...props\n });\n\n this.transformFeedback = this.device.createTransformFeedback({\n layout: this.model.pipeline.shaderLayout,\n // @ts-expect-error TODO\n buffers: props.feedbackBuffers\n });\n\n this.model.setTransformFeedback(this.transformFeedback);\n\n Object.seal(this);\n }\n\n /** Destroy owned resources. */\n destroy(): void {\n if (this.model) {\n this.model.destroy();\n }\n }\n\n /** @deprecated Use {@link destroy}. */\n delete(): void {\n this.destroy();\n }\n\n /** Run one transform loop. */\n run(\n options?: RenderPassProps & {\n inputBuffers?: Record<string, Buffer>;\n outputBuffers?: Record<string, Buffer>;\n }\n ): void {\n if (options?.inputBuffers) {\n this.model.setAttributes(options.inputBuffers);\n }\n if (options?.outputBuffers) {\n this.transformFeedback.setBuffers(options.outputBuffers);\n }\n const renderPass = this.device.beginRenderPass(options);\n this.model.draw(renderPass);\n renderPass.end();\n }\n\n // DEPRECATED METHODS\n\n /** @deprecated App knows what buffers it is passing in - Returns the {@link Buffer} or {@link BufferRange} for given varying name. */\n getBuffer(varyingName: string): Buffer | BufferRange | null {\n return this.transformFeedback.getBuffer(varyingName);\n }\n\n /** @deprecated App knows what buffers it is passing in - Reads the {@link Buffer} or {@link BufferRange} for given varying name. */\n readAsync(varyingName: string): Promise<Uint8Array> {\n const result = this.getBuffer(varyingName);\n if (!result) {\n throw new Error('BufferTransform#getBuffer');\n }\n if (result instanceof Buffer) {\n return result.readAsync();\n }\n const {buffer, byteOffset = 0, byteLength = buffer.byteLength} = result;\n return buffer.readAsync(byteOffset, byteLength);\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {Buffer, Device, Framebuffer, RenderPassProps, Sampler, Texture} from '@luma.gl/core';\nimport {getPassthroughFS} from '@luma.gl/shadertools';\nimport {Model, ModelProps} from '../model/model';\nimport {uid} from '../utils/uid';\n\n/**\n * Properties for creating a {@link TextureTransform}\n */\nexport type TextureTransformProps = Omit<ModelProps, 'fs'> & {\n fs?: ModelProps['fs']; // override as optional\n /** @deprecated TODO(donmccurdy): Needed? */\n inject?: Record<string, string>;\n /** @deprecated TODO(donmccurdy): Needed? */\n framebuffer?: Framebuffer;\n /** @deprecated TODO(donmccurdy): Model already handles this? */\n sourceBuffers?: Record<string, Buffer>;\n /** @deprecated TODO(donmccurdy): Model already handles this? */\n sourceTextures?: Record<string, Texture>;\n targetTexture: Texture;\n targetTextureChannels: 1 | 2 | 3 | 4;\n targetTextureVarying: string;\n};\n\ntype TextureBinding = {\n sourceBuffers: Record<string, Buffer>;\n sourceTextures: Record<string, Texture>;\n targetTexture: Texture;\n framebuffer?: Framebuffer;\n};\n\nconst FS_OUTPUT_VARIABLE = 'transform_output';\n\n/**\n * Creates a pipeline for texture\u2192texture transforms.\n * @deprecated\n */\nexport class TextureTransform {\n readonly device: Device;\n readonly model: Model;\n readonly sampler: Sampler;\n\n currentIndex = 0;\n samplerTextureMap: Record<string, any> | null = null;\n bindings: TextureBinding[] = []; // each element is an object : {sourceTextures, targetTexture, framebuffer}\n resources: Record<string, any> = {}; // resources to be deleted\n\n constructor(device: Device, props: TextureTransformProps) {\n this.device = device;\n\n // For precise picking of element IDs.\n this.sampler = device.createSampler({\n addressModeU: 'clamp-to-edge',\n addressModeV: 'clamp-to-edge',\n minFilter: 'nearest',\n magFilter: 'nearest',\n mipmapFilter: 'nearest'\n });\n\n this.model = new Model(this.device, {\n id: props.id || uid('texture-transform-model'),\n fs:\n props.fs ||\n getPassthroughFS({\n input: props.targetTextureVarying,\n inputChannels: props.targetTextureChannels,\n output: FS_OUTPUT_VARIABLE\n }),\n vertexCount: props.vertexCount, // TODO(donmccurdy): Naming?\n ...props\n });\n\n this._initialize(props);\n Object.seal(this);\n }\n\n // Delete owned resources.\n destroy(): void {\n this.model.destroy();\n for (const binding of this.bindings) {\n binding.framebuffer?.destroy();\n }\n }\n\n /** @deprecated Use {@link destroy}. */\n delete(): void {\n this.destroy();\n }\n\n run(options?: RenderPassProps): void {\n const {framebuffer} = this.bindings[this.currentIndex];\n const renderPass = this.device.beginRenderPass({framebuffer, ...options});\n this.model.draw(renderPass);\n renderPass.end();\n this.device.submit();\n }\n\n getTargetTexture(): Texture {\n const {targetTexture} = this.bindings[this.currentIndex];\n return targetTexture;\n }\n\n getFramebuffer(): Framebuffer | undefined {\n const currentResources = this.bindings[this.currentIndex];\n return currentResources.framebuffer;\n }\n\n // Private\n\n _initialize(props: TextureTransformProps): void {\n this._updateBindings(props);\n }\n\n _updateBindings(props: TextureTransformProps) {\n this.bindings[this.currentIndex] = this._updateBinding(this.bindings[this.currentIndex], props);\n }\n\n _updateBinding(\n binding: TextureBinding,\n {sourceBuffers, sourceTextures, targetTexture}: TextureTransformProps\n ): TextureBinding {\n if (!binding) {\n binding = {\n sourceBuffers: {},\n sourceTextures: {},\n // @ts-expect-error\n targetTexture: null\n };\n }\n Object.assign(binding.sourceTextures, sourceTextures);\n Object.assign(binding.sourceBuffers, sourceBuffers);\n if (targetTexture) {\n binding.targetTexture = targetTexture;\n const {width, height} = targetTexture;\n // TODO(donmccurdy): When is this called, and is this expected?\n if (binding.framebuffer) {\n binding.framebuffer.destroy();\n }\n binding.framebuffer = this.device.createFramebuffer({\n id: 'transform-framebuffer',\n width,\n height,\n colorAttachments: [targetTexture]\n });\n binding.framebuffer.resize({width, height});\n }\n return binding;\n }\n\n // set texture filtering parameters on source textures.\n _setSourceTextureParameters(): void {\n const index = this.currentIndex;\n const {sourceTextures} = this.bindings[index];\n for (const name in sourceTextures) {\n sourceTextures[name].sampler = this.sampler;\n }\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {TypedArray} from '@math.gl/core';\nimport type {PrimitiveTopology} from '@luma.gl/core';\nimport {uid} from '../utils/uid';\n\nexport type GeometryProps = {\n id?: string;\n /** Determines how vertices are read from the 'vertex' attributes */\n topology: 'point-list' | 'line-list' | 'line-strip' | 'triangle-list' | 'triangle-strip';\n /** Auto calculated from attributes if not provided */\n vertexCount?: number;\n attributes: Record<string, GeometryAttribute | TypedArray>;\n indices?: GeometryAttribute | TypedArray;\n};\n\nexport type GeometryAttributes = {\n POSITION: GeometryAttribute;\n NORMAL: GeometryAttribute;\n TEXCOORD_0: GeometryAttribute;\n COLOR_0?: GeometryAttribute;\n indices?: GeometryAttribute & {size: 1; value: Uint32Array | Uint16Array};\n};\n\nexport type GeometryAttribute = {\n size?: number;\n value: TypedArray;\n [key: string]: any;\n};\n\nexport class Geometry {\n readonly id: string;\n /** Determines how vertices are read from the 'vertex' attributes */\n readonly topology?: PrimitiveTopology;\n readonly vertexCount: number;\n readonly indices?: GeometryAttribute;\n readonly attributes: {\n POSITION: GeometryAttribute;\n NORMAL: GeometryAttribute;\n TEXCOORD_0: GeometryAttribute;\n COLOR_0?: GeometryAttribute;\n [key: string]: GeometryAttribute | undefined;\n };\n\n userData: Record<string, unknown> = {};\n\n constructor(props: GeometryProps) {\n const {attributes = {}, indices = null, vertexCount = null} = props;\n\n this.id = props.id || uid('geometry');\n this.topology = props.topology;\n\n if (indices) {\n this.indices = ArrayBuffer.isView(indices) ? {value: indices, size: 1} : indices;\n }\n\n // @ts-expect-error\n this.attributes = {};\n\n for (const [attributeName, attributeValue] of Object.entries(attributes)) {\n // Wrap \"unwrapped\" arrays and try to autodetect their type\n const attribute: GeometryAttribute = ArrayBuffer.isView(attributeValue)\n ? {value: attributeValue}\n : attributeValue;\n\n if (!ArrayBuffer.isView(attribute.value)) {\n throw new Error(\n `${this._print(attributeName)}: must be typed array or object with value as typed array`\n );\n }\n\n if ((attributeName === 'POSITION' || attributeName === 'positions') && !attribute.size) {\n attribute.size = 3;\n }\n\n // Move indices to separate field\n if (attributeName === 'indices') {\n if (this.indices) {\n throw new Error('Multiple indices detected');\n }\n this.indices = attribute;\n } else {\n this.attributes[attributeName] = attribute;\n }\n }\n\n if (this.indices && this.indices['isIndexed'] !== undefined) {\n this.indices = Object.assign({}, this.indices);\n delete this.indices['isIndexed'];\n }\n\n this.vertexCount = vertexCount || this._calculateVertexCount(this.attributes, this.indices);\n }\n\n getVertexCount(): number {\n return this.vertexCount;\n }\n\n /**\n * Return an object with all attributes plus indices added as a field.\n * TODO Geometry types are a mess\n */\n getAttributes(): GeometryAttributes {\n // @ts-ignore\n return this.indices ? {indices: this.indices, ...this.attributes} : this.attributes;\n }\n\n // PRIVATE\n\n _print(attributeName: string): string {\n return `Geometry ${this.id} attribute ${attributeName}`;\n }\n\n /**\n * GeometryAttribute\n * value: typed array\n * type: indices, vertices, uvs\n * size: elements per vertex\n * target: WebGL buffer type (string or constant)\n *\n * @param attributes\n * @param indices\n * @returns\n */\n _setAttributes(attributes: Record<string, GeometryAttribute>, indices: any): this {\n return this;\n }\n\n _calculateVertexCount(attributes: GeometryAttributes, indices?: GeometryAttribute): number {\n if (indices) {\n return indices.value.length;\n }\n let vertexCount = Infinity;\n for (const attribute of Object.values(attributes)) {\n const {value, size, constant} = attribute;\n if (!constant && value && size !== undefined && size >= 1) {\n vertexCount = Math.min(vertexCount, value.length / size);\n }\n }\n\n // assert(Number.isFinite(vertexCount));\n return vertexCount;\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n// ClipSpace\nimport {Device} from '@luma.gl/core';\nimport {Model, ModelProps} from '../model/model';\nimport {Geometry} from '../geometry/geometry';\nimport {uid} from '../utils/uid';\n\nconst CLIPSPACE_VERTEX_SHADER_WGSL = /* wgsl */ `\\\nstruct VertexInputs {\n @location(0) clipSpacePosition: vec2<f32>,\n @location(1) texCoord: vec2<f32>,\n @location(2) coordinate: vec2<f32> \n}\n\nstruct FragmentInputs {\n @builtin(position) Position : vec4<f32>,\n @location(0) position : vec2<f32>,\n @location(1) coordinate : vec2<f32>,\n @location(2) uv : vec2<f32>\n};\n\n@vertex\nfn vertexMain(inputs: VertexInputs) -> FragmentInputs {\n var outputs: FragmentInputs;\n outputs.Position = vec4(inputs.clipSpacePosition, 0., 1.);\n outputs.position = inputs.clipSpacePosition;\n outputs.coordinate = inputs.coordinate;\n outputs.uv = inputs.texCoord;\n return outputs;\n}\n`;\n\nconst CLIPSPACE_VERTEX_SHADER = /* glsl */ `\\\n#version 300 es\nin vec2 clipSpacePositions;\nin vec2 texCoords;\nin vec2 coordinates;\n\nout vec2 position;\nout vec2 coordinate;\nout vec2 uv;\n\nvoid main(void) {\n gl_Position = vec4(clipSpacePositions, 0., 1.);\n position = clipSpacePositions;\n coordinate = coordinates;\n uv = texCoords;\n}\n`;\n\n/* eslint-disable indent, no-multi-spaces */\nconst POSITIONS = [-1, -1, 1, -1, -1, 1, 1, 1];\n\n/** Props for ClipSpace */\nexport type ClipSpaceProps = Omit<ModelProps, 'vs' | 'vertexCount' | 'geometry'>;\n\n/**\n * A flat geometry that covers the \"visible area\" that the GPU renders.\n */\nexport class ClipSpace extends Model {\n constructor(device: Device, props: ClipSpaceProps) {\n const TEX_COORDS = POSITIONS.map(coord => (coord === -1 ? 0 : coord));\n\n // For WGSL we need to append the supplied fragment shader to the default vertex shader source\n if (props.source) {\n props = {...props, source: `${CLIPSPACE_VERTEX_SHADER_WGSL}\\n${props.source}`};\n }\n\n super(device, {\n id: props.id || uid('clip-space'),\n ...props,\n vs: CLIPSPACE_VERTEX_SHADER,\n vertexCount: 4,\n geometry: new Geometry({\n topology: 'triangle-strip',\n vertexCount: 4,\n attributes: {\n clipSpacePositions: {size: 2, value: new Float32Array(POSITIONS)},\n texCoords: {size: 2, value: new Float32Array(TEX_COORDS)},\n coordinates: {size: 2, value: new Float32Array(TEX_COORDS)}\n }\n })\n });\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {Device, Texture} from '@luma.gl/core';\nimport {AsyncTexture} from '../async-texture/async-texture';\nimport {ClipSpace} from './clip-space';\n\nconst BACKGROUND_FS_WGSL = /* wgsl */ `\\\n@group(0) @binding(0) var backgroundTexture: texture_2d<f32>;\n@group(0) @binding(1) var backgroundTextureSampler: sampler;\n\nfn billboardTexture_getTextureUV(coordinates: vec2<f32>) -> vec2<f32> {\n\tlet iTexSize: vec2<u32> = textureDimensions(backgroundTexture, 0);\n\tlet texSize: vec2<f32> = vec2<f32>(f32(iTexSize.x), f32(iTexSize.y));\n\tvar position: vec2<f32> = coordinates.xy / texSize;\n\treturn position;\n} \n\n@fragment\nfn fragmentMain(inputs: FragmentInputs) -> @location(0) vec4<f32> {\n\tlet position: vec2<f32> = billboardTexture_getTextureUV(inputs.coordinate);\n\treturn textureSample(backgroundTexture, backgroundTextureSampler, position);\n}\n`;\n\nconst BACKGROUND_FS = /* glsl */ `\\\n#version 300 es\nprecision highp float;\n\nuniform sampler2D backgroundTexture;\nout vec4 fragColor;\n\nvec2 billboardTexture_getTextureUV() {\n ivec2 iTexSize = textureSize(backgroundTexture, 0);\n vec2 texSize = vec2(float(iTexSize.x), float(iTexSize.y));\n vec2 position = gl_FragCoord.xy / texSize;\n return position;\n}\n\nvoid main(void) {\n vec2 position = billboardTexture_getTextureUV();\n fragColor = texture(backgroundTexture, position);\n}\n`;\n\n/**\n * Props for a Model that renders a bitmap into the \"background\", i.e covering the screen\n */\nexport type BackgroundTextureModelProps = {\n /** id of this model */\n id?: string;\n /** The texture to render */\n backgroundTexture: Texture | AsyncTexture;\n /** If true, the texture is rendered into transparent areas of the screen only, i.e blended in where background alpha is small */\n blend?: boolean;\n};\n\n/**\n * Model that renders a bitmap into the \"background\", i.e covering the screen\n */\nexport class BackgroundTextureModel extends ClipSpace {\n constructor(device: Device, props: BackgroundTextureModelProps) {\n super(device, {\n id: props.id || 'background-texture-model',\n source: BACKGROUND_FS_WGSL,\n fs: BACKGROUND_FS,\n parameters: {\n depthWriteEnabled: false,\n ...(props.blend\n ? {\n blend: true,\n blendColorOperation: 'add',\n blendAlphaOperation: 'add',\n blendColorSrcFactor: 'one',\n blendColorDstFactor: 'one-minus-src',\n blendAlphaSrcFactor: 'one',\n blendAlphaDstFactor: 'one-minus-src-alpha'\n }\n : {})\n }\n });\n\n if (!props.backgroundTexture) {\n throw new Error('BackgroundTextureModel requires a backgroundTexture prop');\n }\n this.setTexture(props.backgroundTexture);\n }\n\n setTexture(backgroundTexture: Texture | AsyncTexture): void {\n this.setBindings({\n backgroundTexture\n });\n }\n\n override predraw(): void {\n this.shaderInputs.setProps({});\n super.predraw();\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {Vector3, Matrix4, NumericArray} from '@math.gl/core';\nimport {uid} from '../utils/uid';\n\n/** Properties for creating a new Scenegraph */\nexport type ScenegraphNodeProps = {\n id?: string;\n /** whether to display the object at all */\n display?: boolean;\n matrix?: NumericArray;\n position?: NumericArray;\n rotation?: NumericArray;\n scale?: NumericArray;\n update?: boolean;\n};\n\nexport class ScenegraphNode {\n readonly id: string;\n matrix: Matrix4 = new Matrix4();\n\n display = true;\n position = new Vector3();\n rotation = new Vector3();\n scale = new Vector3(1, 1, 1);\n userData: Record<string, unknown> = {};\n\n props: ScenegraphNodeProps = {};\n\n constructor(props: ScenegraphNodeProps = {}) {\n const {id} = props;\n\n this.id = id || uid(this.constructor.name);\n\n this._setScenegraphNodeProps(props);\n }\n\n getBounds(): [number[], number[]] | null {\n return null;\n }\n\n destroy(): void {}\n\n /** @deprecated use .destroy() */\n delete(): void {\n this.destroy();\n }\n setProps(props: ScenegraphNodeProps): this {\n this._setScenegraphNodeProps(props);\n return this;\n }\n\n toString(): string {\n return `{type: ScenegraphNode, id: ${this.id})}`;\n }\n\n setPosition(position: any): this {\n // assert(position.length === 3, 'setPosition requires vector argument');\n this.position = position;\n return this;\n }\n\n setRotation(rotation: any): this {\n // assert(rotation.length === 3, 'setRotation requires vector argument');\n this.rotation = rotation;\n return this;\n }\n\n setScale(scale: any): this {\n // assert(scale.length === 3, 'setScale requires vector argument');\n this.scale = scale;\n return this;\n }\n\n setMatrix(matrix: any, copyMatrix: boolean = true): void {\n if (copyMatrix) {\n this.matrix.copy(matrix);\n } else {\n this.matrix = matrix;\n }\n }\n\n setMatrixComponents(components: {\n position?: any;\n rotation?: any;\n scale?: any;\n update?: boolean;\n }): this {\n const {position, rotation, scale, update = true} = components;\n if (position) {\n this.setPosition(position);\n }\n if (rotation) {\n this.setRotation(rotation);\n }\n if (scale) {\n this.setScale(scale);\n }\n if (update) {\n this.updateMatrix();\n }\n return this;\n }\n\n updateMatrix(): this {\n const pos = this.position;\n const rot = this.rotation;\n const scale = this.scale;\n\n this.matrix.identity();\n this.matrix.translate(pos);\n this.matrix.rotateXYZ(rot);\n this.matrix.scale(scale);\n return this;\n }\n\n update(options: {position?: any; rotation?: any; scale?: any} = {}): this {\n const {position, rotation, scale} = options;\n if (position) {\n this.setPosition(position);\n }\n if (rotation) {\n this.setRotation(rotation);\n }\n if (scale) {\n this.setScale(scale);\n }\n this.updateMatrix();\n return this;\n }\n\n getCoordinateUniforms(\n viewMatrix: any,\n modelMatrix?: any\n ): {\n viewMatrix: any;\n modelMatrix: any;\n objectMatrix: any;\n worldMatrix: any;\n worldInverseMatrix: any;\n worldInverseTransposeMatrix: any;\n } {\n // TODO - solve multiple class problem\n // assert(viewMatrix instanceof Matrix4);\n // assert(viewMatrix);\n modelMatrix = modelMatrix || this.matrix;\n const worldMatrix = new Matrix4(viewMatrix).multiplyRight(modelMatrix);\n const worldInverse = worldMatrix.invert();\n const worldInverseTranspose = worldInverse.transpose();\n\n return {\n viewMatrix,\n modelMatrix,\n objectMatrix: modelMatrix,\n worldMatrix,\n worldInverseMatrix: worldInverse,\n worldInverseTransposeMatrix: worldInverseTranspose\n };\n }\n\n // TODO - copied code, not yet vetted\n /*\n transform() {\n if (!this.parent) {\n this.endPosition.set(this.position);\n this.endRotation.set(this.rotation);\n this.endScale.set(this.scale);\n } else {\n const parent = this.parent;\n this.endPosition.set(this.position.add(parent.endPosition));\n this.endRotation.set(this.rotation.add(parent.endRotation));\n this.endScale.set(this.scale.add(parent.endScale));\n }\n\n const ch = this.children;\n for (let i = 0; i < ch.length; ++i) {\n ch[i].transform();\n }\n\n return this;\n }\n */\n\n _setScenegraphNodeProps(props: ScenegraphNodeProps): void {\n // if ('display' in props) {\n // this.display = props.display;\n // }\n\n if ('position' in props) {\n this.setPosition(props.position);\n }\n if ('rotation' in props) {\n this.setRotation(props.rotation);\n }\n if ('scale' in props) {\n this.setScale(props.scale);\n }\n\n // Matrix overwrites other props\n if ('matrix' in props) {\n this.setMatrix(props.matrix);\n }\n\n Object.assign(this.props, props);\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {Matrix4, Vector3} from '@math.gl/core';\nimport {log} from '@luma.gl/core';\nimport {ScenegraphNode, ScenegraphNodeProps} from './scenegraph-node';\n\nexport type GroupNodeProps = ScenegraphNodeProps & {\n children?: ScenegraphNode[];\n};\n\nexport class GroupNode extends ScenegraphNode {\n children: ScenegraphNode[];\n\n constructor(children: ScenegraphNode[]);\n constructor(props?: GroupNodeProps);\n\n constructor(props: ScenegraphNode[] | GroupNodeProps = {}) {\n props = Array.isArray(props) ? {children: props} : props;\n const {children = []} = props;\n log.assert(\n children.every(child => child instanceof ScenegraphNode),\n 'every child must an instance of ScenegraphNode'\n );\n super(props);\n this.children = children;\n }\n\n override getBounds(): [number[], number[]] | null {\n const result: [number[], number[]] = [\n [Infinity, Infinity, Infinity],\n [-Infinity, -Infinity, -Infinity]\n ];\n\n this.traverse((node, {worldMatrix}) => {\n const bounds = node.getBounds();\n if (!bounds) {\n return;\n }\n const [min, max] = bounds;\n const center = new Vector3(min).add(max).divide([2, 2, 2]);\n worldMatrix.transformAsPoint(center, center);\n const halfSize = new Vector3(max).subtract(min).divide([2, 2, 2]);\n worldMatrix.transformAsVector(halfSize, halfSize);\n\n for (let v = 0; v < 8; v++) {\n // Test all 8 corners of the box\n const position = new Vector3(v & 0b001 ? -1 : 1, v & 0b010 ? -1 : 1, v & 0b100 ? -1 : 1)\n .multiply(halfSize)\n .add(center);\n\n for (let i = 0; i < 3; i++) {\n result[0][i] = Math.min(result[0][i], position[i]);\n result[1][i] = Math.max(result[1][i], position[i]);\n }\n }\n });\n if (!Number.isFinite(result[0][0])) {\n return null;\n }\n return result;\n }\n\n override destroy(): void {\n this.children.forEach(child => child.destroy());\n this.removeAll();\n super.destroy();\n }\n\n // Unpacks arrays and nested arrays of children\n add(...children: (ScenegraphNode | ScenegraphNode[])[]): this {\n for (const child of children) {\n if (Array.isArray(child)) {\n this.add(...child);\n } else {\n this.children.push(child);\n }\n }\n return this;\n }\n\n remove(child: ScenegraphNode): this {\n const children = this.children;\n const indexOf = children.indexOf(child);\n if (indexOf > -1) {\n children.splice(indexOf, 1);\n }\n return this;\n }\n\n removeAll(): this {\n this.children = [];\n return this;\n }\n\n traverse(\n visitor: (node: ScenegraphNode, context: {worldMatrix: Matrix4}) => void,\n {worldMatrix = new Matrix4()} = {}\n ) {\n const modelMatrix = new Matrix4(worldMatrix).multiplyRight(this.matrix);\n\n for (const child of this.children) {\n if (child instanceof GroupNode) {\n child.traverse(visitor, {worldMatrix: modelMatrix});\n } else {\n visitor(child, {worldMatrix: modelMatrix});\n }\n }\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {RenderPass} from '@luma.gl/core';\nimport {ScenegraphNode, ScenegraphNodeProps} from './scenegraph-node';\nimport {Model} from '../model/model';\n\nexport type ModelNodeProps = ScenegraphNodeProps & {\n model: Model;\n managedResources?: any[];\n bounds?: [number[], number[]];\n};\n\nexport class ModelNode extends ScenegraphNode {\n readonly model: Model;\n bounds: [number[], number[]] | null = null;\n managedResources: any[];\n\n // TODO - is this used? override callbacks to make sure we call them with this\n // onBeforeRender = null;\n // onAfterRender = null;\n // AfterRender = null;\n\n constructor(props: ModelNodeProps) {\n super(props);\n\n // Create new Model or used supplied Model\n this.model = props.model;\n this.managedResources = props.managedResources || [];\n this.bounds = props.bounds || null;\n this.setProps(props);\n }\n\n override destroy(): void {\n if (this.model) {\n this.model.destroy();\n // @ts-expect-error\n this.model = null;\n }\n this.managedResources.forEach(resource => resource.destroy());\n this.managedResources = [];\n }\n\n override getBounds(): [number[], number[]] | null {\n return this.bounds;\n }\n\n // Expose model methods\n draw(renderPass: RenderPass) {\n // Return value indicates if something was actually drawn\n return this.model.draw(renderPass);\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {Geometry} from '../geometry/geometry';\nimport {uid} from '../utils/uid';\n\nconst INDEX_OFFSETS = {\n x: [2, 0, 1],\n y: [0, 1, 2],\n z: [1, 2, 0]\n};\n\nexport type TruncatedConeGeometryProps = {\n topRadius?: number;\n bottomRadius?: number;\n topCap?: boolean;\n bottomCap?: boolean;\n height?: number;\n nradial?: number;\n nvertical?: number;\n verticalAxis?: 'x' | 'y' | 'z';\n};\n\n/**\n * Primitives inspired by TDL http://code.google.com/p/webglsamples/,\n * copyright 2011 Google Inc. new BSD License\n * (http://www.opensource.org/licenses/bsd-license.php).\n */\nexport class TruncatedConeGeometry extends Geometry {\n constructor(props: TruncatedConeGeometryProps & {id?: string; attributes?: any} = {}) {\n const {id = uid('truncated-code-geometry')} = props;\n const {indices, attributes} = tesselateTruncatedCone(props);\n super({\n ...props,\n id,\n topology: 'triangle-list',\n indices,\n attributes: {\n POSITION: {size: 3, value: attributes.POSITION},\n NORMAL: {size: 3, value: attributes.NORMAL},\n TEXCOORD_0: {size: 2, value: attributes.TEXCOORD_0},\n ...props.attributes\n }\n });\n }\n}\n\n/* eslint-disable max-statements, complexity */\nfunction tesselateTruncatedCone(props: TruncatedConeGeometryProps = {}) {\n const {\n bottomRadius = 0,\n topRadius = 0,\n height = 1,\n nradial = 10,\n nvertical = 10,\n verticalAxis = 'y',\n topCap = false,\n bottomCap = false\n } = props;\n\n const extra = (topCap ? 2 : 0) + (bottomCap ? 2 : 0);\n const numVertices = (nradial + 1) * (nvertical + 1 + extra);\n\n const slant = Math.atan2(bottomRadius - topRadius, height);\n const msin = Math.sin;\n const mcos = Math.cos;\n const mpi = Math.PI;\n const cosSlant = mcos(slant);\n const sinSlant = msin(slant);\n const start = topCap ? -2 : 0;\n const end = nvertical + (bottomCap ? 2 : 0);\n const vertsAroundEdge = nradial + 1;\n\n const indices = new Uint16Array(nradial * (nvertical + extra) * 6);\n const indexOffset = INDEX_OFFSETS[verticalAxis];\n\n const positions = new Float32Array(numVertices * 3);\n const normals = new Float32Array(numVertices * 3);\n const texCoords = new Float32Array(numVertices * 2);\n\n let i3 = 0;\n let i2 = 0;\n for (let i = start; i <= end; i++) {\n let v = i / nvertical;\n let y = height * v;\n let ringRadius;\n\n if (i < 0) {\n y = 0;\n v = 1;\n ringRadius = bottomRadius;\n } else if (i > nvertical) {\n y = height;\n v = 1;\n ringRadius = topRadius;\n } else {\n ringRadius = bottomRadius + (topRadius - bottomRadius) * (i / nvertical);\n }\n if (i === -2 || i === nvertical + 2) {\n ringRadius = 0;\n v = 0;\n }\n y -= height / 2;\n for (let j = 0; j < vertsAroundEdge; j++) {\n const sin = msin((j * mpi * 2) / nradial);\n const cos = mcos((j * mpi * 2) / nradial);\n\n positions[i3 + indexOffset[0]] = sin * ringRadius;\n positions[i3 + indexOffset[1]] = y;\n positions[i3 + indexOffset[2]] = cos * ringRadius;\n\n normals[i3 + indexOffset[0]] = i < 0 || i > nvertical ? 0 : sin * cosSlant;\n normals[i3 + indexOffset[1]] = i < 0 ? -1 : i > nvertical ? 1 : sinSlant;\n normals[i3 + indexOffset[2]] = i < 0 || i > nvertical ? 0 : cos * cosSlant;\n\n texCoords[i2 + 0] = j / nradial;\n texCoords[i2 + 1] = v;\n\n i2 += 2;\n i3 += 3;\n }\n }\n\n for (let i = 0; i < nvertical + extra; i++) {\n for (let j = 0; j < nradial; j++) {\n const index = (i * nradial + j) * 6;\n indices[index + 0] = vertsAroundEdge * (i + 0) + 0 + j;\n indices[index + 1] = vertsAroundEdge * (i + 0) + 1 + j;\n indices[index + 2] = vertsAroundEdge * (i + 1) + 1 + j;\n indices[index + 3] = vertsAroundEdge * (i + 0) + 0 + j;\n indices[index + 4] = vertsAroundEdge * (i + 1) + 1 + j;\n indices[index + 5] = vertsAroundEdge * (i + 1) + 0 + j;\n }\n }\n\n return {\n indices,\n attributes: {\n POSITION: positions,\n NORMAL: normals,\n TEXCOORD_0: texCoords\n }\n };\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {TruncatedConeGeometry} from './truncated-cone-geometry';\nimport {uid} from '../utils/uid';\n\nexport type ConeGeometryProps = {\n id?: string;\n radius?: number;\n cap?: boolean;\n};\n\nexport class ConeGeometry extends TruncatedConeGeometry {\n constructor(props: ConeGeometryProps = {}) {\n const {id = uid('cone-geometry'), radius = 1, cap = true} = props;\n super({\n ...props,\n id,\n topRadius: 0,\n topCap: Boolean(cap),\n bottomCap: Boolean(cap),\n bottomRadius: radius\n });\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {Geometry} from '../geometry/geometry';\nimport {uid} from '../utils/uid';\n// import type {GeometryType} from '../geometry/geometry-type';\n\nexport type CubeGeometryProps = {\n id?: string;\n indices?: boolean;\n attributes?: any;\n};\n\nexport class CubeGeometry extends Geometry {\n constructor(props: CubeGeometryProps = {}) {\n const {id = uid('cube-geometry'), indices = true} = props;\n super(\n indices\n ? {\n ...props,\n id,\n topology: 'triangle-list',\n indices: {size: 1, value: CUBE_INDICES},\n attributes: {...ATTRIBUTES, ...props.attributes}\n }\n : {\n ...props,\n id,\n topology: 'triangle-list',\n indices: undefined,\n attributes: {...NON_INDEXED_ATTRIBUTES, ...props.attributes}\n }\n );\n }\n}\n\n// prettier-ignore\nconst CUBE_INDICES = new Uint16Array([\n 0, 1, 2, 0, 2, 3, 4, 5, 6, 4, 6, 7, 8, 9, 10, 8, 10, 11, 12, 13,\n 14, 12, 14, 15, 16, 17, 18, 16, 18, 19, 20, 21, 22, 20, 22, 23\n]);\n\n// prettier-ignore\nconst CUBE_POSITIONS = new Float32Array([\n -1, -1, 1, 1, -1, 1, 1, 1, 1, -1, 1, 1,\n -1, -1, -1, -1, 1, -1, 1, 1, -1, 1, -1, -1,\n -1, 1, -1, -1, 1, 1, 1, 1, 1, 1, 1, -1,\n -1, -1, -1, 1, -1, -1, 1, -1, 1, -1, -1, 1,\n 1, -1, -1, 1, 1, -1, 1, 1, 1, 1, -1, 1,\n -1, -1, -1, -1, -1, 1, -1, 1, 1, -1, 1, -1\n]);\n\n// TODO - could be Uint8\n// prettier-ignore\nconst CUBE_NORMALS = new Float32Array([\n // Front face\n 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1,\n // Back face\n 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1,\n // Top face\n 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0,\n // Bottom face\n 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0,\n // Right face\n 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0,\n // Left face\n -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0\n]);\n\n// prettier-ignore\nconst CUBE_TEX_COORDS = new Float32Array([\n // Front face\n 0, 0, 1, 0, 1, 1, 0, 1,\n // Back face\n 1, 0, 1, 1, 0, 1, 0, 0,\n // Top face\n 0, 1, 0, 0, 1, 0, 1, 1,\n // Bottom face\n 1, 1, 0, 1, 0, 0, 1, 0,\n // Right face\n 1, 0, 1, 1, 0, 1, 0, 0,\n // Left face\n 0, 0, 1, 0, 1, 1, 0, 1\n]);\n\n// float4 position\n// prettier-ignore\nexport const CUBE_NON_INDEXED_POSITIONS = new Float32Array([\n 1, -1, 1,\n -1, -1, 1,\n -1, -1, -1,\n 1, -1, -1,\n 1, -1, 1,\n -1, -1, -1,\n\n 1, 1, 1,\n 1, -1, 1,\n 1, -1, -1,\n 1, 1, -1,\n 1, 1, 1,\n 1, -1, -1,\n\n -1, 1, 1,\n 1, 1, 1,\n 1, 1, -1,\n -1, 1, -1,\n -1, 1, 1,\n 1, 1, -1,\n\n -1, -1, 1,\n -1, 1, 1,\n -1, 1, -1,\n -1, -1, -1,\n -1, -1, 1,\n -1, 1, -1,\n\n 1, 1, 1,\n -1, 1, 1,\n -1, -1, 1,\n -1, -1, 1,\n 1, -1, 1,\n 1, 1, 1,\n\n 1, -1, -1,\n -1, -1, -1,\n -1, 1, -1,\n 1, 1, -1,\n 1, -1, -1,\n -1, 1, -1,\n]);\n\n// float2 uv,\n// prettier-ignore\nexport const CUBE_NON_INDEXED_TEX_COORDS = new Float32Array([\n 1, 1,\n 0, 1,\n 0, 0,\n 1, 0,\n 1, 1,\n 0, 0,\n\n 1, 1,\n 0, 1,\n 0, 0,\n 1, 0,\n 1, 1,\n 0, 0,\n\n 1, 1,\n 0, 1,\n 0, 0,\n 1, 0,\n 1, 1,\n 0, 0,\n\n 1, 1,\n 0, 1,\n 0, 0,\n 1, 0,\n 1, 1,\n 0, 0,\n\n 1, 1,\n 0, 1,\n 0, 0,\n 0, 0,\n 1, 0,\n 1, 1,\n\n 1, 1,\n 0, 1,\n 0, 0,\n 1, 0,\n 1, 1,\n 0, 0,\n]);\n\n// float4 color\n// prettier-ignore\nexport const CUBE_NON_INDEXED_COLORS = new Float32Array([\n 1, 0, 1, 1,\n 0, 0, 1, 1,\n 0, 0, 0, 1,\n 1, 0, 0, 1,\n 1, 0, 1, 1,\n 0, 0, 0, 1,\n\n 1, 1, 1, 1,\n 1, 0, 1, 1,\n 1, 0, 0, 1,\n 1, 1, 0, 1,\n 1, 1, 1, 1,\n 1, 0, 0, 1,\n\n 0, 1, 1, 1,\n 1, 1, 1, 1,\n 1, 1, 0, 1,\n 0, 1, 0, 1,\n 0, 1, 1, 1,\n 1, 1, 0, 1,\n\n 0, 0, 1, 1,\n 0, 1, 1, 1,\n 0, 1, 0, 1,\n 0, 0, 0, 1,\n 0, 0, 1, 1,\n 0, 1, 0, 1,\n\n 1, 1, 1, 1,\n 0, 1, 1, 1,\n 0, 0, 1, 1,\n 0, 0, 1, 1,\n 1, 0, 1, 1,\n 1, 1, 1, 1,\n\n 1, 0, 0, 1,\n 0, 0, 0, 1,\n 0, 1, 0, 1,\n 1, 1, 0, 1,\n 1, 0, 0, 1,\n 0, 1, 0, 1,\n]);\n\nconst ATTRIBUTES = {\n POSITION: {size: 3, value: CUBE_POSITIONS},\n NORMAL: {size: 3, value: CUBE_NORMALS},\n TEXCOORD_0: {size: 2, value: CUBE_TEX_COORDS}\n};\n\nconst NON_INDEXED_ATTRIBUTES = {\n POSITION: {size: 3, value: CUBE_NON_INDEXED_POSITIONS},\n // NORMAL: {size: 3, value: CUBE_NON_INDEXED_NORMALS},\n TEXCOORD_0: {size: 2, value: CUBE_NON_INDEXED_TEX_COORDS},\n COLOR_0: {size: 3, value: CUBE_NON_INDEXED_COLORS}\n};\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {TruncatedConeGeometry} from './truncated-cone-geometry';\nimport {uid} from '../utils/uid';\n\nexport type CylinderGeometryProps = {\n id?: string;\n radius?: number;\n attributes?: any;\n};\n\nexport class CylinderGeometry extends TruncatedConeGeometry {\n constructor(props: CylinderGeometryProps = {}) {\n const {id = uid('cylinder-geometry'), radius = 1} = props;\n super({\n ...props,\n id,\n bottomRadius: radius,\n topRadius: radius\n });\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {Vector3} from '@math.gl/core';\nimport {Geometry} from '../geometry/geometry';\nimport {uid} from '../utils/uid';\n\n/* eslint-disable comma-spacing, max-statements, complexity */\n\nconst ICO_POSITIONS = [-1, 0, 0, 0, 1, 0, 0, 0, -1, 0, 0, 1, 0, -1, 0, 1, 0, 0];\nconst ICO_INDICES = [3, 4, 5, 3, 5, 1, 3, 1, 0, 3, 0, 4, 4, 0, 2, 4, 2, 5, 2, 0, 1, 5, 2, 1];\n\nexport type IcoSphereGeometryProps = {\n id?: string;\n radius?: number;\n iterations?: number;\n attributes?: any;\n};\n\nexport class IcoSphereGeometry extends Geometry {\n constructor(props: IcoSphereGeometryProps = {}) {\n const {id = uid('ico-sphere-geometry')} = props;\n const {indices, attributes} = tesselateIcosaHedron(props);\n super({\n ...props,\n id,\n topology: 'triangle-list',\n indices,\n attributes: {...attributes, ...props.attributes}\n });\n }\n}\n\nfunction tesselateIcosaHedron(props: IcoSphereGeometryProps) {\n const {iterations = 0} = props;\n\n const PI = Math.PI;\n const PI2 = PI * 2;\n\n const positions = [...ICO_POSITIONS];\n let indices = [...ICO_INDICES];\n\n positions.push();\n indices.push();\n\n const getMiddlePoint = (() => {\n const pointMemo: Record<string, number> = {};\n\n return (i1: number, i2: number) => {\n i1 *= 3;\n i2 *= 3;\n const mini = i1 < i2 ? i1 : i2;\n const maxi = i1 > i2 ? i1 : i2;\n const key = `${mini}|${maxi}`;\n\n if (key in pointMemo) {\n return pointMemo[key];\n }\n\n const x1 = positions[i1];\n const y1 = positions[i1 + 1];\n const z1 = positions[i1 + 2];\n const x2 = positions[i2];\n const y2 = positions[i2 + 1];\n const z2 = positions[i2 + 2];\n let xm = (x1 + x2) / 2;\n let ym = (y1 + y2) / 2;\n let zm = (z1 + z2) / 2;\n const len = Math.sqrt(xm * xm + ym * ym + zm * zm);\n\n xm /= len;\n ym /= len;\n zm /= len;\n\n positions.push(xm, ym, zm);\n\n return (pointMemo[key] = positions.length / 3 - 1);\n };\n })();\n\n for (let i = 0; i < iterations; i++) {\n const indices2: number[] = [];\n for (let j = 0; j < indices.length; j += 3) {\n const a = getMiddlePoint(indices[j + 0], indices[j + 1]);\n const b = getMiddlePoint(indices[j + 1], indices[j + 2]);\n const c = getMiddlePoint(indices[j + 2], indices[j + 0]);\n\n indices2.push(c, indices[j + 0], a, a, indices[j + 1], b, b, indices[j + 2], c, a, b, c);\n }\n indices = indices2;\n }\n\n // Calculate texCoords and normals\n const normals = new Array(positions.length);\n const texCoords = new Array((positions.length / 3) * 2);\n\n const l = indices.length;\n for (let i = l - 3; i >= 0; i -= 3) {\n const i1 = indices[i + 0];\n const i2 = indices[i + 1];\n const i3 = indices[i + 2];\n const in1 = i1 * 3;\n const in2 = i2 * 3;\n const in3 = i3 * 3;\n const iu1 = i1 * 2;\n const iu2 = i2 * 2;\n const iu3 = i3 * 2;\n const x1 = positions[in1 + 0];\n const y1 = positions[in1 + 1];\n const z1 = positions[in1 + 2];\n const theta1 = Math.acos(z1 / Math.sqrt(x1 * x1 + y1 * y1 + z1 * z1));\n const phi1 = Math.atan2(y1, x1) + PI;\n const v1 = theta1 / PI;\n const u1 = 1 - phi1 / PI2;\n const x2 = positions[in2 + 0];\n const y2 = positions[in2 + 1];\n const z2 = positions[in2 + 2];\n const theta2 = Math.acos(z2 / Math.sqrt(x2 * x2 + y2 * y2 + z2 * z2));\n const phi2 = Math.atan2(y2, x2) + PI;\n const v2 = theta2 / PI;\n const u2 = 1 - phi2 / PI2;\n const x3 = positions[in3 + 0];\n const y3 = positions[in3 + 1];\n const z3 = positions[in3 + 2];\n const theta3 = Math.acos(z3 / Math.sqrt(x3 * x3 + y3 * y3 + z3 * z3));\n const phi3 = Math.atan2(y3, x3) + PI;\n const v3 = theta3 / PI;\n const u3 = 1 - phi3 / PI2;\n const vec1 = [x3 - x2, y3 - y2, z3 - z2];\n const vec2 = [x1 - x2, y1 - y2, z1 - z2];\n const normal = new Vector3(vec1).cross(vec2).normalize();\n let newIndex;\n\n if (\n (u1 === 0 || u2 === 0 || u3 === 0) &&\n (u1 === 0 || u1 > 0.5) &&\n (u2 === 0 || u2 > 0.5) &&\n (u3 === 0 || u3 > 0.5)\n ) {\n positions.push(positions[in1 + 0], positions[in1 + 1], positions[in1 + 2]);\n newIndex = positions.length / 3 - 1;\n indices.push(newIndex);\n texCoords[newIndex * 2 + 0] = 1;\n texCoords[newIndex * 2 + 1] = v1;\n normals[newIndex * 3 + 0] = normal.x;\n normals[newIndex * 3 + 1] = normal.y;\n normals[newIndex * 3 + 2] = normal.z;\n\n positions.push(positions[in2 + 0], positions[in2 + 1], positions[in2 + 2]);\n newIndex = positions.length / 3 - 1;\n indices.push(newIndex);\n texCoords[newIndex * 2 + 0] = 1;\n texCoords[newIndex * 2 + 1] = v2;\n normals[newIndex * 3 + 0] = normal.x;\n normals[newIndex * 3 + 1] = normal.y;\n normals[newIndex * 3 + 2] = normal.z;\n\n positions.push(positions[in3 + 0], positions[in3 + 1], positions[in3 + 2]);\n newIndex = positions.length / 3 - 1;\n indices.push(newIndex);\n texCoords[newIndex * 2 + 0] = 1;\n texCoords[newIndex * 2 + 1] = v3;\n normals[newIndex * 3 + 0] = normal.x;\n normals[newIndex * 3 + 1] = normal.y;\n normals[newIndex * 3 + 2] = normal.z;\n }\n\n normals[in1 + 0] = normals[in2 + 0] = normals[in3 + 0] = normal.x;\n normals[in1 + 1] = normals[in2 + 1] = normals[in3 + 1] = normal.y;\n normals[in1 + 2] = normals[in2 + 2] = normals[in3 + 2] = normal.z;\n\n texCoords[iu1 + 0] = u1;\n texCoords[iu1 + 1] = v1;\n\n texCoords[iu2 + 0] = u2;\n texCoords[iu2 + 1] = v2;\n\n texCoords[iu3 + 0] = u3;\n texCoords[iu3 + 1] = v3;\n }\n\n return {\n indices: {size: 1, value: new Uint16Array(indices)},\n attributes: {\n POSITION: {size: 3, value: new Float32Array(positions)},\n NORMAL: {size: 3, value: new Float32Array(normals)},\n TEXCOORD_0: {size: 2, value: new Float32Array(texCoords)}\n }\n };\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nexport function unpackIndexedGeometry(geometry: any) {\n const {indices, attributes} = geometry;\n if (!indices) {\n return geometry;\n }\n\n const vertexCount = indices.value.length;\n const unpackedAttributes: Record<string, any> = {};\n\n for (const attributeName in attributes) {\n const attribute = attributes[attributeName];\n const {constant, value, size} = attribute;\n if (constant || !size) {\n continue; // eslint-disable-line\n }\n const unpackedValue = new value.constructor(vertexCount * size);\n for (let x = 0; x < vertexCount; ++x) {\n const index = indices.value[x];\n for (let i = 0; i < size; i++) {\n unpackedValue[x * size + i] = value[index * size + i];\n }\n }\n unpackedAttributes[attributeName] = {size, value: unpackedValue};\n }\n\n return {\n attributes: Object.assign({}, attributes, unpackedAttributes)\n };\n}\n\n// export function calculateVertexNormals(positions: Float32Array): Uint8Array {\n// let normals = new Uint8Array(positions.length / 3);\n\n// for (let i = 0; i < positions.length; i++) {\n// const vec1 = new Vector3(positions.subarray(i * 3, i + 0, i + 3));\n// const vec2 = new Vector3(positions.subarray(i + 3, i + 6));\n// const vec3 = new Vector3(positions.subarray(i + 6, i + 9));\n\n// const normal = new Vector3(vec1).cross(vec2).normalize();\n// normals.set(normal[0], i + 4);\n// normals.set(normal[1], i + 4 + 1);\n// normals.set(normal[2], i + 2);\n// }\n// const normal = new Vector3(vec1).cross(vec2).normalize();\n// }\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {Geometry} from '../geometry/geometry';\nimport {unpackIndexedGeometry} from '../geometry/geometry-utils';\nimport {uid} from '../utils/uid';\n\nexport type PlaneGeometryProps = {\n id?: string;\n radius?: number;\n attributes?: any;\n};\n\n// Primitives inspired by TDL http://code.google.com/p/webglsamples/,\n// copyright 2011 Google Inc. new BSD License\n// (http://www.opensource.org/licenses/bsd-license.php).\nexport class PlaneGeometry extends Geometry {\n constructor(props: PlaneGeometryProps = {}) {\n const {id = uid('plane-geometry')} = props;\n\n const {indices, attributes} = tesselatePlane(props);\n super({\n ...props,\n id,\n topology: 'triangle-list',\n indices,\n attributes: {...attributes, ...props.attributes}\n });\n }\n}\n\n/* eslint-disable complexity, max-statements */\nfunction tesselatePlane(props: any) {\n const {type = 'x,y', offset = 0, flipCull = false, unpack = false} = props;\n\n const coords = type.split(',');\n // width, height\n let c1len = props[`${coords[0]}len`] || 1;\n const c2len = props[`${coords[1]}len`] || 1;\n // subdivisionsWidth, subdivisionsDepth\n const subdivisions1 = props[`n${coords[0]}`] || 1;\n const subdivisions2 = props[`n${coords[1]}`] || 1;\n const numVertices = (subdivisions1 + 1) * (subdivisions2 + 1);\n\n const positions = new Float32Array(numVertices * 3);\n const normals = new Float32Array(numVertices * 3);\n const texCoords = new Float32Array(numVertices * 2);\n\n if (flipCull) {\n c1len = -c1len;\n }\n\n let i2 = 0;\n let i3 = 0;\n for (let z = 0; z <= subdivisions2; z++) {\n for (let x = 0; x <= subdivisions1; x++) {\n const u = x / subdivisions1;\n const v = z / subdivisions2;\n texCoords[i2 + 0] = flipCull ? 1 - u : u;\n texCoords[i2 + 1] = v;\n\n switch (type) {\n case 'x,y':\n positions[i3 + 0] = c1len * u - c1len * 0.5;\n positions[i3 + 1] = c2len * v - c2len * 0.5;\n positions[i3 + 2] = offset;\n\n normals[i3 + 0] = 0;\n normals[i3 + 1] = 0;\n normals[i3 + 2] = flipCull ? 1 : -1;\n break;\n\n case 'x,z':\n positions[i3 + 0] = c1len * u - c1len * 0.5;\n positions[i3 + 1] = offset;\n positions[i3 + 2] = c2len * v - c2len * 0.5;\n\n normals[i3 + 0] = 0;\n normals[i3 + 1] = flipCull ? 1 : -1;\n normals[i3 + 2] = 0;\n break;\n\n case 'y,z':\n positions[i3 + 0] = offset;\n positions[i3 + 1] = c1len * u - c1len * 0.5;\n positions[i3 + 2] = c2len * v - c2len * 0.5;\n\n normals[i3 + 0] = flipCull ? 1 : -1;\n normals[i3 + 1] = 0;\n normals[i3 + 2] = 0;\n break;\n\n default:\n throw new Error('PlaneGeometry: unknown type');\n }\n\n i2 += 2;\n i3 += 3;\n }\n }\n\n const numVertsAcross = subdivisions1 + 1;\n const indices = new Uint16Array(subdivisions1 * subdivisions2 * 6);\n\n for (let z = 0; z < subdivisions2; z++) {\n for (let x = 0; x < subdivisions1; x++) {\n const index = (z * subdivisions1 + x) * 6;\n // Make triangle 1 of quad.\n indices[index + 0] = (z + 0) * numVertsAcross + x;\n indices[index + 1] = (z + 1) * numVertsAcross + x;\n indices[index + 2] = (z + 0) * numVertsAcross + x + 1;\n\n // Make triangle 2 of quad.\n indices[index + 3] = (z + 1) * numVertsAcross + x;\n indices[index + 4] = (z + 1) * numVertsAcross + x + 1;\n indices[index + 5] = (z + 0) * numVertsAcross + x + 1;\n }\n }\n\n const geometry = {\n indices: {size: 1, value: indices},\n attributes: {\n POSITION: {size: 3, value: positions},\n NORMAL: {size: 3, value: normals},\n TEXCOORD_0: {size: 2, value: texCoords}\n }\n };\n\n // Optionally, unpack indexed geometry\n return unpack ? unpackIndexedGeometry(geometry) : geometry;\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {Geometry} from '../geometry/geometry';\nimport {uid} from '../utils/uid';\n\nexport type SphereGeometryProps = {\n id?: string;\n radius?: number;\n nlat?: number;\n nlong?: number;\n attributes?: any;\n};\n\n// Primitives inspired by TDL http://code.google.com/p/webglsamples/,\n// copyright 2011 Google Inc. new BSD License\n// (http://www.opensource.org/licenses/bsd-license.php).\nexport class SphereGeometry extends Geometry {\n constructor(props: SphereGeometryProps = {}) {\n const {id = uid('sphere-geometry')} = props;\n const {indices, attributes} = tesselateSphere(props);\n super({\n ...props,\n id,\n topology: 'triangle-list',\n indices,\n attributes: {...attributes, ...props.attributes}\n });\n }\n}\n\n/* eslint-disable max-statements, complexity */\nfunction tesselateSphere(props: SphereGeometryProps) {\n const {nlat = 10, nlong = 10} = props;\n\n const startLat = 0;\n const endLat = Math.PI;\n const latRange = endLat - startLat;\n const startLong = 0;\n const endLong = 2 * Math.PI;\n const longRange = endLong - startLong;\n const numVertices = (nlat + 1) * (nlong + 1);\n\n const radius = (n1: number, n2: number, n3: number, u: number, v: number) => props.radius || 1;\n\n const positions = new Float32Array(numVertices * 3);\n const normals = new Float32Array(numVertices * 3);\n const texCoords = new Float32Array(numVertices * 2);\n\n const IndexType = numVertices > 0xffff ? Uint32Array : Uint16Array;\n const indices = new IndexType(nlat * nlong * 6);\n\n // Create positions, normals and texCoords\n for (let y = 0; y <= nlat; y++) {\n for (let x = 0; x <= nlong; x++) {\n const u = x / nlong;\n const v = y / nlat;\n\n const index = x + y * (nlong + 1);\n const i2 = index * 2;\n const i3 = index * 3;\n\n const theta = longRange * u;\n const phi = latRange * v;\n const sinTheta = Math.sin(theta);\n const cosTheta = Math.cos(theta);\n const sinPhi = Math.sin(phi);\n const cosPhi = Math.cos(phi);\n const ux = cosTheta * sinPhi;\n const uy = cosPhi;\n const uz = sinTheta * sinPhi;\n\n const r = radius(ux, uy, uz, u, v);\n\n positions[i3 + 0] = r * ux;\n positions[i3 + 1] = r * uy;\n positions[i3 + 2] = r * uz;\n\n normals[i3 + 0] = ux;\n normals[i3 + 1] = uy;\n normals[i3 + 2] = uz;\n\n texCoords[i2 + 0] = u;\n texCoords[i2 + 1] = 1 - v;\n }\n }\n\n // Create indices\n const numVertsAround = nlong + 1;\n for (let x = 0; x < nlong; x++) {\n for (let y = 0; y < nlat; y++) {\n const index = (x * nlat + y) * 6;\n\n indices[index + 0] = y * numVertsAround + x;\n indices[index + 1] = y * numVertsAround + x + 1;\n indices[index + 2] = (y + 1) * numVertsAround + x;\n\n indices[index + 3] = (y + 1) * numVertsAround + x;\n indices[index + 4] = y * numVertsAround + x + 1;\n indices[index + 5] = (y + 1) * numVertsAround + x + 1;\n }\n }\n\n return {\n indices: {size: 1, value: indices},\n attributes: {\n POSITION: {size: 3, value: positions},\n NORMAL: {size: 3, value: normals},\n TEXCOORD_0: {size: 2, value: texCoords}\n }\n };\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n/** Creates a deterministic pseudorandom number generator */\nexport function makeRandomGenerator(): () => number {\n let s = 1;\n let c = 1;\n return () => {\n s = Math.sin(c * 17.23);\n c = Math.cos(s * 27.92);\n return fract(Math.abs(s * c) * 1432.71);\n };\n}\n\nfunction fract(n: number): number {\n return n - Math.floor(n);\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {Device, RenderPass, Texture} from '@luma.gl/core';\nimport type {ShaderPass} from '@luma.gl/shadertools';\nimport {initializeShaderModule} from '@luma.gl/shadertools';\nimport {ShaderInputs} from '../shader-inputs';\nimport {AsyncTexture} from '../async-texture/async-texture';\nimport {ClipSpace} from '../models/clip-space';\nimport {SwapFramebuffers} from '../compute/swap';\nimport {BackgroundTextureModel} from '../models/billboard-texture-model';\n\nimport {getFragmentShaderForRenderPass} from './get-fragment-shader';\n\ntype ShaderSubPass = NonNullable<ShaderPass['passes']>[0];\n\n/** Props for ShaderPassRenderer */\nexport type ShaderPassRendererProps = {\n /** List of ShaderPasses to apply to the sourceTexture */\n shaderPasses: ShaderPass[];\n /** Optional typed ShaderInputs object for setting uniforms */\n shaderInputs: ShaderInputs;\n};\n\n/** A pass that renders a given texture into screen space */\nexport class ShaderPassRenderer {\n device: Device;\n shaderInputs: ShaderInputs;\n passRenderers: PassRenderer[];\n swapFramebuffers: SwapFramebuffers;\n /** For rendering to the screen */\n clipSpace: ClipSpace;\n textureModel: BackgroundTextureModel;\n\n constructor(device: Device, props: ShaderPassRendererProps) {\n this.device = device;\n\n props.shaderPasses.map(shaderPass => initializeShaderModule(shaderPass));\n\n const modules = props.shaderPasses.reduce(\n (object, shaderPass) => ({...object, [shaderPass.name]: shaderPass}),\n {}\n );\n this.shaderInputs = props.shaderInputs || new ShaderInputs(modules);\n\n const size = device.getCanvasContext().getDrawingBufferSize();\n this.swapFramebuffers = new SwapFramebuffers(device, {\n colorAttachments: [device.preferredColorFormat],\n width: size[0],\n height: size[1]\n });\n\n this.textureModel = new BackgroundTextureModel(device, {\n backgroundTexture: this.swapFramebuffers.current.colorAttachments[0].texture\n });\n\n this.clipSpace = new ClipSpace(device, {\n source: /* wgsl */ `\\\n @group(0) @binding(0) var sourceTexture: texture_2d<f32>;\n @group(0) @binding(1) var sourceTextureSampler: sampler;\n\n@fragment\nfn fragmentMain(inputs: FragmentInputs) -> @location(0) vec4<f32> {\n\tlet texCoord: vec2<f32> = inputs.coordinate;\n\treturn textureSample(sourceTexture, sourceTextureSampler, texCoord);\n}\n`,\n\n fs: /* glsl */ `\\\n#version 300 es\n\nuniform sampler2D sourceTexture;\nin vec2 uv;\nin vec2 coordinate;\nout vec4 fragColor;\n\nvoid main() {\n vec2 texCoord = coordinate;\n fragColor = texture(sourceTexture, coordinate);\n}\n`\n });\n\n this.passRenderers = props.shaderPasses.map(shaderPass => new PassRenderer(device, shaderPass));\n }\n\n /** Destroys resources created by this ShaderPassRenderer */\n destroy() {\n for (const subPassRenderer of this.passRenderers) {\n subPassRenderer.destroy();\n }\n this.swapFramebuffers.destroy();\n this.clipSpace.destroy();\n }\n\n resize(width: number, height: number): void {\n this.swapFramebuffers.resize({width, height});\n // this.props.passes.forEach(pass => pass.resize(width, height));\n }\n\n renderToScreen(options: {sourceTexture: AsyncTexture; uniforms?: any; bindings?: any}): boolean {\n // Run the shader passes and generate an output texture\n const outputTexture = this.renderToTexture(options);\n if (!outputTexture) {\n // source texture not yet loaded\n return false;\n }\n\n const framebuffer = this.device\n .getDefaultCanvasContext()\n // @ts-expect-error TODO - remove after republish\n .getCurrentFramebuffer({depthStencilAttachment: false});\n const renderPass = this.device.beginRenderPass({\n id: 'shader-pass-renderer-to-screen',\n framebuffer,\n clearColor: [0, 0, 0, 1],\n clearDepth: 1\n });\n this.clipSpace.setBindings({sourceTexture: outputTexture});\n this.clipSpace.draw(renderPass);\n renderPass.end();\n return true;\n }\n\n /** Runs the shaderPasses in sequence on the sourceTexture and returns a texture with the results.\n * @returns null if the the sourceTexture has not yet been loaded\n */\n renderToTexture(options: {\n sourceTexture: AsyncTexture;\n uniforms?: any;\n bindings?: any;\n }): Texture | null {\n const {sourceTexture} = options;\n if (!sourceTexture.isReady) {\n return null;\n }\n\n this.textureModel.destroy();\n this.textureModel = new BackgroundTextureModel(this.device, {\n backgroundTexture: sourceTexture\n });\n\n // Clear the current texture before we begin\n const clearTexturePass = this.device.beginRenderPass({\n id: 'shader-pass-renderer-clear-texture',\n framebuffer: this.swapFramebuffers.current,\n clearColor: [0, 0, 0, 1]\n });\n this.textureModel.draw(clearTexturePass);\n clearTexturePass.end();\n\n // const commandEncoder = this.device.createCommandEncoder();\n // commandEncoder.copyTextureToTexture({\n // sourceTexture: sourceTexture.texture,\n // destinationTexture: this.swapFramebuffers.current.colorAttachments[0].texture\n // });\n // commandEncoder.finish();\n\n let first = true;\n for (const passRenderer of this.passRenderers) {\n for (const subPassRenderer of passRenderer.subPassRenderers) {\n if (!first) {\n this.swapFramebuffers.swap();\n }\n first = false;\n\n const swapBufferTexture = this.swapFramebuffers.current.colorAttachments[0].texture;\n\n const bindings = {\n sourceTexture: swapBufferTexture\n // texSize: [sourceTextures.width, sourceTextures.height]\n };\n\n const renderPass = this.device.beginRenderPass({\n id: 'shader-pass-renderer-run-pass',\n framebuffer: this.swapFramebuffers.next,\n clearColor: [0, 0, 0, 1],\n clearDepth: 1\n });\n subPassRenderer.render({renderPass, bindings});\n renderPass.end();\n }\n }\n\n this.swapFramebuffers.swap();\n const outputTexture = this.swapFramebuffers.current.colorAttachments[0].texture;\n return outputTexture;\n }\n}\n\n/** renders one ShaderPass */\nclass PassRenderer {\n shaderPass: ShaderPass;\n subPassRenderers: SubPassRenderer[];\n\n constructor(device: Device, shaderPass: ShaderPass, props = {}) {\n this.shaderPass = shaderPass;\n // const id = `${shaderPass.name}-pass`;\n\n const subPasses = shaderPass.passes || [];\n // normalizePasses(gl, module, id, props);\n\n this.subPassRenderers = subPasses.map(subPass => {\n // const idn = `${id}-${subPasses.length + 1}`;\n return new SubPassRenderer(device, shaderPass, subPass);\n });\n }\n\n destroy() {\n for (const subPassRenderer of this.subPassRenderers) {\n subPassRenderer.destroy();\n }\n }\n}\n\n/** Renders one subpass of a ShaderPass */\nclass SubPassRenderer {\n model: ClipSpace;\n shaderPass: ShaderPass;\n subPass: ShaderSubPass;\n\n constructor(device: Device, shaderPass: ShaderPass, subPass: ShaderSubPass) {\n this.shaderPass = shaderPass;\n this.subPass = subPass;\n const action =\n subPass.action || (subPass.filter && 'filter') || (subPass.sampler && 'sample') || 'filter';\n const fs = getFragmentShaderForRenderPass({\n shaderPass,\n action,\n shadingLanguage: device.info.shadingLanguage\n });\n\n this.model = new ClipSpace(device, {\n id: `${shaderPass.name}-subpass`,\n source: fs,\n fs,\n modules: [shaderPass],\n parameters: {\n depthWriteEnabled: false\n }\n });\n }\n\n destroy() {\n this.model.destroy();\n }\n\n render(options: {renderPass: RenderPass; bindings: any}): void {\n const {renderPass, bindings} = options;\n\n this.model.shaderInputs.setProps({\n [this.shaderPass.name]: this.shaderPass.uniforms || {}\n });\n this.model.shaderInputs.setProps({\n [this.shaderPass.name]: this.subPass.uniforms || {}\n });\n // this.model.setBindings(this.subPass.bindings || {});\n this.model.setBindings(bindings || {});\n this.model.draw(renderPass);\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {BufferProps, FramebufferProps} from '@luma.gl/core';\nimport {Device, Resource, Buffer, Framebuffer, Texture} from '@luma.gl/core';\n\n/**\n * Helper class for working with repeated transformations / computations\n * Primarily intended for GPU buffers `Swap<Buffer>` or textures `Swap<Texture>`)\n * @note the two resources are expected to be structurally identical (same size, length, format, etc)\n * @note the two resources can be destroyed by calling `destroy()`\n */\nexport class Swap<T extends Resource<any>> {\n /** The current resource - usually the source for renders or computations */\n current: T;\n /** The next resource - usually the target/destination for transforms / computations */\n next: T;\n\n constructor(props: {current: T; next: T}) {\n this.current = props.current;\n this.next = props.next;\n }\n\n /** Destroys the two managed resources */\n destroy() {\n this.current?.destroy();\n this.next?.destroy();\n }\n\n /** Make the next resource into the current resource, and reuse the current resource as the next resource */\n swap() {\n const current = this.current;\n this.current = this.next;\n this.next = current;\n }\n}\n\n/** Helper for managing double-buffered framebuffers */\nexport class SwapFramebuffers extends Swap<Framebuffer> {\n constructor(device: Device, props: FramebufferProps) {\n props = {...props};\n\n let colorAttachments = props.colorAttachments?.map(colorAttachment =>\n typeof colorAttachment !== 'string'\n ? colorAttachment\n : device.createTexture({\n format: colorAttachment,\n usage: Texture.SAMPLE | Texture.RENDER | Texture.COPY_SRC | Texture.COPY_DST,\n width: 1,\n height: 1\n })\n );\n\n const current = device.createFramebuffer({...props, colorAttachments});\n\n colorAttachments = props.colorAttachments?.map(colorAttachment =>\n typeof colorAttachment !== 'string'\n ? colorAttachment\n : device.createTexture({\n format: colorAttachment,\n usage:\n Texture.TEXTURE | Texture.COPY_SRC | Texture.COPY_DST | Texture.RENDER_ATTACHMENT,\n width: 1,\n height: 1\n })\n );\n\n const next = device.createFramebuffer({...props, colorAttachments});\n\n super({current, next});\n }\n\n /**\n * Resizes the Framebuffers.\n * @returns true if the size changed, otherwise exiting framebuffers were preserved\n * @note any contents are not preserved!\n */\n resize(size: {width: number; height: number}): boolean {\n if (size.width === this.current.width && size.height === this.current.height) {\n return false;\n }\n const {current, next} = this;\n\n this.current = current.clone(size);\n current.destroy();\n\n this.next = next.clone(size);\n next.destroy();\n\n return true;\n }\n}\n\n/** Helper for managing double-buffered GPU buffers */\nexport class SwapBuffers extends Swap<Buffer> {\n constructor(device: Device, props: BufferProps) {\n super({current: device.createBuffer(props), next: device.createBuffer(props)});\n }\n\n /**\n * Resizes the Buffers.\n * @returns true if the size changed, otherwise exiting buffers were preserved.\n * @note any contents are not preserved!\n */\n resize(props: {byteLength: number}) {\n if (props.byteLength === this.current.byteLength) {\n return false;\n }\n\n const {current, next} = this;\n\n this.current = current.clone(props);\n current.destroy();\n\n this.next = next.clone(props);\n next.destroy();\n\n return true;\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {ShaderPass} from '@luma.gl/shadertools';\n\n/**\n * Gets fragment shader source for a shader pass sub pass\n * @param options\n * @returns\n */\nexport function getFragmentShaderForRenderPass(options: {\n shaderPass: ShaderPass;\n action: 'filter' | 'sample';\n shadingLanguage: 'wgsl' | 'glsl';\n}): string {\n const {shaderPass, action, shadingLanguage} = options;\n switch (action) {\n case 'filter':\n const filterFunc = `${shaderPass.name}_filterColor_ext`;\n return shadingLanguage === 'wgsl'\n ? getFilterShaderWGSL(filterFunc)\n : getFilterShaderGLSL(filterFunc);\n\n case 'sample':\n const samplerFunc = `${shaderPass.name}_sampleColor`;\n return shadingLanguage === 'wgsl'\n ? getSamplerShaderWGSL(samplerFunc)\n : getSamplerShaderGLSL(samplerFunc);\n\n default:\n throw new Error(`${shaderPass.name} no fragment shader generated for shader pass`);\n }\n}\n\n/** Get a filtering WGSL fragment shader */\nfunction getFilterShaderWGSL(func: string) {\n return /* wgsl */ `\\\n// Binding 0:1 is reserved for shader passes\n// @group(0) @binding(0) var<uniform> brightnessContrast : brightnessContrastUniforms;\n@group(0) @binding(1) var texture: texture_2d<f32>;\n@group(0) @binding(2) var sampler: sampler;\n\nstruct FragmentInputs {\n @location(0) fragUV: vec2f,\n @location(1) fragPosition: vec4f,\n @location(2) fragCoordinate: vec4f\n};\n\n@fragment\nfn fragmentMain(inputs: FragmentInputs) -> @location(0) vec4f {\n let texSize = textureDimensions(texture, 0);\n var fragColor = textureSample(texture, sampler, fragUV);\n fragColor = ${func}(gl_FragColor, texSize, texCoord);\n return fragColor;\n}\n`;\n}\n\n/** Get a sampling WGSL fragment shader */\nfunction getSamplerShaderWGSL(func: string) {\n return /* wgsl */ `\\\n// Binding 0:1 is reserved for shader passes\n@group(0) @binding(0) var<uniform> brightnessContrast : brightnessContrastUniforms;\n@group(0) @binding(1) var texture: texture_2d<f32>;\n@group(0) @binding(2) var sampler: sampler;\n\nstruct FragmentInputs = {\n @location(0) fragUV: vec2f,\n @location(1) fragPosition: vec4f,\n @location(2) fragCoordinate: vec4f\n};\n\n@fragment\nfn fragmentMain(inputs: FragmentInputs) -> @location(0) vec4f {\n let texSize = textureDimensions(texture, 0);\n var fragColor = textureSample(texture, sampler, fragUV);\n fragColor = ${func}(gl_FragColor, texSize, texCoord);\n return fragColor;\n}\n`;\n}\n\n/** Get a filtering GLSL fragment shader */\nfunction getFilterShaderGLSL(func: string) {\n return /* glsl */ `\\\n#version 300 es\n\nuniform sampler2D sourceTexture;\n\nin vec2 position;\nin vec2 coordinate;\nin vec2 uv;\n\nout vec4 fragColor;\n\nvoid main() {\n vec2 texCoord = coordinate;\n ivec2 iTexSize = textureSize(sourceTexture, 0);\n vec2 texSize = vec2(float(iTexSize.x), float(iTexSize.y));\n\n fragColor = texture(sourceTexture, texCoord);\n fragColor = ${func}(fragColor, texSize, texCoord);\n}\n`;\n}\n\n/** Get a sampling GLSL fragment shader */\nfunction getSamplerShaderGLSL(func: string) {\n return /* glsl */ `\\\n#version 300 es\n\nuniform sampler2D sourceTexture;\n\nin vec2 position;\nin vec2 coordinate;\nin vec2 uv;\n\nout vec4 fragColor;\n\nvoid main() {\n vec2 texCoord = coordinate;\n ivec2 iTexSize = textureSize(sourceTexture, 0);\n vec2 texSize = vec2(float(iTexSize.x), float(iTexSize.y));\n\n fragColor = ${func}(sourceTexture, texSize, texCoord);\n}\n`;\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {DeviceFeature, ComputePipelineProps, Shader, Binding} from '@luma.gl/core';\nimport {\n Device,\n Buffer,\n ComputePipeline,\n ComputePass,\n UniformStore,\n log,\n getTypedArrayConstructor\n} from '@luma.gl/core';\nimport type {ShaderModule, PlatformInfo} from '@luma.gl/shadertools';\nimport {ShaderAssembler, getShaderLayoutFromWGSL} from '@luma.gl/shadertools';\nimport {TypedArray, isNumericArray} from '@math.gl/types';\nimport {ShaderInputs} from '../shader-inputs';\nimport {PipelineFactory} from '../factories/pipeline-factory';\nimport {ShaderFactory} from '../factories/shader-factory';\nimport {uid} from '../utils/uid';\n// import {getDebugTableForShaderLayout} from '../debug/debug-shader-layout';\n\nconst LOG_DRAW_PRIORITY = 2;\nconst LOG_DRAW_TIMEOUT = 10000;\n\nexport type ComputationProps = Omit<ComputePipelineProps, 'shader'> & {\n source?: string;\n\n /** shadertool shader modules (added to shader code) */\n modules?: ShaderModule[];\n /** Shadertool module defines (configures shader code)*/\n defines?: Record<string, boolean>;\n // TODO - injections, hooks etc?\n\n /** Shader inputs, used to generated uniform buffers and bindings */\n shaderInputs?: ShaderInputs;\n\n /** Bindings */\n bindings?: Record<string, Binding>;\n\n /** Show shader source in browser? */\n debugShaders?: 'never' | 'errors' | 'warnings' | 'always';\n\n /** Factory used to create a {@link ComputePipeline}. Defaults to {@link Device} default factory. */\n pipelineFactory?: PipelineFactory;\n /** Factory used to create a {@link Shader}. Defaults to {@link Device} default factory. */\n shaderFactory?: ShaderFactory;\n /** Shader assembler. Defaults to the ShaderAssembler.getShaderAssembler() */\n shaderAssembler?: ShaderAssembler;\n};\n\n/**\n * v9 Model API\n * A model\n * - automatically reuses pipelines (programs) when possible\n * - automatically rebuilds pipelines if necessary to accommodate changed settings\n * shadertools integration\n * - accepts modules and performs shader transpilation\n */\nexport class Computation {\n static defaultProps: Required<ComputationProps> = {\n ...ComputePipeline.defaultProps,\n id: 'unnamed',\n handle: undefined,\n userData: {},\n\n source: '',\n modules: [],\n defines: {},\n\n bindings: undefined!,\n shaderInputs: undefined!,\n\n pipelineFactory: undefined!,\n shaderFactory: undefined!,\n shaderAssembler: ShaderAssembler.getDefaultShaderAssembler(),\n\n debugShaders: undefined!\n };\n\n readonly device: Device;\n readonly id: string;\n\n readonly pipelineFactory: PipelineFactory;\n readonly shaderFactory: ShaderFactory;\n\n userData: {[key: string]: any} = {};\n\n /** Bindings (textures, samplers, uniform buffers) */\n bindings: Record<string, Binding> = {};\n\n /** The underlying GPU pipeline. */\n pipeline: ComputePipeline;\n /** Assembled compute shader source */\n source: string;\n /** the underlying compiled compute shader */\n // @ts-ignore Set in function called from constructor\n shader: Shader;\n\n /** ShaderInputs instance */\n shaderInputs: ShaderInputs;\n\n // @ts-ignore Set in function called from constructor\n _uniformStore: UniformStore;\n\n _pipelineNeedsUpdate: string | false = 'newly created';\n\n private _getModuleUniforms: (props?: Record<string, Record<string, any>>) => Record<string, any>;\n private props: Required<ComputationProps>;\n\n private _destroyed = false;\n\n constructor(device: Device, props: ComputationProps) {\n if (device.type !== 'webgpu') {\n throw new Error('Computation is only supported in WebGPU');\n }\n\n this.props = {...Computation.defaultProps, ...props};\n props = this.props;\n this.id = props.id || uid('model');\n this.device = device;\n\n Object.assign(this.userData, props.userData);\n\n // Setup shader module inputs\n const moduleMap = Object.fromEntries(\n this.props.modules?.map(module => [module.name, module]) || []\n );\n // @ts-ignore TODO - fix up typing?\n this.shaderInputs = props.shaderInputs || new ShaderInputs(moduleMap);\n this.setShaderInputs(this.shaderInputs);\n\n // Support WGSL shader layout introspection\n // TODO - Don't modify props!!\n this.props.shaderLayout ||= getShaderLayoutFromWGSL(this.props.source);\n\n // Setup shader assembler\n const platformInfo = getPlatformInfo(device);\n\n // Extract modules from shader inputs if not supplied\n const modules =\n (this.props.modules?.length > 0 ? this.props.modules : this.shaderInputs?.getModules()) || [];\n\n this.pipelineFactory =\n props.pipelineFactory || PipelineFactory.getDefaultPipelineFactory(this.device);\n this.shaderFactory = props.shaderFactory || ShaderFactory.getDefaultShaderFactory(this.device);\n\n const {source, getUniforms} = this.props.shaderAssembler.assembleWGSLShader({\n platformInfo,\n ...this.props,\n modules\n });\n\n this.source = source;\n // @ts-ignore\n this._getModuleUniforms = getUniforms;\n\n // Create the pipeline\n // @note order is important\n this.pipeline = this._updatePipeline();\n\n // Apply any dynamic settings that will not trigger pipeline change\n if (props.bindings) {\n this.setBindings(props.bindings);\n }\n\n // Catch any access to non-standard props\n Object.seal(this);\n }\n\n destroy(): void {\n if (this._destroyed) return;\n this.pipelineFactory.release(this.pipeline);\n this.shaderFactory.release(this.shader);\n this._uniformStore.destroy();\n this._destroyed = true;\n }\n\n // Draw call\n\n predraw() {\n // Update uniform buffers if needed\n this.updateShaderInputs();\n }\n\n dispatch(computePass: ComputePass, x: number, y?: number, z?: number): void {\n try {\n this._logDrawCallStart();\n\n // Check if the pipeline is invalidated\n // TODO - this is likely the worst place to do this from performance perspective. Perhaps add a predraw()?\n this.pipeline = this._updatePipeline();\n\n // Set pipeline state, we may be sharing a pipeline so we need to set all state on every draw\n // Any caching needs to be done inside the pipeline functions\n this.pipeline.setBindings(this.bindings);\n computePass.setPipeline(this.pipeline);\n // @ts-expect-error\n computePass.setBindings([]);\n\n computePass.dispatch(x, y, z);\n } finally {\n this._logDrawCallEnd();\n }\n }\n\n // Update fixed fields (can trigger pipeline rebuild)\n\n // Update dynamic fields\n\n /**\n * Updates the vertex count (used in draw calls)\n * @note Any attributes with stepMode=vertex need to be at least this big\n */\n setVertexCount(vertexCount: number): void {\n // this.vertexCount = vertexCount;\n }\n\n /**\n * Updates the instance count (used in draw calls)\n * @note Any attributes with stepMode=instance need to be at least this big\n */\n setInstanceCount(instanceCount: number): void {\n // this.instanceCount = instanceCount;\n }\n\n setShaderInputs(shaderInputs: ShaderInputs): void {\n this.shaderInputs = shaderInputs;\n this._uniformStore = new UniformStore(this.shaderInputs.modules);\n // Create uniform buffer bindings for all modules\n for (const moduleName of Object.keys(this.shaderInputs.modules)) {\n const uniformBuffer = this._uniformStore.getManagedUniformBuffer(this.device, moduleName);\n this.bindings[`${moduleName}Uniforms`] = uniformBuffer;\n }\n }\n\n /**\n * Updates shader module settings (which results in uniforms being set)\n */\n setShaderModuleProps(props: Record<string, any>): void {\n const uniforms = this._getModuleUniforms(props);\n\n // Extract textures & framebuffers set by the modules\n // TODO better way to extract bindings\n const keys = Object.keys(uniforms).filter(k => {\n const uniform = uniforms[k];\n return (\n !isNumericArray(uniform) && typeof uniform !== 'number' && typeof uniform !== 'boolean'\n );\n });\n const bindings: Record<string, Binding> = {};\n for (const k of keys) {\n bindings[k] = uniforms[k];\n delete uniforms[k];\n }\n }\n\n updateShaderInputs(): void {\n this._uniformStore.setUniforms(this.shaderInputs.getUniformValues());\n }\n\n /**\n * Sets bindings (textures, samplers, uniform buffers)\n */\n setBindings(bindings: Record<string, Binding>): void {\n Object.assign(this.bindings, bindings);\n }\n\n _setPipelineNeedsUpdate(reason: string): void {\n this._pipelineNeedsUpdate = this._pipelineNeedsUpdate || reason;\n }\n\n _updatePipeline(): ComputePipeline {\n if (this._pipelineNeedsUpdate) {\n let prevShader: Shader | null = null;\n if (this.pipeline) {\n log.log(\n 1,\n `Model ${this.id}: Recreating pipeline because \"${this._pipelineNeedsUpdate}\".`\n )();\n prevShader = this.shader;\n }\n\n this._pipelineNeedsUpdate = false;\n\n this.shader = this.shaderFactory.createShader({\n id: `${this.id}-fragment`,\n stage: 'compute',\n source: this.source,\n debugShaders: this.props.debugShaders\n });\n\n this.pipeline = this.pipelineFactory.createComputePipeline({\n ...this.props,\n shader: this.shader\n });\n\n if (prevShader) {\n this.shaderFactory.release(prevShader);\n }\n }\n return this.pipeline;\n }\n\n /** Throttle draw call logging */\n _lastLogTime = 0;\n _logOpen = false;\n\n _logDrawCallStart(): void {\n // IF level is 4 or higher, log every frame.\n const logDrawTimeout = log.level > 3 ? 0 : LOG_DRAW_TIMEOUT;\n if (log.level < 2 || Date.now() - this._lastLogTime < logDrawTimeout) {\n return;\n }\n\n this._lastLogTime = Date.now();\n this._logOpen = true;\n\n log.group(LOG_DRAW_PRIORITY, `>>> DRAWING MODEL ${this.id}`, {collapsed: log.level <= 2})();\n }\n\n _logDrawCallEnd(): void {\n if (this._logOpen) {\n // const shaderLayoutTable = getDebugTableForShaderLayout(this.pipeline.props.shaderLayout, this.id);\n\n // log.table(logLevel, attributeTable)();\n // log.table(logLevel, uniformTable)();\n // log.table(LOG_DRAW_PRIORITY, shaderLayoutTable)();\n\n const uniformTable = this.shaderInputs.getDebugTable();\n log.table(LOG_DRAW_PRIORITY, uniformTable)();\n\n log.groupEnd(LOG_DRAW_PRIORITY)();\n this._logOpen = false;\n }\n }\n\n protected _drawCount = 0;\n\n // TODO - fix typing of luma data types\n _getBufferOrConstantValues(attribute: Buffer | TypedArray, dataType: any): string {\n const TypedArrayConstructor = getTypedArrayConstructor(dataType);\n const typedArray =\n attribute instanceof Buffer ? new TypedArrayConstructor(attribute.debugData) : attribute;\n return typedArray.toString();\n }\n}\n\n/** Create a shadertools platform info from the Device */\nexport function getPlatformInfo(device: Device): PlatformInfo {\n return {\n type: device.type,\n shaderLanguage: device.info.shadingLanguage,\n shaderLanguageVersion: device.info.shadingLanguageVersion as 100 | 300,\n gpu: device.info.gpu,\n // HACK - we pretend that the DeviceFeatures is a Set, it has a similar API\n features: device.features as unknown as Set<DeviceFeature>\n };\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {NumberArray4} from '@math.gl/types';\nimport type {ShaderModule} from '@luma.gl/shadertools';\n\n/** Default color for auto highlight, a cyan color */\nconst DEFAULT_HIGHLIGHT_COLOR: NumberArray4 = [0, 1, 1, 1];\n\nexport const INVALID_INDEX = -1;\n\n/**\n * Props for the picking module, which depending on mode renders picking colors or highlighted item.\n * When active, renders picking colors, assumed to be rendered to off-screen \"picking\" buffer.\n * When inactive, renders normal colors, with the exception of selected object which is rendered with highlight\n * can distinguish between 2^32 different objects in each of 2^32 different batches.\n */\nexport type PickingProps = {\n /** Are we picking? I.e. rendering picking colors? */\n isActive?: boolean;\n /** Whether to use instance_index (built-in) or a custom application supplied index (usually from an attribute) */\n indexMode?: 'instance' | 'custom';\n /** Batch index (used when rendering multiple models to identify which model was picked), defaults to 0 */\n batchIndex?: number;\n\n /** Index of the highlighted batch, defaults to 0 */\n highlightedBatchIndex?: number | null;\n /** Set an index to highlight that item, or `null` to explicitly clear **/\n highlightedObjectIndex?: number | null;\n /** Color of visual highlight of \"selected\" item () */\n highlightColor?: NumberArray4;\n};\n\n/**\n * Uniforms for the picking module, which renders picking colors and highlighted item.\n * When active, renders picking colors, assumed to be rendered to off-screen \"picking\" buffer.\n * When inactive, renders normal colors, with the exception of selected object which is rendered with highlight\n */\nexport type PickingUniforms = {\n /**\n * When true, renders picking colors. Set when rendering to off-screen \"picking\" buffer.\n * When false, renders normal colors, with the exception of selected object which is rendered with highlight\n */\n isActive: boolean;\n /** Set to true when picking an attribute value instead of object index */\n indexMode: 0 | 1;\n /** Index of batch currently being rendered */\n batchIndex: number;\n\n /** Do we have a highlighted item? */\n isHighlightActive: boolean;\n /** Color of visual highlight of \"selected\" item. Note: RGBA components must in the range 0-1 */\n highlightColor: NumberArray4;\n /** Indicates which batch to visually highlight an item in (defaults to 0) */\n highlightedBatchIndex: number;\n /** Indicates which index in the batch to highlight an item in */\n highlightedObjectIndex: number;\n};\n\nexport type PickingBindings = {};\n\n// GLSL_UNIFORMS\n\nconst uniformTypes: Required<ShaderModule<PickingProps, PickingUniforms>>['uniformTypes'] = {\n isActive: 'i32',\n indexMode: 'i32',\n batchIndex: 'i32',\n\n isHighlightActive: 'i32',\n highlightedBatchIndex: 'i32',\n highlightedObjectIndex: 'i32',\n highlightColor: 'vec4<f32>'\n};\n\nexport const GLSL_UNIFORMS = /* glsl */ `\\\nprecision highp float;\nprecision highp int;\n\nuniform pickingUniforms {\n int isActive;\n int indexMode;\n int batchIndex;\n\n int isHighlightActive;\n int highlightedBatchIndex;\n int highlightedObjectIndex;\n vec4 highlightColor;\n} picking;\n`;\n\nexport const WGSL_UNIFORMS = /* wgsl */ `\\\nstruct pickingUniforms {\n isActive: int32;\n indexMode: int32;\n batchIndex: int32;\n\n isHighlightActive: int32;\n highlightedBatchIndex: int32;\n highlightedObjectIndex: int32;\n highlightColor: vec4<f32>;\n} picking;\n`;\n\nfunction getUniforms(props: PickingProps = {}, prevUniforms?: PickingUniforms): PickingUniforms {\n const uniforms = {...prevUniforms} as PickingUniforms;\n\n // picking\n if (props.isActive !== undefined) {\n uniforms.isActive = Boolean(props.isActive);\n }\n\n switch (props.indexMode) {\n case 'instance':\n uniforms.indexMode = 0;\n break;\n case 'custom':\n uniforms.indexMode = 1;\n break;\n case undefined:\n // no change\n break;\n }\n\n switch (props.highlightedObjectIndex) {\n case undefined:\n // Unless highlightedObjectColor explicitly null or set, do not update state\n break;\n case null:\n // Clear highlight\n uniforms.isHighlightActive = false;\n uniforms.highlightedObjectIndex = INVALID_INDEX;\n break;\n default:\n uniforms.isHighlightActive = true;\n uniforms.highlightedObjectIndex = props.highlightedObjectIndex;\n }\n\n if (typeof props.highlightedBatchIndex === 'number') {\n uniforms.highlightedBatchIndex = props.highlightedBatchIndex;\n }\n\n if (props.highlightColor) {\n uniforms.highlightColor = props.highlightColor;\n }\n\n return uniforms;\n}\n\n/**\n * Provides support for color-based picking and highlighting.\n *\n * In particular, supports picking a specific instance in an instanced\n * draw call and highlighting an instance based on its picking color,\n * and correspondingly, supports picking and highlighting groups of\n * primitives with the same picking color in non-instanced draw-calls\n *\n * @note Color based picking has the significant advantage in that it can be added to any\n * existing shader without requiring any additional picking logic.\n */\nexport const pickingUniforms = {\n props: {} as PickingProps,\n uniforms: {} as PickingUniforms,\n\n name: 'picking',\n\n uniformTypes,\n defaultUniforms: {\n isActive: false,\n indexMode: 0,\n batchIndex: 0,\n isHighlightActive: true,\n highlightedBatchIndex: INVALID_INDEX,\n highlightedObjectIndex: INVALID_INDEX,\n highlightColor: DEFAULT_HIGHLIGHT_COLOR\n },\n\n getUniforms\n} as const satisfies ShaderModule<PickingProps, PickingUniforms, PickingBindings>;\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {Device, Framebuffer} from '@luma.gl/core';\nimport {ShaderInputs} from '../../shader-inputs';\nimport {pickingUniforms, INVALID_INDEX} from './picking-uniforms';\n// import {picking} from './color-picking';\n\n/** Information about picked object */\nexport type PickInfo = {\n batchIndex: number | null;\n objectIndex: number | null;\n};\n\nexport type PickingManagerProps = {\n /** Shader Inputs from models to pick */\n shaderInputs?: ShaderInputs<{picking: typeof pickingUniforms.props}>;\n /** Callback */\n onObjectPicked?: (info: PickInfo) => void;\n};\n\n/**\n * Helper class for using the new picking module\n * @todo Port to WebGPU\n * @todo Support multiple models\n * @todo Switching picking module\n */\nexport class PickingManager {\n device: Device;\n props: Required<PickingManagerProps>;\n /** Info from latest pick operation */\n pickInfo: PickInfo = {batchIndex: null, objectIndex: null};\n /** Framebuffer used for picking */\n framebuffer: Framebuffer | null = null;\n\n static defaultProps: Required<PickingManagerProps> = {\n shaderInputs: undefined!,\n onObjectPicked: () => {}\n };\n\n constructor(device: Device, props: PickingManagerProps) {\n this.device = device;\n this.props = {...PickingManager.defaultProps, ...props};\n }\n\n destroy() {\n this.framebuffer?.destroy();\n }\n\n // TODO - Ask for a cached framebuffer? a Framebuffer factory?\n getFramebuffer() {\n if (!this.framebuffer) {\n this.framebuffer = this.device.createFramebuffer({\n colorAttachments: ['rgba8unorm', 'rg32sint'],\n depthStencilAttachment: 'depth24plus'\n });\n }\n return this.framebuffer;\n }\n\n /** Clear highlighted / picked object */\n clearPickState() {\n this.props.shaderInputs.setProps({picking: {highlightedObjectIndex: null}});\n }\n\n /** Prepare for rendering picking colors */\n beginRenderPass() {\n const framebuffer = this.getFramebuffer();\n framebuffer.resize(this.device.getDefaultCanvasContext().getDevicePixelSize());\n\n this.props.shaderInputs?.setProps({picking: {isActive: true}});\n\n const pickingPass = this.device.beginRenderPass({\n framebuffer,\n clearColors: [new Float32Array([0, 0, 0, 0]), new Int32Array([-1, -1, 0, 0])],\n clearDepth: 1\n });\n\n return pickingPass;\n }\n\n async updatePickInfo(mousePosition: [number, number]): Promise<PickInfo | null> {\n const framebuffer = this.getFramebuffer();\n\n // use the center pixel location in device pixel range\n const [pickX, pickY] = this.getPickPosition(mousePosition);\n\n // Read back\n const pixelData = this.device.readPixelsToArrayWebGL(framebuffer, {\n sourceX: pickX,\n sourceY: pickY,\n sourceWidth: 1,\n sourceHeight: 1,\n sourceAttachment: 1\n });\n if (!pixelData) {\n return null;\n }\n\n const pickInfo: PickInfo = {\n objectIndex: pixelData[0] === INVALID_INDEX ? null : pixelData[0],\n batchIndex: pixelData[1] === INVALID_INDEX ? null : pixelData[1]\n };\n\n // Call callback if picked object has changed\n if (\n pickInfo.objectIndex !== this.pickInfo.objectIndex ||\n pickInfo.batchIndex !== this.pickInfo.batchIndex\n ) {\n this.pickInfo = pickInfo;\n this.props.onObjectPicked(pickInfo);\n // console.log(`Object ${pickInfo.objectIndex} in batch ${pickInfo.batchIndex} was picked`)\n }\n\n this.props.shaderInputs?.setProps({\n picking: {\n isActive: false,\n highlightedBatchIndex: pickInfo.batchIndex,\n highlightedObjectIndex: pickInfo.objectIndex\n }\n });\n\n return this.pickInfo;\n }\n\n /**\n * Get pick position in device pixel range\n * use the center pixel location in device pixel range\n */\n getPickPosition(mousePosition: [number, number]): [number, number] {\n const devicePixels = this.device.getDefaultCanvasContext().cssToDevicePixels(mousePosition);\n const pickX = devicePixels.x + Math.floor(devicePixels.width / 2);\n const pickY = devicePixels.y + Math.floor(devicePixels.height / 2);\n return [pickX, pickY];\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {ShaderModule} from '@luma.gl/shadertools';\n\nimport type {PickingBindings, PickingProps, PickingUniforms} from './picking-uniforms';\nimport {pickingUniforms, GLSL_UNIFORMS, WGSL_UNIFORMS, INVALID_INDEX} from './picking-uniforms';\n\n// SHADERS\n\nconst source = /* wgsl */ `\\\n${WGSL_UNIFORMS}\n\nconst INDEX_PICKING_MODE_INSTANCE = 0;\nconst INDEX_PICKING_MODE_CUSTOM = 1;\nconst INDEX_PICKING_INVALID_INDEX = ${INVALID_INDEX}; // 2^32 - 1\n\nstruct indexPickingFragmentInputs = {\n objectIndex: int32;\n};\n\nlet indexPickingFragmentInputs: indexPickingFragmentInputs;\n\n/**\n * Vertex shaders should call this function to set the object index.\n * If using instance or vertex mode, argument will be ignored, 0 can be supplied.\n */\nfn picking_setObjectIndex(objectIndex: int32) {\n switch (picking.indexMode) {\n case INDEX_PICKING_MODE_INSTANCE, default: {\n picking_objectIndex = instance_index;\n };\n case INDEX_PICKING_MODE_CUSTOM: {\n picking_objectIndex = objectIndex;\n };\n }\n}\n\n`;\n\nconst vs = /* glsl */ `\\\n${GLSL_UNIFORMS}\n\nconst int INDEX_PICKING_MODE_INSTANCE = 0;\nconst int INDEX_PICKING_MODE_CUSTOM = 1;\n\nconst int INDEX_PICKING_INVALID_INDEX = ${INVALID_INDEX}; // 2^32 - 1\n\nflat out int picking_objectIndex;\n\n/**\n * Vertex shaders should call this function to set the object index.\n * If using instance or vertex mode, argument will be ignored, 0 can be supplied.\n */\nvoid picking_setObjectIndex(int objectIndex) {\n switch (picking.indexMode) {\n case INDEX_PICKING_MODE_INSTANCE:\n picking_objectIndex = gl_InstanceID;\n break;\n case INDEX_PICKING_MODE_CUSTOM:\n picking_objectIndex = objectIndex;\n break;\n }\n}\n`;\n\nconst fs = /* glsl */ `\\\n${GLSL_UNIFORMS}\n\nconst int INDEX_PICKING_INVALID_INDEX = ${INVALID_INDEX}; // 2^32 - 1\n\nflat in int picking_objectIndex;\n\n/**\n * Check if this vertex is highlighted (part of the selected batch and object)\n */ \nbool picking_isFragmentHighlighted() {\n return \n bool(picking.isHighlightActive) &&\n picking.highlightedBatchIndex == picking.batchIndex &&\n picking.highlightedObjectIndex == picking_objectIndex\n ;\n}\n\n/**\n * Returns highlight color if this item is selected.\n */\nvec4 picking_filterHighlightColor(vec4 color) {\n // If we are still picking, we don't highlight\n if (bool(picking.isActive)) {\n return color;\n }\n\n // If we are not highlighted, return color as is\n if (!picking_isFragmentHighlighted()) {\n return color;\n }\n \n // Blend in highlight color based on its alpha value\n float highLightAlpha = picking.highlightColor.a;\n float blendedAlpha = highLightAlpha + color.a * (1.0 - highLightAlpha);\n float highLightRatio = highLightAlpha / blendedAlpha;\n\n vec3 blendedRGB = mix(color.rgb, picking.highlightColor.rgb, highLightRatio);\n return vec4(blendedRGB, blendedAlpha);\n}\n\n/*\n * Returns picking color if picking enabled else unmodified argument.\n */\nivec4 picking_getPickingColor() {\n // Assumes that colorAttachment0 is rg32int\n // TODO? - we could render indices into a second color attachment and not mess with fragColor\n return ivec4(picking_objectIndex, picking.batchIndex, 0u, 0u); \n}\n\nvec4 picking_filterPickingColor(vec4 color) {\n if (bool(picking.isActive)) {\n if (picking_objectIndex == INDEX_PICKING_INVALID_INDEX) {\n discard;\n }\n }\n return color;\n}\n\n/*\n * Returns picking color if picking is enabled if not\n * highlight color if this item is selected, otherwise unmodified argument.\n */\nvec4 picking_filterColor(vec4 color) {\n vec4 outColor = color;\n outColor = picking_filterHighlightColor(outColor);\n outColor = picking_filterPickingColor(outColor);\n return outColor;\n}\n`;\n\n/**\n * Provides support for color-based picking and highlighting.\n *\n * In particular, supports picking a specific instance in an instanced\n * draw call and highlighting an instance based on its picking color,\n * and correspondingly, supports picking and highlighting groups of\n * primitives with the same picking color in non-instanced draw-calls\n *\n * @note Color based picking has the significant advantage in that it can be added to any\n * existing shader without requiring any additional picking logic.\n */\nexport const picking = {\n ...pickingUniforms,\n name: 'picking',\n source,\n vs,\n fs\n} as const satisfies ShaderModule<PickingProps, PickingUniforms, PickingBindings>;\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {ShaderModule} from '@luma.gl/shadertools';\n\nimport type {PickingProps, PickingUniforms, PickingBindings} from './picking-uniforms';\nimport {pickingUniforms, GLSL_UNIFORMS, WGSL_UNIFORMS} from './picking-uniforms';\n\nconst source = /* wgsl */ `\\\n${WGSL_UNIFORMS}\n`;\n\nconst vs = /* glsl */ `\\\n${GLSL_UNIFORMS}\nout vec4 picking_vRGBcolor_Avalid;\n\n// Normalize unsigned byte color to 0-1 range\nvec3 picking_normalizeColor(vec3 color) {\n return picking.useFloatColors > 0.5 ? color : color / 255.0;\n}\n\n// Normalize unsigned byte color to 0-1 range\nvec4 picking_normalizeColor(vec4 color) {\n return picking.useFloatColors > 0.5 ? color : color / 255.0;\n}\n\nbool picking_isColorZero(vec3 color) {\n return dot(color, vec3(1.0)) < 0.00001;\n}\n\nbool picking_isColorValid(vec3 color) {\n return dot(color, vec3(1.0)) > 0.00001;\n}\n\n// Check if this vertex is highlighted \nbool isVertexHighlighted(vec3 vertexColor) {\n vec3 highlightedObjectColor = picking_normalizeColor(picking.highlightedObjectColor);\n return\n bool(picking.isHighlightActive) && picking_isColorZero(abs(vertexColor - highlightedObjectColor));\n}\n\n// Set the current picking color\nvoid picking_setPickingColor(vec3 pickingColor) {\n pickingColor = picking_normalizeColor(pickingColor);\n\n if (bool(picking.isActive)) {\n // Use alpha as the validity flag. If pickingColor is [0, 0, 0] fragment is non-pickable\n picking_vRGBcolor_Avalid.a = float(picking_isColorValid(pickingColor));\n\n if (!bool(picking.isAttribute)) {\n // Stores the picking color so that the fragment shader can render it during picking\n picking_vRGBcolor_Avalid.rgb = pickingColor;\n }\n } else {\n // Do the comparison with selected item color in vertex shader as it should mean fewer compares\n picking_vRGBcolor_Avalid.a = float(isVertexHighlighted(pickingColor));\n }\n}\n\nvoid picking_setObjectIndex(uint objectIndex) {\n if (bool(picking.isActive)) {\n uint index = objectIndex;\n if (picking.indexMode == PICKING_INDEX_MODE_INSTANCE) {\n index = uint(gl_InstanceID);\n }\n picking_vRGBcolor_Avalid.r = float(index % 255) / 255.0;\n picking_vRGBcolor_Avalid.g = float((index / 255) % 255) / 255.0;\n picking_vRGBcolor_Avalid.b = float((index / 255 / 255) %255) / 255.0;\n }\n}\n\nvoid picking_setPickingAttribute(float value) {\n if (bool(picking.isAttribute)) {\n picking_vRGBcolor_Avalid.r = value;\n }\n}\n\nvoid picking_setPickingAttribute(vec2 value) {\n if (bool(picking.isAttribute)) {\n picking_vRGBcolor_Avalid.rg = value;\n }\n}\n\nvoid picking_setPickingAttribute(vec3 value) {\n if (bool(picking.isAttribute)) {\n picking_vRGBcolor_Avalid.rgb = value;\n }\n}\n`;\n\nconst fs = /* glsl */ `\\\n${GLSL_UNIFORMS}\n\nin vec4 picking_vRGBcolor_Avalid;\n\n/*\n * Returns highlight color if this item is selected.\n */\nvec4 picking_filterHighlightColor(vec4 color) {\n // If we are still picking, we don't highlight\n if (picking.isActive > 0.5) {\n return color;\n }\n\n bool selected = bool(picking_vRGBcolor_Avalid.a);\n\n if (selected) {\n // Blend in highlight color based on its alpha value\n float highLightAlpha = picking.highlightColor.a;\n float blendedAlpha = highLightAlpha + color.a * (1.0 - highLightAlpha);\n float highLightRatio = highLightAlpha / blendedAlpha;\n\n vec3 blendedRGB = mix(color.rgb, picking.highlightColor.rgb, highLightRatio);\n return vec4(blendedRGB, blendedAlpha);\n } else {\n return color;\n }\n}\n\n/*\n * Returns picking color if picking enabled else unmodified argument.\n */\nvec4 picking_filterPickingColor(vec4 color) {\n if (bool(picking.isActive)) {\n if (picking_vRGBcolor_Avalid.a == 0.0) {\n discard;\n }\n return picking_vRGBcolor_Avalid;\n }\n return color;\n}\n\n/*\n * Returns picking color if picking is enabled if not\n * highlight color if this item is selected, otherwise unmodified argument.\n */\nvec4 picking_filterColor(vec4 color) {\n vec4 highlightColor = picking_filterHighlightColor(color);\n return picking_filterPickingColor(highlightColor);\n}\n`;\n\n/**\n * Provides support for color-coding-based picking and highlighting.\n * In particular, supports picking a specific instance in an instanced\n * draw call and highlighting an instance based on its picking color,\n * and correspondingly, supports picking and highlighting groups of\n * primitives with the same picking color in non-instanced draw-calls\n */\nexport const picking = {\n ...pickingUniforms,\n name: 'picking',\n source,\n vs,\n fs\n} as const satisfies ShaderModule<PickingProps, PickingUniforms, PickingBindings>;\n\n// function getUniforms(opts: PickingProps = {}, prevUniforms?: PickingUniforms): PickingUniforms {\n// const uniforms = {} as PickingUniforms;\n\n// if (opts.highlightedObjectColor === undefined) {\n// // Unless highlightedObjectColor explicitly null or set, do not update state\n// } else if (opts.highlightedObjectColor === null) {\n// uniforms.isHighlightActive = false;\n// } else {\n// uniforms.isHighlightActive = true;\n// const highlightedObjectColor = opts.highlightedObjectColor.slice(0, 3);\n// uniforms.highlightedObjectColor = highlightedObjectColor;\n// }\n\n// if (opts.highlightColor) {\n// const color = Array.from(opts.highlightColor, x => x / 255);\n// if (!Number.isFinite(color[3])) {\n// color[3] = 1;\n// }\n// uniforms.highlightColor = color;\n// }\n\n// if (opts.isActive !== undefined) {\n// uniforms.isActive = Boolean(opts.isActive);\n// uniforms.isAttribute = Boolean(opts.isAttribute);\n// }\n\n// if (opts.useFloatColors !== undefined) {\n// uniforms.useFloatColors = Boolean(opts.useFloatColors);\n// }\n\n// return uniforms;\n// }\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {Device, Framebuffer} from '@luma.gl/core';\nimport {picking} from '@luma.gl/shadertools';\nimport {ShaderInputs} from '../../shader-inputs';\nimport {NumberArray3} from '@math.gl/types';\n\n/**\n * Helper class for using the legacy picking module\n */\nexport class LegacyPickingManager {\n device: Device;\n framebuffer: Framebuffer | null = null;\n shaderInputs: ShaderInputs<{picking: typeof picking.props}>;\n\n constructor(device: Device, shaderInputs: ShaderInputs) {\n this.device = device;\n this.shaderInputs = shaderInputs as ShaderInputs<{picking: typeof picking.props}>;\n }\n\n destroy() {\n this.framebuffer?.destroy();\n }\n\n getFramebuffer() {\n if (!this.framebuffer) {\n this.framebuffer = this.device.createFramebuffer({\n colorAttachments: ['rgba8unorm'],\n depthStencilAttachment: 'depth24plus'\n });\n }\n return this.framebuffer;\n }\n\n /** Clear highlighted / picked object */\n clearPickState() {\n this.shaderInputs.setProps({picking: {highlightedObjectColor: null}});\n }\n\n /** Prepare for rendering picking colors */\n beginRenderPass() {\n const framebuffer = this.getFramebuffer();\n framebuffer.resize(this.device.getCanvasContext().getDevicePixelSize());\n\n this.shaderInputs.setProps({picking: {isActive: true}});\n\n const pickingPass = this.device.beginRenderPass({\n framebuffer,\n clearColor: [0, 0, 0, 0],\n clearDepth: 1\n });\n\n return pickingPass;\n }\n\n updatePickState(mousePosition: [number, number]) {\n const framebuffer = this.getFramebuffer();\n\n // use the center pixel location in device pixel range\n const [pickX, pickY] = this.getPickPosition(mousePosition);\n\n // Read back\n const color255 = this.device.readPixelsToArrayWebGL(framebuffer, {\n sourceX: pickX,\n sourceY: pickY,\n sourceWidth: 1,\n sourceHeight: 1\n });\n // console.log(color255);\n\n // Check if we have\n let highlightedObjectColor: NumberArray3 | null = [...color255].map(\n x => x / 255\n ) as NumberArray3;\n const isHighlightActive =\n highlightedObjectColor[0] + highlightedObjectColor[1] + highlightedObjectColor[2] > 0;\n\n if (!isHighlightActive) {\n highlightedObjectColor = null;\n }\n\n this.shaderInputs.setProps({\n picking: {isActive: false, highlightedObjectColor}\n });\n }\n\n /**\n * Get pick position in device pixel range\n * use the center pixel location in device pixel range\n */\n getPickPosition(mousePosition: [number, number]): [number, number] {\n const devicePixels = this.device.getCanvasContext().cssToDevicePixels(mousePosition);\n const pickX = devicePixels.x + Math.floor(devicePixels.width / 2);\n const pickY = devicePixels.y + Math.floor(devicePixels.height / 2);\n return [pickX, pickY];\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n// luma.gl Engine API\n\n// Animation\nexport {Timeline} from './animation/timeline';\nexport {KeyFrames} from './animation/key-frames';\nexport type {AnimationProps} from './animation-loop/animation-props';\n\nexport {AnimationLoopTemplate} from './animation-loop/animation-loop-template';\n\nexport type {AnimationLoopProps} from './animation-loop/animation-loop';\nexport {AnimationLoop} from './animation-loop/animation-loop';\n\nexport type {MakeAnimationLoopProps} from './animation-loop/make-animation-loop';\nexport {makeAnimationLoop} from './animation-loop/make-animation-loop';\n\nexport type {ModelProps} from './model/model';\nexport {Model} from './model/model';\n\n// Transforms\nexport type {BufferTransformProps} from './compute/buffer-transform';\nexport {BufferTransform} from './compute/buffer-transform';\nexport type {TextureTransformProps} from './compute/texture-transform';\nexport {TextureTransform} from './compute/texture-transform';\n\nexport {PipelineFactory} from './factories/pipeline-factory';\nexport {ShaderFactory} from './factories/shader-factory';\n\n// Models\nexport type {ClipSpaceProps} from './models/clip-space';\nexport {ClipSpace} from './models/clip-space';\nexport type {BackgroundTextureModelProps} from './models/billboard-texture-model';\nexport {BackgroundTextureModel} from './models/billboard-texture-model';\n\n// Scenegraph Core nodes\nexport {ScenegraphNode} from './scenegraph/scenegraph-node';\nexport {GroupNode} from './scenegraph/group-node';\nexport type {ModelNodeProps} from './scenegraph/model-node';\nexport {ModelNode} from './scenegraph/model-node';\n\n// Geometries\nexport type {GeometryProps, GeometryAttribute} from './geometry/geometry';\nexport {Geometry} from './geometry/geometry';\nexport type {GPUGeometryProps} from './geometry/gpu-geometry';\nexport {GPUGeometry} from './geometry/gpu-geometry';\n\n// Primitives\nexport type {ConeGeometryProps} from './geometries/cone-geometry';\nexport {ConeGeometry} from './geometries/cone-geometry';\nexport type {CubeGeometryProps} from './geometries/cube-geometry';\nexport {CubeGeometry} from './geometries/cube-geometry';\nexport type {CylinderGeometryProps} from './geometries/cylinder-geometry';\nexport {CylinderGeometry} from './geometries/cylinder-geometry';\nexport type {IcoSphereGeometryProps} from './geometries/ico-sphere-geometry';\nexport {IcoSphereGeometry} from './geometries/ico-sphere-geometry';\nexport type {PlaneGeometryProps} from './geometries/plane-geometry';\nexport {PlaneGeometry} from './geometries/plane-geometry';\nexport type {SphereGeometryProps} from './geometries/sphere-geometry';\nexport {SphereGeometry} from './geometries/sphere-geometry';\nexport type {TruncatedConeGeometryProps} from './geometries/truncated-cone-geometry';\nexport {TruncatedConeGeometry} from './geometries/truncated-cone-geometry';\n\nexport {ShaderInputs} from './shader-inputs';\n\n// Application Utilities\nexport {makeRandomGenerator} from './application-utils/random';\nexport {setPathPrefix, loadImage, loadImageBitmap} from './application-utils/load-file';\n\n// EXPERIMENTAL\nexport type {ShaderPassRendererProps} from './passes/shader-pass-renderer';\nexport {ShaderPassRenderer} from './passes/shader-pass-renderer';\n\nexport {Swap} from './compute/swap';\nexport {SwapBuffers} from './compute/swap';\nexport {SwapFramebuffers} from './compute/swap';\n\nexport type {ComputationProps} from './compute/computation';\nexport {Computation} from './compute/computation';\n\nexport type {\n TextureCubeFace,\n TextureImageData,\n TextureData,\n Texture1DData,\n Texture2DData,\n Texture3DData,\n TextureCubeData,\n TextureArrayData,\n TextureCubeArrayData\n} from './async-texture/async-texture';\n\nexport type {AsyncTextureProps} from './async-texture/async-texture';\nexport {AsyncTexture} from './async-texture/async-texture';\n\nexport {PickingManager} from './modules/picking/picking-manager';\nexport {picking as indexPicking} from './modules/picking/index-picking';\nexport {picking as colorPicking} from './modules/picking/color-picking';\n\nexport {\n requestAnimationFramePolyfill,\n cancelAnimationFramePolyfill\n} from './animation-loop/request-animation-frame';\n\n// DEPRECATED\n\nexport {LegacyPickingManager} from './modules/picking/legacy-picking-manager';\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n/**\n * Timeline channel properties\n * @param delay = 0;\n * @param duration = Number.POSITIVE_INFINITY;\n * @param rate = 1\n * @param repeat = 1\n */\nexport type ChannelOptions = {\n delay?: number;\n duration?: number;\n rate?: number;\n repeat?: number;\n};\n\nexport type AnimationOptions = {\n setTime: (time: number) => void;\n};\n\ntype Channel = {\n time: number;\n delay: number;\n duration: number;\n rate: number;\n repeat: number;\n};\n\ntype Animation = {\n channel?: number;\n animation: {\n setTime: (time: number) => void;\n };\n};\n\nlet channelHandles = 1;\nlet animationHandles = 1;\n\nexport class Timeline {\n time: number = 0;\n channels = new Map<number, Channel>();\n animations = new Map<number, Animation>();\n playing: boolean = false;\n lastEngineTime: number = -1;\n\n constructor() {}\n\n addChannel(props: ChannelOptions): number {\n const {delay = 0, duration = Number.POSITIVE_INFINITY, rate = 1, repeat = 1} = props;\n\n const channelId = channelHandles++;\n const channel: Channel = {\n time: 0,\n delay,\n duration,\n rate,\n repeat\n };\n this._setChannelTime(channel, this.time);\n this.channels.set(channelId, channel);\n\n return channelId;\n }\n\n removeChannel(channelId: number): void {\n this.channels.delete(channelId);\n\n for (const [animationHandle, animation] of this.animations) {\n if (animation.channel === channelId) {\n this.detachAnimation(animationHandle);\n }\n }\n }\n\n isFinished(channelId: number): boolean {\n const channel = this.channels.get(channelId);\n if (channel === undefined) {\n return false;\n }\n\n return this.time >= channel.delay + channel.duration * channel.repeat;\n }\n\n getTime(channelId?: number): number {\n if (channelId === undefined) {\n return this.time;\n }\n\n const channel = this.channels.get(channelId);\n\n if (channel === undefined) {\n return -1;\n }\n\n return channel.time;\n }\n\n setTime(time: number): void {\n this.time = Math.max(0, time);\n\n const channels = this.channels.values();\n for (const channel of channels) {\n this._setChannelTime(channel, this.time);\n }\n\n const animations = this.animations.values();\n for (const animationData of animations) {\n const {animation, channel} = animationData;\n animation.setTime(this.getTime(channel));\n }\n }\n\n play(): void {\n this.playing = true;\n }\n\n pause(): void {\n this.playing = false;\n this.lastEngineTime = -1;\n }\n\n reset(): void {\n this.setTime(0);\n }\n\n attachAnimation(animation: AnimationOptions, channelHandle?: number): number {\n const animationHandle = animationHandles++;\n\n this.animations.set(animationHandle, {\n animation,\n channel: channelHandle\n });\n\n animation.setTime(this.getTime(channelHandle));\n\n return animationHandle;\n }\n\n detachAnimation(channelId: number): void {\n this.animations.delete(channelId);\n }\n\n update(engineTime: number): void {\n if (this.playing) {\n if (this.lastEngineTime === -1) {\n this.lastEngineTime = engineTime;\n }\n this.setTime(this.time + (engineTime - this.lastEngineTime));\n this.lastEngineTime = engineTime;\n }\n }\n\n _setChannelTime(channel: Channel, time: number): void {\n const offsetTime = time - channel.delay;\n const totalDuration = channel.duration * channel.repeat;\n // Note(Tarek): Don't loop on final repeat.\n if (offsetTime >= totalDuration) {\n channel.time = channel.duration * channel.rate;\n } else {\n channel.time = Math.max(0, offsetTime) % channel.duration;\n channel.time *= channel.rate;\n }\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n// keyframes\nexport type KeyFrame<T> = [number, T];\n\n/** Holds a list of key frames (timestamped values) */\nexport class KeyFrames<T = number> {\n startIndex: number = -1;\n endIndex: number = -1;\n factor: number = 0;\n times: number[] = [];\n values: T[] = [];\n private _lastTime = -1;\n\n constructor(keyFrames: KeyFrame<T>[]) {\n this.setKeyFrames(keyFrames);\n this.setTime(0);\n }\n\n setKeyFrames(keyFrames: KeyFrame<T>[]): void {\n const numKeys = keyFrames.length;\n this.times.length = numKeys;\n this.values.length = numKeys;\n\n for (let i = 0; i < numKeys; ++i) {\n this.times[i] = keyFrames[i][0];\n this.values[i] = keyFrames[i][1];\n }\n\n this._calculateKeys(this._lastTime);\n }\n\n setTime(time: number): void {\n time = Math.max(0, time);\n\n if (time !== this._lastTime) {\n this._calculateKeys(time);\n this._lastTime = time;\n }\n }\n\n getStartTime(): number {\n return this.times[this.startIndex];\n }\n\n getEndTime(): number {\n return this.times[this.endIndex];\n }\n\n getStartData(): T {\n return this.values[this.startIndex];\n }\n\n getEndData(): T {\n return this.values[this.endIndex];\n }\n\n _calculateKeys(time: number): void {\n let index = 0;\n const numKeys = this.times.length;\n\n for (index = 0; index < numKeys - 2; ++index) {\n if (this.times[index + 1] > time) {\n break;\n }\n }\n\n this.startIndex = index;\n this.endIndex = index + 1;\n\n const startTime = this.times[this.startIndex];\n const endTime = this.times[this.endIndex];\n this.factor = Math.min(Math.max(0, (time - startTime) / (endTime - startTime)), 1);\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {AnimationProps} from './animation-props';\n\n/**\n * Minimal class that represents a \"componentized\" rendering life cycle\n * (resource construction, repeated rendering, resource destruction)\n *\n * @note A motivation for this class compared to the raw animation loop is\n * that it simplifies TypeScript code by allowing resources to be typed unconditionally\n * since they are allocated in the constructor rather than in onInitialized\n *\n * @note Introduced in luma.gl v9\n *\n * @example AnimationLoopTemplate is intended to be subclassed,\n * but the subclass should not be instantiated directly. Instead the subclass\n * (i.e. the constructor of the subclass) should be used\n * as an argument to create an AnimationLoop.\n */\nexport abstract class AnimationLoopTemplate {\n constructor(animationProps?: AnimationProps) {}\n async onInitialize(animationProps: AnimationProps): Promise<unknown> {\n return null;\n }\n abstract onRender(animationProps: AnimationProps): unknown;\n abstract onFinalize(animationProps: AnimationProps): void;\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {luma, Device} from '@luma.gl/core';\nimport {\n requestAnimationFramePolyfill,\n cancelAnimationFramePolyfill\n} from './request-animation-frame';\nimport {Timeline} from '../animation/timeline';\nimport {AnimationProps} from './animation-props';\nimport {Stats, Stat} from '@probe.gl/stats';\n\nlet statIdCounter = 0;\n\n/** AnimationLoop properties */\nexport type AnimationLoopProps = {\n device: Device | Promise<Device>;\n\n onAddHTML?: (div: HTMLDivElement) => string; // innerHTML\n onInitialize?: (animationProps: AnimationProps) => Promise<unknown>;\n onRender?: (animationProps: AnimationProps) => unknown;\n onFinalize?: (animationProps: AnimationProps) => void;\n onError?: (reason: Error) => void;\n\n stats?: Stats;\n\n // view parameters - TODO move to CanvasContext?\n autoResizeViewport?: boolean;\n};\n\nexport type MutableAnimationLoopProps = {\n // view parameters\n autoResizeViewport?: boolean;\n};\n\n/** Convenient animation loop */\nexport class AnimationLoop {\n static defaultAnimationLoopProps = {\n device: null!,\n\n onAddHTML: () => '',\n onInitialize: async () => null,\n onRender: () => {},\n onFinalize: () => {},\n onError: error => console.error(error), // eslint-disable-line no-console\n\n stats: luma.stats.get(`animation-loop-${statIdCounter++}`),\n\n // view parameters\n autoResizeViewport: false\n } as const satisfies Readonly<Required<AnimationLoopProps>>;\n\n device: Device | null = null;\n canvas: HTMLCanvasElement | OffscreenCanvas | null = null;\n\n props: Required<AnimationLoopProps>;\n animationProps: AnimationProps | null = null;\n timeline: Timeline | null = null;\n stats: Stats;\n cpuTime: Stat;\n gpuTime: Stat;\n frameRate: Stat;\n\n display: any;\n\n needsRedraw: string | false = 'initialized';\n\n _initialized: boolean = false;\n _running: boolean = false;\n _animationFrameId: any = null;\n _nextFramePromise: Promise<AnimationLoop> | null = null;\n _resolveNextFrame: ((animationLoop: AnimationLoop) => void) | null = null;\n _cpuStartTime: number = 0;\n _error: Error | null = null;\n\n // _gpuTimeQuery: Query | null = null;\n\n /*\n * @param {HTMLCanvasElement} canvas - if provided, width and height will be passed to context\n */\n constructor(props: AnimationLoopProps) {\n this.props = {...AnimationLoop.defaultAnimationLoopProps, ...props};\n props = this.props;\n\n if (!props.device) {\n throw new Error('No device provided');\n }\n\n // state\n this.stats = props.stats || new Stats({id: 'animation-loop-stats'});\n this.cpuTime = this.stats.get('CPU Time');\n this.gpuTime = this.stats.get('GPU Time');\n this.frameRate = this.stats.get('Frame Rate');\n\n this.setProps({autoResizeViewport: props.autoResizeViewport});\n\n // Bind methods\n this.start = this.start.bind(this);\n this.stop = this.stop.bind(this);\n\n this._onMousemove = this._onMousemove.bind(this);\n this._onMouseleave = this._onMouseleave.bind(this);\n }\n\n destroy(): void {\n this.stop();\n this._setDisplay(null);\n }\n\n /** @deprecated Use .destroy() */\n delete(): void {\n this.destroy();\n }\n\n reportError(error: Error): void {\n this.props.onError(error);\n this._error = error;\n }\n\n /** Flags this animation loop as needing redraw */\n setNeedsRedraw(reason: string): this {\n this.needsRedraw = this.needsRedraw || reason;\n return this;\n }\n\n setProps(props: MutableAnimationLoopProps): this {\n if ('autoResizeViewport' in props) {\n this.props.autoResizeViewport = props.autoResizeViewport || false;\n }\n return this;\n }\n\n /** Starts a render loop if not already running */\n async start() {\n if (this._running) {\n return this;\n }\n this._running = true;\n\n try {\n let appContext;\n if (!this._initialized) {\n this._initialized = true;\n // Create the WebGL context\n await this._initDevice();\n this._initialize();\n\n // Note: onIntialize can return a promise (e.g. in case app needs to load resources)\n await this.props.onInitialize(this._getAnimationProps());\n }\n\n // check that we haven't been stopped\n if (!this._running) {\n return null;\n }\n\n // Start the loop\n if (appContext !== false) {\n // cancel any pending renders to ensure only one loop can ever run\n this._cancelAnimationFrame();\n this._requestAnimationFrame();\n }\n\n return this;\n } catch (err: unknown) {\n const error = err instanceof Error ? err : new Error('Unknown error');\n this.props.onError(error);\n // this._running = false; // TODO\n throw error;\n }\n }\n\n /** Stops a render loop if already running, finalizing */\n stop() {\n // console.debug(`Stopping ${this.constructor.name}`);\n if (this._running) {\n // call callback\n // If stop is called immediately, we can end up in a state where props haven't been initialized...\n if (this.animationProps && !this._error) {\n this.props.onFinalize(this.animationProps);\n }\n\n this._cancelAnimationFrame();\n this._nextFramePromise = null;\n this._resolveNextFrame = null;\n this._running = false;\n }\n return this;\n }\n\n /** Explicitly draw a frame */\n redraw(): this {\n if (this.device?.isLost || this._error) {\n return this;\n }\n\n this._beginFrameTimers();\n\n this._setupFrame();\n this._updateAnimationProps();\n\n this._renderFrame(this._getAnimationProps());\n\n // clear needsRedraw flag\n this._clearNeedsRedraw();\n\n if (this._resolveNextFrame) {\n this._resolveNextFrame(this);\n this._nextFramePromise = null;\n this._resolveNextFrame = null;\n }\n\n this._endFrameTimers();\n\n return this;\n }\n\n /** Add a timeline, it will be automatically updated by the animation loop. */\n attachTimeline(timeline: Timeline): Timeline {\n this.timeline = timeline;\n return this.timeline;\n }\n\n /** Remove a timeline */\n detachTimeline(): void {\n this.timeline = null;\n }\n\n /** Wait until a render completes */\n waitForRender(): Promise<AnimationLoop> {\n this.setNeedsRedraw('waitForRender');\n\n if (!this._nextFramePromise) {\n this._nextFramePromise = new Promise(resolve => {\n this._resolveNextFrame = resolve;\n });\n }\n return this._nextFramePromise;\n }\n\n /** TODO - should use device.deviceContext */\n async toDataURL(): Promise<string> {\n this.setNeedsRedraw('toDataURL');\n await this.waitForRender();\n if (this.canvas instanceof HTMLCanvasElement) {\n return this.canvas.toDataURL();\n }\n throw new Error('OffscreenCanvas');\n }\n\n // PRIVATE METHODS\n\n _initialize(): void {\n this._startEventHandling();\n\n // Initialize the callback data\n this._initializeAnimationProps();\n this._updateAnimationProps();\n\n // Default viewport setup, in case onInitialize wants to render\n this._resizeViewport();\n\n // this._gpuTimeQuery = Query.isSupported(this.gl, ['timers']) ? new Query(this.gl) : null;\n }\n\n _setDisplay(display: any): void {\n if (this.display) {\n this.display.destroy();\n this.display.animationLoop = null;\n }\n\n // store animation loop on the display\n if (display) {\n display.animationLoop = this;\n }\n\n this.display = display;\n }\n\n _requestAnimationFrame(): void {\n if (!this._running) {\n return;\n }\n\n // VR display has a separate animation frame to sync with headset\n // TODO WebVR API discontinued, replaced by WebXR: https://immersive-web.github.io/webxr/\n // See https://developer.mozilla.org/en-US/docs/Web/API/VRDisplay/requestAnimationFrame\n // if (this.display && this.display.requestAnimationFrame) {\n // this._animationFrameId = this.display.requestAnimationFrame(this._animationFrame.bind(this));\n // }\n this._animationFrameId = requestAnimationFramePolyfill(this._animationFrame.bind(this));\n }\n\n _cancelAnimationFrame(): void {\n if (this._animationFrameId === null) {\n return;\n }\n\n // VR display has a separate animation frame to sync with headset\n // TODO WebVR API discontinued, replaced by WebXR: https://immersive-web.github.io/webxr/\n // See https://developer.mozilla.org/en-US/docs/Web/API/VRDisplay/requestAnimationFrame\n // if (this.display && this.display.cancelAnimationFramePolyfill) {\n // this.display.cancelAnimationFrame(this._animationFrameId);\n // }\n cancelAnimationFramePolyfill(this._animationFrameId);\n this._animationFrameId = null;\n }\n\n _animationFrame(): void {\n if (!this._running) {\n return;\n }\n this.redraw();\n this._requestAnimationFrame();\n }\n\n // Called on each frame, can be overridden to call onRender multiple times\n // to support e.g. stereoscopic rendering\n _renderFrame(animationProps: AnimationProps): void {\n // Allow e.g. VR display to render multiple frames.\n if (this.display) {\n this.display._renderFrame(animationProps);\n return;\n }\n\n // call callback\n this.props.onRender(this._getAnimationProps());\n // end callback\n\n // Submit commands (necessary on WebGPU)\n this.device?.submit();\n }\n\n _clearNeedsRedraw(): void {\n this.needsRedraw = false;\n }\n\n _setupFrame(): void {\n this._resizeViewport();\n }\n\n // Initialize the object that will be passed to app callbacks\n _initializeAnimationProps(): void {\n const canvasContext = this.device?.getDefaultCanvasContext();\n if (!this.device || !canvasContext) {\n throw new Error('loop');\n }\n\n const canvas = canvasContext?.canvas;\n const useDevicePixels = canvasContext.props.useDevicePixels;\n\n this.animationProps = {\n animationLoop: this,\n\n device: this.device,\n canvasContext,\n canvas,\n // @ts-expect-error Deprecated\n useDevicePixels,\n\n timeline: this.timeline,\n\n needsRedraw: false,\n\n // Placeholders\n width: 1,\n height: 1,\n aspect: 1,\n\n // Animation props\n time: 0,\n startTime: Date.now(),\n engineTime: 0,\n tick: 0,\n tock: 0,\n\n // Experimental\n _mousePosition: null // Event props\n };\n }\n\n _getAnimationProps(): AnimationProps {\n if (!this.animationProps) {\n throw new Error('animationProps');\n }\n return this.animationProps;\n }\n\n // Update the context object that will be passed to app callbacks\n _updateAnimationProps(): void {\n if (!this.animationProps) {\n return;\n }\n\n // Can this be replaced with canvas context?\n const {width, height, aspect} = this._getSizeAndAspect();\n if (width !== this.animationProps.width || height !== this.animationProps.height) {\n this.setNeedsRedraw('drawing buffer resized');\n }\n if (aspect !== this.animationProps.aspect) {\n this.setNeedsRedraw('drawing buffer aspect changed');\n }\n\n this.animationProps.width = width;\n this.animationProps.height = height;\n this.animationProps.aspect = aspect;\n\n this.animationProps.needsRedraw = this.needsRedraw;\n\n // Update time properties\n this.animationProps.engineTime = Date.now() - this.animationProps.startTime;\n\n if (this.timeline) {\n this.timeline.update(this.animationProps.engineTime);\n }\n\n this.animationProps.tick = Math.floor((this.animationProps.time / 1000) * 60);\n this.animationProps.tock++;\n\n // For back compatibility\n this.animationProps.time = this.timeline\n ? this.timeline.getTime()\n : this.animationProps.engineTime;\n }\n\n /** Wait for supplied device */\n async _initDevice() {\n this.device = await this.props.device;\n if (!this.device) {\n throw new Error('No device provided');\n }\n this.canvas = this.device.getDefaultCanvasContext().canvas || null;\n // this._createInfoDiv();\n }\n\n _createInfoDiv(): void {\n if (this.canvas && this.props.onAddHTML) {\n const wrapperDiv = document.createElement('div');\n document.body.appendChild(wrapperDiv);\n wrapperDiv.style.position = 'relative';\n const div = document.createElement('div');\n div.style.position = 'absolute';\n div.style.left = '10px';\n div.style.bottom = '10px';\n div.style.width = '300px';\n div.style.background = 'white';\n if (this.canvas instanceof HTMLCanvasElement) {\n wrapperDiv.appendChild(this.canvas);\n }\n wrapperDiv.appendChild(div);\n const html = this.props.onAddHTML(div);\n if (html) {\n div.innerHTML = html;\n }\n }\n }\n\n _getSizeAndAspect(): {width: number; height: number; aspect: number} {\n if (!this.device) {\n return {width: 1, height: 1, aspect: 1};\n }\n // https://webglfundamentals.org/webgl/lessons/webgl-resizing-the-canvas.html\n const [width, height] = this.device?.getDefaultCanvasContext().getDevicePixelSize() || [1, 1];\n\n // https://webglfundamentals.org/webgl/lessons/webgl-anti-patterns.html\n let aspect = 1;\n const canvas = this.device?.getDefaultCanvasContext().canvas;\n\n // @ts-expect-error\n if (canvas && canvas.clientHeight) {\n // @ts-expect-error\n aspect = canvas.clientWidth / canvas.clientHeight;\n } else if (width > 0 && height > 0) {\n aspect = width / height;\n }\n\n return {width, height, aspect};\n }\n\n /** @deprecated Default viewport setup */\n _resizeViewport(): void {\n // TODO can we use canvas context to code this in a portable way?\n // @ts-expect-error Expose on canvasContext\n if (this.props.autoResizeViewport && this.device.gl) {\n // @ts-expect-error Expose canvasContext\n this.device.gl.viewport(\n 0,\n 0,\n // @ts-expect-error Expose canvasContext\n this.device.gl.drawingBufferWidth,\n // @ts-expect-error Expose canvasContext\n this.device.gl.drawingBufferHeight\n );\n }\n }\n\n _beginFrameTimers() {\n this.frameRate.timeEnd();\n this.frameRate.timeStart();\n\n // Check if timer for last frame has completed.\n // GPU timer results are never available in the same\n // frame they are captured.\n // if (\n // this._gpuTimeQuery &&\n // this._gpuTimeQuery.isResultAvailable() &&\n // !this._gpuTimeQuery.isTimerDisjoint()\n // ) {\n // this.stats.get('GPU Time').addTime(this._gpuTimeQuery.getTimerMilliseconds());\n // }\n\n // if (this._gpuTimeQuery) {\n // // GPU time query start\n // this._gpuTimeQuery.beginTimeElapsedQuery();\n // }\n\n this.cpuTime.timeStart();\n }\n\n _endFrameTimers() {\n this.cpuTime.timeEnd();\n\n // if (this._gpuTimeQuery) {\n // // GPU time query end. Results will be available on next frame.\n // this._gpuTimeQuery.end();\n // }\n }\n\n // Event handling\n\n _startEventHandling() {\n if (this.canvas) {\n this.canvas.addEventListener('mousemove', this._onMousemove.bind(this));\n this.canvas.addEventListener('mouseleave', this._onMouseleave.bind(this));\n }\n }\n\n _onMousemove(event: Event) {\n if (event instanceof MouseEvent) {\n this._getAnimationProps()._mousePosition = [event.offsetX, event.offsetY];\n }\n }\n\n _onMouseleave(event: Event) {\n this._getAnimationProps()._mousePosition = null;\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n/* global window, setTimeout, clearTimeout */\n\n/** Node.js polyfill for requestAnimationFrame */\n// / <reference types=\"@types/node\" />\nexport function requestAnimationFramePolyfill(callback: (time?: any) => void): any {\n return typeof window !== 'undefined' && window.requestAnimationFrame\n ? window.requestAnimationFrame(callback)\n : setTimeout(callback, 1000 / 60);\n}\n\n/** Node.js polyfill for cancelAnimationFrame */\nexport function cancelAnimationFramePolyfill(timerId: any): void {\n return typeof window !== 'undefined' && window.cancelAnimationFrame\n ? window.cancelAnimationFrame(timerId)\n : clearTimeout(timerId);\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {luma, Adapter, Device} from '@luma.gl/core';\nimport {AnimationLoopTemplate} from './animation-loop-template';\nimport {AnimationLoop, AnimationLoopProps} from './animation-loop';\nimport type {AnimationProps} from './animation-props';\n\nexport type MakeAnimationLoopProps = Omit<\n AnimationLoopProps,\n 'onCreateDevice' | 'onInitialize' | 'onRedraw' | 'onFinalize'\n> & {\n /** List of adapters to use when creating the device */\n adapters?: Adapter[];\n};\n\n/**\n * Instantiates an animation loop and initializes it with the template.\n * @note The application needs to call `start()` on the returned animation loop to start the rendering loop.\n */\nexport function makeAnimationLoop(\n AnimationLoopTemplateCtor: typeof AnimationLoopTemplate,\n props?: MakeAnimationLoopProps\n): AnimationLoop {\n let renderLoop: AnimationLoopTemplate | null = null;\n\n const device =\n props?.device ||\n luma.createDevice({id: 'animation-loop', adapters: props?.adapters, createCanvasContext: true});\n\n // Create an animation loop;\n const animationLoop = new AnimationLoop({\n ...props,\n\n device,\n\n async onInitialize(animationProps: AnimationProps): Promise<unknown> {\n clearError(animationProps.animationLoop.device!);\n try {\n // @ts-expect-error abstract to prevent instantiation\n renderLoop = new AnimationLoopTemplateCtor(animationProps);\n // Any async loading can be handled here\n return await renderLoop?.onInitialize(animationProps);\n } catch (error) {\n setError(animationProps.animationLoop.device!, error as Error);\n return null;\n }\n },\n\n onRender: (animationProps: AnimationProps) => renderLoop?.onRender(animationProps),\n\n onFinalize: (animationProps: AnimationProps) => renderLoop?.onFinalize(animationProps)\n });\n\n // @ts-expect-error Hack: adds info for the website to find\n animationLoop.getInfo = () => {\n // @ts-ignore\n // eslint-disable-next-line no-invalid-this\n return this.AnimationLoopTemplateCtor.info;\n };\n\n return animationLoop;\n}\n\nfunction setError(device: Device, error: Error): void {\n const canvas = device?.getDefaultCanvasContext().canvas;\n if (canvas instanceof HTMLCanvasElement) {\n canvas.style.overflow = 'visible';\n let errorDiv = document.getElementById('animation-loop-error');\n errorDiv?.remove();\n errorDiv = document.createElement('h1');\n errorDiv.id = 'animation-loop-error';\n errorDiv.innerHTML = error.message;\n errorDiv.style.position = 'absolute';\n errorDiv.style.top = '10px'; // left: 50%; transform: translate(-50%, -50%);';\n errorDiv.style.left = '10px';\n errorDiv.style.color = 'black';\n errorDiv.style.backgroundColor = 'red';\n canvas.parentElement?.appendChild(errorDiv);\n // canvas.style.position = 'absolute';\n }\n}\n\nfunction clearError(device: Device): void {\n const errorDiv = document.getElementById('animation-loop-error');\n if (errorDiv) {\n errorDiv.remove();\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n// A lot of imports, but then Model is where it all comes together...\nimport type {TypedArray} from '@math.gl/types';\nimport type {\n RenderPipelineProps,\n RenderPipelineParameters,\n BufferLayout,\n Shader,\n VertexArray,\n TransformFeedback,\n AttributeInfo,\n Binding,\n PrimitiveTopology\n} from '@luma.gl/core';\nimport {\n Device,\n DeviceFeature,\n Buffer,\n Texture,\n TextureView,\n Sampler,\n RenderPipeline,\n RenderPass,\n UniformStore,\n log,\n getTypedArrayConstructor,\n getAttributeInfosFromLayouts\n} from '@luma.gl/core';\n\nimport type {ShaderModule, PlatformInfo} from '@luma.gl/shadertools';\nimport {ShaderAssembler, getShaderLayoutFromWGSL} from '@luma.gl/shadertools';\n\nimport type {Geometry} from '../geometry/geometry';\nimport {GPUGeometry, makeGPUGeometry} from '../geometry/gpu-geometry';\nimport {PipelineFactory} from '../factories/pipeline-factory';\nimport {ShaderFactory} from '../factories/shader-factory';\nimport {getDebugTableForShaderLayout} from '../debug/debug-shader-layout';\nimport {debugFramebuffer} from '../debug/debug-framebuffer';\nimport {deepEqual} from '../utils/deep-equal';\nimport {BufferLayoutHelper} from '../utils/buffer-layout-helper';\nimport {sortedBufferLayoutByShaderSourceLocations} from '../utils/buffer-layout-order';\nimport {uid} from '../utils/uid';\nimport {ShaderInputs} from '../shader-inputs';\nimport {AsyncTexture} from '../async-texture/async-texture';\n\nconst LOG_DRAW_PRIORITY = 2;\nconst LOG_DRAW_TIMEOUT = 10000;\n\nexport type ModelProps = Omit<RenderPipelineProps, 'vs' | 'fs' | 'bindings'> & {\n source?: string;\n vs?: string | null;\n fs?: string | null;\n\n /** shadertool shader modules (added to shader code) */\n modules?: ShaderModule[];\n /** Shadertool module defines (configures shader code)*/\n defines?: Record<string, boolean>;\n // TODO - injections, hooks etc?\n\n /** Shader inputs, used to generated uniform buffers and bindings */\n shaderInputs?: ShaderInputs;\n /** Bindings */\n bindings?: Record<string, Binding | AsyncTexture>;\n /** Parameters that are built into the pipeline */\n parameters?: RenderPipelineParameters;\n\n /** Geometry */\n geometry?: GPUGeometry | Geometry | null;\n\n /** @deprecated Use instanced rendering? Will be auto-detected in 9.1 */\n isInstanced?: boolean;\n /** instance count */\n instanceCount?: number;\n /** Vertex count */\n vertexCount?: number;\n\n indexBuffer?: Buffer | null;\n /** @note this is really a map of buffers, not a map of attributes */\n attributes?: Record<string, Buffer>;\n /** */\n constantAttributes?: Record<string, TypedArray>;\n\n /** Some applications intentionally supply unused attributes and bindings, and want to disable warnings */\n disableWarnings?: boolean;\n\n /** @internal For use with {@link TransformFeedback}, WebGL only. */\n varyings?: string[];\n\n transformFeedback?: TransformFeedback;\n\n /** Show shader source in browser? */\n debugShaders?: 'never' | 'errors' | 'warnings' | 'always';\n\n /** Factory used to create a {@link RenderPipeline}. Defaults to {@link Device} default factory. */\n pipelineFactory?: PipelineFactory;\n /** Factory used to create a {@link Shader}. Defaults to {@link Device} default factory. */\n shaderFactory?: ShaderFactory;\n /** Shader assembler. Defaults to the ShaderAssembler.getShaderAssembler() */\n shaderAssembler?: ShaderAssembler;\n};\n\n/**\n * v9 Model API\n * A model\n * - automatically reuses pipelines (programs) when possible\n * - automatically rebuilds pipelines if necessary to accommodate changed settings\n * shadertools integration\n * - accepts modules and performs shader transpilation\n */\nexport class Model {\n static defaultProps: Required<ModelProps> = {\n ...RenderPipeline.defaultProps,\n source: undefined!,\n vs: null,\n fs: null,\n id: 'unnamed',\n handle: undefined,\n userData: {},\n defines: {},\n modules: [],\n geometry: null,\n indexBuffer: null,\n attributes: {},\n constantAttributes: {},\n varyings: [],\n\n isInstanced: undefined!,\n instanceCount: 0,\n vertexCount: 0,\n\n shaderInputs: undefined!,\n pipelineFactory: undefined!,\n shaderFactory: undefined!,\n transformFeedback: undefined!,\n shaderAssembler: ShaderAssembler.getDefaultShaderAssembler(),\n\n debugShaders: undefined!,\n disableWarnings: undefined!\n };\n\n readonly device: Device;\n readonly id: string;\n // @ts-expect-error assigned in function called from constructor\n readonly source: string;\n // @ts-expect-error assigned in function called from constructor\n readonly vs: string;\n // @ts-expect-error assigned in function called from constructor\n readonly fs: string;\n readonly pipelineFactory: PipelineFactory;\n readonly shaderFactory: ShaderFactory;\n userData: {[key: string]: any} = {};\n\n // Fixed properties (change can trigger pipeline rebuild)\n\n /** The render pipeline GPU parameters, depth testing etc */\n parameters: RenderPipelineParameters;\n\n /** The primitive topology */\n topology: PrimitiveTopology;\n /** Buffer layout */\n bufferLayout: BufferLayout[];\n\n // Dynamic properties\n\n /** Use instanced rendering */\n isInstanced: boolean | undefined = undefined;\n /** instance count. `undefined` means not instanced */\n instanceCount: number = 0;\n /** Vertex count */\n vertexCount: number;\n\n /** Index buffer */\n indexBuffer: Buffer | null = null;\n /** Buffer-valued attributes */\n bufferAttributes: Record<string, Buffer> = {};\n /** Constant-valued attributes */\n constantAttributes: Record<string, TypedArray> = {};\n /** Bindings (textures, samplers, uniform buffers) */\n bindings: Record<string, Binding | AsyncTexture> = {};\n\n /**\n * VertexArray\n * @note not implemented: if bufferLayout is updated, vertex array has to be rebuilt!\n * @todo - allow application to define multiple vertex arrays?\n * */\n vertexArray: VertexArray;\n\n /** TransformFeedback, WebGL 2 only. */\n transformFeedback: TransformFeedback | null = null;\n\n /** The underlying GPU \"program\". @note May be recreated if parameters change */\n pipeline: RenderPipeline;\n\n /** ShaderInputs instance */\n // @ts-expect-error Assigned in function called by constructor\n shaderInputs: ShaderInputs;\n // @ts-expect-error Assigned in function called by constructor\n _uniformStore: UniformStore;\n\n _attributeInfos: Record<string, AttributeInfo> = {};\n _gpuGeometry: GPUGeometry | null = null;\n private props: Required<ModelProps>;\n\n _pipelineNeedsUpdate: string | false = 'newly created';\n private _needsRedraw: string | false = 'initializing';\n private _destroyed = false;\n\n /** \"Time\" of last draw. Monotonically increasing timestamp */\n _lastDrawTimestamp: number = -1;\n\n get [Symbol.toStringTag](): string {\n return 'Model';\n }\n\n toString(): string {\n return `Model(${this.id})`;\n }\n\n constructor(device: Device, props: ModelProps) {\n this.props = {...Model.defaultProps, ...props};\n props = this.props;\n this.id = props.id || uid('model');\n this.device = device;\n\n Object.assign(this.userData, props.userData);\n\n // Setup shader module inputs\n const moduleMap = Object.fromEntries(\n this.props.modules?.map(module => [module.name, module]) || []\n );\n\n const shaderInputs =\n props.shaderInputs ||\n new ShaderInputs(moduleMap, {disableWarnings: this.props.disableWarnings});\n // @ts-ignore\n this.setShaderInputs(shaderInputs);\n\n // Setup shader assembler\n const platformInfo = getPlatformInfo(device);\n\n // Extract modules from shader inputs if not supplied\n const modules =\n // @ts-ignore shaderInputs is assigned in setShaderInputs above.\n (this.props.modules?.length > 0 ? this.props.modules : this.shaderInputs?.getModules()) || [];\n\n const isWebGPU = this.device.type === 'webgpu';\n\n // WebGPU\n // TODO - hack to support unified WGSL shader\n // TODO - this is wrong, compile a single shader\n if (isWebGPU && this.props.source) {\n // WGSL\n const {source, getUniforms} = this.props.shaderAssembler.assembleWGSLShader({\n platformInfo,\n ...this.props,\n modules\n });\n this.source = source;\n // @ts-expect-error\n this._getModuleUniforms = getUniforms;\n // Extract shader layout after modules have been added to WGSL source, to include any bindings added by modules\n this.props.shaderLayout ||= getShaderLayoutFromWGSL(this.source);\n } else {\n // GLSL\n const {vs, fs, getUniforms} = this.props.shaderAssembler.assembleGLSLShaderPair({\n platformInfo,\n ...this.props,\n modules\n });\n\n this.vs = vs;\n this.fs = fs;\n // @ts-expect-error\n this._getModuleUniforms = getUniforms;\n }\n\n this.vertexCount = this.props.vertexCount;\n this.instanceCount = this.props.instanceCount;\n\n this.topology = this.props.topology;\n this.bufferLayout = this.props.bufferLayout;\n this.parameters = this.props.parameters;\n\n // Geometry, if provided, sets topology and vertex cound\n if (props.geometry) {\n this.setGeometry(props.geometry);\n }\n\n this.pipelineFactory =\n props.pipelineFactory || PipelineFactory.getDefaultPipelineFactory(this.device);\n this.shaderFactory = props.shaderFactory || ShaderFactory.getDefaultShaderFactory(this.device);\n\n // Create the pipeline\n // @note order is important\n this.pipeline = this._updatePipeline();\n\n this.vertexArray = device.createVertexArray({\n shaderLayout: this.pipeline.shaderLayout,\n bufferLayout: this.pipeline.bufferLayout\n });\n\n // Now we can apply geometry attributes\n if (this._gpuGeometry) {\n this._setGeometryAttributes(this._gpuGeometry);\n }\n\n // Apply any dynamic settings that will not trigger pipeline change\n if ('isInstanced' in props) {\n this.isInstanced = props.isInstanced;\n }\n\n if (props.instanceCount) {\n this.setInstanceCount(props.instanceCount);\n }\n if (props.vertexCount) {\n this.setVertexCount(props.vertexCount);\n }\n if (props.indexBuffer) {\n this.setIndexBuffer(props.indexBuffer);\n }\n if (props.attributes) {\n this.setAttributes(props.attributes);\n }\n if (props.constantAttributes) {\n this.setConstantAttributes(props.constantAttributes);\n }\n if (props.bindings) {\n this.setBindings(props.bindings);\n }\n if (props.transformFeedback) {\n this.transformFeedback = props.transformFeedback;\n }\n\n // Catch any access to non-standard props\n Object.seal(this);\n }\n\n destroy(): void {\n if (!this._destroyed) {\n // Release pipeline before we destroy the shaders used by the pipeline\n this.pipelineFactory.release(this.pipeline);\n // Release the shaders\n this.shaderFactory.release(this.pipeline.vs);\n if (this.pipeline.fs) {\n this.shaderFactory.release(this.pipeline.fs);\n }\n this._uniformStore.destroy();\n // TODO - mark resource as managed and destroyIfManaged() ?\n this._gpuGeometry?.destroy();\n this._destroyed = true;\n }\n }\n\n // Draw call\n\n /** Query redraw status. Clears the status. */\n needsRedraw(): false | string {\n // Catch any writes to already bound resources\n if (this._getBindingsUpdateTimestamp() > this._lastDrawTimestamp) {\n this.setNeedsRedraw('contents of bound textures or buffers updated');\n }\n const needsRedraw = this._needsRedraw;\n this._needsRedraw = false;\n return needsRedraw;\n }\n\n /** Mark the model as needing a redraw */\n setNeedsRedraw(reason: string): void {\n this._needsRedraw ||= reason;\n }\n\n predraw(): void {\n // Update uniform buffers if needed\n this.updateShaderInputs();\n // Check if the pipeline is invalidated\n this.pipeline = this._updatePipeline();\n }\n\n draw(renderPass: RenderPass): boolean {\n const loadingBinding = this._areBindingsLoading();\n if (loadingBinding) {\n log.info(LOG_DRAW_PRIORITY, `>>> DRAWING ABORTED ${this.id}: ${loadingBinding} not loaded`)();\n return false;\n }\n\n try {\n renderPass.pushDebugGroup(`${this}.predraw(${renderPass})`);\n this.predraw();\n } finally {\n renderPass.popDebugGroup();\n }\n\n let drawSuccess: boolean;\n try {\n renderPass.pushDebugGroup(`${this}.draw(${renderPass})`);\n this._logDrawCallStart();\n\n // Update the pipeline if invalidated\n // TODO - inside RenderPass is likely the worst place to do this from performance perspective.\n // Application can call Model.predraw() to avoid this.\n this.pipeline = this._updatePipeline();\n\n // Set pipeline state, we may be sharing a pipeline so we need to set all state on every draw\n // Any caching needs to be done inside the pipeline functions\n // TODO this is a busy initialized check for all bindings every frame\n\n const syncBindings = this._getBindings();\n this.pipeline.setBindings(syncBindings, {\n disableWarnings: this.props.disableWarnings\n });\n\n const {indexBuffer} = this.vertexArray;\n const indexCount = indexBuffer\n ? indexBuffer.byteLength / (indexBuffer.indexType === 'uint32' ? 4 : 2)\n : undefined;\n\n drawSuccess = this.pipeline.draw({\n renderPass,\n vertexArray: this.vertexArray,\n isInstanced: this.isInstanced,\n vertexCount: this.vertexCount,\n instanceCount: this.instanceCount,\n indexCount,\n transformFeedback: this.transformFeedback || undefined,\n // WebGL shares underlying cached pipelines even for models that have different parameters and topology,\n // so we must provide our unique parameters to each draw\n // (In WebGPU most parameters are encoded in the pipeline and cannot be changed per draw call)\n parameters: this.parameters,\n topology: this.topology\n });\n } finally {\n renderPass.popDebugGroup();\n this._logDrawCallEnd();\n }\n this._logFramebuffer(renderPass);\n\n // Update needsRedraw flag\n if (drawSuccess) {\n this._lastDrawTimestamp = this.device.timestamp;\n this._needsRedraw = false;\n } else {\n this._needsRedraw = 'waiting for resource initialization';\n }\n return drawSuccess;\n }\n\n // Update fixed fields (can trigger pipeline rebuild)\n\n /**\n * Updates the optional geometry\n * Geometry, set topology and bufferLayout\n * @note Can trigger a pipeline rebuild / pipeline cache fetch on WebGPU\n */\n setGeometry(geometry: GPUGeometry | Geometry | null): void {\n this._gpuGeometry?.destroy();\n const gpuGeometry = geometry && makeGPUGeometry(this.device, geometry);\n if (gpuGeometry) {\n this.setTopology(gpuGeometry.topology || 'triangle-list');\n const bufferLayoutHelper = new BufferLayoutHelper(this.bufferLayout);\n this.bufferLayout = bufferLayoutHelper.mergeBufferLayouts(\n gpuGeometry.bufferLayout,\n this.bufferLayout\n );\n if (this.vertexArray) {\n this._setGeometryAttributes(gpuGeometry);\n }\n }\n this._gpuGeometry = gpuGeometry;\n }\n\n /**\n * Updates the primitive topology ('triangle-list', 'triangle-strip' etc).\n * @note Triggers a pipeline rebuild / pipeline cache fetch on WebGPU\n */\n setTopology(topology: PrimitiveTopology): void {\n if (topology !== this.topology) {\n this.topology = topology;\n this._setPipelineNeedsUpdate('topology');\n }\n }\n\n /**\n * Updates the buffer layout.\n * @note Triggers a pipeline rebuild / pipeline cache fetch\n */\n setBufferLayout(bufferLayout: BufferLayout[]): void {\n const bufferLayoutHelper = new BufferLayoutHelper(this.bufferLayout);\n this.bufferLayout = this._gpuGeometry\n ? bufferLayoutHelper.mergeBufferLayouts(bufferLayout, this._gpuGeometry.bufferLayout)\n : bufferLayout;\n this._setPipelineNeedsUpdate('bufferLayout');\n\n // Recreate the pipeline\n this.pipeline = this._updatePipeline();\n\n // vertex array needs to be updated if we update buffer layout,\n // but not if we update parameters\n this.vertexArray = this.device.createVertexArray({\n shaderLayout: this.pipeline.shaderLayout,\n bufferLayout: this.pipeline.bufferLayout\n });\n\n // Reapply geometry attributes to the new vertex array\n if (this._gpuGeometry) {\n this._setGeometryAttributes(this._gpuGeometry);\n }\n }\n\n /**\n * Set GPU parameters.\n * @note Can trigger a pipeline rebuild / pipeline cache fetch.\n * @param parameters\n */\n setParameters(parameters: RenderPipelineParameters) {\n if (!deepEqual(parameters, this.parameters, 2)) {\n this.parameters = parameters;\n this._setPipelineNeedsUpdate('parameters');\n }\n }\n\n // Update dynamic fields\n\n /**\n * Updates the instance count (used in draw calls)\n * @note Any attributes with stepMode=instance need to be at least this big\n */\n setInstanceCount(instanceCount: number): void {\n this.instanceCount = instanceCount;\n // luma.gl examples don't set props.isInstanced and rely on auto-detection\n // but deck.gl sets instanceCount even for models that are not instanced.\n if (this.isInstanced === undefined && instanceCount > 0) {\n this.isInstanced = true;\n }\n this.setNeedsRedraw('instanceCount');\n }\n\n /**\n * Updates the vertex count (used in draw calls)\n * @note Any attributes with stepMode=vertex need to be at least this big\n */\n setVertexCount(vertexCount: number): void {\n this.vertexCount = vertexCount;\n this.setNeedsRedraw('vertexCount');\n }\n\n /** Set the shader inputs */\n setShaderInputs(shaderInputs: ShaderInputs): void {\n this.shaderInputs = shaderInputs;\n this._uniformStore = new UniformStore(this.shaderInputs.modules);\n // Create uniform buffer bindings for all modules that actually have uniforms\n for (const [moduleName, module] of Object.entries(this.shaderInputs.modules)) {\n if (shaderModuleHasUniforms(module)) {\n const uniformBuffer = this._uniformStore.getManagedUniformBuffer(this.device, moduleName);\n this.bindings[`${moduleName}Uniforms`] = uniformBuffer;\n }\n }\n this.setNeedsRedraw('shaderInputs');\n }\n\n /** Update uniform buffers from the model's shader inputs */\n updateShaderInputs(): void {\n this._uniformStore.setUniforms(this.shaderInputs.getUniformValues());\n this.setBindings(this.shaderInputs.getBindingValues());\n // TODO - this is already tracked through buffer/texture update times?\n this.setNeedsRedraw('shaderInputs');\n }\n\n /**\n * Sets bindings (textures, samplers, uniform buffers)\n */\n setBindings(bindings: Record<string, Binding | AsyncTexture>): void {\n Object.assign(this.bindings, bindings);\n this.setNeedsRedraw('bindings');\n }\n\n /**\n * Updates optional transform feedback. WebGL only.\n */\n setTransformFeedback(transformFeedback: TransformFeedback | null): void {\n this.transformFeedback = transformFeedback;\n this.setNeedsRedraw('transformFeedback');\n }\n\n /**\n * Sets the index buffer\n * @todo - how to unset it if we change geometry?\n */\n setIndexBuffer(indexBuffer: Buffer | null): void {\n this.vertexArray.setIndexBuffer(indexBuffer);\n this.setNeedsRedraw('indexBuffer');\n }\n\n /**\n * Sets attributes (buffers)\n * @note Overrides any attributes previously set with the same name\n */\n setAttributes(buffers: Record<string, Buffer>, options?: {disableWarnings?: boolean}): void {\n const disableWarnings = options?.disableWarnings ?? this.props.disableWarnings;\n if (buffers['indices']) {\n log.warn(\n `Model:${this.id} setAttributes() - indexBuffer should be set using setIndexBuffer()`\n )();\n }\n\n // ensure bufferLayout order matches source layout so we bind\n // the correct buffers to the correct indices in webgpu.\n this.bufferLayout = sortedBufferLayoutByShaderSourceLocations(\n this.pipeline.shaderLayout,\n this.bufferLayout\n );\n const bufferLayoutHelper = new BufferLayoutHelper(this.bufferLayout);\n\n // Check if all buffers have a layout\n for (const [bufferName, buffer] of Object.entries(buffers)) {\n const bufferLayout = bufferLayoutHelper.getBufferLayout(bufferName);\n if (!bufferLayout) {\n if (!disableWarnings) {\n log.warn(`Model(${this.id}): Missing layout for buffer \"${bufferName}\".`)();\n }\n continue; // eslint-disable-line no-continue\n }\n\n // In WebGL, for an interleaved attribute we may need to set multiple attributes\n // but in WebGPU, we set it according to the buffer's position in the vertexArray\n const attributeNames = bufferLayoutHelper.getAttributeNamesForBuffer(bufferLayout);\n let set = false;\n for (const attributeName of attributeNames) {\n const attributeInfo = this._attributeInfos[attributeName];\n if (attributeInfo) {\n const location =\n this.device.type === 'webgpu'\n ? bufferLayoutHelper.getBufferIndex(attributeInfo.bufferName)\n : attributeInfo.location;\n\n this.vertexArray.setBuffer(location, buffer);\n set = true;\n }\n }\n if (!set && !disableWarnings) {\n log.warn(\n `Model(${this.id}): Ignoring buffer \"${buffer.id}\" for unknown attribute \"${bufferName}\"`\n )();\n }\n }\n this.setNeedsRedraw('attributes');\n }\n\n /**\n * Sets constant attributes\n * @note Overrides any attributes previously set with the same name\n * Constant attributes are only supported in WebGL, not in WebGPU\n * Any attribute that is disabled in the current vertex array object\n * is read from the context's global constant value for that attribute location.\n * @param constantAttributes\n */\n setConstantAttributes(\n attributes: Record<string, TypedArray>,\n options?: {disableWarnings?: boolean}\n ): void {\n for (const [attributeName, value] of Object.entries(attributes)) {\n const attributeInfo = this._attributeInfos[attributeName];\n if (attributeInfo) {\n this.vertexArray.setConstantWebGL(attributeInfo.location, value);\n } else if (!(options?.disableWarnings ?? this.props.disableWarnings)) {\n log.warn(\n `Model \"${this.id}: Ignoring constant supplied for unknown attribute \"${attributeName}\"`\n )();\n }\n }\n this.setNeedsRedraw('constants');\n }\n\n // INTERNAL METHODS\n\n /** Check that bindings are loaded. Returns id of first binding that is still loading. */\n _areBindingsLoading(): string | false {\n for (const binding of Object.values(this.bindings)) {\n if (binding instanceof AsyncTexture && !binding.isReady) {\n return binding.id;\n }\n }\n return false;\n }\n\n /** Extracts texture view from loaded async textures. Returns null if any textures have not yet been loaded. */\n _getBindings(): Record<string, Binding> {\n const validBindings: Record<string, Binding> = {};\n\n for (const [name, binding] of Object.entries(this.bindings)) {\n if (binding instanceof AsyncTexture) {\n // Check that async textures are loaded\n if (binding.isReady) {\n validBindings[name] = binding.texture;\n }\n } else {\n validBindings[name] = binding;\n }\n }\n\n return validBindings;\n }\n\n /** Get the timestamp of the latest updated bound GPU memory resource (buffer/texture). */\n _getBindingsUpdateTimestamp(): number {\n let timestamp = 0;\n for (const binding of Object.values(this.bindings)) {\n if (binding instanceof TextureView) {\n timestamp = Math.max(timestamp, binding.texture.updateTimestamp);\n } else if (binding instanceof Buffer || binding instanceof Texture) {\n timestamp = Math.max(timestamp, binding.updateTimestamp);\n } else if (binding instanceof AsyncTexture) {\n timestamp = binding.texture\n ? Math.max(timestamp, binding.texture.updateTimestamp)\n : // The texture will become available in the future\n Infinity;\n } else if (!(binding instanceof Sampler)) {\n timestamp = Math.max(timestamp, binding.buffer.updateTimestamp);\n }\n }\n return timestamp;\n }\n\n /**\n * Updates the optional geometry attributes\n * Geometry, sets several attributes, indexBuffer, and also vertex count\n * @note Can trigger a pipeline rebuild / pipeline cache fetch on WebGPU\n */\n _setGeometryAttributes(gpuGeometry: GPUGeometry): void {\n // Filter geometry attribute so that we don't issue warnings for unused attributes\n const attributes = {...gpuGeometry.attributes};\n for (const [attributeName] of Object.entries(attributes)) {\n if (\n !this.pipeline.shaderLayout.attributes.find(layout => layout.name === attributeName) &&\n attributeName !== 'positions'\n ) {\n delete attributes[attributeName];\n }\n }\n\n // TODO - delete previous geometry?\n this.vertexCount = gpuGeometry.vertexCount;\n this.setIndexBuffer(gpuGeometry.indices || null);\n this.setAttributes(gpuGeometry.attributes, {disableWarnings: true});\n this.setAttributes(attributes, {disableWarnings: this.props.disableWarnings});\n\n this.setNeedsRedraw('geometry attributes');\n }\n\n /** Mark pipeline as needing update */\n _setPipelineNeedsUpdate(reason: string): void {\n this._pipelineNeedsUpdate ||= reason;\n this.setNeedsRedraw(reason);\n }\n\n /** Update pipeline if needed */\n _updatePipeline(): RenderPipeline {\n if (this._pipelineNeedsUpdate) {\n let prevShaderVs: Shader | null = null;\n let prevShaderFs: Shader | null = null;\n if (this.pipeline) {\n log.log(\n 1,\n `Model ${this.id}: Recreating pipeline because \"${this._pipelineNeedsUpdate}\".`\n )();\n prevShaderVs = this.pipeline.vs;\n prevShaderFs = this.pipeline.fs;\n }\n\n this._pipelineNeedsUpdate = false;\n\n const vs = this.shaderFactory.createShader({\n id: `${this.id}-vertex`,\n stage: 'vertex',\n source: this.source || this.vs,\n debugShaders: this.props.debugShaders\n });\n\n let fs: Shader | null = null;\n if (this.source) {\n fs = vs;\n } else if (this.fs) {\n fs = this.shaderFactory.createShader({\n id: `${this.id}-fragment`,\n stage: 'fragment',\n source: this.source || this.fs,\n debugShaders: this.props.debugShaders\n });\n }\n\n this.pipeline = this.pipelineFactory.createRenderPipeline({\n ...this.props,\n bufferLayout: this.bufferLayout,\n topology: this.topology,\n parameters: this.parameters,\n // TODO - why set bindings here when we reset them every frame?\n // Should we expose a BindGroup abstraction?\n bindings: this._getBindings(),\n vs,\n fs\n });\n\n this._attributeInfos = getAttributeInfosFromLayouts(\n this.pipeline.shaderLayout,\n this.bufferLayout\n );\n\n if (prevShaderVs) this.shaderFactory.release(prevShaderVs);\n if (prevShaderFs) this.shaderFactory.release(prevShaderFs);\n }\n return this.pipeline;\n }\n\n /** Throttle draw call logging */\n _lastLogTime = 0;\n _logOpen = false;\n\n _logDrawCallStart(): void {\n // IF level is 4 or higher, log every frame.\n const logDrawTimeout = log.level > 3 ? 0 : LOG_DRAW_TIMEOUT;\n if (log.level < 2 || Date.now() - this._lastLogTime < logDrawTimeout) {\n return;\n }\n\n this._lastLogTime = Date.now();\n this._logOpen = true;\n\n log.group(LOG_DRAW_PRIORITY, `>>> DRAWING MODEL ${this.id}`, {collapsed: log.level <= 2})();\n }\n\n _logDrawCallEnd(): void {\n if (this._logOpen) {\n const shaderLayoutTable = getDebugTableForShaderLayout(this.pipeline.shaderLayout, this.id);\n\n // log.table(logLevel, attributeTable)();\n // log.table(logLevel, uniformTable)();\n log.table(LOG_DRAW_PRIORITY, shaderLayoutTable)();\n\n const uniformTable = this.shaderInputs.getDebugTable();\n log.table(LOG_DRAW_PRIORITY, uniformTable)();\n\n const attributeTable = this._getAttributeDebugTable();\n log.table(LOG_DRAW_PRIORITY, this._attributeInfos)();\n log.table(LOG_DRAW_PRIORITY, attributeTable)();\n\n log.groupEnd(LOG_DRAW_PRIORITY)();\n this._logOpen = false;\n }\n }\n\n protected _drawCount = 0;\n _logFramebuffer(renderPass: RenderPass): void {\n const debugFramebuffers = this.device.props.debugFramebuffers;\n this._drawCount++;\n // Update first 3 frames and then every 60 frames\n if (!debugFramebuffers) {\n // } || (this._drawCount++ > 3 && this._drawCount % 60)) {\n return;\n }\n // TODO - display framebuffer output in debug window\n const framebuffer = renderPass.props.framebuffer;\n if (framebuffer) {\n debugFramebuffer(framebuffer, {id: framebuffer.id, minimap: true});\n // log.image({logLevel: LOG_DRAW_PRIORITY, message: `${framebuffer.id} %c sup?`, image})();\n }\n }\n\n _getAttributeDebugTable(): Record<string, Record<string, unknown>> {\n const table: Record<string, Record<string, unknown>> = {};\n for (const [name, attributeInfo] of Object.entries(this._attributeInfos)) {\n const values = this.vertexArray.attributes[attributeInfo.location];\n table[attributeInfo.location] = {\n name,\n type: attributeInfo.shaderType,\n values: values\n ? this._getBufferOrConstantValues(values, attributeInfo.bufferDataType)\n : 'null'\n };\n }\n if (this.vertexArray.indexBuffer) {\n const {indexBuffer} = this.vertexArray;\n const values =\n indexBuffer.indexType === 'uint32'\n ? new Uint32Array(indexBuffer.debugData)\n : new Uint16Array(indexBuffer.debugData);\n table['indices'] = {\n name: 'indices',\n type: indexBuffer.indexType,\n values: values.toString()\n };\n }\n return table;\n }\n\n // TODO - fix typing of luma data types\n _getBufferOrConstantValues(attribute: Buffer | TypedArray, dataType: any): string {\n const TypedArrayConstructor = getTypedArrayConstructor(dataType);\n const typedArray =\n attribute instanceof Buffer ? new TypedArrayConstructor(attribute.debugData) : attribute;\n return typedArray.toString();\n }\n}\n\nfunction shaderModuleHasUniforms(module: ShaderModule): boolean {\n return Boolean(module.uniformTypes && !isObjectEmpty(module.uniformTypes));\n}\n\n// HELPERS\n\n/** Create a shadertools platform info from the Device */\nexport function getPlatformInfo(device: Device): PlatformInfo {\n return {\n type: device.type,\n shaderLanguage: device.info.shadingLanguage,\n shaderLanguageVersion: device.info.shadingLanguageVersion as 100 | 300,\n gpu: device.info.gpu,\n // HACK - we pretend that the DeviceFeatures is a Set, it has a similar API\n features: device.features as unknown as Set<DeviceFeature>\n };\n}\n\n/** Returns true if given object is empty, false otherwise. */\nfunction isObjectEmpty(obj: object): boolean {\n // @ts-ignore key is unused\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n for (const key in obj) {\n return false;\n }\n return true;\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {PrimitiveTopology, BufferLayout} from '@luma.gl/core';\nimport {Device, Buffer, getVertexFormatFromAttribute} from '@luma.gl/core';\nimport type {Geometry} from '../geometry/geometry';\nimport {uid} from '../utils/uid';\n\nexport type GPUGeometryProps = {\n id?: string;\n /** Determines how vertices are read from the 'vertex' attributes */\n topology: 'point-list' | 'line-list' | 'line-strip' | 'triangle-list' | 'triangle-strip';\n /** Auto calculated from attributes if not provided */\n vertexCount: number;\n bufferLayout: BufferLayout[];\n indices?: Buffer | null;\n attributes: Record<string, Buffer>;\n};\n\nexport class GPUGeometry {\n readonly id: string;\n userData: Record<string, unknown> = {};\n\n /** Determines how vertices are read from the 'vertex' attributes */\n readonly topology?: PrimitiveTopology;\n readonly bufferLayout: BufferLayout[] = [];\n\n readonly vertexCount: number;\n readonly indices?: Buffer | null;\n readonly attributes: Record<string, Buffer>;\n\n constructor(props: GPUGeometryProps) {\n this.id = props.id || uid('geometry');\n this.topology = props.topology;\n this.indices = props.indices || null;\n this.attributes = props.attributes;\n\n this.vertexCount = props.vertexCount;\n\n this.bufferLayout = props.bufferLayout || [];\n\n if (this.indices) {\n if (!(this.indices.usage & Buffer.INDEX)) {\n throw new Error('Index buffer must have INDEX usage');\n }\n }\n }\n\n destroy(): void {\n this.indices?.destroy();\n for (const attribute of Object.values(this.attributes)) {\n attribute.destroy();\n }\n }\n\n getVertexCount(): number {\n return this.vertexCount;\n }\n\n getAttributes(): Record<string, Buffer> {\n return this.attributes;\n }\n\n getIndexes(): Buffer | null {\n return this.indices || null;\n }\n\n _calculateVertexCount(positions: Buffer): number {\n // Assume that positions is a fully packed float32x3 buffer\n const vertexCount = positions.byteLength / 12;\n return vertexCount;\n }\n}\n\nexport function makeGPUGeometry(device: Device, geometry: Geometry | GPUGeometry): GPUGeometry {\n if (geometry instanceof GPUGeometry) {\n return geometry;\n }\n\n const indices = getIndexBufferFromGeometry(device, geometry);\n const {attributes, bufferLayout} = getAttributeBuffersFromGeometry(device, geometry);\n return new GPUGeometry({\n topology: geometry.topology || 'triangle-list',\n bufferLayout,\n vertexCount: geometry.vertexCount,\n indices,\n attributes\n });\n}\n\nexport function getIndexBufferFromGeometry(device: Device, geometry: Geometry): Buffer | undefined {\n if (!geometry.indices) {\n return undefined;\n }\n const data = geometry.indices.value;\n return device.createBuffer({usage: Buffer.INDEX, data});\n}\n\nexport function getAttributeBuffersFromGeometry(\n device: Device,\n geometry: Geometry\n): {attributes: Record<string, Buffer>; bufferLayout: BufferLayout[]; vertexCount: number} {\n const bufferLayout: BufferLayout[] = [];\n\n const attributes: Record<string, Buffer> = {};\n for (const [attributeName, attribute] of Object.entries(geometry.attributes)) {\n let name: string = attributeName;\n // TODO Map some GLTF attribute names (is this still needed?)\n switch (attributeName) {\n case 'POSITION':\n name = 'positions';\n break;\n case 'NORMAL':\n name = 'normals';\n break;\n case 'TEXCOORD_0':\n name = 'texCoords';\n break;\n case 'COLOR_0':\n name = 'colors';\n break;\n }\n if (attribute) {\n attributes[name] = device.createBuffer({\n data: attribute.value,\n id: `${attributeName}-buffer`\n });\n const {value, size, normalized} = attribute;\n // @ts-expect-error\n bufferLayout.push({name, format: getVertexFormatFromAttribute(value, size, normalized)});\n }\n }\n\n const vertexCount = geometry._calculateVertexCount(geometry.attributes, geometry.indices);\n\n return {attributes, bufferLayout, vertexCount};\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nconst uidCounters: Record<string, number> = {};\n\n/**\n * Returns a UID.\n * @param id= - Identifier base name\n * @return uid\n **/\nexport function uid(id: string = 'id'): string {\n uidCounters[id] = uidCounters[id] || 1;\n const count = uidCounters[id]++;\n return `${id}-${count}`;\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {RenderPipelineProps, ComputePipelineProps} from '@luma.gl/core';\nimport {Device, RenderPipeline, ComputePipeline, log} from '@luma.gl/core';\nimport {uid} from '../utils/uid';\n\nexport type PipelineFactoryProps = RenderPipelineProps;\n\ntype RenderPipelineCacheItem = {pipeline: RenderPipeline; useCount: number};\ntype ComputePipelineCacheItem = {pipeline: ComputePipeline; useCount: number};\n\n/**\n * Efficiently creates / caches pipelines\n */\nexport class PipelineFactory {\n static defaultProps: Required<PipelineFactoryProps> = {...RenderPipeline.defaultProps};\n\n /** Get the singleton default pipeline factory for the specified device */\n static getDefaultPipelineFactory(device: Device): PipelineFactory {\n device._lumaData['defaultPipelineFactory'] =\n device._lumaData['defaultPipelineFactory'] || new PipelineFactory(device);\n return device._lumaData['defaultPipelineFactory'] as PipelineFactory;\n }\n\n readonly device: Device;\n readonly cachingEnabled: boolean;\n readonly destroyPolicy: 'unused' | 'never';\n readonly debug: boolean;\n\n private _hashCounter: number = 0;\n private readonly _hashes: Record<string, number> = {};\n private readonly _renderPipelineCache: Record<string, RenderPipelineCacheItem> = {};\n private readonly _computePipelineCache: Record<string, ComputePipelineCacheItem> = {};\n\n get [Symbol.toStringTag](): string {\n return 'PipelineFactory';\n }\n\n toString(): string {\n return `PipelineFactory(${this.device.id})`;\n }\n\n constructor(device: Device) {\n this.device = device;\n this.cachingEnabled = device.props._cachePipelines;\n this.destroyPolicy = device.props._cacheDestroyPolicy;\n this.debug = device.props.debugFactories;\n }\n\n /** Return a RenderPipeline matching supplied props. Reuses an equivalent pipeline if already created. */\n createRenderPipeline(props: RenderPipelineProps): RenderPipeline {\n if (!this.cachingEnabled) {\n return this.device.createRenderPipeline(props);\n }\n\n const allProps: Required<RenderPipelineProps> = {...RenderPipeline.defaultProps, ...props};\n\n const cache = this._renderPipelineCache;\n const hash = this._hashRenderPipeline(allProps);\n\n let pipeline: RenderPipeline = cache[hash]?.pipeline;\n if (!pipeline) {\n pipeline = this.device.createRenderPipeline({\n ...allProps,\n id: allProps.id ? `${allProps.id}-cached` : uid('unnamed-cached')\n });\n pipeline.hash = hash;\n cache[hash] = {pipeline, useCount: 1};\n if (this.debug) {\n log.log(3, `${this}: ${pipeline} created, count=${cache[hash].useCount}`)();\n }\n } else {\n cache[hash].useCount++;\n if (this.debug) {\n log.log(\n 3,\n `${this}: ${cache[hash].pipeline} reused, count=${cache[hash].useCount}, (id=${props.id})`\n )();\n }\n }\n\n return pipeline;\n }\n\n /** Return a ComputePipeline matching supplied props. Reuses an equivalent pipeline if already created. */\n createComputePipeline(props: ComputePipelineProps): ComputePipeline {\n if (!this.cachingEnabled) {\n return this.device.createComputePipeline(props);\n }\n\n const allProps: Required<ComputePipelineProps> = {...ComputePipeline.defaultProps, ...props};\n\n const cache = this._computePipelineCache;\n const hash = this._hashComputePipeline(allProps);\n\n let pipeline: ComputePipeline = cache[hash]?.pipeline;\n if (!pipeline) {\n pipeline = this.device.createComputePipeline({\n ...allProps,\n id: allProps.id ? `${allProps.id}-cached` : undefined\n });\n pipeline.hash = hash;\n cache[hash] = {pipeline, useCount: 1};\n if (this.debug) {\n log.log(3, `${this}: ${pipeline} created, count=${cache[hash].useCount}`)();\n }\n } else {\n cache[hash].useCount++;\n if (this.debug) {\n log.log(\n 3,\n `${this}: ${cache[hash].pipeline} reused, count=${cache[hash].useCount}, (id=${props.id})`\n )();\n }\n }\n\n return pipeline;\n }\n\n release(pipeline: RenderPipeline | ComputePipeline): void {\n if (!this.cachingEnabled) {\n pipeline.destroy();\n return;\n }\n\n const cache = this._getCache(pipeline);\n const hash = pipeline.hash;\n\n cache[hash].useCount--;\n if (cache[hash].useCount === 0) {\n this._destroyPipeline(pipeline);\n if (this.debug) {\n log.log(3, `${this}: ${pipeline} released and destroyed`)();\n }\n } else if (cache[hash].useCount < 0) {\n log.error(`${this}: ${pipeline} released, useCount < 0, resetting`)();\n cache[hash].useCount = 0;\n } else if (this.debug) {\n log.log(3, `${this}: ${pipeline} released, count=${cache[hash].useCount}`)();\n }\n }\n\n // PRIVATE\n\n /** Destroy a cached pipeline, removing it from the cache (depending on destroy policy) */\n private _destroyPipeline(pipeline: RenderPipeline | ComputePipeline): boolean {\n const cache = this._getCache(pipeline);\n\n switch (this.destroyPolicy) {\n case 'never':\n return false;\n case 'unused':\n delete cache[pipeline.hash];\n pipeline.destroy();\n return true;\n }\n }\n\n /** Get the appropriate cache for the type of pipeline */\n private _getCache(\n pipeline: RenderPipeline | ComputePipeline\n ): Record<string, RenderPipelineCacheItem> | Record<string, ComputePipelineCacheItem> {\n let cache:\n | Record<string, RenderPipelineCacheItem>\n | Record<string, ComputePipelineCacheItem>\n | undefined;\n if (pipeline instanceof ComputePipeline) {\n cache = this._computePipelineCache;\n }\n if (pipeline instanceof RenderPipeline) {\n cache = this._renderPipelineCache;\n }\n if (!cache) {\n throw new Error(`${this}`);\n }\n if (!cache[pipeline.hash]) {\n throw new Error(`${this}: ${pipeline} matched incorrect entry`);\n }\n return cache;\n }\n\n /** Calculate a hash based on all the inputs for a compute pipeline */\n private _hashComputePipeline(props: ComputePipelineProps): string {\n const {type} = this.device;\n const shaderHash = this._getHash(props.shader.source);\n return `${type}/C/${shaderHash}`;\n }\n\n /** Calculate a hash based on all the inputs for a render pipeline */\n private _hashRenderPipeline(props: RenderPipelineProps): string {\n const vsHash = props.vs ? this._getHash(props.vs.source) : 0;\n const fsHash = props.fs ? this._getHash(props.fs.source) : 0;\n\n // WebGL specific\n // const {varyings = [], bufferMode = {}} = props;\n // const varyingHashes = varyings.map((v) => this._getHash(v));\n const varyingHash = '-'; // `${varyingHashes.join('/')}B${bufferMode}`\n const bufferLayoutHash = this._getHash(JSON.stringify(props.bufferLayout));\n\n const {type} = this.device;\n switch (type) {\n case 'webgl':\n // WebGL is more dynamic\n return `${type}/R/${vsHash}/${fsHash}V${varyingHash}BL${bufferLayoutHash}`;\n\n case 'webgpu':\n default:\n // On WebGPU we need to rebuild the pipeline if topology, parameters or bufferLayout change\n const parameterHash = this._getHash(JSON.stringify(props.parameters));\n // TODO - Can json.stringify() generate different strings for equivalent objects if order of params is different?\n // create a deepHash() to deduplicate?\n return `${type}/R/${vsHash}/${fsHash}V${varyingHash}T${props.topology}P${parameterHash}BL${bufferLayoutHash}`;\n }\n }\n\n private _getHash(key: string): number {\n if (this._hashes[key] === undefined) {\n this._hashes[key] = this._hashCounter++;\n }\n return this._hashes[key];\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {Device, Shader, ShaderProps, log} from '@luma.gl/core';\n\n/** Manages a cached pool of Shaders for reuse. */\nexport class ShaderFactory {\n static readonly defaultProps: Required<ShaderProps> = {...Shader.defaultProps};\n\n /** Returns the default ShaderFactory for the given {@link Device}, creating one if necessary. */\n static getDefaultShaderFactory(device: Device): ShaderFactory {\n device._lumaData['defaultShaderFactory'] ||= new ShaderFactory(device);\n return device._lumaData['defaultShaderFactory'] as ShaderFactory;\n }\n\n public readonly device: Device;\n readonly cachingEnabled: boolean;\n readonly destroyPolicy: 'unused' | 'never';\n readonly debug: boolean;\n\n private readonly _cache: Record<string, {shader: Shader; useCount: number}> = {};\n\n get [Symbol.toStringTag](): string {\n return 'ShaderFactory';\n }\n\n toString(): string {\n return `${this[Symbol.toStringTag]}(${this.device.id})`;\n }\n\n /** @internal */\n constructor(device: Device) {\n this.device = device;\n this.cachingEnabled = device.props._cacheShaders;\n this.destroyPolicy = device.props._cacheDestroyPolicy;\n this.debug = true; // device.props.debugFactories;\n }\n\n /** Requests a {@link Shader} from the cache, creating a new Shader only if necessary. */\n createShader(props: ShaderProps): Shader {\n if (!this.cachingEnabled) {\n return this.device.createShader(props);\n }\n\n const key = this._hashShader(props);\n\n let cacheEntry = this._cache[key];\n if (!cacheEntry) {\n const shader = this.device.createShader({\n ...props,\n id: props.id ? `${props.id}-cached` : undefined\n });\n this._cache[key] = cacheEntry = {shader, useCount: 1};\n if (this.debug) {\n log.log(3, `${this}: Created new shader ${shader.id}`)();\n }\n } else {\n cacheEntry.useCount++;\n if (this.debug) {\n log.log(\n 3,\n `${this}: Reusing shader ${cacheEntry.shader.id} count=${cacheEntry.useCount}`\n )();\n }\n }\n\n return cacheEntry.shader;\n }\n\n /** Releases a previously-requested {@link Shader}, destroying it if no users remain. */\n release(shader: Shader): void {\n if (!this.cachingEnabled) {\n shader.destroy();\n return;\n }\n\n const key = this._hashShader(shader);\n const cacheEntry = this._cache[key];\n if (cacheEntry) {\n cacheEntry.useCount--;\n if (cacheEntry.useCount === 0) {\n if (this.destroyPolicy === 'unused') {\n delete this._cache[key];\n cacheEntry.shader.destroy();\n if (this.debug) {\n log.log(3, `${this}: Releasing shader ${shader.id}, destroyed`)();\n }\n }\n } else if (cacheEntry.useCount < 0) {\n throw new Error(`ShaderFactory: Shader ${shader.id} released too many times`);\n } else if (this.debug) {\n log.log(3, `${this}: Releasing shader ${shader.id} count=${cacheEntry.useCount}`)();\n }\n }\n }\n\n // PRIVATE\n\n protected _hashShader(value: Shader | ShaderProps): string {\n return `${value.stage}:${value.source}`;\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {ShaderLayout} from '@luma.gl/core';\n\n/**\n * Extracts a table suitable for `console.table()` from a shader layout to assist in debugging.\n * @param layout shader layout\n * @param name app should provide the most meaningful name, usually the model or pipeline name / id.\n * @returns\n */\nexport function getDebugTableForShaderLayout(\n layout: ShaderLayout,\n name: string\n): Record<string, Record<string, string>> {\n const table: Record<string, Record<string, string>> = {};\n\n const header = 'Values'; // '`Shader Layout for ${name}`;\n\n if (layout.attributes.length === 0 && !layout.varyings?.length) {\n return {'No attributes or varyings': {[header]: 'N/A'}};\n }\n\n for (const attributeDeclaration of layout.attributes) {\n if (attributeDeclaration) {\n const glslDeclaration = `${attributeDeclaration.location} ${attributeDeclaration.name}: ${attributeDeclaration.type}`;\n table[`in ${glslDeclaration}`] = {[header]: attributeDeclaration.stepMode || 'vertex'};\n }\n }\n\n for (const varyingDeclaration of layout.varyings || []) {\n const glslDeclaration = `${varyingDeclaration.location} ${varyingDeclaration.name}`;\n table[`out ${glslDeclaration}`] = {[header]: JSON.stringify(varyingDeclaration)};\n }\n\n return table;\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {Framebuffer, Texture} from '@luma.gl/core';\n// import {copyTextureToImage} from '../debug/copy-texture-to-image';\n\n/** Only works with 1st device? */\nlet canvas: HTMLCanvasElement | null = null;\nlet ctx: CanvasRenderingContext2D | null = null;\n// let targetImage: HTMLImageElement | null = null;\n\n/** Debug utility to draw FBO contents onto screen */\n// eslint-disable-next-line\nexport function debugFramebuffer(\n fbo: Framebuffer | Texture,\n {\n id,\n minimap,\n opaque,\n top = '0',\n left = '0',\n rgbaScale = 1\n }: {\n id: string;\n minimap?: boolean;\n opaque?: boolean;\n top?: string;\n left?: string;\n rgbaScale?: number;\n }\n) {\n if (!canvas) {\n canvas = document.createElement('canvas');\n canvas.id = id;\n canvas.title = id;\n canvas.style.zIndex = '100';\n canvas.style.position = 'absolute';\n canvas.style.top = top; // \u26A0\uFE0F\n canvas.style.left = left; // \u26A0\uFE0F\n canvas.style.border = 'blue 5px solid';\n canvas.style.transform = 'scaleY(-1)';\n document.body.appendChild(canvas);\n\n ctx = canvas.getContext('2d');\n // targetImage = new Image();\n }\n\n // const canvasHeight = (minimap ? 2 : 1) * fbo.height;\n if (canvas.width !== fbo.width || canvas.height !== fbo.height) {\n canvas.width = fbo.width / 2;\n canvas.height = fbo.height / 2;\n canvas.style.width = '400px';\n canvas.style.height = '400px';\n }\n\n // const image = copyTextureToImage(fbo, {targetMaxHeight: 100, targetImage});\n // ctx.drawImage(image, 0, 0);\n\n const color = fbo.device.readPixelsToArrayWebGL(fbo);\n const imageData = ctx?.createImageData(fbo.width, fbo.height);\n if (imageData) {\n // Full map\n const offset = 0;\n // if (color.some((v) => v > 0)) {\n // console.error('THERE IS NON-ZERO DATA IN THE FBO!');\n // }\n for (let i = 0; i < color.length; i += 4) {\n imageData.data[offset + i + 0] = color[i + 0] * rgbaScale;\n imageData.data[offset + i + 1] = color[i + 1] * rgbaScale;\n imageData.data[offset + i + 2] = color[i + 2] * rgbaScale;\n imageData.data[offset + i + 3] = opaque ? 255 : color[i + 3] * rgbaScale;\n }\n ctx?.putImageData(imageData, 0, 0);\n }\n}\n", "// luma.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", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {log, type BufferLayout} from '@luma.gl/core';\n\n/** BufferLayoutHelper is a helper class that should not be used directly by applications */\nexport class BufferLayoutHelper {\n bufferLayouts: BufferLayout[];\n\n constructor(bufferLayouts: BufferLayout[]) {\n this.bufferLayouts = bufferLayouts;\n }\n\n getBufferLayout(name: string): BufferLayout | null {\n return this.bufferLayouts.find(layout => layout.name === name) || null;\n }\n\n /** Get attribute names from a BufferLayout */\n getAttributeNamesForBuffer(bufferLayout: BufferLayout): string[] {\n return bufferLayout.attributes\n ? bufferLayout.attributes?.map(layout => layout.attribute)\n : [bufferLayout.name];\n }\n\n mergeBufferLayouts(\n bufferLayouts1: BufferLayout[],\n bufferLayouts2: BufferLayout[]\n ): BufferLayout[] {\n const mergedLayouts = [...bufferLayouts1];\n for (const attribute of bufferLayouts2) {\n const index = mergedLayouts.findIndex(attribute2 => attribute2.name === attribute.name);\n if (index < 0) {\n mergedLayouts.push(attribute);\n } else {\n mergedLayouts[index] = attribute;\n }\n }\n return mergedLayouts;\n }\n\n getBufferIndex(bufferName: string): number {\n const bufferIndex = this.bufferLayouts.findIndex(layout => layout.name === bufferName);\n\n if (bufferIndex === -1) {\n log.warn(`BufferLayout: Missing buffer for \"${bufferName}\".`)();\n }\n\n return bufferIndex;\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {type BufferLayout, type ShaderLayout} from '@luma.gl/core';\n\nexport function sortedBufferLayoutByShaderSourceLocations(\n shaderLayout: ShaderLayout,\n bufferLayout: BufferLayout[]\n): BufferLayout[] {\n const shaderLayoutMap = Object.fromEntries(\n shaderLayout.attributes.map(attr => [attr.name, attr.location])\n );\n\n const sortedLayout = bufferLayout.slice();\n sortedLayout.sort((a, b) => {\n const attributeNamesA = a.attributes ? a.attributes.map(attr => attr.attribute) : [a.name];\n const attributeNamesB = b.attributes ? b.attributes.map(attr => attr.attribute) : [b.name];\n const minLocationA = Math.min(...attributeNamesA.map(name => shaderLayoutMap[name]));\n const minLocationB = Math.min(...attributeNamesB.map(name => shaderLayoutMap[name]));\n\n return minLocationA - minLocationB;\n });\n\n return sortedLayout;\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {Binding, UniformValue} from '@luma.gl/core';\nimport {log} from '@luma.gl/core';\n// import type {VariableShaderType, UniformValue, UniformFormat, UniformInfoDevice, Texture, Sampler} from '@luma.gl/core';\nimport {getShaderModuleDependencies, ShaderModule} from '@luma.gl/shadertools';\nimport {splitUniformsAndBindings} from './model/split-uniforms-and-bindings';\n\nexport type ShaderInputsOptions = {\n disableWarnings?: boolean;\n};\n\n/**\n * ShaderInputs holds uniform and binding values for one or more shader modules,\n * - It can generate binary data for any uniform buffer\n * - It can manage a uniform buffer for each block\n * - It can update managed uniform buffers with a single call\n * - It performs some book keeping on what has changed to minimize unnecessary writes to uniform buffers.\n */\nexport class ShaderInputs<\n ShaderPropsT extends Partial<Record<string, Record<string, unknown>>> = Partial<\n Record<string, Record<string, unknown>>\n >\n> {\n options: Required<ShaderInputsOptions> = {\n disableWarnings: false\n };\n\n /**\n * The map of modules\n * @todo should should this include the resolved dependencies?\n */\n // @ts-ignore Fix typings\n modules: Readonly<{[P in keyof ShaderPropsT]: ShaderModule<ShaderPropsT[P]>}>;\n\n /** Stores the uniform values for each module */\n moduleUniforms: Record<keyof ShaderPropsT, Record<string, UniformValue>>;\n /** Stores the uniform bindings for each module */\n moduleBindings: Record<keyof ShaderPropsT, Record<string, Binding>>;\n /** Tracks if uniforms have changed */\n // moduleUniformsChanged: Record<keyof ShaderPropsT, false | string>;\n\n /**\n * Create a new UniformStore instance\n * @param modules\n */\n constructor(\n // @ts-ignore Fix typings\n modules: {[P in keyof ShaderPropsT]?: ShaderModule<ShaderPropsT[P], any>},\n options?: ShaderInputsOptions\n ) {\n Object.assign(this.options, options);\n\n // Extract modules with dependencies\n const resolvedModules = getShaderModuleDependencies(\n Object.values(modules).filter(module => module.dependencies)\n );\n for (const resolvedModule of resolvedModules) {\n // @ts-ignore\n modules[resolvedModule.name] = resolvedModule;\n }\n\n log.log(1, 'Creating ShaderInputs with modules', Object.keys(modules))();\n\n // Store the module definitions and create storage for uniform values and binding values, per module\n // @ts-ignore Fix typings\n this.modules = modules as {[P in keyof ShaderPropsT]: ShaderModule<ShaderPropsT[P]>};\n this.moduleUniforms = {} as Record<keyof ShaderPropsT, Record<string, UniformValue>>;\n this.moduleBindings = {} as Record<keyof ShaderPropsT, Record<string, Binding>>;\n\n // Initialize the modules\n for (const [name, module] of Object.entries(modules)) {\n this._addModule(module);\n if (module.name && name !== module.name && !this.options.disableWarnings) {\n log.warn(`Module name: ${name} vs ${module.name}`)();\n }\n }\n }\n\n /** Destroy */\n destroy(): void {}\n\n /**\n * Set module props\n */\n setProps(props: Partial<{[P in keyof ShaderPropsT]?: Partial<ShaderPropsT[P]>}>): void {\n for (const name of Object.keys(props)) {\n const moduleName = name as keyof ShaderPropsT;\n const moduleProps = props[moduleName] || {};\n const module = this.modules[moduleName];\n if (!module) {\n // Ignore props for unregistered modules\n if (!this.options.disableWarnings) {\n log.warn(`Module ${name} not found`)();\n }\n continue; // eslint-disable-line no-continue\n }\n\n const oldUniforms = this.moduleUniforms[moduleName] as (typeof module)['uniforms'];\n const oldBindings = this.moduleBindings[moduleName];\n const uniformsAndBindings =\n module.getUniforms?.(moduleProps, oldUniforms) || (moduleProps as any);\n\n const {uniforms, bindings} = splitUniformsAndBindings(uniformsAndBindings);\n this.moduleUniforms[moduleName] = {...oldUniforms, ...uniforms};\n this.moduleBindings[moduleName] = {...oldBindings, ...bindings};\n // this.moduleUniformsChanged ||= moduleName;\n\n // console.log(`setProps(${String(moduleName)}`, moduleName, this.moduleUniforms[moduleName])\n }\n }\n\n /**\n * Return the map of modules\n * @todo should should this include the resolved dependencies?\n */\n getModules(): ShaderModule[] {\n return Object.values(this.modules);\n }\n\n /** Get all uniform values for all modules */\n getUniformValues(): Partial<Record<keyof ShaderPropsT, Record<string, UniformValue>>> {\n return this.moduleUniforms;\n }\n\n /** Merges all bindings for the shader (from the various modules) */\n getBindingValues(): Record<string, Binding> {\n const bindings = {} as Record<string, Binding>;\n for (const moduleBindings of Object.values(this.moduleBindings)) {\n Object.assign(bindings, moduleBindings);\n }\n return bindings;\n }\n\n // INTERNAL\n\n /** Return a debug table that can be used for console.table() or log.table() */\n getDebugTable(): Record<string, Record<string, unknown>> {\n const table: Record<string, Record<string, unknown>> = {};\n for (const [moduleName, module] of Object.entries(this.moduleUniforms)) {\n for (const [key, value] of Object.entries(module)) {\n table[`${moduleName}.${key}`] = {\n type: this.modules[moduleName].uniformTypes?.[key as keyof ShaderPropsT],\n value: String(value)\n };\n }\n }\n return table;\n }\n\n _addModule(module: ShaderModule): void {\n const moduleName = module.name as keyof ShaderPropsT;\n // Get default uniforms from module\n this.moduleUniforms[moduleName] = module.defaultUniforms || {};\n this.moduleBindings[moduleName] = {};\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {UniformValue, Binding} from '@luma.gl/core';\nimport {isNumericArray} from '@math.gl/types';\n\nexport function isUniformValue(value: unknown): value is UniformValue {\n return isNumericArray(value) || typeof value === 'number' || typeof value === 'boolean';\n}\n\ntype UniformsAndBindings = {\n bindings: Record<string, Binding>;\n uniforms: Record<string, UniformValue>;\n};\n\nexport function splitUniformsAndBindings(\n uniforms: Record<string, Binding | UniformValue>\n): UniformsAndBindings {\n const result: UniformsAndBindings = {bindings: {}, uniforms: {}};\n Object.keys(uniforms).forEach(name => {\n const uniform = uniforms[name];\n if (isUniformValue(uniform)) {\n result.uniforms[name] = uniform;\n } else {\n result.bindings[name] = uniform;\n }\n });\n\n return result;\n}\n", "// luma.gl, MIT license\n// Copyright (c) vis.gl contributors\n\nimport type {\n TextureProps,\n SamplerProps,\n TextureView,\n Device,\n TypedArray,\n TextureFormat,\n ExternalImage\n} from '@luma.gl/core';\n\nimport {Texture, Sampler, log} from '@luma.gl/core';\n\nimport {loadImageBitmap} from '../application-utils/load-file';\nimport {uid} from '../utils/uid';\n\ntype AsyncTextureDataProps =\n | AsyncTexture1DProps\n | AsyncTexture2DProps\n | AsyncTexture3DProps\n | AsyncTextureArrayProps\n | AsyncTextureCubeProps\n | AsyncTextureCubeArrayProps;\n\ntype AsyncTexture1DProps = {dimension: '1d'; data: Promise<Texture1DData> | Texture1DData | null};\ntype AsyncTexture2DProps = {dimension?: '2d'; data: Promise<Texture2DData> | Texture2DData | null};\ntype AsyncTexture3DProps = {dimension: '3d'; data: Promise<Texture3DData> | Texture3DData | null};\ntype AsyncTextureArrayProps = {\n dimension: '2d-array';\n data: Promise<TextureArrayData> | TextureArrayData | null;\n};\ntype AsyncTextureCubeProps = {\n dimension: 'cube';\n data: Promise<TextureCubeData> | TextureCubeData | null;\n};\ntype AsyncTextureCubeArrayProps = {\n dimension: 'cube-array';\n data: Promise<TextureCubeArrayData> | TextureCubeArrayData | null;\n};\n\ntype AsyncTextureData = AsyncTextureProps['data'];\n\n/** Names of cube texture faces */\nexport type TextureCubeFace = '+X' | '-X' | '+Y' | '-Y' | '+Z' | '-Z';\nexport const TextureCubeFaces: TextureCubeFace[] = ['+X', '-X', '+Y', '-Y', '+Z', '-Z'];\n// prettier-ignore\nexport const TextureCubeFaceMap = {'+X': 0, '-X': 1, '+Y': 2, '-Y': 3, '+Z': 4, '-Z': 5};\n\n/**\n * One mip level\n * Basic data structure is similar to `ImageData`\n * additional optional fields can describe compressed texture data.\n */\nexport type TextureImageData = {\n /** WebGPU style format string. Defaults to 'rgba8unorm' */\n format?: TextureFormat;\n data: TypedArray;\n width: number;\n height: number;\n\n compressed?: boolean;\n byteLength?: number;\n hasAlpha?: boolean;\n};\n\nexport type TextureLevelSource = TextureImageData | ExternalImage;\n\n/** Texture data can be one or more mip levels */\nexport type TextureData = TextureImageData | ExternalImage | (TextureImageData | ExternalImage)[];\n\n/** @todo - define what data type is supported for 1D textures */\nexport type Texture1DData = TypedArray | TextureImageData;\n\n/** Texture data can be one or more mip levels */\nexport type Texture2DData =\n | TypedArray\n | TextureImageData\n | ExternalImage\n | (TextureImageData | ExternalImage)[];\n\n/** 6 face textures */\nexport type TextureCubeData = Record<TextureCubeFace, TextureData>;\n\n/** Array of textures */\nexport type Texture3DData = TextureData[];\n\n/** Array of textures */\nexport type TextureArrayData = TextureData[];\n\n/** Array of 6 face textures */\nexport type TextureCubeArrayData = Record<TextureCubeFace, TextureData>[];\n\nexport const CubeFaces: TextureCubeFace[] = ['+X', '-X', '+Y', '-Y', '+Z', '-Z'];\n\n/** Properties for an async texture */\nexport type AsyncTextureProps = Omit<TextureProps, 'data' | 'mipLevels' | 'width' | 'height'> &\n AsyncTextureDataProps & {\n /** Generate mipmaps after creating textures and setting data */\n mipmaps?: boolean;\n /** nipLevels can be set to 'auto' to generate max number of mipLevels */\n mipLevels?: number | 'auto';\n /** Width - can be auto-calculated when initializing from ExternalImage */\n width?: number;\n /** Height - can be auto-calculated when initializing from ExternalImage */\n height?: number;\n };\n\n/**\n * It is very convenient to be able to initialize textures with promises\n * This can add considerable complexity to the Texture class, and doesn't\n * fit with the immutable nature of WebGPU resources.\n * Instead, luma.gl offers async textures as a separate class.\n */\nexport class AsyncTexture {\n readonly device: Device;\n readonly id: string;\n props: Required<Omit<AsyncTextureProps, 'data'>>;\n\n // TODO - should we type these as possibly `null`? It will make usage harder?\n // @ts-expect-error\n texture: Texture;\n // @ts-expect-error\n sampler: Sampler;\n // @ts-expect-error\n view: TextureView;\n\n readonly ready: Promise<void>;\n isReady: boolean = false;\n destroyed: boolean = false;\n\n protected resolveReady: () => void = () => {};\n protected rejectReady: (error: Error) => void = () => {};\n\n get [Symbol.toStringTag]() {\n return 'AsyncTexture';\n }\n\n toString(): string {\n return `AsyncTexture:\"${this.id}\"(${this.isReady ? 'ready' : 'loading'})`;\n }\n\n constructor(device: Device, props: AsyncTextureProps) {\n this.device = device;\n\n // TODO - if we support URL strings as data...\n const id = uid('async-texture'); // typeof props?.data === 'string' ? props.data.slice(-20) : uid('async-texture');\n this.props = {...AsyncTexture.defaultProps, id, ...props};\n this.id = this.props.id;\n\n props = {...props};\n // Signature: new AsyncTexture(device, {data: url})\n if (typeof props?.data === 'string' && props.dimension === '2d') {\n props.data = loadImageBitmap(props.data);\n }\n\n // If mipmaps are requested, we need to allocate space for them\n if (props.mipmaps) {\n props.mipLevels = 'auto';\n }\n\n this.ready = new Promise<void>((resolve, reject) => {\n this.resolveReady = () => {\n this.isReady = true;\n resolve();\n };\n this.rejectReady = reject;\n });\n\n this.initAsync(props);\n }\n\n async initAsync(props: AsyncTextureProps): Promise<void> {\n const asyncData: AsyncTextureData = props.data;\n // @ts-expect-error not clear how to convince TS that null will be returned\n const data: TextureData | null = await awaitAllPromises(asyncData).then(\n undefined,\n this.rejectReady\n );\n\n // Check that we haven't been destroyed while waiting for texture data to load\n if (this.destroyed) {\n return;\n }\n\n // Now we can actually create the texture\n\n // Auto-deduce width and height if not supplied\n const size =\n this.props.width && this.props.height\n ? {width: this.props.width, height: this.props.height}\n : this.getTextureDataSize(data);\n if (!size) {\n throw new Error('Texture size could not be determined');\n }\n const syncProps: TextureProps = {...size, ...props, data: undefined, mipLevels: 1};\n\n // Auto-calculate the number of mip levels as a convenience\n // TODO - Should we clamp to 1-getMipLevelCount?\n const maxMips = this.device.getMipLevelCount(syncProps.width, syncProps.height);\n syncProps.mipLevels =\n this.props.mipLevels === 'auto' ? maxMips : Math.min(maxMips, this.props.mipLevels);\n\n this.texture = this.device.createTexture(syncProps);\n this.sampler = this.texture.sampler;\n this.view = this.texture.view;\n\n if (props.data) {\n switch (this.props.dimension) {\n case '1d':\n this._setTexture1DData(this.texture, data as Texture1DData);\n break;\n case '2d':\n this._setTexture2DData(data as Texture2DData);\n break;\n case '3d':\n this._setTexture3DData(this.texture, data as Texture3DData);\n break;\n case '2d-array':\n this._setTextureArrayData(this.texture, data as TextureArrayData);\n break;\n case 'cube':\n this._setTextureCubeData(this.texture, data as unknown as TextureCubeData);\n break;\n case 'cube-array':\n this._setTextureCubeArrayData(this.texture, data as unknown as TextureCubeArrayData);\n break;\n }\n }\n\n // Do we need to generate mipmaps?\n if (this.props.mipmaps) {\n this.generateMipmaps();\n }\n\n log.info(1, `${this} loaded`);\n this.resolveReady();\n }\n\n destroy(): void {\n if (this.texture) {\n this.texture.destroy();\n // @ts-expect-error\n this.texture = null;\n }\n this.destroyed = true;\n }\n\n generateMipmaps(): void {\n // if (this.device.type === 'webgl') {\n this.texture.generateMipmapsWebGL();\n // }\n }\n\n /** Set sampler or create and set new Sampler from SamplerProps */\n setSampler(sampler: Sampler | SamplerProps = {}): void {\n this.texture.setSampler(\n sampler instanceof Sampler ? sampler : this.device.createSampler(sampler)\n );\n }\n\n /**\n * Textures are immutable and cannot be resized after creation,\n * but we can create a similar texture with the same parameters but a new size.\n * @note Does not copy contents of the texture\n * @note Mipmaps may need to be regenerated after resizing / setting new data\n * @todo Abort pending promise and create a texture with the new size?\n */\n resize(size: {width: number; height: number}): boolean {\n if (!this.isReady) {\n throw new Error('Cannot resize texture before it is ready');\n }\n\n if (size.width === this.texture.width && size.height === this.texture.height) {\n return false;\n }\n\n if (this.texture) {\n const texture = this.texture;\n this.texture = texture.clone(size);\n texture.destroy();\n }\n\n return true;\n }\n\n /** Check if texture data is a typed array */\n isTextureLevelData(data: TextureData): data is TextureImageData {\n const typedArray = (data as TextureImageData)?.data;\n return ArrayBuffer.isView(typedArray);\n }\n\n /** Get the size of the texture described by the provided TextureData */\n getTextureDataSize(\n data:\n | TextureData\n | TextureCubeData\n | TextureArrayData\n | TextureCubeArrayData\n | TypedArray\n | null\n ): {width: number; height: number} | null {\n if (!data) {\n return null;\n }\n if (ArrayBuffer.isView(data)) {\n return null;\n }\n // Recurse into arrays (array of miplevels)\n if (Array.isArray(data)) {\n return this.getTextureDataSize(data[0]);\n }\n if (this.device.isExternalImage(data)) {\n return this.device.getExternalImageSize(data);\n }\n if (data && typeof data === 'object' && data.constructor === Object) {\n const textureDataArray = Object.values(data);\n const untypedData = textureDataArray[0];\n return {width: untypedData.width, height: untypedData.height};\n }\n throw new Error('texture size deduction failed');\n }\n\n /** Convert luma.gl cubemap face constants to depth index */\n getCubeFaceDepth(face: TextureCubeFace): number {\n // prettier-ignore\n switch (face) {\n case '+X': return 0;\n case '-X': return 1;\n case '+Y': return 2;\n case '-Y': return 3;\n case '+Z': return 4;\n case '-Z': return 5;\n default: throw new Error(face);\n }\n }\n\n // EXPERIMENTAL\n\n setTextureData(data: TextureData) {}\n\n /** Experimental: Set multiple mip levels */\n _setTexture1DData(texture: Texture, data: Texture1DData): void {\n throw new Error('setTexture1DData not supported in WebGL.');\n }\n\n /** Experimental: Set multiple mip levels */\n _setTexture2DData(lodData: Texture2DData, depth = 0): void {\n if (!this.texture) {\n throw new Error('Texture not initialized');\n }\n\n const lodArray = this._normalizeTextureData(lodData);\n\n // If the user provides multiple LODs, then automatic mipmap\n // generation generateMipmap() should be disabled to avoid overwriting them.\n if (lodArray.length > 1 && this.props.mipmaps !== false) {\n log.warn(`Texture ${this.id} mipmap and multiple LODs.`)();\n }\n\n for (let mipLevel = 0; mipLevel < lodArray.length; mipLevel++) {\n const imageData = lodArray[mipLevel];\n if (this.device.isExternalImage(imageData)) {\n this.texture.copyExternalImage({image: imageData, depth, mipLevel, flipY: true});\n } else {\n this.texture.copyImageData({data: imageData.data /* , depth */, mipLevel});\n }\n }\n }\n\n /**\n * Experimental: Sets 3D texture data: multiple depth slices, multiple mip levels\n * @param data\n */\n _setTexture3DData(texture: Texture, data: Texture3DData): void {\n if (this.texture?.props.dimension !== '3d') {\n throw new Error(this.id);\n }\n for (let depth = 0; depth < data.length; depth++) {\n this._setTexture2DData(data[depth], depth);\n }\n }\n\n /**\n * Experimental: Set Cube texture data, multiple faces, multiple mip levels\n * @todo - could support TextureCubeArray with depth\n * @param data\n * @param index\n */\n _setTextureCubeData(texture: Texture, data: TextureCubeData): void {\n if (this.texture?.props.dimension !== 'cube') {\n throw new Error(this.id);\n }\n for (const [face, faceData] of Object.entries(data)) {\n const faceDepth = CubeFaces.indexOf(face as TextureCubeFace);\n this._setTexture2DData(faceData, faceDepth);\n }\n }\n\n /**\n * Experimental: Sets texture array data, multiple levels, multiple depth slices\n * @param data\n */\n _setTextureArrayData(texture: Texture, data: TextureArrayData): void {\n if (this.texture?.props.dimension !== '2d-array') {\n throw new Error(this.id);\n }\n for (let depth = 0; depth < data.length; depth++) {\n this._setTexture2DData(data[depth], depth);\n }\n }\n\n /**\n * Experimental: Sets texture cube array, multiple faces, multiple levels, multiple mip levels\n * @param data\n */\n _setTextureCubeArrayData(texture: Texture, data: TextureCubeArrayData): void {\n throw new Error('setTextureCubeArrayData not supported in WebGL2.');\n }\n\n /** Experimental */\n _setTextureCubeFaceData(\n texture: Texture,\n lodData: Texture2DData,\n face: TextureCubeFace,\n depth: number = 0\n ): void {\n // assert(this.props.dimension === 'cube');\n\n // If the user provides multiple LODs, then automatic mipmap\n // generation generateMipmap() should be disabled to avoid overwriting them.\n if (Array.isArray(lodData) && lodData.length > 1 && this.props.mipmaps !== false) {\n log.warn(`${this.id} has mipmap and multiple LODs.`)();\n }\n\n const faceDepth = TextureCubeFaces.indexOf(face);\n this._setTexture2DData(lodData, faceDepth);\n }\n\n /**\n * Normalize TextureData to an array of TextureImageData / ExternalImages\n * @param data\n * @param options\n * @returns array of TextureImageData / ExternalImages\n */\n _normalizeTextureData(data: Texture2DData): (TextureImageData | ExternalImage)[] {\n const options: {width: number; height: number; depth: number} = this.texture;\n let mipLevelArray: (TextureImageData | ExternalImage)[];\n if (ArrayBuffer.isView(data)) {\n mipLevelArray = [\n {\n // ts-expect-error does data really need to be Uint8ClampedArray?\n data,\n width: options.width,\n height: options.height\n // depth: options.depth\n }\n ];\n } else if (!Array.isArray(data)) {\n mipLevelArray = [data];\n } else {\n mipLevelArray = data;\n }\n return mipLevelArray;\n }\n\n static defaultProps: Required<AsyncTextureProps> = {\n ...Texture.defaultProps,\n data: null,\n mipmaps: false\n };\n}\n\n// TODO - Remove when texture refactor is complete\n\n/*\nsetCubeMapData(options: {\n width: number;\n height: number;\n data: Record<GL, Texture2DData> | Record<TextureCubeFace, Texture2DData>;\n format?: any;\n type?: any;\n /** @deprecated Use .data *\n pixels: any;\n}): void {\n const {gl} = this;\n\n const {width, height, pixels, data, format = GL.RGBA, type = GL.UNSIGNED_BYTE} = options;\n\n // pixel data (imageDataMap) is an Object from Face to Image or Promise.\n // For example:\n // {\n // GL.TEXTURE_CUBE_MAP_POSITIVE_X : Image-or-Promise,\n // GL.TEXTURE_CUBE_MAP_NEGATIVE_X : Image-or-Promise,\n // ... }\n // To provide multiple level-of-details (LODs) this can be Face to Array\n // of Image or Promise, like this\n // {\n // GL.TEXTURE_CUBE_MAP_POSITIVE_X : [Image-or-Promise-LOD-0, Image-or-Promise-LOD-1],\n // GL.TEXTURE_CUBE_MAP_NEGATIVE_X : [Image-or-Promise-LOD-0, Image-or-Promise-LOD-1],\n // ... }\n\n const imageDataMap = this._getImageDataMap(pixels || data);\n\n const resolvedFaces = WEBGLTexture.FACES.map(face => {\n const facePixels = imageDataMap[face];\n return Array.isArray(facePixels) ? facePixels : [facePixels];\n });\n this.bind();\n\n WEBGLTexture.FACES.forEach((face, index) => {\n if (resolvedFaces[index].length > 1 && this.props.mipmaps !== false) {\n // If the user provides multiple LODs, then automatic mipmap\n // generation generateMipmaps() should be disabled to avoid overwritting them.\n log.warn(`${this.id} has mipmap and multiple LODs.`)();\n }\n resolvedFaces[index].forEach((image, lodLevel) => {\n // TODO: adjust width & height for LOD!\n if (width && height) {\n gl.texImage2D(face, lodLevel, format, width, height, 0 /* border*, format, type, image);\n } else {\n gl.texImage2D(face, lodLevel, format, format, type, image);\n }\n });\n });\n\n this.unbind();\n}\n*/\n\n// HELPERS\n\n/** Resolve all promises in a nested data structure */\nasync function awaitAllPromises(x: any): Promise<any> {\n x = await x;\n if (Array.isArray(x)) {\n return await Promise.all(x.map(awaitAllPromises));\n }\n if (x && typeof x === 'object' && x.constructor === Object) {\n const object: Record<string, any> = x;\n const values = await Promise.all(Object.values(object));\n const keys = Object.keys(object);\n const resolvedObject: Record<string, any> = {};\n for (let i = 0; i < keys.length; i++) {\n resolvedObject[keys[i]] = values[i];\n }\n return resolvedObject;\n }\n return x;\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nlet pathPrefix = '';\n\n/**\n * Set a relative path prefix\n */\nexport function setPathPrefix(prefix: string) {\n pathPrefix = prefix;\n}\n\n/**\n * Loads ImageBitmap asynchronously. Respects setPathPrefix.\n * image.crossOrigin can be set via opts.crossOrigin, default to 'anonymous'\n * @returns a promise tracking the load\n */\nexport async function loadImageBitmap(\n url: string,\n opts?: {crossOrigin?: string} & ImageBitmapOptions\n): Promise<ImageBitmap> {\n const image = new Image();\n image.crossOrigin = opts?.crossOrigin || 'anonymous';\n image.src = url.startsWith('http') ? url : pathPrefix + url;\n await image.decode();\n return opts ? await createImageBitmap(image, opts) : await createImageBitmap(image);\n}\n\n/**\n * Loads image asynchronously. Respects setPathPrefix.\n * image.crossOrigin can be set via opts.crossOrigin, default to 'anonymous'\n * @returns a promise tracking the load\n * @deprecated Use `loadImageBitmap()` unless you are supporting old versions of Safari.\n */\nexport async function loadImage(\n url: string,\n opts?: {crossOrigin?: string}\n): Promise<HTMLImageElement> {\n return await new Promise((resolve, reject) => {\n try {\n const image = new Image();\n image.onload = () => resolve(image);\n image.onerror = () => reject(new Error(`Could not load image ${url}.`));\n image.crossOrigin = opts?.crossOrigin || 'anonymous';\n image.src = url.startsWith('http') ? url : pathPrefix + url;\n } catch (error) {\n reject(error);\n }\n });\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {Device, Buffer, BufferRange, TransformFeedback, RenderPassProps} from '@luma.gl/core';\nimport {getPassthroughFS} from '@luma.gl/shadertools';\nimport {Model} from '../model/model';\nimport type {ModelProps} from '../model/model';\n\n/**\n * Properties for creating a {@link BufferTransform}\n * @note Only works under WebGL2.\n */\nexport type BufferTransformProps = Omit<ModelProps, 'fs'> & {\n /** Optional fragment shader - normally not used in transforms */\n fs?: ModelProps['fs']; // override as optional\n /** A list of named outputs corresponding to shader declarations (varyings in WebGL) */\n outputs?: string[];\n /** @deprecated Use run({outputBuffers}) instead - Map of output buffers that the shaders will write results of computations to */\n feedbackBuffers?: Record<string, Buffer | BufferRange>;\n};\n\n/**\n * Manages a WebGL program (pipeline) for buffer\u2192buffer transforms.\n * @note Only works under WebGL2.\n */\nexport class BufferTransform {\n readonly device: Device;\n readonly model: Model;\n readonly transformFeedback: TransformFeedback;\n\n static defaultProps: Required<BufferTransformProps> = {\n ...Model.defaultProps,\n outputs: undefined!,\n feedbackBuffers: undefined!\n };\n\n static isSupported(device: Device): boolean {\n return device?.info?.type === 'webgl';\n }\n\n constructor(device: Device, props: BufferTransformProps = BufferTransform.defaultProps) {\n if (!BufferTransform.isSupported(device)) {\n throw new Error('BufferTransform not yet implemented on WebGPU');\n }\n\n this.device = device;\n\n this.model = new Model(this.device, {\n id: props.id || 'buffer-transform-model',\n fs: props.fs || getPassthroughFS(),\n topology: props.topology || 'point-list',\n varyings: props.outputs || props.varyings,\n ...props\n });\n\n this.transformFeedback = this.device.createTransformFeedback({\n layout: this.model.pipeline.shaderLayout,\n // @ts-expect-error TODO\n buffers: props.feedbackBuffers\n });\n\n this.model.setTransformFeedback(this.transformFeedback);\n\n Object.seal(this);\n }\n\n /** Destroy owned resources. */\n destroy(): void {\n if (this.model) {\n this.model.destroy();\n }\n }\n\n /** @deprecated Use {@link destroy}. */\n delete(): void {\n this.destroy();\n }\n\n /** Run one transform loop. */\n run(\n options?: RenderPassProps & {\n inputBuffers?: Record<string, Buffer>;\n outputBuffers?: Record<string, Buffer>;\n }\n ): void {\n if (options?.inputBuffers) {\n this.model.setAttributes(options.inputBuffers);\n }\n if (options?.outputBuffers) {\n this.transformFeedback.setBuffers(options.outputBuffers);\n }\n const renderPass = this.device.beginRenderPass(options);\n this.model.draw(renderPass);\n renderPass.end();\n }\n\n // DEPRECATED METHODS\n\n /** @deprecated App knows what buffers it is passing in - Returns the {@link Buffer} or {@link BufferRange} for given varying name. */\n getBuffer(varyingName: string): Buffer | BufferRange | null {\n return this.transformFeedback.getBuffer(varyingName);\n }\n\n /** @deprecated App knows what buffers it is passing in - Reads the {@link Buffer} or {@link BufferRange} for given varying name. */\n readAsync(varyingName: string): Promise<Uint8Array> {\n const result = this.getBuffer(varyingName);\n if (!result) {\n throw new Error('BufferTransform#getBuffer');\n }\n if (result instanceof Buffer) {\n return result.readAsync();\n }\n const {buffer, byteOffset = 0, byteLength = buffer.byteLength} = result;\n return buffer.readAsync(byteOffset, byteLength);\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {Buffer, Device, Framebuffer, RenderPassProps, Sampler, Texture} from '@luma.gl/core';\nimport {getPassthroughFS} from '@luma.gl/shadertools';\nimport {Model, ModelProps} from '../model/model';\nimport {uid} from '../utils/uid';\n\n/**\n * Properties for creating a {@link TextureTransform}\n */\nexport type TextureTransformProps = Omit<ModelProps, 'fs'> & {\n fs?: ModelProps['fs']; // override as optional\n /** @deprecated TODO(donmccurdy): Needed? */\n inject?: Record<string, string>;\n /** @deprecated TODO(donmccurdy): Needed? */\n framebuffer?: Framebuffer;\n /** @deprecated TODO(donmccurdy): Model already handles this? */\n sourceBuffers?: Record<string, Buffer>;\n /** @deprecated TODO(donmccurdy): Model already handles this? */\n sourceTextures?: Record<string, Texture>;\n targetTexture: Texture;\n targetTextureChannels: 1 | 2 | 3 | 4;\n targetTextureVarying: string;\n};\n\ntype TextureBinding = {\n sourceBuffers: Record<string, Buffer>;\n sourceTextures: Record<string, Texture>;\n targetTexture: Texture;\n framebuffer?: Framebuffer;\n};\n\nconst FS_OUTPUT_VARIABLE = 'transform_output';\n\n/**\n * Creates a pipeline for texture\u2192texture transforms.\n * @deprecated\n */\nexport class TextureTransform {\n readonly device: Device;\n readonly model: Model;\n readonly sampler: Sampler;\n\n currentIndex = 0;\n samplerTextureMap: Record<string, any> | null = null;\n bindings: TextureBinding[] = []; // each element is an object : {sourceTextures, targetTexture, framebuffer}\n resources: Record<string, any> = {}; // resources to be deleted\n\n constructor(device: Device, props: TextureTransformProps) {\n this.device = device;\n\n // For precise picking of element IDs.\n this.sampler = device.createSampler({\n addressModeU: 'clamp-to-edge',\n addressModeV: 'clamp-to-edge',\n minFilter: 'nearest',\n magFilter: 'nearest',\n mipmapFilter: 'nearest'\n });\n\n this.model = new Model(this.device, {\n id: props.id || uid('texture-transform-model'),\n fs:\n props.fs ||\n getPassthroughFS({\n input: props.targetTextureVarying,\n inputChannels: props.targetTextureChannels,\n output: FS_OUTPUT_VARIABLE\n }),\n vertexCount: props.vertexCount, // TODO(donmccurdy): Naming?\n ...props\n });\n\n this._initialize(props);\n Object.seal(this);\n }\n\n // Delete owned resources.\n destroy(): void {\n this.model.destroy();\n for (const binding of this.bindings) {\n binding.framebuffer?.destroy();\n }\n }\n\n /** @deprecated Use {@link destroy}. */\n delete(): void {\n this.destroy();\n }\n\n run(options?: RenderPassProps): void {\n const {framebuffer} = this.bindings[this.currentIndex];\n const renderPass = this.device.beginRenderPass({framebuffer, ...options});\n this.model.draw(renderPass);\n renderPass.end();\n this.device.submit();\n }\n\n getTargetTexture(): Texture {\n const {targetTexture} = this.bindings[this.currentIndex];\n return targetTexture;\n }\n\n getFramebuffer(): Framebuffer | undefined {\n const currentResources = this.bindings[this.currentIndex];\n return currentResources.framebuffer;\n }\n\n // Private\n\n _initialize(props: TextureTransformProps): void {\n this._updateBindings(props);\n }\n\n _updateBindings(props: TextureTransformProps) {\n this.bindings[this.currentIndex] = this._updateBinding(this.bindings[this.currentIndex], props);\n }\n\n _updateBinding(\n binding: TextureBinding,\n {sourceBuffers, sourceTextures, targetTexture}: TextureTransformProps\n ): TextureBinding {\n if (!binding) {\n binding = {\n sourceBuffers: {},\n sourceTextures: {},\n // @ts-expect-error\n targetTexture: null\n };\n }\n Object.assign(binding.sourceTextures, sourceTextures);\n Object.assign(binding.sourceBuffers, sourceBuffers);\n if (targetTexture) {\n binding.targetTexture = targetTexture;\n const {width, height} = targetTexture;\n // TODO(donmccurdy): When is this called, and is this expected?\n if (binding.framebuffer) {\n binding.framebuffer.destroy();\n }\n binding.framebuffer = this.device.createFramebuffer({\n id: 'transform-framebuffer',\n width,\n height,\n colorAttachments: [targetTexture]\n });\n binding.framebuffer.resize({width, height});\n }\n return binding;\n }\n\n // set texture filtering parameters on source textures.\n _setSourceTextureParameters(): void {\n const index = this.currentIndex;\n const {sourceTextures} = this.bindings[index];\n for (const name in sourceTextures) {\n sourceTextures[name].sampler = this.sampler;\n }\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {TypedArray} from '@math.gl/core';\nimport type {PrimitiveTopology} from '@luma.gl/core';\nimport {uid} from '../utils/uid';\n\nexport type GeometryProps = {\n id?: string;\n /** Determines how vertices are read from the 'vertex' attributes */\n topology: 'point-list' | 'line-list' | 'line-strip' | 'triangle-list' | 'triangle-strip';\n /** Auto calculated from attributes if not provided */\n vertexCount?: number;\n attributes: Record<string, GeometryAttribute | TypedArray>;\n indices?: GeometryAttribute | TypedArray;\n};\n\nexport type GeometryAttributes = {\n POSITION: GeometryAttribute;\n NORMAL: GeometryAttribute;\n TEXCOORD_0: GeometryAttribute;\n COLOR_0?: GeometryAttribute;\n indices?: GeometryAttribute & {size: 1; value: Uint32Array | Uint16Array};\n};\n\nexport type GeometryAttribute = {\n size?: number;\n value: TypedArray;\n [key: string]: any;\n};\n\nexport class Geometry {\n readonly id: string;\n /** Determines how vertices are read from the 'vertex' attributes */\n readonly topology?: PrimitiveTopology;\n readonly vertexCount: number;\n readonly indices?: GeometryAttribute;\n readonly attributes: {\n POSITION: GeometryAttribute;\n NORMAL: GeometryAttribute;\n TEXCOORD_0: GeometryAttribute;\n COLOR_0?: GeometryAttribute;\n [key: string]: GeometryAttribute | undefined;\n };\n\n userData: Record<string, unknown> = {};\n\n constructor(props: GeometryProps) {\n const {attributes = {}, indices = null, vertexCount = null} = props;\n\n this.id = props.id || uid('geometry');\n this.topology = props.topology;\n\n if (indices) {\n this.indices = ArrayBuffer.isView(indices) ? {value: indices, size: 1} : indices;\n }\n\n // @ts-expect-error\n this.attributes = {};\n\n for (const [attributeName, attributeValue] of Object.entries(attributes)) {\n // Wrap \"unwrapped\" arrays and try to autodetect their type\n const attribute: GeometryAttribute = ArrayBuffer.isView(attributeValue)\n ? {value: attributeValue}\n : attributeValue;\n\n if (!ArrayBuffer.isView(attribute.value)) {\n throw new Error(\n `${this._print(attributeName)}: must be typed array or object with value as typed array`\n );\n }\n\n if ((attributeName === 'POSITION' || attributeName === 'positions') && !attribute.size) {\n attribute.size = 3;\n }\n\n // Move indices to separate field\n if (attributeName === 'indices') {\n if (this.indices) {\n throw new Error('Multiple indices detected');\n }\n this.indices = attribute;\n } else {\n this.attributes[attributeName] = attribute;\n }\n }\n\n if (this.indices && this.indices['isIndexed'] !== undefined) {\n this.indices = Object.assign({}, this.indices);\n delete this.indices['isIndexed'];\n }\n\n this.vertexCount = vertexCount || this._calculateVertexCount(this.attributes, this.indices);\n }\n\n getVertexCount(): number {\n return this.vertexCount;\n }\n\n /**\n * Return an object with all attributes plus indices added as a field.\n * TODO Geometry types are a mess\n */\n getAttributes(): GeometryAttributes {\n // @ts-ignore\n return this.indices ? {indices: this.indices, ...this.attributes} : this.attributes;\n }\n\n // PRIVATE\n\n _print(attributeName: string): string {\n return `Geometry ${this.id} attribute ${attributeName}`;\n }\n\n /**\n * GeometryAttribute\n * value: typed array\n * type: indices, vertices, uvs\n * size: elements per vertex\n * target: WebGL buffer type (string or constant)\n *\n * @param attributes\n * @param indices\n * @returns\n */\n _setAttributes(attributes: Record<string, GeometryAttribute>, indices: any): this {\n return this;\n }\n\n _calculateVertexCount(attributes: GeometryAttributes, indices?: GeometryAttribute): number {\n if (indices) {\n return indices.value.length;\n }\n let vertexCount = Infinity;\n for (const attribute of Object.values(attributes)) {\n const {value, size, constant} = attribute;\n if (!constant && value && size !== undefined && size >= 1) {\n vertexCount = Math.min(vertexCount, value.length / size);\n }\n }\n\n // assert(Number.isFinite(vertexCount));\n return vertexCount;\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n// ClipSpace\nimport {Device} from '@luma.gl/core';\nimport {Model, ModelProps} from '../model/model';\nimport {Geometry} from '../geometry/geometry';\nimport {uid} from '../utils/uid';\n\nconst CLIPSPACE_VERTEX_SHADER_WGSL = /* wgsl */ `\\\nstruct VertexInputs {\n @location(0) clipSpacePosition: vec2<f32>,\n @location(1) texCoord: vec2<f32>,\n @location(2) coordinate: vec2<f32> \n}\n\nstruct FragmentInputs {\n @builtin(position) Position : vec4<f32>,\n @location(0) position : vec2<f32>,\n @location(1) coordinate : vec2<f32>,\n @location(2) uv : vec2<f32>\n};\n\n@vertex\nfn vertexMain(inputs: VertexInputs) -> FragmentInputs {\n var outputs: FragmentInputs;\n outputs.Position = vec4(inputs.clipSpacePosition, 0., 1.);\n outputs.position = inputs.clipSpacePosition;\n outputs.coordinate = inputs.coordinate;\n outputs.uv = inputs.texCoord;\n return outputs;\n}\n`;\n\nconst CLIPSPACE_VERTEX_SHADER = /* glsl */ `\\\n#version 300 es\nin vec2 clipSpacePositions;\nin vec2 texCoords;\nin vec2 coordinates;\n\nout vec2 position;\nout vec2 coordinate;\nout vec2 uv;\n\nvoid main(void) {\n gl_Position = vec4(clipSpacePositions, 0., 1.);\n position = clipSpacePositions;\n coordinate = coordinates;\n uv = texCoords;\n}\n`;\n\n/* eslint-disable indent, no-multi-spaces */\nconst POSITIONS = [-1, -1, 1, -1, -1, 1, 1, 1];\n\n/** Props for ClipSpace */\nexport type ClipSpaceProps = Omit<ModelProps, 'vs' | 'vertexCount' | 'geometry'>;\n\n/**\n * A flat geometry that covers the \"visible area\" that the GPU renders.\n */\nexport class ClipSpace extends Model {\n constructor(device: Device, props: ClipSpaceProps) {\n const TEX_COORDS = POSITIONS.map(coord => (coord === -1 ? 0 : coord));\n\n // For WGSL we need to append the supplied fragment shader to the default vertex shader source\n if (props.source) {\n props = {...props, source: `${CLIPSPACE_VERTEX_SHADER_WGSL}\\n${props.source}`};\n }\n\n super(device, {\n id: props.id || uid('clip-space'),\n ...props,\n vs: CLIPSPACE_VERTEX_SHADER,\n vertexCount: 4,\n geometry: new Geometry({\n topology: 'triangle-strip',\n vertexCount: 4,\n attributes: {\n clipSpacePositions: {size: 2, value: new Float32Array(POSITIONS)},\n texCoords: {size: 2, value: new Float32Array(TEX_COORDS)},\n coordinates: {size: 2, value: new Float32Array(TEX_COORDS)}\n }\n })\n });\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {Device, Texture} from '@luma.gl/core';\nimport {AsyncTexture} from '../async-texture/async-texture';\nimport {ClipSpace} from './clip-space';\n\nconst BACKGROUND_FS_WGSL = /* wgsl */ `\\\n@group(0) @binding(0) var backgroundTexture: texture_2d<f32>;\n@group(0) @binding(1) var backgroundTextureSampler: sampler;\n\nfn billboardTexture_getTextureUV(coordinates: vec2<f32>) -> vec2<f32> {\n\tlet iTexSize: vec2<u32> = textureDimensions(backgroundTexture, 0);\n\tlet texSize: vec2<f32> = vec2<f32>(f32(iTexSize.x), f32(iTexSize.y));\n\tvar position: vec2<f32> = coordinates.xy / texSize;\n\treturn position;\n} \n\n@fragment\nfn fragmentMain(inputs: FragmentInputs) -> @location(0) vec4<f32> {\n\tlet position: vec2<f32> = billboardTexture_getTextureUV(inputs.coordinate);\n\treturn textureSample(backgroundTexture, backgroundTextureSampler, position);\n}\n`;\n\nconst BACKGROUND_FS = /* glsl */ `\\\n#version 300 es\nprecision highp float;\n\nuniform sampler2D backgroundTexture;\nout vec4 fragColor;\n\nvec2 billboardTexture_getTextureUV() {\n ivec2 iTexSize = textureSize(backgroundTexture, 0);\n vec2 texSize = vec2(float(iTexSize.x), float(iTexSize.y));\n vec2 position = gl_FragCoord.xy / texSize;\n return position;\n}\n\nvoid main(void) {\n vec2 position = billboardTexture_getTextureUV();\n fragColor = texture(backgroundTexture, position);\n}\n`;\n\n/**\n * Props for a Model that renders a bitmap into the \"background\", i.e covering the screen\n */\nexport type BackgroundTextureModelProps = {\n /** id of this model */\n id?: string;\n /** The texture to render */\n backgroundTexture: Texture | AsyncTexture;\n /** If true, the texture is rendered into transparent areas of the screen only, i.e blended in where background alpha is small */\n blend?: boolean;\n};\n\n/**\n * Model that renders a bitmap into the \"background\", i.e covering the screen\n */\nexport class BackgroundTextureModel extends ClipSpace {\n constructor(device: Device, props: BackgroundTextureModelProps) {\n super(device, {\n id: props.id || 'background-texture-model',\n source: BACKGROUND_FS_WGSL,\n fs: BACKGROUND_FS,\n parameters: {\n depthWriteEnabled: false,\n ...(props.blend\n ? {\n blend: true,\n blendColorOperation: 'add',\n blendAlphaOperation: 'add',\n blendColorSrcFactor: 'one',\n blendColorDstFactor: 'one-minus-src',\n blendAlphaSrcFactor: 'one',\n blendAlphaDstFactor: 'one-minus-src-alpha'\n }\n : {})\n }\n });\n\n if (!props.backgroundTexture) {\n throw new Error('BackgroundTextureModel requires a backgroundTexture prop');\n }\n this.setTexture(props.backgroundTexture);\n }\n\n setTexture(backgroundTexture: Texture | AsyncTexture): void {\n this.setBindings({\n backgroundTexture\n });\n }\n\n override predraw(): void {\n this.shaderInputs.setProps({});\n super.predraw();\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {Vector3, Matrix4, NumericArray} from '@math.gl/core';\nimport {uid} from '../utils/uid';\n\n/** Properties for creating a new Scenegraph */\nexport type ScenegraphNodeProps = {\n id?: string;\n /** whether to display the object at all */\n display?: boolean;\n matrix?: NumericArray;\n position?: NumericArray;\n rotation?: NumericArray;\n scale?: NumericArray;\n update?: boolean;\n};\n\nexport class ScenegraphNode {\n readonly id: string;\n matrix: Matrix4 = new Matrix4();\n\n display = true;\n position = new Vector3();\n rotation = new Vector3();\n scale = new Vector3(1, 1, 1);\n userData: Record<string, unknown> = {};\n\n props: ScenegraphNodeProps = {};\n\n constructor(props: ScenegraphNodeProps = {}) {\n const {id} = props;\n\n this.id = id || uid(this.constructor.name);\n\n this._setScenegraphNodeProps(props);\n }\n\n getBounds(): [number[], number[]] | null {\n return null;\n }\n\n destroy(): void {}\n\n /** @deprecated use .destroy() */\n delete(): void {\n this.destroy();\n }\n setProps(props: ScenegraphNodeProps): this {\n this._setScenegraphNodeProps(props);\n return this;\n }\n\n toString(): string {\n return `{type: ScenegraphNode, id: ${this.id})}`;\n }\n\n setPosition(position: any): this {\n // assert(position.length === 3, 'setPosition requires vector argument');\n this.position = position;\n return this;\n }\n\n setRotation(rotation: any): this {\n // assert(rotation.length === 3, 'setRotation requires vector argument');\n this.rotation = rotation;\n return this;\n }\n\n setScale(scale: any): this {\n // assert(scale.length === 3, 'setScale requires vector argument');\n this.scale = scale;\n return this;\n }\n\n setMatrix(matrix: any, copyMatrix: boolean = true): void {\n if (copyMatrix) {\n this.matrix.copy(matrix);\n } else {\n this.matrix = matrix;\n }\n }\n\n setMatrixComponents(components: {\n position?: any;\n rotation?: any;\n scale?: any;\n update?: boolean;\n }): this {\n const {position, rotation, scale, update = true} = components;\n if (position) {\n this.setPosition(position);\n }\n if (rotation) {\n this.setRotation(rotation);\n }\n if (scale) {\n this.setScale(scale);\n }\n if (update) {\n this.updateMatrix();\n }\n return this;\n }\n\n updateMatrix(): this {\n const pos = this.position;\n const rot = this.rotation;\n const scale = this.scale;\n\n this.matrix.identity();\n this.matrix.translate(pos);\n this.matrix.rotateXYZ(rot);\n this.matrix.scale(scale);\n return this;\n }\n\n update(options: {position?: any; rotation?: any; scale?: any} = {}): this {\n const {position, rotation, scale} = options;\n if (position) {\n this.setPosition(position);\n }\n if (rotation) {\n this.setRotation(rotation);\n }\n if (scale) {\n this.setScale(scale);\n }\n this.updateMatrix();\n return this;\n }\n\n getCoordinateUniforms(\n viewMatrix: any,\n modelMatrix?: any\n ): {\n viewMatrix: any;\n modelMatrix: any;\n objectMatrix: any;\n worldMatrix: any;\n worldInverseMatrix: any;\n worldInverseTransposeMatrix: any;\n } {\n // TODO - solve multiple class problem\n // assert(viewMatrix instanceof Matrix4);\n // assert(viewMatrix);\n modelMatrix = modelMatrix || this.matrix;\n const worldMatrix = new Matrix4(viewMatrix).multiplyRight(modelMatrix);\n const worldInverse = worldMatrix.invert();\n const worldInverseTranspose = worldInverse.transpose();\n\n return {\n viewMatrix,\n modelMatrix,\n objectMatrix: modelMatrix,\n worldMatrix,\n worldInverseMatrix: worldInverse,\n worldInverseTransposeMatrix: worldInverseTranspose\n };\n }\n\n // TODO - copied code, not yet vetted\n /*\n transform() {\n if (!this.parent) {\n this.endPosition.set(this.position);\n this.endRotation.set(this.rotation);\n this.endScale.set(this.scale);\n } else {\n const parent = this.parent;\n this.endPosition.set(this.position.add(parent.endPosition));\n this.endRotation.set(this.rotation.add(parent.endRotation));\n this.endScale.set(this.scale.add(parent.endScale));\n }\n\n const ch = this.children;\n for (let i = 0; i < ch.length; ++i) {\n ch[i].transform();\n }\n\n return this;\n }\n */\n\n _setScenegraphNodeProps(props: ScenegraphNodeProps): void {\n // if ('display' in props) {\n // this.display = props.display;\n // }\n\n if ('position' in props) {\n this.setPosition(props.position);\n }\n if ('rotation' in props) {\n this.setRotation(props.rotation);\n }\n if ('scale' in props) {\n this.setScale(props.scale);\n }\n\n // Matrix overwrites other props\n if ('matrix' in props) {\n this.setMatrix(props.matrix);\n }\n\n Object.assign(this.props, props);\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {Matrix4, Vector3} from '@math.gl/core';\nimport {log} from '@luma.gl/core';\nimport {ScenegraphNode, ScenegraphNodeProps} from './scenegraph-node';\n\nexport type GroupNodeProps = ScenegraphNodeProps & {\n children?: ScenegraphNode[];\n};\n\nexport class GroupNode extends ScenegraphNode {\n children: ScenegraphNode[];\n\n constructor(children: ScenegraphNode[]);\n constructor(props?: GroupNodeProps);\n\n constructor(props: ScenegraphNode[] | GroupNodeProps = {}) {\n props = Array.isArray(props) ? {children: props} : props;\n const {children = []} = props;\n log.assert(\n children.every(child => child instanceof ScenegraphNode),\n 'every child must an instance of ScenegraphNode'\n );\n super(props);\n this.children = children;\n }\n\n override getBounds(): [number[], number[]] | null {\n const result: [number[], number[]] = [\n [Infinity, Infinity, Infinity],\n [-Infinity, -Infinity, -Infinity]\n ];\n\n this.traverse((node, {worldMatrix}) => {\n const bounds = node.getBounds();\n if (!bounds) {\n return;\n }\n const [min, max] = bounds;\n const center = new Vector3(min).add(max).divide([2, 2, 2]);\n worldMatrix.transformAsPoint(center, center);\n const halfSize = new Vector3(max).subtract(min).divide([2, 2, 2]);\n worldMatrix.transformAsVector(halfSize, halfSize);\n\n for (let v = 0; v < 8; v++) {\n // Test all 8 corners of the box\n const position = new Vector3(v & 0b001 ? -1 : 1, v & 0b010 ? -1 : 1, v & 0b100 ? -1 : 1)\n .multiply(halfSize)\n .add(center);\n\n for (let i = 0; i < 3; i++) {\n result[0][i] = Math.min(result[0][i], position[i]);\n result[1][i] = Math.max(result[1][i], position[i]);\n }\n }\n });\n if (!Number.isFinite(result[0][0])) {\n return null;\n }\n return result;\n }\n\n override destroy(): void {\n this.children.forEach(child => child.destroy());\n this.removeAll();\n super.destroy();\n }\n\n // Unpacks arrays and nested arrays of children\n add(...children: (ScenegraphNode | ScenegraphNode[])[]): this {\n for (const child of children) {\n if (Array.isArray(child)) {\n this.add(...child);\n } else {\n this.children.push(child);\n }\n }\n return this;\n }\n\n remove(child: ScenegraphNode): this {\n const children = this.children;\n const indexOf = children.indexOf(child);\n if (indexOf > -1) {\n children.splice(indexOf, 1);\n }\n return this;\n }\n\n removeAll(): this {\n this.children = [];\n return this;\n }\n\n traverse(\n visitor: (node: ScenegraphNode, context: {worldMatrix: Matrix4}) => void,\n {worldMatrix = new Matrix4()} = {}\n ) {\n const modelMatrix = new Matrix4(worldMatrix).multiplyRight(this.matrix);\n\n for (const child of this.children) {\n if (child instanceof GroupNode) {\n child.traverse(visitor, {worldMatrix: modelMatrix});\n } else {\n visitor(child, {worldMatrix: modelMatrix});\n }\n }\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {RenderPass} from '@luma.gl/core';\nimport {ScenegraphNode, ScenegraphNodeProps} from './scenegraph-node';\nimport {Model} from '../model/model';\n\nexport type ModelNodeProps = ScenegraphNodeProps & {\n model: Model;\n managedResources?: any[];\n bounds?: [number[], number[]];\n};\n\nexport class ModelNode extends ScenegraphNode {\n readonly model: Model;\n bounds: [number[], number[]] | null = null;\n managedResources: any[];\n\n // TODO - is this used? override callbacks to make sure we call them with this\n // onBeforeRender = null;\n // onAfterRender = null;\n // AfterRender = null;\n\n constructor(props: ModelNodeProps) {\n super(props);\n\n // Create new Model or used supplied Model\n this.model = props.model;\n this.managedResources = props.managedResources || [];\n this.bounds = props.bounds || null;\n this.setProps(props);\n }\n\n override destroy(): void {\n if (this.model) {\n this.model.destroy();\n // @ts-expect-error\n this.model = null;\n }\n this.managedResources.forEach(resource => resource.destroy());\n this.managedResources = [];\n }\n\n override getBounds(): [number[], number[]] | null {\n return this.bounds;\n }\n\n // Expose model methods\n draw(renderPass: RenderPass) {\n // Return value indicates if something was actually drawn\n return this.model.draw(renderPass);\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {Geometry} from '../geometry/geometry';\nimport {uid} from '../utils/uid';\n\nconst INDEX_OFFSETS = {\n x: [2, 0, 1],\n y: [0, 1, 2],\n z: [1, 2, 0]\n};\n\nexport type TruncatedConeGeometryProps = {\n topRadius?: number;\n bottomRadius?: number;\n topCap?: boolean;\n bottomCap?: boolean;\n height?: number;\n nradial?: number;\n nvertical?: number;\n verticalAxis?: 'x' | 'y' | 'z';\n};\n\n/**\n * Primitives inspired by TDL http://code.google.com/p/webglsamples/,\n * copyright 2011 Google Inc. new BSD License\n * (http://www.opensource.org/licenses/bsd-license.php).\n */\nexport class TruncatedConeGeometry extends Geometry {\n constructor(props: TruncatedConeGeometryProps & {id?: string; attributes?: any} = {}) {\n const {id = uid('truncated-code-geometry')} = props;\n const {indices, attributes} = tesselateTruncatedCone(props);\n super({\n ...props,\n id,\n topology: 'triangle-list',\n indices,\n attributes: {\n POSITION: {size: 3, value: attributes.POSITION},\n NORMAL: {size: 3, value: attributes.NORMAL},\n TEXCOORD_0: {size: 2, value: attributes.TEXCOORD_0},\n ...props.attributes\n }\n });\n }\n}\n\n/* eslint-disable max-statements, complexity */\nfunction tesselateTruncatedCone(props: TruncatedConeGeometryProps = {}) {\n const {\n bottomRadius = 0,\n topRadius = 0,\n height = 1,\n nradial = 10,\n nvertical = 10,\n verticalAxis = 'y',\n topCap = false,\n bottomCap = false\n } = props;\n\n const extra = (topCap ? 2 : 0) + (bottomCap ? 2 : 0);\n const numVertices = (nradial + 1) * (nvertical + 1 + extra);\n\n const slant = Math.atan2(bottomRadius - topRadius, height);\n const msin = Math.sin;\n const mcos = Math.cos;\n const mpi = Math.PI;\n const cosSlant = mcos(slant);\n const sinSlant = msin(slant);\n const start = topCap ? -2 : 0;\n const end = nvertical + (bottomCap ? 2 : 0);\n const vertsAroundEdge = nradial + 1;\n\n const indices = new Uint16Array(nradial * (nvertical + extra) * 6);\n const indexOffset = INDEX_OFFSETS[verticalAxis];\n\n const positions = new Float32Array(numVertices * 3);\n const normals = new Float32Array(numVertices * 3);\n const texCoords = new Float32Array(numVertices * 2);\n\n let i3 = 0;\n let i2 = 0;\n for (let i = start; i <= end; i++) {\n let v = i / nvertical;\n let y = height * v;\n let ringRadius;\n\n if (i < 0) {\n y = 0;\n v = 1;\n ringRadius = bottomRadius;\n } else if (i > nvertical) {\n y = height;\n v = 1;\n ringRadius = topRadius;\n } else {\n ringRadius = bottomRadius + (topRadius - bottomRadius) * (i / nvertical);\n }\n if (i === -2 || i === nvertical + 2) {\n ringRadius = 0;\n v = 0;\n }\n y -= height / 2;\n for (let j = 0; j < vertsAroundEdge; j++) {\n const sin = msin((j * mpi * 2) / nradial);\n const cos = mcos((j * mpi * 2) / nradial);\n\n positions[i3 + indexOffset[0]] = sin * ringRadius;\n positions[i3 + indexOffset[1]] = y;\n positions[i3 + indexOffset[2]] = cos * ringRadius;\n\n normals[i3 + indexOffset[0]] = i < 0 || i > nvertical ? 0 : sin * cosSlant;\n normals[i3 + indexOffset[1]] = i < 0 ? -1 : i > nvertical ? 1 : sinSlant;\n normals[i3 + indexOffset[2]] = i < 0 || i > nvertical ? 0 : cos * cosSlant;\n\n texCoords[i2 + 0] = j / nradial;\n texCoords[i2 + 1] = v;\n\n i2 += 2;\n i3 += 3;\n }\n }\n\n for (let i = 0; i < nvertical + extra; i++) {\n for (let j = 0; j < nradial; j++) {\n const index = (i * nradial + j) * 6;\n indices[index + 0] = vertsAroundEdge * (i + 0) + 0 + j;\n indices[index + 1] = vertsAroundEdge * (i + 0) + 1 + j;\n indices[index + 2] = vertsAroundEdge * (i + 1) + 1 + j;\n indices[index + 3] = vertsAroundEdge * (i + 0) + 0 + j;\n indices[index + 4] = vertsAroundEdge * (i + 1) + 1 + j;\n indices[index + 5] = vertsAroundEdge * (i + 1) + 0 + j;\n }\n }\n\n return {\n indices,\n attributes: {\n POSITION: positions,\n NORMAL: normals,\n TEXCOORD_0: texCoords\n }\n };\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {TruncatedConeGeometry} from './truncated-cone-geometry';\nimport {uid} from '../utils/uid';\n\nexport type ConeGeometryProps = {\n id?: string;\n radius?: number;\n cap?: boolean;\n};\n\nexport class ConeGeometry extends TruncatedConeGeometry {\n constructor(props: ConeGeometryProps = {}) {\n const {id = uid('cone-geometry'), radius = 1, cap = true} = props;\n super({\n ...props,\n id,\n topRadius: 0,\n topCap: Boolean(cap),\n bottomCap: Boolean(cap),\n bottomRadius: radius\n });\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {Geometry} from '../geometry/geometry';\nimport {uid} from '../utils/uid';\n// import type {GeometryType} from '../geometry/geometry-type';\n\nexport type CubeGeometryProps = {\n id?: string;\n indices?: boolean;\n attributes?: any;\n};\n\nexport class CubeGeometry extends Geometry {\n constructor(props: CubeGeometryProps = {}) {\n const {id = uid('cube-geometry'), indices = true} = props;\n super(\n indices\n ? {\n ...props,\n id,\n topology: 'triangle-list',\n indices: {size: 1, value: CUBE_INDICES},\n attributes: {...ATTRIBUTES, ...props.attributes}\n }\n : {\n ...props,\n id,\n topology: 'triangle-list',\n indices: undefined,\n attributes: {...NON_INDEXED_ATTRIBUTES, ...props.attributes}\n }\n );\n }\n}\n\n// prettier-ignore\nconst CUBE_INDICES = new Uint16Array([\n 0, 1, 2, 0, 2, 3, 4, 5, 6, 4, 6, 7, 8, 9, 10, 8, 10, 11, 12, 13,\n 14, 12, 14, 15, 16, 17, 18, 16, 18, 19, 20, 21, 22, 20, 22, 23\n]);\n\n// prettier-ignore\nconst CUBE_POSITIONS = new Float32Array([\n -1, -1, 1, 1, -1, 1, 1, 1, 1, -1, 1, 1,\n -1, -1, -1, -1, 1, -1, 1, 1, -1, 1, -1, -1,\n -1, 1, -1, -1, 1, 1, 1, 1, 1, 1, 1, -1,\n -1, -1, -1, 1, -1, -1, 1, -1, 1, -1, -1, 1,\n 1, -1, -1, 1, 1, -1, 1, 1, 1, 1, -1, 1,\n -1, -1, -1, -1, -1, 1, -1, 1, 1, -1, 1, -1\n]);\n\n// TODO - could be Uint8\n// prettier-ignore\nconst CUBE_NORMALS = new Float32Array([\n // Front face\n 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1,\n // Back face\n 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1,\n // Top face\n 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0,\n // Bottom face\n 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0,\n // Right face\n 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0,\n // Left face\n -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0\n]);\n\n// prettier-ignore\nconst CUBE_TEX_COORDS = new Float32Array([\n // Front face\n 0, 0, 1, 0, 1, 1, 0, 1,\n // Back face\n 1, 0, 1, 1, 0, 1, 0, 0,\n // Top face\n 0, 1, 0, 0, 1, 0, 1, 1,\n // Bottom face\n 1, 1, 0, 1, 0, 0, 1, 0,\n // Right face\n 1, 0, 1, 1, 0, 1, 0, 0,\n // Left face\n 0, 0, 1, 0, 1, 1, 0, 1\n]);\n\n// float4 position\n// prettier-ignore\nexport const CUBE_NON_INDEXED_POSITIONS = new Float32Array([\n 1, -1, 1,\n -1, -1, 1,\n -1, -1, -1,\n 1, -1, -1,\n 1, -1, 1,\n -1, -1, -1,\n\n 1, 1, 1,\n 1, -1, 1,\n 1, -1, -1,\n 1, 1, -1,\n 1, 1, 1,\n 1, -1, -1,\n\n -1, 1, 1,\n 1, 1, 1,\n 1, 1, -1,\n -1, 1, -1,\n -1, 1, 1,\n 1, 1, -1,\n\n -1, -1, 1,\n -1, 1, 1,\n -1, 1, -1,\n -1, -1, -1,\n -1, -1, 1,\n -1, 1, -1,\n\n 1, 1, 1,\n -1, 1, 1,\n -1, -1, 1,\n -1, -1, 1,\n 1, -1, 1,\n 1, 1, 1,\n\n 1, -1, -1,\n -1, -1, -1,\n -1, 1, -1,\n 1, 1, -1,\n 1, -1, -1,\n -1, 1, -1,\n]);\n\n// float2 uv,\n// prettier-ignore\nexport const CUBE_NON_INDEXED_TEX_COORDS = new Float32Array([\n 1, 1,\n 0, 1,\n 0, 0,\n 1, 0,\n 1, 1,\n 0, 0,\n\n 1, 1,\n 0, 1,\n 0, 0,\n 1, 0,\n 1, 1,\n 0, 0,\n\n 1, 1,\n 0, 1,\n 0, 0,\n 1, 0,\n 1, 1,\n 0, 0,\n\n 1, 1,\n 0, 1,\n 0, 0,\n 1, 0,\n 1, 1,\n 0, 0,\n\n 1, 1,\n 0, 1,\n 0, 0,\n 0, 0,\n 1, 0,\n 1, 1,\n\n 1, 1,\n 0, 1,\n 0, 0,\n 1, 0,\n 1, 1,\n 0, 0,\n]);\n\n// float4 color\n// prettier-ignore\nexport const CUBE_NON_INDEXED_COLORS = new Float32Array([\n 1, 0, 1, 1,\n 0, 0, 1, 1,\n 0, 0, 0, 1,\n 1, 0, 0, 1,\n 1, 0, 1, 1,\n 0, 0, 0, 1,\n\n 1, 1, 1, 1,\n 1, 0, 1, 1,\n 1, 0, 0, 1,\n 1, 1, 0, 1,\n 1, 1, 1, 1,\n 1, 0, 0, 1,\n\n 0, 1, 1, 1,\n 1, 1, 1, 1,\n 1, 1, 0, 1,\n 0, 1, 0, 1,\n 0, 1, 1, 1,\n 1, 1, 0, 1,\n\n 0, 0, 1, 1,\n 0, 1, 1, 1,\n 0, 1, 0, 1,\n 0, 0, 0, 1,\n 0, 0, 1, 1,\n 0, 1, 0, 1,\n\n 1, 1, 1, 1,\n 0, 1, 1, 1,\n 0, 0, 1, 1,\n 0, 0, 1, 1,\n 1, 0, 1, 1,\n 1, 1, 1, 1,\n\n 1, 0, 0, 1,\n 0, 0, 0, 1,\n 0, 1, 0, 1,\n 1, 1, 0, 1,\n 1, 0, 0, 1,\n 0, 1, 0, 1,\n]);\n\nconst ATTRIBUTES = {\n POSITION: {size: 3, value: CUBE_POSITIONS},\n NORMAL: {size: 3, value: CUBE_NORMALS},\n TEXCOORD_0: {size: 2, value: CUBE_TEX_COORDS}\n};\n\nconst NON_INDEXED_ATTRIBUTES = {\n POSITION: {size: 3, value: CUBE_NON_INDEXED_POSITIONS},\n // NORMAL: {size: 3, value: CUBE_NON_INDEXED_NORMALS},\n TEXCOORD_0: {size: 2, value: CUBE_NON_INDEXED_TEX_COORDS},\n COLOR_0: {size: 3, value: CUBE_NON_INDEXED_COLORS}\n};\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {TruncatedConeGeometry} from './truncated-cone-geometry';\nimport {uid} from '../utils/uid';\n\nexport type CylinderGeometryProps = {\n id?: string;\n radius?: number;\n attributes?: any;\n};\n\nexport class CylinderGeometry extends TruncatedConeGeometry {\n constructor(props: CylinderGeometryProps = {}) {\n const {id = uid('cylinder-geometry'), radius = 1} = props;\n super({\n ...props,\n id,\n bottomRadius: radius,\n topRadius: radius\n });\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {Vector3} from '@math.gl/core';\nimport {Geometry} from '../geometry/geometry';\nimport {uid} from '../utils/uid';\n\n/* eslint-disable comma-spacing, max-statements, complexity */\n\nconst ICO_POSITIONS = [-1, 0, 0, 0, 1, 0, 0, 0, -1, 0, 0, 1, 0, -1, 0, 1, 0, 0];\nconst ICO_INDICES = [3, 4, 5, 3, 5, 1, 3, 1, 0, 3, 0, 4, 4, 0, 2, 4, 2, 5, 2, 0, 1, 5, 2, 1];\n\nexport type IcoSphereGeometryProps = {\n id?: string;\n radius?: number;\n iterations?: number;\n attributes?: any;\n};\n\nexport class IcoSphereGeometry extends Geometry {\n constructor(props: IcoSphereGeometryProps = {}) {\n const {id = uid('ico-sphere-geometry')} = props;\n const {indices, attributes} = tesselateIcosaHedron(props);\n super({\n ...props,\n id,\n topology: 'triangle-list',\n indices,\n attributes: {...attributes, ...props.attributes}\n });\n }\n}\n\nfunction tesselateIcosaHedron(props: IcoSphereGeometryProps) {\n const {iterations = 0} = props;\n\n const PI = Math.PI;\n const PI2 = PI * 2;\n\n const positions = [...ICO_POSITIONS];\n let indices = [...ICO_INDICES];\n\n positions.push();\n indices.push();\n\n const getMiddlePoint = (() => {\n const pointMemo: Record<string, number> = {};\n\n return (i1: number, i2: number) => {\n i1 *= 3;\n i2 *= 3;\n const mini = i1 < i2 ? i1 : i2;\n const maxi = i1 > i2 ? i1 : i2;\n const key = `${mini}|${maxi}`;\n\n if (key in pointMemo) {\n return pointMemo[key];\n }\n\n const x1 = positions[i1];\n const y1 = positions[i1 + 1];\n const z1 = positions[i1 + 2];\n const x2 = positions[i2];\n const y2 = positions[i2 + 1];\n const z2 = positions[i2 + 2];\n let xm = (x1 + x2) / 2;\n let ym = (y1 + y2) / 2;\n let zm = (z1 + z2) / 2;\n const len = Math.sqrt(xm * xm + ym * ym + zm * zm);\n\n xm /= len;\n ym /= len;\n zm /= len;\n\n positions.push(xm, ym, zm);\n\n return (pointMemo[key] = positions.length / 3 - 1);\n };\n })();\n\n for (let i = 0; i < iterations; i++) {\n const indices2: number[] = [];\n for (let j = 0; j < indices.length; j += 3) {\n const a = getMiddlePoint(indices[j + 0], indices[j + 1]);\n const b = getMiddlePoint(indices[j + 1], indices[j + 2]);\n const c = getMiddlePoint(indices[j + 2], indices[j + 0]);\n\n indices2.push(c, indices[j + 0], a, a, indices[j + 1], b, b, indices[j + 2], c, a, b, c);\n }\n indices = indices2;\n }\n\n // Calculate texCoords and normals\n const normals = new Array(positions.length);\n const texCoords = new Array((positions.length / 3) * 2);\n\n const l = indices.length;\n for (let i = l - 3; i >= 0; i -= 3) {\n const i1 = indices[i + 0];\n const i2 = indices[i + 1];\n const i3 = indices[i + 2];\n const in1 = i1 * 3;\n const in2 = i2 * 3;\n const in3 = i3 * 3;\n const iu1 = i1 * 2;\n const iu2 = i2 * 2;\n const iu3 = i3 * 2;\n const x1 = positions[in1 + 0];\n const y1 = positions[in1 + 1];\n const z1 = positions[in1 + 2];\n const theta1 = Math.acos(z1 / Math.sqrt(x1 * x1 + y1 * y1 + z1 * z1));\n const phi1 = Math.atan2(y1, x1) + PI;\n const v1 = theta1 / PI;\n const u1 = 1 - phi1 / PI2;\n const x2 = positions[in2 + 0];\n const y2 = positions[in2 + 1];\n const z2 = positions[in2 + 2];\n const theta2 = Math.acos(z2 / Math.sqrt(x2 * x2 + y2 * y2 + z2 * z2));\n const phi2 = Math.atan2(y2, x2) + PI;\n const v2 = theta2 / PI;\n const u2 = 1 - phi2 / PI2;\n const x3 = positions[in3 + 0];\n const y3 = positions[in3 + 1];\n const z3 = positions[in3 + 2];\n const theta3 = Math.acos(z3 / Math.sqrt(x3 * x3 + y3 * y3 + z3 * z3));\n const phi3 = Math.atan2(y3, x3) + PI;\n const v3 = theta3 / PI;\n const u3 = 1 - phi3 / PI2;\n const vec1 = [x3 - x2, y3 - y2, z3 - z2];\n const vec2 = [x1 - x2, y1 - y2, z1 - z2];\n const normal = new Vector3(vec1).cross(vec2).normalize();\n let newIndex;\n\n if (\n (u1 === 0 || u2 === 0 || u3 === 0) &&\n (u1 === 0 || u1 > 0.5) &&\n (u2 === 0 || u2 > 0.5) &&\n (u3 === 0 || u3 > 0.5)\n ) {\n positions.push(positions[in1 + 0], positions[in1 + 1], positions[in1 + 2]);\n newIndex = positions.length / 3 - 1;\n indices.push(newIndex);\n texCoords[newIndex * 2 + 0] = 1;\n texCoords[newIndex * 2 + 1] = v1;\n normals[newIndex * 3 + 0] = normal.x;\n normals[newIndex * 3 + 1] = normal.y;\n normals[newIndex * 3 + 2] = normal.z;\n\n positions.push(positions[in2 + 0], positions[in2 + 1], positions[in2 + 2]);\n newIndex = positions.length / 3 - 1;\n indices.push(newIndex);\n texCoords[newIndex * 2 + 0] = 1;\n texCoords[newIndex * 2 + 1] = v2;\n normals[newIndex * 3 + 0] = normal.x;\n normals[newIndex * 3 + 1] = normal.y;\n normals[newIndex * 3 + 2] = normal.z;\n\n positions.push(positions[in3 + 0], positions[in3 + 1], positions[in3 + 2]);\n newIndex = positions.length / 3 - 1;\n indices.push(newIndex);\n texCoords[newIndex * 2 + 0] = 1;\n texCoords[newIndex * 2 + 1] = v3;\n normals[newIndex * 3 + 0] = normal.x;\n normals[newIndex * 3 + 1] = normal.y;\n normals[newIndex * 3 + 2] = normal.z;\n }\n\n normals[in1 + 0] = normals[in2 + 0] = normals[in3 + 0] = normal.x;\n normals[in1 + 1] = normals[in2 + 1] = normals[in3 + 1] = normal.y;\n normals[in1 + 2] = normals[in2 + 2] = normals[in3 + 2] = normal.z;\n\n texCoords[iu1 + 0] = u1;\n texCoords[iu1 + 1] = v1;\n\n texCoords[iu2 + 0] = u2;\n texCoords[iu2 + 1] = v2;\n\n texCoords[iu3 + 0] = u3;\n texCoords[iu3 + 1] = v3;\n }\n\n return {\n indices: {size: 1, value: new Uint16Array(indices)},\n attributes: {\n POSITION: {size: 3, value: new Float32Array(positions)},\n NORMAL: {size: 3, value: new Float32Array(normals)},\n TEXCOORD_0: {size: 2, value: new Float32Array(texCoords)}\n }\n };\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nexport function unpackIndexedGeometry(geometry: any) {\n const {indices, attributes} = geometry;\n if (!indices) {\n return geometry;\n }\n\n const vertexCount = indices.value.length;\n const unpackedAttributes: Record<string, any> = {};\n\n for (const attributeName in attributes) {\n const attribute = attributes[attributeName];\n const {constant, value, size} = attribute;\n if (constant || !size) {\n continue; // eslint-disable-line\n }\n const unpackedValue = new value.constructor(vertexCount * size);\n for (let x = 0; x < vertexCount; ++x) {\n const index = indices.value[x];\n for (let i = 0; i < size; i++) {\n unpackedValue[x * size + i] = value[index * size + i];\n }\n }\n unpackedAttributes[attributeName] = {size, value: unpackedValue};\n }\n\n return {\n attributes: Object.assign({}, attributes, unpackedAttributes)\n };\n}\n\n// export function calculateVertexNormals(positions: Float32Array): Uint8Array {\n// let normals = new Uint8Array(positions.length / 3);\n\n// for (let i = 0; i < positions.length; i++) {\n// const vec1 = new Vector3(positions.subarray(i * 3, i + 0, i + 3));\n// const vec2 = new Vector3(positions.subarray(i + 3, i + 6));\n// const vec3 = new Vector3(positions.subarray(i + 6, i + 9));\n\n// const normal = new Vector3(vec1).cross(vec2).normalize();\n// normals.set(normal[0], i + 4);\n// normals.set(normal[1], i + 4 + 1);\n// normals.set(normal[2], i + 2);\n// }\n// const normal = new Vector3(vec1).cross(vec2).normalize();\n// }\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {Geometry} from '../geometry/geometry';\nimport {unpackIndexedGeometry} from '../geometry/geometry-utils';\nimport {uid} from '../utils/uid';\n\nexport type PlaneGeometryProps = {\n id?: string;\n radius?: number;\n attributes?: any;\n};\n\n// Primitives inspired by TDL http://code.google.com/p/webglsamples/,\n// copyright 2011 Google Inc. new BSD License\n// (http://www.opensource.org/licenses/bsd-license.php).\nexport class PlaneGeometry extends Geometry {\n constructor(props: PlaneGeometryProps = {}) {\n const {id = uid('plane-geometry')} = props;\n\n const {indices, attributes} = tesselatePlane(props);\n super({\n ...props,\n id,\n topology: 'triangle-list',\n indices,\n attributes: {...attributes, ...props.attributes}\n });\n }\n}\n\n/* eslint-disable complexity, max-statements */\nfunction tesselatePlane(props: any) {\n const {type = 'x,y', offset = 0, flipCull = false, unpack = false} = props;\n\n const coords = type.split(',');\n // width, height\n let c1len = props[`${coords[0]}len`] || 1;\n const c2len = props[`${coords[1]}len`] || 1;\n // subdivisionsWidth, subdivisionsDepth\n const subdivisions1 = props[`n${coords[0]}`] || 1;\n const subdivisions2 = props[`n${coords[1]}`] || 1;\n const numVertices = (subdivisions1 + 1) * (subdivisions2 + 1);\n\n const positions = new Float32Array(numVertices * 3);\n const normals = new Float32Array(numVertices * 3);\n const texCoords = new Float32Array(numVertices * 2);\n\n if (flipCull) {\n c1len = -c1len;\n }\n\n let i2 = 0;\n let i3 = 0;\n for (let z = 0; z <= subdivisions2; z++) {\n for (let x = 0; x <= subdivisions1; x++) {\n const u = x / subdivisions1;\n const v = z / subdivisions2;\n texCoords[i2 + 0] = flipCull ? 1 - u : u;\n texCoords[i2 + 1] = v;\n\n switch (type) {\n case 'x,y':\n positions[i3 + 0] = c1len * u - c1len * 0.5;\n positions[i3 + 1] = c2len * v - c2len * 0.5;\n positions[i3 + 2] = offset;\n\n normals[i3 + 0] = 0;\n normals[i3 + 1] = 0;\n normals[i3 + 2] = flipCull ? 1 : -1;\n break;\n\n case 'x,z':\n positions[i3 + 0] = c1len * u - c1len * 0.5;\n positions[i3 + 1] = offset;\n positions[i3 + 2] = c2len * v - c2len * 0.5;\n\n normals[i3 + 0] = 0;\n normals[i3 + 1] = flipCull ? 1 : -1;\n normals[i3 + 2] = 0;\n break;\n\n case 'y,z':\n positions[i3 + 0] = offset;\n positions[i3 + 1] = c1len * u - c1len * 0.5;\n positions[i3 + 2] = c2len * v - c2len * 0.5;\n\n normals[i3 + 0] = flipCull ? 1 : -1;\n normals[i3 + 1] = 0;\n normals[i3 + 2] = 0;\n break;\n\n default:\n throw new Error('PlaneGeometry: unknown type');\n }\n\n i2 += 2;\n i3 += 3;\n }\n }\n\n const numVertsAcross = subdivisions1 + 1;\n const indices = new Uint16Array(subdivisions1 * subdivisions2 * 6);\n\n for (let z = 0; z < subdivisions2; z++) {\n for (let x = 0; x < subdivisions1; x++) {\n const index = (z * subdivisions1 + x) * 6;\n // Make triangle 1 of quad.\n indices[index + 0] = (z + 0) * numVertsAcross + x;\n indices[index + 1] = (z + 1) * numVertsAcross + x;\n indices[index + 2] = (z + 0) * numVertsAcross + x + 1;\n\n // Make triangle 2 of quad.\n indices[index + 3] = (z + 1) * numVertsAcross + x;\n indices[index + 4] = (z + 1) * numVertsAcross + x + 1;\n indices[index + 5] = (z + 0) * numVertsAcross + x + 1;\n }\n }\n\n const geometry = {\n indices: {size: 1, value: indices},\n attributes: {\n POSITION: {size: 3, value: positions},\n NORMAL: {size: 3, value: normals},\n TEXCOORD_0: {size: 2, value: texCoords}\n }\n };\n\n // Optionally, unpack indexed geometry\n return unpack ? unpackIndexedGeometry(geometry) : geometry;\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {Geometry} from '../geometry/geometry';\nimport {uid} from '../utils/uid';\n\nexport type SphereGeometryProps = {\n id?: string;\n radius?: number;\n nlat?: number;\n nlong?: number;\n attributes?: any;\n};\n\n// Primitives inspired by TDL http://code.google.com/p/webglsamples/,\n// copyright 2011 Google Inc. new BSD License\n// (http://www.opensource.org/licenses/bsd-license.php).\nexport class SphereGeometry extends Geometry {\n constructor(props: SphereGeometryProps = {}) {\n const {id = uid('sphere-geometry')} = props;\n const {indices, attributes} = tesselateSphere(props);\n super({\n ...props,\n id,\n topology: 'triangle-list',\n indices,\n attributes: {...attributes, ...props.attributes}\n });\n }\n}\n\n/* eslint-disable max-statements, complexity */\nfunction tesselateSphere(props: SphereGeometryProps) {\n const {nlat = 10, nlong = 10} = props;\n\n const startLat = 0;\n const endLat = Math.PI;\n const latRange = endLat - startLat;\n const startLong = 0;\n const endLong = 2 * Math.PI;\n const longRange = endLong - startLong;\n const numVertices = (nlat + 1) * (nlong + 1);\n\n const radius = (n1: number, n2: number, n3: number, u: number, v: number) => props.radius || 1;\n\n const positions = new Float32Array(numVertices * 3);\n const normals = new Float32Array(numVertices * 3);\n const texCoords = new Float32Array(numVertices * 2);\n\n const IndexType = numVertices > 0xffff ? Uint32Array : Uint16Array;\n const indices = new IndexType(nlat * nlong * 6);\n\n // Create positions, normals and texCoords\n for (let y = 0; y <= nlat; y++) {\n for (let x = 0; x <= nlong; x++) {\n const u = x / nlong;\n const v = y / nlat;\n\n const index = x + y * (nlong + 1);\n const i2 = index * 2;\n const i3 = index * 3;\n\n const theta = longRange * u;\n const phi = latRange * v;\n const sinTheta = Math.sin(theta);\n const cosTheta = Math.cos(theta);\n const sinPhi = Math.sin(phi);\n const cosPhi = Math.cos(phi);\n const ux = cosTheta * sinPhi;\n const uy = cosPhi;\n const uz = sinTheta * sinPhi;\n\n const r = radius(ux, uy, uz, u, v);\n\n positions[i3 + 0] = r * ux;\n positions[i3 + 1] = r * uy;\n positions[i3 + 2] = r * uz;\n\n normals[i3 + 0] = ux;\n normals[i3 + 1] = uy;\n normals[i3 + 2] = uz;\n\n texCoords[i2 + 0] = u;\n texCoords[i2 + 1] = 1 - v;\n }\n }\n\n // Create indices\n const numVertsAround = nlong + 1;\n for (let x = 0; x < nlong; x++) {\n for (let y = 0; y < nlat; y++) {\n const index = (x * nlat + y) * 6;\n\n indices[index + 0] = y * numVertsAround + x;\n indices[index + 1] = y * numVertsAround + x + 1;\n indices[index + 2] = (y + 1) * numVertsAround + x;\n\n indices[index + 3] = (y + 1) * numVertsAround + x;\n indices[index + 4] = y * numVertsAround + x + 1;\n indices[index + 5] = (y + 1) * numVertsAround + x + 1;\n }\n }\n\n return {\n indices: {size: 1, value: indices},\n attributes: {\n POSITION: {size: 3, value: positions},\n NORMAL: {size: 3, value: normals},\n TEXCOORD_0: {size: 2, value: texCoords}\n }\n };\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n/** Creates a deterministic pseudorandom number generator */\nexport function makeRandomGenerator(): () => number {\n let s = 1;\n let c = 1;\n return () => {\n s = Math.sin(c * 17.23);\n c = Math.cos(s * 27.92);\n return fract(Math.abs(s * c) * 1432.71);\n };\n}\n\nfunction fract(n: number): number {\n return n - Math.floor(n);\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {Device, RenderPass, Texture} from '@luma.gl/core';\nimport type {ShaderPass} from '@luma.gl/shadertools';\nimport {initializeShaderModule} from '@luma.gl/shadertools';\nimport {ShaderInputs} from '../shader-inputs';\nimport {AsyncTexture} from '../async-texture/async-texture';\nimport {ClipSpace} from '../models/clip-space';\nimport {SwapFramebuffers} from '../compute/swap';\nimport {BackgroundTextureModel} from '../models/billboard-texture-model';\n\nimport {getFragmentShaderForRenderPass} from './get-fragment-shader';\n\ntype ShaderSubPass = NonNullable<ShaderPass['passes']>[0];\n\n/** Props for ShaderPassRenderer */\nexport type ShaderPassRendererProps = {\n /** List of ShaderPasses to apply to the sourceTexture */\n shaderPasses: ShaderPass[];\n /** Optional typed ShaderInputs object for setting uniforms */\n shaderInputs: ShaderInputs;\n};\n\n/** A pass that renders a given texture into screen space */\nexport class ShaderPassRenderer {\n device: Device;\n shaderInputs: ShaderInputs;\n passRenderers: PassRenderer[];\n swapFramebuffers: SwapFramebuffers;\n /** For rendering to the screen */\n clipSpace: ClipSpace;\n textureModel: BackgroundTextureModel;\n\n constructor(device: Device, props: ShaderPassRendererProps) {\n this.device = device;\n\n props.shaderPasses.map(shaderPass => initializeShaderModule(shaderPass));\n\n const modules = props.shaderPasses.reduce(\n (object, shaderPass) => ({...object, [shaderPass.name]: shaderPass}),\n {}\n );\n this.shaderInputs = props.shaderInputs || new ShaderInputs(modules);\n\n const size = device.getCanvasContext().getDrawingBufferSize();\n this.swapFramebuffers = new SwapFramebuffers(device, {\n colorAttachments: [device.preferredColorFormat],\n width: size[0],\n height: size[1]\n });\n\n this.textureModel = new BackgroundTextureModel(device, {\n backgroundTexture: this.swapFramebuffers.current.colorAttachments[0].texture\n });\n\n this.clipSpace = new ClipSpace(device, {\n source: /* wgsl */ `\\\n @group(0) @binding(0) var sourceTexture: texture_2d<f32>;\n @group(0) @binding(1) var sourceTextureSampler: sampler;\n\n@fragment\nfn fragmentMain(inputs: FragmentInputs) -> @location(0) vec4<f32> {\n\tlet texCoord: vec2<f32> = inputs.coordinate;\n\treturn textureSample(sourceTexture, sourceTextureSampler, texCoord);\n}\n`,\n\n fs: /* glsl */ `\\\n#version 300 es\n\nuniform sampler2D sourceTexture;\nin vec2 uv;\nin vec2 coordinate;\nout vec4 fragColor;\n\nvoid main() {\n vec2 texCoord = coordinate;\n fragColor = texture(sourceTexture, coordinate);\n}\n`\n });\n\n this.passRenderers = props.shaderPasses.map(shaderPass => new PassRenderer(device, shaderPass));\n }\n\n /** Destroys resources created by this ShaderPassRenderer */\n destroy() {\n for (const subPassRenderer of this.passRenderers) {\n subPassRenderer.destroy();\n }\n this.swapFramebuffers.destroy();\n this.clipSpace.destroy();\n }\n\n resize(width: number, height: number): void {\n this.swapFramebuffers.resize({width, height});\n // this.props.passes.forEach(pass => pass.resize(width, height));\n }\n\n renderToScreen(options: {sourceTexture: AsyncTexture; uniforms?: any; bindings?: any}): boolean {\n // Run the shader passes and generate an output texture\n const outputTexture = this.renderToTexture(options);\n if (!outputTexture) {\n // source texture not yet loaded\n return false;\n }\n\n const framebuffer = this.device\n .getDefaultCanvasContext()\n // @ts-expect-error TODO - remove after republish\n .getCurrentFramebuffer({depthStencilAttachment: false});\n const renderPass = this.device.beginRenderPass({\n id: 'shader-pass-renderer-to-screen',\n framebuffer,\n clearColor: [0, 0, 0, 1],\n clearDepth: 1\n });\n this.clipSpace.setBindings({sourceTexture: outputTexture});\n this.clipSpace.draw(renderPass);\n renderPass.end();\n return true;\n }\n\n /** Runs the shaderPasses in sequence on the sourceTexture and returns a texture with the results.\n * @returns null if the the sourceTexture has not yet been loaded\n */\n renderToTexture(options: {\n sourceTexture: AsyncTexture;\n uniforms?: any;\n bindings?: any;\n }): Texture | null {\n const {sourceTexture} = options;\n if (!sourceTexture.isReady) {\n return null;\n }\n\n this.textureModel.destroy();\n this.textureModel = new BackgroundTextureModel(this.device, {\n backgroundTexture: sourceTexture\n });\n\n // Clear the current texture before we begin\n const clearTexturePass = this.device.beginRenderPass({\n id: 'shader-pass-renderer-clear-texture',\n framebuffer: this.swapFramebuffers.current,\n clearColor: [0, 0, 0, 1]\n });\n this.textureModel.draw(clearTexturePass);\n clearTexturePass.end();\n\n // const commandEncoder = this.device.createCommandEncoder();\n // commandEncoder.copyTextureToTexture({\n // sourceTexture: sourceTexture.texture,\n // destinationTexture: this.swapFramebuffers.current.colorAttachments[0].texture\n // });\n // commandEncoder.finish();\n\n let first = true;\n for (const passRenderer of this.passRenderers) {\n for (const subPassRenderer of passRenderer.subPassRenderers) {\n if (!first) {\n this.swapFramebuffers.swap();\n }\n first = false;\n\n const swapBufferTexture = this.swapFramebuffers.current.colorAttachments[0].texture;\n\n const bindings = {\n sourceTexture: swapBufferTexture\n // texSize: [sourceTextures.width, sourceTextures.height]\n };\n\n const renderPass = this.device.beginRenderPass({\n id: 'shader-pass-renderer-run-pass',\n framebuffer: this.swapFramebuffers.next,\n clearColor: [0, 0, 0, 1],\n clearDepth: 1\n });\n subPassRenderer.render({renderPass, bindings});\n renderPass.end();\n }\n }\n\n this.swapFramebuffers.swap();\n const outputTexture = this.swapFramebuffers.current.colorAttachments[0].texture;\n return outputTexture;\n }\n}\n\n/** renders one ShaderPass */\nclass PassRenderer {\n shaderPass: ShaderPass;\n subPassRenderers: SubPassRenderer[];\n\n constructor(device: Device, shaderPass: ShaderPass, props = {}) {\n this.shaderPass = shaderPass;\n // const id = `${shaderPass.name}-pass`;\n\n const subPasses = shaderPass.passes || [];\n // normalizePasses(gl, module, id, props);\n\n this.subPassRenderers = subPasses.map(subPass => {\n // const idn = `${id}-${subPasses.length + 1}`;\n return new SubPassRenderer(device, shaderPass, subPass);\n });\n }\n\n destroy() {\n for (const subPassRenderer of this.subPassRenderers) {\n subPassRenderer.destroy();\n }\n }\n}\n\n/** Renders one subpass of a ShaderPass */\nclass SubPassRenderer {\n model: ClipSpace;\n shaderPass: ShaderPass;\n subPass: ShaderSubPass;\n\n constructor(device: Device, shaderPass: ShaderPass, subPass: ShaderSubPass) {\n this.shaderPass = shaderPass;\n this.subPass = subPass;\n const action =\n subPass.action || (subPass.filter && 'filter') || (subPass.sampler && 'sample') || 'filter';\n const fs = getFragmentShaderForRenderPass({\n shaderPass,\n action,\n shadingLanguage: device.info.shadingLanguage\n });\n\n this.model = new ClipSpace(device, {\n id: `${shaderPass.name}-subpass`,\n source: fs,\n fs,\n modules: [shaderPass],\n parameters: {\n depthWriteEnabled: false\n }\n });\n }\n\n destroy() {\n this.model.destroy();\n }\n\n render(options: {renderPass: RenderPass; bindings: any}): void {\n const {renderPass, bindings} = options;\n\n this.model.shaderInputs.setProps({\n [this.shaderPass.name]: this.shaderPass.uniforms || {}\n });\n this.model.shaderInputs.setProps({\n [this.shaderPass.name]: this.subPass.uniforms || {}\n });\n // this.model.setBindings(this.subPass.bindings || {});\n this.model.setBindings(bindings || {});\n this.model.draw(renderPass);\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {BufferProps, FramebufferProps} from '@luma.gl/core';\nimport {Device, Resource, Buffer, Framebuffer, Texture} from '@luma.gl/core';\n\n/**\n * Helper class for working with repeated transformations / computations\n * Primarily intended for GPU buffers `Swap<Buffer>` or textures `Swap<Texture>`)\n * @note the two resources are expected to be structurally identical (same size, length, format, etc)\n * @note the two resources can be destroyed by calling `destroy()`\n */\nexport class Swap<T extends Resource<any>> {\n /** The current resource - usually the source for renders or computations */\n current: T;\n /** The next resource - usually the target/destination for transforms / computations */\n next: T;\n\n constructor(props: {current: T; next: T}) {\n this.current = props.current;\n this.next = props.next;\n }\n\n /** Destroys the two managed resources */\n destroy() {\n this.current?.destroy();\n this.next?.destroy();\n }\n\n /** Make the next resource into the current resource, and reuse the current resource as the next resource */\n swap() {\n const current = this.current;\n this.current = this.next;\n this.next = current;\n }\n}\n\n/** Helper for managing double-buffered framebuffers */\nexport class SwapFramebuffers extends Swap<Framebuffer> {\n constructor(device: Device, props: FramebufferProps) {\n props = {...props};\n\n let colorAttachments = props.colorAttachments?.map(colorAttachment =>\n typeof colorAttachment !== 'string'\n ? colorAttachment\n : device.createTexture({\n format: colorAttachment,\n usage: Texture.SAMPLE | Texture.RENDER | Texture.COPY_SRC | Texture.COPY_DST,\n width: 1,\n height: 1\n })\n );\n\n const current = device.createFramebuffer({...props, colorAttachments});\n\n colorAttachments = props.colorAttachments?.map(colorAttachment =>\n typeof colorAttachment !== 'string'\n ? colorAttachment\n : device.createTexture({\n format: colorAttachment,\n usage:\n Texture.TEXTURE | Texture.COPY_SRC | Texture.COPY_DST | Texture.RENDER_ATTACHMENT,\n width: 1,\n height: 1\n })\n );\n\n const next = device.createFramebuffer({...props, colorAttachments});\n\n super({current, next});\n }\n\n /**\n * Resizes the Framebuffers.\n * @returns true if the size changed, otherwise exiting framebuffers were preserved\n * @note any contents are not preserved!\n */\n resize(size: {width: number; height: number}): boolean {\n if (size.width === this.current.width && size.height === this.current.height) {\n return false;\n }\n const {current, next} = this;\n\n this.current = current.clone(size);\n current.destroy();\n\n this.next = next.clone(size);\n next.destroy();\n\n return true;\n }\n}\n\n/** Helper for managing double-buffered GPU buffers */\nexport class SwapBuffers extends Swap<Buffer> {\n constructor(device: Device, props: BufferProps) {\n super({current: device.createBuffer(props), next: device.createBuffer(props)});\n }\n\n /**\n * Resizes the Buffers.\n * @returns true if the size changed, otherwise exiting buffers were preserved.\n * @note any contents are not preserved!\n */\n resize(props: {byteLength: number}) {\n if (props.byteLength === this.current.byteLength) {\n return false;\n }\n\n const {current, next} = this;\n\n this.current = current.clone(props);\n current.destroy();\n\n this.next = next.clone(props);\n next.destroy();\n\n return true;\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {ShaderPass} from '@luma.gl/shadertools';\n\n/**\n * Gets fragment shader source for a shader pass sub pass\n * @param options\n * @returns\n */\nexport function getFragmentShaderForRenderPass(options: {\n shaderPass: ShaderPass;\n action: 'filter' | 'sample';\n shadingLanguage: 'wgsl' | 'glsl';\n}): string {\n const {shaderPass, action, shadingLanguage} = options;\n switch (action) {\n case 'filter':\n const filterFunc = `${shaderPass.name}_filterColor_ext`;\n return shadingLanguage === 'wgsl'\n ? getFilterShaderWGSL(filterFunc)\n : getFilterShaderGLSL(filterFunc);\n\n case 'sample':\n const samplerFunc = `${shaderPass.name}_sampleColor`;\n return shadingLanguage === 'wgsl'\n ? getSamplerShaderWGSL(samplerFunc)\n : getSamplerShaderGLSL(samplerFunc);\n\n default:\n throw new Error(`${shaderPass.name} no fragment shader generated for shader pass`);\n }\n}\n\n/** Get a filtering WGSL fragment shader */\nfunction getFilterShaderWGSL(func: string) {\n return /* wgsl */ `\\\n// Binding 0:1 is reserved for shader passes\n// @group(0) @binding(0) var<uniform> brightnessContrast : brightnessContrastUniforms;\n@group(0) @binding(1) var texture: texture_2d<f32>;\n@group(0) @binding(2) var sampler: sampler;\n\nstruct FragmentInputs {\n @location(0) fragUV: vec2f,\n @location(1) fragPosition: vec4f,\n @location(2) fragCoordinate: vec4f\n};\n\n@fragment\nfn fragmentMain(inputs: FragmentInputs) -> @location(0) vec4f {\n let texSize = textureDimensions(texture, 0);\n var fragColor = textureSample(texture, sampler, fragUV);\n fragColor = ${func}(gl_FragColor, texSize, texCoord);\n return fragColor;\n}\n`;\n}\n\n/** Get a sampling WGSL fragment shader */\nfunction getSamplerShaderWGSL(func: string) {\n return /* wgsl */ `\\\n// Binding 0:1 is reserved for shader passes\n@group(0) @binding(0) var<uniform> brightnessContrast : brightnessContrastUniforms;\n@group(0) @binding(1) var texture: texture_2d<f32>;\n@group(0) @binding(2) var sampler: sampler;\n\nstruct FragmentInputs = {\n @location(0) fragUV: vec2f,\n @location(1) fragPosition: vec4f,\n @location(2) fragCoordinate: vec4f\n};\n\n@fragment\nfn fragmentMain(inputs: FragmentInputs) -> @location(0) vec4f {\n let texSize = textureDimensions(texture, 0);\n var fragColor = textureSample(texture, sampler, fragUV);\n fragColor = ${func}(gl_FragColor, texSize, texCoord);\n return fragColor;\n}\n`;\n}\n\n/** Get a filtering GLSL fragment shader */\nfunction getFilterShaderGLSL(func: string) {\n return /* glsl */ `\\\n#version 300 es\n\nuniform sampler2D sourceTexture;\n\nin vec2 position;\nin vec2 coordinate;\nin vec2 uv;\n\nout vec4 fragColor;\n\nvoid main() {\n vec2 texCoord = coordinate;\n ivec2 iTexSize = textureSize(sourceTexture, 0);\n vec2 texSize = vec2(float(iTexSize.x), float(iTexSize.y));\n\n fragColor = texture(sourceTexture, texCoord);\n fragColor = ${func}(fragColor, texSize, texCoord);\n}\n`;\n}\n\n/** Get a sampling GLSL fragment shader */\nfunction getSamplerShaderGLSL(func: string) {\n return /* glsl */ `\\\n#version 300 es\n\nuniform sampler2D sourceTexture;\n\nin vec2 position;\nin vec2 coordinate;\nin vec2 uv;\n\nout vec4 fragColor;\n\nvoid main() {\n vec2 texCoord = coordinate;\n ivec2 iTexSize = textureSize(sourceTexture, 0);\n vec2 texSize = vec2(float(iTexSize.x), float(iTexSize.y));\n\n fragColor = ${func}(sourceTexture, texSize, texCoord);\n}\n`;\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {DeviceFeature, ComputePipelineProps, Shader, Binding} from '@luma.gl/core';\nimport {\n Device,\n Buffer,\n ComputePipeline,\n ComputePass,\n UniformStore,\n log,\n getTypedArrayConstructor\n} from '@luma.gl/core';\nimport type {ShaderModule, PlatformInfo} from '@luma.gl/shadertools';\nimport {ShaderAssembler, getShaderLayoutFromWGSL} from '@luma.gl/shadertools';\nimport {TypedArray, isNumericArray} from '@math.gl/types';\nimport {ShaderInputs} from '../shader-inputs';\nimport {PipelineFactory} from '../factories/pipeline-factory';\nimport {ShaderFactory} from '../factories/shader-factory';\nimport {uid} from '../utils/uid';\n// import {getDebugTableForShaderLayout} from '../debug/debug-shader-layout';\n\nconst LOG_DRAW_PRIORITY = 2;\nconst LOG_DRAW_TIMEOUT = 10000;\n\nexport type ComputationProps = Omit<ComputePipelineProps, 'shader'> & {\n source?: string;\n\n /** shadertool shader modules (added to shader code) */\n modules?: ShaderModule[];\n /** Shadertool module defines (configures shader code)*/\n defines?: Record<string, boolean>;\n // TODO - injections, hooks etc?\n\n /** Shader inputs, used to generated uniform buffers and bindings */\n shaderInputs?: ShaderInputs;\n\n /** Bindings */\n bindings?: Record<string, Binding>;\n\n /** Show shader source in browser? */\n debugShaders?: 'never' | 'errors' | 'warnings' | 'always';\n\n /** Factory used to create a {@link ComputePipeline}. Defaults to {@link Device} default factory. */\n pipelineFactory?: PipelineFactory;\n /** Factory used to create a {@link Shader}. Defaults to {@link Device} default factory. */\n shaderFactory?: ShaderFactory;\n /** Shader assembler. Defaults to the ShaderAssembler.getShaderAssembler() */\n shaderAssembler?: ShaderAssembler;\n};\n\n/**\n * v9 Model API\n * A model\n * - automatically reuses pipelines (programs) when possible\n * - automatically rebuilds pipelines if necessary to accommodate changed settings\n * shadertools integration\n * - accepts modules and performs shader transpilation\n */\nexport class Computation {\n static defaultProps: Required<ComputationProps> = {\n ...ComputePipeline.defaultProps,\n id: 'unnamed',\n handle: undefined,\n userData: {},\n\n source: '',\n modules: [],\n defines: {},\n\n bindings: undefined!,\n shaderInputs: undefined!,\n\n pipelineFactory: undefined!,\n shaderFactory: undefined!,\n shaderAssembler: ShaderAssembler.getDefaultShaderAssembler(),\n\n debugShaders: undefined!\n };\n\n readonly device: Device;\n readonly id: string;\n\n readonly pipelineFactory: PipelineFactory;\n readonly shaderFactory: ShaderFactory;\n\n userData: {[key: string]: any} = {};\n\n /** Bindings (textures, samplers, uniform buffers) */\n bindings: Record<string, Binding> = {};\n\n /** The underlying GPU pipeline. */\n pipeline: ComputePipeline;\n /** Assembled compute shader source */\n source: string;\n /** the underlying compiled compute shader */\n // @ts-ignore Set in function called from constructor\n shader: Shader;\n\n /** ShaderInputs instance */\n shaderInputs: ShaderInputs;\n\n // @ts-ignore Set in function called from constructor\n _uniformStore: UniformStore;\n\n _pipelineNeedsUpdate: string | false = 'newly created';\n\n private _getModuleUniforms: (props?: Record<string, Record<string, any>>) => Record<string, any>;\n private props: Required<ComputationProps>;\n\n private _destroyed = false;\n\n constructor(device: Device, props: ComputationProps) {\n if (device.type !== 'webgpu') {\n throw new Error('Computation is only supported in WebGPU');\n }\n\n this.props = {...Computation.defaultProps, ...props};\n props = this.props;\n this.id = props.id || uid('model');\n this.device = device;\n\n Object.assign(this.userData, props.userData);\n\n // Setup shader module inputs\n const moduleMap = Object.fromEntries(\n this.props.modules?.map(module => [module.name, module]) || []\n );\n // @ts-ignore TODO - fix up typing?\n this.shaderInputs = props.shaderInputs || new ShaderInputs(moduleMap);\n this.setShaderInputs(this.shaderInputs);\n\n // Support WGSL shader layout introspection\n // TODO - Don't modify props!!\n this.props.shaderLayout ||= getShaderLayoutFromWGSL(this.props.source);\n\n // Setup shader assembler\n const platformInfo = getPlatformInfo(device);\n\n // Extract modules from shader inputs if not supplied\n const modules =\n (this.props.modules?.length > 0 ? this.props.modules : this.shaderInputs?.getModules()) || [];\n\n this.pipelineFactory =\n props.pipelineFactory || PipelineFactory.getDefaultPipelineFactory(this.device);\n this.shaderFactory = props.shaderFactory || ShaderFactory.getDefaultShaderFactory(this.device);\n\n const {source, getUniforms} = this.props.shaderAssembler.assembleWGSLShader({\n platformInfo,\n ...this.props,\n modules\n });\n\n this.source = source;\n // @ts-ignore\n this._getModuleUniforms = getUniforms;\n\n // Create the pipeline\n // @note order is important\n this.pipeline = this._updatePipeline();\n\n // Apply any dynamic settings that will not trigger pipeline change\n if (props.bindings) {\n this.setBindings(props.bindings);\n }\n\n // Catch any access to non-standard props\n Object.seal(this);\n }\n\n destroy(): void {\n if (this._destroyed) return;\n this.pipelineFactory.release(this.pipeline);\n this.shaderFactory.release(this.shader);\n this._uniformStore.destroy();\n this._destroyed = true;\n }\n\n // Draw call\n\n predraw() {\n // Update uniform buffers if needed\n this.updateShaderInputs();\n }\n\n dispatch(computePass: ComputePass, x: number, y?: number, z?: number): void {\n try {\n this._logDrawCallStart();\n\n // Check if the pipeline is invalidated\n // TODO - this is likely the worst place to do this from performance perspective. Perhaps add a predraw()?\n this.pipeline = this._updatePipeline();\n\n // Set pipeline state, we may be sharing a pipeline so we need to set all state on every draw\n // Any caching needs to be done inside the pipeline functions\n this.pipeline.setBindings(this.bindings);\n computePass.setPipeline(this.pipeline);\n // @ts-expect-error\n computePass.setBindings([]);\n\n computePass.dispatch(x, y, z);\n } finally {\n this._logDrawCallEnd();\n }\n }\n\n // Update fixed fields (can trigger pipeline rebuild)\n\n // Update dynamic fields\n\n /**\n * Updates the vertex count (used in draw calls)\n * @note Any attributes with stepMode=vertex need to be at least this big\n */\n setVertexCount(vertexCount: number): void {\n // this.vertexCount = vertexCount;\n }\n\n /**\n * Updates the instance count (used in draw calls)\n * @note Any attributes with stepMode=instance need to be at least this big\n */\n setInstanceCount(instanceCount: number): void {\n // this.instanceCount = instanceCount;\n }\n\n setShaderInputs(shaderInputs: ShaderInputs): void {\n this.shaderInputs = shaderInputs;\n this._uniformStore = new UniformStore(this.shaderInputs.modules);\n // Create uniform buffer bindings for all modules\n for (const moduleName of Object.keys(this.shaderInputs.modules)) {\n const uniformBuffer = this._uniformStore.getManagedUniformBuffer(this.device, moduleName);\n this.bindings[`${moduleName}Uniforms`] = uniformBuffer;\n }\n }\n\n /**\n * Updates shader module settings (which results in uniforms being set)\n */\n setShaderModuleProps(props: Record<string, any>): void {\n const uniforms = this._getModuleUniforms(props);\n\n // Extract textures & framebuffers set by the modules\n // TODO better way to extract bindings\n const keys = Object.keys(uniforms).filter(k => {\n const uniform = uniforms[k];\n return (\n !isNumericArray(uniform) && typeof uniform !== 'number' && typeof uniform !== 'boolean'\n );\n });\n const bindings: Record<string, Binding> = {};\n for (const k of keys) {\n bindings[k] = uniforms[k];\n delete uniforms[k];\n }\n }\n\n updateShaderInputs(): void {\n this._uniformStore.setUniforms(this.shaderInputs.getUniformValues());\n }\n\n /**\n * Sets bindings (textures, samplers, uniform buffers)\n */\n setBindings(bindings: Record<string, Binding>): void {\n Object.assign(this.bindings, bindings);\n }\n\n _setPipelineNeedsUpdate(reason: string): void {\n this._pipelineNeedsUpdate = this._pipelineNeedsUpdate || reason;\n }\n\n _updatePipeline(): ComputePipeline {\n if (this._pipelineNeedsUpdate) {\n let prevShader: Shader | null = null;\n if (this.pipeline) {\n log.log(\n 1,\n `Model ${this.id}: Recreating pipeline because \"${this._pipelineNeedsUpdate}\".`\n )();\n prevShader = this.shader;\n }\n\n this._pipelineNeedsUpdate = false;\n\n this.shader = this.shaderFactory.createShader({\n id: `${this.id}-fragment`,\n stage: 'compute',\n source: this.source,\n debugShaders: this.props.debugShaders\n });\n\n this.pipeline = this.pipelineFactory.createComputePipeline({\n ...this.props,\n shader: this.shader\n });\n\n if (prevShader) {\n this.shaderFactory.release(prevShader);\n }\n }\n return this.pipeline;\n }\n\n /** Throttle draw call logging */\n _lastLogTime = 0;\n _logOpen = false;\n\n _logDrawCallStart(): void {\n // IF level is 4 or higher, log every frame.\n const logDrawTimeout = log.level > 3 ? 0 : LOG_DRAW_TIMEOUT;\n if (log.level < 2 || Date.now() - this._lastLogTime < logDrawTimeout) {\n return;\n }\n\n this._lastLogTime = Date.now();\n this._logOpen = true;\n\n log.group(LOG_DRAW_PRIORITY, `>>> DRAWING MODEL ${this.id}`, {collapsed: log.level <= 2})();\n }\n\n _logDrawCallEnd(): void {\n if (this._logOpen) {\n // const shaderLayoutTable = getDebugTableForShaderLayout(this.pipeline.props.shaderLayout, this.id);\n\n // log.table(logLevel, attributeTable)();\n // log.table(logLevel, uniformTable)();\n // log.table(LOG_DRAW_PRIORITY, shaderLayoutTable)();\n\n const uniformTable = this.shaderInputs.getDebugTable();\n log.table(LOG_DRAW_PRIORITY, uniformTable)();\n\n log.groupEnd(LOG_DRAW_PRIORITY)();\n this._logOpen = false;\n }\n }\n\n protected _drawCount = 0;\n\n // TODO - fix typing of luma data types\n _getBufferOrConstantValues(attribute: Buffer | TypedArray, dataType: any): string {\n const TypedArrayConstructor = getTypedArrayConstructor(dataType);\n const typedArray =\n attribute instanceof Buffer ? new TypedArrayConstructor(attribute.debugData) : attribute;\n return typedArray.toString();\n }\n}\n\n/** Create a shadertools platform info from the Device */\nexport function getPlatformInfo(device: Device): PlatformInfo {\n return {\n type: device.type,\n shaderLanguage: device.info.shadingLanguage,\n shaderLanguageVersion: device.info.shadingLanguageVersion as 100 | 300,\n gpu: device.info.gpu,\n // HACK - we pretend that the DeviceFeatures is a Set, it has a similar API\n features: device.features as unknown as Set<DeviceFeature>\n };\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {NumberArray4} from '@math.gl/types';\nimport type {ShaderModule} from '@luma.gl/shadertools';\n\n/** Default color for auto highlight, a cyan color */\nconst DEFAULT_HIGHLIGHT_COLOR: NumberArray4 = [0, 1, 1, 1];\n\nexport const INVALID_INDEX = -1;\n\n/**\n * Props for the picking module, which depending on mode renders picking colors or highlighted item.\n * When active, renders picking colors, assumed to be rendered to off-screen \"picking\" buffer.\n * When inactive, renders normal colors, with the exception of selected object which is rendered with highlight\n * can distinguish between 2^32 different objects in each of 2^32 different batches.\n */\nexport type PickingProps = {\n /** Are we picking? I.e. rendering picking colors? */\n isActive?: boolean;\n /** Whether to use instance_index (built-in) or a custom application supplied index (usually from an attribute) */\n indexMode?: 'instance' | 'custom';\n /** Batch index (used when rendering multiple models to identify which model was picked), defaults to 0 */\n batchIndex?: number;\n\n /** Index of the highlighted batch, defaults to 0 */\n highlightedBatchIndex?: number | null;\n /** Set an index to highlight that item, or `null` to explicitly clear **/\n highlightedObjectIndex?: number | null;\n /** Color of visual highlight of \"selected\" item () */\n highlightColor?: NumberArray4;\n};\n\n/**\n * Uniforms for the picking module, which renders picking colors and highlighted item.\n * When active, renders picking colors, assumed to be rendered to off-screen \"picking\" buffer.\n * When inactive, renders normal colors, with the exception of selected object which is rendered with highlight\n */\nexport type PickingUniforms = {\n /**\n * When true, renders picking colors. Set when rendering to off-screen \"picking\" buffer.\n * When false, renders normal colors, with the exception of selected object which is rendered with highlight\n */\n isActive: boolean;\n /** Set to true when picking an attribute value instead of object index */\n indexMode: 0 | 1;\n /** Index of batch currently being rendered */\n batchIndex: number;\n\n /** Do we have a highlighted item? */\n isHighlightActive: boolean;\n /** Color of visual highlight of \"selected\" item. Note: RGBA components must in the range 0-1 */\n highlightColor: NumberArray4;\n /** Indicates which batch to visually highlight an item in (defaults to 0) */\n highlightedBatchIndex: number;\n /** Indicates which index in the batch to highlight an item in */\n highlightedObjectIndex: number;\n};\n\nexport type PickingBindings = {};\n\n// GLSL_UNIFORMS\n\nconst uniformTypes: Required<ShaderModule<PickingProps, PickingUniforms>>['uniformTypes'] = {\n isActive: 'i32',\n indexMode: 'i32',\n batchIndex: 'i32',\n\n isHighlightActive: 'i32',\n highlightedBatchIndex: 'i32',\n highlightedObjectIndex: 'i32',\n highlightColor: 'vec4<f32>'\n};\n\nexport const GLSL_UNIFORMS = /* glsl */ `\\\nprecision highp float;\nprecision highp int;\n\nuniform pickingUniforms {\n int isActive;\n int indexMode;\n int batchIndex;\n\n int isHighlightActive;\n int highlightedBatchIndex;\n int highlightedObjectIndex;\n vec4 highlightColor;\n} picking;\n`;\n\nexport const WGSL_UNIFORMS = /* wgsl */ `\\\nstruct pickingUniforms {\n isActive: int32;\n indexMode: int32;\n batchIndex: int32;\n\n isHighlightActive: int32;\n highlightedBatchIndex: int32;\n highlightedObjectIndex: int32;\n highlightColor: vec4<f32>;\n} picking;\n`;\n\nfunction getUniforms(props: PickingProps = {}, prevUniforms?: PickingUniforms): PickingUniforms {\n const uniforms = {...prevUniforms} as PickingUniforms;\n\n // picking\n if (props.isActive !== undefined) {\n uniforms.isActive = Boolean(props.isActive);\n }\n\n switch (props.indexMode) {\n case 'instance':\n uniforms.indexMode = 0;\n break;\n case 'custom':\n uniforms.indexMode = 1;\n break;\n case undefined:\n // no change\n break;\n }\n\n switch (props.highlightedObjectIndex) {\n case undefined:\n // Unless highlightedObjectColor explicitly null or set, do not update state\n break;\n case null:\n // Clear highlight\n uniforms.isHighlightActive = false;\n uniforms.highlightedObjectIndex = INVALID_INDEX;\n break;\n default:\n uniforms.isHighlightActive = true;\n uniforms.highlightedObjectIndex = props.highlightedObjectIndex;\n }\n\n if (typeof props.highlightedBatchIndex === 'number') {\n uniforms.highlightedBatchIndex = props.highlightedBatchIndex;\n }\n\n if (props.highlightColor) {\n uniforms.highlightColor = props.highlightColor;\n }\n\n return uniforms;\n}\n\n/**\n * Provides support for color-based picking and highlighting.\n *\n * In particular, supports picking a specific instance in an instanced\n * draw call and highlighting an instance based on its picking color,\n * and correspondingly, supports picking and highlighting groups of\n * primitives with the same picking color in non-instanced draw-calls\n *\n * @note Color based picking has the significant advantage in that it can be added to any\n * existing shader without requiring any additional picking logic.\n */\nexport const pickingUniforms = {\n props: {} as PickingProps,\n uniforms: {} as PickingUniforms,\n\n name: 'picking',\n\n uniformTypes,\n defaultUniforms: {\n isActive: false,\n indexMode: 0,\n batchIndex: 0,\n isHighlightActive: true,\n highlightedBatchIndex: INVALID_INDEX,\n highlightedObjectIndex: INVALID_INDEX,\n highlightColor: DEFAULT_HIGHLIGHT_COLOR\n },\n\n getUniforms\n} as const satisfies ShaderModule<PickingProps, PickingUniforms, PickingBindings>;\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {Device, Framebuffer} from '@luma.gl/core';\nimport {ShaderInputs} from '../../shader-inputs';\nimport {pickingUniforms, INVALID_INDEX} from './picking-uniforms';\n// import {picking} from './color-picking';\n\n/** Information about picked object */\nexport type PickInfo = {\n batchIndex: number | null;\n objectIndex: number | null;\n};\n\nexport type PickingManagerProps = {\n /** Shader Inputs from models to pick */\n shaderInputs?: ShaderInputs<{picking: typeof pickingUniforms.props}>;\n /** Callback */\n onObjectPicked?: (info: PickInfo) => void;\n};\n\n/**\n * Helper class for using the new picking module\n * @todo Port to WebGPU\n * @todo Support multiple models\n * @todo Switching picking module\n */\nexport class PickingManager {\n device: Device;\n props: Required<PickingManagerProps>;\n /** Info from latest pick operation */\n pickInfo: PickInfo = {batchIndex: null, objectIndex: null};\n /** Framebuffer used for picking */\n framebuffer: Framebuffer | null = null;\n\n static defaultProps: Required<PickingManagerProps> = {\n shaderInputs: undefined!,\n onObjectPicked: () => {}\n };\n\n constructor(device: Device, props: PickingManagerProps) {\n this.device = device;\n this.props = {...PickingManager.defaultProps, ...props};\n }\n\n destroy() {\n this.framebuffer?.destroy();\n }\n\n // TODO - Ask for a cached framebuffer? a Framebuffer factory?\n getFramebuffer() {\n if (!this.framebuffer) {\n this.framebuffer = this.device.createFramebuffer({\n colorAttachments: ['rgba8unorm', 'rg32sint'],\n depthStencilAttachment: 'depth24plus'\n });\n }\n return this.framebuffer;\n }\n\n /** Clear highlighted / picked object */\n clearPickState() {\n this.props.shaderInputs.setProps({picking: {highlightedObjectIndex: null}});\n }\n\n /** Prepare for rendering picking colors */\n beginRenderPass() {\n const framebuffer = this.getFramebuffer();\n framebuffer.resize(this.device.getDefaultCanvasContext().getDevicePixelSize());\n\n this.props.shaderInputs?.setProps({picking: {isActive: true}});\n\n const pickingPass = this.device.beginRenderPass({\n framebuffer,\n clearColors: [new Float32Array([0, 0, 0, 0]), new Int32Array([-1, -1, 0, 0])],\n clearDepth: 1\n });\n\n return pickingPass;\n }\n\n async updatePickInfo(mousePosition: [number, number]): Promise<PickInfo | null> {\n const framebuffer = this.getFramebuffer();\n\n // use the center pixel location in device pixel range\n const [pickX, pickY] = this.getPickPosition(mousePosition);\n\n // Read back\n const pixelData = this.device.readPixelsToArrayWebGL(framebuffer, {\n sourceX: pickX,\n sourceY: pickY,\n sourceWidth: 1,\n sourceHeight: 1,\n sourceAttachment: 1\n });\n if (!pixelData) {\n return null;\n }\n\n const pickInfo: PickInfo = {\n objectIndex: pixelData[0] === INVALID_INDEX ? null : pixelData[0],\n batchIndex: pixelData[1] === INVALID_INDEX ? null : pixelData[1]\n };\n\n // Call callback if picked object has changed\n if (\n pickInfo.objectIndex !== this.pickInfo.objectIndex ||\n pickInfo.batchIndex !== this.pickInfo.batchIndex\n ) {\n this.pickInfo = pickInfo;\n this.props.onObjectPicked(pickInfo);\n // console.log(`Object ${pickInfo.objectIndex} in batch ${pickInfo.batchIndex} was picked`)\n }\n\n this.props.shaderInputs?.setProps({\n picking: {\n isActive: false,\n highlightedBatchIndex: pickInfo.batchIndex,\n highlightedObjectIndex: pickInfo.objectIndex\n }\n });\n\n return this.pickInfo;\n }\n\n /**\n * Get pick position in device pixel range\n * use the center pixel location in device pixel range\n */\n getPickPosition(mousePosition: [number, number]): [number, number] {\n const devicePixels = this.device.getDefaultCanvasContext().cssToDevicePixels(mousePosition);\n const pickX = devicePixels.x + Math.floor(devicePixels.width / 2);\n const pickY = devicePixels.y + Math.floor(devicePixels.height / 2);\n return [pickX, pickY];\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {ShaderModule} from '@luma.gl/shadertools';\n\nimport type {PickingBindings, PickingProps, PickingUniforms} from './picking-uniforms';\nimport {pickingUniforms, GLSL_UNIFORMS, WGSL_UNIFORMS, INVALID_INDEX} from './picking-uniforms';\n\n// SHADERS\n\nconst source = /* wgsl */ `\\\n${WGSL_UNIFORMS}\n\nconst INDEX_PICKING_MODE_INSTANCE = 0;\nconst INDEX_PICKING_MODE_CUSTOM = 1;\nconst INDEX_PICKING_INVALID_INDEX = ${INVALID_INDEX}; // 2^32 - 1\n\nstruct indexPickingFragmentInputs = {\n objectIndex: int32;\n};\n\nlet indexPickingFragmentInputs: indexPickingFragmentInputs;\n\n/**\n * Vertex shaders should call this function to set the object index.\n * If using instance or vertex mode, argument will be ignored, 0 can be supplied.\n */\nfn picking_setObjectIndex(objectIndex: int32) {\n switch (picking.indexMode) {\n case INDEX_PICKING_MODE_INSTANCE, default: {\n picking_objectIndex = instance_index;\n };\n case INDEX_PICKING_MODE_CUSTOM: {\n picking_objectIndex = objectIndex;\n };\n }\n}\n\n`;\n\nconst vs = /* glsl */ `\\\n${GLSL_UNIFORMS}\n\nconst int INDEX_PICKING_MODE_INSTANCE = 0;\nconst int INDEX_PICKING_MODE_CUSTOM = 1;\n\nconst int INDEX_PICKING_INVALID_INDEX = ${INVALID_INDEX}; // 2^32 - 1\n\nflat out int picking_objectIndex;\n\n/**\n * Vertex shaders should call this function to set the object index.\n * If using instance or vertex mode, argument will be ignored, 0 can be supplied.\n */\nvoid picking_setObjectIndex(int objectIndex) {\n switch (picking.indexMode) {\n case INDEX_PICKING_MODE_INSTANCE:\n picking_objectIndex = gl_InstanceID;\n break;\n case INDEX_PICKING_MODE_CUSTOM:\n picking_objectIndex = objectIndex;\n break;\n }\n}\n`;\n\nconst fs = /* glsl */ `\\\n${GLSL_UNIFORMS}\n\nconst int INDEX_PICKING_INVALID_INDEX = ${INVALID_INDEX}; // 2^32 - 1\n\nflat in int picking_objectIndex;\n\n/**\n * Check if this vertex is highlighted (part of the selected batch and object)\n */ \nbool picking_isFragmentHighlighted() {\n return \n bool(picking.isHighlightActive) &&\n picking.highlightedBatchIndex == picking.batchIndex &&\n picking.highlightedObjectIndex == picking_objectIndex\n ;\n}\n\n/**\n * Returns highlight color if this item is selected.\n */\nvec4 picking_filterHighlightColor(vec4 color) {\n // If we are still picking, we don't highlight\n if (bool(picking.isActive)) {\n return color;\n }\n\n // If we are not highlighted, return color as is\n if (!picking_isFragmentHighlighted()) {\n return color;\n }\n \n // Blend in highlight color based on its alpha value\n float highLightAlpha = picking.highlightColor.a;\n float blendedAlpha = highLightAlpha + color.a * (1.0 - highLightAlpha);\n float highLightRatio = highLightAlpha / blendedAlpha;\n\n vec3 blendedRGB = mix(color.rgb, picking.highlightColor.rgb, highLightRatio);\n return vec4(blendedRGB, blendedAlpha);\n}\n\n/*\n * Returns picking color if picking enabled else unmodified argument.\n */\nivec4 picking_getPickingColor() {\n // Assumes that colorAttachment0 is rg32int\n // TODO? - we could render indices into a second color attachment and not mess with fragColor\n return ivec4(picking_objectIndex, picking.batchIndex, 0u, 0u); \n}\n\nvec4 picking_filterPickingColor(vec4 color) {\n if (bool(picking.isActive)) {\n if (picking_objectIndex == INDEX_PICKING_INVALID_INDEX) {\n discard;\n }\n }\n return color;\n}\n\n/*\n * Returns picking color if picking is enabled if not\n * highlight color if this item is selected, otherwise unmodified argument.\n */\nvec4 picking_filterColor(vec4 color) {\n vec4 outColor = color;\n outColor = picking_filterHighlightColor(outColor);\n outColor = picking_filterPickingColor(outColor);\n return outColor;\n}\n`;\n\n/**\n * Provides support for color-based picking and highlighting.\n *\n * In particular, supports picking a specific instance in an instanced\n * draw call and highlighting an instance based on its picking color,\n * and correspondingly, supports picking and highlighting groups of\n * primitives with the same picking color in non-instanced draw-calls\n *\n * @note Color based picking has the significant advantage in that it can be added to any\n * existing shader without requiring any additional picking logic.\n */\nexport const picking = {\n ...pickingUniforms,\n name: 'picking',\n source,\n vs,\n fs\n} as const satisfies ShaderModule<PickingProps, PickingUniforms, PickingBindings>;\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {ShaderModule} from '@luma.gl/shadertools';\n\nimport type {PickingProps, PickingUniforms, PickingBindings} from './picking-uniforms';\nimport {pickingUniforms, GLSL_UNIFORMS, WGSL_UNIFORMS} from './picking-uniforms';\n\nconst source = /* wgsl */ `\\\n${WGSL_UNIFORMS}\n`;\n\nconst vs = /* glsl */ `\\\n${GLSL_UNIFORMS}\nout vec4 picking_vRGBcolor_Avalid;\n\n// Normalize unsigned byte color to 0-1 range\nvec3 picking_normalizeColor(vec3 color) {\n return picking.useFloatColors > 0.5 ? color : color / 255.0;\n}\n\n// Normalize unsigned byte color to 0-1 range\nvec4 picking_normalizeColor(vec4 color) {\n return picking.useFloatColors > 0.5 ? color : color / 255.0;\n}\n\nbool picking_isColorZero(vec3 color) {\n return dot(color, vec3(1.0)) < 0.00001;\n}\n\nbool picking_isColorValid(vec3 color) {\n return dot(color, vec3(1.0)) > 0.00001;\n}\n\n// Check if this vertex is highlighted \nbool isVertexHighlighted(vec3 vertexColor) {\n vec3 highlightedObjectColor = picking_normalizeColor(picking.highlightedObjectColor);\n return\n bool(picking.isHighlightActive) && picking_isColorZero(abs(vertexColor - highlightedObjectColor));\n}\n\n// Set the current picking color\nvoid picking_setPickingColor(vec3 pickingColor) {\n pickingColor = picking_normalizeColor(pickingColor);\n\n if (bool(picking.isActive)) {\n // Use alpha as the validity flag. If pickingColor is [0, 0, 0] fragment is non-pickable\n picking_vRGBcolor_Avalid.a = float(picking_isColorValid(pickingColor));\n\n if (!bool(picking.isAttribute)) {\n // Stores the picking color so that the fragment shader can render it during picking\n picking_vRGBcolor_Avalid.rgb = pickingColor;\n }\n } else {\n // Do the comparison with selected item color in vertex shader as it should mean fewer compares\n picking_vRGBcolor_Avalid.a = float(isVertexHighlighted(pickingColor));\n }\n}\n\nvoid picking_setObjectIndex(uint objectIndex) {\n if (bool(picking.isActive)) {\n uint index = objectIndex;\n if (picking.indexMode == PICKING_INDEX_MODE_INSTANCE) {\n index = uint(gl_InstanceID);\n }\n picking_vRGBcolor_Avalid.r = float(index % 255) / 255.0;\n picking_vRGBcolor_Avalid.g = float((index / 255) % 255) / 255.0;\n picking_vRGBcolor_Avalid.b = float((index / 255 / 255) %255) / 255.0;\n }\n}\n\nvoid picking_setPickingAttribute(float value) {\n if (bool(picking.isAttribute)) {\n picking_vRGBcolor_Avalid.r = value;\n }\n}\n\nvoid picking_setPickingAttribute(vec2 value) {\n if (bool(picking.isAttribute)) {\n picking_vRGBcolor_Avalid.rg = value;\n }\n}\n\nvoid picking_setPickingAttribute(vec3 value) {\n if (bool(picking.isAttribute)) {\n picking_vRGBcolor_Avalid.rgb = value;\n }\n}\n`;\n\nconst fs = /* glsl */ `\\\n${GLSL_UNIFORMS}\n\nin vec4 picking_vRGBcolor_Avalid;\n\n/*\n * Returns highlight color if this item is selected.\n */\nvec4 picking_filterHighlightColor(vec4 color) {\n // If we are still picking, we don't highlight\n if (picking.isActive > 0.5) {\n return color;\n }\n\n bool selected = bool(picking_vRGBcolor_Avalid.a);\n\n if (selected) {\n // Blend in highlight color based on its alpha value\n float highLightAlpha = picking.highlightColor.a;\n float blendedAlpha = highLightAlpha + color.a * (1.0 - highLightAlpha);\n float highLightRatio = highLightAlpha / blendedAlpha;\n\n vec3 blendedRGB = mix(color.rgb, picking.highlightColor.rgb, highLightRatio);\n return vec4(blendedRGB, blendedAlpha);\n } else {\n return color;\n }\n}\n\n/*\n * Returns picking color if picking enabled else unmodified argument.\n */\nvec4 picking_filterPickingColor(vec4 color) {\n if (bool(picking.isActive)) {\n if (picking_vRGBcolor_Avalid.a == 0.0) {\n discard;\n }\n return picking_vRGBcolor_Avalid;\n }\n return color;\n}\n\n/*\n * Returns picking color if picking is enabled if not\n * highlight color if this item is selected, otherwise unmodified argument.\n */\nvec4 picking_filterColor(vec4 color) {\n vec4 highlightColor = picking_filterHighlightColor(color);\n return picking_filterPickingColor(highlightColor);\n}\n`;\n\n/**\n * Provides support for color-coding-based picking and highlighting.\n * In particular, supports picking a specific instance in an instanced\n * draw call and highlighting an instance based on its picking color,\n * and correspondingly, supports picking and highlighting groups of\n * primitives with the same picking color in non-instanced draw-calls\n */\nexport const picking = {\n ...pickingUniforms,\n name: 'picking',\n source,\n vs,\n fs\n} as const satisfies ShaderModule<PickingProps, PickingUniforms, PickingBindings>;\n\n// function getUniforms(opts: PickingProps = {}, prevUniforms?: PickingUniforms): PickingUniforms {\n// const uniforms = {} as PickingUniforms;\n\n// if (opts.highlightedObjectColor === undefined) {\n// // Unless highlightedObjectColor explicitly null or set, do not update state\n// } else if (opts.highlightedObjectColor === null) {\n// uniforms.isHighlightActive = false;\n// } else {\n// uniforms.isHighlightActive = true;\n// const highlightedObjectColor = opts.highlightedObjectColor.slice(0, 3);\n// uniforms.highlightedObjectColor = highlightedObjectColor;\n// }\n\n// if (opts.highlightColor) {\n// const color = Array.from(opts.highlightColor, x => x / 255);\n// if (!Number.isFinite(color[3])) {\n// color[3] = 1;\n// }\n// uniforms.highlightColor = color;\n// }\n\n// if (opts.isActive !== undefined) {\n// uniforms.isActive = Boolean(opts.isActive);\n// uniforms.isAttribute = Boolean(opts.isAttribute);\n// }\n\n// if (opts.useFloatColors !== undefined) {\n// uniforms.useFloatColors = Boolean(opts.useFloatColors);\n// }\n\n// return uniforms;\n// }\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {Device, Framebuffer} from '@luma.gl/core';\nimport {picking} from '@luma.gl/shadertools';\nimport {ShaderInputs} from '../../shader-inputs';\nimport {NumberArray3} from '@math.gl/types';\n\n/**\n * Helper class for using the legacy picking module\n */\nexport class LegacyPickingManager {\n device: Device;\n framebuffer: Framebuffer | null = null;\n shaderInputs: ShaderInputs<{picking: typeof picking.props}>;\n\n constructor(device: Device, shaderInputs: ShaderInputs) {\n this.device = device;\n this.shaderInputs = shaderInputs as ShaderInputs<{picking: typeof picking.props}>;\n }\n\n destroy() {\n this.framebuffer?.destroy();\n }\n\n getFramebuffer() {\n if (!this.framebuffer) {\n this.framebuffer = this.device.createFramebuffer({\n colorAttachments: ['rgba8unorm'],\n depthStencilAttachment: 'depth24plus'\n });\n }\n return this.framebuffer;\n }\n\n /** Clear highlighted / picked object */\n clearPickState() {\n this.shaderInputs.setProps({picking: {highlightedObjectColor: null}});\n }\n\n /** Prepare for rendering picking colors */\n beginRenderPass() {\n const framebuffer = this.getFramebuffer();\n framebuffer.resize(this.device.getCanvasContext().getDevicePixelSize());\n\n this.shaderInputs.setProps({picking: {isActive: true}});\n\n const pickingPass = this.device.beginRenderPass({\n framebuffer,\n clearColor: [0, 0, 0, 0],\n clearDepth: 1\n });\n\n return pickingPass;\n }\n\n updatePickState(mousePosition: [number, number]) {\n const framebuffer = this.getFramebuffer();\n\n // use the center pixel location in device pixel range\n const [pickX, pickY] = this.getPickPosition(mousePosition);\n\n // Read back\n const color255 = this.device.readPixelsToArrayWebGL(framebuffer, {\n sourceX: pickX,\n sourceY: pickY,\n sourceWidth: 1,\n sourceHeight: 1\n });\n // console.log(color255);\n\n // Check if we have\n let highlightedObjectColor: NumberArray3 | null = [...color255].map(\n x => x / 255\n ) as NumberArray3;\n const isHighlightActive =\n highlightedObjectColor[0] + highlightedObjectColor[1] + highlightedObjectColor[2] > 0;\n\n if (!isHighlightActive) {\n highlightedObjectColor = null;\n }\n\n this.shaderInputs.setProps({\n picking: {isActive: false, highlightedObjectColor}\n });\n }\n\n /**\n * Get pick position in device pixel range\n * use the center pixel location in device pixel range\n */\n getPickPosition(mousePosition: [number, number]): [number, number] {\n const devicePixels = this.device.getCanvasContext().cssToDevicePixels(mousePosition);\n const pickX = devicePixels.x + Math.floor(devicePixels.width / 2);\n const pickY = devicePixels.y + Math.floor(devicePixels.height / 2);\n return [pickX, pickY];\n }\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sBAAAA;EAAA;;;;;;;;;;;ACqCA,IAAI,iBAAiB;AACrB,IAAI,mBAAmB;AAEjB,IAAO,WAAP,MAAe;EACnB,OAAe;EACf,WAAW,oBAAI,IAAG;EAClB,aAAa,oBAAI,IAAG;EACpB,UAAmB;EACnB,iBAAyB;EAEzB,cAAA;EAAe;EAEf,WAAW,OAAqB;AAC9B,UAAM,EAAC,QAAQ,GAAG,WAAW,OAAO,mBAAmB,OAAO,GAAG,SAAS,EAAC,IAAI;AAE/E,UAAM,YAAY;AAClB,UAAM,UAAmB;MACvB,MAAM;MACN;MACA;MACA;MACA;;AAEF,SAAK,gBAAgB,SAAS,KAAK,IAAI;AACvC,SAAK,SAAS,IAAI,WAAW,OAAO;AAEpC,WAAO;EACT;EAEA,cAAc,WAAiB;AAC7B,SAAK,SAAS,OAAO,SAAS;AAE9B,eAAW,CAAC,iBAAiB,SAAS,KAAK,KAAK,YAAY;AAC1D,UAAI,UAAU,YAAY,WAAW;AACnC,aAAK,gBAAgB,eAAe;MACtC;IACF;EACF;EAEA,WAAW,WAAiB;AAC1B,UAAM,UAAU,KAAK,SAAS,IAAI,SAAS;AAC3C,QAAI,YAAY,QAAW;AACzB,aAAO;IACT;AAEA,WAAO,KAAK,QAAQ,QAAQ,QAAQ,QAAQ,WAAW,QAAQ;EACjE;EAEA,QAAQ,WAAkB;AACxB,QAAI,cAAc,QAAW;AAC3B,aAAO,KAAK;IACd;AAEA,UAAM,UAAU,KAAK,SAAS,IAAI,SAAS;AAE3C,QAAI,YAAY,QAAW;AACzB,aAAO;IACT;AAEA,WAAO,QAAQ;EACjB;EAEA,QAAQ,MAAY;AAClB,SAAK,OAAO,KAAK,IAAI,GAAG,IAAI;AAE5B,UAAM,WAAW,KAAK,SAAS,OAAM;AACrC,eAAW,WAAW,UAAU;AAC9B,WAAK,gBAAgB,SAAS,KAAK,IAAI;IACzC;AAEA,UAAM,aAAa,KAAK,WAAW,OAAM;AACzC,eAAW,iBAAiB,YAAY;AACtC,YAAM,EAAC,WAAW,QAAO,IAAI;AAC7B,gBAAU,QAAQ,KAAK,QAAQ,OAAO,CAAC;IACzC;EACF;EAEA,OAAI;AACF,SAAK,UAAU;EACjB;EAEA,QAAK;AACH,SAAK,UAAU;AACf,SAAK,iBAAiB;EACxB;EAEA,QAAK;AACH,SAAK,QAAQ,CAAC;EAChB;EAEA,gBAAgB,WAA6B,eAAsB;AACjE,UAAM,kBAAkB;AAExB,SAAK,WAAW,IAAI,iBAAiB;MACnC;MACA,SAAS;KACV;AAED,cAAU,QAAQ,KAAK,QAAQ,aAAa,CAAC;AAE7C,WAAO;EACT;EAEA,gBAAgB,WAAiB;AAC/B,SAAK,WAAW,OAAO,SAAS;EAClC;EAEA,OAAO,YAAkB;AACvB,QAAI,KAAK,SAAS;AAChB,UAAI,KAAK,mBAAmB,IAAI;AAC9B,aAAK,iBAAiB;MACxB;AACA,WAAK,QAAQ,KAAK,QAAQ,aAAa,KAAK,eAAe;AAC3D,WAAK,iBAAiB;IACxB;EACF;EAEA,gBAAgB,SAAkB,MAAY;AAC5C,UAAM,aAAa,OAAO,QAAQ;AAClC,UAAM,gBAAgB,QAAQ,WAAW,QAAQ;AAEjD,QAAI,cAAc,eAAe;AAC/B,cAAQ,OAAO,QAAQ,WAAW,QAAQ;IAC5C,OAAO;AACL,cAAQ,OAAO,KAAK,IAAI,GAAG,UAAU,IAAI,QAAQ;AACjD,cAAQ,QAAQ,QAAQ;IAC1B;EACF;;;;AC5JI,IAAO,YAAP,MAAgB;EACpB,aAAqB;EACrB,WAAmB;EACnB,SAAiB;EACjB,QAAkB,CAAA;EAClB,SAAc,CAAA;EACN,YAAY;EAEpB,YAAY,WAAwB;AAClC,SAAK,aAAa,SAAS;AAC3B,SAAK,QAAQ,CAAC;EAChB;EAEA,aAAa,WAAwB;AACnC,UAAM,UAAU,UAAU;AAC1B,SAAK,MAAM,SAAS;AACpB,SAAK,OAAO,SAAS;AAErB,aAAS,IAAI,GAAG,IAAI,SAAS,EAAE,GAAG;AAChC,WAAK,MAAM,CAAC,IAAI,UAAU,CAAC,EAAE,CAAC;AAC9B,WAAK,OAAO,CAAC,IAAI,UAAU,CAAC,EAAE,CAAC;IACjC;AAEA,SAAK,eAAe,KAAK,SAAS;EACpC;EAEA,QAAQ,MAAY;AAClB,WAAO,KAAK,IAAI,GAAG,IAAI;AAEvB,QAAI,SAAS,KAAK,WAAW;AAC3B,WAAK,eAAe,IAAI;AACxB,WAAK,YAAY;IACnB;EACF;EAEA,eAAY;AACV,WAAO,KAAK,MAAM,KAAK,UAAU;EACnC;EAEA,aAAU;AACR,WAAO,KAAK,MAAM,KAAK,QAAQ;EACjC;EAEA,eAAY;AACV,WAAO,KAAK,OAAO,KAAK,UAAU;EACpC;EAEA,aAAU;AACR,WAAO,KAAK,OAAO,KAAK,QAAQ;EAClC;EAEA,eAAe,MAAY;AACzB,QAAI,QAAQ;AACZ,UAAM,UAAU,KAAK,MAAM;AAE3B,SAAK,QAAQ,GAAG,QAAQ,UAAU,GAAG,EAAE,OAAO;AAC5C,UAAI,KAAK,MAAM,QAAQ,CAAC,IAAI,MAAM;AAChC;MACF;IACF;AAEA,SAAK,aAAa;AAClB,SAAK,WAAW,QAAQ;AAExB,UAAM,YAAY,KAAK,MAAM,KAAK,UAAU;AAC5C,UAAM,UAAU,KAAK,MAAM,KAAK,QAAQ;AACxC,SAAK,SAAS,KAAK,IAAI,KAAK,IAAI,IAAI,OAAO,cAAc,UAAU,UAAU,GAAG,CAAC;EACnF;;;;ACtDI,IAAgB,wBAAhB,MAAqC;EACzC,YAAY,gBAA+B;EAAG;EAC9C,MAAM,aAAa,gBAA8B;AAC/C,WAAO;EACT;;;;ACrBF,kBAA2B;;;ACIrB,SAAU,8BAA8B,UAA8B;AAC1E,SAAO,OAAO,WAAW,eAAe,OAAO,wBAC3C,OAAO,sBAAsB,QAAQ,IACrC,WAAW,UAAU,MAAO,EAAE;AACpC;AAGM,SAAU,6BAA6B,SAAY;AACvD,SAAO,OAAO,WAAW,eAAe,OAAO,uBAC3C,OAAO,qBAAqB,OAAO,IACnC,aAAa,OAAO;AAC1B;;;ADRA,mBAA0B;AAE1B,IAAI,gBAAgB;AAwBd,IAAO,iBAAP,MAAoB;EAgBxB,SAAwB;EACxB,SAAqD;EAErD;EACA,iBAAwC;EACxC,WAA4B;EAC5B;EACA;EACA;EACA;EAEA;EAEA,cAA8B;EAE9B,eAAwB;EACxB,WAAoB;EACpB,oBAAyB;EACzB,oBAAmD;EACnD,oBAAqE;EACrE,gBAAwB;EACxB,SAAuB;;;;;EAOvB,YAAY,OAAyB;AACnC,SAAK,QAAQ,EAAC,GAAG,eAAc,2BAA2B,GAAG,MAAK;AAClE,YAAQ,KAAK;AAEb,QAAI,CAAC,MAAM,QAAQ;AACjB,YAAM,IAAI,MAAM,oBAAoB;IACtC;AAGA,SAAK,QAAQ,MAAM,SAAS,IAAI,mBAAM,EAAC,IAAI,uBAAsB,CAAC;AAClE,SAAK,UAAU,KAAK,MAAM,IAAI,UAAU;AACxC,SAAK,UAAU,KAAK,MAAM,IAAI,UAAU;AACxC,SAAK,YAAY,KAAK,MAAM,IAAI,YAAY;AAE5C,SAAK,SAAS,EAAC,oBAAoB,MAAM,mBAAkB,CAAC;AAG5D,SAAK,QAAQ,KAAK,MAAM,KAAK,IAAI;AACjC,SAAK,OAAO,KAAK,KAAK,KAAK,IAAI;AAE/B,SAAK,eAAe,KAAK,aAAa,KAAK,IAAI;AAC/C,SAAK,gBAAgB,KAAK,cAAc,KAAK,IAAI;EACnD;EAEA,UAAO;AACL,SAAK,KAAI;AACT,SAAK,YAAY,IAAI;EACvB;;EAGA,SAAM;AACJ,SAAK,QAAO;EACd;EAEA,YAAY,OAAY;AACtB,SAAK,MAAM,QAAQ,KAAK;AACxB,SAAK,SAAS;EAChB;;EAGA,eAAe,QAAc;AAC3B,SAAK,cAAc,KAAK,eAAe;AACvC,WAAO;EACT;EAEA,SAAS,OAAgC;AACvC,QAAI,wBAAwB,OAAO;AACjC,WAAK,MAAM,qBAAqB,MAAM,sBAAsB;IAC9D;AACA,WAAO;EACT;;EAGA,MAAM,QAAK;AACT,QAAI,KAAK,UAAU;AACjB,aAAO;IACT;AACA,SAAK,WAAW;AAEhB,QAAI;AACF,UAAI;AACJ,UAAI,CAAC,KAAK,cAAc;AACtB,aAAK,eAAe;AAEpB,cAAM,KAAK,YAAW;AACtB,aAAK,YAAW;AAGhB,cAAM,KAAK,MAAM,aAAa,KAAK,mBAAkB,CAAE;MACzD;AAGA,UAAI,CAAC,KAAK,UAAU;AAClB,eAAO;MACT;AAGA,UAAI,eAAe,OAAO;AAExB,aAAK,sBAAqB;AAC1B,aAAK,uBAAsB;MAC7B;AAEA,aAAO;IACT,SAAS,KAAP;AACA,YAAM,QAAQ,eAAe,QAAQ,MAAM,IAAI,MAAM,eAAe;AACpE,WAAK,MAAM,QAAQ,KAAK;AAExB,YAAM;IACR;EACF;;EAGA,OAAI;AAEF,QAAI,KAAK,UAAU;AAGjB,UAAI,KAAK,kBAAkB,CAAC,KAAK,QAAQ;AACvC,aAAK,MAAM,WAAW,KAAK,cAAc;MAC3C;AAEA,WAAK,sBAAqB;AAC1B,WAAK,oBAAoB;AACzB,WAAK,oBAAoB;AACzB,WAAK,WAAW;IAClB;AACA,WAAO;EACT;;EAGA,SAAM;AAhMR;AAiMI,UAAI,UAAK,WAAL,mBAAa,WAAU,KAAK,QAAQ;AACtC,aAAO;IACT;AAEA,SAAK,kBAAiB;AAEtB,SAAK,YAAW;AAChB,SAAK,sBAAqB;AAE1B,SAAK,aAAa,KAAK,mBAAkB,CAAE;AAG3C,SAAK,kBAAiB;AAEtB,QAAI,KAAK,mBAAmB;AAC1B,WAAK,kBAAkB,IAAI;AAC3B,WAAK,oBAAoB;AACzB,WAAK,oBAAoB;IAC3B;AAEA,SAAK,gBAAe;AAEpB,WAAO;EACT;;EAGA,eAAe,UAAkB;AAC/B,SAAK,WAAW;AAChB,WAAO,KAAK;EACd;;EAGA,iBAAc;AACZ,SAAK,WAAW;EAClB;;EAGA,gBAAa;AACX,SAAK,eAAe,eAAe;AAEnC,QAAI,CAAC,KAAK,mBAAmB;AAC3B,WAAK,oBAAoB,IAAI,QAAQ,aAAU;AAC7C,aAAK,oBAAoB;MAC3B,CAAC;IACH;AACA,WAAO,KAAK;EACd;;EAGA,MAAM,YAAS;AACb,SAAK,eAAe,WAAW;AAC/B,UAAM,KAAK,cAAa;AACxB,QAAI,KAAK,kBAAkB,mBAAmB;AAC5C,aAAO,KAAK,OAAO,UAAS;IAC9B;AACA,UAAM,IAAI,MAAM,iBAAiB;EACnC;;EAIA,cAAW;AACT,SAAK,oBAAmB;AAGxB,SAAK,0BAAyB;AAC9B,SAAK,sBAAqB;AAG1B,SAAK,gBAAe;EAGtB;EAEA,YAAY,SAAY;AACtB,QAAI,KAAK,SAAS;AAChB,WAAK,QAAQ,QAAO;AACpB,WAAK,QAAQ,gBAAgB;IAC/B;AAGA,QAAI,SAAS;AACX,cAAQ,gBAAgB;IAC1B;AAEA,SAAK,UAAU;EACjB;EAEA,yBAAsB;AACpB,QAAI,CAAC,KAAK,UAAU;AAClB;IACF;AAQA,SAAK,oBAAoB,8BAA8B,KAAK,gBAAgB,KAAK,IAAI,CAAC;EACxF;EAEA,wBAAqB;AACnB,QAAI,KAAK,sBAAsB,MAAM;AACnC;IACF;AAQA,iCAA6B,KAAK,iBAAiB;AACnD,SAAK,oBAAoB;EAC3B;EAEA,kBAAe;AACb,QAAI,CAAC,KAAK,UAAU;AAClB;IACF;AACA,SAAK,OAAM;AACX,SAAK,uBAAsB;EAC7B;;;EAIA,aAAa,gBAA8B;AA/T7C;AAiUI,QAAI,KAAK,SAAS;AAChB,WAAK,QAAQ,aAAa,cAAc;AACxC;IACF;AAGA,SAAK,MAAM,SAAS,KAAK,mBAAkB,CAAE;AAI7C,eAAK,WAAL,mBAAa;EACf;EAEA,oBAAiB;AACf,SAAK,cAAc;EACrB;EAEA,cAAW;AACT,SAAK,gBAAe;EACtB;;EAGA,4BAAyB;AAvV3B;AAwVI,UAAM,iBAAgB,UAAK,WAAL,mBAAa;AACnC,QAAI,CAAC,KAAK,UAAU,CAAC,eAAe;AAClC,YAAM,IAAI,MAAM,MAAM;IACxB;AAEA,UAAMC,UAAS,+CAAe;AAC9B,UAAM,kBAAkB,cAAc,MAAM;AAE5C,SAAK,iBAAiB;MACpB,eAAe;MAEf,QAAQ,KAAK;MACb;MACA,QAAAA;;MAEA;MAEA,UAAU,KAAK;MAEf,aAAa;;MAGb,OAAO;MACP,QAAQ;MACR,QAAQ;;MAGR,MAAM;MACN,WAAW,KAAK,IAAG;MACnB,YAAY;MACZ,MAAM;MACN,MAAM;;MAGN,gBAAgB;;;EAEpB;EAEA,qBAAkB;AAChB,QAAI,CAAC,KAAK,gBAAgB;AACxB,YAAM,IAAI,MAAM,gBAAgB;IAClC;AACA,WAAO,KAAK;EACd;;EAGA,wBAAqB;AACnB,QAAI,CAAC,KAAK,gBAAgB;AACxB;IACF;AAGA,UAAM,EAAC,OAAO,QAAQ,OAAM,IAAI,KAAK,kBAAiB;AACtD,QAAI,UAAU,KAAK,eAAe,SAAS,WAAW,KAAK,eAAe,QAAQ;AAChF,WAAK,eAAe,wBAAwB;IAC9C;AACA,QAAI,WAAW,KAAK,eAAe,QAAQ;AACzC,WAAK,eAAe,+BAA+B;IACrD;AAEA,SAAK,eAAe,QAAQ;AAC5B,SAAK,eAAe,SAAS;AAC7B,SAAK,eAAe,SAAS;AAE7B,SAAK,eAAe,cAAc,KAAK;AAGvC,SAAK,eAAe,aAAa,KAAK,IAAG,IAAK,KAAK,eAAe;AAElE,QAAI,KAAK,UAAU;AACjB,WAAK,SAAS,OAAO,KAAK,eAAe,UAAU;IACrD;AAEA,SAAK,eAAe,OAAO,KAAK,MAAO,KAAK,eAAe,OAAO,MAAQ,EAAE;AAC5E,SAAK,eAAe;AAGpB,SAAK,eAAe,OAAO,KAAK,WAC5B,KAAK,SAAS,QAAO,IACrB,KAAK,eAAe;EAC1B;;EAGA,MAAM,cAAW;AACf,SAAK,SAAS,MAAM,KAAK,MAAM;AAC/B,QAAI,CAAC,KAAK,QAAQ;AAChB,YAAM,IAAI,MAAM,oBAAoB;IACtC;AACA,SAAK,SAAS,KAAK,OAAO,wBAAuB,EAAG,UAAU;EAEhE;EAEA,iBAAc;AACZ,QAAI,KAAK,UAAU,KAAK,MAAM,WAAW;AACvC,YAAM,aAAa,SAAS,cAAc,KAAK;AAC/C,eAAS,KAAK,YAAY,UAAU;AACpC,iBAAW,MAAM,WAAW;AAC5B,YAAM,MAAM,SAAS,cAAc,KAAK;AACxC,UAAI,MAAM,WAAW;AACrB,UAAI,MAAM,OAAO;AACjB,UAAI,MAAM,SAAS;AACnB,UAAI,MAAM,QAAQ;AAClB,UAAI,MAAM,aAAa;AACvB,UAAI,KAAK,kBAAkB,mBAAmB;AAC5C,mBAAW,YAAY,KAAK,MAAM;MACpC;AACA,iBAAW,YAAY,GAAG;AAC1B,YAAM,OAAO,KAAK,MAAM,UAAU,GAAG;AACrC,UAAI,MAAM;AACR,YAAI,YAAY;MAClB;IACF;EACF;EAEA,oBAAiB;AA1cnB;AA2cI,QAAI,CAAC,KAAK,QAAQ;AAChB,aAAO,EAAC,OAAO,GAAG,QAAQ,GAAG,QAAQ,EAAC;IACxC;AAEA,UAAM,CAAC,OAAO,MAAM,MAAI,UAAK,WAAL,mBAAa,0BAA0B,yBAAwB,CAAC,GAAG,CAAC;AAG5F,QAAI,SAAS;AACb,UAAMA,WAAS,UAAK,WAAL,mBAAa,0BAA0B;AAGtD,QAAIA,WAAUA,QAAO,cAAc;AAEjC,eAASA,QAAO,cAAcA,QAAO;IACvC,WAAW,QAAQ,KAAK,SAAS,GAAG;AAClC,eAAS,QAAQ;IACnB;AAEA,WAAO,EAAC,OAAO,QAAQ,OAAM;EAC/B;;EAGA,kBAAe;AAGb,QAAI,KAAK,MAAM,sBAAsB,KAAK,OAAO,IAAI;AAEnD,WAAK,OAAO,GAAG;QACb;QACA;;QAEA,KAAK,OAAO,GAAG;;QAEf,KAAK,OAAO,GAAG;MAAmB;IAEtC;EACF;EAEA,oBAAiB;AACf,SAAK,UAAU,QAAO;AACtB,SAAK,UAAU,UAAS;AAkBxB,SAAK,QAAQ,UAAS;EACxB;EAEA,kBAAe;AACb,SAAK,QAAQ,QAAO;EAMtB;;EAIA,sBAAmB;AACjB,QAAI,KAAK,QAAQ;AACf,WAAK,OAAO,iBAAiB,aAAa,KAAK,aAAa,KAAK,IAAI,CAAC;AACtE,WAAK,OAAO,iBAAiB,cAAc,KAAK,cAAc,KAAK,IAAI,CAAC;IAC1E;EACF;EAEA,aAAa,OAAY;AACvB,QAAI,iBAAiB,YAAY;AAC/B,WAAK,mBAAkB,EAAG,iBAAiB,CAAC,MAAM,SAAS,MAAM,OAAO;IAC1E;EACF;EAEA,cAAc,OAAY;AACxB,SAAK,mBAAkB,EAAG,iBAAiB;EAC7C;;AA7fI,IAAO,gBAAP;AACJ,cADW,eACJ,6BAA4B;EACjC,QAAQ;EAER,WAAW,MAAM;EACjB,cAAc,YAAY;EAC1B,UAAU,MAAK;EAAE;EACjB,YAAY,MAAK;EAAE;EACnB,SAAS,WAAS,QAAQ,MAAM,KAAK;;EAErC,OAAO,iBAAK,MAAM,IAAI,kBAAkB,iBAAiB;;EAGzD,oBAAoB;;;;AE9CxB,IAAAC,eAAoC;AAiB9B,SAAU,kBACd,2BACA,OAA8B;AAE9B,MAAI,aAA2C;AAE/C,QAAM,UACJ,+BAAO,WACP,kBAAK,aAAa,EAAC,IAAI,kBAAkB,UAAU,+BAAO,UAAU,qBAAqB,KAAI,CAAC;AAGhG,QAAM,gBAAgB,IAAI,cAAc;IACtC,GAAG;IAEH;IAEA,MAAM,aAAa,gBAA8B;AAC/C,iBAAW,eAAe,cAAc,MAAO;AAC/C,UAAI;AAEF,qBAAa,IAAI,0BAA0B,cAAc;AAEzD,eAAO,OAAM,yCAAY,aAAa;MACxC,SAAS,OAAP;AACA,iBAAS,eAAe,cAAc,QAAS,KAAc;AAC7D,eAAO;MACT;IACF;IAEA,UAAU,CAAC,mBAAmC,yCAAY,SAAS;IAEnE,YAAY,CAAC,mBAAmC,yCAAY,WAAW;GACxE;AAGD,gBAAc,UAAU,MAAK;AAG3B,WAAO,KAAK,0BAA0B;EACxC;AAEA,SAAO;AACT;AAEA,SAAS,SAAS,QAAgB,OAAY;AAjE9C;AAkEE,QAAMC,UAAS,iCAAQ,0BAA0B;AACjD,MAAIA,mBAAkB,mBAAmB;AACvC,IAAAA,QAAO,MAAM,WAAW;AACxB,QAAI,WAAW,SAAS,eAAe,sBAAsB;AAC7D,yCAAU;AACV,eAAW,SAAS,cAAc,IAAI;AACtC,aAAS,KAAK;AACd,aAAS,YAAY,MAAM;AAC3B,aAAS,MAAM,WAAW;AAC1B,aAAS,MAAM,MAAM;AACrB,aAAS,MAAM,OAAO;AACtB,aAAS,MAAM,QAAQ;AACvB,aAAS,MAAM,kBAAkB;AACjC,UAAAA,QAAO,kBAAP,mBAAsB,YAAY;EAEpC;AACF;AAEA,SAAS,WAAW,QAAc;AAChC,QAAM,WAAW,SAAS,eAAe,sBAAsB;AAC/D,MAAI,UAAU;AACZ,aAAS,OAAM;EACjB;AACF;;;ACxEA,IAAAC,eAaO;AAGP,IAAAC,sBAAuD;;;AC5BvD,IAAAC,eAA2D;;;ACD3D,IAAM,cAAsC,CAAA;AAOtC,SAAU,IAAI,KAAa,MAAI;AACnC,cAAY,EAAE,IAAI,YAAY,EAAE,KAAK;AACrC,QAAM,QAAQ,YAAY,EAAE;AAC5B,SAAO,GAAG,MAAM;AAClB;;;ADKM,IAAO,cAAP,MAAkB;EACb;EACT,WAAoC,CAAA;;EAG3B;EACA,eAA+B,CAAA;EAE/B;EACA;EACA;EAET,YAAY,OAAuB;AACjC,SAAK,KAAK,MAAM,MAAM,IAAI,UAAU;AACpC,SAAK,WAAW,MAAM;AACtB,SAAK,UAAU,MAAM,WAAW;AAChC,SAAK,aAAa,MAAM;AAExB,SAAK,cAAc,MAAM;AAEzB,SAAK,eAAe,MAAM,gBAAgB,CAAA;AAE1C,QAAI,KAAK,SAAS;AAChB,UAAI,EAAE,KAAK,QAAQ,QAAQ,oBAAO,QAAQ;AACxC,cAAM,IAAI,MAAM,oCAAoC;MACtD;IACF;EACF;EAEA,UAAO;AAjDT;AAkDI,eAAK,YAAL,mBAAc;AACd,eAAW,aAAa,OAAO,OAAO,KAAK,UAAU,GAAG;AACtD,gBAAU,QAAO;IACnB;EACF;EAEA,iBAAc;AACZ,WAAO,KAAK;EACd;EAEA,gBAAa;AACX,WAAO,KAAK;EACd;EAEA,aAAU;AACR,WAAO,KAAK,WAAW;EACzB;EAEA,sBAAsB,WAAiB;AAErC,UAAM,cAAc,UAAU,aAAa;AAC3C,WAAO;EACT;;AAGI,SAAU,gBAAgB,QAAgB,UAAgC;AAC9E,MAAI,oBAAoB,aAAa;AACnC,WAAO;EACT;AAEA,QAAM,UAAU,2BAA2B,QAAQ,QAAQ;AAC3D,QAAM,EAAC,YAAY,aAAY,IAAI,gCAAgC,QAAQ,QAAQ;AACnF,SAAO,IAAI,YAAY;IACrB,UAAU,SAAS,YAAY;IAC/B;IACA,aAAa,SAAS;IACtB;IACA;GACD;AACH;AAEM,SAAU,2BAA2B,QAAgB,UAAkB;AAC3E,MAAI,CAAC,SAAS,SAAS;AACrB,WAAO;EACT;AACA,QAAM,OAAO,SAAS,QAAQ;AAC9B,SAAO,OAAO,aAAa,EAAC,OAAO,oBAAO,OAAO,KAAI,CAAC;AACxD;AAEM,SAAU,gCACd,QACA,UAAkB;AAElB,QAAM,eAA+B,CAAA;AAErC,QAAM,aAAqC,CAAA;AAC3C,aAAW,CAAC,eAAe,SAAS,KAAK,OAAO,QAAQ,SAAS,UAAU,GAAG;AAC5E,QAAI,OAAe;AAEnB,YAAQ,eAAe;MACrB,KAAK;AACH,eAAO;AACP;MACF,KAAK;AACH,eAAO;AACP;MACF,KAAK;AACH,eAAO;AACP;MACF,KAAK;AACH,eAAO;AACP;IACJ;AACA,QAAI,WAAW;AACb,iBAAW,IAAI,IAAI,OAAO,aAAa;QACrC,MAAM,UAAU;QAChB,IAAI,GAAG;OACR;AACD,YAAM,EAAC,OAAO,MAAM,WAAU,IAAI;AAElC,mBAAa,KAAK,EAAC,MAAM,YAAQ,2CAA6B,OAAO,MAAM,UAAU,EAAC,CAAC;IACzF;EACF;AAEA,QAAM,cAAc,SAAS,sBAAsB,SAAS,YAAY,SAAS,OAAO;AAExF,SAAO,EAAC,YAAY,cAAc,YAAW;AAC/C;;;AEpIA,IAAAC,eAA2D;AAWrD,IAAO,mBAAP,MAAsB;;EAI1B,OAAO,0BAA0B,QAAc;AAC7C,WAAO,UAAU,wBAAwB,IACvC,OAAO,UAAU,wBAAwB,KAAK,IAAI,iBAAgB,MAAM;AAC1E,WAAO,OAAO,UAAU,wBAAwB;EAClD;EAES;EACA;EACA;EACA;EAED,eAAuB;EACd,UAAkC,CAAA;EAClC,uBAAgE,CAAA;EAChE,wBAAkE,CAAA;EAEnF,KAAK,OAAO,WAAW,IAAC;AACtB,WAAO;EACT;EAEA,WAAQ;AACN,WAAO,mBAAmB,KAAK,OAAO;EACxC;EAEA,YAAY,QAAc;AACxB,SAAK,SAAS;AACd,SAAK,iBAAiB,OAAO,MAAM;AACnC,SAAK,gBAAgB,OAAO,MAAM;AAClC,SAAK,QAAQ,OAAO,MAAM;EAC5B;;EAGA,qBAAqB,OAA0B;AApDjD;AAqDI,QAAI,CAAC,KAAK,gBAAgB;AACxB,aAAO,KAAK,OAAO,qBAAqB,KAAK;IAC/C;AAEA,UAAM,WAA0C,EAAC,GAAG,4BAAe,cAAc,GAAG,MAAK;AAEzF,UAAM,QAAQ,KAAK;AACnB,UAAM,OAAO,KAAK,oBAAoB,QAAQ;AAE9C,QAAI,YAA2B,WAAM,IAAI,MAAV,mBAAa;AAC5C,QAAI,CAAC,UAAU;AACb,iBAAW,KAAK,OAAO,qBAAqB;QAC1C,GAAG;QACH,IAAI,SAAS,KAAK,GAAG,SAAS,cAAc,IAAI,gBAAgB;OACjE;AACD,eAAS,OAAO;AAChB,YAAM,IAAI,IAAI,EAAC,UAAU,UAAU,EAAC;AACpC,UAAI,KAAK,OAAO;AACd,yBAAI,IAAI,GAAG,GAAG,SAAS,2BAA2B,MAAM,IAAI,EAAE,UAAU,EAAC;MAC3E;IACF,OAAO;AACL,YAAM,IAAI,EAAE;AACZ,UAAI,KAAK,OAAO;AACd,yBAAI,IACF,GACA,GAAG,SAAS,MAAM,IAAI,EAAE,0BAA0B,MAAM,IAAI,EAAE,iBAAiB,MAAM,KAAK,EAC3F;MACH;IACF;AAEA,WAAO;EACT;;EAGA,sBAAsB,OAA2B;AAvFnD;AAwFI,QAAI,CAAC,KAAK,gBAAgB;AACxB,aAAO,KAAK,OAAO,sBAAsB,KAAK;IAChD;AAEA,UAAM,WAA2C,EAAC,GAAG,6BAAgB,cAAc,GAAG,MAAK;AAE3F,UAAM,QAAQ,KAAK;AACnB,UAAM,OAAO,KAAK,qBAAqB,QAAQ;AAE/C,QAAI,YAA4B,WAAM,IAAI,MAAV,mBAAa;AAC7C,QAAI,CAAC,UAAU;AACb,iBAAW,KAAK,OAAO,sBAAsB;QAC3C,GAAG;QACH,IAAI,SAAS,KAAK,GAAG,SAAS,cAAc;OAC7C;AACD,eAAS,OAAO;AAChB,YAAM,IAAI,IAAI,EAAC,UAAU,UAAU,EAAC;AACpC,UAAI,KAAK,OAAO;AACd,yBAAI,IAAI,GAAG,GAAG,SAAS,2BAA2B,MAAM,IAAI,EAAE,UAAU,EAAC;MAC3E;IACF,OAAO;AACL,YAAM,IAAI,EAAE;AACZ,UAAI,KAAK,OAAO;AACd,yBAAI,IACF,GACA,GAAG,SAAS,MAAM,IAAI,EAAE,0BAA0B,MAAM,IAAI,EAAE,iBAAiB,MAAM,KAAK,EAC3F;MACH;IACF;AAEA,WAAO;EACT;EAEA,QAAQ,UAA0C;AAChD,QAAI,CAAC,KAAK,gBAAgB;AACxB,eAAS,QAAO;AAChB;IACF;AAEA,UAAM,QAAQ,KAAK,UAAU,QAAQ;AACrC,UAAM,OAAO,SAAS;AAEtB,UAAM,IAAI,EAAE;AACZ,QAAI,MAAM,IAAI,EAAE,aAAa,GAAG;AAC9B,WAAK,iBAAiB,QAAQ;AAC9B,UAAI,KAAK,OAAO;AACd,yBAAI,IAAI,GAAG,GAAG,SAAS,iCAAiC,EAAC;MAC3D;IACF,WAAW,MAAM,IAAI,EAAE,WAAW,GAAG;AACnC,uBAAI,MAAM,GAAG,SAAS,4CAA4C,EAAC;AACnE,YAAM,IAAI,EAAE,WAAW;IACzB,WAAW,KAAK,OAAO;AACrB,uBAAI,IAAI,GAAG,GAAG,SAAS,4BAA4B,MAAM,IAAI,EAAE,UAAU,EAAC;IAC5E;EACF;;;EAKQ,iBAAiB,UAA0C;AACjE,UAAM,QAAQ,KAAK,UAAU,QAAQ;AAErC,YAAQ,KAAK,eAAe;MAC1B,KAAK;AACH,eAAO;MACT,KAAK;AACH,eAAO,MAAM,SAAS,IAAI;AAC1B,iBAAS,QAAO;AAChB,eAAO;IACX;EACF;;EAGQ,UACN,UAA0C;AAE1C,QAAI;AAIJ,QAAI,oBAAoB,8BAAiB;AACvC,cAAQ,KAAK;IACf;AACA,QAAI,oBAAoB,6BAAgB;AACtC,cAAQ,KAAK;IACf;AACA,QAAI,CAAC,OAAO;AACV,YAAM,IAAI,MAAM,GAAG,MAAM;IAC3B;AACA,QAAI,CAAC,MAAM,SAAS,IAAI,GAAG;AACzB,YAAM,IAAI,MAAM,GAAG,SAAS,kCAAkC;IAChE;AACA,WAAO;EACT;;EAGQ,qBAAqB,OAA2B;AACtD,UAAM,EAAC,KAAI,IAAI,KAAK;AACpB,UAAM,aAAa,KAAK,SAAS,MAAM,OAAO,MAAM;AACpD,WAAO,GAAG,UAAU;EACtB;;EAGQ,oBAAoB,OAA0B;AACpD,UAAM,SAAS,MAAM,KAAK,KAAK,SAAS,MAAM,GAAG,MAAM,IAAI;AAC3D,UAAM,SAAS,MAAM,KAAK,KAAK,SAAS,MAAM,GAAG,MAAM,IAAI;AAK3D,UAAM,cAAc;AACpB,UAAM,mBAAmB,KAAK,SAAS,KAAK,UAAU,MAAM,YAAY,CAAC;AAEzE,UAAM,EAAC,KAAI,IAAI,KAAK;AACpB,YAAQ,MAAM;MACZ,KAAK;AAEH,eAAO,GAAG,UAAU,UAAU,UAAU,gBAAgB;MAE1D,KAAK;MACL;AAEE,cAAM,gBAAgB,KAAK,SAAS,KAAK,UAAU,MAAM,UAAU,CAAC;AAGpE,eAAO,GAAG,UAAU,UAAU,UAAU,eAAe,MAAM,YAAY,kBAAkB;IAC/F;EACF;EAEQ,SAAS,KAAW;AAC1B,QAAI,KAAK,QAAQ,GAAG,MAAM,QAAW;AACnC,WAAK,QAAQ,GAAG,IAAI,KAAK;IAC3B;AACA,WAAO,KAAK,QAAQ,GAAG;EACzB;;AA9MI,IAAO,kBAAP;AACJ,cADW,iBACJ,gBAA+C,EAAC,GAAG,4BAAe,aAAY;;;ACbvF,IAAAC,eAA+C;AAGzC,IAAO,iBAAP,MAAoB;;EAIxB,OAAO,wBAAwB,QAAc;AAC3C,WAAO,UAAU,sBAAsB,MAAM,IAAI,eAAc,MAAM;AACrE,WAAO,OAAO,UAAU,sBAAsB;EAChD;EAEgB;EACP;EACA;EACA;EAEQ,SAA6D,CAAA;EAE9E,KAAK,OAAO,WAAW,IAAC;AACtB,WAAO;EACT;EAEA,WAAQ;AACN,WAAO,GAAG,KAAK,OAAO,WAAW,KAAK,KAAK,OAAO;EACpD;;EAGA,YAAY,QAAc;AACxB,SAAK,SAAS;AACd,SAAK,iBAAiB,OAAO,MAAM;AACnC,SAAK,gBAAgB,OAAO,MAAM;AAClC,SAAK,QAAQ;EACf;;EAGA,aAAa,OAAkB;AAC7B,QAAI,CAAC,KAAK,gBAAgB;AACxB,aAAO,KAAK,OAAO,aAAa,KAAK;IACvC;AAEA,UAAM,MAAM,KAAK,YAAY,KAAK;AAElC,QAAI,aAAa,KAAK,OAAO,GAAG;AAChC,QAAI,CAAC,YAAY;AACf,YAAM,SAAS,KAAK,OAAO,aAAa;QACtC,GAAG;QACH,IAAI,MAAM,KAAK,GAAG,MAAM,cAAc;OACvC;AACD,WAAK,OAAO,GAAG,IAAI,aAAa,EAAC,QAAQ,UAAU,EAAC;AACpD,UAAI,KAAK,OAAO;AACd,yBAAI,IAAI,GAAG,GAAG,4BAA4B,OAAO,IAAI,EAAC;MACxD;IACF,OAAO;AACL,iBAAW;AACX,UAAI,KAAK,OAAO;AACd,yBAAI,IACF,GACA,GAAG,wBAAwB,WAAW,OAAO,YAAY,WAAW,UAAU,EAC/E;MACH;IACF;AAEA,WAAO,WAAW;EACpB;;EAGA,QAAQ,QAAc;AACpB,QAAI,CAAC,KAAK,gBAAgB;AACxB,aAAO,QAAO;AACd;IACF;AAEA,UAAM,MAAM,KAAK,YAAY,MAAM;AACnC,UAAM,aAAa,KAAK,OAAO,GAAG;AAClC,QAAI,YAAY;AACd,iBAAW;AACX,UAAI,WAAW,aAAa,GAAG;AAC7B,YAAI,KAAK,kBAAkB,UAAU;AACnC,iBAAO,KAAK,OAAO,GAAG;AACtB,qBAAW,OAAO,QAAO;AACzB,cAAI,KAAK,OAAO;AACd,6BAAI,IAAI,GAAG,GAAG,0BAA0B,OAAO,eAAe,EAAC;UACjE;QACF;MACF,WAAW,WAAW,WAAW,GAAG;AAClC,cAAM,IAAI,MAAM,yBAAyB,OAAO,4BAA4B;MAC9E,WAAW,KAAK,OAAO;AACrB,yBAAI,IAAI,GAAG,GAAG,0BAA0B,OAAO,YAAY,WAAW,UAAU,EAAC;MACnF;IACF;EACF;;EAIU,YAAY,OAA2B;AAC/C,WAAO,GAAG,MAAM,SAAS,MAAM;EACjC;;AA9FI,IAAO,gBAAP;AACJ,cADW,eACK,gBAAsC,EAAC,GAAG,oBAAO,aAAY;;;ACIzE,SAAU,6BACd,QACA,MAAY;AAdd;AAgBE,QAAM,QAAgD,CAAA;AAEtD,QAAM,SAAS;AAEf,MAAI,OAAO,WAAW,WAAW,KAAK,GAAC,YAAO,aAAP,mBAAiB,SAAQ;AAC9D,WAAO,EAAC,6BAA6B,EAAC,CAAC,MAAM,GAAG,MAAK,EAAC;EACxD;AAEA,aAAW,wBAAwB,OAAO,YAAY;AACpD,QAAI,sBAAsB;AACxB,YAAM,kBAAkB,GAAG,qBAAqB,YAAY,qBAAqB,SAAS,qBAAqB;AAC/G,YAAM,MAAM,iBAAiB,IAAI,EAAC,CAAC,MAAM,GAAG,qBAAqB,YAAY,SAAQ;IACvF;EACF;AAEA,aAAW,sBAAsB,OAAO,YAAY,CAAA,GAAI;AACtD,UAAM,kBAAkB,GAAG,mBAAmB,YAAY,mBAAmB;AAC7E,UAAM,OAAO,iBAAiB,IAAI,EAAC,CAAC,MAAM,GAAG,KAAK,UAAU,kBAAkB,EAAC;EACjF;AAEA,SAAO;AACT;;;AC7BA,IAAI,SAAmC;AACvC,IAAI,MAAuC;AAKrC,SAAU,iBACd,KACA,EACE,IACA,SACA,QACA,MAAM,KACN,OAAO,KACP,YAAY,EAAC,GAQd;AAED,MAAI,CAAC,QAAQ;AACX,aAAS,SAAS,cAAc,QAAQ;AACxC,WAAO,KAAK;AACZ,WAAO,QAAQ;AACf,WAAO,MAAM,SAAS;AACtB,WAAO,MAAM,WAAW;AACxB,WAAO,MAAM,MAAM;AACnB,WAAO,MAAM,OAAO;AACpB,WAAO,MAAM,SAAS;AACtB,WAAO,MAAM,YAAY;AACzB,aAAS,KAAK,YAAY,MAAM;AAEhC,UAAM,OAAO,WAAW,IAAI;EAE9B;AAGA,MAAI,OAAO,UAAU,IAAI,SAAS,OAAO,WAAW,IAAI,QAAQ;AAC9D,WAAO,QAAQ,IAAI,QAAQ;AAC3B,WAAO,SAAS,IAAI,SAAS;AAC7B,WAAO,MAAM,QAAQ;AACrB,WAAO,MAAM,SAAS;EACxB;AAKA,QAAM,QAAQ,IAAI,OAAO,uBAAuB,GAAG;AACnD,QAAM,YAAY,2BAAK,gBAAgB,IAAI,OAAO,IAAI;AACtD,MAAI,WAAW;AAEb,UAAM,SAAS;AAIf,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK,GAAG;AACxC,gBAAU,KAAK,SAAS,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI;AAChD,gBAAU,KAAK,SAAS,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI;AAChD,gBAAU,KAAK,SAAS,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI;AAChD,gBAAU,KAAK,SAAS,IAAI,CAAC,IAAI,SAAS,MAAM,MAAM,IAAI,CAAC,IAAI;IACjE;AACA,+BAAK,aAAa,WAAW,GAAG;EAClC;AACF;;;AC/DM,SAAU,UAAU,GAAQ,GAAQ,OAAa;AACrD,MAAI,MAAM,GAAG;AACX,WAAO;EACT;AACA,MAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG;AACtB,WAAO;EACT;AACA,MAAI,MAAM,QAAQ,CAAC,GAAG;AACpB,QAAI,CAAC,MAAM,QAAQ,CAAC,KAAK,EAAE,WAAW,EAAE,QAAQ;AAC9C,aAAO;IACT;AACA,aAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,KAAK;AACjC,UAAI,CAAC,UAAU,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,QAAQ,CAAC,GAAG;AACrC,eAAO;MACT;IACF;AACA,WAAO;EACT;AACA,MAAI,MAAM,QAAQ,CAAC,GAAG;AACpB,WAAO;EACT;AACA,MAAI,OAAO,MAAM,YAAY,OAAO,MAAM,UAAU;AAClD,UAAM,QAAQ,OAAO,KAAK,CAAC;AAC3B,UAAM,QAAQ,OAAO,KAAK,CAAC;AAC3B,QAAI,MAAM,WAAW,MAAM,QAAQ;AACjC,aAAO;IACT;AACA,eAAW,OAAO,OAAO;AACvB,UAAI,CAAC,EAAE,eAAe,GAAG,GAAG;AAC1B,eAAO;MACT;AACA,UAAI,CAAC,UAAU,EAAE,GAAG,GAAG,EAAE,GAAG,GAAG,QAAQ,CAAC,GAAG;AACzC,eAAO;MACT;IACF;AACA,WAAO;EACT;AACA,SAAO;AACT;;;AC9CA,IAAAC,eAAqC;AAG/B,IAAO,qBAAP,MAAyB;EAC7B;EAEA,YAAY,eAA6B;AACvC,SAAK,gBAAgB;EACvB;EAEA,gBAAgB,MAAY;AAC1B,WAAO,KAAK,cAAc,KAAK,YAAU,OAAO,SAAS,IAAI,KAAK;EACpE;;EAGA,2BAA2B,cAA0B;AAnBvD;AAoBI,WAAO,aAAa,cAChB,kBAAa,eAAb,mBAAyB,IAAI,YAAU,OAAO,aAC9C,CAAC,aAAa,IAAI;EACxB;EAEA,mBACE,gBACA,gBAA8B;AAE9B,UAAM,gBAAgB,CAAC,GAAG,cAAc;AACxC,eAAW,aAAa,gBAAgB;AACtC,YAAM,QAAQ,cAAc,UAAU,gBAAc,WAAW,SAAS,UAAU,IAAI;AACtF,UAAI,QAAQ,GAAG;AACb,sBAAc,KAAK,SAAS;MAC9B,OAAO;AACL,sBAAc,KAAK,IAAI;MACzB;IACF;AACA,WAAO;EACT;EAEA,eAAe,YAAkB;AAC/B,UAAM,cAAc,KAAK,cAAc,UAAU,YAAU,OAAO,SAAS,UAAU;AAErF,QAAI,gBAAgB,IAAI;AACtB,uBAAI,KAAK,qCAAqC,cAAc,EAAC;IAC/D;AAEA,WAAO;EACT;;;;AC3CI,SAAU,0CACd,cACA,cAA4B;AAE5B,QAAM,kBAAkB,OAAO,YAC7B,aAAa,WAAW,IAAI,UAAQ,CAAC,KAAK,MAAM,KAAK,QAAQ,CAAC,CAAC;AAGjE,QAAM,eAAe,aAAa,MAAK;AACvC,eAAa,KAAK,CAAC,GAAG,MAAK;AACzB,UAAM,kBAAkB,EAAE,aAAa,EAAE,WAAW,IAAI,UAAQ,KAAK,SAAS,IAAI,CAAC,EAAE,IAAI;AACzF,UAAM,kBAAkB,EAAE,aAAa,EAAE,WAAW,IAAI,UAAQ,KAAK,SAAS,IAAI,CAAC,EAAE,IAAI;AACzF,UAAM,eAAe,KAAK,IAAI,GAAG,gBAAgB,IAAI,UAAQ,gBAAgB,IAAI,CAAC,CAAC;AACnF,UAAM,eAAe,KAAK,IAAI,GAAG,gBAAgB,IAAI,UAAQ,gBAAgB,IAAI,CAAC,CAAC;AAEnF,WAAO,eAAe;EACxB,CAAC;AAED,SAAO;AACT;;;ACpBA,IAAAC,eAAkB;AAElB,yBAAwD;;;ACFxD,mBAA6B;AAEvB,SAAU,eAAe,OAAc;AAC3C,aAAO,6BAAe,KAAK,KAAK,OAAO,UAAU,YAAY,OAAO,UAAU;AAChF;AAOM,SAAU,yBACd,UAAgD;AAEhD,QAAM,SAA8B,EAAC,UAAU,CAAA,GAAI,UAAU,CAAA,EAAE;AAC/D,SAAO,KAAK,QAAQ,EAAE,QAAQ,UAAO;AACnC,UAAM,UAAU,SAAS,IAAI;AAC7B,QAAI,eAAe,OAAO,GAAG;AAC3B,aAAO,SAAS,IAAI,IAAI;IAC1B,OAAO;AACL,aAAO,SAAS,IAAI,IAAI;IAC1B;EACF,CAAC;AAED,SAAO;AACT;;;ADTM,IAAO,eAAP,MAAmB;EAKvB,UAAyC;IACvC,iBAAiB;;;;;;;EAQnB;;EAGA;;EAEA;;;;;;;EAQA,YAEE,SACA,SAA6B;AAE7B,WAAO,OAAO,KAAK,SAAS,OAAO;AAGnC,UAAM,sBAAkB,gDACtB,OAAO,OAAO,OAAO,EAAE,OAAO,CAAAC,YAAUA,QAAO,YAAY,CAAC;AAE9D,eAAW,kBAAkB,iBAAiB;AAE5C,cAAQ,eAAe,IAAI,IAAI;IACjC;AAEA,qBAAI,IAAI,GAAG,sCAAsC,OAAO,KAAK,OAAO,CAAC,EAAC;AAItE,SAAK,UAAU;AACf,SAAK,iBAAiB,CAAA;AACtB,SAAK,iBAAiB,CAAA;AAGtB,eAAW,CAAC,MAAMA,OAAM,KAAK,OAAO,QAAQ,OAAO,GAAG;AACpD,WAAK,WAAWA,OAAM;AACtB,UAAIA,QAAO,QAAQ,SAASA,QAAO,QAAQ,CAAC,KAAK,QAAQ,iBAAiB;AACxE,yBAAI,KAAK,gBAAgB,WAAWA,QAAO,MAAM,EAAC;MACpD;IACF;EACF;;EAGA,UAAO;EAAU;;;;EAKjB,SAAS,OAAsE;AAvFjF;AAwFI,eAAW,QAAQ,OAAO,KAAK,KAAK,GAAG;AACrC,YAAM,aAAa;AACnB,YAAM,cAAc,MAAM,UAAU,KAAK,CAAA;AACzC,YAAMA,UAAS,KAAK,QAAQ,UAAU;AACtC,UAAI,CAACA,SAAQ;AAEX,YAAI,CAAC,KAAK,QAAQ,iBAAiB;AACjC,2BAAI,KAAK,UAAU,gBAAgB,EAAC;QACtC;AACA;MACF;AAEA,YAAM,cAAc,KAAK,eAAe,UAAU;AAClD,YAAM,cAAc,KAAK,eAAe,UAAU;AAClD,YAAM,wBACJ,KAAAA,QAAO,gBAAP,wBAAAA,SAAqB,aAAa,iBAAiB;AAErD,YAAM,EAAC,UAAU,SAAQ,IAAI,yBAAyB,mBAAmB;AACzE,WAAK,eAAe,UAAU,IAAI,EAAC,GAAG,aAAa,GAAG,SAAQ;AAC9D,WAAK,eAAe,UAAU,IAAI,EAAC,GAAG,aAAa,GAAG,SAAQ;IAIhE;EACF;;;;;EAMA,aAAU;AACR,WAAO,OAAO,OAAO,KAAK,OAAO;EACnC;;EAGA,mBAAgB;AACd,WAAO,KAAK;EACd;;EAGA,mBAAgB;AACd,UAAM,WAAW,CAAA;AACjB,eAAW,kBAAkB,OAAO,OAAO,KAAK,cAAc,GAAG;AAC/D,aAAO,OAAO,UAAU,cAAc;IACxC;AACA,WAAO;EACT;;;EAKA,gBAAa;AA3If;AA4II,UAAM,QAAiD,CAAA;AACvD,eAAW,CAAC,YAAYA,OAAM,KAAK,OAAO,QAAQ,KAAK,cAAc,GAAG;AACtE,iBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQA,OAAM,GAAG;AACjD,cAAM,GAAG,cAAc,KAAK,IAAI;UAC9B,OAAM,UAAK,QAAQ,UAAU,EAAE,iBAAzB,mBAAwC;UAC9C,OAAO,OAAO,KAAK;;MAEvB;IACF;AACA,WAAO;EACT;EAEA,WAAWA,SAAoB;AAC7B,UAAM,aAAaA,QAAO;AAE1B,SAAK,eAAe,UAAU,IAAIA,QAAO,mBAAmB,CAAA;AAC5D,SAAK,eAAe,UAAU,IAAI,CAAA;EACpC;;;;AEhJF,IAAAC,eAAoC;;;ACTpC,IAAI,aAAa;AAKX,SAAU,cAAc,QAAc;AAC1C,eAAa;AACf;AAOA,eAAsB,gBACpB,KACA,MAAkD;AAElD,QAAM,QAAQ,IAAI,MAAK;AACvB,QAAM,eAAc,6BAAM,gBAAe;AACzC,QAAM,MAAM,IAAI,WAAW,MAAM,IAAI,MAAM,aAAa;AACxD,QAAM,MAAM,OAAM;AAClB,SAAO,OAAO,MAAM,kBAAkB,OAAO,IAAI,IAAI,MAAM,kBAAkB,KAAK;AACpF;AAQA,eAAsB,UACpB,KACA,MAA6B;AAE7B,SAAO,MAAM,IAAI,QAAQ,CAAC,SAAS,WAAU;AAC3C,QAAI;AACF,YAAM,QAAQ,IAAI,MAAK;AACvB,YAAM,SAAS,MAAM,QAAQ,KAAK;AAClC,YAAM,UAAU,MAAM,OAAO,IAAI,MAAM,wBAAwB,MAAM,CAAC;AACtE,YAAM,eAAc,6BAAM,gBAAe;AACzC,YAAM,MAAM,IAAI,WAAW,MAAM,IAAI,MAAM,aAAa;IAC1D,SAAS,OAAP;AACA,aAAO,KAAK;IACd;EACF,CAAC;AACH;;;ADJO,IAAM,mBAAsC,CAAC,MAAM,MAAM,MAAM,MAAM,MAAM,IAAI;AAgD/E,IAAM,YAA+B,CAAC,MAAM,MAAM,MAAM,MAAM,MAAM,IAAI;AAqBzE,IAAO,gBAAP,MAAmB;EACd;EACA;EACT;;;EAIA;;EAEA;;EAEA;EAES;EACT,UAAmB;EACnB,YAAqB;EAEX,eAA2B,MAAK;EAAE;EAClC,cAAsC,MAAK;EAAE;EAEvD,KAAK,OAAO,WAAW,IAAC;AACtB,WAAO;EACT;EAEA,WAAQ;AACN,WAAO,iBAAiB,KAAK,OAAO,KAAK,UAAU,UAAU;EAC/D;EAEA,YAAY,QAAgB,OAAwB;AAClD,SAAK,SAAS;AAGd,UAAM,KAAK,IAAI,eAAe;AAC9B,SAAK,QAAQ,EAAC,GAAG,cAAa,cAAc,IAAI,GAAG,MAAK;AACxD,SAAK,KAAK,KAAK,MAAM;AAErB,YAAQ,EAAC,GAAG,MAAK;AAEjB,QAAI,QAAO,+BAAO,UAAS,YAAY,MAAM,cAAc,MAAM;AAC/D,YAAM,OAAO,gBAAgB,MAAM,IAAI;IACzC;AAGA,QAAI,MAAM,SAAS;AACjB,YAAM,YAAY;IACpB;AAEA,SAAK,QAAQ,IAAI,QAAc,CAAC,SAAS,WAAU;AACjD,WAAK,eAAe,MAAK;AACvB,aAAK,UAAU;AACf,gBAAO;MACT;AACA,WAAK,cAAc;IACrB,CAAC;AAED,SAAK,UAAU,KAAK;EACtB;EAEA,MAAM,UAAU,OAAwB;AACtC,UAAM,YAA8B,MAAM;AAE1C,UAAM,OAA2B,MAAM,iBAAiB,SAAS,EAAE,KACjE,QACA,KAAK,WAAW;AAIlB,QAAI,KAAK,WAAW;AAClB;IACF;AAKA,UAAM,OACJ,KAAK,MAAM,SAAS,KAAK,MAAM,SAC3B,EAAC,OAAO,KAAK,MAAM,OAAO,QAAQ,KAAK,MAAM,OAAM,IACnD,KAAK,mBAAmB,IAAI;AAClC,QAAI,CAAC,MAAM;AACT,YAAM,IAAI,MAAM,sCAAsC;IACxD;AACA,UAAM,YAA0B,EAAC,GAAG,MAAM,GAAG,OAAO,MAAM,QAAW,WAAW,EAAC;AAIjF,UAAM,UAAU,KAAK,OAAO,iBAAiB,UAAU,OAAO,UAAU,MAAM;AAC9E,cAAU,YACR,KAAK,MAAM,cAAc,SAAS,UAAU,KAAK,IAAI,SAAS,KAAK,MAAM,SAAS;AAEpF,SAAK,UAAU,KAAK,OAAO,cAAc,SAAS;AAClD,SAAK,UAAU,KAAK,QAAQ;AAC5B,SAAK,OAAO,KAAK,QAAQ;AAEzB,QAAI,MAAM,MAAM;AACd,cAAQ,KAAK,MAAM,WAAW;QAC5B,KAAK;AACH,eAAK,kBAAkB,KAAK,SAAS,IAAqB;AAC1D;QACF,KAAK;AACH,eAAK,kBAAkB,IAAqB;AAC5C;QACF,KAAK;AACH,eAAK,kBAAkB,KAAK,SAAS,IAAqB;AAC1D;QACF,KAAK;AACH,eAAK,qBAAqB,KAAK,SAAS,IAAwB;AAChE;QACF,KAAK;AACH,eAAK,oBAAoB,KAAK,SAAS,IAAkC;AACzE;QACF,KAAK;AACH,eAAK,yBAAyB,KAAK,SAAS,IAAuC;AACnF;MACJ;IACF;AAGA,QAAI,KAAK,MAAM,SAAS;AACtB,WAAK,gBAAe;IACtB;AAEA,qBAAI,KAAK,GAAG,GAAG,aAAa;AAC5B,SAAK,aAAY;EACnB;EAEA,UAAO;AACL,QAAI,KAAK,SAAS;AAChB,WAAK,QAAQ,QAAO;AAEpB,WAAK,UAAU;IACjB;AACA,SAAK,YAAY;EACnB;EAEA,kBAAe;AAEb,SAAK,QAAQ,qBAAoB;EAEnC;;EAGA,WAAW,UAAkC,CAAA,GAAE;AAC7C,SAAK,QAAQ,WACX,mBAAmB,uBAAU,UAAU,KAAK,OAAO,cAAc,OAAO,CAAC;EAE7E;;;;;;;;EASA,OAAO,MAAqC;AAC1C,QAAI,CAAC,KAAK,SAAS;AACjB,YAAM,IAAI,MAAM,0CAA0C;IAC5D;AAEA,QAAI,KAAK,UAAU,KAAK,QAAQ,SAAS,KAAK,WAAW,KAAK,QAAQ,QAAQ;AAC5E,aAAO;IACT;AAEA,QAAI,KAAK,SAAS;AAChB,YAAM,UAAU,KAAK;AACrB,WAAK,UAAU,QAAQ,MAAM,IAAI;AACjC,cAAQ,QAAO;IACjB;AAEA,WAAO;EACT;;EAGA,mBAAmB,MAAiB;AAClC,UAAM,aAAc,6BAA2B;AAC/C,WAAO,YAAY,OAAO,UAAU;EACtC;;EAGA,mBACE,MAMQ;AAER,QAAI,CAAC,MAAM;AACT,aAAO;IACT;AACA,QAAI,YAAY,OAAO,IAAI,GAAG;AAC5B,aAAO;IACT;AAEA,QAAI,MAAM,QAAQ,IAAI,GAAG;AACvB,aAAO,KAAK,mBAAmB,KAAK,CAAC,CAAC;IACxC;AACA,QAAI,KAAK,OAAO,gBAAgB,IAAI,GAAG;AACrC,aAAO,KAAK,OAAO,qBAAqB,IAAI;IAC9C;AACA,QAAI,QAAQ,OAAO,SAAS,YAAY,KAAK,gBAAgB,QAAQ;AACnE,YAAM,mBAAmB,OAAO,OAAO,IAAI;AAC3C,YAAM,cAAc,iBAAiB,CAAC;AACtC,aAAO,EAAC,OAAO,YAAY,OAAO,QAAQ,YAAY,OAAM;IAC9D;AACA,UAAM,IAAI,MAAM,+BAA+B;EACjD;;EAGA,iBAAiB,MAAqB;AAEpC,YAAQ,MAAM;MACV,KAAK;AAAM,eAAQ;MACnB,KAAK;AAAM,eAAQ;MACnB,KAAK;AAAM,eAAQ;MACnB,KAAK;AAAM,eAAQ;MACnB,KAAK;AAAM,eAAQ;MACnB,KAAK;AAAM,eAAQ;MACnB;AAAS,cAAM,IAAI,MAAM,IAAI;IAC/B;EACJ;;EAIA,eAAe,MAAiB;EAAG;;EAGnC,kBAAkB,SAAkB,MAAmB;AACrD,UAAM,IAAI,MAAM,0CAA0C;EAC5D;;EAGA,kBAAkB,SAAwB,QAAQ,GAAC;AACjD,QAAI,CAAC,KAAK,SAAS;AACjB,YAAM,IAAI,MAAM,yBAAyB;IAC3C;AAEA,UAAM,WAAW,KAAK,sBAAsB,OAAO;AAInD,QAAI,SAAS,SAAS,KAAK,KAAK,MAAM,YAAY,OAAO;AACvD,uBAAI,KAAK,WAAW,KAAK,8BAA8B,EAAC;IAC1D;AAEA,aAAS,WAAW,GAAG,WAAW,SAAS,QAAQ,YAAY;AAC7D,YAAM,YAAY,SAAS,QAAQ;AACnC,UAAI,KAAK,OAAO,gBAAgB,SAAS,GAAG;AAC1C,aAAK,QAAQ,kBAAkB,EAAC,OAAO,WAAW,OAAO,UAAU,OAAO,KAAI,CAAC;MACjF,OAAO;AACL,aAAK,QAAQ,cAAc,EAAC,MAAM,UAAU,MAAoB,SAAQ,CAAC;MAC3E;IACF;EACF;;;;;EAMA,kBAAkB,SAAkB,MAAmB;AAvXzD;AAwXI,UAAI,UAAK,YAAL,mBAAc,MAAM,eAAc,MAAM;AAC1C,YAAM,IAAI,MAAM,KAAK,EAAE;IACzB;AACA,aAAS,QAAQ,GAAG,QAAQ,KAAK,QAAQ,SAAS;AAChD,WAAK,kBAAkB,KAAK,KAAK,GAAG,KAAK;IAC3C;EACF;;;;;;;EAQA,oBAAoB,SAAkB,MAAqB;AAtY7D;AAuYI,UAAI,UAAK,YAAL,mBAAc,MAAM,eAAc,QAAQ;AAC5C,YAAM,IAAI,MAAM,KAAK,EAAE;IACzB;AACA,eAAW,CAAC,MAAM,QAAQ,KAAK,OAAO,QAAQ,IAAI,GAAG;AACnD,YAAM,YAAY,UAAU,QAAQ,IAAuB;AAC3D,WAAK,kBAAkB,UAAU,SAAS;IAC5C;EACF;;;;;EAMA,qBAAqB,SAAkB,MAAsB;AApZ/D;AAqZI,UAAI,UAAK,YAAL,mBAAc,MAAM,eAAc,YAAY;AAChD,YAAM,IAAI,MAAM,KAAK,EAAE;IACzB;AACA,aAAS,QAAQ,GAAG,QAAQ,KAAK,QAAQ,SAAS;AAChD,WAAK,kBAAkB,KAAK,KAAK,GAAG,KAAK;IAC3C;EACF;;;;;EAMA,yBAAyB,SAAkB,MAA0B;AACnE,UAAM,IAAI,MAAM,kDAAkD;EACpE;;EAGA,wBACE,SACA,SACA,MACA,QAAgB,GAAC;AAMjB,QAAI,MAAM,QAAQ,OAAO,KAAK,QAAQ,SAAS,KAAK,KAAK,MAAM,YAAY,OAAO;AAChF,uBAAI,KAAK,GAAG,KAAK,kCAAkC,EAAC;IACtD;AAEA,UAAM,YAAY,iBAAiB,QAAQ,IAAI;AAC/C,SAAK,kBAAkB,SAAS,SAAS;EAC3C;;;;;;;EAQA,sBAAsB,MAAmB;AACvC,UAAM,UAA0D,KAAK;AACrE,QAAI;AACJ,QAAI,YAAY,OAAO,IAAI,GAAG;AAC5B,sBAAgB;QACd;;UAEE;UACA,OAAO,QAAQ;UACf,QAAQ,QAAQ;;;;IAItB,WAAW,CAAC,MAAM,QAAQ,IAAI,GAAG;AAC/B,sBAAgB,CAAC,IAAI;IACvB,OAAO;AACL,sBAAgB;IAClB;AACA,WAAO;EACT;;AA9VI,IAAO,eAAP;AAgWJ,cAhWW,cAgWJ,gBAA4C;EACjD,GAAG,qBAAQ;EACX,MAAM;EACN,SAAS;;AAgEb,eAAe,iBAAiB,GAAM;AACpC,MAAI,MAAM;AACV,MAAI,MAAM,QAAQ,CAAC,GAAG;AACpB,WAAO,MAAM,QAAQ,IAAI,EAAE,IAAI,gBAAgB,CAAC;EAClD;AACA,MAAI,KAAK,OAAO,MAAM,YAAY,EAAE,gBAAgB,QAAQ;AAC1D,UAAM,SAA8B;AACpC,UAAM,SAAS,MAAM,QAAQ,IAAI,OAAO,OAAO,MAAM,CAAC;AACtD,UAAM,OAAO,OAAO,KAAK,MAAM;AAC/B,UAAM,iBAAsC,CAAA;AAC5C,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,qBAAe,KAAK,CAAC,CAAC,IAAI,OAAO,CAAC;IACpC;AACA,WAAO;EACT;AACA,SAAO;AACT;;;AZtfA,IAAM,oBAAoB;AAC1B,IAAM,mBAAmB;AA+DnB,IAAO,SAAP,MAAY;EA+BP;EACA;;EAEA;;EAEA;;EAEA;EACA;EACA;EACT,WAAiC,CAAA;;;EAKjC;;EAGA;;EAEA;;;EAKA,cAAmC;;EAEnC,gBAAwB;;EAExB;;EAGA,cAA6B;;EAE7B,mBAA2C,CAAA;;EAE3C,qBAAiD,CAAA;;EAEjD,WAAmD,CAAA;;;;;;EAOnD;;EAGA,oBAA8C;;EAG9C;;;EAIA;;EAEA;EAEA,kBAAiD,CAAA;EACjD,eAAmC;EAC3B;EAER,uBAAuC;EAC/B,eAA+B;EAC/B,aAAa;;EAGrB,qBAA6B;EAE7B,KAAK,OAAO,WAAW,IAAC;AACtB,WAAO;EACT;EAEA,WAAQ;AACN,WAAO,SAAS,KAAK;EACvB;EAEA,YAAY,QAAgB,OAAiB;AA7N/C;AA8NI,SAAK,QAAQ,EAAC,GAAG,OAAM,cAAc,GAAG,MAAK;AAC7C,YAAQ,KAAK;AACb,SAAK,KAAK,MAAM,MAAM,IAAI,OAAO;AACjC,SAAK,SAAS;AAEd,WAAO,OAAO,KAAK,UAAU,MAAM,QAAQ;AAG3C,UAAM,YAAY,OAAO,cACvB,UAAK,MAAM,YAAX,mBAAoB,IAAI,CAAAC,YAAU,CAACA,QAAO,MAAMA,OAAM,OAAM,CAAA,CAAE;AAGhE,UAAM,eACJ,MAAM,gBACN,IAAI,aAAa,WAAW,EAAC,iBAAiB,KAAK,MAAM,gBAAe,CAAC;AAE3E,SAAK,gBAAgB,YAAY;AAGjC,UAAM,eAAe,gBAAgB,MAAM;AAG3C,UAAM;;SAEH,UAAK,MAAM,YAAX,mBAAoB,UAAS,IAAI,KAAK,MAAM,WAAU,UAAK,iBAAL,mBAAmB,iBAAiB,CAAA;;AAE7F,UAAM,WAAW,KAAK,OAAO,SAAS;AAKtC,QAAI,YAAY,KAAK,MAAM,QAAQ;AAEjC,YAAM,EAAC,QAAAC,SAAQ,aAAAC,aAAW,IAAI,KAAK,MAAM,gBAAgB,mBAAmB;QAC1E;QACA,GAAG,KAAK;QACR;OACD;AACD,WAAK,SAASD;AAEd,WAAK,qBAAqBC;AAE1B,WAAK,MAAM,qBAAiB,6CAAwB,KAAK,MAAM;IACjE,OAAO;AAEL,YAAM,EAAC,IAAAC,KAAI,IAAAC,KAAI,aAAAF,aAAW,IAAI,KAAK,MAAM,gBAAgB,uBAAuB;QAC9E;QACA,GAAG,KAAK;QACR;OACD;AAED,WAAK,KAAKC;AACV,WAAK,KAAKC;AAEV,WAAK,qBAAqBF;IAC5B;AAEA,SAAK,cAAc,KAAK,MAAM;AAC9B,SAAK,gBAAgB,KAAK,MAAM;AAEhC,SAAK,WAAW,KAAK,MAAM;AAC3B,SAAK,eAAe,KAAK,MAAM;AAC/B,SAAK,aAAa,KAAK,MAAM;AAG7B,QAAI,MAAM,UAAU;AAClB,WAAK,YAAY,MAAM,QAAQ;IACjC;AAEA,SAAK,kBACH,MAAM,mBAAmB,gBAAgB,0BAA0B,KAAK,MAAM;AAChF,SAAK,gBAAgB,MAAM,iBAAiB,cAAc,wBAAwB,KAAK,MAAM;AAI7F,SAAK,WAAW,KAAK,gBAAe;AAEpC,SAAK,cAAc,OAAO,kBAAkB;MAC1C,cAAc,KAAK,SAAS;MAC5B,cAAc,KAAK,SAAS;KAC7B;AAGD,QAAI,KAAK,cAAc;AACrB,WAAK,uBAAuB,KAAK,YAAY;IAC/C;AAGA,QAAI,iBAAiB,OAAO;AAC1B,WAAK,cAAc,MAAM;IAC3B;AAEA,QAAI,MAAM,eAAe;AACvB,WAAK,iBAAiB,MAAM,aAAa;IAC3C;AACA,QAAI,MAAM,aAAa;AACrB,WAAK,eAAe,MAAM,WAAW;IACvC;AACA,QAAI,MAAM,aAAa;AACrB,WAAK,eAAe,MAAM,WAAW;IACvC;AACA,QAAI,MAAM,YAAY;AACpB,WAAK,cAAc,MAAM,UAAU;IACrC;AACA,QAAI,MAAM,oBAAoB;AAC5B,WAAK,sBAAsB,MAAM,kBAAkB;IACrD;AACA,QAAI,MAAM,UAAU;AAClB,WAAK,YAAY,MAAM,QAAQ;IACjC;AACA,QAAI,MAAM,mBAAmB;AAC3B,WAAK,oBAAoB,MAAM;IACjC;AAGA,WAAO,KAAK,IAAI;EAClB;EAEA,UAAO;AApVT;AAqVI,QAAI,CAAC,KAAK,YAAY;AAEpB,WAAK,gBAAgB,QAAQ,KAAK,QAAQ;AAE1C,WAAK,cAAc,QAAQ,KAAK,SAAS,EAAE;AAC3C,UAAI,KAAK,SAAS,IAAI;AACpB,aAAK,cAAc,QAAQ,KAAK,SAAS,EAAE;MAC7C;AACA,WAAK,cAAc,QAAO;AAE1B,iBAAK,iBAAL,mBAAmB;AACnB,WAAK,aAAa;IACpB;EACF;;;EAKA,cAAW;AAET,QAAI,KAAK,4BAA2B,IAAK,KAAK,oBAAoB;AAChE,WAAK,eAAe,+CAA+C;IACrE;AACA,UAAM,cAAc,KAAK;AACzB,SAAK,eAAe;AACpB,WAAO;EACT;;EAGA,eAAe,QAAc;AAC3B,SAAK,iBAAiB;EACxB;EAEA,UAAO;AAEL,SAAK,mBAAkB;AAEvB,SAAK,WAAW,KAAK,gBAAe;EACtC;EAEA,KAAK,YAAsB;AACzB,UAAM,iBAAiB,KAAK,oBAAmB;AAC/C,QAAI,gBAAgB;AAClB,uBAAI,KAAK,mBAAmB,uBAAuB,KAAK,OAAO,2BAA2B,EAAC;AAC3F,aAAO;IACT;AAEA,QAAI;AACF,iBAAW,eAAe,GAAG,gBAAgB,aAAa;AAC1D,WAAK,QAAO;IACd;AACE,iBAAW,cAAa;IAC1B;AAEA,QAAI;AACJ,QAAI;AACF,iBAAW,eAAe,GAAG,aAAa,aAAa;AACvD,WAAK,kBAAiB;AAKtB,WAAK,WAAW,KAAK,gBAAe;AAMpC,YAAM,eAAe,KAAK,aAAY;AACtC,WAAK,SAAS,YAAY,cAAc;QACtC,iBAAiB,KAAK,MAAM;OAC7B;AAED,YAAM,EAAC,YAAW,IAAI,KAAK;AAC3B,YAAM,aAAa,cACf,YAAY,cAAc,YAAY,cAAc,WAAW,IAAI,KACnE;AAEJ,oBAAc,KAAK,SAAS,KAAK;QAC/B;QACA,aAAa,KAAK;QAClB,aAAa,KAAK;QAClB,aAAa,KAAK;QAClB,eAAe,KAAK;QACpB;QACA,mBAAmB,KAAK,qBAAqB;;;;QAI7C,YAAY,KAAK;QACjB,UAAU,KAAK;OAChB;IACH;AACE,iBAAW,cAAa;AACxB,WAAK,gBAAe;IACtB;AACA,SAAK,gBAAgB,UAAU;AAG/B,QAAI,aAAa;AACf,WAAK,qBAAqB,KAAK,OAAO;AACtC,WAAK,eAAe;IACtB,OAAO;AACL,WAAK,eAAe;IACtB;AACA,WAAO;EACT;;;;;;;EASA,YAAY,UAAuC;AAxcrD;AAycI,eAAK,iBAAL,mBAAmB;AACnB,UAAM,cAAc,YAAY,gBAAgB,KAAK,QAAQ,QAAQ;AACrE,QAAI,aAAa;AACf,WAAK,YAAY,YAAY,YAAY,eAAe;AACxD,YAAM,qBAAqB,IAAI,mBAAmB,KAAK,YAAY;AACnE,WAAK,eAAe,mBAAmB,mBACrC,YAAY,cACZ,KAAK,YAAY;AAEnB,UAAI,KAAK,aAAa;AACpB,aAAK,uBAAuB,WAAW;MACzC;IACF;AACA,SAAK,eAAe;EACtB;;;;;EAMA,YAAY,UAA2B;AACrC,QAAI,aAAa,KAAK,UAAU;AAC9B,WAAK,WAAW;AAChB,WAAK,wBAAwB,UAAU;IACzC;EACF;;;;;EAMA,gBAAgB,cAA4B;AAC1C,UAAM,qBAAqB,IAAI,mBAAmB,KAAK,YAAY;AACnE,SAAK,eAAe,KAAK,eACrB,mBAAmB,mBAAmB,cAAc,KAAK,aAAa,YAAY,IAClF;AACJ,SAAK,wBAAwB,cAAc;AAG3C,SAAK,WAAW,KAAK,gBAAe;AAIpC,SAAK,cAAc,KAAK,OAAO,kBAAkB;MAC/C,cAAc,KAAK,SAAS;MAC5B,cAAc,KAAK,SAAS;KAC7B;AAGD,QAAI,KAAK,cAAc;AACrB,WAAK,uBAAuB,KAAK,YAAY;IAC/C;EACF;;;;;;EAOA,cAAc,YAAoC;AAChD,QAAI,CAAC,UAAU,YAAY,KAAK,YAAY,CAAC,GAAG;AAC9C,WAAK,aAAa;AAClB,WAAK,wBAAwB,YAAY;IAC3C;EACF;;;;;;EAQA,iBAAiB,eAAqB;AACpC,SAAK,gBAAgB;AAGrB,QAAI,KAAK,gBAAgB,UAAa,gBAAgB,GAAG;AACvD,WAAK,cAAc;IACrB;AACA,SAAK,eAAe,eAAe;EACrC;;;;;EAMA,eAAe,aAAmB;AAChC,SAAK,cAAc;AACnB,SAAK,eAAe,aAAa;EACnC;;EAGA,gBAAgB,cAA0B;AACxC,SAAK,eAAe;AACpB,SAAK,gBAAgB,IAAI,0BAAa,KAAK,aAAa,OAAO;AAE/D,eAAW,CAAC,YAAYF,OAAM,KAAK,OAAO,QAAQ,KAAK,aAAa,OAAO,GAAG;AAC5E,UAAI,wBAAwBA,OAAM,GAAG;AACnC,cAAM,gBAAgB,KAAK,cAAc,wBAAwB,KAAK,QAAQ,UAAU;AACxF,aAAK,SAAS,GAAG,oBAAoB,IAAI;MAC3C;IACF;AACA,SAAK,eAAe,cAAc;EACpC;;EAGA,qBAAkB;AAChB,SAAK,cAAc,YAAY,KAAK,aAAa,iBAAgB,CAAE;AACnE,SAAK,YAAY,KAAK,aAAa,iBAAgB,CAAE;AAErD,SAAK,eAAe,cAAc;EACpC;;;;EAKA,YAAY,UAAgD;AAC1D,WAAO,OAAO,KAAK,UAAU,QAAQ;AACrC,SAAK,eAAe,UAAU;EAChC;;;;EAKA,qBAAqB,mBAA2C;AAC9D,SAAK,oBAAoB;AACzB,SAAK,eAAe,mBAAmB;EACzC;;;;;EAMA,eAAe,aAA0B;AACvC,SAAK,YAAY,eAAe,WAAW;AAC3C,SAAK,eAAe,aAAa;EACnC;;;;;EAMA,cAAc,SAAiC,SAAqC;AAClF,UAAM,mBAAkB,mCAAS,oBAAmB,KAAK,MAAM;AAC/D,QAAI,QAAQ,SAAS,GAAG;AACtB,uBAAI,KACF,SAAS,KAAK,uEAAuE,EACtF;IACH;AAIA,SAAK,eAAe,0CAClB,KAAK,SAAS,cACd,KAAK,YAAY;AAEnB,UAAM,qBAAqB,IAAI,mBAAmB,KAAK,YAAY;AAGnE,eAAW,CAAC,YAAY,MAAM,KAAK,OAAO,QAAQ,OAAO,GAAG;AAC1D,YAAM,eAAe,mBAAmB,gBAAgB,UAAU;AAClE,UAAI,CAAC,cAAc;AACjB,YAAI,CAAC,iBAAiB;AACpB,2BAAI,KAAK,SAAS,KAAK,mCAAmC,cAAc,EAAC;QAC3E;AACA;MACF;AAIA,YAAM,iBAAiB,mBAAmB,2BAA2B,YAAY;AACjF,UAAI,MAAM;AACV,iBAAW,iBAAiB,gBAAgB;AAC1C,cAAM,gBAAgB,KAAK,gBAAgB,aAAa;AACxD,YAAI,eAAe;AACjB,gBAAM,WACJ,KAAK,OAAO,SAAS,WACjB,mBAAmB,eAAe,cAAc,UAAU,IAC1D,cAAc;AAEpB,eAAK,YAAY,UAAU,UAAU,MAAM;AAC3C,gBAAM;QACR;MACF;AACA,UAAI,CAAC,OAAO,CAAC,iBAAiB;AAC5B,yBAAI,KACF,SAAS,KAAK,yBAAyB,OAAO,8BAA8B,aAAa,EAC1F;MACH;IACF;AACA,SAAK,eAAe,YAAY;EAClC;;;;;;;;;EAUA,sBACE,YACA,SAAqC;AAErC,eAAW,CAAC,eAAe,KAAK,KAAK,OAAO,QAAQ,UAAU,GAAG;AAC/D,YAAM,gBAAgB,KAAK,gBAAgB,aAAa;AACxD,UAAI,eAAe;AACjB,aAAK,YAAY,iBAAiB,cAAc,UAAU,KAAK;MACjE,WAAW,GAAE,mCAAS,oBAAmB,KAAK,MAAM,kBAAkB;AACpE,yBAAI,KACF,UAAU,KAAK,yDAAyD,gBAAgB,EACzF;MACH;IACF;AACA,SAAK,eAAe,WAAW;EACjC;;;EAKA,sBAAmB;AACjB,eAAW,WAAW,OAAO,OAAO,KAAK,QAAQ,GAAG;AAClD,UAAI,mBAAmB,gBAAgB,CAAC,QAAQ,SAAS;AACvD,eAAO,QAAQ;MACjB;IACF;AACA,WAAO;EACT;;EAGA,eAAY;AACV,UAAM,gBAAyC,CAAA;AAE/C,eAAW,CAAC,MAAM,OAAO,KAAK,OAAO,QAAQ,KAAK,QAAQ,GAAG;AAC3D,UAAI,mBAAmB,cAAc;AAEnC,YAAI,QAAQ,SAAS;AACnB,wBAAc,IAAI,IAAI,QAAQ;QAChC;MACF,OAAO;AACL,sBAAc,IAAI,IAAI;MACxB;IACF;AAEA,WAAO;EACT;;EAGA,8BAA2B;AACzB,QAAI,YAAY;AAChB,eAAW,WAAW,OAAO,OAAO,KAAK,QAAQ,GAAG;AAClD,UAAI,mBAAmB,0BAAa;AAClC,oBAAY,KAAK,IAAI,WAAW,QAAQ,QAAQ,eAAe;MACjE,WAAW,mBAAmB,uBAAU,mBAAmB,sBAAS;AAClE,oBAAY,KAAK,IAAI,WAAW,QAAQ,eAAe;MACzD,WAAW,mBAAmB,cAAc;AAC1C,oBAAY,QAAQ,UAChB,KAAK,IAAI,WAAW,QAAQ,QAAQ,eAAe;;UAEnD;;MACN,WAAW,EAAE,mBAAmB,uBAAU;AACxC,oBAAY,KAAK,IAAI,WAAW,QAAQ,OAAO,eAAe;MAChE;IACF;AACA,WAAO;EACT;;;;;;EAOA,uBAAuB,aAAwB;AAE7C,UAAM,aAAa,EAAC,GAAG,YAAY,WAAU;AAC7C,eAAW,CAAC,aAAa,KAAK,OAAO,QAAQ,UAAU,GAAG;AACxD,UACE,CAAC,KAAK,SAAS,aAAa,WAAW,KAAK,YAAU,OAAO,SAAS,aAAa,KACnF,kBAAkB,aAClB;AACA,eAAO,WAAW,aAAa;MACjC;IACF;AAGA,SAAK,cAAc,YAAY;AAC/B,SAAK,eAAe,YAAY,WAAW,IAAI;AAC/C,SAAK,cAAc,YAAY,YAAY,EAAC,iBAAiB,KAAI,CAAC;AAClE,SAAK,cAAc,YAAY,EAAC,iBAAiB,KAAK,MAAM,gBAAe,CAAC;AAE5E,SAAK,eAAe,qBAAqB;EAC3C;;EAGA,wBAAwB,QAAc;AACpC,SAAK,yBAAyB;AAC9B,SAAK,eAAe,MAAM;EAC5B;;EAGA,kBAAe;AACb,QAAI,KAAK,sBAAsB;AAC7B,UAAI,eAA8B;AAClC,UAAI,eAA8B;AAClC,UAAI,KAAK,UAAU;AACjB,yBAAI,IACF,GACA,SAAS,KAAK,oCAAoC,KAAK,wBAAwB,EAChF;AACD,uBAAe,KAAK,SAAS;AAC7B,uBAAe,KAAK,SAAS;MAC/B;AAEA,WAAK,uBAAuB;AAE5B,YAAMG,MAAK,KAAK,cAAc,aAAa;QACzC,IAAI,GAAG,KAAK;QACZ,OAAO;QACP,QAAQ,KAAK,UAAU,KAAK;QAC5B,cAAc,KAAK,MAAM;OAC1B;AAED,UAAIC,MAAoB;AACxB,UAAI,KAAK,QAAQ;AACf,QAAAA,MAAKD;MACP,WAAW,KAAK,IAAI;AAClB,QAAAC,MAAK,KAAK,cAAc,aAAa;UACnC,IAAI,GAAG,KAAK;UACZ,OAAO;UACP,QAAQ,KAAK,UAAU,KAAK;UAC5B,cAAc,KAAK,MAAM;SAC1B;MACH;AAEA,WAAK,WAAW,KAAK,gBAAgB,qBAAqB;QACxD,GAAG,KAAK;QACR,cAAc,KAAK;QACnB,UAAU,KAAK;QACf,YAAY,KAAK;;;QAGjB,UAAU,KAAK,aAAY;QAC3B,IAAAD;QACA,IAAAC;OACD;AAED,WAAK,sBAAkB,2CACrB,KAAK,SAAS,cACd,KAAK,YAAY;AAGnB,UAAI;AAAc,aAAK,cAAc,QAAQ,YAAY;AACzD,UAAI;AAAc,aAAK,cAAc,QAAQ,YAAY;IAC3D;AACA,WAAO,KAAK;EACd;;EAGA,eAAe;EACf,WAAW;EAEX,oBAAiB;AAEf,UAAM,iBAAiB,iBAAI,QAAQ,IAAI,IAAI;AAC3C,QAAI,iBAAI,QAAQ,KAAK,KAAK,IAAG,IAAK,KAAK,eAAe,gBAAgB;AACpE;IACF;AAEA,SAAK,eAAe,KAAK,IAAG;AAC5B,SAAK,WAAW;AAEhB,qBAAI,MAAM,mBAAmB,qBAAqB,KAAK,MAAM,EAAC,WAAW,iBAAI,SAAS,EAAC,CAAC,EAAC;EAC3F;EAEA,kBAAe;AACb,QAAI,KAAK,UAAU;AACjB,YAAM,oBAAoB,6BAA6B,KAAK,SAAS,cAAc,KAAK,EAAE;AAI1F,uBAAI,MAAM,mBAAmB,iBAAiB,EAAC;AAE/C,YAAM,eAAe,KAAK,aAAa,cAAa;AACpD,uBAAI,MAAM,mBAAmB,YAAY,EAAC;AAE1C,YAAM,iBAAiB,KAAK,wBAAuB;AACnD,uBAAI,MAAM,mBAAmB,KAAK,eAAe,EAAC;AAClD,uBAAI,MAAM,mBAAmB,cAAc,EAAC;AAE5C,uBAAI,SAAS,iBAAiB,EAAC;AAC/B,WAAK,WAAW;IAClB;EACF;EAEU,aAAa;EACvB,gBAAgB,YAAsB;AACpC,UAAM,oBAAoB,KAAK,OAAO,MAAM;AAC5C,SAAK;AAEL,QAAI,CAAC,mBAAmB;AAEtB;IACF;AAEA,UAAM,cAAc,WAAW,MAAM;AACrC,QAAI,aAAa;AACf,uBAAiB,aAAa,EAAC,IAAI,YAAY,IAAI,SAAS,KAAI,CAAC;IAEnE;EACF;EAEA,0BAAuB;AACrB,UAAM,QAAiD,CAAA;AACvD,eAAW,CAAC,MAAM,aAAa,KAAK,OAAO,QAAQ,KAAK,eAAe,GAAG;AACxE,YAAM,SAAS,KAAK,YAAY,WAAW,cAAc,QAAQ;AACjE,YAAM,cAAc,QAAQ,IAAI;QAC9B;QACA,MAAM,cAAc;QACpB,QAAQ,SACJ,KAAK,2BAA2B,QAAQ,cAAc,cAAc,IACpE;;IAER;AACA,QAAI,KAAK,YAAY,aAAa;AAChC,YAAM,EAAC,YAAW,IAAI,KAAK;AAC3B,YAAM,SACJ,YAAY,cAAc,WACtB,IAAI,YAAY,YAAY,SAAS,IACrC,IAAI,YAAY,YAAY,SAAS;AAC3C,YAAM,SAAS,IAAI;QACjB,MAAM;QACN,MAAM,YAAY;QAClB,QAAQ,OAAO,SAAQ;;IAE3B;AACA,WAAO;EACT;;EAGA,2BAA2B,WAAgC,UAAa;AACtE,UAAM,4BAAwB,uCAAyB,QAAQ;AAC/D,UAAM,aACJ,qBAAqB,sBAAS,IAAI,sBAAsB,UAAU,SAAS,IAAI;AACjF,WAAO,WAAW,SAAQ;EAC5B;;AAtxBI,IAAO,QAAP;AACJ,cADW,OACJ,gBAAqC;EAC1C,GAAG,4BAAe;EAClB,QAAQ;EACR,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,QAAQ;EACR,UAAU,CAAA;EACV,SAAS,CAAA;EACT,SAAS,CAAA;EACT,UAAU;EACV,aAAa;EACb,YAAY,CAAA;EACZ,oBAAoB,CAAA;EACpB,UAAU,CAAA;EAEV,aAAa;EACb,eAAe;EACf,aAAa;EAEb,cAAc;EACd,iBAAiB;EACjB,eAAe;EACf,mBAAmB;EACnB,iBAAiB,oCAAgB,0BAAyB;EAE1D,cAAc;EACd,iBAAiB;;AA6vBrB,SAAS,wBAAwBJ,SAAoB;AACnD,SAAO,QAAQA,QAAO,gBAAgB,CAAC,cAAcA,QAAO,YAAY,CAAC;AAC3E;AAKM,SAAU,gBAAgB,QAAc;AAC5C,SAAO;IACL,MAAM,OAAO;IACb,gBAAgB,OAAO,KAAK;IAC5B,uBAAuB,OAAO,KAAK;IACnC,KAAK,OAAO,KAAK;;IAEjB,UAAU,OAAO;;AAErB;AAGA,SAAS,cAAc,KAAW;AAGhC,aAAW,OAAO,KAAK;AACrB,WAAO;EACT;AACA,SAAO;AACT;;;Ac/5BA,IAAAK,gBAA8E;AAC9E,IAAAC,sBAA+B;AAqBzB,IAAO,mBAAP,MAAsB;EACjB;EACA;EACA;EAQT,OAAO,YAAY,QAAc;AArCnC;AAsCI,aAAO,sCAAQ,SAAR,mBAAc,UAAS;EAChC;EAEA,YAAY,QAAgB,QAA8B,iBAAgB,cAAY;AACpF,QAAI,CAAC,iBAAgB,YAAY,MAAM,GAAG;AACxC,YAAM,IAAI,MAAM,+CAA+C;IACjE;AAEA,SAAK,SAAS;AAEd,SAAK,QAAQ,IAAI,MAAM,KAAK,QAAQ;MAClC,IAAI,MAAM,MAAM;MAChB,IAAI,MAAM,UAAM,sCAAgB;MAChC,UAAU,MAAM,YAAY;MAC5B,UAAU,MAAM,WAAW,MAAM;MACjC,GAAG;KACJ;AAED,SAAK,oBAAoB,KAAK,OAAO,wBAAwB;MAC3D,QAAQ,KAAK,MAAM,SAAS;;MAE5B,SAAS,MAAM;KAChB;AAED,SAAK,MAAM,qBAAqB,KAAK,iBAAiB;AAEtD,WAAO,KAAK,IAAI;EAClB;;EAGA,UAAO;AACL,QAAI,KAAK,OAAO;AACd,WAAK,MAAM,QAAO;IACpB;EACF;;EAGA,SAAM;AACJ,SAAK,QAAO;EACd;;EAGA,IACE,SAGC;AAED,QAAI,mCAAS,cAAc;AACzB,WAAK,MAAM,cAAc,QAAQ,YAAY;IAC/C;AACA,QAAI,mCAAS,eAAe;AAC1B,WAAK,kBAAkB,WAAW,QAAQ,aAAa;IACzD;AACA,UAAM,aAAa,KAAK,OAAO,gBAAgB,OAAO;AACtD,SAAK,MAAM,KAAK,UAAU;AAC1B,eAAW,IAAG;EAChB;;;EAKA,UAAU,aAAmB;AAC3B,WAAO,KAAK,kBAAkB,UAAU,WAAW;EACrD;;EAGA,UAAU,aAAmB;AAC3B,UAAM,SAAS,KAAK,UAAU,WAAW;AACzC,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,MAAM,2BAA2B;IAC7C;AACA,QAAI,kBAAkB,sBAAQ;AAC5B,aAAO,OAAO,UAAS;IACzB;AACA,UAAM,EAAC,QAAQ,aAAa,GAAG,aAAa,OAAO,WAAU,IAAI;AACjE,WAAO,OAAO,UAAU,YAAY,UAAU;EAChD;;AAzFI,IAAO,kBAAP;AAKJ,cALW,iBAKJ,gBAA+C;EACpD,GAAG,MAAM;EACT,SAAS;EACT,iBAAiB;;;;AC7BrB,IAAAC,sBAA+B;AA6B/B,IAAM,qBAAqB;AAMrB,IAAO,mBAAP,MAAuB;EAClB;EACA;EACA;EAET,eAAe;EACf,oBAAgD;EAChD,WAA6B,CAAA;;EAC7B,YAAiC,CAAA;;EAEjC,YAAY,QAAgB,OAA4B;AACtD,SAAK,SAAS;AAGd,SAAK,UAAU,OAAO,cAAc;MAClC,cAAc;MACd,cAAc;MACd,WAAW;MACX,WAAW;MACX,cAAc;KACf;AAED,SAAK,QAAQ,IAAI,MAAM,KAAK,QAAQ;MAClC,IAAI,MAAM,MAAM,IAAI,yBAAyB;MAC7C,IACE,MAAM,UACN,sCAAiB;QACf,OAAO,MAAM;QACb,eAAe,MAAM;QACrB,QAAQ;OACT;MACH,aAAa,MAAM;;MACnB,GAAG;KACJ;AAED,SAAK,YAAY,KAAK;AACtB,WAAO,KAAK,IAAI;EAClB;;EAGA,UAAO;AAhFT;AAiFI,SAAK,MAAM,QAAO;AAClB,eAAW,WAAW,KAAK,UAAU;AACnC,oBAAQ,gBAAR,mBAAqB;IACvB;EACF;;EAGA,SAAM;AACJ,SAAK,QAAO;EACd;EAEA,IAAI,SAAyB;AAC3B,UAAM,EAAC,YAAW,IAAI,KAAK,SAAS,KAAK,YAAY;AACrD,UAAM,aAAa,KAAK,OAAO,gBAAgB,EAAC,aAAa,GAAG,QAAO,CAAC;AACxE,SAAK,MAAM,KAAK,UAAU;AAC1B,eAAW,IAAG;AACd,SAAK,OAAO,OAAM;EACpB;EAEA,mBAAgB;AACd,UAAM,EAAC,cAAa,IAAI,KAAK,SAAS,KAAK,YAAY;AACvD,WAAO;EACT;EAEA,iBAAc;AACZ,UAAM,mBAAmB,KAAK,SAAS,KAAK,YAAY;AACxD,WAAO,iBAAiB;EAC1B;;EAIA,YAAY,OAA4B;AACtC,SAAK,gBAAgB,KAAK;EAC5B;EAEA,gBAAgB,OAA4B;AAC1C,SAAK,SAAS,KAAK,YAAY,IAAI,KAAK,eAAe,KAAK,SAAS,KAAK,YAAY,GAAG,KAAK;EAChG;EAEA,eACE,SACA,EAAC,eAAe,gBAAgB,cAAa,GAAwB;AAErE,QAAI,CAAC,SAAS;AACZ,gBAAU;QACR,eAAe,CAAA;QACf,gBAAgB,CAAA;;QAEhB,eAAe;;IAEnB;AACA,WAAO,OAAO,QAAQ,gBAAgB,cAAc;AACpD,WAAO,OAAO,QAAQ,eAAe,aAAa;AAClD,QAAI,eAAe;AACjB,cAAQ,gBAAgB;AACxB,YAAM,EAAC,OAAO,OAAM,IAAI;AAExB,UAAI,QAAQ,aAAa;AACvB,gBAAQ,YAAY,QAAO;MAC7B;AACA,cAAQ,cAAc,KAAK,OAAO,kBAAkB;QAClD,IAAI;QACJ;QACA;QACA,kBAAkB,CAAC,aAAa;OACjC;AACD,cAAQ,YAAY,OAAO,EAAC,OAAO,OAAM,CAAC;IAC5C;AACA,WAAO;EACT;;EAGA,8BAA2B;AACzB,UAAM,QAAQ,KAAK;AACnB,UAAM,EAAC,eAAc,IAAI,KAAK,SAAS,KAAK;AAC5C,eAAW,QAAQ,gBAAgB;AACjC,qBAAe,IAAI,EAAE,UAAU,KAAK;IACtC;EACF;;;;AC/HI,IAAO,WAAP,MAAe;EACV;;EAEA;EACA;EACA;EACA;EAQT,WAAoC,CAAA;EAEpC,YAAY,OAAoB;AAC9B,UAAM,EAAC,aAAa,CAAA,GAAI,UAAU,MAAM,cAAc,KAAI,IAAI;AAE9D,SAAK,KAAK,MAAM,MAAM,IAAI,UAAU;AACpC,SAAK,WAAW,MAAM;AAEtB,QAAI,SAAS;AACX,WAAK,UAAU,YAAY,OAAO,OAAO,IAAI,EAAC,OAAO,SAAS,MAAM,EAAC,IAAI;IAC3E;AAGA,SAAK,aAAa,CAAA;AAElB,eAAW,CAAC,eAAe,cAAc,KAAK,OAAO,QAAQ,UAAU,GAAG;AAExE,YAAM,YAA+B,YAAY,OAAO,cAAc,IAClE,EAAC,OAAO,eAAc,IACtB;AAEJ,UAAI,CAAC,YAAY,OAAO,UAAU,KAAK,GAAG;AACxC,cAAM,IAAI,MACR,GAAG,KAAK,OAAO,aAAa,4DAA4D;MAE5F;AAEA,WAAK,kBAAkB,cAAc,kBAAkB,gBAAgB,CAAC,UAAU,MAAM;AACtF,kBAAU,OAAO;MACnB;AAGA,UAAI,kBAAkB,WAAW;AAC/B,YAAI,KAAK,SAAS;AAChB,gBAAM,IAAI,MAAM,2BAA2B;QAC7C;AACA,aAAK,UAAU;MACjB,OAAO;AACL,aAAK,WAAW,aAAa,IAAI;MACnC;IACF;AAEA,QAAI,KAAK,WAAW,KAAK,QAAQ,WAAW,MAAM,QAAW;AAC3D,WAAK,UAAU,OAAO,OAAO,CAAA,GAAI,KAAK,OAAO;AAC7C,aAAO,KAAK,QAAQ,WAAW;IACjC;AAEA,SAAK,cAAc,eAAe,KAAK,sBAAsB,KAAK,YAAY,KAAK,OAAO;EAC5F;EAEA,iBAAc;AACZ,WAAO,KAAK;EACd;;;;;EAMA,gBAAa;AAEX,WAAO,KAAK,UAAU,EAAC,SAAS,KAAK,SAAS,GAAG,KAAK,WAAU,IAAI,KAAK;EAC3E;;EAIA,OAAO,eAAqB;AAC1B,WAAO,YAAY,KAAK,gBAAgB;EAC1C;;;;;;;;;;;;EAaA,eAAe,YAA+C,SAAY;AACxE,WAAO;EACT;EAEA,sBAAsB,YAAgC,SAA2B;AAC/E,QAAI,SAAS;AACX,aAAO,QAAQ,MAAM;IACvB;AACA,QAAI,cAAc;AAClB,eAAW,aAAa,OAAO,OAAO,UAAU,GAAG;AACjD,YAAM,EAAC,OAAO,MAAM,SAAQ,IAAI;AAChC,UAAI,CAAC,YAAY,SAAS,SAAS,UAAa,QAAQ,GAAG;AACzD,sBAAc,KAAK,IAAI,aAAa,MAAM,SAAS,IAAI;MACzD;IACF;AAGA,WAAO;EACT;;;;ACtIF,IAAM;;EAA0C;;;;;;;;;;;;;;;;;;;;;;;;AAyBhD,IAAM;;EAAqC;;;;;;;;;;;;;;;;;AAmB3C,IAAM,YAAY,CAAC,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,CAAC;AAQvC,IAAO,YAAP,cAAyB,MAAK;EAClC,YAAY,QAAgB,OAAqB;AAC/C,UAAM,aAAa,UAAU,IAAI,WAAU,UAAU,KAAK,IAAI,KAAM;AAGpE,QAAI,MAAM,QAAQ;AAChB,cAAQ,EAAC,GAAG,OAAO,QAAQ,GAAG;EAAiC,MAAM,SAAQ;IAC/E;AAEA,UAAM,QAAQ;MACZ,IAAI,MAAM,MAAM,IAAI,YAAY;MAChC,GAAG;MACH,IAAI;MACJ,aAAa;MACb,UAAU,IAAI,SAAS;QACrB,UAAU;QACV,aAAa;QACb,YAAY;UACV,oBAAoB,EAAC,MAAM,GAAG,OAAO,IAAI,aAAa,SAAS,EAAC;UAChE,WAAW,EAAC,MAAM,GAAG,OAAO,IAAI,aAAa,UAAU,EAAC;UACxD,aAAa,EAAC,MAAM,GAAG,OAAO,IAAI,aAAa,UAAU,EAAC;;OAE7D;KACF;EACH;;;;AC9EF,IAAM;;EAAgC;;;;;;;;;;;;;;;;;AAkBtC,IAAM;;EAA2B;;;;;;;;;;;;;;;;;;;AAmC3B,IAAO,yBAAP,cAAsC,UAAS;EACnD,YAAY,QAAgB,OAAkC;AAC5D,UAAM,QAAQ;MACZ,IAAI,MAAM,MAAM;MAChB,QAAQ;MACR,IAAI;MACJ,YAAY;QACV,mBAAmB;QACnB,GAAI,MAAM,QACN;UACE,OAAO;UACP,qBAAqB;UACrB,qBAAqB;UACrB,qBAAqB;UACrB,qBAAqB;UACrB,qBAAqB;UACrB,qBAAqB;YAEvB,CAAA;;KAEP;AAED,QAAI,CAAC,MAAM,mBAAmB;AAC5B,YAAM,IAAI,MAAM,0DAA0D;IAC5E;AACA,SAAK,WAAW,MAAM,iBAAiB;EACzC;EAEA,WAAW,mBAAyC;AAClD,SAAK,YAAY;MACf;KACD;EACH;EAES,UAAO;AACd,SAAK,aAAa,SAAS,CAAA,CAAE;AAC7B,UAAM,QAAO;EACf;;;;AC9FF,IAAAC,gBAA6C;AAevC,IAAO,iBAAP,MAAqB;EAChB;EACT,SAAkB,IAAI,sBAAO;EAE7B,UAAU;EACV,WAAW,IAAI,sBAAO;EACtB,WAAW,IAAI,sBAAO;EACtB,QAAQ,IAAI,sBAAQ,GAAG,GAAG,CAAC;EAC3B,WAAoC,CAAA;EAEpC,QAA6B,CAAA;EAE7B,YAAY,QAA6B,CAAA,GAAE;AACzC,UAAM,EAAC,GAAE,IAAI;AAEb,SAAK,KAAK,MAAM,IAAI,KAAK,YAAY,IAAI;AAEzC,SAAK,wBAAwB,KAAK;EACpC;EAEA,YAAS;AACP,WAAO;EACT;EAEA,UAAO;EAAU;;EAGjB,SAAM;AACJ,SAAK,QAAO;EACd;EACA,SAAS,OAA0B;AACjC,SAAK,wBAAwB,KAAK;AAClC,WAAO;EACT;EAEA,WAAQ;AACN,WAAO,8BAA8B,KAAK;EAC5C;EAEA,YAAY,UAAa;AAEvB,SAAK,WAAW;AAChB,WAAO;EACT;EAEA,YAAY,UAAa;AAEvB,SAAK,WAAW;AAChB,WAAO;EACT;EAEA,SAAS,OAAU;AAEjB,SAAK,QAAQ;AACb,WAAO;EACT;EAEA,UAAU,QAAa,aAAsB,MAAI;AAC/C,QAAI,YAAY;AACd,WAAK,OAAO,KAAK,MAAM;IACzB,OAAO;AACL,WAAK,SAAS;IAChB;EACF;EAEA,oBAAoB,YAKnB;AACC,UAAM,EAAC,UAAU,UAAU,OAAO,SAAS,KAAI,IAAI;AACnD,QAAI,UAAU;AACZ,WAAK,YAAY,QAAQ;IAC3B;AACA,QAAI,UAAU;AACZ,WAAK,YAAY,QAAQ;IAC3B;AACA,QAAI,OAAO;AACT,WAAK,SAAS,KAAK;IACrB;AACA,QAAI,QAAQ;AACV,WAAK,aAAY;IACnB;AACA,WAAO;EACT;EAEA,eAAY;AACV,UAAM,MAAM,KAAK;AACjB,UAAM,MAAM,KAAK;AACjB,UAAM,QAAQ,KAAK;AAEnB,SAAK,OAAO,SAAQ;AACpB,SAAK,OAAO,UAAU,GAAG;AACzB,SAAK,OAAO,UAAU,GAAG;AACzB,SAAK,OAAO,MAAM,KAAK;AACvB,WAAO;EACT;EAEA,OAAO,UAAyD,CAAA,GAAE;AAChE,UAAM,EAAC,UAAU,UAAU,MAAK,IAAI;AACpC,QAAI,UAAU;AACZ,WAAK,YAAY,QAAQ;IAC3B;AACA,QAAI,UAAU;AACZ,WAAK,YAAY,QAAQ;IAC3B;AACA,QAAI,OAAO;AACT,WAAK,SAAS,KAAK;IACrB;AACA,SAAK,aAAY;AACjB,WAAO;EACT;EAEA,sBACE,YACA,aAAiB;AAYjB,kBAAc,eAAe,KAAK;AAClC,UAAM,cAAc,IAAI,sBAAQ,UAAU,EAAE,cAAc,WAAW;AACrE,UAAM,eAAe,YAAY,OAAM;AACvC,UAAM,wBAAwB,aAAa,UAAS;AAEpD,WAAO;MACL;MACA;MACA,cAAc;MACd;MACA,oBAAoB;MACpB,6BAA6B;;EAEjC;;;;;;;;;;;;;;;;;;;;;;;EAyBA,wBAAwB,OAA0B;AAKhD,QAAI,cAAc,OAAO;AACvB,WAAK,YAAY,MAAM,QAAQ;IACjC;AACA,QAAI,cAAc,OAAO;AACvB,WAAK,YAAY,MAAM,QAAQ;IACjC;AACA,QAAI,WAAW,OAAO;AACpB,WAAK,SAAS,MAAM,KAAK;IAC3B;AAGA,QAAI,YAAY,OAAO;AACrB,WAAK,UAAU,MAAM,MAAM;IAC7B;AAEA,WAAO,OAAO,KAAK,OAAO,KAAK;EACjC;;;;AC1MF,IAAAC,gBAA+B;AAC/B,IAAAA,gBAAkB;AAOZ,IAAO,YAAP,cAAyB,eAAc;EAC3C;EAKA,YAAY,QAA2C,CAAA,GAAE;AACvD,YAAQ,MAAM,QAAQ,KAAK,IAAI,EAAC,UAAU,MAAK,IAAI;AACnD,UAAM,EAAC,WAAW,CAAA,EAAE,IAAI;AACxB,sBAAI,OACF,SAAS,MAAM,WAAS,iBAAiB,cAAc,GACvD,gDAAgD;AAElD,UAAM,KAAK;AACX,SAAK,WAAW;EAClB;EAES,YAAS;AAChB,UAAM,SAA+B;MACnC,CAAC,UAAU,UAAU,QAAQ;MAC7B,CAAC,WAAW,WAAW,SAAS;;AAGlC,SAAK,SAAS,CAAC,MAAM,EAAC,YAAW,MAAK;AACpC,YAAM,SAAS,KAAK,UAAS;AAC7B,UAAI,CAAC,QAAQ;AACX;MACF;AACA,YAAM,CAAC,KAAK,GAAG,IAAI;AACnB,YAAM,SAAS,IAAI,sBAAQ,GAAG,EAAE,IAAI,GAAG,EAAE,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC;AACzD,kBAAY,iBAAiB,QAAQ,MAAM;AAC3C,YAAM,WAAW,IAAI,sBAAQ,GAAG,EAAE,SAAS,GAAG,EAAE,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC;AAChE,kBAAY,kBAAkB,UAAU,QAAQ;AAEhD,eAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAE1B,cAAM,WAAW,IAAI,sBAAQ,IAAI,IAAQ,KAAK,GAAG,IAAI,IAAQ,KAAK,GAAG,IAAI,IAAQ,KAAK,CAAC,EACpF,SAAS,QAAQ,EACjB,IAAI,MAAM;AAEb,iBAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,iBAAO,CAAC,EAAE,CAAC,IAAI,KAAK,IAAI,OAAO,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC;AACjD,iBAAO,CAAC,EAAE,CAAC,IAAI,KAAK,IAAI,OAAO,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC;QACnD;MACF;IACF,CAAC;AACD,QAAI,CAAC,OAAO,SAAS,OAAO,CAAC,EAAE,CAAC,CAAC,GAAG;AAClC,aAAO;IACT;AACA,WAAO;EACT;EAES,UAAO;AACd,SAAK,SAAS,QAAQ,WAAS,MAAM,QAAO,CAAE;AAC9C,SAAK,UAAS;AACd,UAAM,QAAO;EACf;;EAGA,OAAO,UAA+C;AACpD,eAAW,SAAS,UAAU;AAC5B,UAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,aAAK,IAAI,GAAG,KAAK;MACnB,OAAO;AACL,aAAK,SAAS,KAAK,KAAK;MAC1B;IACF;AACA,WAAO;EACT;EAEA,OAAO,OAAqB;AAC1B,UAAM,WAAW,KAAK;AACtB,UAAM,UAAU,SAAS,QAAQ,KAAK;AACtC,QAAI,UAAU,IAAI;AAChB,eAAS,OAAO,SAAS,CAAC;IAC5B;AACA,WAAO;EACT;EAEA,YAAS;AACP,SAAK,WAAW,CAAA;AAChB,WAAO;EACT;EAEA,SACE,SACA,EAAC,cAAc,IAAI,sBAAO,EAAE,IAAI,CAAA,GAAE;AAElC,UAAM,cAAc,IAAI,sBAAQ,WAAW,EAAE,cAAc,KAAK,MAAM;AAEtE,eAAW,SAAS,KAAK,UAAU;AACjC,UAAI,iBAAiB,WAAW;AAC9B,cAAM,SAAS,SAAS,EAAC,aAAa,YAAW,CAAC;MACpD,OAAO;AACL,gBAAQ,OAAO,EAAC,aAAa,YAAW,CAAC;MAC3C;IACF;EACF;;;;AC/FI,IAAO,YAAP,cAAyB,eAAc;EAClC;EACT,SAAsC;EACtC;;;;;EAOA,YAAY,OAAqB;AAC/B,UAAM,KAAK;AAGX,SAAK,QAAQ,MAAM;AACnB,SAAK,mBAAmB,MAAM,oBAAoB,CAAA;AAClD,SAAK,SAAS,MAAM,UAAU;AAC9B,SAAK,SAAS,KAAK;EACrB;EAES,UAAO;AACd,QAAI,KAAK,OAAO;AACd,WAAK,MAAM,QAAO;AAElB,WAAK,QAAQ;IACf;AACA,SAAK,iBAAiB,QAAQ,cAAY,SAAS,QAAO,CAAE;AAC5D,SAAK,mBAAmB,CAAA;EAC1B;EAES,YAAS;AAChB,WAAO,KAAK;EACd;;EAGA,KAAK,YAAsB;AAEzB,WAAO,KAAK,MAAM,KAAK,UAAU;EACnC;;;;AC7CF,IAAM,gBAAgB;EACpB,GAAG,CAAC,GAAG,GAAG,CAAC;EACX,GAAG,CAAC,GAAG,GAAG,CAAC;EACX,GAAG,CAAC,GAAG,GAAG,CAAC;;AAmBP,IAAO,wBAAP,cAAqC,SAAQ;EACjD,YAAY,QAAsE,CAAA,GAAE;AAClF,UAAM,EAAC,KAAK,IAAI,yBAAyB,EAAC,IAAI;AAC9C,UAAM,EAAC,SAAS,WAAU,IAAI,uBAAuB,KAAK;AAC1D,UAAM;MACJ,GAAG;MACH;MACA,UAAU;MACV;MACA,YAAY;QACV,UAAU,EAAC,MAAM,GAAG,OAAO,WAAW,SAAQ;QAC9C,QAAQ,EAAC,MAAM,GAAG,OAAO,WAAW,OAAM;QAC1C,YAAY,EAAC,MAAM,GAAG,OAAO,WAAW,WAAU;QAClD,GAAG,MAAM;;KAEZ;EACH;;AAIF,SAAS,uBAAuB,QAAoC,CAAA,GAAE;AACpE,QAAM,EACJ,eAAe,GACf,YAAY,GACZ,SAAS,GACT,UAAU,IACV,YAAY,IACZ,eAAe,KACf,SAAS,OACT,YAAY,MAAK,IACf;AAEJ,QAAM,SAAS,SAAS,IAAI,MAAM,YAAY,IAAI;AAClD,QAAM,eAAe,UAAU,MAAM,YAAY,IAAI;AAErD,QAAM,QAAQ,KAAK,MAAM,eAAe,WAAW,MAAM;AACzD,QAAM,OAAO,KAAK;AAClB,QAAM,OAAO,KAAK;AAClB,QAAM,MAAM,KAAK;AACjB,QAAM,WAAW,KAAK,KAAK;AAC3B,QAAM,WAAW,KAAK,KAAK;AAC3B,QAAM,QAAQ,SAAS,KAAK;AAC5B,QAAM,MAAM,aAAa,YAAY,IAAI;AACzC,QAAM,kBAAkB,UAAU;AAElC,QAAM,UAAU,IAAI,YAAY,WAAW,YAAY,SAAS,CAAC;AACjE,QAAM,cAAc,cAAc,YAAY;AAE9C,QAAM,YAAY,IAAI,aAAa,cAAc,CAAC;AAClD,QAAM,UAAU,IAAI,aAAa,cAAc,CAAC;AAChD,QAAM,YAAY,IAAI,aAAa,cAAc,CAAC;AAElD,MAAI,KAAK;AACT,MAAI,KAAK;AACT,WAAS,IAAI,OAAO,KAAK,KAAK,KAAK;AACjC,QAAI,IAAI,IAAI;AACZ,QAAI,IAAI,SAAS;AACjB,QAAI;AAEJ,QAAI,IAAI,GAAG;AACT,UAAI;AACJ,UAAI;AACJ,mBAAa;IACf,WAAW,IAAI,WAAW;AACxB,UAAI;AACJ,UAAI;AACJ,mBAAa;IACf,OAAO;AACL,mBAAa,gBAAgB,YAAY,iBAAiB,IAAI;IAChE;AACA,QAAI,MAAM,MAAM,MAAM,YAAY,GAAG;AACnC,mBAAa;AACb,UAAI;IACN;AACA,SAAK,SAAS;AACd,aAAS,IAAI,GAAG,IAAI,iBAAiB,KAAK;AACxC,YAAM,MAAM,KAAM,IAAI,MAAM,IAAK,OAAO;AACxC,YAAM,MAAM,KAAM,IAAI,MAAM,IAAK,OAAO;AAExC,gBAAU,KAAK,YAAY,CAAC,CAAC,IAAI,MAAM;AACvC,gBAAU,KAAK,YAAY,CAAC,CAAC,IAAI;AACjC,gBAAU,KAAK,YAAY,CAAC,CAAC,IAAI,MAAM;AAEvC,cAAQ,KAAK,YAAY,CAAC,CAAC,IAAI,IAAI,KAAK,IAAI,YAAY,IAAI,MAAM;AAClE,cAAQ,KAAK,YAAY,CAAC,CAAC,IAAI,IAAI,IAAI,KAAK,IAAI,YAAY,IAAI;AAChE,cAAQ,KAAK,YAAY,CAAC,CAAC,IAAI,IAAI,KAAK,IAAI,YAAY,IAAI,MAAM;AAElE,gBAAU,KAAK,CAAC,IAAI,IAAI;AACxB,gBAAU,KAAK,CAAC,IAAI;AAEpB,YAAM;AACN,YAAM;IACR;EACF;AAEA,WAAS,IAAI,GAAG,IAAI,YAAY,OAAO,KAAK;AAC1C,aAAS,IAAI,GAAG,IAAI,SAAS,KAAK;AAChC,YAAM,SAAS,IAAI,UAAU,KAAK;AAClC,cAAQ,QAAQ,CAAC,IAAI,mBAAmB,IAAI,KAAK,IAAI;AACrD,cAAQ,QAAQ,CAAC,IAAI,mBAAmB,IAAI,KAAK,IAAI;AACrD,cAAQ,QAAQ,CAAC,IAAI,mBAAmB,IAAI,KAAK,IAAI;AACrD,cAAQ,QAAQ,CAAC,IAAI,mBAAmB,IAAI,KAAK,IAAI;AACrD,cAAQ,QAAQ,CAAC,IAAI,mBAAmB,IAAI,KAAK,IAAI;AACrD,cAAQ,QAAQ,CAAC,IAAI,mBAAmB,IAAI,KAAK,IAAI;IACvD;EACF;AAEA,SAAO;IACL;IACA,YAAY;MACV,UAAU;MACV,QAAQ;MACR,YAAY;;;AAGlB;;;ACnIM,IAAO,eAAP,cAA4B,sBAAqB;EACrD,YAAY,QAA2B,CAAA,GAAE;AACvC,UAAM,EAAC,KAAK,IAAI,eAAe,GAAG,SAAS,GAAG,MAAM,KAAI,IAAI;AAC5D,UAAM;MACJ,GAAG;MACH;MACA,WAAW;MACX,QAAQ,QAAQ,GAAG;MACnB,WAAW,QAAQ,GAAG;MACtB,cAAc;KACf;EACH;;;;ACVI,IAAO,eAAP,cAA4B,SAAQ;EACxC,YAAY,QAA2B,CAAA,GAAE;AACvC,UAAM,EAAC,KAAK,IAAI,eAAe,GAAG,UAAU,KAAI,IAAI;AACpD,UACE,UACI;MACE,GAAG;MACH;MACA,UAAU;MACV,SAAS,EAAC,MAAM,GAAG,OAAO,aAAY;MACtC,YAAY,EAAC,GAAG,YAAY,GAAG,MAAM,WAAU;QAEjD;MACE,GAAG;MACH;MACA,UAAU;MACV,SAAS;MACT,YAAY,EAAC,GAAG,wBAAwB,GAAG,MAAM,WAAU;KAC5D;EAET;;AAIF,IAAM,eAAe,IAAI,YAAY;EACnC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAI;EAAG;EAAI;EAAI;EAAI;EAC7D;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;CAC7D;AAGD,IAAM,iBAAiB,IAAI,aAAa;EACtC;EAAK;EAAK;EAAG;EAAI;EAAK;EAAI;EAAI;EAAI;EAAI;EAAK;EAAI;EAC/C;EAAK;EAAK;EAAK;EAAK;EAAI;EAAK;EAAI;EAAI;EAAK;EAAI;EAAK;EACnD;EAAK;EAAI;EAAK;EAAK;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAC/C;EAAK;EAAK;EAAK;EAAI;EAAK;EAAK;EAAI;EAAK;EAAI;EAAK;EAAK;EACpD;EAAI;EAAK;EAAK;EAAI;EAAI;EAAK;EAAI;EAAI;EAAI;EAAI;EAAK;EAChD;EAAK;EAAK;EAAK;EAAK;EAAK;EAAI;EAAK;EAAI;EAAI;EAAK;EAAI;CACpD;AAID,IAAM,eAAe,IAAI,aAAa;;EAEpC;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;;EAE5C;EAAI;EAAI;EAAK;EAAI;EAAI;EAAK;EAAI;EAAI;EAAK;EAAI;EAAI;;EAE/C;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;;EAE5C;EAAI;EAAK;EAAI;EAAI;EAAK;EAAI;EAAI;EAAK;EAAI;EAAI;EAAK;;EAEhD;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;;EAE5C;EAAK;EAAI;EAAI;EAAK;EAAI;EAAI;EAAK;EAAI;EAAI;EAAK;EAAI;CACjD;AAGD,IAAM,kBAAkB,IAAI,aAAa;;EAEvC;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;;EAE5B;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;;EAE5B;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;;EAE5B;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;;EAE5B;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;;EAE5B;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;CAC7B;AAIM,IAAM,6BAA6B,IAAI,aAAa;EACzD;EAAG;EAAI;EACP;EAAI;EAAI;EACR;EAAI;EAAI;EACR;EAAG;EAAI;EACP;EAAG;EAAI;EACP;EAAI;EAAI;EAER;EAAG;EAAG;EACN;EAAG;EAAI;EACP;EAAG;EAAI;EACP;EAAG;EAAG;EACN;EAAG;EAAG;EACN;EAAG;EAAI;EAEP;EAAI;EAAG;EACP;EAAG;EAAG;EACN;EAAG;EAAG;EACN;EAAI;EAAG;EACP;EAAI;EAAG;EACP;EAAG;EAAG;EAEN;EAAI;EAAI;EACR;EAAI;EAAG;EACP;EAAI;EAAG;EACP;EAAI;EAAI;EACR;EAAI;EAAI;EACR;EAAI;EAAG;EAEP;EAAG;EAAG;EACN;EAAI;EAAG;EACP;EAAI;EAAI;EACR;EAAI;EAAI;EACR;EAAG;EAAI;EACP;EAAG;EAAG;EAEN;EAAG;EAAI;EACP;EAAI;EAAI;EACR;EAAI;EAAG;EACP;EAAG;EAAG;EACN;EAAG;EAAI;EACP;EAAI;EAAG;CACR;AAIM,IAAM,8BAA8B,IAAI,aAAa;EAC1D;EAAG;EACH;EAAG;EACH;EAAG;EACH;EAAG;EACH;EAAG;EACH;EAAG;EAEH;EAAG;EACH;EAAG;EACH;EAAG;EACH;EAAG;EACH;EAAG;EACH;EAAG;EAEH;EAAG;EACH;EAAG;EACH;EAAG;EACH;EAAG;EACH;EAAG;EACH;EAAG;EAEH;EAAG;EACH;EAAG;EACH;EAAG;EACH;EAAG;EACH;EAAG;EACH;EAAG;EAEH;EAAG;EACH;EAAG;EACH;EAAG;EACH;EAAG;EACH;EAAG;EACH;EAAG;EAEH;EAAG;EACH;EAAG;EACH;EAAG;EACH;EAAG;EACH;EAAG;EACH;EAAG;CACJ;AAIM,IAAM,0BAA0B,IAAI,aAAa;EACtD;EAAG;EAAG;EAAG;EACT;EAAG;EAAG;EAAG;EACT;EAAG;EAAG;EAAG;EACT;EAAG;EAAG;EAAG;EACT;EAAG;EAAG;EAAG;EACT;EAAG;EAAG;EAAG;EAET;EAAG;EAAG;EAAG;EACT;EAAG;EAAG;EAAG;EACT;EAAG;EAAG;EAAG;EACT;EAAG;EAAG;EAAG;EACT;EAAG;EAAG;EAAG;EACT;EAAG;EAAG;EAAG;EAET;EAAG;EAAG;EAAG;EACT;EAAG;EAAG;EAAG;EACT;EAAG;EAAG;EAAG;EACT;EAAG;EAAG;EAAG;EACT;EAAG;EAAG;EAAG;EACT;EAAG;EAAG;EAAG;EAET;EAAG;EAAG;EAAG;EACT;EAAG;EAAG;EAAG;EACT;EAAG;EAAG;EAAG;EACT;EAAG;EAAG;EAAG;EACT;EAAG;EAAG;EAAG;EACT;EAAG;EAAG;EAAG;EAET;EAAG;EAAG;EAAG;EACT;EAAG;EAAG;EAAG;EACT;EAAG;EAAG;EAAG;EACT;EAAG;EAAG;EAAG;EACT;EAAG;EAAG;EAAG;EACT;EAAG;EAAG;EAAG;EAET;EAAG;EAAG;EAAG;EACT;EAAG;EAAG;EAAG;EACT;EAAG;EAAG;EAAG;EACT;EAAG;EAAG;EAAG;EACT;EAAG;EAAG;EAAG;EACT;EAAG;EAAG;EAAG;CACV;AAED,IAAM,aAAa;EACjB,UAAU,EAAC,MAAM,GAAG,OAAO,eAAc;EACzC,QAAQ,EAAC,MAAM,GAAG,OAAO,aAAY;EACrC,YAAY,EAAC,MAAM,GAAG,OAAO,gBAAe;;AAG9C,IAAM,yBAAyB;EAC7B,UAAU,EAAC,MAAM,GAAG,OAAO,2BAA0B;;EAErD,YAAY,EAAC,MAAM,GAAG,OAAO,4BAA2B;EACxD,SAAS,EAAC,MAAM,GAAG,OAAO,wBAAuB;;;;AC7N7C,IAAO,mBAAP,cAAgC,sBAAqB;EACzD,YAAY,QAA+B,CAAA,GAAE;AAC3C,UAAM,EAAC,KAAK,IAAI,mBAAmB,GAAG,SAAS,EAAC,IAAI;AACpD,UAAM;MACJ,GAAG;MACH;MACA,cAAc;MACd,WAAW;KACZ;EACH;;;;AClBF,IAAAC,gBAAsB;AAMtB,IAAM,gBAAgB,CAAC,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,CAAC;AAC9E,IAAM,cAAc,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AASrF,IAAO,oBAAP,cAAiC,SAAQ;EAC7C,YAAY,QAAgC,CAAA,GAAE;AAC5C,UAAM,EAAC,KAAK,IAAI,qBAAqB,EAAC,IAAI;AAC1C,UAAM,EAAC,SAAS,WAAU,IAAI,qBAAqB,KAAK;AACxD,UAAM;MACJ,GAAG;MACH;MACA,UAAU;MACV;MACA,YAAY,EAAC,GAAG,YAAY,GAAG,MAAM,WAAU;KAChD;EACH;;AAGF,SAAS,qBAAqB,OAA6B;AACzD,QAAM,EAAC,aAAa,EAAC,IAAI;AAEzB,QAAM,KAAK,KAAK;AAChB,QAAM,MAAM,KAAK;AAEjB,QAAM,YAAY,CAAC,GAAG,aAAa;AACnC,MAAI,UAAU,CAAC,GAAG,WAAW;AAE7B,YAAU,KAAI;AACd,UAAQ,KAAI;AAEZ,QAAM,kBAAkB,MAAK;AAC3B,UAAM,YAAoC,CAAA;AAE1C,WAAO,CAAC,IAAY,OAAc;AAChC,YAAM;AACN,YAAM;AACN,YAAM,OAAO,KAAK,KAAK,KAAK;AAC5B,YAAM,OAAO,KAAK,KAAK,KAAK;AAC5B,YAAM,MAAM,GAAG,QAAQ;AAEvB,UAAI,OAAO,WAAW;AACpB,eAAO,UAAU,GAAG;MACtB;AAEA,YAAM,KAAK,UAAU,EAAE;AACvB,YAAM,KAAK,UAAU,KAAK,CAAC;AAC3B,YAAM,KAAK,UAAU,KAAK,CAAC;AAC3B,YAAM,KAAK,UAAU,EAAE;AACvB,YAAM,KAAK,UAAU,KAAK,CAAC;AAC3B,YAAM,KAAK,UAAU,KAAK,CAAC;AAC3B,UAAI,MAAM,KAAK,MAAM;AACrB,UAAI,MAAM,KAAK,MAAM;AACrB,UAAI,MAAM,KAAK,MAAM;AACrB,YAAM,MAAM,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,EAAE;AAEjD,YAAM;AACN,YAAM;AACN,YAAM;AAEN,gBAAU,KAAK,IAAI,IAAI,EAAE;AAEzB,aAAQ,UAAU,GAAG,IAAI,UAAU,SAAS,IAAI;IAClD;EACF,GAAE;AAEF,WAAS,IAAI,GAAG,IAAI,YAAY,KAAK;AACnC,UAAM,WAAqB,CAAA;AAC3B,aAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK,GAAG;AAC1C,YAAM,IAAI,eAAe,QAAQ,IAAI,CAAC,GAAG,QAAQ,IAAI,CAAC,CAAC;AACvD,YAAM,IAAI,eAAe,QAAQ,IAAI,CAAC,GAAG,QAAQ,IAAI,CAAC,CAAC;AACvD,YAAM,IAAI,eAAe,QAAQ,IAAI,CAAC,GAAG,QAAQ,IAAI,CAAC,CAAC;AAEvD,eAAS,KAAK,GAAG,QAAQ,IAAI,CAAC,GAAG,GAAG,GAAG,QAAQ,IAAI,CAAC,GAAG,GAAG,GAAG,QAAQ,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC;IACzF;AACA,cAAU;EACZ;AAGA,QAAM,UAAU,IAAI,MAAM,UAAU,MAAM;AAC1C,QAAM,YAAY,IAAI,MAAO,UAAU,SAAS,IAAK,CAAC;AAEtD,QAAM,IAAI,QAAQ;AAClB,WAAS,IAAI,IAAI,GAAG,KAAK,GAAG,KAAK,GAAG;AAClC,UAAM,KAAK,QAAQ,IAAI,CAAC;AACxB,UAAM,KAAK,QAAQ,IAAI,CAAC;AACxB,UAAM,KAAK,QAAQ,IAAI,CAAC;AACxB,UAAM,MAAM,KAAK;AACjB,UAAM,MAAM,KAAK;AACjB,UAAM,MAAM,KAAK;AACjB,UAAM,MAAM,KAAK;AACjB,UAAM,MAAM,KAAK;AACjB,UAAM,MAAM,KAAK;AACjB,UAAM,KAAK,UAAU,MAAM,CAAC;AAC5B,UAAM,KAAK,UAAU,MAAM,CAAC;AAC5B,UAAM,KAAK,UAAU,MAAM,CAAC;AAC5B,UAAM,SAAS,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,EAAE,CAAC;AACpE,UAAM,OAAO,KAAK,MAAM,IAAI,EAAE,IAAI;AAClC,UAAM,KAAK,SAAS;AACpB,UAAM,KAAK,IAAI,OAAO;AACtB,UAAM,KAAK,UAAU,MAAM,CAAC;AAC5B,UAAM,KAAK,UAAU,MAAM,CAAC;AAC5B,UAAM,KAAK,UAAU,MAAM,CAAC;AAC5B,UAAM,SAAS,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,EAAE,CAAC;AACpE,UAAM,OAAO,KAAK,MAAM,IAAI,EAAE,IAAI;AAClC,UAAM,KAAK,SAAS;AACpB,UAAM,KAAK,IAAI,OAAO;AACtB,UAAM,KAAK,UAAU,MAAM,CAAC;AAC5B,UAAM,KAAK,UAAU,MAAM,CAAC;AAC5B,UAAM,KAAK,UAAU,MAAM,CAAC;AAC5B,UAAM,SAAS,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,EAAE,CAAC;AACpE,UAAM,OAAO,KAAK,MAAM,IAAI,EAAE,IAAI;AAClC,UAAM,KAAK,SAAS;AACpB,UAAM,KAAK,IAAI,OAAO;AACtB,UAAM,OAAO,CAAC,KAAK,IAAI,KAAK,IAAI,KAAK,EAAE;AACvC,UAAM,OAAO,CAAC,KAAK,IAAI,KAAK,IAAI,KAAK,EAAE;AACvC,UAAM,SAAS,IAAI,sBAAQ,IAAI,EAAE,MAAM,IAAI,EAAE,UAAS;AACtD,QAAI;AAEJ,SACG,OAAO,KAAK,OAAO,KAAK,OAAO,OAC/B,OAAO,KAAK,KAAK,SACjB,OAAO,KAAK,KAAK,SACjB,OAAO,KAAK,KAAK,MAClB;AACA,gBAAU,KAAK,UAAU,MAAM,CAAC,GAAG,UAAU,MAAM,CAAC,GAAG,UAAU,MAAM,CAAC,CAAC;AACzE,iBAAW,UAAU,SAAS,IAAI;AAClC,cAAQ,KAAK,QAAQ;AACrB,gBAAU,WAAW,IAAI,CAAC,IAAI;AAC9B,gBAAU,WAAW,IAAI,CAAC,IAAI;AAC9B,cAAQ,WAAW,IAAI,CAAC,IAAI,OAAO;AACnC,cAAQ,WAAW,IAAI,CAAC,IAAI,OAAO;AACnC,cAAQ,WAAW,IAAI,CAAC,IAAI,OAAO;AAEnC,gBAAU,KAAK,UAAU,MAAM,CAAC,GAAG,UAAU,MAAM,CAAC,GAAG,UAAU,MAAM,CAAC,CAAC;AACzE,iBAAW,UAAU,SAAS,IAAI;AAClC,cAAQ,KAAK,QAAQ;AACrB,gBAAU,WAAW,IAAI,CAAC,IAAI;AAC9B,gBAAU,WAAW,IAAI,CAAC,IAAI;AAC9B,cAAQ,WAAW,IAAI,CAAC,IAAI,OAAO;AACnC,cAAQ,WAAW,IAAI,CAAC,IAAI,OAAO;AACnC,cAAQ,WAAW,IAAI,CAAC,IAAI,OAAO;AAEnC,gBAAU,KAAK,UAAU,MAAM,CAAC,GAAG,UAAU,MAAM,CAAC,GAAG,UAAU,MAAM,CAAC,CAAC;AACzE,iBAAW,UAAU,SAAS,IAAI;AAClC,cAAQ,KAAK,QAAQ;AACrB,gBAAU,WAAW,IAAI,CAAC,IAAI;AAC9B,gBAAU,WAAW,IAAI,CAAC,IAAI;AAC9B,cAAQ,WAAW,IAAI,CAAC,IAAI,OAAO;AACnC,cAAQ,WAAW,IAAI,CAAC,IAAI,OAAO;AACnC,cAAQ,WAAW,IAAI,CAAC,IAAI,OAAO;IACrC;AAEA,YAAQ,MAAM,CAAC,IAAI,QAAQ,MAAM,CAAC,IAAI,QAAQ,MAAM,CAAC,IAAI,OAAO;AAChE,YAAQ,MAAM,CAAC,IAAI,QAAQ,MAAM,CAAC,IAAI,QAAQ,MAAM,CAAC,IAAI,OAAO;AAChE,YAAQ,MAAM,CAAC,IAAI,QAAQ,MAAM,CAAC,IAAI,QAAQ,MAAM,CAAC,IAAI,OAAO;AAEhE,cAAU,MAAM,CAAC,IAAI;AACrB,cAAU,MAAM,CAAC,IAAI;AAErB,cAAU,MAAM,CAAC,IAAI;AACrB,cAAU,MAAM,CAAC,IAAI;AAErB,cAAU,MAAM,CAAC,IAAI;AACrB,cAAU,MAAM,CAAC,IAAI;EACvB;AAEA,SAAO;IACL,SAAS,EAAC,MAAM,GAAG,OAAO,IAAI,YAAY,OAAO,EAAC;IAClD,YAAY;MACV,UAAU,EAAC,MAAM,GAAG,OAAO,IAAI,aAAa,SAAS,EAAC;MACtD,QAAQ,EAAC,MAAM,GAAG,OAAO,IAAI,aAAa,OAAO,EAAC;MAClD,YAAY,EAAC,MAAM,GAAG,OAAO,IAAI,aAAa,SAAS,EAAC;;;AAG9D;;;AC1LM,SAAU,sBAAsB,UAAa;AACjD,QAAM,EAAC,SAAS,WAAU,IAAI;AAC9B,MAAI,CAAC,SAAS;AACZ,WAAO;EACT;AAEA,QAAM,cAAc,QAAQ,MAAM;AAClC,QAAM,qBAA0C,CAAA;AAEhD,aAAW,iBAAiB,YAAY;AACtC,UAAM,YAAY,WAAW,aAAa;AAC1C,UAAM,EAAC,UAAU,OAAO,KAAI,IAAI;AAChC,QAAI,YAAY,CAAC,MAAM;AACrB;IACF;AACA,UAAM,gBAAgB,IAAI,MAAM,YAAY,cAAc,IAAI;AAC9D,aAAS,IAAI,GAAG,IAAI,aAAa,EAAE,GAAG;AACpC,YAAM,QAAQ,QAAQ,MAAM,CAAC;AAC7B,eAAS,IAAI,GAAG,IAAI,MAAM,KAAK;AAC7B,sBAAc,IAAI,OAAO,CAAC,IAAI,MAAM,QAAQ,OAAO,CAAC;MACtD;IACF;AACA,uBAAmB,aAAa,IAAI,EAAC,MAAM,OAAO,cAAa;EACjE;AAEA,SAAO;IACL,YAAY,OAAO,OAAO,CAAA,GAAI,YAAY,kBAAkB;;AAEhE;;;ACfM,IAAO,gBAAP,cAA6B,SAAQ;EACzC,YAAY,QAA4B,CAAA,GAAE;AACxC,UAAM,EAAC,KAAK,IAAI,gBAAgB,EAAC,IAAI;AAErC,UAAM,EAAC,SAAS,WAAU,IAAI,eAAe,KAAK;AAClD,UAAM;MACJ,GAAG;MACH;MACA,UAAU;MACV;MACA,YAAY,EAAC,GAAG,YAAY,GAAG,MAAM,WAAU;KAChD;EACH;;AAIF,SAAS,eAAe,OAAU;AAChC,QAAM,EAAC,OAAO,OAAO,SAAS,GAAG,WAAW,OAAO,SAAS,MAAK,IAAI;AAErE,QAAM,SAAS,KAAK,MAAM,GAAG;AAE7B,MAAI,QAAQ,MAAM,GAAG,OAAO,CAAC,MAAM,KAAK;AACxC,QAAM,QAAQ,MAAM,GAAG,OAAO,CAAC,MAAM,KAAK;AAE1C,QAAM,gBAAgB,MAAM,IAAI,OAAO,CAAC,GAAG,KAAK;AAChD,QAAM,gBAAgB,MAAM,IAAI,OAAO,CAAC,GAAG,KAAK;AAChD,QAAM,eAAe,gBAAgB,MAAM,gBAAgB;AAE3D,QAAM,YAAY,IAAI,aAAa,cAAc,CAAC;AAClD,QAAM,UAAU,IAAI,aAAa,cAAc,CAAC;AAChD,QAAM,YAAY,IAAI,aAAa,cAAc,CAAC;AAElD,MAAI,UAAU;AACZ,YAAQ,CAAC;EACX;AAEA,MAAI,KAAK;AACT,MAAI,KAAK;AACT,WAAS,IAAI,GAAG,KAAK,eAAe,KAAK;AACvC,aAAS,IAAI,GAAG,KAAK,eAAe,KAAK;AACvC,YAAM,IAAI,IAAI;AACd,YAAM,IAAI,IAAI;AACd,gBAAU,KAAK,CAAC,IAAI,WAAW,IAAI,IAAI;AACvC,gBAAU,KAAK,CAAC,IAAI;AAEpB,cAAQ,MAAM;QACZ,KAAK;AACH,oBAAU,KAAK,CAAC,IAAI,QAAQ,IAAI,QAAQ;AACxC,oBAAU,KAAK,CAAC,IAAI,QAAQ,IAAI,QAAQ;AACxC,oBAAU,KAAK,CAAC,IAAI;AAEpB,kBAAQ,KAAK,CAAC,IAAI;AAClB,kBAAQ,KAAK,CAAC,IAAI;AAClB,kBAAQ,KAAK,CAAC,IAAI,WAAW,IAAI;AACjC;QAEF,KAAK;AACH,oBAAU,KAAK,CAAC,IAAI,QAAQ,IAAI,QAAQ;AACxC,oBAAU,KAAK,CAAC,IAAI;AACpB,oBAAU,KAAK,CAAC,IAAI,QAAQ,IAAI,QAAQ;AAExC,kBAAQ,KAAK,CAAC,IAAI;AAClB,kBAAQ,KAAK,CAAC,IAAI,WAAW,IAAI;AACjC,kBAAQ,KAAK,CAAC,IAAI;AAClB;QAEF,KAAK;AACH,oBAAU,KAAK,CAAC,IAAI;AACpB,oBAAU,KAAK,CAAC,IAAI,QAAQ,IAAI,QAAQ;AACxC,oBAAU,KAAK,CAAC,IAAI,QAAQ,IAAI,QAAQ;AAExC,kBAAQ,KAAK,CAAC,IAAI,WAAW,IAAI;AACjC,kBAAQ,KAAK,CAAC,IAAI;AAClB,kBAAQ,KAAK,CAAC,IAAI;AAClB;QAEF;AACE,gBAAM,IAAI,MAAM,6BAA6B;MACjD;AAEA,YAAM;AACN,YAAM;IACR;EACF;AAEA,QAAM,iBAAiB,gBAAgB;AACvC,QAAM,UAAU,IAAI,YAAY,gBAAgB,gBAAgB,CAAC;AAEjE,WAAS,IAAI,GAAG,IAAI,eAAe,KAAK;AACtC,aAAS,IAAI,GAAG,IAAI,eAAe,KAAK;AACtC,YAAM,SAAS,IAAI,gBAAgB,KAAK;AAExC,cAAQ,QAAQ,CAAC,KAAK,IAAI,KAAK,iBAAiB;AAChD,cAAQ,QAAQ,CAAC,KAAK,IAAI,KAAK,iBAAiB;AAChD,cAAQ,QAAQ,CAAC,KAAK,IAAI,KAAK,iBAAiB,IAAI;AAGpD,cAAQ,QAAQ,CAAC,KAAK,IAAI,KAAK,iBAAiB;AAChD,cAAQ,QAAQ,CAAC,KAAK,IAAI,KAAK,iBAAiB,IAAI;AACpD,cAAQ,QAAQ,CAAC,KAAK,IAAI,KAAK,iBAAiB,IAAI;IACtD;EACF;AAEA,QAAM,WAAW;IACf,SAAS,EAAC,MAAM,GAAG,OAAO,QAAO;IACjC,YAAY;MACV,UAAU,EAAC,MAAM,GAAG,OAAO,UAAS;MACpC,QAAQ,EAAC,MAAM,GAAG,OAAO,QAAO;MAChC,YAAY,EAAC,MAAM,GAAG,OAAO,UAAS;;;AAK1C,SAAO,SAAS,sBAAsB,QAAQ,IAAI;AACpD;;;ACjHM,IAAO,iBAAP,cAA8B,SAAQ;EAC1C,YAAY,QAA6B,CAAA,GAAE;AACzC,UAAM,EAAC,KAAK,IAAI,iBAAiB,EAAC,IAAI;AACtC,UAAM,EAAC,SAAS,WAAU,IAAI,gBAAgB,KAAK;AACnD,UAAM;MACJ,GAAG;MACH;MACA,UAAU;MACV;MACA,YAAY,EAAC,GAAG,YAAY,GAAG,MAAM,WAAU;KAChD;EACH;;AAIF,SAAS,gBAAgB,OAA0B;AACjD,QAAM,EAAC,OAAO,IAAI,QAAQ,GAAE,IAAI;AAEhC,QAAM,WAAW;AACjB,QAAM,SAAS,KAAK;AACpB,QAAM,WAAW,SAAS;AAC1B,QAAM,YAAY;AAClB,QAAM,UAAU,IAAI,KAAK;AACzB,QAAM,YAAY,UAAU;AAC5B,QAAM,eAAe,OAAO,MAAM,QAAQ;AAE1C,QAAM,SAAS,CAAC,IAAY,IAAY,IAAY,GAAW,MAAc,MAAM,UAAU;AAE7F,QAAM,YAAY,IAAI,aAAa,cAAc,CAAC;AAClD,QAAM,UAAU,IAAI,aAAa,cAAc,CAAC;AAChD,QAAM,YAAY,IAAI,aAAa,cAAc,CAAC;AAElD,QAAM,YAAY,cAAc,QAAS,cAAc;AACvD,QAAM,UAAU,IAAI,UAAU,OAAO,QAAQ,CAAC;AAG9C,WAAS,IAAI,GAAG,KAAK,MAAM,KAAK;AAC9B,aAAS,IAAI,GAAG,KAAK,OAAO,KAAK;AAC/B,YAAM,IAAI,IAAI;AACd,YAAM,IAAI,IAAI;AAEd,YAAM,QAAQ,IAAI,KAAK,QAAQ;AAC/B,YAAM,KAAK,QAAQ;AACnB,YAAM,KAAK,QAAQ;AAEnB,YAAM,QAAQ,YAAY;AAC1B,YAAM,MAAM,WAAW;AACvB,YAAM,WAAW,KAAK,IAAI,KAAK;AAC/B,YAAM,WAAW,KAAK,IAAI,KAAK;AAC/B,YAAM,SAAS,KAAK,IAAI,GAAG;AAC3B,YAAM,SAAS,KAAK,IAAI,GAAG;AAC3B,YAAM,KAAK,WAAW;AACtB,YAAM,KAAK;AACX,YAAM,KAAK,WAAW;AAEtB,YAAM,IAAI,OAAO,IAAI,IAAI,IAAI,GAAG,CAAC;AAEjC,gBAAU,KAAK,CAAC,IAAI,IAAI;AACxB,gBAAU,KAAK,CAAC,IAAI,IAAI;AACxB,gBAAU,KAAK,CAAC,IAAI,IAAI;AAExB,cAAQ,KAAK,CAAC,IAAI;AAClB,cAAQ,KAAK,CAAC,IAAI;AAClB,cAAQ,KAAK,CAAC,IAAI;AAElB,gBAAU,KAAK,CAAC,IAAI;AACpB,gBAAU,KAAK,CAAC,IAAI,IAAI;IAC1B;EACF;AAGA,QAAM,iBAAiB,QAAQ;AAC/B,WAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC9B,aAAS,IAAI,GAAG,IAAI,MAAM,KAAK;AAC7B,YAAM,SAAS,IAAI,OAAO,KAAK;AAE/B,cAAQ,QAAQ,CAAC,IAAI,IAAI,iBAAiB;AAC1C,cAAQ,QAAQ,CAAC,IAAI,IAAI,iBAAiB,IAAI;AAC9C,cAAQ,QAAQ,CAAC,KAAK,IAAI,KAAK,iBAAiB;AAEhD,cAAQ,QAAQ,CAAC,KAAK,IAAI,KAAK,iBAAiB;AAChD,cAAQ,QAAQ,CAAC,IAAI,IAAI,iBAAiB,IAAI;AAC9C,cAAQ,QAAQ,CAAC,KAAK,IAAI,KAAK,iBAAiB,IAAI;IACtD;EACF;AAEA,SAAO;IACL,SAAS,EAAC,MAAM,GAAG,OAAO,QAAO;IACjC,YAAY;MACV,UAAU,EAAC,MAAM,GAAG,OAAO,UAAS;MACpC,QAAQ,EAAC,MAAM,GAAG,OAAO,QAAO;MAChC,YAAY,EAAC,MAAM,GAAG,OAAO,UAAS;;;AAG5C;;;AC3GM,SAAU,sBAAmB;AACjC,MAAI,IAAI;AACR,MAAI,IAAI;AACR,SAAO,MAAK;AACV,QAAI,KAAK,IAAI,IAAI,KAAK;AACtB,QAAI,KAAK,IAAI,IAAI,KAAK;AACtB,WAAO,MAAM,KAAK,IAAI,IAAI,CAAC,IAAI,OAAO;EACxC;AACF;AAEA,SAAS,MAAM,GAAS;AACtB,SAAO,IAAI,KAAK,MAAM,CAAC;AACzB;;;ACXA,IAAAC,sBAAqC;;;ACDrC,IAAAC,gBAA6D;AAQvD,IAAO,OAAP,MAAW;;EAEf;;EAEA;EAEA,YAAY,OAA4B;AACtC,SAAK,UAAU,MAAM;AACrB,SAAK,OAAO,MAAM;EACpB;;EAGA,UAAO;AAzBT;AA0BI,eAAK,YAAL,mBAAc;AACd,eAAK,SAAL,mBAAW;EACb;;EAGA,OAAI;AACF,UAAM,UAAU,KAAK;AACrB,SAAK,UAAU,KAAK;AACpB,SAAK,OAAO;EACd;;AAII,IAAO,mBAAP,cAAgC,KAAiB;EACrD,YAAY,QAAgB,OAAuB;AAxCrD;AAyCI,YAAQ,EAAC,GAAG,MAAK;AAEjB,QAAI,oBAAmB,WAAM,qBAAN,mBAAwB,IAAI,qBACjD,OAAO,oBAAoB,WACvB,kBACA,OAAO,cAAc;MACnB,QAAQ;MACR,OAAO,sBAAQ,SAAS,sBAAQ,SAAS,sBAAQ,WAAW,sBAAQ;MACpE,OAAO;MACP,QAAQ;KACT;AAGP,UAAM,UAAU,OAAO,kBAAkB,EAAC,GAAG,OAAO,iBAAgB,CAAC;AAErE,wBAAmB,WAAM,qBAAN,mBAAwB,IAAI,qBAC7C,OAAO,oBAAoB,WACvB,kBACA,OAAO,cAAc;MACnB,QAAQ;MACR,OACE,sBAAQ,UAAU,sBAAQ,WAAW,sBAAQ,WAAW,sBAAQ;MAClE,OAAO;MACP,QAAQ;KACT;AAGP,UAAM,OAAO,OAAO,kBAAkB,EAAC,GAAG,OAAO,iBAAgB,CAAC;AAElE,UAAM,EAAC,SAAS,KAAI,CAAC;EACvB;;;;;;EAOA,OAAO,MAAqC;AAC1C,QAAI,KAAK,UAAU,KAAK,QAAQ,SAAS,KAAK,WAAW,KAAK,QAAQ,QAAQ;AAC5E,aAAO;IACT;AACA,UAAM,EAAC,SAAS,KAAI,IAAI;AAExB,SAAK,UAAU,QAAQ,MAAM,IAAI;AACjC,YAAQ,QAAO;AAEf,SAAK,OAAO,KAAK,MAAM,IAAI;AAC3B,SAAK,QAAO;AAEZ,WAAO;EACT;;AAII,IAAO,cAAP,cAA2B,KAAY;EAC3C,YAAY,QAAgB,OAAkB;AAC5C,UAAM,EAAC,SAAS,OAAO,aAAa,KAAK,GAAG,MAAM,OAAO,aAAa,KAAK,EAAC,CAAC;EAC/E;;;;;;EAOA,OAAO,OAA2B;AAChC,QAAI,MAAM,eAAe,KAAK,QAAQ,YAAY;AAChD,aAAO;IACT;AAEA,UAAM,EAAC,SAAS,KAAI,IAAI;AAExB,SAAK,UAAU,QAAQ,MAAM,KAAK;AAClC,YAAQ,QAAO;AAEf,SAAK,OAAO,KAAK,MAAM,KAAK;AAC5B,SAAK,QAAO;AAEZ,WAAO;EACT;;;;AC5GI,SAAU,+BAA+B,SAI9C;AACC,QAAM,EAAC,YAAY,QAAQ,gBAAe,IAAI;AAC9C,UAAQ,QAAQ;IACd,KAAK;AACH,YAAM,aAAa,GAAG,WAAW;AACjC,aAAO,oBAAoB,SACvB,oBAAoB,UAAU,IAC9B,oBAAoB,UAAU;IAEpC,KAAK;AACH,YAAM,cAAc,GAAG,WAAW;AAClC,aAAO,oBAAoB,SACvB,qBAAqB,WAAW,IAChC,qBAAqB,WAAW;IAEtC;AACE,YAAM,IAAI,MAAM,GAAG,WAAW,mDAAmD;EACrF;AACF;AAGA,SAAS,oBAAoB,MAAY;AACvC;;IAAkB;;;;;;;;;;;;;;;gBAgBJ;;;;;AAIhB;AAGA,SAAS,qBAAqB,MAAY;AACxC;;IAAkB;;;;;;;;;;;;;;;gBAgBJ;;;;;AAIhB;AAGA,SAAS,oBAAoB,MAAY;AACvC;;IAAkB;;;;;;;;;;;;;;;;gBAiBJ;;;;AAGhB;AAGA,SAAS,qBAAqB,MAAY;AACxC;;IAAkB;;;;;;;;;;;;;;;gBAgBJ;;;;AAGhB;;;AFtGM,IAAO,qBAAP,MAAyB;EAC7B;EACA;EACA;EACA;;EAEA;EACA;EAEA,YAAY,QAAgB,OAA8B;AACxD,SAAK,SAAS;AAEd,UAAM,aAAa,IAAI,oBAAc,4CAAuB,UAAU,CAAC;AAEvE,UAAM,UAAU,MAAM,aAAa,OACjC,CAAC,QAAQ,gBAAgB,EAAC,GAAG,QAAQ,CAAC,WAAW,IAAI,GAAG,WAAU,IAClE,CAAA,CAAE;AAEJ,SAAK,eAAe,MAAM,gBAAgB,IAAI,aAAa,OAAO;AAElE,UAAM,OAAO,OAAO,iBAAgB,EAAG,qBAAoB;AAC3D,SAAK,mBAAmB,IAAI,iBAAiB,QAAQ;MACnD,kBAAkB,CAAC,OAAO,oBAAoB;MAC9C,OAAO,KAAK,CAAC;MACb,QAAQ,KAAK,CAAC;KACf;AAED,SAAK,eAAe,IAAI,uBAAuB,QAAQ;MACrD,mBAAmB,KAAK,iBAAiB,QAAQ,iBAAiB,CAAC,EAAE;KACtE;AAED,SAAK,YAAY,IAAI,UAAU,QAAQ;MACrC;;QAAmB;;;;;;;;;;MAWnB;;QAAe;;;;;;;;;;;;;KAahB;AAED,SAAK,gBAAgB,MAAM,aAAa,IAAI,gBAAc,IAAI,aAAa,QAAQ,UAAU,CAAC;EAChG;;EAGA,UAAO;AACL,eAAW,mBAAmB,KAAK,eAAe;AAChD,sBAAgB,QAAO;IACzB;AACA,SAAK,iBAAiB,QAAO;AAC7B,SAAK,UAAU,QAAO;EACxB;EAEA,OAAO,OAAe,QAAc;AAClC,SAAK,iBAAiB,OAAO,EAAC,OAAO,OAAM,CAAC;EAE9C;EAEA,eAAe,SAAsE;AAEnF,UAAM,gBAAgB,KAAK,gBAAgB,OAAO;AAClD,QAAI,CAAC,eAAe;AAElB,aAAO;IACT;AAEA,UAAM,cAAc,KAAK,OACtB,wBAAuB,EAEvB,sBAAsB,EAAC,wBAAwB,MAAK,CAAC;AACxD,UAAM,aAAa,KAAK,OAAO,gBAAgB;MAC7C,IAAI;MACJ;MACA,YAAY,CAAC,GAAG,GAAG,GAAG,CAAC;MACvB,YAAY;KACb;AACD,SAAK,UAAU,YAAY,EAAC,eAAe,cAAa,CAAC;AACzD,SAAK,UAAU,KAAK,UAAU;AAC9B,eAAW,IAAG;AACd,WAAO;EACT;;;;EAKA,gBAAgB,SAIf;AACC,UAAM,EAAC,cAAa,IAAI;AACxB,QAAI,CAAC,cAAc,SAAS;AAC1B,aAAO;IACT;AAEA,SAAK,aAAa,QAAO;AACzB,SAAK,eAAe,IAAI,uBAAuB,KAAK,QAAQ;MAC1D,mBAAmB;KACpB;AAGD,UAAM,mBAAmB,KAAK,OAAO,gBAAgB;MACnD,IAAI;MACJ,aAAa,KAAK,iBAAiB;MACnC,YAAY,CAAC,GAAG,GAAG,GAAG,CAAC;KACxB;AACD,SAAK,aAAa,KAAK,gBAAgB;AACvC,qBAAiB,IAAG;AASpB,QAAI,QAAQ;AACZ,eAAW,gBAAgB,KAAK,eAAe;AAC7C,iBAAW,mBAAmB,aAAa,kBAAkB;AAC3D,YAAI,CAAC,OAAO;AACV,eAAK,iBAAiB,KAAI;QAC5B;AACA,gBAAQ;AAER,cAAM,oBAAoB,KAAK,iBAAiB,QAAQ,iBAAiB,CAAC,EAAE;AAE5E,cAAM,WAAW;UACf,eAAe;;;AAIjB,cAAM,aAAa,KAAK,OAAO,gBAAgB;UAC7C,IAAI;UACJ,aAAa,KAAK,iBAAiB;UACnC,YAAY,CAAC,GAAG,GAAG,GAAG,CAAC;UACvB,YAAY;SACb;AACD,wBAAgB,OAAO,EAAC,YAAY,SAAQ,CAAC;AAC7C,mBAAW,IAAG;MAChB;IACF;AAEA,SAAK,iBAAiB,KAAI;AAC1B,UAAM,gBAAgB,KAAK,iBAAiB,QAAQ,iBAAiB,CAAC,EAAE;AACxE,WAAO;EACT;;AAIF,IAAM,eAAN,MAAkB;EAChB;EACA;EAEA,YAAY,QAAgB,YAAwB,QAAQ,CAAA,GAAE;AAC5D,SAAK,aAAa;AAGlB,UAAM,YAAY,WAAW,UAAU,CAAA;AAGvC,SAAK,mBAAmB,UAAU,IAAI,aAAU;AAE9C,aAAO,IAAI,gBAAgB,QAAQ,YAAY,OAAO;IACxD,CAAC;EACH;EAEA,UAAO;AACL,eAAW,mBAAmB,KAAK,kBAAkB;AACnD,sBAAgB,QAAO;IACzB;EACF;;AAIF,IAAM,kBAAN,MAAqB;EACnB;EACA;EACA;EAEA,YAAY,QAAgB,YAAwB,SAAsB;AACxE,SAAK,aAAa;AAClB,SAAK,UAAU;AACf,UAAM,SACJ,QAAQ,UAAW,QAAQ,UAAU,YAAc,QAAQ,WAAW,YAAa;AACrF,UAAMC,MAAK,+BAA+B;MACxC;MACA;MACA,iBAAiB,OAAO,KAAK;KAC9B;AAED,SAAK,QAAQ,IAAI,UAAU,QAAQ;MACjC,IAAI,GAAG,WAAW;MAClB,QAAQA;MACR,IAAAA;MACA,SAAS,CAAC,UAAU;MACpB,YAAY;QACV,mBAAmB;;KAEtB;EACH;EAEA,UAAO;AACL,SAAK,MAAM,QAAO;EACpB;EAEA,OAAO,SAAgD;AACrD,UAAM,EAAC,YAAY,SAAQ,IAAI;AAE/B,SAAK,MAAM,aAAa,SAAS;MAC/B,CAAC,KAAK,WAAW,IAAI,GAAG,KAAK,WAAW,YAAY,CAAA;KACrD;AACD,SAAK,MAAM,aAAa,SAAS;MAC/B,CAAC,KAAK,WAAW,IAAI,GAAG,KAAK,QAAQ,YAAY,CAAA;KAClD;AAED,SAAK,MAAM,YAAY,YAAY,CAAA,CAAE;AACrC,SAAK,MAAM,KAAK,UAAU;EAC5B;;;;AG/PF,IAAAC,gBAQO;AAEP,IAAAC,sBAAuD;AACvD,IAAAC,gBAAyC;AAOzC,IAAMC,qBAAoB;AAC1B,IAAMC,oBAAmB;AAoCnB,IAAO,eAAP,MAAkB;EAqBb;EACA;EAEA;EACA;EAET,WAAiC,CAAA;;EAGjC,WAAoC,CAAA;;EAGpC;;EAEA;;;EAGA;;EAGA;;EAGA;EAEA,uBAAuC;EAE/B;EACA;EAEA,aAAa;EAErB,YAAY,QAAgB,OAAuB;AAjHrD;AAkHI,QAAI,OAAO,SAAS,UAAU;AAC5B,YAAM,IAAI,MAAM,yCAAyC;IAC3D;AAEA,SAAK,QAAQ,EAAC,GAAG,aAAY,cAAc,GAAG,MAAK;AACnD,YAAQ,KAAK;AACb,SAAK,KAAK,MAAM,MAAM,IAAI,OAAO;AACjC,SAAK,SAAS;AAEd,WAAO,OAAO,KAAK,UAAU,MAAM,QAAQ;AAG3C,UAAM,YAAY,OAAO,cACvB,UAAK,MAAM,YAAX,mBAAoB,IAAI,CAAAC,YAAU,CAACA,QAAO,MAAMA,OAAM,OAAM,CAAA,CAAE;AAGhE,SAAK,eAAe,MAAM,gBAAgB,IAAI,aAAa,SAAS;AACpE,SAAK,gBAAgB,KAAK,YAAY;AAItC,SAAK,MAAM,qBAAiB,6CAAwB,KAAK,MAAM,MAAM;AAGrE,UAAM,eAAeC,iBAAgB,MAAM;AAG3C,UAAM,aACH,UAAK,MAAM,YAAX,mBAAoB,UAAS,IAAI,KAAK,MAAM,WAAU,UAAK,iBAAL,mBAAmB,iBAAiB,CAAA;AAE7F,SAAK,kBACH,MAAM,mBAAmB,gBAAgB,0BAA0B,KAAK,MAAM;AAChF,SAAK,gBAAgB,MAAM,iBAAiB,cAAc,wBAAwB,KAAK,MAAM;AAE7F,UAAM,EAAC,QAAAC,SAAQ,aAAAC,aAAW,IAAI,KAAK,MAAM,gBAAgB,mBAAmB;MAC1E;MACA,GAAG,KAAK;MACR;KACD;AAED,SAAK,SAASD;AAEd,SAAK,qBAAqBC;AAI1B,SAAK,WAAW,KAAK,gBAAe;AAGpC,QAAI,MAAM,UAAU;AAClB,WAAK,YAAY,MAAM,QAAQ;IACjC;AAGA,WAAO,KAAK,IAAI;EAClB;EAEA,UAAO;AACL,QAAI,KAAK;AAAY;AACrB,SAAK,gBAAgB,QAAQ,KAAK,QAAQ;AAC1C,SAAK,cAAc,QAAQ,KAAK,MAAM;AACtC,SAAK,cAAc,QAAO;AAC1B,SAAK,aAAa;EACpB;;EAIA,UAAO;AAEL,SAAK,mBAAkB;EACzB;EAEA,SAAS,aAA0B,GAAW,GAAY,GAAU;AAClE,QAAI;AACF,WAAK,kBAAiB;AAItB,WAAK,WAAW,KAAK,gBAAe;AAIpC,WAAK,SAAS,YAAY,KAAK,QAAQ;AACvC,kBAAY,YAAY,KAAK,QAAQ;AAErC,kBAAY,YAAY,CAAA,CAAE;AAE1B,kBAAY,SAAS,GAAG,GAAG,CAAC;IAC9B;AACE,WAAK,gBAAe;IACtB;EACF;;;;;;;EAUA,eAAe,aAAmB;EAElC;;;;;EAMA,iBAAiB,eAAqB;EAEtC;EAEA,gBAAgB,cAA0B;AACxC,SAAK,eAAe;AACpB,SAAK,gBAAgB,IAAI,2BAAa,KAAK,aAAa,OAAO;AAE/D,eAAW,cAAc,OAAO,KAAK,KAAK,aAAa,OAAO,GAAG;AAC/D,YAAM,gBAAgB,KAAK,cAAc,wBAAwB,KAAK,QAAQ,UAAU;AACxF,WAAK,SAAS,GAAG,oBAAoB,IAAI;IAC3C;EACF;;;;EAKA,qBAAqB,OAA0B;AAC7C,UAAM,WAAW,KAAK,mBAAmB,KAAK;AAI9C,UAAM,OAAO,OAAO,KAAK,QAAQ,EAAE,OAAO,OAAI;AAC5C,YAAM,UAAU,SAAS,CAAC;AAC1B,aACE,KAAC,8BAAe,OAAO,KAAK,OAAO,YAAY,YAAY,OAAO,YAAY;IAElF,CAAC;AACD,UAAM,WAAoC,CAAA;AAC1C,eAAW,KAAK,MAAM;AACpB,eAAS,CAAC,IAAI,SAAS,CAAC;AACxB,aAAO,SAAS,CAAC;IACnB;EACF;EAEA,qBAAkB;AAChB,SAAK,cAAc,YAAY,KAAK,aAAa,iBAAgB,CAAE;EACrE;;;;EAKA,YAAY,UAAiC;AAC3C,WAAO,OAAO,KAAK,UAAU,QAAQ;EACvC;EAEA,wBAAwB,QAAc;AACpC,SAAK,uBAAuB,KAAK,wBAAwB;EAC3D;EAEA,kBAAe;AACb,QAAI,KAAK,sBAAsB;AAC7B,UAAI,aAA4B;AAChC,UAAI,KAAK,UAAU;AACjB,0BAAI,IACF,GACA,SAAS,KAAK,oCAAoC,KAAK,wBAAwB,EAChF;AACD,qBAAa,KAAK;MACpB;AAEA,WAAK,uBAAuB;AAE5B,WAAK,SAAS,KAAK,cAAc,aAAa;QAC5C,IAAI,GAAG,KAAK;QACZ,OAAO;QACP,QAAQ,KAAK;QACb,cAAc,KAAK,MAAM;OAC1B;AAED,WAAK,WAAW,KAAK,gBAAgB,sBAAsB;QACzD,GAAG,KAAK;QACR,QAAQ,KAAK;OACd;AAED,UAAI,YAAY;AACd,aAAK,cAAc,QAAQ,UAAU;MACvC;IACF;AACA,WAAO,KAAK;EACd;;EAGA,eAAe;EACf,WAAW;EAEX,oBAAiB;AAEf,UAAM,iBAAiB,kBAAI,QAAQ,IAAI,IAAIJ;AAC3C,QAAI,kBAAI,QAAQ,KAAK,KAAK,IAAG,IAAK,KAAK,eAAe,gBAAgB;AACpE;IACF;AAEA,SAAK,eAAe,KAAK,IAAG;AAC5B,SAAK,WAAW;AAEhB,sBAAI,MAAMD,oBAAmB,qBAAqB,KAAK,MAAM,EAAC,WAAW,kBAAI,SAAS,EAAC,CAAC,EAAC;EAC3F;EAEA,kBAAe;AACb,QAAI,KAAK,UAAU;AAOjB,YAAM,eAAe,KAAK,aAAa,cAAa;AACpD,wBAAI,MAAMA,oBAAmB,YAAY,EAAC;AAE1C,wBAAI,SAASA,kBAAiB,EAAC;AAC/B,WAAK,WAAW;IAClB;EACF;EAEU,aAAa;;EAGvB,2BAA2B,WAAgC,UAAa;AACtE,UAAM,4BAAwB,wCAAyB,QAAQ;AAC/D,UAAM,aACJ,qBAAqB,uBAAS,IAAI,sBAAsB,UAAU,SAAS,IAAI;AACjF,WAAO,WAAW,SAAQ;EAC5B;;AA9RI,IAAO,cAAP;AACJ,cADW,aACJ,gBAA2C;EAChD,GAAG,8BAAgB;EACnB,IAAI;EACJ,QAAQ;EACR,UAAU,CAAA;EAEV,QAAQ;EACR,SAAS,CAAA;EACT,SAAS,CAAA;EAET,UAAU;EACV,cAAc;EAEd,iBAAiB;EACjB,eAAe;EACf,iBAAiB,oCAAgB,0BAAyB;EAE1D,cAAc;;AAgRZ,SAAUG,iBAAgB,QAAc;AAC5C,SAAO;IACL,MAAM,OAAO;IACb,gBAAgB,OAAO,KAAK;IAC5B,uBAAuB,OAAO,KAAK;IACnC,KAAK,OAAO,KAAK;;IAEjB,UAAU,OAAO;;AAErB;;;AC/VA,IAAM,0BAAwC,CAAC,GAAG,GAAG,GAAG,CAAC;AAElD,IAAM,gBAAgB;AAsD7B,IAAM,eAAsF;EAC1F,UAAU;EACV,WAAW;EACX,YAAY;EAEZ,mBAAmB;EACnB,uBAAuB;EACvB,wBAAwB;EACxB,gBAAgB;;AAGX,IAAM;;EAA2B;;;;;;;;;;;;;;;AAgBjC,IAAM;;EAA2B;;;;;;;;;;;;AAaxC,SAAS,YAAY,QAAsB,CAAA,GAAI,cAA8B;AAC3E,QAAM,WAAW,EAAC,GAAG,aAAY;AAGjC,MAAI,MAAM,aAAa,QAAW;AAChC,aAAS,WAAW,QAAQ,MAAM,QAAQ;EAC5C;AAEA,UAAQ,MAAM,WAAW;IACvB,KAAK;AACH,eAAS,YAAY;AACrB;IACF,KAAK;AACH,eAAS,YAAY;AACrB;IACF,KAAK;AAEH;EACJ;AAEA,UAAQ,MAAM,wBAAwB;IACpC,KAAK;AAEH;IACF,KAAK;AAEH,eAAS,oBAAoB;AAC7B,eAAS,yBAAyB;AAClC;IACF;AACE,eAAS,oBAAoB;AAC7B,eAAS,yBAAyB,MAAM;EAC5C;AAEA,MAAI,OAAO,MAAM,0BAA0B,UAAU;AACnD,aAAS,wBAAwB,MAAM;EACzC;AAEA,MAAI,MAAM,gBAAgB;AACxB,aAAS,iBAAiB,MAAM;EAClC;AAEA,SAAO;AACT;AAaO,IAAM,kBAAkB;EAC7B,OAAO,CAAA;EACP,UAAU,CAAA;EAEV,MAAM;EAEN;EACA,iBAAiB;IACf,UAAU;IACV,WAAW;IACX,YAAY;IACZ,mBAAmB;IACnB,uBAAuB;IACvB,wBAAwB;IACxB,gBAAgB;;EAGlB;;;;ACrJI,IAAO,kBAAP,MAAqB;EACzB;EACA;;EAEA,WAAqB,EAAC,YAAY,MAAM,aAAa,KAAI;;EAEzD,cAAkC;EAOlC,YAAY,QAAgB,OAA0B;AACpD,SAAK,SAAS;AACd,SAAK,QAAQ,EAAC,GAAG,gBAAe,cAAc,GAAG,MAAK;EACxD;EAEA,UAAO;AA9CT;AA+CI,eAAK,gBAAL,mBAAkB;EACpB;;EAGA,iBAAc;AACZ,QAAI,CAAC,KAAK,aAAa;AACrB,WAAK,cAAc,KAAK,OAAO,kBAAkB;QAC/C,kBAAkB,CAAC,cAAc,UAAU;QAC3C,wBAAwB;OACzB;IACH;AACA,WAAO,KAAK;EACd;;EAGA,iBAAc;AACZ,SAAK,MAAM,aAAa,SAAS,EAAC,SAAS,EAAC,wBAAwB,KAAI,EAAC,CAAC;EAC5E;;EAGA,kBAAe;AAnEjB;AAoEI,UAAM,cAAc,KAAK,eAAc;AACvC,gBAAY,OAAO,KAAK,OAAO,wBAAuB,EAAG,mBAAkB,CAAE;AAE7E,eAAK,MAAM,iBAAX,mBAAyB,SAAS,EAAC,SAAS,EAAC,UAAU,KAAI,EAAC;AAE5D,UAAM,cAAc,KAAK,OAAO,gBAAgB;MAC9C;MACA,aAAa,CAAC,IAAI,aAAa,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,GAAG,IAAI,WAAW,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC;MAC5E,YAAY;KACb;AAED,WAAO;EACT;EAEA,MAAM,eAAe,eAA+B;AAlFtD;AAmFI,UAAM,cAAc,KAAK,eAAc;AAGvC,UAAM,CAAC,OAAO,KAAK,IAAI,KAAK,gBAAgB,aAAa;AAGzD,UAAM,YAAY,KAAK,OAAO,uBAAuB,aAAa;MAChE,SAAS;MACT,SAAS;MACT,aAAa;MACb,cAAc;MACd,kBAAkB;KACnB;AACD,QAAI,CAAC,WAAW;AACd,aAAO;IACT;AAEA,UAAM,WAAqB;MACzB,aAAa,UAAU,CAAC,MAAM,gBAAgB,OAAO,UAAU,CAAC;MAChE,YAAY,UAAU,CAAC,MAAM,gBAAgB,OAAO,UAAU,CAAC;;AAIjE,QACE,SAAS,gBAAgB,KAAK,SAAS,eACvC,SAAS,eAAe,KAAK,SAAS,YACtC;AACA,WAAK,WAAW;AAChB,WAAK,MAAM,eAAe,QAAQ;IAEpC;AAEA,eAAK,MAAM,iBAAX,mBAAyB,SAAS;MAChC,SAAS;QACP,UAAU;QACV,uBAAuB,SAAS;QAChC,wBAAwB,SAAS;;;AAIrC,WAAO,KAAK;EACd;;;;;EAMA,gBAAgB,eAA+B;AAC7C,UAAM,eAAe,KAAK,OAAO,wBAAuB,EAAG,kBAAkB,aAAa;AAC1F,UAAM,QAAQ,aAAa,IAAI,KAAK,MAAM,aAAa,QAAQ,CAAC;AAChE,UAAM,QAAQ,aAAa,IAAI,KAAK,MAAM,aAAa,SAAS,CAAC;AACjE,WAAO,CAAC,OAAO,KAAK;EACtB;;AA3GI,IAAO,iBAAP;AAQJ,cARW,gBAQJ,gBAA8C;EACnD,cAAc;EACd,gBAAgB,MAAK;EAAE;;;;AC3B3B,IAAM;;EAAoB,GACxB;;;;sCAIoC;;;;;;;;;;;;;;;;;;;;;;;;;AAyBtC,IAAM;;EAAgB,GACpB;;;;;0CAKwC;;;;;;;;;;;;;;;;;;;;AAoB1C,IAAM;;EAAgB,GACpB;;0CAEwC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+EnC,IAAM,UAAU;EACrB,GAAG;EACH,MAAM;EACN;EACA;EACA;;;;ACjJF,IAAMG;;EAAoB,GACxB;;;AAGF,IAAMC;;EAAgB,GACpB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6EF,IAAMC;;EAAgB,GACpB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0DK,IAAMC,WAAU;EACrB,GAAG;EACH,MAAM;EACN,QAAAH;EACA,IAAAC;EACA,IAAAC;;;;AC/II,IAAO,uBAAP,MAA2B;EAC/B;EACA,cAAkC;EAClC;EAEA,YAAY,QAAgB,cAA0B;AACpD,SAAK,SAAS;AACd,SAAK,eAAe;EACtB;EAEA,UAAO;AAtBT;AAuBI,eAAK,gBAAL,mBAAkB;EACpB;EAEA,iBAAc;AACZ,QAAI,CAAC,KAAK,aAAa;AACrB,WAAK,cAAc,KAAK,OAAO,kBAAkB;QAC/C,kBAAkB,CAAC,YAAY;QAC/B,wBAAwB;OACzB;IACH;AACA,WAAO,KAAK;EACd;;EAGA,iBAAc;AACZ,SAAK,aAAa,SAAS,EAAC,SAAS,EAAC,wBAAwB,KAAI,EAAC,CAAC;EACtE;;EAGA,kBAAe;AACb,UAAM,cAAc,KAAK,eAAc;AACvC,gBAAY,OAAO,KAAK,OAAO,iBAAgB,EAAG,mBAAkB,CAAE;AAEtE,SAAK,aAAa,SAAS,EAAC,SAAS,EAAC,UAAU,KAAI,EAAC,CAAC;AAEtD,UAAM,cAAc,KAAK,OAAO,gBAAgB;MAC9C;MACA,YAAY,CAAC,GAAG,GAAG,GAAG,CAAC;MACvB,YAAY;KACb;AAED,WAAO;EACT;EAEA,gBAAgB,eAA+B;AAC7C,UAAM,cAAc,KAAK,eAAc;AAGvC,UAAM,CAAC,OAAO,KAAK,IAAI,KAAK,gBAAgB,aAAa;AAGzD,UAAM,WAAW,KAAK,OAAO,uBAAuB,aAAa;MAC/D,SAAS;MACT,SAAS;MACT,aAAa;MACb,cAAc;KACf;AAID,QAAI,yBAA8C,CAAC,GAAG,QAAQ,EAAE,IAC9D,OAAK,IAAI,GAAG;AAEd,UAAM,oBACJ,uBAAuB,CAAC,IAAI,uBAAuB,CAAC,IAAI,uBAAuB,CAAC,IAAI;AAEtF,QAAI,CAAC,mBAAmB;AACtB,+BAAyB;IAC3B;AAEA,SAAK,aAAa,SAAS;MACzB,SAAS,EAAC,UAAU,OAAO,uBAAsB;KAClD;EACH;;;;;EAMA,gBAAgB,eAA+B;AAC7C,UAAM,eAAe,KAAK,OAAO,iBAAgB,EAAG,kBAAkB,aAAa;AACnF,UAAM,QAAQ,aAAa,IAAI,KAAK,MAAM,aAAa,QAAQ,CAAC;AAChE,UAAM,QAAQ,aAAa,IAAI,KAAK,MAAM,aAAa,SAAS,CAAC;AACjE,WAAO,CAAC,OAAO,KAAK;EACtB;;",
6
6
  "names": ["picking", "canvas", "import_core", "canvas", "import_core", "import_shadertools", "import_core", "import_core", "import_core", "import_core", "import_core", "module", "import_core", "module", "source", "getUniforms", "vs", "fs", "import_core", "import_shadertools", "import_shadertools", "import_core", "import_core", "import_core", "import_shadertools", "import_core", "fs", "import_core", "import_shadertools", "import_types", "LOG_DRAW_PRIORITY", "LOG_DRAW_TIMEOUT", "module", "getPlatformInfo", "source", "getUniforms", "source", "vs", "fs", "picking"]
7
7
  }