ice3 0.2.0 → 0.2.2

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.
Files changed (39) hide show
  1. package/README.md +7 -6
  2. package/dist/_types/assets/ICEGLBReader.d.ts +8 -1
  3. package/dist/_types/assets/ICEPreparedGLB.d.ts +26 -0
  4. package/dist/_types/assets/ICEPreviewGeometryPacket.d.ts +60 -0
  5. package/dist/_types/assets/index.d.ts +3 -0
  6. package/dist/_types/core/camera/ICEPerspectiveCamera.d.ts +8 -2
  7. package/dist/_types/core/geometry/ICEGeometry.d.ts +13 -0
  8. package/dist/_types/core/geometry/ICEIndexedGeometry.d.ts +3 -1
  9. package/dist/_types/core/index.d.ts +2 -2
  10. package/dist/_types/core/material/ICEBasicMaterial.d.ts +52 -0
  11. package/dist/_types/renderer/InstanceBatch.d.ts +7 -0
  12. package/dist/_types/renderer/SceneBounds.d.ts +16 -0
  13. package/dist/_types/renderer/ShadowFrustum.d.ts +20 -0
  14. package/dist/_types/renderer/WebGL2DepthMath.d.ts +22 -0
  15. package/dist/_types/renderer/WebGL2GeometryCache.d.ts +16 -2
  16. package/dist/_types/renderer/WebGL2InstanceBatch.d.ts +1 -1
  17. package/dist/_types/renderer/WebGL2Program.d.ts +68 -0
  18. package/dist/_types/renderer/WebGL2RendererBackend.d.ts +44 -0
  19. package/dist/_types/renderer/WebGL2SceneDepth.d.ts +19 -0
  20. package/dist/_types/renderer/WebGL2Shader.d.ts +11 -0
  21. package/dist/_types/renderer/WebGL2ShadowMap.d.ts +42 -0
  22. package/dist/_types/renderer/WebGL2TextureCache.d.ts +31 -0
  23. package/dist/_types/renderer/WebGL2Uv.d.ts +16 -0
  24. package/dist/_types/renderer/WebGPUDrawStorage.d.ts +1 -0
  25. package/dist/_types/renderer/WebGPUGeometryCache.d.ts +16 -2
  26. package/dist/_types/renderer/WebGPURenderPipeline.d.ts +1 -1
  27. package/dist/_types/renderer/WebGPURendererBackend.d.ts +2 -0
  28. package/dist/_types/renderer/index.d.ts +1 -1
  29. package/dist/_types/renderer/types.d.ts +9 -1
  30. package/dist/_types/runtime/ICE3.d.ts +8 -0
  31. package/dist/_types/runtime/asset/ICEAssetSceneBuilder.d.ts +8 -2
  32. package/dist/_types/runtime/asset/ICEPreviewPacketLoader.d.ts +25 -0
  33. package/dist/_types/runtime/asset/ICETilesetLoader.d.ts +0 -1
  34. package/dist/_types/runtime/index.d.ts +2 -1
  35. package/dist/_types/runtime/input/ICEOrbitController.d.ts +2 -0
  36. package/dist/index.d.ts +2 -2
  37. package/dist/index.js +2742 -242
  38. package/dist/index.js.map +4 -4
  39. package/package.json +1 -1
package/dist/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../../packages/core/src/math/ICEVector3.ts", "../../../packages/core/src/math/ICEMatrix4.ts", "../../../packages/core/src/event/ICEEvent.ts", "../../../packages/core/src/event/ICEEventDispatcher.ts", "../../../packages/core/src/geometry/ICEBoxGeometry.ts", "../../../packages/core/src/geometry/ICEIndexedGeometry.ts", "../../../packages/core/src/material/ICEBasicMaterial.ts", "../../../packages/core/src/camera/ICEPerspectiveCamera.ts", "../../../packages/core/src/culling/ICEFrustum.ts", "../../../packages/core/src/diagnostics/ICEEngineError.ts", "../../../packages/core/src/scene/ICENode.ts", "../../../packages/core/src/scene/ICEScene.ts", "../../../packages/core/src/scene/ICEMesh.ts", "../../../packages/core/src/types/ICETypeRegistry.ts", "../../../packages/core/src/serialization/serializeScene.ts", "../../../packages/renderer/src/Renderables.ts", "../../../packages/renderer/src/RenderBatch.ts", "../../../packages/renderer/src/WebGL2Program.ts", "../../../packages/renderer/src/InstanceBatch.ts", "../../../packages/renderer/src/WebGL2InstanceBatch.ts", "../../../packages/renderer/src/WebGL2GeometryCache.ts", "../../../packages/renderer/src/WebGL2PickCodec.ts", "../../../packages/renderer/src/WebGL2SemanticProgram.ts", "../../../packages/renderer/src/WebGL2Picker.ts", "../../../packages/renderer/src/Color.ts", "../../../packages/renderer/src/RendererProfiler.ts", "../../../packages/renderer/src/WebGL2RendererBackend.ts", "../../../packages/renderer/src/WebGPUProbe.ts", "../../../packages/renderer/src/WebGPUResources.ts", "../../../packages/renderer/src/WebGPUGeometryCache.ts", "../../../packages/renderer/src/WebGPUInstanceCache.ts", "../../../packages/renderer/src/WebGPURenderPipeline.ts", "../../../packages/renderer/src/WebGPUTimestampProfiler.ts", "../../../packages/renderer/src/WebGPUSelectionMask.ts", "../../../packages/renderer/src/WebGPUDrawStorage.ts", "../../../packages/renderer/src/WebGPURenderPlan.ts", "../../../packages/renderer/src/WebGPUBundleCache.ts", "../../../packages/renderer/src/WebGPUCapabilities.ts", "../../../packages/renderer/src/WebGPUInstanceStorage.ts", "../../../packages/renderer/src/WebGPUVisibility.ts", "../../../packages/renderer/src/WebGPUPicker.ts", "../../../packages/renderer/src/WebGPURendererBackend.ts", "../../../packages/renderer/src/RendererSelection.ts", "../../../packages/renderer/src/ICEWebGL2BatchGenerationUploader.ts", "../../../packages/runtime/src/layer/ICE2DLayer.ts", "../../../packages/runtime/src/layer/ICE2DLayerRouter.ts", "../../../packages/runtime/src/layer/ICEWorldLayer.ts", "../../../packages/runtime/src/layer/ICEScreenLayer.ts", "../../../packages/runtime/src/layer/ICELabel.ts", "../../../packages/runtime/src/layer/ICE2DCanvasPainter.ts", "../../../packages/runtime/src/input/ICEInputRouter.ts", "../../../packages/runtime/src/input/ICEScenePicker.ts", "../../../packages/runtime/src/input/ICESelectionGesture.ts", "../../../packages/runtime/src/ICEInteractionState.ts", "../../../packages/runtime/src/ICEProjection.ts", "../../../packages/runtime/src/ICERenderScheduler.ts", "../../../packages/runtime/src/query/ICESceneQuery.ts", "../../../packages/runtime/src/ICE3.ts", "../../../packages/runtime/src/input/ICEOrbitController.ts", "../../../packages/runtime/src/asset/ICERenderBatch.ts", "../../../packages/runtime/src/asset/ICEAssetSceneBuilder.ts", "../../../packages/assets/src/ICEProfileValidator.ts", "../../../packages/assets/src/ICEGLBReader.ts", "../../../packages/assets/src/ICETilesetReader.ts", "../../../packages/runtime/src/asset/ICEAssetLoader.ts", "../../../packages/runtime/src/asset/ICETilesetScheduler.ts", "../../../packages/runtime/src/asset/ICELodSelector.ts", "../../../packages/runtime/src/batching/ICEAdaptiveRenderBatchController.ts", "../../../packages/runtime/src/batching/createBatchWorker.ts", "../../../packages/runtime/src/batching/ICEBatchWorkerPool.ts", "../../../packages/runtime/src/batching/ICERenderBatchPlanner.ts", "../../../packages/runtime/src/asset/ICETilesetLoader.ts"],
4
- "sourcesContent": ["export type ICEVector3Tuple = readonly [number, number, number];\n\nexport class ICEVector3 {\n readonly x: number;\n readonly y: number;\n readonly z: number;\n\n constructor(x = 0, y = 0, z = 0) {\n this.x = x;\n this.y = y;\n this.z = z;\n Object.freeze(this);\n }\n\n clone(): ICEVector3 {\n return new ICEVector3(this.x, this.y, this.z);\n }\n\n toArray(): [number, number, number] {\n return [this.x, this.y, this.z];\n }\n}\n", "import { ICEVector3 } from './ICEVector3.js';\n\nconst dot = (left: ICEVector3, right: ICEVector3): number =>\n left.x * right.x + left.y * right.y + left.z * right.z;\n\nconst cross = (left: ICEVector3, right: ICEVector3): ICEVector3 =>\n new ICEVector3(\n left.y * right.z - left.z * right.y,\n left.z * right.x - left.x * right.z,\n left.x * right.y - left.y * right.x,\n );\n\nconst normalize = (value: ICEVector3): ICEVector3 => {\n const length = Math.hypot(value.x, value.y, value.z);\n if (length === 0) {\n return new ICEVector3();\n }\n return new ICEVector3(value.x / length, value.y / length, value.z / length);\n};\n\nexport class ICEMatrix4 {\n readonly elements = new Float32Array(16);\n\n constructor() {\n this.identity();\n }\n\n identity(): this {\n this.elements.fill(0);\n this.elements[0] = 1;\n this.elements[5] = 1;\n this.elements[10] = 1;\n this.elements[15] = 1;\n return this;\n }\n\n multiply(other: ICEMatrix4): this {\n const left = this.elements.slice();\n const right = other.elements;\n\n for (let column = 0; column < 4; column += 1) {\n for (let row = 0; row < 4; row += 1) {\n let value = 0;\n for (let index = 0; index < 4; index += 1) {\n value += left[index * 4 + row]! * right[column * 4 + index]!;\n }\n this.elements[column * 4 + row] = value;\n }\n }\n return this;\n }\n\n perspective(fovDegrees: number, aspect: number, near: number, far: number): this {\n const f = 1 / Math.tan((fovDegrees * Math.PI) / 360);\n this.elements.fill(0);\n this.elements[0] = f / aspect;\n this.elements[5] = f;\n this.elements[10] = (far + near) / (near - far);\n this.elements[11] = -1;\n this.elements[14] = (2 * far * near) / (near - far);\n return this;\n }\n\n lookAt(eye: ICEVector3, target: ICEVector3, up: ICEVector3): this {\n const zAxis = normalize(\n new ICEVector3(eye.x - target.x, eye.y - target.y, eye.z - target.z),\n );\n const xAxis = normalize(cross(up, zAxis));\n const yAxis = cross(zAxis, xAxis);\n\n this.elements[0] = xAxis.x;\n this.elements[1] = yAxis.x;\n this.elements[2] = zAxis.x;\n this.elements[3] = 0;\n this.elements[4] = xAxis.y;\n this.elements[5] = yAxis.y;\n this.elements[6] = zAxis.y;\n this.elements[7] = 0;\n this.elements[8] = xAxis.z;\n this.elements[9] = yAxis.z;\n this.elements[10] = zAxis.z;\n this.elements[11] = 0;\n this.elements[12] = -dot(xAxis, eye);\n this.elements[13] = -dot(yAxis, eye);\n this.elements[14] = -dot(zAxis, eye);\n this.elements[15] = 1;\n return this;\n }\n\n transformPoint(point: ICEVector3): [number, number, number, number] {\n const elements = this.elements;\n const x = elements[0]! * point.x\n + elements[4]! * point.y\n + elements[8]! * point.z\n + elements[12]!;\n const y = elements[1]! * point.x\n + elements[5]! * point.y\n + elements[9]! * point.z\n + elements[13]!;\n const z = elements[2]! * point.x\n + elements[6]! * point.y\n + elements[10]! * point.z\n + elements[14]!;\n const w = elements[3]! * point.x\n + elements[7]! * point.y\n + elements[11]! * point.z\n + elements[15]!;\n return [x, y, z, w];\n }\n}\n", "export class ICEEvent<T = unknown> {\n constructor(\n readonly type: string,\n readonly target: unknown,\n readonly param?: T,\n ) {}\n}\n", "import { ICEEvent } from './ICEEvent.js';\n\ntype StoredListener = Readonly<{\n listener: (event: ICEEvent<unknown>) => void;\n once: boolean;\n}>;\n\nexport class ICEEventDispatcher {\n private readonly listeners = new Map<string, StoredListener[]>();\n\n on<T>(type: string, listener: (event: ICEEvent<T>) => void): this {\n return this.add(type, listener, false);\n }\n\n once<T>(type: string, listener: (event: ICEEvent<T>) => void): this {\n return this.add(type, listener, true);\n }\n\n off<T>(type: string, listener?: (event: ICEEvent<T>) => void): this {\n if (!listener) {\n this.listeners.delete(type);\n return this;\n }\n\n const current = this.listeners.get(type);\n if (!current) {\n return this;\n }\n\n const next = current.filter((entry) => entry.listener !== listener);\n if (next.length === 0) {\n this.listeners.delete(type);\n } else {\n this.listeners.set(type, next);\n }\n return this;\n }\n\n removeAllListeners(): this {\n this.listeners.clear();\n return this;\n }\n\n trigger<T>(type: string, param?: T): this {\n const current = this.listeners.get(type);\n if (!current) {\n return this;\n }\n\n const event = new ICEEvent(type, this, param);\n for (const entry of [...current]) {\n if (entry.once) {\n const latest = this.listeners.get(type);\n if (latest) {\n const next = latest.filter((candidate) => candidate !== entry);\n if (next.length === 0) {\n this.listeners.delete(type);\n } else {\n this.listeners.set(type, next);\n }\n }\n }\n entry.listener(event as ICEEvent<unknown>);\n }\n return this;\n }\n\n private add<T>(\n type: string,\n listener: (event: ICEEvent<T>) => void,\n once: boolean,\n ): this {\n const current = this.listeners.get(type) ?? [];\n current.push({\n listener: listener as (event: ICEEvent<unknown>) => void,\n once,\n });\n this.listeners.set(type, current);\n return this;\n }\n}\n", "export interface ICEBoxGeometryOptions {\n readonly width: number;\n readonly height: number;\n readonly depth: number;\n}\n\nexport class ICEBoxGeometry implements ICEGeometry {\n readonly typeId = 'ice3:BoxGeometry';\n readonly width: number;\n readonly height: number;\n readonly depth: number;\n readonly positions: Float32Array;\n readonly indices: Uint16Array;\n readonly edgeIndices: Uint16Array;\n\n constructor(options: ICEBoxGeometryOptions) {\n if (options.width <= 0 || options.height <= 0 || options.depth <= 0) {\n throw new RangeError('ICE box dimensions must be positive');\n }\n this.width = options.width;\n this.height = options.height;\n this.depth = options.depth;\n this.positions = scaledPositions(options);\n this.indices = BOX_INDICES;\n this.edgeIndices = BOX_EDGE_INDICES;\n }\n\n getBounds(): ICEGeometryBounds {\n return {\n min: [-this.width / 2, -this.height / 2, -this.depth / 2],\n max: [this.width / 2, this.height / 2, this.depth / 2],\n };\n }\n\n toJSON(): Record<string, unknown> {\n return {\n typeId: this.typeId,\n width: this.width,\n height: this.height,\n depth: this.depth,\n };\n }\n}\n\nfunction scaledPositions(options: ICEBoxGeometryOptions): Float32Array {\n const positions = new Float32Array(BOX_POSITIONS);\n for (let index = 0; index < positions.length; index += 3) {\n positions[index] = positions[index]! * options.width;\n positions[index + 1] = positions[index + 1]! * options.height;\n positions[index + 2] = positions[index + 2]! * options.depth;\n }\n return positions;\n}\nimport type { ICEGeometry, ICEGeometryBounds } from './ICEGeometry.js';\n\nconst BOX_POSITIONS = new Float32Array([\n -0.5, -0.5, 0.5,\n 0.5, -0.5, 0.5,\n 0.5, 0.5, 0.5,\n -0.5, 0.5, 0.5,\n -0.5, -0.5, -0.5,\n 0.5, -0.5, -0.5,\n 0.5, 0.5, -0.5,\n -0.5, 0.5, -0.5,\n]);\n\nconst BOX_INDICES = new Uint16Array([\n 0, 1, 2, 0, 2, 3,\n 5, 4, 7, 5, 7, 6,\n 4, 0, 3, 4, 3, 7,\n 1, 5, 6, 1, 6, 2,\n 3, 2, 6, 3, 6, 7,\n 4, 5, 1, 4, 1, 0,\n]);\n\nconst BOX_EDGE_INDICES = new Uint16Array([\n 0, 1, 1, 2, 2, 3, 3, 0,\n 4, 5, 5, 6, 6, 7, 7, 4,\n 0, 4, 1, 5, 2, 6, 3, 7,\n]);\n", "import type { ICEGeometry, ICEGeometryBounds } from './ICEGeometry.js';\n\nexport interface ICEIndexedGeometryOptions {\n readonly id: string;\n readonly positions: Float32Array;\n readonly indices: Uint16Array | Uint32Array;\n readonly edgeIndices?: Uint16Array | Uint32Array;\n readonly colors?: Float32Array;\n readonly semanticIndices?: Uint32Array;\n}\n\nexport class ICEIndexedGeometry implements ICEGeometry {\n readonly typeId = 'ice3:IndexedGeometry';\n readonly id: string;\n readonly positions: Float32Array;\n readonly indices: Uint16Array | Uint32Array;\n readonly edgeIndices?: Uint16Array | Uint32Array;\n readonly colors?: Float32Array;\n readonly semanticIndices?: Uint32Array;\n\n constructor(options: ICEIndexedGeometryOptions) {\n if (!options.id.trim()) {\n throw new TypeError('ICE geometry ID must not be empty');\n }\n if (\n options.positions.length === 0\n || options.positions.length % 3 !== 0\n || options.positions.some((value) => !Number.isFinite(value))\n ) {\n throw new TypeError('ICE indexed geometry positions are invalid');\n }\n const vertexCount = options.positions.length / 3;\n for (const index of options.indices) {\n if (index >= vertexCount) {\n throw new RangeError('ICE indexed geometry index is out of range');\n }\n }\n for (const index of options.edgeIndices ?? []) {\n if (index >= vertexCount) {\n throw new RangeError('ICE indexed geometry edge index is out of range');\n }\n }\n if (options.edgeIndices && options.edgeIndices.length % 2 !== 0) {\n throw new TypeError('ICE edge index count must be even');\n }\n if (\n options.colors\n && options.colors.length !== vertexCount * 3\n && options.colors.length !== vertexCount * 4\n ) {\n throw new TypeError(\n 'ICE color count must be 3 or 4 values per vertex',\n );\n }\n if (\n options.semanticIndices\n && options.semanticIndices.length !== vertexCount\n ) {\n throw new TypeError(\n 'ICE semantic index count must match the vertex count',\n );\n }\n this.id = options.id;\n this.positions = options.positions;\n this.indices = options.indices;\n if (options.edgeIndices) {\n this.edgeIndices = options.edgeIndices;\n }\n if (options.colors) {\n this.colors = options.colors;\n }\n if (options.semanticIndices) {\n this.semanticIndices = options.semanticIndices;\n }\n }\n\n getBounds(): ICEGeometryBounds {\n const min: [number, number, number] = [Infinity, Infinity, Infinity];\n const max: [number, number, number] = [-Infinity, -Infinity, -Infinity];\n for (let index = 0; index < this.positions.length; index += 3) {\n for (let axis = 0; axis < 3; axis += 1) {\n const value = this.positions[index + axis]!;\n min[axis] = Math.min(min[axis]!, value);\n max[axis] = Math.max(max[axis]!, value);\n }\n }\n return { min, max };\n }\n\n toJSON(): Record<string, unknown> {\n return {\n typeId: this.typeId,\n id: this.id,\n positionCount: this.positions.length / 3,\n indexCount: this.indices.length,\n edgeIndexCount: this.edgeIndices?.length ?? 0,\n colorCount: this.colors ? this.positions.length / 3 : 0,\n ...(this.semanticIndices\n ? { semanticIndexCount: this.semanticIndices.length }\n : {}),\n bounds: this.getBounds(),\n };\n }\n}\n", "export interface ICEBasicMaterialOptions {\n readonly color: string;\n readonly edgeColor?: string;\n}\n\nexport class ICEBasicMaterial {\n readonly typeId = 'ice3:BasicMaterial';\n readonly color: string;\n readonly edgeColor: string | undefined;\n\n constructor(options: ICEBasicMaterialOptions) {\n this.color = options.color;\n this.edgeColor = options.edgeColor;\n }\n\n toJSON(): Record<string, unknown> {\n return {\n typeId: this.typeId,\n color: this.color,\n ...(this.edgeColor ? { edgeColor: this.edgeColor } : {}),\n };\n }\n}\n", "import { ICEMatrix4 } from '../math/ICEMatrix4.js';\nimport { ICEVector3, type ICEVector3Tuple } from '../math/ICEVector3.js';\n\nexport interface ICEPerspectiveCameraOptions {\n readonly id: string;\n readonly fov: number;\n readonly near: number;\n readonly far: number;\n readonly position: ICEVector3Tuple;\n readonly target?: ICEVector3Tuple;\n}\n\nexport class ICEPerspectiveCamera {\n readonly id: string;\n readonly fov: number;\n readonly near: number;\n readonly far: number;\n\n private eye: ICEVector3;\n private lookTarget: ICEVector3;\n\n constructor(options: ICEPerspectiveCameraOptions) {\n if (options.near <= 0 || options.far <= options.near) {\n throw new RangeError('Camera near/far values are invalid');\n }\n this.id = options.id;\n this.fov = options.fov;\n this.near = options.near;\n this.far = options.far;\n this.eye = new ICEVector3(...options.position);\n this.lookTarget = new ICEVector3(...(options.target ?? [0, 0, 0]));\n }\n\n setPosition(position: ICEVector3Tuple): this {\n this.eye = new ICEVector3(...position);\n return this;\n }\n\n setTarget(target: ICEVector3Tuple): this {\n this.lookTarget = new ICEVector3(...target);\n return this;\n }\n\n getPosition(): ICEVector3 {\n return this.eye;\n }\n\n getTarget(): ICEVector3 {\n return this.lookTarget;\n }\n\n getViewProjectionMatrix(aspect: number): ICEMatrix4 {\n const projection = new ICEMatrix4().perspective(this.fov, aspect, this.near, this.far);\n const view = new ICEMatrix4().lookAt(\n this.eye,\n this.lookTarget,\n new ICEVector3(0, 1, 0),\n );\n return projection.multiply(view);\n }\n}\n", "import type { ICEGeometryBounds } from '../geometry/ICEGeometry.js';\nimport type { ICEMatrix4 } from '../math/ICEMatrix4.js';\n\ntype Plane = readonly [number, number, number, number];\n\nexport class ICEFrustum {\n private constructor(\n private readonly planes: readonly Plane[],\n ) {}\n\n static fromViewProjection(matrix: ICEMatrix4): ICEFrustum {\n const m = matrix.elements;\n const row0 = [m[0]!, m[4]!, m[8]!, m[12]!] as const;\n const row1 = [m[1]!, m[5]!, m[9]!, m[13]!] as const;\n const row2 = [m[2]!, m[6]!, m[10]!, m[14]!] as const;\n const row3 = [m[3]!, m[7]!, m[11]!, m[15]!] as const;\n return new ICEFrustum([\n normalizePlane(add(row3, row0)),\n normalizePlane(subtract(row3, row0)),\n normalizePlane(add(row3, row1)),\n normalizePlane(subtract(row3, row1)),\n normalizePlane(add(row3, row2)),\n normalizePlane(subtract(row3, row2)),\n ]);\n }\n\n intersectsBounds(bounds: ICEGeometryBounds, margin = 0): boolean {\n const values = [...bounds.min, ...bounds.max];\n if (values.some((value) => !Number.isFinite(value))) {\n throw new TypeError('ICE frustum bounds must be finite');\n }\n if (\n bounds.min.some((value, axis) => value > bounds.max[axis]!)\n || !Number.isFinite(margin)\n || margin < 0\n ) {\n throw new RangeError('ICE frustum bounds or margin are invalid');\n }\n for (const [a, b, c, d] of this.planes) {\n const x = a >= 0 ? bounds.max[0] : bounds.min[0];\n const y = b >= 0 ? bounds.max[1] : bounds.min[1];\n const z = c >= 0 ? bounds.max[2] : bounds.min[2];\n if (a * x + b * y + c * z + d < -margin) {\n return false;\n }\n }\n return true;\n }\n}\n\nfunction add(\n left: readonly number[],\n right: readonly number[],\n): [number, number, number, number] {\n return [\n left[0]! + right[0]!,\n left[1]! + right[1]!,\n left[2]! + right[2]!,\n left[3]! + right[3]!,\n ];\n}\n\nfunction subtract(\n left: readonly number[],\n right: readonly number[],\n): [number, number, number, number] {\n return [\n left[0]! - right[0]!,\n left[1]! - right[1]!,\n left[2]! - right[2]!,\n left[3]! - right[3]!,\n ];\n}\n\nfunction normalizePlane(\n plane: readonly [number, number, number, number],\n): Plane {\n const length = Math.hypot(plane[0], plane[1], plane[2]);\n if (length === 0 || !Number.isFinite(length)) {\n throw new TypeError('ICE frustum matrix produced an invalid plane');\n }\n return [\n plane[0] / length,\n plane[1] / length,\n plane[2] / length,\n plane[3] / length,\n ];\n}\n", "import type { ICEDiagnostic } from './ICEDiagnostic.js';\n\nexport class ICEEngineError extends Error {\n constructor(\n readonly code: string,\n message: string,\n readonly details?: Readonly<Record<string, unknown>>,\n readonly diagnostic?: Readonly<ICEDiagnostic>,\n ) {\n super(message);\n this.name = 'ICEEngineError';\n }\n}\n", "import { ICEEventDispatcher } from '../event/ICEEventDispatcher.js';\nimport { ICEEngineError } from '../diagnostics/ICEEngineError.js';\nimport { ICEMatrix4 } from '../math/ICEMatrix4.js';\nimport { ICEVector3, type ICEVector3Tuple } from '../math/ICEVector3.js';\n\nexport interface ICENodeOptions {\n readonly id: string;\n readonly displayName?: string;\n readonly selectionId?: string;\n readonly metadata?: Readonly<Record<string, unknown>>;\n readonly position?: ICEVector3Tuple;\n readonly rotation?: ICEVector3Tuple;\n readonly scale?: ICEVector3Tuple;\n readonly matrix?: ICEMatrix4Tuple;\n}\n\nexport type ICEMatrix4Tuple = readonly [\n number, number, number, number,\n number, number, number, number,\n number, number, number, number,\n number, number, number, number,\n];\n\nexport interface ICESerializedNode {\n readonly id: string;\n readonly displayName?: string;\n readonly metadata?: Readonly<Record<string, unknown>>;\n readonly typeId: string;\n readonly visible: boolean;\n readonly position: ICEVector3Tuple;\n readonly rotation: ICEVector3Tuple;\n readonly scale: ICEVector3Tuple;\n readonly matrix?: ICEMatrix4Tuple;\n readonly children: readonly ICESerializedNode[];\n readonly [key: string]: unknown;\n}\n\nconst LOCAL_MATRIX = new ICEMatrix4();\n\nexport class ICENode extends ICEEventDispatcher {\n readonly id: string;\n readonly displayName: string;\n readonly selectionId?: string;\n readonly metadata?: Readonly<Record<string, unknown>>;\n readonly position: ICEVector3;\n readonly rotation: ICEVector3;\n readonly scale: ICEVector3;\n\n private _parent: ICENode | null = null;\n private readonly _children: ICENode[] = [];\n private readonly worldMatrix = new ICEMatrix4();\n private localMatrixOverride: Float32Array | null = null;\n private _visible = true;\n private _revision = 0;\n\n constructor(options: ICENodeOptions) {\n super();\n if (!options.id.trim()) {\n throw new TypeError('ICE node ID must not be empty');\n }\n this.id = options.id;\n this.displayName = options.displayName?.trim() || options.id;\n const selectionId = options.selectionId?.trim();\n if (selectionId) this.selectionId = selectionId;\n if (options.metadata && Object.keys(options.metadata).length > 0) {\n this.metadata = Object.freeze({ ...options.metadata });\n }\n this.position = new ICEVector3(...(options.position ?? [0, 0, 0]));\n this.rotation = new ICEVector3(...(options.rotation ?? [0, 0, 0]));\n this.scale = new ICEVector3(...(options.scale ?? [1, 1, 1]));\n if (options.matrix) {\n this.setLocalMatrix(options.matrix);\n }\n }\n\n get typeId(): string {\n return 'ice3:Node';\n }\n\n get visible(): boolean {\n return this._visible;\n }\n\n set visible(value: boolean) {\n if (value === this._visible) return;\n this._visible = value;\n this.markSceneChanged();\n }\n\n get revision(): number {\n return this.getRoot()._revision;\n }\n\n get parent(): ICENode | null {\n return this._parent;\n }\n\n get children(): readonly ICENode[] {\n return this._children;\n }\n\n addChild(node: ICENode): this {\n if (node === this || node.isAncestorOf(this)) {\n throw new ICEEngineError('ICE3_SCENE_CYCLE', 'ICE scene cycle is not allowed');\n }\n\n const root = this.getRoot();\n for (const id of collectIDs(node)) {\n const duplicate = root.findByID(id);\n if (duplicate && duplicate !== node.findByID(id)) {\n throw new ICEEngineError(\n 'ICE3_DUPLICATE_OBJECT_ID',\n `Duplicate ICE node ID: ${id}`,\n { id },\n );\n }\n }\n\n if (node._parent) {\n node._parent.removeChild(node, { dispose: false });\n }\n node._parent = this;\n this._children.push(node);\n this.markSceneChanged();\n return this;\n }\n\n removeChild(node: ICENode, options?: { readonly dispose?: boolean }): this {\n const index = this._children.indexOf(node);\n if (index < 0) {\n return this;\n }\n this._children.splice(index, 1);\n node._parent = null;\n this.markSceneChanged();\n if (options?.dispose) {\n node.dispose();\n }\n return this;\n }\n\n findByID(id: string): ICENode | undefined {\n if (this.id === id) {\n return this;\n }\n for (const child of this._children) {\n const found = child.findByID(id);\n if (found) {\n return found;\n }\n }\n return undefined;\n }\n\n updateWorldMatrix(parentMatrix?: ICEMatrix4): ICEMatrix4 {\n const parent = parentMatrix\n ?? this._parent?.updateWorldMatrix()\n ?? new ICEMatrix4().identity();\n\n const local = this.localMatrix(LOCAL_MATRIX);\n this.worldMatrix.elements.set(parent.elements);\n this.worldMatrix.multiply(local);\n return this.worldMatrix;\n }\n\n getWorldPosition(): ICEVector3 {\n const matrix = this.updateWorldMatrix();\n return new ICEVector3(matrix.elements[12]!, matrix.elements[13]!, matrix.elements[14]!);\n }\n\n setLocalMatrix(matrix: ICEMatrix4Tuple): this {\n if (matrix.length !== 16 || matrix.some((value) => !Number.isFinite(value))) {\n throw new TypeError('ICE local matrix must contain 16 finite values');\n }\n this.localMatrixOverride = new Float32Array(matrix);\n this.markSceneChanged();\n return this;\n }\n\n clearLocalMatrix(): this {\n if (this.localMatrixOverride === null) return this;\n this.localMatrixOverride = null;\n this.markSceneChanged();\n return this;\n }\n\n toJSON(): ICESerializedNode {\n return {\n id: this.id,\n displayName: this.displayName,\n ...(this.metadata ? { metadata: this.metadata } : {}),\n typeId: this.typeId,\n ...(this.selectionId ? { selectionId: this.selectionId } : {}),\n visible: this.visible,\n position: this.position.toArray(),\n rotation: this.rotation.toArray(),\n scale: this.scale.toArray(),\n ...(this.localMatrixOverride\n ? { matrix: [...this.localMatrixOverride] as unknown as ICEMatrix4Tuple }\n : {}),\n children: this._children.map((child) => child.toJSON()),\n };\n }\n\n dispose(): void {\n for (const child of [...this._children]) {\n this.removeChild(child, { dispose: true });\n }\n this.removeAllListeners();\n }\n\n private getRoot(): ICENode {\n let current: ICENode = this;\n while (current._parent) {\n current = current._parent;\n }\n return current;\n }\n\n private markSceneChanged(): void {\n this.getRoot()._revision += 1;\n }\n\n private isAncestorOf(node: ICENode): boolean {\n let current: ICENode | null = node;\n while (current) {\n if (current === this) {\n return true;\n }\n current = current._parent;\n }\n return false;\n }\n\n private localMatrix(target: ICEMatrix4): ICEMatrix4 {\n if (this.localMatrixOverride) {\n target.elements.set(this.localMatrixOverride);\n return target;\n }\n const x = this.rotation.x;\n const y = this.rotation.y;\n const z = this.rotation.z;\n const cx = Math.cos(x);\n const sx = Math.sin(x);\n const cy = Math.cos(y);\n const sy = Math.sin(y);\n const cz = Math.cos(z);\n const sz = Math.sin(z);\n const elements = target.elements;\n\n elements[0] = (cy * cz) * this.scale.x;\n elements[1] = (sx * sy * cz + cx * sz) * this.scale.x;\n elements[2] = (-cx * sy * cz + sx * sz) * this.scale.x;\n elements[3] = 0;\n elements[4] = (-cy * sz) * this.scale.y;\n elements[5] = (-sx * sy * sz + cx * cz) * this.scale.y;\n elements[6] = (cx * sy * sz + sx * cz) * this.scale.y;\n elements[7] = 0;\n elements[8] = sy * this.scale.z;\n elements[9] = -sx * cy * this.scale.z;\n elements[10] = cx * cy * this.scale.z;\n elements[11] = 0;\n elements[12] = this.position.x;\n elements[13] = this.position.y;\n elements[14] = this.position.z;\n elements[15] = 1;\n return target;\n }\n}\n\nconst collectIDs = (node: ICENode): string[] => [\n node.id,\n ...node.children.flatMap((child) => collectIDs(child)),\n];\n", "import { ICENode, type ICENodeOptions } from './ICENode.js';\n\nexport class ICEScene extends ICENode {\n constructor(options: ICENodeOptions) {\n super(options);\n }\n\n override get typeId(): string {\n return 'ice3:Scene';\n }\n}\n", "import type { ICEGeometry } from '../geometry/ICEGeometry.js';\nimport { ICEBoxGeometry as BoxGeometry } from '../geometry/ICEBoxGeometry.js';\nimport type { ICEBasicMaterial } from '../material/ICEBasicMaterial.js';\nimport { ICEBasicMaterial as BasicMaterial } from '../material/ICEBasicMaterial.js';\nimport { ICENode, type ICENodeOptions, type ICESerializedNode } from './ICENode.js';\n\nexport interface ICEMeshOptions extends ICENodeOptions {\n readonly geometry: ICEGeometry;\n readonly material: ICEBasicMaterial;\n}\n\nexport class ICEMesh extends ICENode {\n static readonly typeId = 'ice3:Mesh';\n\n readonly geometry: ICEGeometry;\n readonly material: ICEBasicMaterial;\n override readonly selectionId: string;\n\n constructor(options: ICEMeshOptions) {\n super(options);\n this.geometry = options.geometry;\n this.material = options.material;\n this.selectionId = options.selectionId?.trim() || options.id;\n }\n\n override get typeId(): string {\n return ICEMesh.typeId;\n }\n\n override toJSON(): ICESerializedNode {\n return {\n ...super.toJSON(),\n selectionId: this.selectionId,\n geometry: this.geometry.toJSON(),\n material: this.material.toJSON(),\n };\n }\n\n static fromJSON(value: ICESerializedNode): ICEMesh {\n const geometry = value.geometry as Record<string, unknown>;\n const material = value.material as Record<string, unknown>;\n return new ICEMesh({\n id: value.id,\n displayName: typeof value.displayName === 'string'\n ? value.displayName\n : value.id,\n ...(value.metadata ? { metadata: value.metadata } : {}),\n selectionId: typeof value.selectionId === 'string'\n ? value.selectionId\n : value.id,\n position: value.position,\n rotation: value.rotation,\n scale: value.scale,\n ...(value.matrix ? { matrix: value.matrix } : {}),\n geometry: new BoxGeometry({\n width: Number(geometry.width),\n height: Number(geometry.height),\n depth: Number(geometry.depth),\n }),\n material: new BasicMaterial({\n color: String(material.color),\n ...(typeof material.edgeColor === 'string'\n ? { edgeColor: material.edgeColor }\n : {}),\n }),\n });\n }\n}\n", "import type { ICENode, ICESerializedNode } from '../scene/ICENode.js';\n\nexport interface ICENodeType {\n readonly typeId: string;\n fromJSON(value: ICESerializedNode): ICENode;\n}\n\nexport class ICETypeRegistry {\n private readonly types = new Map<string, ICENodeType>();\n private readonly typeIds = new Map<ICENodeType, string>();\n\n register(typeId: string, type: ICENodeType): this {\n if (!/^[a-z][a-z0-9-]*:[A-Za-z_][A-Za-z0-9_-]*$/.test(typeId)) {\n throw new TypeError(`Invalid ICE type ID: ${typeId}`);\n }\n\n const registeredType = this.types.get(typeId);\n if (registeredType && registeredType !== type) {\n throw new TypeError(`Type ID already registered: ${typeId}`);\n }\n\n const registeredId = this.typeIds.get(type);\n if (registeredId && registeredId !== typeId) {\n throw new TypeError(`Type already registered as ${registeredId}`);\n }\n\n this.types.set(typeId, type);\n this.typeIds.set(type, typeId);\n return this;\n }\n\n get(typeId: string): ICENodeType | undefined {\n return this.types.get(typeId);\n }\n}\n", "import type { ICEDiagnostic } from '../diagnostics/ICEDiagnostic.js';\nimport type { ICETypeRegistry } from '../types/ICETypeRegistry.js';\nimport { ICENode, type ICESerializedNode } from '../scene/ICENode.js';\nimport { ICEScene } from '../scene/ICEScene.js';\n\nexport interface ICESerializedScene {\n readonly schemaVersion: 1;\n readonly typeId: 'ice3:Scene';\n readonly scene: ICESerializedNode;\n}\n\nexport interface ICEDeserializedScene {\n readonly scene: ICEScene;\n readonly report: Readonly<{ errors: readonly ICEDiagnostic[] }>;\n}\n\nexport function serializeScene(scene: ICEScene): ICESerializedScene {\n return {\n schemaVersion: 1,\n typeId: 'ice3:Scene',\n scene: scene.toJSON(),\n };\n}\n\nexport function deserializeScene(\n value: ICESerializedScene,\n registry: ICETypeRegistry,\n): ICEDeserializedScene {\n const errors: ICEDiagnostic[] = [];\n const scene = new ICEScene({\n id: value.scene.id,\n ...(value.scene.displayName\n ? { displayName: value.scene.displayName }\n : {}),\n ...(value.scene.metadata ? { metadata: value.scene.metadata } : {}),\n position: value.scene.position,\n rotation: value.scene.rotation,\n scale: value.scene.scale,\n });\n scene.visible = value.scene.visible;\n\n const buildChildren = (source: ICESerializedNode, parent: ICENode, path: string) => {\n source.children.forEach((child, index) => {\n const type = registry.get(child.typeId);\n if (!type) {\n errors.push({\n severity: 'error',\n code: 'ICE3_UNKNOWN_TYPE',\n message: `Unknown ICE node type: ${child.typeId}`,\n path: `${path}.children[${index}]`,\n });\n return;\n }\n try {\n const node = type.fromJSON(child);\n parent.addChild(node);\n buildChildren(child, node, `${path}.children[${index}]`);\n } catch (error) {\n errors.push({\n severity: 'error',\n code: 'ICE3_INVALID_NODE_DATA',\n message: `Invalid ICE node data: ${\n error instanceof Error ? error.message : String(error)\n }`,\n path: `${path}.children[${index}]`,\n });\n }\n });\n };\n\n buildChildren(value.scene, scene, 'scene');\n return { scene, report: { errors } };\n}\n", "import { ICEMesh, type ICENode, type ICEScene } from '@ice3/core';\n\nexport interface ICEGeometryRenderable {\n readonly id: string;\n readonly mesh: ICEMesh;\n readonly worldMatrix: Float32Array;\n}\n\nconst visit = (\n node: ICENode,\n parentVisible: boolean,\n output: ICEGeometryRenderable[],\n): void => {\n const visible = parentVisible && node.visible;\n if (visible && node instanceof ICEMesh) {\n output.push({\n id: node.id,\n mesh: node,\n worldMatrix: node.updateWorldMatrix().elements,\n });\n }\n for (const child of node.children) {\n visit(child, visible, output);\n }\n};\n\nexport function collectRenderables(\n scene: ICEScene,\n output: ICEGeometryRenderable[] = [],\n): readonly ICEGeometryRenderable[] {\n output.length = 0;\n visit(scene, true, output);\n return output;\n}\n\nexport const selectionIdentity = (mesh: ICEMesh): string => mesh.selectionId;\n", "import type {\n ICEBasicMaterial,\n ICEGeometry,\n ICENode,\n ICEScene,\n} from '@ice3/core';\n\nexport interface ICERenderBatchNode extends ICENode {\n readonly geometry: ICEGeometry;\n readonly material: ICEBasicMaterial;\n readonly semanticIds: readonly string[];\n readonly semanticNodeIds: readonly string[];\n readonly semanticSelectionIds: readonly string[];\n readonly materialKey: string;\n}\n\nexport interface ICERenderBatchDraw {\n readonly id: string;\n readonly batch: ICERenderBatchNode;\n readonly worldMatrix: Float32Array;\n}\n\nexport function collectRenderBatches(\n scene: ICEScene,\n output: ICERenderBatchDraw[] = [],\n): readonly ICERenderBatchDraw[] {\n output.length = 0;\n const visit = (node: ICENode, parentVisible: boolean): void => {\n const visible = parentVisible && node.visible;\n if (visible && isRenderBatch(node)) {\n output.push({\n id: node.id,\n batch: node,\n worldMatrix: node.updateWorldMatrix().elements,\n });\n }\n for (const child of node.children) visit(child, visible);\n };\n visit(scene, true);\n output.sort((left, right) => (\n left.batch.materialKey.localeCompare(right.batch.materialKey, 'en')\n || left.id.localeCompare(right.id, 'en')\n ));\n return output;\n}\n\nfunction isRenderBatch(node: ICENode): node is ICERenderBatchNode {\n if (node.typeId !== 'ice3:RenderBatch') return false;\n const candidate = node as unknown as Partial<ICERenderBatchNode>;\n return Boolean(\n candidate.geometry\n && candidate.material\n && candidate.semanticIds\n && candidate.semanticNodeIds\n && candidate.semanticSelectionIds\n && typeof candidate.materialKey === 'string',\n );\n}\n\nexport function semanticSelectionId(\n batch: Pick<ICERenderBatchNode, 'semanticSelectionIds'>,\n semanticIndex: number,\n): string | undefined {\n return Number.isInteger(semanticIndex) && semanticIndex >= 0\n ? batch.semanticSelectionIds[semanticIndex]\n : undefined;\n}\n", "import { ICEEngineError } from '@ice3/core';\nimport type { ICEMatrix4 } from '@ice3/core';\n\nconst VERTEX_SOURCE = `\nattribute vec3 a_position;\nattribute vec3 a_color;\nattribute vec4 a_instanceColumn0;\nattribute vec4 a_instanceColumn1;\nattribute vec4 a_instanceColumn2;\nattribute vec4 a_instanceColumn3;\nuniform mat4 u_worldViewProjection;\nuniform vec2 u_clipOffset;\nuniform float u_useInstancing;\nvarying vec3 v_color;\n\nvoid main() {\n mat4 instanceMatrix = mat4(\n a_instanceColumn0,\n a_instanceColumn1,\n a_instanceColumn2,\n a_instanceColumn3\n );\n vec4 localPosition = vec4(a_position, 1.0);\n vec4 position = mix(\n localPosition,\n instanceMatrix * localPosition,\n u_useInstancing\n );\n gl_Position = u_worldViewProjection * position;\n gl_Position.xy += u_clipOffset * gl_Position.w;\n v_color = a_color;\n}\n`;\n\nconst FRAGMENT_SOURCE = `\nprecision highp float;\nuniform vec4 u_color;\nuniform float u_useVertexColor;\nvarying vec3 v_color;\n\nvoid main() {\n gl_FragColor = vec4(\n u_color.rgb * mix(vec3(1.0), v_color, step(0.5, u_useVertexColor)),\n u_color.a\n );\n}\n`;\n\nexport class WebGL2Program {\n static readonly POSITION_ATTRIBUTE = 0;\n static readonly COLOR_ATTRIBUTE = 1;\n static readonly INSTANCE_MATRIX_ATTRIBUTE = 3;\n static readonly INSTANCE_SEMANTIC_ATTRIBUTE = 7;\n readonly program: WebGLProgram;\n private readonly matrixLocation: WebGLUniformLocation;\n private readonly colorLocation: WebGLUniformLocation;\n private readonly clipOffsetLocation: WebGLUniformLocation;\n private readonly vertexColorLocation: WebGLUniformLocation;\n private readonly instancingLocation: WebGLUniformLocation;\n\n constructor(private readonly gl: WebGL2RenderingContext) {\n const program = this.createProgram(VERTEX_SOURCE, FRAGMENT_SOURCE);\n const matrixLocation = gl.getUniformLocation(program, 'u_worldViewProjection');\n const colorLocation = gl.getUniformLocation(program, 'u_color');\n const clipOffsetLocation = gl.getUniformLocation(program, 'u_clipOffset');\n const vertexColorLocation = gl.getUniformLocation(program, 'u_useVertexColor');\n const instancingLocation = gl.getUniformLocation(program, 'u_useInstancing');\n if (\n !matrixLocation\n || !colorLocation\n || !clipOffsetLocation\n || !vertexColorLocation\n || !instancingLocation\n ) {\n gl.deleteProgram(program);\n throw new ICEEngineError(\n 'ICE3_SHADER_LINK_FAILED',\n 'ICE3_SHADER_LINK_FAILED: shader uniforms are missing',\n );\n }\n this.program = program;\n this.matrixLocation = matrixLocation;\n this.colorLocation = colorLocation;\n this.clipOffsetLocation = clipOffsetLocation;\n this.vertexColorLocation = vertexColorLocation;\n this.instancingLocation = instancingLocation;\n }\n\n use(): void {\n this.gl.useProgram(this.program);\n }\n\n setMatrix(matrix: ICEMatrix4): void {\n this.gl.uniformMatrix4fv(this.matrixLocation, false, matrix.elements);\n }\n\n setColor(color: readonly [number, number, number, number]): void {\n this.gl.uniform4f(this.colorLocation, ...color);\n }\n\n setClipOffset(x: number, y: number): void {\n this.gl.uniform2f(this.clipOffsetLocation, x, y);\n }\n\n setVertexColors(enabled: boolean): void {\n this.gl.uniform1f(this.vertexColorLocation, enabled ? 1 : 0);\n }\n\n setInstancing(enabled: boolean): void {\n this.gl.uniform1f(this.instancingLocation, enabled ? 1 : 0);\n }\n\n dispose(): void {\n this.gl.deleteProgram(this.program);\n }\n\n private createProgram(vertexSource: string, fragmentSource: string): WebGLProgram {\n const gl = this.gl;\n const vertex = this.compile(gl.VERTEX_SHADER, vertexSource);\n const fragment = this.compile(gl.FRAGMENT_SHADER, fragmentSource);\n const program = gl.createProgram();\n if (!program) {\n gl.deleteShader(vertex);\n gl.deleteShader(fragment);\n throw new ICEEngineError(\n 'ICE3_SHADER_LINK_FAILED',\n 'ICE3_SHADER_LINK_FAILED: program allocation failed',\n );\n }\n\n gl.attachShader(program, vertex);\n gl.attachShader(program, fragment);\n gl.bindAttribLocation(program, WebGL2Program.POSITION_ATTRIBUTE, 'a_position');\n gl.bindAttribLocation(program, WebGL2Program.COLOR_ATTRIBUTE, 'a_color');\n for (let column = 0; column < 4; column += 1) {\n gl.bindAttribLocation(\n program,\n WebGL2Program.INSTANCE_MATRIX_ATTRIBUTE + column,\n `a_instanceColumn${column}`,\n );\n }\n gl.linkProgram(program);\n gl.deleteShader(vertex);\n gl.deleteShader(fragment);\n\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n const log = gl.getProgramInfoLog(program) ?? 'unknown link error';\n gl.deleteProgram(program);\n throw new ICEEngineError(\n 'ICE3_SHADER_LINK_FAILED',\n `ICE3_SHADER_LINK_FAILED: ${log}`,\n );\n }\n return program;\n }\n\n private compile(type: number, source: string): WebGLShader {\n const gl = this.gl;\n const shader = gl.createShader(type);\n if (!shader) {\n throw new ICEEngineError(\n 'ICE3_SHADER_COMPILE_FAILED',\n 'ICE3_SHADER_COMPILE_FAILED: shader allocation failed',\n );\n }\n\n gl.shaderSource(shader, source);\n gl.compileShader(shader);\n if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n const log = gl.getShaderInfoLog(shader) ?? 'unknown compile error';\n gl.deleteShader(shader);\n throw new ICEEngineError(\n 'ICE3_SHADER_COMPILE_FAILED',\n `ICE3_SHADER_COMPILE_FAILED: ${log}`,\n );\n }\n return shader;\n }\n}\n", "import type {\n ICEBasicMaterial,\n ICEGeometry,\n} from '@ice3/core';\nimport type { ICEGeometryRenderable } from './Renderables.js';\n\nexport interface ICEInstanceBatch {\n readonly id: string;\n readonly geometry: ICEGeometry;\n readonly material: ICEBasicMaterial;\n readonly instanceMatrices: Float32Array;\n readonly semanticIds: readonly string[];\n readonly semanticIndices: Uint32Array;\n readonly meshIds: readonly string[];\n readonly materialKey: string;\n}\n\nexport function collectInstanceBatches(\n renderables: readonly ICEGeometryRenderable[],\n output: ICEInstanceBatch[] = [],\n): readonly ICEInstanceBatch[] {\n output.length = 0;\n const byGeometry = new Map<\n ICEGeometry,\n Map<ICEBasicMaterial, ICEGeometryRenderable[]>\n >();\n for (const renderable of renderables) {\n const byMaterial = byGeometry.get(renderable.mesh.geometry)\n ?? new Map<ICEBasicMaterial, ICEGeometryRenderable[]>();\n const group = byMaterial.get(renderable.mesh.material) ?? [];\n group.push(renderable);\n byMaterial.set(renderable.mesh.material, group);\n byGeometry.set(renderable.mesh.geometry, byMaterial);\n }\n for (const [geometry, byMaterial] of byGeometry) {\n for (const [material, group] of byMaterial) {\n if (group.length < 2) continue;\n const instanceMatrices = new Float32Array(group.length * 16);\n const semanticIndices = new Uint32Array(group.length);\n for (let index = 0; index < group.length; index += 1) {\n instanceMatrices.set(group[index]!.worldMatrix, index * 16);\n semanticIndices[index] = index;\n }\n output.push({\n id: `instance:${group[0]!.id}`,\n geometry,\n material,\n instanceMatrices,\n semanticIds: group.map((renderable) => renderable.mesh.selectionId),\n semanticIndices,\n meshIds: group.map((renderable) => renderable.id),\n materialKey: `${material.color}:${material.edgeColor ?? ''}`,\n });\n }\n }\n return output;\n}\n", "import type {\n ICEBasicMaterial,\n ICEGeometry,\n} from '@ice3/core';\nimport { WebGL2GeometryCache } from './WebGL2GeometryCache.js';\nimport type { ICEGeometryRenderable } from './Renderables.js';\nimport { WebGL2Program } from './WebGL2Program.js';\nimport type { ICEInstanceBatch } from './InstanceBatch.js';\n\nexport type { ICEGeometryRenderable } from './Renderables.js';\nexport {\n collectInstanceBatches,\n type ICEInstanceBatch,\n} from './InstanceBatch.js';\n\nexport interface WebGL2InstanceEntry {\n readonly vertexArray: WebGLVertexArrayObject;\n readonly matrixBuffer: WebGLBuffer;\n readonly semanticBuffer: WebGLBuffer;\n readonly triangleIndexBuffer: WebGLBuffer;\n readonly edgeIndexBuffer: WebGLBuffer | null;\n readonly triangleCount: number;\n readonly edgeCount: number;\n instanceCount: number;\n readonly bytes: number;\n}\n\nexport class WebGL2InstanceCache {\n private readonly entries = new Map<string, WebGL2InstanceEntry>();\n private active = new Set<string>();\n private gl: WebGL2RenderingContext | null = null;\n private fallbacks = 0;\n\n retain(\n gl: WebGL2RenderingContext,\n geometryCache: WebGL2GeometryCache,\n batch: ICEInstanceBatch,\n ): Readonly<WebGL2InstanceEntry> | undefined {\n this.gl = gl;\n this.active.add(batch.id);\n const geometry = geometryCache.retain(gl, batch.geometry);\n const existing = this.entries.get(batch.id);\n if (existing) {\n gl.bindBuffer(gl.ARRAY_BUFFER, existing.matrixBuffer);\n gl.bufferData(\n gl.ARRAY_BUFFER,\n batch.instanceMatrices,\n gl.DYNAMIC_DRAW,\n );\n gl.bindBuffer(gl.ARRAY_BUFFER, existing.semanticBuffer);\n gl.bufferData(\n gl.ARRAY_BUFFER,\n batch.semanticIndices,\n gl.DYNAMIC_DRAW,\n );\n gl.bindBuffer(gl.ARRAY_BUFFER, null);\n existing.instanceCount = batch.semanticIds.length;\n return existing;\n }\n\n const vertexArray = gl.createVertexArray();\n const matrixBuffer = gl.createBuffer();\n const semanticBuffer = gl.createBuffer();\n if (!vertexArray || !matrixBuffer || !semanticBuffer) {\n gl.deleteVertexArray(vertexArray);\n gl.deleteBuffer(matrixBuffer);\n gl.deleteBuffer(semanticBuffer);\n this.fallbacks += 1;\n return undefined;\n }\n gl.bindVertexArray(vertexArray);\n gl.bindBuffer(gl.ARRAY_BUFFER, geometry.positionBuffer);\n gl.enableVertexAttribArray(WebGL2Program.POSITION_ATTRIBUTE);\n gl.vertexAttribPointer(\n WebGL2Program.POSITION_ATTRIBUTE,\n 3,\n gl.FLOAT,\n false,\n 0,\n 0,\n );\n if (geometry.colorBuffer) {\n gl.bindBuffer(gl.ARRAY_BUFFER, geometry.colorBuffer);\n gl.enableVertexAttribArray(WebGL2Program.COLOR_ATTRIBUTE);\n gl.vertexAttribPointer(\n WebGL2Program.COLOR_ATTRIBUTE,\n 3,\n gl.FLOAT,\n false,\n 0,\n 0,\n );\n }\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, geometry.triangleIndexBuffer);\n\n gl.bindBuffer(gl.ARRAY_BUFFER, matrixBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, batch.instanceMatrices, gl.DYNAMIC_DRAW);\n for (let column = 0; column < 4; column += 1) {\n const location = WebGL2Program.INSTANCE_MATRIX_ATTRIBUTE + column;\n gl.enableVertexAttribArray(location);\n gl.vertexAttribPointer(\n location,\n 4,\n gl.FLOAT,\n false,\n 64,\n column * 16,\n );\n gl.vertexAttribDivisor(location, 1);\n }\n gl.bindBuffer(gl.ARRAY_BUFFER, semanticBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, batch.semanticIndices, gl.DYNAMIC_DRAW);\n gl.enableVertexAttribArray(WebGL2Program.INSTANCE_SEMANTIC_ATTRIBUTE);\n gl.vertexAttribPointer(\n WebGL2Program.INSTANCE_SEMANTIC_ATTRIBUTE,\n 1,\n gl.UNSIGNED_INT,\n false,\n 0,\n 0,\n );\n gl.vertexAttribDivisor(WebGL2Program.INSTANCE_SEMANTIC_ATTRIBUTE, 1);\n gl.bindVertexArray(null);\n gl.bindBuffer(gl.ARRAY_BUFFER, null);\n\n const entry: WebGL2InstanceEntry = {\n vertexArray,\n matrixBuffer,\n semanticBuffer,\n triangleIndexBuffer: geometry.triangleIndexBuffer,\n edgeIndexBuffer: geometry.edgeIndexBuffer,\n triangleCount: geometry.triangleCount,\n edgeCount: geometry.edgeCount,\n instanceCount: batch.semanticIds.length,\n bytes: batch.instanceMatrices.byteLength\n + batch.semanticIndices.byteLength,\n };\n this.entries.set(batch.id, entry);\n return entry;\n }\n\n beginFrame(): void {\n this.active = new Set();\n this.fallbacks = 0;\n }\n\n endFrame(): void {\n for (const [id, entry] of this.entries) {\n if (this.active.has(id)) continue;\n this.deleteEntry(entry);\n this.entries.delete(id);\n }\n }\n\n clear(): void {\n this.entries.clear();\n this.active.clear();\n this.gl = null;\n this.fallbacks = 0;\n }\n\n dispose(): void {\n if (this.gl) {\n for (const entry of this.entries.values()) {\n this.deleteEntry(entry);\n }\n }\n this.clear();\n }\n\n get fallbackCount(): number {\n return this.fallbacks;\n }\n\n get totalBytes(): number {\n return [...this.entries.values()]\n .reduce((sum, entry) => sum + entry.bytes, 0);\n }\n\n private deleteEntry(entry: WebGL2InstanceEntry): void {\n if (!this.gl) return;\n this.gl.deleteBuffer(entry.matrixBuffer);\n this.gl.deleteBuffer(entry.semanticBuffer);\n this.gl.deleteVertexArray(entry.vertexArray);\n }\n}\n", "import type { ICEGeometry } from '@ice3/core';\nimport { WebGL2Program } from './WebGL2Program.js';\n\nexport interface GeometryEntry {\n readonly vertexArray: WebGLVertexArrayObject;\n readonly positionBuffer: WebGLBuffer;\n readonly triangleIndexBuffer: WebGLBuffer;\n readonly edgeIndexBuffer: WebGLBuffer | null;\n readonly colorBuffer: WebGLBuffer | null;\n readonly semanticBuffer: WebGLBuffer | null;\n readonly triangleCount: number;\n readonly edgeCount: number;\n readonly bytes: number;\n lastUsedFrame: number;\n}\n\nexport interface WebGL2GeometryCacheOptions {\n readonly inactiveGraceFrames?: number;\n readonly maxBytes?: number;\n}\n\nexport class WebGL2GeometryCache {\n private readonly entries = new Map<ICEGeometry, GeometryEntry>();\n private active = new Set<ICEGeometry>();\n private readonly pinned = new Set<ICEGeometry>();\n private gl: WebGL2RenderingContext | null = null;\n private uploads = 0;\n private evictions = 0;\n private frameId = 0;\n private readonly inactiveGraceFrames: number;\n private readonly maxBytes: number;\n\n constructor(options: WebGL2GeometryCacheOptions = {}) {\n this.inactiveGraceFrames = options.inactiveGraceFrames ?? 60;\n this.maxBytes = options.maxBytes ?? 768 * 1024 * 1024;\n if (\n !Number.isInteger(this.inactiveGraceFrames)\n || this.inactiveGraceFrames < 0\n || !Number.isInteger(this.maxBytes)\n || this.maxBytes < 1\n ) {\n throw new Error('ICE3_GPU_CACHE_INVALID: cache options are invalid');\n }\n }\n\n retain(\n gl: WebGL2RenderingContext,\n geometry: ICEGeometry,\n ): Readonly<GeometryEntry> {\n this.gl = gl;\n this.active.add(geometry);\n const existing = this.entries.get(geometry);\n if (existing) {\n existing.lastUsedFrame = this.frameId;\n return existing;\n }\n\n const vertexArray = gl.createVertexArray();\n const positionBuffer = gl.createBuffer();\n const triangleIndexBuffer = gl.createBuffer();\n const edgeIndexBuffer = geometry.edgeIndices ? gl.createBuffer() : null;\n const colorBuffer = geometry.colors ? gl.createBuffer() : null;\n const semanticBuffer = geometry.semanticIndices ? gl.createBuffer() : null;\n if (\n !vertexArray\n || !positionBuffer\n || !triangleIndexBuffer\n || (geometry.edgeIndices && !edgeIndexBuffer)\n || (geometry.colors && !colorBuffer)\n || (geometry.semanticIndices && !semanticBuffer)\n ) {\n gl.deleteVertexArray(vertexArray);\n gl.deleteBuffer(positionBuffer);\n gl.deleteBuffer(triangleIndexBuffer);\n gl.deleteBuffer(edgeIndexBuffer);\n gl.deleteBuffer(colorBuffer);\n gl.deleteBuffer(semanticBuffer);\n throw new Error('ICE3_GPU_RESOURCE_FAILED: geometry buffers are unavailable');\n }\n gl.bindVertexArray(vertexArray);\n gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, geometry.positions, gl.STATIC_DRAW);\n gl.enableVertexAttribArray(WebGL2Program.POSITION_ATTRIBUTE);\n gl.vertexAttribPointer(\n WebGL2Program.POSITION_ATTRIBUTE,\n 3,\n gl.FLOAT,\n false,\n 0,\n 0,\n );\n if (colorBuffer && geometry.colors) {\n gl.bindBuffer(gl.ARRAY_BUFFER, colorBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, geometry.colors, gl.STATIC_DRAW);\n gl.enableVertexAttribArray(WebGL2Program.COLOR_ATTRIBUTE);\n gl.vertexAttribPointer(\n WebGL2Program.COLOR_ATTRIBUTE,\n 3,\n gl.FLOAT,\n false,\n 0,\n 0,\n );\n }\n if (semanticBuffer && geometry.semanticIndices) {\n gl.bindBuffer(gl.ARRAY_BUFFER, semanticBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, geometry.semanticIndices, gl.STATIC_DRAW);\n gl.enableVertexAttribArray(2);\n gl.vertexAttribPointer(2, 1, gl.UNSIGNED_INT, false, 0, 0);\n }\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, triangleIndexBuffer);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, geometry.indices, gl.STATIC_DRAW);\n if (edgeIndexBuffer && geometry.edgeIndices) {\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, edgeIndexBuffer);\n gl.bufferData(\n gl.ELEMENT_ARRAY_BUFFER,\n geometry.edgeIndices,\n gl.STATIC_DRAW,\n );\n }\n gl.bindVertexArray(null);\n\n const entry: GeometryEntry = {\n vertexArray,\n positionBuffer,\n triangleIndexBuffer,\n edgeIndexBuffer,\n colorBuffer,\n semanticBuffer,\n triangleCount: geometry.indices.length,\n edgeCount: geometry.edgeIndices?.length ?? 0,\n bytes:\n geometry.positions.byteLength\n + geometry.indices.byteLength\n + (geometry.edgeIndices?.byteLength ?? 0)\n + (geometry.colors?.byteLength ?? 0)\n + (geometry.semanticIndices?.byteLength ?? 0),\n lastUsedFrame: this.frameId,\n };\n this.entries.set(geometry, entry);\n this.uploads += 1;\n return entry;\n }\n\n beginFrame(): void {\n this.frameId += 1;\n this.active = new Set();\n }\n\n pin(\n gl: WebGL2RenderingContext,\n geometry: ICEGeometry,\n ): Readonly<GeometryEntry> {\n this.pinned.add(geometry);\n const entry = this.retain(gl, geometry);\n this.enforceBudget();\n if (this.totalBytes > this.maxBytes) {\n this.pinned.delete(geometry);\n this.deleteEntry(entry);\n this.entries.delete(geometry);\n throw new Error(\n 'ICE3_GPU_RESOURCE_FAILED: geometry exceeds the GPU residency budget',\n );\n }\n return entry;\n }\n\n unpin(geometry: ICEGeometry): void {\n this.pinned.delete(geometry);\n }\n\n endFrame(): void {\n for (const [geometry, entry] of this.entries) {\n if (this.active.has(geometry) || this.pinned.has(geometry)) {\n continue;\n }\n if (\n this.frameId - entry.lastUsedFrame\n < this.inactiveGraceFrames\n ) {\n continue;\n }\n this.deleteEntry(entry);\n this.entries.delete(geometry);\n }\n this.enforceBudget();\n }\n\n clear(): void {\n this.entries.clear();\n this.active.clear();\n this.pinned.clear();\n this.gl = null;\n }\n\n dispose(): void {\n if (this.gl) {\n for (const entry of this.entries.values()) {\n this.deleteEntry(entry);\n }\n }\n this.clear();\n }\n\n get totalBytes(): number {\n return [...this.entries.values()].reduce((sum, entry) => sum + entry.bytes, 0);\n }\n\n get uploadCount(): number {\n return this.uploads;\n }\n\n get evictionCount(): number {\n return this.evictions;\n }\n\n private deleteEntry(\n entry: GeometryEntry,\n ): void {\n if (!this.gl) return;\n this.gl.deleteBuffer(entry.positionBuffer);\n this.gl.deleteBuffer(entry.triangleIndexBuffer);\n this.gl.deleteBuffer(entry.edgeIndexBuffer);\n this.gl.deleteBuffer(entry.colorBuffer);\n this.gl.deleteBuffer(entry.semanticBuffer);\n this.gl.deleteVertexArray(entry.vertexArray);\n this.evictions += 1;\n }\n\n private enforceBudget(): void {\n let total = this.totalBytes;\n if (total <= this.maxBytes) return;\n const candidates = [...this.entries]\n .filter(([geometry]) => !this.pinned.has(geometry))\n .sort((left, right) => (\n left[1].lastUsedFrame - right[1].lastUsedFrame\n ));\n for (const [geometry, entry] of candidates) {\n if (total <= this.maxBytes) break;\n this.deleteEntry(entry);\n this.entries.delete(geometry);\n total -= entry.bytes;\n }\n }\n}\n", "const MAX_SELECTION_INDEX = 0xffffff;\n\nexport function encodeSelectionIndex(\n index: number,\n): readonly [number, number, number, 255] {\n if (!Number.isInteger(index) || index < 0 || index > MAX_SELECTION_INDEX) {\n throw new RangeError('ICE selection index is out of range');\n }\n return [\n index & 0xff,\n (index >>> 8) & 0xff,\n (index >>> 16) & 0xff,\n 255,\n ];\n}\n\nexport function decodeSelectionIndex(\n pixel: ArrayLike<number>,\n): number | undefined {\n if (pixel.length < 4) {\n throw new RangeError('ICE pick pixel must contain RGBA values');\n }\n const index = pixel[0]!\n + pixel[1]! * 256\n + pixel[2]! * 65_536;\n return index === 0 ? undefined : index;\n}\n", "import { ICEEngineError } from '@ice3/core';\nimport type { ICEMatrix4 } from '@ice3/core';\n\nconst VERTEX_SOURCE = `#version 300 es\nlayout(location = 0) in vec3 a_position;\nlayout(location = 2) in float a_semantic;\nlayout(location = 3) in vec4 a_instanceColumn0;\nlayout(location = 4) in vec4 a_instanceColumn1;\nlayout(location = 5) in vec4 a_instanceColumn2;\nlayout(location = 6) in vec4 a_instanceColumn3;\nlayout(location = 7) in float a_instanceSemantic;\nuniform mat4 u_worldViewProjection;\nuniform float u_useInstancing;\nflat out int v_semantic;\n\nvoid main() {\n mat4 instanceMatrix = mat4(\n a_instanceColumn0,\n a_instanceColumn1,\n a_instanceColumn2,\n a_instanceColumn3\n );\n vec4 localPosition = vec4(a_position, 1.0);\n vec4 position = mix(\n localPosition,\n instanceMatrix * localPosition,\n u_useInstancing\n );\n gl_Position = u_worldViewProjection * position;\n float semantic = mix(a_semantic, a_instanceSemantic, u_useInstancing);\n v_semantic = int(semantic + 0.5);\n}\n`;\n\nconst FRAGMENT_SOURCE = `#version 300 es\nprecision highp float;\nuniform float u_pickMode;\nuniform uint u_pickBase;\nuniform float u_highlightSemantic;\nuniform vec4 u_color;\nflat in int v_semantic;\nout vec4 outColor;\n\nvoid main() {\n if (u_pickMode > 0.5) {\n uint id = u_pickBase + uint(v_semantic) + 1u;\n outColor = vec4(\n float(id & 255u),\n float((id >> 8u) & 255u),\n float((id >> 16u) & 255u),\n 1.0\n ) / 255.0;\n return;\n }\n if (abs(float(v_semantic) - u_highlightSemantic) > 0.1) discard;\n outColor = u_color;\n}\n`;\n\nexport class WebGL2SemanticProgram {\n private readonly program: WebGLProgram;\n private readonly matrixLocation: WebGLUniformLocation;\n private readonly pickModeLocation: WebGLUniformLocation;\n private readonly pickBaseLocation: WebGLUniformLocation;\n private readonly highlightLocation: WebGLUniformLocation;\n private readonly colorLocation: WebGLUniformLocation;\n private readonly instancingLocation: WebGLUniformLocation;\n\n constructor(private readonly gl: WebGL2RenderingContext) {\n const program = this.createProgram(VERTEX_SOURCE, FRAGMENT_SOURCE);\n const matrixLocation = gl.getUniformLocation(program, 'u_worldViewProjection');\n const pickModeLocation = gl.getUniformLocation(program, 'u_pickMode');\n const pickBaseLocation = gl.getUniformLocation(program, 'u_pickBase');\n const highlightLocation = gl.getUniformLocation(program, 'u_highlightSemantic');\n const colorLocation = gl.getUniformLocation(program, 'u_color');\n const instancingLocation = gl.getUniformLocation(program, 'u_useInstancing');\n if (\n !matrixLocation\n || !pickModeLocation\n || !pickBaseLocation\n || !highlightLocation\n || !colorLocation\n || !instancingLocation\n ) {\n gl.deleteProgram(program);\n throw new ICEEngineError(\n 'ICE3_SHADER_LINK_FAILED',\n 'ICE3_SHADER_LINK_FAILED: semantic uniforms are missing',\n );\n }\n this.program = program;\n this.matrixLocation = matrixLocation;\n this.pickModeLocation = pickModeLocation;\n this.pickBaseLocation = pickBaseLocation;\n this.highlightLocation = highlightLocation;\n this.colorLocation = colorLocation;\n this.instancingLocation = instancingLocation;\n }\n\n use(): void {\n this.gl.useProgram(this.program);\n }\n\n setMatrix(matrix: ICEMatrix4): void {\n this.gl.uniformMatrix4fv(this.matrixLocation, false, matrix.elements);\n }\n\n setPick(base: number): void {\n this.gl.uniform1f(this.pickModeLocation, 1);\n this.gl.uniform1ui(this.pickBaseLocation, base);\n }\n\n setHighlight(semanticIndex: number): void {\n this.gl.uniform1f(this.pickModeLocation, 0);\n this.gl.uniform1f(this.highlightLocation, semanticIndex);\n this.gl.uniform4f(this.colorLocation, 1, 208 / 255, 0, 0.72);\n }\n\n setInstancing(enabled: boolean): void {\n this.gl.uniform1f(this.instancingLocation, enabled ? 1 : 0);\n }\n\n dispose(): void {\n this.gl.deleteProgram(this.program);\n }\n\n private createProgram(vertexSource: string, fragmentSource: string): WebGLProgram {\n const gl = this.gl;\n const vertex = this.compile(gl.VERTEX_SHADER, vertexSource);\n const fragment = this.compile(gl.FRAGMENT_SHADER, fragmentSource);\n const program = gl.createProgram();\n if (!program) {\n gl.deleteShader(vertex);\n gl.deleteShader(fragment);\n throw new ICEEngineError(\n 'ICE3_SHADER_LINK_FAILED',\n 'ICE3_SHADER_LINK_FAILED: program allocation failed',\n );\n }\n gl.attachShader(program, vertex);\n gl.attachShader(program, fragment);\n gl.linkProgram(program);\n gl.deleteShader(vertex);\n gl.deleteShader(fragment);\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n const log = gl.getProgramInfoLog(program) ?? 'unknown link error';\n gl.deleteProgram(program);\n throw new ICEEngineError(\n 'ICE3_SHADER_LINK_FAILED',\n `ICE3_SHADER_LINK_FAILED: ${log}`,\n );\n }\n return program;\n }\n\n private compile(type: number, source: string): WebGLShader {\n const gl = this.gl;\n const shader = gl.createShader(type);\n if (!shader) {\n throw new ICEEngineError(\n 'ICE3_SHADER_COMPILE_FAILED',\n 'ICE3_SHADER_COMPILE_FAILED: shader allocation failed',\n );\n }\n gl.shaderSource(shader, source);\n gl.compileShader(shader);\n if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n const log = gl.getShaderInfoLog(shader) ?? 'unknown compile error';\n gl.deleteShader(shader);\n throw new ICEEngineError(\n 'ICE3_SHADER_COMPILE_FAILED',\n `ICE3_SHADER_COMPILE_FAILED: ${log}`,\n );\n }\n return shader;\n }\n}\n", "import { ICEEngineError, ICEMatrix4 } from '@ice3/core';\nimport type { ICEGeometryRenderable } from './WebGL2GeometryBatch.js';\nimport type { WebGL2GeometryCache } from './WebGL2GeometryCache.js';\nimport type {\n ICEInstanceBatch,\n WebGL2InstanceCache,\n} from './WebGL2InstanceBatch.js';\nimport {\n decodeSelectionIndex,\n encodeSelectionIndex,\n} from './WebGL2PickCodec.js';\nimport { WebGL2Program } from './WebGL2Program.js';\nimport type { ICERenderBatchDraw } from './WebGL2RenderBatch.js';\nimport { WebGL2SemanticProgram } from './WebGL2SemanticProgram.js';\nimport type { ICEFrame, ICEScreenPoint } from './types.js';\n\nexport type ICEPickFrame = ICEFrame & {\n readonly point: ICEScreenPoint;\n};\n\nexport class WebGL2Picker {\n private readonly program: WebGL2Program;\n private readonly semanticProgram: WebGL2SemanticProgram;\n private framebuffer: WebGLFramebuffer | null = null;\n private colorTexture: WebGLTexture | null = null;\n private depthBuffer: WebGLRenderbuffer | null = null;\n private width = 0;\n private height = 0;\n\n constructor(private readonly gl: WebGL2RenderingContext) {\n this.program = new WebGL2Program(gl);\n this.semanticProgram = new WebGL2SemanticProgram(gl);\n }\n\n pick(\n frame: ICEPickFrame,\n cache: WebGL2GeometryCache,\n renderables: readonly ICEGeometryRenderable[],\n batches: readonly ICERenderBatchDraw[] = [],\n instances: readonly ICEInstanceBatch[] = [],\n instanceCache: WebGL2InstanceCache | null = null,\n ): string | undefined {\n const pickIds = new Map<number, string>();\n const selectionIds = new Map<string, number>();\n for (const renderable of renderables) {\n const id = renderable.mesh.selectionId;\n if (!selectionIds.has(id)) {\n if (selectionIds.size >= 0xffffff) {\n throw new ICEEngineError(\n 'ICE3_PICK_CAPACITY',\n 'ICE3_PICK_CAPACITY: too many selectable devices',\n );\n }\n const index = selectionIds.size + 1;\n selectionIds.set(id, index);\n pickIds.set(index, id);\n }\n }\n this.ensureTarget(\n Math.max(1, Math.round(frame.viewport.width * frame.dpr)),\n Math.max(1, Math.round(frame.viewport.height * frame.dpr)),\n );\n const gl = this.gl;\n gl.bindFramebuffer(gl.FRAMEBUFFER, this.framebuffer);\n gl.viewport(0, 0, this.width, this.height);\n gl.clearColor(0, 0, 0, 1);\n gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);\n gl.enable(gl.DEPTH_TEST);\n gl.depthFunc(gl.LEQUAL);\n gl.disable(gl.BLEND);\n this.program.use();\n this.program.setClipOffset(0, 0);\n this.program.setInstancing(false);\n const aspect = frame.viewport.width / Math.max(frame.viewport.height, 1);\n const viewProjection = frame.camera.getViewProjectionMatrix(aspect);\n const mvp = new ICEMatrix4();\n const world = new ICEMatrix4();\n const instancedMeshIds = new Set<string>();\n if (instanceCache) {\n for (const batch of instances) {\n if (instanceCache.retain(gl, cache, batch)) {\n for (const id of batch.meshIds) instancedMeshIds.add(id);\n }\n }\n }\n for (const renderable of renderables) {\n if (instancedMeshIds.has(renderable.id)) continue;\n const selectionIndex = selectionIds.get(renderable.mesh.selectionId)!;\n const color = encodeSelectionIndex(selectionIndex);\n this.program.setColor([\n color[0] / 255,\n color[1] / 255,\n color[2] / 255,\n 1,\n ]);\n mvp.elements.set(viewProjection.elements);\n world.elements.set(renderable.worldMatrix);\n mvp.multiply(world);\n this.program.setMatrix(mvp);\n this.program.setVertexColors(false);\n const geometry = cache.retain(gl, renderable.mesh.geometry);\n gl.bindVertexArray(geometry.vertexArray);\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, geometry.triangleIndexBuffer);\n gl.drawElements(\n gl.TRIANGLES,\n geometry.triangleCount,\n renderable.mesh.geometry.indices instanceof Uint16Array\n ? gl.UNSIGNED_SHORT\n : gl.UNSIGNED_INT,\n 0,\n );\n }\n this.semanticProgram.use();\n let nextPickId = selectionIds.size + 1;\n if (instanceCache) {\n this.semanticProgram.setInstancing(true);\n mvp.elements.set(viewProjection.elements);\n this.semanticProgram.setMatrix(mvp);\n for (const batch of instances) {\n const instance = instanceCache.retain(gl, cache, batch);\n if (!instance) continue;\n const base = nextPickId - 1;\n for (const id of batch.semanticIds) {\n if (nextPickId > 0xffffff) {\n throw new ICEEngineError(\n 'ICE3_PICK_CAPACITY',\n 'ICE3_PICK_CAPACITY: too many selectable instances',\n );\n }\n pickIds.set(nextPickId, id);\n nextPickId += 1;\n }\n this.semanticProgram.setPick(base);\n gl.bindVertexArray(instance.vertexArray);\n gl.drawElementsInstanced(\n gl.TRIANGLES,\n instance.triangleCount,\n batch.geometry.indices instanceof Uint16Array\n ? gl.UNSIGNED_SHORT\n : gl.UNSIGNED_INT,\n 0,\n instance.instanceCount,\n );\n }\n }\n this.semanticProgram.setInstancing(false);\n for (const draw of batches) {\n const base = nextPickId - 1;\n for (const id of draw.batch.semanticSelectionIds) {\n if (nextPickId > 0xffffff) {\n throw new ICEEngineError(\n 'ICE3_PICK_CAPACITY',\n 'ICE3_PICK_CAPACITY: too many selectable batch devices',\n );\n }\n pickIds.set(nextPickId, id);\n nextPickId += 1;\n }\n mvp.elements.set(viewProjection.elements);\n world.elements.set(draw.worldMatrix);\n mvp.multiply(world);\n this.semanticProgram.setMatrix(mvp);\n this.semanticProgram.setPick(base);\n const geometry = cache.retain(gl, draw.batch.geometry);\n gl.bindVertexArray(geometry.vertexArray);\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, geometry.triangleIndexBuffer);\n gl.drawElements(\n gl.TRIANGLES,\n geometry.triangleCount,\n draw.batch.geometry.indices instanceof Uint16Array\n ? gl.UNSIGNED_SHORT\n : gl.UNSIGNED_INT,\n 0,\n );\n }\n const pixelX = Math.max(\n 0,\n Math.min(\n this.width - 1,\n Math.floor(frame.point.x * frame.dpr),\n ),\n );\n const pixelY = Math.max(\n 0,\n Math.min(\n this.height - 1,\n Math.floor((frame.viewport.height - frame.point.y) * frame.dpr),\n ),\n );\n gl.pixelStorei(gl.PACK_ALIGNMENT, 1);\n const pixel = new Uint8Array(4);\n gl.readPixels(pixelX, pixelY, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, pixel);\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n gl.viewport(\n frame.viewport.x * frame.dpr,\n frame.viewport.y * frame.dpr,\n frame.viewport.width * frame.dpr,\n frame.viewport.height * frame.dpr,\n );\n const index = decodeSelectionIndex(pixel);\n return index === undefined ? undefined : pickIds.get(index);\n }\n\n dispose(): void {\n this.releaseTarget();\n this.program.dispose();\n this.semanticProgram.dispose();\n }\n\n private ensureTarget(width: number, height: number): void {\n if (\n this.framebuffer\n && this.colorTexture\n && this.depthBuffer\n && this.width === width\n && this.height === height\n ) {\n return;\n }\n this.releaseTarget();\n const gl = this.gl;\n const framebuffer = gl.createFramebuffer();\n const colorTexture = gl.createTexture();\n const depthBuffer = gl.createRenderbuffer();\n if (!framebuffer || !colorTexture || !depthBuffer) {\n gl.deleteFramebuffer(framebuffer);\n gl.deleteTexture(colorTexture);\n gl.deleteRenderbuffer(depthBuffer);\n throw new ICEEngineError(\n 'ICE3_PICK_UNAVAILABLE',\n 'ICE3_PICK_UNAVAILABLE: pick target allocation failed',\n );\n }\n gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);\n gl.bindTexture(gl.TEXTURE_2D, colorTexture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.texImage2D(\n gl.TEXTURE_2D,\n 0,\n gl.RGBA8,\n width,\n height,\n 0,\n gl.RGBA,\n gl.UNSIGNED_BYTE,\n null,\n );\n gl.framebufferTexture2D(\n gl.FRAMEBUFFER,\n gl.COLOR_ATTACHMENT0,\n gl.TEXTURE_2D,\n colorTexture,\n 0,\n );\n gl.bindRenderbuffer(gl.RENDERBUFFER, depthBuffer);\n gl.renderbufferStorage(\n gl.RENDERBUFFER,\n gl.DEPTH_COMPONENT16,\n width,\n height,\n );\n gl.framebufferRenderbuffer(\n gl.FRAMEBUFFER,\n gl.DEPTH_ATTACHMENT,\n gl.RENDERBUFFER,\n depthBuffer,\n );\n if (gl.checkFramebufferStatus(gl.FRAMEBUFFER) !== gl.FRAMEBUFFER_COMPLETE) {\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n gl.deleteFramebuffer(framebuffer);\n gl.deleteTexture(colorTexture);\n gl.deleteRenderbuffer(depthBuffer);\n throw new ICEEngineError(\n 'ICE3_PICK_UNAVAILABLE',\n 'ICE3_PICK_UNAVAILABLE: pick framebuffer is incomplete',\n );\n }\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n this.framebuffer = framebuffer;\n this.colorTexture = colorTexture;\n this.depthBuffer = depthBuffer;\n this.width = width;\n this.height = height;\n }\n\n private releaseTarget(): void {\n const gl = this.gl;\n gl.deleteFramebuffer(this.framebuffer);\n gl.deleteTexture(this.colorTexture);\n gl.deleteRenderbuffer(this.depthBuffer);\n this.framebuffer = null;\n this.colorTexture = null;\n this.depthBuffer = null;\n }\n}\n", "const COLOR_CACHE_LIMIT = 128;\nconst COLOR_CACHE = new Map<\n string,\n readonly [number, number, number, number]\n>();\n\nexport function colorToRgba(\n color: string,\n): readonly [number, number, number, number] {\n const normalized = color.startsWith('#') ? color.slice(1) : color;\n const expanded = normalized.length === 3\n ? normalized.split('').map((part) => part + part).join('')\n : normalized;\n if (!/^[0-9a-fA-F]{6}$/.test(expanded)) {\n throw new Error(`Unsupported ICE basic material color: ${color}`);\n }\n const key = expanded.toLowerCase();\n const cached = COLOR_CACHE.get(key);\n if (cached) return cached;\n const rgba = Object.freeze([\n Number.parseInt(expanded.slice(0, 2), 16) / 255,\n Number.parseInt(expanded.slice(2, 4), 16) / 255,\n Number.parseInt(expanded.slice(4, 6), 16) / 255,\n 1,\n ]) as readonly [number, number, number, number];\n if (COLOR_CACHE.size >= COLOR_CACHE_LIMIT) {\n const oldest = COLOR_CACHE.keys().next().value as string | undefined;\n if (oldest !== undefined) COLOR_CACHE.delete(oldest);\n }\n COLOR_CACHE.set(key, rgba);\n return rgba;\n}\n", "export type ICEFrameStageProfile = Readonly<{\n collectMs: number;\n prepareAndUploadMs: number;\n encodeMs: number;\n submitMs: number;\n}>;\n\ntype Stage = 'collect' | 'prepareAndUpload' | 'encode' | 'submit';\n\nexport class RendererProfiler {\n private enabled = false;\n private cursor = 0;\n private readonly marks = new Map<Stage, number>();\n\n enable(value: boolean): void {\n this.enabled = value;\n this.marks.clear();\n }\n\n get isEnabled(): boolean {\n return this.enabled;\n }\n\n begin(): void {\n if (!this.enabled) return;\n this.cursor = performance.now();\n this.marks.clear();\n }\n\n mark(stage: Stage): void {\n if (!this.enabled) return;\n const now = performance.now();\n this.marks.set(stage, Math.max(0, now - this.cursor));\n this.cursor = now;\n }\n\n end(): ICEFrameStageProfile | null {\n if (!this.enabled) return null;\n return {\n collectMs: this.marks.get('collect') ?? 0,\n prepareAndUploadMs: this.marks.get('prepareAndUpload') ?? 0,\n encodeMs: this.marks.get('encode') ?? 0,\n submitMs: this.marks.get('submit')\n ?? Math.max(0, performance.now() - this.cursor),\n };\n }\n}\n", "import {\n ICEEngineError,\n ICEMatrix4,\n type ICEGeometry,\n} from '@ice3/core';\nimport {\n collectRenderables,\n selectionIdentity,\n type ICEGeometryRenderable,\n} from './WebGL2GeometryBatch.js';\nimport {\n collectRenderBatches,\n type ICERenderBatchDraw,\n} from './WebGL2RenderBatch.js';\nimport {\n collectInstanceBatches,\n WebGL2InstanceCache,\n type ICEInstanceBatch,\n} from './WebGL2InstanceBatch.js';\nimport { WebGL2GeometryCache } from './WebGL2GeometryCache.js';\nimport { WebGL2Picker } from './WebGL2Picker.js';\nimport { WebGL2Program } from './WebGL2Program.js';\nimport { WebGL2SemanticProgram } from './WebGL2SemanticProgram.js';\nimport { colorToRgba } from './Color.js';\nimport {\n RendererProfiler,\n type ICEFrameStageProfile,\n} from './RendererProfiler.js';\nimport type {\n ICERendererBackend,\n ICERendererCapabilities,\n ICEFrame,\n ICEScreenPoint,\n ICEViewport,\n} from './types.js';\n\nconst EDGE_PIXEL_OFFSETS = [\n [0, 0],\n [-1, 0],\n [1, 0],\n [0, -1],\n [0, 1],\n] as const;\n\nconst SELECTION_RGBA = [255 / 255, 208 / 255, 0] as const;\nconst SELECTION_TINT_ALPHA = 0.65;\nexport { colorToRgba } from './Color.js';\n\nexport class WebGL2RendererBackend implements ICERendererBackend {\n capabilities: Readonly<ICERendererCapabilities> = {\n backend: 'webgl2',\n maxTextureSize: 0,\n picking: true,\n };\n\n private canvas: HTMLCanvasElement | null = null;\n private gl: WebGL2RenderingContext | null = null;\n private viewport: ICEViewport = { x: 0, y: 0, width: 1, height: 1 };\n private dpr = 1;\n private onContextLost: (() => void) | undefined;\n private onContextRestored: (() => void) | undefined;\n private program: WebGL2Program | null = null;\n private semanticProgram: WebGL2SemanticProgram | null = null;\n private geometryCache: WebGL2GeometryCache | null = null;\n private instanceCache: WebGL2InstanceCache | null = null;\n private picker: WebGL2Picker | null = null;\n private readonly mvpScratch = new ICEMatrix4();\n private readonly worldScratch = new ICEMatrix4();\n private readonly renderablesScratch: ICEGeometryRenderable[] = [];\n private readonly batchesScratch: ICERenderBatchDraw[] = [];\n private readonly instancesScratch: ICEInstanceBatch[] = [];\n private readonly instancedMeshIds = new Set<string>();\n private readonly profiler = new RendererProfiler();\n private lastFrameProfile: ICEFrameStageProfile | null = null;\n private backgroundRgba: readonly [number, number, number, number] = [\n 0.035,\n 0.055,\n 0.09,\n 1,\n ];\n private frameStats = {\n drawCalls: 0,\n renderedMeshes: 0,\n renderedBatches: 0,\n instancingFallbacks: 0,\n gpuUploads: 0,\n gpuEvictions: 0,\n gpuBytes: 0,\n };\n private readonly handleContextLost = (event: Event): void => {\n event.preventDefault();\n this.picker = null;\n this.program = null;\n this.geometryCache?.clear();\n this.geometryCache = null;\n this.instanceCache?.clear();\n this.instanceCache = null;\n this.onContextLost?.();\n };\n private readonly handleContextRestored = (): void => {\n if (this.gl) {\n this.gl.enable(this.gl.DEPTH_TEST);\n this.gl.depthFunc(this.gl.LEQUAL);\n this.gl.enable(this.gl.POLYGON_OFFSET_FILL);\n this.gl.polygonOffset(2, 4);\n this.gl.viewport(\n this.viewport.x * this.dpr,\n this.viewport.y * this.dpr,\n this.viewport.width * this.dpr,\n this.viewport.height * this.dpr,\n );\n this.createProgram(this.gl);\n }\n this.onContextRestored?.();\n };\n\n initialize(options: {\n readonly canvas: HTMLCanvasElement;\n readonly onContextLost?: () => void;\n readonly onContextRestored?: () => void;\n }): void {\n const gl = options.canvas.getContext('webgl2', {\n alpha: true,\n antialias: true,\n premultipliedAlpha: true,\n preserveDrawingBuffer: true,\n });\n if (!gl) {\n throw new ICEEngineError(\n 'ICE3_WEBGL2_UNAVAILABLE',\n 'ICE3_WEBGL2_UNAVAILABLE: ICE3 requires a WebGL2-capable canvas',\n );\n }\n\n this.canvas = options.canvas;\n this.gl = gl;\n this.onContextLost = options.onContextLost;\n this.onContextRestored = options.onContextRestored;\n this.capabilities = {\n backend: 'webgl2',\n maxTextureSize: gl.getParameter(gl.MAX_TEXTURE_SIZE) as number,\n picking: true,\n };\n gl.enable(gl.DEPTH_TEST);\n gl.depthFunc(gl.LEQUAL);\n gl.enable(gl.POLYGON_OFFSET_FILL);\n gl.polygonOffset(2, 4);\n this.createProgram(gl);\n this.canvas.addEventListener('webglcontextlost', this.handleContextLost);\n this.canvas.addEventListener('webglcontextrestored', this.handleContextRestored);\n }\n\n resize(viewport: ICEViewport, dpr: number): void {\n if (!this.canvas || !this.gl) {\n throw new ICEEngineError('ICE3_ENGINE_NOT_READY', 'Renderer is not initialized');\n }\n this.viewport = { ...viewport };\n this.dpr = dpr;\n this.canvas.width = Math.max(1, Math.round(viewport.width * dpr));\n this.canvas.height = Math.max(1, Math.round(viewport.height * dpr));\n this.gl.viewport(\n viewport.x * dpr,\n viewport.y * dpr,\n viewport.width * dpr,\n viewport.height * dpr,\n );\n }\n\n setBackgroundColor(color: string): void {\n this.backgroundRgba = colorToRgba(color);\n }\n\n prepareBatchGeometry(geometry: ICEGeometry): void {\n if (!this.gl || !this.geometryCache) {\n throw new ICEEngineError(\n 'ICE3_ENGINE_NOT_READY',\n 'Renderer is not initialized',\n );\n }\n this.geometryCache.pin(this.gl, geometry);\n }\n\n releaseBatchGeometry(geometry: ICEGeometry): void {\n this.geometryCache?.unpin(geometry);\n }\n\n render(frame: ICEFrame): void {\n if (\n !this.gl\n || !this.program\n || !this.geometryCache\n ) {\n throw new ICEEngineError('ICE3_ENGINE_NOT_READY', 'Renderer is not initialized');\n }\n this.profiler.begin();\n this.lastFrameProfile = null;\n const gl = this.gl;\n gl.clearColor(...this.backgroundRgba);\n gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);\n\n const aspect = frame.viewport.width / Math.max(frame.viewport.height, 1);\n const viewProjection = frame.camera.getViewProjectionMatrix(aspect);\n const mvp = this.mvpScratch;\n this.frameStats = {\n drawCalls: 0,\n renderedMeshes: 0,\n renderedBatches: 0,\n instancingFallbacks: 0,\n gpuUploads: 0,\n gpuEvictions: 0,\n gpuBytes: 0,\n };\n\n this.program.use();\n this.program.setClipOffset(0, 0);\n this.geometryCache.beginFrame();\n this.instanceCache!.beginFrame();\n this.instancedMeshIds.clear();\n const world = this.worldScratch;\n const clipPixelX = 2 / Math.max(1, frame.viewport.width * frame.dpr);\n const clipPixelY = 2 / Math.max(1, frame.viewport.height * frame.dpr);\n const renderables = collectRenderables(\n frame.scene,\n this.renderablesScratch,\n );\n const instances = collectInstanceBatches(\n renderables,\n this.instancesScratch,\n );\n const batches = collectRenderBatches(frame.scene, this.batchesScratch);\n this.profiler.mark('collect');\n this.program.setInstancing(true);\n this.profiler.mark('prepareAndUpload');\n for (const batch of instances) {\n const instance = this.instanceCache!.retain(\n gl,\n this.geometryCache,\n batch,\n );\n if (!instance) continue;\n for (const id of batch.meshIds) this.instancedMeshIds.add(id);\n mvp.elements.set(viewProjection.elements);\n this.program.setMatrix(mvp);\n this.program.setColor(colorToRgba(batch.material.color));\n this.program.setVertexColors(Boolean(batch.geometry.colors));\n gl.bindVertexArray(instance.vertexArray);\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, instance.triangleIndexBuffer);\n gl.drawElementsInstanced(\n gl.TRIANGLES,\n instance.triangleCount,\n batch.geometry.indices instanceof Uint16Array\n ? gl.UNSIGNED_SHORT\n : gl.UNSIGNED_INT,\n 0,\n instance.instanceCount,\n );\n this.frameStats.drawCalls += 1;\n if (batch.material.edgeColor && instance.edgeCount > 0) {\n this.program.setVertexColors(false);\n this.program.setColor(colorToRgba(batch.material.edgeColor));\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, instance.edgeIndexBuffer);\n for (const [offsetX, offsetY] of EDGE_PIXEL_OFFSETS) {\n this.program.setClipOffset(\n offsetX * clipPixelX,\n offsetY * clipPixelY,\n );\n gl.drawElementsInstanced(\n gl.LINES,\n instance.edgeCount,\n batch.geometry.edgeIndices instanceof Uint16Array\n ? gl.UNSIGNED_SHORT\n : gl.UNSIGNED_INT,\n 0,\n instance.instanceCount,\n );\n this.frameStats.drawCalls += 1;\n }\n }\n }\n this.program.setInstancing(false);\n this.program.setClipOffset(0, 0);\n for (const draw of batches) {\n this.program.setClipOffset(0, 0);\n mvp.elements.set(viewProjection.elements);\n world.elements.set(draw.worldMatrix);\n mvp.multiply(world);\n this.program.setMatrix(mvp);\n this.program.setColor(colorToRgba(draw.batch.material.color));\n const geometry = this.geometryCache.retain(gl, draw.batch.geometry);\n this.program.setVertexColors(Boolean(draw.batch.geometry.colors));\n gl.bindVertexArray(geometry.vertexArray);\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, geometry.triangleIndexBuffer);\n gl.drawElements(\n gl.TRIANGLES,\n geometry.triangleCount,\n draw.batch.geometry.indices instanceof Uint16Array\n ? gl.UNSIGNED_SHORT\n : gl.UNSIGNED_INT,\n 0,\n );\n this.frameStats.drawCalls += 1;\n this.frameStats.renderedBatches += 1;\n if (draw.batch.material.edgeColor) {\n this.program.setVertexColors(false);\n this.program.setColor(colorToRgba(draw.batch.material.edgeColor));\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, geometry.edgeIndexBuffer);\n for (const [offsetX, offsetY] of EDGE_PIXEL_OFFSETS) {\n this.program.setClipOffset(\n offsetX * clipPixelX,\n offsetY * clipPixelY,\n );\n gl.drawElements(\n gl.LINES,\n geometry.edgeCount,\n draw.batch.geometry.edgeIndices instanceof Uint16Array\n ? gl.UNSIGNED_SHORT\n : gl.UNSIGNED_INT,\n 0,\n );\n this.frameStats.drawCalls += 1;\n }\n }\n }\n for (const renderable of renderables) {\n if (this.instancedMeshIds.has(renderable.id)) continue;\n this.program.setClipOffset(0, 0);\n mvp.elements.set(viewProjection.elements);\n world.elements.set(renderable.worldMatrix);\n mvp.multiply(world);\n this.program.setMatrix(mvp);\n this.program.setColor(colorToRgba(renderable.mesh.material.color));\n const geometry = this.geometryCache.retain(gl, renderable.mesh.geometry);\n this.program.setVertexColors(Boolean(renderable.mesh.geometry.colors));\n gl.bindVertexArray(geometry.vertexArray);\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, geometry.triangleIndexBuffer);\n gl.drawElements(\n gl.TRIANGLES,\n geometry.triangleCount,\n renderable.mesh.geometry.indices instanceof Uint16Array\n ? gl.UNSIGNED_SHORT\n : gl.UNSIGNED_INT,\n 0,\n );\n this.frameStats.drawCalls += 1;\n if (renderable.mesh.material.edgeColor) {\n this.program.setVertexColors(false);\n this.program.setColor(\n colorToRgba(renderable.mesh.material.edgeColor),\n );\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, geometry.edgeIndexBuffer);\n for (const [offsetX, offsetY] of EDGE_PIXEL_OFFSETS) {\n this.program.setClipOffset(\n offsetX * clipPixelX,\n offsetY * clipPixelY,\n );\n gl.drawElements(\n gl.LINES,\n geometry.edgeCount,\n renderable.mesh.geometry.edgeIndices instanceof Uint16Array\n ? gl.UNSIGNED_SHORT\n : gl.UNSIGNED_INT,\n 0,\n );\n this.frameStats.drawCalls += 1;\n }\n }\n this.frameStats.renderedMeshes += 1;\n }\n if (frame.selection.length > 0) {\n const selected = new Set(frame.selection);\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n gl.depthMask(false);\n this.program.setVertexColors(false);\n this.program.setColor([\n SELECTION_RGBA[0],\n SELECTION_RGBA[1],\n SELECTION_RGBA[2],\n SELECTION_TINT_ALPHA,\n ]);\n for (const renderable of renderables) {\n if (this.instancedMeshIds.has(renderable.id)) continue;\n if (!selected.has(selectionIdentity(renderable.mesh))) continue;\n mvp.elements.set(viewProjection.elements);\n world.elements.set(renderable.worldMatrix);\n mvp.multiply(world);\n this.program.setMatrix(mvp);\n this.program.setClipOffset(0, 0);\n const geometry = this.geometryCache.retain(gl, renderable.mesh.geometry);\n gl.bindVertexArray(geometry.vertexArray);\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, geometry.triangleIndexBuffer);\n gl.drawElements(\n gl.TRIANGLES,\n geometry.triangleCount,\n renderable.mesh.geometry.indices instanceof Uint16Array\n ? gl.UNSIGNED_SHORT\n : gl.UNSIGNED_INT,\n 0,\n );\n }\n this.program.setColor([\n SELECTION_RGBA[0],\n SELECTION_RGBA[1],\n SELECTION_RGBA[2],\n 1,\n ]);\n for (const renderable of renderables) {\n if (this.instancedMeshIds.has(renderable.id)) continue;\n if (!selected.has(selectionIdentity(renderable.mesh))) continue;\n const geometry = this.geometryCache.retain(gl, renderable.mesh.geometry);\n if (!geometry.edgeIndexBuffer || !renderable.mesh.geometry.edgeIndices) {\n continue;\n }\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, geometry.edgeIndexBuffer);\n for (const [offsetX, offsetY] of EDGE_PIXEL_OFFSETS) {\n this.program.setClipOffset(\n offsetX * clipPixelX,\n offsetY * clipPixelY,\n );\n gl.drawElements(\n gl.LINES,\n geometry.edgeCount,\n renderable.mesh.geometry.edgeIndices instanceof Uint16Array\n ? gl.UNSIGNED_SHORT\n : gl.UNSIGNED_INT,\n 0,\n );\n }\n }\n if (this.semanticProgram) {\n this.semanticProgram.use();\n this.semanticProgram.setInstancing(false);\n for (const draw of batches) {\n for (\n let semanticIndex = 0;\n semanticIndex < draw.batch.semanticSelectionIds.length;\n semanticIndex += 1\n ) {\n if (!selected.has(\n draw.batch.semanticSelectionIds[semanticIndex]!,\n )) {\n continue;\n }\n mvp.elements.set(viewProjection.elements);\n world.elements.set(draw.worldMatrix);\n mvp.multiply(world);\n this.semanticProgram.setMatrix(mvp);\n this.semanticProgram.setHighlight(semanticIndex);\n const geometry = this.geometryCache.retain(\n gl,\n draw.batch.geometry,\n );\n gl.bindVertexArray(geometry.vertexArray);\n gl.bindBuffer(\n gl.ELEMENT_ARRAY_BUFFER,\n geometry.triangleIndexBuffer,\n );\n gl.drawElements(\n gl.TRIANGLES,\n geometry.triangleCount,\n draw.batch.geometry.indices instanceof Uint16Array\n ? gl.UNSIGNED_SHORT\n : gl.UNSIGNED_INT,\n 0,\n );\n }\n }\n this.semanticProgram.setInstancing(true);\n mvp.elements.set(viewProjection.elements);\n this.semanticProgram.setMatrix(mvp);\n for (const batch of instances) {\n const instance = this.instanceCache!.retain(\n gl,\n this.geometryCache,\n batch,\n );\n if (!instance) continue;\n for (\n let semanticIndex = 0;\n semanticIndex < batch.semanticIds.length;\n semanticIndex += 1\n ) {\n if (!selected.has(batch.semanticIds[semanticIndex]!)) continue;\n this.semanticProgram.setHighlight(semanticIndex);\n gl.bindVertexArray(instance.vertexArray);\n gl.drawElementsInstanced(\n gl.TRIANGLES,\n instance.triangleCount,\n batch.geometry.indices instanceof Uint16Array\n ? gl.UNSIGNED_SHORT\n : gl.UNSIGNED_INT,\n 0,\n instance.instanceCount,\n );\n }\n }\n }\n gl.depthMask(true);\n gl.disable(gl.BLEND);\n this.program.use();\n this.program.setClipOffset(0, 0);\n }\n gl.bindVertexArray(null);\n this.geometryCache.endFrame();\n this.instanceCache!.endFrame();\n this.frameStats.instancingFallbacks = this.instanceCache!.fallbackCount;\n this.frameStats.gpuUploads = this.geometryCache.uploadCount;\n this.frameStats.gpuEvictions = this.geometryCache.evictionCount;\n this.frameStats.gpuBytes = this.geometryCache.totalBytes\n + this.instanceCache!.totalBytes;\n this.profiler.mark('encode');\n this.profiler.mark('submit');\n this.lastFrameProfile = this.profiler.end();\n }\n\n enableProfiling(enabled: boolean): void {\n this.profiler.enable(enabled);\n this.lastFrameProfile = null;\n }\n\n get frameProfile(): ICEFrameStageProfile | null {\n return this.lastFrameProfile;\n }\n\n async pick(\n frame: ICEFrame,\n point: ICEScreenPoint,\n ): Promise<string | undefined> {\n if (!this.picker || !this.geometryCache) {\n throw new ICEEngineError(\n 'ICE3_PICK_UNAVAILABLE',\n 'ICE3_PICK_UNAVAILABLE: picker is not initialized',\n );\n }\n const renderables = collectRenderables(\n frame.scene,\n this.renderablesScratch,\n );\n return this.picker.pick(\n { ...frame, point },\n this.geometryCache,\n renderables,\n collectRenderBatches(frame.scene, this.batchesScratch),\n collectInstanceBatches(\n renderables,\n this.instancesScratch,\n ),\n this.instanceCache!,\n );\n }\n\n async capture(): Promise<Blob> {\n if (!this.canvas) {\n throw new ICEEngineError(\n 'ICE3_ENGINE_NOT_READY',\n 'Renderer is not initialized',\n );\n }\n return new Promise<Blob>((resolve, reject) => {\n this.canvas!.toBlob((blob) => {\n if (blob) resolve(blob);\n else reject(new Error('ICE3_CAPTURE_UNAVAILABLE: PNG encoding failed'));\n }, 'image/png');\n });\n }\n\n async finish(): Promise<void> {\n this.gl?.finish();\n }\n\n dispose(): void {\n if (this.canvas) {\n this.canvas.removeEventListener('webglcontextlost', this.handleContextLost);\n this.canvas.removeEventListener(\n 'webglcontextrestored',\n this.handleContextRestored,\n );\n }\n if (this.program) {\n this.program.dispose();\n }\n this.semanticProgram?.dispose();\n this.picker?.dispose();\n this.geometryCache?.dispose();\n this.instanceCache?.dispose();\n this.program = null;\n this.semanticProgram = null;\n this.geometryCache = null;\n this.instanceCache = null;\n this.picker = null;\n this.canvas = null;\n this.gl = null;\n this.onContextLost = undefined;\n this.onContextRestored = undefined;\n }\n\n getViewport(): ICEViewport {\n return { ...this.viewport };\n }\n\n getDevicePixelRatio(): number {\n return this.dpr;\n }\n\n get stats(): Readonly<typeof this.frameStats> {\n return this.frameStats;\n }\n\n private createProgram(gl: WebGL2RenderingContext): void {\n const program = new WebGL2Program(gl);\n gl.lineWidth(2);\n this.program = program;\n this.semanticProgram = new WebGL2SemanticProgram(gl);\n this.geometryCache = new WebGL2GeometryCache();\n this.instanceCache = new WebGL2InstanceCache();\n this.picker = new WebGL2Picker(gl);\n }\n}\n", "const WEBGPU_TIMEOUT_MS = 3000;\n\nconst REQUIRED_LIMITS = [\n ['maxTextureDimension2D', 4096],\n ['maxBufferSize', 268_435_456],\n ['maxVertexBuffers', 2],\n ['maxBindGroups', 2],\n] as const satisfies readonly (readonly [\n keyof GPUSupportedLimits,\n number,\n])[];\n\nconst PROBE_SHADER = `\n@vertex\nfn vertexMain(@builtin(vertex_index) index: u32) -> @builtin(position) vec4<f32> {\n var positions = array<vec2<f32>, 3>(\n vec2<f32>(-1.0, -1.0),\n vec2<f32>(3.0, -1.0),\n vec2<f32>(-1.0, 3.0),\n );\n return vec4<f32>(positions[index], 0.0, 1.0);\n}\n\n@fragment\nfn fragmentMain() -> @location(0) vec4<f32> {\n return vec4<f32>(0.0, 0.0, 0.0, 1.0);\n}\n`;\n\nexport type ICEWebGPUProbeFailureReason =\n | 'document-unavailable'\n | 'api-unavailable'\n | 'adapter-unavailable'\n | 'adapter-timeout'\n | 'feature-missing'\n | 'limit-too-low'\n | 'device-failed'\n | 'context-failed'\n | 'pipeline-failed'\n | 'device-lost';\n\nexport type ICEWebGPUProbeResult =\n | {\n readonly supported: true;\n readonly adapter: GPUAdapter;\n readonly device: GPUDevice;\n readonly format: GPUTextureFormat;\n readonly enabledFeatures: ReadonlySet<GPUFeatureName>;\n readonly release: () => void;\n }\n | {\n readonly supported: false;\n readonly reason: ICEWebGPUProbeFailureReason;\n readonly detail?: string;\n };\n\nexport type ICEWebGPUProbeOptions = {\n readonly gpu?: GPU;\n readonly timeoutMs?: number;\n readonly createCanvas?: () => OffscreenCanvas | HTMLCanvasElement;\n readonly optionalFeatures?: readonly GPUFeatureName[];\n};\n\nconst successfulProbes = new WeakMap<\n GPU,\n Map<string, Promise<ICEWebGPUProbeResult>>\n>();\n\nexport function probeWebGPU(\n options: ICEWebGPUProbeOptions = {},\n): Promise<ICEWebGPUProbeResult> {\n const gpu = options.gpu\n ?? (\n typeof navigator === 'undefined'\n ? undefined\n : (navigator as Navigator & { readonly gpu?: GPU }).gpu\n );\n if (!gpu) {\n return Promise.resolve(failure(\n 'api-unavailable',\n 'navigator.gpu is unavailable',\n ));\n }\n\n const featureKey = [...(options.optionalFeatures ?? [])]\n .sort()\n .join('|');\n const probes = successfulProbes.get(gpu);\n const cached = probes?.get(featureKey);\n if (cached) return cached;\n\n const probe = executeProbe(gpu, options).then((result) => (\n result.supported\n ? {\n ...result,\n release: () => {\n const current = successfulProbes.get(gpu);\n current?.delete(featureKey);\n if (current?.size === 0) successfulProbes.delete(gpu);\n },\n }\n : result\n ));\n const featureProbes = probes ?? new Map();\n featureProbes.set(featureKey, probe);\n successfulProbes.set(gpu, featureProbes);\n void probe.then((result) => {\n if (!result.supported) {\n featureProbes.delete(featureKey);\n if (featureProbes.size === 0) successfulProbes.delete(gpu);\n }\n });\n return probe;\n}\n\nasync function executeProbe(\n gpu: GPU,\n options: ICEWebGPUProbeOptions,\n): Promise<ICEWebGPUProbeResult> {\n const timeoutMs = options.timeoutMs ?? WEBGPU_TIMEOUT_MS;\n const timeout = Symbol('timeout');\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n let adapter: GPUAdapter | null | typeof timeout;\n try {\n adapter = await Promise.race([\n gpu.requestAdapter({ powerPreference: 'high-performance' }),\n new Promise<typeof timeout>((resolve) => {\n timeoutId = setTimeout(() => resolve(timeout), timeoutMs);\n }),\n ]);\n } catch (error) {\n if (timeoutId !== undefined) clearTimeout(timeoutId);\n return failure('adapter-unavailable', errorMessage(error));\n }\n if (timeoutId !== undefined) clearTimeout(timeoutId);\n if (adapter === timeout) {\n return failure('adapter-timeout', `Adapter lookup exceeded ${timeoutMs}ms`);\n }\n if (!adapter) {\n return failure('adapter-unavailable', 'requestAdapter returned null');\n }\n\n for (const [name, minimum] of REQUIRED_LIMITS) {\n const value = adapter.limits[name];\n if (typeof value !== 'number' || value < minimum) {\n return failure(\n 'limit-too-low',\n `${name} requires at least ${minimum}; received ${String(value)}`,\n );\n }\n }\n\n let device: GPUDevice;\n try {\n const features = (options.optionalFeatures ?? [])\n .filter((feature) => adapter.features.has(feature));\n device = await adapter.requestDevice({\n ...(features.length > 0 ? { requiredFeatures: features } : {}),\n });\n } catch (error) {\n return failure('device-failed', errorMessage(error));\n }\n\n const canvas = createProbeCanvas(options.createCanvas);\n if (!canvas) {\n device.destroy();\n return failure('document-unavailable', 'No Canvas implementation is available');\n }\n let context: GPUCanvasContext | null;\n try {\n context = canvas.getContext('webgpu') as GPUCanvasContext | null;\n } catch (error) {\n device.destroy();\n return failure('context-failed', errorMessage(error));\n }\n if (!context) {\n device.destroy();\n return failure('context-failed', 'WebGPU canvas context is unavailable');\n }\n\n try {\n const format = gpu.getPreferredCanvasFormat();\n context.configure({\n device,\n format,\n alphaMode: 'premultiplied',\n });\n const module = device.createShaderModule({ code: PROBE_SHADER });\n const pipeline = await device.createRenderPipelineAsync({\n layout: 'auto',\n vertex: {\n module,\n entryPoint: 'vertexMain',\n },\n fragment: {\n module,\n entryPoint: 'fragmentMain',\n targets: [{ format }],\n },\n primitive: { topology: 'triangle-list' },\n });\n const texture = context.getCurrentTexture();\n const encoder = device.createCommandEncoder();\n const pass = encoder.beginRenderPass({\n colorAttachments: [{\n view: texture.createView(),\n clearValue: { r: 0, g: 0, b: 0, a: 1 },\n loadOp: 'clear',\n storeOp: 'store',\n }],\n });\n pass.setPipeline(pipeline);\n pass.draw(3);\n pass.end();\n device.queue.submit([encoder.finish()]);\n\n const lost = await Promise.race([\n device.lost.then((info) => info.message || info.reason),\n new Promise<false>((resolve) => {\n setTimeout(() => resolve(false), 0);\n }),\n ]);\n if (lost) {\n device.destroy();\n return failure('device-lost', lost);\n }\n return {\n supported: true,\n adapter,\n device,\n format,\n enabledFeatures: new Set<GPUFeatureName>(\n Array.from(device.features) as GPUFeatureName[],\n ),\n release: () => undefined,\n };\n } catch (error) {\n device.destroy();\n return failure('pipeline-failed', errorMessage(error));\n }\n}\n\nfunction createProbeCanvas(\n createCanvas: ICEWebGPUProbeOptions['createCanvas'],\n): OffscreenCanvas | HTMLCanvasElement | undefined {\n if (createCanvas) return createCanvas();\n if (typeof OffscreenCanvas !== 'undefined') {\n return new OffscreenCanvas(64, 64);\n }\n if (typeof document !== 'undefined') {\n const canvas = document.createElement('canvas');\n canvas.width = 64;\n canvas.height = 64;\n return canvas;\n }\n return undefined;\n}\n\nfunction failure(\n reason: ICEWebGPUProbeFailureReason,\n detail?: string,\n): ICEWebGPUProbeResult {\n return {\n supported: false,\n reason,\n ...(detail ? { detail } : {}),\n };\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n", "import { ICEEngineError } from '@ice3/core';\n\nexport const WEBGPU_BUFFER_USAGE = {\n vertex: 32 | 8,\n index: 16 | 8,\n} as const;\n\nexport function alignToFourBytes(value: number): number {\n return Math.ceil(value / 4) * 4;\n}\n\nexport function createGPUDataBuffer(\n device: GPUDevice,\n data: ArrayBufferView,\n usage: GPUBufferUsageFlags,\n label: string,\n): GPUBuffer {\n const byteLength = alignToFourBytes(data.byteLength);\n let buffer: GPUBuffer | undefined;\n try {\n buffer = device.createBuffer({\n label,\n size: byteLength,\n usage,\n mappedAtCreation: false,\n });\n const upload = data.byteLength === byteLength\n ? data\n : copyAndPad(data, byteLength);\n device.queue.writeBuffer(buffer, 0, upload as unknown as BufferSource);\n return buffer;\n } catch (error) {\n buffer?.destroy();\n throw new ICEEngineError(\n 'ICE3_GPU_RESOURCE_FAILED',\n `ICE3_GPU_RESOURCE_FAILED: ${label}`,\n { cause: error },\n );\n }\n}\n\nexport function createEmptyGPUDataBuffer(\n device: GPUDevice,\n byteLength: number,\n usage: GPUBufferUsageFlags,\n label: string,\n): GPUBuffer {\n try {\n return device.createBuffer({\n label,\n size: Math.max(4, alignToFourBytes(byteLength)),\n usage,\n mappedAtCreation: false,\n });\n } catch (error) {\n throw new ICEEngineError(\n 'ICE3_GPU_RESOURCE_FAILED',\n `ICE3_GPU_RESOURCE_FAILED: ${label}`,\n { cause: error },\n );\n }\n}\n\nexport function writeGPUData(\n device: GPUDevice,\n buffer: GPUBuffer,\n data: ArrayBufferView,\n): void {\n try {\n device.queue.writeBuffer(buffer, 0, data as unknown as BufferSource);\n } catch (error) {\n throw new ICEEngineError(\n 'ICE3_GPU_RESOURCE_FAILED',\n 'ICE3_GPU_RESOURCE_FAILED: buffer upload failed',\n { cause: error },\n );\n }\n}\n\nfunction copyAndPad(\n data: ArrayBufferView,\n byteLength: number,\n): Uint8Array {\n const output = new Uint8Array(byteLength);\n output.set(new Uint8Array(\n data.buffer,\n data.byteOffset,\n data.byteLength,\n ));\n return output;\n}\n", "import {\n ICEEngineError,\n type ICEGeometry,\n} from '@ice3/core';\nimport {\n createGPUDataBuffer,\n WEBGPU_BUFFER_USAGE,\n} from './WebGPUResources.js';\n\nexport interface WebGPUGeometryEntry {\n readonly vertexBuffer: GPUBuffer;\n readonly triangleIndexBuffer: GPUBuffer;\n readonly edgeIndexBuffer: GPUBuffer | null;\n readonly semanticBuffer: GPUBuffer | null;\n readonly triangleCount: number;\n readonly edgeCount: number;\n readonly indexFormat: GPUIndexFormat;\n readonly vertexCount: number;\n readonly bytes: number;\n lastUsedFrame: number;\n}\n\nexport interface WebGPUGeometryCacheOptions {\n readonly device: GPUDevice;\n readonly inactiveGraceFrames?: number;\n readonly maxBytes?: number;\n}\n\nexport class WebGPUGeometryCache {\n private readonly device: GPUDevice;\n private readonly entries = new Map<ICEGeometry, WebGPUGeometryEntry>();\n private active = new Set<ICEGeometry>();\n private readonly pinned = new Set<ICEGeometry>();\n private readonly inactiveGraceFrames: number;\n private readonly maxBytes: number;\n private uploads = 0;\n private evictions = 0;\n private frameId = 0;\n private resourceGeneration = 0;\n\n constructor(options: WebGPUGeometryCacheOptions) {\n this.device = options.device;\n this.inactiveGraceFrames = options.inactiveGraceFrames ?? 60;\n this.maxBytes = options.maxBytes ?? 768 * 1024 * 1024;\n if (\n !Number.isInteger(this.inactiveGraceFrames)\n || this.inactiveGraceFrames < 0\n || !Number.isInteger(this.maxBytes)\n || this.maxBytes < 1\n ) {\n throw new Error('ICE3_GPU_CACHE_INVALID: cache options are invalid');\n }\n }\n\n retain(geometry: ICEGeometry): WebGPUGeometryEntry {\n this.active.add(geometry);\n const existing = this.entries.get(geometry);\n if (existing) {\n existing.lastUsedFrame = this.frameId;\n return existing;\n }\n\n const buffers: GPUBuffer[] = [];\n try {\n const vertexCount = geometry.positions.length / 3;\n const vertices = new Float32Array(vertexCount * 6);\n const colorStride = geometry.colors\n ? geometry.colors.length / vertexCount\n : 0;\n for (let index = 0; index < vertexCount; index += 1) {\n vertices[index * 6] = geometry.positions[index * 3]!;\n vertices[index * 6 + 1] = geometry.positions[index * 3 + 1]!;\n vertices[index * 6 + 2] = geometry.positions[index * 3 + 2]!;\n vertices[index * 6 + 3] = geometry.colors?.[index * colorStride] ?? 1;\n vertices[index * 6 + 4] =\n geometry.colors?.[index * colorStride + 1] ?? 1;\n vertices[index * 6 + 5] =\n geometry.colors?.[index * colorStride + 2] ?? 1;\n }\n const vertexBuffer = createGPUDataBuffer(\n this.device,\n vertices,\n WEBGPU_BUFFER_USAGE.vertex,\n `${geometry.typeId}:vertices`,\n );\n buffers.push(vertexBuffer);\n const triangleIndexBuffer = createGPUDataBuffer(\n this.device,\n geometry.indices,\n WEBGPU_BUFFER_USAGE.index,\n `${geometry.typeId}:triangle-indices`,\n );\n buffers.push(triangleIndexBuffer);\n const edgeIndexBuffer = geometry.edgeIndices\n ? createGPUDataBuffer(\n this.device,\n geometry.edgeIndices,\n WEBGPU_BUFFER_USAGE.index,\n `${geometry.typeId}:edge-indices`,\n )\n : null;\n if (edgeIndexBuffer) buffers.push(edgeIndexBuffer);\n const semanticBuffer = geometry.semanticIndices\n ? createGPUDataBuffer(\n this.device,\n geometry.semanticIndices,\n WEBGPU_BUFFER_USAGE.vertex,\n `${geometry.typeId}:semantic`,\n )\n : null;\n if (semanticBuffer) buffers.push(semanticBuffer);\n\n const entry: WebGPUGeometryEntry = {\n vertexBuffer,\n triangleIndexBuffer,\n edgeIndexBuffer,\n semanticBuffer,\n triangleCount: geometry.indices.length,\n edgeCount: geometry.edgeIndices?.length ?? 0,\n indexFormat: geometry.indices instanceof Uint16Array\n ? 'uint16'\n : 'uint32',\n vertexCount,\n bytes: buffers.reduce((sum, buffer) => sum + buffer.size, 0),\n lastUsedFrame: this.frameId,\n };\n this.entries.set(geometry, entry);\n this.uploads += buffers.length;\n this.resourceGeneration += 1;\n return entry;\n } catch (error) {\n for (const buffer of buffers) buffer.destroy();\n if (error instanceof ICEEngineError) throw error;\n throw new ICEEngineError(\n 'ICE3_GPU_RESOURCE_FAILED',\n 'ICE3_GPU_RESOURCE_FAILED: geometry upload failed',\n { cause: error },\n );\n }\n }\n\n pin(geometry: ICEGeometry): WebGPUGeometryEntry {\n this.pinned.add(geometry);\n const entry = this.retain(geometry);\n this.enforceBudget();\n if (this.totalBytes > this.maxBytes) {\n this.pinned.delete(geometry);\n this.deleteEntry(geometry, entry);\n throw new ICEEngineError(\n 'ICE3_GPU_RESOURCE_FAILED',\n 'ICE3_GPU_RESOURCE_FAILED: geometry exceeds the GPU residency budget',\n );\n }\n return entry;\n }\n\n unpin(geometry: ICEGeometry): void {\n this.pinned.delete(geometry);\n }\n\n beginFrame(): void {\n this.frameId += 1;\n this.active = new Set();\n }\n\n endFrame(): void {\n for (const [geometry, entry] of this.entries) {\n if (this.active.has(geometry) || this.pinned.has(geometry)) continue;\n if (this.frameId - entry.lastUsedFrame < this.inactiveGraceFrames) {\n continue;\n }\n this.deleteEntry(geometry, entry);\n }\n this.enforceBudget();\n }\n\n clear(): void {\n for (const [geometry, entry] of this.entries) {\n this.deleteEntry(geometry, entry);\n }\n this.active.clear();\n this.pinned.clear();\n }\n\n dispose(): void {\n this.clear();\n }\n\n get totalBytes(): number {\n return [...this.entries.values()]\n .reduce((sum, entry) => sum + entry.bytes, 0);\n }\n\n get uploadCount(): number {\n return this.uploads;\n }\n\n get evictionCount(): number {\n return this.evictions;\n }\n\n get generation(): number {\n return this.resourceGeneration;\n }\n\n private enforceBudget(): void {\n let total = this.totalBytes;\n if (total <= this.maxBytes) return;\n const candidates = [...this.entries]\n .filter(([geometry]) => !this.pinned.has(geometry))\n .sort((left, right) => (\n left[1].lastUsedFrame - right[1].lastUsedFrame\n ));\n for (const [geometry, entry] of candidates) {\n if (total <= this.maxBytes) break;\n this.deleteEntry(geometry, entry);\n total -= entry.bytes;\n }\n }\n\n private deleteEntry(\n geometry: ICEGeometry,\n entry: WebGPUGeometryEntry,\n ): void {\n entry.vertexBuffer.destroy();\n entry.triangleIndexBuffer.destroy();\n entry.edgeIndexBuffer?.destroy();\n entry.semanticBuffer?.destroy();\n this.entries.delete(geometry);\n this.evictions += 1;\n this.resourceGeneration += 1;\n }\n}\n", "import {\n createEmptyGPUDataBuffer,\n writeGPUData,\n WEBGPU_BUFFER_USAGE,\n} from './WebGPUResources.js';\nimport type { ICEInstanceBatch } from './InstanceBatch.js';\n\nexport interface WebGPUInstanceEntry {\n readonly matrixBuffer: GPUBuffer;\n readonly semanticBuffer: GPUBuffer;\n instanceCount: number;\n readonly bytes: number;\n readonly generation: number;\n}\n\ninterface CachedInstanceEntry extends WebGPUInstanceEntry {\n matrixCapacity: number;\n semanticCapacity: number;\n matrixBytes?: Uint8Array;\n semanticBytes?: Uint8Array;\n matrixSource?: Float32Array;\n semanticSource?: Uint32Array;\n}\n\nexport class WebGPUInstanceCache {\n private readonly entries = new Map<string, CachedInstanceEntry>();\n private active = new Set<string>();\n private bufferGeneration = 0;\n\n constructor(private readonly device: GPUDevice) {}\n\n retain(batch: ICEInstanceBatch): WebGPUInstanceEntry {\n this.active.add(batch.id);\n const matrixSize = batch.instanceMatrices.byteLength;\n const semanticSize = batch.semanticIndices.byteLength;\n let entry = this.entries.get(batch.id);\n if (\n !entry\n || entry.matrixCapacity < matrixSize\n || entry.semanticCapacity < semanticSize\n ) {\n if (entry) this.deleteEntry(entry);\n entry = {\n matrixBuffer: createEmptyGPUDataBuffer(\n this.device,\n matrixSize,\n WEBGPU_BUFFER_USAGE.vertex,\n `${batch.id}:matrices`,\n ),\n semanticBuffer: createEmptyGPUDataBuffer(\n this.device,\n semanticSize,\n WEBGPU_BUFFER_USAGE.vertex,\n `${batch.id}:semantic`,\n ),\n instanceCount: batch.semanticIds.length,\n bytes: Math.ceil(matrixSize / 4) * 4\n + Math.ceil(semanticSize / 4) * 4,\n generation: ++this.bufferGeneration,\n matrixCapacity: Math.max(4, Math.ceil(matrixSize / 4) * 4),\n semanticCapacity: Math.max(4, Math.ceil(semanticSize / 4) * 4),\n };\n this.entries.set(batch.id, entry);\n }\n if (entry.matrixSource !== batch.instanceMatrices) {\n const matrixBytes = toBytes(batch.instanceMatrices);\n if (\n !entry.matrixBytes\n || !sameBytes(entry.matrixBytes, matrixBytes)\n ) {\n writeGPUData(this.device, entry.matrixBuffer, batch.instanceMatrices);\n }\n entry.matrixBytes = matrixBytes;\n entry.matrixSource = batch.instanceMatrices;\n }\n if (entry.semanticSource !== batch.semanticIndices) {\n const semanticBytes = toBytes(batch.semanticIndices);\n if (\n !entry.semanticBytes\n || !sameBytes(entry.semanticBytes, semanticBytes)\n ) {\n writeGPUData(\n this.device,\n entry.semanticBuffer,\n batch.semanticIndices,\n );\n }\n entry.semanticBytes = semanticBytes;\n entry.semanticSource = batch.semanticIndices;\n }\n entry.instanceCount = batch.semanticIds.length;\n return entry;\n }\n\n beginFrame(): void {\n this.active = new Set();\n }\n\n endFrame(): void {\n for (const [id, entry] of this.entries) {\n if (this.active.has(id)) continue;\n this.deleteEntry(entry);\n this.entries.delete(id);\n }\n }\n\n clear(): void {\n for (const entry of this.entries.values()) {\n this.deleteEntry(entry);\n }\n this.active.clear();\n }\n\n dispose(): void {\n this.clear();\n }\n\n get totalBytes(): number {\n return [...this.entries.values()]\n .reduce((sum, entry) => sum + entry.bytes, 0);\n }\n\n get generation(): number {\n return this.bufferGeneration;\n }\n\n private deleteEntry(entry: WebGPUInstanceEntry): void {\n entry.matrixBuffer.destroy();\n entry.semanticBuffer.destroy();\n this.bufferGeneration += 1;\n }\n}\n\nfunction toBytes(data: Float32Array | Uint32Array): Uint8Array {\n return new Uint8Array(\n data.buffer,\n data.byteOffset,\n data.byteLength,\n ).slice();\n}\n\nfunction sameBytes(left: Uint8Array, right: Uint8Array): boolean {\n if (left.byteLength !== right.byteLength) return false;\n for (let index = 0; index < left.byteLength; index += 1) {\n if (left[index] !== right[index]) return false;\n }\n return true;\n}\n", "import { ICEEngineError } from '@ice3/core';\n\nexport const WEBGPU_UNIFORM_STRIDE = 256;\nexport const WEBGPU_UNIFORM_BYTES = 128;\n\nconst SHADER_SOURCE = (\n selectionMask: boolean,\n storageInstances: boolean,\n indirectInstances: boolean,\n): string => `\nstruct FrameUniforms {\n worldViewProjection: mat4x4<f32>,\n color: vec4<f32>,\n clipOffset: vec2<f32>,\n useVertexColor: f32,\n useInstancing: f32,\n highlightSemantic: f32,\n useSemantic: f32,\n pickMode: f32,\n pickBase: f32,\n selectionBase: f32,\n useSelectionMask: f32,\n pageBase: f32,\n useIndirect: f32,\n}\n\n${storageInstances\n ? `\nstruct InstanceRecord {\n transform: mat4x4<f32>,\n bounds: vec4<f32>,\n semantic: u32,\n pad0: u32,\n pad1: u32,\n pad2: u32,\n}`\n : ''}\n\nstruct VertexOutput {\n @builtin(position) position: vec4<f32>,\n @location(0) color: vec4<f32>,\n @location(1) @interpolate(flat) semantic: u32,\n}\n\n@group(0) @binding(0) var<uniform> frame: FrameUniforms;\n${selectionMask\n ? '@group(0) @binding(1) var<storage, read> selection: array<u32>;'\n : ''}\n${storageInstances\n ? '@group(0) @binding(2) var<storage, read> instances: array<InstanceRecord>;'\n : ''}\n${indirectInstances\n ? '@group(0) @binding(3) var<storage, read> visibleIndices: array<u32>;'\n : ''}\n\n@vertex\nfn vertexMain(\n @location(0) position: vec3<f32>,\n @location(1) color: vec3<f32>,\n ${storageInstances\n ? `\n @builtin(instance_index) instanceIndex: u32,\n @location(2) vertexSemantic: u32,\n`\n : `\n @location(2) instanceColumn0: vec4<f32>,\n @location(3) instanceColumn1: vec4<f32>,\n @location(4) instanceColumn2: vec4<f32>,\n @location(5) instanceColumn3: vec4<f32>,\n @location(6) instanceSemantic: u32,\n @location(7) vertexSemantic: u32,\n`}\n) -> VertexOutput {\n ${storageInstances\n ? `\n let visibleIndex = ${\n indirectInstances\n ? 'visibleIndices[instanceIndex]'\n : 'instanceIndex - u32(frame.pageBase)'\n };\n let recordIndex = visibleIndex;\n let record = instances[recordIndex];\n let instanceMatrix = record.transform;\n let instanceSemantic = record.semantic;\n let localPosition = vec4<f32>(position, 1.0);\n let worldPosition = instanceMatrix * localPosition;\n`\n : `\n let instanceMatrix = mat4x4<f32>(\n instanceColumn0,\n instanceColumn1,\n instanceColumn2,\n instanceColumn3\n );\n let localPosition = vec4<f32>(position, 1.0);\n let worldPosition = mix(\n localPosition,\n instanceMatrix * localPosition,\n frame.useInstancing\n );\n`}\n var output: VertexOutput;\n output.position = frame.worldViewProjection * worldPosition;\n output.position.xy += frame.clipOffset * output.position.w;\n output.color = vec4<f32>(\n mix(vec3<f32>(1.0), color, frame.useVertexColor) * frame.color.rgb,\n frame.color.a\n );\n output.semantic = select(\n vertexSemantic,\n instanceSemantic,\n ${storageInstances ? 'true' : 'frame.useInstancing > 0.5'}\n );\n return output;\n}\n\n@fragment\nfn fragmentMain(input: VertexOutput) -> @location(0) vec4<f32> {\n if (frame.pickMode > 0.5) {\n let id = u32(frame.pickBase) + input.semantic + 1u;\n return vec4<f32>(\n f32(id & 255u),\n f32((id >> 8u) & 255u),\n f32((id >> 16u) & 255u),\n 255.0\n ) / 255.0;\n }\n if (\n frame.useSemantic > 0.5\n && abs(f32(input.semantic) - frame.highlightSemantic) > 0.1\n ) {\n discard;\n }\n ${selectionMask\n ? `\n let isSelected =\n selection[u32(frame.selectionBase) + input.semantic] != 0u;\n if (frame.useSelectionMask > 0.5) {\n if (frame.useSemantic > 0.5 && !isSelected) {\n discard;\n }\n if (isSelected) {\n return vec4<f32>(\n mix(\n input.color.rgb,\n vec3<f32>(1.0, 208.0 / 255.0, 0.0),\n 0.65\n ),\n 1.0\n );\n }\n }`\n : ''}\n return input.color;\n}\n`;\n\nconst VERTEX_LAYOUT: GPUVertexBufferLayout[] = [\n {\n arrayStride: 24,\n stepMode: 'vertex',\n attributes: [\n { shaderLocation: 0, offset: 0, format: 'float32x3' },\n { shaderLocation: 1, offset: 12, format: 'float32x3' },\n ],\n },\n {\n arrayStride: 80,\n stepMode: 'instance',\n attributes: [\n { shaderLocation: 2, offset: 0, format: 'float32x4' },\n { shaderLocation: 3, offset: 16, format: 'float32x4' },\n { shaderLocation: 4, offset: 32, format: 'float32x4' },\n { shaderLocation: 5, offset: 48, format: 'float32x4' },\n { shaderLocation: 6, offset: 64, format: 'uint32' },\n ],\n },\n {\n arrayStride: 4,\n stepMode: 'vertex',\n attributes: [\n { shaderLocation: 7, offset: 0, format: 'uint32' },\n ],\n },\n];\n\nconst STORAGE_VERTEX_LAYOUT: GPUVertexBufferLayout[] = [\n VERTEX_LAYOUT[0]!,\n {\n arrayStride: 4,\n stepMode: 'vertex',\n attributes: [\n { shaderLocation: 2, offset: 0, format: 'uint32' },\n ],\n },\n];\n\nexport class WebGPURenderPipeline {\n readonly bindGroupLayout: GPUBindGroupLayout;\n readonly pipelineLayout: GPUPipelineLayout;\n readonly triangle: GPURenderPipeline;\n readonly line: GPURenderPipeline;\n readonly selectionTriangle: GPURenderPipeline;\n readonly selectionLine: GPURenderPipeline;\n readonly selectionMask: boolean;\n readonly storageInstances: boolean;\n readonly indirectInstances: boolean;\n\n private constructor(\n readonly device: GPUDevice,\n readonly format: GPUTextureFormat,\n bindGroupLayout: GPUBindGroupLayout,\n pipelineLayout: GPUPipelineLayout,\n triangle: GPURenderPipeline,\n line: GPURenderPipeline,\n selectionTriangle: GPURenderPipeline,\n selectionLine: GPURenderPipeline,\n selectionMask: boolean,\n storageInstances: boolean,\n indirectInstances: boolean,\n ) {\n this.bindGroupLayout = bindGroupLayout;\n this.pipelineLayout = pipelineLayout;\n this.triangle = triangle;\n this.line = line;\n this.selectionTriangle = selectionTriangle;\n this.selectionLine = selectionLine;\n this.selectionMask = selectionMask;\n this.storageInstances = storageInstances;\n this.indirectInstances = indirectInstances;\n }\n\n static async create(\n device: GPUDevice,\n format: GPUTextureFormat,\n options: {\n readonly selectionMask?: boolean;\n readonly storageInstances?: boolean;\n readonly indirectInstances?: boolean;\n } = {},\n ): Promise<WebGPURenderPipeline> {\n try {\n const storageInstances = Boolean(options.storageInstances);\n const indirectInstances = (\n storageInstances && Boolean(options.indirectInstances)\n );\n const selectionMask = Boolean(\n options.selectionMask || storageInstances,\n );\n const bindGroupEntries: GPUBindGroupLayoutEntry[] = [{\n binding: 0,\n visibility: 3,\n buffer: {\n type: 'uniform',\n hasDynamicOffset: true,\n minBindingSize: WEBGPU_UNIFORM_BYTES,\n },\n }];\n if (selectionMask) {\n bindGroupEntries.push({\n binding: 1,\n visibility: 2,\n buffer: {\n type: 'read-only-storage',\n minBindingSize: 4,\n },\n });\n }\n if (storageInstances) {\n bindGroupEntries.push({\n binding: 2,\n visibility: 1,\n buffer: {\n type: 'read-only-storage',\n minBindingSize: 96,\n },\n });\n }\n if (indirectInstances) {\n bindGroupEntries.push({\n binding: 3,\n visibility: 1,\n buffer: {\n type: 'read-only-storage',\n minBindingSize: 4,\n },\n });\n }\n const bindGroupLayout = device.createBindGroupLayout({\n entries: bindGroupEntries,\n });\n const pipelineLayout = device.createPipelineLayout({\n bindGroupLayouts: [bindGroupLayout],\n });\n const module = device.createShaderModule({\n code: SHADER_SOURCE(\n selectionMask,\n storageInstances,\n indirectInstances,\n ),\n });\n const createPipeline = (\n label: string,\n topology: GPUPrimitiveTopology,\n selection = false,\n ) => device.createRenderPipelineAsync({\n label: indirectInstances\n ? `${label}:storage:indirect`\n : storageInstances\n ? `${label}:storage`\n : label,\n layout: pipelineLayout,\n vertex: {\n module,\n entryPoint: 'vertexMain',\n buffers: storageInstances\n ? STORAGE_VERTEX_LAYOUT\n : VERTEX_LAYOUT,\n },\n fragment: {\n module,\n entryPoint: 'fragmentMain',\n targets: [{\n format,\n ...(selection\n ? {\n blend: {\n color: {\n srcFactor: 'src-alpha' as GPUBlendFactor,\n dstFactor: 'one-minus-src-alpha' as GPUBlendFactor,\n operation: 'add' as GPUBlendOperation,\n },\n alpha: {\n srcFactor: 'one' as GPUBlendFactor,\n dstFactor: 'one-minus-src-alpha' as GPUBlendFactor,\n operation: 'add' as GPUBlendOperation,\n },\n },\n }\n : {}),\n }],\n },\n primitive: {\n topology,\n cullMode: 'none',\n },\n depthStencil: {\n format: 'depth24plus',\n depthCompare: 'less-equal',\n depthWriteEnabled: !selection,\n },\n multisample: { count: 1 },\n });\n const [\n triangle,\n line,\n selectionTriangle,\n selectionLine,\n ] = await Promise.all([\n createPipeline('main:triangle', 'triangle-list'),\n createPipeline('main:line', 'line-list'),\n createPipeline('selection:triangle', 'triangle-list', true),\n createPipeline('selection:line', 'line-list', true),\n ]);\n return new WebGPURenderPipeline(\n device,\n format,\n bindGroupLayout,\n pipelineLayout,\n triangle,\n line,\n selectionTriangle,\n selectionLine,\n selectionMask,\n storageInstances,\n indirectInstances,\n );\n } catch (error) {\n throw new ICEEngineError(\n 'ICE3_WEBGPU_PIPELINE_FAILED',\n 'ICE3_WEBGPU_PIPELINE_FAILED: render pipelines are unavailable',\n { cause: error },\n );\n }\n }\n}\n", "type TimestampSlot = {\n readonly querySet: GPUQuerySet;\n readonly buffer: GPUBuffer;\n pending: boolean;\n};\n\nexport class WebGPUTimestampProfiler {\n private readonly slots: TimestampSlot[];\n private readonly pending: number[] = [];\n private reason: string | undefined;\n private disposed = false;\n\n constructor(\n private readonly device: GPUDevice,\n slotCount = 64,\n ) {\n if (!Number.isInteger(slotCount) || slotCount < 1) {\n throw new Error('ICE3_TIMESTAMP_INVALID: slot count must be positive');\n }\n this.slots = Array.from({ length: slotCount }, (_, index) => ({\n querySet: device.createQuerySet({\n label: `ice3:timestamp:${index}`,\n type: 'timestamp',\n count: 2,\n }),\n buffer: device.createBuffer({\n label: `ice3:timestamp-resolve:${index}`,\n size: 256,\n usage: 512 | 8 | 1,\n }),\n pending: false,\n }));\n }\n\n get unavailableReason(): string | undefined {\n return this.reason;\n }\n\n querySetFor(frameId: number): GPUQuerySet {\n return this.slotFor(frameId).querySet;\n }\n\n resolveFrame(encoder: GPUCommandEncoder, frameId: number): void {\n const slot = this.slotFor(frameId);\n if (slot.pending) {\n throw new Error('ICE3_TIMESTAMP_SLOT_BUSY');\n }\n encoder.resolveQuerySet(slot.querySet, 0, 2, slot.buffer, 0);\n this.pending.push(this.slotIndex(frameId));\n slot.pending = true;\n }\n\n async drain(): Promise<readonly number[]> {\n if (this.disposed) return [];\n const samples: number[] = [];\n for (const index of [...this.pending]) {\n const slot = this.slots[index]!;\n let mapped = false;\n try {\n await slot.buffer.mapAsync(1);\n mapped = true;\n const values = new BigUint64Array(\n slot.buffer.getMappedRange(),\n 0,\n 2,\n );\n const start = values[0]!;\n const end = values[1]!;\n if (end <= start) {\n this.reason = 'invalid-timestamp';\n } else {\n samples.push(Number(end - start) / 1_000_000);\n }\n } catch {\n this.reason = 'map-failed';\n } finally {\n if (mapped) slot.buffer.unmap();\n slot.pending = false;\n const pendingIndex = this.pending.indexOf(index);\n if (pendingIndex >= 0) this.pending.splice(pendingIndex, 1);\n }\n }\n return samples;\n }\n\n dispose(): void {\n if (this.disposed) return;\n this.disposed = true;\n for (const slot of this.slots) {\n slot.querySet.destroy();\n slot.buffer.destroy();\n slot.pending = false;\n }\n this.pending.length = 0;\n }\n\n private slotFor(frameId: number): TimestampSlot {\n if (this.disposed) {\n throw new Error('ICE3_ENGINE_DESTROYED: timestamp profiler');\n }\n if (!Number.isSafeInteger(frameId) || frameId < 0) {\n throw new Error('ICE3_TIMESTAMP_INVALID: frame ID');\n }\n return this.slots[this.slotIndex(frameId)]!;\n }\n\n private slotIndex(frameId: number): number {\n return frameId % this.slots.length;\n }\n}\n", "import {\n createEmptyGPUDataBuffer,\n writeGPUData,\n} from './WebGPUResources.js';\n\nconst STORAGE_USAGE = 128 | 8;\n\nexport type ICESelectionMaskLayout = Readonly<{\n words: Uint32Array;\n bases: readonly number[];\n}>;\n\nexport function buildSelectionMask(\n ranges: readonly (readonly string[])[],\n selection: readonly string[],\n): ICESelectionMaskLayout {\n const selected = new Set(selection);\n const bases: number[] = [];\n let count = 0;\n for (const range of ranges) {\n bases.push(count);\n count += range.length;\n }\n const words = new Uint32Array(Math.max(1, count));\n ranges.forEach((range, rangeIndex) => {\n const base = bases[rangeIndex]!;\n range.forEach((id, index) => {\n words[base + index] = selected.has(id) ? 1 : 0;\n });\n });\n return { words, bases };\n}\n\nexport class WebGPUSelectionMaskBuffer {\n private maskBuffer: GPUBuffer | null = null;\n private previous: Uint8Array | null = null;\n private maskGeneration = 0;\n\n constructor(private readonly device: GPUDevice) {}\n\n get buffer(): GPUBuffer | null {\n return this.maskBuffer;\n }\n\n get generation(): number {\n return this.maskGeneration;\n }\n\n get totalBytes(): number {\n return this.maskBuffer?.size ?? 0;\n }\n\n update(words: Uint32Array): void {\n if (this.maskBuffer && this.maskBuffer.size < words.byteLength) {\n this.maskBuffer.destroy();\n this.maskBuffer = null;\n this.previous = null;\n }\n if (!this.maskBuffer) {\n this.maskBuffer = createEmptyGPUDataBuffer(\n this.device,\n words.byteLength,\n STORAGE_USAGE,\n 'ice3:selection-mask',\n );\n this.maskGeneration += 1;\n }\n const bytes = new Uint8Array(\n words.buffer,\n words.byteOffset,\n words.byteLength,\n ).slice();\n if (this.previous && sameBytes(this.previous, bytes)) return;\n writeGPUData(this.device, this.maskBuffer, words);\n this.previous = bytes;\n }\n\n dispose(): void {\n this.maskBuffer?.destroy();\n this.maskBuffer = null;\n this.previous = null;\n }\n}\n\nfunction sameBytes(left: Uint8Array, right: Uint8Array): boolean {\n if (left.byteLength !== right.byteLength) return false;\n for (let index = 0; index < left.byteLength; index += 1) {\n if (left[index] !== right[index]) return false;\n }\n return true;\n}\n", "import { WEBGPU_UNIFORM_STRIDE } from './WebGPURenderPipeline.js';\n\nconst FLOATS_PER_DRAW = WEBGPU_UNIFORM_STRIDE / 4;\n\nexport type ICEWebGPUDrawUniform = Readonly<{\n matrix: ArrayLike<number>;\n color: readonly [number, number, number, number];\n useVertexColor: boolean;\n useInstancing: boolean;\n semanticHighlight?: number;\n useSemantic?: boolean;\n selectionBase: number;\n useSelectionMask: boolean;\n pageBase?: number;\n useIndirect?: boolean;\n}>;\n\nexport class WebGPUDrawStorage {\n private uniformBuffer: Float32Array;\n private capacity: number;\n private generationValue = 0;\n private count = 0;\n\n constructor(private readonly minimumCapacity = 64) {\n if (!Number.isInteger(minimumCapacity) || minimumCapacity < 1) {\n throw new Error('ICE3_DRAW_STORAGE_INVALID');\n }\n this.capacity = drawCountPowerOfTwo(minimumCapacity);\n this.uniformBuffer = new Float32Array(\n this.capacity * FLOATS_PER_DRAW,\n );\n }\n\n begin(requiredDraws: number): void {\n this.ensureCapacity(requiredDraws);\n this.count = 0;\n }\n\n append(draw: ICEWebGPUDrawUniform): number {\n if (this.count >= this.capacity) {\n this.ensureCapacity(this.count + 1);\n }\n const index = this.count;\n const offset = index * FLOATS_PER_DRAW;\n this.uniformBuffer.set(draw.matrix, offset);\n this.uniformBuffer.set(draw.color, offset + 16);\n this.uniformBuffer[offset + 20] = 0;\n this.uniformBuffer[offset + 21] = 0;\n this.uniformBuffer[offset + 22] = draw.useVertexColor ? 1 : 0;\n this.uniformBuffer[offset + 23] = draw.useInstancing ? 1 : 0;\n this.uniformBuffer[offset + 24] = draw.semanticHighlight ?? 0;\n this.uniformBuffer[offset + 25] = draw.useSemantic ? 1 : 0;\n this.uniformBuffer[offset + 26] = 0;\n this.uniformBuffer[offset + 27] = 0;\n this.uniformBuffer[offset + 28] = draw.selectionBase;\n this.uniformBuffer[offset + 29] = draw.useSelectionMask ? 1 : 0;\n this.uniformBuffer[offset + 30] = draw.pageBase ?? 0;\n this.uniformBuffer[offset + 31] = draw.useIndirect ? 1 : 0;\n this.count += 1;\n return index;\n }\n\n get uniformData(): Float32Array {\n return this.uniformBuffer;\n }\n\n get drawCount(): number {\n return this.count;\n }\n\n get generation(): number {\n return this.generationValue;\n }\n\n private ensureCapacity(requiredDraws: number): void {\n const next = Math.max(\n this.minimumCapacity,\n drawCountPowerOfTwo(requiredDraws),\n );\n if (next === this.capacity) return;\n this.capacity = next;\n this.uniformBuffer = new Float32Array(next * FLOATS_PER_DRAW);\n this.generationValue += 1;\n }\n}\n\nfunction drawCountPowerOfTwo(value: number): number {\n let result = 1;\n while (result < Math.max(1, value)) result *= 2;\n return result;\n}\n", "import type { ICEScene } from '@ice3/core';\nimport {\n collectRenderables,\n type ICEGeometryRenderable,\n} from './Renderables.js';\nimport {\n collectInstanceBatches,\n type ICEInstanceBatch,\n} from './InstanceBatch.js';\nimport {\n collectRenderBatches,\n type ICERenderBatchDraw,\n} from './RenderBatch.js';\n\nexport type WebGPURenderPlan = Readonly<{\n scene: ICEScene;\n revision: number;\n renderables: readonly ICEGeometryRenderable[];\n instances: readonly ICEInstanceBatch[];\n batches: readonly ICERenderBatchDraw[];\n instancedMeshIds: ReadonlySet<string>;\n}>;\n\nexport class WebGPURenderPlanCache {\n private scene: ICEScene | null = null;\n private current: WebGPURenderPlan | null = null;\n private readonly renderablesScratch: ICEGeometryRenderable[] = [];\n private readonly instancesScratch: ICEInstanceBatch[] = [];\n private readonly batchesScratch: ICERenderBatchDraw[] = [];\n\n get(scene: ICEScene): WebGPURenderPlan {\n if (\n this.current\n && this.scene === scene\n && this.current.revision === scene.revision\n ) {\n return this.current;\n }\n\n const renderables = collectRenderables(\n scene,\n this.renderablesScratch,\n );\n const instances = collectInstanceBatches(\n renderables,\n this.instancesScratch,\n );\n const batches = collectRenderBatches(scene, this.batchesScratch);\n const instancedMeshIds = new Set<string>();\n for (const instance of instances) {\n for (const id of instance.meshIds) instancedMeshIds.add(id);\n }\n this.scene = scene;\n this.current = Object.freeze({\n scene,\n revision: scene.revision,\n renderables: Object.freeze([...renderables]),\n instances: Object.freeze([...instances]),\n batches: Object.freeze([...batches]),\n instancedMeshIds,\n });\n return this.current;\n }\n\n invalidate(): void {\n this.scene = null;\n this.current = null;\n this.renderablesScratch.length = 0;\n this.instancesScratch.length = 0;\n this.batchesScratch.length = 0;\n }\n\n dispose(): void {\n this.invalidate();\n }\n}\n", "export class WebGPUBundleCache {\n private key: string | null = null;\n private bundle: GPURenderBundle | null = null;\n private recreations = 0;\n\n constructor(\n private readonly device: GPUDevice,\n private readonly format: GPUTextureFormat,\n ) {}\n\n get(\n key: string,\n record: (encoder: GPURenderBundleEncoder) => void,\n ): GPURenderBundle {\n if (this.key === key && this.bundle) return this.bundle;\n const encoder = this.device.createRenderBundleEncoder({\n label: `ice3:bundle:${key}`,\n colorFormats: [this.format],\n depthStencilFormat: 'depth24plus',\n });\n record(encoder);\n const bundle = encoder.finish();\n this.key = key;\n this.bundle = bundle;\n this.recreations += 1;\n return bundle;\n }\n\n get current(): GPURenderBundle | null {\n return this.bundle;\n }\n\n get bundleRecreations(): number {\n return this.recreations;\n }\n\n invalidate(): void {\n this.key = null;\n this.bundle = null;\n }\n\n dispose(): void {\n this.invalidate();\n }\n}\n", "export type ICEWebGPUAccelerationTier =\n | 'baseline'\n | 'storage'\n | 'gpu-driven';\n\n// Measured CPU benefit was below the 10% promotion threshold.\nexport const WEBGPU_STORAGE_DEFAULT = false;\nexport const WEBGPU_GPU_DRIVEN_DEFAULT = false;\nexport const WEBGPU_INSTANCE_VISIBILITY_THRESHOLD = 1024;\n\nexport type ICEWebGPUOptimizationStats = Readonly<{\n tier: ICEWebGPUAccelerationTier;\n selectionMaskActive: boolean;\n bundleActive: boolean;\n storageActive: boolean;\n visibilityActive: boolean;\n instanceUploadBytes: number;\n bundleRecreations: number;\n timestampUnavailableReason?: string;\n}>;\n\nexport type ICEWebGPUAcceleration = Readonly<{\n tier: ICEWebGPUAccelerationTier;\n storage: boolean;\n visibility: boolean;\n maxStorageBufferBindingSize: number;\n minStorageBufferOffsetAlignment: number;\n}>;\n\nexport function detectWebGPUAcceleration(\n device: GPUDevice,\n): ICEWebGPUAcceleration {\n const maxBindingBytes =\n device.limits.maxStorageBufferBindingSize ?? 0;\n const maxBuffers =\n device.limits.maxStorageBuffersPerShaderStage ?? 0;\n const alignment =\n device.limits.minStorageBufferOffsetAlignment ?? 256;\n const storage = (\n maxBindingBytes >= 256\n && maxBuffers >= 2\n && alignment >= 4\n && Number.isInteger(alignment)\n );\n const visibility = storage && maxBuffers >= 3;\n return {\n tier: visibility ? 'gpu-driven' : storage ? 'storage' : 'baseline',\n storage,\n visibility,\n maxStorageBufferBindingSize: maxBindingBytes,\n minStorageBufferOffsetAlignment: alignment,\n };\n}\n", "import type {\n ICEGeometry,\n} from '@ice3/core';\nimport type { ICEInstanceBatch } from './InstanceBatch.js';\nimport {\n createEmptyGPUDataBuffer,\n writeGPUData,\n} from './WebGPUResources.js';\n\nconst STORAGE_USAGE = 128 | 8;\nexport const INSTANCE_RECORD_BYTES = 96;\n\nexport type ICEInstanceStoragePagePlan = Readonly<{\n firstInstance: number;\n instanceCount: number;\n}>;\n\nexport type ICEInstanceStoragePage = ICEInstanceStoragePagePlan & {\n readonly buffer: GPUBuffer;\n};\n\nexport type ICEInstanceStorageEntry = Readonly<{\n pages: readonly ICEInstanceStoragePage[];\n generation: number;\n bytes: number;\n}>;\n\ntype CachedEntry = ICEInstanceStorageEntry & {\n readonly geometry: ICEGeometry;\n readonly matrixSource: Float32Array;\n readonly semanticSource: Uint32Array;\n};\n\nexport type WebGPUInstanceStorageOptions = {\n readonly maxBindingBytes: number;\n readonly minOffsetAlignment: number;\n};\n\nexport class WebGPUInstanceStorage {\n private readonly entries = new Map<string, CachedEntry>();\n private active = new Set<string>();\n private resourceGeneration = 0;\n private uploadBytes = 0;\n private readonly maxBindingBytes: number;\n private readonly minOffsetAlignment: number;\n\n constructor(\n private readonly device: GPUDevice,\n options?: Partial<WebGPUInstanceStorageOptions>,\n ) {\n this.maxBindingBytes = options?.maxBindingBytes\n ?? device.limits.maxStorageBufferBindingSize\n ?? 0;\n this.minOffsetAlignment = options?.minOffsetAlignment\n ?? device.limits.minStorageBufferOffsetAlignment\n ?? 256;\n if (\n this.maxBindingBytes < INSTANCE_RECORD_BYTES\n || this.minOffsetAlignment < 4\n ) {\n throw new Error('ICE3_STORAGE_INVALID: limits are too low');\n }\n }\n\n plan(\n instanceCount: number,\n recordBytes = INSTANCE_RECORD_BYTES,\n ): readonly ICEInstanceStoragePagePlan[] {\n if (\n !Number.isInteger(instanceCount)\n || instanceCount < 0\n || !Number.isInteger(recordBytes)\n || recordBytes < 1\n ) {\n throw new Error('ICE3_STORAGE_INVALID: page input');\n }\n if (instanceCount === 0) return [];\n const stride = Math.ceil(recordBytes / 16) * 16;\n const perPage = Math.max(1, Math.floor(this.maxBindingBytes / stride));\n const pages: ICEInstanceStoragePagePlan[] = [];\n for (let first = 0; first < instanceCount; first += perPage) {\n pages.push({\n firstInstance: first,\n instanceCount: Math.min(perPage, instanceCount - first),\n });\n }\n return pages;\n }\n\n retain(\n batch: ICEInstanceBatch,\n geometry: ICEGeometry,\n ): ICEInstanceStorageEntry {\n this.active.add(batch.id);\n const existing = this.entries.get(batch.id);\n if (\n existing\n && existing.geometry === geometry\n && existing.matrixSource === batch.instanceMatrices\n && existing.semanticSource === batch.semanticIndices\n ) {\n return existing;\n }\n if (existing) this.delete(existing);\n\n const bounds = geometry.getBounds();\n const radius = Math.hypot(\n bounds.max[0] - bounds.min[0],\n bounds.max[1] - bounds.min[1],\n bounds.max[2] - bounds.min[2],\n ) / 2;\n const center = [\n (bounds.min[0] + bounds.max[0]) / 2,\n (bounds.min[1] + bounds.max[1]) / 2,\n (bounds.min[2] + bounds.max[2]) / 2,\n ] as const;\n const plans = this.plan(batch.semanticIds.length);\n const pages = plans.map((page) => {\n const data = new ArrayBuffer(page.instanceCount * INSTANCE_RECORD_BYTES);\n const floats = new Float32Array(data);\n const words = new Uint32Array(data);\n for (let local = 0; local < page.instanceCount; local += 1) {\n const source = page.firstInstance + local;\n const offset = local * 24;\n floats.set(\n batch.instanceMatrices.subarray(source * 16, source * 16 + 16),\n offset,\n );\n floats.set([\n center[0],\n center[1],\n center[2],\n radius,\n ], offset + 16);\n words[offset + 20] = batch.semanticIndices[source] ?? source;\n }\n const buffer = createEmptyGPUDataBuffer(\n this.device,\n data.byteLength,\n STORAGE_USAGE,\n `ice3:instance-records:${batch.id}:${page.firstInstance}`,\n );\n writeGPUData(this.device, buffer, floats);\n this.uploadBytes += data.byteLength;\n return { ...page, buffer };\n });\n const entry: CachedEntry = {\n pages,\n generation: ++this.resourceGeneration,\n bytes: pages.reduce((sum, page) => sum + page.buffer.size, 0),\n geometry,\n matrixSource: batch.instanceMatrices,\n semanticSource: batch.semanticIndices,\n };\n this.entries.set(batch.id, entry);\n return entry;\n }\n\n beginFrame(): void {\n this.active = new Set();\n }\n\n endFrame(): void {\n for (const [id, entry] of this.entries) {\n if (this.active.has(id)) continue;\n this.delete(entry);\n this.entries.delete(id);\n }\n }\n\n get generation(): number {\n return this.resourceGeneration;\n }\n\n get totalBytes(): number {\n return [...this.entries.values()]\n .reduce((sum, entry) => sum + entry.bytes, 0);\n }\n\n get totalUploadBytes(): number {\n return this.uploadBytes;\n }\n\n dispose(): void {\n for (const entry of this.entries.values()) this.delete(entry);\n this.entries.clear();\n this.active.clear();\n }\n\n private delete(entry: ICEInstanceStorageEntry): void {\n for (const page of entry.pages) page.buffer.destroy();\n this.resourceGeneration += 1;\n }\n}\n", "import type { ICEGeometryBounds } from '@ice3/core';\nimport type { ICEInstanceStoragePage } from './WebGPUInstanceStorage.js';\nimport {\n createEmptyGPUDataBuffer,\n writeGPUData,\n} from './WebGPUResources.js';\n\nconst STORAGE_USAGE = 128 | 8;\nconst INDIRECT_USAGE = 256 | 128 | 8 | 4;\n\nexport function createIndirectArguments(\n indexCount: number,\n firstIndex: number,\n baseVertex: number,\n): Uint32Array | undefined {\n if (\n !Number.isInteger(indexCount)\n || indexCount < 0\n || !Number.isInteger(firstIndex)\n || firstIndex < 0\n || !Number.isInteger(baseVertex)\n || baseVertex < 0\n ) {\n return undefined;\n }\n return new Uint32Array([\n indexCount,\n 0,\n firstIndex,\n baseVertex,\n 0,\n ]);\n}\n\nexport function isAabbVisible(\n matrix: ArrayLike<number>,\n bounds: ICEGeometryBounds,\n viewProjection: ArrayLike<number>,\n): boolean {\n let minX = Infinity;\n let minY = Infinity;\n let minZ = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n let maxZ = -Infinity;\n for (const x of [bounds.min[0], bounds.max[0]]) {\n for (const y of [bounds.min[1], bounds.max[1]]) {\n for (const z of [bounds.min[2], bounds.max[2]]) {\n const world = multiply(matrix, [x, y, z, 1]);\n minX = Math.min(minX, world[0]);\n minY = Math.min(minY, world[1]);\n minZ = Math.min(minZ, world[2]);\n maxX = Math.max(maxX, world[0]);\n maxY = Math.max(maxY, world[1]);\n maxZ = Math.max(maxZ, world[2]);\n }\n }\n }\n const row = (index: number) => [\n viewProjection[index]!,\n viewProjection[index + 4]!,\n viewProjection[index + 8]!,\n viewProjection[index + 12]!,\n ] as const;\n const r0 = row(0);\n const r1 = row(1);\n const r2 = row(2);\n const r3 = row(3);\n const planes = [\n addPlane(r3, r0),\n subtractPlane(r3, r0),\n addPlane(r3, r1),\n subtractPlane(r3, r1),\n addPlane(r3, r2),\n subtractPlane(r3, r2),\n ];\n return !planes.some((plane) => {\n const x = plane[0] >= 0 ? maxX : minX;\n const y = plane[1] >= 0 ? maxY : minY;\n const z = plane[2] >= 0 ? maxZ : minZ;\n return plane[0] * x + plane[1] * y + plane[2] * z + plane[3] < 0;\n });\n}\n\nexport type ICEVisibilityEntry = Readonly<{\n readonly visibleBuffer: GPUBuffer;\n readonly indirectBuffer: GPUBuffer;\n readonly instanceCount: number;\n}>;\n\nconst COMPUTE_SHADER = `\nstruct FrameUniforms {\n worldViewProjection: mat4x4<f32>,\n}\n\nstruct InstanceRecord {\n transform: mat4x4<f32>,\n bounds: vec4<f32>,\n semantic: u32,\n pad0: u32,\n pad1: u32,\n pad2: u32,\n}\n\nstruct IndirectArguments {\n indexCount: u32,\n instanceCount: atomic<u32>,\n firstIndex: u32,\n baseVertex: i32,\n firstInstance: u32,\n}\n\n@group(0) @binding(0) var<uniform> frame: FrameUniforms;\n@group(0) @binding(1) var<storage, read> instances: array<InstanceRecord>;\n@group(0) @binding(2) var<storage, read_write> visible: array<u32>;\n@group(0) @binding(3) var<storage, read_write> arguments: IndirectArguments;\n\n@compute @workgroup_size(64)\nfn computeMain(@builtin(global_invocation_id) id: vec3<u32>) {\n let index = id.x;\n if (index >= arrayLength(&instances)) {\n return;\n }\n let instance = instances[index];\n let radius = instance.bounds.w;\n let localMin = instance.bounds.xyz - vec3<f32>(radius);\n let localMax = instance.bounds.xyz + vec3<f32>(radius);\n var worldMin = vec3<f32>(1e30);\n var worldMax = vec3<f32>(-1e30);\n for (var cornerIndex = 0u; cornerIndex < 8u; cornerIndex += 1u) {\n let corner = vec3<f32>(\n select(localMin.x, localMax.x, (cornerIndex & 1u) != 0u),\n select(localMin.y, localMax.y, (cornerIndex & 2u) != 0u),\n select(localMin.z, localMax.z, (cornerIndex & 4u) != 0u)\n );\n let world = (instance.transform * vec4<f32>(corner, 1.0)).xyz;\n worldMin = min(worldMin, world);\n worldMax = max(worldMax, world);\n }\n let r0 = vec4<f32>(\n frame.worldViewProjection[0][0],\n frame.worldViewProjection[1][0],\n frame.worldViewProjection[2][0],\n frame.worldViewProjection[3][0]\n );\n let r1 = vec4<f32>(\n frame.worldViewProjection[0][1],\n frame.worldViewProjection[1][1],\n frame.worldViewProjection[2][1],\n frame.worldViewProjection[3][1]\n );\n let r2 = vec4<f32>(\n frame.worldViewProjection[0][2],\n frame.worldViewProjection[1][2],\n frame.worldViewProjection[2][2],\n frame.worldViewProjection[3][2]\n );\n let r3 = vec4<f32>(\n frame.worldViewProjection[0][3],\n frame.worldViewProjection[1][3],\n frame.worldViewProjection[2][3],\n frame.worldViewProjection[3][3]\n );\n let planes = array<vec4<f32>, 6>(\n r3 + r0,\n r3 - r0,\n r3 + r1,\n r3 - r1,\n r3 + r2,\n r3 - r2\n );\n var culled = false;\n for (var planeIndex = 0u; planeIndex < 6u; planeIndex += 1u) {\n let plane = planes[planeIndex];\n let positive = select(worldMin, worldMax, plane.xyz >= vec3<f32>(0.0));\n if (dot(plane.xyz, positive) + plane.w < 0.0) {\n culled = true;\n break;\n }\n }\n if (culled) {\n return;\n }\n let slot = atomicAdd(&arguments.instanceCount, 1u);\n visible[slot] = index;\n}\n`;\n\nexport class WebGPUVisibilityEncoder {\n private readonly entries = new Map<\n GPUBuffer,\n Map<number, ICEVisibilityEntry>\n >();\n\n private constructor(\n private readonly device: GPUDevice,\n readonly bindGroupLayout: GPUBindGroupLayout,\n readonly pipeline: GPUComputePipeline,\n ) {}\n\n static async create(device: GPUDevice): Promise<WebGPUVisibilityEncoder> {\n const bindGroupLayout = device.createBindGroupLayout({\n entries: [\n {\n binding: 0,\n visibility: 4,\n buffer: {\n type: 'uniform',\n hasDynamicOffset: true,\n minBindingSize: 64,\n },\n },\n {\n binding: 1,\n visibility: 4,\n buffer: { type: 'read-only-storage', minBindingSize: 96 },\n },\n {\n binding: 2,\n visibility: 4,\n buffer: { type: 'storage', minBindingSize: 4 },\n },\n {\n binding: 3,\n visibility: 4,\n buffer: { type: 'storage', minBindingSize: 20 },\n },\n ],\n });\n const layout = device.createPipelineLayout({\n bindGroupLayouts: [bindGroupLayout],\n });\n const module = device.createShaderModule({ code: COMPUTE_SHADER });\n const pipeline = await device.createComputePipelineAsync({\n label: 'ice3:visibility',\n layout,\n compute: { module, entryPoint: 'computeMain' },\n });\n return new WebGPUVisibilityEncoder(device, bindGroupLayout, pipeline);\n }\n\n retain(\n page: ICEInstanceStoragePage,\n indexCount: number,\n ): ICEVisibilityEntry {\n const byIndexCount = this.entries.get(page.buffer);\n const existing = byIndexCount?.get(indexCount);\n if (existing) {\n return existing;\n }\n const visibleBuffer = createEmptyGPUDataBuffer(\n this.device,\n page.instanceCount * 4,\n STORAGE_USAGE,\n 'ice3:visible-instances',\n );\n const indirectBuffer = createEmptyGPUDataBuffer(\n this.device,\n 256,\n INDIRECT_USAGE,\n 'ice3:indirect-arguments',\n );\n writeGPUData(\n this.device,\n indirectBuffer,\n createIndirectArguments(indexCount, 0, 0)!,\n );\n const entry = {\n visibleBuffer,\n indirectBuffer,\n instanceCount: page.instanceCount,\n };\n const entries = byIndexCount ?? new Map();\n entries.set(indexCount, entry);\n this.entries.set(page.buffer, entries);\n return entry;\n }\n\n encode(\n encoder: GPUCommandEncoder,\n entry: ICEVisibilityEntry,\n page: ICEInstanceStoragePage,\n uniformBuffer: GPUBuffer,\n uniformOffset: number,\n ): void {\n encoder.clearBuffer(entry.indirectBuffer, 4, 4);\n const bindGroup = this.device.createBindGroup({\n label: 'ice3:visibility-bindings',\n layout: this.bindGroupLayout,\n entries: [\n {\n binding: 0,\n resource: { buffer: uniformBuffer, offset: 0, size: 112 },\n },\n {\n binding: 1,\n resource: { buffer: page.buffer, offset: 0, size: page.buffer.size },\n },\n {\n binding: 2,\n resource: {\n buffer: entry.visibleBuffer,\n offset: 0,\n size: entry.visibleBuffer.size,\n },\n },\n {\n binding: 3,\n resource: {\n buffer: entry.indirectBuffer,\n offset: 0,\n size: entry.indirectBuffer.size,\n },\n },\n ],\n });\n const pass = encoder.beginComputePass({ label: 'ice3:visibility-pass' });\n pass.setPipeline(this.pipeline);\n pass.setBindGroup(0, bindGroup, [uniformOffset]);\n pass.dispatchWorkgroups(Math.ceil(page.instanceCount / 64));\n pass.end();\n }\n\n async readStats(\n entry: ICEVisibilityEntry,\n page: ICEInstanceStoragePage,\n ): Promise<Readonly<{\n visibleInstances: number;\n culledInstances: number;\n dispatchCount: number;\n }>> {\n const readback = this.device.createBuffer({\n label: 'ice3:visibility-stats',\n size: 4,\n usage: 1 | 8,\n });\n const encoder = this.device.createCommandEncoder();\n encoder.copyBufferToBuffer(entry.indirectBuffer, 4, readback, 0, 4);\n this.device.queue.submit([encoder.finish()]);\n try {\n await readback.mapAsync(1);\n const visibleInstances = new Uint32Array(\n readback.getMappedRange(),\n )[0]!;\n return {\n visibleInstances,\n culledInstances: page.instanceCount - visibleInstances,\n dispatchCount: Math.ceil(page.instanceCount / 64),\n };\n } finally {\n readback.unmap();\n readback.destroy();\n }\n }\n\n dispose(): void {\n for (const entries of this.entries.values()) {\n for (const entry of entries.values()) this.destroy(entry);\n }\n this.entries.clear();\n }\n\n private destroy(entry: ICEVisibilityEntry): void {\n entry.visibleBuffer.destroy();\n entry.indirectBuffer.destroy();\n }\n}\n\nfunction multiply(\n matrix: ArrayLike<number>,\n vector: readonly [number, number, number, number],\n): [number, number, number, number] {\n return [\n matrix[0]! * vector[0] + matrix[4]! * vector[1]\n + matrix[8]! * vector[2] + matrix[12]! * vector[3],\n matrix[1]! * vector[0] + matrix[5]! * vector[1]\n + matrix[9]! * vector[2] + matrix[13]! * vector[3],\n matrix[2]! * vector[0] + matrix[6]! * vector[1]\n + matrix[10]! * vector[2] + matrix[14]! * vector[3],\n matrix[3]! * vector[0] + matrix[7]! * vector[1]\n + matrix[11]! * vector[2] + matrix[15]! * vector[3],\n ];\n}\n\nfunction addPlane(\n left: readonly [number, number, number, number],\n right: readonly [number, number, number, number],\n): readonly [number, number, number, number] {\n return [\n left[0] + right[0],\n left[1] + right[1],\n left[2] + right[2],\n left[3] + right[3],\n ];\n}\n\nfunction subtractPlane(\n left: readonly [number, number, number, number],\n right: readonly [number, number, number, number],\n): readonly [number, number, number, number] {\n return [\n left[0] - right[0],\n left[1] - right[1],\n left[2] - right[2],\n left[3] - right[3],\n ];\n}\n", "import {\n ICEEngineError,\n ICEMatrix4,\n} from '@ice3/core';\nimport {\n collectRenderables,\n} from './Renderables.js';\nimport {\n collectRenderBatches,\n} from './RenderBatch.js';\nimport {\n collectInstanceBatches,\n} from './InstanceBatch.js';\nimport {\n decodeSelectionIndex,\n} from './WebGL2PickCodec.js';\nimport { WebGPUGeometryCache } from './WebGPUGeometryCache.js';\nimport { WebGPUInstanceCache } from './WebGPUInstanceCache.js';\nimport {\n WebGPURenderPipeline,\n WEBGPU_UNIFORM_BYTES,\n WEBGPU_UNIFORM_STRIDE,\n} from './WebGPURenderPipeline.js';\nimport { WebGPURenderPlanCache } from './WebGPURenderPlan.js';\nimport type {\n ICEFrame,\n ICEScreenPoint,\n} from './types.js';\n\ntype ICEPickFrame = ICEFrame & {\n readonly point: ICEScreenPoint;\n};\n\nconst VERTEX_USAGE = 32 | 8;\nconst UNIFORM_USAGE = 64 | 8;\nconst PICK_TEXTURE_USAGE = 16 | 1;\nconst DEPTH_USAGE = 16;\nconst MAP_READ = 1;\nconst COPY_DST = 8;\nconst PICK_FORMAT: GPUTextureFormat = 'rgba8unorm';\n\nexport class WebGPUPicker {\n private readonly pipelinePromise: Promise<WebGPURenderPipeline>;\n private readonly instanceCache: WebGPUInstanceCache;\n private readonly identityInstances: GPUBuffer;\n private readonly zeroSemantics: GPUBuffer;\n private readonly renderPlan = new WebGPURenderPlanCache();\n private target: GPUTexture | null = null;\n private depth: GPUTexture | null = null;\n private uniformBuffer: GPUBuffer | null = null;\n private width = 0;\n private height = 0;\n private disposed = false;\n\n constructor(\n private readonly device: GPUDevice,\n format: GPUTextureFormat,\n ) {\n void format;\n this.pipelinePromise = WebGPURenderPipeline.create(device, PICK_FORMAT);\n this.instanceCache = new WebGPUInstanceCache(device);\n this.identityInstances = device.createBuffer({\n label: 'ice3:pick-identity-instances',\n size: 80,\n usage: VERTEX_USAGE,\n });\n const identity = new Float32Array(20);\n identity.set([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]);\n device.queue.writeBuffer(this.identityInstances, 0, identity);\n this.zeroSemantics = device.createBuffer({\n label: 'ice3:pick-zero-semantic',\n size: 4,\n usage: VERTEX_USAGE,\n });\n device.queue.writeBuffer(this.zeroSemantics, 0, new Uint32Array([0]));\n }\n\n async pick(\n frame: ICEPickFrame,\n geometryCache: WebGPUGeometryCache,\n pickIds: Readonly<Record<number, string>>,\n ): Promise<string | undefined> {\n if (this.disposed) {\n throw new ICEEngineError(\n 'ICE3_ENGINE_DESTROYED',\n 'WebGPU picker is disposed',\n );\n }\n const width = Math.max(\n 1,\n Math.round(frame.viewport.width * frame.dpr),\n );\n const height = Math.max(\n 1,\n Math.round(frame.viewport.height * frame.dpr),\n );\n this.ensureTarget(width, height);\n const pipeline = await this.pipelinePromise;\n this.instanceCache.beginFrame();\n geometryCache.beginFrame();\n const plan = this.renderPlan.get(frame.scene);\n const renderables = plan.renderables;\n const instances = plan.instances;\n const batches = plan.batches;\n const instancedIds = new Set<string>();\n const idBySelection = new Map<string, number>();\n for (const [key, value] of Object.entries(pickIds)) {\n idBySelection.set(value, Number(key));\n }\n const aspect = frame.viewport.width / Math.max(frame.viewport.height, 1);\n const viewProjection = frame.camera.getViewProjectionMatrix(aspect);\n const mvp = new ICEMatrix4();\n const world = new ICEMatrix4();\n const draws: Array<{\n matrix: Float32Array;\n base: number;\n useInstancing: boolean;\n instanceCount: number;\n geometry: ReturnType<WebGPUGeometryCache['retain']>;\n instanceBuffer: GPUBuffer;\n semanticBuffer: GPUBuffer;\n }> = [];\n const matrixFor = (matrix: ArrayLike<number>): Float32Array => {\n mvp.elements.set(viewProjection.elements);\n world.elements.set(matrix);\n mvp.multiply(world);\n return new Float32Array(mvp.elements);\n };\n for (const batch of instances) {\n const ids = batch.semanticIds\n .map((id) => idBySelection.get(id))\n .filter((id): id is number => id !== undefined);\n if (ids.length === 0) continue;\n const instance = this.instanceCache.retain(batch);\n for (const id of batch.meshIds) instancedIds.add(id);\n draws.push({\n matrix: new Float32Array(viewProjection.elements),\n base: Math.min(...ids) - 1,\n useInstancing: true,\n instanceCount: instance.instanceCount,\n geometry: geometryCache.retain(batch.geometry),\n instanceBuffer: instance.matrixBuffer,\n semanticBuffer: instance.semanticBuffer,\n });\n }\n for (const draw of batches) {\n const ids = draw.batch.semanticSelectionIds\n .map((id) => idBySelection.get(id))\n .filter((id): id is number => id !== undefined);\n if (ids.length === 0) continue;\n draws.push({\n matrix: matrixFor(draw.worldMatrix),\n base: Math.min(...ids) - 1,\n useInstancing: false,\n instanceCount: 1,\n geometry: geometryCache.retain(draw.batch.geometry),\n instanceBuffer: this.identityInstances,\n semanticBuffer:\n geometryCache.retain(draw.batch.geometry).semanticBuffer\n ?? this.zeroSemantics,\n });\n }\n for (const renderable of renderables) {\n if (instancedIds.has(renderable.id)) continue;\n const id = idBySelection.get(renderable.mesh.selectionId);\n if (id === undefined) continue;\n draws.push({\n matrix: matrixFor(renderable.worldMatrix),\n base: id - 1,\n useInstancing: false,\n instanceCount: 1,\n geometry: geometryCache.retain(renderable.mesh.geometry),\n instanceBuffer: this.identityInstances,\n semanticBuffer: this.zeroSemantics,\n });\n }\n this.ensureUniformBuffer(draws.length);\n const uniforms = new Float32Array(draws.length * 64);\n for (let index = 0; index < draws.length; index += 1) {\n const draw = draws[index]!;\n const offset = index * 64;\n uniforms.set(draw.matrix, offset);\n uniforms[offset + 16] = 1;\n uniforms[offset + 17] = 1;\n uniforms[offset + 18] = 1;\n uniforms[offset + 19] = 1;\n uniforms[offset + 23] = draw.useInstancing ? 1 : 0;\n uniforms[offset + 26] = 1;\n uniforms[offset + 27] = draw.base;\n }\n if (uniforms.length > 0) {\n this.device.queue.writeBuffer(\n this.uniformBuffer!,\n 0,\n uniforms as unknown as BufferSource,\n );\n }\n const bindGroup = this.device.createBindGroup({\n layout: pipeline.bindGroupLayout,\n entries: [{\n binding: 0,\n resource: {\n buffer: this.uniformBuffer!,\n offset: 0,\n size: WEBGPU_UNIFORM_BYTES,\n },\n }],\n });\n const encoder = this.device.createCommandEncoder();\n const pass = encoder.beginRenderPass({\n colorAttachments: [{\n view: this.target!.createView(),\n clearValue: { r: 0, g: 0, b: 0, a: 1 },\n loadOp: 'clear',\n storeOp: 'store',\n }],\n depthStencilAttachment: {\n view: this.depth!.createView(),\n depthClearValue: 1,\n depthLoadOp: 'clear',\n depthStoreOp: 'store',\n },\n });\n pass.setPipeline(pipeline.triangle);\n for (let index = 0; index < draws.length; index += 1) {\n const draw = draws[index]!;\n pass.setBindGroup(0, bindGroup, [index * WEBGPU_UNIFORM_STRIDE]);\n pass.setVertexBuffer(0, draw.geometry.vertexBuffer);\n pass.setVertexBuffer(1, draw.instanceBuffer);\n pass.setVertexBuffer(2, draw.semanticBuffer);\n pass.setIndexBuffer(\n draw.geometry.triangleIndexBuffer,\n draw.geometry.indexFormat,\n );\n pass.drawIndexed(\n draw.geometry.triangleCount,\n draw.instanceCount,\n );\n }\n pass.end();\n const pixelX = Math.max(\n 0,\n Math.min(this.width - 1, Math.floor(frame.point.x * frame.dpr)),\n );\n const pixelY = Math.max(\n 0,\n Math.min(this.height - 1, Math.floor(frame.point.y * frame.dpr)),\n );\n const readback = this.device.createBuffer({\n label: 'ice3:pick-readback',\n size: 256,\n usage: COPY_DST | MAP_READ,\n });\n encoder.copyTextureToBuffer(\n {\n texture: this.target!,\n origin: {\n x: pixelX,\n y: pixelY,\n z: 0,\n },\n },\n {\n buffer: readback,\n bytesPerRow: 256,\n rowsPerImage: 1,\n },\n { width: 1, height: 1, depthOrArrayLayers: 1 },\n );\n this.device.queue.submit([encoder.finish()]);\n let pixel: Uint8Array | undefined;\n try {\n await readback.mapAsync(MAP_READ);\n pixel = new Uint8Array(readback.getMappedRange(), 0, 4).slice();\n } catch (error) {\n throw new ICEEngineError(\n 'ICE3_WEBGPU_PICK_UNAVAILABLE',\n 'ICE3_WEBGPU_PICK_UNAVAILABLE: readback failed',\n { cause: error },\n );\n } finally {\n readback.unmap();\n readback.destroy();\n this.instanceCache.endFrame();\n geometryCache.endFrame();\n }\n const index = pixel ? decodeSelectionIndex(pixel) : undefined;\n return index === undefined ? undefined : pickIds[index];\n }\n\n resize(width: number, height: number): void {\n this.ensureTarget(width, height);\n }\n\n dispose(): void {\n if (this.disposed) return;\n this.disposed = true;\n this.target?.destroy();\n this.depth?.destroy();\n this.uniformBuffer?.destroy();\n this.identityInstances.destroy();\n this.zeroSemantics.destroy();\n this.instanceCache.dispose();\n this.renderPlan.dispose();\n this.target = null;\n this.depth = null;\n this.uniformBuffer = null;\n }\n\n private ensureTarget(width: number, height: number): void {\n if (this.target && this.depth && this.width === width && this.height === height) {\n return;\n }\n this.target?.destroy();\n this.depth?.destroy();\n this.target = this.device.createTexture({\n label: 'ice3:pick-target',\n size: [width, height],\n format: PICK_FORMAT,\n usage: PICK_TEXTURE_USAGE,\n });\n this.depth = this.device.createTexture({\n label: 'ice3:pick-depth',\n size: [width, height],\n format: 'depth24plus',\n usage: DEPTH_USAGE,\n });\n this.width = width;\n this.height = height;\n }\n\n private ensureUniformBuffer(draws: number): void {\n const capacity = Math.max(1, draws);\n if (capacity <= this.uniformBufferDraws()) return;\n this.uniformBuffer?.destroy();\n this.uniformBuffer = this.device.createBuffer({\n label: 'ice3:pick-uniforms',\n size: capacity * WEBGPU_UNIFORM_STRIDE,\n usage: UNIFORM_USAGE,\n });\n this.uniformBufferCapacity = capacity;\n }\n\n private uniformBufferCapacity = 0;\n\n private uniformBufferDraws(): number {\n return this.uniformBufferCapacity;\n }\n}\n\nexport function collectWebGPUPickIds(\n frame: ICEFrame,\n): Readonly<Record<number, string>> {\n const pickIds: Record<number, string> = {};\n const seen = new Set<string>();\n let next = 1;\n const add = (id: string): void => {\n if (seen.has(id)) return;\n seen.add(id);\n pickIds[next] = id;\n next += 1;\n };\n const renderables = collectRenderables(frame.scene);\n const instances = collectInstanceBatches(renderables);\n for (const instance of instances) {\n for (const id of instance.semanticIds) add(id);\n }\n const instancedIds = new Set(instances.flatMap((item) => item.meshIds));\n for (const batch of collectRenderBatches(frame.scene)) {\n for (const id of batch.batch.semanticSelectionIds) add(id);\n }\n for (const renderable of renderables) {\n if (!instancedIds.has(renderable.id)) add(renderable.mesh.selectionId);\n }\n return pickIds;\n}\n", "import {\n ICEEngineError,\n ICEMatrix4,\n type ICEGeometry,\n} from '@ice3/core';\nimport { colorToRgba } from './Color.js';\nimport type {\n ICERendererBackend,\n ICERendererCapabilities,\n ICEFrame,\n ICEViewport,\n} from './types.js';\nimport {\n WebGPUGeometryCache,\n type WebGPUGeometryEntry,\n} from './WebGPUGeometryCache.js';\nimport {\n WebGPUInstanceCache,\n type WebGPUInstanceEntry,\n} from './WebGPUInstanceCache.js';\nimport {\n WebGPURenderPipeline,\n WEBGPU_UNIFORM_BYTES,\n WEBGPU_UNIFORM_STRIDE,\n} from './WebGPURenderPipeline.js';\nimport {\n RendererProfiler,\n type ICEFrameStageProfile,\n} from './RendererProfiler.js';\nimport { WebGPUTimestampProfiler } from './WebGPUTimestampProfiler.js';\nimport {\n buildSelectionMask,\n WebGPUSelectionMaskBuffer,\n type ICESelectionMaskLayout,\n} from './WebGPUSelectionMask.js';\nimport { WebGPUDrawStorage } from './WebGPUDrawStorage.js';\nimport { WebGPURenderPlanCache } from './WebGPURenderPlan.js';\nimport { WebGPUBundleCache } from './WebGPUBundleCache.js';\nimport {\n detectWebGPUAcceleration,\n type ICEWebGPUAcceleration,\n type ICEWebGPUOptimizationStats,\n WEBGPU_GPU_DRIVEN_DEFAULT,\n WEBGPU_INSTANCE_VISIBILITY_THRESHOLD,\n WEBGPU_STORAGE_DEFAULT,\n} from './WebGPUCapabilities.js';\nimport {\n WebGPUInstanceStorage,\n type ICEInstanceStoragePage,\n} from './WebGPUInstanceStorage.js';\nimport {\n WebGPUVisibilityEncoder,\n type ICEVisibilityEntry,\n} from './WebGPUVisibility.js';\nimport {\n collectWebGPUPickIds,\n WebGPUPicker,\n} from './WebGPUPicker.js';\nimport type { ICEScreenPoint } from './types.js';\n\nconst VERTEX_USAGE = 32 | 8;\nconst UNIFORM_USAGE = 64 | 8;\nconst RENDER_ATTACHMENT_USAGE = 16;\nconst UNIFORM_BUFFER_INITIAL_DRAWS = 64;\nconst SELECTION_RGBA = [1, 208 / 255, 0, 1] as const;\nconst SELECTION_TINT_RGBA = [1, 208 / 255, 0, 0.65] as const;\nconst EMPTY_SELECTION = new Uint32Array([0]);\nconst EDGE_PIXEL_OFFSETS = [\n [0, 0],\n [-1, 0],\n [1, 0],\n [0, -1],\n [0, 1],\n] as const;\n\nexport type WebGPUDeviceContext = Readonly<{\n adapter: GPUAdapter;\n device: GPUDevice;\n format: GPUTextureFormat;\n release?: () => void;\n}>;\n\nexport type WebGPURendererBackendOptions = Readonly<{\n readonly forceStoragePath?: boolean;\n readonly forceGpuDriven?: boolean;\n}>;\n\nexport class WebGPURendererBackend implements ICERendererBackend {\n capabilities: Readonly<ICERendererCapabilities> = {\n backend: 'webgpu',\n maxTextureSize: 0,\n picking: true,\n };\n\n private readonly adapter: GPUAdapter;\n private device: GPUDevice;\n private readonly format: GPUTextureFormat;\n private pipeline: WebGPURenderPipeline;\n private storagePipeline: WebGPURenderPipeline | null;\n private gpuDrivenPipeline: WebGPURenderPipeline | null;\n private visibilityEncoder: WebGPUVisibilityEncoder | null;\n private storageCache: WebGPUInstanceStorage | null;\n private readonly acceleration: ICEWebGPUAcceleration;\n private readonly forceStoragePath: boolean;\n private readonly forceGpuDriven: boolean;\n private readonly releaseProbe: (() => void) | undefined;\n private onContextLost: (() => void) | undefined;\n private onContextRestored: (() => void) | undefined;\n private onError: ((error: ICEEngineError) => void) | undefined;\n private disposing = false;\n private canvas: HTMLCanvasElement | null = null;\n private context: GPUCanvasContext | null = null;\n private geometryCache: WebGPUGeometryCache | null = null;\n private instanceCache: WebGPUInstanceCache | null = null;\n private picker: WebGPUPicker | null = null;\n private selectionMaskBuffer: WebGPUSelectionMaskBuffer | null = null;\n private timestampProfiler: WebGPUTimestampProfiler | null = null;\n private timestampProfilingEnabled = false;\n private bundleCache: WebGPUBundleCache;\n private bundleActive = true;\n private frameBindGroup: GPUBindGroup | null = null;\n private frameBindGroupKey = '';\n private readonly storageBindGroups = new Map<\n GPUBuffer,\n {\n readonly key: string;\n readonly visibleBuffer?: GPUBuffer;\n readonly group: GPUBindGroup;\n }\n >();\n private uniformBufferGeneration = 0;\n private readonly optimizationWarnings = new Set<string>();\n private identityInstances: GPUBuffer | null = null;\n private zeroSemantics: GPUBuffer | null = null;\n private uniformBuffer: GPUBuffer | null = null;\n private depthTexture: GPUTexture | null = null;\n private uniformCapacity = UNIFORM_BUFFER_INITIAL_DRAWS;\n private viewport: ICEViewport = { x: 0, y: 0, width: 1, height: 1 };\n private dpr = 1;\n private backgroundRgba: readonly [number, number, number, number] = [\n 0.035,\n 0.055,\n 0.09,\n 1,\n ];\n private frameStats = {\n drawCalls: 0,\n renderedMeshes: 0,\n renderedBatches: 0,\n instancingFallbacks: 0,\n gpuUploads: 0,\n gpuEvictions: 0,\n gpuBytes: 0,\n };\n private lastFrame: ICEFrame | null = null;\n private captureRequest: {\n readonly buffer: GPUBuffer;\n readonly bytesPerRow: number;\n } | null = null;\n private readonly renderPlan = new WebGPURenderPlanCache();\n private readonly drawListScratch: PendingDraw[] = [];\n private readonly selected = new Set<string>();\n private readonly drawStorage = new WebGPUDrawStorage();\n private readonly lastVisibilityEntries: Array<{\n readonly entry: ICEVisibilityEntry;\n readonly page: ICEInstanceStoragePage;\n }> = [];\n private readonly mvpScratch = new ICEMatrix4();\n private readonly worldScratch = new ICEMatrix4();\n private readonly profiler = new RendererProfiler();\n private lastFrameProfile: ICEFrameStageProfile | null = null;\n private optimizationFailureReason: string | null = null;\n private storageFailureReason: string | null = null;\n private visibilityFailureReason: string | null = null;\n\n private constructor(\n context: WebGPUDeviceContext,\n pipeline: WebGPURenderPipeline,\n storagePipeline: WebGPURenderPipeline | null,\n gpuDrivenPipeline: WebGPURenderPipeline | null,\n visibilityEncoder: WebGPUVisibilityEncoder | null,\n storageCache: WebGPUInstanceStorage | null,\n acceleration: ICEWebGPUAcceleration,\n forceStoragePath: boolean,\n forceGpuDriven: boolean,\n selectionMaskBuffer: WebGPUSelectionMaskBuffer | null,\n optimizationFailureReason: string | null,\n storageFailureReason: string | null,\n visibilityFailureReason: string | null,\n ) {\n this.adapter = context.adapter;\n this.device = context.device;\n this.format = context.format;\n this.pipeline = pipeline;\n this.storagePipeline = storagePipeline;\n this.gpuDrivenPipeline = gpuDrivenPipeline;\n this.visibilityEncoder = visibilityEncoder;\n this.storageCache = storageCache;\n this.acceleration = acceleration;\n this.forceStoragePath = forceStoragePath;\n this.forceGpuDriven = forceGpuDriven;\n this.bundleCache = new WebGPUBundleCache(\n context.device,\n context.format,\n );\n this.selectionMaskBuffer = selectionMaskBuffer;\n this.optimizationFailureReason = optimizationFailureReason;\n this.storageFailureReason = storageFailureReason;\n this.visibilityFailureReason = visibilityFailureReason;\n this.releaseProbe = context.release;\n this.watchDevice(this.device);\n }\n\n static async create(\n context: WebGPUDeviceContext,\n options: WebGPURendererBackendOptions = {},\n ): Promise<WebGPURendererBackend> {\n let selectionMaskBuffer: WebGPUSelectionMaskBuffer | null = null;\n let optimizationFailureReason: string | null = null;\n let pipeline: WebGPURenderPipeline;\n try {\n selectionMaskBuffer = new WebGPUSelectionMaskBuffer(context.device);\n selectionMaskBuffer.update(new Uint32Array([0]));\n pipeline = await WebGPURenderPipeline.create(\n context.device,\n context.format,\n { selectionMask: true },\n );\n } catch {\n selectionMaskBuffer?.dispose();\n selectionMaskBuffer = null;\n optimizationFailureReason = 'selection-mask';\n pipeline = await WebGPURenderPipeline.create(\n context.device,\n context.format,\n );\n }\n const acceleration = detectWebGPUAcceleration(context.device);\n const forceStoragePath = options.forceStoragePath\n ?? WEBGPU_STORAGE_DEFAULT;\n const forceGpuDriven = options.forceGpuDriven\n ?? WEBGPU_GPU_DRIVEN_DEFAULT;\n let storagePipeline: WebGPURenderPipeline | null = null;\n let gpuDrivenPipeline: WebGPURenderPipeline | null = null;\n let visibilityEncoder: WebGPUVisibilityEncoder | null = null;\n let storageCache: WebGPUInstanceStorage | null = null;\n let storageFailureReason: string | null = null;\n let visibilityFailureReason: string | null = null;\n if (forceStoragePath || forceGpuDriven) {\n if (!acceleration.storage) {\n storageFailureReason = 'limit-too-low';\n } else {\n try {\n storagePipeline = await WebGPURenderPipeline.create(\n context.device,\n context.format,\n {\n selectionMask: true,\n storageInstances: true,\n },\n );\n storageCache = new WebGPUInstanceStorage(context.device);\n } catch {\n storagePipeline = null;\n storageCache?.dispose();\n storageCache = null;\n storageFailureReason = 'pipeline-failed';\n }\n }\n }\n if (forceGpuDriven) {\n if (!storagePipeline || !storageCache) {\n visibilityFailureReason = storageFailureReason ?? 'limit-too-low';\n } else if (!acceleration.visibility) {\n visibilityFailureReason = 'limit-too-low';\n } else {\n try {\n gpuDrivenPipeline = await WebGPURenderPipeline.create(\n context.device,\n context.format,\n {\n selectionMask: true,\n storageInstances: true,\n indirectInstances: true,\n },\n );\n visibilityEncoder = await WebGPUVisibilityEncoder.create(\n context.device,\n );\n } catch {\n gpuDrivenPipeline = null;\n visibilityEncoder?.dispose();\n visibilityEncoder = null;\n visibilityFailureReason = 'pipeline-failed';\n }\n }\n }\n return new WebGPURendererBackend(\n context,\n pipeline,\n storagePipeline,\n gpuDrivenPipeline,\n visibilityEncoder,\n storageCache,\n acceleration,\n forceStoragePath,\n forceGpuDriven,\n selectionMaskBuffer,\n optimizationFailureReason,\n storageFailureReason,\n visibilityFailureReason,\n );\n }\n\n initialize(options: {\n readonly canvas: HTMLCanvasElement;\n readonly onContextLost?: () => void;\n readonly onContextRestored?: () => void;\n readonly onError?: (error: ICEEngineError) => void;\n }): void {\n const context = options.canvas.getContext('webgpu') as\n | GPUCanvasContext\n | null;\n if (!context) {\n throw new ICEEngineError(\n 'ICE3_WEBGPU_UNAVAILABLE',\n 'ICE3_WEBGPU_UNAVAILABLE: WebGPU canvas context is unavailable',\n );\n }\n context.configure({\n device: this.device,\n format: this.format,\n alphaMode: 'premultiplied',\n usage: RENDER_ATTACHMENT_USAGE | 1,\n });\n this.canvas = options.canvas;\n this.context = context;\n this.onContextLost = options.onContextLost;\n this.onContextRestored = options.onContextRestored;\n this.onError = options.onError;\n if (this.optimizationFailureReason) {\n const reason = this.optimizationFailureReason;\n this.optimizationFailureReason = null;\n this.reportOptimizationFailure('selection-mask', reason);\n }\n if (this.storageFailureReason) {\n const reason = this.storageFailureReason;\n this.storageFailureReason = null;\n this.reportOptimizationFailure('storage', reason);\n }\n if (this.visibilityFailureReason) {\n const reason = this.visibilityFailureReason;\n this.visibilityFailureReason = null;\n this.reportOptimizationFailure('visibility', reason);\n }\n this.geometryCache = new WebGPUGeometryCache({ device: this.device });\n this.instanceCache = new WebGPUInstanceCache(this.device);\n this.picker = new WebGPUPicker(this.device, this.format);\n this.timestampProfiler = this.device.features.has('timestamp-query')\n ? new WebGPUTimestampProfiler(this.device)\n : null;\n this.capabilities = {\n backend: 'webgpu',\n maxTextureSize: this.device.limits.maxTextureDimension2D,\n picking: true,\n };\n this.identityInstances = this.device.createBuffer({\n label: 'ice3:identity-instances',\n size: 80,\n usage: VERTEX_USAGE,\n });\n const identity = new Float32Array(20);\n identity.set([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]);\n this.device.queue.writeBuffer(this.identityInstances, 0, identity);\n this.zeroSemantics = this.device.createBuffer({\n label: 'ice3:zero-semantic',\n size: 4,\n usage: VERTEX_USAGE,\n });\n this.device.queue.writeBuffer(\n this.zeroSemantics,\n 0,\n new Uint32Array([0]),\n );\n this.ensureUniformCapacity(UNIFORM_BUFFER_INITIAL_DRAWS);\n }\n\n resize(viewport: ICEViewport, dpr: number): void {\n if (!this.canvas || !this.device) {\n throw new ICEEngineError(\n 'ICE3_ENGINE_NOT_READY',\n 'Renderer is not initialized',\n );\n }\n this.viewport = { ...viewport };\n this.dpr = dpr;\n this.canvas.width = Math.max(1, Math.round(viewport.width * dpr));\n this.canvas.height = Math.max(1, Math.round(viewport.height * dpr));\n this.bundleCache.invalidate();\n this.frameBindGroup = null;\n this.depthTexture?.destroy();\n this.depthTexture = this.device.createTexture({\n label: 'ice3:depth',\n size: [this.canvas.width, this.canvas.height],\n format: 'depth24plus',\n usage: RENDER_ATTACHMENT_USAGE,\n });\n this.picker?.resize(this.canvas.width, this.canvas.height);\n }\n\n setBackgroundColor(color: string): void {\n this.backgroundRgba = colorToRgba(color);\n }\n\n prepareBatchGeometry(geometry: ICEGeometry): void {\n this.requireGeometryCache().pin(geometry);\n }\n\n releaseBatchGeometry(geometry: ICEGeometry): void {\n this.geometryCache?.unpin(geometry);\n }\n\n render(frame: ICEFrame): void {\n this.profiler.begin();\n this.lastFrameProfile = null;\n this.lastFrame = frame;\n const context = this.context;\n const cache = this.requireGeometryCache();\n const instanceCache = this.instanceCache;\n if (\n !context\n || !this.depthTexture\n || !this.identityInstances\n || !this.zeroSemantics\n || !instanceCache\n ) {\n throw new ICEEngineError(\n 'ICE3_ENGINE_NOT_READY',\n 'Renderer is not initialized',\n );\n }\n this.frameStats = {\n drawCalls: 0,\n renderedMeshes: 0,\n renderedBatches: 0,\n instancingFallbacks: 0,\n gpuUploads: 0,\n gpuEvictions: 0,\n gpuBytes: 0,\n };\n cache.beginFrame();\n instanceCache.beginFrame();\n this.storageCache?.beginFrame();\n const plan = this.renderPlan.get(frame.scene);\n const renderables = plan.renderables;\n const instances = plan.instances;\n const batches = plan.batches;\n this.profiler.mark('collect');\n const aspect = frame.viewport.width / Math.max(frame.viewport.height, 1);\n const viewProjection = frame.camera.getViewProjectionMatrix(aspect);\n const world = this.worldScratch;\n const mvp = this.mvpScratch;\n const drawList = this.drawListScratch;\n drawList.length = 0;\n this.lastVisibilityEntries.length = 0;\n this.drawStorage.begin(0);\n const instancedMeshIds = plan.instancedMeshIds;\n const selected = this.selected;\n selected.clear();\n for (const id of frame.selection) selected.add(id);\n const selectionMaskActive = this.selectionMaskBuffer !== null;\n const selectionMaskEnabled = selectionMaskActive\n && frame.selection.length > 0;\n let selectionEntryCount = 0;\n const selectionOverlays: string[] = [];\n const pushDraw = (\n draw: Omit<PendingDraw, 'selectionBase'>,\n matrix: Float32Array,\n selectionIds?: readonly string[],\n ): void => {\n const selectionBase = selectionMaskEnabled\n ? selectionEntryCount\n : 0;\n this.drawStorage.append({\n ...draw,\n matrix,\n selectionBase,\n useSelectionMask: Boolean(draw.useSelectionMask),\n pageBase: draw.storagePage?.firstInstance ?? 0,\n useIndirect: Boolean(draw.visibilityEntry),\n });\n drawList.push({\n ...draw,\n ...(selectionIds ? { selectionIds } : {}),\n selectionBase,\n });\n if (selectionMaskEnabled && selectionIds) {\n selectionEntryCount += selectionIds.length;\n }\n };\n const matrixFor = (source: ArrayLike<number>): Float32Array => {\n mvp.elements.set(viewProjection.elements);\n world.elements.set(source);\n mvp.multiply(world);\n return mvp.elements;\n };\n const pushEdgeDraws = (\n geometry: WebGPUGeometryEntry,\n instance: {\n readonly matrixBuffer: GPUBuffer;\n readonly semanticBuffer: GPUBuffer;\n readonly instanceCount: number;\n readonly storagePage?: ICEInstanceStoragePage;\n } | null,\n matrix: Float32Array,\n color: readonly [number, number, number, number],\n pipeline: GPURenderPipeline,\n selection?: {\n readonly selectionIds: readonly string[];\n readonly useSelectionMask: boolean;\n readonly useSemantic: boolean;\n readonly selectionScope: string;\n },\n ): void => {\n if (!geometry.edgeIndexBuffer || geometry.edgeCount === 0) return;\n if (selection) selectionOverlays.push(selection.selectionScope);\n const clipPixelX = 2 / Math.max(1, this.viewport.width * this.dpr);\n const clipPixelY = 2 / Math.max(1, this.viewport.height * this.dpr);\n for (const [offsetX, offsetY] of EDGE_PIXEL_OFFSETS) {\n pushDraw({\n geometry,\n instanceBuffer: instance?.matrixBuffer ?? this.identityInstances!,\n semanticBuffer: instance?.semanticBuffer ?? this.zeroSemantics!,\n instanceCount: instance?.instanceCount ?? 1,\n color,\n useVertexColor: false,\n useInstancing: instance !== null,\n pipeline,\n clipOffset: [offsetX * clipPixelX, offsetY * clipPixelY],\n edge: true,\n ...(selection ?? {}),\n ...(instance?.storagePage\n ? { storagePage: instance.storagePage }\n : {}),\n ...(instance?.storagePage\n && this.gpuDrivenActive\n && instance.storagePage.instanceCount\n >= WEBGPU_INSTANCE_VISIBILITY_THRESHOLD\n ? {\n visibilityEntry: this.visibilityEncoder!.retain(\n instance.storagePage,\n pipeline === this.gpuDrivenPipeline?.line\n || pipeline === this.gpuDrivenPipeline?.selectionLine\n ? geometry.edgeCount\n : geometry.triangleCount,\n ),\n }\n : {}),\n }, matrix, selection?.selectionIds);\n }\n };\n\n for (const batch of instances) {\n const geometry = cache.retain(batch.geometry);\n if (\n this.storageActive\n && this.storageCache\n && this.storagePipeline\n ) {\n const storage = this.storageCache.retain(batch, batch.geometry);\n for (const page of storage.pages) {\n const useVisibility = (\n this.gpuDrivenActive\n && page.instanceCount >= WEBGPU_INSTANCE_VISIBILITY_THRESHOLD\n );\n const pagePipeline = useVisibility\n ? this.gpuDrivenPipeline!\n : this.storagePipeline;\n const visibilityEntry = useVisibility\n ? this.visibilityEncoder!.retain(page, geometry.triangleCount)\n : undefined;\n if (visibilityEntry) {\n this.lastVisibilityEntries.push({\n entry: visibilityEntry,\n page,\n });\n }\n const instance = {\n matrixBuffer: this.identityInstances,\n semanticBuffer: geometry.semanticBuffer ?? this.zeroSemantics,\n instanceCount: page.instanceCount,\n storagePage: page,\n };\n pushDraw({\n geometry,\n instanceBuffer: instance.matrixBuffer,\n semanticBuffer: instance.semanticBuffer,\n instanceCount: instance.instanceCount,\n color: colorToRgba(batch.material.color),\n useVertexColor: Boolean(batch.geometry.colors),\n useInstancing: true,\n pipeline: pagePipeline.triangle,\n useSelectionMask: selectionMaskEnabled,\n storagePage: page,\n ...(visibilityEntry ? { visibilityEntry } : {}),\n }, viewProjection.elements, batch.semanticIds);\n if (batch.material.edgeColor) {\n pushEdgeDraws(\n geometry,\n instance,\n viewProjection.elements,\n colorToRgba(batch.material.edgeColor),\n pagePipeline.line,\n );\n }\n if (\n selectionMaskEnabled\n && batch.material.edgeColor\n && batch.semanticIds.some((id) => selected.has(id))\n ) {\n pushEdgeDraws(\n geometry,\n instance,\n viewProjection.elements,\n SELECTION_RGBA,\n pagePipeline.selectionLine,\n {\n selectionIds: batch.semanticIds,\n useSelectionMask: true,\n useSemantic: true,\n selectionScope: batch.id,\n },\n );\n }\n }\n } else {\n const instance = instanceCache.retain(batch);\n pushDraw({\n geometry,\n instanceBuffer: instance.matrixBuffer,\n semanticBuffer: instance.semanticBuffer,\n instanceCount: instance.instanceCount,\n color: colorToRgba(batch.material.color),\n useVertexColor: Boolean(batch.geometry.colors),\n useInstancing: true,\n pipeline: this.pipeline.triangle,\n useSelectionMask: selectionMaskEnabled,\n }, viewProjection.elements, batch.semanticIds);\n if (batch.material.edgeColor) {\n pushEdgeDraws(\n geometry,\n instance,\n viewProjection.elements,\n colorToRgba(batch.material.edgeColor),\n this.pipeline.line,\n );\n }\n if (\n selectionMaskEnabled\n && batch.material.edgeColor\n && batch.semanticIds.some((id) => selected.has(id))\n ) {\n pushEdgeDraws(\n geometry,\n instance,\n viewProjection.elements,\n SELECTION_RGBA,\n this.pipeline.selectionLine,\n {\n selectionIds: batch.semanticIds,\n useSelectionMask: true,\n useSemantic: true,\n selectionScope: batch.id,\n },\n );\n } else if (!selectionMaskEnabled) {\n for (\n let semanticIndex = 0;\n semanticIndex < batch.semanticIds.length;\n semanticIndex += 1\n ) {\n if (!selected.has(batch.semanticIds[semanticIndex]!)) continue;\n pushDraw({\n geometry,\n instanceBuffer: instance.matrixBuffer,\n semanticBuffer: instance.semanticBuffer,\n instanceCount: instance.instanceCount,\n color: [...SELECTION_RGBA] as [number, number, number, number],\n useVertexColor: false,\n useInstancing: true,\n pipeline: this.pipeline.selectionTriangle,\n semanticHighlight: semanticIndex,\n useSemantic: true,\n }, viewProjection.elements);\n }\n }\n }\n }\n\n for (const draw of batches) {\n const geometry = cache.retain(draw.batch.geometry);\n const matrix = matrixFor(draw.worldMatrix);\n pushDraw({\n geometry,\n instanceBuffer: this.identityInstances,\n semanticBuffer: geometry.semanticBuffer ?? this.zeroSemantics,\n instanceCount: 1,\n color: colorToRgba(draw.batch.material.color),\n useVertexColor: Boolean(draw.batch.geometry.colors),\n useInstancing: false,\n pipeline: this.pipeline.triangle,\n useSelectionMask: selectionMaskEnabled,\n }, matrix, draw.batch.semanticSelectionIds);\n this.frameStats.renderedBatches += 1;\n if (draw.batch.material.edgeColor) {\n pushEdgeDraws(\n geometry,\n null,\n matrix,\n colorToRgba(draw.batch.material.edgeColor),\n this.pipeline.line,\n );\n }\n if (\n selectionMaskEnabled\n && draw.batch.material.edgeColor\n && draw.batch.semanticSelectionIds.some((id) => selected.has(id))\n ) {\n pushEdgeDraws(\n geometry,\n null,\n matrix,\n SELECTION_RGBA,\n this.pipeline.selectionLine,\n {\n selectionIds: draw.batch.semanticSelectionIds,\n useSelectionMask: true,\n useSemantic: true,\n selectionScope: draw.id,\n },\n );\n } else if (!selectionMaskEnabled) {\n for (\n let semanticIndex = 0;\n semanticIndex < draw.batch.semanticSelectionIds.length;\n semanticIndex += 1\n ) {\n if (!selected.has(draw.batch.semanticSelectionIds[semanticIndex]!)) {\n continue;\n }\n pushDraw({\n geometry,\n instanceBuffer: this.identityInstances,\n semanticBuffer: geometry.semanticBuffer ?? this.zeroSemantics,\n instanceCount: 1,\n color: [...SELECTION_RGBA] as [number, number, number, number],\n useVertexColor: false,\n useInstancing: false,\n pipeline: this.pipeline.selectionTriangle,\n semanticHighlight: semanticIndex,\n useSemantic: true,\n }, matrix);\n }\n }\n }\n\n for (const renderable of renderables) {\n if (instancedMeshIds.has(renderable.id)) continue;\n const geometry = cache.retain(renderable.mesh.geometry);\n const matrix = matrixFor(renderable.worldMatrix);\n pushDraw({\n geometry,\n instanceBuffer: this.identityInstances,\n semanticBuffer: this.zeroSemantics,\n instanceCount: 1,\n color: colorToRgba(renderable.mesh.material.color),\n useVertexColor: Boolean(renderable.mesh.geometry.colors),\n useInstancing: false,\n pipeline: this.pipeline.triangle,\n useSelectionMask: selectionMaskEnabled,\n }, matrix, [renderable.mesh.selectionId]);\n this.frameStats.renderedMeshes += 1;\n if (renderable.mesh.material.edgeColor) {\n pushEdgeDraws(\n geometry,\n null,\n matrix,\n colorToRgba(renderable.mesh.material.edgeColor),\n this.pipeline.line,\n );\n }\n if (selected.has(renderable.mesh.selectionId)) {\n if (!selectionMaskEnabled) {\n pushDraw({\n geometry,\n instanceBuffer: this.identityInstances,\n semanticBuffer: this.zeroSemantics,\n instanceCount: 1,\n color: [...SELECTION_TINT_RGBA] as [\n number,\n number,\n number,\n number,\n ],\n useVertexColor: false,\n useInstancing: false,\n pipeline: this.pipeline.selectionTriangle,\n }, matrix);\n }\n pushEdgeDraws(\n geometry,\n null,\n matrix,\n SELECTION_RGBA,\n this.pipeline.selectionLine,\n selectionMaskEnabled\n ? {\n selectionIds: [renderable.mesh.selectionId],\n useSelectionMask: true,\n useSemantic: true,\n selectionScope: renderable.id,\n }\n : undefined,\n );\n }\n }\n\n const selectionLayout = selectionMaskEnabled\n ? buildSelectionMask(\n drawList.map((draw) => draw.selectionIds ?? []),\n frame.selection,\n )\n : { words: EMPTY_SELECTION, bases: [] };\n this.selectionMaskBuffer?.update(selectionLayout.words);\n this.ensureUniformCapacity(this.drawStorage.drawCount);\n const uniforms = this.drawStorage.uniformData.subarray(\n 0,\n this.drawStorage.drawCount * 64,\n );\n if (uniforms.length > 0) {\n this.device.queue.writeBuffer(\n this.uniformBuffer!,\n 0,\n uniforms as unknown as BufferSource,\n );\n }\n this.profiler.mark('prepareAndUpload');\n const bindGroupKey = [\n this.uniformBufferGeneration,\n this.selectionMaskBuffer?.generation ?? 0,\n this.pipeline.selectionMask ? 1 : 0,\n ].join(':');\n if (!this.frameBindGroup || this.frameBindGroupKey !== bindGroupKey) {\n const bindGroupEntries: GPUBindGroupEntry[] = [{\n binding: 0,\n resource: {\n buffer: this.uniformBuffer!,\n offset: 0,\n size: WEBGPU_UNIFORM_BYTES,\n },\n }];\n if (selectionMaskActive && this.selectionMaskBuffer?.buffer) {\n bindGroupEntries.push({\n binding: 1,\n resource: {\n buffer: this.selectionMaskBuffer.buffer,\n offset: 0,\n size: this.selectionMaskBuffer.buffer.size,\n },\n });\n }\n this.frameBindGroup = this.device.createBindGroup({\n label: 'ice3:frame-uniforms',\n layout: this.pipeline.bindGroupLayout,\n entries: bindGroupEntries,\n });\n this.frameBindGroupKey = bindGroupKey;\n }\n const bindGroup = this.frameBindGroup!;\n const encodeDraws = (\n encoder: GPURenderPassEncoder | GPURenderBundleEncoder,\n ): void => {\n for (let index = 0; index < drawList.length; index += 1) {\n const draw = drawList[index]!;\n encoder.setPipeline(draw.pipeline);\n const drawBindGroup = draw.storagePage\n ? this.storageBindGroupFor(\n draw.storagePage,\n draw.visibilityEntry?.visibleBuffer,\n )\n : bindGroup;\n encoder.setBindGroup(0, drawBindGroup, [\n index * WEBGPU_UNIFORM_STRIDE,\n ]);\n encoder.setVertexBuffer(0, draw.geometry.vertexBuffer);\n if (draw.storagePage) {\n encoder.setVertexBuffer(1, draw.semanticBuffer);\n } else {\n encoder.setVertexBuffer(1, draw.instanceBuffer);\n encoder.setVertexBuffer(2, draw.semanticBuffer);\n }\n encoder.setIndexBuffer(\n draw.edge\n ? draw.geometry.edgeIndexBuffer!\n : draw.geometry.triangleIndexBuffer,\n draw.geometry.indexFormat,\n );\n if (draw.visibilityEntry) {\n encoder.drawIndexedIndirect(\n draw.visibilityEntry.indirectBuffer,\n 0,\n );\n } else {\n encoder.drawIndexed(\n draw.edge ? draw.geometry.edgeCount : draw.geometry.triangleCount,\n draw.instanceCount,\n 0,\n 0,\n draw.storagePage?.firstInstance ?? 0,\n );\n }\n }\n };\n const bundleKey = [\n plan.revision,\n this.drawStorage.generation,\n cache.generation,\n instanceCache.generation,\n this.storageCache?.generation ?? 0,\n this.selectionMaskBuffer?.generation ?? 0,\n this.uniformBufferGeneration,\n this.format,\n selectionOverlays.join('|'),\n ].join(':');\n let bundle: GPURenderBundle | null = null;\n if (this.bundleActive && drawList.length > 0) {\n try {\n bundle = this.bundleCache.get(bundleKey, encodeDraws);\n } catch {\n this.bundleActive = false;\n this.bundleCache.invalidate();\n this.reportOptimizationFailure('bundle', 'resource-failed');\n }\n }\n const targetTexture = context.getCurrentTexture();\n const encoder = this.device.createCommandEncoder();\n if (this.gpuDrivenActive) {\n const encodedVisibility = new Set<ICEVisibilityEntry>();\n for (let index = 0; index < drawList.length; index += 1) {\n const draw = drawList[index]!;\n if (\n !draw.visibilityEntry\n || !draw.storagePage\n || encodedVisibility.has(draw.visibilityEntry)\n ) {\n continue;\n }\n encodedVisibility.add(draw.visibilityEntry);\n this.visibilityEncoder!.encode(\n encoder,\n draw.visibilityEntry,\n draw.storagePage,\n this.uniformBuffer!,\n index * WEBGPU_UNIFORM_STRIDE,\n );\n }\n }\n const timestampProfiler = this.captureRequest || !this.timestampProfilingEnabled\n ? null\n : this.timestampProfiler;\n const timestampQuerySet = timestampProfiler?.querySetFor(frame.frameId);\n const pass = encoder.beginRenderPass({\n colorAttachments: [{\n view: targetTexture.createView(),\n clearValue: {\n r: this.backgroundRgba[0],\n g: this.backgroundRgba[1],\n b: this.backgroundRgba[2],\n a: this.backgroundRgba[3],\n },\n loadOp: 'clear',\n storeOp: 'store',\n }],\n depthStencilAttachment: {\n view: this.depthTexture.createView(),\n depthClearValue: 1,\n depthLoadOp: 'clear',\n depthStoreOp: 'store',\n },\n ...(timestampQuerySet\n ? {\n timestampWrites: {\n querySet: timestampQuerySet,\n beginningOfPassWriteIndex: 0,\n endOfPassWriteIndex: 1,\n },\n }\n : {}),\n });\n if (bundle) {\n try {\n pass.executeBundles([bundle]);\n } catch {\n this.bundleActive = false;\n this.bundleCache.invalidate();\n this.reportOptimizationFailure('bundle', 'runtime-failed');\n encodeDraws(pass);\n }\n } else {\n encodeDraws(pass);\n }\n this.frameStats.drawCalls += drawList.length;\n pass.end();\n if (timestampProfiler) {\n timestampProfiler.resolveFrame(encoder, frame.frameId);\n }\n if (this.captureRequest) {\n encoder.copyTextureToBuffer(\n { texture: targetTexture },\n {\n buffer: this.captureRequest.buffer,\n bytesPerRow: this.captureRequest.bytesPerRow,\n rowsPerImage: this.canvas!.height,\n },\n {\n width: this.canvas!.width,\n height: this.canvas!.height,\n depthOrArrayLayers: 1,\n },\n );\n this.captureRequest = null;\n }\n const commandBuffer = encoder.finish();\n this.profiler.mark('encode');\n this.device.queue.submit([commandBuffer]);\n this.profiler.mark('submit');\n cache.endFrame();\n instanceCache.endFrame();\n this.storageCache?.endFrame();\n this.frameStats.gpuUploads = cache.uploadCount;\n this.frameStats.gpuEvictions = cache.evictionCount;\n this.frameStats.gpuBytes = cache.totalBytes\n + instanceCache.totalBytes\n + (this.storageCache?.totalBytes ?? 0);\n this.lastFrameProfile = this.profiler.end();\n }\n\n enableProfiling(enabled: boolean): void {\n this.profiler.enable(enabled);\n this.lastFrameProfile = null;\n }\n\n get frameProfile(): ICEFrameStageProfile | null {\n return this.lastFrameProfile;\n }\n\n async pick(\n frame: ICEFrame,\n point: ICEScreenPoint,\n ): Promise<string | undefined> {\n if (!this.picker) {\n throw new ICEEngineError(\n 'ICE3_WEBGPU_PICK_UNAVAILABLE',\n 'ICE3_WEBGPU_PICK_UNAVAILABLE: picker is not initialized',\n );\n }\n try {\n return await this.picker.pick(\n { ...frame, point },\n this.requireGeometryCache(),\n collectWebGPUPickIds(frame),\n );\n } catch (error) {\n if (\n error instanceof ICEEngineError\n && error.code === 'ICE3_WEBGPU_PICK_UNAVAILABLE'\n ) {\n throw error;\n }\n throw new ICEEngineError(\n 'ICE3_WEBGPU_PICK_UNAVAILABLE',\n 'ICE3_WEBGPU_PICK_UNAVAILABLE: exact pick failed',\n { cause: error },\n );\n }\n }\n\n dispose(): void {\n this.disposing = true;\n this.bundleCache.dispose();\n this.geometryCache?.dispose();\n this.renderPlan.dispose();\n this.picker?.dispose();\n this.selectionMaskBuffer?.dispose();\n this.storageCache?.dispose();\n this.visibilityEncoder?.dispose();\n this.timestampProfiler?.dispose();\n this.instanceCache?.dispose();\n this.identityInstances?.destroy();\n this.zeroSemantics?.destroy();\n this.uniformBuffer?.destroy();\n this.depthTexture?.destroy();\n this.context?.unconfigure();\n this.geometryCache = null;\n this.picker = null;\n this.selectionMaskBuffer = null;\n this.storageCache = null;\n this.visibilityEncoder = null;\n this.gpuDrivenPipeline = null;\n this.timestampProfiler = null;\n this.instanceCache = null;\n this.identityInstances = null;\n this.zeroSemantics = null;\n this.uniformBuffer = null;\n this.depthTexture = null;\n this.context = null;\n this.canvas = null;\n this.frameBindGroup = null;\n this.device.destroy();\n this.releaseProbe?.();\n this.onContextLost = undefined;\n this.onContextRestored = undefined;\n this.onError = undefined;\n }\n\n async capture(): Promise<Blob> {\n if (!this.context || !this.canvas || !this.lastFrame) {\n throw new ICEEngineError(\n 'ICE3_ENGINE_NOT_READY',\n 'Renderer has no frame to capture',\n );\n }\n const width = this.canvas.width;\n const height = this.canvas.height;\n const bytesPerRow = Math.ceil(width * 4 / 256) * 256;\n const readback = this.device.createBuffer({\n label: 'ice3:capture-readback',\n size: bytesPerRow * height,\n usage: 1 | 8,\n });\n this.captureRequest = { buffer: readback, bytesPerRow };\n try {\n this.render(this.lastFrame);\n } catch (error) {\n this.captureRequest = null;\n readback.destroy();\n throw error;\n }\n let bytes: Uint8Array;\n try {\n await readback.mapAsync(1);\n bytes = new Uint8Array(readback.getMappedRange()).slice();\n } finally {\n readback.unmap();\n readback.destroy();\n }\n for (let offset = 0; offset < bytes.length; offset += 4) {\n if (this.format === 'bgra8unorm' || this.format === 'bgra8unorm-srgb') {\n [bytes[offset], bytes[offset + 2]] = [\n bytes[offset + 2]!,\n bytes[offset]!,\n ];\n }\n }\n const imageBytes = new Uint8Array(width * height * 4);\n const rowBytes = width * 4;\n for (let row = 0; row < height; row += 1) {\n imageBytes.set(\n bytes.subarray(row * bytesPerRow, row * bytesPerRow + rowBytes),\n row * rowBytes,\n );\n }\n return pixelsToPng(imageBytes, width, height);\n }\n\n async finish(): Promise<void> {\n await this.device.queue.onSubmittedWorkDone?.();\n }\n\n async drainGpuTimings(): Promise<readonly number[]> {\n return this.timestampProfiler?.drain() ?? [];\n }\n\n enableTimestampProfiling(enabled: boolean): void {\n this.timestampProfilingEnabled = enabled && this.timestampProfiler !== null;\n }\n\n get timestampProfilingAvailable(): boolean {\n return this.timestampProfiler !== null;\n }\n\n get timestampProfilingUnavailableReason(): string | undefined {\n return this.timestampProfiler\n ? this.timestampProfiler.unavailableReason\n : 'timestamp-query unavailable';\n }\n\n get stats(): Readonly<typeof this.frameStats> {\n return this.frameStats;\n }\n\n async readVisibilityStats(): Promise<Readonly<{\n visibleInstances: number;\n culledInstances: number;\n dispatchCount: number;\n }> | undefined> {\n if (!this.visibilityEncoder) {\n return undefined;\n }\n let visibleInstances = 0;\n let culledInstances = 0;\n let dispatchCount = 0;\n const seen = new Set<ICEVisibilityEntry>();\n for (const item of this.lastVisibilityEntries) {\n if (seen.has(item.entry)) continue;\n seen.add(item.entry);\n const result = await this.visibilityEncoder.readStats(\n item.entry,\n item.page,\n );\n visibleInstances += result.visibleInstances;\n culledInstances += result.culledInstances;\n dispatchCount += result.dispatchCount;\n }\n return { visibleInstances, culledInstances, dispatchCount };\n }\n\n get storageActive(): boolean {\n return (\n (this.forceStoragePath || this.forceGpuDriven)\n && this.storagePipeline !== null\n && this.storageCache !== null\n );\n }\n\n private get gpuDrivenActive(): boolean {\n return (\n this.forceGpuDriven\n && this.gpuDrivenPipeline !== null\n && this.visibilityEncoder !== null\n && this.storageCache !== null\n );\n }\n\n get optimizationStats(): ICEWebGPUOptimizationStats {\n return {\n tier: this.gpuDrivenActive\n ? 'gpu-driven'\n : this.storageActive\n ? 'storage'\n : 'baseline',\n selectionMaskActive: this.selectionMaskBuffer !== null,\n bundleActive: this.bundleActive,\n storageActive: this.storageActive,\n visibilityActive: this.gpuDrivenActive,\n instanceUploadBytes: this.storageCache?.totalUploadBytes ?? 0,\n bundleRecreations: this.bundleCache.bundleRecreations,\n ...(this.timestampProfilingUnavailableReason\n ? {\n timestampUnavailableReason:\n this.timestampProfilingUnavailableReason,\n }\n : {}),\n };\n }\n\n private storageBindGroupFor(\n page: ICEInstanceStoragePage,\n visibleBuffer?: GPUBuffer,\n ): GPUBindGroup {\n const key = [\n this.uniformBufferGeneration,\n this.selectionMaskBuffer?.generation ?? 0,\n ].join(':');\n const cached = this.storageBindGroups.get(page.buffer);\n if (\n cached?.key === key\n && cached.visibleBuffer === visibleBuffer\n ) {\n return cached.group;\n }\n const entries: GPUBindGroupEntry[] = [{\n binding: 0,\n resource: {\n buffer: this.uniformBuffer!,\n offset: 0,\n size: WEBGPU_UNIFORM_BYTES,\n },\n }];\n if (this.selectionMaskBuffer?.buffer) {\n entries.push({\n binding: 1,\n resource: {\n buffer: this.selectionMaskBuffer.buffer,\n offset: 0,\n size: this.selectionMaskBuffer.buffer.size,\n },\n });\n }\n entries.push({\n binding: 2,\n resource: {\n buffer: page.buffer,\n offset: 0,\n size: page.buffer.size,\n },\n });\n if (visibleBuffer) {\n entries.push({\n binding: 3,\n resource: {\n buffer: visibleBuffer,\n offset: 0,\n size: visibleBuffer.size,\n },\n });\n }\n const group = this.device.createBindGroup({\n label: 'ice3:storage-instance-pipeline',\n layout: visibleBuffer\n ? this.gpuDrivenPipeline!.bindGroupLayout\n : this.storagePipeline!.bindGroupLayout,\n entries,\n });\n this.storageBindGroups.set(page.buffer, {\n key,\n ...(visibleBuffer ? { visibleBuffer } : {}),\n group,\n });\n return group;\n }\n\n private reportOptimizationFailure(\n layer: string,\n reason: string,\n ): void {\n const key = `${layer}/${reason}`;\n if (this.optimizationWarnings.has(key)) return;\n this.optimizationWarnings.add(key);\n this.onError?.(new ICEEngineError(\n 'ICE3_RENDERER_OPTIMIZATION_UNAVAILABLE',\n `ICE3_RENDERER_OPTIMIZATION_UNAVAILABLE: ${key}`,\n { layer, reason },\n ));\n }\n\n private requireGeometryCache(): WebGPUGeometryCache {\n if (!this.geometryCache) {\n throw new ICEEngineError(\n 'ICE3_ENGINE_NOT_READY',\n 'Renderer is not initialized',\n );\n }\n return this.geometryCache;\n }\n\n private ensureUniformCapacity(draws: number): void {\n if (draws <= this.uniformCapacity && this.uniformBuffer) return;\n let capacity = Math.max(UNIFORM_BUFFER_INITIAL_DRAWS, drawCountPowerOfTwo(draws));\n this.uniformBuffer?.destroy();\n this.uniformBuffer = this.device.createBuffer({\n label: 'ice3:frame-uniforms',\n size: capacity * WEBGPU_UNIFORM_STRIDE,\n usage: UNIFORM_USAGE,\n });\n this.uniformCapacity = capacity;\n this.uniformBufferGeneration += 1;\n this.frameBindGroup = null;\n this.bundleCache.invalidate();\n }\n\n private watchDevice(device: GPUDevice): void {\n void device.lost.then((info) => {\n if (\n this.disposing\n || device !== this.device\n || info.reason === 'destroyed'\n ) {\n return;\n }\n void this.recoverDevice();\n });\n }\n\n private async recoverDevice(): Promise<void> {\n this.releaseProbe?.();\n this.onContextLost?.();\n this.geometryCache?.dispose();\n this.bundleCache.dispose();\n this.instanceCache?.dispose();\n this.picker?.dispose();\n this.selectionMaskBuffer?.dispose();\n this.storageCache?.dispose();\n this.timestampProfiler?.dispose();\n this.identityInstances?.destroy();\n this.zeroSemantics?.destroy();\n this.uniformBuffer?.destroy();\n this.depthTexture?.destroy();\n this.geometryCache = null;\n this.instanceCache = null;\n this.selectionMaskBuffer = null;\n this.storageCache = null;\n this.picker = null;\n this.timestampProfiler = null;\n this.identityInstances = null;\n this.zeroSemantics = null;\n this.uniformBuffer = null;\n this.depthTexture = null;\n this.uniformCapacity = 0;\n this.frameBindGroup = null;\n this.bundleActive = true;\n this.optimizationWarnings.clear();\n this.storagePipeline = null;\n this.storageBindGroups.clear();\n this.renderPlan.invalidate();\n try {\n const features: GPUFeatureName[] = this.device.features.has(\n 'timestamp-query',\n )\n ? ['timestamp-query']\n : [];\n const device = await this.adapter.requestDevice({\n ...(features.length > 0 ? { requiredFeatures: features } : {}),\n });\n let selectionMaskBuffer: WebGPUSelectionMaskBuffer | null = null;\n let pipeline: WebGPURenderPipeline;\n try {\n selectionMaskBuffer = new WebGPUSelectionMaskBuffer(device);\n selectionMaskBuffer.update(new Uint32Array([0]));\n pipeline = await WebGPURenderPipeline.create(\n device,\n this.format,\n { selectionMask: true },\n );\n } catch {\n selectionMaskBuffer?.dispose();\n selectionMaskBuffer = null;\n pipeline = await WebGPURenderPipeline.create(device, this.format);\n }\n if (this.disposing) {\n selectionMaskBuffer?.dispose();\n device.destroy();\n return;\n }\n this.device = device;\n this.pipeline = pipeline;\n this.selectionMaskBuffer = selectionMaskBuffer;\n this.bundleCache = new WebGPUBundleCache(device, this.format);\n this.watchDevice(device);\n if (this.canvas) {\n this.initialize({\n canvas: this.canvas,\n ...(this.onContextLost\n ? { onContextLost: this.onContextLost }\n : {}),\n ...(this.onContextRestored\n ? { onContextRestored: this.onContextRestored }\n : {}),\n });\n this.resize(this.viewport, this.dpr);\n }\n this.onContextRestored?.();\n } catch (error) {\n if (this.disposing) return;\n this.onError?.(new ICEEngineError(\n 'ICE3_WEBGPU_DEVICE_LOST',\n `ICE3_WEBGPU_DEVICE_LOST: ${\n error instanceof Error ? error.message : String(error)\n }`,\n { cause: error },\n ));\n }\n }\n}\n\nfunction drawCountPowerOfTwo(value: number): number {\n let result = 1;\n while (result < Math.max(1, value)) result *= 2;\n return result;\n}\n\nasync function pixelsToPng(\n bytes: Uint8Array,\n width: number,\n height: number,\n): Promise<Blob> {\n const pixels = new Uint8ClampedArray(\n bytes.buffer,\n bytes.byteOffset,\n width * height * 4,\n ).slice();\n if (typeof OffscreenCanvas !== 'undefined') {\n const canvas = new OffscreenCanvas(width, height);\n const context = canvas.getContext('2d');\n if (!context) throw new Error('ICE3_GPU_RESOURCE_FAILED: 2D context');\n const image = typeof ImageData === 'undefined'\n ? { data: pixels, width, height } as ImageData\n : new ImageData(pixels, width, height);\n context.putImageData(\n image,\n 0,\n 0,\n );\n return canvas.convertToBlob({ type: 'image/png' });\n }\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n const context = canvas.getContext('2d');\n if (!context) throw new Error('ICE3_GPU_RESOURCE_FAILED: 2D context');\n const image = typeof ImageData === 'undefined'\n ? { data: pixels, width, height } as ImageData\n : new ImageData(pixels, width, height);\n context.putImageData(\n image,\n 0,\n 0,\n );\n return new Promise<Blob>((resolve, reject) => {\n canvas.toBlob((blob) => {\n if (blob) resolve(blob);\n else reject(new Error('ICE3_GPU_RESOURCE_FAILED: PNG encoding failed'));\n }, 'image/png');\n });\n}\n\ntype PendingDraw = {\n readonly pipeline: GPURenderPipeline;\n readonly geometry: WebGPUGeometryEntry;\n readonly instanceBuffer: GPUBuffer;\n readonly semanticBuffer: GPUBuffer;\n readonly instanceCount: number;\n readonly selectionBase: number;\n readonly color: readonly [number, number, number, number];\n readonly useVertexColor: boolean;\n readonly useInstancing: boolean;\n readonly semanticHighlight?: number;\n readonly useSemantic?: boolean;\n readonly selectionIds?: readonly string[];\n readonly useSelectionMask?: boolean;\n readonly storagePage?: ICEInstanceStoragePage;\n readonly visibilityEntry?: ICEVisibilityEntry;\n readonly clipOffset?: readonly [number, number];\n readonly edge?: boolean;\n};\n", "import { ICEEngineError } from '@ice3/core';\nimport { probeWebGPU } from './WebGPUProbe.js';\nimport { WebGPURendererBackend } from './WebGPURendererBackend.js';\nimport { WebGL2RendererBackend } from './WebGL2RendererBackend.js';\nimport type {\n ICE3RendererPreference,\n ICE3RendererSelection,\n ICERendererBackend,\n} from './types.js';\n\nexport type ICERendererFactories = Readonly<{\n createWebGPU: () => Promise<ICERendererBackend>;\n createWebGL2: () => ICERendererBackend;\n}>;\n\nexport type ICERendererBackendSelection = Readonly<{\n backend: ICERendererBackend;\n selection: ICE3RendererSelection;\n}>;\n\nexport async function selectRendererBackend(\n preference: ICE3RendererPreference,\n factories: ICERendererFactories,\n): Promise<ICERendererBackendSelection> {\n const startedAt = performance.now();\n if (preference === 'auto' || preference === 'webgl2') {\n const backend = factories.createWebGL2();\n return {\n backend,\n selection: {\n requested: preference,\n selected: backend.capabilities.backend,\n fallback: false,\n experimental: false,\n probeDurationMs: performance.now() - startedAt,\n },\n };\n }\n\n try {\n const backend = await factories.createWebGPU();\n return {\n backend,\n selection: {\n requested: preference,\n selected: backend.capabilities.backend,\n fallback: false,\n experimental: true,\n probeDurationMs: performance.now() - startedAt,\n },\n };\n } catch (error) {\n if (preference === 'webgpu') {\n if (\n error instanceof ICEEngineError\n && error.code === 'ICE3_WEBGPU_UNAVAILABLE'\n ) {\n throw error;\n }\n throw new ICEEngineError(\n 'ICE3_WEBGPU_UNAVAILABLE',\n `ICE3_WEBGPU_UNAVAILABLE: ${\n error instanceof Error ? error.message : String(error)\n }`,\n { reason: failureReason(error) },\n );\n }\n const backend = factories.createWebGL2();\n const reason = failureReason(error);\n return {\n backend,\n selection: {\n requested: preference,\n selected: backend.capabilities.backend,\n fallback: true,\n experimental: false,\n probeDurationMs: performance.now() - startedAt,\n ...(reason ? { fallbackReason: reason } : {}),\n },\n };\n }\n}\n\nexport async function selectDefaultRendererBackend(\n preference: ICE3RendererPreference,\n): Promise<ICERendererBackendSelection> {\n return selectRendererBackend(preference, {\n createWebGPU: createDefaultWebGPU,\n createWebGL2: () => new WebGL2RendererBackend(),\n });\n}\n\nasync function createDefaultWebGPU(): Promise<ICERendererBackend> {\n const result = await probeWebGPU();\n if (!result.supported) {\n throw new ICEEngineError(\n 'ICE3_WEBGPU_UNAVAILABLE',\n `ICE3_WEBGPU_UNAVAILABLE: ${result.reason}${\n result.detail ? `: ${result.detail}` : ''\n }`,\n { reason: result.reason },\n );\n }\n try {\n return await WebGPURendererBackend.create(result);\n } catch (error) {\n result.device.destroy();\n result.release();\n throw new ICEEngineError(\n 'ICE3_WEBGPU_UNAVAILABLE',\n `ICE3_WEBGPU_UNAVAILABLE: ${\n error instanceof Error ? error.message : String(error)\n }`,\n { reason: 'pipeline-failed' },\n );\n }\n}\n\nfunction failureReason(\n error: unknown,\n): ICE3RendererSelection['fallbackReason'] {\n const details = (\n error as { readonly details?: Readonly<Record<string, unknown>> }\n )?.details;\n const reason = details?.reason;\n return typeof reason === 'string'\n ? reason as ICE3RendererSelection['fallbackReason']\n : undefined;\n}\n", "import type { ICEGeometryBounds } from '@ice3/core';\n\nexport interface ICEBatchUploadBuffer {\n readonly id: string;\n readonly materialKey: string;\n readonly positions: Float32Array;\n readonly indices: Uint32Array;\n readonly semanticIndices: Uint32Array;\n readonly semanticIds: readonly string[];\n readonly semanticNodeIds: readonly string[];\n readonly semanticSelectionIds: readonly string[];\n readonly bounds: ICEGeometryBounds;\n readonly triangleCount: number;\n readonly byteLength: number;\n}\n\nexport interface ICEBatchUploadOptions {\n readonly generation: number;\n readonly bytesPerFrame: number;\n readonly onUploaded: (generation: number) => void;\n readonly onFailed: (generation: number, error: unknown) => void;\n readonly upload?: (buffer: ICEBatchUploadBuffer) => unknown;\n readonly release?: (resource: unknown) => void;\n readonly onActivate?: (\n generation: number,\n resources: readonly unknown[],\n ) => void;\n readonly schedule?: (callback: FrameRequestCallback) => number;\n readonly cancelSchedule?: (id: number) => void;\n readonly isCurrent?: () => boolean;\n}\n\nexport interface ICEBatchGenerationHandle {\n cancel(): void;\n}\n\nexport function queueBatchGeneration(\n buffers: readonly ICEBatchUploadBuffer[],\n options: ICEBatchUploadOptions,\n): ICEBatchGenerationHandle {\n if (\n !Number.isInteger(options.generation)\n || options.generation < 0\n || !Number.isInteger(options.bytesPerFrame)\n || options.bytesPerFrame < 1\n || buffers.some((buffer) => (\n !Number.isInteger(buffer.byteLength)\n || buffer.byteLength < 1\n || buffer.byteLength > options.bytesPerFrame\n ))\n ) {\n fail(options, new Error(\n 'ICE3_RENDER_BATCH_UPLOAD_INVALID: upload options are invalid',\n ));\n return { cancel: () => undefined };\n }\n const schedule = options.schedule ?? globalThis.requestAnimationFrame;\n const cancelSchedule =\n options.cancelSchedule ?? globalThis.cancelAnimationFrame;\n const upload = options.upload ?? ((buffer) => buffer);\n const release = options.release ?? (() => undefined);\n const resources: unknown[] = [];\n let next = 0;\n let frame: number | undefined;\n let settled = false;\n\n const cleanup = (): void => {\n if (frame !== undefined) {\n cancelSchedule(frame);\n frame = undefined;\n }\n for (const resource of resources.splice(0)) release(resource);\n };\n const current = (): boolean => options.isCurrent?.() ?? true;\n const failNow = (error: unknown): void => {\n if (settled) return;\n settled = true;\n cleanup();\n options.onFailed(options.generation, error);\n };\n const pump = (): void => {\n frame = undefined;\n if (settled) return;\n if (!current()) {\n settled = true;\n cleanup();\n return;\n }\n let bytes = 0;\n try {\n while (next < buffers.length) {\n const buffer = buffers[next]!;\n if (resources.length > 0 && bytes + buffer.byteLength > options.bytesPerFrame) {\n break;\n }\n bytes += buffer.byteLength;\n next += 1;\n resources.push(upload(buffer));\n }\n } catch (error) {\n failNow(error);\n return;\n }\n if (next >= buffers.length) {\n if (!current()) {\n settled = true;\n cleanup();\n return;\n }\n try {\n options.onActivate?.(options.generation, resources);\n } catch (error) {\n failNow(error);\n return;\n }\n settled = true;\n options.onUploaded(options.generation);\n return;\n }\n frame = schedule(pump);\n };\n frame = schedule(pump);\n return {\n cancel: () => {\n if (settled) return;\n settled = true;\n cleanup();\n },\n };\n}\n\nfunction fail(options: ICEBatchUploadOptions, error: unknown): void {\n options.onFailed(options.generation, error);\n}\n", "import { ICEEventDispatcher } from '@ice3/core';\nimport type { ICEViewport } from '@ice3/renderer';\nimport { ICELabel } from './ICELabel.js';\n\nexport interface ICE2DLayerOptions {\n readonly id: string;\n readonly order?: number;\n readonly visible?: boolean;\n readonly interactive?: boolean;\n readonly passThrough?: boolean;\n}\n\nexport class ICE2DLayer extends ICEEventDispatcher {\n readonly id: string;\n readonly order: number;\n visible: boolean;\n interactive: boolean;\n passThrough: boolean;\n protected readonly labels: ICELabel[] = [];\n\n constructor(options: ICE2DLayerOptions) {\n super();\n this.id = options.id;\n this.order = options.order ?? 0;\n this.visible = options.visible ?? true;\n this.interactive = options.interactive ?? true;\n this.passThrough = options.passThrough ?? true;\n }\n\n addChild(child: ICELabel): this {\n if (this.labels.some((label) => label.id === child.id)) {\n throw new Error(`Duplicate ICE label ID: ${child.id}`);\n }\n this.labels.push(child);\n return this;\n }\n\n removeChild(child: ICELabel): this {\n const index = this.labels.indexOf(child);\n if (index >= 0) {\n this.labels.splice(index, 1);\n }\n return this;\n }\n\n hitTest(point: { readonly x: number; readonly y: number }): ICELabel | undefined {\n if (!this.visible || !this.interactive) {\n return undefined;\n }\n for (let index = this.labels.length - 1; index >= 0; index -= 1) {\n const label = this.labels[index]!;\n if (label.interactive && label.containsPoint(point)) {\n return label;\n }\n }\n return undefined;\n }\n\n getLabels(): readonly ICELabel[] {\n return this.labels;\n }\n\n paint(context: CanvasRenderingContext2D, _viewport: ICEViewport): void {\n if (!this.visible) {\n return;\n }\n context.save();\n context.font = '14px sans-serif';\n context.textBaseline = 'top';\n for (const label of this.labels) {\n if (!label.visible) {\n continue;\n }\n const rect = label.measure(context);\n context.fillStyle = label.background;\n context.fillRect(rect.x, rect.y, rect.width, rect.height);\n context.fillStyle = label.color;\n context.fillText(label.text, rect.x + label.padding, rect.y + label.padding);\n }\n context.restore();\n }\n\n dispose(): void {\n this.labels.length = 0;\n this.removeAllListeners();\n }\n}\n", "import type { ICE2DLayer } from './ICE2DLayer.js';\nimport type { ICELabel } from './ICELabel.js';\n\nexport type ICELayerHit = {\n readonly layer: ICE2DLayer;\n readonly label: ICELabel;\n};\n\nexport class ICE2DLayerRouter {\n constructor(private readonly getLayers: () => readonly ICE2DLayer[]) {}\n\n hitTest(point: { readonly x: number; readonly y: number }): ICELayerHit | undefined {\n const layers = this.topDown();\n for (const layer of layers) {\n const label = layer.hitTest(point);\n if (label) {\n return { layer, label };\n }\n }\n return undefined;\n }\n\n shouldPassThrough(point: { readonly x: number; readonly y: number }): boolean {\n for (const layer of this.topDown()) {\n if (!layer.visible) {\n continue;\n }\n if (layer.hitTest(point)) {\n return false;\n }\n if (!layer.passThrough) {\n return false;\n }\n }\n return true;\n }\n\n private topDown(): readonly ICE2DLayer[] {\n return this.getLayers()\n .map((layer, index) => ({ layer, index }))\n .sort((left, right) =>\n right.layer.order - left.layer.order || right.index - left.index,\n )\n .map((entry) => entry.layer);\n }\n}\n", "import { ICEScene } from '@ice3/core';\nimport type { ICEProjectedPoint } from '../ICEProjection.js';\nimport { ICE2DLayer, type ICE2DLayerOptions } from './ICE2DLayer.js';\n\nexport type ICEAnchorProjector = (anchorId: string) => ICEProjectedPoint | undefined;\n\nexport class ICEWorldLayer extends ICE2DLayer {\n constructor(options: ICE2DLayerOptions) {\n super(options);\n }\n\n prepare(_scene: ICEScene, project: ICEAnchorProjector): void {\n for (const label of this.labels) {\n if (!label.anchorId) {\n label.visible = false;\n continue;\n }\n const anchor = project(label.anchorId);\n if (!anchor) {\n label.visible = false;\n continue;\n }\n label.setWorldAnchor([anchor.x, anchor.y], anchor.visible);\n }\n }\n}\n", "import { ICE2DLayer, type ICE2DLayerOptions } from './ICE2DLayer.js';\n\nexport class ICEScreenLayer extends ICE2DLayer {\n constructor(options: ICE2DLayerOptions) {\n super(options);\n }\n}\n", "import { ICEEventDispatcher } from '@ice3/core';\n\nexport interface ICELabelOptions {\n readonly id: string;\n readonly text: string;\n readonly anchorId?: string;\n readonly screenPosition?: readonly [number, number];\n readonly color?: string;\n readonly background?: string;\n readonly padding?: number;\n readonly interactive?: boolean;\n}\n\nexport interface ICELabelRect {\n readonly x: number;\n readonly y: number;\n readonly width: number;\n readonly height: number;\n}\n\nexport class ICELabel extends ICEEventDispatcher {\n readonly id: string;\n readonly anchorId: string | undefined;\n readonly color: string;\n readonly background: string;\n readonly padding: number;\n readonly interactive: boolean;\n visible = true;\n\n private currentText: string;\n private currentScreenPosition: readonly [number, number] | undefined;\n private rect: ICELabelRect;\n\n constructor(options: ICELabelOptions) {\n super();\n this.id = options.id;\n this.currentText = options.text;\n this.anchorId = options.anchorId;\n this.currentScreenPosition = options.screenPosition\n ? [options.screenPosition[0], options.screenPosition[1]]\n : undefined;\n this.color = options.color ?? '#f8fafc';\n this.background = options.background ?? 'rgba(9, 18, 34, 0.88)';\n this.padding = options.padding ?? 6;\n this.interactive = options.interactive ?? false;\n const width = Math.max(28, [...this.text].length * 14) + this.padding * 2;\n const height = 20 + this.padding * 2;\n const [x, y] = this.currentScreenPosition ?? [0, 0];\n this.rect = { x, y, width, height };\n }\n\n get text(): string {\n return this.currentText;\n }\n\n get screenPosition(): readonly [number, number] | undefined {\n return this.currentScreenPosition\n ? [this.currentScreenPosition[0], this.currentScreenPosition[1]]\n : undefined;\n }\n\n setText(text: string): this {\n this.currentText = text;\n this.visible = text.length > 0;\n const width = Math.max(28, [...text].length * 14) + this.padding * 2;\n const height = 20 + this.padding * 2;\n this.rect = { ...this.rect, width, height };\n return this;\n }\n\n setScreenPosition(position: readonly [number, number]): this {\n this.currentScreenPosition = [position[0], position[1]];\n const width = this.rect.width;\n const height = this.rect.height;\n this.rect = { x: position[0], y: position[1], width, height };\n return this;\n }\n\n setWorldAnchor(position: readonly [number, number], visible = true): this {\n this.visible = visible;\n const width = this.rect.width;\n const height = this.rect.height;\n this.rect = {\n x: position[0] - width / 2,\n y: position[1] - height / 2,\n width,\n height,\n };\n return this;\n }\n\n measure(context: CanvasRenderingContext2D): ICELabelRect {\n const width = Math.max(28, context.measureText(this.text).width)\n + this.padding * 2;\n const height = 20 + this.padding * 2;\n if (this.currentScreenPosition) {\n this.rect = {\n x: this.currentScreenPosition[0],\n y: this.currentScreenPosition[1],\n width,\n height,\n };\n } else {\n const centerX = this.rect.x + this.rect.width / 2;\n const centerY = this.rect.y + this.rect.height / 2;\n this.rect = {\n x: centerX - width / 2,\n y: centerY - height / 2,\n width,\n height,\n };\n }\n return this.getRect();\n }\n\n getRect(): ICELabelRect {\n return { ...this.rect };\n }\n\n containsPoint(point: { readonly x: number; readonly y: number }): boolean {\n return (\n this.visible\n && point.x >= this.rect.x\n && point.x <= this.rect.x + this.rect.width\n && point.y >= this.rect.y\n && point.y <= this.rect.y + this.rect.height\n );\n }\n}\n", "import type { ICEViewport } from '@ice3/renderer';\nimport type { ICE2DLayer } from './ICE2DLayer.js';\n\nexport class ICE2DCanvasPainter {\n paint(\n canvas: HTMLCanvasElement,\n layers: readonly ICE2DLayer[],\n viewport: ICEViewport,\n dpr: number,\n ): void {\n const context = canvas.getContext('2d');\n if (!context) {\n return;\n }\n const width = Math.max(1, Math.round(viewport.width * dpr));\n const height = Math.max(1, Math.round(viewport.height * dpr));\n if (canvas.width !== width) {\n canvas.width = width;\n }\n if (canvas.height !== height) {\n canvas.height = height;\n }\n context.setTransform(dpr, 0, 0, dpr, 0, 0);\n context.clearRect(0, 0, viewport.width, viewport.height);\n\n const ordered = [...layers].sort((left, right) => left.order - right.order);\n for (const layer of ordered) {\n layer.paint(context, viewport);\n }\n }\n}\n", "export type ICEInputTarget =\n | { readonly kind: 'layer'; readonly layerId: string; readonly labelId: string }\n | { readonly kind: 'scene'; readonly nodeId?: string };\n\nexport type ICEInputEvent = {\n readonly type: 'pointerdown' | 'pointermove' | 'pointerup' | 'pointercancel' | 'wheel';\n readonly point: Readonly<{ x: number; y: number }>;\n readonly pointerId?: number;\n readonly deltaY?: number;\n readonly deltaMode?: number;\n};\n\nexport type ICEKeyboardInputEvent = {\n readonly type: 'keydown' | 'keyup';\n readonly code: string;\n readonly key: string;\n readonly repeat: boolean;\n};\n\nexport interface ICEInputRouterOptions {\n readonly hitTestLayer: (point: { x: number; y: number }) => ICEInputTarget | undefined;\n readonly pickScene: (point: { x: number; y: number }) => ICEInputTarget | undefined;\n readonly dispatch?: (target: ICEInputTarget, event: ICEInputEvent) => void;\n}\n\nexport class ICEInputRouter {\n private readonly captured = new Map<number, ICEInputTarget>();\n\n constructor(private readonly options: ICEInputRouterOptions) {}\n\n route(point: { x: number; y: number }): ICEInputTarget | undefined {\n return this.options.hitTestLayer(point) ?? this.options.pickScene(point);\n }\n\n pointerDown(\n point: { x: number; y: number },\n pointerId: number,\n ): ICEInputTarget | undefined {\n const target = this.route(point);\n if (target) {\n this.captured.set(pointerId, target);\n this.options.dispatch?.(target, {\n type: 'pointerdown',\n point: { ...point },\n pointerId,\n });\n }\n return target;\n }\n\n pointerMove(\n point: { x: number; y: number },\n pointerId: number,\n ): ICEInputTarget | undefined {\n const target = this.captured.get(pointerId) ?? this.route(point);\n if (target) {\n this.options.dispatch?.(target, {\n type: 'pointermove',\n point: { ...point },\n pointerId,\n });\n }\n return target;\n }\n\n pointerUp(\n point: { x: number; y: number },\n pointerId: number,\n ): ICEInputTarget | undefined {\n const target = this.captured.get(pointerId) ?? this.route(point);\n if (target) {\n this.options.dispatch?.(target, {\n type: 'pointerup',\n point: { ...point },\n pointerId,\n });\n }\n this.captured.delete(pointerId);\n return target;\n }\n\n pointerCancel(pointerId: number): void {\n const target = this.captured.get(pointerId);\n if (target) {\n this.options.dispatch?.(target, {\n type: 'pointercancel',\n point: { x: 0, y: 0 },\n pointerId,\n });\n }\n this.captured.delete(pointerId);\n }\n\n wheel(\n deltaY: number,\n point: { x: number; y: number },\n deltaMode = 0,\n ): ICEInputTarget | undefined {\n const target = this.route(point);\n if (target) {\n this.options.dispatch?.(target, {\n type: 'wheel',\n point: { ...point },\n deltaY,\n deltaMode,\n });\n }\n return target;\n }\n}\n", "import {\n ICEMesh,\n ICEPerspectiveCamera,\n ICEScene,\n type ICENode,\n} from '@ice3/core';\nimport type { ICEViewport } from '@ice3/renderer';\n\nexport function pickSceneNode(\n scene: ICEScene,\n camera: ICEPerspectiveCamera,\n viewport: ICEViewport,\n point: { readonly x: number; readonly y: number },\n): ICENode | undefined {\n const eye = camera.getPosition();\n const target = camera.getTarget();\n const forward = normalize([\n target.x - eye.x,\n target.y - eye.y,\n target.z - eye.z,\n ]);\n const right = normalize(cross(forward, [0, 1, 0]));\n const up = normalize(cross(right, forward));\n const aspect = viewport.width / Math.max(viewport.height, 1);\n const tangent = Math.tan((camera.fov * Math.PI) / 360);\n const ndcX = (point.x / viewport.width) * 2 - 1;\n const ndcY = 1 - (point.y / viewport.height) * 2;\n const direction = normalize([\n forward[0] + right[0] * ndcX * aspect * tangent + up[0] * ndcY * tangent,\n forward[1] + right[1] * ndcX * aspect * tangent + up[1] * ndcY * tangent,\n forward[2] + right[2] * ndcX * aspect * tangent + up[2] * ndcY * tangent,\n ]);\n\n let nearest: ICENode | undefined;\n let nearestDistance = Number.POSITIVE_INFINITY;\n const visit = (node: ICENode, parentVisible: boolean): void => {\n const visible = parentVisible && node.visible;\n if (!visible) {\n return;\n }\n if (node instanceof ICEMesh) {\n const inverse = invertMatrix(node.updateWorldMatrix().elements);\n if (!inverse) {\n return;\n }\n const localOrigin = transformPoint(inverse, eye.toArray(), 1);\n const localDirection = transformPoint(inverse, direction, 0);\n const { min, max } = node.geometry.getBounds();\n const distance = rayBoxDistance(localOrigin, localDirection, min, max);\n if (distance !== undefined && distance < nearestDistance) {\n nearest = node;\n nearestDistance = distance;\n }\n }\n for (const child of node.children) {\n visit(child, visible);\n }\n };\n visit(scene, true);\n return nearest;\n}\n\nconst normalize = (\n value: readonly [number, number, number],\n): [number, number, number] => {\n const length = Math.hypot(...value);\n return length > 0\n ? [value[0] / length, value[1] / length, value[2] / length]\n : [0, 0, 0];\n};\n\nconst cross = (\n left: readonly [number, number, number],\n right: readonly [number, number, number],\n): [number, number, number] => [\n left[1] * right[2] - left[2] * right[1],\n left[2] * right[0] - left[0] * right[2],\n left[0] * right[1] - left[1] * right[0],\n];\n\nconst rayBoxDistance = (\n origin: readonly [number, number, number],\n direction: readonly [number, number, number],\n min: readonly [number, number, number],\n max: readonly [number, number, number],\n): number | undefined => {\n let near = -Number.POSITIVE_INFINITY;\n let far = Number.POSITIVE_INFINITY;\n for (let axis = 0; axis < 3; axis += 1) {\n const value = direction[axis]!;\n if (Math.abs(value) < 1e-9) {\n if (origin[axis]! < min[axis]! || origin[axis]! > max[axis]!) {\n return undefined;\n }\n continue;\n }\n const first = (min[axis]! - origin[axis]!) / value;\n const second = (max[axis]! - origin[axis]!) / value;\n near = Math.max(near, Math.min(first, second));\n far = Math.min(far, Math.max(first, second));\n if (far < near || far < 0) {\n return undefined;\n }\n }\n return near >= 0 ? near : far >= 0 ? far : undefined;\n};\n\nconst transformPoint = (\n matrix: readonly number[],\n point: readonly [number, number, number],\n w: number,\n): [number, number, number] => [\n matrix[0]! * point[0]! + matrix[4]! * point[1]! + matrix[8]! * point[2]!\n + matrix[12]! * w,\n matrix[1]! * point[0]! + matrix[5]! * point[1]! + matrix[9]! * point[2]!\n + matrix[13]! * w,\n matrix[2]! * point[0]! + matrix[6]! * point[1]! + matrix[10]! * point[2]!\n + matrix[14]! * w,\n];\n\nconst invertMatrix = (source: ArrayLike<number>): number[] | undefined => {\n const inverse = new Array<number>(16);\n const a00 = source[0]!;\n const a01 = source[1]!;\n const a02 = source[2]!;\n const a03 = source[3]!;\n const a10 = source[4]!;\n const a11 = source[5]!;\n const a12 = source[6]!;\n const a13 = source[7]!;\n const a20 = source[8]!;\n const a21 = source[9]!;\n const a22 = source[10]!;\n const a23 = source[11]!;\n const a30 = source[12]!;\n const a31 = source[13]!;\n const a32 = source[14]!;\n const a33 = source[15]!;\n const b00 = a00 * a11 - a01 * a10;\n const b01 = a00 * a12 - a02 * a10;\n const b02 = a00 * a13 - a03 * a10;\n const b03 = a01 * a12 - a02 * a11;\n const b04 = a01 * a13 - a03 * a11;\n const b05 = a02 * a13 - a03 * a12;\n const b06 = a20 * a31 - a21 * a30;\n const b07 = a20 * a32 - a22 * a30;\n const b08 = a20 * a33 - a23 * a30;\n const b09 = a21 * a32 - a22 * a31;\n const b10 = a21 * a33 - a23 * a31;\n const b11 = a22 * a33 - a23 * a32;\n const determinant =\n b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n if (Math.abs(determinant) < 1e-12) {\n return undefined;\n }\n const value = 1 / determinant;\n inverse[0] = (a11 * b11 - a12 * b10 + a13 * b09) * value;\n inverse[1] = (-a01 * b11 + a02 * b10 - a03 * b09) * value;\n inverse[2] = (a31 * b05 - a32 * b04 + a33 * b03) * value;\n inverse[3] = (-a21 * b05 + a22 * b04 - a23 * b03) * value;\n inverse[4] = (-a10 * b11 + a12 * b08 - a13 * b07) * value;\n inverse[5] = (a00 * b11 - a02 * b08 + a03 * b07) * value;\n inverse[6] = (-a30 * b05 + a32 * b02 - a33 * b01) * value;\n inverse[7] = (a20 * b05 - a22 * b02 + a23 * b01) * value;\n inverse[8] = (a10 * b10 - a11 * b08 + a13 * b06) * value;\n inverse[9] = (-a00 * b10 + a01 * b08 - a03 * b06) * value;\n inverse[10] = (a30 * b04 - a31 * b02 + a33 * b00) * value;\n inverse[11] = (-a20 * b04 + a21 * b02 - a23 * b00) * value;\n inverse[12] = (-a10 * b09 + a11 * b07 - a12 * b06) * value;\n inverse[13] = (a00 * b09 - a01 * b07 + a02 * b06) * value;\n inverse[14] = (-a30 * b03 + a31 * b01 - a32 * b00) * value;\n inverse[15] = (a20 * b03 - a21 * b01 + a22 * b00) * value;\n return inverse;\n};\n", "export const SELECTION_CLICK_THRESHOLD_PX = 4;\n\nexport function isSelectionClick(\n start: Readonly<{ x: number; y: number }>,\n end: Readonly<{ x: number; y: number }>,\n): boolean {\n return Math.hypot(end.x - start.x, end.y - start.y)\n <= SELECTION_CLICK_THRESHOLD_PX;\n}\n\nexport type ICEPickOutcome =\n | { readonly kind: 'hit'; readonly id: string }\n | { readonly kind: 'empty' }\n | { readonly kind: 'error' };\n\nexport function selectionForOutcome(\n outcome: ICEPickOutcome,\n): readonly string[] | undefined {\n if (outcome.kind === 'hit') return [outcome.id];\n if (outcome.kind === 'empty') return [];\n return undefined;\n}\n", "import { ICEEventDispatcher } from '@ice3/core';\n\nexport class ICEInteractionState extends ICEEventDispatcher {\n private selection: readonly string[] = [];\n\n getSelection(): readonly string[] {\n return this.selection;\n }\n\n setSelection(ids: readonly string[]): this {\n const next = [...new Set(ids)];\n if (\n next.length === this.selection.length\n && next.every((id, index) => id === this.selection[index])\n ) {\n return this;\n }\n this.selection = Object.freeze(next);\n this.trigger('SELECTION_CHANGE', { selection: this.selection });\n return this;\n }\n}\n", "import {\n ICEPerspectiveCamera,\n ICEVector3,\n type ICEVector3Tuple,\n} from '@ice3/core';\nimport type { ICEViewport } from '@ice3/renderer';\n\nexport interface ICEProjectedPoint {\n readonly x: number;\n readonly y: number;\n readonly visible: boolean;\n readonly depth: number;\n}\n\nexport function projectWorldPoint(\n camera: ICEPerspectiveCamera,\n position: ICEVector3Tuple,\n viewport: ICEViewport,\n): ICEProjectedPoint {\n const aspect = viewport.width / Math.max(viewport.height, 1);\n const [x, y, z, w] = camera\n .getViewProjectionMatrix(aspect)\n .transformPoint(new ICEVector3(...position));\n const safeW = Math.max(Math.abs(w), Number.EPSILON) * Math.sign(w || 1);\n const ndcX = x / safeW;\n const ndcY = y / safeW;\n const ndcZ = z / safeW;\n return {\n x: viewport.x + ((ndcX + 1) / 2) * viewport.width,\n y: viewport.y + ((1 - ndcY) / 2) * viewport.height,\n visible: w > 0\n && ndcX >= -1\n && ndcX <= 1\n && ndcY >= -1\n && ndcY <= 1\n && ndcZ >= -1\n && ndcZ <= 1,\n depth: ndcZ,\n };\n}\n", "export interface ICERenderScheduler {\n request(callback: FrameRequestCallback): number;\n cancelAll(): void;\n flushForTest(): boolean;\n pendingCount(): number;\n}\n\nexport class BrowserRenderScheduler implements ICERenderScheduler {\n private readonly pending = new Map<number, FrameRequestCallback>();\n\n request(callback: FrameRequestCallback): number {\n let handle = 0;\n handle = requestAnimationFrame((time) => {\n this.pending.delete(handle);\n callback(time);\n });\n this.pending.set(handle, callback);\n return handle;\n }\n\n cancelAll(): void {\n for (const handle of this.pending.keys()) {\n cancelAnimationFrame(handle);\n }\n this.pending.clear();\n }\n\n flushForTest(): boolean {\n const first = this.pending.entries().next().value as\n | [number, FrameRequestCallback]\n | undefined;\n if (!first) {\n return false;\n }\n cancelAnimationFrame(first[0]);\n this.pending.delete(first[0]);\n first[1](performance.now());\n return true;\n }\n\n pendingCount(): number {\n return this.pending.size;\n }\n}\n", "import {\n ICEMesh,\n type ICEGeometryBounds,\n type ICENode,\n type ICEScene,\n} from '@ice3/core';\n\nexport interface ICESceneQuery {\n readonly ids?: readonly string[];\n readonly selectionIds?: readonly string[];\n readonly bounds?: ICEGeometryBounds;\n readonly visibleOnly?: boolean;\n readonly limit?: number;\n}\n\nexport interface ICESceneItem {\n readonly nodeId: string;\n readonly selectionId: string;\n readonly name: string;\n readonly typeId: string;\n readonly bounds: ICEGeometryBounds;\n readonly visible: boolean;\n}\n\nexport interface ICERay {\n readonly origin: readonly [number, number, number];\n readonly direction: readonly [number, number, number];\n readonly maxDistance?: number;\n}\n\nexport function raycastSceneNode(\n scene: ICEScene,\n ray: ICERay,\n): ICENode | undefined {\n const values = [...ray.origin, ...ray.direction];\n const length = Math.hypot(...ray.direction);\n if (values.some((value) => !Number.isFinite(value)) || length === 0\n || (ray.maxDistance !== undefined && (!Number.isFinite(ray.maxDistance) || ray.maxDistance <= 0))) {\n throw new Error('ICE3_SCENE_QUERY_INVALID: ray is invalid');\n }\n const direction = ray.direction.map((value) => value / length);\n const maxDistance = ray.maxDistance ?? Infinity;\n let nearest = maxDistance;\n let hit: ICEMesh | undefined;\n const visit = (node: ICENode): void => {\n if (!node.visible) return;\n if (node instanceof ICEMesh) {\n const matrix = node.updateWorldMatrix().elements;\n const transform = (index: number): readonly [number, number, number] => {\n const x = node.geometry.positions[index * 3]!;\n const y = node.geometry.positions[index * 3 + 1]!;\n const z = node.geometry.positions[index * 3 + 2]!;\n return [\n matrix[0]! * x + matrix[4]! * y + matrix[8]! * z + matrix[12]!,\n matrix[1]! * x + matrix[5]! * y + matrix[9]! * z + matrix[13]!,\n matrix[2]! * x + matrix[6]! * y + matrix[10]! * z + matrix[14]!,\n ];\n };\n for (let i = 0; i < node.geometry.indices.length; i += 3) {\n const distance = intersectTriangle(\n ray.origin,\n direction,\n transform(node.geometry.indices[i]!),\n transform(node.geometry.indices[i + 1]!),\n transform(node.geometry.indices[i + 2]!),\n );\n if (distance >= 0 && distance < nearest) {\n nearest = distance;\n hit = node;\n }\n }\n }\n for (const child of node.children) visit(child);\n };\n visit(scene);\n return hit;\n}\n\nfunction intersectTriangle(\n origin: readonly number[],\n direction: readonly number[],\n a: readonly number[],\n b: readonly number[],\n c: readonly number[],\n): number {\n const edge1 = [b[0]! - a[0]!, b[1]! - a[1]!, b[2]! - a[2]!];\n const edge2 = [c[0]! - a[0]!, c[1]! - a[1]!, c[2]! - a[2]!];\n const p = [\n direction[1]! * edge2[2]! - direction[2]! * edge2[1]!,\n direction[2]! * edge2[0]! - direction[0]! * edge2[2]!,\n direction[0]! * edge2[1]! - direction[1]! * edge2[0]!,\n ];\n const determinant = edge1[0]! * p[0]! + edge1[1]! * p[1]! + edge1[2]! * p[2]!;\n if (Math.abs(determinant) < 1e-9) return -1;\n const inverse = 1 / determinant;\n const t = [origin[0]! - a[0]!, origin[1]! - a[1]!, origin[2]! - a[2]!];\n const u = (t[0]! * p[0]! + t[1]! * p[1]! + t[2]! * p[2]!) * inverse;\n if (u < 0 || u > 1) return -1;\n const q = [\n t[1]! * edge1[2]! - t[2]! * edge1[1]!,\n t[2]! * edge1[0]! - t[0]! * edge1[2]!,\n t[0]! * edge1[1]! - t[1]! * edge1[0]!,\n ];\n const v = (direction[0]! * q[0]! + direction[1]! * q[1]! + direction[2]! * q[2]!) * inverse;\n if (v < 0 || u + v > 1) return -1;\n return (edge2[0]! * q[0]! + edge2[1]! * q[1]! + edge2[2]! * q[2]!) * inverse;\n}\n\nexport function collectSceneItems(\n scene: ICEScene,\n query: ICESceneQuery = {},\n): readonly ICESceneItem[] {\n if (query.limit !== undefined && (!Number.isInteger(query.limit) || query.limit < 1)) {\n throw new Error('ICE3_SCENE_QUERY_INVALID: limit must be positive');\n }\n const ids = query.ids ? new Set(query.ids) : undefined;\n const selections = query.selectionIds ? new Set(query.selectionIds) : undefined;\n const items = new Map<string, { item: ICESceneItem; depth: number }>();\n const visit = (node: ICENode, depth: number, inheritedVisible: boolean): void => {\n const visible = inheritedVisible && node.visible;\n if (node.selectionId) {\n const matrix = node.updateWorldMatrix().elements;\n const local = node instanceof ICEMesh\n ? node.geometry.getBounds()\n : {\n min: [0, 0, 0] as const,\n max: [0, 0, 0] as const,\n };\n const corners = [0, 1].flatMap((x) => [0, 1].flatMap((y) => [0, 1].map((z) => {\n const p = [x ? local.max[0] : local.min[0], y ? local.max[1] : local.min[1], z ? local.max[2] : local.min[2]];\n return [matrix[0]! * p[0]! + matrix[4]! * p[1]! + matrix[8]! * p[2]! + matrix[12]!, matrix[1]! * p[0]! + matrix[5]! * p[1]! + matrix[9]! * p[2]! + matrix[13]!, matrix[2]! * p[0]! + matrix[6]! * p[1]! + matrix[10]! * p[2]! + matrix[14]!] as const;\n })));\n const bounds: ICEGeometryBounds = {\n min: [Math.min(...corners.map((p) => p[0])), Math.min(...corners.map((p) => p[1])), Math.min(...corners.map((p) => p[2]))],\n max: [Math.max(...corners.map((p) => p[0])), Math.max(...corners.map((p) => p[1])), Math.max(...corners.map((p) => p[2]))],\n };\n const item = Object.freeze({\n nodeId: node.id,\n selectionId: node.selectionId,\n name: node.displayName,\n typeId: node.typeId,\n bounds: Object.freeze(bounds),\n visible,\n });\n const previous = items.get(item.selectionId);\n if (!previous || depth > previous.depth || (depth === previous.depth && item.nodeId < previous.item.nodeId)) {\n items.set(item.selectionId, { item, depth });\n }\n }\n for (const child of node.children) visit(child, depth + 1, visible);\n };\n visit(scene, 0, true);\n const filtered = [...items.values()].map((entry) => entry.item)\n .filter((item) => !ids || ids.has(item.nodeId))\n .filter((item) => !selections || selections.has(item.selectionId))\n .filter((item) => !query.visibleOnly || item.visible)\n .sort((a, b) => a.selectionId.localeCompare(b.selectionId, 'en'));\n return Object.freeze((query.limit ? filtered.slice(0, query.limit) : filtered));\n}\n", "import {\n ICEEngineError,\n ICEEventDispatcher,\n ICEMesh,\n ICEPerspectiveCamera,\n ICEScene,\n type ICEDiagnostic,\n type ICEGeometry,\n type ICENode,\n} from '@ice3/core';\nimport {\n selectDefaultRendererBackend,\n WebGL2RendererBackend,\n type ICE3RendererPreference,\n type ICE3RendererSelection,\n type ICERendererBackend,\n type ICEScreenPoint,\n type ICEViewport,\n} from '@ice3/renderer';\nimport { ICE2DCanvasPainter } from './layer/ICE2DCanvasPainter.js';\nimport { ICE2DLayer } from './layer/ICE2DLayer.js';\nimport { ICE2DLayerRouter } from './layer/ICE2DLayerRouter.js';\nimport { ICEWorldLayer } from './layer/ICEWorldLayer.js';\nimport {\n ICEInputRouter,\n type ICEInputEvent,\n type ICEInputTarget,\n type ICEKeyboardInputEvent,\n} from './input/ICEInputRouter.js';\nimport { pickSceneNode } from './input/ICEScenePicker.js';\nimport {\n isSelectionClick,\n selectionForOutcome,\n type ICEPickOutcome,\n} from './input/ICESelectionGesture.js';\nimport { ICEInteractionState } from './ICEInteractionState.js';\nimport { projectWorldPoint, type ICEProjectedPoint } from './ICEProjection.js';\nimport {\n BrowserRenderScheduler,\n type ICERenderScheduler,\n} from './ICERenderScheduler.js';\nimport type { ICEVector3Tuple } from '@ice3/core';\nimport {\n collectSceneItems,\n raycastSceneNode,\n type ICERay,\n type ICESceneItem,\n type ICESceneQuery,\n} from './query/ICESceneQuery.js';\n\nexport type ICE3Options = {\n readonly backend?: ICERendererBackend;\n readonly renderer?: ICE3RendererPreference;\n readonly scheduler?: ICERenderScheduler;\n};\n\nexport type ICEEngineDiagnostics = {\n readonly frameId: number;\n readonly fps: number;\n readonly cpuFrameTimeMs: number;\n readonly backend: Readonly<{\n backend: 'webgl2' | 'webgpu' | 'fake';\n maxTextureSize: number;\n picking: boolean;\n }>;\n readonly rendererSelection: Readonly<ICE3RendererSelection>;\n readonly nodeCount: number;\n readonly layerCount: number;\n readonly labelCount: number;\n readonly dpr: number;\n readonly canvas: Readonly<{ width: number; height: number }>;\n readonly viewport: Readonly<ICEViewport>;\n readonly contextLossCount: number;\n readonly renderer: Readonly<{\n drawCalls: number;\n renderedMeshes: number;\n renderedBatches: number;\n instancingFallbacks: number;\n gpuUploads: number;\n gpuEvictions: number;\n gpuBytes: number;\n }>;\n readonly selectionCount: number;\n readonly lastPickTimeMs: number;\n readonly lastPickId?: string;\n readonly labels: readonly Readonly<{\n id: string;\n layerId: string;\n rect: Readonly<{ x: number; y: number; width: number; height: number }>;\n }>[];\n readonly lastDiagnostic?: Readonly<ICEDiagnostic>;\n};\n\ntype EngineState = 'created' | 'initialized' | 'running' | 'stopped' | 'destroyed';\n\ntype PointerGesture = {\n readonly start: Readonly<{ x: number; y: number }>;\n readonly target: ICEInputTarget;\n dragged: boolean;\n};\n\ntype ICEPickResult =\n | {\n readonly kind: 'hit';\n readonly node: ICENode;\n readonly selectionId: string;\n }\n | { readonly kind: 'empty' }\n | { readonly kind: 'error' };\n\nconst NAVIGATION_KEY_CODES = new Set([\n 'ArrowUp',\n 'ArrowLeft',\n 'ArrowDown',\n 'ArrowRight',\n]);\n\nexport class ICE3 extends ICEEventDispatcher {\n private backend: ICERendererBackend;\n private readonly rendererPreference: ICE3RendererPreference | undefined;\n private rendererSelection: Readonly<ICE3RendererSelection>;\n private readonly scheduler: ICERenderScheduler;\n private readonly interaction = new ICEInteractionState();\n private readonly layers: ICE2DLayer[] = [];\n private readonly layerRouter = new ICE2DLayerRouter(() => this.layers);\n private readonly layerPainter = new ICE2DCanvasPainter();\n private readonly inputRouter = new ICEInputRouter({\n hitTestLayer: (point): ICEInputTarget | undefined => {\n const hit = this.layerRouter.hitTest(point);\n return hit\n ? { kind: 'layer', layerId: hit.layer.id, labelId: hit.label.id }\n : undefined;\n },\n pickScene: () => ({ kind: 'scene' }),\n dispatch: (target, event) => this.dispatchInput(target, event),\n });\n private state: EngineState = 'created';\n private host: HTMLElement | null = null;\n private baseCanvas: HTMLCanvasElement | null = null;\n private overlayCanvas: HTMLCanvasElement | null = null;\n private generatedBaseCanvas = false;\n private generatedOverlayCanvas = false;\n private scene: ICEScene | null = null;\n private camera: ICEPerspectiveCamera | null = null;\n private viewport: ICEViewport = { x: 0, y: 0, width: 1, height: 1 };\n private dpr = 1;\n private frameId = 0;\n private renderPending = false;\n private lastFrameAt = 0;\n private fps = 0;\n private cpuFrameTimeMs = 0;\n private contextLost = false;\n private contextLossCount = 0;\n private lastPickTimeMs = 0;\n private lastPickId: string | undefined;\n private readonly pointerGestures = new Map<number, PointerGesture>();\n private lastDiagnostic: ICEDiagnostic | undefined;\n private instancingFallbackReported = false;\n private pickGeneration = 0;\n private readonly removeInputListeners: Array<() => void> = [];\n private readonly handleWindowResize = (): void => {\n this.resize();\n };\n\n constructor(options: ICE3Options = {}) {\n super();\n if (options.backend && options.renderer) {\n throw new ICEEngineError(\n 'ICE3_RENDERER_CONFIG_INVALID',\n 'ICE3_RENDERER_CONFIG_INVALID: backend injection cannot be combined with a renderer preference',\n );\n }\n this.rendererPreference = options.renderer;\n this.backend = options.backend ?? new WebGL2RendererBackend();\n this.rendererSelection = {\n requested: options.backend\n ? 'custom'\n : options.renderer ?? 'webgl2',\n selected: this.backend.capabilities.backend,\n fallback: false,\n experimental: this.backend.capabilities.backend === 'webgpu',\n };\n this.scheduler = options.scheduler ?? new BrowserRenderScheduler();\n }\n\n init(target: string | HTMLElement): this {\n if (this.state !== 'created') {\n throw new ICEEngineError(\n 'ICE3_ALREADY_INITIALIZED',\n 'ICE3 engine can only be initialized once',\n );\n }\n if (\n this.rendererPreference === 'webgpu'\n ) {\n throw new ICEEngineError(\n 'ICE3_RENDERER_ASYNC_REQUIRED',\n 'ICE3_RENDERER_ASYNC_REQUIRED: webgpu requires initAsync()',\n );\n }\n return this.initializeWithBackend(target);\n }\n\n async initAsync(target: string | HTMLElement): Promise<this> {\n if (this.state !== 'created') {\n throw new ICEEngineError(\n 'ICE3_ALREADY_INITIALIZED',\n 'ICE3 engine can only be initialized once',\n );\n }\n if (this.rendererSelection.requested === 'custom') {\n return this.initializeWithBackend(target);\n }\n const selected = await selectDefaultRendererBackend(\n this.rendererPreference ?? 'webgl2',\n );\n this.backend = selected.backend;\n this.rendererSelection = selected.selection;\n try {\n return this.initializeWithBackend(target);\n } catch (error) {\n selected.backend.dispose();\n throw error;\n }\n }\n\n private initializeWithBackend(target: string | HTMLElement): this {\n if (typeof target === 'string') {\n const element = document.querySelector<HTMLElement>(target);\n if (!element) {\n throw new ICEEngineError(\n 'ICE3_INVALID_TARGET',\n `ICE3_INVALID_TARGET: target not found: ${target}`,\n );\n }\n this.configureTarget(element);\n } else {\n this.configureTarget(target);\n }\n\n const canvas = this.baseCanvas;\n if (!canvas) {\n throw new ICEEngineError('ICE3_INVALID_TARGET', 'ICE3 canvas was not created');\n }\n\n try {\n this.backend.initialize({\n canvas,\n onContextLost: () => {\n this.contextLost = true;\n this.scheduler.cancelAll();\n this.renderPending = false;\n this.contextLossCount += 1;\n this.recordDiagnostic(\n 'ICE3_CONTEXT_LOST',\n 'The GPU context was lost; waiting for restoration',\n 'warning',\n );\n this.trigger('CONTEXT_LOST');\n },\n onContextRestored: () => {\n this.contextLost = false;\n this.recordDiagnostic(\n 'ICE3_CONTEXT_RESTORED',\n 'The GPU context was restored',\n 'info',\n );\n this.trigger('CONTEXT_RESTORED');\n this.requestRender('context-restored');\n },\n onError: (error) => {\n if (this.state === 'destroyed') return;\n this.recordDiagnostic(\n error.code,\n error.message,\n 'error',\n );\n },\n });\n window.addEventListener('resize', this.handleWindowResize);\n this.removeInputListeners.push(() =>\n window.removeEventListener('resize', this.handleWindowResize),\n );\n this.installInputEvents();\n } catch (error) {\n for (const remove of this.removeInputListeners.splice(0)) {\n remove();\n }\n if (this.generatedOverlayCanvas) {\n this.overlayCanvas?.remove();\n }\n if (this.generatedBaseCanvas) {\n this.baseCanvas?.remove();\n }\n this.overlayCanvas = null;\n this.baseCanvas = null;\n this.host = null;\n this.generatedOverlayCanvas = false;\n this.generatedBaseCanvas = false;\n throw error;\n }\n this.state = 'initialized';\n this.resize();\n return this;\n }\n\n setScene(scene: ICEScene): this {\n this.assertActive();\n this.scene = scene;\n this.requestRender('scene-changed');\n return this;\n }\n\n setCamera(camera: ICEPerspectiveCamera): this {\n this.assertActive();\n this.camera = camera;\n this.requestRender('camera-changed');\n return this;\n }\n\n setBackgroundColor(color: string): this {\n this.assertActive();\n this.backend.setBackgroundColor?.(color);\n this.requestRender('background-color');\n return this;\n }\n\n prepareRenderBatchGeometry(geometry: ICEGeometry): this {\n if (!this.backend.prepareBatchGeometry) {\n throw new ICEEngineError(\n 'ICE3_RENDER_BATCH_ADAPTER_UNAVAILABLE',\n 'The active renderer cannot stage adaptive batch geometry',\n );\n }\n this.backend.prepareBatchGeometry(geometry);\n return this;\n }\n\n releaseRenderBatchGeometry(geometry: ICEGeometry): this {\n this.backend.releaseBatchGeometry?.(geometry);\n return this;\n }\n\n addLayer(layer: ICE2DLayer): this {\n this.assertActive();\n if (this.layers.some((item) => item.id === layer.id)) {\n throw new ICEEngineError(\n 'ICE3_LAYER_ORDER_CONFLICT',\n `Duplicate ICE layer ID: ${layer.id}`,\n );\n }\n this.layers.push(layer);\n this.layers.sort((left, right) => left.order - right.order);\n this.requestRender('layer-added');\n return this;\n }\n\n removeLayer(layer: ICE2DLayer): this {\n const index = this.layers.indexOf(layer);\n if (index >= 0) {\n this.layers.splice(index, 1);\n this.requestRender('layer-removed');\n }\n return this;\n }\n\n start(): this {\n this.assertActive();\n if (this.state === 'running') {\n return this;\n }\n this.state = 'running';\n this.requestRender('started');\n return this;\n }\n\n stop(): this {\n this.assertActive();\n this.scheduler.cancelAll();\n this.renderPending = false;\n this.pointerGestures.clear();\n this.state = 'stopped';\n return this;\n }\n\n requestRender(_reason = 'requested'): this {\n this.assertActive();\n if (this.state !== 'running' || this.contextLost) {\n return this;\n }\n if (!this.scene || !this.camera) {\n this.recordDiagnostic(\n 'ICE3_ENGINE_NOT_READY',\n 'Scene and camera must be configured before rendering',\n );\n return this;\n }\n if (this.renderPending) {\n return this;\n }\n this.renderPending = true;\n this.scheduler.request(() => {\n this.renderPending = false;\n this.renderFrame();\n });\n return this;\n }\n\n project(position: ICEVector3Tuple): ICEProjectedPoint {\n this.assertActive();\n if (!this.camera) {\n throw new ICEEngineError('ICE3_ENGINE_NOT_READY', 'Camera is not configured');\n }\n return projectWorldPoint(this.camera, position, this.viewport);\n }\n\n getSelection(): readonly string[] {\n return this.interaction.getSelection();\n }\n\n queryScene(query?: ICESceneQuery): readonly ICESceneItem[] {\n this.assertActive();\n return this.scene ? collectSceneItems(this.scene, query) : Object.freeze([]);\n }\n\n findBySelectionId(selectionId: string): ICENode | undefined {\n const item = this.queryScene({ selectionIds: [selectionId], limit: 1 })[0];\n return item ? this.scene?.findByID(item.nodeId) : undefined;\n }\n\n raycast(ray: ICERay): ICESceneItem | undefined {\n this.assertActive();\n const node = this.scene ? raycastSceneNode(this.scene, ray) : undefined;\n return node ? this.queryScene({ ids: [node.id], limit: 1 })[0] : undefined;\n }\n\n setSelection(ids: readonly string[]): this {\n this.interaction.setSelection(ids);\n this.trigger('SELECTION_CHANGE', { selection: this.getSelection() });\n this.requestRender('selection-changed');\n return this;\n }\n\n async pick(point: ICEScreenPoint): Promise<ICENode | undefined> {\n const result = await this.samplePick(point);\n return result.kind === 'hit' ? result.node : undefined;\n }\n\n async pickItem(\n point: ICEScreenPoint,\n ): Promise<{ readonly item?: ICESceneItem }> {\n const node = await this.pick(point);\n if (!node) return Object.freeze({});\n const item = this.queryScene({\n selectionIds: [node.selectionId ?? node.id],\n limit: 1,\n })[0];\n return Object.freeze(item ? { item } : {});\n }\n\n async capture(): Promise<Blob> {\n this.assertActive();\n if (!this.backend.capture) {\n throw new ICEEngineError(\n 'ICE3_CAPTURE_UNAVAILABLE',\n 'ICE3_CAPTURE_UNAVAILABLE: the active renderer cannot capture pixels',\n );\n }\n return this.backend.capture();\n }\n\n getDiagnostics(): Readonly<ICEEngineDiagnostics> {\n return {\n frameId: this.frameId,\n fps: this.fps,\n cpuFrameTimeMs: this.cpuFrameTimeMs,\n backend: this.backend.capabilities,\n rendererSelection: this.rendererSelection,\n nodeCount: this.scene ? countNodes(this.scene) : 0,\n layerCount: this.layers.length,\n labelCount: this.layers.reduce(\n (total, layer) => total + layer.getLabels().length,\n 0,\n ),\n dpr: this.dpr,\n canvas: {\n width: this.baseCanvas?.width ?? 0,\n height: this.baseCanvas?.height ?? 0,\n },\n viewport: { ...this.viewport },\n contextLossCount: this.contextLossCount,\n renderer: this.backend.stats ?? {\n drawCalls: 0,\n renderedMeshes: 0,\n renderedBatches: 0,\n instancingFallbacks: 0,\n gpuUploads: 0,\n gpuEvictions: 0,\n gpuBytes: 0,\n },\n selectionCount: this.interaction.getSelection().length,\n lastPickTimeMs: this.lastPickTimeMs,\n ...(this.lastPickId ? { lastPickId: this.lastPickId } : {}),\n labels: this.layers.flatMap((layer) =>\n layer.getLabels().map((label) => ({\n id: label.id,\n layerId: layer.id,\n rect: label.getRect(),\n })),\n ),\n ...(this.lastDiagnostic ? { lastDiagnostic: this.lastDiagnostic } : {}),\n };\n }\n\n destroy(): void {\n if (this.state === 'destroyed') {\n return;\n }\n this.scheduler.cancelAll();\n this.renderPending = false;\n for (const layer of this.layers.splice(0)) {\n layer.dispose();\n }\n for (const remove of this.removeInputListeners.splice(0)) {\n remove();\n }\n this.backend.dispose();\n if (this.generatedOverlayCanvas) {\n this.overlayCanvas?.remove();\n }\n if (this.generatedBaseCanvas) {\n this.baseCanvas?.remove();\n }\n this.overlayCanvas = null;\n this.baseCanvas = null;\n this.host = null;\n this.scene = null;\n this.camera = null;\n this.pointerGestures.clear();\n this.state = 'destroyed';\n this.trigger('DESTROY');\n this.removeAllListeners();\n }\n\n resize(): this {\n this.assertActive();\n if (!this.host || !this.baseCanvas || !this.overlayCanvas) {\n return this;\n }\n const bounds = this.host.getBoundingClientRect();\n const width = Math.max(1, Math.round(bounds.width || this.host.clientWidth));\n const height = Math.max(1, Math.round(bounds.height || this.host.clientHeight));\n this.dpr = window.devicePixelRatio || 1;\n this.viewport = { x: 0, y: 0, width, height };\n this.backend.resize(this.viewport, this.dpr);\n this.overlayCanvas.width = Math.round(width * this.dpr);\n this.overlayCanvas.height = Math.round(height * this.dpr);\n this.overlayCanvas.style.width = `${width}px`;\n this.overlayCanvas.style.height = `${height}px`;\n this.trigger('RESIZE', { viewport: this.viewport, dpr: this.dpr });\n this.requestRender('resize');\n return this;\n }\n\n private configureTarget(target: HTMLElement): void {\n if (target instanceof HTMLCanvasElement) {\n this.baseCanvas = target;\n const parent = target.parentElement;\n if (!parent) {\n throw new ICEEngineError(\n 'ICE3_INVALID_TARGET',\n 'Canvas target must have a parent for the 2D layer',\n );\n }\n this.host = parent;\n } else {\n this.host = target;\n const canvas = document.createElement('canvas');\n canvas.dataset.layer = 'scene';\n this.baseCanvas = canvas;\n this.generatedBaseCanvas = true;\n target.appendChild(canvas);\n }\n\n if (getComputedStyle(this.host).position === 'static') {\n this.host.style.position = 'relative';\n }\n this.baseCanvas.style.position = 'absolute';\n this.baseCanvas.style.inset = '0';\n this.baseCanvas.style.width = '100%';\n this.baseCanvas.style.height = '100%';\n\n const overlay = document.createElement('canvas');\n overlay.dataset.layer = 'overlay';\n overlay.style.position = 'absolute';\n overlay.style.inset = '0';\n overlay.style.pointerEvents = 'auto';\n this.overlayCanvas = overlay;\n this.generatedOverlayCanvas = true;\n this.host.appendChild(overlay);\n }\n\n private renderFrame(): void {\n if (\n this.state !== 'running'\n || this.contextLost\n || !this.scene\n || !this.camera\n ) {\n return;\n }\n const startedAt = performance.now();\n this.trigger('BEFORE_RENDER');\n this.frameId += 1;\n this.backend.render({\n frameId: this.frameId,\n scene: this.scene,\n camera: this.camera,\n viewport: this.viewport,\n dpr: this.dpr,\n selection: this.interaction.getSelection(),\n });\n const instancingFallback = (\n this.backend.stats?.instancingFallbacks ?? 0\n ) > 0;\n if (instancingFallback && !this.instancingFallbackReported) {\n this.recordDiagnostic(\n 'ICE3_RENDER_INSTANCING_FALLBACK',\n 'Instance buffers are unavailable; repeated geometry uses individual draws',\n 'warning',\n );\n this.instancingFallbackReported = true;\n } else if (!instancingFallback) {\n this.instancingFallbackReported = false;\n }\n if (this.overlayCanvas && this.layers.length > 0) {\n if (this.scene) {\n for (const layer of this.layers) {\n if (layer instanceof ICEWorldLayer) {\n layer.prepare(this.scene, (anchorId) => {\n const node = this.scene?.findByID(anchorId);\n if (!node) {\n this.recordDiagnostic(\n 'ICE3_UNKNOWN_ANCHOR',\n `Unknown ICE label anchor: ${anchorId}`,\n );\n return undefined;\n }\n return this.project(node.getWorldPosition().toArray());\n });\n }\n }\n }\n this.layerPainter.paint(\n this.overlayCanvas,\n this.layers,\n this.viewport,\n this.dpr,\n );\n }\n this.cpuFrameTimeMs = performance.now() - startedAt;\n if (this.lastFrameAt) {\n const frameMs = startedAt - this.lastFrameAt;\n this.fps = frameMs > 0 ? 1000 / frameMs : 0;\n }\n this.lastFrameAt = startedAt;\n this.trigger('AFTER_RENDER');\n }\n\n private installInputEvents(): void {\n const overlay = this.overlayCanvas;\n if (!overlay) {\n return;\n }\n overlay.style.touchAction = 'none';\n\n const listen = <K extends keyof HTMLElementEventMap>(\n type: K,\n handler: (event: HTMLElementEventMap[K]) => void,\n ) => {\n overlay.addEventListener(type, handler as EventListener);\n this.removeInputListeners.push(() =>\n overlay.removeEventListener(type, handler as EventListener),\n );\n };\n const pointOf = (event: PointerEvent | WheelEvent) => {\n const bounds = overlay.getBoundingClientRect();\n return {\n x: event.clientX - bounds.left,\n y: event.clientY - bounds.top,\n };\n };\n\n listen('pointerdown', (event) => {\n overlay.setPointerCapture?.(event.pointerId);\n const point = pointOf(event);\n const target = this.inputRouter.pointerDown(point, event.pointerId);\n if (target && event.button === 0) {\n const multiplePointers = this.pointerGestures.size > 0;\n if (multiplePointers) {\n for (const gesture of this.pointerGestures.values()) {\n gesture.dragged = true;\n }\n }\n this.pointerGestures.set(event.pointerId, {\n start: { ...point },\n target,\n dragged: multiplePointers,\n });\n }\n });\n listen('pointermove', (event) => {\n const point = pointOf(event);\n const gesture = this.pointerGestures.get(event.pointerId);\n if (\n gesture\n && !isSelectionClick(gesture.start, point)\n ) {\n gesture.dragged = true;\n }\n this.inputRouter.pointerMove(point, event.pointerId);\n });\n listen('pointerup', async (event) => {\n const point = pointOf(event);\n const gesture = this.pointerGestures.get(event.pointerId);\n this.inputRouter.pointerUp(point, event.pointerId);\n this.pointerGestures.delete(event.pointerId);\n overlay.releasePointerCapture?.(event.pointerId);\n if (\n gesture\n && gesture.target.kind === 'scene'\n && !gesture.dragged\n && isSelectionClick(gesture.start, point)\n ) {\n const generation = ++this.pickGeneration;\n const result = await this.samplePick(point);\n if (\n generation !== this.pickGeneration\n || this.state === 'destroyed'\n ) {\n return;\n }\n const outcome: ICEPickOutcome = result.kind === 'hit'\n ? {\n kind: 'hit',\n id: result.selectionId,\n }\n : result;\n const nextSelection = selectionForOutcome(outcome);\n if (nextSelection !== undefined) {\n this.setSelection(nextSelection);\n }\n }\n });\n listen('pointercancel', (event) => {\n this.inputRouter.pointerCancel(event.pointerId);\n this.pointerGestures.delete(event.pointerId);\n });\n listen('wheel', (event) => {\n event.preventDefault();\n this.inputRouter.wheel(event.deltaY, pointOf(event), event.deltaMode);\n });\n\n const handleKey = (type: 'keydown' | 'keyup', event: KeyboardEvent): void => {\n const editing = type === 'keydown' && (\n isEditableTarget(event.target)\n || isEditableTarget(document.activeElement)\n );\n if (editing) {\n return;\n }\n if (type === 'keydown' && NAVIGATION_KEY_CODES.has(event.code)) {\n event.preventDefault();\n }\n const input: ICEKeyboardInputEvent = {\n type,\n code: event.code,\n key: event.key,\n repeat: event.repeat,\n };\n this.trigger(type === 'keydown' ? 'KEY_DOWN' : 'KEY_UP', {\n target: { kind: 'scene' },\n event: input,\n });\n };\n const handleKeyDown = (event: KeyboardEvent): void => {\n handleKey('keydown', event);\n };\n const handleKeyUp = (event: KeyboardEvent): void => {\n handleKey('keyup', event);\n };\n const handleBlur = (): void => {\n this.pointerGestures.clear();\n this.trigger('KEY_CANCEL');\n };\n window.addEventListener('keydown', handleKeyDown);\n window.addEventListener('keyup', handleKeyUp);\n window.addEventListener('blur', handleBlur);\n this.removeInputListeners.push(() => {\n window.removeEventListener('keydown', handleKeyDown);\n window.removeEventListener('keyup', handleKeyUp);\n window.removeEventListener('blur', handleBlur);\n });\n }\n\n private dispatchInput(target: ICEInputTarget, event: ICEInputEvent): void {\n const eventName = {\n pointerdown: 'POINTER_DOWN',\n pointermove: 'POINTER_MOVE',\n pointerup: 'POINTER_UP',\n pointercancel: 'POINTER_CANCEL',\n wheel: 'WHEEL',\n }[event.type];\n this.trigger(eventName, { target, event });\n }\n\n private async samplePick(point: ICEScreenPoint): Promise<ICEPickResult> {\n this.assertActive();\n if (!this.scene || !this.camera) {\n return { kind: 'empty' };\n }\n if (this.backend.capabilities.picking && this.backend.pick) {\n const startedAt = performance.now();\n try {\n const selectionId = await this.backend.pick({\n frameId: this.frameId,\n scene: this.scene,\n camera: this.camera,\n viewport: this.viewport,\n dpr: this.dpr,\n selection: this.interaction.getSelection(),\n }, point);\n this.lastPickId = selectionId;\n const node = selectionId\n ? findNodeForPickedSelectionId(this.scene, selectionId)\n : undefined;\n return node && selectionId\n ? { kind: 'hit', node, selectionId }\n : { kind: 'empty' };\n } catch (error) {\n this.recordDiagnostic(\n 'ICE3_PICK_UNAVAILABLE',\n error instanceof Error ? error.message : String(error),\n );\n return { kind: 'error' };\n } finally {\n this.lastPickTimeMs = performance.now() - startedAt;\n }\n }\n const node = pickSceneNode(this.scene, this.camera, this.viewport, point);\n return node\n ? {\n kind: 'hit',\n node,\n selectionId: node instanceof ICEMesh ? node.selectionId : node.id,\n }\n : { kind: 'empty' };\n }\n\n private assertActive(): void {\n if (this.state === 'destroyed') {\n throw new ICEEngineError('ICE3_ENGINE_DESTROYED', 'ICE3 engine is destroyed');\n }\n }\n\n reportDiagnostic(\n code: string,\n message: string,\n severity: ICEDiagnostic['severity'] = 'error',\n ): this {\n this.assertActive();\n this.lastDiagnostic = { severity, code, message };\n this.trigger('DIAGNOSTIC', this.lastDiagnostic);\n return this;\n }\n\n private recordDiagnostic(\n code: string,\n message: string,\n severity: ICEDiagnostic['severity'] = 'error',\n ): void {\n this.reportDiagnostic(code, message, severity);\n }\n}\n\nconst findNodeForPickedSelectionId = (\n node: ICENode,\n selectionId: string,\n): ICENode | undefined => {\n if (node.selectionId === selectionId) {\n return node;\n }\n const semanticIds = (\n node as ICENode & { readonly semanticSelectionIds?: readonly string[] }\n ).semanticSelectionIds;\n if (semanticIds?.includes(selectionId)) {\n return node;\n }\n for (const child of node.children) {\n const found = findNodeForPickedSelectionId(child, selectionId);\n if (found) return found;\n }\n return undefined;\n};\n\nconst countNodes = (node: ICENode): number =>\n 1 + node.children.reduce((total, child) => total + countNodes(child), 0);\n\nconst isEditableTarget = (target: EventTarget | null): boolean =>\n target instanceof Element\n && target.closest(\n 'input, textarea, select, [contenteditable]:not([contenteditable=\"false\"])',\n ) !== null;\n", "import type { ICEEvent } from '@ice3/core';\nimport { ICEPerspectiveCamera } from '@ice3/core';\nimport type { ICE3 } from '../ICE3.js';\nimport type {\n ICEInputEvent,\n ICEInputTarget,\n ICEKeyboardInputEvent,\n} from './ICEInputRouter.js';\n\ntype DispatchEvent = ICEEvent<{\n readonly target: ICEInputTarget;\n readonly event: ICEInputEvent | ICEKeyboardInputEvent;\n}>;\n\nconst isKeyboardInput = (\n input: ICEInputEvent | ICEKeyboardInputEvent,\n): input is ICEKeyboardInputEvent => (\n input.type === 'keydown' || input.type === 'keyup'\n);\n\nconst clamp = (value: number, min: number, max: number): number =>\n Math.min(max, Math.max(min, value));\n\nconst MOTION_TIME_CONSTANT_MS = 55;\nconst MAX_FRAME_DELTA_MS = 64;\nconst SETTLE_EPSILON = 1e-5;\nconst WHEEL_LINE_HEIGHT_PX = 16;\nconst MAX_WHEEL_STEP_PX = 240;\nconst MOVE_SPEED_PER_DISTANCE = 0.75;\n\nconst NAVIGATION_KEYS = new Set([\n 'KeyW',\n 'KeyA',\n 'KeyS',\n 'KeyD',\n 'ArrowUp',\n 'ArrowLeft',\n 'ArrowDown',\n 'ArrowRight',\n]);\n\nexport class ICEOrbitController {\n private target: [number, number, number];\n private yaw: number;\n private pitch: number;\n private distance: number;\n private targetYaw: number;\n private targetPitch: number;\n private targetDistance: number;\n private lastMotionAt = performance.now();\n private draggingPointer: number | null = null;\n private lastPoint: readonly [number, number] = [0, 0];\n private readonly activePointers = new Map<\n number,\n Readonly<{ x: number; y: number }>\n >();\n private pinchDistance: number | null = null;\n private readonly pressedKeys = new Set<string>();\n private started = false;\n private disposed = false;\n private readonly onPointerDown = (event: DispatchEvent): void => {\n const { target, event: input } = event.param ?? {};\n if (!input || isKeyboardInput(input) || input.pointerId === undefined) {\n return;\n }\n if (target?.kind === 'scene') {\n this.activePointers.set(input.pointerId, { ...input.point });\n if (this.activePointers.size === 1) {\n this.draggingPointer = input.pointerId;\n this.lastPoint = [input.point.x, input.point.y];\n } else {\n this.draggingPointer = null;\n this.pinchDistance = this.distanceBetweenPointers();\n }\n }\n };\n private readonly onPointerMove = (event: DispatchEvent): void => {\n const input = event.param?.event;\n if (!input || isKeyboardInput(input) || input.pointerId === undefined) {\n return;\n }\n if (this.activePointers.has(input.pointerId)) {\n this.activePointers.set(input.pointerId, { ...input.point });\n }\n if (this.activePointers.size >= 2) {\n const nextDistance = this.distanceBetweenPointers();\n if (this.pinchDistance !== null && nextDistance !== null) {\n this.zoomBy((this.pinchDistance - nextDistance) * 2);\n }\n this.pinchDistance = nextDistance;\n return;\n }\n if (input.pointerId !== this.draggingPointer) {\n return;\n }\n this.rotateBy(\n input.point.x - this.lastPoint[0],\n input.point.y - this.lastPoint[1],\n );\n this.lastPoint = [input.point.x, input.point.y];\n };\n private readonly onPointerUp = (event: DispatchEvent): void => {\n const input = event.param?.event;\n const pointerId = input && !isKeyboardInput(input)\n ? input.pointerId\n : undefined;\n if (pointerId === undefined) {\n return;\n }\n this.activePointers.delete(pointerId);\n if (this.activePointers.size < 2) {\n this.pinchDistance = null;\n }\n if (this.activePointers.size === 1) {\n const [remainingId, point] = this.activePointers.entries().next().value as [\n number,\n Readonly<{ x: number; y: number }>,\n ];\n this.draggingPointer = remainingId;\n this.lastPoint = [point.x, point.y];\n } else if (this.activePointers.size === 0) {\n this.draggingPointer = null;\n }\n };\n private readonly onWheel = (event: DispatchEvent): void => {\n const param = event.param;\n if (\n param?.target.kind === 'scene'\n && !isKeyboardInput(param.event)\n && param.event.deltaY !== undefined\n ) {\n const deltaMode = param.event.deltaMode ?? 0;\n const scale = deltaMode === 1\n ? WHEEL_LINE_HEIGHT_PX\n : deltaMode === 2\n ? this.engine.getDiagnostics().viewport.height\n : 1;\n this.zoomBy(\n clamp(\n param.event.deltaY * Math.max(1, scale),\n -MAX_WHEEL_STEP_PX,\n MAX_WHEEL_STEP_PX,\n ),\n );\n }\n };\n private readonly onKeyDown = (event: DispatchEvent): void => {\n const input = event.param?.event;\n if (\n !input\n || input.type !== 'keydown'\n || !NAVIGATION_KEYS.has(input.code)\n ) {\n return;\n }\n this.prepareMotion();\n this.pressedKeys.add(input.code);\n this.engine.requestRender('camera-keyboard-movement');\n };\n private readonly onKeyUp = (event: DispatchEvent): void => {\n const input = event.param?.event;\n if (input?.type === 'keyup') {\n this.pressedKeys.delete(input.code);\n }\n };\n private readonly onKeyCancel = (): void => {\n this.pressedKeys.clear();\n };\n private readonly onBeforeRender = (): void => {\n const moving = this.pressedKeys.size > 0;\n if (this.motionSettled() && !moving) {\n return;\n }\n const now = performance.now();\n const deltaMs = clamp(now - this.lastMotionAt, 0, MAX_FRAME_DELTA_MS);\n this.lastMotionAt = now;\n const alpha = 1 - Math.exp(-deltaMs / MOTION_TIME_CONSTANT_MS);\n this.yaw += (this.targetYaw - this.yaw) * alpha;\n this.pitch += (this.targetPitch - this.pitch) * alpha;\n this.distance = Math.exp(\n Math.log(this.distance)\n + (Math.log(this.targetDistance) - Math.log(this.distance)) * alpha,\n );\n if (this.motionSettled()) {\n this.yaw = this.targetYaw;\n this.pitch = this.targetPitch;\n this.distance = this.targetDistance;\n }\n this.applyKeyboardMovement(deltaMs);\n this.applyPosition();\n if (!this.motionSettled() || this.pressedKeys.size > 0) {\n this.engine.requestRender('orbit-smoothing');\n }\n };\n\n constructor(\n private readonly engine: ICE3,\n private readonly camera: ICEPerspectiveCamera,\n ) {\n const target = camera.getTarget();\n const eye = camera.getPosition();\n const offsetX = eye.x - target.x;\n const offsetY = eye.y - target.y;\n const offsetZ = eye.z - target.z;\n this.target = target.toArray();\n this.distance = Math.max(0.2, Math.hypot(offsetX, offsetY, offsetZ));\n this.yaw = Math.atan2(offsetX, offsetZ);\n this.pitch = Math.asin(clamp(offsetY / this.distance, -1, 1));\n this.targetYaw = this.yaw;\n this.targetPitch = this.pitch;\n this.targetDistance = this.distance;\n }\n\n focus(\n target: { readonly bounds: { readonly min: readonly [number, number, number]; readonly max: readonly [number, number, number] } },\n options: { readonly padding?: number; readonly animate?: boolean } = {},\n ): this {\n this.assertActive();\n const padding = options.padding ?? 1.15;\n if (!Number.isFinite(padding) || padding <= 0) {\n throw new Error('ICE3_CAMERA_FOCUS_INVALID: padding must be positive');\n }\n const center: [number, number, number] = [\n (target.bounds.min[0] + target.bounds.max[0]) / 2,\n (target.bounds.min[1] + target.bounds.max[1]) / 2,\n (target.bounds.min[2] + target.bounds.max[2]) / 2,\n ];\n const radius = Math.max(\n 0.1,\n Math.hypot(\n target.bounds.max[0] - target.bounds.min[0],\n target.bounds.max[1] - target.bounds.min[1],\n target.bounds.max[2] - target.bounds.min[2],\n ) / 2,\n );\n this.target = center;\n this.targetDistance = radius / Math.sin(this.camera.fov * Math.PI / 360) * padding;\n if (options.animate === false) {\n this.distance = this.targetDistance;\n this.applyPosition();\n }\n this.engine.requestRender('camera-focus');\n return this;\n }\n\n rotateBy(deltaX: number, deltaY: number): this {\n this.assertActive();\n this.prepareMotion();\n this.targetYaw -= deltaX * 0.005;\n this.targetPitch = clamp(\n this.targetPitch + deltaY * 0.005,\n -1.45,\n 1.45,\n );\n this.engine.requestRender('camera-rotation');\n return this;\n }\n\n zoomBy(delta: number): this {\n this.assertActive();\n this.prepareMotion();\n this.targetDistance = clamp(\n this.targetDistance * Math.exp(delta * 0.001),\n 0.2,\n 100,\n );\n this.engine.requestRender('camera-zoom');\n return this;\n }\n\n start(): this {\n this.assertActive();\n if (this.started) {\n return this;\n }\n this.engine\n .on('POINTER_DOWN', this.onPointerDown)\n .on('POINTER_MOVE', this.onPointerMove)\n .on('POINTER_UP', this.onPointerUp)\n .on('POINTER_CANCEL', this.onPointerUp)\n .on('WHEEL', this.onWheel)\n .on('KEY_DOWN', this.onKeyDown)\n .on('KEY_UP', this.onKeyUp)\n .on('KEY_CANCEL', this.onKeyCancel)\n .on('BEFORE_RENDER', this.onBeforeRender);\n this.started = true;\n return this;\n }\n\n stop(): this {\n if (!this.started) {\n return this;\n }\n this.engine\n .off('POINTER_DOWN', this.onPointerDown)\n .off('POINTER_MOVE', this.onPointerMove)\n .off('POINTER_UP', this.onPointerUp)\n .off('POINTER_CANCEL', this.onPointerUp)\n .off('WHEEL', this.onWheel)\n .off('KEY_DOWN', this.onKeyDown)\n .off('KEY_UP', this.onKeyUp)\n .off('KEY_CANCEL', this.onKeyCancel)\n .off('BEFORE_RENDER', this.onBeforeRender);\n this.started = false;\n this.draggingPointer = null;\n this.activePointers.clear();\n this.pinchDistance = null;\n this.pressedKeys.clear();\n return this;\n }\n\n dispose(): void {\n this.stop();\n this.disposed = true;\n }\n\n private applyPosition(): void {\n const horizontal = Math.cos(this.pitch) * this.distance;\n const [targetX, targetY, targetZ] = this.target;\n this.camera.setTarget(this.target);\n this.camera.setPosition([\n targetX + Math.sin(this.yaw) * horizontal,\n targetY + Math.sin(this.pitch) * this.distance,\n targetZ + Math.cos(this.yaw) * horizontal,\n ]);\n }\n\n private applyKeyboardMovement(deltaMs: number): void {\n const right = (\n Number(this.pressedKeys.has('KeyD') || this.pressedKeys.has('ArrowRight'))\n - Number(this.pressedKeys.has('KeyA') || this.pressedKeys.has('ArrowLeft'))\n );\n const up = (\n Number(this.pressedKeys.has('KeyW') || this.pressedKeys.has('ArrowUp'))\n - Number(this.pressedKeys.has('KeyS') || this.pressedKeys.has('ArrowDown'))\n );\n const magnitude = Math.hypot(right, up);\n if (magnitude === 0) {\n return;\n }\n const distance = this.distance * MOVE_SPEED_PER_DISTANCE\n * (deltaMs / 1000)\n / magnitude;\n const sinYaw = Math.sin(this.yaw);\n const cosYaw = Math.cos(this.yaw);\n const sinPitch = Math.sin(this.pitch);\n const cosPitch = Math.cos(this.pitch);\n this.target[0] += distance * (\n cosYaw * right\n - sinYaw * sinPitch * up\n );\n this.target[1] += distance * cosPitch * up;\n this.target[2] += distance * (\n -sinYaw * right\n - cosYaw * sinPitch * up\n );\n }\n\n private prepareMotion(): void {\n if (this.motionSettled()) {\n this.lastMotionAt = performance.now();\n }\n }\n\n private motionSettled(): boolean {\n return (\n Math.abs(this.targetYaw - this.yaw) <= SETTLE_EPSILON\n && Math.abs(this.targetPitch - this.pitch) <= SETTLE_EPSILON\n && Math.abs(Math.log(this.targetDistance / this.distance))\n <= SETTLE_EPSILON\n );\n }\n\n private assertActive(): void {\n if (this.disposed) {\n throw new Error('ICE orbit controller is disposed');\n }\n }\n\n private distanceBetweenPointers(): number | null {\n const points = [...this.activePointers.values()];\n const first = points[0];\n const second = points[1];\n return first && second\n ? Math.hypot(second.x - first.x, second.y - first.y)\n : null;\n }\n}\n", "import {\n ICENode,\n type ICEBasicMaterial,\n type ICEIndexedGeometry,\n type ICENodeOptions,\n} from '@ice3/core';\n\nexport interface ICERenderBatchOptions extends ICENodeOptions {\n readonly geometry: ICEIndexedGeometry;\n readonly material: ICEBasicMaterial;\n readonly semanticIds: readonly string[];\n readonly semanticNodeIds: readonly string[];\n readonly semanticSelectionIds: readonly string[];\n readonly materialKey: string;\n}\n\nexport class ICERenderBatch extends ICENode {\n static readonly typeId = 'ice3:RenderBatch';\n\n readonly geometry: ICEIndexedGeometry;\n readonly material: ICEBasicMaterial;\n readonly semanticIds: readonly string[];\n readonly semanticNodeIds: readonly string[];\n readonly semanticSelectionIds: readonly string[];\n readonly materialKey: string;\n\n constructor(options: ICERenderBatchOptions) {\n const { selectionId: _selectionId, ...nodeOptions } = options;\n super(nodeOptions);\n this.geometry = options.geometry;\n this.material = options.material;\n this.semanticIds = Object.freeze([...options.semanticIds]);\n this.semanticNodeIds = Object.freeze([...options.semanticNodeIds]);\n this.semanticSelectionIds = Object.freeze(\n [...options.semanticSelectionIds],\n );\n this.materialKey = options.materialKey;\n }\n\n override get typeId(): string {\n return ICERenderBatch.typeId;\n }\n}\n", "import type {\n ICEPreparedAssetSnapshot,\n ICEPreparedStats,\n} from '@ice3/assets';\nimport {\n ICEBasicMaterial,\n ICEIndexedGeometry,\n ICEMesh,\n ICENode,\n ICEScene,\n type ICEGeometryBounds,\n} from '@ice3/core';\nimport { ICERenderBatch } from './ICERenderBatch.js';\n\nexport interface ICEBuiltAsset {\n readonly scene: ICEScene;\n readonly bounds: ICEGeometryBounds;\n readonly stats: ICEPreparedStats;\n}\n\nexport function buildAssetScene(\n snapshot: ICEPreparedAssetSnapshot,\n): ICEBuiltAsset {\n const geometries = snapshot.geometries.map((geometry) => (\n new ICEIndexedGeometry({\n id: geometry.id,\n positions: geometry.positions,\n indices: geometry.indices,\n ...(geometry.edgeIndices ? { edgeIndices: geometry.edgeIndices } : {}),\n ...(geometry.colors ? { colors: geometry.colors } : {}),\n ...(geometry.semanticIndices\n ? { semanticIndices: geometry.semanticIndices }\n : {}),\n })\n ));\n const materials = snapshot.materials.map((material) => (\n new ICEBasicMaterial({\n color: material.baseColor,\n ...(material.edgeColor ? { edgeColor: material.edgeColor } : {}),\n })\n ));\n const meshesByNode = new Map<number, typeof snapshot.meshes[number][]>();\n for (const mesh of snapshot.meshes) {\n const entries = meshesByNode.get(mesh.node) ?? [];\n entries.push(mesh);\n meshesByNode.set(mesh.node, entries);\n }\n\n const scene = new ICEScene({ id: `${snapshot.assetId}:scene` });\n const nodes: ICENode[] = snapshot.nodes.map((source, index) => {\n const mesh = meshesByNode.get(index)?.[0];\n const geometry = mesh ? geometries[mesh.geometry] : undefined;\n const material = mesh ? materials[mesh.material] : undefined;\n const node = snapshot.batching && geometry && material\n ? new ICERenderBatch({\n id: source.id,\n displayName: source.name,\n ...(source.metadata ? { metadata: source.metadata } : {}),\n matrix: source.matrix,\n geometry,\n material,\n semanticIds: snapshot.batching.semanticIds,\n semanticNodeIds: snapshot.batching.semanticNodeIds,\n semanticSelectionIds: snapshot.batching.semanticSelectionIds,\n materialKey: `${mesh!.material}`,\n })\n : geometry && material\n ? new ICEMesh({\n id: source.id,\n displayName: source.name,\n ...(source.metadata ? { metadata: source.metadata } : {}),\n selectionId: source.selectionId,\n matrix: source.matrix,\n geometry,\n material,\n })\n : new ICENode({\n id: source.id,\n displayName: source.name,\n ...(source.metadata ? { metadata: source.metadata } : {}),\n selectionId: source.selectionId,\n matrix: source.matrix,\n });\n node.visible = source.visible;\n return node;\n });\n\n for (const [index, node] of nodes.entries()) {\n const source = snapshot.nodes[index]!;\n const parentIndex = snapshot.nodes[index]!.parent;\n if (parentIndex === null) {\n scene.addChild(node);\n } else {\n const parent = nodes[parentIndex];\n if (!parent) {\n throw new Error(`ICE3_ASSET_INVALID_GLB: parent node ${parentIndex} is missing`);\n }\n parent.addChild(node);\n }\n\n for (const mesh of meshesByNode.get(index)?.slice(1) ?? []) {\n const geometry = geometries[mesh.geometry];\n const material = materials[mesh.material];\n if (!geometry || !material) {\n throw new Error('ICE3_ASSET_INVALID_GLB: mesh references are invalid');\n }\n node.addChild(new ICEMesh({\n id: mesh.id,\n displayName: source.name,\n selectionId: source.selectionId,\n geometry,\n material,\n }));\n }\n }\n\n return {\n scene,\n bounds: snapshot.bounds,\n stats: snapshot.stats,\n };\n}\n", "type JSONRecord = Record<string, unknown>;\n\nexport interface ICEProfileValidation {\n readonly json: JSONRecord;\n readonly binary: Uint8Array;\n readonly profile: JSONRecord;\n}\n\nexport function validatePreparedProfile(\n json: JSONRecord,\n binary: Uint8Array,\n): ICEProfileValidation {\n const asset = record(json.asset);\n const profile = record(record(asset?.extras)?.ice3);\n if (\n profile?.profile !== 'ice3-prepared'\n || profile.profileVersion !== '1.0'\n || typeof profile.assetId !== 'string'\n ) {\n throw assetError(\n 'ICE3_ASSET_PROFILE_UNSUPPORTED',\n 'GLB is not an ICE3 Prepared Profile',\n );\n }\n if (Array.isArray(json.extensionsRequired) && json.extensionsRequired.length > 0) {\n throw assetError(\n 'ICE3_ASSET_PROFILE_UNSUPPORTED',\n 'required glTF extensions are unsupported',\n );\n }\n const contractVersion = profile.contractVersion;\n if (contractVersion !== undefined) {\n if (\n typeof contractVersion !== 'string'\n || !/^1(?:\\.\\d+){1,2}$/.test(contractVersion)\n ) {\n throw assetError(\n 'ICE3_ASSET_CONTRACT_UNSUPPORTED',\n `unsupported asset contract version: ${String(contractVersion)}`,\n );\n }\n const preparation = record(profile.preparation);\n if (preparation?.runtimeConversionRequired !== false) {\n throw assetError(\n 'ICE3_TOOL_RUNTIME_CONVERSION_REQUIRED',\n 'asset requires unsupported runtime conversion',\n );\n }\n const budget = record(profile.budget);\n if (\n !budget\n || typeof budget.profile !== 'string'\n || !['pass', 'warning', 'error'].includes(String(budget.status))\n || !nonNegativeInteger(budget.warningCount)\n || !nonNegativeInteger(budget.errorCount)\n ) {\n throw assetError(\n 'ICE3_ASSET_CONTRACT_UNSUPPORTED',\n 'asset contract budget is invalid',\n );\n }\n }\n for (const field of [\n 'animations',\n 'skins',\n 'cameras',\n 'textures',\n 'images',\n 'samplers',\n 'lights',\n ]) {\n if (Array.isArray(json[field]) && json[field].length > 0) {\n throw assetError(\n 'ICE3_ASSET_UNSUPPORTED_FEATURE',\n `${field} are unsupported by the M1 profile`,\n );\n }\n }\n if (\n records(json.scenes).length !== 1\n || json.scene !== 0\n || records(json.buffers).length !== 1\n || records(json.buffers)[0]?.uri !== undefined\n || Number(records(json.buffers)[0]?.byteLength) > binary.byteLength\n ) {\n throw assetError('ICE3_ASSET_INVALID_GLB', 'profile container fields are invalid');\n }\n const ids = new Set<string>();\n for (const node of records(json.nodes)) {\n const nodeProfile = record(record(node.extras)?.ice3);\n const id = nodeProfile?.id;\n if (typeof id !== 'string' || !id || ids.has(id)) {\n throw assetError('ICE3_ASSET_DUPLICATE_ID', 'node profile ID is invalid');\n }\n ids.add(id);\n const selectionId = nodeProfile?.selectionId;\n if (\n selectionId !== undefined\n && (typeof selectionId !== 'string' || !selectionId.trim())\n ) {\n throw assetError(\n 'ICE3_ASSET_PROFILE_UNSUPPORTED',\n 'node selection identity is invalid',\n );\n }\n const matrix = node.matrix;\n if (\n !Array.isArray(matrix)\n || matrix.length !== 16\n || matrix.some((value) => typeof value !== 'number' || !Number.isFinite(value))\n || node.translation !== undefined\n || node.rotation !== undefined\n || node.scale !== undefined\n ) {\n throw assetError(\n 'ICE3_ASSET_PROFILE_UNSUPPORTED',\n 'nodes must use matrix transforms',\n );\n }\n }\n for (const [field, kind] of [\n ['meshes', 'mesh'],\n ['materials', 'material'],\n ] as const) {\n for (const entry of records(json[field])) {\n const id = record(record(entry.extras)?.ice3)?.id;\n if (typeof id !== 'string' || !id || ids.has(id)) {\n throw assetError(\n 'ICE3_ASSET_DUPLICATE_ID',\n `${kind} profile ID is invalid`,\n );\n }\n ids.add(id);\n }\n }\n const views = records(json.bufferViews);\n for (const [index, view] of views.entries()) {\n const offset = Number(view.byteOffset ?? 0);\n const length = Number(view.byteLength);\n if (\n !Number.isInteger(offset)\n || !Number.isInteger(length)\n || offset % 4 !== 0\n || offset < 0\n || length < 0\n || offset + length > binary.byteLength\n || view.buffer !== 0\n || view.byteStride !== undefined\n ) {\n throw assetError(\n 'ICE3_ASSET_ACCESSOR_INVALID',\n `bufferView ${index} is invalid`,\n );\n }\n }\n const accessors = records(json.accessors);\n for (const [index, accessor] of accessors.entries()) {\n if (\n !views[Number(accessor.bufferView)]\n || accessor.sparse !== undefined\n || accessor.normalized === true\n ) {\n throw assetError(\n 'ICE3_ASSET_ACCESSOR_INVALID',\n `accessor ${index} is unsupported`,\n );\n }\n }\n for (const mesh of records(json.meshes)) {\n for (const primitive of records(mesh.primitives)) {\n const mode = Number(primitive.mode ?? 4);\n if (mode !== 4 && mode !== 1) {\n throw assetError(\n 'ICE3_ASSET_UNSUPPORTED_FEATURE',\n 'only triangle and edge primitives are supported',\n );\n }\n if (\n mode === 1\n && record(record(primitive.extras)?.ice3)?.role !== 'edges'\n ) {\n throw assetError(\n 'ICE3_ASSET_PROFILE_UNSUPPORTED',\n 'line primitives must use the edge role',\n );\n }\n if (mode === 4) {\n const attributes = record(primitive.attributes);\n const colorIndex = attributes?.COLOR_0;\n if (colorIndex !== undefined) {\n const position = accessors[Number(attributes?.POSITION)];\n const colors = accessors[Number(colorIndex)];\n if (\n colors?.componentType !== 5126\n || colors.type !== 'VEC3'\n || colors.count !== position?.count\n ) {\n throw assetError(\n 'ICE3_ASSET_ACCESSOR_INVALID',\n 'COLOR_0 must be float VEC3 matching POSITION',\n );\n }\n }\n }\n }\n }\n if (contractVersion !== undefined) {\n validatePreparedStats(json, profile);\n }\n return { json, binary, profile };\n}\n\nfunction validatePreparedStats(json: JSONRecord, profile: JSONRecord): void {\n const stats = record(profile.stats);\n const nodes = records(json.nodes);\n const meshes = records(json.meshes);\n const accessors = records(json.accessors);\n let primitiveCount = 0;\n let triangleCount = 0;\n let edgeSegmentCount = 0;\n const selectionNodes = new Set<number>();\n const referencedMeshes = new Set<number>();\n for (const [nodeIndex, node] of nodes.entries()) {\n if (node.mesh === undefined) continue;\n const mesh = meshes[Number(node.mesh)];\n if (!mesh) continue;\n referencedMeshes.add(Number(node.mesh));\n for (const primitive of records(mesh.primitives)) {\n const mode = Number(primitive.mode ?? 4);\n if (mode === 4) {\n selectionNodes.add(nodeIndex);\n }\n }\n }\n for (const meshIndex of referencedMeshes) {\n for (const primitive of records(meshes[meshIndex]?.primitives)) {\n primitiveCount += 1;\n const mode = Number(primitive.mode ?? 4);\n const count = Number(accessors[Number(primitive.indices)]?.count);\n if (!Number.isInteger(count) || count < 0) continue;\n if (mode === 4) triangleCount += count / 3;\n if (mode === 1) edgeSegmentCount += count / 2;\n }\n }\n const batchingSelectionIds = record(profile.batching)?.semanticSelectionIds;\n const expected = {\n nodeCount: nodes.length,\n maxNodeDepth: sceneDepth(json),\n meshCount: meshes.length,\n primitiveCount,\n triangleCount,\n edgeSegmentCount,\n materialCount: records(json.materials).length,\n selectionGroupCount: Array.isArray(batchingSelectionIds)\n ? new Set(batchingSelectionIds).size\n : selectionNodes.size,\n };\n for (const [key, value] of Object.entries(expected)) {\n if (stats?.[key] !== value) {\n throw assetError(\n 'ICE3_ASSET_STATS_MISMATCH',\n `asset stat ${key} does not match prepared data`,\n );\n }\n }\n}\n\nfunction sceneDepth(json: JSONRecord): number {\n const nodes = records(json.nodes);\n const scenes = records(json.scenes);\n const visit = (index: number, visiting = new Set<number>()): number => {\n if (visiting.has(index)) return 0;\n const next = new Set(visiting).add(index);\n const children = Array.isArray(nodes[index]?.children)\n ? nodes[index]!.children as number[]\n : [];\n return children.length === 0\n ? 0\n : 1 + Math.max(...children.map((child) => visit(Number(child), next)));\n };\n const roots = Array.isArray(scenes[0]?.nodes)\n ? scenes[0]!.nodes as number[]\n : [];\n return roots.length === 0\n ? 0\n : Math.max(...roots.map((root) => visit(Number(root))));\n}\n\nfunction nonNegativeInteger(value: unknown): value is number {\n return typeof value === 'number'\n && Number.isInteger(value)\n && value >= 0;\n}\n\nexport function records(value: unknown): JSONRecord[] {\n return Array.isArray(value)\n ? value.filter((item): item is JSONRecord => (\n Boolean(item) && typeof item === 'object' && !Array.isArray(item)\n ))\n : [];\n}\n\nexport function record(value: unknown): JSONRecord | undefined {\n return value && typeof value === 'object' && !Array.isArray(value)\n ? value as JSONRecord\n : undefined;\n}\n\nfunction assetError(code: string, message: string): Error {\n return new Error(`${code}: ${message}`);\n}\n", "import type {\n ICEGeometryBounds,\n ICEMatrix4Tuple,\n} from '@ice3/core';\nimport type {\n ICEPreparedAssetSnapshot,\n ICEPreparedBatch,\n ICEPreparedBatching,\n ICEPreparedGeometry,\n ICEPreparedMaterial,\n ICEPreparedMesh,\n ICEPreparedNode,\n} from './ICEPreparedGLB.js';\nimport {\n record,\n records,\n validatePreparedProfile,\n} from './ICEProfileValidator.js';\n\ntype JSONRecord = Record<string, unknown>;\n\nexport function readPreparedGLB(bytes: ArrayBuffer): ICEPreparedAssetSnapshot {\n const { json, binary, profile } = parseGLB(bytes);\n const accessors = records(json.accessors);\n const views = records(json.bufferViews);\n const sourceNodes = records(json.nodes);\n const sourceMeshes = records(json.meshes);\n const sourceMaterials = records(json.materials);\n const activeScene = records(json.scenes)[Number(json.scene ?? 0)];\n const sceneRoots = integers(activeScene?.nodes);\n const parents = new Array<number | null>(sourceNodes.length).fill(null);\n for (const [index, node] of sourceNodes.entries()) {\n for (const child of integers(node.children)) {\n if (child < 0 || child >= sourceNodes.length) {\n throw assetError('ICE3_ASSET_INVALID_GLB', 'node child index is invalid');\n }\n parents[child] = index;\n }\n }\n\n const nodes: ICEPreparedNode[] = sourceNodes.map((node, index) => {\n const profile = record(record(node.extras)?.ice3);\n const id = profile?.id;\n if (typeof id !== 'string') {\n throw assetError('ICE3_ASSET_INVALID_GLB', 'node identity is missing');\n }\n const selectionId = profile?.selectionId;\n const metadata: Record<string, string | readonly string[]> = {};\n for (const key of [\n 'displayName',\n 'equipmentTag',\n 'processStage',\n 'area',\n 'ports',\n 'connections',\n ]) {\n const value = profile?.[key];\n if (typeof value === 'string') {\n metadata[key] = value;\n } else if (\n Array.isArray(value)\n && value.every((item) => typeof item === 'string')\n ) {\n metadata[key] = Object.freeze([...value]);\n }\n }\n return {\n id,\n selectionId: typeof selectionId === 'string' && selectionId.trim()\n ? selectionId\n : id,\n name: typeof node.name === 'string' ? node.name : id,\n ...(Object.keys(metadata).length > 0\n ? { metadata: Object.freeze(metadata) }\n : {}),\n parent: parents[index] ?? null,\n matrix: node.matrix as ICEMatrix4Tuple,\n visible: record(record(node.extras)?.ice3)?.visible !== false,\n };\n });\n const batching = readBatchingMetadata(\n profile,\n sourceNodes,\n sourceMeshes,\n sourceMaterials,\n nodes,\n views,\n accessors,\n binary,\n );\n\n const geometries: ICEPreparedGeometry[] = [];\n const materials: ICEPreparedMaterial[] = [];\n const meshes: ICEPreparedMesh[] = [];\n const selectionNodes = new Set<number>();\n let primitiveCount = 0;\n let triangleCount = 0;\n let edgeSegmentCount = 0;\n for (const [meshIndex, mesh] of sourceMeshes.entries()) {\n const meshId = record(record(mesh.extras)?.ice3)?.id;\n if (typeof meshId !== 'string') {\n throw assetError('ICE3_ASSET_INVALID_GLB', 'mesh identity is missing');\n }\n const primitives = records(mesh.primitives);\n const nodesForMesh = sourceNodes\n .map((node, index) => ({ node, index }))\n .filter((entry) => Number(entry.node.mesh) === meshIndex);\n for (const [primitiveIndex, primitive] of primitives.entries()) {\n primitiveCount += 1;\n if (Number(primitive.mode ?? 4) !== 4) continue;\n const positionIndex = Number(record(primitive.attributes)?.POSITION);\n const triangleIndex = Number(primitive.indices);\n const positions = readFloatAccessor(\n binary,\n views,\n accessors[positionIndex],\n );\n const colorAccessorIndex = record(primitive.attributes)?.COLOR_0;\n const colors = colorAccessorIndex === undefined\n ? undefined\n : readColorAccessor(\n binary,\n views,\n accessors[Number(colorAccessorIndex)],\n positions.length / 3,\n );\n const indices = readIndexAccessor(\n binary,\n views,\n accessors[triangleIndex],\n );\n const semanticAccessorIndex = record(primitive.attributes)\n ?._ICE3_SEMANTIC_INDEX;\n const semanticIndices = semanticAccessorIndex === undefined\n ? undefined\n : readSemanticAccessor(\n binary,\n views,\n accessors[Number(semanticAccessorIndex)],\n positions.length / 3,\n batching?.semanticIds.length ?? 0,\n );\n triangleCount += indices.length / 3;\n validateIndexRange(indices, positions.length / 3);\n const edgePrimitive = primitives.find((candidate) => (\n Number(candidate.mode) === 1\n && Number(record(candidate.attributes)?.POSITION) === positionIndex\n ));\n const edgeIndices = edgePrimitive\n ? readIndexAccessor(binary, views, accessors[Number(edgePrimitive.indices)])\n : undefined;\n if (edgeIndices) validateIndexRange(edgeIndices, positions.length / 3);\n edgeSegmentCount += (edgeIndices?.length ?? 0) / 2;\n const baseMaterial = sourceMaterials[Number(primitive.material)];\n const edgeMaterial = edgePrimitive\n ? sourceMaterials[Number(edgePrimitive.material)]\n : undefined;\n const materialIndex = materials.length;\n materials.push({\n id: `${meshId}/material/${primitiveIndex}`,\n baseColor: materialColor(baseMaterial),\n ...(edgeMaterial ? { edgeColor: materialColor(edgeMaterial) } : {}),\n });\n const bounds = boundsFromAccessor(accessors[positionIndex]);\n const geometryIndex = geometries.length;\n geometries.push({\n id: `${meshId}/geometry/${primitiveIndex}`,\n positions,\n indices,\n ...(edgeIndices ? { edgeIndices } : {}),\n ...(colors ? { colors } : {}),\n ...(semanticIndices ? { semanticIndices } : {}),\n bounds,\n });\n for (const entry of nodesForMesh) {\n selectionNodes.add(entry.index);\n meshes.push({\n id: `${meshId}/primitive/${primitiveIndex}/${entry.index}`,\n node: entry.index,\n geometry: geometryIndex,\n material: materialIndex,\n });\n }\n }\n }\n const stats = {\n nodeCount: sourceNodes.length,\n maxNodeDepth: preparedNodeDepth(sourceNodes, sceneRoots),\n meshCount: sourceMeshes.length,\n primitiveCount,\n triangleCount,\n edgeSegmentCount,\n materialCount: sourceMaterials.length,\n selectionGroupCount: selectionNodes.size,\n };\n const contract = preparedContract(profile);\n\n return {\n assetId: String(profile.assetId),\n bounds: boundsFromProfile(profile.bounds),\n stats,\n contract,\n nodes,\n geometries,\n materials,\n meshes,\n ...(batching ? { batching } : {}),\n };\n}\n\nfunction readBatchingMetadata(\n profile: JSONRecord,\n sourceNodes: readonly JSONRecord[],\n sourceMeshes: readonly JSONRecord[],\n sourceMaterials: readonly JSONRecord[],\n nodes: readonly ICEPreparedNode[],\n views: readonly JSONRecord[],\n accessors: readonly JSONRecord[],\n binary: Uint8Array,\n): ICEPreparedBatching | undefined {\n const raw = record(profile.batching);\n if (!raw) return undefined;\n if (raw.version !== '1.0') {\n throw assetError('ICE3_ASSET_BATCH_INVALID', 'batch version is unsupported');\n }\n const semanticIds = stringArray(raw.semanticIds, 'semanticIds');\n const semanticNodeIds = stringArray(raw.semanticNodeIds, 'semanticNodeIds');\n const semanticSelectionIds = stringArray(\n raw.semanticSelectionIds,\n 'semanticSelectionIds',\n );\n if (\n semanticIds.length === 0\n || semanticNodeIds.length !== semanticIds.length\n || semanticSelectionIds.length !== semanticIds.length\n ) {\n throw assetError('ICE3_ASSET_BATCH_INVALID', 'semantic arrays are inconsistent');\n }\n const nodeById = new Map(nodes.map((node) => [node.id, node] as const));\n for (let index = 0; index < semanticNodeIds.length; index += 1) {\n const node = nodeById.get(semanticNodeIds[index]!);\n if (!node || node.selectionId !== semanticSelectionIds[index]) {\n throw assetError(\n 'ICE3_ASSET_BATCH_INVALID',\n 'semantic node and selection identity do not match',\n );\n }\n }\n const sourceBatches = records(raw.batches);\n if (sourceBatches.length === 0) {\n throw assetError('ICE3_ASSET_BATCH_INVALID', 'batch list is empty');\n }\n const batchIds = new Set<string>();\n const primitiveKeys = new Set<string>();\n const batches: ICEPreparedBatch[] = sourceBatches.map((entry) => {\n const id = entry.id;\n const mesh = entry.mesh;\n const primitive = entry.primitive;\n const material = entry.material;\n const mode = entry.mode;\n const triangleCount = entry.triangleCount;\n if (\n typeof id !== 'string'\n || !id.trim()\n || batchIds.has(id)\n || !nonNegativeInteger(mesh)\n || !nonNegativeInteger(primitive)\n || !nonNegativeInteger(material)\n || (mode !== 4 && mode !== 1)\n || !nonNegativeInteger(triangleCount)\n ) {\n throw assetError('ICE3_ASSET_BATCH_INVALID', 'batch entry is invalid');\n }\n batchIds.add(id);\n const sourceMesh = sourceMeshes[mesh];\n const sourcePrimitive = records(sourceMesh?.primitives)[primitive];\n if (\n !sourcePrimitive\n || material >= sourceMaterials.length\n || Number(sourcePrimitive.mode ?? 4) !== mode\n ) {\n throw assetError(\n 'ICE3_ASSET_BATCH_INVALID',\n 'batch primitive or material index is invalid',\n );\n }\n const primitiveKey = `${mesh}:${primitive}`;\n if (primitiveKeys.has(primitiveKey)) {\n throw assetError('ICE3_ASSET_BATCH_INVALID', 'batch primitive is duplicated');\n }\n primitiveKeys.add(primitiveKey);\n const attributes = record(sourcePrimitive.attributes);\n const semanticAccessorIndex = Number(attributes?._ICE3_SEMANTIC_INDEX);\n const semanticAccessor = accessors[semanticAccessorIndex];\n const positionCount = Number(\n accessors[Number(attributes?.POSITION)]?.count,\n );\n if (\n !Number.isInteger(semanticAccessorIndex)\n || semanticAccessorIndex < 0\n || semanticAccessor?.componentType !== 5125\n || semanticAccessor.type !== 'SCALAR'\n || Number(semanticAccessor.count) !== positionCount\n ) {\n throw assetError(\n 'ICE3_ASSET_BATCH_INVALID',\n 'batch semantic attribute is invalid',\n );\n }\n readSemanticAccessor(\n binary,\n views,\n semanticAccessor,\n positionCount,\n semanticIds.length,\n );\n if (\n mode === 4\n && triangleCount !== Number(accessors[Number(sourcePrimitive.indices)]?.count) / 3\n ) {\n throw assetError(\n 'ICE3_ASSET_BATCH_INVALID',\n 'batch triangle count is invalid',\n );\n }\n return {\n id,\n mesh,\n primitive,\n material,\n mode,\n triangleCount,\n bounds: batchingBounds(entry.bounds),\n };\n });\n return {\n version: '1.0',\n semanticIds,\n semanticNodeIds,\n semanticSelectionIds,\n batches,\n };\n}\n\nfunction stringArray(value: unknown, field: string): readonly string[] {\n if (\n !Array.isArray(value)\n || value.some((entry) => typeof entry !== 'string' || !entry.trim())\n || new Set(value).size !== value.length\n ) {\n throw assetError('ICE3_ASSET_BATCH_INVALID', `${field} is invalid`);\n }\n return value as string[];\n}\n\nfunction batchingBounds(value: unknown): ICEGeometryBounds {\n const recordValue = record(value);\n const min = numbers(recordValue?.min, 3);\n const max = numbers(recordValue?.max, 3);\n if (\n !min\n || !max\n || [0, 1, 2].some((axis) => min[axis]! > max[axis]!)\n ) {\n throw assetError('ICE3_ASSET_BATCH_INVALID', 'batch bounds are invalid');\n }\n return {\n min: [min[0]!, min[1]!, min[2]!],\n max: [max[0]!, max[1]!, max[2]!],\n };\n}\n\nfunction readSemanticAccessor(\n binary: Uint8Array,\n views: readonly JSONRecord[],\n accessor: JSONRecord | undefined,\n vertexCount: number,\n semanticCount: number,\n): Uint32Array {\n if (\n !accessor\n || accessor.componentType !== 5125\n || accessor.type !== 'SCALAR'\n || Number(accessor.count) !== vertexCount\n ) {\n throw assetError(\n 'ICE3_ASSET_BATCH_INVALID',\n 'semantic index accessor is invalid',\n );\n }\n const offset = accessorOffset(binary, views, accessor);\n const values = new Uint32Array(\n binary.buffer,\n binary.byteOffset + offset,\n vertexCount,\n );\n if (values.some((value) => value >= semanticCount)) {\n throw assetError(\n 'ICE3_ASSET_BATCH_INVALID',\n 'semantic index is out of range',\n );\n }\n return values;\n}\n\nfunction preparedContract(profile: JSONRecord): {\n status: 'active' | 'legacy';\n version?: string;\n preparation?: {\n runtimeConversionRequired: false;\n sourceFormat: 'gltf-2.0';\n unitsNormalized: true;\n matrixTransformsBaked: true;\n requiredCompressionDecoded: true;\n edgesPrepared: boolean;\n selectionGroupsPrepared: true;\n };\n budget?: {\n profile: string;\n status: 'pass' | 'warning' | 'error';\n warningCount: number;\n errorCount: number;\n };\n} {\n if (profile.contractVersion === undefined) {\n return { status: 'legacy' };\n }\n const preparation = record(profile.preparation)!;\n const budget = record(profile.budget)!;\n return {\n status: 'active',\n version: String(profile.contractVersion),\n preparation: {\n runtimeConversionRequired: false,\n sourceFormat: 'gltf-2.0',\n unitsNormalized: true,\n matrixTransformsBaked: true,\n requiredCompressionDecoded: true,\n edgesPrepared: Boolean(preparation.edgesPrepared),\n selectionGroupsPrepared: true,\n },\n budget: {\n profile: String(budget.profile),\n status: budget.status as 'pass' | 'warning' | 'error',\n warningCount: Number(budget.warningCount),\n errorCount: Number(budget.errorCount),\n },\n };\n}\n\nfunction preparedNodeDepth(\n nodes: readonly JSONRecord[],\n roots: readonly number[],\n): number {\n const depth = (index: number, visiting = new Set<number>()): number => {\n if (visiting.has(index)) return 0;\n const next = new Set(visiting).add(index);\n const children = integers(nodes[index]?.children);\n return children.length === 0\n ? 0\n : 1 + Math.max(...children.map((child) => depth(child, next)));\n };\n return roots.length === 0\n ? 0\n : Math.max(...roots.map((root) => depth(root)));\n}\n\nexport async function verifyPreparedGLBIntegrity(\n bytes: ArrayBuffer,\n): Promise<boolean> {\n const { binary, profile } = parseGLB(bytes);\n const digest = record(profile.contentDigest);\n if (\n digest?.algorithm !== 'sha256'\n || digest.covers !== 'binary-chunk'\n || typeof digest.value !== 'string'\n ) {\n return false;\n }\n const hashed = await crypto.subtle.digest('SHA-256', Uint8Array.from(binary));\n const value = [...new Uint8Array(hashed)]\n .map((part) => part.toString(16).padStart(2, '0'))\n .join('');\n return value === digest.value.toLowerCase();\n}\n\nfunction parseGLB(bytes: ArrayBuffer): ReturnType<typeof validatePreparedProfile> {\n const view = new DataView(bytes);\n if (\n bytes.byteLength < 12\n || view.getUint32(0, true) !== 0x46546c67\n || view.getUint16(4, true) !== 2\n || view.getUint32(8, true) !== bytes.byteLength\n ) {\n throw assetError('ICE3_ASSET_INVALID_GLB', 'GLB header is invalid');\n }\n let offset = 12;\n let index = 0;\n let json: JSONRecord | undefined;\n let binary: Uint8Array | undefined;\n while (offset < bytes.byteLength) {\n if (offset + 8 > bytes.byteLength) {\n throw assetError('ICE3_ASSET_INVALID_GLB', 'GLB chunk header is truncated');\n }\n const length = view.getUint32(offset, true);\n const type = view.getUint32(offset + 4, true);\n if (length % 4 !== 0 || offset + 8 + length > bytes.byteLength) {\n throw assetError('ICE3_ASSET_INVALID_GLB', 'GLB chunk length is invalid');\n }\n const chunk = new Uint8Array(bytes, offset + 8, length);\n if (index === 0) {\n if (type !== 0x4e4f534a) {\n throw assetError('ICE3_ASSET_INVALID_GLB', 'JSON chunk must be first');\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(\n new TextDecoder().decode(chunk).replace(/ +$/g, ''),\n );\n } catch {\n throw assetError('ICE3_ASSET_INVALID_GLB', 'JSON chunk is invalid');\n }\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n throw assetError('ICE3_ASSET_INVALID_GLB', 'JSON root is invalid');\n }\n json = parsed as JSONRecord;\n } else if (type === 0x004e4942) {\n if (index !== 1 || binary) {\n throw assetError('ICE3_ASSET_INVALID_GLB', 'BIN chunk is invalid');\n }\n binary = chunk;\n }\n offset += 8 + length;\n index += 1;\n }\n if (!json || !binary) {\n throw assetError('ICE3_ASSET_INVALID_GLB', 'required chunks are missing');\n }\n return validatePreparedProfile(json, binary);\n}\n\nfunction readFloatAccessor(\n binary: Uint8Array,\n views: readonly JSONRecord[],\n accessor: JSONRecord | undefined,\n): Float32Array {\n if (\n !accessor\n || accessor.componentType !== 5126\n || accessor.type !== 'VEC3'\n ) {\n throw assetError('ICE3_ASSET_ACCESSOR_INVALID', 'POSITION must be float VEC3');\n }\n const offset = accessorOffset(binary, views, accessor);\n const count = Number(accessor.count) * 3;\n return new Float32Array(binary.buffer, binary.byteOffset + offset, count);\n}\n\nfunction readIndexAccessor(\n binary: Uint8Array,\n views: readonly JSONRecord[],\n accessor: JSONRecord | undefined,\n): Uint16Array | Uint32Array {\n if (\n !accessor\n || accessor.type !== 'SCALAR'\n || (accessor.componentType !== 5123 && accessor.componentType !== 5125)\n ) {\n throw assetError('ICE3_ASSET_ACCESSOR_INVALID', 'indices must be unsigned scalars');\n }\n const offset = accessorOffset(binary, views, accessor);\n const count = Number(accessor.count);\n return accessor.componentType === 5123\n ? new Uint16Array(binary.buffer, binary.byteOffset + offset, count)\n : new Uint32Array(binary.buffer, binary.byteOffset + offset, count);\n}\n\nfunction readColorAccessor(\n binary: Uint8Array,\n views: readonly JSONRecord[],\n accessor: JSONRecord | undefined,\n vertexCount: number,\n): Float32Array {\n if (\n !accessor\n || accessor.componentType !== 5126\n || accessor.type !== 'VEC3'\n || Number(accessor.count) !== vertexCount\n ) {\n throw assetError(\n 'ICE3_ASSET_ACCESSOR_INVALID',\n 'COLOR_0 must be float VEC3 matching the position count',\n );\n }\n const offset = accessorOffset(binary, views, accessor);\n return new Float32Array(\n binary.buffer,\n binary.byteOffset + offset,\n vertexCount * 3,\n );\n}\n\nfunction accessorOffset(\n binary: Uint8Array,\n views: readonly JSONRecord[],\n accessor: JSONRecord,\n): number {\n const view = views[Number(accessor.bufferView)];\n if (!view) {\n throw assetError('ICE3_ASSET_ACCESSOR_INVALID', 'bufferView is missing');\n }\n const offset = Number(view.byteOffset ?? 0) + Number(accessor.byteOffset ?? 0);\n const componentBytes = accessor.componentType === 5126\n ? 4\n : accessor.componentType === 5123\n ? 2\n : 4;\n const componentCount = accessor.type === 'VEC3' ? 3 : 1;\n const required = Number(accessor.count) * componentBytes * componentCount;\n if (\n !Number.isInteger(offset)\n || offset < 0\n || offset % componentBytes !== 0\n || required > Number(view.byteLength)\n || offset + required > binary.byteLength\n ) {\n throw assetError('ICE3_ASSET_ACCESSOR_INVALID', 'accessor exceeds its buffer');\n }\n return offset;\n}\n\nfunction validateIndexRange(\n indices: Uint16Array | Uint32Array,\n vertexCount: number,\n): void {\n if (indices.some((index) => index >= vertexCount)) {\n throw assetError('ICE3_ASSET_ACCESSOR_INVALID', 'index exceeds vertex count');\n }\n}\n\nfunction boundsFromAccessor(accessor: JSONRecord | undefined): ICEGeometryBounds {\n const min = accessor?.min;\n const max = accessor?.max;\n if (!Array.isArray(min) || !Array.isArray(max) || min.length !== 3 || max.length !== 3) {\n throw assetError('ICE3_ASSET_ACCESSOR_INVALID', 'POSITION bounds are missing');\n }\n return {\n min: [Number(min[0]), Number(min[1]), Number(min[2])],\n max: [Number(max[0]), Number(max[1]), Number(max[2])],\n };\n}\n\nfunction boundsFromProfile(value: unknown): ICEGeometryBounds {\n const bounds = record(value);\n const min = bounds?.min;\n const max = bounds?.max;\n if (!Array.isArray(min) || !Array.isArray(max) || min.length !== 3 || max.length !== 3) {\n throw assetError('ICE3_ASSET_INVALID_GLB', 'profile bounds are invalid');\n }\n return {\n min: [Number(min[0]), Number(min[1]), Number(min[2])],\n max: [Number(max[0]), Number(max[1]), Number(max[2])],\n };\n}\n\nfunction materialColor(material: JSONRecord | undefined): string {\n if (!material) return '#808080';\n const color = record(material.pbrMetallicRoughness)?.baseColorFactor;\n if (!Array.isArray(color) || color.length < 3) return '#808080';\n return `#${color.slice(0, 3).map((value) => (\n Math.round(Math.min(1, Math.max(0, Number(value))) * 255)\n .toString(16)\n .padStart(2, '0')\n )).join('')}`;\n}\n\nfunction integers(value: unknown): number[] {\n return Array.isArray(value)\n ? value.filter((entry): entry is number => Number.isInteger(entry))\n : [];\n}\n\nfunction numbers(value: unknown, length: number): number[] | undefined {\n return Array.isArray(value)\n && value.length === length\n && value.every((entry) => typeof entry === 'number' && Number.isFinite(entry))\n ? value as number[]\n : undefined;\n}\n\nfunction nonNegativeInteger(value: unknown): value is number {\n return typeof value === 'number'\n && Number.isInteger(value)\n && value >= 0;\n}\n\nfunction assetError(code: string, message: string): Error {\n return new Error(`${code}: ${message}`);\n}\n", "import type { ICEGeometryBounds } from '@ice3/core';\nimport type {\n ICETilesetSnapshot,\n ICETilesetTile,\n} from './ICETileset.js';\n\ntype JSONRecord = Record<string, unknown>;\ntype Matrix = readonly [\n number, number, number, number,\n number, number, number, number,\n number, number, number, number,\n number, number, number, number,\n];\n\nconst IDENTITY: Matrix = [\n 1, 0, 0, 0,\n 0, 1, 0, 0,\n 0, 0, 1, 0,\n 0, 0, 0, 1,\n];\nconst Y_UP_TO_Z_UP: Matrix = [\n 1, 0, 0, 0,\n 0, 0, 1, 0,\n 0, -1, 0, 0,\n 0, 0, 0, 1,\n];\nconst Z_UP_TO_Y_UP: Matrix = [\n 1, 0, 0, 0,\n 0, 0, -1, 0,\n 0, 1, 0, 0,\n 0, 0, 0, 1,\n];\nconst EPSILON = 1e-6;\n\nexport function readTileset(\n text: string,\n baseUrl: string,\n): ICETilesetSnapshot {\n let parsed: unknown;\n try {\n parsed = JSON.parse(text);\n } catch {\n throw invalid('tileset JSON is invalid');\n }\n const document = record(parsed);\n if (!document) throw invalid('tileset root must be an object');\n const asset = record(document.asset);\n if (asset?.version !== '1.1') {\n throw unsupported('asset.version must be 1.1');\n }\n const assetId = record(record(asset.extras)?.ice3)?.assetId;\n if (typeof assetId !== 'string' || !assetId.trim()) {\n throw invalid('asset.extras.ice3.assetId is required');\n }\n if (\n Array.isArray(document.extensionsRequired)\n && document.extensionsRequired.length > 0\n ) {\n throw unsupported('required tileset extensions are not supported');\n }\n const root = record(document.root);\n if (!root) throw invalid('root tile is missing');\n const tiles: ICETilesetTile[] = [];\n const ids = new Set<string>();\n const rootTile = parseTile(\n root,\n 'root',\n new URL(baseUrl),\n IDENTITY,\n undefined,\n ids,\n tiles,\n );\n return {\n assetId,\n root: rootTile,\n bounds: rootTile.bounds,\n tiles,\n };\n}\n\nfunction parseTile(\n input: JSONRecord,\n id: string,\n baseUrl: URL,\n parentTransform: Matrix,\n inheritedRefine: 'REPLACE' | undefined,\n ids: Set<string>,\n output: ICETilesetTile[],\n): ICETilesetTile {\n if (ids.has(id)) {\n throw invalid(`duplicate tile id: ${id}`);\n }\n ids.add(id);\n if (input.region !== undefined || record(input.boundingVolume)?.region) {\n throw unsupported('region bounding volumes are not supported');\n }\n if (input.implicitTiling !== undefined) {\n throw unsupported('implicit tiling is not supported');\n }\n if (input.viewerRequestVolume !== undefined) {\n throw unsupported('viewerRequestVolume is not supported');\n }\n if (\n Array.isArray(input.extensionsRequired)\n && input.extensionsRequired.length > 0\n ) {\n throw unsupported('required tile extensions are not supported');\n }\n const localTransform = parseTransform(input.transform);\n const standardTransform = multiplyMatrices(parentTransform, localTransform);\n const bounds = parseBounds(\n record(input.boundingVolume),\n standardTransform,\n );\n const geometricError = input.geometricError;\n if (\n typeof geometricError !== 'number'\n || !Number.isFinite(geometricError)\n || geometricError < 0\n ) {\n throw invalid('geometricError must be a non-negative finite number');\n }\n const refine = input.refine === undefined ? inheritedRefine : input.refine;\n if (refine !== 'REPLACE') {\n throw unsupported('only REPLACE refinement is supported');\n }\n const content = record(input.content);\n if (content?.boundingVolume && record(content.boundingVolume)?.region) {\n throw unsupported('region content bounds are not supported');\n }\n if (content && input.contents !== undefined) {\n throw new Error(\n 'ICE3_TILESET_CONTENTS_INVALID: content and contents cannot both be present',\n );\n }\n const contentUris = input.contents === undefined\n ? content?.uri === undefined\n ? []\n : [resolveContentUri(content.uri, baseUrl)]\n : parseContents(input.contents, baseUrl);\n const contentOutputIndex = output.length;\n const childrenInput = input.children;\n if (\n childrenInput !== undefined\n && (!Array.isArray(childrenInput) || childrenInput.length === 0)\n ) {\n throw invalid('children must be a non-empty array');\n }\n const children = (childrenInput ?? []).map((value, index) => {\n const child = record(value);\n if (!child) throw invalid(`child ${index} must be an object`);\n const parsed = parseTile(\n child,\n `${id}/${index}`,\n baseUrl,\n standardTransform,\n 'REPLACE',\n ids,\n output,\n );\n assertContains(bounds, parsed.bounds, id);\n if (parsed.geometricError > geometricError) {\n throw invalid(`tile ${parsed.id} geometricError exceeds its parent`);\n }\n return parsed;\n });\n if (contentUris.length === 0 && children.length === 0) {\n throw invalid(`tile ${id} has neither content nor children`);\n }\n const engineTransform = multiplyMatrices(\n multiplyMatrices(Z_UP_TO_Y_UP, standardTransform),\n Y_UP_TO_Z_UP,\n );\n const tile: ICETilesetTile = {\n id,\n bounds,\n contentUris,\n ...(contentUris.length === 1 ? { contentUri: contentUris[0]! } : {}),\n children,\n geometricError,\n ...(isIdentity(engineTransform)\n ? {}\n : { transform: [...engineTransform] }),\n };\n if (contentUris.length > 0) output.splice(contentOutputIndex, 0, tile);\n return tile;\n}\n\nfunction parseContents(value: unknown, baseUrl: URL): readonly string[] {\n if (!Array.isArray(value) || value.length === 0) {\n throw new Error('ICE3_TILESET_CONTENTS_INVALID: contents must be non-empty');\n }\n const uris = value.map((entry, index) => {\n const item = record(entry);\n if (!item || item.uri === undefined) {\n throw new Error(\n `ICE3_TILESET_CONTENTS_INVALID: contents[${index}] has no uri`,\n );\n }\n return resolveContentUri(item.uri, baseUrl);\n });\n if (new Set(uris).size !== uris.length) {\n throw new Error('ICE3_TILESET_CONTENTS_INVALID: duplicate content uri');\n }\n return uris;\n}\n\nfunction parseBounds(\n volume: JSONRecord | undefined,\n transform: Matrix,\n): ICEGeometryBounds {\n if (!volume) throw invalid('tile boundingVolume is required');\n const hasBox = volume.box !== undefined;\n const hasSphere = volume.sphere !== undefined;\n if (hasBox === hasSphere) {\n throw unsupported('tile must use exactly one box or sphere');\n }\n if (hasBox) {\n const box = numbers(volume.box, 12);\n if (!box) throw invalid('box must contain 12 finite numbers');\n return transformTilesBounds(box, transform);\n }\n const sphere = numbers(volume.sphere, 4);\n if (!sphere) throw invalid('sphere must contain 4 finite numbers');\n const center = transformPoint(transform, sphere[0]!, sphere[1]!, sphere[2]!);\n const scale = Math.max(\n axisLength(transform, 0),\n axisLength(transform, 1),\n axisLength(transform, 2),\n );\n const radius = sphere[3]! * scale;\n if (!Number.isFinite(radius) || radius < 0) {\n throw invalid('sphere radius is invalid');\n }\n return {\n min: [center[0] - radius, center[1] - radius, center[2] - radius],\n max: [center[0] + radius, center[1] + radius, center[2] + radius],\n };\n}\n\nfunction transformTilesBounds(\n box: readonly number[],\n transform: Matrix,\n): ICEGeometryBounds {\n const center = [box[0]!, box[1]!, box[2]!] as const;\n const axes = [\n [box[3]!, box[4]!, box[5]!] as const,\n [box[6]!, box[7]!, box[8]!] as const,\n [box[9]!, box[10]!, box[11]!] as const,\n ] as const;\n const min: [number, number, number] = [Infinity, Infinity, Infinity];\n const max: [number, number, number] = [-Infinity, -Infinity, -Infinity];\n for (const x of [-1, 1]) {\n for (const y of [-1, 1]) {\n for (const z of [-1, 1]) {\n const tilesPoint = [\n center[0] + axes[0][0] * x + axes[1][0] * y + axes[2][0] * z,\n center[1] + axes[0][1] * x + axes[1][1] * y + axes[2][1] * z,\n center[2] + axes[0][2] * x + axes[1][2] * y + axes[2][2] * z,\n ] as const;\n const transformed = transformPoint(transform, ...tilesPoint);\n const point = [\n transformed[0],\n transformed[2],\n -transformed[1],\n ] as const;\n for (let axis = 0; axis < 3; axis += 1) {\n min[axis] = normalizeZero(Math.min(min[axis]!, point[axis]!));\n max[axis] = normalizeZero(Math.max(max[axis]!, point[axis]!));\n }\n }\n }\n }\n return { min, max };\n}\n\nfunction normalizeZero(value: number): number {\n return value === 0 ? 0 : value;\n}\n\nfunction resolveContentUri(value: unknown, baseUrl: URL): string {\n if (typeof value !== 'string' || !value) {\n throw invalid('content.uri must be a non-empty string');\n }\n if (/^(?:[a-z][a-z0-9+.-]*:|\\/)/i.test(value)) {\n throw unsupported('content.uri must be relative');\n }\n let resolved: URL;\n try {\n resolved = new URL(value, baseUrl);\n } catch {\n throw unsupported('content.uri cannot be resolved');\n }\n const directory = new URL('.', baseUrl);\n if (!resolved.href.startsWith(directory.href)) {\n throw unsupported('content.uri escapes the tileset directory');\n }\n if (!resolved.pathname.toLowerCase().endsWith('.glb')) {\n throw unsupported('content.uri must reference a GLB');\n }\n return resolved.href;\n}\n\nfunction parseTransform(value: unknown): Matrix {\n if (value === undefined) return IDENTITY;\n const matrix = numbers(value, 16);\n if (!matrix) throw invalid('transform must contain 16 finite numbers');\n if (\n Math.abs(matrix[3]!) > EPSILON\n || Math.abs(matrix[7]!) > EPSILON\n || Math.abs(matrix[11]!) > EPSILON\n || Math.abs(matrix[15]! - 1) > EPSILON\n ) {\n throw invalid('transform must be affine');\n }\n return matrix as unknown as Matrix;\n}\n\nfunction assertContains(\n parent: ICEGeometryBounds,\n child: ICEGeometryBounds,\n id: string,\n): void {\n if ([0, 1, 2].some((axis) => (\n child.min[axis]! < parent.min[axis]! - EPSILON\n || child.max[axis]! > parent.max[axis]! + EPSILON\n ))) {\n throw invalid(`child bounds escape parent tile ${id}`);\n }\n}\n\nfunction multiplyMatrices(left: Matrix, right: Matrix): Matrix {\n const output = new Array<number>(16).fill(0);\n for (let column = 0; column < 4; column += 1) {\n for (let row = 0; row < 4; row += 1) {\n for (let index = 0; index < 4; index += 1) {\n const offset = column * 4 + row;\n output[offset] = (output[offset] ?? 0)\n + left[index * 4 + row]! * right[column * 4 + index]!;\n }\n }\n }\n return output as unknown as Matrix;\n}\n\nfunction transformPoint(\n matrix: Matrix,\n x: number,\n y: number,\n z: number,\n): [number, number, number] {\n return [\n matrix[0] * x + matrix[4] * y + matrix[8] * z + matrix[12],\n matrix[1] * x + matrix[5] * y + matrix[9] * z + matrix[13],\n matrix[2] * x + matrix[6] * y + matrix[10] * z + matrix[14],\n ];\n}\n\nfunction axisLength(matrix: Matrix, axis: number): number {\n return Math.hypot(\n matrix[axis * 4]!,\n matrix[axis * 4 + 1]!,\n matrix[axis * 4 + 2]!,\n );\n}\n\nfunction isIdentity(matrix: Matrix): boolean {\n return matrix.every((value, index) => (\n Math.abs(value - IDENTITY[index]!) <= EPSILON\n ));\n}\n\nfunction numbers(value: unknown, length: number): number[] | undefined {\n return Array.isArray(value)\n && value.length === length\n && value.every((item) => typeof item === 'number' && Number.isFinite(item))\n ? value as number[]\n : undefined;\n}\n\nfunction record(value: unknown): JSONRecord | undefined {\n return value && typeof value === 'object' && !Array.isArray(value)\n ? value as JSONRecord\n : undefined;\n}\n\nfunction invalid(message: string): Error {\n return new Error(`ICE3_TILESET_INVALID: ${message}`);\n}\n\nfunction unsupported(message: string): Error {\n return new Error(`ICE3_TILESET_UNSUPPORTED: ${message}`);\n}\n", "import type {\n ICEPreparedAssetSnapshot,\n ICEPreparedContract,\n ICEPreparedStats,\n} from '@ice3/assets';\nimport {\n readPreparedGLB,\n verifyPreparedGLBIntegrity,\n} from '@ice3/assets';\nimport type { ICEGeometryBounds, ICEScene } from '@ice3/core';\nimport type { ICE3 } from '../ICE3.js';\nimport { buildAssetScene } from './ICEAssetSceneBuilder.js';\n\nexport interface ICEAssetLoaderOptions {\n readonly fetch?: typeof globalThis.fetch;\n readonly verifyIntegrity?: boolean;\n}\n\nexport interface ICEAssetLoadOptions {\n readonly signal?: AbortSignal;\n}\n\nexport interface ICEAssetHandle {\n readonly id: string;\n readonly scene: ICEScene;\n readonly bounds: ICEGeometryBounds;\n readonly stats: ICEPreparedStats;\n readonly contract: ICEPreparedContract;\n dispose(): void;\n}\n\nexport class ICEAssetLoader {\n private readonly fetcher: typeof globalThis.fetch;\n private readonly verifyIntegrity: boolean;\n private readonly legacyWarnings = new Set<string>();\n private readonly cache = new Map<string, Promise<{\n readonly bytes: ArrayBuffer;\n readonly snapshot: ICEPreparedAssetSnapshot;\n }>>();\n\n constructor(\n private readonly engine: ICE3,\n options: ICEAssetLoaderOptions = {},\n ) {\n this.fetcher = options.fetch ?? globalThis.fetch.bind(globalThis);\n this.verifyIntegrity = options.verifyIntegrity ?? false;\n }\n\n async load(\n url: string,\n options: ICEAssetLoadOptions = {},\n ): Promise<ICEAssetHandle> {\n assertNotAborted(options.signal);\n let pending = this.cache.get(url);\n if (!pending) {\n pending = this.fetchSnapshot(url);\n this.cache.set(url, pending);\n pending.catch(() => {\n if (this.cache.get(url) === pending) {\n this.cache.delete(url);\n }\n });\n }\n const cached = await awaitWithAbort(pending, options.signal);\n assertNotAborted(options.signal);\n if (\n cached.snapshot.contract.status === 'legacy'\n && !this.legacyWarnings.has(url)\n ) {\n this.legacyWarnings.add(url);\n this.engine.reportDiagnostic(\n 'ICE3_ASSET_CONTRACT_MISSING',\n 'Prepared asset has no collaboration contract; using legacy statistics',\n 'warning',\n );\n }\n if (\n this.verifyIntegrity\n && !await verifyPreparedGLBIntegrity(cached.bytes)\n ) {\n throw new Error('ICE3_ASSET_INTEGRITY_FAILED: BIN digest does not match');\n }\n assertNotAborted(options.signal);\n const built = buildAssetScene(cached.snapshot);\n let disposed = false;\n return {\n id: cached.snapshot.assetId,\n scene: built.scene,\n bounds: built.bounds,\n stats: built.stats,\n contract: cached.snapshot.contract,\n dispose: () => {\n if (disposed) return;\n disposed = true;\n built.scene.dispose();\n this.engine.requestRender('asset-disposed');\n },\n };\n }\n\n clear(url?: string): void {\n if (url === undefined) {\n this.cache.clear();\n this.legacyWarnings.clear();\n return;\n }\n this.cache.delete(url);\n this.legacyWarnings.delete(url);\n }\n\n private async fetchSnapshot(\n url: string,\n ): Promise<{\n readonly bytes: ArrayBuffer;\n readonly snapshot: ICEPreparedAssetSnapshot;\n }> {\n let response: Response;\n try {\n response = await this.fetcher(url);\n } catch (error) {\n throw new Error(\n `ICE3_ASSET_FETCH_FAILED: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n if (!response.ok) {\n throw new Error(`ICE3_ASSET_FETCH_FAILED: HTTP ${response.status}`);\n }\n const bytes = await response.arrayBuffer();\n const snapshot = readPreparedGLB(bytes);\n return { bytes, snapshot };\n }\n}\n\nfunction assertNotAborted(signal?: AbortSignal): void {\n if (signal?.aborted) {\n throw abortedError();\n }\n}\n\nasync function awaitWithAbort<T>(\n promise: Promise<T>,\n signal?: AbortSignal,\n): Promise<T> {\n if (!signal) return promise;\n assertNotAborted(signal);\n return new Promise<T>((resolve, reject) => {\n const abort = (): void => reject(abortedError());\n signal.addEventListener('abort', abort, { once: true });\n void promise.then(resolve, reject).finally(() => {\n signal.removeEventListener('abort', abort);\n });\n });\n}\n\nfunction abortedError(): Error {\n return new Error('ICE3_ASSET_ABORTED: asset loading was aborted');\n}\n", "import {\n ICEFrustum,\n type ICEGeometryBounds,\n type ICEPerspectiveCamera,\n} from '@ice3/core';\nimport type { ICETilesetTile } from '@ice3/assets';\nimport type { ICEViewport } from '@ice3/renderer';\n\nexport interface ICETilesetSchedulerOptions {\n readonly maxResidentTiles: number;\n readonly maxResidentBytes: number;\n readonly prefetchMarginRatio: number;\n readonly unloadMarginRatio: number;\n}\n\nexport interface ICETilesetWorkSetInput {\n readonly assetBounds: ICEGeometryBounds;\n readonly tiles: readonly ICETilesetTile[];\n readonly camera: ICEPerspectiveCamera;\n readonly viewport: ICEViewport;\n readonly residentBytes: ReadonlyMap<string, number>;\n}\n\nexport interface ICETilesetWorkSet {\n readonly visible: readonly ICETilesetTile[];\n readonly prefetch: readonly ICETilesetTile[];\n readonly retainIds: ReadonlySet<string>;\n readonly ordered: readonly ICETilesetTile[];\n readonly budgetExceeded: boolean;\n}\n\nexport class ICETilesetScheduler {\n private readonly maxResidentTiles: number;\n private readonly maxResidentBytes: number;\n private readonly prefetchMarginRatio: number;\n private readonly unloadMarginRatio: number;\n\n constructor(options: ICETilesetSchedulerOptions) {\n if (\n !Number.isInteger(options.maxResidentTiles)\n || options.maxResidentTiles < 1\n ) {\n throw new RangeError('ICE maxResidentTiles must be a positive integer');\n }\n if (\n !Number.isFinite(options.maxResidentBytes)\n || options.maxResidentBytes <= 0\n ) {\n throw new RangeError('ICE maxResidentBytes must be positive');\n }\n if (\n !Number.isFinite(options.prefetchMarginRatio)\n || options.prefetchMarginRatio <= 0\n || !Number.isFinite(options.unloadMarginRatio)\n || options.unloadMarginRatio <= options.prefetchMarginRatio\n ) {\n throw new RangeError('ICE tile margin ratios are invalid');\n }\n this.maxResidentTiles = options.maxResidentTiles;\n this.maxResidentBytes = options.maxResidentBytes;\n this.prefetchMarginRatio = options.prefetchMarginRatio;\n this.unloadMarginRatio = options.unloadMarginRatio;\n }\n\n get residentTileLimit(): number {\n return this.maxResidentTiles;\n }\n\n get residentByteLimit(): number {\n return this.maxResidentBytes;\n }\n\n update(input: ICETilesetWorkSetInput): ICETilesetWorkSet {\n const aspect = input.viewport.width / Math.max(1, input.viewport.height);\n const viewProjection = input.camera.getViewProjectionMatrix(aspect);\n const strict = ICEFrustum.fromViewProjection(viewProjection);\n const prefetchFrustum = ICEFrustum.fromViewProjection(viewProjection);\n const unloadFrustum = ICEFrustum.fromViewProjection(viewProjection);\n const sceneRadius = Math.hypot(\n input.assetBounds.max[0] - input.assetBounds.min[0],\n input.assetBounds.max[1] - input.assetBounds.min[1],\n input.assetBounds.max[2] - input.assetBounds.min[2],\n ) / 2;\n const prefetchMargin = sceneRadius * this.prefetchMarginRatio;\n const unloadMargin = sceneRadius * this.unloadMarginRatio;\n const eye = input.camera.getPosition().toArray();\n const visible = input.tiles.filter((entry) => (\n strict.intersectsBounds(entry.bounds)\n ));\n const visibleIds = new Set(visible.map((entry) => entry.id));\n const prefetch = input.tiles.filter((entry) => (\n !visibleIds.has(entry.id)\n && prefetchFrustum.intersectsBounds(entry.bounds, prefetchMargin)\n ));\n const retainIds = new Set(\n input.tiles\n .filter((entry) => unloadFrustum.intersectsBounds(\n entry.bounds,\n unloadMargin,\n ))\n .map((entry) => entry.id),\n );\n const rank = new Map(\n visible.map((entry) => [entry.id, 0] as const),\n );\n const byPriority = (left: ICETilesetTile, right: ICETilesetTile): number => (\n (rank.get(left.id) ?? 1) - (rank.get(right.id) ?? 1)\n || distance(left, eye) - distance(right, eye)\n || left.id.localeCompare(right.id, 'en')\n );\n visible.sort(byPriority);\n prefetch.sort(byPriority);\n const byteTotal = [...input.residentBytes.values()].reduce(\n (total, bytes) => total + bytes,\n 0,\n );\n return {\n visible: Object.freeze(visible),\n prefetch: Object.freeze(prefetch),\n retainIds,\n ordered: Object.freeze([...visible, ...prefetch]),\n budgetExceeded: input.residentBytes.size > this.maxResidentTiles\n || byteTotal > this.maxResidentBytes,\n };\n }\n}\n\nfunction distance(\n tile: ICETilesetTile,\n eye: readonly number[],\n): number {\n const center = boundsCenter(tile.bounds);\n return Math.hypot(\n center[0] - eye[0]!,\n center[1] - eye[1]!,\n center[2] - eye[2]!,\n );\n}\n\nfunction boundsCenter(\n bounds: ICEGeometryBounds,\n): readonly [number, number, number] {\n return [\n (bounds.min[0] + bounds.max[0]) / 2,\n (bounds.min[1] + bounds.max[1]) / 2,\n (bounds.min[2] + bounds.max[2]) / 2,\n ];\n}\n", "import type { ICETilesetTile } from '@ice3/assets';\nimport {\n ICEFrustum,\n type ICEGeometryBounds,\n type ICEPerspectiveCamera,\n} from '@ice3/core';\nimport type { ICEViewport } from '@ice3/renderer';\n\nexport interface ICELodSelectionInput {\n readonly root: ICETilesetTile;\n readonly camera: ICEPerspectiveCamera;\n readonly viewport: ICEViewport;\n readonly residentIds: ReadonlySet<string>;\n readonly failedIds: ReadonlySet<string>;\n readonly previousTargetIds?: ReadonlySet<string>;\n readonly maxScreenSpaceErrorPixels: number;\n}\n\nexport interface ICELodSelection {\n readonly target: readonly ICETilesetTile[];\n readonly prefetch: readonly ICETilesetTile[];\n readonly fallbackByTargetId: ReadonlyMap<string, string>;\n}\n\nexport class ICELodSelector {\n select(input: ICELodSelectionInput): ICELodSelection {\n if (\n !Number.isFinite(input.maxScreenSpaceErrorPixels)\n || input.maxScreenSpaceErrorPixels <= 0\n ) {\n throw new Error(\n 'ICE3_TILESET_LOD_INVALID: maxScreenSpaceErrorPixels must be positive',\n );\n }\n const aspect = input.viewport.width / Math.max(1, input.viewport.height);\n const frustum = ICEFrustum.fromViewProjection(\n input.camera.getViewProjectionMatrix(aspect),\n );\n const parentByChild = new Map<string, string>();\n const indexParents = (tile: ICETilesetTile): void => {\n for (const child of tile.children) {\n parentByChild.set(child.id, tile.id);\n indexParents(child);\n }\n };\n indexParents(input.root);\n const targets = new Map<string, ICETilesetTile>();\n const fallbackByTargetId = new Map<string, string>();\n const visit = (\n tile: ICETilesetTile,\n nearestContent?: ICETilesetTile,\n ): void => {\n if (!frustum.intersectsBounds(tile.bounds)) return;\n const hasContent = (tile.contentUris?.length ?? 0) > 0\n || Boolean(tile.contentUri);\n const contentAncestor = hasContent ? tile : nearestContent;\n const previouslyRefined = input.previousTargetIds\n ? [...input.previousTargetIds].some((id) => (\n isDescendant(id, tile.id, parentByChild)\n ))\n : false;\n const threshold = input.maxScreenSpaceErrorPixels\n * (previouslyRefined ? LOD_HYSTERESIS_RATIO : 1);\n const shouldRefine = tile.children.length > 0\n && tile.geometricError > 0\n && screenSpaceError(\n tile,\n input.camera,\n input.viewport,\n ) > threshold;\n if (shouldRefine) {\n const before = targets.size;\n for (const child of tile.children) visit(child, contentAncestor);\n if (targets.size === before && hasContent) {\n addTarget(tile, nearestContent);\n }\n return;\n }\n if (hasContent) {\n addTarget(tile, nearestContent);\n return;\n }\n for (const child of tile.children) visit(child, nearestContent);\n };\n const addTarget = (\n tile: ICETilesetTile,\n nearestContent?: ICETilesetTile,\n ): void => {\n if (input.failedIds.has(tile.id) && nearestContent) {\n targets.set(nearestContent.id, nearestContent);\n return;\n }\n targets.set(tile.id, tile);\n if (nearestContent) {\n fallbackByTargetId.set(tile.id, nearestContent.id);\n }\n };\n\n visit(input.root);\n const visibleTargets = collapseNestedTargets(input.root, targets);\n const targetIds = new Set(visibleTargets.keys());\n for (const id of [...fallbackByTargetId.keys()]) {\n if (!targetIds.has(id)) fallbackByTargetId.delete(id);\n }\n const prefetch = new Map<string, ICETilesetTile>();\n const addPrefetch = (tile: ICETilesetTile): void => {\n if (targetIds.has(tile.id) || input.residentIds.has(tile.id)) return;\n prefetch.set(tile.id, tile);\n };\n for (const tile of visibleTargets.values()) {\n for (const child of tile.children) {\n if (child.contentUris?.length > 0 || child.contentUri) {\n addPrefetch(child);\n } else {\n for (const descendant of child.children) {\n if (descendant.contentUris?.length > 0 || descendant.contentUri) {\n addPrefetch(descendant);\n }\n }\n }\n }\n }\n return {\n target: Object.freeze([...visibleTargets.values()]),\n prefetch: Object.freeze(\n [...prefetch.values()].sort((left, right) => (\n left.id.localeCompare(right.id, 'en')\n )),\n ),\n fallbackByTargetId,\n };\n }\n}\n\nconst LOD_HYSTERESIS_RATIO = 0.75;\n\nfunction collapseNestedTargets(\n root: ICETilesetTile,\n targets: ReadonlyMap<string, ICETilesetTile>,\n): Map<string, ICETilesetTile> {\n const visible = new Map<string, ICETilesetTile>();\n const visit = (tile: ICETilesetTile): void => {\n if (targets.has(tile.id)) {\n visible.set(tile.id, tile);\n return;\n }\n for (const child of tile.children) visit(child);\n };\n visit(root);\n return visible;\n}\n\nfunction isDescendant(\n candidateId: string,\n ancestorId: string,\n parentByChild: ReadonlyMap<string, string>,\n): boolean {\n let current = parentByChild.get(candidateId);\n while (current !== undefined) {\n if (current === ancestorId) return true;\n current = parentByChild.get(current);\n }\n return false;\n}\n\nfunction screenSpaceError(\n tile: ICETilesetTile,\n camera: ICEPerspectiveCamera,\n viewport: ICEViewport,\n): number {\n const distance = Math.max(\n camera.near,\n distanceToBounds(camera.getPosition().toArray(), tile.bounds),\n );\n return tile.geometricError * viewport.height / (\n 2 * distance * Math.tan(camera.fov * Math.PI / 360)\n );\n}\n\nfunction distanceToBounds(\n point: readonly number[],\n bounds: ICEGeometryBounds,\n): number {\n const delta = [0, 1, 2].map((axis) => {\n const value = point[axis]!;\n if (value < bounds.min[axis]!) return bounds.min[axis]! - value;\n if (value > bounds.max[axis]!) return value - bounds.max[axis]!;\n return 0;\n });\n return Math.hypot(delta[0]!, delta[1]!, delta[2]!);\n}\n", "import type { ICERenderBatchPlan } from './ICERenderBatchPlan.js';\n\nexport type ICERenderBatchingMode = 'asset' | 'adaptive' | 'off';\n\nexport interface ICERenderBatchingOptions {\n readonly mode: ICERenderBatchingMode;\n readonly maxWorkers?: number;\n readonly idleTaskBudgetMs?: number;\n readonly uploadBytesPerFrame?: number;\n readonly maxExtraGpuBytes?: number;\n}\n\nexport interface ICEAdaptiveBatchRequest {\n readonly cameraMoving: boolean;\n readonly generation: number;\n readonly plan: ICERenderBatchPlan;\n}\n\nexport type ICEAdaptiveBatchExecutionResult =\n | {\n readonly kind: 'completed';\n readonly estimatedBytes: number;\n }\n | {\n readonly kind: 'failed';\n readonly reason: 'worker' | 'upload';\n readonly error: unknown;\n };\n\nexport type ICEAdaptiveBatchRequestResult =\n | { readonly kind: 'disabled' }\n | { readonly kind: 'deferred' }\n | { readonly kind: 'started'; readonly generation: number }\n | {\n readonly kind: 'rejected';\n readonly reason: 'plan' | 'memory' | 'superseded' | 'busy';\n };\n\nexport interface ICEAdaptiveRenderBatchControllerOptions {\n readonly mode: ICERenderBatchingMode;\n readonly activeGeneration: number;\n readonly maxExtraGpuBytes?: number;\n readonly execute: (\n request: ICEAdaptiveBatchRequest,\n ) => Promise<ICEAdaptiveBatchExecutionResult>;\n readonly onDiagnostic?: (\n code: string,\n generation: number,\n message: string,\n ) => void;\n}\n\nexport class ICEAdaptiveRenderBatchController {\n private generation: number;\n private candidateGeneration: number | undefined;\n private readonly mode: ICERenderBatchingMode;\n private readonly maxExtraGpuBytes: number;\n private readonly execute: ICEAdaptiveRenderBatchControllerOptions['execute'];\n private readonly onDiagnostic:\n ICEAdaptiveRenderBatchControllerOptions['onDiagnostic'];\n private readonly emitted = new Set<string>();\n\n constructor(options: ICEAdaptiveRenderBatchControllerOptions) {\n this.mode = options.mode;\n this.generation = options.activeGeneration;\n this.maxExtraGpuBytes = options.maxExtraGpuBytes ?? 256 * 1024 * 1024;\n this.execute = options.execute;\n this.onDiagnostic = options.onDiagnostic;\n }\n\n get activeGeneration(): number {\n return this.generation;\n }\n\n get candidate(): number | undefined {\n return this.candidateGeneration;\n }\n\n request(request: ICEAdaptiveBatchRequest): ICEAdaptiveBatchRequestResult {\n if (this.mode !== 'adaptive') return { kind: 'disabled' };\n if (request.cameraMoving) return { kind: 'deferred' };\n if (!request.plan.accepted) {\n return { kind: 'rejected', reason: 'plan' };\n }\n if (request.generation <= this.generation) {\n return { kind: 'rejected', reason: 'superseded' };\n }\n if (this.candidateGeneration !== undefined) {\n return { kind: 'rejected', reason: 'busy' };\n }\n if (\n request.plan.estimatedBytes > this.maxExtraGpuBytes\n || request.plan.estimatedBytes > Number.MAX_SAFE_INTEGER\n ) {\n this.diagnostic(\n 'ICE3_RENDER_BATCH_MEMORY_REJECTED',\n request.generation,\n 'Adaptive render batch generation exceeds the extra GPU memory budget',\n );\n return { kind: 'rejected', reason: 'memory' };\n }\n this.candidateGeneration = request.generation;\n this.diagnostic(\n 'ICE3_RENDER_BATCH_ADAPTIVE_STARTED',\n request.generation,\n 'Adaptive render batch generation started',\n );\n void this.execute(request).then(\n (result) => this.finish(request.generation, result),\n (error: unknown) => this.finish(request.generation, {\n kind: 'failed',\n reason: 'worker',\n error,\n }),\n );\n return { kind: 'started', generation: request.generation };\n }\n\n cancel(generation: number): void {\n if (this.candidateGeneration !== generation) return;\n this.candidateGeneration = undefined;\n this.diagnostic(\n 'ICE3_RENDER_BATCH_ADAPTIVE_CANCELLED',\n generation,\n 'Adaptive render batch generation was cancelled',\n );\n }\n\n cameraMotion(): void {\n if (this.candidateGeneration !== undefined) {\n this.cancel(this.candidateGeneration);\n }\n }\n\n dispose(): void {\n if (this.candidateGeneration !== undefined) {\n const generation = this.candidateGeneration;\n this.candidateGeneration = undefined;\n this.emitted.clear();\n this.diagnostic(\n 'ICE3_RENDER_BATCH_ADAPTIVE_CANCELLED',\n generation,\n 'Adaptive render batch generation was cancelled',\n );\n }\n }\n\n private finish(\n generation: number,\n result: ICEAdaptiveBatchExecutionResult,\n ): void {\n if (this.candidateGeneration !== generation) return;\n this.candidateGeneration = undefined;\n if (result.kind === 'completed') {\n this.generation = generation;\n this.diagnostic(\n 'ICE3_RENDER_BATCH_ADAPTIVE_COMPLETED',\n generation,\n 'Adaptive render batch generation is active',\n );\n return;\n }\n this.diagnostic(\n 'ICE3_RENDER_BATCH_ADAPTIVE_FAILED',\n generation,\n `Adaptive ${result.reason} stage failed: ${\n result.error instanceof Error ? result.error.message : String(result.error)\n }`,\n );\n }\n\n private diagnostic(\n code: string,\n generation: number,\n message: string,\n ): void {\n const key = `${code}:${generation}`;\n if (this.emitted.has(key)) return;\n this.emitted.add(key);\n this.onDiagnostic?.(code, generation, message);\n }\n}\n", "import type { ICEBatchWorkerLike } from './ICEBatchWorkerPool.js';\n\nconst WORKER_SOURCE = String.raw`\nself.addEventListener('message', (event) => {\n const request = event.data;\n try {\n if (!request.sources.length) {\n self.postMessage({ type: 'built', generation: request.generation, batches: [] });\n return;\n }\n const materialKey = request.sources[0].materialKey;\n if (!materialKey || request.sources.some((source) => source.materialKey !== materialKey)) {\n throw new Error('ICE3_RENDER_BATCH_WORKER_INVALID: mixed materials');\n }\n const sources = request.sources.map((source) => ({\n id: source.id,\n positions: new Float32Array(source.positions),\n indices: new Uint32Array(source.indices),\n semanticIndices: new Uint32Array(source.semanticIndices),\n semanticIds: source.semanticIds,\n semanticNodeIds: source.semanticNodeIds,\n semanticSelectionIds: source.semanticSelectionIds,\n })).sort((left, right) => left.id.localeCompare(right.id, 'en'));\n const ids = new Set();\n const semanticIds = [];\n const semanticNodeIds = [];\n const semanticSelectionIds = [];\n const semanticBySelectionId = new Map();\n for (const source of sources) {\n if (ids.has(source.id)) throw new Error('ICE3_RENDER_BATCH_WORKER_INVALID: duplicate source');\n ids.add(source.id);\n if (\n source.positions.byteLength % 12 !== 0 ||\n source.indices.byteLength % 12 !== 0 ||\n source.semanticIndices.byteLength !== source.positions.byteLength / 3 ||\n source.semanticIds.length !== source.semanticNodeIds.length ||\n source.semanticIds.length !== source.semanticSelectionIds.length\n ) throw new Error('ICE3_RENDER_BATCH_WORKER_INVALID: source lengths');\n const vertexCount = source.positions.length / 3;\n for (const index of source.indices) if (index >= vertexCount) {\n throw new Error('ICE3_RENDER_BATCH_WORKER_INVALID: source index');\n }\n source.remap = new Uint32Array(source.semanticSelectionIds.length);\n for (let index = 0; index < source.remap.length; index += 1) {\n const selectionId = source.semanticSelectionIds[index];\n let target = semanticBySelectionId.get(selectionId);\n if (target === undefined) {\n target = semanticIds.length;\n semanticBySelectionId.set(selectionId, target);\n semanticIds.push(source.semanticIds[index]);\n semanticNodeIds.push(source.semanticNodeIds[index]);\n semanticSelectionIds.push(selectionId);\n }\n source.remap[index] = target;\n }\n for (const semantic of source.semanticIndices) {\n if (semantic >= source.semanticIds.length) {\n throw new Error('ICE3_RENDER_BATCH_WORKER_INVALID: semantic index');\n }\n }\n }\n const maxTriangles = request.maxTrianglesPerBatch;\n if (!Number.isInteger(maxTriangles) || maxTriangles < 1) {\n throw new Error('ICE3_RENDER_BATCH_WORKER_INVALID: triangle limit');\n }\n const maxBytes = request.maxBytesPerBatch;\n if (!Number.isInteger(maxBytes) || maxBytes < 28) {\n throw new Error('ICE3_RENDER_BATCH_WORKER_INVALID: byte limit');\n }\n const batches = [];\n let positions = [], indices = [], semantics = [], count = 0;\n const min = [Infinity, Infinity, Infinity], max = [-Infinity, -Infinity, -Infinity];\n const finish = () => {\n if (count === 0) return;\n batches.push({\n id: 'adaptive:' + materialKey + ':' + batches.length,\n materialKey,\n positions: new Float32Array(positions).buffer,\n indices: new Uint32Array(indices).buffer,\n semanticIndices: new Uint32Array(semantics).buffer,\n semanticIds,\n semanticNodeIds,\n semanticSelectionIds,\n bounds: { min: [...min], max: [...max] },\n triangleCount: count,\n });\n positions = []; indices = []; semantics = []; count = 0;\n min[0] = min[1] = min[2] = Infinity;\n max[0] = max[1] = max[2] = -Infinity;\n };\n for (const source of sources) {\n for (let offset = 0; offset < source.indices.length; offset += 3) {\n if (count > 0 && (count + 1 > maxTriangles || count * 28 + 28 > maxBytes)) finish();\n for (let corner = offset; corner < offset + 3; corner += 1) {\n const vertex = source.indices[corner];\n indices.push(positions.length / 3);\n const x = source.positions[vertex * 3];\n const y = source.positions[vertex * 3 + 1];\n const z = source.positions[vertex * 3 + 2];\n positions.push(x, y, z);\n semantics.push(source.remap[source.semanticIndices[vertex]]);\n min[0] = Math.min(min[0], x); min[1] = Math.min(min[1], y); min[2] = Math.min(min[2], z);\n max[0] = Math.max(max[0], x); max[1] = Math.max(max[1], y); max[2] = Math.max(max[2], z);\n }\n count += 1;\n }\n }\n finish();\n const transfer = [...new Set(batches.flatMap((batch) => [\n batch.positions, batch.indices, batch.semanticIndices,\n ]))];\n self.postMessage({\n type: 'built',\n generation: request.generation,\n batches,\n }, transfer);\n } catch (error) {\n self.postMessage({\n type: 'failed',\n generation: request.generation,\n message: error instanceof Error ? error.message : String(error),\n });\n }\n});\n`;\n\nexport function createBatchWorker(): ICEBatchWorkerLike {\n if (\n typeof Worker === 'undefined'\n || typeof Blob === 'undefined'\n || typeof URL.createObjectURL !== 'function'\n ) {\n throw new Error('ICE3_RENDER_BATCH_WORKER_UNAVAILABLE: Worker is unavailable');\n }\n const objectUrl = URL.createObjectURL(new Blob(\n [WORKER_SOURCE],\n { type: 'text/javascript' },\n ));\n try {\n const worker = new Worker(objectUrl);\n return {\n postMessage: (message, transfer) => {\n if (transfer) {\n worker.postMessage(message, transfer as Transferable[]);\n } else {\n worker.postMessage(message);\n }\n },\n addEventListener: (type, listener) => {\n worker.addEventListener(type, listener as EventListener);\n },\n removeEventListener: (type, listener) => {\n worker.removeEventListener(type, listener as EventListener);\n },\n terminate: () => {\n worker.terminate();\n URL.revokeObjectURL(objectUrl);\n },\n };\n } catch {\n URL.revokeObjectURL(objectUrl);\n throw new Error(\n 'ICE3_RENDER_BATCH_WORKER_UNAVAILABLE: Worker startup failed',\n );\n }\n}\n", "import { createBatchWorker } from './createBatchWorker.js';\nimport type {\n ICEBatchWorkerRequest,\n ICEBatchWorkerResponse,\n} from './ICEBatchWorkerProtocol.js';\n\nexport interface ICEBatchWorkerLike {\n postMessage(message: unknown, transfer?: readonly Transferable[]): void;\n addEventListener(\n type: string,\n listener: (event: MessageEvent | ErrorEvent) => void,\n ): void;\n removeEventListener(\n type: string,\n listener: (event: MessageEvent | ErrorEvent) => void,\n ): void;\n terminate(): void;\n}\n\nexport interface ICEBatchWorkerPoolOptions {\n readonly maxWorkers?: number;\n readonly workerFactory?: () => ICEBatchWorkerLike;\n}\n\ninterface WorkerJob {\n readonly id: number;\n readonly request: ICEBatchWorkerRequest;\n readonly signal: AbortSignal;\n readonly resolve: (response: ICEBatchWorkerResponse) => void;\n readonly reject: (error: unknown) => void;\n readonly abort: () => void;\n settled: boolean;\n worker?: ICEBatchWorkerLike;\n}\n\nexport class ICEBatchWorkerPool {\n private readonly maxWorkers: number;\n private readonly workerFactory: () => ICEBatchWorkerLike;\n private readonly queue: WorkerJob[] = [];\n private readonly active = new Map<number, WorkerJob>();\n private disposed = false;\n private nextJobId = 1;\n\n constructor(options: ICEBatchWorkerPoolOptions = {}) {\n const requested = options.maxWorkers ?? defaultConcurrency();\n this.maxWorkers = Number.isInteger(requested) && requested > 0\n ? requested\n : 1;\n this.workerFactory = options.workerFactory ?? createBatchWorker;\n }\n\n run(\n request: ICEBatchWorkerRequest,\n signal: AbortSignal,\n ): Promise<ICEBatchWorkerResponse> {\n if (this.disposed) {\n return Promise.resolve(failed(\n request.generation,\n 'ICE3_RENDER_BATCH_WORKER_UNAVAILABLE: worker pool is disposed',\n ));\n }\n if (signal.aborted) return Promise.reject(abortError());\n return new Promise((resolve, reject) => {\n const job: WorkerJob = {\n id: this.nextJobId,\n request,\n signal,\n resolve,\n reject,\n abort: () => this.cancel(job),\n settled: false,\n };\n this.nextJobId += 1;\n signal.addEventListener('abort', job.abort, { once: true });\n this.queue.push(job);\n this.pump();\n });\n }\n\n dispose(): void {\n if (this.disposed) return;\n this.disposed = true;\n for (const job of [...this.queue, ...this.active.values()]) {\n if (job.settled) continue;\n job.settled = true;\n job.signal.removeEventListener('abort', job.abort);\n job.worker?.terminate();\n job.reject(abortError());\n }\n this.queue.length = 0;\n this.active.clear();\n }\n\n private pump(): void {\n while (!this.disposed && this.active.size < this.maxWorkers) {\n const job = this.queue.shift();\n if (!job) return;\n if (job.settled) continue;\n this.start(job);\n }\n }\n\n private start(job: WorkerJob): void {\n let worker: ICEBatchWorkerLike;\n try {\n worker = this.workerFactory();\n } catch (error) {\n this.settle(job, failed(\n job.request.generation,\n `ICE3_RENDER_BATCH_WORKER_UNAVAILABLE: ${\n error instanceof Error ? error.message : String(error)\n }`,\n ));\n return;\n }\n job.worker = worker;\n this.active.set(job.id, job);\n const onMessage = (event: MessageEvent | ErrorEvent): void => {\n const response = (event as MessageEvent).data as\n | ICEBatchWorkerResponse\n | undefined;\n if (\n !response\n || response.generation !== job.request.generation\n ) {\n this.settle(job, failed(\n job.request.generation,\n 'ICE3_RENDER_BATCH_WORKER_FAILED: response generation is invalid',\n ));\n return;\n }\n this.settle(job, response);\n };\n const onError = (event: MessageEvent | ErrorEvent): void => {\n this.settle(job, failed(\n job.request.generation,\n `ICE3_RENDER_BATCH_WORKER_FAILED: ${\n (event as ErrorEvent).message ?? 'worker failed'\n }`,\n ));\n };\n worker.addEventListener('message', onMessage);\n worker.addEventListener('error', onError);\n const transfer = transferList(job.request);\n try {\n worker.postMessage(job.request, transfer);\n } catch (error) {\n worker.removeEventListener('message', onMessage);\n worker.removeEventListener('error', onError);\n this.settle(job, failed(\n job.request.generation,\n `ICE3_RENDER_BATCH_WORKER_FAILED: ${\n error instanceof Error ? error.message : String(error)\n }`,\n ));\n }\n }\n\n private settle(job: WorkerJob, response: ICEBatchWorkerResponse): void {\n if (job.settled) return;\n job.settled = true;\n job.signal.removeEventListener('abort', job.abort);\n job.worker?.terminate();\n const activeJob = this.active.get(job.id);\n if (activeJob === job) this.active.delete(job.id);\n job.resolve(response);\n this.pump();\n }\n\n private cancel(job: WorkerJob): void {\n if (job.settled) return;\n job.settled = true;\n job.signal.removeEventListener('abort', job.abort);\n const queuedIndex = this.queue.indexOf(job);\n if (queuedIndex >= 0) this.queue.splice(queuedIndex, 1);\n job.worker?.terminate();\n const activeJob = this.active.get(job.id);\n if (activeJob === job) this.active.delete(job.id);\n job.reject(abortError());\n this.pump();\n }\n}\n\nfunction transferList(request: ICEBatchWorkerRequest): Transferable[] {\n const buffers = new Set<ArrayBuffer>();\n for (const source of request.sources) {\n buffers.add(source.positions);\n buffers.add(source.indices);\n buffers.add(source.semanticIndices);\n }\n return [...buffers];\n}\n\nfunction failed(\n generation: number,\n message: string,\n): ICEBatchWorkerResponse {\n return { type: 'failed', generation, message };\n}\n\nfunction abortError(): DOMException {\n return new DOMException('Batch worker request was aborted', 'AbortError');\n}\n\nfunction defaultConcurrency(): number {\n return Math.min(\n 4,\n Math.max(\n 1,\n (globalThis.navigator?.hardwareConcurrency ?? 2) - 1,\n ),\n );\n}\n", "import type {\n ICERenderBatchCandidate,\n ICERenderBatchPlan,\n ICERenderBatchPlanInput,\n} from './ICERenderBatchPlan.js';\n\nconst DRAW_GAIN_MS = 0.1;\nconst WORKER_OVERHEAD_MS = 0.25;\nconst COPY_BYTES_PER_MS = 2 * 1024 * 1024;\nconst UPLOAD_BYTES_PER_MS = 1024 * 1024;\nconst MEMORY_BYTES_PER_MS = 64 * 1024 * 1024 / 0.02;\nconst MINIMUM_GAIN_MS = 0.2;\n\ninterface Candidate {\n readonly batch: ICERenderBatchCandidate;\n readonly visibleIndex: number;\n}\n\nexport class ICERenderBatchPlanner {\n plan(input: ICERenderBatchPlanInput): ICERenderBatchPlan {\n if (!validInput(input)) return rejected(input.generation);\n const visible = [...new Set(input.visibleBatchIds)];\n const visibleIndex = new Map(\n visible.map((id, index) => [id, index] as const),\n );\n const byId = new Map<string, ICERenderBatchCandidate>();\n for (const batch of input.batches) {\n if (byId.has(batch.id) || !validCandidate(batch)) {\n return rejected(input.generation);\n }\n byId.set(batch.id, batch);\n }\n const candidates: Candidate[] = [];\n for (const id of visible) {\n const batch = byId.get(id);\n if (batch) candidates.push({ batch, visibleIndex: visibleIndex.get(id)! });\n }\n candidates.sort((left, right) => (\n left.batch.materialKey.localeCompare(right.batch.materialKey, 'en')\n || left.visibleIndex - right.visibleIndex\n || left.batch.byteLength - right.batch.byteLength\n || left.batch.id.localeCompare(right.batch.id, 'en')\n ));\n if (candidates.length < 2) {\n return rejected(input.generation, candidates);\n }\n const sourceBytes = candidates.reduce(\n (total, candidate) => total + candidate.batch.byteLength,\n 0,\n );\n const candidateBytes = candidates.reduce(\n (total, candidate) => total + candidate.batch.triangleCount * 28,\n 0,\n );\n const estimatedBytes = sourceBytes + candidateBytes;\n const drawCallsSaved = candidates.length - new Set(\n candidates.map((candidate) => candidate.batch.materialKey),\n ).size;\n const estimatedGainMs = drawCallsSaved * DRAW_GAIN_MS;\n const estimatedCostMs = WORKER_OVERHEAD_MS\n + estimatedBytes / COPY_BYTES_PER_MS\n + estimatedBytes / UPLOAD_BYTES_PER_MS\n + estimatedBytes / MEMORY_BYTES_PER_MS;\n return {\n generation: input.generation,\n sourceBatchIds: candidates.map((candidate) => candidate.batch.id),\n estimatedDrawCallsSaved: drawCallsSaved,\n estimatedBytes,\n estimatedGainMs,\n estimatedCostMs,\n accepted: drawCallsSaved > 0\n && estimatedBytes <= input.maxExtraGpuBytes\n && estimatedGainMs >= MINIMUM_GAIN_MS\n && estimatedGainMs > estimatedCostMs,\n };\n }\n}\n\nfunction rejected(\n generation: number,\n candidates: readonly Candidate[] = [],\n): ICERenderBatchPlan {\n return {\n generation: Number.isInteger(generation) && generation >= 0\n ? generation\n : 0,\n sourceBatchIds: candidates.map((candidate) => candidate.batch.id),\n estimatedDrawCallsSaved: 0,\n estimatedBytes: 0,\n estimatedGainMs: 0,\n estimatedCostMs: 0,\n accepted: false,\n };\n}\n\nfunction validInput(input: ICERenderBatchPlanInput): boolean {\n return Number.isInteger(input.generation)\n && input.generation >= 0\n && Number.isFinite(input.maxExtraGpuBytes)\n && input.maxExtraGpuBytes >= 0\n && Array.isArray(input.visibleBatchIds)\n && Array.isArray(input.batches);\n}\n\nfunction validCandidate(batch: ICERenderBatchCandidate): boolean {\n return typeof batch.id === 'string'\n && batch.id.length > 0\n && typeof batch.materialKey === 'string'\n && Number.isFinite(batch.triangleCount)\n && batch.triangleCount >= 0\n && Number.isInteger(batch.byteLength)\n && batch.byteLength >= 0;\n}\n", "import {\n ICEBasicMaterial,\n ICEEventDispatcher,\n ICEIndexedGeometry,\n ICEMesh,\n ICENode,\n ICEScene,\n type ICEGeometry,\n type ICEGeometryBounds,\n type ICEMatrix4Tuple,\n type ICEPerspectiveCamera,\n} from '@ice3/core';\nimport {\n queueBatchGeneration,\n type ICEBatchGenerationHandle,\n type ICEBatchUploadBuffer,\n} from '@ice3/renderer';\nimport {\n readTileset,\n type ICETilesetSnapshot,\n type ICETilesetTile,\n} from '@ice3/assets';\nimport type { ICE3 } from '../ICE3.js';\nimport { ICEAssetLoader, type ICEAssetHandle } from './ICEAssetLoader.js';\nimport {\n ICETilesetScheduler,\n type ICETilesetWorkSet,\n} from './ICETilesetScheduler.js';\nimport {\n ICELodSelector,\n type ICELodSelection,\n} from './ICELodSelector.js';\nimport {\n ICEAdaptiveRenderBatchController,\n type ICEAdaptiveBatchExecutionResult,\n type ICEAdaptiveBatchRequest,\n type ICERenderBatchingOptions,\n} from '../batching/ICEAdaptiveRenderBatchController.js';\nimport {\n ICEBatchWorkerPool,\n} from '../batching/ICEBatchWorkerPool.js';\nimport type {\n ICEBatchWorkerOutput,\n ICEBatchWorkerSource,\n} from '../batching/ICEBatchWorkerProtocol.js';\nimport { ICERenderBatchPlanner } from '../batching/ICERenderBatchPlanner.js';\nimport { ICERenderBatch } from './ICERenderBatch.js';\n\nexport type ICETilesetTileState =\n | 'pending'\n | 'loading'\n | 'loaded'\n | 'failed'\n | 'evicted';\n\nexport interface ICETilesetStats {\n readonly total: number;\n readonly pending: number;\n readonly loading: number;\n readonly loaded: number;\n readonly failed: number;\n readonly evicted: number;\n readonly visible: number;\n readonly resident: number;\n readonly residentBytes: number;\n readonly residentContents: number;\n readonly loadingContents: number;\n readonly lod: ICELodStats;\n}\n\nexport interface ICELodStats {\n readonly target: number;\n readonly resident: number;\n readonly coarseResident: number;\n readonly fineResident: number;\n readonly transitioning: number;\n readonly fallback: number;\n readonly maxScreenSpaceErrorPixels: number;\n}\n\nexport interface ICETilesetEvent {\n readonly stats: ICETilesetStats;\n readonly tileId?: string;\n}\n\nexport interface ICETilesetLoaderOptions {\n readonly fetch?: typeof globalThis.fetch;\n readonly camera: ICEPerspectiveCamera;\n readonly maxConcurrentTiles?: number;\n readonly maxResidentTiles?: number;\n readonly maxResidentBytes?: number;\n readonly prefetchMarginRatio?: number;\n readonly unloadMarginRatio?: number;\n readonly maxCommitsPerFrame?: number;\n readonly maxScreenSpaceErrorPixels?: number;\n readonly lodSettleDelayMs?: number;\n readonly renderBatching?: ICERenderBatchingOptions;\n}\n\nexport interface ICETilesetOpenOptions {\n readonly signal?: AbortSignal;\n}\n\nexport class ICETilesetLoader {\n private readonly fetcher: typeof globalThis.fetch;\n private readonly camera: ICEPerspectiveCamera;\n private readonly maxConcurrentTiles: number;\n private readonly maxCommitsPerFrame: number;\n private readonly scheduler: ICETilesetScheduler;\n private readonly maxScreenSpaceErrorPixels: number;\n private readonly lodSettleDelayMs: number;\n private readonly renderBatching: ICERenderBatchingOptions | undefined;\n\n constructor(\n private readonly engine: ICE3,\n options: ICETilesetLoaderOptions,\n ) {\n if (!options.camera) {\n throw new Error(\n 'ICE3_TILESET_CAMERA_REQUIRED: Tileset scheduling requires a camera',\n );\n }\n this.fetcher = options.fetch ?? globalThis.fetch.bind(globalThis);\n this.camera = options.camera;\n this.maxConcurrentTiles = options.maxConcurrentTiles ?? 2;\n this.maxCommitsPerFrame = options.maxCommitsPerFrame ?? 1;\n this.maxScreenSpaceErrorPixels = options.maxScreenSpaceErrorPixels ?? 16;\n this.lodSettleDelayMs = options.lodSettleDelayMs ?? 180;\n this.renderBatching = options.renderBatching;\n if (\n options.renderBatching\n && (\n !['asset', 'adaptive', 'off'].includes(options.renderBatching.mode)\n || (\n options.renderBatching.maxWorkers !== undefined\n && (\n !Number.isInteger(options.renderBatching.maxWorkers)\n || options.renderBatching.maxWorkers < 1\n )\n )\n || (\n options.renderBatching.idleTaskBudgetMs !== undefined\n && (\n !Number.isFinite(options.renderBatching.idleTaskBudgetMs)\n || options.renderBatching.idleTaskBudgetMs < 0\n )\n )\n || (\n options.renderBatching.uploadBytesPerFrame !== undefined\n && (\n !Number.isInteger(options.renderBatching.uploadBytesPerFrame)\n || options.renderBatching.uploadBytesPerFrame < 1\n )\n )\n || (\n options.renderBatching.maxExtraGpuBytes !== undefined\n && (\n !Number.isFinite(options.renderBatching.maxExtraGpuBytes)\n || options.renderBatching.maxExtraGpuBytes < 0\n )\n )\n )\n ) {\n throw new Error(\n 'ICE3_TILESET_INVALID: adaptive batching options are invalid',\n );\n }\n if (\n !Number.isInteger(this.maxConcurrentTiles)\n || this.maxConcurrentTiles < 1\n || !Number.isInteger(this.maxCommitsPerFrame)\n || this.maxCommitsPerFrame < 1\n ) {\n throw new Error(\n 'ICE3_TILESET_INVALID: concurrency and commit limits must be positive integers',\n );\n }\n if (\n !Number.isFinite(this.maxScreenSpaceErrorPixels)\n || this.maxScreenSpaceErrorPixels <= 0\n ) {\n throw new Error(\n 'ICE3_TILESET_LOD_INVALID: maxScreenSpaceErrorPixels must be positive',\n );\n }\n if (\n !Number.isInteger(this.lodSettleDelayMs)\n || this.lodSettleDelayMs < 0\n ) {\n throw new Error(\n 'ICE3_TILESET_LOD_INVALID: lodSettleDelayMs must be a non-negative integer',\n );\n }\n this.scheduler = new ICETilesetScheduler({\n maxResidentTiles: options.maxResidentTiles ?? 64,\n maxResidentBytes: options.maxResidentBytes ?? 805_306_368,\n prefetchMarginRatio: options.prefetchMarginRatio ?? 0.20,\n unloadMarginRatio: options.unloadMarginRatio ?? 1.0,\n });\n }\n\n async open(\n url: string,\n options: ICETilesetOpenOptions = {},\n ): Promise<ICETilesetHandle> {\n throwIfAborted(options.signal);\n const absoluteUrl = typeof globalThis.location === 'undefined'\n ? url\n : new URL(url, globalThis.location.href).href;\n let response: Response;\n try {\n response = await this.fetcher(\n absoluteUrl,\n options.signal ? { signal: options.signal } : {},\n );\n } catch (error) {\n if (options.signal?.aborted) {\n throw abortedTilesetError();\n }\n throw new Error(\n `ICE3_TILESET_INVALID: Tileset request failed: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n if (!response.ok) {\n throw new Error(`ICE3_TILESET_INVALID: HTTP ${response.status}`);\n }\n throwIfAborted(options.signal);\n const text = await response.text();\n throwIfAborted(options.signal);\n const snapshot = readTileset(text, absoluteUrl);\n const handle = new ICETilesetHandle(\n this.engine,\n snapshot,\n this.camera,\n this.scheduler,\n this.fetcher,\n this.maxConcurrentTiles,\n this.maxCommitsPerFrame,\n this.maxScreenSpaceErrorPixels,\n this.lodSettleDelayMs,\n this.renderBatching,\n options.signal,\n );\n handle.start();\n return handle;\n }\n}\n\nexport class ICETilesetHandle extends ICEEventDispatcher {\n readonly scene: ICEScene;\n readonly bounds: ICEGeometryBounds;\n private readonly states = new Map<string, ICETilesetTileState>();\n private readonly tilesById = new Map<string, ICETilesetTile>();\n private readonly resident = new Map<string, ICEResidentTile>();\n private readonly candidates = new Map<string, ICETileCandidate>();\n private readonly activeIds = new Set<string>();\n private readonly prefetchIds = new Set<string>();\n private readonly failedLodFallbacks = new Set<string>();\n private readonly lodAncestorCache = new Map<\n string,\n readonly ICETilesetTile[]\n >();\n private readonly idleWaiters: ICEIdleWaiter[] = [];\n private readonly assetLoader: ICEAssetLoader;\n private readonly lodSelector = new ICELodSelector();\n private readonly abortController = new AbortController();\n private readonly readyPromise: Promise<void>;\n private readonly lodSettleDelayMs: number;\n private requestQueue: ICETilesetTile[] = [];\n private commitQueue: string[] = [];\n private workSet: ICETilesetWorkSet | undefined;\n private residentBytes = 0;\n private activeRequests = 0;\n private resolveReady!: () => void;\n private rejectReady!: (reason: unknown) => void;\n private readySettled = false;\n private started = false;\n private disposed = false;\n private removeCallerAbort: (() => void) | undefined;\n private workSetUpdateScheduled = false;\n private workSetDirty = true;\n private workSetForce = false;\n private lastSignature = '';\n private commitScheduled = false;\n private budgetWarningActive = false;\n private idleEmitted = false;\n private lodSelection: ICELodSelection | undefined;\n private lastLodTarget = '';\n private lastLodFallbacks = '';\n private cameraMoving = false;\n private lodSettleTimer: ReturnType<typeof setTimeout> | undefined;\n private motionFallbackId: string | undefined;\n private readonly adaptiveController: ICEAdaptiveRenderBatchController | undefined;\n private readonly batchWorkerPool: ICEBatchWorkerPool | undefined;\n private readonly adaptivePlanner = new ICERenderBatchPlanner();\n private readonly adaptiveUploadBytesPerFrame: number;\n private readonly adaptiveMaxExtraGpuBytes: number;\n private readonly adaptiveIdleTaskBudgetMs: number;\n private adaptiveAbortController: AbortController | undefined;\n private adaptiveUploadHandle: ICEBatchGenerationHandle | undefined;\n private adaptiveState: ICEAdaptiveSceneState | undefined;\n private adaptivePlanningSignature = '';\n private readonly renderBatchingMode: ICERenderBatchingOptions['mode'];\n private visibleCoverageIds = new Set<string>();\n\n constructor(\n private readonly engine: ICE3,\n private readonly snapshot: ICETilesetSnapshot,\n private readonly camera: ICEPerspectiveCamera,\n private readonly scheduler: ICETilesetScheduler,\n fetch: typeof globalThis.fetch,\n private readonly maxConcurrentTiles: number,\n private readonly maxCommitsPerFrame: number,\n private readonly maxScreenSpaceErrorPixels: number,\n lodSettleDelayMs: number,\n renderBatching: ICERenderBatchingOptions | undefined,\n callerSignal?: AbortSignal,\n ) {\n super();\n this.scene = new ICEScene({ id: `${snapshot.assetId}:scene` });\n this.bounds = snapshot.bounds;\n this.lodSettleDelayMs = lodSettleDelayMs;\n this.renderBatchingMode = renderBatching?.mode ?? 'asset';\n this.adaptiveUploadBytesPerFrame =\n renderBatching?.uploadBytesPerFrame ?? 8 * 1024 * 1024;\n this.adaptiveMaxExtraGpuBytes =\n renderBatching?.maxExtraGpuBytes ?? 256 * 1024 * 1024;\n this.adaptiveIdleTaskBudgetMs =\n renderBatching?.idleTaskBudgetMs ?? 4;\n if (renderBatching?.mode === 'adaptive') {\n this.batchWorkerPool = new ICEBatchWorkerPool({\n ...(renderBatching.maxWorkers === undefined\n ? {}\n : { maxWorkers: renderBatching.maxWorkers }),\n });\n this.adaptiveController = new ICEAdaptiveRenderBatchController({\n mode: 'adaptive',\n activeGeneration: 1,\n maxExtraGpuBytes: this.adaptiveMaxExtraGpuBytes,\n execute: (request) => this.executeAdaptiveBatch(request),\n onDiagnostic: (code, generation, message) => {\n this.engine.reportDiagnostic(\n code,\n `${message} (generation ${generation})`,\n 'info',\n );\n },\n });\n }\n this.assetLoader = new ICEAssetLoader(engine, {\n fetch: (input, init) => fetch(input, {\n ...(init ?? {}),\n signal: this.abortController.signal,\n }),\n });\n for (const tile of snapshot.tiles) {\n this.states.set(tile.id, 'pending');\n this.tilesById.set(tile.id, tile);\n }\n this.readyPromise = new Promise<void>((resolve, reject) => {\n this.resolveReady = resolve;\n this.rejectReady = reject;\n });\n void this.readyPromise.catch(() => {});\n if (callerSignal) {\n if (callerSignal.aborted) this.abort();\n else {\n const abort = (): void => this.abort();\n callerSignal.addEventListener('abort', abort, { once: true });\n this.removeCallerAbort = () => {\n callerSignal.removeEventListener('abort', abort);\n };\n }\n }\n }\n\n get stats(): ICETilesetStats {\n const values = [...this.states.values()];\n const targetTiles = this.lodSelection?.target ?? [];\n const coverageIds = this.lodCoverageIds(targetTiles);\n const residentCut = [...coverageIds].filter((id) => (\n this.resident.has(id)\n )).length;\n const coarseResident = [...this.resident.keys()].filter((id) => (\n (this.tilesById.get(id)?.children.length ?? 0) > 0\n )).length;\n const unavailableTargets = targetTiles.filter((tile) => (\n !this.resident.has(tile.id)\n ));\n const transitioning = this.lodNextTiles(targetTiles).length;\n const fallbacks = new Set([\n ...[...coverageIds].filter((id) => (\n unavailableTargets.some((tile) => (\n this.lodAncestorIds(tile.id).includes(id)\n ))\n )),\n ...this.failedLodFallbacks,\n ]);\n const lod = Object.freeze({\n target: this.lodSelection?.target.length ?? 0,\n resident: residentCut,\n coarseResident,\n fineResident: this.resident.size - coarseResident,\n transitioning,\n fallback: fallbacks.size,\n maxScreenSpaceErrorPixels: this.maxScreenSpaceErrorPixels,\n });\n return Object.freeze({\n total: this.states.size,\n pending: values.filter((value) => value === 'pending').length,\n loading: values.filter((value) => value === 'loading').length,\n loaded: this.resident.size,\n failed: values.filter((value) => value === 'failed').length,\n evicted: values.filter((value) => value === 'evicted').length,\n visible: this.workSet?.visible.length ?? 0,\n resident: this.resident.size,\n residentContents: [...this.resident.values()].reduce(\n (total, tile) => total + tile.contentUris.length,\n 0,\n ),\n loadingContents: [...this.states]\n .filter(([, state]) => state === 'loading')\n .reduce((total, [id]) => (\n total + (this.tilesById.get(id)?.contentUris.length ?? 0)\n ), 0),\n residentBytes: this.residentBytes,\n lod,\n });\n }\n\n get adaptiveStats(): Readonly<{\n mode: ICERenderBatchingOptions['mode'];\n activeGeneration: number;\n candidateGeneration?: number;\n adaptiveBatchCount: number;\n }> {\n const candidate = this.adaptiveController?.candidate;\n return Object.freeze({\n mode: this.renderBatchingMode,\n activeGeneration: this.adaptiveController?.activeGeneration ?? 1,\n ...(candidate === undefined ? {} : { candidateGeneration: candidate }),\n adaptiveBatchCount: this.adaptiveState?.nodes.length ?? 0,\n });\n }\n\n private lodAncestors(tileId: string): readonly ICETilesetTile[] {\n const cached = this.lodAncestorCache.get(tileId);\n if (cached) return cached;\n const search = (\n tile: ICETilesetTile,\n ancestors: readonly ICETilesetTile[],\n ): readonly ICETilesetTile[] | undefined => {\n if (tile.id === tileId) return ancestors;\n const next = tile.contentUris.length > 0\n ? [...ancestors, tile]\n : ancestors;\n for (const child of tile.children) {\n const found = search(child, next);\n if (found) return found;\n }\n return undefined;\n };\n const ancestors = search(this.snapshot.root, []) ?? [];\n this.lodAncestorCache.set(tileId, ancestors);\n return ancestors;\n }\n\n private lodAncestorIds(tileId: string): readonly string[] {\n return this.lodAncestors(tileId).map((tile) => tile.id);\n }\n\n private lodCoverageId(tile: ICETilesetTile | undefined): string | undefined {\n if (!tile) return undefined;\n if (this.resident.has(tile.id)) return tile.id;\n const residentAncestor = [...this.lodAncestors(tile.id)]\n .reverse()\n .find((ancestor) => this.resident.has(ancestor.id));\n return residentAncestor?.id;\n }\n\n private lodCoverageIds(\n targets: readonly ICETilesetTile[],\n ): Set<string> {\n return new Set(\n targets\n .map((tile) => this.lodCoverageId(tile))\n .filter((id): id is string => Boolean(id)),\n );\n }\n\n private lodNextTiles(\n targets: readonly ICETilesetTile[],\n ): ICETilesetTile[] {\n const output = new Map<string, ICETilesetTile>();\n for (const target of targets) {\n if (this.resident.has(target.id)) continue;\n const ancestors = this.lodAncestors(target.id);\n const deepestResident = ancestors.findLastIndex((tile) => (\n this.resident.has(tile.id)\n ));\n const next = [\n ...(deepestResident < 0\n ? ancestors\n : ancestors.slice(deepestResident + 1)),\n target,\n ].find((tile) => this.states.get(tile.id) !== 'failed');\n if (!next) continue;\n if (\n this.residentBudgetReached()\n && this.lodCoverageId(target)\n ) {\n continue;\n }\n output.set(next.id, next);\n }\n return [...output.values()];\n }\n\n private lodUnsettledIds(): string[] {\n const targets = (this.lodSelection?.target ?? []).filter((tile) => (\n !this.resident.has(tile.id)\n && this.states.get(tile.id) !== 'failed'\n ));\n const next = this.lodNextTiles(targets);\n if (next.length === 0) return [];\n return [...new Set([\n ...next.map((tile) => tile.id),\n ...targets.map((tile) => tile.id),\n ])];\n }\n\n private recordLodFailure(tileId: string): void {\n const coverage = this.lodCoverageId(this.tilesById.get(tileId));\n if (coverage && !this.failedLodFallbacks.has(coverage)) {\n this.failedLodFallbacks.add(coverage);\n this.engine.reportDiagnostic(\n 'ICE3_TILESET_LOD_FALLBACK',\n 'Finer Tileset content is unavailable; retaining coarse coverage',\n 'warning',\n );\n }\n }\n\n tileState(tileId: string): ICETilesetTileState | undefined {\n return this.states.get(tileId);\n }\n\n whenReady(): Promise<void> {\n return this.readyPromise;\n }\n\n whenIdle(): Promise<void> {\n const pending = new Set<string>([\n ...this.requestQueue\n .map((tile) => tile.id)\n .filter((id) => !this.prefetchIds.has(id)),\n ...this.commitQueue.filter((id) => !this.prefetchIds.has(id)),\n ...this.lodUnsettledIds(),\n ...[...this.states]\n .filter(([id, state]) => (\n !this.prefetchIds.has(id)\n && (state === 'pending' || state === 'loading')\n ))\n .map(([id]) => id),\n ]);\n if (this.cameraMoving) pending.add('@lod-settle');\n if (pending.size === 0 && !this.workSetUpdateScheduled) {\n return Promise.resolve();\n }\n return new Promise<void>((resolve) => {\n this.idleWaiters.push({ watchedIds: pending, resolve });\n });\n }\n\n dispose(): void {\n if (this.disposed) return;\n this.disposed = true;\n this.cancelAdaptiveCandidate();\n this.restoreAdaptiveScene();\n this.adaptiveController?.dispose();\n this.batchWorkerPool?.dispose();\n this.removeCallerAbort?.();\n this.removeCallerAbort = undefined;\n this.engine.off('AFTER_RENDER', this.handleAfterRender);\n if (this.lodSettleTimer !== undefined) {\n clearTimeout(this.lodSettleTimer);\n this.lodSettleTimer = undefined;\n }\n this.abortController.abort();\n for (const [id, state] of this.states) {\n if (state === 'pending' || state === 'loading') {\n this.states.set(id, 'evicted');\n }\n }\n for (const candidate of this.candidates.values()) {\n candidate.container.dispose();\n for (const uri of candidate.contentUris) this.assetLoader.clear(uri);\n }\n this.candidates.clear();\n if (!this.readySettled) {\n this.readySettled = true;\n this.rejectReady(abortedTilesetError());\n }\n for (const waiter of this.idleWaiters.splice(0)) waiter.resolve();\n for (const resident of this.resident.values()) {\n for (const geometry of resident.geometries) {\n this.engine.releaseRenderBatchGeometry(geometry);\n }\n }\n this.resident.clear();\n this.residentBytes = 0;\n const sceneIds = new Set<string>();\n collectNodeIDs(this.scene, sceneIds);\n if (this.engine.getSelection().some((id) => sceneIds.has(id))) {\n this.engine.setSelection([]);\n }\n this.scene.dispose();\n this.assetLoader.clear();\n this.removeAllListeners();\n }\n\n start(): void {\n if (this.started || this.disposed) return;\n this.started = true;\n this.engine.on('AFTER_RENDER', this.handleAfterRender);\n this.requestWorkSetUpdate();\n }\n\n private readonly handleAfterRender = (): void => {\n this.requestWorkSetUpdate();\n };\n\n private requestWorkSetUpdate(force = false): void {\n if (this.disposed) return;\n this.workSetDirty = true;\n this.workSetForce ||= force;\n if (this.workSetUpdateScheduled) return;\n this.workSetUpdateScheduled = true;\n queueMicrotask(() => {\n this.workSetUpdateScheduled = false;\n if (!this.workSetDirty || this.disposed) return;\n this.workSetDirty = false;\n this.updateWorkSet();\n });\n }\n\n private updateWorkSet(): void {\n if (this.disposed) return;\n const viewport = this.engine.getDiagnostics().viewport;\n const aspect = viewport.width / Math.max(1, viewport.height);\n const viewProjection = this.camera.getViewProjectionMatrix(aspect);\n const signature = [\n viewport.width,\n viewport.height,\n ...viewProjection.elements,\n ].join(':');\n const cameraChanged = this.lastSignature !== ''\n && signature !== this.lastSignature;\n if (signature === this.lastSignature && !this.workSetForce) {\n this.settleIdleWaiters();\n return;\n }\n this.workSetForce = false;\n this.lastSignature = signature;\n if (cameraChanged) this.enterCameraMotion();\n const previousTargetIds = new Set(\n this.lodSelection?.target.map((tile) => tile.id) ?? [],\n );\n const lodSelection = this.lodSelector.select({\n root: this.snapshot.root,\n camera: this.camera,\n viewport,\n residentIds: new Set(this.resident.keys()),\n failedIds: new Set(\n [...this.states]\n .filter(([, state]) => state === 'failed')\n .map(([id]) => id),\n ),\n previousTargetIds,\n maxScreenSpaceErrorPixels: this.maxScreenSpaceErrorPixels,\n });\n this.lodSelection = lodSelection;\n const lodTarget = lodSelection.target.map((tile) => tile.id).join('|');\n if (this.lastLodTarget && lodTarget !== this.lastLodTarget) {\n this.trigger<ICETilesetEvent>('TILESET_LOD_CHANGED', {\n stats: this.stats,\n });\n }\n this.lastLodTarget = lodTarget;\n const fallbacks = [...lodSelection.fallbackByTargetId]\n .map(([targetId, fallbackId]) => `${targetId}:${fallbackId}`)\n .join('|');\n if (fallbacks !== this.lastLodFallbacks) {\n this.trigger<ICETilesetEvent>('TILESET_LOD_FALLBACK', {\n stats: this.stats,\n });\n }\n this.lastLodFallbacks = fallbacks;\n const targetTiles = [...lodSelection.target];\n const coverageTiles = [...this.lodCoverageIds(targetTiles)]\n .map((id) => this.tilesById.get(id))\n .filter((tile): tile is ICETilesetTile => Boolean(tile));\n const nextTiles = this.lodNextTiles(targetTiles);\n const prefetchTiles = this.residentBudgetReached()\n ? []\n : [...lodSelection.prefetch];\n this.prefetchIds.clear();\n for (const tile of prefetchTiles) this.prefetchIds.add(tile.id);\n const candidateMap = new Map<string, ICETilesetTile>();\n for (const tile of [\n ...coverageTiles,\n ...nextTiles,\n ...prefetchTiles,\n ]) {\n candidateMap.set(tile.id, tile);\n }\n for (const id of this.resident.keys()) {\n const tile = this.tilesById.get(id);\n if (tile) candidateMap.set(id, tile);\n }\n const workSet = this.scheduler.update({\n assetBounds: this.bounds,\n tiles: [...candidateMap.values()],\n camera: this.camera,\n viewport,\n residentBytes: new Map(\n [...this.resident].map(([id, tile]) => [id, tile.bytes]),\n ),\n });\n this.workSet = workSet;\n this.idleEmitted = false;\n\n this.promoteReadyVisibleTargets();\n const retainingTransitionCoverage = this.cameraMoving\n || this.hasPendingVisibleTargets();\n if (!retainingTransitionCoverage) {\n for (const id of [...this.resident.keys()]) {\n if (\n !workSet.retainIds.has(id)\n && (\n (this.lodSelection?.target.length ?? 0) === 0\n || id !== this.motionFallbackId\n )\n ) {\n this.unloadTile(id);\n }\n }\n }\n for (const id of [...this.candidates.keys()]) {\n if (!workSet.retainIds.has(id)) this.discardCandidate(id);\n }\n\n if (!retainingTransitionCoverage) this.enforceResidentBudget();\n const desired = [...nextTiles, ...prefetchTiles];\n const desiredIds = new Set(desired.map((tile) => tile.id));\n const pending: ICETilesetTile[] = [];\n for (const tile of this.snapshot.tiles) {\n if (this.activeIds.has(tile.id)) {\n if (this.states.get(tile.id) !== 'failed') {\n this.states.set(\n tile.id,\n desiredIds.has(tile.id) ? 'loading' : 'evicted',\n );\n }\n continue;\n }\n if (\n this.resident.has(tile.id)\n || this.candidates.has(tile.id)\n ) {\n continue;\n }\n if (this.states.get(tile.id) === 'failed') continue;\n if (desiredIds.has(tile.id)) {\n this.states.set(tile.id, 'pending');\n pending.push(tile);\n } else {\n this.states.set(tile.id, 'evicted');\n }\n }\n for (const tileId of this.activeIds) {\n if (\n this.states.get(tileId) !== 'failed'\n && !desiredIds.has(tileId)\n && !workSet.retainIds.has(tileId)\n ) {\n this.states.set(tileId, 'evicted');\n }\n }\n const rank = new Map(\n desired.map((tile, index) => [tile.id, index] as const),\n );\n this.requestQueue = pending.sort((left, right) => (\n (rank.get(left.id) ?? Number.MAX_SAFE_INTEGER)\n - (rank.get(right.id) ?? Number.MAX_SAFE_INTEGER)\n ));\n this.commitQueue.sort((left, right) => (\n (rank.get(left) ?? Number.MAX_SAFE_INTEGER)\n - (rank.get(right) ?? Number.MAX_SAFE_INTEGER)\n ));\n this.pumpRequests();\n this.scheduleCommit();\n this.updateBudgetWarning();\n this.settleIdleWaiters();\n }\n\n private pumpRequests(): void {\n if (this.disposed) return;\n while (\n this.activeRequests < this.maxConcurrentTiles\n && this.requestQueue.length > 0\n ) {\n const tile = this.requestQueue.shift()!;\n if (this.states.get(tile.id) !== 'pending') continue;\n const visible = this.workSet?.visible.some(\n (entry) => entry.id === tile.id,\n ) ?? false;\n if (!visible && this.residentBudgetReached()) {\n this.states.set(tile.id, 'evicted');\n continue;\n }\n this.activeIds.add(tile.id);\n this.activeRequests += 1;\n this.states.set(tile.id, 'loading');\n this.emit('TILESET_TILE_LOADING', tile.id);\n void this.loadTile(tile).finally(() => {\n this.activeIds.delete(tile.id);\n this.activeRequests -= 1;\n this.pumpRequests();\n this.settleIdleWaiters();\n });\n }\n }\n\n private async loadTile(tile: ICETilesetTile): Promise<void> {\n const loadedHandles: ICEAssetHandle[] = [];\n try {\n if (tile.contentUris.length === 0) {\n throw new Error('tile has no content URI');\n }\n const container = new ICENode({\n id: `${this.snapshot.assetId}:tile:${tile.id}`,\n ...(tile.transform\n ? { matrix: tile.transform as ICEMatrix4Tuple }\n : {}),\n });\n let bytes = 0;\n for (const [index, uri] of tile.contentUris.entries()) {\n const loaded = await this.assetLoader.load(uri, {\n signal: this.abortController.signal,\n });\n loadedHandles.push(loaded);\n if (this.disposed || !this.workSet?.retainIds.has(tile.id)) {\n for (const handle of loadedHandles) handle.dispose();\n for (const contentUri of tile.contentUris) {\n this.assetLoader.clear(contentUri);\n }\n container.dispose();\n if (!this.disposed) this.states.set(tile.id, 'evicted');\n return;\n }\n bytes += estimateSceneBytes(loaded.scene);\n const chunk = new ICENode({ id: `${container.id}:content:${index}` });\n for (const child of [...loaded.scene.children]) chunk.addChild(child);\n container.addChild(chunk);\n loaded.dispose();\n }\n this.candidates.set(tile.id, {\n tile,\n container,\n bytes,\n contentUris: tile.contentUris,\n });\n this.commitQueue.push(tile.id);\n this.scheduleCommit();\n this.settleIdleWaiters();\n } catch (error) {\n for (const handle of loadedHandles) handle.dispose();\n for (const uri of tile.contentUris) this.assetLoader.clear(uri);\n if (this.disposed || isAbortError(error)) return;\n if (!this.workSet?.retainIds.has(tile.id)) {\n this.states.set(tile.id, 'evicted');\n return;\n }\n this.states.set(tile.id, 'failed');\n if (this.prefetchIds.has(tile.id)) {\n this.states.set(tile.id, 'evicted');\n return;\n }\n this.engine.reportDiagnostic(\n 'ICE3_TILESET_TILE_FAILED',\n error instanceof Error ? error.message : String(error),\n );\n this.emit('TILESET_TILE_FAILED', tile.id);\n this.recordLodFailure(tile.id);\n this.rejectReadyIfVisibleSetFailed();\n this.requestWorkSetUpdate(true);\n this.settleIdleWaiters();\n }\n }\n\n private scheduleCommit(): void {\n if (\n this.disposed\n || this.commitScheduled\n || this.commitQueue.length === 0\n ) {\n return;\n }\n this.commitScheduled = true;\n requestFrame(() => {\n this.commitScheduled = false;\n if (this.disposed) return;\n this.commitBatch();\n });\n }\n\n private commitBatch(): void {\n let committed = 0;\n while (\n committed < this.maxCommitsPerFrame\n && this.commitQueue.length > 0\n ) {\n const tileId = this.commitQueue.shift()!;\n const candidate = this.candidates.get(tileId);\n if (!candidate) continue;\n this.candidates.delete(tileId);\n if (!this.workSet?.retainIds.has(tileId)) {\n this.discardCandidateRecord(candidate);\n this.states.set(tileId, 'evicted');\n continue;\n }\n const visible = this.workSet.visible.some(\n (tile) => tile.id === tileId,\n );\n if (!visible && !this.canCommitWithinBudget(candidate)) {\n this.discardCandidateRecord(candidate);\n this.states.set(tileId, 'evicted');\n continue;\n }\n committed += 1;\n const preparedGeometries: ICEGeometry[] = [];\n try {\n this.cancelAdaptiveCandidate();\n this.restoreAdaptiveScene();\n if (this.scene.findByID(candidate.container.id)) {\n throw new Error(`ICE3_TILESET_DUPLICATE_ID: ${candidate.container.id}`);\n }\n for (const geometry of collectNodeGeometries(candidate.container)) {\n this.engine.prepareRenderBatchGeometry(geometry);\n preparedGeometries.push(geometry);\n }\n candidate.container.visible = false;\n this.scene.addChild(candidate.container);\n this.resident.set(tileId, {\n tile: candidate.tile,\n container: candidate.container,\n bytes: candidate.bytes,\n contentUris: candidate.contentUris,\n geometries: preparedGeometries,\n });\n this.residentBytes += candidate.bytes;\n this.states.set(tileId, 'loaded');\n this.emit('TILESET_TILE_LOADED', tileId);\n } catch (error) {\n for (const geometry of preparedGeometries) {\n this.engine.releaseRenderBatchGeometry(geometry);\n }\n candidate.container.dispose();\n for (const uri of candidate.contentUris) this.assetLoader.clear(uri);\n this.states.set(tileId, 'failed');\n this.engine.reportDiagnostic(\n 'ICE3_TILESET_TILE_FAILED',\n error instanceof Error ? error.message : String(error),\n );\n this.emit('TILESET_TILE_FAILED', tileId);\n this.rejectReadyIfVisibleSetFailed();\n }\n }\n if (!this.cameraMoving) this.promoteReadyVisibleTargets();\n if (this.lodSelection) this.requestWorkSetUpdate(true);\n if (!this.cameraMoving && !this.hasPendingVisibleTargets()) {\n this.enforceResidentBudget();\n }\n this.updateBudgetWarning();\n this.scheduleCommit();\n this.settleIdleWaiters();\n }\n\n private discardCandidate(tileId: string): void {\n const candidate = this.candidates.get(tileId);\n if (!candidate) return;\n this.candidates.delete(tileId);\n this.commitQueue = this.commitQueue.filter((id) => id !== tileId);\n this.discardCandidateRecord(candidate);\n this.states.set(tileId, 'evicted');\n }\n\n private discardCandidateRecord(candidate: ICETileCandidate): void {\n candidate.container.dispose();\n for (const uri of candidate.contentUris) this.assetLoader.clear(uri);\n }\n\n private unloadTile(tileId: string): void {\n this.cancelAdaptiveCandidate();\n this.restoreAdaptiveScene();\n const record = this.resident.get(tileId);\n if (!record) return;\n this.scene.removeChild(record.container, { dispose: true });\n for (const geometry of record.geometries) {\n this.engine.releaseRenderBatchGeometry(geometry);\n }\n this.resident.delete(tileId);\n this.residentBytes = Math.max(0, this.residentBytes - record.bytes);\n for (const uri of record.contentUris) this.assetLoader.clear(uri);\n this.states.set(tileId, 'evicted');\n this.emit('TILESET_TILE_UNLOADED', tileId);\n const remainingIds = new Set<string>();\n collectNodeAndSelectionIDs(this.scene, remainingIds);\n const selection = this.engine.getSelection();\n if (selection.some((id) => !remainingIds.has(id))) {\n this.engine.setSelection(\n selection.filter((id) => remainingIds.has(id)),\n );\n }\n this.engine.requestRender('tileset-tile-unloaded');\n }\n\n private hasPendingVisibleTargets(): boolean {\n return (this.lodSelection?.target ?? []).some((tile) => (\n !this.resident.has(tile.id)\n ));\n }\n\n private enterCameraMotion(): void {\n this.cancelAdaptiveCandidate();\n this.restoreAdaptiveScene();\n if (this.lodSettleDelayMs === 0) {\n this.cameraMoving = false;\n this.requestWorkSetUpdate(true);\n return;\n }\n if (!this.cameraMoving) {\n this.cameraMoving = true;\n }\n if (this.lodSettleTimer !== undefined) {\n clearTimeout(this.lodSettleTimer);\n }\n this.lodSettleTimer = setTimeout(() => {\n this.lodSettleTimer = undefined;\n if (this.disposed) return;\n this.cameraMoving = false;\n this.requestWorkSetUpdate(true);\n }, this.lodSettleDelayMs);\n }\n\n private promoteReadyVisibleTargets(): void {\n const targets = (this.lodSelection?.target ?? []).filter((target) => (\n !this.cameraMoving\n || ![...this.visibleCoverageIds].some((visibleId) => (\n visibleId === target.id\n || this.lodAncestorIds(target.id).includes(visibleId)\n || this.lodAncestorIds(visibleId).includes(target.id)\n ))\n ));\n const targetIds = this.lodReadyVisibleCoverage(targets);\n for (const tileId of this.visibleCoverageIds) {\n if (\n !this.resident.has(tileId)\n || !this.workSet?.retainIds.has(tileId)\n ) {\n continue;\n }\n const relatedToTarget = [...targetIds].some((id) => (\n id === tileId\n || this.lodAncestorIds(id).includes(tileId)\n ));\n const coveredByTargetAncestor = this.lodAncestorIds(tileId)\n .some((id) => targetIds.has(id));\n if (!relatedToTarget && !coveredByTargetAncestor) {\n targetIds.add(tileId);\n }\n }\n if (targetIds.size === 0) return;\n const fallbackIds = new Set(\n [...(this.lodSelection?.fallbackByTargetId.values() ?? [])]\n .filter((id) => this.resident.has(id)),\n );\n this.motionFallbackId = fallbackIds.values().next().value;\n for (const [tileId, resident] of this.resident) {\n resident.container.visible = targetIds.has(tileId);\n }\n for (const tileId of targetIds) {\n const fallbackId = this.lodSelection?.fallbackByTargetId.get(tileId);\n if (fallbackId) this.failedLodFallbacks.delete(fallbackId);\n }\n this.visibleCoverageIds = targetIds;\n this.reconcileSelectionVisibility();\n this.engine.requestRender('tileset-visible-target-committed');\n if (!this.readySettled) {\n this.readySettled = true;\n this.resolveReady();\n this.trigger<ICETilesetEvent>('TILESET_READY', {\n stats: this.stats,\n });\n }\n }\n\n private lodReadyVisibleCoverage(\n targets: readonly ICETilesetTile[],\n ): Set<string> {\n const exact = new Set<string>();\n const fallback = new Set<string>();\n for (const target of targets) {\n if (this.resident.has(target.id)) {\n exact.add(target.id);\n continue;\n }\n const coverage = this.lodCoverageId(target);\n if (coverage) fallback.add(coverage);\n }\n const visible = new Set<string>();\n for (const id of [...exact, ...fallback]) {\n const tile = this.tilesById.get(id);\n if (!tile) continue;\n const coveredByFallback = this.lodAncestors(id).some((ancestor) => (\n fallback.has(ancestor.id)\n ));\n if (!coveredByFallback) visible.add(id);\n }\n for (const id of [...visible]) {\n const coveredByDescendant = [...visible].some((candidate) => (\n candidate !== id && this.lodAncestorIds(candidate).includes(id)\n ));\n if (coveredByDescendant) visible.delete(id);\n }\n return visible;\n }\n\n private reconcileSelectionVisibility(): void {\n const visibleIds = new Set<string>();\n for (const child of this.scene.children) {\n collectVisibleNodeAndSelectionIDs(child, visibleIds);\n }\n const selection = this.engine.getSelection();\n const visibleSelection = selection.filter((id) => visibleIds.has(id));\n if (visibleSelection.length !== selection.length) {\n this.engine.setSelection(visibleSelection);\n }\n }\n\n private rejectReadyIfVisibleSetFailed(): void {\n if (this.readySettled || !this.workSet) return;\n const visible = this.workSet.visible;\n if (\n visible.length > 0\n && visible.every((tile) => this.states.get(tile.id) === 'failed')\n ) {\n this.readySettled = true;\n this.rejectReady(new Error('All visible Tileset partitions failed'));\n }\n }\n\n private updateBudgetWarning(): void {\n const exceeded = this.residentBudgetExceeded();\n if (exceeded && !this.budgetWarningActive) {\n this.engine.reportDiagnostic(\n 'ICE3_TILESET_RESIDENT_BUDGET_EXCEEDED',\n 'Tileset residency exceeds the soft resident budget',\n 'warning',\n );\n }\n this.budgetWarningActive = exceeded;\n }\n\n private residentBudgetReached(): boolean {\n return this.resident.size >= this.scheduler.residentTileLimit\n || this.residentBytes >= this.scheduler.residentByteLimit;\n }\n\n private residentBudgetExceeded(): boolean {\n return this.resident.size > this.scheduler.residentTileLimit\n || this.residentBytes > this.scheduler.residentByteLimit;\n }\n\n private canCommitWithinBudget(candidate: ICETileCandidate): boolean {\n return this.resident.size < this.scheduler.residentTileLimit\n && this.residentBytes + candidate.bytes\n <= this.scheduler.residentByteLimit;\n }\n\n private enforceResidentBudget(): void {\n if (!this.residentBudgetExceeded()) return;\n const visibleIds = new Set(\n this.workSet?.visible.map((tile) => tile.id) ?? [],\n );\n for (const id of [...this.resident.keys()]) {\n if (!visibleIds.has(id)) this.unloadTile(id);\n }\n for (const id of [...this.candidates.keys()]) {\n if (!visibleIds.has(id)) this.discardCandidate(id);\n }\n }\n\n private maybeStartAdaptiveBatch(): void {\n if (\n !this.adaptiveController\n || this.cameraMoving\n || this.adaptiveState\n || this.adaptivePlanningSignature === this.lastSignature\n ) {\n return;\n }\n const batches = collectAdaptiveSourceBatches(\n this.scene,\n performance.now() + this.adaptiveIdleTaskBudgetMs,\n );\n if (batches.length < 2) return;\n const plan = this.adaptivePlanner.plan({\n generation: this.adaptiveController.activeGeneration + 1,\n visibleBatchIds: batches.map((batch) => batch.id),\n batches: batches.map((batch) => ({\n id: batch.id,\n materialKey: batch.materialKey,\n triangleCount: batch.geometry.indices.length / 3,\n byteLength: geometryByteLength(batch),\n bounds: batch.geometry.getBounds(),\n })),\n maxExtraGpuBytes: this.adaptiveMaxExtraGpuBytes,\n });\n if (!plan.accepted) {\n if (plan.estimatedBytes > this.adaptiveMaxExtraGpuBytes) {\n this.engine.reportDiagnostic(\n 'ICE3_RENDER_BATCH_MEMORY_REJECTED',\n `Adaptive render batch generation exceeds the extra GPU memory budget (generation ${plan.generation})`,\n 'warning',\n );\n }\n return;\n }\n this.adaptivePlanningSignature = this.lastSignature;\n this.adaptiveController.request({\n cameraMoving: this.cameraMoving,\n generation: plan.generation,\n plan,\n });\n }\n\n private async executeAdaptiveBatch(\n request: ICEAdaptiveBatchRequest,\n ): Promise<ICEAdaptiveBatchExecutionResult> {\n if (!this.batchWorkerPool) {\n return {\n kind: 'failed',\n reason: 'worker',\n error: new Error('ICE3_RENDER_BATCH_WORKER_UNAVAILABLE'),\n };\n }\n const sourceById = new Map(\n collectAdaptiveSourceBatches(this.scene).map((batch) => [\n batch.id,\n batch,\n ] as const),\n );\n this.adaptiveAbortController?.abort();\n const controller = new AbortController();\n this.adaptiveAbortController = controller;\n const materialByKey = new Map<string, ICEBasicMaterial>();\n const groups = new Map<string, ICEBatchWorkerSource[]>();\n for (const id of request.plan.sourceBatchIds) {\n const batch = sourceById.get(id);\n if (!batch) continue;\n await yieldMainThread();\n if (controller.signal.aborted) {\n return {\n kind: 'failed',\n reason: 'worker',\n error: new DOMException('Adaptive source staging aborted', 'AbortError'),\n };\n }\n materialByKey.set(batch.materialKey, batch.material);\n const group = groups.get(batch.materialKey) ?? [];\n const source = await workerSource(batch, controller.signal);\n if (controller.signal.aborted) {\n return {\n kind: 'failed',\n reason: 'worker',\n error: new DOMException('Adaptive source staging aborted', 'AbortError'),\n };\n }\n group.push(source);\n groups.set(batch.materialKey, group);\n }\n if (groups.size === 0) {\n return {\n kind: 'failed',\n reason: 'worker',\n error: new Error('ICE3_RENDER_BATCH_ADAPTIVE_EMPTY'),\n };\n }\n let responses;\n try {\n responses = await Promise.all(\n [...groups.values()].map((sources) => this.batchWorkerPool!.run({\n type: 'build',\n generation: request.generation,\n maxTrianglesPerBatch: 500_000,\n maxBytesPerBatch: 32 * 1024 * 1024,\n sources,\n }, controller.signal)),\n );\n } catch (error) {\n if (controller.signal.aborted) {\n return { kind: 'failed', reason: 'worker', error };\n }\n return { kind: 'failed', reason: 'worker', error };\n }\n const failed = responses.find((response) => response.type === 'failed');\n if (failed?.type === 'failed') {\n return {\n kind: 'failed',\n reason: 'worker',\n error: new Error(failed.message),\n };\n }\n const outputs = responses.flatMap((response) => (\n response.type === 'built' ? response.batches : []\n ));\n const uploadBuffers = outputs.map((output) => uploadBuffer(output));\n return new Promise((resolve) => {\n let settled = false;\n const finish = (\n result: ICEAdaptiveBatchExecutionResult,\n ): void => {\n if (settled) return;\n settled = true;\n controller.signal.removeEventListener('abort', abort);\n resolve(result);\n };\n const abort = (): void => {\n this.adaptiveUploadHandle?.cancel();\n finish({\n kind: 'failed',\n reason: 'upload',\n error: new DOMException('Adaptive batch upload aborted', 'AbortError'),\n });\n };\n controller.signal.addEventListener('abort', abort, { once: true });\n this.adaptiveUploadHandle = queueBatchGeneration(uploadBuffers, {\n generation: request.generation,\n bytesPerFrame: this.adaptiveUploadBytesPerFrame,\n isCurrent: () => !controller.signal.aborted,\n upload: (buffer) => {\n const geometry = new ICEIndexedGeometry({\n id: buffer.id,\n positions: buffer.positions,\n indices: buffer.indices,\n semanticIndices: buffer.semanticIndices,\n });\n this.engine.prepareRenderBatchGeometry(geometry);\n return {\n buffer,\n geometry,\n material: materialByKey.get(buffer.materialKey)!,\n };\n },\n release: (resource) => {\n this.engine.releaseRenderBatchGeometry(\n (resource as ICEAdaptiveUploadedResource).geometry,\n );\n },\n onActivate: (_generation, resources) => {\n this.activateAdaptiveScene(\n request.generation,\n request.plan.sourceBatchIds,\n resources as readonly ICEAdaptiveUploadedResource[],\n );\n },\n onUploaded: () => {\n finish({\n kind: 'completed',\n estimatedBytes: request.plan.estimatedBytes,\n });\n },\n onFailed: (_generation, error) => {\n finish({ kind: 'failed', reason: 'upload', error });\n },\n });\n });\n }\n\n private activateAdaptiveScene(\n generation: number,\n sourceIds: readonly string[],\n resources: readonly ICEAdaptiveUploadedResource[],\n ): void {\n this.restoreAdaptiveScene();\n const sourceVisibility = new Map<ICERenderBatch, boolean>();\n const sourceNodes: ICERenderBatch[] = [];\n const adaptiveNodes = resources.map((resource, index) => (\n new ICERenderBatch({\n id: `adaptive:${generation}:${index}`,\n displayName: `adaptive-render-batch-${index}`,\n geometry: resource.geometry,\n material: resource.material,\n semanticIds: resource.buffer.semanticIds,\n semanticNodeIds: resource.buffer.semanticNodeIds,\n semanticSelectionIds: resource.buffer.semanticSelectionIds,\n materialKey: resource.buffer.materialKey,\n })\n ));\n const added: ICERenderBatch[] = [];\n try {\n for (const id of sourceIds) {\n const node = this.scene.findByID(id);\n if (!(node instanceof ICERenderBatch)) continue;\n sourceVisibility.set(node, node.visible);\n sourceNodes.push(node);\n node.visible = false;\n }\n for (const node of adaptiveNodes) {\n this.scene.addChild(node);\n added.push(node);\n }\n this.adaptiveState = {\n generation,\n nodes: adaptiveNodes,\n resources,\n sourceNodes,\n sourceVisibility,\n };\n this.engine.requestRender('adaptive-render-batch-activated');\n } catch (error) {\n for (const node of added) {\n this.scene.removeChild(node, { dispose: true });\n }\n for (const [node, visible] of sourceVisibility) {\n node.visible = visible;\n }\n this.engine.requestRender('adaptive-render-batch-restored');\n throw error;\n }\n }\n\n private restoreAdaptiveScene(): void {\n const state = this.adaptiveState;\n if (!state) return;\n this.adaptiveState = undefined;\n for (const node of state.nodes) {\n if (this.scene.findByID(node.id)) {\n this.scene.removeChild(node, { dispose: true });\n }\n }\n for (const resource of state.resources) {\n this.engine.releaseRenderBatchGeometry(resource.geometry);\n }\n for (const [node, visible] of state.sourceVisibility) {\n node.visible = visible;\n }\n this.engine.requestRender('adaptive-render-batch-restored');\n }\n\n private cancelAdaptiveCandidate(): void {\n this.adaptiveController?.cameraMotion();\n this.adaptiveAbortController?.abort();\n this.adaptivePlanningSignature = '';\n }\n\n private settleIdleWaiters(): void {\n const unsettled = new Set<string>([\n ...this.requestQueue\n .map((tile) => tile.id)\n .filter((id) => !this.prefetchIds.has(id)),\n ...this.commitQueue.filter((id) => !this.prefetchIds.has(id)),\n ...this.lodUnsettledIds(),\n ...[...this.states]\n .filter(([id, state]) => (\n !this.prefetchIds.has(id)\n && (state === 'pending' || state === 'loading')\n ))\n .map(([id]) => id),\n ]);\n if (this.cameraMoving) unsettled.add('@lod-settle');\n for (const waiter of [...this.idleWaiters]) {\n if ([...waiter.watchedIds].every((id) => !unsettled.has(id))) {\n this.idleWaiters.splice(this.idleWaiters.indexOf(waiter), 1);\n waiter.resolve();\n }\n }\n if (\n unsettled.size === 0\n && !this.idleEmitted\n && !this.workSetUpdateScheduled\n ) {\n this.maybeStartAdaptiveBatch();\n this.idleEmitted = true;\n this.trigger<ICETilesetEvent>('TILESET_IDLE', { stats: this.stats });\n }\n }\n\n private abort(): void {\n if (!this.disposed) this.dispose();\n }\n\n private emit(type: string, tileId: string): void {\n this.trigger<ICETilesetEvent>(type, {\n tileId,\n stats: this.stats,\n });\n }\n}\n\ninterface ICEResidentTile {\n readonly tile: ICETilesetTile;\n readonly container: ICENode;\n readonly bytes: number;\n readonly contentUris: readonly string[];\n readonly geometries: readonly ICEGeometry[];\n}\n\ninterface ICEAdaptiveSceneState {\n readonly generation: number;\n readonly nodes: readonly ICERenderBatch[];\n readonly resources: readonly ICEAdaptiveUploadedResource[];\n readonly sourceNodes: readonly ICERenderBatch[];\n readonly sourceVisibility: ReadonlyMap<ICERenderBatch, boolean>;\n}\n\ninterface ICEAdaptiveUploadedResource {\n readonly buffer: ICEBatchUploadBuffer;\n readonly geometry: ICEIndexedGeometry;\n readonly material: ICEBasicMaterial;\n}\n\nfunction collectAdaptiveSourceBatches(\n scene: ICEScene,\n deadline = Infinity,\n): ICERenderBatch[] {\n const output: ICERenderBatch[] = [];\n const visit = (node: ICENode, parentVisible: boolean): void => {\n if (output.length % 256 === 0 && performance.now() > deadline) return;\n const visible = parentVisible && node.visible;\n if (\n visible\n && node instanceof ICERenderBatch\n && !node.geometry.edgeIndices?.length\n && node.geometry.semanticIndices\n ) {\n output.push(node);\n }\n for (const child of node.children) visit(child, visible);\n };\n visit(scene, true);\n return output;\n}\n\nfunction geometryByteLength(batch: ICERenderBatch): number {\n return batch.geometry.positions.byteLength\n + batch.geometry.indices.byteLength\n + (batch.geometry.semanticIndices?.byteLength ?? 0);\n}\n\nasync function workerSource(\n batch: ICERenderBatch,\n signal: AbortSignal,\n): Promise<ICEBatchWorkerSource> {\n const semanticIndices = batch.geometry.semanticIndices!;\n return {\n id: batch.id,\n materialKey: batch.materialKey,\n positions: (\n await copyFloat32(batch.geometry.positions, signal)\n ).buffer as ArrayBuffer,\n indices: (\n await copyUint32(batch.geometry.indices, signal)\n ).buffer as ArrayBuffer,\n semanticIndices: (\n await copyUint32(semanticIndices, signal)\n ).buffer as ArrayBuffer,\n semanticIds: batch.semanticIds,\n semanticNodeIds: batch.semanticNodeIds,\n semanticSelectionIds: batch.semanticSelectionIds,\n };\n}\n\nasync function copyFloat32(\n source: Float32Array,\n signal: AbortSignal,\n): Promise<Float32Array> {\n const target = new Float32Array(source.length);\n for (let offset = 0; offset < source.length; offset += 262_144) {\n target.set(source.subarray(offset, offset + 262_144), offset);\n if (signal.aborted) break;\n await yieldMainThread();\n }\n return target;\n}\n\nasync function copyUint32(\n source: Uint16Array | Uint32Array,\n signal: AbortSignal,\n): Promise<Uint32Array> {\n const target = new Uint32Array(source.length);\n for (let offset = 0; offset < source.length; offset += 262_144) {\n target.set(source.subarray(offset, offset + 262_144), offset);\n if (signal.aborted) break;\n await yieldMainThread();\n }\n return target;\n}\n\nfunction uploadBuffer(\n output: ICEBatchWorkerOutput,\n): ICEBatchUploadBuffer {\n const positions = new Float32Array(output.positions);\n const indices = new Uint32Array(output.indices);\n const semanticIndices = new Uint32Array(output.semanticIndices);\n return {\n id: output.id,\n materialKey: output.materialKey,\n positions,\n indices,\n semanticIndices,\n semanticIds: output.semanticIds,\n semanticNodeIds: output.semanticNodeIds,\n semanticSelectionIds: output.semanticSelectionIds,\n bounds: output.bounds,\n triangleCount: output.triangleCount,\n byteLength: positions.byteLength\n + indices.byteLength\n + semanticIndices.byteLength,\n };\n}\n\nfunction yieldMainThread(): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, 0));\n}\n\ninterface ICETileCandidate extends Omit<\n ICEResidentTile,\n 'tile' | 'geometries'\n> {\n readonly tile: ICETilesetTile;\n}\n\ninterface ICEIdleWaiter {\n readonly watchedIds: ReadonlySet<string>;\n readonly resolve: () => void;\n}\n\nfunction requestFrame(callback: FrameRequestCallback): void {\n if (typeof globalThis.requestAnimationFrame === 'function') {\n globalThis.requestAnimationFrame(callback);\n } else {\n setTimeout(() => callback(performance.now()), 0);\n }\n}\n\nfunction estimateSceneBytes(scene: ICEScene): number {\n let total = 0;\n for (const geometry of collectNodeGeometries(scene)) {\n total += geometry.positions.byteLength;\n total += geometry.indices.byteLength;\n total += geometry.edgeIndices?.byteLength ?? 0;\n total += geometry.colors?.byteLength ?? 0;\n total += geometry.semanticIndices?.byteLength ?? 0;\n }\n return total;\n}\n\nfunction collectNodeGeometries(node: ICENode): ICEGeometry[] {\n const geometries = new Set<ICEGeometry>();\n const visit = (current: ICENode): void => {\n if (current instanceof ICEMesh) geometries.add(current.geometry);\n if (current instanceof ICERenderBatch) geometries.add(current.geometry);\n for (const child of current.children) visit(child);\n };\n visit(node);\n return [...geometries];\n}\n\nfunction collectNodeIDs(node: ICENode, output: Set<string>): void {\n output.add(node.id);\n for (const child of node.children) collectNodeIDs(child, output);\n}\n\nfunction collectNodeAndSelectionIDs(\n node: ICENode,\n output: Set<string>,\n): void {\n output.add(node.id);\n if (node instanceof ICEMesh) output.add(node.selectionId);\n if (node instanceof ICERenderBatch) {\n for (const selectionId of node.semanticSelectionIds) {\n output.add(selectionId);\n }\n }\n for (const child of node.children) {\n collectNodeAndSelectionIDs(child, output);\n }\n}\n\nfunction collectVisibleNodeAndSelectionIDs(\n node: ICENode,\n output: Set<string>,\n): void {\n if (!node.visible) return;\n output.add(node.id);\n if (node instanceof ICEMesh) output.add(node.selectionId);\n if (node instanceof ICERenderBatch) {\n for (const selectionId of node.semanticSelectionIds) {\n output.add(selectionId);\n }\n }\n for (const child of node.children) {\n collectVisibleNodeAndSelectionIDs(child, output);\n }\n}\n\nfunction throwIfAborted(signal?: AbortSignal): void {\n if (signal?.aborted) throw abortedTilesetError();\n}\n\nfunction isAbortError(error: unknown): boolean {\n return error instanceof DOMException && error.name === 'AbortError';\n}\n\nfunction abortedTilesetError(): Error {\n return new Error('ICE3_TILESET_ABORTED: Tileset loading was aborted');\n}\n"],
5
- "mappings": "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",
6
- "names": ["visit", "VERTEX_SOURCE", "FRAGMENT_SOURCE", "index", "sameBytes", "record", "STORAGE_USAGE", "STORAGE_USAGE", "STORAGE_USAGE", "index", "add", "VERTEX_USAGE", "UNIFORM_USAGE", "SELECTION_RGBA", "EDGE_PIXEL_OFFSETS", "encoder", "drawCountPowerOfTwo", "canvas", "context", "image", "normalize", "cross", "visit", "distance", "visit", "distance", "node", "distance", "visit", "assetError", "profile", "nonNegativeInteger", "document", "record", "numbers", "transformPoint", "visit", "distance", "ancestors", "record", "failed", "visit"]
3
+ "sources": ["../../../packages/core/src/math/ICEVector3.ts", "../../../packages/core/src/math/ICEMatrix4.ts", "../../../packages/core/src/event/ICEEvent.ts", "../../../packages/core/src/event/ICEEventDispatcher.ts", "../../../packages/core/src/geometry/ICEBoxGeometry.ts", "../../../packages/core/src/geometry/ICEIndexedGeometry.ts", "../../../packages/core/src/material/ICEBasicMaterial.ts", "../../../packages/core/src/camera/ICEPerspectiveCamera.ts", "../../../packages/core/src/culling/ICEFrustum.ts", "../../../packages/core/src/diagnostics/ICEEngineError.ts", "../../../packages/core/src/scene/ICENode.ts", "../../../packages/core/src/scene/ICEScene.ts", "../../../packages/core/src/scene/ICEMesh.ts", "../../../packages/core/src/types/ICETypeRegistry.ts", "../../../packages/core/src/serialization/serializeScene.ts", "../../../packages/renderer/src/Renderables.ts", "../../../packages/renderer/src/RenderBatch.ts", "../../../packages/renderer/src/WebGL2Program.ts", "../../../packages/renderer/src/InstanceBatch.ts", "../../../packages/renderer/src/WebGL2InstanceBatch.ts", "../../../packages/renderer/src/WebGL2GeometryCache.ts", "../../../packages/renderer/src/WebGL2PickCodec.ts", "../../../packages/renderer/src/WebGL2SemanticProgram.ts", "../../../packages/renderer/src/WebGL2Picker.ts", "../../../packages/renderer/src/WebGL2Shader.ts", "../../../packages/renderer/src/ShadowFrustum.ts", "../../../packages/renderer/src/WebGL2ShadowMap.ts", "../../../packages/renderer/src/SceneBounds.ts", "../../../packages/renderer/src/WebGL2SceneDepth.ts", "../../../packages/renderer/src/WebGL2TextureCache.ts", "../../../packages/renderer/src/WebGL2Uv.ts", "../../../packages/renderer/src/Color.ts", "../../../packages/renderer/src/RendererProfiler.ts", "../../../packages/renderer/src/WebGL2RendererBackend.ts", "../../../packages/renderer/src/WebGPUProbe.ts", "../../../packages/renderer/src/WebGPUResources.ts", "../../../packages/renderer/src/WebGPUGeometryCache.ts", "../../../packages/renderer/src/WebGPUInstanceCache.ts", "../../../packages/renderer/src/WebGPURenderPipeline.ts", "../../../packages/renderer/src/WebGPUTimestampProfiler.ts", "../../../packages/renderer/src/WebGPUSelectionMask.ts", "../../../packages/renderer/src/WebGPUDrawStorage.ts", "../../../packages/renderer/src/WebGPURenderPlan.ts", "../../../packages/renderer/src/WebGPUBundleCache.ts", "../../../packages/renderer/src/WebGPUCapabilities.ts", "../../../packages/renderer/src/WebGPUInstanceStorage.ts", "../../../packages/renderer/src/WebGPUVisibility.ts", "../../../packages/renderer/src/WebGPUPicker.ts", "../../../packages/renderer/src/WebGPURendererBackend.ts", "../../../packages/renderer/src/RendererSelection.ts", "../../../packages/renderer/src/ICEWebGL2BatchGenerationUploader.ts", "../../../packages/runtime/src/layer/ICE2DLayer.ts", "../../../packages/runtime/src/layer/ICE2DLayerRouter.ts", "../../../packages/runtime/src/layer/ICEWorldLayer.ts", "../../../packages/runtime/src/layer/ICEScreenLayer.ts", "../../../packages/runtime/src/layer/ICELabel.ts", "../../../packages/runtime/src/layer/ICE2DCanvasPainter.ts", "../../../packages/runtime/src/input/ICEInputRouter.ts", "../../../packages/runtime/src/input/ICEScenePicker.ts", "../../../packages/runtime/src/input/ICESelectionGesture.ts", "../../../packages/runtime/src/ICEInteractionState.ts", "../../../packages/runtime/src/ICEProjection.ts", "../../../packages/runtime/src/ICERenderScheduler.ts", "../../../packages/runtime/src/query/ICESceneQuery.ts", "../../../packages/runtime/src/ICE3.ts", "../../../packages/runtime/src/input/ICEOrbitController.ts", "../../../packages/runtime/src/asset/ICERenderBatch.ts", "../../../packages/runtime/src/asset/ICEAssetSceneBuilder.ts", "../../../packages/assets/src/ICEProfileValidator.ts", "../../../packages/assets/src/ICEGLBReader.ts", "../../../packages/assets/src/ICEPreviewGeometryPacket.ts", "../../../packages/assets/src/ICETilesetReader.ts", "../../../packages/runtime/src/asset/ICEAssetLoader.ts", "../../../packages/runtime/src/asset/ICETilesetScheduler.ts", "../../../packages/runtime/src/asset/ICELodSelector.ts", "../../../packages/runtime/src/batching/ICEAdaptiveRenderBatchController.ts", "../../../packages/runtime/src/batching/createBatchWorker.ts", "../../../packages/runtime/src/batching/ICEBatchWorkerPool.ts", "../../../packages/runtime/src/batching/ICERenderBatchPlanner.ts", "../../../packages/runtime/src/asset/ICETilesetLoader.ts", "../../../packages/runtime/src/asset/ICEPreviewPacketLoader.ts"],
4
+ "sourcesContent": ["export type ICEVector3Tuple = readonly [number, number, number];\n\nexport class ICEVector3 {\n readonly x: number;\n readonly y: number;\n readonly z: number;\n\n constructor(x = 0, y = 0, z = 0) {\n this.x = x;\n this.y = y;\n this.z = z;\n Object.freeze(this);\n }\n\n clone(): ICEVector3 {\n return new ICEVector3(this.x, this.y, this.z);\n }\n\n toArray(): [number, number, number] {\n return [this.x, this.y, this.z];\n }\n}\n", "import { ICEVector3 } from './ICEVector3.js';\n\nconst dot = (left: ICEVector3, right: ICEVector3): number =>\n left.x * right.x + left.y * right.y + left.z * right.z;\n\nconst cross = (left: ICEVector3, right: ICEVector3): ICEVector3 =>\n new ICEVector3(\n left.y * right.z - left.z * right.y,\n left.z * right.x - left.x * right.z,\n left.x * right.y - left.y * right.x,\n );\n\nconst normalize = (value: ICEVector3): ICEVector3 => {\n const length = Math.hypot(value.x, value.y, value.z);\n if (length === 0) {\n return new ICEVector3();\n }\n return new ICEVector3(value.x / length, value.y / length, value.z / length);\n};\n\nexport class ICEMatrix4 {\n readonly elements = new Float32Array(16);\n\n constructor() {\n this.identity();\n }\n\n identity(): this {\n this.elements.fill(0);\n this.elements[0] = 1;\n this.elements[5] = 1;\n this.elements[10] = 1;\n this.elements[15] = 1;\n return this;\n }\n\n multiply(other: ICEMatrix4): this {\n const left = this.elements.slice();\n const right = other.elements;\n\n for (let column = 0; column < 4; column += 1) {\n for (let row = 0; row < 4; row += 1) {\n let value = 0;\n for (let index = 0; index < 4; index += 1) {\n value += left[index * 4 + row]! * right[column * 4 + index]!;\n }\n this.elements[column * 4 + row] = value;\n }\n }\n return this;\n }\n\n perspective(fovDegrees: number, aspect: number, near: number, far: number): this {\n const f = 1 / Math.tan((fovDegrees * Math.PI) / 360);\n this.elements.fill(0);\n this.elements[0] = f / aspect;\n this.elements[5] = f;\n this.elements[10] = (far + near) / (near - far);\n this.elements[11] = -1;\n this.elements[14] = (2 * far * near) / (near - far);\n return this;\n }\n\n lookAt(eye: ICEVector3, target: ICEVector3, up: ICEVector3): this {\n const zAxis = normalize(\n new ICEVector3(eye.x - target.x, eye.y - target.y, eye.z - target.z),\n );\n const xAxis = normalize(cross(up, zAxis));\n const yAxis = cross(zAxis, xAxis);\n\n this.elements[0] = xAxis.x;\n this.elements[1] = yAxis.x;\n this.elements[2] = zAxis.x;\n this.elements[3] = 0;\n this.elements[4] = xAxis.y;\n this.elements[5] = yAxis.y;\n this.elements[6] = zAxis.y;\n this.elements[7] = 0;\n this.elements[8] = xAxis.z;\n this.elements[9] = yAxis.z;\n this.elements[10] = zAxis.z;\n this.elements[11] = 0;\n this.elements[12] = -dot(xAxis, eye);\n this.elements[13] = -dot(yAxis, eye);\n this.elements[14] = -dot(zAxis, eye);\n this.elements[15] = 1;\n return this;\n }\n\n transformPoint(point: ICEVector3): [number, number, number, number] {\n const elements = this.elements;\n const x = elements[0]! * point.x\n + elements[4]! * point.y\n + elements[8]! * point.z\n + elements[12]!;\n const y = elements[1]! * point.x\n + elements[5]! * point.y\n + elements[9]! * point.z\n + elements[13]!;\n const z = elements[2]! * point.x\n + elements[6]! * point.y\n + elements[10]! * point.z\n + elements[14]!;\n const w = elements[3]! * point.x\n + elements[7]! * point.y\n + elements[11]! * point.z\n + elements[15]!;\n return [x, y, z, w];\n }\n}\n", "export class ICEEvent<T = unknown> {\n constructor(\n readonly type: string,\n readonly target: unknown,\n readonly param?: T,\n ) {}\n}\n", "import { ICEEvent } from './ICEEvent.js';\n\ntype StoredListener = Readonly<{\n listener: (event: ICEEvent<unknown>) => void;\n once: boolean;\n}>;\n\nexport class ICEEventDispatcher {\n private readonly listeners = new Map<string, StoredListener[]>();\n\n on<T>(type: string, listener: (event: ICEEvent<T>) => void): this {\n return this.add(type, listener, false);\n }\n\n once<T>(type: string, listener: (event: ICEEvent<T>) => void): this {\n return this.add(type, listener, true);\n }\n\n off<T>(type: string, listener?: (event: ICEEvent<T>) => void): this {\n if (!listener) {\n this.listeners.delete(type);\n return this;\n }\n\n const current = this.listeners.get(type);\n if (!current) {\n return this;\n }\n\n const next = current.filter((entry) => entry.listener !== listener);\n if (next.length === 0) {\n this.listeners.delete(type);\n } else {\n this.listeners.set(type, next);\n }\n return this;\n }\n\n removeAllListeners(): this {\n this.listeners.clear();\n return this;\n }\n\n trigger<T>(type: string, param?: T): this {\n const current = this.listeners.get(type);\n if (!current) {\n return this;\n }\n\n const event = new ICEEvent(type, this, param);\n for (const entry of [...current]) {\n if (entry.once) {\n const latest = this.listeners.get(type);\n if (latest) {\n const next = latest.filter((candidate) => candidate !== entry);\n if (next.length === 0) {\n this.listeners.delete(type);\n } else {\n this.listeners.set(type, next);\n }\n }\n }\n entry.listener(event as ICEEvent<unknown>);\n }\n return this;\n }\n\n private add<T>(\n type: string,\n listener: (event: ICEEvent<T>) => void,\n once: boolean,\n ): this {\n const current = this.listeners.get(type) ?? [];\n current.push({\n listener: listener as (event: ICEEvent<unknown>) => void,\n once,\n });\n this.listeners.set(type, current);\n return this;\n }\n}\n", "export interface ICEBoxGeometryOptions {\n readonly width: number;\n readonly height: number;\n readonly depth: number;\n}\n\nexport class ICEBoxGeometry implements ICEGeometry {\n readonly typeId = 'ice3:BoxGeometry';\n readonly width: number;\n readonly height: number;\n readonly depth: number;\n readonly positions: Float32Array;\n readonly indices: Uint16Array;\n readonly edgeIndices: Uint16Array;\n\n constructor(options: ICEBoxGeometryOptions) {\n if (options.width <= 0 || options.height <= 0 || options.depth <= 0) {\n throw new RangeError('ICE box dimensions must be positive');\n }\n this.width = options.width;\n this.height = options.height;\n this.depth = options.depth;\n this.positions = scaledPositions(options);\n this.indices = BOX_INDICES;\n this.edgeIndices = BOX_EDGE_INDICES;\n }\n\n getBounds(): ICEGeometryBounds {\n return {\n min: [-this.width / 2, -this.height / 2, -this.depth / 2],\n max: [this.width / 2, this.height / 2, this.depth / 2],\n };\n }\n\n toJSON(): Record<string, unknown> {\n return {\n typeId: this.typeId,\n width: this.width,\n height: this.height,\n depth: this.depth,\n };\n }\n}\n\nfunction scaledPositions(options: ICEBoxGeometryOptions): Float32Array {\n const positions = new Float32Array(BOX_POSITIONS);\n for (let index = 0; index < positions.length; index += 3) {\n positions[index] = positions[index]! * options.width;\n positions[index + 1] = positions[index + 1]! * options.height;\n positions[index + 2] = positions[index + 2]! * options.depth;\n }\n return positions;\n}\nimport type { ICEGeometry, ICEGeometryBounds } from './ICEGeometry.js';\n\nconst BOX_POSITIONS = new Float32Array([\n -0.5, -0.5, 0.5,\n 0.5, -0.5, 0.5,\n 0.5, 0.5, 0.5,\n -0.5, 0.5, 0.5,\n -0.5, -0.5, -0.5,\n 0.5, -0.5, -0.5,\n 0.5, 0.5, -0.5,\n -0.5, 0.5, -0.5,\n]);\n\nconst BOX_INDICES = new Uint16Array([\n 0, 1, 2, 0, 2, 3,\n 5, 4, 7, 5, 7, 6,\n 4, 0, 3, 4, 3, 7,\n 1, 5, 6, 1, 6, 2,\n 3, 2, 6, 3, 6, 7,\n 4, 5, 1, 4, 1, 0,\n]);\n\nconst BOX_EDGE_INDICES = new Uint16Array([\n 0, 1, 1, 2, 2, 3, 3, 0,\n 4, 5, 5, 6, 6, 7, 7, 4,\n 0, 4, 1, 5, 2, 6, 3, 7,\n]);\n", "import type {\n ICEGeometry,\n ICEGeometryBounds,\n ICEGeometryIdentity,\n} from './ICEGeometry.js';\n\nexport interface ICEIndexedGeometryOptions {\n readonly id: string;\n readonly positions: Float32Array;\n readonly indices: Uint16Array | Uint32Array;\n readonly edgeIndices?: Uint16Array | Uint32Array;\n readonly colors?: Float32Array;\n readonly semanticIndices?: Uint32Array;\n readonly identity?: ICEGeometryIdentity;\n}\n\nexport class ICEIndexedGeometry implements ICEGeometry {\n readonly typeId = 'ice3:IndexedGeometry';\n readonly id: string;\n readonly positions: Float32Array;\n readonly indices: Uint16Array | Uint32Array;\n readonly edgeIndices?: Uint16Array | Uint32Array;\n readonly colors?: Float32Array;\n readonly semanticIndices?: Uint32Array;\n readonly identity: ICEGeometryIdentity;\n\n constructor(options: ICEIndexedGeometryOptions) {\n if (!options.id.trim()) {\n throw new TypeError('ICE geometry ID must not be empty');\n }\n if (\n options.positions.length === 0\n || options.positions.length % 3 !== 0\n || options.positions.some((value) => !Number.isFinite(value))\n ) {\n throw new TypeError('ICE indexed geometry positions are invalid');\n }\n const vertexCount = options.positions.length / 3;\n for (const index of options.indices) {\n if (index >= vertexCount) {\n throw new RangeError('ICE indexed geometry index is out of range');\n }\n }\n for (const index of options.edgeIndices ?? []) {\n if (index >= vertexCount) {\n throw new RangeError('ICE indexed geometry edge index is out of range');\n }\n }\n if (options.edgeIndices && options.edgeIndices.length % 2 !== 0) {\n throw new TypeError('ICE edge index count must be even');\n }\n if (\n options.colors\n && options.colors.length !== vertexCount * 3\n && options.colors.length !== vertexCount * 4\n ) {\n throw new TypeError(\n 'ICE color count must be 3 or 4 values per vertex',\n );\n }\n if (\n options.semanticIndices\n && options.semanticIndices.length !== vertexCount\n ) {\n throw new TypeError(\n 'ICE semantic index count must match the vertex count',\n );\n }\n this.id = options.id;\n this.identity = Object.freeze({\n geometryId: options.identity?.geometryId ?? options.id,\n topologyDigest: options.identity?.topologyDigest ?? '',\n attributeDigest: options.identity?.attributeDigest ?? '',\n });\n this.positions = options.positions;\n this.indices = options.indices;\n if (options.edgeIndices) {\n this.edgeIndices = options.edgeIndices;\n }\n if (options.colors) {\n this.colors = options.colors;\n }\n if (options.semanticIndices) {\n this.semanticIndices = options.semanticIndices;\n }\n }\n\n getBounds(): ICEGeometryBounds {\n const min: [number, number, number] = [Infinity, Infinity, Infinity];\n const max: [number, number, number] = [-Infinity, -Infinity, -Infinity];\n for (let index = 0; index < this.positions.length; index += 3) {\n for (let axis = 0; axis < 3; axis += 1) {\n const value = this.positions[index + axis]!;\n min[axis] = Math.min(min[axis]!, value);\n max[axis] = Math.max(max[axis]!, value);\n }\n }\n return { min, max };\n }\n\n toJSON(): Record<string, unknown> {\n return {\n typeId: this.typeId,\n id: this.id,\n positionCount: this.positions.length / 3,\n indexCount: this.indices.length,\n edgeIndexCount: this.edgeIndices?.length ?? 0,\n colorCount: this.colors ? this.positions.length / 3 : 0,\n ...(this.semanticIndices\n ? { semanticIndexCount: this.semanticIndices.length }\n : {}),\n ...(this.identity.topologyDigest || this.identity.attributeDigest\n ? { identity: this.identity }\n : {}),\n bounds: this.getBounds(),\n };\n }\n}\n", "/**\n * Base-colour texture reference.\n *\n * `url` points at an image the renderer loads asynchronously; `scale` tiles it\n * over the metre-based UV projection (`[1,1]` means one texture repeat per metre).\n */\nexport const DEFAULT_ROUGHNESS = 0.85;\n\nexport interface ICEBasicMaterialMap {\n readonly url: string;\n readonly scale?: readonly [number, number];\n}\n\n/**\n * Tangent-space normal map.\n *\n * `strength` multiplies the sampled X/Y perturbation, matching glTF's\n * `normalTexture.scale`; 1 is neutral.\n */\nexport interface ICEBasicMaterialNormalMap {\n readonly url: string;\n readonly strength?: number;\n}\n\n/**\n * Packed occlusion / roughness / metallic map, the glTF ORM layout:\n * R = ambient occlusion, G = roughness, B = metallic.\n *\n * `occlusion` and `metallicRoughness` say which channels the image actually\n * carries \u2014 an exporter may ship only the metallic-roughness half, and using the\n * R channel then would darken surfaces for no reason.\n */\nexport interface ICEBasicMaterialOrmMap {\n readonly url: string;\n readonly scale?: readonly [number, number];\n readonly occlusion?: boolean;\n readonly metallicRoughness?: boolean;\n}\n\nexport interface ICEBasicMaterialOptions {\n readonly color: string;\n readonly edgeColor?: string;\n readonly shading?: 'directional' | 'flat' | 'water';\n readonly map?: ICEBasicMaterialMap;\n readonly normalMap?: ICEBasicMaterialNormalMap;\n readonly ormMap?: ICEBasicMaterialOrmMap;\n /** 0 = dielectric, 1 = metal. Drives the specular tint and strength. */\n readonly metallic?: number;\n /** 0 = mirror-smooth highlight, 1 = broad and dull. */\n readonly roughness?: number;\n /** Linear RGB emitted by the surface, added after lighting. */\n readonly emissive?: readonly [number, number, number];\n}\n\nexport class ICEBasicMaterial {\n readonly typeId = 'ice3:BasicMaterial';\n readonly color: string;\n readonly edgeColor: string | undefined;\n readonly shading: 'directional' | 'flat' | 'water' | undefined;\n readonly map: ICEBasicMaterialMap | undefined;\n readonly normalMap: ICEBasicMaterialNormalMap | undefined;\n readonly ormMap: ICEBasicMaterialOrmMap | undefined;\n readonly metallic: number;\n readonly roughness: number;\n readonly emissive: readonly [number, number, number] | undefined;\n\n constructor(options: ICEBasicMaterialOptions) {\n this.color = options.color;\n this.edgeColor = options.edgeColor;\n this.shading = options.shading;\n this.map = options.map;\n this.normalMap = options.normalMap;\n this.ormMap = options.ormMap;\n this.metallic = options.metallic ?? 0;\n this.roughness = options.roughness ?? DEFAULT_ROUGHNESS;\n this.emissive = options.emissive;\n }\n\n toJSON(): Record<string, unknown> {\n return {\n typeId: this.typeId,\n color: this.color,\n ...(this.edgeColor ? { edgeColor: this.edgeColor } : {}),\n ...(this.shading ? { shading: this.shading } : {}),\n ...(this.map ? { map: this.map } : {}),\n ...(this.normalMap ? { normalMap: this.normalMap } : {}),\n ...(this.ormMap ? { ormMap: this.ormMap } : {}),\n ...(this.metallic !== 0 ? { metallic: this.metallic } : {}),\n ...(this.roughness !== DEFAULT_ROUGHNESS\n ? { roughness: this.roughness }\n : {}),\n ...(this.emissive ? { emissive: this.emissive } : {}),\n };\n }\n}\n", "import { ICEMatrix4 } from '../math/ICEMatrix4.js';\nimport { ICEVector3, type ICEVector3Tuple } from '../math/ICEVector3.js';\n\nexport interface ICEPerspectiveCameraOptions {\n readonly id: string;\n readonly fov: number;\n readonly near: number;\n readonly far: number;\n readonly position: ICEVector3Tuple;\n readonly target?: ICEVector3Tuple;\n}\n\nexport class ICEPerspectiveCamera {\n readonly id: string;\n readonly fov: number;\n near: number;\n far: number;\n\n private eye: ICEVector3;\n private lookTarget: ICEVector3;\n\n constructor(options: ICEPerspectiveCameraOptions) {\n if (options.near <= 0 || options.far <= options.near) {\n throw new RangeError('Camera near/far values are invalid');\n }\n this.id = options.id;\n this.fov = options.fov;\n this.near = options.near;\n this.far = options.far;\n this.eye = new ICEVector3(...options.position);\n this.lookTarget = new ICEVector3(...(options.target ?? [0, 0, 0]));\n }\n\n setPosition(position: ICEVector3Tuple): this {\n this.eye = new ICEVector3(...position);\n return this;\n }\n\n setTarget(target: ICEVector3Tuple): this {\n this.lookTarget = new ICEVector3(...target);\n return this;\n }\n\n setClipPlanes(near: number, far: number): this {\n if (!Number.isFinite(near) || !Number.isFinite(far) || near <= 0 || far <= near) {\n throw new RangeError('Camera near/far values are invalid');\n }\n this.near = near;\n this.far = far;\n return this;\n }\n\n getPosition(): ICEVector3 {\n return this.eye;\n }\n\n getTarget(): ICEVector3 {\n return this.lookTarget;\n }\n\n /**\n * \u6295\u5F71\u77E9\u9635\u3002\u5C4F\u5E55\u7A7A\u95F4\u6548\u679C\u8981\u4ECE\u6DF1\u5EA6\u91CD\u5EFA\u89C6\u7A7A\u95F4\u5750\u6807\uFF0C\u5149\u6709 viewProjection \u4E0D\u591F\u3002\n */\n getProjectionMatrix(aspect: number): ICEMatrix4 {\n return new ICEMatrix4().perspective(this.fov, aspect, this.near, this.far);\n }\n\n getViewMatrix(): ICEMatrix4 {\n return new ICEMatrix4().lookAt(\n this.eye,\n this.lookTarget,\n new ICEVector3(0, 1, 0),\n );\n }\n\n getViewProjectionMatrix(aspect: number): ICEMatrix4 {\n return this.getProjectionMatrix(aspect).multiply(this.getViewMatrix());\n }\n}\n", "import type { ICEGeometryBounds } from '../geometry/ICEGeometry.js';\nimport type { ICEMatrix4 } from '../math/ICEMatrix4.js';\n\ntype Plane = readonly [number, number, number, number];\n\nexport class ICEFrustum {\n private constructor(\n private readonly planes: readonly Plane[],\n ) {}\n\n static fromViewProjection(matrix: ICEMatrix4): ICEFrustum {\n const m = matrix.elements;\n const row0 = [m[0]!, m[4]!, m[8]!, m[12]!] as const;\n const row1 = [m[1]!, m[5]!, m[9]!, m[13]!] as const;\n const row2 = [m[2]!, m[6]!, m[10]!, m[14]!] as const;\n const row3 = [m[3]!, m[7]!, m[11]!, m[15]!] as const;\n return new ICEFrustum([\n normalizePlane(add(row3, row0)),\n normalizePlane(subtract(row3, row0)),\n normalizePlane(add(row3, row1)),\n normalizePlane(subtract(row3, row1)),\n normalizePlane(add(row3, row2)),\n normalizePlane(subtract(row3, row2)),\n ]);\n }\n\n intersectsBounds(bounds: ICEGeometryBounds, margin = 0): boolean {\n const values = [...bounds.min, ...bounds.max];\n if (values.some((value) => !Number.isFinite(value))) {\n throw new TypeError('ICE frustum bounds must be finite');\n }\n if (\n bounds.min.some((value, axis) => value > bounds.max[axis]!)\n || !Number.isFinite(margin)\n || margin < 0\n ) {\n throw new RangeError('ICE frustum bounds or margin are invalid');\n }\n for (const [a, b, c, d] of this.planes) {\n const x = a >= 0 ? bounds.max[0] : bounds.min[0];\n const y = b >= 0 ? bounds.max[1] : bounds.min[1];\n const z = c >= 0 ? bounds.max[2] : bounds.min[2];\n if (a * x + b * y + c * z + d < -margin) {\n return false;\n }\n }\n return true;\n }\n}\n\nfunction add(\n left: readonly number[],\n right: readonly number[],\n): [number, number, number, number] {\n return [\n left[0]! + right[0]!,\n left[1]! + right[1]!,\n left[2]! + right[2]!,\n left[3]! + right[3]!,\n ];\n}\n\nfunction subtract(\n left: readonly number[],\n right: readonly number[],\n): [number, number, number, number] {\n return [\n left[0]! - right[0]!,\n left[1]! - right[1]!,\n left[2]! - right[2]!,\n left[3]! - right[3]!,\n ];\n}\n\nfunction normalizePlane(\n plane: readonly [number, number, number, number],\n): Plane {\n const length = Math.hypot(plane[0], plane[1], plane[2]);\n if (length === 0 || !Number.isFinite(length)) {\n throw new TypeError('ICE frustum matrix produced an invalid plane');\n }\n return [\n plane[0] / length,\n plane[1] / length,\n plane[2] / length,\n plane[3] / length,\n ];\n}\n", "import type { ICEDiagnostic } from './ICEDiagnostic.js';\n\nexport class ICEEngineError extends Error {\n constructor(\n readonly code: string,\n message: string,\n readonly details?: Readonly<Record<string, unknown>>,\n readonly diagnostic?: Readonly<ICEDiagnostic>,\n ) {\n super(message);\n this.name = 'ICEEngineError';\n }\n}\n", "import { ICEEventDispatcher } from '../event/ICEEventDispatcher.js';\nimport { ICEEngineError } from '../diagnostics/ICEEngineError.js';\nimport { ICEMatrix4 } from '../math/ICEMatrix4.js';\nimport { ICEVector3, type ICEVector3Tuple } from '../math/ICEVector3.js';\n\nexport interface ICENodeOptions {\n readonly id: string;\n readonly displayName?: string;\n readonly selectionId?: string;\n readonly metadata?: Readonly<Record<string, unknown>>;\n readonly position?: ICEVector3Tuple;\n readonly rotation?: ICEVector3Tuple;\n readonly scale?: ICEVector3Tuple;\n readonly matrix?: ICEMatrix4Tuple;\n}\n\nexport type ICEMatrix4Tuple = readonly [\n number, number, number, number,\n number, number, number, number,\n number, number, number, number,\n number, number, number, number,\n];\n\nexport interface ICESerializedNode {\n readonly id: string;\n readonly displayName?: string;\n readonly metadata?: Readonly<Record<string, unknown>>;\n readonly typeId: string;\n readonly visible: boolean;\n readonly position: ICEVector3Tuple;\n readonly rotation: ICEVector3Tuple;\n readonly scale: ICEVector3Tuple;\n readonly matrix?: ICEMatrix4Tuple;\n readonly children: readonly ICESerializedNode[];\n readonly [key: string]: unknown;\n}\n\nconst LOCAL_MATRIX = new ICEMatrix4();\n\nexport class ICENode extends ICEEventDispatcher {\n readonly id: string;\n readonly displayName: string;\n readonly selectionId?: string;\n readonly metadata?: Readonly<Record<string, unknown>>;\n readonly position: ICEVector3;\n readonly rotation: ICEVector3;\n readonly scale: ICEVector3;\n\n private _parent: ICENode | null = null;\n private readonly _children: ICENode[] = [];\n private readonly worldMatrix = new ICEMatrix4();\n private localMatrixOverride: Float32Array | null = null;\n private _visible = true;\n private _revision = 0;\n\n constructor(options: ICENodeOptions) {\n super();\n if (!options.id.trim()) {\n throw new TypeError('ICE node ID must not be empty');\n }\n this.id = options.id;\n this.displayName = options.displayName?.trim() || options.id;\n const selectionId = options.selectionId?.trim();\n if (selectionId) this.selectionId = selectionId;\n if (options.metadata && Object.keys(options.metadata).length > 0) {\n this.metadata = Object.freeze({ ...options.metadata });\n }\n this.position = new ICEVector3(...(options.position ?? [0, 0, 0]));\n this.rotation = new ICEVector3(...(options.rotation ?? [0, 0, 0]));\n this.scale = new ICEVector3(...(options.scale ?? [1, 1, 1]));\n if (options.matrix) {\n this.setLocalMatrix(options.matrix);\n }\n }\n\n get typeId(): string {\n return 'ice3:Node';\n }\n\n get visible(): boolean {\n return this._visible;\n }\n\n set visible(value: boolean) {\n if (value === this._visible) return;\n this._visible = value;\n this.markSceneChanged();\n }\n\n get revision(): number {\n return this.getRoot()._revision;\n }\n\n get parent(): ICENode | null {\n return this._parent;\n }\n\n get children(): readonly ICENode[] {\n return this._children;\n }\n\n addChild(node: ICENode): this {\n if (node === this || node.isAncestorOf(this)) {\n throw new ICEEngineError('ICE3_SCENE_CYCLE', 'ICE scene cycle is not allowed');\n }\n\n const root = this.getRoot();\n for (const id of collectIDs(node)) {\n const duplicate = root.findByID(id);\n if (duplicate && duplicate !== node.findByID(id)) {\n throw new ICEEngineError(\n 'ICE3_DUPLICATE_OBJECT_ID',\n `Duplicate ICE node ID: ${id}`,\n { id },\n );\n }\n }\n\n if (node._parent) {\n node._parent.removeChild(node, { dispose: false });\n }\n node._parent = this;\n this._children.push(node);\n this.markSceneChanged();\n return this;\n }\n\n removeChild(node: ICENode, options?: { readonly dispose?: boolean }): this {\n const index = this._children.indexOf(node);\n if (index < 0) {\n return this;\n }\n this._children.splice(index, 1);\n node._parent = null;\n this.markSceneChanged();\n if (options?.dispose) {\n node.dispose();\n }\n return this;\n }\n\n findByID(id: string): ICENode | undefined {\n if (this.id === id) {\n return this;\n }\n for (const child of this._children) {\n const found = child.findByID(id);\n if (found) {\n return found;\n }\n }\n return undefined;\n }\n\n updateWorldMatrix(parentMatrix?: ICEMatrix4): ICEMatrix4 {\n const parent = parentMatrix\n ?? this._parent?.updateWorldMatrix()\n ?? new ICEMatrix4().identity();\n\n const local = this.localMatrix(LOCAL_MATRIX);\n this.worldMatrix.elements.set(parent.elements);\n this.worldMatrix.multiply(local);\n return this.worldMatrix;\n }\n\n getWorldPosition(): ICEVector3 {\n const matrix = this.updateWorldMatrix();\n return new ICEVector3(matrix.elements[12]!, matrix.elements[13]!, matrix.elements[14]!);\n }\n\n setLocalMatrix(matrix: ICEMatrix4Tuple): this {\n if (matrix.length !== 16 || matrix.some((value) => !Number.isFinite(value))) {\n throw new TypeError('ICE local matrix must contain 16 finite values');\n }\n this.localMatrixOverride = new Float32Array(matrix);\n this.markSceneChanged();\n return this;\n }\n\n clearLocalMatrix(): this {\n if (this.localMatrixOverride === null) return this;\n this.localMatrixOverride = null;\n this.markSceneChanged();\n return this;\n }\n\n toJSON(): ICESerializedNode {\n return {\n id: this.id,\n displayName: this.displayName,\n ...(this.metadata ? { metadata: this.metadata } : {}),\n typeId: this.typeId,\n ...(this.selectionId ? { selectionId: this.selectionId } : {}),\n visible: this.visible,\n position: this.position.toArray(),\n rotation: this.rotation.toArray(),\n scale: this.scale.toArray(),\n ...(this.localMatrixOverride\n ? { matrix: [...this.localMatrixOverride] as unknown as ICEMatrix4Tuple }\n : {}),\n children: this._children.map((child) => child.toJSON()),\n };\n }\n\n dispose(): void {\n for (const child of [...this._children]) {\n this.removeChild(child, { dispose: true });\n }\n this.removeAllListeners();\n }\n\n private getRoot(): ICENode {\n let current: ICENode = this;\n while (current._parent) {\n current = current._parent;\n }\n return current;\n }\n\n private markSceneChanged(): void {\n this.getRoot()._revision += 1;\n }\n\n private isAncestorOf(node: ICENode): boolean {\n let current: ICENode | null = node;\n while (current) {\n if (current === this) {\n return true;\n }\n current = current._parent;\n }\n return false;\n }\n\n private localMatrix(target: ICEMatrix4): ICEMatrix4 {\n if (this.localMatrixOverride) {\n target.elements.set(this.localMatrixOverride);\n return target;\n }\n const x = this.rotation.x;\n const y = this.rotation.y;\n const z = this.rotation.z;\n const cx = Math.cos(x);\n const sx = Math.sin(x);\n const cy = Math.cos(y);\n const sy = Math.sin(y);\n const cz = Math.cos(z);\n const sz = Math.sin(z);\n const elements = target.elements;\n\n elements[0] = (cy * cz) * this.scale.x;\n elements[1] = (sx * sy * cz + cx * sz) * this.scale.x;\n elements[2] = (-cx * sy * cz + sx * sz) * this.scale.x;\n elements[3] = 0;\n elements[4] = (-cy * sz) * this.scale.y;\n elements[5] = (-sx * sy * sz + cx * cz) * this.scale.y;\n elements[6] = (cx * sy * sz + sx * cz) * this.scale.y;\n elements[7] = 0;\n elements[8] = sy * this.scale.z;\n elements[9] = -sx * cy * this.scale.z;\n elements[10] = cx * cy * this.scale.z;\n elements[11] = 0;\n elements[12] = this.position.x;\n elements[13] = this.position.y;\n elements[14] = this.position.z;\n elements[15] = 1;\n return target;\n }\n}\n\nconst collectIDs = (node: ICENode): string[] => [\n node.id,\n ...node.children.flatMap((child) => collectIDs(child)),\n];\n", "import { ICENode, type ICENodeOptions } from './ICENode.js';\n\nexport class ICEScene extends ICENode {\n constructor(options: ICENodeOptions) {\n super(options);\n }\n\n override get typeId(): string {\n return 'ice3:Scene';\n }\n}\n", "import type { ICEGeometry } from '../geometry/ICEGeometry.js';\nimport { ICEBoxGeometry as BoxGeometry } from '../geometry/ICEBoxGeometry.js';\nimport type { ICEBasicMaterial } from '../material/ICEBasicMaterial.js';\nimport { ICEBasicMaterial as BasicMaterial } from '../material/ICEBasicMaterial.js';\nimport { ICENode, type ICENodeOptions, type ICESerializedNode } from './ICENode.js';\n\nexport interface ICEMeshOptions extends ICENodeOptions {\n readonly geometry: ICEGeometry;\n readonly material: ICEBasicMaterial;\n}\n\nexport class ICEMesh extends ICENode {\n static readonly typeId = 'ice3:Mesh';\n\n readonly geometry: ICEGeometry;\n readonly material: ICEBasicMaterial;\n override readonly selectionId: string;\n\n constructor(options: ICEMeshOptions) {\n super(options);\n this.geometry = options.geometry;\n this.material = options.material;\n this.selectionId = options.selectionId?.trim() || options.id;\n }\n\n override get typeId(): string {\n return ICEMesh.typeId;\n }\n\n override toJSON(): ICESerializedNode {\n return {\n ...super.toJSON(),\n selectionId: this.selectionId,\n geometry: this.geometry.toJSON(),\n material: this.material.toJSON(),\n };\n }\n\n static fromJSON(value: ICESerializedNode): ICEMesh {\n const geometry = value.geometry as Record<string, unknown>;\n const material = value.material as Record<string, unknown>;\n const shading = material.shading === 'directional'\n || material.shading === 'flat'\n || material.shading === 'water'\n ? material.shading\n : undefined;\n return new ICEMesh({\n id: value.id,\n displayName: typeof value.displayName === 'string'\n ? value.displayName\n : value.id,\n ...(value.metadata ? { metadata: value.metadata } : {}),\n selectionId: typeof value.selectionId === 'string'\n ? value.selectionId\n : value.id,\n position: value.position,\n rotation: value.rotation,\n scale: value.scale,\n ...(value.matrix ? { matrix: value.matrix } : {}),\n geometry: new BoxGeometry({\n width: Number(geometry.width),\n height: Number(geometry.height),\n depth: Number(geometry.depth),\n }),\n material: new BasicMaterial({\n color: String(material.color),\n ...(typeof material.edgeColor === 'string'\n ? { edgeColor: material.edgeColor }\n : {}),\n ...(shading ? { shading } : {}),\n }),\n });\n }\n}\n", "import type { ICENode, ICESerializedNode } from '../scene/ICENode.js';\n\nexport interface ICENodeType {\n readonly typeId: string;\n fromJSON(value: ICESerializedNode): ICENode;\n}\n\nexport class ICETypeRegistry {\n private readonly types = new Map<string, ICENodeType>();\n private readonly typeIds = new Map<ICENodeType, string>();\n\n register(typeId: string, type: ICENodeType): this {\n if (!/^[a-z][a-z0-9-]*:[A-Za-z_][A-Za-z0-9_-]*$/.test(typeId)) {\n throw new TypeError(`Invalid ICE type ID: ${typeId}`);\n }\n\n const registeredType = this.types.get(typeId);\n if (registeredType && registeredType !== type) {\n throw new TypeError(`Type ID already registered: ${typeId}`);\n }\n\n const registeredId = this.typeIds.get(type);\n if (registeredId && registeredId !== typeId) {\n throw new TypeError(`Type already registered as ${registeredId}`);\n }\n\n this.types.set(typeId, type);\n this.typeIds.set(type, typeId);\n return this;\n }\n\n get(typeId: string): ICENodeType | undefined {\n return this.types.get(typeId);\n }\n}\n", "import type { ICEDiagnostic } from '../diagnostics/ICEDiagnostic.js';\nimport type { ICETypeRegistry } from '../types/ICETypeRegistry.js';\nimport { ICENode, type ICESerializedNode } from '../scene/ICENode.js';\nimport { ICEScene } from '../scene/ICEScene.js';\n\nexport interface ICESerializedScene {\n readonly schemaVersion: 1;\n readonly typeId: 'ice3:Scene';\n readonly scene: ICESerializedNode;\n}\n\nexport interface ICEDeserializedScene {\n readonly scene: ICEScene;\n readonly report: Readonly<{ errors: readonly ICEDiagnostic[] }>;\n}\n\nexport function serializeScene(scene: ICEScene): ICESerializedScene {\n return {\n schemaVersion: 1,\n typeId: 'ice3:Scene',\n scene: scene.toJSON(),\n };\n}\n\nexport function deserializeScene(\n value: ICESerializedScene,\n registry: ICETypeRegistry,\n): ICEDeserializedScene {\n const errors: ICEDiagnostic[] = [];\n const scene = new ICEScene({\n id: value.scene.id,\n ...(value.scene.displayName\n ? { displayName: value.scene.displayName }\n : {}),\n ...(value.scene.metadata ? { metadata: value.scene.metadata } : {}),\n position: value.scene.position,\n rotation: value.scene.rotation,\n scale: value.scene.scale,\n });\n scene.visible = value.scene.visible;\n\n const buildChildren = (source: ICESerializedNode, parent: ICENode, path: string) => {\n source.children.forEach((child, index) => {\n const type = registry.get(child.typeId);\n if (!type) {\n errors.push({\n severity: 'error',\n code: 'ICE3_UNKNOWN_TYPE',\n message: `Unknown ICE node type: ${child.typeId}`,\n path: `${path}.children[${index}]`,\n });\n return;\n }\n try {\n const node = type.fromJSON(child);\n parent.addChild(node);\n buildChildren(child, node, `${path}.children[${index}]`);\n } catch (error) {\n errors.push({\n severity: 'error',\n code: 'ICE3_INVALID_NODE_DATA',\n message: `Invalid ICE node data: ${\n error instanceof Error ? error.message : String(error)\n }`,\n path: `${path}.children[${index}]`,\n });\n }\n });\n };\n\n buildChildren(value.scene, scene, 'scene');\n return { scene, report: { errors } };\n}\n", "import { ICEMesh, type ICENode, type ICEScene } from '@ice3/core';\n\nexport interface ICEGeometryRenderable {\n readonly id: string;\n readonly mesh: ICEMesh;\n readonly worldMatrix: Float32Array;\n}\n\nconst visit = (\n node: ICENode,\n parentVisible: boolean,\n output: ICEGeometryRenderable[],\n): void => {\n const visible = parentVisible && node.visible;\n if (visible && node instanceof ICEMesh) {\n output.push({\n id: node.id,\n mesh: node,\n worldMatrix: node.updateWorldMatrix().elements,\n });\n }\n for (const child of node.children) {\n visit(child, visible, output);\n }\n};\n\nexport function collectRenderables(\n scene: ICEScene,\n output: ICEGeometryRenderable[] = [],\n): readonly ICEGeometryRenderable[] {\n output.length = 0;\n visit(scene, true, output);\n return output;\n}\n\nexport const selectionIdentity = (mesh: ICEMesh): string => mesh.selectionId;\n", "import type {\n ICEBasicMaterial,\n ICEGeometry,\n ICENode,\n ICEScene,\n} from '@ice3/core';\n\nexport interface ICERenderBatchNode extends ICENode {\n readonly geometry: ICEGeometry;\n readonly material: ICEBasicMaterial;\n readonly semanticIds: readonly string[];\n readonly semanticNodeIds: readonly string[];\n readonly semanticSelectionIds: readonly string[];\n readonly materialKey: string;\n}\n\nexport interface ICERenderBatchDraw {\n readonly id: string;\n readonly batch: ICERenderBatchNode;\n readonly worldMatrix: Float32Array;\n}\n\nexport function collectRenderBatches(\n scene: ICEScene,\n output: ICERenderBatchDraw[] = [],\n): readonly ICERenderBatchDraw[] {\n output.length = 0;\n const visit = (node: ICENode, parentVisible: boolean): void => {\n const visible = parentVisible && node.visible;\n if (visible && isRenderBatch(node)) {\n output.push({\n id: node.id,\n batch: node,\n worldMatrix: node.updateWorldMatrix().elements,\n });\n }\n for (const child of node.children) visit(child, visible);\n };\n visit(scene, true);\n output.sort((left, right) => (\n left.batch.materialKey.localeCompare(right.batch.materialKey, 'en')\n || left.id.localeCompare(right.id, 'en')\n ));\n return output;\n}\n\nfunction isRenderBatch(node: ICENode): node is ICERenderBatchNode {\n if (node.typeId !== 'ice3:RenderBatch') return false;\n const candidate = node as unknown as Partial<ICERenderBatchNode>;\n return Boolean(\n candidate.geometry\n && candidate.material\n && candidate.semanticIds\n && candidate.semanticNodeIds\n && candidate.semanticSelectionIds\n && typeof candidate.materialKey === 'string',\n );\n}\n\nexport function semanticSelectionId(\n batch: Pick<ICERenderBatchNode, 'semanticSelectionIds'>,\n semanticIndex: number,\n): string | undefined {\n return Number.isInteger(semanticIndex) && semanticIndex >= 0\n ? batch.semanticSelectionIds[semanticIndex]\n : undefined;\n}\n", "import { ICEEngineError } from '@ice3/core';\nimport type { ICEMatrix4 } from '@ice3/core';\n\nconst LIGHT_DIRECTION = [-0.35, 0.85, 0.4] as const;\nconst LIGHTING = Object.freeze({\n ambient: 0.72,\n direct: 0.72,\n sky: 0.18,\n minimum: 0.92,\n maximum: 1.42,\n});\n\nexport function directionalLightingShade(\n normal: readonly [number, number, number],\n): number {\n const length = Math.hypot(...normal) || 1;\n const nx = normal[0] / length;\n const ny = normal[1] / length;\n const nz = normal[2] / length;\n const diffuse = nx * LIGHT_DIRECTION[0]\n + ny * LIGHT_DIRECTION[1]\n + nz * LIGHT_DIRECTION[2];\n const key = Math.max(diffuse, 0) + 0.35 * Math.max(-diffuse, 0);\n const hemisphere = 0.5 + 0.5 * ny;\n return Math.max(\n LIGHTING.minimum,\n Math.min(\n LIGHTING.maximum,\n LIGHTING.ambient + LIGHTING.direct * key + LIGHTING.sky * hemisphere,\n ),\n );\n}\n\nconst VERTEX_SOURCE = `#version 300 es\nin vec3 a_position;\nin vec3 a_color;\nin vec4 a_instanceColumn0;\nin vec4 a_instanceColumn1;\nin vec4 a_instanceColumn2;\nin vec4 a_instanceColumn3;\nuniform mat4 u_worldViewProjection;\nuniform vec2 u_clipOffset;\nuniform float u_useInstancing;\nout vec3 v_color;\nout vec3 v_worldPosition;\n\nvoid main() {\n mat4 instanceMatrix = mat4(\n a_instanceColumn0,\n a_instanceColumn1,\n a_instanceColumn2,\n a_instanceColumn3\n );\n vec4 localPosition = vec4(a_position, 1.0);\n vec4 position = mix(\n localPosition,\n instanceMatrix * localPosition,\n u_useInstancing\n );\n gl_Position = u_worldViewProjection * position;\n gl_Position.xy += u_clipOffset * gl_Position.w;\n v_color = a_color;\n v_worldPosition = position.xyz;\n}\n`;\n\nconst FRAGMENT_SOURCE = `#version 300 es\nprecision highp float;\nuniform vec4 u_color;\nuniform vec4 u_clipPlane;\nuniform float u_pickMode;\nuniform float u_useVertexColor;\nuniform float u_useDirectionalShading;\nuniform float u_waterShading;\nuniform vec3 u_cameraPosition;\nuniform sampler2D u_shadowMap;\nuniform mat4 u_lightViewProjection;\nuniform float u_shadowEnabled;\nuniform float u_shadowNormalOffset;\nuniform float u_shadowDebug;\nuniform sampler2D u_baseColorMap;\nuniform float u_useBaseColorMap;\nuniform vec2 u_uvScale;\nuniform sampler2D u_normalMap;\nuniform float u_useNormalMap;\nuniform sampler2D u_ormMap;\nuniform float u_useOrmMap;\nuniform float u_ormOcclusion;\nuniform float u_ormMetallicRoughness;\nuniform float u_normalScale;\nuniform float u_metallic;\nuniform float u_roughness;\nuniform vec3 u_emissive;\nuniform sampler2D u_sceneDepth;\nuniform float u_useSceneDepth;\nuniform mat4 u_projection;\nuniform vec2 u_viewport;\nuniform vec2 u_clipRange;\nuniform float u_aoRadius;\nuniform float u_aoStrength;\nin vec3 v_color;\nin vec3 v_worldPosition;\nout vec4 outputColor;\n\n// \u7531\u5C4F\u5E55 UV \u4E0E\u6DF1\u5EA6\u7F13\u51B2\u91CD\u5EFA\u89C6\u7A7A\u95F4\u5750\u6807\uFF08\u4E0E WebGL2DepthMath \u7684\u6362\u7B97\u4E00\u81F4\uFF09\u3002\nvec3 viewPositionAt(vec2 uv, float tanHalfFov, float aspect, float near, float far) {\n float depth = texture(u_sceneDepth, uv).r;\n float ndcZ = depth * 2.0 - 1.0;\n float linear = (2.0 * near * far) / (far + near - ndcZ * (far - near));\n vec2 ndc = uv * 2.0 - 1.0;\n return vec3(ndc.x * tanHalfFov * aspect * linear, ndc.y * tanHalfFov * linear, -linear);\n}\n\nvoid main() {\n // Section plane: discard the half-space on the negative side. A zero plane\n // (0,0,0,0) evaluates to 0 and keeps everything, so it doubles as \"off\".\n if (dot(v_worldPosition, u_clipPlane.xyz) + u_clipPlane.w < 0.0) {\n discard;\n }\n if (u_pickMode > 0.5) {\n outputColor = u_color;\n return;\n }\n vec3 color = u_color.rgb\n * mix(vec3(1.0), v_color, step(0.5, u_useVertexColor));\n vec3 normal = normalize(cross(\n dFdx(v_worldPosition),\n dFdy(v_worldPosition)\n ));\n // Box-projected UVs make the tangent frame analytic: the projection plane's\n // two world axes are the tangents, so no vertex tangent channel is needed.\n vec3 tangent = vec3(0.0);\n vec3 bitangent = vec3(0.0);\n vec3 axisWeight = abs(normal);\n if (axisWeight.x >= axisWeight.y && axisWeight.x >= axisWeight.z) {\n tangent = vec3(0.0, 0.0, -sign(normal.x));\n bitangent = vec3(0.0, 1.0, 0.0);\n } else if (axisWeight.y >= axisWeight.z) {\n tangent = vec3(1.0, 0.0, 0.0);\n bitangent = vec3(0.0, 0.0, sign(normal.y));\n } else {\n tangent = vec3(sign(normal.z), 0.0, 0.0);\n bitangent = vec3(0.0, 1.0, 0.0);\n }\n // \u4E09\u5F20\u8D34\u56FE\u5171\u7528\u540C\u4E00\u5957\u76D2\u6295\u5F71 UV\uFF1A\u6CD5\u7EBF\u4E3B\u5BFC\u8F74\u51B3\u5B9A\u6295\u5F71\u5E73\u9762\uFF0C\u5355\u4F4D\u662F\u7C73\u3002\n // \u5199\u4E00\u6B21\u5C31\u591F\u4E86\u2014\u2014\u5E95\u56FE\u3001\u6CD5\u7EBF\u56FE\u3001ORM \u5404\u5199\u4E00\u904D\u8FDF\u65E9\u4F1A\u6F02\u3002\n vec2 surfaceUv;\n if (axisWeight.x >= axisWeight.y && axisWeight.x >= axisWeight.z) {\n surfaceUv = vec2(-sign(normal.x) * v_worldPosition.z, v_worldPosition.y);\n } else if (axisWeight.y >= axisWeight.z) {\n surfaceUv = vec2(v_worldPosition.x, sign(normal.y) * v_worldPosition.z);\n } else {\n surfaceUv = vec2(sign(normal.z) * v_worldPosition.x, v_worldPosition.y);\n }\n surfaceUv *= u_uvScale;\n if (u_useNormalMap > 0.5) {\n vec3 sampled = texture(u_normalMap, surfaceUv).xyz * 2.0 - 1.0;\n sampled.xy *= u_normalScale;\n normal = normalize(\n normalize(tangent) * sampled.x\n + normalize(bitangent) * sampled.y\n + normal * sampled.z\n );\n }\n // \u4E3B\u5149 + \u534A\u7403\u5929\u5149\u3002\u6CD5\u7EBF\u7531\u5C4F\u5E55\u7A7A\u95F4\u5BFC\u6570\u6C42\u51FA\uFF0C\u671D\u5411\u4E0E\u7ED5\u5E8F\u4E00\u81F4\uFF1A\n // \u8FCE\u7740\u5149\u7684\u4E00\u9762\u5403\u6EE1\u76F4\u5C04\uFF0C\u80CC\u5149\u9762\u53EA\u7559 35% \u7684\u53CD\u5F39\u5149\uFF0C\u6697\u90E8\u4E0D\u81F3\u4E8E\u7CCA\u6210\u4E00\u7247\u3002\n vec3 lightDirection = normalize(vec3(${LIGHT_DIRECTION.join(', ')}));\n float ndl = dot(normal, lightDirection);\n float key = max(ndl, 0.0) + 0.35 * max(-ndl, 0.0);\n float sky = 0.5 + 0.5 * normal.y;\n // ORM\uFF1AR \u906E\u853D\u3001G \u7C97\u7CD9\u5EA6\u3001B \u91D1\u5C5E\u5EA6\uFF0C\u548C glTF \u7684\u6253\u5305\u7EA6\u5B9A\u4E00\u81F4\u3002\n // \u906E\u853D\u53EA\u538B\u95F4\u63A5\u5149\uFF08\u73AF\u5883\u4E0E\u5929\u5149\uFF09\uFF0C\u76F4\u5C04\u7167\u5EA6\u4E0D\u53D7\u5F71\u54CD\u2014\u2014\u5426\u5219\u9634\u5F71\u548C\u8D34\u56FE\u4F1A\u4E92\u76F8\u6253\u67B6\u3002\n float surfaceOcclusion = 1.0;\n float surfaceMetallic = u_metallic;\n float surfaceRoughness = clamp(u_roughness, 0.04, 1.0);\n if (u_useOrmMap > 0.5) {\n vec3 orm = texture(u_ormMap, surfaceUv).rgb;\n if (u_ormOcclusion > 0.5) surfaceOcclusion = clamp(orm.r, 0.0, 1.0);\n if (u_ormMetallicRoughness > 0.5) {\n surfaceRoughness = clamp(surfaceRoughness * orm.g, 0.04, 1.0);\n surfaceMetallic = clamp(surfaceMetallic * orm.b, 0.0, 1.0);\n }\n }\n // \u76F4\u5C04\u5149\u5F3A\u5EA6\u6309\u771F\u5B9E\u65E5\u7167\u7ED9\uFF1A\u671D\u4E0A\u7684\u9762\u4F1A\u8D85\u8FC7 1\uFF0C\u8FC7\u66DD\u5230\u63A5\u8FD1\u767D\u8272\u662F\u5BF9\u7684\uFF0C\n // \u4E4B\u524D\u4E0A\u9650\u538B\u5230 1 \u9644\u8FD1\uFF0C\u6574\u4E2A\u5382\u533A\u5C31\u6C38\u8FDC\u6652\u4E0D\u5230\u592A\u9633\uFF0C\u770B\u7740\u53D1\u95F7\u53D1\u6697\u3002\n float shade = clamp(\n (${LIGHTING.ambient} + ${LIGHTING.sky} * sky) * surfaceOcclusion\n + ${LIGHTING.direct} * key,\n ${LIGHTING.minimum},\n ${LIGHTING.maximum}\n );\n // Base-colour texture. There is no UV vertex channel: the projection is\n // derived from the surface normal's dominant axis, in metres, which matches\n // the coordinates Studio writes into exported glTF.\n if (u_useBaseColorMap > 0.5) {\n color *= texture(u_baseColorMap, surfaceUv).rgb;\n }\n vec3 lit = color * mix(1.0, shade, u_useDirectionalShading);\n\n // \u8868\u9762\u9897\u7C92\uFF1A\u6309\u4E16\u754C\u5750\u6807\u53D6\u4E24\u5C42\u54C8\u5E0C\uFF0C\u6253\u6563\u6574\u7247\u7EAF\u8272\u5E26\u6765\u7684\u5851\u6599\u611F\u3002\n // \u5E45\u5EA6\u63A7\u5236\u5728 \u00B16% \u5185\uFF0C\u8FDC\u4E86\u770B\u4E0D\u51FA\u3001\u8FD1\u4E86\u6709\u8D28\u611F\uFF0C\u4E0D\u4F1A\u55A7\u5BBE\u593A\u4E3B\u3002\n vec3 fine = floor(v_worldPosition * 4.5);\n vec3 coarse = floor(v_worldPosition * 0.42);\n float grain = fract(sin(dot(fine, vec3(12.9898, 78.233, 37.719))) * 43758.5453);\n float stain = fract(sin(dot(coarse, vec3(39.346, 11.135, 83.155))) * 24634.6345);\n // \u4F4E\u9891\u6C61\u6E0D\u8D1F\u8D23\u5927\u9762\u79EF\u4E0D\u5300\uFF0C\u9AD8\u9891\u9897\u7C92\u8D1F\u8D23\u8FD1\u770B\u7684\u624B\u611F\u3002\n lit *= 0.94 + 0.06 * grain + 0.05 * (stain - 0.5);\n\n // Liquid surfaces use an analytic Fresnel reflection plus shallow ripple\n // normals. The effect is opt-in through material shading and remains\n // independent from any application-specific material naming.\n if (u_waterShading > 0.5) {\n float waveA = sin(v_worldPosition.x * 1.1\n + sin(v_worldPosition.z * 0.43) * 2.0);\n float waveB = sin(v_worldPosition.z * 1.7\n + v_worldPosition.x * 0.31);\n float waveC = sin((v_worldPosition.x + v_worldPosition.z) * 2.3);\n vec3 rippleNormal = normalize(vec3(\n waveA * 0.09 + waveC * 0.025,\n 1.0,\n waveB * 0.09 - waveC * 0.02\n ));\n vec3 viewDirection = normalize(u_cameraPosition - v_worldPosition);\n float facing = clamp(dot(rippleNormal, viewDirection), 0.0, 1.0);\n float fresnel = pow(1.0 - facing, 2.4);\n vec3 reflectedSky = vec3(0.22, 0.34, 0.36);\n vec3 surfaceColor = mix(\n color,\n reflectedSky,\n 0.30 + 0.30 * fresnel\n );\n surfaceColor *= 0.92 + 0.09 * waveA + 0.05 * waveB;\n vec3 halfDirection = normalize(lightDirection + viewDirection);\n float sparkle = pow(\n max(dot(rippleNormal, halfDirection), 0.0),\n 36.0\n );\n lit = mix(lit, surfaceColor * shade, 0.92)\n + vec3(0.42, 0.52, 0.54) * sparkle * 0.55;\n }\n\n // \u5C4F\u5E55\u7A7A\u95F4\u906E\u853D\uFF1A\u5148\u628A\u6DF1\u5EA6\u8FD8\u539F\u6210\u89C6\u7A7A\u95F4\u5750\u6807\uFF0C\u518D\u6309**\u4E16\u754C\u534A\u5F84**\u53D6\u6837\u3002\n // \u76F4\u63A5\u6BD4\u8F83 NDC \u6DF1\u5EA6\u5DEE\u8868\u8FBE\u4E0D\u4E86\"1 \u7C73\"\u8FD9\u79CD\u91CF\uFF08\u8FDC\u7AEF\u5343\u5206\u4E4B\u51E0\u5C31\u8DE8\u4E86\u5341\u7C73\uFF09\uFF0C\n // \u8FD9\u4E5F\u662F SPEC-007 \u524D\u4E09\u8F6E\u5931\u8D25\u7684\u539F\u56E0\u3002\n if (u_useSceneDepth > 0.5) {\n vec2 screenUv = gl_FragCoord.xy / u_viewport;\n float tanHalfFov = 1.0 / u_projection[1][1];\n float aspect = u_projection[1][1] / u_projection[0][0];\n float near = u_clipRange.x;\n float far = u_clipRange.y;\n\n vec3 centre = viewPositionAt(screenUv, tanHalfFov, aspect, near, far);\n // \u6CD5\u7EBF\u7531\u89C6\u7A7A\u95F4\u4F4D\u7F6E\u7684\u5C4F\u5E55\u5BFC\u6570\u6C42\u51FA\uFF1A\u51E0\u4F55\u6CA1\u6709\u6CD5\u7EBF\u5C5E\u6027\uFF0C\u4E5F\u4E0D\u9700\u8981\u3002\n vec3 viewNormal = normalize(cross(dFdx(centre), dFdy(centre)));\n float centreDepth = -centre.z;\n\n // \u4E16\u754C\u534A\u5F84\u6362\u7B97\u6210\u50CF\u7D20\u534A\u5F84\uFF1A\u8D8A\u8FDC\u8D8A\u5C0F\uFF0C\u8FD1\u666F\u8FDC\u666F\u624D\u90FD\u6709\u610F\u4E49\u3002\n float pixelRadius = (u_aoRadius / max(1e-4, centreDepth * tanHalfFov)) * (u_viewport.y * 0.5);\n // \u4EA4\u9519\u68AF\u5EA6\u566A\u58F0\uFF08IGN\uFF09\u4EE3\u66FF sin \u54C8\u5E0C\uFF1A\u540C\u6837\u662F\u9010\u50CF\u7D20\u6270\u52A8\uFF0C\u4F46\u5B83\u5728\u76F8\u90BB\u50CF\u7D20\u95F4\u662F\n // \u6E10\u53D8\u800C\u975E\u8DF3\u53D8\uFF0C\u91C7\u6837\u7F3A\u53E3\u770B\u8D77\u6765\u50CF\u7EC6\u5BC6\u6296\u52A8\uFF0C\u4E0D\u50CF\u6912\u76D0\u566A\u70B9\u3002\n float rotation = fract(52.9829189 * fract(dot(gl_FragCoord.xy, vec2(0.06711056, 0.00583715)))) * 6.2831853;\n\n // \u4E09\u5708\u53D6\u6837\uFF1A0.35 / 0.65 / 1.0 \u500D\u534A\u5F84\uFF0C\u6743\u91CD 1.0 / 0.7 / 0.45\uFF0C\u5206\u522B\u8D1F\u8D23\n // \u8D34\u5730\u63A5\u89E6\u3001\u7F1D\u9699\u4E2D\u90E8\u3001\u5927\u9762\u79EF\u5939\u89D2\u3002\u6837\u672C\u6309\u4E0E\u6CD5\u7EBF\u7684\u5939\u89D2\u52A0\u6743\u2014\u2014\u6B63\u5BF9\u7740\u7684\u5E73\u9762\n // \u4E0D\u8BE5\u88AB\u5468\u56F4\u540C\u6837\u5E73\u7684\u4E1C\u897F\u538B\u6697\uFF0C\u53EA\u6709\"\u7ACB\u8D77\u6765\u6321\u4F4F\u6211\"\u7684\u624D\u7B97\u6CD5\u3002\n float occlusion = 0.0;\n float weightSum = 0.0;\n for (int ring = 0; ring < 3; ring++) {\n // \u4E09\u5708\uFF1A\u8D34\u5730\u63A5\u89E6 / \u7F1D\u9699\u4E2D\u90E8 / \u5927\u9762\u79EF\u5939\u89D2\u3002\u6CA1\u6709\u6A21\u7CCA\u901A\u9053\u65F6\uFF0C\u9760\u5708\u5C42\u5206\u644A\n // \u91C7\u6837\u5BC6\u5EA6\u662F\u538B\u566A\u70B9\u6700\u76F4\u63A5\u7684\u529E\u6CD5\uFF08\u6A21\u7CCA\u8981\u989D\u5916\u7684 FBO \u4E0E\u5168\u5C4F\u901A\u9053\uFF09\u3002\n float ringScale = ring == 0 ? 0.35 : (ring == 1 ? 0.65 : 1.0);\n float ringWeight = ring == 0 ? 1.0 : (ring == 1 ? 0.7 : 0.45);\n for (int i = 0; i < 8; i++) {\n float angle = rotation + float(i) * 0.7853982 + float(ring) * 0.2618;\n vec2 offset = vec2(cos(angle), sin(angle)) * pixelRadius * ringScale;\n vec2 sampleUv = screenUv + offset / u_viewport;\n if (sampleUv.x < 0.0 || sampleUv.x > 1.0 || sampleUv.y < 0.0 || sampleUv.y > 1.0) continue;\n vec3 delta = viewPositionAt(sampleUv, tanHalfFov, aspect, near, far) - centre;\n float distance = length(delta);\n if (distance < 0.0001 || distance > u_aoRadius) continue;\n float alignment = dot(delta, viewNormal) / distance;\n if (alignment <= 0.15) continue;\n occlusion += ringWeight * alignment;\n weightSum += ringWeight;\n }\n }\n if (weightSum > 0.0) {\n occlusion /= weightSum;\n lit *= 1.0 - clamp(occlusion, 0.0, 1.0) * u_aoStrength;\n }\n }\n\n // \u91D1\u5C5E\u6CA1\u6709\u6F2B\u53CD\u5C04\uFF1A\u5B83\u7684\u989C\u8272\u5168\u90E8\u6765\u81EA\u53CD\u5C04\u3002\u5148\u628A\u6F2B\u53CD\u5C04\u6309 metallic \u6536\u6389\uFF0C\n // \u518D\u7528\u53CD\u5C04\u9879\u8865\u56DE\u6765\uFF0C\u5426\u5219\u91D1\u5C5E\u548C\u5851\u6599\u5728\u540C\u4E00\u4E2A\u592A\u9633\u4E0B\u53EA\u662F\"\u989C\u8272\u4E0D\u540C\"\u3002\n {\n vec3 viewDirection = normalize(u_cameraPosition - v_worldPosition);\n vec3 halfVector = normalize(lightDirection + viewDirection);\n float metallic = clamp(surfaceMetallic, 0.0, 1.0);\n float roughness = clamp(surfaceRoughness, 0.04, 1.0);\n vec3 reflectance = mix(vec3(0.04), color, metallic);\n\n float diffuseGain = 1.0 - metallic * 0.85;\n float facing = max(dot(normal, lightDirection), 0.0);\n\n // \u9AD8\u5149\uFF1A\u7C97\u7CD9\u5EA6\u51B3\u5B9A\u53F6\u74E3\u5BBD\u5EA6\u4E0E\u5F3A\u5EA6\uFF08\u6307\u6570 96 \u2192 4\uFF0C\u589E\u76CA 1.0 \u2192 0.18\uFF09\u3002\n float shininess = mix(96.0, 4.0, roughness * roughness);\n float highlight = pow(max(dot(normal, halfVector), 0.0), shininess);\n float specularGain = mix(1.0, 0.18, roughness);\n\n // \u73AF\u5883\u53CD\u5C04\uFF1A\u6309\u53CD\u5C04\u65B9\u5411\u53D6\u5929\u7A7A/\u5730\u9762\u8272\uFF0C\u63A0\u5C04\u89D2\u518D\u53E0\u4E00\u5C42 Fresnel\u3002\n // \u53EA\u770B\u6CD5\u7EBF\u7684\u8BDD\uFF0C\u5E73\u8EBA\u7684\u91D1\u5C5E\u4F1A\u548C\u7ACB\u7740\u7684\u91D1\u5C5E\u4E00\u4E2A\u989C\u8272\u2014\u2014\u73B0\u5B9E\u91CC\u524D\u8005\u53CD\u5C04\u5929\u9876\u3001\n // \u540E\u8005\u53CD\u5C04\u5730\u5E73\u7EBF\uFF0C\u6070\u6070\u662F\u91D1\u5C5E\u6700\u5BB9\u6613\u8FA8\u8BA4\u7684\u7279\u5F81\u3002\n vec3 reflected = reflect(-viewDirection, normal);\n float skyMix = clamp(reflected.y * 0.9 + 0.35, 0.0, 1.0);\n vec3 skyColor = mix(vec3(0.15, 0.16, 0.17), vec3(0.62, 0.72, 0.84), skyMix);\n float fresnel = pow(1.0 - clamp(dot(normal, viewDirection), 0.0, 1.0), 4.0);\n float envGain = (0.22 + 0.55 * fresnel) * mix(0.4, 1.0, metallic);\n\n float litScale = diffuseGain;\n lit *= litScale;\n lit += reflectance * (highlight * specularGain * mix(0.35, 1.0, facing)\n + skyColor * envGain);\n lit += u_emissive;\n }\n\n // \u9634\u5F71\uFF1A\u628A\u4E16\u754C\u5750\u6807\u6295\u5230\u5149\u6E90\u7A7A\u95F4\uFF0C\u4E0E\u6DF1\u5EA6\u56FE\u6BD4\u8F83\u3002\u53D6 3\u00D73 \u91C7\u6837\u7684\u5E73\u5747\u505A\u8F7B\u5FAE\u67D4\u5316\u3002\n // shadowLit \u5728\u8C03\u8BD5\u901A\u9053\u91CC\u76F4\u63A5\u8F93\u51FA\uFF1A1 = \u53D7\u5149\uFF0C0 = \u88AB\u906E\u3002\n float shadowLit = 1.0;\n if (u_shadowEnabled > 0.5) {\n // \u91C7\u6837\u70B9\u6CBF\u6CD5\u7EBF\u63A8\u51FA 1.5 \u4E2A\u7EB9\u7D20\uFF1A\u5E73\u8EBA\u5728\u5149\u91CC\u7684\u9762\uFF08\u5C4B\u9876\u3001\u5730\u9762\uFF09\u5728\u6BCF\u4E2A\u7EB9\u7D20\u5185\n // \u672C\u8EAB\u5C31\u6709\u6DF1\u5EA6\u5DEE\uFF0C\u9760\u6DF1\u5EA6\u504F\u5DEE\u53BB\u8FFD\u8FD9\u4E2A\u5DEE\u53EA\u4F1A\u8BA9\u5F71\u5B50\u8131\u79BB\u7269\u4F53\uFF08peter-panning\uFF09\u3002\n // \u628A\u6BD4\u8F83\u70B9\u62AC\u79BB\u8868\u9762\u624D\u662F\u6B63\u89E3\uFF0C\u504F\u79FB\u91CF\u6309\u7EB9\u7D20\u6362\u7B97\uFF0C\u548C\u8D34\u56FE\u5206\u8FA8\u7387\u89E3\u8026\u3002\n vec3 shadowPosition = v_worldPosition + normal * u_shadowNormalOffset;\n vec4 lightSpace = u_lightViewProjection * vec4(shadowPosition, 1.0);\n vec3 projected = lightSpace.xyz / max(lightSpace.w, 1e-5) * 0.5 + 0.5;\n if (projected.x > 0.002 && projected.x < 0.998\n && projected.y > 0.002 && projected.y < 0.998\n && projected.z > 0.0 && projected.z < 1.0) {\n // \u89C6\u9525\u8D34\u5408\u573A\u666F\u540E\u6DF1\u5EA6\u8DE8\u5EA6\u53EA\u6709\u767E\u7C73\u91CF\u7EA7\uFF0C\u504F\u5DEE\u4E5F\u5C31\u53EF\u4EE5\u6309\u7EB9\u7406\u5355\u5143\u7ED9\u3002\n // \u9634\u5F71 pass \u53EA\u753B\u80CC\u9762\uFF08cull FRONT\uFF09\uFF0C\u53D7\u5149\u9762\u548C\u6DF1\u5EA6\u56FE\u5929\u7136\u9519\u5F00\uFF0C\u57FA\u6570\u53EF\u4EE5\u5F88\u5C0F\uFF1B\n // \u659C\u9762\u6700\u654F\u611F\uFF0C\u4ECD\u6309 N\u00B7L \u653E\u5927\uFF08\u9634\u5F71\u75E4\u75AE\u4E0E\u9634\u5F71\u8131\u79BB\u4E4B\u95F4\u7684\u90A3\u6761\u7A84\u7F1D\uFF09\u3002\n float ndlShadow = max(dot(normal, lightDirection), 0.0);\n float bias = 0.0006 + 0.0012 * (1.0 - ndlShadow);\n float lit2 = 0.0;\n vec2 texel = vec2(1.0 / 2048.0);\n for (int dx = -1; dx <= 1; dx++) {\n for (int dy = -1; dy <= 1; dy++) {\n float depth = texture(u_shadowMap, projected.xy + vec2(float(dx), float(dy)) * texel).r;\n lit2 += projected.z - bias > depth ? 0.0 : 1.0;\n }\n }\n shadowLit = lit2 / 9.0;\n lit *= mix(0.68, 1.0, shadowLit);\n\n }\n }\n // \u8C03\u8BD5\u901A\u9053\uFF1A?shadowdebug=1 \u770B\u906E\u853D\u5224\u5B9A\uFF0C=2 \u770B\u6DF1\u5EA6\u56FE\u672C\u8EAB\u3002\n if (u_shadowDebug > 0.5) {\n if (u_shadowDebug < 1.5) {\n outputColor = vec4(shadowLit, 0.12, 0.12, 1.0);\n } else {\n float stored = texture(u_shadowMap, gl_FragCoord.xy / u_viewport).r;\n outputColor = vec4(vec3(stored), 1.0);\n }\n return;\n }\n // \u753B\u5E03\u6309 sRGB \u89E3\u91CA\u5199\u5165\u503C\uFF0C\u800C\u6750\u8D28\u662F\u7EBF\u6027\u7A7A\u95F4\u7684\u5206\u91CF\uFF0C\u5FC5\u987B\u505A\u4E00\u6B21\u7F16\u7801\u3002\n // \u4E0D\u505A\u7684\u8BDD\u7EBF\u6027 0.017 \u4F1A\u5F53\u4F5C sRGB 0.017 \u663E\u793A\uFF0C\u6DF1\u8272\u6750\u8D28\u5168\u90E8\u584C\u6210\u9ED1\u8272\u3002\n outputColor = vec4(\n pow(max(lit, vec3(0.0)), vec3(1.0 / 2.2)),\n u_color.a\n );\n}\n`;\n\n/**\n * Mirror of the shader's specular curve, exported so the response can be tested\n * without a GPU: smoother surfaces get a tighter, stronger highlight.\n */\nexport function specularShininess(roughness: number): number {\n const clamped = Math.min(1, Math.max(0.04, roughness));\n return 180 + (8 - 180) * clamped * clamped;\n}\n\nexport function specularGain(roughness: number): number {\n const clamped = Math.min(1, Math.max(0.04, roughness));\n return 0.9 + (0.08 - 0.9) * clamped;\n}\n\n/** Metals tint their highlight with the base colour; dielectrics stay neutral. */\nexport function specularReflectance(\n metallic: number,\n color: readonly [number, number, number],\n): [number, number, number] {\n const t = Math.min(1, Math.max(0, metallic));\n return [\n 0.04 + (color[0] - 0.04) * t,\n 0.04 + (color[1] - 0.04) * t,\n 0.04 + (color[2] - 0.04) * t,\n ];\n}\n\nexport class WebGL2Program {\n static readonly POSITION_ATTRIBUTE = 0;\n static readonly COLOR_ATTRIBUTE = 1;\n static readonly INSTANCE_MATRIX_ATTRIBUTE = 3;\n static readonly INSTANCE_SEMANTIC_ATTRIBUTE = 7;\n readonly program: WebGLProgram;\n private readonly matrixLocation: WebGLUniformLocation;\n private readonly colorLocation: WebGLUniformLocation;\n private readonly clipOffsetLocation: WebGLUniformLocation;\n private readonly vertexColorLocation: WebGLUniformLocation;\n private readonly directionalShadingLocation: WebGLUniformLocation;\n private readonly waterShadingLocation: WebGLUniformLocation;\n private readonly cameraPositionLocation: WebGLUniformLocation;\n private readonly shadowMapLocation: WebGLUniformLocation | null;\n private readonly lightMatrixLocation: WebGLUniformLocation | null;\n private readonly shadowEnabledLocation: WebGLUniformLocation | null;\n private readonly shadowNormalOffsetLocation: WebGLUniformLocation | null;\n private readonly shadowDebugLocation: WebGLUniformLocation | null;\n private readonly instancingLocation: WebGLUniformLocation;\n private readonly pickModeLocation: WebGLUniformLocation;\n private readonly clipPlaneLocation: WebGLUniformLocation | null;\n private readonly baseColorMapLocation: WebGLUniformLocation | null;\n private readonly useBaseColorMapLocation: WebGLUniformLocation | null;\n private readonly uvScaleLocation: WebGLUniformLocation | null;\n private readonly normalMapLocation: WebGLUniformLocation | null;\n private readonly ormMapLocation: WebGLUniformLocation | null;\n private readonly useOrmMapLocation: WebGLUniformLocation | null;\n private readonly ormOcclusionLocation: WebGLUniformLocation | null;\n private readonly ormMetallicRoughnessLocation: WebGLUniformLocation | null;\n private readonly useNormalMapLocation: WebGLUniformLocation | null;\n private readonly normalScaleLocation: WebGLUniformLocation | null;\n private readonly metallicLocation: WebGLUniformLocation | null;\n private readonly roughnessLocation: WebGLUniformLocation | null;\n private readonly emissiveLocation: WebGLUniformLocation | null;\n private readonly sceneDepthLocation: WebGLUniformLocation | null;\n private readonly useSceneDepthLocation: WebGLUniformLocation | null;\n private readonly projectionLocation: WebGLUniformLocation | null;\n private readonly viewportLocation: WebGLUniformLocation | null;\n private readonly clipRangeLocation: WebGLUniformLocation | null;\n private readonly aoRadiusLocation: WebGLUniformLocation | null;\n private readonly aoStrengthLocation: WebGLUniformLocation | null;\n\n constructor(private readonly gl: WebGL2RenderingContext) {\n const program = this.createProgram(VERTEX_SOURCE, FRAGMENT_SOURCE);\n const matrixLocation = gl.getUniformLocation(program, 'u_worldViewProjection');\n const colorLocation = gl.getUniformLocation(program, 'u_color');\n const clipOffsetLocation = gl.getUniformLocation(program, 'u_clipOffset');\n const vertexColorLocation = gl.getUniformLocation(program, 'u_useVertexColor');\n const directionalShadingLocation = gl.getUniformLocation(\n program,\n 'u_useDirectionalShading',\n );\n const waterShadingLocation = gl.getUniformLocation(program, 'u_waterShading');\n const cameraPositionLocation = gl.getUniformLocation(program, 'u_cameraPosition');\n const instancingLocation = gl.getUniformLocation(program, 'u_useInstancing');\n const pickModeLocation = gl.getUniformLocation(program, 'u_pickMode');\n const clipPlaneLocation = gl.getUniformLocation(program, 'u_clipPlane');\n const baseColorMapLocation = gl.getUniformLocation(program, 'u_baseColorMap');\n const useBaseColorMapLocation = gl.getUniformLocation(program, 'u_useBaseColorMap');\n const uvScaleLocation = gl.getUniformLocation(program, 'u_uvScale');\n const normalMapLocation = gl.getUniformLocation(program, 'u_normalMap');\n const ormMapLocation = gl.getUniformLocation(program, 'u_ormMap');\n const useOrmMapLocation = gl.getUniformLocation(program, 'u_useOrmMap');\n const ormOcclusionLocation = gl.getUniformLocation(program, 'u_ormOcclusion');\n const ormMetallicRoughnessLocation = gl.getUniformLocation(program, 'u_ormMetallicRoughness');\n const useNormalMapLocation = gl.getUniformLocation(program, 'u_useNormalMap');\n const normalScaleLocation = gl.getUniformLocation(program, 'u_normalScale');\n const metallicLocation = gl.getUniformLocation(program, 'u_metallic');\n const roughnessLocation = gl.getUniformLocation(program, 'u_roughness');\n const emissiveLocation = gl.getUniformLocation(program, 'u_emissive');\n const sceneDepthLocation = gl.getUniformLocation(program, 'u_sceneDepth');\n const useSceneDepthLocation = gl.getUniformLocation(program, 'u_useSceneDepth');\n const projectionLocation = gl.getUniformLocation(program, 'u_projection');\n const viewportLocation = gl.getUniformLocation(program, 'u_viewport');\n const clipRangeLocation = gl.getUniformLocation(program, 'u_clipRange');\n const aoRadiusLocation = gl.getUniformLocation(program, 'u_aoRadius');\n const aoStrengthLocation = gl.getUniformLocation(program, 'u_aoStrength');\n const shadowMapLocation = gl.getUniformLocation(program, 'u_shadowMap');\n const lightMatrixLocation = gl.getUniformLocation(program, 'u_lightViewProjection');\n const shadowEnabledLocation = gl.getUniformLocation(program, 'u_shadowEnabled');\n const shadowNormalOffsetLocation = gl.getUniformLocation(program, 'u_shadowNormalOffset');\n const shadowDebugLocation = gl.getUniformLocation(program, 'u_shadowDebug');\n if (\n !matrixLocation\n || !colorLocation\n || !clipOffsetLocation\n || !vertexColorLocation\n || !directionalShadingLocation\n || !waterShadingLocation\n || !cameraPositionLocation\n || !instancingLocation\n || !pickModeLocation\n ) {\n gl.deleteProgram(program);\n throw new ICEEngineError(\n 'ICE3_SHADER_LINK_FAILED',\n 'ICE3_SHADER_LINK_FAILED: shader uniforms are missing',\n );\n }\n this.program = program;\n this.matrixLocation = matrixLocation;\n this.colorLocation = colorLocation;\n this.clipOffsetLocation = clipOffsetLocation;\n this.vertexColorLocation = vertexColorLocation;\n this.directionalShadingLocation = directionalShadingLocation;\n this.waterShadingLocation = waterShadingLocation;\n this.cameraPositionLocation = cameraPositionLocation;\n this.shadowMapLocation = shadowMapLocation;\n this.lightMatrixLocation = lightMatrixLocation;\n this.shadowEnabledLocation = shadowEnabledLocation;\n this.shadowNormalOffsetLocation = shadowNormalOffsetLocation;\n this.shadowDebugLocation = shadowDebugLocation;\n this.instancingLocation = instancingLocation;\n this.pickModeLocation = pickModeLocation;\n this.clipPlaneLocation = clipPlaneLocation;\n this.baseColorMapLocation = baseColorMapLocation;\n this.useBaseColorMapLocation = useBaseColorMapLocation;\n this.uvScaleLocation = uvScaleLocation;\n this.normalMapLocation = normalMapLocation;\n this.ormMapLocation = ormMapLocation;\n this.useOrmMapLocation = useOrmMapLocation;\n this.ormOcclusionLocation = ormOcclusionLocation;\n this.ormMetallicRoughnessLocation = ormMetallicRoughnessLocation;\n this.useNormalMapLocation = useNormalMapLocation;\n this.normalScaleLocation = normalScaleLocation;\n this.metallicLocation = metallicLocation;\n this.roughnessLocation = roughnessLocation;\n this.emissiveLocation = emissiveLocation;\n this.sceneDepthLocation = sceneDepthLocation;\n this.useSceneDepthLocation = useSceneDepthLocation;\n this.projectionLocation = projectionLocation;\n this.viewportLocation = viewportLocation;\n this.clipRangeLocation = clipRangeLocation;\n this.aoRadiusLocation = aoRadiusLocation;\n this.aoStrengthLocation = aoStrengthLocation;\n if (sceneDepthLocation) {\n gl.useProgram(program);\n gl.uniform1i(sceneDepthLocation, 2);\n }\n if (useSceneDepthLocation) {\n gl.useProgram(program);\n gl.uniform1f(useSceneDepthLocation, 0);\n }\n if (aoRadiusLocation) {\n gl.useProgram(program);\n gl.uniform1f(aoRadiusLocation, 2.5);\n }\n if (emissiveLocation) {\n gl.useProgram(program);\n gl.uniform3f(emissiveLocation, 0, 0, 0);\n }\n if (normalMapLocation) {\n gl.useProgram(program);\n gl.uniform1i(normalMapLocation, 1);\n }\n // ORM \u8D70 4 \u53F7\u5355\u5143\uFF1A0 \u5E95\u8272\u30011 \u6CD5\u7EBF\u30012 \u573A\u666F\u6DF1\u5EA6\u30013 \u9634\u5F71\uFF0C\u522B\u649E\u8F66\u3002\n if (ormMapLocation) {\n gl.useProgram(program);\n gl.uniform1i(ormMapLocation, 4);\n }\n if (useNormalMapLocation) {\n gl.useProgram(program);\n gl.uniform1f(useNormalMapLocation, 0);\n }\n if (baseColorMapLocation) {\n gl.useProgram(program);\n gl.uniform1i(baseColorMapLocation, 0);\n }\n if (useBaseColorMapLocation) {\n gl.useProgram(program);\n gl.uniform1f(useBaseColorMapLocation, 0);\n }\n if (clipPlaneLocation) {\n gl.useProgram(program);\n gl.uniform4f(clipPlaneLocation, 0, 0, 0, 0);\n }\n if (shadowMapLocation) {\n gl.useProgram(program);\n gl.uniform1i(shadowMapLocation, 3);\n }\n }\n\n use(): void {\n this.gl.useProgram(this.program);\n }\n\n setMatrix(matrix: ICEMatrix4): void {\n this.gl.uniformMatrix4fv(this.matrixLocation, false, matrix.elements);\n }\n\n setColor(color: readonly [number, number, number, number]): void {\n this.gl.uniform4f(this.colorLocation, ...color);\n }\n\n /**\n * Bind a base-colour texture to unit 0 and enable sampling. Passing `null`\n * restores flat shading without touching the bound texture.\n */\n setBaseColorMap(texture: WebGLTexture | null, scale: readonly [number, number]): void {\n const gl = this.gl;\n if (!this.useBaseColorMapLocation) return;\n if (!texture) {\n gl.uniform1f(this.useBaseColorMapLocation, 0);\n return;\n }\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.uniform1f(this.useBaseColorMapLocation, 1);\n if (this.uvScaleLocation) {\n gl.uniform2f(this.uvScaleLocation, scale[0], scale[1]);\n }\n }\n\n /** Bind a tangent-space normal map to unit 1; `null` disables perturbation. */\n setNormalMap(texture: WebGLTexture | null, strength: number): void {\n const gl = this.gl;\n if (!this.useNormalMapLocation) return;\n if (!texture) {\n gl.uniform1f(this.useNormalMapLocation, 0);\n return;\n }\n gl.activeTexture(gl.TEXTURE1);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.uniform1f(this.useNormalMapLocation, 1);\n if (this.normalScaleLocation) {\n gl.uniform1f(this.normalScaleLocation, strength);\n }\n }\n\n /**\n * Bind the packed ORM map. `occlusion` / `metallicRoughness` describe which\n * halves of the image are meaningful; both false disables sampling.\n */\n setOrmMap(\n texture: WebGLTexture | null,\n occlusion: boolean,\n metallicRoughness: boolean,\n ): void {\n const gl = this.gl;\n if (!this.useOrmMapLocation) return;\n if (!texture || (!occlusion && !metallicRoughness)) {\n gl.uniform1f(this.useOrmMapLocation, 0);\n return;\n }\n gl.activeTexture(gl.TEXTURE4);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.uniform1f(this.useOrmMapLocation, 1);\n if (this.ormOcclusionLocation) {\n gl.uniform1f(this.ormOcclusionLocation, occlusion ? 1 : 0);\n }\n if (this.ormMetallicRoughnessLocation) {\n gl.uniform1f(this.ormMetallicRoughnessLocation, metallicRoughness ? 1 : 0);\n }\n }\n\n /** Metallic-roughness factors plus emission for the current draw. */\n setSurface(\n metallic: number,\n roughness: number,\n emissive: readonly [number, number, number] | undefined,\n ): void {\n const gl = this.gl;\n if (this.metallicLocation) gl.uniform1f(this.metallicLocation, metallic);\n if (this.roughnessLocation) gl.uniform1f(this.roughnessLocation, roughness);\n if (this.emissiveLocation) {\n if (emissive) gl.uniform3f(this.emissiveLocation, emissive[0], emissive[1], emissive[2]);\n else gl.uniform3f(this.emissiveLocation, 0, 0, 0);\n }\n }\n\n /** \u7ED1\u5B9A\u76F8\u673A\u6DF1\u5EA6\u7EB9\u7406\uFF08unit 2\uFF09\u5E76\u4F20\u5165\u91CD\u5EFA\u89C6\u7A7A\u95F4\u6240\u9700\u7684\u76F8\u673A\u53C2\u6570\u3002 */\n setSceneDepth(\n texture: WebGLTexture | null,\n projection: { readonly elements: Float32Array } | null,\n near: number,\n far: number,\n deviceWidth: number,\n deviceHeight: number,\n ): void {\n const gl = this.gl;\n if (!this.useSceneDepthLocation) return;\n if (!texture || !projection) {\n gl.uniform1f(this.useSceneDepthLocation, 0);\n return;\n }\n gl.activeTexture(gl.TEXTURE2);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.uniform1f(this.useSceneDepthLocation, 1);\n if (this.projectionLocation) {\n gl.uniformMatrix4fv(this.projectionLocation, false, projection.elements);\n }\n if (this.viewportLocation) {\n gl.uniform2f(this.viewportLocation, deviceWidth, deviceHeight);\n }\n if (this.clipRangeLocation) {\n gl.uniform2f(this.clipRangeLocation, near, far);\n }\n }\n\n /** \u906E\u853D\u534A\u5F84\uFF08\u7C73\uFF09\u4E0E\u5F3A\u5EA6\uFF0C\u4F9B\u8FD0\u884C\u65F6\u8C03\u8282\u3002\u5F3A\u5EA6 0 \u7B49\u4E8E\u5173\u95ED\u3002 */\n setOcclusion(radius: number, strength: number): void {\n const gl = this.gl;\n if (this.aoRadiusLocation) gl.uniform1f(this.aoRadiusLocation, radius);\n if (this.aoStrengthLocation) gl.uniform1f(this.aoStrengthLocation, strength);\n }\n\n setClipOffset(x: number, y: number): void {\n this.gl.uniform2f(this.clipOffsetLocation, x, y);\n }\n\n setClipPlane(plane: readonly [number, number, number, number]): void {\n if (!this.clipPlaneLocation) return;\n this.gl.uniform4f(this.clipPlaneLocation, plane[0], plane[1], plane[2], plane[3]);\n }\n\n setVertexColors(enabled: boolean): void {\n this.gl.uniform1f(this.vertexColorLocation, enabled ? 1 : 0);\n }\n\n\n /** \u7ED1\u5B9A\u9634\u5F71\u8D34\u56FE\u4E0E\u5149\u6E90\u77E9\u9635\uFF1B\u5173\u95ED\u65F6\u7740\u8272\u5668\u8DF3\u8FC7\u91C7\u6837\u3002 */\n setShadow(\n enabled: boolean,\n texture: WebGLTexture | null,\n matrix: Float32Array | null,\n normalOffset = 0,\n unit = 3,\n ): void {\n const gl = this.gl;\n gl.uniform1f(this.shadowEnabledLocation, enabled && texture && matrix ? 1 : 0);\n if (!enabled || !texture || !matrix) return;\n gl.activeTexture(gl.TEXTURE0 + unit);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n if (this.shadowMapLocation) gl.uniform1i(this.shadowMapLocation, unit);\n if (this.lightMatrixLocation) gl.uniformMatrix4fv(this.lightMatrixLocation, false, matrix);\n if (this.shadowNormalOffsetLocation) {\n gl.uniform1f(this.shadowNormalOffsetLocation, normalOffset);\n }\n gl.activeTexture(gl.TEXTURE0);\n }\n\n /** \u9634\u5F71\u8C03\u8BD5\u901A\u9053\uFF1A0 \u5173\u95ED\uFF0C1 \u8F93\u51FA\u906E\u853D\u5224\u5B9A\uFF0C2 \u8F93\u51FA\u6DF1\u5EA6\u56FE\u3002 */\n setShadowDebug(mode: number): void {\n if (!this.shadowDebugLocation) return;\n this.gl.uniform1f(this.shadowDebugLocation, mode);\n }\n\n setDirectionalShading(enabled: boolean): void {\n this.gl.uniform1f(\n this.directionalShadingLocation,\n enabled ? 1 : 0,\n );\n }\n\n setWaterShading(enabled: boolean): void {\n this.gl.uniform1f(this.waterShadingLocation, enabled ? 1 : 0);\n }\n\n setCameraPosition(position: readonly [number, number, number]): void {\n this.gl.uniform3f(this.cameraPositionLocation, ...position);\n }\n\n setInstancing(enabled: boolean): void {\n this.gl.uniform1f(this.instancingLocation, enabled ? 1 : 0);\n }\n\n setPickMode(enabled: boolean): void {\n this.gl.uniform1f(this.pickModeLocation, enabled ? 1 : 0);\n }\n\n dispose(): void {\n this.gl.deleteProgram(this.program);\n }\n\n private createProgram(vertexSource: string, fragmentSource: string): WebGLProgram {\n const gl = this.gl;\n const vertex = this.compile(gl.VERTEX_SHADER, vertexSource);\n const fragment = this.compile(gl.FRAGMENT_SHADER, fragmentSource);\n const program = gl.createProgram();\n if (!program) {\n gl.deleteShader(vertex);\n gl.deleteShader(fragment);\n throw new ICEEngineError(\n 'ICE3_SHADER_LINK_FAILED',\n 'ICE3_SHADER_LINK_FAILED: program allocation failed',\n );\n }\n\n gl.attachShader(program, vertex);\n gl.attachShader(program, fragment);\n gl.bindAttribLocation(program, WebGL2Program.POSITION_ATTRIBUTE, 'a_position');\n gl.bindAttribLocation(program, WebGL2Program.COLOR_ATTRIBUTE, 'a_color');\n for (let column = 0; column < 4; column += 1) {\n gl.bindAttribLocation(\n program,\n WebGL2Program.INSTANCE_MATRIX_ATTRIBUTE + column,\n `a_instanceColumn${column}`,\n );\n }\n gl.linkProgram(program);\n gl.deleteShader(vertex);\n gl.deleteShader(fragment);\n\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n const log = gl.getProgramInfoLog(program) ?? 'unknown link error';\n gl.deleteProgram(program);\n throw new ICEEngineError(\n 'ICE3_SHADER_LINK_FAILED',\n `ICE3_SHADER_LINK_FAILED: ${log}`,\n );\n }\n return program;\n }\n\n private compile(type: number, source: string): WebGLShader {\n const gl = this.gl;\n const shader = gl.createShader(type);\n if (!shader) {\n throw new ICEEngineError(\n 'ICE3_SHADER_COMPILE_FAILED',\n 'ICE3_SHADER_COMPILE_FAILED: shader allocation failed',\n );\n }\n\n gl.shaderSource(shader, source);\n gl.compileShader(shader);\n if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n const log = gl.getShaderInfoLog(shader) ?? 'unknown compile error';\n gl.deleteShader(shader);\n throw new ICEEngineError(\n 'ICE3_SHADER_COMPILE_FAILED',\n `ICE3_SHADER_COMPILE_FAILED: ${log}`,\n );\n }\n return shader;\n }\n}\n", "import type {\n ICEBasicMaterial,\n ICEGeometry,\n} from '@ice3/core';\nimport type { ICEGeometryRenderable } from './Renderables.js';\n\nexport interface ICEInstanceBatch {\n readonly id: string;\n readonly geometry: ICEGeometry;\n readonly material: ICEBasicMaterial;\n readonly instanceMatrices: Float32Array;\n readonly semanticIds: readonly string[];\n readonly semanticIndices: Uint32Array;\n readonly meshIds: readonly string[];\n readonly materialKey: string;\n}\n\nexport function collectInstanceBatches(\n renderables: readonly ICEGeometryRenderable[],\n output: ICEInstanceBatch[] = [],\n): readonly ICEInstanceBatch[] {\n output.length = 0;\n const byGeometry = new Map<\n ICEGeometry,\n Map<ICEBasicMaterial, ICEGeometryRenderable[]>\n >();\n for (const renderable of renderables) {\n const byMaterial = byGeometry.get(renderable.mesh.geometry)\n ?? new Map<ICEBasicMaterial, ICEGeometryRenderable[]>();\n const group = byMaterial.get(renderable.mesh.material) ?? [];\n group.push(renderable);\n byMaterial.set(renderable.mesh.material, group);\n byGeometry.set(renderable.mesh.geometry, byMaterial);\n }\n for (const [geometry, byMaterial] of byGeometry) {\n for (const [material, group] of byMaterial) {\n if (group.length < 2) continue;\n const instanceMatrices = new Float32Array(group.length * 16);\n const semanticIndices = new Uint32Array(group.length);\n for (let index = 0; index < group.length; index += 1) {\n instanceMatrices.set(group[index]!.worldMatrix, index * 16);\n semanticIndices[index] = index;\n }\n output.push({\n id: `instance:${group[0]!.id}`,\n geometry,\n material,\n instanceMatrices,\n semanticIds: group.map((renderable) => renderable.mesh.selectionId),\n semanticIndices,\n meshIds: group.map((renderable) => renderable.id),\n materialKey: [\n material.color,\n material.edgeColor ?? '',\n material.shading ?? '',\n ].join(':'),\n });\n }\n }\n return output;\n}\n\n/**\n * \u843D\u5355\u7684\u7F51\u683C\uFF1A\u51E0\u4F55\u4E0E\u6750\u8D28\u7EC4\u5408\u53EA\u51FA\u73B0\u4E00\u6B21\uFF0C\u5B9E\u4F8B\u5316\u7701\u4E0D\u4E0B\u5F00\u9500\uFF0C\u4E3B\u901A\u9053\u4ECD\u6309\u5355\u4F53\u7ED8\u5236\u3002\n *\n * \u5355\u72EC\u62BD\u51FA\u6765\u662F\u56E0\u4E3A**\u6BCF\u4E2A\u9644\u52A0\u901A\u9053\u90FD\u8981\u753B\u540C\u4E00\u6279\u4E1C\u897F**\u3002\u6DF1\u5EA6\u901A\u9053\u6F0F\u6389\u8FD9\u4E00\u6761\uFF0C\n * \u843D\u5355\u7684\u7F51\u683C\u5C31\u65E2\u4E0D\u53C2\u4E0E\u906E\u6321\u4E5F\u4E0D\u63A5\u6536\u906E\u853D\uFF08SPEC-007 \u7B2C 5 \u8282\uFF09\u3002\n */\nexport function renderablesOutsideInstanceBatches(\n renderables: readonly ICEGeometryRenderable[],\n batches: readonly ICEInstanceBatch[],\n): ICEGeometryRenderable[] {\n const batched = new Set<string>();\n for (const batch of batches) {\n for (const id of batch.meshIds) batched.add(id);\n }\n return renderables.filter((renderable) => !batched.has(renderable.id));\n}\n", "import type {\n ICEBasicMaterial,\n ICEGeometry,\n} from '@ice3/core';\nimport { WebGL2GeometryCache } from './WebGL2GeometryCache.js';\nimport type { ICEGeometryRenderable } from './Renderables.js';\nimport { WebGL2Program } from './WebGL2Program.js';\nimport type { ICEInstanceBatch } from './InstanceBatch.js';\n\nexport type { ICEGeometryRenderable } from './Renderables.js';\nexport {\n collectInstanceBatches,\n renderablesOutsideInstanceBatches,\n type ICEInstanceBatch,\n} from './InstanceBatch.js';\n\nexport interface WebGL2InstanceEntry {\n readonly vertexArray: WebGLVertexArrayObject;\n readonly matrixBuffer: WebGLBuffer;\n readonly semanticBuffer: WebGLBuffer;\n readonly triangleIndexBuffer: WebGLBuffer;\n readonly edgeIndexBuffer: WebGLBuffer | null;\n readonly triangleCount: number;\n readonly edgeCount: number;\n instanceCount: number;\n readonly bytes: number;\n}\n\nexport class WebGL2InstanceCache {\n private readonly entries = new Map<string, WebGL2InstanceEntry>();\n private active = new Set<string>();\n private gl: WebGL2RenderingContext | null = null;\n private fallbacks = 0;\n\n retain(\n gl: WebGL2RenderingContext,\n geometryCache: WebGL2GeometryCache,\n batch: ICEInstanceBatch,\n ): Readonly<WebGL2InstanceEntry> | undefined {\n this.gl = gl;\n this.active.add(batch.id);\n const geometry = geometryCache.retain(gl, batch.geometry);\n const existing = this.entries.get(batch.id);\n if (existing) {\n gl.bindBuffer(gl.ARRAY_BUFFER, existing.matrixBuffer);\n gl.bufferData(\n gl.ARRAY_BUFFER,\n batch.instanceMatrices,\n gl.DYNAMIC_DRAW,\n );\n gl.bindBuffer(gl.ARRAY_BUFFER, existing.semanticBuffer);\n gl.bufferData(\n gl.ARRAY_BUFFER,\n batch.semanticIndices,\n gl.DYNAMIC_DRAW,\n );\n gl.bindBuffer(gl.ARRAY_BUFFER, null);\n existing.instanceCount = batch.semanticIds.length;\n return existing;\n }\n\n const vertexArray = gl.createVertexArray();\n const matrixBuffer = gl.createBuffer();\n const semanticBuffer = gl.createBuffer();\n if (!vertexArray || !matrixBuffer || !semanticBuffer) {\n gl.deleteVertexArray(vertexArray);\n gl.deleteBuffer(matrixBuffer);\n gl.deleteBuffer(semanticBuffer);\n this.fallbacks += 1;\n return undefined;\n }\n gl.bindVertexArray(vertexArray);\n gl.bindBuffer(gl.ARRAY_BUFFER, geometry.positionBuffer);\n gl.enableVertexAttribArray(WebGL2Program.POSITION_ATTRIBUTE);\n gl.vertexAttribPointer(\n WebGL2Program.POSITION_ATTRIBUTE,\n 3,\n gl.FLOAT,\n false,\n 0,\n 0,\n );\n if (geometry.colorBuffer) {\n gl.bindBuffer(gl.ARRAY_BUFFER, geometry.colorBuffer);\n gl.enableVertexAttribArray(WebGL2Program.COLOR_ATTRIBUTE);\n gl.vertexAttribPointer(\n WebGL2Program.COLOR_ATTRIBUTE,\n 3,\n gl.FLOAT,\n false,\n 0,\n 0,\n );\n }\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, geometry.triangleIndexBuffer);\n\n gl.bindBuffer(gl.ARRAY_BUFFER, matrixBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, batch.instanceMatrices, gl.DYNAMIC_DRAW);\n for (let column = 0; column < 4; column += 1) {\n const location = WebGL2Program.INSTANCE_MATRIX_ATTRIBUTE + column;\n gl.enableVertexAttribArray(location);\n gl.vertexAttribPointer(\n location,\n 4,\n gl.FLOAT,\n false,\n 64,\n column * 16,\n );\n gl.vertexAttribDivisor(location, 1);\n }\n gl.bindBuffer(gl.ARRAY_BUFFER, semanticBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, batch.semanticIndices, gl.DYNAMIC_DRAW);\n gl.enableVertexAttribArray(WebGL2Program.INSTANCE_SEMANTIC_ATTRIBUTE);\n gl.vertexAttribPointer(\n WebGL2Program.INSTANCE_SEMANTIC_ATTRIBUTE,\n 1,\n gl.UNSIGNED_INT,\n false,\n 0,\n 0,\n );\n gl.vertexAttribDivisor(WebGL2Program.INSTANCE_SEMANTIC_ATTRIBUTE, 1);\n gl.bindVertexArray(null);\n gl.bindBuffer(gl.ARRAY_BUFFER, null);\n\n const entry: WebGL2InstanceEntry = {\n vertexArray,\n matrixBuffer,\n semanticBuffer,\n triangleIndexBuffer: geometry.triangleIndexBuffer,\n edgeIndexBuffer: geometry.edgeIndexBuffer,\n triangleCount: geometry.triangleCount,\n edgeCount: geometry.edgeCount,\n instanceCount: batch.semanticIds.length,\n bytes: batch.instanceMatrices.byteLength\n + batch.semanticIndices.byteLength,\n };\n this.entries.set(batch.id, entry);\n return entry;\n }\n\n beginFrame(): void {\n this.active = new Set();\n this.fallbacks = 0;\n }\n\n endFrame(): void {\n for (const [id, entry] of this.entries) {\n if (this.active.has(id)) continue;\n this.deleteEntry(entry);\n this.entries.delete(id);\n }\n }\n\n clear(): void {\n this.entries.clear();\n this.active.clear();\n this.gl = null;\n this.fallbacks = 0;\n }\n\n dispose(): void {\n if (this.gl) {\n for (const entry of this.entries.values()) {\n this.deleteEntry(entry);\n }\n }\n this.clear();\n }\n\n get fallbackCount(): number {\n return this.fallbacks;\n }\n\n get totalBytes(): number {\n return [...this.entries.values()]\n .reduce((sum, entry) => sum + entry.bytes, 0);\n }\n\n private deleteEntry(entry: WebGL2InstanceEntry): void {\n if (!this.gl) return;\n this.gl.deleteBuffer(entry.matrixBuffer);\n this.gl.deleteBuffer(entry.semanticBuffer);\n this.gl.deleteVertexArray(entry.vertexArray);\n }\n}\n", "import type {\n ICEGeometry,\n ICEGeometryBufferUpdate,\n} from '@ice3/core';\nimport { WebGL2Program } from './WebGL2Program.js';\n\nexport interface GeometryEntry {\n geometry: ICEGeometry;\n readonly geometryId: string;\n readonly attributeDigest: string;\n readonly topologyDigest: string;\n readonly vertexArray: WebGLVertexArrayObject;\n readonly positionBuffer: WebGLBuffer;\n readonly triangleIndexBuffer: WebGLBuffer;\n readonly edgeIndexBuffer: WebGLBuffer | null;\n readonly colorBuffer: WebGLBuffer | null;\n readonly semanticBuffer: WebGLBuffer | null;\n readonly triangleCount: number;\n readonly edgeCount: number;\n readonly bytes: number;\n lastUsedFrame: number;\n}\n\nexport interface WebGL2GeometryCacheOptions {\n readonly inactiveGraceFrames?: number;\n readonly maxBytes?: number;\n}\n\nexport class WebGL2GeometryCache {\n private readonly entries = new Map<string, GeometryEntry>();\n private active = new Set<string>();\n private readonly pinned = new Set<string>();\n private readonly objectKeys = new WeakMap<object, string>();\n private readonly legacyKeys = new WeakMap<object, string>();\n private objectKeySequence = 0;\n private gl: WebGL2RenderingContext | null = null;\n private uploads = 0;\n private updatedBytes = 0;\n private evictions = 0;\n private frameId = 0;\n private readonly inactiveGraceFrames: number;\n private readonly maxBytes: number;\n\n constructor(options: WebGL2GeometryCacheOptions = {}) {\n this.inactiveGraceFrames = options.inactiveGraceFrames ?? 60;\n this.maxBytes = options.maxBytes ?? 768 * 1024 * 1024;\n if (\n !Number.isInteger(this.inactiveGraceFrames)\n || this.inactiveGraceFrames < 0\n || !Number.isInteger(this.maxBytes)\n || this.maxBytes < 1\n ) {\n throw new Error('ICE3_GPU_CACHE_INVALID: cache options are invalid');\n }\n }\n\n retain(\n gl: WebGL2RenderingContext,\n geometry: ICEGeometry,\n ): Readonly<GeometryEntry> {\n this.gl = gl;\n const key = this.keyFor(geometry);\n this.active.add(key);\n const existing = this.entries.get(key);\n if (existing) {\n if (this.canReuse(existing, geometry)) {\n existing.lastUsedFrame = this.frameId;\n return existing;\n }\n }\n\n const next = this.createEntry(gl, geometry, key);\n if (existing) {\n this.deleteEntry(existing, false);\n }\n this.entries.set(key, next);\n this.uploads += 1;\n return next;\n }\n\n private createEntry(\n gl: WebGL2RenderingContext,\n geometry: ICEGeometry,\n key: string,\n ): GeometryEntry {\n const vertexArray = gl.createVertexArray();\n const positionBuffer = gl.createBuffer();\n const triangleIndexBuffer = gl.createBuffer();\n const edgeIndexBuffer = geometry.edgeIndices ? gl.createBuffer() : null;\n const colorBuffer = geometry.colors ? gl.createBuffer() : null;\n const semanticBuffer = geometry.semanticIndices ? gl.createBuffer() : null;\n if (\n !vertexArray\n || !positionBuffer\n || !triangleIndexBuffer\n || (geometry.edgeIndices && !edgeIndexBuffer)\n || (geometry.colors && !colorBuffer)\n || (geometry.semanticIndices && !semanticBuffer)\n ) {\n gl.deleteVertexArray(vertexArray);\n gl.deleteBuffer(positionBuffer);\n gl.deleteBuffer(triangleIndexBuffer);\n gl.deleteBuffer(edgeIndexBuffer);\n gl.deleteBuffer(colorBuffer);\n gl.deleteBuffer(semanticBuffer);\n throw new Error('ICE3_GPU_RESOURCE_FAILED: geometry buffers are unavailable');\n }\n gl.bindVertexArray(vertexArray);\n gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, geometry.positions, gl.STATIC_DRAW);\n gl.enableVertexAttribArray(WebGL2Program.POSITION_ATTRIBUTE);\n gl.vertexAttribPointer(\n WebGL2Program.POSITION_ATTRIBUTE,\n 3,\n gl.FLOAT,\n false,\n 0,\n 0,\n );\n if (colorBuffer && geometry.colors) {\n gl.bindBuffer(gl.ARRAY_BUFFER, colorBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, geometry.colors, gl.STATIC_DRAW);\n gl.enableVertexAttribArray(WebGL2Program.COLOR_ATTRIBUTE);\n gl.vertexAttribPointer(\n WebGL2Program.COLOR_ATTRIBUTE,\n 3,\n gl.FLOAT,\n false,\n 0,\n 0,\n );\n }\n if (semanticBuffer && geometry.semanticIndices) {\n gl.bindBuffer(gl.ARRAY_BUFFER, semanticBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, geometry.semanticIndices, gl.STATIC_DRAW);\n gl.enableVertexAttribArray(2);\n gl.vertexAttribPointer(2, 1, gl.UNSIGNED_INT, false, 0, 0);\n }\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, triangleIndexBuffer);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, geometry.indices, gl.STATIC_DRAW);\n if (edgeIndexBuffer && geometry.edgeIndices) {\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, edgeIndexBuffer);\n gl.bufferData(\n gl.ELEMENT_ARRAY_BUFFER,\n geometry.edgeIndices,\n gl.STATIC_DRAW,\n );\n }\n gl.bindVertexArray(null);\n\n const entry: GeometryEntry = {\n geometry,\n geometryId: geometry.identity?.geometryId ?? key,\n attributeDigest: geometry.identity?.attributeDigest ?? '',\n topologyDigest: geometry.identity?.topologyDigest ?? '',\n vertexArray,\n positionBuffer,\n triangleIndexBuffer,\n edgeIndexBuffer,\n colorBuffer,\n semanticBuffer,\n triangleCount: geometry.indices.length,\n edgeCount: geometry.edgeIndices?.length ?? 0,\n bytes:\n geometry.positions.byteLength\n + geometry.indices.byteLength\n + (geometry.edgeIndices?.byteLength ?? 0)\n + (geometry.colors?.byteLength ?? 0)\n + (geometry.semanticIndices?.byteLength ?? 0),\n lastUsedFrame: this.frameId,\n };\n return entry;\n }\n\n beginFrame(): void {\n this.frameId += 1;\n this.active = new Set();\n }\n\n pin(\n gl: WebGL2RenderingContext,\n geometry: ICEGeometry,\n update?: ICEGeometryBufferUpdate,\n ): Readonly<GeometryEntry> {\n const key = this.keyFor(geometry);\n this.pinned.add(key);\n const existing = this.entries.get(key);\n if (existing && update && this.sameTopology(existing, geometry)) {\n this.gl = gl;\n this.applyPositionUpdate(gl, existing, geometry, update);\n return existing;\n }\n const entry = this.retain(gl, geometry);\n this.enforceBudget();\n if (this.totalBytes > this.maxBytes) {\n this.pinned.delete(key);\n this.deleteEntry(entry, false);\n this.entries.delete(key);\n throw new Error(\n 'ICE3_GPU_RESOURCE_FAILED: geometry exceeds the GPU residency budget',\n );\n }\n return entry;\n }\n\n unpin(geometry: ICEGeometry): void {\n this.pinned.delete(this.keyFor(geometry));\n }\n\n endFrame(): void {\n for (const [geometry, entry] of this.entries) {\n if (this.active.has(geometry) || this.pinned.has(geometry)) {\n continue;\n }\n if (\n this.frameId - entry.lastUsedFrame\n < this.inactiveGraceFrames\n ) {\n continue;\n }\n this.deleteEntry(entry);\n this.entries.delete(geometry);\n }\n this.enforceBudget();\n }\n\n clear(): void {\n this.entries.clear();\n this.active.clear();\n this.pinned.clear();\n this.gl = null;\n }\n\n dispose(): void {\n if (this.gl) {\n for (const entry of this.entries.values()) {\n this.deleteEntry(entry);\n }\n }\n this.clear();\n }\n\n get totalBytes(): number {\n return [...this.entries.values()].reduce((sum, entry) => sum + entry.bytes, 0);\n }\n\n get uploadCount(): number {\n return this.uploads;\n }\n\n get updateBytes(): number {\n return this.updatedBytes;\n }\n\n get evictionCount(): number {\n return this.evictions;\n }\n\n private deleteEntry(\n entry: GeometryEntry,\n eviction = true,\n ): void {\n if (!this.gl) return;\n this.gl.deleteBuffer(entry.positionBuffer);\n this.gl.deleteBuffer(entry.triangleIndexBuffer);\n this.gl.deleteBuffer(entry.edgeIndexBuffer);\n this.gl.deleteBuffer(entry.colorBuffer);\n this.gl.deleteBuffer(entry.semanticBuffer);\n this.gl.deleteVertexArray(entry.vertexArray);\n if (eviction) {\n this.evictions += 1;\n }\n }\n\n private enforceBudget(): void {\n let total = this.totalBytes;\n if (total <= this.maxBytes) return;\n const candidates = [...this.entries]\n .filter(([geometry]) => !this.pinned.has(geometry))\n .sort((left, right) => (\n left[1].lastUsedFrame - right[1].lastUsedFrame\n ));\n for (const [geometry, entry] of candidates) {\n if (total <= this.maxBytes) break;\n this.deleteEntry(entry);\n this.entries.delete(geometry);\n total -= entry.bytes;\n }\n }\n\n private applyPositionUpdate(\n gl: WebGL2RenderingContext,\n entry: GeometryEntry,\n geometry: ICEGeometry,\n update: ICEGeometryBufferUpdate,\n ): void {\n let updated = 0;\n try {\n gl.bindBuffer(gl.ARRAY_BUFFER, entry.positionBuffer);\n for (const range of update.positionRanges) {\n if (\n range.byteOffset % 4 !== 0\n || range.byteLength % 4 !== 0\n || range.byteOffset + range.byteLength > geometry.positions.byteLength\n ) {\n throw new Error('invalid position range');\n }\n gl.bufferSubData(\n gl.ARRAY_BUFFER,\n range.byteOffset,\n new Uint8Array(\n geometry.positions.buffer,\n geometry.positions.byteOffset + range.byteOffset,\n range.byteLength,\n ),\n );\n updated += range.byteLength;\n }\n } catch (error) {\n throw new Error('ICE3_GPU_RESOURCE_FAILED: geometry update failed', {\n cause: error,\n });\n }\n entry.geometry = geometry;\n entry.lastUsedFrame = this.frameId;\n this.updatedBytes += updated;\n }\n\n private canReuse(existing: GeometryEntry, geometry: ICEGeometry): boolean {\n if (existing.geometry === geometry) {\n return true;\n }\n if (!this.sameTopology(existing, geometry)) {\n return false;\n }\n const existingDigest = existing.attributeDigest;\n const nextDigest = geometry.identity?.attributeDigest ?? '';\n return (\n (\n existing.geometry.positions === geometry.positions\n || equalNumberArrays(existing.geometry.positions, geometry.positions)\n )\n && equalOptionalNumberArrays(\n existing.geometry.colors,\n geometry.colors,\n )\n && equalOptionalNumberArrays(\n existing.geometry.semanticIndices,\n geometry.semanticIndices,\n )\n && equalOptionalNumberArrays(\n existing.geometry.edgeIndices,\n geometry.edgeIndices,\n )\n ) || (existingDigest !== '' && existingDigest === nextDigest);\n }\n\n private sameTopology(existing: GeometryEntry, geometry: ICEGeometry): boolean {\n const existingDigest = existing.topologyDigest;\n const nextDigest = geometry.identity?.topologyDigest ?? '';\n return (\n existing.geometry.indices.constructor === geometry.indices.constructor\n && existing.geometry.indices.length === geometry.indices.length\n && (\n existing.geometry.indices === geometry.indices\n || (existingDigest !== '' && existingDigest === nextDigest)\n || equalTypedArrays(existing.geometry.indices, geometry.indices)\n )\n );\n }\n\n private keyFor(geometry: ICEGeometry): string {\n const identity = geometry.identity?.geometryId;\n if (identity) {\n return `identity:${identity}`;\n }\n const id = (geometry as ICEGeometry & { id?: unknown }).id;\n if (typeof id === 'string' && id.trim()) {\n const cached = this.legacyKeys.get(geometry);\n if (cached) return cached;\n const key = [\n 'content',\n geometry.positions.length,\n geometry.indices.length,\n contentFingerprint(geometry.positions),\n contentFingerprint(geometry.indices),\n geometry.colors ? contentFingerprint(geometry.colors) : 0,\n geometry.edgeIndices ? contentFingerprint(geometry.edgeIndices) : 0,\n geometry.semanticIndices\n ? contentFingerprint(geometry.semanticIndices)\n : 0,\n ].join(':');\n this.legacyKeys.set(geometry, key);\n return key;\n }\n const existing = this.objectKeys.get(geometry);\n if (existing) {\n return existing;\n }\n const key = `object:${this.objectKeySequence}`;\n this.objectKeySequence += 1;\n this.objectKeys.set(geometry, key);\n return key;\n }\n}\n\nfunction equalTypedArrays(\n left: Uint16Array | Uint32Array,\n right: Uint16Array | Uint32Array,\n): boolean {\n return left.length === right.length\n && left.every((value, index) => value === right[index]);\n}\n\nfunction equalNumberArrays(\n left: Float32Array,\n right: Float32Array,\n): boolean {\n return left.length === right.length\n && left.every((value, index) => value === right[index]);\n}\n\nfunction equalOptionalNumberArrays<T extends Uint16Array | Uint32Array | Float32Array>(\n left: T | undefined,\n right: T | undefined,\n): boolean {\n if (left === undefined || right === undefined) {\n return left === right;\n }\n return left.length === right.length\n && left.every((value, index) => value === right[index]);\n}\n\nfunction contentFingerprint(\n values: Uint16Array | Uint32Array | Float32Array,\n): number {\n let hash = 0x811c9dc5;\n const bytes = new Uint8Array(\n values.buffer,\n values.byteOffset,\n values.byteLength,\n );\n for (const byte of bytes) {\n hash ^= byte;\n hash = Math.imul(hash, 0x01000193) >>> 0;\n }\n return hash;\n}\n", "const MAX_SELECTION_INDEX = 0xffffff;\n\nexport function encodeSelectionIndex(\n index: number,\n): readonly [number, number, number, 255] {\n if (!Number.isInteger(index) || index < 0 || index > MAX_SELECTION_INDEX) {\n throw new RangeError('ICE selection index is out of range');\n }\n return [\n index & 0xff,\n (index >>> 8) & 0xff,\n (index >>> 16) & 0xff,\n 255,\n ];\n}\n\nexport function decodeSelectionIndex(\n pixel: ArrayLike<number>,\n): number | undefined {\n if (pixel.length < 4) {\n throw new RangeError('ICE pick pixel must contain RGBA values');\n }\n const index = pixel[0]!\n + pixel[1]! * 256\n + pixel[2]! * 65_536;\n return index === 0 ? undefined : index;\n}\n", "import { ICEEngineError } from '@ice3/core';\nimport type { ICEMatrix4 } from '@ice3/core';\n\nconst VERTEX_SOURCE = `#version 300 es\nlayout(location = 0) in vec3 a_position;\nlayout(location = 2) in float a_semantic;\nlayout(location = 3) in vec4 a_instanceColumn0;\nlayout(location = 4) in vec4 a_instanceColumn1;\nlayout(location = 5) in vec4 a_instanceColumn2;\nlayout(location = 6) in vec4 a_instanceColumn3;\nlayout(location = 7) in float a_instanceSemantic;\nuniform mat4 u_worldViewProjection;\nuniform float u_useInstancing;\nflat out int v_semantic;\n\nvoid main() {\n mat4 instanceMatrix = mat4(\n a_instanceColumn0,\n a_instanceColumn1,\n a_instanceColumn2,\n a_instanceColumn3\n );\n vec4 localPosition = vec4(a_position, 1.0);\n vec4 position = mix(\n localPosition,\n instanceMatrix * localPosition,\n u_useInstancing\n );\n gl_Position = u_worldViewProjection * position;\n float semantic = mix(a_semantic, a_instanceSemantic, u_useInstancing);\n v_semantic = int(semantic + 0.5);\n}\n`;\n\nconst FRAGMENT_SOURCE = `#version 300 es\nprecision highp float;\nuniform float u_pickMode;\nuniform uint u_pickBase;\nuniform float u_highlightSemantic;\nuniform vec4 u_color;\nflat in int v_semantic;\nout vec4 outColor;\n\nvoid main() {\n if (u_pickMode > 0.5) {\n uint id = u_pickBase + uint(v_semantic) + 1u;\n outColor = vec4(\n float(id & 255u),\n float((id >> 8u) & 255u),\n float((id >> 16u) & 255u),\n 1.0\n ) / 255.0;\n return;\n }\n if (abs(float(v_semantic) - u_highlightSemantic) > 0.1) discard;\n outColor = u_color;\n}\n`;\n\nexport class WebGL2SemanticProgram {\n private readonly program: WebGLProgram;\n private readonly matrixLocation: WebGLUniformLocation;\n private readonly pickModeLocation: WebGLUniformLocation;\n private readonly pickBaseLocation: WebGLUniformLocation;\n private readonly highlightLocation: WebGLUniformLocation;\n private readonly colorLocation: WebGLUniformLocation;\n private readonly instancingLocation: WebGLUniformLocation;\n\n constructor(private readonly gl: WebGL2RenderingContext) {\n const program = this.createProgram(VERTEX_SOURCE, FRAGMENT_SOURCE);\n const matrixLocation = gl.getUniformLocation(program, 'u_worldViewProjection');\n const pickModeLocation = gl.getUniformLocation(program, 'u_pickMode');\n const pickBaseLocation = gl.getUniformLocation(program, 'u_pickBase');\n const highlightLocation = gl.getUniformLocation(program, 'u_highlightSemantic');\n const colorLocation = gl.getUniformLocation(program, 'u_color');\n const instancingLocation = gl.getUniformLocation(program, 'u_useInstancing');\n if (\n !matrixLocation\n || !pickModeLocation\n || !pickBaseLocation\n || !highlightLocation\n || !colorLocation\n || !instancingLocation\n ) {\n gl.deleteProgram(program);\n throw new ICEEngineError(\n 'ICE3_SHADER_LINK_FAILED',\n 'ICE3_SHADER_LINK_FAILED: semantic uniforms are missing',\n );\n }\n this.program = program;\n this.matrixLocation = matrixLocation;\n this.pickModeLocation = pickModeLocation;\n this.pickBaseLocation = pickBaseLocation;\n this.highlightLocation = highlightLocation;\n this.colorLocation = colorLocation;\n this.instancingLocation = instancingLocation;\n }\n\n use(): void {\n this.gl.useProgram(this.program);\n }\n\n setMatrix(matrix: ICEMatrix4): void {\n this.gl.uniformMatrix4fv(this.matrixLocation, false, matrix.elements);\n }\n\n setPick(base: number): void {\n this.gl.uniform1f(this.pickModeLocation, 1);\n this.gl.uniform1ui(this.pickBaseLocation, base);\n }\n\n setHighlight(semanticIndex: number): void {\n this.gl.uniform1f(this.pickModeLocation, 0);\n this.gl.uniform1f(this.highlightLocation, semanticIndex);\n this.gl.uniform4f(this.colorLocation, 1, 208 / 255, 0, 0.72);\n }\n\n setInstancing(enabled: boolean): void {\n this.gl.uniform1f(this.instancingLocation, enabled ? 1 : 0);\n }\n\n dispose(): void {\n this.gl.deleteProgram(this.program);\n }\n\n private createProgram(vertexSource: string, fragmentSource: string): WebGLProgram {\n const gl = this.gl;\n const vertex = this.compile(gl.VERTEX_SHADER, vertexSource);\n const fragment = this.compile(gl.FRAGMENT_SHADER, fragmentSource);\n const program = gl.createProgram();\n if (!program) {\n gl.deleteShader(vertex);\n gl.deleteShader(fragment);\n throw new ICEEngineError(\n 'ICE3_SHADER_LINK_FAILED',\n 'ICE3_SHADER_LINK_FAILED: program allocation failed',\n );\n }\n gl.attachShader(program, vertex);\n gl.attachShader(program, fragment);\n gl.linkProgram(program);\n gl.deleteShader(vertex);\n gl.deleteShader(fragment);\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n const log = gl.getProgramInfoLog(program) ?? 'unknown link error';\n gl.deleteProgram(program);\n throw new ICEEngineError(\n 'ICE3_SHADER_LINK_FAILED',\n `ICE3_SHADER_LINK_FAILED: ${log}`,\n );\n }\n return program;\n }\n\n private compile(type: number, source: string): WebGLShader {\n const gl = this.gl;\n const shader = gl.createShader(type);\n if (!shader) {\n throw new ICEEngineError(\n 'ICE3_SHADER_COMPILE_FAILED',\n 'ICE3_SHADER_COMPILE_FAILED: shader allocation failed',\n );\n }\n gl.shaderSource(shader, source);\n gl.compileShader(shader);\n if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n const log = gl.getShaderInfoLog(shader) ?? 'unknown compile error';\n gl.deleteShader(shader);\n throw new ICEEngineError(\n 'ICE3_SHADER_COMPILE_FAILED',\n `ICE3_SHADER_COMPILE_FAILED: ${log}`,\n );\n }\n return shader;\n }\n}\n", "import { ICEEngineError, ICEMatrix4 } from '@ice3/core';\nimport type { ICEGeometryRenderable } from './WebGL2GeometryBatch.js';\nimport type { WebGL2GeometryCache } from './WebGL2GeometryCache.js';\nimport type {\n ICEInstanceBatch,\n WebGL2InstanceCache,\n} from './WebGL2InstanceBatch.js';\nimport {\n decodeSelectionIndex,\n encodeSelectionIndex,\n} from './WebGL2PickCodec.js';\nimport { WebGL2Program } from './WebGL2Program.js';\nimport type { ICERenderBatchDraw } from './WebGL2RenderBatch.js';\nimport { WebGL2SemanticProgram } from './WebGL2SemanticProgram.js';\nimport type { ICEFrame, ICEScreenPoint } from './types.js';\n\nexport type ICEPickFrame = ICEFrame & {\n readonly point: ICEScreenPoint;\n};\n\nexport class WebGL2Picker {\n private readonly program: WebGL2Program;\n private readonly semanticProgram: WebGL2SemanticProgram;\n private framebuffer: WebGLFramebuffer | null = null;\n private colorTexture: WebGLTexture | null = null;\n private depthBuffer: WebGLRenderbuffer | null = null;\n private width = 0;\n private height = 0;\n\n constructor(private readonly gl: WebGL2RenderingContext) {\n this.program = new WebGL2Program(gl);\n this.semanticProgram = new WebGL2SemanticProgram(gl);\n }\n\n pick(\n frame: ICEPickFrame,\n cache: WebGL2GeometryCache,\n renderables: readonly ICEGeometryRenderable[],\n batches: readonly ICERenderBatchDraw[] = [],\n instances: readonly ICEInstanceBatch[] = [],\n instanceCache: WebGL2InstanceCache | null = null,\n ): string | undefined {\n const pickIds = new Map<number, string>();\n const selectionIds = new Map<string, number>();\n for (const renderable of renderables) {\n const id = renderable.mesh.selectionId;\n if (!selectionIds.has(id)) {\n if (selectionIds.size >= 0xffffff) {\n throw new ICEEngineError(\n 'ICE3_PICK_CAPACITY',\n 'ICE3_PICK_CAPACITY: too many selectable devices',\n );\n }\n const index = selectionIds.size + 1;\n selectionIds.set(id, index);\n pickIds.set(index, id);\n }\n }\n this.ensureTarget(\n Math.max(1, Math.round(frame.viewport.width * frame.dpr)),\n Math.max(1, Math.round(frame.viewport.height * frame.dpr)),\n );\n const gl = this.gl;\n gl.bindFramebuffer(gl.FRAMEBUFFER, this.framebuffer);\n gl.viewport(0, 0, this.width, this.height);\n gl.clearColor(0, 0, 0, 1);\n gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);\n gl.enable(gl.DEPTH_TEST);\n gl.depthFunc(gl.LEQUAL);\n gl.disable(gl.BLEND);\n this.program.use();\n this.program.setPickMode(true);\n this.program.setClipOffset(0, 0);\n this.program.setInstancing(false);\n const aspect = frame.viewport.width / Math.max(frame.viewport.height, 1);\n const viewProjection = frame.camera.getViewProjectionMatrix(aspect);\n const mvp = new ICEMatrix4();\n const world = new ICEMatrix4();\n const instancedMeshIds = new Set<string>();\n if (instanceCache) {\n for (const batch of instances) {\n if (instanceCache.retain(gl, cache, batch)) {\n for (const id of batch.meshIds) instancedMeshIds.add(id);\n }\n }\n }\n for (const renderable of renderables) {\n if (instancedMeshIds.has(renderable.id)) continue;\n const selectionIndex = selectionIds.get(renderable.mesh.selectionId)!;\n const color = encodeSelectionIndex(selectionIndex);\n this.program.setColor([\n color[0] / 255,\n color[1] / 255,\n color[2] / 255,\n 1,\n ]);\n mvp.elements.set(viewProjection.elements);\n world.elements.set(renderable.worldMatrix);\n mvp.multiply(world);\n this.program.setMatrix(mvp);\n this.program.setVertexColors(false);\n const geometry = cache.retain(gl, renderable.mesh.geometry);\n gl.bindVertexArray(geometry.vertexArray);\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, geometry.triangleIndexBuffer);\n gl.drawElements(\n gl.TRIANGLES,\n geometry.triangleCount,\n renderable.mesh.geometry.indices instanceof Uint16Array\n ? gl.UNSIGNED_SHORT\n : gl.UNSIGNED_INT,\n 0,\n );\n }\n this.semanticProgram.use();\n let nextPickId = selectionIds.size + 1;\n if (instanceCache) {\n this.semanticProgram.setInstancing(true);\n mvp.elements.set(viewProjection.elements);\n this.semanticProgram.setMatrix(mvp);\n for (const batch of instances) {\n const instance = instanceCache.retain(gl, cache, batch);\n if (!instance) continue;\n const base = nextPickId - 1;\n for (const id of batch.semanticIds) {\n if (nextPickId > 0xffffff) {\n throw new ICEEngineError(\n 'ICE3_PICK_CAPACITY',\n 'ICE3_PICK_CAPACITY: too many selectable instances',\n );\n }\n pickIds.set(nextPickId, id);\n nextPickId += 1;\n }\n this.semanticProgram.setPick(base);\n gl.bindVertexArray(instance.vertexArray);\n gl.drawElementsInstanced(\n gl.TRIANGLES,\n instance.triangleCount,\n batch.geometry.indices instanceof Uint16Array\n ? gl.UNSIGNED_SHORT\n : gl.UNSIGNED_INT,\n 0,\n instance.instanceCount,\n );\n }\n }\n this.semanticProgram.setInstancing(false);\n for (const draw of batches) {\n const base = nextPickId - 1;\n for (const id of draw.batch.semanticSelectionIds) {\n if (nextPickId > 0xffffff) {\n throw new ICEEngineError(\n 'ICE3_PICK_CAPACITY',\n 'ICE3_PICK_CAPACITY: too many selectable batch devices',\n );\n }\n pickIds.set(nextPickId, id);\n nextPickId += 1;\n }\n mvp.elements.set(viewProjection.elements);\n world.elements.set(draw.worldMatrix);\n mvp.multiply(world);\n this.semanticProgram.setMatrix(mvp);\n this.semanticProgram.setPick(base);\n const geometry = cache.retain(gl, draw.batch.geometry);\n gl.bindVertexArray(geometry.vertexArray);\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, geometry.triangleIndexBuffer);\n gl.drawElements(\n gl.TRIANGLES,\n geometry.triangleCount,\n draw.batch.geometry.indices instanceof Uint16Array\n ? gl.UNSIGNED_SHORT\n : gl.UNSIGNED_INT,\n 0,\n );\n }\n const pixelX = Math.max(\n 0,\n Math.min(\n this.width - 1,\n Math.floor(frame.point.x * frame.dpr),\n ),\n );\n const pixelY = Math.max(\n 0,\n Math.min(\n this.height - 1,\n Math.floor((frame.viewport.height - frame.point.y) * frame.dpr),\n ),\n );\n gl.pixelStorei(gl.PACK_ALIGNMENT, 1);\n const pixel = new Uint8Array(4);\n gl.readPixels(pixelX, pixelY, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, pixel);\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n gl.viewport(\n frame.viewport.x * frame.dpr,\n frame.viewport.y * frame.dpr,\n frame.viewport.width * frame.dpr,\n frame.viewport.height * frame.dpr,\n );\n const index = decodeSelectionIndex(pixel);\n return index === undefined ? undefined : pickIds.get(index);\n }\n\n dispose(): void {\n this.releaseTarget();\n this.program.dispose();\n this.semanticProgram.dispose();\n }\n\n private ensureTarget(width: number, height: number): void {\n if (\n this.framebuffer\n && this.colorTexture\n && this.depthBuffer\n && this.width === width\n && this.height === height\n ) {\n return;\n }\n this.releaseTarget();\n const gl = this.gl;\n const framebuffer = gl.createFramebuffer();\n const colorTexture = gl.createTexture();\n const depthBuffer = gl.createRenderbuffer();\n if (!framebuffer || !colorTexture || !depthBuffer) {\n gl.deleteFramebuffer(framebuffer);\n gl.deleteTexture(colorTexture);\n gl.deleteRenderbuffer(depthBuffer);\n throw new ICEEngineError(\n 'ICE3_PICK_UNAVAILABLE',\n 'ICE3_PICK_UNAVAILABLE: pick target allocation failed',\n );\n }\n gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);\n gl.bindTexture(gl.TEXTURE_2D, colorTexture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.texImage2D(\n gl.TEXTURE_2D,\n 0,\n gl.RGBA8,\n width,\n height,\n 0,\n gl.RGBA,\n gl.UNSIGNED_BYTE,\n null,\n );\n gl.framebufferTexture2D(\n gl.FRAMEBUFFER,\n gl.COLOR_ATTACHMENT0,\n gl.TEXTURE_2D,\n colorTexture,\n 0,\n );\n gl.bindRenderbuffer(gl.RENDERBUFFER, depthBuffer);\n gl.renderbufferStorage(\n gl.RENDERBUFFER,\n gl.DEPTH_COMPONENT16,\n width,\n height,\n );\n gl.framebufferRenderbuffer(\n gl.FRAMEBUFFER,\n gl.DEPTH_ATTACHMENT,\n gl.RENDERBUFFER,\n depthBuffer,\n );\n if (gl.checkFramebufferStatus(gl.FRAMEBUFFER) !== gl.FRAMEBUFFER_COMPLETE) {\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n gl.deleteFramebuffer(framebuffer);\n gl.deleteTexture(colorTexture);\n gl.deleteRenderbuffer(depthBuffer);\n throw new ICEEngineError(\n 'ICE3_PICK_UNAVAILABLE',\n 'ICE3_PICK_UNAVAILABLE: pick framebuffer is incomplete',\n );\n }\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n this.framebuffer = framebuffer;\n this.colorTexture = colorTexture;\n this.depthBuffer = depthBuffer;\n this.width = width;\n this.height = height;\n }\n\n private releaseTarget(): void {\n const gl = this.gl;\n gl.deleteFramebuffer(this.framebuffer);\n gl.deleteTexture(this.colorTexture);\n gl.deleteRenderbuffer(this.depthBuffer);\n this.framebuffer = null;\n this.colorTexture = null;\n this.depthBuffer = null;\n }\n}\n", "import { ICEEngineError } from '@ice3/core';\n\n/**\n * Compile and link a program, throwing with the driver's info log on failure.\n *\n * WebGL fails silently: `compileShader`/`linkProgram` only set a status flag, and\n * code that returns `null` on failure turns a shader typo into \"this pass simply\n * does nothing\". That is exactly how a depth pass can run for two rounds without\n * changing a single pixel (SPEC-007). Every program in the renderer goes through\n * here so a broken shader is loud and quotable.\n */\nexport function createShaderProgram(\n gl: WebGL2RenderingContext,\n vertexSource: string,\n fragmentSource: string,\n label: string,\n): WebGLProgram {\n const vertex = compileShader(gl, gl.VERTEX_SHADER, vertexSource, `${label}:vertex`);\n const fragment = compileShader(gl, gl.FRAGMENT_SHADER, fragmentSource, `${label}:fragment`);\n const program = gl.createProgram();\n if (!program) {\n throw new ICEEngineError(\n 'ICE3_SHADER_LINK_FAILED',\n `ICE3_SHADER_LINK_FAILED: ${label}: program allocation failed`,\n );\n }\n gl.attachShader(program, vertex);\n gl.attachShader(program, fragment);\n gl.linkProgram(program);\n gl.deleteShader(vertex);\n gl.deleteShader(fragment);\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n const log = gl.getProgramInfoLog(program) ?? 'unknown link error';\n gl.deleteProgram(program);\n throw new ICEEngineError(\n 'ICE3_SHADER_LINK_FAILED',\n `ICE3_SHADER_LINK_FAILED: ${label}: ${log}`,\n );\n }\n return program;\n}\n\nfunction compileShader(\n gl: WebGL2RenderingContext,\n type: number,\n source: string,\n label: string,\n): WebGLShader {\n const shader = gl.createShader(type);\n if (!shader) {\n throw new ICEEngineError(\n 'ICE3_SHADER_COMPILE_FAILED',\n `ICE3_SHADER_COMPILE_FAILED: ${label}: allocation failed`,\n );\n }\n gl.shaderSource(shader, source);\n gl.compileShader(shader);\n if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n const log = gl.getShaderInfoLog(shader) ?? 'unknown compile error';\n gl.deleteShader(shader);\n throw new ICEEngineError(\n 'ICE3_SHADER_COMPILE_FAILED',\n `ICE3_SHADER_COMPILE_FAILED: ${label}: ${log}`,\n );\n }\n return shader;\n}\n", "//! \u9634\u5F71\u89C6\u9525\uFF1A\u6309\u573A\u666F\u5305\u56F4\u76D2\u62DF\u5408\u65B9\u5411\u5149\u7684\u6B63\u4EA4\u6295\u5F71\u3002\n//!\n//! \u65E9\u671F\u5B9E\u73B0\u628A\u5149\u7167\u89C6\u9525\u5199\u6B7B\u6210 860 \u7C73\u89C1\u65B9\u3001960 \u7C73\u6DF1\u3002\u4E24\u4E2A\u540E\u679C\u90FD\u5F88\u8D35\uFF1A\n//! 2048 \u7684\u6DF1\u5EA6\u56FE\u644A\u5230 860 \u7C73\u662F\u6BCF\u7EB9\u7D20 0.42 \u7C73\uFF08\u8584\u5899\u7684\u5F71\u5B50\u76F4\u63A5\u6D88\u5931\uFF09\uFF0C\n//! \u800C\u6DF1\u5EA6\u504F\u5DEE 0.0015 \u5728 960 \u7C73\u7684\u8DE8\u5EA6\u4E0A\u7B49\u4E8E 1.4 \u7C73\uFF0C\u77ED\u5F71\u5B50\u88AB\u6574\u6BB5\u5403\u6389\u3002\n//! \u89C6\u9525\u8D34\u5408\u573A\u666F\u540E\uFF0C\u504F\u5DEE\u56DE\u5230\"\u5398\u7C73\"\u91CF\u7EA7\uFF0C\u8D34\u56FE\u5206\u8FA8\u7387\u4E5F\u624D\u6709\u610F\u4E49\u3002\n\nimport { ICEMatrix4, ICEVector3 } from '@ice3/core';\n\nexport type ICEBounds = Readonly<{\n min: readonly [number, number, number];\n max: readonly [number, number, number];\n}>;\n\n/** \u5149\u6E90\u65B9\u5411\uFF08\u4E0E\u4E3B\u7740\u8272\u5668\u3001\u9634\u5F71 pass \u5171\u7528\u540C\u4E00\u7EA6\u5B9A\uFF1A\u6307\u5411\"\u5149\u4F20\u64AD\"\u7684\u65B9\u5411\uFF09\u3002 */\nexport const SHADOW_LIGHT_DIRECTION: readonly [number, number, number] = [-0.35, 0.85, 0.4];\n\n/** \u89C6\u9525\u56DB\u5468\u7559\u51FA\u7684\u4F59\u91CF\uFF0C\u6309\u573A\u666F\u534A\u5F84\u7684\u6BD4\u4F8B\u7ED9\uFF1A\u8D34\u592A\u7D27\u4F1A\u8BA9\u8FB9\u7F18\u7684\u6295\u5F71\u88AB\u88C1\u6389\u3002 */\nconst BOUNDS_PADDING = 0.08;\n\nexport type ICEShadowFrustum = Readonly<{\n /** \u5149\u7167\u89C6\u56FE\u6295\u5F71\u77E9\u9635\uFF08\u5217\u4E3B\u5E8F 16 \u5143\u7D20\uFF09\u3002 */\n matrix: Float32Array;\n /** \u4E00\u4E2A\u7EB9\u7D20\u5728\u4E16\u754C\u7A7A\u95F4\u91CC\u7684\u8FB9\u957F\uFF08\u7C73\uFF09\uFF1A\u6CD5\u7EBF\u504F\u79FB\u91CF\u6309\u5B83\u6765\u7B97\u3002 */\n texelWorld: number;\n}>;\n\n/**\n * \u573A\u666F\u5305\u56F4\u76D2 \u2192 \u5149\u7167\u89C6\u56FE\u6295\u5F71\u77E9\u9635\uFF08\u5217\u4E3B\u5E8F 16 \u5143\u7D20\uFF09\u3002\n *\n * \u4F20\u5165 `null` \u65F6\u9000\u56DE\u4E00\u4E2A\u8986\u76D6 600 \u7C73\u573A\u5730\u7684\u9ED8\u8BA4\u76D2\uFF0C\u907F\u514D\u76F4\u63A5\u629B\u9519\uFF1A\n * \u9634\u5F71\u662F\u53EF\u9009\u6548\u679C\uFF0C\u5B81\u53EF\u4FDD\u5B88\u8986\u76D6\u4E5F\u4E0D\u8981\u6574\u5E27\u5931\u8D25\u3002\n */\nexport function shadowFrustum(bounds: ICEBounds | null, mapSize = 2048): ICEShadowFrustum {\n const box = bounds ?? { min: [-50, -5, -50] as const, max: [650, 60, 650] as const };\n const centre: [number, number, number] = [\n (box.min[0] + box.max[0]) / 2,\n (box.min[1] + box.max[1]) / 2,\n (box.min[2] + box.max[2]) / 2,\n ];\n const radius = Math.max(\n 1,\n 0.5 * Math.hypot(\n box.max[0] - box.min[0],\n box.max[1] - box.min[1],\n box.max[2] - box.min[2],\n ),\n );\n const pad = radius * BOUNDS_PADDING;\n const direction = normalize(SHADOW_LIGHT_DIRECTION);\n const distance = radius * 2 + pad * 2;\n const eye: [number, number, number] = [\n centre[0] + direction[0] * distance,\n centre[1] + direction[1] * distance,\n centre[2] + direction[2] * distance,\n ];\n\n const view = new ICEMatrix4().lookAt(\n new ICEVector3(eye[0], eye[1], eye[2]),\n new ICEVector3(centre[0], centre[1], centre[2]),\n new ICEVector3(0, 1, 0),\n );\n\n // \u628A\u516B\u4E2A\u89D2\u6295\u5230\u89C6\u56FE\u7A7A\u95F4\uFF0C\u53D6\u7D27\u8D34\u7684 x/y/z \u8303\u56F4\u2014\u2014\u8FD9\u5C31\u662F\u89C6\u9525\u7684\u771F\u5B9E\u5C3A\u5BF8\u3002\n let minX = Infinity;\n let maxX = -Infinity;\n let minY = Infinity;\n let maxY = -Infinity;\n let minZ = Infinity;\n let maxZ = -Infinity;\n for (let corner = 0; corner < 8; corner += 1) {\n const point = new ICEVector3(\n corner & 1 ? box.max[0] : box.min[0],\n corner & 2 ? box.max[1] : box.min[1],\n corner & 4 ? box.max[2] : box.min[2],\n );\n const projected = view.transformPoint(point);\n minX = Math.min(minX, projected[0]);\n maxX = Math.max(maxX, projected[0]);\n minY = Math.min(minY, projected[1]);\n maxY = Math.max(maxY, projected[1]);\n // lookAt \u7684 z \u8F74\u6307\u5411\u76F8\u673A\u540E\u65B9\uFF0C\u9762\u524D\u7684\u70B9 z \u4E3A\u8D1F\uFF1B\u6B63\u4EA4\u6295\u5F71\u7684 near/far \u8981\u53D6\u53CD\u3002\n minZ = Math.min(minZ, projected[2]);\n maxZ = Math.max(maxZ, projected[2]);\n }\n\n const projection = orthographic(\n minX - pad,\n maxX + pad,\n minY - pad,\n maxY + pad,\n -maxZ - pad,\n -minZ + pad,\n );\n const width = (maxX - minX) + pad * 2;\n const height = (maxY - minY) + pad * 2;\n return {\n matrix: multiply(projection, view.elements),\n texelWorld: Math.max(width, height) / mapSize,\n };\n}\n\nfunction normalize(value: readonly [number, number, number]): [number, number, number] {\n const length = Math.hypot(value[0], value[1], value[2]) || 1;\n return [value[0] / length, value[1] / length, value[2] / length];\n}\n\nfunction orthographic(\n left: number,\n right: number,\n bottom: number,\n top: number,\n near: number,\n far: number,\n): number[] {\n const lr = 1 / (left - right);\n const bt = 1 / (bottom - top);\n const nf = 1 / (near - far);\n return [\n -2 * lr, 0, 0, 0,\n 0, -2 * bt, 0, 0,\n 0, 0, 2 * nf, 0,\n (left + right) * lr, (top + bottom) * bt, (far + near) * nf, 1,\n ];\n}\n\nfunction multiply(\n a: readonly number[] | Float32Array,\n b: readonly number[] | Float32Array,\n): Float32Array {\n const out = new Float32Array(16);\n for (let column = 0; column < 4; column += 1) {\n for (let row = 0; row < 4; row += 1) {\n let sum = 0;\n for (let k = 0; k < 4; k += 1) {\n sum += (a[k * 4 + row] ?? 0) * (b[column * 4 + k] ?? 0);\n }\n out[column * 4 + row] = sum;\n }\n }\n return out;\n}\n", "//! \u65B9\u5411\u5149\u9634\u5F71\u8D34\u56FE\u3002\n//!\n//! \u4E00\u6B21\u6DF1\u5EA6 pass \u628A\u573A\u666F\u4ECE\u5149\u6E90\u65B9\u5411\u6E32\u67D3\u8FDB\u6DF1\u5EA6\u7EB9\u7406\uFF0C\u4E3B pass \u518D\u6309\u4E16\u754C\u5750\u6807\u6BD4\u8F83\u6DF1\u5EA6\u3002\n//! \u53EA\u5904\u7406\u5355\u65B9\u5411\u5149\u3001\u5355\u5F20\u8D34\u56FE\uFF1B\u89C6\u9525\u6309\u573A\u666F\u5305\u56F4\u76D2\u62DF\u5408\uFF08\u89C1 ShadowFrustum\uFF09\u3002\n\nimport { createShaderProgram } from './WebGL2Shader.js';\nimport { shadowFrustum, type ICEBounds } from './ShadowFrustum.js';\n\nconst VERTEX_SOURCE = `#version 300 es\nlayout(location = 0) in vec3 a_position;\nlayout(location = 3) in mat4 a_instanceMatrix;\nuniform mat4 u_matrix;\nuniform float u_useInstancing;\nvoid main() {\n vec4 local = vec4(a_position, 1.0);\n vec4 world = mix(local, a_instanceMatrix * local, u_useInstancing);\n gl_Position = u_matrix * world;\n}\n`;\n\nconst FRAGMENT_SOURCE = `#version 300 es\nprecision highp float;\nvoid main() {\n // \u53EA\u5199\u6DF1\u5EA6\uFF0C\u989C\u8272\u4E0D\u9700\u8981\u3002\n}\n`;\n\n/** \u5149\u6E90\u65B9\u5411\uFF08\u4E0E\u4E3B\u7740\u8272\u5668\u7684 diffuse \u4FDD\u6301\u540C\u4E00\u65B9\u5411\uFF09\u3002 */\nexport { SHADOW_LIGHT_DIRECTION as LIGHT_DIRECTION } from './ShadowFrustum.js';\n\nconst SHADOW_SIZE = 2048;\n\nexport class WebGL2ShadowMap {\n /** \u6700\u8FD1\u4E00\u6B21\u7740\u8272\u5668\u7F16\u8BD1/\u94FE\u63A5\u5931\u8D25\u7684\u539F\u56E0\uFF0C\u4F9B\u8BCA\u65AD\u8BFB\u53D6\u3002 */\n lastError: string | null = null;\n private framebuffer: WebGLFramebuffer | null = null;\n private depthTexture: WebGLTexture | null = null;\n private program: WebGLProgram | null = null;\n private matrixLocation: WebGLUniformLocation | null = null;\n private instancingLocation: WebGLUniformLocation | null = null;\n private matrixScratch = new Float32Array(16);\n private texelWorldValue = 1;\n\n constructor(private readonly gl: WebGL2RenderingContext) {\n this.createResources();\n }\n\n /** \u6DF1\u5EA6\u7EB9\u7406\uFF0C\u4F9B\u4E3B\u7740\u8272\u5668\u91C7\u6837\u3002 */\n get texture(): WebGLTexture | null {\n return this.depthTexture;\n }\n\n get matrix(): Float32Array {\n return this.matrixScratch;\n }\n\n /** \u4E00\u4E2A\u6DF1\u5EA6\u7EB9\u7D20\u5728\u4E16\u754C\u7A7A\u95F4\u7684\u8FB9\u957F\uFF08\u7C73\uFF09\u3002\u6CD5\u7EBF\u504F\u79FB\u6309\u5B83\u6362\u7B97\uFF0C\u522B\u7528\u9B54\u6570\u3002 */\n get texelWorld(): number {\n return this.texelWorldValue;\n }\n\n /**\n * \u6309\u573A\u666F\u5305\u56F4\u76D2\u62DF\u5408\u89C6\u9525\u3002\u6BCF\u5E27\u8C03\u7528\u6CA1\u6709\u610F\u4E49\u2014\u2014\u573A\u666F\u5185\u5BB9\u4E0D\u53D8\u65F6\u77E9\u9635\u4E5F\u4E0D\u4F1A\u53D8\uFF0C\n * \u6240\u4EE5\u7531\u8C03\u7528\u65B9\u51B3\u5B9A\u4F55\u65F6\u91CD\u7B97\uFF08\u5305\u56F4\u76D2\u53D8\u5316\u6216\u9996\u5E27\uFF09\u3002\n */\n setBounds(bounds: ICEBounds | null): void {\n const frustum = shadowFrustum(bounds, SHADOW_SIZE);\n this.matrixScratch.set(frustum.matrix);\n this.texelWorldValue = frustum.texelWorld;\n }\n\n /** \u7ED1\u5B9A\u9634\u5F71\u5E27\u7F13\u51B2\uFF0C\u8FD4\u56DE\u662F\u5426\u6210\u529F\u3002 */\n begin(): boolean {\n const gl = this.gl;\n if (!this.framebuffer || !this.program) return false;\n gl.bindFramebuffer(gl.FRAMEBUFFER, this.framebuffer);\n gl.viewport(0, 0, SHADOW_SIZE, SHADOW_SIZE);\n // \u9634\u5F71 pass \u5FC5\u987B\u5173\u6389\u591A\u8FB9\u5F62\u504F\u79FB\uFF1A\u4E3B pass \u4E3A\u4E86\u907F\u514D\u5171\u9762\u95EA\u70C1\u5F00\u4E86 offset(2, 4)\uFF0C\n // \u90A3\u662F\u6309\u5C4F\u5E55\u7A7A\u95F4\u6DF1\u5EA6\u659C\u7387\u52A0\u6743\u7684\uFF0C\u5728\u6DF1\u5EA6 pass \u91CC\u4F1A\u628A\u6295\u5F71\u6DF1\u5EA6\u63A8\u540E\uFF0C\u9634\u5F71\u76F4\u63A5\u6D88\u5931\u3002\n gl.disable(gl.POLYGON_OFFSET_FILL);\n gl.clear(gl.DEPTH_BUFFER_BIT);\n gl.enable(gl.DEPTH_TEST);\n // \u4E0D\u505A\u9762\u5254\u9664\uFF1A\u6DF1\u5EA6\u56FE\u8BB0\u4E0B\u7684\u662F\u300C\u79BB\u5149\u6700\u8FD1\u300D\u7684\u90A3\u4E00\u5C42\uFF0C\u914D\u5408\u6CD5\u7EBF\u504F\u79FB\uFF0C\n // \u53D7\u5149\u9762\u4E0D\u4F1A\u548C\u81EA\u5DF1\u6253\u67B6\u3002\u5254\u9664\u4F9D\u8D56\u9876\u70B9\u7ED5\u5E8F\uFF0C\u5BFC\u5165\u6A21\u578B\u7ED5\u5E8F\u4E0D\u7EDF\u4E00\u65F6\u4F1A\u9759\u9ED8\u5931\u6548\u3002\n gl.disable(gl.CULL_FACE);\n gl.useProgram(this.program);\n gl.uniformMatrix4fv(this.matrixLocation, false, this.matrixScratch);\n gl.uniform1f(this.instancingLocation, 1);\n return true;\n }\n\n /**\n * \u975E\u5B9E\u4F8B\u5316\u7ED8\u5236\uFF1A\u77E9\u9635\u6362\u6210 `lightViewProjection \u00D7 world`\uFF0C\u9876\u70B9\u4F4D\u7F6E\u76F4\u63A5\u5F53\u4E16\u754C\u5750\u6807\u7528\u3002\n *\n * \u9634\u5F71\u901A\u9053\u539F\u5148\u53EA\u4F1A\u753B\u5B9E\u4F8B\u5316\u6279\u6B21\uFF0C\u74E6\u7247\uFF08\u6E32\u67D3\u6279\u6B21\uFF09\u4E0E\u843D\u5355\u7F51\u683C\u56E0\u6B64\u5B8C\u5168\u4E0D\u6295\u5F71\u3002\n * \u8865\u8FD9\u4E24\u6761\u8DEF\u5F84\u9760\u7684\u5C31\u662F\u8FD9\u4E2A\u5165\u53E3\u2014\u2014\u548C `WebGL2SceneDepth` \u540C\u4E00\u5957\u5199\u6CD5\u3002\n */\n setMatrix(matrix: Float32Array): void {\n this.gl.uniformMatrix4fv(this.matrixLocation, false, matrix);\n }\n\n setInstancing(enabled: boolean): void {\n this.gl.uniform1f(this.instancingLocation, enabled ? 1 : 0);\n }\n\n /** \u89E3\u7ED1\uFF0C\u6062\u590D\u9ED8\u8BA4\u5E27\u7F13\u51B2\u3002 */\n end(width: number, height: number): void {\n const gl = this.gl;\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n gl.disable(gl.CULL_FACE);\n gl.enable(gl.POLYGON_OFFSET_FILL);\n gl.viewport(0, 0, width, height);\n }\n\n dispose(): void {\n const gl = this.gl;\n if (this.depthTexture) gl.deleteTexture(this.depthTexture);\n if (this.framebuffer) gl.deleteFramebuffer(this.framebuffer);\n if (this.program) gl.deleteProgram(this.program);\n this.depthTexture = null;\n this.framebuffer = null;\n this.program = null;\n }\n\n private createResources(): void {\n const gl = this.gl;\n\n this.depthTexture = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, this.depthTexture);\n gl.texImage2D(\n gl.TEXTURE_2D,\n 0,\n gl.DEPTH_COMPONENT24,\n SHADOW_SIZE,\n SHADOW_SIZE,\n 0,\n gl.DEPTH_COMPONENT,\n gl.UNSIGNED_INT,\n null,\n );\n // \u6DF1\u5EA6\u7EB9\u7406\u4E0D\u53EF\u7EBF\u6027\u8FC7\u6EE4\uFF1ADEPTH_COMPONENT24 \u5F00 LINEAR \u4F1A\u8BA9\u7EB9\u7406\u4E0D\u5B8C\u6574\uFF0C\n // \u91C7\u6837\u4E00\u5F8B\u8FD4\u56DE 0\uFF0C\u7ED3\u679C\u5C31\u662F\u6574\u7247\u573A\u666F\u88AB\u8BEF\u5224\u6210\u300C\u5168\u5728\u9634\u5F71\u91CC\u300D\u3002\n // \u8FD9\u91CC\u7528 NEAREST\uFF0C\u67D4\u5316\u4EA4\u7ED9\u4E3B\u7740\u8272\u5668\u91CC\u7684 3\u00D73 \u624B\u5DE5\u53D6\u6837\u3002\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n\n this.framebuffer = gl.createFramebuffer();\n gl.bindFramebuffer(gl.FRAMEBUFFER, this.framebuffer);\n gl.framebufferTexture2D(\n gl.FRAMEBUFFER,\n gl.DEPTH_ATTACHMENT,\n gl.TEXTURE_2D,\n this.depthTexture,\n 0,\n );\n gl.drawBuffers([gl.NONE]);\n gl.readBuffer(gl.NONE);\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n\n this.program = this.createProgram(VERTEX_SOURCE, FRAGMENT_SOURCE);\n this.matrixLocation = this.program\n ? gl.getUniformLocation(this.program, 'u_matrix')\n : null;\n this.instancingLocation = this.program\n ? gl.getUniformLocation(this.program, 'u_useInstancing')\n : null;\n this.setBounds(null);\n }\n\n private createProgram(vertex: string, fragment: string): WebGLProgram | null {\n try {\n return createShaderProgram(this.gl, vertex, fragment, 'shadow');\n } catch (error) {\n // \u9634\u5F71\u662F\u53EF\u9009\u6548\u679C\uFF1A\u7F16\u8BD1\u5931\u8D25\u4E0D\u8BE5\u8BA9\u6574\u5E27\u5D29\u6389\uFF0C\u4F46\u5FC5\u987B\u7559\u4E0B\u53EF\u8BFB\u7684\u539F\u56E0\uFF0C\n // \u5426\u5219\"\u9634\u5F71\u6084\u6084\u4E0D\u5DE5\u4F5C\"\u4F1A\u4F2A\u88C5\u6210\u5149\u7167\u95EE\u9898\u3002\n this.lastError = error instanceof Error ? error.message : String(error);\n return null;\n }\n }\n}\n", "//! \u573A\u666F\u5305\u56F4\u76D2\uFF1A\u7ED9\u9634\u5F71\u89C6\u9525\u7528\u3002\n//!\n//! \u5F15\u64CE\u91CC\u6CA1\u6709\u73B0\u6210\u7684\u573A\u666F bounds\uFF0C\u800C\u9634\u5F71\u89C6\u9525\u5FC5\u987B\u8D34\u5408\u5B9E\u9645\u5185\u5BB9\u2014\u2014\u5199\u6B7B\u8303\u56F4\u4F1A\u8BA9\n//! \u6DF1\u5EA6\u7CBE\u5EA6\u548C\u8D34\u56FE\u5206\u8FA8\u7387\u4E00\u8D77\u6D6A\u8D39\uFF08\u89C1 ShadowFrustum\uFF09\u3002\u8FD9\u91CC\u6309\"\u51E0\u4F55\u5C40\u90E8\u5305\u56F4\u76D2\n//! \u7F13\u5B58 + \u4E16\u754C\u77E9\u9635\u53D8\u6362\"\u7D2F\u52A0\uFF0C\u907F\u514D\u6BCF\u5E27\u626B\u63CF\u51E0\u5341\u4E07\u4E2A\u9876\u70B9\u3002\n\nimport type { ICEGeometry } from '@ice3/core';\nimport type { ICEGeometryRenderable } from './Renderables.js';\nimport type { ICEBounds } from './ShadowFrustum.js';\n\ntype LocalBounds = Readonly<{\n min: readonly [number, number, number];\n max: readonly [number, number, number];\n}>;\n\nconst localBoundsCache = new WeakMap<ICEGeometry, LocalBounds>();\n\n/** \u51E0\u4F55\u7684\u5C40\u90E8\u5305\u56F4\u76D2\uFF1A\u53EA\u5728\u9996\u6B21\u89C1\u5230\u8BE5\u51E0\u4F55\u65F6\u626B\u63CF\u4E00\u904D\u9876\u70B9\u3002 */\nexport function geometryLocalBounds(geometry: ICEGeometry): LocalBounds | null {\n const cached = localBoundsCache.get(geometry);\n if (cached) return cached;\n const positions = geometry.positions;\n if (!positions || positions.length < 3) return null;\n let minX = Infinity;\n let minY = Infinity;\n let minZ = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n let maxZ = -Infinity;\n for (let index = 0; index + 2 < positions.length; index += 3) {\n const x = positions[index]!;\n const y = positions[index + 1]!;\n const z = positions[index + 2]!;\n if (x < minX) minX = x;\n if (y < minY) minY = y;\n if (z < minZ) minZ = z;\n if (x > maxX) maxX = x;\n if (y > maxY) maxY = y;\n if (z > maxZ) maxZ = z;\n }\n const bounds = { min: [minX, minY, minZ] as const, max: [maxX, maxY, maxZ] as const };\n localBoundsCache.set(geometry, bounds);\n return bounds;\n}\n\n/**\n * \u7D2F\u52A0\u6240\u6709\u53EF\u6E32\u67D3\u7F51\u683C\u7684\u4E16\u754C\u5305\u56F4\u76D2\u3002\u8FD4\u56DE `null` \u8868\u793A\u573A\u666F\u662F\u7A7A\u7684\uFF0C\n * \u8C03\u7528\u65B9\u5E94\u9000\u56DE\u9ED8\u8BA4\u89C6\u9525\u800C\u4E0D\u662F\u7528\u7A7A\u76D2\u5B50\u53BB\u62DF\u5408\uFF08\u5426\u5219\u89C6\u9525\u9000\u5316\u6210\u4E00\u6761\u7EBF\uFF09\u3002\n */\nexport function accumulateSceneBounds(\n renderables: readonly ICEGeometryRenderable[],\n): ICEBounds | null {\n let minX = Infinity;\n let minY = Infinity;\n let minZ = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n let maxZ = -Infinity;\n let seen = false;\n for (const renderable of renderables) {\n const local = geometryLocalBounds(renderable.mesh.geometry);\n if (!local) continue;\n const matrix = renderable.worldMatrix;\n for (let corner = 0; corner < 8; corner += 1) {\n const x = corner & 1 ? local.max[0] : local.min[0];\n const y = corner & 2 ? local.max[1] : local.min[1];\n const z = corner & 4 ? local.max[2] : local.min[2];\n const worldX = matrix[0]! * x + matrix[4]! * y + matrix[8]! * z + matrix[12]!;\n const worldY = matrix[1]! * x + matrix[5]! * y + matrix[9]! * z + matrix[13]!;\n const worldZ = matrix[2]! * x + matrix[6]! * y + matrix[10]! * z + matrix[14]!;\n if (worldX < minX) minX = worldX;\n if (worldY < minY) minY = worldY;\n if (worldZ < minZ) minZ = worldZ;\n if (worldX > maxX) maxX = worldX;\n if (worldY > maxY) maxY = worldY;\n if (worldZ > maxZ) maxZ = worldZ;\n seen = true;\n }\n }\n return seen ? { min: [minX, minY, minZ], max: [maxX, maxY, maxZ] } : null;\n}\n", "//! \u76F8\u673A\u6DF1\u5EA6\u901A\u9053\uFF1A\u5C4F\u5E55\u7A7A\u95F4\u906E\u853D\u7684\u6765\u6E90\u3002\n//!\n//! \u4ECE**\u76F8\u673A**\u65B9\u5411\u6E32\u67D3\u4E00\u904D\u6DF1\u5EA6\u3002\u5FC5\u987B\u8986\u76D6\u5168\u90E8\u51E0\u4F55\u8DEF\u5F84\u2014\u2014\u74E6\u7247\u8D70\u6E32\u67D3\u6279\u6B21\uFF0C\u5176\u4F59\u8D70\u5B9E\u4F8B\u5316\n//! \u6279\u6B21\uFF1B\u53EA\u753B\u4E00\u6761\u4F1A\u8BA9\u6DF1\u5EA6\u56FE\u5927\u534A\u662F\u7A7A\u7684\uFF08SPEC-007\uFF09\u3002\n\nimport { createShaderProgram } from './WebGL2Shader.js';\n\nconst VERTEX_SOURCE = `#version 300 es\nlayout(location = 0) in vec3 a_position;\nlayout(location = 3) in mat4 a_instanceMatrix;\nuniform mat4 u_matrix;\nuniform float u_useInstancing;\nvoid main() {\n vec4 local = vec4(a_position, 1.0);\n vec4 world = mix(local, a_instanceMatrix * local, u_useInstancing);\n gl_Position = u_matrix * world;\n}\n`;\n\nconst FRAGMENT_SOURCE = `#version 300 es\nprecision highp float;\nvoid main() {}\n`;\n\nexport class WebGL2SceneDepth {\n private readonly framebuffer: WebGLFramebuffer;\n private depthTexture: WebGLTexture | null = null;\n private readonly program: WebGLProgram;\n private readonly matrixLocation: WebGLUniformLocation | null;\n private readonly instancingLocation: WebGLUniformLocation | null;\n private width = 0;\n private height = 0;\n\n constructor(private readonly gl: WebGL2RenderingContext) {\n this.program = createShaderProgram(gl, VERTEX_SOURCE, FRAGMENT_SOURCE, 'scene-depth');\n this.matrixLocation = gl.getUniformLocation(this.program, 'u_matrix');\n this.instancingLocation = gl.getUniformLocation(this.program, 'u_useInstancing');\n const framebuffer = gl.createFramebuffer();\n if (!framebuffer) throw new Error('ICE3_FRAMEBUFFER_FAILED: scene depth');\n this.framebuffer = framebuffer;\n }\n\n get texture(): WebGLTexture | null {\n return this.depthTexture;\n }\n\n begin(viewProjection: Float32Array, width: number, height: number): void {\n const gl = this.gl;\n this.ensureTexture(Math.max(1, width), Math.max(1, height));\n gl.bindFramebuffer(gl.FRAMEBUFFER, this.framebuffer);\n gl.viewport(0, 0, this.width, this.height);\n // \u4E3B pass \u7684\u591A\u8FB9\u5F62\u504F\u79FB\u6309\u5C4F\u5E55\u6DF1\u5EA6\u659C\u7387\u52A0\u6743\uFF0C\u4F1A\u628A\u6DF1\u5EA6\u63A8\u540E\uFF0C\u6DF1\u5EA6 pass \u5FC5\u987B\u5173\u6389\u3002\n gl.disable(gl.POLYGON_OFFSET_FILL);\n gl.disable(gl.BLEND);\n gl.depthMask(true);\n gl.clear(gl.DEPTH_BUFFER_BIT);\n gl.enable(gl.DEPTH_TEST);\n gl.useProgram(this.program);\n gl.uniformMatrix4fv(this.matrixLocation, false, viewProjection);\n gl.uniform1f(this.instancingLocation, 0);\n }\n\n setMatrix(matrix: Float32Array): void {\n this.gl.uniformMatrix4fv(this.matrixLocation, false, matrix);\n }\n\n setInstancing(enabled: boolean): void {\n this.gl.uniform1f(this.instancingLocation, enabled ? 1 : 0);\n }\n\n end(width: number, height: number): void {\n const gl = this.gl;\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n gl.enable(gl.POLYGON_OFFSET_FILL);\n gl.viewport(0, 0, width, height);\n }\n\n dispose(): void {\n const gl = this.gl;\n if (this.depthTexture) gl.deleteTexture(this.depthTexture);\n gl.deleteFramebuffer(this.framebuffer);\n gl.deleteProgram(this.program);\n this.depthTexture = null;\n }\n\n private ensureTexture(width: number, height: number): void {\n const gl = this.gl;\n gl.bindFramebuffer(gl.FRAMEBUFFER, this.framebuffer);\n if (this.depthTexture && this.width === width && this.height === height) {\n gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.TEXTURE_2D, this.depthTexture, 0);\n return;\n }\n if (this.depthTexture) gl.deleteTexture(this.depthTexture);\n this.width = width;\n this.height = height;\n const texture = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.texImage2D(\n gl.TEXTURE_2D, 0, gl.DEPTH_COMPONENT24, width, height, 0,\n gl.DEPTH_COMPONENT, gl.UNSIGNED_INT, null,\n );\n // \u6DF1\u5EA6\u7EB9\u7406\u53EA\u80FD NEAREST\uFF1ALINEAR \u4F1A\u53D8\u6210\u4E0D\u5B8C\u6574\u7EB9\u7406\uFF0C\u91C7\u6837\u6052\u4E3A 0\u3002\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.TEXTURE_2D, texture, 0);\n // \u53EA\u6709\u6DF1\u5EA6\u9644\u4EF6\u7684 FBO \u5FC5\u987B\u58F0\u660E\u300C\u4E0D\u753B\u989C\u8272\u300D\uFF0C\u5426\u5219\u5E27\u7F13\u51B2\u4E0D\u5B8C\u6574\u3001\u5199\u5165\u88AB\u4E22\u5F03\u3002\n gl.drawBuffers([gl.NONE]);\n gl.readBuffer(gl.NONE);\n this.depthTexture = texture;\n }\n}\n", "/**\n * Base-colour texture cache.\n *\n * Materials reference textures by URL; the renderer turns each URL into one\n * `WebGLTexture` the first time a frame needs it and keeps it for later frames.\n * Loading is asynchronous, so the first frames after a URL appears draw with the\n * flat material colour and switch to the texture once the upload lands \u2014 a\n * self-correcting behaviour that never blocks the frame loop.\n */\n\nconst REPEAT = 10497;\n\nexport type ICEImageLoader = (url: string) => Promise<ImageBitmap>;\n\nexport type ICEWebGL2TextureStats = {\n readonly loaded: number;\n readonly pending: number;\n readonly failed: number;\n};\n\ntype TextureEntry =\n | { readonly state: 'pending' }\n | { readonly state: 'ready'; readonly texture: WebGLTexture }\n | { readonly state: 'failed' };\n\n/** Default loader: fetch the image and decode it off the main thread. */\nexport const fetchImageLoader: ICEImageLoader = async (url) => {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`ICE3_TEXTURE_FETCH_FAILED: ${response.status} ${url}`);\n }\n return createImageBitmap(await response.blob());\n};\n\nexport class WebGL2TextureCache {\n private readonly entries = new Map<string, TextureEntry>();\n private disposed = false;\n\n constructor(\n private readonly gl: WebGL2RenderingContext,\n private readonly load: ICEImageLoader = fetchImageLoader,\n private readonly onUpload?: () => void,\n ) {}\n\n /** Texture for `url`, or `null` while it is still loading (or after failure). */\n texture(url: string): WebGLTexture | null {\n if (this.disposed) return null;\n const existing = this.entries.get(url);\n if (existing) {\n return existing.state === 'ready' ? existing.texture : null;\n }\n this.entries.set(url, { state: 'pending' });\n void this.load(url)\n .then((image) => {\n if (this.disposed) {\n image.close?.();\n return;\n }\n const texture = this.upload(image);\n // A dispose during the await must not resurrect an entry.\n if (this.disposed) {\n this.gl.deleteTexture(texture);\n return;\n }\n this.entries.set(url, { state: 'ready', texture });\n this.onUpload?.();\n })\n .catch(() => {\n if (!this.disposed) this.entries.set(url, { state: 'failed' });\n });\n return null;\n }\n\n stats(): ICEWebGL2TextureStats {\n let loaded = 0;\n let pending = 0;\n let failed = 0;\n for (const entry of this.entries.values()) {\n if (entry.state === 'ready') loaded += 1;\n else if (entry.state === 'pending') pending += 1;\n else failed += 1;\n }\n return { loaded, pending, failed };\n }\n\n dispose(): void {\n if (this.disposed) return;\n this.disposed = true;\n for (const entry of this.entries.values()) {\n if (entry.state === 'ready') this.gl.deleteTexture(entry.texture);\n }\n this.entries.clear();\n }\n\n private upload(image: ImageBitmap): WebGLTexture {\n const gl = this.gl;\n const texture = gl.createTexture();\n if (!texture) {\n throw new Error('ICE3_TEXTURE_CREATE_FAILED');\n }\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, REPEAT);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, REPEAT);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n gl.generateMipmap(gl.TEXTURE_2D);\n gl.bindTexture(gl.TEXTURE_2D, null);\n image.close?.();\n return texture;\n }\n}\n", "/**\n * Box-projected texture coordinates.\n *\n * Studio generates geometry procedurally, so meshes reach the renderer without a\n * UV attribute. The projection is derived from the surface instead: each fragment\n * is projected along the dominant axis of its normal, which is stable inside a\n * face and needs no extra vertex channel.\n *\n * This mirrors `box_projected_uvs` in Studio's exporter, so a surface textured in\n * the viewport and the same surface exported as glTF land on the same texels.\n * Coordinates are in metres; tiling is a material concern.\n */\n\nexport type ICEUvScale = readonly [number, number];\n\nexport const DEFAULT_UV_SCALE: ICEUvScale = [1, 1];\n\nexport function boxProjectedUv(\n position: readonly [number, number, number],\n normal: readonly [number, number, number],\n scale: ICEUvScale = DEFAULT_UV_SCALE,\n): [number, number] {\n const [x, y, z] = position;\n const [nx, ny, nz] = normal;\n const ax = Math.abs(nx);\n const ay = Math.abs(ny);\n const az = Math.abs(nz);\n const [su, sv] = scale;\n if (ax + ay + az < 1e-6) {\n // A degenerate normal says nothing about orientation; the XY plane is the\n // least surprising default.\n return [x * su, y * sv];\n }\n if (ax >= ay && ax >= az) {\n const sign = nx >= 0 ? 1 : -1;\n return [-sign * z * su, y * sv];\n }\n if (ay >= az) {\n const sign = ny >= 0 ? 1 : -1;\n return [x * su, sign * z * sv];\n }\n const sign = nz >= 0 ? 1 : -1;\n return [sign * x * su, y * sv];\n}\n", "const COLOR_CACHE_LIMIT = 128;\nconst COLOR_CACHE = new Map<\n string,\n readonly [number, number, number, number]\n>();\n\nexport function colorToRgba(\n color: string,\n): readonly [number, number, number, number] {\n const normalized = color.startsWith('#') ? color.slice(1) : color;\n const expanded = normalized.length === 3\n ? normalized.split('').map((part) => part + part).join('')\n : normalized;\n if (!/^[0-9a-fA-F]{6}([0-9a-fA-F]{2})?$/.test(expanded)) {\n throw new Error(`Unsupported ICE basic material color: ${color}`);\n }\n const key = expanded.toLowerCase();\n const cached = COLOR_CACHE.get(key);\n if (cached) return cached;\n const rgba = Object.freeze([\n Number.parseInt(expanded.slice(0, 2), 16) / 255,\n Number.parseInt(expanded.slice(2, 4), 16) / 255,\n Number.parseInt(expanded.slice(4, 6), 16) / 255,\n expanded.length === 8\n ? Number.parseInt(expanded.slice(6, 8), 16) / 255\n : 1,\n ]) as readonly [number, number, number, number];\n if (COLOR_CACHE.size >= COLOR_CACHE_LIMIT) {\n const oldest = COLOR_CACHE.keys().next().value as string | undefined;\n if (oldest !== undefined) COLOR_CACHE.delete(oldest);\n }\n COLOR_CACHE.set(key, rgba);\n return rgba;\n}\n", "export type ICEFrameStageProfile = Readonly<{\n collectMs: number;\n prepareAndUploadMs: number;\n encodeMs: number;\n submitMs: number;\n}>;\n\ntype Stage = 'collect' | 'prepareAndUpload' | 'encode' | 'submit';\n\nexport class RendererProfiler {\n private enabled = false;\n private cursor = 0;\n private readonly marks = new Map<Stage, number>();\n\n enable(value: boolean): void {\n this.enabled = value;\n this.marks.clear();\n }\n\n get isEnabled(): boolean {\n return this.enabled;\n }\n\n begin(): void {\n if (!this.enabled) return;\n this.cursor = performance.now();\n this.marks.clear();\n }\n\n mark(stage: Stage): void {\n if (!this.enabled) return;\n const now = performance.now();\n this.marks.set(stage, Math.max(0, now - this.cursor));\n this.cursor = now;\n }\n\n end(): ICEFrameStageProfile | null {\n if (!this.enabled) return null;\n return {\n collectMs: this.marks.get('collect') ?? 0,\n prepareAndUploadMs: this.marks.get('prepareAndUpload') ?? 0,\n encodeMs: this.marks.get('encode') ?? 0,\n submitMs: this.marks.get('submit')\n ?? Math.max(0, performance.now() - this.cursor),\n };\n }\n}\n", "import {\n ICEEngineError,\n ICEMatrix4,\n type ICEGeometry,\n} from '@ice3/core';\nimport {\n collectRenderables,\n selectionIdentity,\n type ICEGeometryRenderable,\n} from './WebGL2GeometryBatch.js';\nimport {\n collectRenderBatches,\n type ICERenderBatchDraw,\n} from './WebGL2RenderBatch.js';\nimport {\n collectInstanceBatches,\n renderablesOutsideInstanceBatches,\n WebGL2InstanceCache,\n type ICEInstanceBatch,\n} from './WebGL2InstanceBatch.js';\nimport { WebGL2GeometryCache } from './WebGL2GeometryCache.js';\nimport { WebGL2Picker } from './WebGL2Picker.js';\nimport { WebGL2ShadowMap } from './WebGL2ShadowMap.js';\nimport { accumulateSceneBounds } from './SceneBounds.js';\nimport { WebGL2SceneDepth } from './WebGL2SceneDepth.js';\nimport { WebGL2Program } from './WebGL2Program.js';\nimport { WebGL2TextureCache } from './WebGL2TextureCache.js';\nimport { DEFAULT_UV_SCALE, type ICEUvScale } from './WebGL2Uv.js';\nimport { WebGL2SemanticProgram } from './WebGL2SemanticProgram.js';\nimport { colorToRgba } from './Color.js';\nimport {\n RendererProfiler,\n type ICEFrameStageProfile,\n} from './RendererProfiler.js';\nimport type { ICEBasicMaterial } from '@ice3/core';\nimport type {\n ICERendererBackend,\n ICERendererCapabilities,\n ICEFrame,\n ICEScreenPoint,\n ICEViewport,\n} from './types.js';\n\nconst EDGE_PIXEL_OFFSETS = [\n [0, 0],\n [-1, 0],\n [1, 0],\n [0, -1],\n [0, 1],\n] as const;\n\nconst SELECTION_RGBA = [255 / 255, 208 / 255, 0] as const;\nconst SELECTION_TINT_ALPHA = 0.65;\n\nfunction isTransparentColor(color: string): boolean {\n return colorToRgba(color)[3] < 0.999;\n}\n\nexport { colorToRgba } from './Color.js';\n\nexport class WebGL2RendererBackend implements ICERendererBackend {\n capabilities: Readonly<ICERendererCapabilities> = {\n backend: 'webgl2',\n maxTextureSize: 0,\n picking: true,\n };\n\n private canvas: HTMLCanvasElement | null = null;\n private gl: WebGL2RenderingContext | null = null;\n private viewport: ICEViewport = { x: 0, y: 0, width: 1, height: 1 };\n private dpr = 1;\n private onContextLost: (() => void) | undefined;\n private onContextRestored: (() => void) | undefined;\n private program: WebGL2Program | null = null;\n private clipPlane: readonly [number, number, number, number] = [0, 0, 0, 0];\n private shadowMap: WebGL2ShadowMap | null = null;\n /** \u65B9\u5411\u5149\u9634\u5F71\u5F00\u5173\uFF1A\u9ED8\u8BA4\u5173\u95ED\uFF0C\u7531 `initialize({ shadows })` \u6216\u9875\u9762\u5730\u5740 `?shadows=` \u6253\u5F00\u3002 */\n private shadowEnabled = false;\n /** `?shadowdebug=1` \u8F93\u51FA\u906E\u853D\u5224\u5B9A\uFF0C`=2` \u8F93\u51FA\u6DF1\u5EA6\u56FE\uFF1B\u6392\u67E5\u9634\u5F71\u95EE\u9898\u7684\u552F\u4E00\u53EF\u4FE1\u624B\u6BB5\u3002 */\n private shadowDebug = 0;\n private semanticProgram: WebGL2SemanticProgram | null = null;\n private geometryCache: WebGL2GeometryCache | null = null;\n private instanceCache: WebGL2InstanceCache | null = null;\n private picker: WebGL2Picker | null = null;\n private readonly mvpScratch = new ICEMatrix4();\n private readonly worldScratch = new ICEMatrix4();\n private readonly renderablesScratch: ICEGeometryRenderable[] = [];\n private readonly batchesScratch: ICERenderBatchDraw[] = [];\n private readonly instancesScratch: ICEInstanceBatch[] = [];\n private readonly instancedMeshIds = new Set<string>();\n private readonly profiler = new RendererProfiler();\n private lastFrameProfile: ICEFrameStageProfile | null = null;\n private backgroundRgba: readonly [number, number, number, number] = [\n 0.035,\n 0.055,\n 0.09,\n 1,\n ];\n private frameStats = {\n drawCalls: 0,\n renderedMeshes: 0,\n renderedBatches: 0,\n instancingFallbacks: 0,\n gpuUploads: 0,\n gpuEvictions: 0,\n gpuBytes: 0,\n };\n private textures: WebGL2TextureCache | null = null;\n private sceneDepth: WebGL2SceneDepth | null = null;\n private occlusionRadius = 2.5;\n /**\n * \u4E09\u5708\u91C7\u6837\u6BD4\u53CC\u5708\u591A\u627E\u5230\u7EA6 1.7 \u4E2A\u4EAE\u5EA6\u70B9\u7684\u906E\u853D\uFF08\u540C\u53C2\u6570 96.36 \u2192 94.65\uFF09\uFF0C\u539F\u6837\u6CBF\u7528\u5230\n * \u9ED8\u8BA4\u503C\u5C31\u628A\u5382\u533A\u538B\u5F97\u53D1\u95F7\u30020.30 \u662F\u56DE\u8C03\u540E\u7684\u503C\uFF1A\u6574\u5E27 95.70\uFF08\u65E0\u906E\u853D 99.59\uFF09\uFF0C\n * \u9AD8\u5149\u50CF\u7D20 878\uFF08\u65E0\u906E\u853D 1088\uFF09\uFF0C\u63A5\u89E6\u6697\u90E8\u4ECD\u770B\u5F97\u89C1\u3002\u8BE6\u89C1 SPEC-007 \u7B2C 5.5 \u8282\u3002\n */\n private occlusionStrength = 0.3;\n private options: Parameters<ICERendererBackend['initialize']>[0] | null = null;\n\n /**\n * Bind the material's colour and (if it has one) its base-colour texture.\n * Called for every opaque/shaded draw so a batched draw and a single mesh draw\n * cannot drift apart.\n */\n private applyMaterial(material: ICEBasicMaterial): void {\n const program = this.program;\n if (!program) return;\n program.setColor(colorToRgba(material.color));\n const map = material.map;\n const texture = map && this.textures ? this.textures.texture(map.url) : null;\n // \u4E09\u5F20\u8D34\u56FE\u5171\u7528\u4E00\u5957\u7C73\u5236 UV\uFF0C\u5E73\u94FA\u500D\u7387\u4E5F\u5C31\u53EA\u6709\u4E00\u4E2A\uFF1A\u5E95\u8272\u56FE\u4F18\u5148\uFF0C\n // \u6CA1\u6709\u5E95\u8272\u56FE\u65F6\u9000\u56DE ORM \u81EA\u5DF1\u5E26\u7684\u500D\u7387\uFF08\u5BFC\u5165\u7684\u8D44\u4EA7\u5E38\u5E38\u53EA\u5E26 ORM\uFF09\u3002\n program.setBaseColorMap(\n texture,\n map?.scale ?? material.ormMap?.scale ?? DEFAULT_UV_SCALE,\n );\n const normalMap = material.normalMap;\n const normalTexture = normalMap && this.textures\n ? this.textures.texture(normalMap.url)\n : null;\n program.setNormalMap(normalTexture, normalMap?.strength ?? 1);\n const ormMap = material.ormMap;\n const ormTexture = ormMap && this.textures ? this.textures.texture(ormMap.url) : null;\n program.setOrmMap(\n ormTexture,\n ormMap?.occlusion !== false,\n ormMap?.metallicRoughness !== false,\n );\n program.setSurface(material.metallic, material.roughness, material.emissive);\n }\n\n /** Edge overlays are line work: never sampled, always flat. */\n private applyEdgeMaterial(material: ICEBasicMaterial): void {\n const program = this.program;\n if (!program) return;\n program.setColor(colorToRgba(material.edgeColor ?? material.color));\n program.setBaseColorMap(null, DEFAULT_UV_SCALE);\n program.setNormalMap(null, 1);\n program.setOrmMap(null, false, false);\n program.setSurface(0, 0.85, undefined);\n }\n\n /**\n * `?ao=<radius>,<strength>` \u8986\u76D6\u906E\u853D\u53C2\u6570\uFF08`ao=off` \u5173\u95ED\uFF09\u3002\n *\n * \u5C4F\u5E55\u7A7A\u95F4\u906E\u853D\u7684\u5408\u9002\u53C2\u6570\u4E0E\u573A\u666F\u5C3A\u5EA6\u5F3A\u76F8\u5173\uFF0C\u9760\u6539\u4EE3\u7801\u91CD\u7F16\u8BD1\u6765\u627E\u592A\u6162\u3002\u8FD9\u91CC\u53EA\u8BFB\u4E00\u6B21\n * \u9875\u9762\u5730\u5740\uFF0C\u7EAF\u5C5E\u8C03\u53C2\u901A\u9053\uFF0C\u4E0D\u53C2\u4E0E\u6E32\u67D3\u51B3\u7B56\u3002\n */\n private readOcclusionOverride(): void {\n if (typeof location === 'undefined') return;\n const value = new URLSearchParams(location.search).get('ao');\n if (!value) return;\n if (value === 'off') {\n this.occlusionStrength = 0;\n return;\n }\n const parts = value.split(',').map(Number);\n const radius = parts[0];\n const strength = parts[1];\n if (radius !== undefined && Number.isFinite(radius) && radius > 0) {\n this.occlusionRadius = radius;\n }\n if (strength !== undefined && Number.isFinite(strength) && strength >= 0) {\n this.occlusionStrength = strength;\n }\n }\n\n /**\n * `?shadows=1` / `?shadows=0` \u8986\u76D6\u9634\u5F71\u5F00\u5173\uFF0C\u4E0E `?ao` \u540C\u5C5E\u8C03\u53C2\u901A\u9053\u3002\n *\n * \u9634\u5F71\u662F\u4E00\u6B21\u989D\u5916\u5168\u573A\u666F pass\uFF0C\u9ED8\u8BA4\u4E0D\u5F00\uFF1B\u6F14\u793A\u4E0E\u5BF9\u6BD4\u65F6\u9760\u5730\u5740\u680F\u5207\u6362\uFF0C\n * \u4E0D\u5FC5\u4E3A\u770B\u6E05\"\u6709\u5F71\u5B50/\u6CA1\u5F71\u5B50\"\u91CD\u7F16\u8BD1\u4E00\u6B21\u3002\n */\n private readShadowOverride(): void {\n if (typeof location === 'undefined') return;\n const params = new URLSearchParams(location.search);\n const value = params.get('shadows');\n if (value !== null) {\n this.shadowEnabled = value !== '0' && value !== 'off';\n }\n const debug = Number(params.get('shadowdebug'));\n this.shadowDebug = Number.isFinite(debug) ? Math.max(0, Math.min(2, Math.trunc(debug))) : 0;\n // \u8C03\u8BD5\u901A\u9053\u8981\u6709\u5185\u5BB9\u53EF\u770B\uFF0C\u987A\u624B\u628A\u9634\u5F71\u6253\u5F00\uFF0C\u514D\u5F97\u518D\u62FC\u4E00\u4E2A\u53C2\u6570\u3002\n if (this.shadowDebug > 0) this.shadowEnabled = true;\n }\n\n private ensureTextureCache(): void {\n if (this.textures || !this.gl) return;\n this.textures = new WebGL2TextureCache(this.gl, undefined, () => {\n // The texture arrived after the frame was drawn; ask for one more frame.\n this.options?.onUploadReady?.();\n });\n }\n\n private readonly handleContextLost = (event: Event): void => {\n event.preventDefault();\n this.picker = null;\n this.program = null;\n this.sceneDepth?.dispose();\n this.sceneDepth = null;\n this.shadowMap?.dispose();\n this.shadowMap = null;\n this.geometryCache?.clear();\n this.geometryCache = null;\n this.instanceCache?.clear();\n this.instanceCache = null;\n this.onContextLost?.();\n };\n private readonly handleContextRestored = (): void => {\n if (this.gl) {\n this.gl.enable(this.gl.DEPTH_TEST);\n this.gl.depthFunc(this.gl.LEQUAL);\n this.gl.enable(this.gl.POLYGON_OFFSET_FILL);\n this.gl.polygonOffset(2, 4);\n this.gl.viewport(\n this.viewport.x * this.dpr,\n this.viewport.y * this.dpr,\n this.viewport.width * this.dpr,\n this.viewport.height * this.dpr,\n );\n this.createProgram(this.gl);\n }\n this.onContextRestored?.();\n };\n\n initialize(options: {\n readonly canvas: HTMLCanvasElement;\n readonly onContextLost?: () => void;\n readonly onContextRestored?: () => void;\n readonly onUploadReady?: () => void;\n readonly shadows?: boolean;\n }): void {\n this.options = options;\n const gl = options.canvas.getContext('webgl2', {\n alpha: true,\n antialias: true,\n premultipliedAlpha: true,\n preserveDrawingBuffer: true,\n });\n if (!gl) {\n throw new ICEEngineError(\n 'ICE3_WEBGL2_UNAVAILABLE',\n 'ICE3_WEBGL2_UNAVAILABLE: ICE3 requires a WebGL2-capable canvas',\n );\n }\n\n this.canvas = options.canvas;\n this.gl = gl;\n this.onContextLost = options.onContextLost;\n this.onContextRestored = options.onContextRestored;\n this.capabilities = {\n backend: 'webgl2',\n maxTextureSize: gl.getParameter(gl.MAX_TEXTURE_SIZE) as number,\n picking: true,\n };\n gl.enable(gl.DEPTH_TEST);\n gl.depthFunc(gl.LEQUAL);\n gl.enable(gl.POLYGON_OFFSET_FILL);\n gl.polygonOffset(2, 4);\n this.createProgram(gl);\n this.ensureTextureCache();\n this.sceneDepth = new WebGL2SceneDepth(gl);\n this.readOcclusionOverride();\n this.shadowEnabled = options.shadows ?? false;\n this.readShadowOverride();\n this.canvas.addEventListener('webglcontextlost', this.handleContextLost);\n this.canvas.addEventListener('webglcontextrestored', this.handleContextRestored);\n }\n\n resize(viewport: ICEViewport, dpr: number): void {\n if (!this.canvas || !this.gl) {\n throw new ICEEngineError('ICE3_ENGINE_NOT_READY', 'Renderer is not initialized');\n }\n this.viewport = { ...viewport };\n this.dpr = dpr;\n this.canvas.width = Math.max(1, Math.round(viewport.width * dpr));\n this.canvas.height = Math.max(1, Math.round(viewport.height * dpr));\n this.gl.viewport(\n viewport.x * dpr,\n viewport.y * dpr,\n viewport.width * dpr,\n viewport.height * dpr,\n );\n }\n\n setBackgroundColor(color: string): void {\n this.backgroundRgba = colorToRgba(color);\n }\n\n prepareBatchGeometry(geometry: ICEGeometry): void {\n if (!this.gl || !this.geometryCache) {\n throw new ICEEngineError(\n 'ICE3_ENGINE_NOT_READY',\n 'Renderer is not initialized',\n );\n }\n this.geometryCache.pin(this.gl, geometry);\n }\n\n prepareGeometry(\n geometry: ICEGeometry,\n update?: import('@ice3/core').ICEGeometryBufferUpdate,\n ): void {\n if (!this.gl || !this.geometryCache) {\n throw new ICEEngineError(\n 'ICE3_ENGINE_NOT_READY',\n 'Renderer is not initialized',\n );\n }\n this.geometryCache.pin(this.gl, geometry, update);\n }\n\n releaseGeometry(geometry: ICEGeometry): void {\n this.geometryCache?.unpin(geometry);\n }\n\n releaseBatchGeometry(geometry: ICEGeometry): void {\n this.geometryCache?.unpin(geometry);\n }\n\n setClipPlane(plane: readonly [number, number, number, number] | null): void {\n this.clipPlane = plane\n ? [plane[0], plane[1], plane[2], plane[3]]\n : [0, 0, 0, 0];\n }\n\n render(frame: ICEFrame): void {\n if (\n !this.gl\n || !this.program\n || !this.geometryCache\n ) {\n throw new ICEEngineError('ICE3_ENGINE_NOT_READY', 'Renderer is not initialized');\n }\n this.profiler.begin();\n this.lastFrameProfile = null;\n const gl = this.gl;\n gl.clearColor(...this.backgroundRgba);\n gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);\n\n const aspect = frame.viewport.width / Math.max(frame.viewport.height, 1);\n const viewProjection = frame.camera.getViewProjectionMatrix(aspect);\n const mvp = this.mvpScratch;\n this.frameStats = {\n drawCalls: 0,\n renderedMeshes: 0,\n renderedBatches: 0,\n instancingFallbacks: 0,\n gpuUploads: 0,\n gpuEvictions: 0,\n gpuBytes: 0,\n };\n\n this.program.use();\n this.program.setClipPlane(this.clipPlane);\n this.program.setClipOffset(0, 0);\n this.program.setDirectionalShading(false);\n this.program.setWaterShading(false);\n const cameraPosition = frame.camera.getPosition().toArray();\n this.program.setCameraPosition(cameraPosition);\n this.geometryCache.beginFrame();\n this.instanceCache!.beginFrame();\n this.instancedMeshIds.clear();\n const world = this.worldScratch;\n const clipPixelX = 2 / Math.max(1, frame.viewport.width * frame.dpr);\n const clipPixelY = 2 / Math.max(1, frame.viewport.height * frame.dpr);\n const renderables = collectRenderables(\n frame.scene,\n this.renderablesScratch,\n );\n const instances = collectInstanceBatches(\n renderables,\n this.instancesScratch,\n );\n const batches = collectRenderBatches(frame.scene, this.batchesScratch);\n // \u5B9E\u4F8B\u5316\u6279\u6B21\u53EA\u6536\u91CD\u590D\u7EC4\u5408\uFF1B\u843D\u5355\u7684\u7F51\u683C\u7531\u4E3B\u901A\u9053\u6309\u5355\u4F53\u7ED8\u5236\uFF0C\u6DF1\u5EA6\u901A\u9053\u4E5F\u8981\u5355\u72EC\u753B\u4E00\u904D\u3002\n const standalone = renderablesOutsideInstanceBatches(renderables, instances);\n this.profiler.mark('collect');\n\n // \u76F8\u673A\u6DF1\u5EA6 pass\uFF08\u5C4F\u5E55\u7A7A\u95F4\u906E\u853D\u7684\u6765\u6E90\uFF09\uFF1A\u4E09\u6761\u51E0\u4F55\u8DEF\u5F84\u90FD\u8981\u753B\u3002\n let aoReady = false;\n if (this.sceneDepth) {\n const deviceWidth = Math.max(1, Math.round(frame.viewport.width * this.dpr));\n const deviceHeight = Math.max(1, Math.round(frame.viewport.height * this.dpr));\n this.sceneDepth.begin(viewProjection.elements, deviceWidth, deviceHeight);\n this.sceneDepth.setInstancing(true);\n for (const batch of instances) {\n if (isTransparentColor(batch.material.color)) continue;\n const instance = this.instanceCache!.retain(gl, this.geometryCache, batch);\n if (!instance) continue;\n gl.bindVertexArray(instance.vertexArray);\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, instance.triangleIndexBuffer);\n gl.drawElementsInstanced(\n gl.TRIANGLES,\n instance.triangleCount,\n batch.geometry.indices instanceof Uint16Array\n ? gl.UNSIGNED_SHORT\n : gl.UNSIGNED_INT,\n 0,\n instance.instanceCount,\n );\n }\n this.sceneDepth.setInstancing(false);\n for (const draw of batches) {\n if (isTransparentColor(draw.batch.material.color)) continue;\n world.elements.set(draw.worldMatrix);\n mvp.elements.set(viewProjection.elements);\n mvp.multiply(world);\n this.sceneDepth.setMatrix(mvp.elements);\n const geometry = this.geometryCache.retain(gl, draw.batch.geometry);\n gl.bindVertexArray(geometry.vertexArray);\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, geometry.triangleIndexBuffer);\n gl.drawElements(\n gl.TRIANGLES,\n geometry.triangleCount,\n draw.batch.geometry.indices instanceof Uint16Array\n ? gl.UNSIGNED_SHORT\n : gl.UNSIGNED_INT,\n 0,\n );\n }\n // \u7B2C\u4E09\u6761\u8DEF\u5F84\uFF1A\u6CA1\u8FDB\u4EFB\u4F55\u6279\u6B21\u7684\u5355\u4F53\u7F51\u683C\u3002\u6F0F\u6389\u8FD9\u91CC\uFF0C\u5B83\u4EEC\u5728\u6DF1\u5EA6\u56FE\u4E0A\u4E0D\u5B58\u5728\uFF0C\n // \u4E8E\u662F\u65E2\u4E0D\u6321\u4F4F\u540E\u9762\u7684\u50CF\u7D20\u3001\u4E5F\u4E0D\u4F1A\u88AB\u5899\u89D2\u538B\u6697\u2014\u2014\u8868\u73B0\u5C31\u662F\u300C\u53EA\u6709\u4E00\u90E8\u5206\u8BBE\u5907\u6709\u63A5\u89E6\u9634\u5F71\u300D\u3002\n for (const renderable of standalone) {\n if (isTransparentColor(renderable.mesh.material.color)) continue;\n world.elements.set(renderable.worldMatrix);\n mvp.elements.set(viewProjection.elements);\n mvp.multiply(world);\n this.sceneDepth.setMatrix(mvp.elements);\n const geometry = this.geometryCache.retain(gl, renderable.mesh.geometry);\n gl.bindVertexArray(geometry.vertexArray);\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, geometry.triangleIndexBuffer);\n gl.drawElements(\n gl.TRIANGLES,\n geometry.triangleCount,\n renderable.mesh.geometry.indices instanceof Uint16Array\n ? gl.UNSIGNED_SHORT\n : gl.UNSIGNED_INT,\n 0,\n );\n }\n this.sceneDepth.end(deviceWidth, deviceHeight);\n aoReady = true;\n this.program.use();\n }\n\n // \u9634\u5F71 pass\uFF1A\u5148\u7528\u6DF1\u5EA6\u7A0B\u5E8F\u628A\u573A\u666F\u6E32\u67D3\u8FDB\u8D34\u56FE\uFF0C\u4E3B pass \u518D\u91C7\u6837\u3002\n // \u4E0E\u76F8\u673A\u6DF1\u5EA6\u901A\u9053\u540C\u7406\uFF0C\u4E09\u6761\u51E0\u4F55\u8DEF\u5F84\u90FD\u8981\u753B\u2014\u2014\u53EA\u753B\u5B9E\u4F8B\u5316\u6279\u6B21\u7684\u8BDD\uFF0C\u5382\u533A\u7684\u74E6\u7247\u3001\n // \u5355\u72EC\u7F16\u8F91\u7684\u7269\u4EF6\u5168\u90FD\u4E0D\u4F1A\u6295\u5F71\uFF0C\u770B\u8D77\u6765\u50CF\"\u592A\u9633\u53EA\u7167\u67D0\u4E9B\u8BBE\u5907\"\u3002\n if (this.shadowEnabled && this.shadowMap) {\n // \u89C6\u9525\u6309\u573A\u666F\u8D34\u5408\uFF1A\u5199\u6B7B\u8303\u56F4\u4F1A\u540C\u65F6\u6D6A\u8D39\u6DF1\u5EA6\u7CBE\u5EA6\u548C\u8D34\u56FE\u5206\u8FA8\u7387\uFF0C\n // \u6DF1\u5EA6\u504F\u5DEE\u5927\u5230\u80FD\u628A\u77ED\u5F71\u5B50\u6574\u6BB5\u5403\u6389\uFF08\u8BE6\u89C1 ShadowFrustum \u7684\u8BF4\u660E\uFF09\u3002\n this.shadowMap.setBounds(accumulateSceneBounds(renderables));\n }\n if (this.shadowEnabled && this.shadowMap?.begin()) {\n const lightViewProjection = this.shadowMap.matrix;\n for (const batch of instances) {\n if (isTransparentColor(batch.material.color)) continue;\n const instance = this.instanceCache!.retain(gl, this.geometryCache, batch);\n if (!instance) continue;\n gl.bindVertexArray(instance.vertexArray);\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, instance.triangleIndexBuffer);\n gl.drawElementsInstanced(\n gl.TRIANGLES,\n instance.triangleCount,\n batch.geometry.indices instanceof Uint16Array\n ? gl.UNSIGNED_SHORT\n : gl.UNSIGNED_INT,\n 0,\n instance.instanceCount,\n );\n }\n this.shadowMap.setInstancing(false);\n for (const draw of batches) {\n if (isTransparentColor(draw.batch.material.color)) continue;\n world.elements.set(draw.worldMatrix);\n mvp.elements.set(lightViewProjection);\n mvp.multiply(world);\n this.shadowMap.setMatrix(mvp.elements);\n const geometry = this.geometryCache.retain(gl, draw.batch.geometry);\n gl.bindVertexArray(geometry.vertexArray);\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, geometry.triangleIndexBuffer);\n gl.drawElements(\n gl.TRIANGLES,\n geometry.triangleCount,\n draw.batch.geometry.indices instanceof Uint16Array\n ? gl.UNSIGNED_SHORT\n : gl.UNSIGNED_INT,\n 0,\n );\n }\n for (const renderable of standalone) {\n if (isTransparentColor(renderable.mesh.material.color)) continue;\n world.elements.set(renderable.worldMatrix);\n mvp.elements.set(lightViewProjection);\n mvp.multiply(world);\n this.shadowMap.setMatrix(mvp.elements);\n const geometry = this.geometryCache.retain(gl, renderable.mesh.geometry);\n gl.bindVertexArray(geometry.vertexArray);\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, geometry.triangleIndexBuffer);\n gl.drawElements(\n gl.TRIANGLES,\n geometry.triangleCount,\n renderable.mesh.geometry.indices instanceof Uint16Array\n ? gl.UNSIGNED_SHORT\n : gl.UNSIGNED_INT,\n 0,\n );\n }\n // \u89C6\u53E3\u8981\u7528\u8BBE\u5907\u50CF\u7D20\uFF1Aresize \u91CC canvas.width \u662F\u6309 dpr \u653E\u5927\u7684\uFF0C\u7528 CSS \u50CF\u7D20\u4F1A\u628A\u753B\u9762\u7F29\u5230\u5DE6\u4E0B\u89D2\u3002\n this.shadowMap.end(frame.viewport.width * this.dpr, frame.viewport.height * this.dpr);\n // \u9634\u5F71 pass \u7528\u7684\u662F\u6DF1\u5EA6\u7A0B\u5E8F\uFF0C\u7ED3\u675F\u540E\u5FC5\u987B\u5207\u56DE\u4E3B\u7A0B\u5E8F\uFF1A\n // \u5426\u5219\u540E\u9762\u7684 setColor/setMatrix \u90FD\u5728\u5F80\u53E6\u4E00\u4E2A\u7A0B\u5E8F\u4E0A\u5199 uniform\uFF0C\u4E3B pass \u62FF\u5230\u7684\u662F\u7A7A\u7684\u3002\n this.program.use();\n }\n\n // \u91C7\u6837\u53C2\u6570\u653E\u5728\u6DF1\u5EA6 pass \u4E4B\u540E\u518D\u8BBE\uFF1A\u6B64\u65F6\u8D34\u56FE\u5185\u5BB9\u4E0E\u77E9\u9635\u90FD\u5DF2\u5C31\u7EEA\uFF0C\n // \u4E5F\u548C\u300C\u5148\u5EFA\u56FE\u3001\u540E\u91C7\u6837\u300D\u7684\u8BED\u4E49\u4E00\u81F4\uFF0C\u907F\u514D\u4EFB\u4F55\u5148\u540E\u987A\u5E8F\u9020\u6210\u7684\u9519\u914D\u3002\n // \u5173\u95ED\u65F6\u4E5F\u8981\u8D70\u4E00\u904D\uFF1Auniform \u9ED8\u8BA4 0 \u53EA\u662F\"\u6070\u597D\u6B63\u786E\"\uFF0C\u663E\u5F0F\u5173\u6389\u624D\u4E0D\u4F1A\u5728\u5F00\u5173\u5207\u6362\u65F6\u6B8B\u7559\u3002\n if (this.shadowMap) {\n this.program.use();\n this.program.setShadow(\n this.shadowEnabled,\n this.shadowMap.texture,\n this.shadowMap.matrix,\n // 1.5 \u4E2A\u7EB9\u7D20\uFF1A\u591F\u628A\u5E73\u8EBA\u5728\u5149\u91CC\u7684\u9762\u62AC\u79BB\u81EA\u8EAB\u6DF1\u5EA6\uFF0C\u53C8\u4E0D\u4F1A\u8BA9\u5F71\u5B50\u660E\u663E\u79BB\u5F00\u7269\u4F53\u3002\n this.shadowMap.texelWorld * 1.5,\n );\n this.program.setShadowDebug(this.shadowDebug);\n }\n\n this.program.setSceneDepth(\n aoReady ? this.sceneDepth!.texture : null,\n frame.camera.getProjectionMatrix(aspect),\n frame.camera.near,\n frame.camera.far,\n Math.max(1, frame.viewport.width * this.dpr),\n Math.max(1, frame.viewport.height * this.dpr),\n );\n\n this.program.setOcclusion(this.occlusionRadius, this.occlusionStrength);\n\n for (const transparentPass of [false, true] as const) {\n if (transparentPass) {\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n gl.depthMask(false);\n } else {\n gl.disable(gl.BLEND);\n gl.depthMask(true);\n }\n this.program.setInstancing(true);\n this.profiler.mark('prepareAndUpload');\n for (const batch of instances) {\n if (isTransparentColor(batch.material.color) !== transparentPass) continue;\n const instance = this.instanceCache!.retain(\n gl,\n this.geometryCache,\n batch,\n );\n if (!instance) continue;\n for (const id of batch.meshIds) this.instancedMeshIds.add(id);\n mvp.elements.set(viewProjection.elements);\n this.program.setMatrix(mvp);\n this.applyMaterial(batch.material);\n this.program.setVertexColors(Boolean(batch.geometry.colors));\n this.program.setDirectionalShading(\n batch.material.shading !== 'flat',\n );\n this.program.setWaterShading(batch.material.shading === 'water');\n gl.bindVertexArray(instance.vertexArray);\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, instance.triangleIndexBuffer);\n gl.drawElementsInstanced(\n gl.TRIANGLES,\n instance.triangleCount,\n batch.geometry.indices instanceof Uint16Array\n ? gl.UNSIGNED_SHORT\n : gl.UNSIGNED_INT,\n 0,\n instance.instanceCount,\n );\n this.frameStats.drawCalls += 1;\n if (batch.material.edgeColor && instance.edgeCount > 0) {\n this.program.setVertexColors(false);\n this.program.setDirectionalShading(false);\n this.program.setWaterShading(false);\n this.applyEdgeMaterial(batch.material);\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, instance.edgeIndexBuffer);\n for (const [offsetX, offsetY] of EDGE_PIXEL_OFFSETS) {\n this.program.setClipOffset(\n offsetX * clipPixelX,\n offsetY * clipPixelY,\n );\n gl.drawElementsInstanced(\n gl.LINES,\n instance.edgeCount,\n batch.geometry.edgeIndices instanceof Uint16Array\n ? gl.UNSIGNED_SHORT\n : gl.UNSIGNED_INT,\n 0,\n instance.instanceCount,\n );\n this.frameStats.drawCalls += 1;\n }\n }\n }\n this.program.setInstancing(false);\n this.program.setClipOffset(0, 0);\n for (const draw of batches) {\n if (isTransparentColor(draw.batch.material.color) !== transparentPass) continue;\n this.program.setClipOffset(0, 0);\n mvp.elements.set(viewProjection.elements);\n world.elements.set(draw.worldMatrix);\n mvp.multiply(world);\n this.program.setMatrix(mvp);\n this.applyMaterial(draw.batch.material);\n const geometry = this.geometryCache.retain(gl, draw.batch.geometry);\n this.program.setVertexColors(Boolean(draw.batch.geometry.colors));\n this.program.setDirectionalShading(\n draw.batch.material.shading !== 'flat',\n );\n this.program.setWaterShading(draw.batch.material.shading === 'water');\n gl.bindVertexArray(geometry.vertexArray);\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, geometry.triangleIndexBuffer);\n gl.drawElements(\n gl.TRIANGLES,\n geometry.triangleCount,\n draw.batch.geometry.indices instanceof Uint16Array\n ? gl.UNSIGNED_SHORT\n : gl.UNSIGNED_INT,\n 0,\n );\n this.frameStats.drawCalls += 1;\n this.frameStats.renderedBatches += 1;\n if (draw.batch.material.edgeColor) {\n this.program.setVertexColors(false);\n this.program.setDirectionalShading(false);\n this.program.setWaterShading(false);\n this.applyEdgeMaterial(draw.batch.material);\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, geometry.edgeIndexBuffer);\n for (const [offsetX, offsetY] of EDGE_PIXEL_OFFSETS) {\n this.program.setClipOffset(\n offsetX * clipPixelX,\n offsetY * clipPixelY,\n );\n gl.drawElements(\n gl.LINES,\n geometry.edgeCount,\n draw.batch.geometry.edgeIndices instanceof Uint16Array\n ? gl.UNSIGNED_SHORT\n : gl.UNSIGNED_INT,\n 0,\n );\n this.frameStats.drawCalls += 1;\n }\n }\n }\n for (const renderable of renderables) {\n if (\n isTransparentColor(renderable.mesh.material.color)\n !== transparentPass\n ) continue;\n if (this.instancedMeshIds.has(renderable.id)) continue;\n this.program.setClipOffset(0, 0);\n mvp.elements.set(viewProjection.elements);\n world.elements.set(renderable.worldMatrix);\n mvp.multiply(world);\n this.program.setMatrix(mvp);\n this.applyMaterial(renderable.mesh.material);\n const geometry = this.geometryCache.retain(gl, renderable.mesh.geometry);\n this.program.setVertexColors(Boolean(renderable.mesh.geometry.colors));\n this.program.setDirectionalShading(\n renderable.mesh.material.shading !== 'flat',\n );\n this.program.setWaterShading(renderable.mesh.material.shading === 'water');\n gl.bindVertexArray(geometry.vertexArray);\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, geometry.triangleIndexBuffer);\n gl.drawElements(\n gl.TRIANGLES,\n geometry.triangleCount,\n renderable.mesh.geometry.indices instanceof Uint16Array\n ? gl.UNSIGNED_SHORT\n : gl.UNSIGNED_INT,\n 0,\n );\n this.frameStats.drawCalls += 1;\n if (renderable.mesh.material.edgeColor) {\n this.program.setVertexColors(false);\n this.program.setDirectionalShading(false);\n this.program.setWaterShading(false);\n this.applyEdgeMaterial(renderable.mesh.material);\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, geometry.edgeIndexBuffer);\n for (const [offsetX, offsetY] of EDGE_PIXEL_OFFSETS) {\n this.program.setClipOffset(\n offsetX * clipPixelX,\n offsetY * clipPixelY,\n );\n gl.drawElements(\n gl.LINES,\n geometry.edgeCount,\n renderable.mesh.geometry.edgeIndices instanceof Uint16Array\n ? gl.UNSIGNED_SHORT\n : gl.UNSIGNED_INT,\n 0,\n );\n this.frameStats.drawCalls += 1;\n }\n }\n this.frameStats.renderedMeshes += 1;\n }\n }\n gl.depthMask(true);\n gl.disable(gl.BLEND);\n if (frame.selection.length > 0) {\n const selected = new Set(frame.selection);\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n gl.depthMask(false);\n // The tint is a second pass over the same triangles. Pull it forward so\n // rotational depth precision cannot make the highlight flicker.\n gl.polygonOffset(-1, -4);\n this.program.setVertexColors(false);\n this.program.setDirectionalShading(false);\n this.program.setColor([\n SELECTION_RGBA[0],\n SELECTION_RGBA[1],\n SELECTION_RGBA[2],\n SELECTION_TINT_ALPHA,\n ]);\n for (const renderable of renderables) {\n if (this.instancedMeshIds.has(renderable.id)) continue;\n if (!selected.has(selectionIdentity(renderable.mesh))) continue;\n mvp.elements.set(viewProjection.elements);\n world.elements.set(renderable.worldMatrix);\n mvp.multiply(world);\n this.program.setMatrix(mvp);\n this.program.setClipOffset(0, 0);\n const geometry = this.geometryCache.retain(gl, renderable.mesh.geometry);\n gl.bindVertexArray(geometry.vertexArray);\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, geometry.triangleIndexBuffer);\n gl.drawElements(\n gl.TRIANGLES,\n geometry.triangleCount,\n renderable.mesh.geometry.indices instanceof Uint16Array\n ? gl.UNSIGNED_SHORT\n : gl.UNSIGNED_INT,\n 0,\n );\n }\n this.program.setColor([\n SELECTION_RGBA[0],\n SELECTION_RGBA[1],\n SELECTION_RGBA[2],\n 1,\n ]);\n for (const renderable of renderables) {\n if (this.instancedMeshIds.has(renderable.id)) continue;\n if (!selected.has(selectionIdentity(renderable.mesh))) continue;\n const geometry = this.geometryCache.retain(gl, renderable.mesh.geometry);\n if (!geometry.edgeIndexBuffer || !renderable.mesh.geometry.edgeIndices) {\n continue;\n }\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, geometry.edgeIndexBuffer);\n for (const [offsetX, offsetY] of EDGE_PIXEL_OFFSETS) {\n this.program.setClipOffset(\n offsetX * clipPixelX,\n offsetY * clipPixelY,\n );\n gl.drawElements(\n gl.LINES,\n geometry.edgeCount,\n renderable.mesh.geometry.edgeIndices instanceof Uint16Array\n ? gl.UNSIGNED_SHORT\n : gl.UNSIGNED_INT,\n 0,\n );\n }\n }\n if (this.semanticProgram) {\n this.semanticProgram.use();\n this.semanticProgram.setInstancing(false);\n gl.polygonOffset(-1, -4);\n for (const draw of batches) {\n for (\n let semanticIndex = 0;\n semanticIndex < draw.batch.semanticSelectionIds.length;\n semanticIndex += 1\n ) {\n if (!selected.has(\n draw.batch.semanticSelectionIds[semanticIndex]!,\n )) {\n continue;\n }\n mvp.elements.set(viewProjection.elements);\n world.elements.set(draw.worldMatrix);\n mvp.multiply(world);\n this.semanticProgram.setMatrix(mvp);\n this.semanticProgram.setHighlight(semanticIndex);\n const geometry = this.geometryCache.retain(\n gl,\n draw.batch.geometry,\n );\n gl.bindVertexArray(geometry.vertexArray);\n gl.bindBuffer(\n gl.ELEMENT_ARRAY_BUFFER,\n geometry.triangleIndexBuffer,\n );\n gl.drawElements(\n gl.TRIANGLES,\n geometry.triangleCount,\n draw.batch.geometry.indices instanceof Uint16Array\n ? gl.UNSIGNED_SHORT\n : gl.UNSIGNED_INT,\n 0,\n );\n }\n }\n this.semanticProgram.setInstancing(true);\n gl.polygonOffset(-1, -4);\n mvp.elements.set(viewProjection.elements);\n this.semanticProgram.setMatrix(mvp);\n for (const batch of instances) {\n const instance = this.instanceCache!.retain(\n gl,\n this.geometryCache,\n batch,\n );\n if (!instance) continue;\n for (\n let semanticIndex = 0;\n semanticIndex < batch.semanticIds.length;\n semanticIndex += 1\n ) {\n if (!selected.has(batch.semanticIds[semanticIndex]!)) continue;\n this.semanticProgram.setHighlight(semanticIndex);\n gl.bindVertexArray(instance.vertexArray);\n gl.drawElementsInstanced(\n gl.TRIANGLES,\n instance.triangleCount,\n batch.geometry.indices instanceof Uint16Array\n ? gl.UNSIGNED_SHORT\n : gl.UNSIGNED_INT,\n 0,\n instance.instanceCount,\n );\n }\n }\n }\n gl.depthMask(true);\n gl.polygonOffset(2, 4);\n gl.disable(gl.BLEND);\n this.program.use();\n this.program.setClipOffset(0, 0);\n }\n gl.bindVertexArray(null);\n this.geometryCache.endFrame();\n this.instanceCache!.endFrame();\n this.frameStats.instancingFallbacks = this.instanceCache!.fallbackCount;\n this.frameStats.gpuUploads = this.geometryCache.uploadCount;\n this.frameStats.gpuEvictions = this.geometryCache.evictionCount;\n this.frameStats.gpuBytes = this.geometryCache.totalBytes\n + this.instanceCache!.totalBytes;\n this.profiler.mark('encode');\n this.profiler.mark('submit');\n this.lastFrameProfile = this.profiler.end();\n }\n\n enableProfiling(enabled: boolean): void {\n this.profiler.enable(enabled);\n this.lastFrameProfile = null;\n }\n\n get frameProfile(): ICEFrameStageProfile | null {\n return this.lastFrameProfile;\n }\n\n async pick(\n frame: ICEFrame,\n point: ICEScreenPoint,\n ): Promise<string | undefined> {\n if (!this.picker || !this.geometryCache) {\n throw new ICEEngineError(\n 'ICE3_PICK_UNAVAILABLE',\n 'ICE3_PICK_UNAVAILABLE: picker is not initialized',\n );\n }\n const renderables = collectRenderables(\n frame.scene,\n this.renderablesScratch,\n );\n return this.picker.pick(\n { ...frame, point },\n this.geometryCache,\n renderables,\n collectRenderBatches(frame.scene, this.batchesScratch),\n collectInstanceBatches(\n renderables,\n this.instancesScratch,\n ),\n this.instanceCache!,\n );\n }\n\n async capture(): Promise<Blob> {\n if (!this.canvas) {\n throw new ICEEngineError(\n 'ICE3_ENGINE_NOT_READY',\n 'Renderer is not initialized',\n );\n }\n return new Promise<Blob>((resolve, reject) => {\n this.canvas!.toBlob((blob) => {\n if (blob) resolve(blob);\n else reject(new Error('ICE3_CAPTURE_UNAVAILABLE: PNG encoding failed'));\n }, 'image/png');\n });\n }\n\n async finish(): Promise<void> {\n this.gl?.finish();\n }\n\n dispose(): void {\n if (this.canvas) {\n this.canvas.removeEventListener('webglcontextlost', this.handleContextLost);\n this.canvas.removeEventListener(\n 'webglcontextrestored',\n this.handleContextRestored,\n );\n }\n if (this.program) {\n this.program.dispose();\n }\n this.semanticProgram?.dispose();\n this.picker?.dispose();\n this.geometryCache?.dispose();\n this.instanceCache?.dispose();\n this.program = null;\n this.semanticProgram = null;\n this.geometryCache = null;\n this.instanceCache = null;\n this.picker = null;\n this.canvas = null;\n this.gl = null;\n this.onContextLost = undefined;\n this.onContextRestored = undefined;\n }\n\n getViewport(): ICEViewport {\n return { ...this.viewport };\n }\n\n getDevicePixelRatio(): number {\n return this.dpr;\n }\n\n get stats(): Readonly<typeof this.frameStats> {\n return this.frameStats;\n }\n\n private createProgram(gl: WebGL2RenderingContext): void {\n const program = new WebGL2Program(gl);\n gl.lineWidth(2);\n this.program = program;\n this.semanticProgram = new WebGL2SemanticProgram(gl);\n this.geometryCache = new WebGL2GeometryCache();\n this.instanceCache = new WebGL2InstanceCache();\n this.picker = new WebGL2Picker(gl);\n // \u9634\u5F71\u8D34\u56FE\u5FC5\u987B\u5728\u8FD9\u91CC\u5EFA\uFF1A\u5B83\u548C\u4E3B\u7A0B\u5E8F\u540C\u751F\u547D\u5468\u671F\uFF0C\u4E0A\u4E0B\u6587\u4E22\u5931\u540E\u4E00\u8D77\u91CD\u5EFA\u3002\n this.shadowMap = new WebGL2ShadowMap(gl);\n }\n}\n", "const WEBGPU_TIMEOUT_MS = 3000;\n\nconst REQUIRED_LIMITS = [\n ['maxTextureDimension2D', 4096],\n ['maxBufferSize', 268_435_456],\n ['maxVertexBuffers', 2],\n ['maxBindGroups', 2],\n] as const satisfies readonly (readonly [\n keyof GPUSupportedLimits,\n number,\n])[];\n\nconst PROBE_SHADER = `\n@vertex\nfn vertexMain(@builtin(vertex_index) index: u32) -> @builtin(position) vec4<f32> {\n var positions = array<vec2<f32>, 3>(\n vec2<f32>(-1.0, -1.0),\n vec2<f32>(3.0, -1.0),\n vec2<f32>(-1.0, 3.0),\n );\n return vec4<f32>(positions[index], 0.0, 1.0);\n}\n\n@fragment\nfn fragmentMain() -> @location(0) vec4<f32> {\n return vec4<f32>(0.0, 0.0, 0.0, 1.0);\n}\n`;\n\nexport type ICEWebGPUProbeFailureReason =\n | 'document-unavailable'\n | 'api-unavailable'\n | 'adapter-unavailable'\n | 'adapter-timeout'\n | 'feature-missing'\n | 'limit-too-low'\n | 'device-failed'\n | 'context-failed'\n | 'pipeline-failed'\n | 'device-lost';\n\nexport type ICEWebGPUProbeResult =\n | {\n readonly supported: true;\n readonly adapter: GPUAdapter;\n readonly device: GPUDevice;\n readonly format: GPUTextureFormat;\n readonly enabledFeatures: ReadonlySet<GPUFeatureName>;\n readonly release: () => void;\n }\n | {\n readonly supported: false;\n readonly reason: ICEWebGPUProbeFailureReason;\n readonly detail?: string;\n };\n\nexport type ICEWebGPUProbeOptions = {\n readonly gpu?: GPU;\n readonly timeoutMs?: number;\n readonly createCanvas?: () => OffscreenCanvas | HTMLCanvasElement;\n readonly optionalFeatures?: readonly GPUFeatureName[];\n};\n\nconst successfulProbes = new WeakMap<\n GPU,\n Map<string, Promise<ICEWebGPUProbeResult>>\n>();\n\nexport function probeWebGPU(\n options: ICEWebGPUProbeOptions = {},\n): Promise<ICEWebGPUProbeResult> {\n const gpu = options.gpu\n ?? (\n typeof navigator === 'undefined'\n ? undefined\n : (navigator as Navigator & { readonly gpu?: GPU }).gpu\n );\n if (!gpu) {\n return Promise.resolve(failure(\n 'api-unavailable',\n 'navigator.gpu is unavailable',\n ));\n }\n\n const featureKey = [...(options.optionalFeatures ?? [])]\n .sort()\n .join('|');\n const probes = successfulProbes.get(gpu);\n const cached = probes?.get(featureKey);\n if (cached) return cached;\n\n const probe = executeProbe(gpu, options).then((result) => (\n result.supported\n ? {\n ...result,\n release: () => {\n const current = successfulProbes.get(gpu);\n current?.delete(featureKey);\n if (current?.size === 0) successfulProbes.delete(gpu);\n },\n }\n : result\n ));\n const featureProbes = probes ?? new Map();\n featureProbes.set(featureKey, probe);\n successfulProbes.set(gpu, featureProbes);\n void probe.then((result) => {\n if (!result.supported) {\n featureProbes.delete(featureKey);\n if (featureProbes.size === 0) successfulProbes.delete(gpu);\n }\n });\n return probe;\n}\n\nasync function executeProbe(\n gpu: GPU,\n options: ICEWebGPUProbeOptions,\n): Promise<ICEWebGPUProbeResult> {\n const timeoutMs = options.timeoutMs ?? WEBGPU_TIMEOUT_MS;\n const timeout = Symbol('timeout');\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n let adapter: GPUAdapter | null | typeof timeout;\n try {\n adapter = await Promise.race([\n gpu.requestAdapter({ powerPreference: 'high-performance' }),\n new Promise<typeof timeout>((resolve) => {\n timeoutId = setTimeout(() => resolve(timeout), timeoutMs);\n }),\n ]);\n } catch (error) {\n if (timeoutId !== undefined) clearTimeout(timeoutId);\n return failure('adapter-unavailable', errorMessage(error));\n }\n if (timeoutId !== undefined) clearTimeout(timeoutId);\n if (adapter === timeout) {\n return failure('adapter-timeout', `Adapter lookup exceeded ${timeoutMs}ms`);\n }\n if (!adapter) {\n return failure('adapter-unavailable', 'requestAdapter returned null');\n }\n\n for (const [name, minimum] of REQUIRED_LIMITS) {\n const value = adapter.limits[name];\n if (typeof value !== 'number' || value < minimum) {\n return failure(\n 'limit-too-low',\n `${name} requires at least ${minimum}; received ${String(value)}`,\n );\n }\n }\n\n let device: GPUDevice;\n try {\n const features = (options.optionalFeatures ?? [])\n .filter((feature) => adapter.features.has(feature));\n device = await adapter.requestDevice({\n ...(features.length > 0 ? { requiredFeatures: features } : {}),\n });\n } catch (error) {\n return failure('device-failed', errorMessage(error));\n }\n\n const canvas = createProbeCanvas(options.createCanvas);\n if (!canvas) {\n device.destroy();\n return failure('document-unavailable', 'No Canvas implementation is available');\n }\n let context: GPUCanvasContext | null;\n try {\n context = canvas.getContext('webgpu') as GPUCanvasContext | null;\n } catch (error) {\n device.destroy();\n return failure('context-failed', errorMessage(error));\n }\n if (!context) {\n device.destroy();\n return failure('context-failed', 'WebGPU canvas context is unavailable');\n }\n\n try {\n const format = gpu.getPreferredCanvasFormat();\n context.configure({\n device,\n format,\n alphaMode: 'premultiplied',\n });\n const module = device.createShaderModule({ code: PROBE_SHADER });\n const pipeline = await device.createRenderPipelineAsync({\n layout: 'auto',\n vertex: {\n module,\n entryPoint: 'vertexMain',\n },\n fragment: {\n module,\n entryPoint: 'fragmentMain',\n targets: [{ format }],\n },\n primitive: { topology: 'triangle-list' },\n });\n const texture = context.getCurrentTexture();\n const encoder = device.createCommandEncoder();\n const pass = encoder.beginRenderPass({\n colorAttachments: [{\n view: texture.createView(),\n clearValue: { r: 0, g: 0, b: 0, a: 1 },\n loadOp: 'clear',\n storeOp: 'store',\n }],\n });\n pass.setPipeline(pipeline);\n pass.draw(3);\n pass.end();\n device.queue.submit([encoder.finish()]);\n\n const lost = await Promise.race([\n device.lost.then((info) => info.message || info.reason),\n new Promise<false>((resolve) => {\n setTimeout(() => resolve(false), 0);\n }),\n ]);\n if (lost) {\n device.destroy();\n return failure('device-lost', lost);\n }\n return {\n supported: true,\n adapter,\n device,\n format,\n enabledFeatures: new Set<GPUFeatureName>(\n Array.from(device.features) as GPUFeatureName[],\n ),\n release: () => undefined,\n };\n } catch (error) {\n device.destroy();\n return failure('pipeline-failed', errorMessage(error));\n }\n}\n\nfunction createProbeCanvas(\n createCanvas: ICEWebGPUProbeOptions['createCanvas'],\n): OffscreenCanvas | HTMLCanvasElement | undefined {\n if (createCanvas) return createCanvas();\n if (typeof OffscreenCanvas !== 'undefined') {\n return new OffscreenCanvas(64, 64);\n }\n if (typeof document !== 'undefined') {\n const canvas = document.createElement('canvas');\n canvas.width = 64;\n canvas.height = 64;\n return canvas;\n }\n return undefined;\n}\n\nfunction failure(\n reason: ICEWebGPUProbeFailureReason,\n detail?: string,\n): ICEWebGPUProbeResult {\n return {\n supported: false,\n reason,\n ...(detail ? { detail } : {}),\n };\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n", "import { ICEEngineError } from '@ice3/core';\n\nexport const WEBGPU_BUFFER_USAGE = {\n vertex: 32 | 8,\n index: 16 | 8,\n} as const;\n\nexport function alignToFourBytes(value: number): number {\n return Math.ceil(value / 4) * 4;\n}\n\nexport function createGPUDataBuffer(\n device: GPUDevice,\n data: ArrayBufferView,\n usage: GPUBufferUsageFlags,\n label: string,\n): GPUBuffer {\n const byteLength = alignToFourBytes(data.byteLength);\n let buffer: GPUBuffer | undefined;\n try {\n buffer = device.createBuffer({\n label,\n size: byteLength,\n usage,\n mappedAtCreation: false,\n });\n const upload = data.byteLength === byteLength\n ? data\n : copyAndPad(data, byteLength);\n device.queue.writeBuffer(buffer, 0, upload as unknown as BufferSource);\n return buffer;\n } catch (error) {\n buffer?.destroy();\n throw new ICEEngineError(\n 'ICE3_GPU_RESOURCE_FAILED',\n `ICE3_GPU_RESOURCE_FAILED: ${label}`,\n { cause: error },\n );\n }\n}\n\nexport function createEmptyGPUDataBuffer(\n device: GPUDevice,\n byteLength: number,\n usage: GPUBufferUsageFlags,\n label: string,\n): GPUBuffer {\n try {\n return device.createBuffer({\n label,\n size: Math.max(4, alignToFourBytes(byteLength)),\n usage,\n mappedAtCreation: false,\n });\n } catch (error) {\n throw new ICEEngineError(\n 'ICE3_GPU_RESOURCE_FAILED',\n `ICE3_GPU_RESOURCE_FAILED: ${label}`,\n { cause: error },\n );\n }\n}\n\nexport function writeGPUData(\n device: GPUDevice,\n buffer: GPUBuffer,\n data: ArrayBufferView,\n): void {\n try {\n device.queue.writeBuffer(buffer, 0, data as unknown as BufferSource);\n } catch (error) {\n throw new ICEEngineError(\n 'ICE3_GPU_RESOURCE_FAILED',\n 'ICE3_GPU_RESOURCE_FAILED: buffer upload failed',\n { cause: error },\n );\n }\n}\n\nfunction copyAndPad(\n data: ArrayBufferView,\n byteLength: number,\n): Uint8Array {\n const output = new Uint8Array(byteLength);\n output.set(new Uint8Array(\n data.buffer,\n data.byteOffset,\n data.byteLength,\n ));\n return output;\n}\n", "import {\n ICEEngineError,\n type ICEGeometry,\n type ICEGeometryBufferUpdate,\n} from '@ice3/core';\nimport {\n createGPUDataBuffer,\n WEBGPU_BUFFER_USAGE,\n} from './WebGPUResources.js';\n\nexport interface WebGPUGeometryEntry {\n geometry: ICEGeometry;\n readonly geometryId: string;\n readonly attributeDigest: string;\n readonly topologyDigest: string;\n readonly vertexBuffer: GPUBuffer;\n readonly triangleIndexBuffer: GPUBuffer;\n readonly edgeIndexBuffer: GPUBuffer | null;\n readonly semanticBuffer: GPUBuffer | null;\n readonly triangleCount: number;\n readonly edgeCount: number;\n readonly indexFormat: GPUIndexFormat;\n readonly vertexCount: number;\n readonly bytes: number;\n lastUsedFrame: number;\n}\n\nexport interface WebGPUGeometryCacheOptions {\n readonly device: GPUDevice;\n readonly inactiveGraceFrames?: number;\n readonly maxBytes?: number;\n}\n\nexport class WebGPUGeometryCache {\n private readonly device: GPUDevice;\n private readonly entries = new Map<string, WebGPUGeometryEntry>();\n private active = new Set<string>();\n private readonly pinned = new Set<string>();\n private readonly objectKeys = new WeakMap<object, string>();\n private readonly legacyKeys = new WeakMap<object, string>();\n private objectKeySequence = 0;\n private readonly inactiveGraceFrames: number;\n private readonly maxBytes: number;\n private uploads = 0;\n private updatedBytes = 0;\n private evictions = 0;\n private frameId = 0;\n private resourceGeneration = 0;\n\n constructor(options: WebGPUGeometryCacheOptions) {\n this.device = options.device;\n this.inactiveGraceFrames = options.inactiveGraceFrames ?? 60;\n this.maxBytes = options.maxBytes ?? 768 * 1024 * 1024;\n if (\n !Number.isInteger(this.inactiveGraceFrames)\n || this.inactiveGraceFrames < 0\n || !Number.isInteger(this.maxBytes)\n || this.maxBytes < 1\n ) {\n throw new Error('ICE3_GPU_CACHE_INVALID: cache options are invalid');\n }\n }\n\n retain(geometry: ICEGeometry): WebGPUGeometryEntry {\n const key = this.keyFor(geometry);\n this.active.add(key);\n const existing = this.entries.get(key);\n if (existing) {\n if (this.canReuse(existing, geometry)) {\n existing.lastUsedFrame = this.frameId;\n return existing;\n }\n }\n\n const next = this.createEntry(geometry, key);\n if (existing) {\n this.deleteEntry(existing, false);\n }\n this.entries.set(key, next);\n return next;\n }\n\n private createEntry(\n geometry: ICEGeometry,\n key: string,\n ): WebGPUGeometryEntry {\n const buffers: GPUBuffer[] = [];\n try {\n const vertexCount = geometry.positions.length / 3;\n const vertices = new Float32Array(vertexCount * 6);\n const colorStride = geometry.colors\n ? geometry.colors.length / vertexCount\n : 0;\n for (let index = 0; index < vertexCount; index += 1) {\n vertices[index * 6] = geometry.positions[index * 3]!;\n vertices[index * 6 + 1] = geometry.positions[index * 3 + 1]!;\n vertices[index * 6 + 2] = geometry.positions[index * 3 + 2]!;\n vertices[index * 6 + 3] = geometry.colors?.[index * colorStride] ?? 1;\n vertices[index * 6 + 4] =\n geometry.colors?.[index * colorStride + 1] ?? 1;\n vertices[index * 6 + 5] =\n geometry.colors?.[index * colorStride + 2] ?? 1;\n }\n const vertexBuffer = createGPUDataBuffer(\n this.device,\n vertices,\n WEBGPU_BUFFER_USAGE.vertex,\n `${geometry.typeId}:vertices`,\n );\n buffers.push(vertexBuffer);\n const triangleIndexBuffer = createGPUDataBuffer(\n this.device,\n geometry.indices,\n WEBGPU_BUFFER_USAGE.index,\n `${geometry.typeId}:triangle-indices`,\n );\n buffers.push(triangleIndexBuffer);\n const edgeIndexBuffer = geometry.edgeIndices\n ? createGPUDataBuffer(\n this.device,\n geometry.edgeIndices,\n WEBGPU_BUFFER_USAGE.index,\n `${geometry.typeId}:edge-indices`,\n )\n : null;\n if (edgeIndexBuffer) buffers.push(edgeIndexBuffer);\n const semanticBuffer = geometry.semanticIndices\n ? createGPUDataBuffer(\n this.device,\n geometry.semanticIndices,\n WEBGPU_BUFFER_USAGE.vertex,\n `${geometry.typeId}:semantic`,\n )\n : null;\n if (semanticBuffer) buffers.push(semanticBuffer);\n\n const entry: WebGPUGeometryEntry = {\n geometry,\n geometryId: geometry.identity?.geometryId ?? key,\n attributeDigest: geometry.identity?.attributeDigest ?? '',\n topologyDigest: geometry.identity?.topologyDigest ?? '',\n vertexBuffer,\n triangleIndexBuffer,\n edgeIndexBuffer,\n semanticBuffer,\n triangleCount: geometry.indices.length,\n edgeCount: geometry.edgeIndices?.length ?? 0,\n indexFormat: geometry.indices instanceof Uint16Array\n ? 'uint16'\n : 'uint32',\n vertexCount,\n bytes: buffers.reduce((sum, buffer) => sum + buffer.size, 0),\n lastUsedFrame: this.frameId,\n };\n this.uploads += buffers.length;\n this.resourceGeneration += 1;\n return entry;\n } catch (error) {\n for (const buffer of buffers) buffer.destroy();\n if (error instanceof ICEEngineError) throw error;\n throw new ICEEngineError(\n 'ICE3_GPU_RESOURCE_FAILED',\n 'ICE3_GPU_RESOURCE_FAILED: geometry upload failed',\n { cause: error },\n );\n }\n }\n\n pin(\n geometry: ICEGeometry,\n update?: ICEGeometryBufferUpdate,\n ): WebGPUGeometryEntry {\n const key = this.keyFor(geometry);\n this.pinned.add(key);\n const existing = this.entries.get(key);\n if (existing && update && this.sameTopology(existing, geometry)) {\n this.applyPositionUpdate(existing, geometry, update);\n return existing;\n }\n const entry = this.retain(geometry);\n this.enforceBudget();\n if (this.totalBytes > this.maxBytes) {\n this.pinned.delete(key);\n this.deleteEntry(entry);\n throw new ICEEngineError(\n 'ICE3_GPU_RESOURCE_FAILED',\n 'ICE3_GPU_RESOURCE_FAILED: geometry exceeds the GPU residency budget',\n );\n }\n return entry;\n }\n\n unpin(geometry: ICEGeometry): void {\n this.pinned.delete(this.keyFor(geometry));\n }\n\n beginFrame(): void {\n this.frameId += 1;\n this.active = new Set();\n }\n\n endFrame(): void {\n for (const [geometry, entry] of this.entries) {\n if (this.active.has(geometry) || this.pinned.has(geometry)) continue;\n if (this.frameId - entry.lastUsedFrame < this.inactiveGraceFrames) {\n continue;\n }\n this.deleteEntry(entry);\n }\n this.enforceBudget();\n }\n\n clear(): void {\n for (const [geometry, entry] of this.entries) {\n this.deleteEntry(entry);\n }\n this.active.clear();\n this.pinned.clear();\n }\n\n dispose(): void {\n this.clear();\n }\n\n get totalBytes(): number {\n return [...this.entries.values()]\n .reduce((sum, entry) => sum + entry.bytes, 0);\n }\n\n get uploadCount(): number {\n return this.uploads;\n }\n\n get updateBytes(): number {\n return this.updatedBytes;\n }\n\n get evictionCount(): number {\n return this.evictions;\n }\n\n get generation(): number {\n return this.resourceGeneration;\n }\n\n private enforceBudget(): void {\n let total = this.totalBytes;\n if (total <= this.maxBytes) return;\n const candidates = [...this.entries]\n .filter(([geometry]) => !this.pinned.has(geometry))\n .sort((left, right) => (\n left[1].lastUsedFrame - right[1].lastUsedFrame\n ));\n for (const [geometry, entry] of candidates) {\n if (total <= this.maxBytes) break;\n this.deleteEntry(entry);\n total -= entry.bytes;\n }\n }\n\n private deleteEntry(entry: WebGPUGeometryEntry, eviction = true): void {\n entry.vertexBuffer.destroy();\n entry.triangleIndexBuffer.destroy();\n entry.edgeIndexBuffer?.destroy();\n entry.semanticBuffer?.destroy();\n for (const [key, candidate] of this.entries) {\n if (candidate === entry) {\n this.entries.delete(key);\n break;\n }\n }\n if (eviction) {\n this.evictions += 1;\n }\n this.resourceGeneration += 1;\n }\n\n private applyPositionUpdate(\n entry: WebGPUGeometryEntry,\n geometry: ICEGeometry,\n update: ICEGeometryBufferUpdate,\n ): void {\n let updated = 0;\n try {\n for (const range of update.positionRanges) {\n if (\n range.byteOffset % 12 !== 0\n || range.byteLength % 12 !== 0\n || range.byteOffset + range.byteLength > geometry.positions.byteLength\n ) {\n throw new Error('invalid position range');\n }\n const vertexOffset = range.byteOffset / 12;\n const vertexCount = range.byteLength / 12;\n const vertices = new Float32Array(vertexCount * 6);\n const totalVertices = geometry.positions.length / 3;\n const colorStride = geometry.colors\n ? geometry.colors.length / totalVertices\n : 0;\n for (let index = 0; index < vertexCount; index += 1) {\n const sourceVertex = vertexOffset + index;\n vertices[index * 6] = geometry.positions[sourceVertex * 3]!;\n vertices[index * 6 + 1] = geometry.positions[sourceVertex * 3 + 1]!;\n vertices[index * 6 + 2] = geometry.positions[sourceVertex * 3 + 2]!;\n vertices[index * 6 + 3] =\n geometry.colors?.[sourceVertex * colorStride] ?? 1;\n vertices[index * 6 + 4] =\n geometry.colors?.[sourceVertex * colorStride + 1] ?? 1;\n vertices[index * 6 + 5] =\n geometry.colors?.[sourceVertex * colorStride + 2] ?? 1;\n }\n this.device.queue.writeBuffer(\n entry.vertexBuffer,\n range.byteOffset * 2,\n vertices,\n );\n updated += range.byteLength;\n }\n } catch (error) {\n throw new ICEEngineError(\n 'ICE3_GPU_RESOURCE_FAILED',\n 'ICE3_GPU_RESOURCE_FAILED: geometry update failed',\n { cause: error },\n );\n }\n entry.geometry = geometry;\n entry.lastUsedFrame = this.frameId;\n this.updatedBytes += updated;\n }\n\n private canReuse(\n existing: WebGPUGeometryEntry,\n geometry: ICEGeometry,\n ): boolean {\n if (existing.geometry === geometry) {\n return true;\n }\n if (!this.sameTopology(existing, geometry)) {\n return false;\n }\n return (\n (\n existing.geometry.positions === geometry.positions\n || equalNumberArrays(existing.geometry.positions, geometry.positions)\n )\n && equalOptionalNumberArrays(\n existing.geometry.colors,\n geometry.colors,\n )\n && equalOptionalNumberArrays(\n existing.geometry.semanticIndices,\n geometry.semanticIndices,\n )\n && equalOptionalNumberArrays(\n existing.geometry.edgeIndices,\n geometry.edgeIndices,\n )\n ) || (\n existing.attributeDigest !== ''\n && existing.attributeDigest === geometry.identity?.attributeDigest\n );\n }\n\n private sameTopology(\n existing: WebGPUGeometryEntry,\n geometry: ICEGeometry,\n ): boolean {\n return (\n existing.geometry.indices.constructor === geometry.indices.constructor\n && existing.geometry.indices.length === geometry.indices.length\n && (\n existing.geometry.indices === geometry.indices\n || (\n existing.topologyDigest !== ''\n && existing.topologyDigest === geometry.identity?.topologyDigest\n )\n )\n );\n }\n\n private keyFor(geometry: ICEGeometry): string {\n const identity = geometry.identity?.geometryId;\n if (identity) {\n return `identity:${identity}`;\n }\n const id = (geometry as ICEGeometry & { id?: unknown }).id;\n if (typeof id === 'string' && id.trim()) {\n const cached = this.legacyKeys.get(geometry);\n if (cached) return cached;\n const key = [\n 'content',\n geometry.positions.length,\n geometry.indices.length,\n contentFingerprint(geometry.positions),\n contentFingerprint(geometry.indices),\n geometry.colors ? contentFingerprint(geometry.colors) : 0,\n geometry.edgeIndices ? contentFingerprint(geometry.edgeIndices) : 0,\n geometry.semanticIndices\n ? contentFingerprint(geometry.semanticIndices)\n : 0,\n ].join(':');\n this.legacyKeys.set(geometry, key);\n return key;\n }\n const existing = this.objectKeys.get(geometry);\n if (existing) {\n return existing;\n }\n const key = `object:${this.objectKeySequence}`;\n this.objectKeySequence += 1;\n this.objectKeys.set(geometry, key);\n return key;\n }\n}\n\nfunction contentFingerprint(\n values: Uint16Array | Uint32Array | Float32Array,\n): number {\n let hash = 0x811c9dc5;\n const bytes = new Uint8Array(\n values.buffer,\n values.byteOffset,\n values.byteLength,\n );\n for (const byte of bytes) {\n hash ^= byte;\n hash = Math.imul(hash, 0x01000193) >>> 0;\n }\n return hash;\n}\n\nfunction equalNumberArrays(\n left: Float32Array,\n right: Float32Array,\n): boolean {\n return left.length === right.length\n && left.every((value, index) => value === right[index]);\n}\n\nfunction equalOptionalNumberArrays<T extends Uint16Array | Uint32Array | Float32Array>(\n left: T | undefined,\n right: T | undefined,\n): boolean {\n if (left === undefined || right === undefined) {\n return left === right;\n }\n return left.length === right.length\n && left.every((value, index) => value === right[index]);\n}\n", "import {\n createEmptyGPUDataBuffer,\n writeGPUData,\n WEBGPU_BUFFER_USAGE,\n} from './WebGPUResources.js';\nimport type { ICEInstanceBatch } from './InstanceBatch.js';\n\nexport interface WebGPUInstanceEntry {\n readonly matrixBuffer: GPUBuffer;\n readonly semanticBuffer: GPUBuffer;\n instanceCount: number;\n readonly bytes: number;\n readonly generation: number;\n}\n\ninterface CachedInstanceEntry extends WebGPUInstanceEntry {\n matrixCapacity: number;\n semanticCapacity: number;\n matrixBytes?: Uint8Array;\n semanticBytes?: Uint8Array;\n matrixSource?: Float32Array;\n semanticSource?: Uint32Array;\n}\n\nexport class WebGPUInstanceCache {\n private readonly entries = new Map<string, CachedInstanceEntry>();\n private active = new Set<string>();\n private bufferGeneration = 0;\n\n constructor(private readonly device: GPUDevice) {}\n\n retain(batch: ICEInstanceBatch): WebGPUInstanceEntry {\n this.active.add(batch.id);\n const matrixSize = batch.instanceMatrices.byteLength;\n const semanticSize = batch.semanticIndices.byteLength;\n let entry = this.entries.get(batch.id);\n if (\n !entry\n || entry.matrixCapacity < matrixSize\n || entry.semanticCapacity < semanticSize\n ) {\n if (entry) this.deleteEntry(entry);\n entry = {\n matrixBuffer: createEmptyGPUDataBuffer(\n this.device,\n matrixSize,\n WEBGPU_BUFFER_USAGE.vertex,\n `${batch.id}:matrices`,\n ),\n semanticBuffer: createEmptyGPUDataBuffer(\n this.device,\n semanticSize,\n WEBGPU_BUFFER_USAGE.vertex,\n `${batch.id}:semantic`,\n ),\n instanceCount: batch.semanticIds.length,\n bytes: Math.ceil(matrixSize / 4) * 4\n + Math.ceil(semanticSize / 4) * 4,\n generation: ++this.bufferGeneration,\n matrixCapacity: Math.max(4, Math.ceil(matrixSize / 4) * 4),\n semanticCapacity: Math.max(4, Math.ceil(semanticSize / 4) * 4),\n };\n this.entries.set(batch.id, entry);\n }\n if (entry.matrixSource !== batch.instanceMatrices) {\n const matrixBytes = toBytes(batch.instanceMatrices);\n if (\n !entry.matrixBytes\n || !sameBytes(entry.matrixBytes, matrixBytes)\n ) {\n writeGPUData(this.device, entry.matrixBuffer, batch.instanceMatrices);\n }\n entry.matrixBytes = matrixBytes;\n entry.matrixSource = batch.instanceMatrices;\n }\n if (entry.semanticSource !== batch.semanticIndices) {\n const semanticBytes = toBytes(batch.semanticIndices);\n if (\n !entry.semanticBytes\n || !sameBytes(entry.semanticBytes, semanticBytes)\n ) {\n writeGPUData(\n this.device,\n entry.semanticBuffer,\n batch.semanticIndices,\n );\n }\n entry.semanticBytes = semanticBytes;\n entry.semanticSource = batch.semanticIndices;\n }\n entry.instanceCount = batch.semanticIds.length;\n return entry;\n }\n\n beginFrame(): void {\n this.active = new Set();\n }\n\n endFrame(): void {\n for (const [id, entry] of this.entries) {\n if (this.active.has(id)) continue;\n this.deleteEntry(entry);\n this.entries.delete(id);\n }\n }\n\n clear(): void {\n for (const entry of this.entries.values()) {\n this.deleteEntry(entry);\n }\n this.active.clear();\n }\n\n dispose(): void {\n this.clear();\n }\n\n get totalBytes(): number {\n return [...this.entries.values()]\n .reduce((sum, entry) => sum + entry.bytes, 0);\n }\n\n get generation(): number {\n return this.bufferGeneration;\n }\n\n private deleteEntry(entry: WebGPUInstanceEntry): void {\n entry.matrixBuffer.destroy();\n entry.semanticBuffer.destroy();\n this.bufferGeneration += 1;\n }\n}\n\nfunction toBytes(data: Float32Array | Uint32Array): Uint8Array {\n return new Uint8Array(\n data.buffer,\n data.byteOffset,\n data.byteLength,\n ).slice();\n}\n\nfunction sameBytes(left: Uint8Array, right: Uint8Array): boolean {\n if (left.byteLength !== right.byteLength) return false;\n for (let index = 0; index < left.byteLength; index += 1) {\n if (left[index] !== right[index]) return false;\n }\n return true;\n}\n", "import { ICEEngineError } from '@ice3/core';\n\nexport const WEBGPU_UNIFORM_STRIDE = 256;\nexport const WEBGPU_UNIFORM_BYTES = 144;\n\nconst SHADER_SOURCE = (\n selectionMask: boolean,\n storageInstances: boolean,\n indirectInstances: boolean,\n): string => `\nstruct FrameUniforms {\n worldViewProjection: mat4x4<f32>,\n color: vec4<f32>,\n clipOffset: vec2<f32>,\n useVertexColor: f32,\n useInstancing: f32,\n highlightSemantic: f32,\n useSemantic: f32,\n pickMode: f32,\n pickBase: f32,\n selectionBase: f32,\n useSelectionMask: f32,\n pageBase: f32,\n useIndirect: f32,\n useLighting: f32,\n}\n\n${storageInstances\n ? `\nstruct InstanceRecord {\n transform: mat4x4<f32>,\n bounds: vec4<f32>,\n semantic: u32,\n pad0: u32,\n pad1: u32,\n pad2: u32,\n}`\n : ''}\n\nstruct VertexOutput {\n @builtin(position) position: vec4<f32>,\n @location(0) color: vec4<f32>,\n @location(1) @interpolate(flat) semantic: u32,\n @location(2) worldPosition: vec4<f32>,\n}\n\n@group(0) @binding(0) var<uniform> frame: FrameUniforms;\n${selectionMask\n ? '@group(0) @binding(1) var<storage, read> selection: array<u32>;'\n : ''}\n${storageInstances\n ? '@group(0) @binding(2) var<storage, read> instances: array<InstanceRecord>;'\n : ''}\n${indirectInstances\n ? '@group(0) @binding(3) var<storage, read> visibleIndices: array<u32>;'\n : ''}\n\n@vertex\nfn vertexMain(\n @location(0) position: vec3<f32>,\n @location(1) color: vec3<f32>,\n ${storageInstances\n ? `\n @builtin(instance_index) instanceIndex: u32,\n @location(2) vertexSemantic: u32,\n`\n : `\n @location(2) instanceColumn0: vec4<f32>,\n @location(3) instanceColumn1: vec4<f32>,\n @location(4) instanceColumn2: vec4<f32>,\n @location(5) instanceColumn3: vec4<f32>,\n @location(6) instanceSemantic: u32,\n @location(7) vertexSemantic: u32,\n`}\n) -> VertexOutput {\n ${storageInstances\n ? `\n let visibleIndex = ${\n indirectInstances\n ? 'visibleIndices[instanceIndex]'\n : 'instanceIndex - u32(frame.pageBase)'\n };\n let recordIndex = visibleIndex;\n let record = instances[recordIndex];\n let instanceMatrix = record.transform;\n let instanceSemantic = record.semantic;\n let localPosition = vec4<f32>(position, 1.0);\n let worldPosition = instanceMatrix * localPosition;\n`\n : `\n let instanceMatrix = mat4x4<f32>(\n instanceColumn0,\n instanceColumn1,\n instanceColumn2,\n instanceColumn3\n );\n let localPosition = vec4<f32>(position, 1.0);\n let worldPosition = mix(\n localPosition,\n instanceMatrix * localPosition,\n frame.useInstancing\n );\n`}\n var output: VertexOutput;\n output.position = frame.worldViewProjection * worldPosition;\n output.position.xy += frame.clipOffset * output.position.w;\n output.color = vec4<f32>(\n mix(vec3<f32>(1.0), color, frame.useVertexColor) * frame.color.rgb,\n frame.color.a\n );\n output.worldPosition = worldPosition;\n output.semantic = select(\n vertexSemantic,\n instanceSemantic,\n ${storageInstances ? 'true' : 'frame.useInstancing > 0.5'}\n );\n return output;\n}\n\n@fragment\nfn fragmentMain(input: VertexOutput) -> @location(0) vec4<f32> {\n if (frame.pickMode > 0.5) {\n let id = u32(frame.pickBase) + input.semantic + 1u;\n return vec4<f32>(\n f32(id & 255u),\n f32((id >> 8u) & 255u),\n f32((id >> 16u) & 255u),\n 255.0\n ) / 255.0;\n }\n if (\n frame.useSemantic > 0.5\n && abs(f32(input.semantic) - frame.highlightSemantic) > 0.1\n ) {\n discard;\n }\n ${selectionMask\n ? `\n let isSelected =\n selection[u32(frame.selectionBase) + input.semantic] != 0u;\n if (frame.useSelectionMask > 0.5) {\n if (frame.useSemantic > 0.5 && !isSelected) {\n discard;\n }\n if (isSelected) {\n return vec4<f32>(\n mix(\n input.color.rgb,\n vec3<f32>(1.0, 208.0 / 255.0, 0.0),\n 0.65\n ),\n 1.0\n );\n }\n }`\n : ''}\n var outputColor = input.color;\n if (frame.useLighting > 0.5) {\n let normal = normalize(cross(\n dpdx(input.worldPosition.xyz),\n dpdy(input.worldPosition.xyz)\n ));\n let lightDirection = normalize(vec3<f32>(-0.35, 0.85, 0.4));\n let diffuse = dot(normal, lightDirection);\n let key = max(diffuse, 0.0) + 0.35 * max(-diffuse, 0.0);\n let sky = 0.5 + 0.5 * normal.y;\n let shade = clamp(\n 0.72 + 0.72 * key + 0.18 * sky,\n 0.92,\n 1.42\n );\n outputColor = vec4<f32>(outputColor.rgb * shade, outputColor.a);\n }\n return outputColor;\n}\n`;\n\nconst VERTEX_LAYOUT: GPUVertexBufferLayout[] = [\n {\n arrayStride: 24,\n stepMode: 'vertex',\n attributes: [\n { shaderLocation: 0, offset: 0, format: 'float32x3' },\n { shaderLocation: 1, offset: 12, format: 'float32x3' },\n ],\n },\n {\n arrayStride: 80,\n stepMode: 'instance',\n attributes: [\n { shaderLocation: 2, offset: 0, format: 'float32x4' },\n { shaderLocation: 3, offset: 16, format: 'float32x4' },\n { shaderLocation: 4, offset: 32, format: 'float32x4' },\n { shaderLocation: 5, offset: 48, format: 'float32x4' },\n { shaderLocation: 6, offset: 64, format: 'uint32' },\n ],\n },\n {\n arrayStride: 4,\n stepMode: 'vertex',\n attributes: [\n { shaderLocation: 7, offset: 0, format: 'uint32' },\n ],\n },\n];\n\nconst STORAGE_VERTEX_LAYOUT: GPUVertexBufferLayout[] = [\n VERTEX_LAYOUT[0]!,\n {\n arrayStride: 4,\n stepMode: 'vertex',\n attributes: [\n { shaderLocation: 2, offset: 0, format: 'uint32' },\n ],\n },\n];\n\nexport class WebGPURenderPipeline {\n readonly bindGroupLayout: GPUBindGroupLayout;\n readonly pipelineLayout: GPUPipelineLayout;\n readonly triangle: GPURenderPipeline;\n readonly line: GPURenderPipeline;\n readonly selectionTriangle: GPURenderPipeline;\n readonly selectionLine: GPURenderPipeline;\n readonly selectionMask: boolean;\n readonly storageInstances: boolean;\n readonly indirectInstances: boolean;\n\n private constructor(\n readonly device: GPUDevice,\n readonly format: GPUTextureFormat,\n bindGroupLayout: GPUBindGroupLayout,\n pipelineLayout: GPUPipelineLayout,\n triangle: GPURenderPipeline,\n line: GPURenderPipeline,\n selectionTriangle: GPURenderPipeline,\n selectionLine: GPURenderPipeline,\n selectionMask: boolean,\n storageInstances: boolean,\n indirectInstances: boolean,\n ) {\n this.bindGroupLayout = bindGroupLayout;\n this.pipelineLayout = pipelineLayout;\n this.triangle = triangle;\n this.line = line;\n this.selectionTriangle = selectionTriangle;\n this.selectionLine = selectionLine;\n this.selectionMask = selectionMask;\n this.storageInstances = storageInstances;\n this.indirectInstances = indirectInstances;\n }\n\n static async create(\n device: GPUDevice,\n format: GPUTextureFormat,\n options: {\n readonly selectionMask?: boolean;\n readonly storageInstances?: boolean;\n readonly indirectInstances?: boolean;\n } = {},\n ): Promise<WebGPURenderPipeline> {\n try {\n const storageInstances = Boolean(options.storageInstances);\n const indirectInstances = (\n storageInstances && Boolean(options.indirectInstances)\n );\n const selectionMask = Boolean(\n options.selectionMask || storageInstances,\n );\n const bindGroupEntries: GPUBindGroupLayoutEntry[] = [{\n binding: 0,\n visibility: 3,\n buffer: {\n type: 'uniform',\n hasDynamicOffset: true,\n minBindingSize: WEBGPU_UNIFORM_BYTES,\n },\n }];\n if (selectionMask) {\n bindGroupEntries.push({\n binding: 1,\n visibility: 2,\n buffer: {\n type: 'read-only-storage',\n minBindingSize: 4,\n },\n });\n }\n if (storageInstances) {\n bindGroupEntries.push({\n binding: 2,\n visibility: 1,\n buffer: {\n type: 'read-only-storage',\n minBindingSize: 96,\n },\n });\n }\n if (indirectInstances) {\n bindGroupEntries.push({\n binding: 3,\n visibility: 1,\n buffer: {\n type: 'read-only-storage',\n minBindingSize: 4,\n },\n });\n }\n const bindGroupLayout = device.createBindGroupLayout({\n entries: bindGroupEntries,\n });\n const pipelineLayout = device.createPipelineLayout({\n bindGroupLayouts: [bindGroupLayout],\n });\n const module = device.createShaderModule({\n code: SHADER_SOURCE(\n selectionMask,\n storageInstances,\n indirectInstances,\n ),\n });\n const createPipeline = (\n label: string,\n topology: GPUPrimitiveTopology,\n selection = false,\n ) => device.createRenderPipelineAsync({\n label: indirectInstances\n ? `${label}:storage:indirect`\n : storageInstances\n ? `${label}:storage`\n : label,\n layout: pipelineLayout,\n vertex: {\n module,\n entryPoint: 'vertexMain',\n buffers: storageInstances\n ? STORAGE_VERTEX_LAYOUT\n : VERTEX_LAYOUT,\n },\n fragment: {\n module,\n entryPoint: 'fragmentMain',\n targets: [{\n format,\n ...(selection\n ? {\n blend: {\n color: {\n srcFactor: 'src-alpha' as GPUBlendFactor,\n dstFactor: 'one-minus-src-alpha' as GPUBlendFactor,\n operation: 'add' as GPUBlendOperation,\n },\n alpha: {\n srcFactor: 'one' as GPUBlendFactor,\n dstFactor: 'one-minus-src-alpha' as GPUBlendFactor,\n operation: 'add' as GPUBlendOperation,\n },\n },\n }\n : {}),\n }],\n },\n primitive: {\n topology,\n cullMode: 'none',\n },\n depthStencil: {\n format: 'depth24plus',\n depthCompare: 'less-equal',\n depthWriteEnabled: !selection,\n // Selected triangles are redrawn after opaque geometry. Pull that\n // overlay slightly forward instead of competing at an equal depth.\n ...(selection && topology === 'triangle-list'\n ? {\n depthBias: -1,\n depthBiasSlopeScale: -1,\n depthBiasClamp: 0,\n }\n : {}),\n },\n multisample: { count: 1 },\n });\n const [\n triangle,\n line,\n selectionTriangle,\n selectionLine,\n ] = await Promise.all([\n createPipeline('main:triangle', 'triangle-list'),\n createPipeline('main:line', 'line-list'),\n createPipeline('selection:triangle', 'triangle-list', true),\n createPipeline('selection:line', 'line-list', true),\n ]);\n return new WebGPURenderPipeline(\n device,\n format,\n bindGroupLayout,\n pipelineLayout,\n triangle,\n line,\n selectionTriangle,\n selectionLine,\n selectionMask,\n storageInstances,\n indirectInstances,\n );\n } catch (error) {\n throw new ICEEngineError(\n 'ICE3_WEBGPU_PIPELINE_FAILED',\n 'ICE3_WEBGPU_PIPELINE_FAILED: render pipelines are unavailable',\n { cause: error },\n );\n }\n }\n}\n", "type TimestampSlot = {\n readonly querySet: GPUQuerySet;\n readonly buffer: GPUBuffer;\n pending: boolean;\n};\n\nexport class WebGPUTimestampProfiler {\n private readonly slots: TimestampSlot[];\n private readonly pending: number[] = [];\n private reason: string | undefined;\n private disposed = false;\n\n constructor(\n private readonly device: GPUDevice,\n slotCount = 64,\n ) {\n if (!Number.isInteger(slotCount) || slotCount < 1) {\n throw new Error('ICE3_TIMESTAMP_INVALID: slot count must be positive');\n }\n this.slots = Array.from({ length: slotCount }, (_, index) => ({\n querySet: device.createQuerySet({\n label: `ice3:timestamp:${index}`,\n type: 'timestamp',\n count: 2,\n }),\n buffer: device.createBuffer({\n label: `ice3:timestamp-resolve:${index}`,\n size: 256,\n usage: 512 | 8 | 1,\n }),\n pending: false,\n }));\n }\n\n get unavailableReason(): string | undefined {\n return this.reason;\n }\n\n querySetFor(frameId: number): GPUQuerySet {\n return this.slotFor(frameId).querySet;\n }\n\n resolveFrame(encoder: GPUCommandEncoder, frameId: number): void {\n const slot = this.slotFor(frameId);\n if (slot.pending) {\n throw new Error('ICE3_TIMESTAMP_SLOT_BUSY');\n }\n encoder.resolveQuerySet(slot.querySet, 0, 2, slot.buffer, 0);\n this.pending.push(this.slotIndex(frameId));\n slot.pending = true;\n }\n\n async drain(): Promise<readonly number[]> {\n if (this.disposed) return [];\n const samples: number[] = [];\n for (const index of [...this.pending]) {\n const slot = this.slots[index]!;\n let mapped = false;\n try {\n await slot.buffer.mapAsync(1);\n mapped = true;\n const values = new BigUint64Array(\n slot.buffer.getMappedRange(),\n 0,\n 2,\n );\n const start = values[0]!;\n const end = values[1]!;\n if (end <= start) {\n this.reason = 'invalid-timestamp';\n } else {\n samples.push(Number(end - start) / 1_000_000);\n }\n } catch {\n this.reason = 'map-failed';\n } finally {\n if (mapped) slot.buffer.unmap();\n slot.pending = false;\n const pendingIndex = this.pending.indexOf(index);\n if (pendingIndex >= 0) this.pending.splice(pendingIndex, 1);\n }\n }\n return samples;\n }\n\n dispose(): void {\n if (this.disposed) return;\n this.disposed = true;\n for (const slot of this.slots) {\n slot.querySet.destroy();\n slot.buffer.destroy();\n slot.pending = false;\n }\n this.pending.length = 0;\n }\n\n private slotFor(frameId: number): TimestampSlot {\n if (this.disposed) {\n throw new Error('ICE3_ENGINE_DESTROYED: timestamp profiler');\n }\n if (!Number.isSafeInteger(frameId) || frameId < 0) {\n throw new Error('ICE3_TIMESTAMP_INVALID: frame ID');\n }\n return this.slots[this.slotIndex(frameId)]!;\n }\n\n private slotIndex(frameId: number): number {\n return frameId % this.slots.length;\n }\n}\n", "import {\n createEmptyGPUDataBuffer,\n writeGPUData,\n} from './WebGPUResources.js';\n\nconst STORAGE_USAGE = 128 | 8;\n\nexport type ICESelectionMaskLayout = Readonly<{\n words: Uint32Array;\n bases: readonly number[];\n}>;\n\nexport function buildSelectionMask(\n ranges: readonly (readonly string[])[],\n selection: readonly string[],\n): ICESelectionMaskLayout {\n const selected = new Set(selection);\n const bases: number[] = [];\n let count = 0;\n for (const range of ranges) {\n bases.push(count);\n count += range.length;\n }\n const words = new Uint32Array(Math.max(1, count));\n ranges.forEach((range, rangeIndex) => {\n const base = bases[rangeIndex]!;\n range.forEach((id, index) => {\n words[base + index] = selected.has(id) ? 1 : 0;\n });\n });\n return { words, bases };\n}\n\nexport class WebGPUSelectionMaskBuffer {\n private maskBuffer: GPUBuffer | null = null;\n private previous: Uint8Array | null = null;\n private maskGeneration = 0;\n\n constructor(private readonly device: GPUDevice) {}\n\n get buffer(): GPUBuffer | null {\n return this.maskBuffer;\n }\n\n get generation(): number {\n return this.maskGeneration;\n }\n\n get totalBytes(): number {\n return this.maskBuffer?.size ?? 0;\n }\n\n update(words: Uint32Array): void {\n if (this.maskBuffer && this.maskBuffer.size < words.byteLength) {\n this.maskBuffer.destroy();\n this.maskBuffer = null;\n this.previous = null;\n }\n if (!this.maskBuffer) {\n this.maskBuffer = createEmptyGPUDataBuffer(\n this.device,\n words.byteLength,\n STORAGE_USAGE,\n 'ice3:selection-mask',\n );\n this.maskGeneration += 1;\n }\n const bytes = new Uint8Array(\n words.buffer,\n words.byteOffset,\n words.byteLength,\n ).slice();\n if (this.previous && sameBytes(this.previous, bytes)) return;\n writeGPUData(this.device, this.maskBuffer, words);\n this.previous = bytes;\n }\n\n dispose(): void {\n this.maskBuffer?.destroy();\n this.maskBuffer = null;\n this.previous = null;\n }\n}\n\nfunction sameBytes(left: Uint8Array, right: Uint8Array): boolean {\n if (left.byteLength !== right.byteLength) return false;\n for (let index = 0; index < left.byteLength; index += 1) {\n if (left[index] !== right[index]) return false;\n }\n return true;\n}\n", "import { WEBGPU_UNIFORM_STRIDE } from './WebGPURenderPipeline.js';\n\nconst FLOATS_PER_DRAW = WEBGPU_UNIFORM_STRIDE / 4;\n\nexport type ICEWebGPUDrawUniform = Readonly<{\n matrix: ArrayLike<number>;\n color: readonly [number, number, number, number];\n useVertexColor: boolean;\n useInstancing: boolean;\n useLighting?: boolean;\n semanticHighlight?: number;\n useSemantic?: boolean;\n selectionBase: number;\n useSelectionMask: boolean;\n pageBase?: number;\n useIndirect?: boolean;\n}>;\n\nexport class WebGPUDrawStorage {\n private uniformBuffer: Float32Array;\n private capacity: number;\n private generationValue = 0;\n private count = 0;\n\n constructor(private readonly minimumCapacity = 64) {\n if (!Number.isInteger(minimumCapacity) || minimumCapacity < 1) {\n throw new Error('ICE3_DRAW_STORAGE_INVALID');\n }\n this.capacity = drawCountPowerOfTwo(minimumCapacity);\n this.uniformBuffer = new Float32Array(\n this.capacity * FLOATS_PER_DRAW,\n );\n }\n\n begin(requiredDraws: number): void {\n this.ensureCapacity(requiredDraws);\n this.count = 0;\n }\n\n append(draw: ICEWebGPUDrawUniform): number {\n if (this.count >= this.capacity) {\n this.ensureCapacity(this.count + 1);\n }\n const index = this.count;\n const offset = index * FLOATS_PER_DRAW;\n this.uniformBuffer.set(draw.matrix, offset);\n this.uniformBuffer.set(draw.color, offset + 16);\n this.uniformBuffer[offset + 20] = 0;\n this.uniformBuffer[offset + 21] = 0;\n this.uniformBuffer[offset + 22] = draw.useVertexColor ? 1 : 0;\n this.uniformBuffer[offset + 23] = draw.useInstancing ? 1 : 0;\n this.uniformBuffer[offset + 24] = draw.semanticHighlight ?? 0;\n this.uniformBuffer[offset + 25] = draw.useSemantic ? 1 : 0;\n this.uniformBuffer[offset + 26] = 0;\n this.uniformBuffer[offset + 27] = 0;\n this.uniformBuffer[offset + 28] = draw.selectionBase;\n this.uniformBuffer[offset + 29] = draw.useSelectionMask ? 1 : 0;\n this.uniformBuffer[offset + 30] = draw.pageBase ?? 0;\n this.uniformBuffer[offset + 31] = draw.useIndirect ? 1 : 0;\n this.uniformBuffer[offset + 32] = draw.useLighting ? 1 : 0;\n this.count += 1;\n return index;\n }\n\n get uniformData(): Float32Array {\n return this.uniformBuffer;\n }\n\n get drawCount(): number {\n return this.count;\n }\n\n get generation(): number {\n return this.generationValue;\n }\n\n private ensureCapacity(requiredDraws: number): void {\n const next = Math.max(\n this.minimumCapacity,\n drawCountPowerOfTwo(requiredDraws),\n );\n if (next === this.capacity) return;\n this.capacity = next;\n this.uniformBuffer = new Float32Array(next * FLOATS_PER_DRAW);\n this.generationValue += 1;\n }\n}\n\nfunction drawCountPowerOfTwo(value: number): number {\n let result = 1;\n while (result < Math.max(1, value)) result *= 2;\n return result;\n}\n", "import type { ICEScene } from '@ice3/core';\nimport {\n collectRenderables,\n type ICEGeometryRenderable,\n} from './Renderables.js';\nimport {\n collectInstanceBatches,\n type ICEInstanceBatch,\n} from './InstanceBatch.js';\nimport {\n collectRenderBatches,\n type ICERenderBatchDraw,\n} from './RenderBatch.js';\n\nexport type WebGPURenderPlan = Readonly<{\n scene: ICEScene;\n revision: number;\n renderables: readonly ICEGeometryRenderable[];\n instances: readonly ICEInstanceBatch[];\n batches: readonly ICERenderBatchDraw[];\n instancedMeshIds: ReadonlySet<string>;\n}>;\n\nexport class WebGPURenderPlanCache {\n private scene: ICEScene | null = null;\n private current: WebGPURenderPlan | null = null;\n private readonly renderablesScratch: ICEGeometryRenderable[] = [];\n private readonly instancesScratch: ICEInstanceBatch[] = [];\n private readonly batchesScratch: ICERenderBatchDraw[] = [];\n\n get(scene: ICEScene): WebGPURenderPlan {\n if (\n this.current\n && this.scene === scene\n && this.current.revision === scene.revision\n ) {\n return this.current;\n }\n\n const renderables = collectRenderables(\n scene,\n this.renderablesScratch,\n );\n const instances = collectInstanceBatches(\n renderables,\n this.instancesScratch,\n );\n const batches = collectRenderBatches(scene, this.batchesScratch);\n const instancedMeshIds = new Set<string>();\n for (const instance of instances) {\n for (const id of instance.meshIds) instancedMeshIds.add(id);\n }\n this.scene = scene;\n this.current = Object.freeze({\n scene,\n revision: scene.revision,\n renderables: Object.freeze([...renderables]),\n instances: Object.freeze([...instances]),\n batches: Object.freeze([...batches]),\n instancedMeshIds,\n });\n return this.current;\n }\n\n invalidate(): void {\n this.scene = null;\n this.current = null;\n this.renderablesScratch.length = 0;\n this.instancesScratch.length = 0;\n this.batchesScratch.length = 0;\n }\n\n dispose(): void {\n this.invalidate();\n }\n}\n", "export class WebGPUBundleCache {\n private key: string | null = null;\n private bundle: GPURenderBundle | null = null;\n private recreations = 0;\n\n constructor(\n private readonly device: GPUDevice,\n private readonly format: GPUTextureFormat,\n ) {}\n\n get(\n key: string,\n record: (encoder: GPURenderBundleEncoder) => void,\n ): GPURenderBundle {\n if (this.key === key && this.bundle) return this.bundle;\n const encoder = this.device.createRenderBundleEncoder({\n label: `ice3:bundle:${key}`,\n colorFormats: [this.format],\n depthStencilFormat: 'depth24plus',\n });\n record(encoder);\n const bundle = encoder.finish();\n this.key = key;\n this.bundle = bundle;\n this.recreations += 1;\n return bundle;\n }\n\n get current(): GPURenderBundle | null {\n return this.bundle;\n }\n\n get bundleRecreations(): number {\n return this.recreations;\n }\n\n invalidate(): void {\n this.key = null;\n this.bundle = null;\n }\n\n dispose(): void {\n this.invalidate();\n }\n}\n", "export type ICEWebGPUAccelerationTier =\n | 'baseline'\n | 'storage'\n | 'gpu-driven';\n\n// Measured CPU benefit was below the 10% promotion threshold.\nexport const WEBGPU_STORAGE_DEFAULT = false;\nexport const WEBGPU_GPU_DRIVEN_DEFAULT = false;\nexport const WEBGPU_INSTANCE_VISIBILITY_THRESHOLD = 1024;\n\nexport type ICEWebGPUOptimizationStats = Readonly<{\n tier: ICEWebGPUAccelerationTier;\n selectionMaskActive: boolean;\n bundleActive: boolean;\n storageActive: boolean;\n visibilityActive: boolean;\n instanceUploadBytes: number;\n bundleRecreations: number;\n timestampUnavailableReason?: string;\n}>;\n\nexport type ICEWebGPUAcceleration = Readonly<{\n tier: ICEWebGPUAccelerationTier;\n storage: boolean;\n visibility: boolean;\n maxStorageBufferBindingSize: number;\n minStorageBufferOffsetAlignment: number;\n}>;\n\nexport function detectWebGPUAcceleration(\n device: GPUDevice,\n): ICEWebGPUAcceleration {\n const maxBindingBytes =\n device.limits.maxStorageBufferBindingSize ?? 0;\n const maxBuffers =\n device.limits.maxStorageBuffersPerShaderStage ?? 0;\n const alignment =\n device.limits.minStorageBufferOffsetAlignment ?? 256;\n const storage = (\n maxBindingBytes >= 256\n && maxBuffers >= 2\n && alignment >= 4\n && Number.isInteger(alignment)\n );\n const visibility = storage && maxBuffers >= 3;\n return {\n tier: visibility ? 'gpu-driven' : storage ? 'storage' : 'baseline',\n storage,\n visibility,\n maxStorageBufferBindingSize: maxBindingBytes,\n minStorageBufferOffsetAlignment: alignment,\n };\n}\n", "import type {\n ICEGeometry,\n} from '@ice3/core';\nimport type { ICEInstanceBatch } from './InstanceBatch.js';\nimport {\n createEmptyGPUDataBuffer,\n writeGPUData,\n} from './WebGPUResources.js';\n\nconst STORAGE_USAGE = 128 | 8;\nexport const INSTANCE_RECORD_BYTES = 96;\n\nexport type ICEInstanceStoragePagePlan = Readonly<{\n firstInstance: number;\n instanceCount: number;\n}>;\n\nexport type ICEInstanceStoragePage = ICEInstanceStoragePagePlan & {\n readonly buffer: GPUBuffer;\n};\n\nexport type ICEInstanceStorageEntry = Readonly<{\n pages: readonly ICEInstanceStoragePage[];\n generation: number;\n bytes: number;\n}>;\n\ntype CachedEntry = ICEInstanceStorageEntry & {\n readonly geometry: ICEGeometry;\n readonly matrixSource: Float32Array;\n readonly semanticSource: Uint32Array;\n};\n\nexport type WebGPUInstanceStorageOptions = {\n readonly maxBindingBytes: number;\n readonly minOffsetAlignment: number;\n};\n\nexport class WebGPUInstanceStorage {\n private readonly entries = new Map<string, CachedEntry>();\n private active = new Set<string>();\n private resourceGeneration = 0;\n private uploadBytes = 0;\n private readonly maxBindingBytes: number;\n private readonly minOffsetAlignment: number;\n\n constructor(\n private readonly device: GPUDevice,\n options?: Partial<WebGPUInstanceStorageOptions>,\n ) {\n this.maxBindingBytes = options?.maxBindingBytes\n ?? device.limits.maxStorageBufferBindingSize\n ?? 0;\n this.minOffsetAlignment = options?.minOffsetAlignment\n ?? device.limits.minStorageBufferOffsetAlignment\n ?? 256;\n if (\n this.maxBindingBytes < INSTANCE_RECORD_BYTES\n || this.minOffsetAlignment < 4\n ) {\n throw new Error('ICE3_STORAGE_INVALID: limits are too low');\n }\n }\n\n plan(\n instanceCount: number,\n recordBytes = INSTANCE_RECORD_BYTES,\n ): readonly ICEInstanceStoragePagePlan[] {\n if (\n !Number.isInteger(instanceCount)\n || instanceCount < 0\n || !Number.isInteger(recordBytes)\n || recordBytes < 1\n ) {\n throw new Error('ICE3_STORAGE_INVALID: page input');\n }\n if (instanceCount === 0) return [];\n const stride = Math.ceil(recordBytes / 16) * 16;\n const perPage = Math.max(1, Math.floor(this.maxBindingBytes / stride));\n const pages: ICEInstanceStoragePagePlan[] = [];\n for (let first = 0; first < instanceCount; first += perPage) {\n pages.push({\n firstInstance: first,\n instanceCount: Math.min(perPage, instanceCount - first),\n });\n }\n return pages;\n }\n\n retain(\n batch: ICEInstanceBatch,\n geometry: ICEGeometry,\n ): ICEInstanceStorageEntry {\n this.active.add(batch.id);\n const existing = this.entries.get(batch.id);\n if (\n existing\n && existing.geometry === geometry\n && existing.matrixSource === batch.instanceMatrices\n && existing.semanticSource === batch.semanticIndices\n ) {\n return existing;\n }\n if (existing) this.delete(existing);\n\n const bounds = geometry.getBounds();\n const radius = Math.hypot(\n bounds.max[0] - bounds.min[0],\n bounds.max[1] - bounds.min[1],\n bounds.max[2] - bounds.min[2],\n ) / 2;\n const center = [\n (bounds.min[0] + bounds.max[0]) / 2,\n (bounds.min[1] + bounds.max[1]) / 2,\n (bounds.min[2] + bounds.max[2]) / 2,\n ] as const;\n const plans = this.plan(batch.semanticIds.length);\n const pages = plans.map((page) => {\n const data = new ArrayBuffer(page.instanceCount * INSTANCE_RECORD_BYTES);\n const floats = new Float32Array(data);\n const words = new Uint32Array(data);\n for (let local = 0; local < page.instanceCount; local += 1) {\n const source = page.firstInstance + local;\n const offset = local * 24;\n floats.set(\n batch.instanceMatrices.subarray(source * 16, source * 16 + 16),\n offset,\n );\n floats.set([\n center[0],\n center[1],\n center[2],\n radius,\n ], offset + 16);\n words[offset + 20] = batch.semanticIndices[source] ?? source;\n }\n const buffer = createEmptyGPUDataBuffer(\n this.device,\n data.byteLength,\n STORAGE_USAGE,\n `ice3:instance-records:${batch.id}:${page.firstInstance}`,\n );\n writeGPUData(this.device, buffer, floats);\n this.uploadBytes += data.byteLength;\n return { ...page, buffer };\n });\n const entry: CachedEntry = {\n pages,\n generation: ++this.resourceGeneration,\n bytes: pages.reduce((sum, page) => sum + page.buffer.size, 0),\n geometry,\n matrixSource: batch.instanceMatrices,\n semanticSource: batch.semanticIndices,\n };\n this.entries.set(batch.id, entry);\n return entry;\n }\n\n beginFrame(): void {\n this.active = new Set();\n }\n\n endFrame(): void {\n for (const [id, entry] of this.entries) {\n if (this.active.has(id)) continue;\n this.delete(entry);\n this.entries.delete(id);\n }\n }\n\n get generation(): number {\n return this.resourceGeneration;\n }\n\n get totalBytes(): number {\n return [...this.entries.values()]\n .reduce((sum, entry) => sum + entry.bytes, 0);\n }\n\n get totalUploadBytes(): number {\n return this.uploadBytes;\n }\n\n dispose(): void {\n for (const entry of this.entries.values()) this.delete(entry);\n this.entries.clear();\n this.active.clear();\n }\n\n private delete(entry: ICEInstanceStorageEntry): void {\n for (const page of entry.pages) page.buffer.destroy();\n this.resourceGeneration += 1;\n }\n}\n", "import type { ICEGeometryBounds } from '@ice3/core';\nimport type { ICEInstanceStoragePage } from './WebGPUInstanceStorage.js';\nimport {\n createEmptyGPUDataBuffer,\n writeGPUData,\n} from './WebGPUResources.js';\n\nconst STORAGE_USAGE = 128 | 8;\nconst INDIRECT_USAGE = 256 | 128 | 8 | 4;\n\nexport function createIndirectArguments(\n indexCount: number,\n firstIndex: number,\n baseVertex: number,\n): Uint32Array | undefined {\n if (\n !Number.isInteger(indexCount)\n || indexCount < 0\n || !Number.isInteger(firstIndex)\n || firstIndex < 0\n || !Number.isInteger(baseVertex)\n || baseVertex < 0\n ) {\n return undefined;\n }\n return new Uint32Array([\n indexCount,\n 0,\n firstIndex,\n baseVertex,\n 0,\n ]);\n}\n\nexport function isAabbVisible(\n matrix: ArrayLike<number>,\n bounds: ICEGeometryBounds,\n viewProjection: ArrayLike<number>,\n): boolean {\n let minX = Infinity;\n let minY = Infinity;\n let minZ = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n let maxZ = -Infinity;\n for (const x of [bounds.min[0], bounds.max[0]]) {\n for (const y of [bounds.min[1], bounds.max[1]]) {\n for (const z of [bounds.min[2], bounds.max[2]]) {\n const world = multiply(matrix, [x, y, z, 1]);\n minX = Math.min(minX, world[0]);\n minY = Math.min(minY, world[1]);\n minZ = Math.min(minZ, world[2]);\n maxX = Math.max(maxX, world[0]);\n maxY = Math.max(maxY, world[1]);\n maxZ = Math.max(maxZ, world[2]);\n }\n }\n }\n const row = (index: number) => [\n viewProjection[index]!,\n viewProjection[index + 4]!,\n viewProjection[index + 8]!,\n viewProjection[index + 12]!,\n ] as const;\n const r0 = row(0);\n const r1 = row(1);\n const r2 = row(2);\n const r3 = row(3);\n const planes = [\n addPlane(r3, r0),\n subtractPlane(r3, r0),\n addPlane(r3, r1),\n subtractPlane(r3, r1),\n addPlane(r3, r2),\n subtractPlane(r3, r2),\n ];\n return !planes.some((plane) => {\n const x = plane[0] >= 0 ? maxX : minX;\n const y = plane[1] >= 0 ? maxY : minY;\n const z = plane[2] >= 0 ? maxZ : minZ;\n return plane[0] * x + plane[1] * y + plane[2] * z + plane[3] < 0;\n });\n}\n\nexport type ICEVisibilityEntry = Readonly<{\n readonly visibleBuffer: GPUBuffer;\n readonly indirectBuffer: GPUBuffer;\n readonly instanceCount: number;\n}>;\n\nconst COMPUTE_SHADER = `\nstruct FrameUniforms {\n worldViewProjection: mat4x4<f32>,\n}\n\nstruct InstanceRecord {\n transform: mat4x4<f32>,\n bounds: vec4<f32>,\n semantic: u32,\n pad0: u32,\n pad1: u32,\n pad2: u32,\n}\n\nstruct IndirectArguments {\n indexCount: u32,\n instanceCount: atomic<u32>,\n firstIndex: u32,\n baseVertex: i32,\n firstInstance: u32,\n}\n\n@group(0) @binding(0) var<uniform> frame: FrameUniforms;\n@group(0) @binding(1) var<storage, read> instances: array<InstanceRecord>;\n@group(0) @binding(2) var<storage, read_write> visible: array<u32>;\n@group(0) @binding(3) var<storage, read_write> arguments: IndirectArguments;\n\n@compute @workgroup_size(64)\nfn computeMain(@builtin(global_invocation_id) id: vec3<u32>) {\n let index = id.x;\n if (index >= arrayLength(&instances)) {\n return;\n }\n let instance = instances[index];\n let radius = instance.bounds.w;\n let localMin = instance.bounds.xyz - vec3<f32>(radius);\n let localMax = instance.bounds.xyz + vec3<f32>(radius);\n var worldMin = vec3<f32>(1e30);\n var worldMax = vec3<f32>(-1e30);\n for (var cornerIndex = 0u; cornerIndex < 8u; cornerIndex += 1u) {\n let corner = vec3<f32>(\n select(localMin.x, localMax.x, (cornerIndex & 1u) != 0u),\n select(localMin.y, localMax.y, (cornerIndex & 2u) != 0u),\n select(localMin.z, localMax.z, (cornerIndex & 4u) != 0u)\n );\n let world = (instance.transform * vec4<f32>(corner, 1.0)).xyz;\n worldMin = min(worldMin, world);\n worldMax = max(worldMax, world);\n }\n let r0 = vec4<f32>(\n frame.worldViewProjection[0][0],\n frame.worldViewProjection[1][0],\n frame.worldViewProjection[2][0],\n frame.worldViewProjection[3][0]\n );\n let r1 = vec4<f32>(\n frame.worldViewProjection[0][1],\n frame.worldViewProjection[1][1],\n frame.worldViewProjection[2][1],\n frame.worldViewProjection[3][1]\n );\n let r2 = vec4<f32>(\n frame.worldViewProjection[0][2],\n frame.worldViewProjection[1][2],\n frame.worldViewProjection[2][2],\n frame.worldViewProjection[3][2]\n );\n let r3 = vec4<f32>(\n frame.worldViewProjection[0][3],\n frame.worldViewProjection[1][3],\n frame.worldViewProjection[2][3],\n frame.worldViewProjection[3][3]\n );\n let planes = array<vec4<f32>, 6>(\n r3 + r0,\n r3 - r0,\n r3 + r1,\n r3 - r1,\n r3 + r2,\n r3 - r2\n );\n var culled = false;\n for (var planeIndex = 0u; planeIndex < 6u; planeIndex += 1u) {\n let plane = planes[planeIndex];\n let positive = select(worldMin, worldMax, plane.xyz >= vec3<f32>(0.0));\n if (dot(plane.xyz, positive) + plane.w < 0.0) {\n culled = true;\n break;\n }\n }\n if (culled) {\n return;\n }\n let slot = atomicAdd(&arguments.instanceCount, 1u);\n visible[slot] = index;\n}\n`;\n\nexport class WebGPUVisibilityEncoder {\n private readonly entries = new Map<\n GPUBuffer,\n Map<number, ICEVisibilityEntry>\n >();\n\n private constructor(\n private readonly device: GPUDevice,\n readonly bindGroupLayout: GPUBindGroupLayout,\n readonly pipeline: GPUComputePipeline,\n ) {}\n\n static async create(device: GPUDevice): Promise<WebGPUVisibilityEncoder> {\n const bindGroupLayout = device.createBindGroupLayout({\n entries: [\n {\n binding: 0,\n visibility: 4,\n buffer: {\n type: 'uniform',\n hasDynamicOffset: true,\n minBindingSize: 64,\n },\n },\n {\n binding: 1,\n visibility: 4,\n buffer: { type: 'read-only-storage', minBindingSize: 96 },\n },\n {\n binding: 2,\n visibility: 4,\n buffer: { type: 'storage', minBindingSize: 4 },\n },\n {\n binding: 3,\n visibility: 4,\n buffer: { type: 'storage', minBindingSize: 20 },\n },\n ],\n });\n const layout = device.createPipelineLayout({\n bindGroupLayouts: [bindGroupLayout],\n });\n const module = device.createShaderModule({ code: COMPUTE_SHADER });\n const pipeline = await device.createComputePipelineAsync({\n label: 'ice3:visibility',\n layout,\n compute: { module, entryPoint: 'computeMain' },\n });\n return new WebGPUVisibilityEncoder(device, bindGroupLayout, pipeline);\n }\n\n retain(\n page: ICEInstanceStoragePage,\n indexCount: number,\n ): ICEVisibilityEntry {\n const byIndexCount = this.entries.get(page.buffer);\n const existing = byIndexCount?.get(indexCount);\n if (existing) {\n return existing;\n }\n const visibleBuffer = createEmptyGPUDataBuffer(\n this.device,\n page.instanceCount * 4,\n STORAGE_USAGE,\n 'ice3:visible-instances',\n );\n const indirectBuffer = createEmptyGPUDataBuffer(\n this.device,\n 256,\n INDIRECT_USAGE,\n 'ice3:indirect-arguments',\n );\n writeGPUData(\n this.device,\n indirectBuffer,\n createIndirectArguments(indexCount, 0, 0)!,\n );\n const entry = {\n visibleBuffer,\n indirectBuffer,\n instanceCount: page.instanceCount,\n };\n const entries = byIndexCount ?? new Map();\n entries.set(indexCount, entry);\n this.entries.set(page.buffer, entries);\n return entry;\n }\n\n encode(\n encoder: GPUCommandEncoder,\n entry: ICEVisibilityEntry,\n page: ICEInstanceStoragePage,\n uniformBuffer: GPUBuffer,\n uniformOffset: number,\n ): void {\n encoder.clearBuffer(entry.indirectBuffer, 4, 4);\n const bindGroup = this.device.createBindGroup({\n label: 'ice3:visibility-bindings',\n layout: this.bindGroupLayout,\n entries: [\n {\n binding: 0,\n resource: { buffer: uniformBuffer, offset: 0, size: 112 },\n },\n {\n binding: 1,\n resource: { buffer: page.buffer, offset: 0, size: page.buffer.size },\n },\n {\n binding: 2,\n resource: {\n buffer: entry.visibleBuffer,\n offset: 0,\n size: entry.visibleBuffer.size,\n },\n },\n {\n binding: 3,\n resource: {\n buffer: entry.indirectBuffer,\n offset: 0,\n size: entry.indirectBuffer.size,\n },\n },\n ],\n });\n const pass = encoder.beginComputePass({ label: 'ice3:visibility-pass' });\n pass.setPipeline(this.pipeline);\n pass.setBindGroup(0, bindGroup, [uniformOffset]);\n pass.dispatchWorkgroups(Math.ceil(page.instanceCount / 64));\n pass.end();\n }\n\n async readStats(\n entry: ICEVisibilityEntry,\n page: ICEInstanceStoragePage,\n ): Promise<Readonly<{\n visibleInstances: number;\n culledInstances: number;\n dispatchCount: number;\n }>> {\n const readback = this.device.createBuffer({\n label: 'ice3:visibility-stats',\n size: 4,\n usage: 1 | 8,\n });\n const encoder = this.device.createCommandEncoder();\n encoder.copyBufferToBuffer(entry.indirectBuffer, 4, readback, 0, 4);\n this.device.queue.submit([encoder.finish()]);\n try {\n await readback.mapAsync(1);\n const visibleInstances = new Uint32Array(\n readback.getMappedRange(),\n )[0]!;\n return {\n visibleInstances,\n culledInstances: page.instanceCount - visibleInstances,\n dispatchCount: Math.ceil(page.instanceCount / 64),\n };\n } finally {\n readback.unmap();\n readback.destroy();\n }\n }\n\n dispose(): void {\n for (const entries of this.entries.values()) {\n for (const entry of entries.values()) this.destroy(entry);\n }\n this.entries.clear();\n }\n\n private destroy(entry: ICEVisibilityEntry): void {\n entry.visibleBuffer.destroy();\n entry.indirectBuffer.destroy();\n }\n}\n\nfunction multiply(\n matrix: ArrayLike<number>,\n vector: readonly [number, number, number, number],\n): [number, number, number, number] {\n return [\n matrix[0]! * vector[0] + matrix[4]! * vector[1]\n + matrix[8]! * vector[2] + matrix[12]! * vector[3],\n matrix[1]! * vector[0] + matrix[5]! * vector[1]\n + matrix[9]! * vector[2] + matrix[13]! * vector[3],\n matrix[2]! * vector[0] + matrix[6]! * vector[1]\n + matrix[10]! * vector[2] + matrix[14]! * vector[3],\n matrix[3]! * vector[0] + matrix[7]! * vector[1]\n + matrix[11]! * vector[2] + matrix[15]! * vector[3],\n ];\n}\n\nfunction addPlane(\n left: readonly [number, number, number, number],\n right: readonly [number, number, number, number],\n): readonly [number, number, number, number] {\n return [\n left[0] + right[0],\n left[1] + right[1],\n left[2] + right[2],\n left[3] + right[3],\n ];\n}\n\nfunction subtractPlane(\n left: readonly [number, number, number, number],\n right: readonly [number, number, number, number],\n): readonly [number, number, number, number] {\n return [\n left[0] - right[0],\n left[1] - right[1],\n left[2] - right[2],\n left[3] - right[3],\n ];\n}\n", "import {\n ICEEngineError,\n ICEMatrix4,\n} from '@ice3/core';\nimport {\n collectRenderables,\n} from './Renderables.js';\nimport {\n collectRenderBatches,\n} from './RenderBatch.js';\nimport {\n collectInstanceBatches,\n} from './InstanceBatch.js';\nimport {\n decodeSelectionIndex,\n} from './WebGL2PickCodec.js';\nimport { WebGPUGeometryCache } from './WebGPUGeometryCache.js';\nimport { WebGPUInstanceCache } from './WebGPUInstanceCache.js';\nimport {\n WebGPURenderPipeline,\n WEBGPU_UNIFORM_BYTES,\n WEBGPU_UNIFORM_STRIDE,\n} from './WebGPURenderPipeline.js';\nimport { WebGPURenderPlanCache } from './WebGPURenderPlan.js';\nimport type {\n ICEFrame,\n ICEScreenPoint,\n} from './types.js';\n\ntype ICEPickFrame = ICEFrame & {\n readonly point: ICEScreenPoint;\n};\n\nconst VERTEX_USAGE = 32 | 8;\nconst UNIFORM_USAGE = 64 | 8;\nconst PICK_TEXTURE_USAGE = 16 | 1;\nconst DEPTH_USAGE = 16;\nconst MAP_READ = 1;\nconst COPY_DST = 8;\nconst PICK_FORMAT: GPUTextureFormat = 'rgba8unorm';\n\nexport class WebGPUPicker {\n private readonly pipelinePromise: Promise<WebGPURenderPipeline>;\n private readonly instanceCache: WebGPUInstanceCache;\n private readonly identityInstances: GPUBuffer;\n private readonly zeroSemantics: GPUBuffer;\n private readonly renderPlan = new WebGPURenderPlanCache();\n private target: GPUTexture | null = null;\n private depth: GPUTexture | null = null;\n private uniformBuffer: GPUBuffer | null = null;\n private width = 0;\n private height = 0;\n private disposed = false;\n\n constructor(\n private readonly device: GPUDevice,\n format: GPUTextureFormat,\n ) {\n void format;\n this.pipelinePromise = WebGPURenderPipeline.create(device, PICK_FORMAT);\n this.instanceCache = new WebGPUInstanceCache(device);\n this.identityInstances = device.createBuffer({\n label: 'ice3:pick-identity-instances',\n size: 80,\n usage: VERTEX_USAGE,\n });\n const identity = new Float32Array(20);\n identity.set([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]);\n device.queue.writeBuffer(this.identityInstances, 0, identity);\n this.zeroSemantics = device.createBuffer({\n label: 'ice3:pick-zero-semantic',\n size: 4,\n usage: VERTEX_USAGE,\n });\n device.queue.writeBuffer(this.zeroSemantics, 0, new Uint32Array([0]));\n }\n\n async pick(\n frame: ICEPickFrame,\n geometryCache: WebGPUGeometryCache,\n pickIds: Readonly<Record<number, string>>,\n ): Promise<string | undefined> {\n if (this.disposed) {\n throw new ICEEngineError(\n 'ICE3_ENGINE_DESTROYED',\n 'WebGPU picker is disposed',\n );\n }\n const width = Math.max(\n 1,\n Math.round(frame.viewport.width * frame.dpr),\n );\n const height = Math.max(\n 1,\n Math.round(frame.viewport.height * frame.dpr),\n );\n this.ensureTarget(width, height);\n const pipeline = await this.pipelinePromise;\n this.instanceCache.beginFrame();\n geometryCache.beginFrame();\n const plan = this.renderPlan.get(frame.scene);\n const renderables = plan.renderables;\n const instances = plan.instances;\n const batches = plan.batches;\n const instancedIds = new Set<string>();\n const idBySelection = new Map<string, number>();\n for (const [key, value] of Object.entries(pickIds)) {\n idBySelection.set(value, Number(key));\n }\n const aspect = frame.viewport.width / Math.max(frame.viewport.height, 1);\n const viewProjection = frame.camera.getViewProjectionMatrix(aspect);\n const mvp = new ICEMatrix4();\n const world = new ICEMatrix4();\n const draws: Array<{\n matrix: Float32Array;\n base: number;\n useInstancing: boolean;\n instanceCount: number;\n geometry: ReturnType<WebGPUGeometryCache['retain']>;\n instanceBuffer: GPUBuffer;\n semanticBuffer: GPUBuffer;\n }> = [];\n const matrixFor = (matrix: ArrayLike<number>): Float32Array => {\n mvp.elements.set(viewProjection.elements);\n world.elements.set(matrix);\n mvp.multiply(world);\n return new Float32Array(mvp.elements);\n };\n for (const batch of instances) {\n const ids = batch.semanticIds\n .map((id) => idBySelection.get(id))\n .filter((id): id is number => id !== undefined);\n if (ids.length === 0) continue;\n const instance = this.instanceCache.retain(batch);\n for (const id of batch.meshIds) instancedIds.add(id);\n draws.push({\n matrix: new Float32Array(viewProjection.elements),\n base: Math.min(...ids) - 1,\n useInstancing: true,\n instanceCount: instance.instanceCount,\n geometry: geometryCache.retain(batch.geometry),\n instanceBuffer: instance.matrixBuffer,\n semanticBuffer: instance.semanticBuffer,\n });\n }\n for (const draw of batches) {\n const ids = draw.batch.semanticSelectionIds\n .map((id) => idBySelection.get(id))\n .filter((id): id is number => id !== undefined);\n if (ids.length === 0) continue;\n draws.push({\n matrix: matrixFor(draw.worldMatrix),\n base: Math.min(...ids) - 1,\n useInstancing: false,\n instanceCount: 1,\n geometry: geometryCache.retain(draw.batch.geometry),\n instanceBuffer: this.identityInstances,\n semanticBuffer:\n geometryCache.retain(draw.batch.geometry).semanticBuffer\n ?? this.zeroSemantics,\n });\n }\n for (const renderable of renderables) {\n if (instancedIds.has(renderable.id)) continue;\n const id = idBySelection.get(renderable.mesh.selectionId);\n if (id === undefined) continue;\n draws.push({\n matrix: matrixFor(renderable.worldMatrix),\n base: id - 1,\n useInstancing: false,\n instanceCount: 1,\n geometry: geometryCache.retain(renderable.mesh.geometry),\n instanceBuffer: this.identityInstances,\n semanticBuffer: this.zeroSemantics,\n });\n }\n this.ensureUniformBuffer(draws.length);\n const uniforms = new Float32Array(draws.length * 64);\n for (let index = 0; index < draws.length; index += 1) {\n const draw = draws[index]!;\n const offset = index * 64;\n uniforms.set(draw.matrix, offset);\n uniforms[offset + 16] = 1;\n uniforms[offset + 17] = 1;\n uniforms[offset + 18] = 1;\n uniforms[offset + 19] = 1;\n uniforms[offset + 23] = draw.useInstancing ? 1 : 0;\n uniforms[offset + 26] = 1;\n uniforms[offset + 27] = draw.base;\n }\n if (uniforms.length > 0) {\n this.device.queue.writeBuffer(\n this.uniformBuffer!,\n 0,\n uniforms as unknown as BufferSource,\n );\n }\n const bindGroup = this.device.createBindGroup({\n layout: pipeline.bindGroupLayout,\n entries: [{\n binding: 0,\n resource: {\n buffer: this.uniformBuffer!,\n offset: 0,\n size: WEBGPU_UNIFORM_BYTES,\n },\n }],\n });\n const encoder = this.device.createCommandEncoder();\n const pass = encoder.beginRenderPass({\n colorAttachments: [{\n view: this.target!.createView(),\n clearValue: { r: 0, g: 0, b: 0, a: 1 },\n loadOp: 'clear',\n storeOp: 'store',\n }],\n depthStencilAttachment: {\n view: this.depth!.createView(),\n depthClearValue: 1,\n depthLoadOp: 'clear',\n depthStoreOp: 'store',\n },\n });\n pass.setPipeline(pipeline.triangle);\n for (let index = 0; index < draws.length; index += 1) {\n const draw = draws[index]!;\n pass.setBindGroup(0, bindGroup, [index * WEBGPU_UNIFORM_STRIDE]);\n pass.setVertexBuffer(0, draw.geometry.vertexBuffer);\n pass.setVertexBuffer(1, draw.instanceBuffer);\n pass.setVertexBuffer(2, draw.semanticBuffer);\n pass.setIndexBuffer(\n draw.geometry.triangleIndexBuffer,\n draw.geometry.indexFormat,\n );\n pass.drawIndexed(\n draw.geometry.triangleCount,\n draw.instanceCount,\n );\n }\n pass.end();\n const pixelX = Math.max(\n 0,\n Math.min(this.width - 1, Math.floor(frame.point.x * frame.dpr)),\n );\n const pixelY = Math.max(\n 0,\n Math.min(this.height - 1, Math.floor(frame.point.y * frame.dpr)),\n );\n const readback = this.device.createBuffer({\n label: 'ice3:pick-readback',\n size: 256,\n usage: COPY_DST | MAP_READ,\n });\n encoder.copyTextureToBuffer(\n {\n texture: this.target!,\n origin: {\n x: pixelX,\n y: pixelY,\n z: 0,\n },\n },\n {\n buffer: readback,\n bytesPerRow: 256,\n rowsPerImage: 1,\n },\n { width: 1, height: 1, depthOrArrayLayers: 1 },\n );\n this.device.queue.submit([encoder.finish()]);\n let pixel: Uint8Array | undefined;\n try {\n await readback.mapAsync(MAP_READ);\n pixel = new Uint8Array(readback.getMappedRange(), 0, 4).slice();\n } catch (error) {\n throw new ICEEngineError(\n 'ICE3_WEBGPU_PICK_UNAVAILABLE',\n 'ICE3_WEBGPU_PICK_UNAVAILABLE: readback failed',\n { cause: error },\n );\n } finally {\n readback.unmap();\n readback.destroy();\n this.instanceCache.endFrame();\n geometryCache.endFrame();\n }\n const index = pixel ? decodeSelectionIndex(pixel) : undefined;\n return index === undefined ? undefined : pickIds[index];\n }\n\n resize(width: number, height: number): void {\n this.ensureTarget(width, height);\n }\n\n dispose(): void {\n if (this.disposed) return;\n this.disposed = true;\n this.target?.destroy();\n this.depth?.destroy();\n this.uniformBuffer?.destroy();\n this.identityInstances.destroy();\n this.zeroSemantics.destroy();\n this.instanceCache.dispose();\n this.renderPlan.dispose();\n this.target = null;\n this.depth = null;\n this.uniformBuffer = null;\n }\n\n private ensureTarget(width: number, height: number): void {\n if (this.target && this.depth && this.width === width && this.height === height) {\n return;\n }\n this.target?.destroy();\n this.depth?.destroy();\n this.target = this.device.createTexture({\n label: 'ice3:pick-target',\n size: [width, height],\n format: PICK_FORMAT,\n usage: PICK_TEXTURE_USAGE,\n });\n this.depth = this.device.createTexture({\n label: 'ice3:pick-depth',\n size: [width, height],\n format: 'depth24plus',\n usage: DEPTH_USAGE,\n });\n this.width = width;\n this.height = height;\n }\n\n private ensureUniformBuffer(draws: number): void {\n const capacity = Math.max(1, draws);\n if (capacity <= this.uniformBufferDraws()) return;\n this.uniformBuffer?.destroy();\n this.uniformBuffer = this.device.createBuffer({\n label: 'ice3:pick-uniforms',\n size: capacity * WEBGPU_UNIFORM_STRIDE,\n usage: UNIFORM_USAGE,\n });\n this.uniformBufferCapacity = capacity;\n }\n\n private uniformBufferCapacity = 0;\n\n private uniformBufferDraws(): number {\n return this.uniformBufferCapacity;\n }\n}\n\nexport function collectWebGPUPickIds(\n frame: ICEFrame,\n): Readonly<Record<number, string>> {\n const pickIds: Record<number, string> = {};\n const seen = new Set<string>();\n let next = 1;\n const add = (id: string): void => {\n if (seen.has(id)) return;\n seen.add(id);\n pickIds[next] = id;\n next += 1;\n };\n const renderables = collectRenderables(frame.scene);\n const instances = collectInstanceBatches(renderables);\n for (const instance of instances) {\n for (const id of instance.semanticIds) add(id);\n }\n const instancedIds = new Set(instances.flatMap((item) => item.meshIds));\n for (const batch of collectRenderBatches(frame.scene)) {\n for (const id of batch.batch.semanticSelectionIds) add(id);\n }\n for (const renderable of renderables) {\n if (!instancedIds.has(renderable.id)) add(renderable.mesh.selectionId);\n }\n return pickIds;\n}\n", "import {\n ICEEngineError,\n ICEMatrix4,\n type ICEGeometry,\n} from '@ice3/core';\nimport { colorToRgba } from './Color.js';\nimport type {\n ICERendererBackend,\n ICERendererCapabilities,\n ICEFrame,\n ICEViewport,\n} from './types.js';\nimport {\n WebGPUGeometryCache,\n type WebGPUGeometryEntry,\n} from './WebGPUGeometryCache.js';\nimport {\n WebGPUInstanceCache,\n type WebGPUInstanceEntry,\n} from './WebGPUInstanceCache.js';\nimport {\n WebGPURenderPipeline,\n WEBGPU_UNIFORM_BYTES,\n WEBGPU_UNIFORM_STRIDE,\n} from './WebGPURenderPipeline.js';\nimport {\n RendererProfiler,\n type ICEFrameStageProfile,\n} from './RendererProfiler.js';\nimport { WebGPUTimestampProfiler } from './WebGPUTimestampProfiler.js';\nimport {\n buildSelectionMask,\n WebGPUSelectionMaskBuffer,\n type ICESelectionMaskLayout,\n} from './WebGPUSelectionMask.js';\nimport { WebGPUDrawStorage } from './WebGPUDrawStorage.js';\nimport { WebGPURenderPlanCache } from './WebGPURenderPlan.js';\nimport { WebGPUBundleCache } from './WebGPUBundleCache.js';\nimport {\n detectWebGPUAcceleration,\n type ICEWebGPUAcceleration,\n type ICEWebGPUOptimizationStats,\n WEBGPU_GPU_DRIVEN_DEFAULT,\n WEBGPU_INSTANCE_VISIBILITY_THRESHOLD,\n WEBGPU_STORAGE_DEFAULT,\n} from './WebGPUCapabilities.js';\nimport {\n WebGPUInstanceStorage,\n type ICEInstanceStoragePage,\n} from './WebGPUInstanceStorage.js';\nimport {\n WebGPUVisibilityEncoder,\n type ICEVisibilityEntry,\n} from './WebGPUVisibility.js';\nimport {\n collectWebGPUPickIds,\n WebGPUPicker,\n} from './WebGPUPicker.js';\nimport type { ICEScreenPoint } from './types.js';\n\nconst VERTEX_USAGE = 32 | 8;\nconst UNIFORM_USAGE = 64 | 8;\nconst RENDER_ATTACHMENT_USAGE = 16;\nconst UNIFORM_BUFFER_INITIAL_DRAWS = 64;\nconst SELECTION_RGBA = [1, 208 / 255, 0, 1] as const;\nconst SELECTION_TINT_RGBA = [1, 208 / 255, 0, 0.65] as const;\nconst EMPTY_SELECTION = new Uint32Array([0]);\nconst EDGE_PIXEL_OFFSETS = [\n [0, 0],\n [-1, 0],\n [1, 0],\n [0, -1],\n [0, 1],\n] as const;\n\nexport type WebGPUDeviceContext = Readonly<{\n adapter: GPUAdapter;\n device: GPUDevice;\n format: GPUTextureFormat;\n release?: () => void;\n}>;\n\nexport type WebGPURendererBackendOptions = Readonly<{\n readonly forceStoragePath?: boolean;\n readonly forceGpuDriven?: boolean;\n}>;\n\nexport class WebGPURendererBackend implements ICERendererBackend {\n capabilities: Readonly<ICERendererCapabilities> = {\n backend: 'webgpu',\n maxTextureSize: 0,\n picking: true,\n };\n\n private readonly adapter: GPUAdapter;\n private device: GPUDevice;\n private readonly format: GPUTextureFormat;\n private pipeline: WebGPURenderPipeline;\n private storagePipeline: WebGPURenderPipeline | null;\n private gpuDrivenPipeline: WebGPURenderPipeline | null;\n private visibilityEncoder: WebGPUVisibilityEncoder | null;\n private storageCache: WebGPUInstanceStorage | null;\n private readonly acceleration: ICEWebGPUAcceleration;\n private readonly forceStoragePath: boolean;\n private readonly forceGpuDriven: boolean;\n private readonly releaseProbe: (() => void) | undefined;\n private onContextLost: (() => void) | undefined;\n private onContextRestored: (() => void) | undefined;\n private onError: ((error: ICEEngineError) => void) | undefined;\n private disposing = false;\n private canvas: HTMLCanvasElement | null = null;\n private context: GPUCanvasContext | null = null;\n private geometryCache: WebGPUGeometryCache | null = null;\n private instanceCache: WebGPUInstanceCache | null = null;\n private picker: WebGPUPicker | null = null;\n private selectionMaskBuffer: WebGPUSelectionMaskBuffer | null = null;\n private timestampProfiler: WebGPUTimestampProfiler | null = null;\n private timestampProfilingEnabled = false;\n private bundleCache: WebGPUBundleCache;\n private bundleActive = true;\n private frameBindGroup: GPUBindGroup | null = null;\n private frameBindGroupKey = '';\n private readonly storageBindGroups = new Map<\n GPUBuffer,\n {\n readonly key: string;\n readonly visibleBuffer?: GPUBuffer;\n readonly group: GPUBindGroup;\n }\n >();\n private uniformBufferGeneration = 0;\n private readonly optimizationWarnings = new Set<string>();\n private identityInstances: GPUBuffer | null = null;\n private zeroSemantics: GPUBuffer | null = null;\n private uniformBuffer: GPUBuffer | null = null;\n private depthTexture: GPUTexture | null = null;\n private uniformCapacity = UNIFORM_BUFFER_INITIAL_DRAWS;\n private viewport: ICEViewport = { x: 0, y: 0, width: 1, height: 1 };\n private dpr = 1;\n private backgroundRgba: readonly [number, number, number, number] = [\n 0.035,\n 0.055,\n 0.09,\n 1,\n ];\n private frameStats = {\n drawCalls: 0,\n renderedMeshes: 0,\n renderedBatches: 0,\n instancingFallbacks: 0,\n gpuUploads: 0,\n gpuEvictions: 0,\n gpuBytes: 0,\n };\n private lastFrame: ICEFrame | null = null;\n private captureRequest: {\n readonly buffer: GPUBuffer;\n readonly bytesPerRow: number;\n } | null = null;\n private readonly renderPlan = new WebGPURenderPlanCache();\n private readonly drawListScratch: PendingDraw[] = [];\n private readonly selected = new Set<string>();\n private readonly drawStorage = new WebGPUDrawStorage();\n private readonly lastVisibilityEntries: Array<{\n readonly entry: ICEVisibilityEntry;\n readonly page: ICEInstanceStoragePage;\n }> = [];\n private readonly mvpScratch = new ICEMatrix4();\n private readonly worldScratch = new ICEMatrix4();\n private readonly profiler = new RendererProfiler();\n private lastFrameProfile: ICEFrameStageProfile | null = null;\n private optimizationFailureReason: string | null = null;\n private storageFailureReason: string | null = null;\n private visibilityFailureReason: string | null = null;\n\n private constructor(\n context: WebGPUDeviceContext,\n pipeline: WebGPURenderPipeline,\n storagePipeline: WebGPURenderPipeline | null,\n gpuDrivenPipeline: WebGPURenderPipeline | null,\n visibilityEncoder: WebGPUVisibilityEncoder | null,\n storageCache: WebGPUInstanceStorage | null,\n acceleration: ICEWebGPUAcceleration,\n forceStoragePath: boolean,\n forceGpuDriven: boolean,\n selectionMaskBuffer: WebGPUSelectionMaskBuffer | null,\n optimizationFailureReason: string | null,\n storageFailureReason: string | null,\n visibilityFailureReason: string | null,\n ) {\n this.adapter = context.adapter;\n this.device = context.device;\n this.format = context.format;\n this.pipeline = pipeline;\n this.storagePipeline = storagePipeline;\n this.gpuDrivenPipeline = gpuDrivenPipeline;\n this.visibilityEncoder = visibilityEncoder;\n this.storageCache = storageCache;\n this.acceleration = acceleration;\n this.forceStoragePath = forceStoragePath;\n this.forceGpuDriven = forceGpuDriven;\n this.bundleCache = new WebGPUBundleCache(\n context.device,\n context.format,\n );\n this.selectionMaskBuffer = selectionMaskBuffer;\n this.optimizationFailureReason = optimizationFailureReason;\n this.storageFailureReason = storageFailureReason;\n this.visibilityFailureReason = visibilityFailureReason;\n this.releaseProbe = context.release;\n this.watchDevice(this.device);\n }\n\n static async create(\n context: WebGPUDeviceContext,\n options: WebGPURendererBackendOptions = {},\n ): Promise<WebGPURendererBackend> {\n let selectionMaskBuffer: WebGPUSelectionMaskBuffer | null = null;\n let optimizationFailureReason: string | null = null;\n let pipeline: WebGPURenderPipeline;\n try {\n selectionMaskBuffer = new WebGPUSelectionMaskBuffer(context.device);\n selectionMaskBuffer.update(new Uint32Array([0]));\n pipeline = await WebGPURenderPipeline.create(\n context.device,\n context.format,\n { selectionMask: true },\n );\n } catch {\n selectionMaskBuffer?.dispose();\n selectionMaskBuffer = null;\n optimizationFailureReason = 'selection-mask';\n pipeline = await WebGPURenderPipeline.create(\n context.device,\n context.format,\n );\n }\n const acceleration = detectWebGPUAcceleration(context.device);\n const forceStoragePath = options.forceStoragePath\n ?? WEBGPU_STORAGE_DEFAULT;\n const forceGpuDriven = options.forceGpuDriven\n ?? WEBGPU_GPU_DRIVEN_DEFAULT;\n let storagePipeline: WebGPURenderPipeline | null = null;\n let gpuDrivenPipeline: WebGPURenderPipeline | null = null;\n let visibilityEncoder: WebGPUVisibilityEncoder | null = null;\n let storageCache: WebGPUInstanceStorage | null = null;\n let storageFailureReason: string | null = null;\n let visibilityFailureReason: string | null = null;\n if (forceStoragePath || forceGpuDriven) {\n if (!acceleration.storage) {\n storageFailureReason = 'limit-too-low';\n } else {\n try {\n storagePipeline = await WebGPURenderPipeline.create(\n context.device,\n context.format,\n {\n selectionMask: true,\n storageInstances: true,\n },\n );\n storageCache = new WebGPUInstanceStorage(context.device);\n } catch {\n storagePipeline = null;\n storageCache?.dispose();\n storageCache = null;\n storageFailureReason = 'pipeline-failed';\n }\n }\n }\n if (forceGpuDriven) {\n if (!storagePipeline || !storageCache) {\n visibilityFailureReason = storageFailureReason ?? 'limit-too-low';\n } else if (!acceleration.visibility) {\n visibilityFailureReason = 'limit-too-low';\n } else {\n try {\n gpuDrivenPipeline = await WebGPURenderPipeline.create(\n context.device,\n context.format,\n {\n selectionMask: true,\n storageInstances: true,\n indirectInstances: true,\n },\n );\n visibilityEncoder = await WebGPUVisibilityEncoder.create(\n context.device,\n );\n } catch {\n gpuDrivenPipeline = null;\n visibilityEncoder?.dispose();\n visibilityEncoder = null;\n visibilityFailureReason = 'pipeline-failed';\n }\n }\n }\n return new WebGPURendererBackend(\n context,\n pipeline,\n storagePipeline,\n gpuDrivenPipeline,\n visibilityEncoder,\n storageCache,\n acceleration,\n forceStoragePath,\n forceGpuDriven,\n selectionMaskBuffer,\n optimizationFailureReason,\n storageFailureReason,\n visibilityFailureReason,\n );\n }\n\n initialize(options: {\n readonly canvas: HTMLCanvasElement;\n readonly onContextLost?: () => void;\n readonly onContextRestored?: () => void;\n readonly onError?: (error: ICEEngineError) => void;\n }): void {\n const context = options.canvas.getContext('webgpu') as\n | GPUCanvasContext\n | null;\n if (!context) {\n throw new ICEEngineError(\n 'ICE3_WEBGPU_UNAVAILABLE',\n 'ICE3_WEBGPU_UNAVAILABLE: WebGPU canvas context is unavailable',\n );\n }\n context.configure({\n device: this.device,\n format: this.format,\n alphaMode: 'premultiplied',\n usage: RENDER_ATTACHMENT_USAGE | 1,\n });\n this.canvas = options.canvas;\n this.context = context;\n this.onContextLost = options.onContextLost;\n this.onContextRestored = options.onContextRestored;\n this.onError = options.onError;\n if (this.optimizationFailureReason) {\n const reason = this.optimizationFailureReason;\n this.optimizationFailureReason = null;\n this.reportOptimizationFailure('selection-mask', reason);\n }\n if (this.storageFailureReason) {\n const reason = this.storageFailureReason;\n this.storageFailureReason = null;\n this.reportOptimizationFailure('storage', reason);\n }\n if (this.visibilityFailureReason) {\n const reason = this.visibilityFailureReason;\n this.visibilityFailureReason = null;\n this.reportOptimizationFailure('visibility', reason);\n }\n this.geometryCache = new WebGPUGeometryCache({ device: this.device });\n this.instanceCache = new WebGPUInstanceCache(this.device);\n this.picker = new WebGPUPicker(this.device, this.format);\n this.timestampProfiler = this.device.features.has('timestamp-query')\n ? new WebGPUTimestampProfiler(this.device)\n : null;\n this.capabilities = {\n backend: 'webgpu',\n maxTextureSize: this.device.limits.maxTextureDimension2D,\n picking: true,\n };\n this.identityInstances = this.device.createBuffer({\n label: 'ice3:identity-instances',\n size: 80,\n usage: VERTEX_USAGE,\n });\n const identity = new Float32Array(20);\n identity.set([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]);\n this.device.queue.writeBuffer(this.identityInstances, 0, identity);\n this.zeroSemantics = this.device.createBuffer({\n label: 'ice3:zero-semantic',\n size: 4,\n usage: VERTEX_USAGE,\n });\n this.device.queue.writeBuffer(\n this.zeroSemantics,\n 0,\n new Uint32Array([0]),\n );\n this.ensureUniformCapacity(UNIFORM_BUFFER_INITIAL_DRAWS);\n }\n\n resize(viewport: ICEViewport, dpr: number): void {\n if (!this.canvas || !this.device) {\n throw new ICEEngineError(\n 'ICE3_ENGINE_NOT_READY',\n 'Renderer is not initialized',\n );\n }\n this.viewport = { ...viewport };\n this.dpr = dpr;\n this.canvas.width = Math.max(1, Math.round(viewport.width * dpr));\n this.canvas.height = Math.max(1, Math.round(viewport.height * dpr));\n this.bundleCache.invalidate();\n this.frameBindGroup = null;\n this.depthTexture?.destroy();\n this.depthTexture = this.device.createTexture({\n label: 'ice3:depth',\n size: [this.canvas.width, this.canvas.height],\n format: 'depth24plus',\n usage: RENDER_ATTACHMENT_USAGE,\n });\n this.picker?.resize(this.canvas.width, this.canvas.height);\n }\n\n setBackgroundColor(color: string): void {\n this.backgroundRgba = colorToRgba(color);\n }\n\n prepareBatchGeometry(geometry: ICEGeometry): void {\n this.requireGeometryCache().pin(geometry);\n }\n\n prepareGeometry(\n geometry: ICEGeometry,\n update?: import('@ice3/core').ICEGeometryBufferUpdate,\n ): void {\n this.requireGeometryCache().pin(geometry, update);\n }\n\n releaseGeometry(geometry: ICEGeometry): void {\n this.geometryCache?.unpin(geometry);\n }\n\n releaseBatchGeometry(geometry: ICEGeometry): void {\n this.geometryCache?.unpin(geometry);\n }\n\n render(frame: ICEFrame): void {\n this.profiler.begin();\n this.lastFrameProfile = null;\n this.lastFrame = frame;\n const context = this.context;\n const cache = this.requireGeometryCache();\n const instanceCache = this.instanceCache;\n if (\n !context\n || !this.depthTexture\n || !this.identityInstances\n || !this.zeroSemantics\n || !instanceCache\n ) {\n throw new ICEEngineError(\n 'ICE3_ENGINE_NOT_READY',\n 'Renderer is not initialized',\n );\n }\n this.frameStats = {\n drawCalls: 0,\n renderedMeshes: 0,\n renderedBatches: 0,\n instancingFallbacks: 0,\n gpuUploads: 0,\n gpuEvictions: 0,\n gpuBytes: 0,\n };\n cache.beginFrame();\n instanceCache.beginFrame();\n this.storageCache?.beginFrame();\n const plan = this.renderPlan.get(frame.scene);\n const renderables = plan.renderables;\n const instances = plan.instances;\n const batches = plan.batches;\n this.profiler.mark('collect');\n const aspect = frame.viewport.width / Math.max(frame.viewport.height, 1);\n const viewProjection = frame.camera.getViewProjectionMatrix(aspect);\n const world = this.worldScratch;\n const mvp = this.mvpScratch;\n const drawList = this.drawListScratch;\n drawList.length = 0;\n this.lastVisibilityEntries.length = 0;\n this.drawStorage.begin(0);\n const instancedMeshIds = plan.instancedMeshIds;\n const selected = this.selected;\n selected.clear();\n for (const id of frame.selection) selected.add(id);\n const selectionMaskActive = this.selectionMaskBuffer !== null;\n const selectionMaskEnabled = selectionMaskActive\n && frame.selection.length > 0;\n let selectionEntryCount = 0;\n const selectionOverlays: string[] = [];\n const pushDraw = (\n draw: Omit<PendingDraw, 'selectionBase'>,\n matrix: Float32Array,\n selectionIds?: readonly string[],\n ): void => {\n const selectionBase = selectionMaskEnabled\n ? selectionEntryCount\n : 0;\n this.drawStorage.append({\n ...draw,\n matrix,\n selectionBase,\n useSelectionMask: Boolean(draw.useSelectionMask),\n pageBase: draw.storagePage?.firstInstance ?? 0,\n useIndirect: Boolean(draw.visibilityEntry),\n });\n drawList.push({\n ...draw,\n ...(selectionIds ? { selectionIds } : {}),\n selectionBase,\n });\n if (selectionMaskEnabled && selectionIds) {\n selectionEntryCount += selectionIds.length;\n }\n };\n const matrixFor = (source: ArrayLike<number>): Float32Array => {\n mvp.elements.set(viewProjection.elements);\n world.elements.set(source);\n mvp.multiply(world);\n return mvp.elements;\n };\n const pushEdgeDraws = (\n geometry: WebGPUGeometryEntry,\n instance: {\n readonly matrixBuffer: GPUBuffer;\n readonly semanticBuffer: GPUBuffer;\n readonly instanceCount: number;\n readonly storagePage?: ICEInstanceStoragePage;\n } | null,\n matrix: Float32Array,\n color: readonly [number, number, number, number],\n pipeline: GPURenderPipeline,\n selection?: {\n readonly selectionIds: readonly string[];\n readonly useSelectionMask: boolean;\n readonly useSemantic: boolean;\n readonly selectionScope: string;\n },\n ): void => {\n if (!geometry.edgeIndexBuffer || geometry.edgeCount === 0) return;\n if (selection) selectionOverlays.push(selection.selectionScope);\n const clipPixelX = 2 / Math.max(1, this.viewport.width * this.dpr);\n const clipPixelY = 2 / Math.max(1, this.viewport.height * this.dpr);\n for (const [offsetX, offsetY] of EDGE_PIXEL_OFFSETS) {\n pushDraw({\n geometry,\n instanceBuffer: instance?.matrixBuffer ?? this.identityInstances!,\n semanticBuffer: instance?.semanticBuffer ?? this.zeroSemantics!,\n instanceCount: instance?.instanceCount ?? 1,\n color,\n useVertexColor: false,\n useInstancing: instance !== null,\n pipeline,\n clipOffset: [offsetX * clipPixelX, offsetY * clipPixelY],\n edge: true,\n ...(selection ?? {}),\n ...(instance?.storagePage\n ? { storagePage: instance.storagePage }\n : {}),\n ...(instance?.storagePage\n && this.gpuDrivenActive\n && instance.storagePage.instanceCount\n >= WEBGPU_INSTANCE_VISIBILITY_THRESHOLD\n ? {\n visibilityEntry: this.visibilityEncoder!.retain(\n instance.storagePage,\n pipeline === this.gpuDrivenPipeline?.line\n || pipeline === this.gpuDrivenPipeline?.selectionLine\n ? geometry.edgeCount\n : geometry.triangleCount,\n ),\n }\n : {}),\n }, matrix, selection?.selectionIds);\n }\n };\n\n for (const batch of instances) {\n const geometry = cache.retain(batch.geometry);\n if (\n this.storageActive\n && this.storageCache\n && this.storagePipeline\n ) {\n const storage = this.storageCache.retain(batch, batch.geometry);\n for (const page of storage.pages) {\n const useVisibility = (\n this.gpuDrivenActive\n && page.instanceCount >= WEBGPU_INSTANCE_VISIBILITY_THRESHOLD\n );\n const pagePipeline = useVisibility\n ? this.gpuDrivenPipeline!\n : this.storagePipeline;\n const visibilityEntry = useVisibility\n ? this.visibilityEncoder!.retain(page, geometry.triangleCount)\n : undefined;\n if (visibilityEntry) {\n this.lastVisibilityEntries.push({\n entry: visibilityEntry,\n page,\n });\n }\n const instance = {\n matrixBuffer: this.identityInstances,\n semanticBuffer: geometry.semanticBuffer ?? this.zeroSemantics,\n instanceCount: page.instanceCount,\n storagePage: page,\n };\n pushDraw({\n geometry,\n instanceBuffer: instance.matrixBuffer,\n semanticBuffer: instance.semanticBuffer,\n instanceCount: instance.instanceCount,\n color: colorToRgba(batch.material.color),\n useVertexColor: Boolean(batch.geometry.colors),\n useInstancing: true,\n useLighting: batch.material.shading === 'directional'\n || batch.material.shading === 'water',\n pipeline: pagePipeline.triangle,\n useSelectionMask: selectionMaskEnabled,\n storagePage: page,\n ...(visibilityEntry ? { visibilityEntry } : {}),\n }, viewProjection.elements, batch.semanticIds);\n if (batch.material.edgeColor) {\n pushEdgeDraws(\n geometry,\n instance,\n viewProjection.elements,\n colorToRgba(batch.material.edgeColor),\n pagePipeline.line,\n );\n }\n if (\n selectionMaskEnabled\n && batch.material.edgeColor\n && batch.semanticIds.some((id) => selected.has(id))\n ) {\n pushEdgeDraws(\n geometry,\n instance,\n viewProjection.elements,\n SELECTION_RGBA,\n pagePipeline.selectionLine,\n {\n selectionIds: batch.semanticIds,\n useSelectionMask: true,\n useSemantic: true,\n selectionScope: batch.id,\n },\n );\n }\n }\n } else {\n const instance = instanceCache.retain(batch);\n pushDraw({\n geometry,\n instanceBuffer: instance.matrixBuffer,\n semanticBuffer: instance.semanticBuffer,\n instanceCount: instance.instanceCount,\n color: colorToRgba(batch.material.color),\n useVertexColor: Boolean(batch.geometry.colors),\n useInstancing: true,\n useLighting: batch.material.shading === 'directional'\n || batch.material.shading === 'water',\n pipeline: this.pipeline.triangle,\n useSelectionMask: selectionMaskEnabled,\n }, viewProjection.elements, batch.semanticIds);\n if (batch.material.edgeColor) {\n pushEdgeDraws(\n geometry,\n instance,\n viewProjection.elements,\n colorToRgba(batch.material.edgeColor),\n this.pipeline.line,\n );\n }\n if (\n selectionMaskEnabled\n && batch.material.edgeColor\n && batch.semanticIds.some((id) => selected.has(id))\n ) {\n pushEdgeDraws(\n geometry,\n instance,\n viewProjection.elements,\n SELECTION_RGBA,\n this.pipeline.selectionLine,\n {\n selectionIds: batch.semanticIds,\n useSelectionMask: true,\n useSemantic: true,\n selectionScope: batch.id,\n },\n );\n } else if (!selectionMaskEnabled) {\n for (\n let semanticIndex = 0;\n semanticIndex < batch.semanticIds.length;\n semanticIndex += 1\n ) {\n if (!selected.has(batch.semanticIds[semanticIndex]!)) continue;\n pushDraw({\n geometry,\n instanceBuffer: instance.matrixBuffer,\n semanticBuffer: instance.semanticBuffer,\n instanceCount: instance.instanceCount,\n color: [...SELECTION_RGBA] as [number, number, number, number],\n useVertexColor: false,\n useInstancing: true,\n pipeline: this.pipeline.selectionTriangle,\n semanticHighlight: semanticIndex,\n useSemantic: true,\n }, viewProjection.elements);\n }\n }\n }\n }\n\n for (const draw of batches) {\n const geometry = cache.retain(draw.batch.geometry);\n const matrix = matrixFor(draw.worldMatrix);\n pushDraw({\n geometry,\n instanceBuffer: this.identityInstances,\n semanticBuffer: geometry.semanticBuffer ?? this.zeroSemantics,\n instanceCount: 1,\n color: colorToRgba(draw.batch.material.color),\n useVertexColor: Boolean(draw.batch.geometry.colors),\n useInstancing: false,\n useLighting: draw.batch.material.shading === 'directional'\n || draw.batch.material.shading === 'water',\n pipeline: this.pipeline.triangle,\n useSelectionMask: selectionMaskEnabled,\n }, matrix, draw.batch.semanticSelectionIds);\n this.frameStats.renderedBatches += 1;\n if (draw.batch.material.edgeColor) {\n pushEdgeDraws(\n geometry,\n null,\n matrix,\n colorToRgba(draw.batch.material.edgeColor),\n this.pipeline.line,\n );\n }\n if (\n selectionMaskEnabled\n && draw.batch.material.edgeColor\n && draw.batch.semanticSelectionIds.some((id) => selected.has(id))\n ) {\n pushEdgeDraws(\n geometry,\n null,\n matrix,\n SELECTION_RGBA,\n this.pipeline.selectionLine,\n {\n selectionIds: draw.batch.semanticSelectionIds,\n useSelectionMask: true,\n useSemantic: true,\n selectionScope: draw.id,\n },\n );\n } else if (!selectionMaskEnabled) {\n for (\n let semanticIndex = 0;\n semanticIndex < draw.batch.semanticSelectionIds.length;\n semanticIndex += 1\n ) {\n if (!selected.has(draw.batch.semanticSelectionIds[semanticIndex]!)) {\n continue;\n }\n pushDraw({\n geometry,\n instanceBuffer: this.identityInstances,\n semanticBuffer: geometry.semanticBuffer ?? this.zeroSemantics,\n instanceCount: 1,\n color: [...SELECTION_RGBA] as [number, number, number, number],\n useVertexColor: false,\n useInstancing: false,\n pipeline: this.pipeline.selectionTriangle,\n semanticHighlight: semanticIndex,\n useSemantic: true,\n }, matrix);\n }\n }\n }\n\n for (const renderable of renderables) {\n if (instancedMeshIds.has(renderable.id)) continue;\n const geometry = cache.retain(renderable.mesh.geometry);\n const matrix = matrixFor(renderable.worldMatrix);\n pushDraw({\n geometry,\n instanceBuffer: this.identityInstances,\n semanticBuffer: this.zeroSemantics,\n instanceCount: 1,\n color: colorToRgba(renderable.mesh.material.color),\n useVertexColor: Boolean(renderable.mesh.geometry.colors),\n useInstancing: false,\n useLighting: renderable.mesh.material.shading === 'directional'\n || renderable.mesh.material.shading === 'water',\n pipeline: this.pipeline.triangle,\n useSelectionMask: selectionMaskEnabled,\n }, matrix, [renderable.mesh.selectionId]);\n this.frameStats.renderedMeshes += 1;\n if (renderable.mesh.material.edgeColor) {\n pushEdgeDraws(\n geometry,\n null,\n matrix,\n colorToRgba(renderable.mesh.material.edgeColor),\n this.pipeline.line,\n );\n }\n if (selected.has(renderable.mesh.selectionId)) {\n if (!selectionMaskEnabled) {\n pushDraw({\n geometry,\n instanceBuffer: this.identityInstances,\n semanticBuffer: this.zeroSemantics,\n instanceCount: 1,\n color: [...SELECTION_TINT_RGBA] as [\n number,\n number,\n number,\n number,\n ],\n useVertexColor: false,\n useInstancing: false,\n pipeline: this.pipeline.selectionTriangle,\n }, matrix);\n }\n pushEdgeDraws(\n geometry,\n null,\n matrix,\n SELECTION_RGBA,\n this.pipeline.selectionLine,\n selectionMaskEnabled\n ? {\n selectionIds: [renderable.mesh.selectionId],\n useSelectionMask: true,\n useSemantic: true,\n selectionScope: renderable.id,\n }\n : undefined,\n );\n }\n }\n\n const selectionLayout = selectionMaskEnabled\n ? buildSelectionMask(\n drawList.map((draw) => draw.selectionIds ?? []),\n frame.selection,\n )\n : { words: EMPTY_SELECTION, bases: [] };\n this.selectionMaskBuffer?.update(selectionLayout.words);\n this.ensureUniformCapacity(this.drawStorage.drawCount);\n const uniforms = this.drawStorage.uniformData.subarray(\n 0,\n this.drawStorage.drawCount * 64,\n );\n if (uniforms.length > 0) {\n this.device.queue.writeBuffer(\n this.uniformBuffer!,\n 0,\n uniforms as unknown as BufferSource,\n );\n }\n this.profiler.mark('prepareAndUpload');\n const bindGroupKey = [\n this.uniformBufferGeneration,\n this.selectionMaskBuffer?.generation ?? 0,\n this.pipeline.selectionMask ? 1 : 0,\n ].join(':');\n if (!this.frameBindGroup || this.frameBindGroupKey !== bindGroupKey) {\n const bindGroupEntries: GPUBindGroupEntry[] = [{\n binding: 0,\n resource: {\n buffer: this.uniformBuffer!,\n offset: 0,\n size: WEBGPU_UNIFORM_BYTES,\n },\n }];\n if (selectionMaskActive && this.selectionMaskBuffer?.buffer) {\n bindGroupEntries.push({\n binding: 1,\n resource: {\n buffer: this.selectionMaskBuffer.buffer,\n offset: 0,\n size: this.selectionMaskBuffer.buffer.size,\n },\n });\n }\n this.frameBindGroup = this.device.createBindGroup({\n label: 'ice3:frame-uniforms',\n layout: this.pipeline.bindGroupLayout,\n entries: bindGroupEntries,\n });\n this.frameBindGroupKey = bindGroupKey;\n }\n const bindGroup = this.frameBindGroup!;\n const encodeDraws = (\n encoder: GPURenderPassEncoder | GPURenderBundleEncoder,\n ): void => {\n for (let index = 0; index < drawList.length; index += 1) {\n const draw = drawList[index]!;\n encoder.setPipeline(draw.pipeline);\n const drawBindGroup = draw.storagePage\n ? this.storageBindGroupFor(\n draw.storagePage,\n draw.visibilityEntry?.visibleBuffer,\n )\n : bindGroup;\n encoder.setBindGroup(0, drawBindGroup, [\n index * WEBGPU_UNIFORM_STRIDE,\n ]);\n encoder.setVertexBuffer(0, draw.geometry.vertexBuffer);\n if (draw.storagePage) {\n encoder.setVertexBuffer(1, draw.semanticBuffer);\n } else {\n encoder.setVertexBuffer(1, draw.instanceBuffer);\n encoder.setVertexBuffer(2, draw.semanticBuffer);\n }\n encoder.setIndexBuffer(\n draw.edge\n ? draw.geometry.edgeIndexBuffer!\n : draw.geometry.triangleIndexBuffer,\n draw.geometry.indexFormat,\n );\n if (draw.visibilityEntry) {\n encoder.drawIndexedIndirect(\n draw.visibilityEntry.indirectBuffer,\n 0,\n );\n } else {\n encoder.drawIndexed(\n draw.edge ? draw.geometry.edgeCount : draw.geometry.triangleCount,\n draw.instanceCount,\n 0,\n 0,\n draw.storagePage?.firstInstance ?? 0,\n );\n }\n }\n };\n const bundleKey = [\n plan.revision,\n this.drawStorage.generation,\n cache.generation,\n instanceCache.generation,\n this.storageCache?.generation ?? 0,\n this.selectionMaskBuffer?.generation ?? 0,\n this.uniformBufferGeneration,\n this.format,\n selectionOverlays.join('|'),\n ].join(':');\n let bundle: GPURenderBundle | null = null;\n if (this.bundleActive && drawList.length > 0) {\n try {\n bundle = this.bundleCache.get(bundleKey, encodeDraws);\n } catch {\n this.bundleActive = false;\n this.bundleCache.invalidate();\n this.reportOptimizationFailure('bundle', 'resource-failed');\n }\n }\n const targetTexture = context.getCurrentTexture();\n const encoder = this.device.createCommandEncoder();\n if (this.gpuDrivenActive) {\n const encodedVisibility = new Set<ICEVisibilityEntry>();\n for (let index = 0; index < drawList.length; index += 1) {\n const draw = drawList[index]!;\n if (\n !draw.visibilityEntry\n || !draw.storagePage\n || encodedVisibility.has(draw.visibilityEntry)\n ) {\n continue;\n }\n encodedVisibility.add(draw.visibilityEntry);\n this.visibilityEncoder!.encode(\n encoder,\n draw.visibilityEntry,\n draw.storagePage,\n this.uniformBuffer!,\n index * WEBGPU_UNIFORM_STRIDE,\n );\n }\n }\n const timestampProfiler = this.captureRequest || !this.timestampProfilingEnabled\n ? null\n : this.timestampProfiler;\n const timestampQuerySet = timestampProfiler?.querySetFor(frame.frameId);\n const pass = encoder.beginRenderPass({\n colorAttachments: [{\n view: targetTexture.createView(),\n clearValue: {\n r: this.backgroundRgba[0],\n g: this.backgroundRgba[1],\n b: this.backgroundRgba[2],\n a: this.backgroundRgba[3],\n },\n loadOp: 'clear',\n storeOp: 'store',\n }],\n depthStencilAttachment: {\n view: this.depthTexture.createView(),\n depthClearValue: 1,\n depthLoadOp: 'clear',\n depthStoreOp: 'store',\n },\n ...(timestampQuerySet\n ? {\n timestampWrites: {\n querySet: timestampQuerySet,\n beginningOfPassWriteIndex: 0,\n endOfPassWriteIndex: 1,\n },\n }\n : {}),\n });\n if (bundle) {\n try {\n pass.executeBundles([bundle]);\n } catch {\n this.bundleActive = false;\n this.bundleCache.invalidate();\n this.reportOptimizationFailure('bundle', 'runtime-failed');\n encodeDraws(pass);\n }\n } else {\n encodeDraws(pass);\n }\n this.frameStats.drawCalls += drawList.length;\n pass.end();\n if (timestampProfiler) {\n timestampProfiler.resolveFrame(encoder, frame.frameId);\n }\n if (this.captureRequest) {\n encoder.copyTextureToBuffer(\n { texture: targetTexture },\n {\n buffer: this.captureRequest.buffer,\n bytesPerRow: this.captureRequest.bytesPerRow,\n rowsPerImage: this.canvas!.height,\n },\n {\n width: this.canvas!.width,\n height: this.canvas!.height,\n depthOrArrayLayers: 1,\n },\n );\n this.captureRequest = null;\n }\n const commandBuffer = encoder.finish();\n this.profiler.mark('encode');\n this.device.queue.submit([commandBuffer]);\n this.profiler.mark('submit');\n cache.endFrame();\n instanceCache.endFrame();\n this.storageCache?.endFrame();\n this.frameStats.gpuUploads = cache.uploadCount;\n this.frameStats.gpuEvictions = cache.evictionCount;\n this.frameStats.gpuBytes = cache.totalBytes\n + instanceCache.totalBytes\n + (this.storageCache?.totalBytes ?? 0);\n this.lastFrameProfile = this.profiler.end();\n }\n\n enableProfiling(enabled: boolean): void {\n this.profiler.enable(enabled);\n this.lastFrameProfile = null;\n }\n\n get frameProfile(): ICEFrameStageProfile | null {\n return this.lastFrameProfile;\n }\n\n async pick(\n frame: ICEFrame,\n point: ICEScreenPoint,\n ): Promise<string | undefined> {\n if (!this.picker) {\n throw new ICEEngineError(\n 'ICE3_WEBGPU_PICK_UNAVAILABLE',\n 'ICE3_WEBGPU_PICK_UNAVAILABLE: picker is not initialized',\n );\n }\n try {\n return await this.picker.pick(\n { ...frame, point },\n this.requireGeometryCache(),\n collectWebGPUPickIds(frame),\n );\n } catch (error) {\n if (\n error instanceof ICEEngineError\n && error.code === 'ICE3_WEBGPU_PICK_UNAVAILABLE'\n ) {\n throw error;\n }\n throw new ICEEngineError(\n 'ICE3_WEBGPU_PICK_UNAVAILABLE',\n 'ICE3_WEBGPU_PICK_UNAVAILABLE: exact pick failed',\n { cause: error },\n );\n }\n }\n\n dispose(): void {\n this.disposing = true;\n this.bundleCache.dispose();\n this.geometryCache?.dispose();\n this.renderPlan.dispose();\n this.picker?.dispose();\n this.selectionMaskBuffer?.dispose();\n this.storageCache?.dispose();\n this.visibilityEncoder?.dispose();\n this.timestampProfiler?.dispose();\n this.instanceCache?.dispose();\n this.identityInstances?.destroy();\n this.zeroSemantics?.destroy();\n this.uniformBuffer?.destroy();\n this.depthTexture?.destroy();\n this.context?.unconfigure();\n this.geometryCache = null;\n this.picker = null;\n this.selectionMaskBuffer = null;\n this.storageCache = null;\n this.visibilityEncoder = null;\n this.gpuDrivenPipeline = null;\n this.timestampProfiler = null;\n this.instanceCache = null;\n this.identityInstances = null;\n this.zeroSemantics = null;\n this.uniformBuffer = null;\n this.depthTexture = null;\n this.context = null;\n this.canvas = null;\n this.frameBindGroup = null;\n this.device.destroy();\n this.releaseProbe?.();\n this.onContextLost = undefined;\n this.onContextRestored = undefined;\n this.onError = undefined;\n }\n\n async capture(): Promise<Blob> {\n if (!this.context || !this.canvas || !this.lastFrame) {\n throw new ICEEngineError(\n 'ICE3_ENGINE_NOT_READY',\n 'Renderer has no frame to capture',\n );\n }\n const width = this.canvas.width;\n const height = this.canvas.height;\n const bytesPerRow = Math.ceil(width * 4 / 256) * 256;\n const readback = this.device.createBuffer({\n label: 'ice3:capture-readback',\n size: bytesPerRow * height,\n usage: 1 | 8,\n });\n this.captureRequest = { buffer: readback, bytesPerRow };\n try {\n this.render(this.lastFrame);\n } catch (error) {\n this.captureRequest = null;\n readback.destroy();\n throw error;\n }\n let bytes: Uint8Array;\n try {\n await readback.mapAsync(1);\n bytes = new Uint8Array(readback.getMappedRange()).slice();\n } finally {\n readback.unmap();\n readback.destroy();\n }\n for (let offset = 0; offset < bytes.length; offset += 4) {\n if (this.format === 'bgra8unorm' || this.format === 'bgra8unorm-srgb') {\n [bytes[offset], bytes[offset + 2]] = [\n bytes[offset + 2]!,\n bytes[offset]!,\n ];\n }\n }\n const imageBytes = new Uint8Array(width * height * 4);\n const rowBytes = width * 4;\n for (let row = 0; row < height; row += 1) {\n imageBytes.set(\n bytes.subarray(row * bytesPerRow, row * bytesPerRow + rowBytes),\n row * rowBytes,\n );\n }\n return pixelsToPng(imageBytes, width, height);\n }\n\n async finish(): Promise<void> {\n await this.device.queue.onSubmittedWorkDone?.();\n }\n\n async drainGpuTimings(): Promise<readonly number[]> {\n return this.timestampProfiler?.drain() ?? [];\n }\n\n enableTimestampProfiling(enabled: boolean): void {\n this.timestampProfilingEnabled = enabled && this.timestampProfiler !== null;\n }\n\n get timestampProfilingAvailable(): boolean {\n return this.timestampProfiler !== null;\n }\n\n get timestampProfilingUnavailableReason(): string | undefined {\n return this.timestampProfiler\n ? this.timestampProfiler.unavailableReason\n : 'timestamp-query unavailable';\n }\n\n get stats(): Readonly<typeof this.frameStats> {\n return this.frameStats;\n }\n\n async readVisibilityStats(): Promise<Readonly<{\n visibleInstances: number;\n culledInstances: number;\n dispatchCount: number;\n }> | undefined> {\n if (!this.visibilityEncoder) {\n return undefined;\n }\n let visibleInstances = 0;\n let culledInstances = 0;\n let dispatchCount = 0;\n const seen = new Set<ICEVisibilityEntry>();\n for (const item of this.lastVisibilityEntries) {\n if (seen.has(item.entry)) continue;\n seen.add(item.entry);\n const result = await this.visibilityEncoder.readStats(\n item.entry,\n item.page,\n );\n visibleInstances += result.visibleInstances;\n culledInstances += result.culledInstances;\n dispatchCount += result.dispatchCount;\n }\n return { visibleInstances, culledInstances, dispatchCount };\n }\n\n get storageActive(): boolean {\n return (\n (this.forceStoragePath || this.forceGpuDriven)\n && this.storagePipeline !== null\n && this.storageCache !== null\n );\n }\n\n private get gpuDrivenActive(): boolean {\n return (\n this.forceGpuDriven\n && this.gpuDrivenPipeline !== null\n && this.visibilityEncoder !== null\n && this.storageCache !== null\n );\n }\n\n get optimizationStats(): ICEWebGPUOptimizationStats {\n return {\n tier: this.gpuDrivenActive\n ? 'gpu-driven'\n : this.storageActive\n ? 'storage'\n : 'baseline',\n selectionMaskActive: this.selectionMaskBuffer !== null,\n bundleActive: this.bundleActive,\n storageActive: this.storageActive,\n visibilityActive: this.gpuDrivenActive,\n instanceUploadBytes: this.storageCache?.totalUploadBytes ?? 0,\n bundleRecreations: this.bundleCache.bundleRecreations,\n ...(this.timestampProfilingUnavailableReason\n ? {\n timestampUnavailableReason:\n this.timestampProfilingUnavailableReason,\n }\n : {}),\n };\n }\n\n private storageBindGroupFor(\n page: ICEInstanceStoragePage,\n visibleBuffer?: GPUBuffer,\n ): GPUBindGroup {\n const key = [\n this.uniformBufferGeneration,\n this.selectionMaskBuffer?.generation ?? 0,\n ].join(':');\n const cached = this.storageBindGroups.get(page.buffer);\n if (\n cached?.key === key\n && cached.visibleBuffer === visibleBuffer\n ) {\n return cached.group;\n }\n const entries: GPUBindGroupEntry[] = [{\n binding: 0,\n resource: {\n buffer: this.uniformBuffer!,\n offset: 0,\n size: WEBGPU_UNIFORM_BYTES,\n },\n }];\n if (this.selectionMaskBuffer?.buffer) {\n entries.push({\n binding: 1,\n resource: {\n buffer: this.selectionMaskBuffer.buffer,\n offset: 0,\n size: this.selectionMaskBuffer.buffer.size,\n },\n });\n }\n entries.push({\n binding: 2,\n resource: {\n buffer: page.buffer,\n offset: 0,\n size: page.buffer.size,\n },\n });\n if (visibleBuffer) {\n entries.push({\n binding: 3,\n resource: {\n buffer: visibleBuffer,\n offset: 0,\n size: visibleBuffer.size,\n },\n });\n }\n const group = this.device.createBindGroup({\n label: 'ice3:storage-instance-pipeline',\n layout: visibleBuffer\n ? this.gpuDrivenPipeline!.bindGroupLayout\n : this.storagePipeline!.bindGroupLayout,\n entries,\n });\n this.storageBindGroups.set(page.buffer, {\n key,\n ...(visibleBuffer ? { visibleBuffer } : {}),\n group,\n });\n return group;\n }\n\n private reportOptimizationFailure(\n layer: string,\n reason: string,\n ): void {\n const key = `${layer}/${reason}`;\n if (this.optimizationWarnings.has(key)) return;\n this.optimizationWarnings.add(key);\n this.onError?.(new ICEEngineError(\n 'ICE3_RENDERER_OPTIMIZATION_UNAVAILABLE',\n `ICE3_RENDERER_OPTIMIZATION_UNAVAILABLE: ${key}`,\n { layer, reason },\n ));\n }\n\n private requireGeometryCache(): WebGPUGeometryCache {\n if (!this.geometryCache) {\n throw new ICEEngineError(\n 'ICE3_ENGINE_NOT_READY',\n 'Renderer is not initialized',\n );\n }\n return this.geometryCache;\n }\n\n private ensureUniformCapacity(draws: number): void {\n if (draws <= this.uniformCapacity && this.uniformBuffer) return;\n let capacity = Math.max(UNIFORM_BUFFER_INITIAL_DRAWS, drawCountPowerOfTwo(draws));\n this.uniformBuffer?.destroy();\n this.uniformBuffer = this.device.createBuffer({\n label: 'ice3:frame-uniforms',\n size: capacity * WEBGPU_UNIFORM_STRIDE,\n usage: UNIFORM_USAGE,\n });\n this.uniformCapacity = capacity;\n this.uniformBufferGeneration += 1;\n this.frameBindGroup = null;\n this.bundleCache.invalidate();\n }\n\n private watchDevice(device: GPUDevice): void {\n void device.lost.then((info) => {\n if (\n this.disposing\n || device !== this.device\n || info.reason === 'destroyed'\n ) {\n return;\n }\n void this.recoverDevice();\n });\n }\n\n private async recoverDevice(): Promise<void> {\n this.releaseProbe?.();\n this.onContextLost?.();\n this.geometryCache?.dispose();\n this.bundleCache.dispose();\n this.instanceCache?.dispose();\n this.picker?.dispose();\n this.selectionMaskBuffer?.dispose();\n this.storageCache?.dispose();\n this.timestampProfiler?.dispose();\n this.identityInstances?.destroy();\n this.zeroSemantics?.destroy();\n this.uniformBuffer?.destroy();\n this.depthTexture?.destroy();\n this.geometryCache = null;\n this.instanceCache = null;\n this.selectionMaskBuffer = null;\n this.storageCache = null;\n this.picker = null;\n this.timestampProfiler = null;\n this.identityInstances = null;\n this.zeroSemantics = null;\n this.uniformBuffer = null;\n this.depthTexture = null;\n this.uniformCapacity = 0;\n this.frameBindGroup = null;\n this.bundleActive = true;\n this.optimizationWarnings.clear();\n this.storagePipeline = null;\n this.storageBindGroups.clear();\n this.renderPlan.invalidate();\n try {\n const features: GPUFeatureName[] = this.device.features.has(\n 'timestamp-query',\n )\n ? ['timestamp-query']\n : [];\n const device = await this.adapter.requestDevice({\n ...(features.length > 0 ? { requiredFeatures: features } : {}),\n });\n let selectionMaskBuffer: WebGPUSelectionMaskBuffer | null = null;\n let pipeline: WebGPURenderPipeline;\n try {\n selectionMaskBuffer = new WebGPUSelectionMaskBuffer(device);\n selectionMaskBuffer.update(new Uint32Array([0]));\n pipeline = await WebGPURenderPipeline.create(\n device,\n this.format,\n { selectionMask: true },\n );\n } catch {\n selectionMaskBuffer?.dispose();\n selectionMaskBuffer = null;\n pipeline = await WebGPURenderPipeline.create(device, this.format);\n }\n if (this.disposing) {\n selectionMaskBuffer?.dispose();\n device.destroy();\n return;\n }\n this.device = device;\n this.pipeline = pipeline;\n this.selectionMaskBuffer = selectionMaskBuffer;\n this.bundleCache = new WebGPUBundleCache(device, this.format);\n this.watchDevice(device);\n if (this.canvas) {\n this.initialize({\n canvas: this.canvas,\n ...(this.onContextLost\n ? { onContextLost: this.onContextLost }\n : {}),\n ...(this.onContextRestored\n ? { onContextRestored: this.onContextRestored }\n : {}),\n });\n this.resize(this.viewport, this.dpr);\n }\n this.onContextRestored?.();\n } catch (error) {\n if (this.disposing) return;\n this.onError?.(new ICEEngineError(\n 'ICE3_WEBGPU_DEVICE_LOST',\n `ICE3_WEBGPU_DEVICE_LOST: ${\n error instanceof Error ? error.message : String(error)\n }`,\n { cause: error },\n ));\n }\n }\n}\n\nfunction drawCountPowerOfTwo(value: number): number {\n let result = 1;\n while (result < Math.max(1, value)) result *= 2;\n return result;\n}\n\nasync function pixelsToPng(\n bytes: Uint8Array,\n width: number,\n height: number,\n): Promise<Blob> {\n const pixels = new Uint8ClampedArray(\n bytes.buffer,\n bytes.byteOffset,\n width * height * 4,\n ).slice();\n if (typeof OffscreenCanvas !== 'undefined') {\n const canvas = new OffscreenCanvas(width, height);\n const context = canvas.getContext('2d');\n if (!context) throw new Error('ICE3_GPU_RESOURCE_FAILED: 2D context');\n const image = typeof ImageData === 'undefined'\n ? { data: pixels, width, height } as ImageData\n : new ImageData(pixels, width, height);\n context.putImageData(\n image,\n 0,\n 0,\n );\n return canvas.convertToBlob({ type: 'image/png' });\n }\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n const context = canvas.getContext('2d');\n if (!context) throw new Error('ICE3_GPU_RESOURCE_FAILED: 2D context');\n const image = typeof ImageData === 'undefined'\n ? { data: pixels, width, height } as ImageData\n : new ImageData(pixels, width, height);\n context.putImageData(\n image,\n 0,\n 0,\n );\n return new Promise<Blob>((resolve, reject) => {\n canvas.toBlob((blob) => {\n if (blob) resolve(blob);\n else reject(new Error('ICE3_GPU_RESOURCE_FAILED: PNG encoding failed'));\n }, 'image/png');\n });\n}\n\ntype PendingDraw = {\n readonly pipeline: GPURenderPipeline;\n readonly geometry: WebGPUGeometryEntry;\n readonly instanceBuffer: GPUBuffer;\n readonly semanticBuffer: GPUBuffer;\n readonly instanceCount: number;\n readonly selectionBase: number;\n readonly color: readonly [number, number, number, number];\n readonly useVertexColor: boolean;\n readonly useInstancing: boolean;\n readonly useLighting?: boolean;\n readonly semanticHighlight?: number;\n readonly useSemantic?: boolean;\n readonly selectionIds?: readonly string[];\n readonly useSelectionMask?: boolean;\n readonly storagePage?: ICEInstanceStoragePage;\n readonly visibilityEntry?: ICEVisibilityEntry;\n readonly clipOffset?: readonly [number, number];\n readonly edge?: boolean;\n};\n", "import { ICEEngineError } from '@ice3/core';\nimport { probeWebGPU } from './WebGPUProbe.js';\nimport { WebGPURendererBackend } from './WebGPURendererBackend.js';\nimport { WebGL2RendererBackend } from './WebGL2RendererBackend.js';\nimport type {\n ICE3RendererPreference,\n ICE3RendererSelection,\n ICERendererBackend,\n} from './types.js';\n\nexport type ICERendererFactories = Readonly<{\n createWebGPU: () => Promise<ICERendererBackend>;\n createWebGL2: () => ICERendererBackend;\n}>;\n\nexport type ICERendererBackendSelection = Readonly<{\n backend: ICERendererBackend;\n selection: ICE3RendererSelection;\n}>;\n\nexport async function selectRendererBackend(\n preference: ICE3RendererPreference,\n factories: ICERendererFactories,\n): Promise<ICERendererBackendSelection> {\n const startedAt = performance.now();\n if (preference === 'auto' || preference === 'webgl2') {\n const backend = factories.createWebGL2();\n return {\n backend,\n selection: {\n requested: preference,\n selected: backend.capabilities.backend,\n fallback: false,\n experimental: false,\n probeDurationMs: performance.now() - startedAt,\n },\n };\n }\n\n try {\n const backend = await factories.createWebGPU();\n return {\n backend,\n selection: {\n requested: preference,\n selected: backend.capabilities.backend,\n fallback: false,\n experimental: true,\n probeDurationMs: performance.now() - startedAt,\n },\n };\n } catch (error) {\n if (preference === 'webgpu') {\n if (\n error instanceof ICEEngineError\n && error.code === 'ICE3_WEBGPU_UNAVAILABLE'\n ) {\n throw error;\n }\n throw new ICEEngineError(\n 'ICE3_WEBGPU_UNAVAILABLE',\n `ICE3_WEBGPU_UNAVAILABLE: ${\n error instanceof Error ? error.message : String(error)\n }`,\n { reason: failureReason(error) },\n );\n }\n const backend = factories.createWebGL2();\n const reason = failureReason(error);\n return {\n backend,\n selection: {\n requested: preference,\n selected: backend.capabilities.backend,\n fallback: true,\n experimental: false,\n probeDurationMs: performance.now() - startedAt,\n ...(reason ? { fallbackReason: reason } : {}),\n },\n };\n }\n}\n\nexport async function selectDefaultRendererBackend(\n preference: ICE3RendererPreference,\n): Promise<ICERendererBackendSelection> {\n return selectRendererBackend(preference, {\n createWebGPU: createDefaultWebGPU,\n createWebGL2: () => new WebGL2RendererBackend(),\n });\n}\n\nasync function createDefaultWebGPU(): Promise<ICERendererBackend> {\n const result = await probeWebGPU();\n if (!result.supported) {\n throw new ICEEngineError(\n 'ICE3_WEBGPU_UNAVAILABLE',\n `ICE3_WEBGPU_UNAVAILABLE: ${result.reason}${\n result.detail ? `: ${result.detail}` : ''\n }`,\n { reason: result.reason },\n );\n }\n try {\n return await WebGPURendererBackend.create(result);\n } catch (error) {\n result.device.destroy();\n result.release();\n throw new ICEEngineError(\n 'ICE3_WEBGPU_UNAVAILABLE',\n `ICE3_WEBGPU_UNAVAILABLE: ${\n error instanceof Error ? error.message : String(error)\n }`,\n { reason: 'pipeline-failed' },\n );\n }\n}\n\nfunction failureReason(\n error: unknown,\n): ICE3RendererSelection['fallbackReason'] {\n const details = (\n error as { readonly details?: Readonly<Record<string, unknown>> }\n )?.details;\n const reason = details?.reason;\n return typeof reason === 'string'\n ? reason as ICE3RendererSelection['fallbackReason']\n : undefined;\n}\n", "import type { ICEGeometryBounds } from '@ice3/core';\n\nexport interface ICEBatchUploadBuffer {\n readonly id: string;\n readonly materialKey: string;\n readonly positions: Float32Array;\n readonly indices: Uint32Array;\n readonly semanticIndices: Uint32Array;\n readonly semanticIds: readonly string[];\n readonly semanticNodeIds: readonly string[];\n readonly semanticSelectionIds: readonly string[];\n readonly bounds: ICEGeometryBounds;\n readonly triangleCount: number;\n readonly byteLength: number;\n}\n\nexport interface ICEBatchUploadOptions {\n readonly generation: number;\n readonly bytesPerFrame: number;\n readonly onUploaded: (generation: number) => void;\n readonly onFailed: (generation: number, error: unknown) => void;\n readonly upload?: (buffer: ICEBatchUploadBuffer) => unknown;\n readonly release?: (resource: unknown) => void;\n readonly onActivate?: (\n generation: number,\n resources: readonly unknown[],\n ) => void;\n readonly schedule?: (callback: FrameRequestCallback) => number;\n readonly cancelSchedule?: (id: number) => void;\n readonly isCurrent?: () => boolean;\n}\n\nexport interface ICEBatchGenerationHandle {\n cancel(): void;\n}\n\nexport function queueBatchGeneration(\n buffers: readonly ICEBatchUploadBuffer[],\n options: ICEBatchUploadOptions,\n): ICEBatchGenerationHandle {\n if (\n !Number.isInteger(options.generation)\n || options.generation < 0\n || !Number.isInteger(options.bytesPerFrame)\n || options.bytesPerFrame < 1\n || buffers.some((buffer) => (\n !Number.isInteger(buffer.byteLength)\n || buffer.byteLength < 1\n || buffer.byteLength > options.bytesPerFrame\n ))\n ) {\n fail(options, new Error(\n 'ICE3_RENDER_BATCH_UPLOAD_INVALID: upload options are invalid',\n ));\n return { cancel: () => undefined };\n }\n const schedule = options.schedule ?? globalThis.requestAnimationFrame;\n const cancelSchedule =\n options.cancelSchedule ?? globalThis.cancelAnimationFrame;\n const upload = options.upload ?? ((buffer) => buffer);\n const release = options.release ?? (() => undefined);\n const resources: unknown[] = [];\n let next = 0;\n let frame: number | undefined;\n let settled = false;\n\n const cleanup = (): void => {\n if (frame !== undefined) {\n cancelSchedule(frame);\n frame = undefined;\n }\n for (const resource of resources.splice(0)) release(resource);\n };\n const current = (): boolean => options.isCurrent?.() ?? true;\n const failNow = (error: unknown): void => {\n if (settled) return;\n settled = true;\n cleanup();\n options.onFailed(options.generation, error);\n };\n const pump = (): void => {\n frame = undefined;\n if (settled) return;\n if (!current()) {\n settled = true;\n cleanup();\n return;\n }\n let bytes = 0;\n try {\n while (next < buffers.length) {\n const buffer = buffers[next]!;\n if (resources.length > 0 && bytes + buffer.byteLength > options.bytesPerFrame) {\n break;\n }\n bytes += buffer.byteLength;\n next += 1;\n resources.push(upload(buffer));\n }\n } catch (error) {\n failNow(error);\n return;\n }\n if (next >= buffers.length) {\n if (!current()) {\n settled = true;\n cleanup();\n return;\n }\n try {\n options.onActivate?.(options.generation, resources);\n } catch (error) {\n failNow(error);\n return;\n }\n settled = true;\n options.onUploaded(options.generation);\n return;\n }\n frame = schedule(pump);\n };\n frame = schedule(pump);\n return {\n cancel: () => {\n if (settled) return;\n settled = true;\n cleanup();\n },\n };\n}\n\nfunction fail(options: ICEBatchUploadOptions, error: unknown): void {\n options.onFailed(options.generation, error);\n}\n", "import { ICEEventDispatcher } from '@ice3/core';\nimport type { ICEViewport } from '@ice3/renderer';\nimport { ICELabel } from './ICELabel.js';\n\nexport interface ICE2DLayerOptions {\n readonly id: string;\n readonly order?: number;\n readonly visible?: boolean;\n readonly interactive?: boolean;\n readonly passThrough?: boolean;\n}\n\nexport class ICE2DLayer extends ICEEventDispatcher {\n readonly id: string;\n readonly order: number;\n visible: boolean;\n interactive: boolean;\n passThrough: boolean;\n protected readonly labels: ICELabel[] = [];\n\n constructor(options: ICE2DLayerOptions) {\n super();\n this.id = options.id;\n this.order = options.order ?? 0;\n this.visible = options.visible ?? true;\n this.interactive = options.interactive ?? true;\n this.passThrough = options.passThrough ?? true;\n }\n\n addChild(child: ICELabel): this {\n if (this.labels.some((label) => label.id === child.id)) {\n throw new Error(`Duplicate ICE label ID: ${child.id}`);\n }\n this.labels.push(child);\n return this;\n }\n\n removeChild(child: ICELabel): this {\n const index = this.labels.indexOf(child);\n if (index >= 0) {\n this.labels.splice(index, 1);\n }\n return this;\n }\n\n hitTest(point: { readonly x: number; readonly y: number }): ICELabel | undefined {\n if (!this.visible || !this.interactive) {\n return undefined;\n }\n for (let index = this.labels.length - 1; index >= 0; index -= 1) {\n const label = this.labels[index]!;\n if (label.interactive && label.containsPoint(point)) {\n return label;\n }\n }\n return undefined;\n }\n\n getLabels(): readonly ICELabel[] {\n return this.labels;\n }\n\n paint(context: CanvasRenderingContext2D, _viewport: ICEViewport): void {\n if (!this.visible) {\n return;\n }\n context.save();\n context.font = '14px sans-serif';\n context.textBaseline = 'top';\n for (const label of this.labels) {\n if (!label.visible) {\n continue;\n }\n const rect = label.measure(context);\n context.fillStyle = label.background;\n context.fillRect(rect.x, rect.y, rect.width, rect.height);\n context.fillStyle = label.color;\n context.fillText(label.text, rect.x + label.padding, rect.y + label.padding);\n }\n context.restore();\n }\n\n dispose(): void {\n this.labels.length = 0;\n this.removeAllListeners();\n }\n}\n", "import type { ICE2DLayer } from './ICE2DLayer.js';\nimport type { ICELabel } from './ICELabel.js';\n\nexport type ICELayerHit = {\n readonly layer: ICE2DLayer;\n readonly label: ICELabel;\n};\n\nexport class ICE2DLayerRouter {\n constructor(private readonly getLayers: () => readonly ICE2DLayer[]) {}\n\n hitTest(point: { readonly x: number; readonly y: number }): ICELayerHit | undefined {\n const layers = this.topDown();\n for (const layer of layers) {\n const label = layer.hitTest(point);\n if (label) {\n return { layer, label };\n }\n }\n return undefined;\n }\n\n shouldPassThrough(point: { readonly x: number; readonly y: number }): boolean {\n for (const layer of this.topDown()) {\n if (!layer.visible) {\n continue;\n }\n if (layer.hitTest(point)) {\n return false;\n }\n if (!layer.passThrough) {\n return false;\n }\n }\n return true;\n }\n\n private topDown(): readonly ICE2DLayer[] {\n return this.getLayers()\n .map((layer, index) => ({ layer, index }))\n .sort((left, right) =>\n right.layer.order - left.layer.order || right.index - left.index,\n )\n .map((entry) => entry.layer);\n }\n}\n", "import { ICEScene } from '@ice3/core';\nimport type { ICEProjectedPoint } from '../ICEProjection.js';\nimport { ICE2DLayer, type ICE2DLayerOptions } from './ICE2DLayer.js';\n\nexport type ICEAnchorProjector = (anchorId: string) => ICEProjectedPoint | undefined;\n\nexport class ICEWorldLayer extends ICE2DLayer {\n constructor(options: ICE2DLayerOptions) {\n super(options);\n }\n\n prepare(_scene: ICEScene, project: ICEAnchorProjector): void {\n for (const label of this.labels) {\n if (!label.anchorId) {\n label.visible = false;\n continue;\n }\n const anchor = project(label.anchorId);\n if (!anchor) {\n label.visible = false;\n continue;\n }\n label.setWorldAnchor([anchor.x, anchor.y], anchor.visible);\n }\n }\n}\n", "import { ICE2DLayer, type ICE2DLayerOptions } from './ICE2DLayer.js';\n\nexport class ICEScreenLayer extends ICE2DLayer {\n constructor(options: ICE2DLayerOptions) {\n super(options);\n }\n}\n", "import { ICEEventDispatcher } from '@ice3/core';\n\nexport interface ICELabelOptions {\n readonly id: string;\n readonly text: string;\n readonly anchorId?: string;\n readonly screenPosition?: readonly [number, number];\n readonly color?: string;\n readonly background?: string;\n readonly padding?: number;\n readonly interactive?: boolean;\n}\n\nexport interface ICELabelRect {\n readonly x: number;\n readonly y: number;\n readonly width: number;\n readonly height: number;\n}\n\nexport class ICELabel extends ICEEventDispatcher {\n readonly id: string;\n readonly anchorId: string | undefined;\n readonly color: string;\n readonly background: string;\n readonly padding: number;\n readonly interactive: boolean;\n visible = true;\n\n private currentText: string;\n private currentScreenPosition: readonly [number, number] | undefined;\n private rect: ICELabelRect;\n\n constructor(options: ICELabelOptions) {\n super();\n this.id = options.id;\n this.currentText = options.text;\n this.anchorId = options.anchorId;\n this.currentScreenPosition = options.screenPosition\n ? [options.screenPosition[0], options.screenPosition[1]]\n : undefined;\n this.color = options.color ?? '#f8fafc';\n this.background = options.background ?? 'rgba(9, 18, 34, 0.88)';\n this.padding = options.padding ?? 6;\n this.interactive = options.interactive ?? false;\n const width = Math.max(28, [...this.text].length * 14) + this.padding * 2;\n const height = 20 + this.padding * 2;\n const [x, y] = this.currentScreenPosition ?? [0, 0];\n this.rect = { x, y, width, height };\n }\n\n get text(): string {\n return this.currentText;\n }\n\n get screenPosition(): readonly [number, number] | undefined {\n return this.currentScreenPosition\n ? [this.currentScreenPosition[0], this.currentScreenPosition[1]]\n : undefined;\n }\n\n setText(text: string): this {\n this.currentText = text;\n this.visible = text.length > 0;\n const width = Math.max(28, [...text].length * 14) + this.padding * 2;\n const height = 20 + this.padding * 2;\n this.rect = { ...this.rect, width, height };\n return this;\n }\n\n setScreenPosition(position: readonly [number, number]): this {\n this.currentScreenPosition = [position[0], position[1]];\n const width = this.rect.width;\n const height = this.rect.height;\n this.rect = { x: position[0], y: position[1], width, height };\n return this;\n }\n\n setWorldAnchor(position: readonly [number, number], visible = true): this {\n this.visible = visible;\n const width = this.rect.width;\n const height = this.rect.height;\n this.rect = {\n x: position[0] - width / 2,\n y: position[1] - height / 2,\n width,\n height,\n };\n return this;\n }\n\n measure(context: CanvasRenderingContext2D): ICELabelRect {\n const width = Math.max(28, context.measureText(this.text).width)\n + this.padding * 2;\n const height = 20 + this.padding * 2;\n if (this.currentScreenPosition) {\n this.rect = {\n x: this.currentScreenPosition[0],\n y: this.currentScreenPosition[1],\n width,\n height,\n };\n } else {\n const centerX = this.rect.x + this.rect.width / 2;\n const centerY = this.rect.y + this.rect.height / 2;\n this.rect = {\n x: centerX - width / 2,\n y: centerY - height / 2,\n width,\n height,\n };\n }\n return this.getRect();\n }\n\n getRect(): ICELabelRect {\n return { ...this.rect };\n }\n\n containsPoint(point: { readonly x: number; readonly y: number }): boolean {\n return (\n this.visible\n && point.x >= this.rect.x\n && point.x <= this.rect.x + this.rect.width\n && point.y >= this.rect.y\n && point.y <= this.rect.y + this.rect.height\n );\n }\n}\n", "import type { ICEViewport } from '@ice3/renderer';\nimport type { ICE2DLayer } from './ICE2DLayer.js';\n\nexport class ICE2DCanvasPainter {\n paint(\n canvas: HTMLCanvasElement,\n layers: readonly ICE2DLayer[],\n viewport: ICEViewport,\n dpr: number,\n ): void {\n const context = canvas.getContext('2d');\n if (!context) {\n return;\n }\n const width = Math.max(1, Math.round(viewport.width * dpr));\n const height = Math.max(1, Math.round(viewport.height * dpr));\n if (canvas.width !== width) {\n canvas.width = width;\n }\n if (canvas.height !== height) {\n canvas.height = height;\n }\n context.setTransform(dpr, 0, 0, dpr, 0, 0);\n context.clearRect(0, 0, viewport.width, viewport.height);\n\n const ordered = [...layers].sort((left, right) => left.order - right.order);\n for (const layer of ordered) {\n layer.paint(context, viewport);\n }\n }\n}\n", "export type ICEInputTarget =\n | { readonly kind: 'layer'; readonly layerId: string; readonly labelId: string }\n | { readonly kind: 'scene'; readonly nodeId?: string };\n\nexport type ICEInputEvent = {\n readonly type: 'pointerdown' | 'pointermove' | 'pointerup' | 'pointercancel' | 'wheel';\n readonly point: Readonly<{ x: number; y: number }>;\n readonly pointerId?: number;\n readonly deltaY?: number;\n readonly deltaMode?: number;\n};\n\nexport type ICEKeyboardInputEvent = {\n readonly type: 'keydown' | 'keyup';\n readonly code: string;\n readonly key: string;\n readonly repeat: boolean;\n};\n\nexport interface ICEInputRouterOptions {\n readonly hitTestLayer: (point: { x: number; y: number }) => ICEInputTarget | undefined;\n readonly pickScene: (point: { x: number; y: number }) => ICEInputTarget | undefined;\n readonly dispatch?: (target: ICEInputTarget, event: ICEInputEvent) => void;\n}\n\nexport class ICEInputRouter {\n private readonly captured = new Map<number, ICEInputTarget>();\n\n constructor(private readonly options: ICEInputRouterOptions) {}\n\n route(point: { x: number; y: number }): ICEInputTarget | undefined {\n return this.options.hitTestLayer(point) ?? this.options.pickScene(point);\n }\n\n pointerDown(\n point: { x: number; y: number },\n pointerId: number,\n ): ICEInputTarget | undefined {\n const target = this.route(point);\n if (target) {\n this.captured.set(pointerId, target);\n this.options.dispatch?.(target, {\n type: 'pointerdown',\n point: { ...point },\n pointerId,\n });\n }\n return target;\n }\n\n pointerMove(\n point: { x: number; y: number },\n pointerId: number,\n ): ICEInputTarget | undefined {\n const target = this.captured.get(pointerId) ?? this.route(point);\n if (target) {\n this.options.dispatch?.(target, {\n type: 'pointermove',\n point: { ...point },\n pointerId,\n });\n }\n return target;\n }\n\n pointerUp(\n point: { x: number; y: number },\n pointerId: number,\n ): ICEInputTarget | undefined {\n const target = this.captured.get(pointerId) ?? this.route(point);\n if (target) {\n this.options.dispatch?.(target, {\n type: 'pointerup',\n point: { ...point },\n pointerId,\n });\n }\n this.captured.delete(pointerId);\n return target;\n }\n\n pointerCancel(pointerId: number): void {\n const target = this.captured.get(pointerId);\n if (target) {\n this.options.dispatch?.(target, {\n type: 'pointercancel',\n point: { x: 0, y: 0 },\n pointerId,\n });\n }\n this.captured.delete(pointerId);\n }\n\n wheel(\n deltaY: number,\n point: { x: number; y: number },\n deltaMode = 0,\n ): ICEInputTarget | undefined {\n const target = this.route(point);\n if (target) {\n this.options.dispatch?.(target, {\n type: 'wheel',\n point: { ...point },\n deltaY,\n deltaMode,\n });\n }\n return target;\n }\n}\n", "import {\n ICEMesh,\n ICEPerspectiveCamera,\n ICEScene,\n type ICENode,\n} from '@ice3/core';\nimport type { ICEViewport } from '@ice3/renderer';\n\nexport function pickSceneNode(\n scene: ICEScene,\n camera: ICEPerspectiveCamera,\n viewport: ICEViewport,\n point: { readonly x: number; readonly y: number },\n): ICENode | undefined {\n const eye = camera.getPosition();\n const target = camera.getTarget();\n const forward = normalize([\n target.x - eye.x,\n target.y - eye.y,\n target.z - eye.z,\n ]);\n const right = normalize(cross(forward, [0, 1, 0]));\n const up = normalize(cross(right, forward));\n const aspect = viewport.width / Math.max(viewport.height, 1);\n const tangent = Math.tan((camera.fov * Math.PI) / 360);\n const ndcX = (point.x / viewport.width) * 2 - 1;\n const ndcY = 1 - (point.y / viewport.height) * 2;\n const direction = normalize([\n forward[0] + right[0] * ndcX * aspect * tangent + up[0] * ndcY * tangent,\n forward[1] + right[1] * ndcX * aspect * tangent + up[1] * ndcY * tangent,\n forward[2] + right[2] * ndcX * aspect * tangent + up[2] * ndcY * tangent,\n ]);\n\n let nearest: ICENode | undefined;\n let nearestDistance = Number.POSITIVE_INFINITY;\n const visit = (node: ICENode, parentVisible: boolean): void => {\n const visible = parentVisible && node.visible;\n if (!visible) {\n return;\n }\n if (node instanceof ICEMesh) {\n const inverse = invertMatrix(node.updateWorldMatrix().elements);\n if (!inverse) {\n return;\n }\n const localOrigin = transformPoint(inverse, eye.toArray(), 1);\n const localDirection = transformPoint(inverse, direction, 0);\n const { min, max } = node.geometry.getBounds();\n const distance = rayBoxDistance(localOrigin, localDirection, min, max);\n if (distance !== undefined && distance < nearestDistance) {\n nearest = node;\n nearestDistance = distance;\n }\n }\n for (const child of node.children) {\n visit(child, visible);\n }\n };\n visit(scene, true);\n return nearest;\n}\n\nconst normalize = (\n value: readonly [number, number, number],\n): [number, number, number] => {\n const length = Math.hypot(...value);\n return length > 0\n ? [value[0] / length, value[1] / length, value[2] / length]\n : [0, 0, 0];\n};\n\nconst cross = (\n left: readonly [number, number, number],\n right: readonly [number, number, number],\n): [number, number, number] => [\n left[1] * right[2] - left[2] * right[1],\n left[2] * right[0] - left[0] * right[2],\n left[0] * right[1] - left[1] * right[0],\n];\n\nconst rayBoxDistance = (\n origin: readonly [number, number, number],\n direction: readonly [number, number, number],\n min: readonly [number, number, number],\n max: readonly [number, number, number],\n): number | undefined => {\n let near = -Number.POSITIVE_INFINITY;\n let far = Number.POSITIVE_INFINITY;\n for (let axis = 0; axis < 3; axis += 1) {\n const value = direction[axis]!;\n if (Math.abs(value) < 1e-9) {\n if (origin[axis]! < min[axis]! || origin[axis]! > max[axis]!) {\n return undefined;\n }\n continue;\n }\n const first = (min[axis]! - origin[axis]!) / value;\n const second = (max[axis]! - origin[axis]!) / value;\n near = Math.max(near, Math.min(first, second));\n far = Math.min(far, Math.max(first, second));\n if (far < near || far < 0) {\n return undefined;\n }\n }\n return near >= 0 ? near : far >= 0 ? far : undefined;\n};\n\nconst transformPoint = (\n matrix: readonly number[],\n point: readonly [number, number, number],\n w: number,\n): [number, number, number] => [\n matrix[0]! * point[0]! + matrix[4]! * point[1]! + matrix[8]! * point[2]!\n + matrix[12]! * w,\n matrix[1]! * point[0]! + matrix[5]! * point[1]! + matrix[9]! * point[2]!\n + matrix[13]! * w,\n matrix[2]! * point[0]! + matrix[6]! * point[1]! + matrix[10]! * point[2]!\n + matrix[14]! * w,\n];\n\nconst invertMatrix = (source: ArrayLike<number>): number[] | undefined => {\n const inverse = new Array<number>(16);\n const a00 = source[0]!;\n const a01 = source[1]!;\n const a02 = source[2]!;\n const a03 = source[3]!;\n const a10 = source[4]!;\n const a11 = source[5]!;\n const a12 = source[6]!;\n const a13 = source[7]!;\n const a20 = source[8]!;\n const a21 = source[9]!;\n const a22 = source[10]!;\n const a23 = source[11]!;\n const a30 = source[12]!;\n const a31 = source[13]!;\n const a32 = source[14]!;\n const a33 = source[15]!;\n const b00 = a00 * a11 - a01 * a10;\n const b01 = a00 * a12 - a02 * a10;\n const b02 = a00 * a13 - a03 * a10;\n const b03 = a01 * a12 - a02 * a11;\n const b04 = a01 * a13 - a03 * a11;\n const b05 = a02 * a13 - a03 * a12;\n const b06 = a20 * a31 - a21 * a30;\n const b07 = a20 * a32 - a22 * a30;\n const b08 = a20 * a33 - a23 * a30;\n const b09 = a21 * a32 - a22 * a31;\n const b10 = a21 * a33 - a23 * a31;\n const b11 = a22 * a33 - a23 * a32;\n const determinant =\n b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n if (Math.abs(determinant) < 1e-12) {\n return undefined;\n }\n const value = 1 / determinant;\n inverse[0] = (a11 * b11 - a12 * b10 + a13 * b09) * value;\n inverse[1] = (-a01 * b11 + a02 * b10 - a03 * b09) * value;\n inverse[2] = (a31 * b05 - a32 * b04 + a33 * b03) * value;\n inverse[3] = (-a21 * b05 + a22 * b04 - a23 * b03) * value;\n inverse[4] = (-a10 * b11 + a12 * b08 - a13 * b07) * value;\n inverse[5] = (a00 * b11 - a02 * b08 + a03 * b07) * value;\n inverse[6] = (-a30 * b05 + a32 * b02 - a33 * b01) * value;\n inverse[7] = (a20 * b05 - a22 * b02 + a23 * b01) * value;\n inverse[8] = (a10 * b10 - a11 * b08 + a13 * b06) * value;\n inverse[9] = (-a00 * b10 + a01 * b08 - a03 * b06) * value;\n inverse[10] = (a30 * b04 - a31 * b02 + a33 * b00) * value;\n inverse[11] = (-a20 * b04 + a21 * b02 - a23 * b00) * value;\n inverse[12] = (-a10 * b09 + a11 * b07 - a12 * b06) * value;\n inverse[13] = (a00 * b09 - a01 * b07 + a02 * b06) * value;\n inverse[14] = (-a30 * b03 + a31 * b01 - a32 * b00) * value;\n inverse[15] = (a20 * b03 - a21 * b01 + a22 * b00) * value;\n return inverse;\n};\n", "export const SELECTION_CLICK_THRESHOLD_PX = 4;\n\nexport function isSelectionClick(\n start: Readonly<{ x: number; y: number }>,\n end: Readonly<{ x: number; y: number }>,\n): boolean {\n return Math.hypot(end.x - start.x, end.y - start.y)\n <= SELECTION_CLICK_THRESHOLD_PX;\n}\n\nexport type ICEPickOutcome =\n | { readonly kind: 'hit'; readonly id: string }\n | { readonly kind: 'empty' }\n | { readonly kind: 'error' };\n\nexport function selectionForOutcome(\n outcome: ICEPickOutcome,\n): readonly string[] | undefined {\n if (outcome.kind === 'hit') return [outcome.id];\n if (outcome.kind === 'empty') return [];\n return undefined;\n}\n", "import { ICEEventDispatcher } from '@ice3/core';\n\nexport class ICEInteractionState extends ICEEventDispatcher {\n private selection: readonly string[] = [];\n\n getSelection(): readonly string[] {\n return this.selection;\n }\n\n setSelection(ids: readonly string[]): this {\n const next = [...new Set(ids)];\n if (\n next.length === this.selection.length\n && next.every((id, index) => id === this.selection[index])\n ) {\n return this;\n }\n this.selection = Object.freeze(next);\n this.trigger('SELECTION_CHANGE', { selection: this.selection });\n return this;\n }\n}\n", "import {\n ICEPerspectiveCamera,\n ICEVector3,\n type ICEVector3Tuple,\n} from '@ice3/core';\nimport type { ICEViewport } from '@ice3/renderer';\n\nexport interface ICEProjectedPoint {\n readonly x: number;\n readonly y: number;\n readonly visible: boolean;\n readonly depth: number;\n}\n\nexport function projectWorldPoint(\n camera: ICEPerspectiveCamera,\n position: ICEVector3Tuple,\n viewport: ICEViewport,\n): ICEProjectedPoint {\n const aspect = viewport.width / Math.max(viewport.height, 1);\n const [x, y, z, w] = camera\n .getViewProjectionMatrix(aspect)\n .transformPoint(new ICEVector3(...position));\n const safeW = Math.max(Math.abs(w), Number.EPSILON) * Math.sign(w || 1);\n const ndcX = x / safeW;\n const ndcY = y / safeW;\n const ndcZ = z / safeW;\n return {\n x: viewport.x + ((ndcX + 1) / 2) * viewport.width,\n y: viewport.y + ((1 - ndcY) / 2) * viewport.height,\n visible: w > 0\n && ndcX >= -1\n && ndcX <= 1\n && ndcY >= -1\n && ndcY <= 1\n && ndcZ >= -1\n && ndcZ <= 1,\n depth: ndcZ,\n };\n}\n", "export interface ICERenderScheduler {\n request(callback: FrameRequestCallback): number;\n cancelAll(): void;\n flushForTest(): boolean;\n pendingCount(): number;\n}\n\nexport class BrowserRenderScheduler implements ICERenderScheduler {\n private readonly pending = new Map<number, FrameRequestCallback>();\n\n request(callback: FrameRequestCallback): number {\n let handle = 0;\n handle = requestAnimationFrame((time) => {\n this.pending.delete(handle);\n callback(time);\n });\n this.pending.set(handle, callback);\n return handle;\n }\n\n cancelAll(): void {\n for (const handle of this.pending.keys()) {\n cancelAnimationFrame(handle);\n }\n this.pending.clear();\n }\n\n flushForTest(): boolean {\n const first = this.pending.entries().next().value as\n | [number, FrameRequestCallback]\n | undefined;\n if (!first) {\n return false;\n }\n cancelAnimationFrame(first[0]);\n this.pending.delete(first[0]);\n first[1](performance.now());\n return true;\n }\n\n pendingCount(): number {\n return this.pending.size;\n }\n}\n", "import {\n ICEMesh,\n type ICEGeometryBounds,\n type ICENode,\n type ICEScene,\n} from '@ice3/core';\n\nexport interface ICESceneQuery {\n readonly ids?: readonly string[];\n readonly selectionIds?: readonly string[];\n readonly bounds?: ICEGeometryBounds;\n readonly visibleOnly?: boolean;\n readonly limit?: number;\n}\n\nexport interface ICESceneItem {\n readonly nodeId: string;\n readonly selectionId: string;\n readonly name: string;\n readonly typeId: string;\n readonly bounds: ICEGeometryBounds;\n readonly visible: boolean;\n}\n\nexport interface ICERay {\n readonly origin: readonly [number, number, number];\n readonly direction: readonly [number, number, number];\n readonly maxDistance?: number;\n}\n\nexport function raycastSceneNode(\n scene: ICEScene,\n ray: ICERay,\n): ICENode | undefined {\n const values = [...ray.origin, ...ray.direction];\n const length = Math.hypot(...ray.direction);\n if (values.some((value) => !Number.isFinite(value)) || length === 0\n || (ray.maxDistance !== undefined && (!Number.isFinite(ray.maxDistance) || ray.maxDistance <= 0))) {\n throw new Error('ICE3_SCENE_QUERY_INVALID: ray is invalid');\n }\n const direction = ray.direction.map((value) => value / length);\n const maxDistance = ray.maxDistance ?? Infinity;\n let nearest = maxDistance;\n let hit: ICEMesh | undefined;\n const visit = (node: ICENode): void => {\n if (!node.visible) return;\n if (node instanceof ICEMesh) {\n const matrix = node.updateWorldMatrix().elements;\n const transform = (index: number): readonly [number, number, number] => {\n const x = node.geometry.positions[index * 3]!;\n const y = node.geometry.positions[index * 3 + 1]!;\n const z = node.geometry.positions[index * 3 + 2]!;\n return [\n matrix[0]! * x + matrix[4]! * y + matrix[8]! * z + matrix[12]!,\n matrix[1]! * x + matrix[5]! * y + matrix[9]! * z + matrix[13]!,\n matrix[2]! * x + matrix[6]! * y + matrix[10]! * z + matrix[14]!,\n ];\n };\n for (let i = 0; i < node.geometry.indices.length; i += 3) {\n const distance = intersectTriangle(\n ray.origin,\n direction,\n transform(node.geometry.indices[i]!),\n transform(node.geometry.indices[i + 1]!),\n transform(node.geometry.indices[i + 2]!),\n );\n if (distance >= 0 && distance < nearest) {\n nearest = distance;\n hit = node;\n }\n }\n }\n for (const child of node.children) visit(child);\n };\n visit(scene);\n return hit;\n}\n\nfunction intersectTriangle(\n origin: readonly number[],\n direction: readonly number[],\n a: readonly number[],\n b: readonly number[],\n c: readonly number[],\n): number {\n const edge1 = [b[0]! - a[0]!, b[1]! - a[1]!, b[2]! - a[2]!];\n const edge2 = [c[0]! - a[0]!, c[1]! - a[1]!, c[2]! - a[2]!];\n const p = [\n direction[1]! * edge2[2]! - direction[2]! * edge2[1]!,\n direction[2]! * edge2[0]! - direction[0]! * edge2[2]!,\n direction[0]! * edge2[1]! - direction[1]! * edge2[0]!,\n ];\n const determinant = edge1[0]! * p[0]! + edge1[1]! * p[1]! + edge1[2]! * p[2]!;\n if (Math.abs(determinant) < 1e-9) return -1;\n const inverse = 1 / determinant;\n const t = [origin[0]! - a[0]!, origin[1]! - a[1]!, origin[2]! - a[2]!];\n const u = (t[0]! * p[0]! + t[1]! * p[1]! + t[2]! * p[2]!) * inverse;\n if (u < 0 || u > 1) return -1;\n const q = [\n t[1]! * edge1[2]! - t[2]! * edge1[1]!,\n t[2]! * edge1[0]! - t[0]! * edge1[2]!,\n t[0]! * edge1[1]! - t[1]! * edge1[0]!,\n ];\n const v = (direction[0]! * q[0]! + direction[1]! * q[1]! + direction[2]! * q[2]!) * inverse;\n if (v < 0 || u + v > 1) return -1;\n return (edge2[0]! * q[0]! + edge2[1]! * q[1]! + edge2[2]! * q[2]!) * inverse;\n}\n\nexport function collectSceneItems(\n scene: ICEScene,\n query: ICESceneQuery = {},\n): readonly ICESceneItem[] {\n if (query.limit !== undefined && (!Number.isInteger(query.limit) || query.limit < 1)) {\n throw new Error('ICE3_SCENE_QUERY_INVALID: limit must be positive');\n }\n const ids = query.ids ? new Set(query.ids) : undefined;\n const selections = query.selectionIds ? new Set(query.selectionIds) : undefined;\n const items = new Map<string, { item: ICESceneItem; depth: number }>();\n const visit = (node: ICENode, depth: number, inheritedVisible: boolean): void => {\n const visible = inheritedVisible && node.visible;\n if (node.selectionId) {\n const matrix = node.updateWorldMatrix().elements;\n const local = node instanceof ICEMesh\n ? node.geometry.getBounds()\n : {\n min: [0, 0, 0] as const,\n max: [0, 0, 0] as const,\n };\n const corners = [0, 1].flatMap((x) => [0, 1].flatMap((y) => [0, 1].map((z) => {\n const p = [x ? local.max[0] : local.min[0], y ? local.max[1] : local.min[1], z ? local.max[2] : local.min[2]];\n return [matrix[0]! * p[0]! + matrix[4]! * p[1]! + matrix[8]! * p[2]! + matrix[12]!, matrix[1]! * p[0]! + matrix[5]! * p[1]! + matrix[9]! * p[2]! + matrix[13]!, matrix[2]! * p[0]! + matrix[6]! * p[1]! + matrix[10]! * p[2]! + matrix[14]!] as const;\n })));\n const bounds: ICEGeometryBounds = {\n min: [Math.min(...corners.map((p) => p[0])), Math.min(...corners.map((p) => p[1])), Math.min(...corners.map((p) => p[2]))],\n max: [Math.max(...corners.map((p) => p[0])), Math.max(...corners.map((p) => p[1])), Math.max(...corners.map((p) => p[2]))],\n };\n const item = Object.freeze({\n nodeId: node.id,\n selectionId: node.selectionId,\n name: node.displayName,\n typeId: node.typeId,\n bounds: Object.freeze(bounds),\n visible,\n });\n const previous = items.get(item.selectionId);\n if (!previous || depth > previous.depth || (depth === previous.depth && item.nodeId < previous.item.nodeId)) {\n items.set(item.selectionId, { item, depth });\n }\n }\n for (const child of node.children) visit(child, depth + 1, visible);\n };\n visit(scene, 0, true);\n const filtered = [...items.values()].map((entry) => entry.item)\n .filter((item) => !ids || ids.has(item.nodeId))\n .filter((item) => !selections || selections.has(item.selectionId))\n .filter((item) => !query.visibleOnly || item.visible)\n .sort((a, b) => a.selectionId.localeCompare(b.selectionId, 'en'));\n return Object.freeze((query.limit ? filtered.slice(0, query.limit) : filtered));\n}\n", "import {\n ICEEngineError,\n ICEEventDispatcher,\n ICEMesh,\n ICEPerspectiveCamera,\n ICEScene,\n type ICEDiagnostic,\n type ICEGeometry,\n type ICENode,\n} from '@ice3/core';\nimport {\n selectDefaultRendererBackend,\n WebGL2RendererBackend,\n type ICE3RendererPreference,\n type ICE3RendererSelection,\n type ICERendererBackend,\n type ICEScreenPoint,\n type ICEViewport,\n} from '@ice3/renderer';\nimport { ICE2DCanvasPainter } from './layer/ICE2DCanvasPainter.js';\nimport { ICE2DLayer } from './layer/ICE2DLayer.js';\nimport { ICE2DLayerRouter } from './layer/ICE2DLayerRouter.js';\nimport { ICEWorldLayer } from './layer/ICEWorldLayer.js';\nimport {\n ICEInputRouter,\n type ICEInputEvent,\n type ICEInputTarget,\n type ICEKeyboardInputEvent,\n} from './input/ICEInputRouter.js';\nimport { pickSceneNode } from './input/ICEScenePicker.js';\nimport {\n isSelectionClick,\n selectionForOutcome,\n type ICEPickOutcome,\n} from './input/ICESelectionGesture.js';\nimport { ICEInteractionState } from './ICEInteractionState.js';\nimport { projectWorldPoint, type ICEProjectedPoint } from './ICEProjection.js';\nimport {\n BrowserRenderScheduler,\n type ICERenderScheduler,\n} from './ICERenderScheduler.js';\nimport type { ICEVector3Tuple } from '@ice3/core';\nimport {\n collectSceneItems,\n raycastSceneNode,\n type ICERay,\n type ICESceneItem,\n type ICESceneQuery,\n} from './query/ICESceneQuery.js';\n\nexport type ICE3Options = {\n readonly backend?: ICERendererBackend;\n readonly renderer?: ICE3RendererPreference;\n readonly scheduler?: ICERenderScheduler;\n};\n\nexport type ICEEngineDiagnostics = {\n readonly frameId: number;\n readonly fps: number;\n readonly cpuFrameTimeMs: number;\n readonly backend: Readonly<{\n backend: 'webgl2' | 'webgpu' | 'fake';\n maxTextureSize: number;\n picking: boolean;\n }>;\n readonly rendererSelection: Readonly<ICE3RendererSelection>;\n readonly nodeCount: number;\n readonly layerCount: number;\n readonly labelCount: number;\n readonly dpr: number;\n readonly canvas: Readonly<{ width: number; height: number }>;\n readonly viewport: Readonly<ICEViewport>;\n readonly contextLossCount: number;\n readonly renderer: Readonly<{\n drawCalls: number;\n renderedMeshes: number;\n renderedBatches: number;\n instancingFallbacks: number;\n gpuUploads: number;\n gpuEvictions: number;\n gpuBytes: number;\n }>;\n readonly selectionCount: number;\n readonly lastPickTimeMs: number;\n readonly lastPickId?: string;\n readonly labels: readonly Readonly<{\n id: string;\n layerId: string;\n rect: Readonly<{ x: number; y: number; width: number; height: number }>;\n }>[];\n readonly lastDiagnostic?: Readonly<ICEDiagnostic>;\n};\n\ntype EngineState = 'created' | 'initialized' | 'running' | 'stopped' | 'destroyed';\n\ntype PointerGesture = {\n readonly start: Readonly<{ x: number; y: number }>;\n readonly target: ICEInputTarget;\n dragged: boolean;\n};\n\ntype ICEPickResult =\n | {\n readonly kind: 'hit';\n readonly node: ICENode;\n readonly selectionId: string;\n }\n | { readonly kind: 'empty' }\n | { readonly kind: 'error' };\n\nconst NAVIGATION_KEY_CODES = new Set([\n 'ArrowUp',\n 'ArrowLeft',\n 'ArrowDown',\n 'ArrowRight',\n]);\n\nexport class ICE3 extends ICEEventDispatcher {\n private backend: ICERendererBackend;\n private readonly rendererPreference: ICE3RendererPreference | undefined;\n private rendererSelection: Readonly<ICE3RendererSelection>;\n private readonly scheduler: ICERenderScheduler;\n private readonly interaction = new ICEInteractionState();\n private readonly layers: ICE2DLayer[] = [];\n private readonly layerRouter = new ICE2DLayerRouter(() => this.layers);\n private readonly layerPainter = new ICE2DCanvasPainter();\n private readonly inputRouter = new ICEInputRouter({\n hitTestLayer: (point): ICEInputTarget | undefined => {\n const hit = this.layerRouter.hitTest(point);\n return hit\n ? { kind: 'layer', layerId: hit.layer.id, labelId: hit.label.id }\n : undefined;\n },\n pickScene: () => ({ kind: 'scene' }),\n dispatch: (target, event) => this.dispatchInput(target, event),\n });\n private state: EngineState = 'created';\n private host: HTMLElement | null = null;\n private baseCanvas: HTMLCanvasElement | null = null;\n private overlayCanvas: HTMLCanvasElement | null = null;\n private generatedBaseCanvas = false;\n private generatedOverlayCanvas = false;\n private scene: ICEScene | null = null;\n private camera: ICEPerspectiveCamera | null = null;\n private clipPlane: readonly [number, number, number, number] = [0, 0, 0, 0];\n private viewport: ICEViewport = { x: 0, y: 0, width: 1, height: 1 };\n private dpr = 1;\n private frameId = 0;\n private renderPending = false;\n private lastFrameAt = 0;\n private fps = 0;\n private cpuFrameTimeMs = 0;\n private contextLost = false;\n private contextLossCount = 0;\n private lastPickTimeMs = 0;\n private lastPickId: string | undefined;\n private readonly pointerGestures = new Map<number, PointerGesture>();\n private lastDiagnostic: ICEDiagnostic | undefined;\n private instancingFallbackReported = false;\n private pickGeneration = 0;\n private readonly removeInputListeners: Array<() => void> = [];\n private readonly handleWindowResize = (): void => {\n this.resize();\n };\n\n constructor(options: ICE3Options = {}) {\n super();\n if (options.backend && options.renderer) {\n throw new ICEEngineError(\n 'ICE3_RENDERER_CONFIG_INVALID',\n 'ICE3_RENDERER_CONFIG_INVALID: backend injection cannot be combined with a renderer preference',\n );\n }\n this.rendererPreference = options.renderer;\n this.backend = options.backend ?? new WebGL2RendererBackend();\n this.rendererSelection = {\n requested: options.backend\n ? 'custom'\n : options.renderer ?? 'webgl2',\n selected: this.backend.capabilities.backend,\n fallback: false,\n experimental: this.backend.capabilities.backend === 'webgpu',\n };\n this.scheduler = options.scheduler ?? new BrowserRenderScheduler();\n }\n\n init(target: string | HTMLElement): this {\n if (this.state !== 'created') {\n throw new ICEEngineError(\n 'ICE3_ALREADY_INITIALIZED',\n 'ICE3 engine can only be initialized once',\n );\n }\n if (\n this.rendererPreference === 'webgpu'\n ) {\n throw new ICEEngineError(\n 'ICE3_RENDERER_ASYNC_REQUIRED',\n 'ICE3_RENDERER_ASYNC_REQUIRED: webgpu requires initAsync()',\n );\n }\n return this.initializeWithBackend(target);\n }\n\n async initAsync(target: string | HTMLElement): Promise<this> {\n if (this.state !== 'created') {\n throw new ICEEngineError(\n 'ICE3_ALREADY_INITIALIZED',\n 'ICE3 engine can only be initialized once',\n );\n }\n if (this.rendererSelection.requested === 'custom') {\n return this.initializeWithBackend(target);\n }\n const selected = await selectDefaultRendererBackend(\n this.rendererPreference ?? 'webgl2',\n );\n this.backend = selected.backend;\n this.rendererSelection = selected.selection;\n try {\n return this.initializeWithBackend(target);\n } catch (error) {\n selected.backend.dispose();\n throw error;\n }\n }\n\n private initializeWithBackend(target: string | HTMLElement): this {\n if (typeof target === 'string') {\n const element = document.querySelector<HTMLElement>(target);\n if (!element) {\n throw new ICEEngineError(\n 'ICE3_INVALID_TARGET',\n `ICE3_INVALID_TARGET: target not found: ${target}`,\n );\n }\n this.configureTarget(element);\n } else {\n this.configureTarget(target);\n }\n\n const canvas = this.baseCanvas;\n if (!canvas) {\n throw new ICEEngineError('ICE3_INVALID_TARGET', 'ICE3 canvas was not created');\n }\n\n try {\n this.backend.initialize({\n canvas,\n onContextLost: () => {\n this.contextLost = true;\n this.scheduler.cancelAll();\n this.renderPending = false;\n this.contextLossCount += 1;\n this.recordDiagnostic(\n 'ICE3_CONTEXT_LOST',\n 'The GPU context was lost; waiting for restoration',\n 'warning',\n );\n this.trigger('CONTEXT_LOST');\n },\n onContextRestored: () => {\n this.contextLost = false;\n this.recordDiagnostic(\n 'ICE3_CONTEXT_RESTORED',\n 'The GPU context was restored',\n 'info',\n );\n this.trigger('CONTEXT_RESTORED');\n this.requestRender('context-restored');\n },\n onError: (error) => {\n if (this.state === 'destroyed') return;\n this.recordDiagnostic(\n error.code,\n error.message,\n 'error',\n );\n },\n onUploadReady: () => {\n // A texture finished decoding after the last frame; ask the scheduler\n // for one more frame so it becomes visible without user input.\n if (this.state === 'running') this.requestRender('upload-ready');\n },\n });\n window.addEventListener('resize', this.handleWindowResize);\n this.removeInputListeners.push(() =>\n window.removeEventListener('resize', this.handleWindowResize),\n );\n this.installInputEvents();\n } catch (error) {\n for (const remove of this.removeInputListeners.splice(0)) {\n remove();\n }\n if (this.generatedOverlayCanvas) {\n this.overlayCanvas?.remove();\n }\n if (this.generatedBaseCanvas) {\n this.baseCanvas?.remove();\n }\n this.overlayCanvas = null;\n this.baseCanvas = null;\n this.host = null;\n this.generatedOverlayCanvas = false;\n this.generatedBaseCanvas = false;\n throw error;\n }\n this.state = 'initialized';\n this.resize();\n return this;\n }\n\n setScene(scene: ICEScene): this {\n this.assertActive();\n this.scene = scene;\n this.requestRender('scene-changed');\n return this;\n }\n\n setCamera(camera: ICEPerspectiveCamera): this {\n this.assertActive();\n this.camera = camera;\n this.requestRender('camera-changed');\n return this;\n }\n\n setBackgroundColor(color: string): this {\n this.assertActive();\n this.backend.setBackgroundColor?.(color);\n this.requestRender('background-color');\n return this;\n }\n\n /**\n * Section plane `[nx, ny, nz, d]`: fragments with `dot(world, n) + d < 0`\n * are discarded. `null` (or a zero plane) disables clipping.\n */\n setClipPlane(plane: readonly [number, number, number, number] | null): this {\n this.assertActive();\n this.clipPlane = plane\n ? [plane[0], plane[1], plane[2], plane[3]]\n : [0, 0, 0, 0];\n this.backend.setClipPlane?.(this.clipPlane);\n this.requestRender('clip-plane');\n return this;\n }\n\n prepareRenderBatchGeometry(geometry: ICEGeometry): this {\n if (!this.backend.prepareBatchGeometry) {\n throw new ICEEngineError(\n 'ICE3_RENDER_BATCH_ADAPTER_UNAVAILABLE',\n 'The active renderer cannot stage adaptive batch geometry',\n );\n }\n this.backend.prepareBatchGeometry(geometry);\n return this;\n }\n\n releaseRenderBatchGeometry(geometry: ICEGeometry): this {\n this.backend.releaseBatchGeometry?.(geometry);\n return this;\n }\n\n prepareGeometry(\n geometry: ICEGeometry,\n update?: import('@ice3/core').ICEGeometryBufferUpdate,\n ): this {\n if (!this.backend.prepareGeometry) {\n throw new ICEEngineError(\n 'ICE3_RENDER_GEOMETRY_UNAVAILABLE',\n 'The active renderer cannot stage geometry updates',\n );\n }\n this.backend.prepareGeometry(geometry, update);\n return this;\n }\n\n releaseGeometry(geometry: ICEGeometry): this {\n this.backend.releaseGeometry?.(geometry);\n return this;\n }\n\n addLayer(layer: ICE2DLayer): this {\n this.assertActive();\n if (this.layers.some((item) => item.id === layer.id)) {\n throw new ICEEngineError(\n 'ICE3_LAYER_ORDER_CONFLICT',\n `Duplicate ICE layer ID: ${layer.id}`,\n );\n }\n this.layers.push(layer);\n this.layers.sort((left, right) => left.order - right.order);\n this.requestRender('layer-added');\n return this;\n }\n\n removeLayer(layer: ICE2DLayer): this {\n const index = this.layers.indexOf(layer);\n if (index >= 0) {\n this.layers.splice(index, 1);\n this.requestRender('layer-removed');\n }\n return this;\n }\n\n start(): this {\n this.assertActive();\n if (this.state === 'running') {\n return this;\n }\n this.state = 'running';\n this.requestRender('started');\n return this;\n }\n\n stop(): this {\n this.assertActive();\n this.scheduler.cancelAll();\n this.renderPending = false;\n this.pointerGestures.clear();\n this.state = 'stopped';\n return this;\n }\n\n requestRender(_reason = 'requested'): this {\n this.assertActive();\n if (this.state !== 'running' || this.contextLost) {\n return this;\n }\n if (!this.scene || !this.camera) {\n this.recordDiagnostic(\n 'ICE3_ENGINE_NOT_READY',\n 'Scene and camera must be configured before rendering',\n );\n return this;\n }\n if (this.renderPending) {\n return this;\n }\n this.renderPending = true;\n this.scheduler.request(() => {\n this.renderPending = false;\n this.renderFrame();\n });\n return this;\n }\n\n project(position: ICEVector3Tuple): ICEProjectedPoint {\n this.assertActive();\n if (!this.camera) {\n throw new ICEEngineError('ICE3_ENGINE_NOT_READY', 'Camera is not configured');\n }\n return projectWorldPoint(this.camera, position, this.viewport);\n }\n\n getSelection(): readonly string[] {\n return this.interaction.getSelection();\n }\n\n queryScene(query?: ICESceneQuery): readonly ICESceneItem[] {\n this.assertActive();\n return this.scene ? collectSceneItems(this.scene, query) : Object.freeze([]);\n }\n\n findBySelectionId(selectionId: string): ICENode | undefined {\n const item = this.queryScene({ selectionIds: [selectionId], limit: 1 })[0];\n return item ? this.scene?.findByID(item.nodeId) : undefined;\n }\n\n raycast(ray: ICERay): ICESceneItem | undefined {\n this.assertActive();\n const node = this.scene ? raycastSceneNode(this.scene, ray) : undefined;\n return node ? this.queryScene({ ids: [node.id], limit: 1 })[0] : undefined;\n }\n\n setSelection(ids: readonly string[]): this {\n this.interaction.setSelection(ids);\n this.trigger('SELECTION_CHANGE', { selection: this.getSelection() });\n this.requestRender('selection-changed');\n return this;\n }\n\n async pick(point: ICEScreenPoint): Promise<ICENode | undefined> {\n const result = await this.samplePick(point);\n return result.kind === 'hit' ? result.node : undefined;\n }\n\n async pickItem(\n point: ICEScreenPoint,\n ): Promise<{ readonly item?: ICESceneItem }> {\n const node = await this.pick(point);\n if (!node) return Object.freeze({});\n const item = this.queryScene({\n selectionIds: [node.selectionId ?? node.id],\n limit: 1,\n })[0];\n return Object.freeze(item ? { item } : {});\n }\n\n async capture(): Promise<Blob> {\n this.assertActive();\n if (!this.backend.capture) {\n throw new ICEEngineError(\n 'ICE3_CAPTURE_UNAVAILABLE',\n 'ICE3_CAPTURE_UNAVAILABLE: the active renderer cannot capture pixels',\n );\n }\n return this.backend.capture();\n }\n\n getDiagnostics(): Readonly<ICEEngineDiagnostics> {\n return {\n frameId: this.frameId,\n fps: this.fps,\n cpuFrameTimeMs: this.cpuFrameTimeMs,\n backend: this.backend.capabilities,\n rendererSelection: this.rendererSelection,\n nodeCount: this.scene ? countNodes(this.scene) : 0,\n layerCount: this.layers.length,\n labelCount: this.layers.reduce(\n (total, layer) => total + layer.getLabels().length,\n 0,\n ),\n dpr: this.dpr,\n canvas: {\n width: this.baseCanvas?.width ?? 0,\n height: this.baseCanvas?.height ?? 0,\n },\n viewport: { ...this.viewport },\n contextLossCount: this.contextLossCount,\n renderer: this.backend.stats ?? {\n drawCalls: 0,\n renderedMeshes: 0,\n renderedBatches: 0,\n instancingFallbacks: 0,\n gpuUploads: 0,\n gpuEvictions: 0,\n gpuBytes: 0,\n },\n selectionCount: this.interaction.getSelection().length,\n lastPickTimeMs: this.lastPickTimeMs,\n ...(this.lastPickId ? { lastPickId: this.lastPickId } : {}),\n labels: this.layers.flatMap((layer) =>\n layer.getLabels().map((label) => ({\n id: label.id,\n layerId: layer.id,\n rect: label.getRect(),\n })),\n ),\n ...(this.lastDiagnostic ? { lastDiagnostic: this.lastDiagnostic } : {}),\n };\n }\n\n destroy(): void {\n if (this.state === 'destroyed') {\n return;\n }\n this.scheduler.cancelAll();\n this.renderPending = false;\n for (const layer of this.layers.splice(0)) {\n layer.dispose();\n }\n for (const remove of this.removeInputListeners.splice(0)) {\n remove();\n }\n this.backend.dispose();\n if (this.generatedOverlayCanvas) {\n this.overlayCanvas?.remove();\n }\n if (this.generatedBaseCanvas) {\n this.baseCanvas?.remove();\n }\n this.overlayCanvas = null;\n this.baseCanvas = null;\n this.host = null;\n this.scene = null;\n this.camera = null;\n this.pointerGestures.clear();\n this.state = 'destroyed';\n this.trigger('DESTROY');\n this.removeAllListeners();\n }\n\n resize(): this {\n this.assertActive();\n if (!this.host || !this.baseCanvas || !this.overlayCanvas) {\n return this;\n }\n const bounds = this.host.getBoundingClientRect();\n const width = Math.max(1, Math.round(bounds.width || this.host.clientWidth));\n const height = Math.max(1, Math.round(bounds.height || this.host.clientHeight));\n this.dpr = window.devicePixelRatio || 1;\n this.viewport = { x: 0, y: 0, width, height };\n this.backend.resize(this.viewport, this.dpr);\n this.overlayCanvas.width = Math.round(width * this.dpr);\n this.overlayCanvas.height = Math.round(height * this.dpr);\n this.overlayCanvas.style.width = `${width}px`;\n this.overlayCanvas.style.height = `${height}px`;\n this.trigger('RESIZE', { viewport: this.viewport, dpr: this.dpr });\n this.requestRender('resize');\n return this;\n }\n\n private configureTarget(target: HTMLElement): void {\n if (target instanceof HTMLCanvasElement) {\n this.baseCanvas = target;\n const parent = target.parentElement;\n if (!parent) {\n throw new ICEEngineError(\n 'ICE3_INVALID_TARGET',\n 'Canvas target must have a parent for the 2D layer',\n );\n }\n this.host = parent;\n } else {\n this.host = target;\n const canvas = document.createElement('canvas');\n canvas.dataset.layer = 'scene';\n this.baseCanvas = canvas;\n this.generatedBaseCanvas = true;\n target.appendChild(canvas);\n }\n\n if (getComputedStyle(this.host).position === 'static') {\n this.host.style.position = 'relative';\n }\n this.baseCanvas.style.position = 'absolute';\n this.baseCanvas.style.inset = '0';\n this.baseCanvas.style.width = '100%';\n this.baseCanvas.style.height = '100%';\n\n const overlay = document.createElement('canvas');\n overlay.dataset.layer = 'overlay';\n overlay.style.position = 'absolute';\n overlay.style.inset = '0';\n overlay.style.pointerEvents = 'auto';\n this.overlayCanvas = overlay;\n this.generatedOverlayCanvas = true;\n this.host.appendChild(overlay);\n }\n\n private renderFrame(): void {\n if (\n this.state !== 'running'\n || this.contextLost\n || !this.scene\n || !this.camera\n ) {\n return;\n }\n const startedAt = performance.now();\n this.trigger('BEFORE_RENDER');\n this.frameId += 1;\n this.backend.render({\n frameId: this.frameId,\n scene: this.scene,\n camera: this.camera,\n viewport: this.viewport,\n dpr: this.dpr,\n selection: this.interaction.getSelection(),\n });\n const instancingFallback = (\n this.backend.stats?.instancingFallbacks ?? 0\n ) > 0;\n if (instancingFallback && !this.instancingFallbackReported) {\n this.recordDiagnostic(\n 'ICE3_RENDER_INSTANCING_FALLBACK',\n 'Instance buffers are unavailable; repeated geometry uses individual draws',\n 'warning',\n );\n this.instancingFallbackReported = true;\n } else if (!instancingFallback) {\n this.instancingFallbackReported = false;\n }\n if (this.overlayCanvas && this.layers.length > 0) {\n if (this.scene) {\n for (const layer of this.layers) {\n if (layer instanceof ICEWorldLayer) {\n layer.prepare(this.scene, (anchorId) => {\n const node = this.scene?.findByID(anchorId);\n if (!node) {\n this.recordDiagnostic(\n 'ICE3_UNKNOWN_ANCHOR',\n `Unknown ICE label anchor: ${anchorId}`,\n );\n return undefined;\n }\n return this.project(node.getWorldPosition().toArray());\n });\n }\n }\n }\n this.layerPainter.paint(\n this.overlayCanvas,\n this.layers,\n this.viewport,\n this.dpr,\n );\n }\n this.cpuFrameTimeMs = performance.now() - startedAt;\n if (this.lastFrameAt) {\n const frameMs = startedAt - this.lastFrameAt;\n this.fps = frameMs > 0 ? 1000 / frameMs : 0;\n }\n this.lastFrameAt = startedAt;\n this.trigger('AFTER_RENDER');\n }\n\n private installInputEvents(): void {\n const overlay = this.overlayCanvas;\n if (!overlay) {\n return;\n }\n overlay.style.touchAction = 'none';\n\n const listen = <K extends keyof HTMLElementEventMap>(\n type: K,\n handler: (event: HTMLElementEventMap[K]) => void,\n ) => {\n overlay.addEventListener(type, handler as EventListener);\n this.removeInputListeners.push(() =>\n overlay.removeEventListener(type, handler as EventListener),\n );\n };\n const pointOf = (event: PointerEvent | WheelEvent) => {\n const bounds = overlay.getBoundingClientRect();\n return {\n x: event.clientX - bounds.left,\n y: event.clientY - bounds.top,\n };\n };\n\n listen('pointerdown', (event) => {\n overlay.setPointerCapture?.(event.pointerId);\n const point = pointOf(event);\n const target = this.inputRouter.pointerDown(point, event.pointerId);\n if (target && event.button === 0) {\n const multiplePointers = this.pointerGestures.size > 0;\n if (multiplePointers) {\n for (const gesture of this.pointerGestures.values()) {\n gesture.dragged = true;\n }\n }\n this.pointerGestures.set(event.pointerId, {\n start: { ...point },\n target,\n dragged: multiplePointers,\n });\n }\n });\n listen('pointermove', (event) => {\n const point = pointOf(event);\n const gesture = this.pointerGestures.get(event.pointerId);\n if (\n gesture\n && !isSelectionClick(gesture.start, point)\n ) {\n gesture.dragged = true;\n }\n this.inputRouter.pointerMove(point, event.pointerId);\n });\n listen('pointerup', async (event) => {\n const point = pointOf(event);\n const gesture = this.pointerGestures.get(event.pointerId);\n this.inputRouter.pointerUp(point, event.pointerId);\n this.pointerGestures.delete(event.pointerId);\n overlay.releasePointerCapture?.(event.pointerId);\n if (\n gesture\n && gesture.target.kind === 'scene'\n && !gesture.dragged\n && isSelectionClick(gesture.start, point)\n ) {\n const generation = ++this.pickGeneration;\n const result = await this.samplePick(point);\n if (\n generation !== this.pickGeneration\n || this.state === 'destroyed'\n ) {\n return;\n }\n const outcome: ICEPickOutcome = result.kind === 'hit'\n ? {\n kind: 'hit',\n id: result.selectionId,\n }\n : result;\n const nextSelection = selectionForOutcome(outcome);\n if (nextSelection !== undefined) {\n this.setSelection(nextSelection);\n }\n }\n });\n listen('pointercancel', (event) => {\n this.inputRouter.pointerCancel(event.pointerId);\n this.pointerGestures.delete(event.pointerId);\n });\n listen('wheel', (event) => {\n event.preventDefault();\n this.inputRouter.wheel(event.deltaY, pointOf(event), event.deltaMode);\n });\n\n const handleKey = (type: 'keydown' | 'keyup', event: KeyboardEvent): void => {\n const editing = type === 'keydown' && (\n isEditableTarget(event.target)\n || isEditableTarget(document.activeElement)\n );\n if (editing) {\n return;\n }\n if (type === 'keydown' && NAVIGATION_KEY_CODES.has(event.code)) {\n event.preventDefault();\n }\n const input: ICEKeyboardInputEvent = {\n type,\n code: event.code,\n key: event.key,\n repeat: event.repeat,\n };\n this.trigger(type === 'keydown' ? 'KEY_DOWN' : 'KEY_UP', {\n target: { kind: 'scene' },\n event: input,\n });\n };\n const handleKeyDown = (event: KeyboardEvent): void => {\n handleKey('keydown', event);\n };\n const handleKeyUp = (event: KeyboardEvent): void => {\n handleKey('keyup', event);\n };\n const handleBlur = (): void => {\n this.pointerGestures.clear();\n this.trigger('KEY_CANCEL');\n };\n window.addEventListener('keydown', handleKeyDown);\n window.addEventListener('keyup', handleKeyUp);\n window.addEventListener('blur', handleBlur);\n this.removeInputListeners.push(() => {\n window.removeEventListener('keydown', handleKeyDown);\n window.removeEventListener('keyup', handleKeyUp);\n window.removeEventListener('blur', handleBlur);\n });\n }\n\n private dispatchInput(target: ICEInputTarget, event: ICEInputEvent): void {\n const eventName = {\n pointerdown: 'POINTER_DOWN',\n pointermove: 'POINTER_MOVE',\n pointerup: 'POINTER_UP',\n pointercancel: 'POINTER_CANCEL',\n wheel: 'WHEEL',\n }[event.type];\n this.trigger(eventName, { target, event });\n }\n\n private async samplePick(point: ICEScreenPoint): Promise<ICEPickResult> {\n this.assertActive();\n if (!this.scene || !this.camera) {\n return { kind: 'empty' };\n }\n if (this.backend.capabilities.picking && this.backend.pick) {\n const startedAt = performance.now();\n try {\n const selectionId = await this.backend.pick({\n frameId: this.frameId,\n scene: this.scene,\n camera: this.camera,\n viewport: this.viewport,\n dpr: this.dpr,\n selection: this.interaction.getSelection(),\n }, point);\n this.lastPickId = selectionId;\n const node = selectionId\n ? findNodeForPickedSelectionId(this.scene, selectionId)\n : undefined;\n return node && selectionId\n ? { kind: 'hit', node, selectionId }\n : { kind: 'empty' };\n } catch (error) {\n this.recordDiagnostic(\n 'ICE3_PICK_UNAVAILABLE',\n error instanceof Error ? error.message : String(error),\n );\n return { kind: 'error' };\n } finally {\n this.lastPickTimeMs = performance.now() - startedAt;\n }\n }\n const node = pickSceneNode(this.scene, this.camera, this.viewport, point);\n return node\n ? {\n kind: 'hit',\n node,\n selectionId: node instanceof ICEMesh ? node.selectionId : node.id,\n }\n : { kind: 'empty' };\n }\n\n private assertActive(): void {\n if (this.state === 'destroyed') {\n throw new ICEEngineError('ICE3_ENGINE_DESTROYED', 'ICE3 engine is destroyed');\n }\n }\n\n reportDiagnostic(\n code: string,\n message: string,\n severity: ICEDiagnostic['severity'] = 'error',\n ): this {\n this.assertActive();\n this.lastDiagnostic = { severity, code, message };\n this.trigger('DIAGNOSTIC', this.lastDiagnostic);\n return this;\n }\n\n private recordDiagnostic(\n code: string,\n message: string,\n severity: ICEDiagnostic['severity'] = 'error',\n ): void {\n this.reportDiagnostic(code, message, severity);\n }\n}\n\nconst findNodeForPickedSelectionId = (\n node: ICENode,\n selectionId: string,\n): ICENode | undefined => {\n if (node.selectionId === selectionId) {\n return node;\n }\n const semanticIds = (\n node as ICENode & { readonly semanticSelectionIds?: readonly string[] }\n ).semanticSelectionIds;\n if (semanticIds?.includes(selectionId)) {\n return node;\n }\n for (const child of node.children) {\n const found = findNodeForPickedSelectionId(child, selectionId);\n if (found) return found;\n }\n return undefined;\n};\n\nconst countNodes = (node: ICENode): number =>\n 1 + node.children.reduce((total, child) => total + countNodes(child), 0);\n\nconst isEditableTarget = (target: EventTarget | null): boolean =>\n target instanceof Element\n && target.closest(\n 'input, textarea, select, [contenteditable]:not([contenteditable=\"false\"])',\n ) !== null;\n", "import type { ICEEvent } from '@ice3/core';\nimport { ICEPerspectiveCamera } from '@ice3/core';\nimport type { ICE3 } from '../ICE3.js';\nimport type {\n ICEInputEvent,\n ICEInputTarget,\n ICEKeyboardInputEvent,\n} from './ICEInputRouter.js';\n\ntype DispatchEvent = ICEEvent<{\n readonly target: ICEInputTarget;\n readonly event: ICEInputEvent | ICEKeyboardInputEvent;\n}>;\n\nconst isKeyboardInput = (\n input: ICEInputEvent | ICEKeyboardInputEvent,\n): input is ICEKeyboardInputEvent => (\n input.type === 'keydown' || input.type === 'keyup'\n);\n\nconst clamp = (value: number, min: number, max: number): number =>\n Math.min(max, Math.max(min, value));\n\nconst MOTION_TIME_CONSTANT_MS = 55;\nconst MAX_FRAME_DELTA_MS = 64;\nconst SETTLE_EPSILON = 1e-5;\nconst WHEEL_LINE_HEIGHT_PX = 16;\nconst MAX_WHEEL_STEP_PX = 240;\nconst ZOOM_DISTANCE_PER_HOME_PIXEL = 0.001;\nconst PAN_SPEED_PER_HOME_DISTANCE = 0.75;\nconst MIN_KEY_TAP_MS = 16;\nconst MIN_ZOOM_FRACTION = 0.005;\nconst ABSOLUTE_MIN_ZOOM_DISTANCE = 0.2;\n\nconst NAVIGATION_KEYS = new Set([\n 'KeyW',\n 'KeyA',\n 'KeyS',\n 'KeyD',\n 'ArrowUp',\n 'ArrowLeft',\n 'ArrowDown',\n 'ArrowRight',\n]);\n\nexport class ICEOrbitController {\n private target: [number, number, number];\n private yaw: number;\n private pitch: number;\n private distance: number;\n private readonly minDistance: number;\n private readonly maxDistance: number;\n private targetYaw: number;\n private targetPitch: number;\n private targetDistance: number;\n private lastMotionAt = performance.now();\n private draggingPointer: number | null = null;\n private lastPoint: readonly [number, number] = [0, 0];\n private readonly activePointers = new Map<\n number,\n Readonly<{ x: number; y: number }>\n >();\n private pinchDistance: number | null = null;\n private readonly pressedKeys = new Set<string>();\n private started = false;\n private disposed = false;\n private readonly onPointerDown = (event: DispatchEvent): void => {\n const { target, event: input } = event.param ?? {};\n if (!input || isKeyboardInput(input) || input.pointerId === undefined) {\n return;\n }\n if (target?.kind === 'scene') {\n this.activePointers.set(input.pointerId, { ...input.point });\n if (this.activePointers.size === 1) {\n this.draggingPointer = input.pointerId;\n this.lastPoint = [input.point.x, input.point.y];\n } else {\n this.draggingPointer = null;\n this.pinchDistance = this.distanceBetweenPointers();\n }\n }\n };\n private readonly onPointerMove = (event: DispatchEvent): void => {\n const input = event.param?.event;\n if (!input || isKeyboardInput(input) || input.pointerId === undefined) {\n return;\n }\n if (this.activePointers.has(input.pointerId)) {\n this.activePointers.set(input.pointerId, { ...input.point });\n }\n if (this.activePointers.size >= 2) {\n const nextDistance = this.distanceBetweenPointers();\n if (this.pinchDistance !== null && nextDistance !== null) {\n this.zoomBy((this.pinchDistance - nextDistance) * 2);\n }\n this.pinchDistance = nextDistance;\n return;\n }\n if (input.pointerId !== this.draggingPointer) {\n return;\n }\n this.rotateBy(\n input.point.x - this.lastPoint[0],\n input.point.y - this.lastPoint[1],\n );\n this.lastPoint = [input.point.x, input.point.y];\n };\n private readonly onPointerUp = (event: DispatchEvent): void => {\n const input = event.param?.event;\n const pointerId = input && !isKeyboardInput(input)\n ? input.pointerId\n : undefined;\n if (pointerId === undefined) {\n return;\n }\n this.activePointers.delete(pointerId);\n if (this.activePointers.size < 2) {\n this.pinchDistance = null;\n }\n if (this.activePointers.size === 1) {\n const [remainingId, point] = this.activePointers.entries().next().value as [\n number,\n Readonly<{ x: number; y: number }>,\n ];\n this.draggingPointer = remainingId;\n this.lastPoint = [point.x, point.y];\n } else if (this.activePointers.size === 0) {\n this.draggingPointer = null;\n }\n };\n private readonly onWheel = (event: DispatchEvent): void => {\n const param = event.param;\n if (\n param?.target.kind === 'scene'\n && !isKeyboardInput(param.event)\n && param.event.deltaY !== undefined\n ) {\n const deltaMode = param.event.deltaMode ?? 0;\n const scale = deltaMode === 1\n ? WHEEL_LINE_HEIGHT_PX\n : deltaMode === 2\n ? this.engine.getDiagnostics().viewport.height\n : 1;\n this.zoomBy(\n clamp(\n param.event.deltaY * Math.max(1, scale),\n -MAX_WHEEL_STEP_PX,\n MAX_WHEEL_STEP_PX,\n ),\n );\n }\n };\n private readonly onKeyDown = (event: DispatchEvent): void => {\n const input = event.param?.event;\n if (\n !input\n || input.type !== 'keydown'\n || !NAVIGATION_KEYS.has(input.code)\n ) {\n return;\n }\n this.prepareMotion();\n const alreadyPressed = this.pressedKeys.has(input.code);\n this.pressedKeys.add(input.code);\n if (!alreadyPressed && !input.repeat) {\n this.applyKeyboardMovement(MIN_KEY_TAP_MS);\n this.applyPosition();\n }\n this.engine.requestRender('camera-keyboard-movement');\n };\n private readonly onKeyUp = (event: DispatchEvent): void => {\n const input = event.param?.event;\n if (input?.type === 'keyup') {\n this.pressedKeys.delete(input.code);\n }\n };\n private readonly onKeyCancel = (): void => {\n this.pressedKeys.clear();\n };\n private readonly onBeforeRender = (): void => {\n const moving = this.pressedKeys.size > 0;\n if (this.motionSettled() && !moving) {\n return;\n }\n const now = performance.now();\n const deltaMs = clamp(now - this.lastMotionAt, 0, MAX_FRAME_DELTA_MS);\n this.lastMotionAt = now;\n const alpha = 1 - Math.exp(-deltaMs / MOTION_TIME_CONSTANT_MS);\n this.yaw += (this.targetYaw - this.yaw) * alpha;\n this.pitch += (this.targetPitch - this.pitch) * alpha;\n this.distance = Math.exp(\n Math.log(this.distance)\n + (Math.log(this.targetDistance) - Math.log(this.distance)) * alpha,\n );\n if (this.motionSettled()) {\n this.yaw = this.targetYaw;\n this.pitch = this.targetPitch;\n this.distance = this.targetDistance;\n }\n this.applyKeyboardMovement(deltaMs);\n this.applyPosition();\n if (!this.motionSettled() || this.pressedKeys.size > 0) {\n this.engine.requestRender('orbit-smoothing');\n }\n };\n\n constructor(\n private readonly engine: ICE3,\n private readonly camera: ICEPerspectiveCamera,\n ) {\n const target = camera.getTarget();\n const eye = camera.getPosition();\n const offsetX = eye.x - target.x;\n const offsetY = eye.y - target.y;\n const offsetZ = eye.z - target.z;\n this.target = target.toArray();\n this.distance = Math.max(\n ABSOLUTE_MIN_ZOOM_DISTANCE,\n Math.hypot(offsetX, offsetY, offsetZ),\n );\n this.maxDistance = this.distance;\n this.minDistance = Math.min(\n this.maxDistance,\n Math.max(ABSOLUTE_MIN_ZOOM_DISTANCE, this.maxDistance * MIN_ZOOM_FRACTION),\n );\n this.yaw = Math.atan2(offsetX, offsetZ);\n this.pitch = Math.asin(clamp(offsetY / this.distance, -1, 1));\n this.targetYaw = this.yaw;\n this.targetPitch = this.pitch;\n this.targetDistance = this.distance;\n }\n\n focus(\n target: { readonly bounds: { readonly min: readonly [number, number, number]; readonly max: readonly [number, number, number] } },\n options: { readonly padding?: number; readonly animate?: boolean } = {},\n ): this {\n this.assertActive();\n const padding = options.padding ?? 1.15;\n if (!Number.isFinite(padding) || padding <= 0) {\n throw new Error('ICE3_CAMERA_FOCUS_INVALID: padding must be positive');\n }\n const center: [number, number, number] = [\n (target.bounds.min[0] + target.bounds.max[0]) / 2,\n (target.bounds.min[1] + target.bounds.max[1]) / 2,\n (target.bounds.min[2] + target.bounds.max[2]) / 2,\n ];\n const radius = Math.max(\n 0.1,\n Math.hypot(\n target.bounds.max[0] - target.bounds.min[0],\n target.bounds.max[1] - target.bounds.min[1],\n target.bounds.max[2] - target.bounds.min[2],\n ) / 2,\n );\n this.target = center;\n this.targetDistance = clamp(\n radius / Math.sin(this.camera.fov * Math.PI / 360) * padding,\n this.minDistance,\n this.maxDistance,\n );\n if (options.animate === false) {\n this.distance = this.targetDistance;\n this.applyPosition();\n }\n this.engine.requestRender('camera-focus');\n return this;\n }\n\n rotateBy(deltaX: number, deltaY: number): this {\n this.assertActive();\n this.prepareMotion();\n this.targetYaw -= deltaX * 0.005;\n this.targetPitch = clamp(\n this.targetPitch + deltaY * 0.005,\n -1.45,\n 1.45,\n );\n this.engine.requestRender('camera-rotation');\n return this;\n }\n\n zoomBy(delta: number): this {\n this.assertActive();\n this.prepareMotion();\n this.targetDistance = clamp(\n this.targetDistance + delta * this.maxDistance * ZOOM_DISTANCE_PER_HOME_PIXEL,\n this.minDistance,\n this.maxDistance,\n );\n this.engine.requestRender('camera-zoom');\n return this;\n }\n\n start(): this {\n this.assertActive();\n if (this.started) {\n return this;\n }\n this.engine\n .on('POINTER_DOWN', this.onPointerDown)\n .on('POINTER_MOVE', this.onPointerMove)\n .on('POINTER_UP', this.onPointerUp)\n .on('POINTER_CANCEL', this.onPointerUp)\n .on('WHEEL', this.onWheel)\n .on('KEY_DOWN', this.onKeyDown)\n .on('KEY_UP', this.onKeyUp)\n .on('KEY_CANCEL', this.onKeyCancel)\n .on('BEFORE_RENDER', this.onBeforeRender);\n this.started = true;\n return this;\n }\n\n stop(): this {\n if (!this.started) {\n return this;\n }\n this.engine\n .off('POINTER_DOWN', this.onPointerDown)\n .off('POINTER_MOVE', this.onPointerMove)\n .off('POINTER_UP', this.onPointerUp)\n .off('POINTER_CANCEL', this.onPointerUp)\n .off('WHEEL', this.onWheel)\n .off('KEY_DOWN', this.onKeyDown)\n .off('KEY_UP', this.onKeyUp)\n .off('KEY_CANCEL', this.onKeyCancel)\n .off('BEFORE_RENDER', this.onBeforeRender);\n this.started = false;\n this.draggingPointer = null;\n this.activePointers.clear();\n this.pinchDistance = null;\n this.pressedKeys.clear();\n return this;\n }\n\n dispose(): void {\n this.stop();\n this.disposed = true;\n }\n\n private applyPosition(): void {\n const horizontal = Math.cos(this.pitch) * this.distance;\n const [targetX, targetY, targetZ] = this.target;\n this.camera.setTarget(this.target);\n this.camera.setPosition([\n targetX + Math.sin(this.yaw) * horizontal,\n targetY + Math.sin(this.pitch) * this.distance,\n targetZ + Math.cos(this.yaw) * horizontal,\n ]);\n }\n\n private applyKeyboardMovement(deltaMs: number): void {\n const right = (\n Number(this.pressedKeys.has('KeyD') || this.pressedKeys.has('ArrowRight'))\n - Number(this.pressedKeys.has('KeyA') || this.pressedKeys.has('ArrowLeft'))\n );\n const up = (\n Number(this.pressedKeys.has('KeyW') || this.pressedKeys.has('ArrowUp'))\n - Number(this.pressedKeys.has('KeyS') || this.pressedKeys.has('ArrowDown'))\n );\n const magnitude = Math.hypot(right, up);\n if (magnitude === 0) {\n return;\n }\n const distance = this.maxDistance * PAN_SPEED_PER_HOME_DISTANCE\n * (deltaMs / 1000)\n / magnitude;\n const sinYaw = Math.sin(this.yaw);\n const cosYaw = Math.cos(this.yaw);\n const sinPitch = Math.sin(this.pitch);\n const cosPitch = Math.cos(this.pitch);\n this.target[0] += distance * (\n cosYaw * right\n - sinYaw * sinPitch * up\n );\n this.target[1] += distance * cosPitch * up;\n this.target[2] += distance * (\n -sinYaw * right\n - cosYaw * sinPitch * up\n );\n }\n\n private prepareMotion(): void {\n if (this.motionSettled()) {\n this.lastMotionAt = performance.now();\n }\n }\n\n private motionSettled(): boolean {\n return (\n Math.abs(this.targetYaw - this.yaw) <= SETTLE_EPSILON\n && Math.abs(this.targetPitch - this.pitch) <= SETTLE_EPSILON\n && Math.abs(Math.log(this.targetDistance / this.distance))\n <= SETTLE_EPSILON\n );\n }\n\n private assertActive(): void {\n if (this.disposed) {\n throw new Error('ICE orbit controller is disposed');\n }\n }\n\n private distanceBetweenPointers(): number | null {\n const points = [...this.activePointers.values()];\n const first = points[0];\n const second = points[1];\n return first && second\n ? Math.hypot(second.x - first.x, second.y - first.y)\n : null;\n }\n}\n", "import {\n ICENode,\n type ICEBasicMaterial,\n type ICEIndexedGeometry,\n type ICENodeOptions,\n} from '@ice3/core';\n\nexport interface ICERenderBatchOptions extends ICENodeOptions {\n readonly geometry: ICEIndexedGeometry;\n readonly material: ICEBasicMaterial;\n readonly semanticIds: readonly string[];\n readonly semanticNodeIds: readonly string[];\n readonly semanticSelectionIds: readonly string[];\n readonly materialKey: string;\n}\n\nexport class ICERenderBatch extends ICENode {\n static readonly typeId = 'ice3:RenderBatch';\n\n readonly geometry: ICEIndexedGeometry;\n readonly material: ICEBasicMaterial;\n readonly semanticIds: readonly string[];\n readonly semanticNodeIds: readonly string[];\n readonly semanticSelectionIds: readonly string[];\n readonly materialKey: string;\n\n constructor(options: ICERenderBatchOptions) {\n const { selectionId: _selectionId, ...nodeOptions } = options;\n super(nodeOptions);\n this.geometry = options.geometry;\n this.material = options.material;\n this.semanticIds = Object.freeze([...options.semanticIds]);\n this.semanticNodeIds = Object.freeze([...options.semanticNodeIds]);\n this.semanticSelectionIds = Object.freeze(\n [...options.semanticSelectionIds],\n );\n this.materialKey = options.materialKey;\n }\n\n override get typeId(): string {\n return ICERenderBatch.typeId;\n }\n}\n", "import type {\n ICEPreparedAssetSnapshot,\n ICEPreparedStats,\n ICEPreviewGeometryPacket,\n} from '@ice3/assets';\nimport {\n ICEBasicMaterial,\n ICEIndexedGeometry,\n ICEMesh,\n ICENode,\n ICEScene,\n type ICEGeometryBounds,\n type ICEGeometryBufferUpdate,\n type ICEMatrix4Tuple,\n} from '@ice3/core';\nimport { ICERenderBatch } from './ICERenderBatch.js';\n\nexport interface ICEBuiltAsset {\n readonly scene: ICEScene;\n readonly bounds: ICEGeometryBounds;\n readonly stats: ICEPreparedStats;\n}\n\nexport interface ICEBuiltPreviewPacket {\n readonly scene: ICEScene;\n readonly geometries: ReadonlyMap<string, ICEIndexedGeometry>;\n readonly geometryUpdates: ReadonlyMap<string, ICEGeometryBufferUpdate>;\n}\n\nexport function buildAssetScene(\n snapshot: ICEPreparedAssetSnapshot,\n): ICEBuiltAsset {\n const geometries = snapshot.geometries.map((geometry) => (\n new ICEIndexedGeometry({\n id: geometry.id,\n positions: geometry.positions,\n indices: geometry.indices,\n ...(geometry.edgeIndices ? { edgeIndices: geometry.edgeIndices } : {}),\n ...(geometry.colors ? { colors: geometry.colors } : {}),\n ...(geometry.semanticIndices\n ? { semanticIndices: geometry.semanticIndices }\n : {}),\n })\n ));\n const materials = snapshot.materials.map((material) => (\n new ICEBasicMaterial({\n color: material.baseColor,\n ...(material.edgeColor ? { edgeColor: material.edgeColor } : {}),\n ...(material.shading ? { shading: material.shading } : {}),\n ...(material.map ? { map: material.map } : {}),\n ...(material.normalMap ? { normalMap: material.normalMap } : {}),\n ...(material.ormMap ? { ormMap: material.ormMap } : {}),\n ...(material.metallic !== undefined ? { metallic: material.metallic } : {}),\n ...(material.roughness !== undefined ? { roughness: material.roughness } : {}),\n ...(material.emissive ? { emissive: material.emissive } : {}),\n })\n ));\n const meshesByNode = new Map<number, typeof snapshot.meshes[number][]>();\n for (const mesh of snapshot.meshes) {\n const entries = meshesByNode.get(mesh.node) ?? [];\n entries.push(mesh);\n meshesByNode.set(mesh.node, entries);\n }\n\n const scene = new ICEScene({ id: `${snapshot.assetId}:scene` });\n const nodes: ICENode[] = snapshot.nodes.map((source, index) => {\n const mesh = meshesByNode.get(index)?.[0];\n const geometry = mesh ? geometries[mesh.geometry] : undefined;\n const material = mesh ? materials[mesh.material] : undefined;\n const node = snapshot.batching && geometry && material\n ? new ICERenderBatch({\n id: source.id,\n displayName: source.name,\n ...(source.metadata ? { metadata: source.metadata } : {}),\n matrix: source.matrix,\n geometry,\n material,\n semanticIds: snapshot.batching.semanticIds,\n semanticNodeIds: snapshot.batching.semanticNodeIds,\n semanticSelectionIds: snapshot.batching.semanticSelectionIds,\n materialKey: `${mesh!.material}`,\n })\n : geometry && material\n ? new ICEMesh({\n id: source.id,\n displayName: source.name,\n ...(source.metadata ? { metadata: source.metadata } : {}),\n selectionId: source.selectionId,\n matrix: source.matrix,\n geometry,\n material,\n })\n : new ICENode({\n id: source.id,\n displayName: source.name,\n ...(source.metadata ? { metadata: source.metadata } : {}),\n selectionId: source.selectionId,\n matrix: source.matrix,\n });\n node.visible = source.visible;\n return node;\n });\n\n for (const [index, node] of nodes.entries()) {\n const source = snapshot.nodes[index]!;\n const parentIndex = snapshot.nodes[index]!.parent;\n if (parentIndex === null) {\n scene.addChild(node);\n } else {\n const parent = nodes[parentIndex];\n if (!parent) {\n throw new Error(`ICE3_ASSET_INVALID_GLB: parent node ${parentIndex} is missing`);\n }\n parent.addChild(node);\n }\n\n for (const mesh of meshesByNode.get(index)?.slice(1) ?? []) {\n const geometry = geometries[mesh.geometry];\n const material = materials[mesh.material];\n if (!geometry || !material) {\n throw new Error('ICE3_ASSET_INVALID_GLB: mesh references are invalid');\n }\n node.addChild(new ICEMesh({\n id: mesh.id,\n displayName: source.name,\n selectionId: source.selectionId,\n geometry,\n material,\n }));\n }\n }\n\n return {\n scene,\n bounds: snapshot.bounds,\n stats: snapshot.stats,\n };\n}\n\nexport function buildPreviewPacketScene(\n packet: ICEPreviewGeometryPacket,\n previousGeometries: ReadonlyMap<string, ICEIndexedGeometry> = new Map(),\n): ICEBuiltPreviewPacket {\n const geometries = new Map<string, ICEIndexedGeometry>();\n const geometryUpdates = new Map<string, ICEGeometryBufferUpdate>();\n for (const source of packet.geometries) {\n const previous = previousGeometries.get(source.geometryId);\n if (\n previous\n && previous.identity.topologyDigest === source.topologyDigest\n && previous.identity.attributeDigest === source.attributeDigest\n ) {\n geometries.set(source.geometryId, previous);\n continue;\n }\n const identity = Object.freeze({\n geometryId: source.geometryId,\n topologyDigest: source.topologyDigest,\n attributeDigest: source.attributeDigest,\n });\n const geometry = new ICEIndexedGeometry({\n id: source.residentGeometryId ?? source.geometryId,\n identity,\n positions: source.positions,\n indices: source.indices,\n });\n geometries.set(source.geometryId, geometry);\n const attributeRanges = source.ranges.filter(\n (range) => range.usage === 'vertex_attributes',\n );\n const attributeStart = Math.min(\n ...attributeRanges.map((range) => range.byteOffset),\n );\n geometryUpdates.set(source.geometryId, Object.freeze({\n positionRanges: Object.freeze(attributeRanges.map((range) => Object.freeze({\n byteOffset: range.byteOffset - attributeStart,\n byteLength: range.byteLength,\n }))),\n }));\n }\n\n const materials = new Map(\n packet.materials.map((material) => [\n material.materialId,\n new ICEBasicMaterial({\n color: colorHex(material.baseColor),\n }),\n ]),\n );\n const defaultMaterial = new ICEBasicMaterial({\n color: '#9aa6b2',\n });\n const scene = new ICEScene({ id: `packet:${packet.revision}:scene` });\n const nodes = new Map<string, ICENode>();\n for (const source of packet.nodes) {\n const geometry = source.geometryId\n ? geometries.get(source.geometryId)\n : undefined;\n const material = source.materialId\n ? materials.get(source.materialId) ?? defaultMaterial\n : defaultMaterial;\n const options = {\n id: source.nodeId,\n displayName: source.name,\n selectionId: source.nodeId,\n matrix: source.matrix as ICEMatrix4Tuple,\n };\n const node = geometry\n ? new ICEMesh({\n ...options,\n geometry,\n material,\n })\n : new ICENode(options);\n node.visible = source.visible;\n nodes.set(source.nodeId, node);\n }\n for (const source of packet.nodes) {\n const node = nodes.get(source.nodeId)!;\n const parent = source.parentId ? nodes.get(source.parentId) : undefined;\n if (source.parentId && !parent) {\n throw new Error(\n `ICE3_PREVIEW_PACKET_INVALID: parent node ${source.parentId} is missing`,\n );\n }\n (parent ?? scene).addChild(node);\n }\n return {\n scene,\n geometries,\n geometryUpdates,\n };\n}\n\nfunction colorHex(color: readonly [number, number, number, number]): string {\n const channel = (value: number): string => Math.round(\n Math.max(0, Math.min(1, value)) * 0xff,\n ).toString(16).padStart(2, '0');\n return `#${channel(color[0])}${channel(color[1])}${channel(color[2])}`;\n}\n", "type JSONRecord = Record<string, unknown>;\n\nexport interface ICEProfileValidation {\n readonly json: JSONRecord;\n readonly binary: Uint8Array;\n readonly profile: JSONRecord;\n}\n\n/**\n * Base-colour textures are supported, but only as external relative images.\n *\n * The profile keeps exactly one buffer, so an embedded `bufferView` image would\n * turn the asset into a self-contained binary whose images the renderer cannot\n * address; a relative `uri` travels next to the asset and stays streamable.\n */\nfunction validateTextures(json: JSONRecord): void {\n const images = records(json.images);\n const textures = records(json.textures);\n const samplers = records(json.samplers);\n for (const image of images) {\n const uri = image.uri;\n if (\n typeof uri !== 'string'\n || !uri\n || uri.startsWith('/')\n || uri.includes('..')\n || uri.includes('://')\n || image.bufferView !== undefined\n ) {\n throw assetError(\n 'ICE3_ASSET_UNSUPPORTED_FEATURE',\n 'images must reference a relative file path',\n );\n }\n }\n for (const texture of textures) {\n const source = Number(texture.source);\n if (!Number.isInteger(source) || source < 0 || source >= images.length) {\n throw assetError('ICE3_ASSET_INVALID_GLB', 'texture source is out of range');\n }\n if (texture.sampler !== undefined) {\n const sampler = Number(texture.sampler);\n if (!Number.isInteger(sampler) || sampler < 0 || sampler >= samplers.length) {\n throw assetError('ICE3_ASSET_INVALID_GLB', 'texture sampler is out of range');\n }\n }\n }\n for (const material of records(json.materials)) {\n const slots = [\n ['baseColorTexture', record(record(material.pbrMetallicRoughness)?.baseColorTexture)],\n ['normalTexture', record(material.normalTexture)],\n ['metallicRoughnessTexture', record(record(material.pbrMetallicRoughness)?.metallicRoughnessTexture)],\n ['occlusionTexture', record(material.occlusionTexture)],\n ] as const;\n for (const [slot, reference] of slots) {\n if (!reference) continue;\n const index = Number(reference.index);\n if (!Number.isInteger(index) || index < 0 || index >= textures.length) {\n throw assetError(\n 'ICE3_ASSET_INVALID_GLB',\n `${slot} index is out of range`,\n );\n }\n }\n }\n}\n\nexport function validatePreparedProfile(\n json: JSONRecord,\n binary: Uint8Array,\n): ICEProfileValidation {\n const asset = record(json.asset);\n const profile = record(record(asset?.extras)?.ice3);\n if (\n profile?.profile !== 'ice3-prepared'\n || profile.profileVersion !== '1.0'\n || typeof profile.assetId !== 'string'\n ) {\n throw assetError(\n 'ICE3_ASSET_PROFILE_UNSUPPORTED',\n 'GLB is not an ICE3 Prepared Profile',\n );\n }\n if (Array.isArray(json.extensionsRequired) && json.extensionsRequired.length > 0) {\n throw assetError(\n 'ICE3_ASSET_PROFILE_UNSUPPORTED',\n 'required glTF extensions are unsupported',\n );\n }\n const contractVersion = profile.contractVersion;\n if (contractVersion !== undefined) {\n if (\n typeof contractVersion !== 'string'\n || !/^1(?:\\.\\d+){1,2}$/.test(contractVersion)\n ) {\n throw assetError(\n 'ICE3_ASSET_CONTRACT_UNSUPPORTED',\n `unsupported asset contract version: ${String(contractVersion)}`,\n );\n }\n const preparation = record(profile.preparation);\n if (preparation?.runtimeConversionRequired !== false) {\n throw assetError(\n 'ICE3_TOOL_RUNTIME_CONVERSION_REQUIRED',\n 'asset requires unsupported runtime conversion',\n );\n }\n const budget = record(profile.budget);\n if (\n !budget\n || typeof budget.profile !== 'string'\n || !['pass', 'warning', 'error'].includes(String(budget.status))\n || !nonNegativeInteger(budget.warningCount)\n || !nonNegativeInteger(budget.errorCount)\n ) {\n throw assetError(\n 'ICE3_ASSET_CONTRACT_UNSUPPORTED',\n 'asset contract budget is invalid',\n );\n }\n }\n for (const field of [\n 'animations',\n 'skins',\n 'cameras',\n 'lights',\n ]) {\n if (Array.isArray(json[field]) && json[field].length > 0) {\n throw assetError(\n 'ICE3_ASSET_UNSUPPORTED_FEATURE',\n `${field} are unsupported by the M1 profile`,\n );\n }\n }\n validateTextures(json);\n if (\n records(json.scenes).length !== 1\n || json.scene !== 0\n || records(json.buffers).length !== 1\n || records(json.buffers)[0]?.uri !== undefined\n || Number(records(json.buffers)[0]?.byteLength) > binary.byteLength\n ) {\n throw assetError('ICE3_ASSET_INVALID_GLB', 'profile container fields are invalid');\n }\n const ids = new Set<string>();\n for (const node of records(json.nodes)) {\n const nodeProfile = record(record(node.extras)?.ice3);\n const id = nodeProfile?.id;\n if (typeof id !== 'string' || !id || ids.has(id)) {\n throw assetError('ICE3_ASSET_DUPLICATE_ID', 'node profile ID is invalid');\n }\n ids.add(id);\n const selectionId = nodeProfile?.selectionId;\n if (\n selectionId !== undefined\n && (typeof selectionId !== 'string' || !selectionId.trim())\n ) {\n throw assetError(\n 'ICE3_ASSET_PROFILE_UNSUPPORTED',\n 'node selection identity is invalid',\n );\n }\n const matrix = node.matrix;\n if (\n !Array.isArray(matrix)\n || matrix.length !== 16\n || matrix.some((value) => typeof value !== 'number' || !Number.isFinite(value))\n || node.translation !== undefined\n || node.rotation !== undefined\n || node.scale !== undefined\n ) {\n throw assetError(\n 'ICE3_ASSET_PROFILE_UNSUPPORTED',\n 'nodes must use matrix transforms',\n );\n }\n }\n for (const [field, kind] of [\n ['meshes', 'mesh'],\n ['materials', 'material'],\n ] as const) {\n for (const entry of records(json[field])) {\n const id = record(record(entry.extras)?.ice3)?.id;\n if (typeof id !== 'string' || !id || ids.has(id)) {\n throw assetError(\n 'ICE3_ASSET_DUPLICATE_ID',\n `${kind} profile ID is invalid`,\n );\n }\n ids.add(id);\n }\n }\n const views = records(json.bufferViews);\n for (const [index, view] of views.entries()) {\n const offset = Number(view.byteOffset ?? 0);\n const length = Number(view.byteLength);\n if (\n !Number.isInteger(offset)\n || !Number.isInteger(length)\n || offset % 4 !== 0\n || offset < 0\n || length < 0\n || offset + length > binary.byteLength\n || view.buffer !== 0\n || view.byteStride !== undefined\n ) {\n throw assetError(\n 'ICE3_ASSET_ACCESSOR_INVALID',\n `bufferView ${index} is invalid`,\n );\n }\n }\n const accessors = records(json.accessors);\n for (const [index, accessor] of accessors.entries()) {\n if (\n !views[Number(accessor.bufferView)]\n || accessor.sparse !== undefined\n || accessor.normalized === true\n ) {\n throw assetError(\n 'ICE3_ASSET_ACCESSOR_INVALID',\n `accessor ${index} is unsupported`,\n );\n }\n }\n for (const mesh of records(json.meshes)) {\n for (const primitive of records(mesh.primitives)) {\n const mode = Number(primitive.mode ?? 4);\n if (mode !== 4 && mode !== 1) {\n throw assetError(\n 'ICE3_ASSET_UNSUPPORTED_FEATURE',\n 'only triangle and edge primitives are supported',\n );\n }\n if (\n mode === 1\n && record(record(primitive.extras)?.ice3)?.role !== 'edges'\n ) {\n throw assetError(\n 'ICE3_ASSET_PROFILE_UNSUPPORTED',\n 'line primitives must use the edge role',\n );\n }\n if (mode === 4) {\n const attributes = record(primitive.attributes);\n const colorIndex = attributes?.COLOR_0;\n if (colorIndex !== undefined) {\n const position = accessors[Number(attributes?.POSITION)];\n const colors = accessors[Number(colorIndex)];\n if (\n colors?.componentType !== 5126\n || colors.type !== 'VEC3'\n || colors.count !== position?.count\n ) {\n throw assetError(\n 'ICE3_ASSET_ACCESSOR_INVALID',\n 'COLOR_0 must be float VEC3 matching POSITION',\n );\n }\n }\n }\n }\n }\n if (contractVersion !== undefined) {\n validatePreparedStats(json, profile);\n }\n return { json, binary, profile };\n}\n\nfunction validatePreparedStats(json: JSONRecord, profile: JSONRecord): void {\n const stats = record(profile.stats);\n const nodes = records(json.nodes);\n const meshes = records(json.meshes);\n const accessors = records(json.accessors);\n let primitiveCount = 0;\n let triangleCount = 0;\n let edgeSegmentCount = 0;\n const selectionIds = new Set<string>();\n const referencedMeshes = new Set<number>();\n for (const node of nodes) {\n if (node.mesh === undefined) continue;\n const mesh = meshes[Number(node.mesh)];\n if (!mesh) continue;\n referencedMeshes.add(Number(node.mesh));\n for (const primitive of records(mesh.primitives)) {\n const mode = Number(primitive.mode ?? 4);\n if (mode === 4) {\n const nodeProfile = record(record(node.extras)?.ice3);\n const selectionId = nodeProfile?.selectionId ?? nodeProfile?.id;\n if (typeof selectionId === 'string') selectionIds.add(selectionId);\n }\n }\n }\n for (const meshIndex of referencedMeshes) {\n for (const primitive of records(meshes[meshIndex]?.primitives)) {\n primitiveCount += 1;\n const mode = Number(primitive.mode ?? 4);\n const count = Number(accessors[Number(primitive.indices)]?.count);\n if (!Number.isInteger(count) || count < 0) continue;\n if (mode === 4) triangleCount += count / 3;\n if (mode === 1) edgeSegmentCount += count / 2;\n }\n }\n const batchingSelectionIds = record(profile.batching)?.semanticSelectionIds;\n const expected = {\n nodeCount: nodes.length,\n maxNodeDepth: sceneDepth(json),\n meshCount: meshes.length,\n primitiveCount,\n triangleCount,\n edgeSegmentCount,\n materialCount: records(json.materials).length,\n selectionGroupCount: Array.isArray(batchingSelectionIds)\n ? new Set(batchingSelectionIds).size\n : selectionIds.size,\n };\n for (const [key, value] of Object.entries(expected)) {\n if (stats?.[key] !== value) {\n throw assetError(\n 'ICE3_ASSET_STATS_MISMATCH',\n `asset stat ${key} does not match prepared data`,\n );\n }\n }\n}\n\nfunction sceneDepth(json: JSONRecord): number {\n const nodes = records(json.nodes);\n const scenes = records(json.scenes);\n const visit = (index: number, visiting = new Set<number>()): number => {\n if (visiting.has(index)) return 0;\n const next = new Set(visiting).add(index);\n const children = Array.isArray(nodes[index]?.children)\n ? nodes[index]!.children as number[]\n : [];\n return children.length === 0\n ? 0\n : 1 + Math.max(...children.map((child) => visit(Number(child), next)));\n };\n const roots = Array.isArray(scenes[0]?.nodes)\n ? scenes[0]!.nodes as number[]\n : [];\n return roots.length === 0\n ? 0\n : Math.max(...roots.map((root) => visit(Number(root))));\n}\n\nfunction nonNegativeInteger(value: unknown): value is number {\n return typeof value === 'number'\n && Number.isInteger(value)\n && value >= 0;\n}\n\nexport function records(value: unknown): JSONRecord[] {\n return Array.isArray(value)\n ? value.filter((item): item is JSONRecord => (\n Boolean(item) && typeof item === 'object' && !Array.isArray(item)\n ))\n : [];\n}\n\nexport function record(value: unknown): JSONRecord | undefined {\n return value && typeof value === 'object' && !Array.isArray(value)\n ? value as JSONRecord\n : undefined;\n}\n\nfunction assetError(code: string, message: string): Error {\n return new Error(`${code}: ${message}`);\n}\n", "import type {\n ICEGeometryBounds,\n ICEMatrix4Tuple,\n} from '@ice3/core';\nimport type {\n ICEPreparedAssetSnapshot,\n ICEPreparedBatch,\n ICEPreparedBatching,\n ICEPreparedGeometry,\n ICEPreparedMaterial,\n ICEPreparedMesh,\n ICEPreparedNode,\n} from './ICEPreparedGLB.js';\nimport {\n record,\n records,\n validatePreparedProfile,\n} from './ICEProfileValidator.js';\n\ntype JSONRecord = Record<string, unknown>;\n\nexport interface ICEPreparedReadOptions {\n /**\n * URL the GLB was loaded from. Texture images are resolved against it, as\n * glTF requires external resources to be relative to the referencing file.\n */\n readonly baseUrl?: string;\n}\n\nexport function readPreparedGLB(\n bytes: ArrayBuffer,\n options: ICEPreparedReadOptions = {},\n): ICEPreparedAssetSnapshot {\n const { json, binary, profile } = parseGLB(bytes);\n const accessors = records(json.accessors);\n const views = records(json.bufferViews);\n const sourceNodes = records(json.nodes);\n const sourceMeshes = records(json.meshes);\n const sourceMaterials = records(json.materials);\n const sourceTextures = records(json.textures);\n const sourceImages = records(json.images);\n const activeScene = records(json.scenes)[Number(json.scene ?? 0)];\n const sceneRoots = integers(activeScene?.nodes);\n const parents = new Array<number | null>(sourceNodes.length).fill(null);\n for (const [index, node] of sourceNodes.entries()) {\n for (const child of integers(node.children)) {\n if (child < 0 || child >= sourceNodes.length) {\n throw assetError('ICE3_ASSET_INVALID_GLB', 'node child index is invalid');\n }\n parents[child] = index;\n }\n }\n\n const nodes: ICEPreparedNode[] = sourceNodes.map((node, index) => {\n const profile = record(record(node.extras)?.ice3);\n const id = profile?.id;\n if (typeof id !== 'string') {\n throw assetError('ICE3_ASSET_INVALID_GLB', 'node identity is missing');\n }\n const selectionId = profile?.selectionId;\n const metadata: Record<string, string | readonly string[]> = {};\n for (const key of [\n 'displayName',\n 'equipmentTag',\n 'processStage',\n 'area',\n 'ports',\n 'connections',\n ]) {\n const value = profile?.[key];\n if (typeof value === 'string') {\n metadata[key] = value;\n } else if (\n Array.isArray(value)\n && value.every((item) => typeof item === 'string')\n ) {\n metadata[key] = Object.freeze([...value]);\n }\n }\n return {\n id,\n selectionId: typeof selectionId === 'string' && selectionId.trim()\n ? selectionId\n : id,\n name: typeof node.name === 'string' ? node.name : id,\n ...(Object.keys(metadata).length > 0\n ? { metadata: Object.freeze(metadata) }\n : {}),\n parent: parents[index] ?? null,\n matrix: node.matrix as ICEMatrix4Tuple,\n visible: record(record(node.extras)?.ice3)?.visible !== false,\n };\n });\n const batching = readBatchingMetadata(\n profile,\n sourceNodes,\n sourceMeshes,\n sourceMaterials,\n nodes,\n views,\n accessors,\n binary,\n );\n\n const geometries: ICEPreparedGeometry[] = [];\n const materials: ICEPreparedMaterial[] = [];\n const meshes: ICEPreparedMesh[] = [];\n const selectionIds = new Set<string>();\n let primitiveCount = 0;\n let triangleCount = 0;\n let edgeSegmentCount = 0;\n for (const [meshIndex, mesh] of sourceMeshes.entries()) {\n const meshId = record(record(mesh.extras)?.ice3)?.id;\n if (typeof meshId !== 'string') {\n throw assetError('ICE3_ASSET_INVALID_GLB', 'mesh identity is missing');\n }\n const primitives = records(mesh.primitives);\n const nodesForMesh = sourceNodes\n .map((node, index) => ({ node, index }))\n .filter((entry) => Number(entry.node.mesh) === meshIndex);\n for (const [primitiveIndex, primitive] of primitives.entries()) {\n primitiveCount += 1;\n if (Number(primitive.mode ?? 4) !== 4) continue;\n const positionIndex = Number(record(primitive.attributes)?.POSITION);\n const triangleIndex = Number(primitive.indices);\n const positions = readFloatAccessor(\n binary,\n views,\n accessors[positionIndex],\n );\n const colorAccessorIndex = record(primitive.attributes)?.COLOR_0;\n const colors = colorAccessorIndex === undefined\n ? undefined\n : readColorAccessor(\n binary,\n views,\n accessors[Number(colorAccessorIndex)],\n positions.length / 3,\n );\n const indices = readIndexAccessor(\n binary,\n views,\n accessors[triangleIndex],\n );\n const semanticAccessorIndex = record(primitive.attributes)\n ?._ICE3_SEMANTIC_INDEX;\n const semanticIndices = semanticAccessorIndex === undefined\n ? undefined\n : readSemanticAccessor(\n binary,\n views,\n accessors[Number(semanticAccessorIndex)],\n positions.length / 3,\n batching?.semanticIds.length ?? 0,\n );\n triangleCount += indices.length / 3;\n validateIndexRange(indices, positions.length / 3);\n const edgePrimitive = primitives.find((candidate) => (\n Number(candidate.mode) === 1\n && Number(record(candidate.attributes)?.POSITION) === positionIndex\n ));\n const edgeIndices = edgePrimitive\n ? readIndexAccessor(binary, views, accessors[Number(edgePrimitive.indices)])\n : undefined;\n if (edgeIndices) validateIndexRange(edgeIndices, positions.length / 3);\n edgeSegmentCount += (edgeIndices?.length ?? 0) / 2;\n const baseMaterial = sourceMaterials[Number(primitive.material)];\n const edgeMaterial = edgePrimitive\n ? sourceMaterials[Number(edgePrimitive.material)]\n : undefined;\n const shading = record(record(baseMaterial?.extras)?.ice3)?.shading;\n const materialIndex = materials.length;\n const map = materialMap(\n baseMaterial,\n sourceTextures,\n sourceImages,\n options.baseUrl,\n );\n const normalMap = normalMaterialMap(\n baseMaterial,\n sourceTextures,\n sourceImages,\n options.baseUrl,\n );\n const ormMap = ormMaterialMap(\n baseMaterial,\n sourceTextures,\n sourceImages,\n options.baseUrl,\n );\n materials.push({\n id: `${meshId}/material/${primitiveIndex}`,\n baseColor: materialColor(baseMaterial),\n ...(edgeMaterial ? { edgeColor: materialColor(edgeMaterial) } : {}),\n ...(shading === 'directional' || shading === 'water' ? { shading } : {}),\n ...(map ? { map } : {}),\n ...(normalMap ? { normalMap } : {}),\n ...(ormMap ? { ormMap } : {}),\n ...surfaceFactors(baseMaterial),\n });\n const bounds = boundsFromAccessor(accessors[positionIndex]);\n const geometryIndex = geometries.length;\n geometries.push({\n id: `${meshId}/geometry/${primitiveIndex}`,\n positions,\n indices,\n ...(edgeIndices ? { edgeIndices } : {}),\n ...(colors ? { colors } : {}),\n ...(semanticIndices ? { semanticIndices } : {}),\n bounds,\n });\n for (const entry of nodesForMesh) {\n selectionIds.add(nodes[entry.index]!.selectionId);\n meshes.push({\n id: `${meshId}/primitive/${primitiveIndex}/${entry.index}`,\n node: entry.index,\n geometry: geometryIndex,\n material: materialIndex,\n });\n }\n }\n }\n const stats = {\n nodeCount: sourceNodes.length,\n maxNodeDepth: preparedNodeDepth(sourceNodes, sceneRoots),\n meshCount: sourceMeshes.length,\n primitiveCount,\n triangleCount,\n edgeSegmentCount,\n materialCount: sourceMaterials.length,\n selectionGroupCount: batching\n ? new Set(batching.semanticSelectionIds).size\n : selectionIds.size,\n };\n const contract = preparedContract(profile);\n\n return {\n assetId: String(profile.assetId),\n bounds: boundsFromProfile(profile.bounds),\n stats,\n contract,\n nodes,\n geometries,\n materials,\n meshes,\n ...(batching ? { batching } : {}),\n };\n}\n\nfunction readBatchingMetadata(\n profile: JSONRecord,\n sourceNodes: readonly JSONRecord[],\n sourceMeshes: readonly JSONRecord[],\n sourceMaterials: readonly JSONRecord[],\n nodes: readonly ICEPreparedNode[],\n views: readonly JSONRecord[],\n accessors: readonly JSONRecord[],\n binary: Uint8Array,\n): ICEPreparedBatching | undefined {\n const raw = record(profile.batching);\n if (!raw) return undefined;\n if (raw.version !== '1.0') {\n throw assetError('ICE3_ASSET_BATCH_INVALID', 'batch version is unsupported');\n }\n const semanticIds = stringArray(raw.semanticIds, 'semanticIds');\n const semanticNodeIds = stringArray(raw.semanticNodeIds, 'semanticNodeIds');\n const semanticSelectionIds = stringArray(\n raw.semanticSelectionIds,\n 'semanticSelectionIds',\n false,\n );\n if (\n semanticIds.length === 0\n || semanticNodeIds.length !== semanticIds.length\n || semanticSelectionIds.length !== semanticIds.length\n ) {\n throw assetError('ICE3_ASSET_BATCH_INVALID', 'semantic arrays are inconsistent');\n }\n const nodeById = new Map(nodes.map((node) => [node.id, node] as const));\n for (let index = 0; index < semanticNodeIds.length; index += 1) {\n const node = nodeById.get(semanticNodeIds[index]!);\n if (!node || node.selectionId !== semanticSelectionIds[index]) {\n throw assetError(\n 'ICE3_ASSET_BATCH_INVALID',\n 'semantic node and selection identity do not match',\n );\n }\n }\n const sourceBatches = records(raw.batches);\n if (sourceBatches.length === 0) {\n throw assetError('ICE3_ASSET_BATCH_INVALID', 'batch list is empty');\n }\n const batchIds = new Set<string>();\n const primitiveKeys = new Set<string>();\n const batches: ICEPreparedBatch[] = sourceBatches.map((entry) => {\n const id = entry.id;\n const mesh = entry.mesh;\n const primitive = entry.primitive;\n const material = entry.material;\n const mode = entry.mode;\n const triangleCount = entry.triangleCount;\n if (\n typeof id !== 'string'\n || !id.trim()\n || batchIds.has(id)\n || !nonNegativeInteger(mesh)\n || !nonNegativeInteger(primitive)\n || !nonNegativeInteger(material)\n || (mode !== 4 && mode !== 1)\n || !nonNegativeInteger(triangleCount)\n ) {\n throw assetError('ICE3_ASSET_BATCH_INVALID', 'batch entry is invalid');\n }\n batchIds.add(id);\n const sourceMesh = sourceMeshes[mesh];\n const sourcePrimitive = records(sourceMesh?.primitives)[primitive];\n if (\n !sourcePrimitive\n || material >= sourceMaterials.length\n || Number(sourcePrimitive.mode ?? 4) !== mode\n ) {\n throw assetError(\n 'ICE3_ASSET_BATCH_INVALID',\n 'batch primitive or material index is invalid',\n );\n }\n const primitiveKey = `${mesh}:${primitive}`;\n if (primitiveKeys.has(primitiveKey)) {\n throw assetError('ICE3_ASSET_BATCH_INVALID', 'batch primitive is duplicated');\n }\n primitiveKeys.add(primitiveKey);\n const attributes = record(sourcePrimitive.attributes);\n const semanticAccessorIndex = Number(attributes?._ICE3_SEMANTIC_INDEX);\n const semanticAccessor = accessors[semanticAccessorIndex];\n const positionCount = Number(\n accessors[Number(attributes?.POSITION)]?.count,\n );\n if (\n !Number.isInteger(semanticAccessorIndex)\n || semanticAccessorIndex < 0\n || semanticAccessor?.componentType !== 5125\n || semanticAccessor.type !== 'SCALAR'\n || Number(semanticAccessor.count) !== positionCount\n ) {\n throw assetError(\n 'ICE3_ASSET_BATCH_INVALID',\n 'batch semantic attribute is invalid',\n );\n }\n readSemanticAccessor(\n binary,\n views,\n semanticAccessor,\n positionCount,\n semanticIds.length,\n );\n if (\n mode === 4\n && triangleCount !== Number(accessors[Number(sourcePrimitive.indices)]?.count) / 3\n ) {\n throw assetError(\n 'ICE3_ASSET_BATCH_INVALID',\n 'batch triangle count is invalid',\n );\n }\n return {\n id,\n mesh,\n primitive,\n material,\n mode,\n triangleCount,\n bounds: batchingBounds(entry.bounds),\n };\n });\n return {\n version: '1.0',\n semanticIds,\n semanticNodeIds,\n semanticSelectionIds,\n batches,\n };\n}\n\nfunction stringArray(\n value: unknown,\n field: string,\n unique = true,\n): readonly string[] {\n if (\n !Array.isArray(value)\n || value.some((entry) => typeof entry !== 'string' || !entry.trim())\n || (unique && new Set(value).size !== value.length)\n ) {\n throw assetError('ICE3_ASSET_BATCH_INVALID', `${field} is invalid`);\n }\n return value as string[];\n}\n\nfunction batchingBounds(value: unknown): ICEGeometryBounds {\n const recordValue = record(value);\n const min = numbers(recordValue?.min, 3);\n const max = numbers(recordValue?.max, 3);\n if (\n !min\n || !max\n || [0, 1, 2].some((axis) => min[axis]! > max[axis]!)\n ) {\n throw assetError('ICE3_ASSET_BATCH_INVALID', 'batch bounds are invalid');\n }\n return {\n min: [min[0]!, min[1]!, min[2]!],\n max: [max[0]!, max[1]!, max[2]!],\n };\n}\n\nfunction readSemanticAccessor(\n binary: Uint8Array,\n views: readonly JSONRecord[],\n accessor: JSONRecord | undefined,\n vertexCount: number,\n semanticCount: number,\n): Uint32Array {\n if (\n !accessor\n || accessor.componentType !== 5125\n || accessor.type !== 'SCALAR'\n || Number(accessor.count) !== vertexCount\n ) {\n throw assetError(\n 'ICE3_ASSET_BATCH_INVALID',\n 'semantic index accessor is invalid',\n );\n }\n const offset = accessorOffset(binary, views, accessor);\n const values = new Uint32Array(\n binary.buffer,\n binary.byteOffset + offset,\n vertexCount,\n );\n if (values.some((value) => value >= semanticCount)) {\n throw assetError(\n 'ICE3_ASSET_BATCH_INVALID',\n 'semantic index is out of range',\n );\n }\n return values;\n}\n\nfunction preparedContract(profile: JSONRecord): {\n status: 'active' | 'legacy';\n version?: string;\n preparation?: {\n runtimeConversionRequired: false;\n sourceFormat: 'gltf-2.0';\n unitsNormalized: true;\n matrixTransformsBaked: true;\n requiredCompressionDecoded: true;\n edgesPrepared: boolean;\n selectionGroupsPrepared: true;\n };\n budget?: {\n profile: string;\n status: 'pass' | 'warning' | 'error';\n warningCount: number;\n errorCount: number;\n };\n} {\n if (profile.contractVersion === undefined) {\n return { status: 'legacy' };\n }\n const preparation = record(profile.preparation)!;\n const budget = record(profile.budget)!;\n return {\n status: 'active',\n version: String(profile.contractVersion),\n preparation: {\n runtimeConversionRequired: false,\n sourceFormat: 'gltf-2.0',\n unitsNormalized: true,\n matrixTransformsBaked: true,\n requiredCompressionDecoded: true,\n edgesPrepared: Boolean(preparation.edgesPrepared),\n selectionGroupsPrepared: true,\n },\n budget: {\n profile: String(budget.profile),\n status: budget.status as 'pass' | 'warning' | 'error',\n warningCount: Number(budget.warningCount),\n errorCount: Number(budget.errorCount),\n },\n };\n}\n\nfunction preparedNodeDepth(\n nodes: readonly JSONRecord[],\n roots: readonly number[],\n): number {\n const depth = (index: number, visiting = new Set<number>()): number => {\n if (visiting.has(index)) return 0;\n const next = new Set(visiting).add(index);\n const children = integers(nodes[index]?.children);\n return children.length === 0\n ? 0\n : 1 + Math.max(...children.map((child) => depth(child, next)));\n };\n return roots.length === 0\n ? 0\n : Math.max(...roots.map((root) => depth(root)));\n}\n\nexport async function verifyPreparedGLBIntegrity(\n bytes: ArrayBuffer,\n): Promise<boolean> {\n const { binary, profile } = parseGLB(bytes);\n const digest = record(profile.contentDigest);\n if (\n digest?.algorithm !== 'sha256'\n || digest.covers !== 'binary-chunk'\n || typeof digest.value !== 'string'\n ) {\n return false;\n }\n const hashed = await crypto.subtle.digest('SHA-256', Uint8Array.from(binary));\n const value = [...new Uint8Array(hashed)]\n .map((part) => part.toString(16).padStart(2, '0'))\n .join('');\n return value === digest.value.toLowerCase();\n}\n\nfunction parseGLB(bytes: ArrayBuffer): ReturnType<typeof validatePreparedProfile> {\n const view = new DataView(bytes);\n if (\n bytes.byteLength < 12\n || view.getUint32(0, true) !== 0x46546c67\n || view.getUint16(4, true) !== 2\n || view.getUint32(8, true) !== bytes.byteLength\n ) {\n throw assetError('ICE3_ASSET_INVALID_GLB', 'GLB header is invalid');\n }\n let offset = 12;\n let index = 0;\n let json: JSONRecord | undefined;\n let binary: Uint8Array | undefined;\n while (offset < bytes.byteLength) {\n if (offset + 8 > bytes.byteLength) {\n throw assetError('ICE3_ASSET_INVALID_GLB', 'GLB chunk header is truncated');\n }\n const length = view.getUint32(offset, true);\n const type = view.getUint32(offset + 4, true);\n if (length % 4 !== 0 || offset + 8 + length > bytes.byteLength) {\n throw assetError('ICE3_ASSET_INVALID_GLB', 'GLB chunk length is invalid');\n }\n const chunk = new Uint8Array(bytes, offset + 8, length);\n if (index === 0) {\n if (type !== 0x4e4f534a) {\n throw assetError('ICE3_ASSET_INVALID_GLB', 'JSON chunk must be first');\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(\n new TextDecoder().decode(chunk).replace(/ +$/g, ''),\n );\n } catch {\n throw assetError('ICE3_ASSET_INVALID_GLB', 'JSON chunk is invalid');\n }\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n throw assetError('ICE3_ASSET_INVALID_GLB', 'JSON root is invalid');\n }\n json = parsed as JSONRecord;\n } else if (type === 0x004e4942) {\n if (index !== 1 || binary) {\n throw assetError('ICE3_ASSET_INVALID_GLB', 'BIN chunk is invalid');\n }\n binary = chunk;\n }\n offset += 8 + length;\n index += 1;\n }\n if (!json || !binary) {\n throw assetError('ICE3_ASSET_INVALID_GLB', 'required chunks are missing');\n }\n return validatePreparedProfile(json, binary);\n}\n\nfunction readFloatAccessor(\n binary: Uint8Array,\n views: readonly JSONRecord[],\n accessor: JSONRecord | undefined,\n): Float32Array {\n if (\n !accessor\n || accessor.componentType !== 5126\n || accessor.type !== 'VEC3'\n ) {\n throw assetError('ICE3_ASSET_ACCESSOR_INVALID', 'POSITION must be float VEC3');\n }\n const offset = accessorOffset(binary, views, accessor);\n const count = Number(accessor.count) * 3;\n return new Float32Array(binary.buffer, binary.byteOffset + offset, count);\n}\n\nfunction readIndexAccessor(\n binary: Uint8Array,\n views: readonly JSONRecord[],\n accessor: JSONRecord | undefined,\n): Uint16Array | Uint32Array {\n if (\n !accessor\n || accessor.type !== 'SCALAR'\n || (accessor.componentType !== 5123 && accessor.componentType !== 5125)\n ) {\n throw assetError('ICE3_ASSET_ACCESSOR_INVALID', 'indices must be unsigned scalars');\n }\n const offset = accessorOffset(binary, views, accessor);\n const count = Number(accessor.count);\n return accessor.componentType === 5123\n ? new Uint16Array(binary.buffer, binary.byteOffset + offset, count)\n : new Uint32Array(binary.buffer, binary.byteOffset + offset, count);\n}\n\nfunction readColorAccessor(\n binary: Uint8Array,\n views: readonly JSONRecord[],\n accessor: JSONRecord | undefined,\n vertexCount: number,\n): Float32Array {\n if (\n !accessor\n || accessor.componentType !== 5126\n || accessor.type !== 'VEC3'\n || Number(accessor.count) !== vertexCount\n ) {\n throw assetError(\n 'ICE3_ASSET_ACCESSOR_INVALID',\n 'COLOR_0 must be float VEC3 matching the position count',\n );\n }\n const offset = accessorOffset(binary, views, accessor);\n return new Float32Array(\n binary.buffer,\n binary.byteOffset + offset,\n vertexCount * 3,\n );\n}\n\nfunction accessorOffset(\n binary: Uint8Array,\n views: readonly JSONRecord[],\n accessor: JSONRecord,\n): number {\n const view = views[Number(accessor.bufferView)];\n if (!view) {\n throw assetError('ICE3_ASSET_ACCESSOR_INVALID', 'bufferView is missing');\n }\n const offset = Number(view.byteOffset ?? 0) + Number(accessor.byteOffset ?? 0);\n const componentBytes = accessor.componentType === 5126\n ? 4\n : accessor.componentType === 5123\n ? 2\n : 4;\n const componentCount = accessor.type === 'VEC3' ? 3 : 1;\n const required = Number(accessor.count) * componentBytes * componentCount;\n if (\n !Number.isInteger(offset)\n || offset < 0\n || offset % componentBytes !== 0\n || required > Number(view.byteLength)\n || offset + required > binary.byteLength\n ) {\n throw assetError('ICE3_ASSET_ACCESSOR_INVALID', 'accessor exceeds its buffer');\n }\n return offset;\n}\n\nfunction validateIndexRange(\n indices: Uint16Array | Uint32Array,\n vertexCount: number,\n): void {\n if (indices.some((index) => index >= vertexCount)) {\n throw assetError('ICE3_ASSET_ACCESSOR_INVALID', 'index exceeds vertex count');\n }\n}\n\nfunction boundsFromAccessor(accessor: JSONRecord | undefined): ICEGeometryBounds {\n const min = accessor?.min;\n const max = accessor?.max;\n if (!Array.isArray(min) || !Array.isArray(max) || min.length !== 3 || max.length !== 3) {\n throw assetError('ICE3_ASSET_ACCESSOR_INVALID', 'POSITION bounds are missing');\n }\n return {\n min: [Number(min[0]), Number(min[1]), Number(min[2])],\n max: [Number(max[0]), Number(max[1]), Number(max[2])],\n };\n}\n\nfunction boundsFromProfile(value: unknown): ICEGeometryBounds {\n const bounds = record(value);\n const min = bounds?.min;\n const max = bounds?.max;\n if (!Array.isArray(min) || !Array.isArray(max) || min.length !== 3 || max.length !== 3) {\n throw assetError('ICE3_ASSET_INVALID_GLB', 'profile bounds are invalid');\n }\n return {\n min: [Number(min[0]), Number(min[1]), Number(min[2])],\n max: [Number(max[0]), Number(max[1]), Number(max[2])],\n };\n}\n\n/**\n * Resolve a base-colour texture reference to a loadable URL.\n *\n * The profile only allows external relative images, so the URL the renderer gets\n * is exactly the path recorded in the glTF; the caller resolves it against the\n * asset base.\n */\nfunction materialMap(\n material: JSONRecord | undefined,\n textures: readonly JSONRecord[],\n images: readonly JSONRecord[],\n baseUrl: string | undefined,\n): { url: string; scale?: readonly [number, number] } | undefined {\n const reference = record(record(material?.pbrMetallicRoughness)?.baseColorTexture);\n if (!reference) return undefined;\n const texture = textures[Number(reference.index)];\n const uri = record(images[Number(record(texture)?.source)])?.uri;\n if (typeof uri !== 'string' || uri.length === 0) return undefined;\n const transform = record(record(reference.extensions)?.KHR_texture_transform);\n const scale = numbers(transform?.scale, 2);\n const su = scale?.[0];\n const sv = scale?.[1];\n return {\n url: resolveTextureUrl(uri, baseUrl),\n ...(typeof su === 'number' && typeof sv === 'number' && su > 0 && sv > 0\n ? { scale: [su, sv] as const }\n : {}),\n };\n}\n\n/**\n * Metallic-roughness factors and emission, kept as plain numbers so the\n * renderer can shade without re-reading the glTF.\n */\nfunction surfaceFactors(material: JSONRecord | undefined): {\n metallic?: number;\n roughness?: number;\n emissive?: readonly [number, number, number];\n} {\n const pbr = record(material?.pbrMetallicRoughness);\n const metallic = unitOrUndefined(pbr?.metallicFactor);\n const roughness = unitOrUndefined(pbr?.roughnessFactor);\n const emissive = numbers(material?.emissiveFactor, 3);\n return {\n ...(metallic !== undefined ? { metallic } : {}),\n ...(roughness !== undefined ? { roughness } : {}),\n ...(emissive && emissive.some((value) => value > 0)\n ? { emissive: [emissive[0]!, emissive[1]!, emissive[2]!] as const }\n : {}),\n };\n}\n\nfunction unitOrUndefined(value: unknown): number | undefined {\n const parsed = Number(value);\n if (!Number.isFinite(parsed)) return undefined;\n return Math.min(1, Math.max(0, parsed));\n}\n\n/**\n * Resolve a tangent-space normal map, carrying glTF's `normalTexture.scale` as\n * the perturbation strength.\n */\nfunction normalMaterialMap(\n material: JSONRecord | undefined,\n textures: readonly JSONRecord[],\n images: readonly JSONRecord[],\n baseUrl: string | undefined,\n): { url: string; strength?: number } | undefined {\n const reference = record(material?.normalTexture);\n if (!reference) return undefined;\n const texture = textures[Number(reference.index)];\n const uri = record(images[Number(record(texture)?.source)])?.uri;\n if (typeof uri !== 'string' || uri.length === 0) return undefined;\n const strength = Number(reference.scale);\n return {\n url: resolveTextureUrl(uri, baseUrl),\n ...(Number.isFinite(strength) && strength >= 0 ? { strength } : {}),\n };\n}\n\n/**\n * Resolve the packed occlusion-roughness-metallic slots.\n *\n * glTF keeps them apart (`pbrMetallicRoughness.metallicRoughnessTexture` and the\n * top-level `occlusionTexture`), but they normally point at the same image, so\n * one sampler covers both. When only one slot exists, the flags say which\n * channels to trust \u2014 reading a metallic-roughness image as occlusion would\n * darken the surface for no reason.\n */\nfunction ormMaterialMap(\n material: JSONRecord | undefined,\n textures: readonly JSONRecord[],\n images: readonly JSONRecord[],\n baseUrl: string | undefined,\n): {\n url: string;\n scale?: readonly [number, number];\n occlusion: boolean;\n metallicRoughness: boolean;\n} | undefined {\n const metallicRoughness = textureReference(\n record(record(material?.pbrMetallicRoughness)?.metallicRoughnessTexture),\n textures,\n images,\n baseUrl,\n );\n const occlusion = textureReference(\n record(material?.occlusionTexture),\n textures,\n images,\n baseUrl,\n );\n if (!metallicRoughness && !occlusion) return undefined;\n const url = metallicRoughness?.url ?? occlusion!.url;\n const scale = metallicRoughness?.scale ?? occlusion?.scale;\n return {\n url,\n ...(scale ? { scale } : {}),\n occlusion: occlusion?.url === url,\n metallicRoughness: metallicRoughness !== undefined,\n };\n}\n\n/** Resolve one texture reference (index \u2192 texture \u2192 image uri) to a URL. */\nfunction textureReference(\n reference: JSONRecord | undefined,\n textures: readonly JSONRecord[],\n images: readonly JSONRecord[],\n baseUrl: string | undefined,\n): { url: string; scale?: readonly [number, number] } | undefined {\n if (!reference) return undefined;\n const texture = textures[Number(reference.index)];\n const uri = record(images[Number(record(texture)?.source)])?.uri;\n if (typeof uri !== 'string' || uri.length === 0) return undefined;\n const transform = record(record(reference.extensions)?.KHR_texture_transform);\n const scale = numbers(transform?.scale, 2);\n const su = scale?.[0];\n const sv = scale?.[1];\n return {\n url: resolveTextureUrl(uri, baseUrl),\n ...(typeof su === 'number' && typeof sv === 'number' && su > 0 && sv > 0\n ? { scale: [su, sv] as const }\n : {}),\n };\n}\n\n/**\n * Resolve a texture path against the asset URL, falling back to the raw path\n * when there is no usable base (unit tests, in-memory snapshots).\n */\nfunction resolveTextureUrl(uri: string, baseUrl: string | undefined): string {\n if (!baseUrl) return uri;\n try {\n return new URL(uri, baseUrl).href;\n } catch {\n return uri;\n }\n}\n\nfunction materialColor(material: JSONRecord | undefined): string {\n if (!material) return '#808080';\n const color = record(material.pbrMetallicRoughness)?.baseColorFactor;\n if (!Array.isArray(color) || color.length < 3) return '#808080';\n const alpha = color.length >= 4 ? Number(color[3]) : 1;\n const channels = color.slice(0, alpha < 1 ? 4 : 3).map((value) => (\n Math.round(Math.min(1, Math.max(0, Number(value))) * 255)\n .toString(16)\n .padStart(2, '0')\n ));\n return `#${channels.join('')}`;\n}\n\nfunction integers(value: unknown): number[] {\n return Array.isArray(value)\n ? value.filter((entry): entry is number => Number.isInteger(entry))\n : [];\n}\n\nfunction numbers(value: unknown, length: number): number[] | undefined {\n return Array.isArray(value)\n && value.length === length\n && value.every((entry) => typeof entry === 'number' && Number.isFinite(entry))\n ? value as number[]\n : undefined;\n}\n\nfunction nonNegativeInteger(value: unknown): value is number {\n return typeof value === 'number'\n && Number.isInteger(value)\n && value >= 0;\n}\n\nfunction assetError(code: string, message: string): Error {\n return new Error(`${code}: ${message}`);\n}\n", "const MAGIC = 'ICE3PGP1';\nconst HEADER_BYTES = 120;\nconst MANIFEST_LENGTH_OFFSET = 40;\nconst BINARY_LENGTH_OFFSET = 48;\nconst MANIFEST_DIGEST_OFFSET = 56;\nconst CONTENT_DIGEST_OFFSET = 88;\nconst MAX_PACKET_BYTES = 256 * 1024 * 1024;\nconst MAX_NODES = 1_000_000;\nconst MAX_GEOMETRIES = 250_000;\nconst MAX_RANGES = 64;\nconst encoder = new TextEncoder();\nconst decoder = new TextDecoder('utf-8', { fatal: true });\n\nexport type ICEPreviewGeometryBackend = 'cpu' | 'gpu';\nexport type ICEPreviewGeometryResidencyMode =\n | 'cpu'\n | 'cold'\n | 'warm'\n | 'resident'\n | 'snapshot';\nexport type ICEPreviewGeometryRangeUsage = 'vertex_attributes' | 'indices';\n\nexport interface ICEPreviewGeometryRange {\n readonly byteOffset: number;\n readonly byteLength: number;\n readonly usage: ICEPreviewGeometryRangeUsage;\n}\n\nexport interface ICEPreviewGeometryNode {\n readonly nodeId: string;\n readonly parentId: string | null;\n readonly name: string;\n readonly matrix: readonly number[];\n readonly materialId: string | null;\n readonly geometryId: string | null;\n readonly visible: boolean;\n}\n\nexport interface ICEPreviewGeometryRecord {\n readonly geometryId: string;\n readonly residentGeometryId: string | null;\n readonly topologyDigest: string;\n readonly attributeDigest: string;\n readonly vertexCount: number;\n readonly indexCount: number;\n readonly indexWidth: 2 | 4;\n readonly ranges: readonly ICEPreviewGeometryRange[];\n}\n\nexport interface ICEPreviewGeometry extends ICEPreviewGeometryRecord {\n readonly positions: Float32Array;\n readonly indices: Uint16Array | Uint32Array;\n}\n\nexport interface ICEPreviewGeometryMaterial {\n readonly materialId: string;\n readonly baseColor: readonly [number, number, number, number];\n readonly metallic: number;\n readonly roughness: number;\n readonly opacity: number;\n}\n\nexport interface ICEPreviewGeometryManifest {\n readonly schemaVersion: number;\n readonly transportVersion: number;\n readonly revision: number;\n readonly parentRevision: number | null;\n readonly sourceDigest: string;\n readonly backend: ICEPreviewGeometryBackend;\n readonly residencyMode: ICEPreviewGeometryResidencyMode;\n readonly nodes: readonly ICEPreviewGeometryNode[];\n readonly geometries: readonly ICEPreviewGeometryRecord[];\n readonly materials: readonly ICEPreviewGeometryMaterial[];\n readonly removedNodeIds: readonly string[];\n readonly removedGeometryIds: readonly string[];\n}\n\nexport interface ICEPreviewGeometryPacket\n extends Omit<ICEPreviewGeometryManifest, 'geometries'> {\n readonly geometries: readonly ICEPreviewGeometry[];\n readonly binary: Uint8Array;\n}\n\nexport type ICEPreviewGeometryDelta = ICEPreviewGeometryPacket;\n\nexport function parsePreviewGeometryPacket(\n input: Uint8Array | ArrayBuffer,\n): ICEPreviewGeometryPacket {\n const bytes = input instanceof Uint8Array ? input : new Uint8Array(input);\n if (bytes.byteLength < HEADER_BYTES || bytes.byteLength > MAX_PACKET_BYTES) {\n throw new RangeError('ICE3 preview packet size is invalid');\n }\n if (decoder.decode(bytes.subarray(0, 8)) !== MAGIC) {\n throw new TypeError('ICE3 preview packet magic is invalid');\n }\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const schemaVersion = view.getUint16(8, true);\n const transportVersion = view.getUint16(10, true);\n const headerBytes = view.getUint32(12, true);\n if (schemaVersion !== 1 || transportVersion !== 1 || headerBytes !== HEADER_BYTES) {\n throw new TypeError('ICE3 preview packet version is unsupported');\n }\n const manifestLength = readSafeU64(view, MANIFEST_LENGTH_OFFSET);\n const binaryLength = readSafeU64(view, BINARY_LENGTH_OFFSET);\n if (\n manifestLength === 0\n || manifestLength % 8 !== 0\n || HEADER_BYTES + manifestLength + binaryLength !== bytes.byteLength\n ) {\n throw new RangeError('ICE3 preview packet lengths are invalid');\n }\n\n const manifestStart = HEADER_BYTES;\n const manifestEnd = manifestStart + manifestLength;\n const manifestBytes = bytes.subarray(manifestStart, manifestEnd);\n const binary = bytes.subarray(manifestEnd);\n const expectedManifestDigest = bytes.subarray(\n MANIFEST_DIGEST_OFFSET,\n MANIFEST_DIGEST_OFFSET + 32,\n );\n if (!equalBytes(sha256(manifestBytes), expectedManifestDigest)) {\n throw new TypeError('ICE3 preview packet manifest digest is invalid');\n }\n const contentHash = sha256(concatBytes(manifestBytes, binary));\n const expectedContentDigest = bytes.subarray(\n CONTENT_DIGEST_OFFSET,\n CONTENT_DIGEST_OFFSET + 32,\n );\n if (!equalBytes(contentHash, expectedContentDigest)) {\n throw new TypeError('ICE3 preview packet content digest is invalid');\n }\n\n let candidate: unknown;\n try {\n candidate = JSON.parse(decoder.decode(manifestBytes));\n } catch {\n throw new TypeError('ICE3 preview packet manifest is invalid');\n }\n const manifest = validateManifest(candidate, binary.byteLength);\n return {\n ...manifest,\n geometries: manifest.geometries.map((geometry) => decodeGeometry(geometry, binary)),\n binary,\n };\n}\n\nexport function applyPreviewGeometryDelta(\n base: ICEPreviewGeometryPacket,\n delta: ICEPreviewGeometryDelta,\n): ICEPreviewGeometryPacket {\n if (delta.parentRevision !== base.revision) {\n throw new RangeError(\n `ICE3 preview packet parent revision ${delta.parentRevision ?? 'missing'} does not match ${base.revision}`,\n );\n }\n const nodes = mergeById(\n base.nodes,\n delta.nodes,\n delta.removedNodeIds,\n (node) => node.nodeId,\n );\n const geometries = mergeGeometries(base.geometries, delta, delta.removedGeometryIds);\n const materials = mergeById(\n base.materials,\n delta.materials,\n [],\n (material) => material.materialId,\n );\n return {\n schemaVersion: delta.schemaVersion,\n transportVersion: delta.transportVersion,\n revision: delta.revision,\n parentRevision: delta.parentRevision,\n sourceDigest: delta.sourceDigest,\n backend: delta.backend,\n residencyMode: delta.residencyMode,\n nodes,\n geometries,\n materials,\n removedNodeIds: [],\n removedGeometryIds: [],\n binary: delta.binary,\n };\n}\n\nfunction mergeGeometries(\n baseGeometries: readonly ICEPreviewGeometry[],\n delta: ICEPreviewGeometryPacket,\n removedGeometryIds: readonly string[],\n): readonly ICEPreviewGeometry[] {\n const removed = new Set(removedGeometryIds);\n const updates = new Map(\n delta.geometries.map((geometry) => [geometry.geometryId, geometry]),\n );\n const output: ICEPreviewGeometry[] = [];\n for (const base of baseGeometries) {\n if (removed.has(base.geometryId)) {\n continue;\n }\n const update = updates.get(base.geometryId);\n output.push(update ? mergeGeometry(base, update) : base);\n updates.delete(base.geometryId);\n }\n output.push(...updates.values());\n return Object.freeze(output);\n}\n\nfunction mergeGeometry(\n base: ICEPreviewGeometry,\n update: ICEPreviewGeometry,\n): ICEPreviewGeometry {\n if (base === update) {\n return base;\n }\n return freezeGeometry(\n update,\n base.attributeDigest === update.attributeDigest\n ? base.positions\n : update.positions,\n base.topologyDigest === update.topologyDigest\n ? base.indices\n : update.indices,\n );\n}\n\nfunction validateManifest(\n value: unknown,\n binaryLength: number,\n): ICEPreviewGeometryManifest {\n if (!isRecord(value)) {\n throw invalidManifest();\n }\n const nodes = readArray(value.nodes, MAX_NODES).map(readNode);\n const geometries = readArray(value.geometries, MAX_GEOMETRIES).map(readGeometryRecord);\n const materials = readArray(value.materials, MAX_GEOMETRIES).map(readMaterial);\n const removedNodeIds = readStringArray(value.removedNodeIds, MAX_NODES);\n const removedGeometryIds = readStringArray(value.removedGeometryIds, MAX_GEOMETRIES);\n const manifest: ICEPreviewGeometryManifest = {\n schemaVersion: readVersion(value.schemaVersion, 1),\n transportVersion: readVersion(value.transportVersion, 1),\n revision: readSafeInteger(value.revision, 0, Number.MAX_SAFE_INTEGER),\n parentRevision: value.parentRevision === null\n ? null\n : readSafeInteger(value.parentRevision, 0, Number.MAX_SAFE_INTEGER),\n sourceDigest: readDigest(value.sourceDigest),\n backend: readEnum(value.backend, ['cpu', 'gpu'] as const),\n residencyMode: readEnum(\n value.residencyMode,\n ['cpu', 'cold', 'warm', 'resident', 'snapshot'] as const,\n ),\n nodes,\n geometries,\n materials,\n removedNodeIds,\n removedGeometryIds,\n };\n if (\n manifest.parentRevision !== null\n && manifest.parentRevision >= manifest.revision\n ) {\n throw invalidManifest();\n }\n ensureUnique(nodes, (node) => node.nodeId);\n ensureUnique(geometries, (geometry) => geometry.geometryId);\n ensureUnique(materials, (material) => material.materialId);\n for (const geometry of geometries) {\n for (const range of geometry.ranges) {\n if (\n range.byteOffset % 4 !== 0\n || range.byteLength === 0\n || range.byteOffset + range.byteLength > binaryLength\n ) {\n throw invalidManifest();\n }\n }\n }\n return manifest;\n}\n\nfunction readNode(value: unknown, index: number): ICEPreviewGeometryNode {\n if (!isRecord(value)) {\n throw new TypeError(`ICE3 preview node ${index} is invalid`);\n }\n const matrix = readArray(value.matrix, 16);\n if (matrix.some((entry) => (\n typeof entry !== 'number' || !Number.isFinite(entry)\n ))) {\n throw new TypeError(`ICE3 preview node ${index} matrix is invalid`);\n }\n return {\n nodeId: readNonEmptyString(value.nodeId),\n parentId: readNullableString(value.parentId),\n name: readString(value.name),\n matrix: Object.freeze(matrix as number[]),\n materialId: readNullableString(value.materialId),\n geometryId: readNullableString(value.geometryId),\n visible: readBoolean(value.visible),\n };\n}\n\nfunction readGeometryRecord(value: unknown, index: number): ICEPreviewGeometryRecord {\n if (!isRecord(value)) {\n throw new TypeError(`ICE3 preview geometry ${index} is invalid`);\n }\n const indexWidth = readSafeInteger(value.indexWidth, 1, 8);\n if (indexWidth !== 2 && indexWidth !== 4) {\n throw new TypeError(`ICE3 preview geometry ${index} index width is invalid`);\n }\n const ranges = readArray(value.ranges, MAX_RANGES).map(readRange);\n return {\n geometryId: readNonEmptyString(value.geometryId),\n residentGeometryId: readNullableString(value.residentGeometryId),\n topologyDigest: readDigest(value.topologyDigest),\n attributeDigest: readDigest(value.attributeDigest),\n vertexCount: readSafeInteger(value.vertexCount, 1, 100_000_000),\n indexCount: readSafeInteger(value.indexCount, 0, 300_000_000),\n indexWidth,\n ranges: Object.freeze(ranges),\n };\n}\n\nfunction readRange(value: unknown, index: number): ICEPreviewGeometryRange {\n if (!isRecord(value)) {\n throw new TypeError(`ICE3 preview range ${index} is invalid`);\n }\n return {\n byteOffset: readSafeInteger(value.byteOffset, 0, MAX_PACKET_BYTES),\n byteLength: readSafeInteger(value.byteLength, 1, MAX_PACKET_BYTES),\n usage: readEnum(\n value.usage,\n ['vertex_attributes', 'indices'] as const,\n ),\n };\n}\n\nfunction readMaterial(value: unknown, index: number): ICEPreviewGeometryMaterial {\n if (!isRecord(value)) {\n throw new TypeError(`ICE3 preview material ${index} is invalid`);\n }\n const baseColor = readFiniteArray(value.baseColor, 4);\n return {\n materialId: readNonEmptyString(value.materialId),\n baseColor: Object.freeze(baseColor) as [number, number, number, number],\n metallic: readFiniteNumber(value.metallic),\n roughness: readFiniteNumber(value.roughness),\n opacity: readFiniteNumber(value.opacity),\n };\n}\n\nfunction decodeGeometry(\n geometry: ICEPreviewGeometryRecord,\n binary: Uint8Array,\n): ICEPreviewGeometry {\n const attributes = geometry.ranges.find(\n (range) => range.usage === 'vertex_attributes',\n );\n const topology = geometry.ranges.find((range) => range.usage === 'indices');\n if (!attributes && !topology) {\n return freezeGeometry(\n encodeIdentity(geometry),\n new Float32Array(),\n new Uint32Array(),\n );\n }\n const positions = attributes\n ? decodePositions(attributes, geometry.vertexCount, binary)\n : new Float32Array(geometry.vertexCount * 3);\n const indices = topology\n ? decodeIndices(topology, geometry.indexCount, geometry.indexWidth, binary)\n : new Uint32Array();\n return freezeGeometry(encodeIdentity(geometry), positions, indices);\n}\n\nfunction decodePositions(\n range: ICEPreviewGeometryRange,\n vertexCount: number,\n binary: Uint8Array,\n): Float32Array {\n const bytesPerVertex = range.byteLength / vertexCount;\n const components = bytesPerVertex / 4;\n if (!Number.isInteger(components) || components < 3) {\n throw new TypeError('ICE3 preview position range has an invalid stride');\n }\n const source = new Float32Array(\n binary.buffer,\n binary.byteOffset + range.byteOffset,\n range.byteLength / 4,\n );\n if (components === 3) {\n return source;\n }\n const positions = new Float32Array(vertexCount * 3);\n for (let vertex = 0; vertex < vertexCount; vertex += 1) {\n const sourceOffset = vertex * components;\n positions[vertex * 3] = source[sourceOffset]!;\n positions[vertex * 3 + 1] = source[sourceOffset + 1]!;\n positions[vertex * 3 + 2] = source[sourceOffset + 2]!;\n }\n return positions;\n}\n\nfunction decodeIndices(\n range: ICEPreviewGeometryRange,\n indexCount: number,\n indexWidth: 2 | 4,\n binary: Uint8Array,\n): Uint16Array | Uint32Array {\n if (range.byteLength !== indexCount * indexWidth) {\n throw new TypeError('ICE3 preview index range has an invalid length');\n }\n const offset = binary.byteOffset + range.byteOffset;\n return indexWidth === 2\n ? new Uint16Array(binary.buffer, offset, indexCount)\n : new Uint32Array(binary.buffer, offset, indexCount);\n}\n\nfunction freezeGeometry(\n identity: Pick<ICEPreviewGeometryRecord,\n 'geometryId'\n | 'residentGeometryId'\n | 'topologyDigest'\n | 'attributeDigest'\n | 'vertexCount'\n | 'indexCount'\n | 'indexWidth'\n | 'ranges'>,\n positions: Float32Array,\n indices: Uint16Array | Uint32Array,\n): ICEPreviewGeometry {\n return Object.freeze({\n ...identity,\n positions,\n indices,\n });\n}\n\nfunction encodeIdentity(\n geometry: ICEPreviewGeometryRecord,\n): ICEPreviewGeometryRecord {\n return geometry;\n}\n\nfunction mergeById<T>(\n base: readonly T[],\n updates: readonly T[],\n removed: readonly string[],\n id: (value: T) => string,\n): readonly T[] {\n const removedIds = new Set(removed);\n const updateMap = new Map(updates.map((value) => [id(value), value]));\n const output = base\n .filter((value) => !removedIds.has(id(value)))\n .map((value) => updateMap.get(id(value)) ?? value);\n const baseIds = new Set(base.map(id));\n for (const value of updates) {\n if (!baseIds.has(id(value))) {\n output.push(value);\n }\n }\n return Object.freeze(output);\n}\n\nfunction readArray(value: unknown, maximum: number): unknown[] {\n if (!Array.isArray(value) || value.length > maximum) {\n throw invalidManifest();\n }\n return value;\n}\n\nfunction readStringArray(value: unknown, maximum: number): readonly string[] {\n return Object.freeze(readArray(value, maximum).map(readString));\n}\n\nfunction readFiniteArray(value: unknown, length: number): number[] {\n const values = readArray(value, length);\n if (\n values.length !== length\n || values.some((entry) => (\n typeof entry !== 'number' || !Number.isFinite(entry)\n ))\n ) {\n throw invalidManifest();\n }\n return values as number[];\n}\n\nfunction readVersion(value: unknown, expected: number): number {\n if (value !== expected) {\n throw new TypeError('ICE3 preview packet version is unsupported');\n }\n return expected;\n}\n\nfunction readSafeInteger(value: unknown, minimum: number, maximum: number): number {\n if (\n typeof value !== 'number'\n || !Number.isSafeInteger(value)\n || value < minimum\n || value > maximum\n ) {\n throw invalidManifest();\n }\n return value;\n}\n\nfunction readFiniteNumber(value: unknown): number {\n if (typeof value !== 'number' || !Number.isFinite(value)) {\n throw invalidManifest();\n }\n return value;\n}\n\nfunction readBoolean(value: unknown): boolean {\n if (typeof value !== 'boolean') {\n throw invalidManifest();\n }\n return value;\n}\n\nfunction readString(value: unknown): string {\n if (typeof value !== 'string') {\n throw invalidManifest();\n }\n return value;\n}\n\nfunction readNonEmptyString(value: unknown): string {\n const result = readString(value);\n if (!result.trim()) {\n throw invalidManifest();\n }\n return result;\n}\n\nfunction readNullableString(value: unknown): string | null {\n return value === null ? null : readString(value);\n}\n\nfunction readDigest(value: unknown): string {\n const digest = readString(value);\n if (!/^[0-9a-fA-F]{64}$/.test(digest)) {\n throw invalidManifest();\n }\n return digest.toLowerCase();\n}\n\nfunction readEnum<const T extends readonly string[]>(\n value: unknown,\n allowed: T,\n): T[number] {\n if (typeof value !== 'string' || !allowed.includes(value)) {\n throw invalidManifest();\n }\n return value as T[number];\n}\n\nfunction ensureUnique<T>(values: readonly T[], id: (value: T) => string): void {\n if (new Set(values.map(id)).size !== values.length) {\n throw invalidManifest();\n }\n}\n\nfunction invalidManifest(): TypeError {\n return new TypeError('ICE3 preview packet manifest is invalid');\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction readSafeU64(view: DataView, offset: number): number {\n const value = view.getBigUint64(offset, true);\n if (value > BigInt(Number.MAX_SAFE_INTEGER)) {\n throw new RangeError('ICE3 preview packet length exceeds safe integer range');\n }\n return Number(value);\n}\n\nfunction concatBytes(left: Uint8Array, right: Uint8Array): Uint8Array {\n const output = new Uint8Array(left.length + right.length);\n output.set(left);\n output.set(right, left.length);\n return output;\n}\n\nfunction equalBytes(left: Uint8Array, right: Uint8Array): boolean {\n return left.length === right.length\n && left.every((value, index) => value === right[index]);\n}\n\nconst SHA256_CONSTANTS = new Uint32Array([\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,\n 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\n 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,\n 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\n 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,\n 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,\n 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\n 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,\n 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\n 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,\n 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,\n 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\n 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,\n 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2,\n]);\n\nfunction sha256(input: Uint8Array): Uint8Array {\n const bitLength = input.length * 8;\n const paddedLength = Math.ceil((input.length + 9) / 64) * 64;\n const data = new Uint8Array(paddedLength);\n data.set(input);\n data[input.length] = 0x80;\n const view = new DataView(data.buffer);\n view.setUint32(paddedLength - 8, Math.floor(bitLength / 0x1_0000_0000));\n view.setUint32(paddedLength - 4, bitLength >>> 0);\n const hash = new Uint32Array([\n 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a,\n 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19,\n ]);\n const words = new Uint32Array(64);\n for (let offset = 0; offset < data.length; offset += 64) {\n for (let index = 0; index < 16; index += 1) {\n words[index] = view.getUint32(offset + index * 4);\n }\n for (let index = 16; index < 64; index += 1) {\n const s0 = rotateRight(words[index - 15]!, 7)\n ^ rotateRight(words[index - 15]!, 18)\n ^ (words[index - 15]! >>> 3);\n const s1 = rotateRight(words[index - 2]!, 17)\n ^ rotateRight(words[index - 2]!, 19)\n ^ (words[index - 2]! >>> 10);\n words[index] = (\n words[index - 16]!\n + s0\n + words[index - 7]!\n + s1\n ) >>> 0;\n }\n let [a, b, c, d, e, f, g, h] = hash;\n for (let index = 0; index < 64; index += 1) {\n const sum1 = rotateRight(e!, 6) ^ rotateRight(e!, 11) ^ rotateRight(e!, 25);\n const choice = (e! & f!) ^ (~e! & g!);\n const temp1 = (h! + sum1 + choice + SHA256_CONSTANTS[index]! + words[index]!) >>> 0;\n const sum0 = rotateRight(a!, 2) ^ rotateRight(a!, 13) ^ rotateRight(a!, 22);\n const majority = (a! & b!) ^ (a! & c!) ^ (b! & c!);\n const temp2 = (sum0 + majority) >>> 0;\n h = g;\n g = f;\n f = e;\n e = (d! + temp1) >>> 0;\n d = c;\n c = b;\n b = a;\n a = (temp1 + temp2) >>> 0;\n }\n hash[0] = (hash[0]! + a!) >>> 0;\n hash[1] = (hash[1]! + b!) >>> 0;\n hash[2] = (hash[2]! + c!) >>> 0;\n hash[3] = (hash[3]! + d!) >>> 0;\n hash[4] = (hash[4]! + e!) >>> 0;\n hash[5] = (hash[5]! + f!) >>> 0;\n hash[6] = (hash[6]! + g!) >>> 0;\n hash[7] = (hash[7]! + h!) >>> 0;\n }\n const output = new Uint8Array(32);\n const outputView = new DataView(output.buffer);\n for (let index = 0; index < hash.length; index += 1) {\n outputView.setUint32(index * 4, hash[index]!, false);\n }\n return output;\n}\n\nfunction rotateRight(value: number, bits: number): number {\n return (value >>> bits) | (value << (32 - bits));\n}\n", "import type { ICEGeometryBounds } from '@ice3/core';\nimport type {\n ICETilesetSnapshot,\n ICETilesetTile,\n} from './ICETileset.js';\n\ntype JSONRecord = Record<string, unknown>;\ntype Matrix = readonly [\n number, number, number, number,\n number, number, number, number,\n number, number, number, number,\n number, number, number, number,\n];\n\nconst IDENTITY: Matrix = [\n 1, 0, 0, 0,\n 0, 1, 0, 0,\n 0, 0, 1, 0,\n 0, 0, 0, 1,\n];\nconst Y_UP_TO_Z_UP: Matrix = [\n 1, 0, 0, 0,\n 0, 0, 1, 0,\n 0, -1, 0, 0,\n 0, 0, 0, 1,\n];\nconst Z_UP_TO_Y_UP: Matrix = [\n 1, 0, 0, 0,\n 0, 0, -1, 0,\n 0, 1, 0, 0,\n 0, 0, 0, 1,\n];\nconst EPSILON = 1e-6;\n\nexport function readTileset(\n text: string,\n baseUrl: string,\n): ICETilesetSnapshot {\n let parsed: unknown;\n try {\n parsed = JSON.parse(text);\n } catch {\n throw invalid('tileset JSON is invalid');\n }\n const document = record(parsed);\n if (!document) throw invalid('tileset root must be an object');\n const asset = record(document.asset);\n if (asset?.version !== '1.1') {\n throw unsupported('asset.version must be 1.1');\n }\n const assetId = record(record(asset.extras)?.ice3)?.assetId;\n if (typeof assetId !== 'string' || !assetId.trim()) {\n throw invalid('asset.extras.ice3.assetId is required');\n }\n if (\n Array.isArray(document.extensionsRequired)\n && document.extensionsRequired.length > 0\n ) {\n throw unsupported('required tileset extensions are not supported');\n }\n const root = record(document.root);\n if (!root) throw invalid('root tile is missing');\n const tiles: ICETilesetTile[] = [];\n const ids = new Set<string>();\n const rootTile = parseTile(\n root,\n 'root',\n new URL(baseUrl),\n IDENTITY,\n undefined,\n ids,\n tiles,\n );\n return {\n assetId,\n root: rootTile,\n bounds: rootTile.bounds,\n tiles,\n };\n}\n\nfunction parseTile(\n input: JSONRecord,\n id: string,\n baseUrl: URL,\n parentTransform: Matrix,\n inheritedRefine: 'REPLACE' | undefined,\n ids: Set<string>,\n output: ICETilesetTile[],\n): ICETilesetTile {\n if (ids.has(id)) {\n throw invalid(`duplicate tile id: ${id}`);\n }\n ids.add(id);\n if (input.region !== undefined || record(input.boundingVolume)?.region) {\n throw unsupported('region bounding volumes are not supported');\n }\n if (input.implicitTiling !== undefined) {\n throw unsupported('implicit tiling is not supported');\n }\n if (input.viewerRequestVolume !== undefined) {\n throw unsupported('viewerRequestVolume is not supported');\n }\n if (\n Array.isArray(input.extensionsRequired)\n && input.extensionsRequired.length > 0\n ) {\n throw unsupported('required tile extensions are not supported');\n }\n const localTransform = parseTransform(input.transform);\n const standardTransform = multiplyMatrices(parentTransform, localTransform);\n const bounds = parseBounds(\n record(input.boundingVolume),\n standardTransform,\n );\n const geometricError = input.geometricError;\n if (\n typeof geometricError !== 'number'\n || !Number.isFinite(geometricError)\n || geometricError < 0\n ) {\n throw invalid('geometricError must be a non-negative finite number');\n }\n const refine = input.refine === undefined ? inheritedRefine : input.refine;\n if (refine !== 'REPLACE') {\n throw unsupported('only REPLACE refinement is supported');\n }\n const content = record(input.content);\n if (content?.boundingVolume && record(content.boundingVolume)?.region) {\n throw unsupported('region content bounds are not supported');\n }\n if (content && input.contents !== undefined) {\n throw new Error(\n 'ICE3_TILESET_CONTENTS_INVALID: content and contents cannot both be present',\n );\n }\n const contentUris = input.contents === undefined\n ? content?.uri === undefined\n ? []\n : [resolveContentUri(content.uri, baseUrl)]\n : parseContents(input.contents, baseUrl);\n const contentOutputIndex = output.length;\n const childrenInput = input.children;\n if (\n childrenInput !== undefined\n && (!Array.isArray(childrenInput) || childrenInput.length === 0)\n ) {\n throw invalid('children must be a non-empty array');\n }\n const children = (childrenInput ?? []).map((value, index) => {\n const child = record(value);\n if (!child) throw invalid(`child ${index} must be an object`);\n const parsed = parseTile(\n child,\n `${id}/${index}`,\n baseUrl,\n standardTransform,\n 'REPLACE',\n ids,\n output,\n );\n assertContains(bounds, parsed.bounds, id);\n if (parsed.geometricError > geometricError) {\n throw invalid(`tile ${parsed.id} geometricError exceeds its parent`);\n }\n return parsed;\n });\n if (contentUris.length === 0 && children.length === 0) {\n throw invalid(`tile ${id} has neither content nor children`);\n }\n const engineTransform = multiplyMatrices(\n multiplyMatrices(Z_UP_TO_Y_UP, standardTransform),\n Y_UP_TO_Z_UP,\n );\n const tile: ICETilesetTile = {\n id,\n bounds,\n contentUris,\n ...(contentUris.length === 1 ? { contentUri: contentUris[0]! } : {}),\n children,\n geometricError,\n ...(isIdentity(engineTransform)\n ? {}\n : { transform: [...engineTransform] }),\n };\n if (contentUris.length > 0) output.splice(contentOutputIndex, 0, tile);\n return tile;\n}\n\nfunction parseContents(value: unknown, baseUrl: URL): readonly string[] {\n if (!Array.isArray(value) || value.length === 0) {\n throw new Error('ICE3_TILESET_CONTENTS_INVALID: contents must be non-empty');\n }\n const uris = value.map((entry, index) => {\n const item = record(entry);\n if (!item || item.uri === undefined) {\n throw new Error(\n `ICE3_TILESET_CONTENTS_INVALID: contents[${index}] has no uri`,\n );\n }\n return resolveContentUri(item.uri, baseUrl);\n });\n if (new Set(uris).size !== uris.length) {\n throw new Error('ICE3_TILESET_CONTENTS_INVALID: duplicate content uri');\n }\n return uris;\n}\n\nfunction parseBounds(\n volume: JSONRecord | undefined,\n transform: Matrix,\n): ICEGeometryBounds {\n if (!volume) throw invalid('tile boundingVolume is required');\n const hasBox = volume.box !== undefined;\n const hasSphere = volume.sphere !== undefined;\n if (hasBox === hasSphere) {\n throw unsupported('tile must use exactly one box or sphere');\n }\n if (hasBox) {\n const box = numbers(volume.box, 12);\n if (!box) throw invalid('box must contain 12 finite numbers');\n return transformTilesBounds(box, transform);\n }\n const sphere = numbers(volume.sphere, 4);\n if (!sphere) throw invalid('sphere must contain 4 finite numbers');\n const center = transformPoint(transform, sphere[0]!, sphere[1]!, sphere[2]!);\n const scale = Math.max(\n axisLength(transform, 0),\n axisLength(transform, 1),\n axisLength(transform, 2),\n );\n const radius = sphere[3]! * scale;\n if (!Number.isFinite(radius) || radius < 0) {\n throw invalid('sphere radius is invalid');\n }\n return {\n min: [center[0] - radius, center[1] - radius, center[2] - radius],\n max: [center[0] + radius, center[1] + radius, center[2] + radius],\n };\n}\n\nfunction transformTilesBounds(\n box: readonly number[],\n transform: Matrix,\n): ICEGeometryBounds {\n const center = [box[0]!, box[1]!, box[2]!] as const;\n const axes = [\n [box[3]!, box[4]!, box[5]!] as const,\n [box[6]!, box[7]!, box[8]!] as const,\n [box[9]!, box[10]!, box[11]!] as const,\n ] as const;\n const min: [number, number, number] = [Infinity, Infinity, Infinity];\n const max: [number, number, number] = [-Infinity, -Infinity, -Infinity];\n for (const x of [-1, 1]) {\n for (const y of [-1, 1]) {\n for (const z of [-1, 1]) {\n const tilesPoint = [\n center[0] + axes[0][0] * x + axes[1][0] * y + axes[2][0] * z,\n center[1] + axes[0][1] * x + axes[1][1] * y + axes[2][1] * z,\n center[2] + axes[0][2] * x + axes[1][2] * y + axes[2][2] * z,\n ] as const;\n const transformed = transformPoint(transform, ...tilesPoint);\n const point = [\n transformed[0],\n transformed[2],\n -transformed[1],\n ] as const;\n for (let axis = 0; axis < 3; axis += 1) {\n min[axis] = normalizeZero(Math.min(min[axis]!, point[axis]!));\n max[axis] = normalizeZero(Math.max(max[axis]!, point[axis]!));\n }\n }\n }\n }\n return { min, max };\n}\n\nfunction normalizeZero(value: number): number {\n return value === 0 ? 0 : value;\n}\n\nfunction resolveContentUri(value: unknown, baseUrl: URL): string {\n if (typeof value !== 'string' || !value) {\n throw invalid('content.uri must be a non-empty string');\n }\n if (/^(?:[a-z][a-z0-9+.-]*:|\\/)/i.test(value)) {\n throw unsupported('content.uri must be relative');\n }\n let resolved: URL;\n try {\n resolved = new URL(value, baseUrl);\n } catch {\n throw unsupported('content.uri cannot be resolved');\n }\n const directory = new URL('.', baseUrl);\n if (!resolved.href.startsWith(directory.href)) {\n throw unsupported('content.uri escapes the tileset directory');\n }\n if (!resolved.pathname.toLowerCase().endsWith('.glb')) {\n throw unsupported('content.uri must reference a GLB');\n }\n return resolved.href;\n}\n\nfunction parseTransform(value: unknown): Matrix {\n if (value === undefined) return IDENTITY;\n const matrix = numbers(value, 16);\n if (!matrix) throw invalid('transform must contain 16 finite numbers');\n if (\n Math.abs(matrix[3]!) > EPSILON\n || Math.abs(matrix[7]!) > EPSILON\n || Math.abs(matrix[11]!) > EPSILON\n || Math.abs(matrix[15]! - 1) > EPSILON\n ) {\n throw invalid('transform must be affine');\n }\n return matrix as unknown as Matrix;\n}\n\nfunction assertContains(\n parent: ICEGeometryBounds,\n child: ICEGeometryBounds,\n id: string,\n): void {\n if ([0, 1, 2].some((axis) => {\n const scale = Math.max(\n 1,\n Math.abs(parent.min[axis]!),\n Math.abs(parent.max[axis]!),\n Math.abs(child.min[axis]!),\n Math.abs(child.max[axis]!),\n );\n const tolerance = EPSILON * scale;\n return child.min[axis]! < parent.min[axis]! - tolerance\n || child.max[axis]! > parent.max[axis]! + tolerance;\n })) {\n throw invalid(`child bounds escape parent tile ${id}`);\n }\n}\n\nfunction multiplyMatrices(left: Matrix, right: Matrix): Matrix {\n const output = new Array<number>(16).fill(0);\n for (let column = 0; column < 4; column += 1) {\n for (let row = 0; row < 4; row += 1) {\n for (let index = 0; index < 4; index += 1) {\n const offset = column * 4 + row;\n output[offset] = (output[offset] ?? 0)\n + left[index * 4 + row]! * right[column * 4 + index]!;\n }\n }\n }\n return output as unknown as Matrix;\n}\n\nfunction transformPoint(\n matrix: Matrix,\n x: number,\n y: number,\n z: number,\n): [number, number, number] {\n return [\n matrix[0] * x + matrix[4] * y + matrix[8] * z + matrix[12],\n matrix[1] * x + matrix[5] * y + matrix[9] * z + matrix[13],\n matrix[2] * x + matrix[6] * y + matrix[10] * z + matrix[14],\n ];\n}\n\nfunction axisLength(matrix: Matrix, axis: number): number {\n return Math.hypot(\n matrix[axis * 4]!,\n matrix[axis * 4 + 1]!,\n matrix[axis * 4 + 2]!,\n );\n}\n\nfunction isIdentity(matrix: Matrix): boolean {\n return matrix.every((value, index) => (\n Math.abs(value - IDENTITY[index]!) <= EPSILON\n ));\n}\n\nfunction numbers(value: unknown, length: number): number[] | undefined {\n return Array.isArray(value)\n && value.length === length\n && value.every((item) => typeof item === 'number' && Number.isFinite(item))\n ? value as number[]\n : undefined;\n}\n\nfunction record(value: unknown): JSONRecord | undefined {\n return value && typeof value === 'object' && !Array.isArray(value)\n ? value as JSONRecord\n : undefined;\n}\n\nfunction invalid(message: string): Error {\n return new Error(`ICE3_TILESET_INVALID: ${message}`);\n}\n\nfunction unsupported(message: string): Error {\n return new Error(`ICE3_TILESET_UNSUPPORTED: ${message}`);\n}\n", "import type {\n ICEPreparedAssetSnapshot,\n ICEPreparedContract,\n ICEPreparedStats,\n} from '@ice3/assets';\nimport {\n readPreparedGLB,\n verifyPreparedGLBIntegrity,\n} from '@ice3/assets';\nimport type { ICEGeometryBounds, ICEScene } from '@ice3/core';\nimport type { ICE3 } from '../ICE3.js';\nimport { buildAssetScene } from './ICEAssetSceneBuilder.js';\n\nexport interface ICEAssetLoaderOptions {\n readonly fetch?: typeof globalThis.fetch;\n readonly verifyIntegrity?: boolean;\n}\n\nexport interface ICEAssetLoadOptions {\n readonly signal?: AbortSignal;\n}\n\nexport interface ICEAssetHandle {\n readonly id: string;\n readonly scene: ICEScene;\n readonly bounds: ICEGeometryBounds;\n readonly stats: ICEPreparedStats;\n readonly contract: ICEPreparedContract;\n dispose(): void;\n}\n\nexport class ICEAssetLoader {\n private readonly fetcher: typeof globalThis.fetch;\n private readonly verifyIntegrity: boolean;\n private readonly legacyWarnings = new Set<string>();\n private readonly cache = new Map<string, Promise<{\n readonly bytes: ArrayBuffer;\n readonly snapshot: ICEPreparedAssetSnapshot;\n }>>();\n\n constructor(\n private readonly engine: ICE3,\n options: ICEAssetLoaderOptions = {},\n ) {\n this.fetcher = options.fetch ?? globalThis.fetch.bind(globalThis);\n this.verifyIntegrity = options.verifyIntegrity ?? false;\n }\n\n async load(\n url: string,\n options: ICEAssetLoadOptions = {},\n ): Promise<ICEAssetHandle> {\n assertNotAborted(options.signal);\n let pending = this.cache.get(url);\n if (!pending) {\n pending = this.fetchSnapshot(url);\n this.cache.set(url, pending);\n pending.catch(() => {\n if (this.cache.get(url) === pending) {\n this.cache.delete(url);\n }\n });\n }\n const cached = await awaitWithAbort(pending, options.signal);\n assertNotAborted(options.signal);\n if (\n cached.snapshot.contract.status === 'legacy'\n && !this.legacyWarnings.has(url)\n ) {\n this.legacyWarnings.add(url);\n this.engine.reportDiagnostic(\n 'ICE3_ASSET_CONTRACT_MISSING',\n 'Prepared asset has no collaboration contract; using legacy statistics',\n 'warning',\n );\n }\n if (\n this.verifyIntegrity\n && !await verifyPreparedGLBIntegrity(cached.bytes)\n ) {\n throw new Error('ICE3_ASSET_INTEGRITY_FAILED: BIN digest does not match');\n }\n assertNotAborted(options.signal);\n const built = buildAssetScene(cached.snapshot);\n let disposed = false;\n return {\n id: cached.snapshot.assetId,\n scene: built.scene,\n bounds: built.bounds,\n stats: built.stats,\n contract: cached.snapshot.contract,\n dispose: () => {\n if (disposed) return;\n disposed = true;\n built.scene.dispose();\n this.engine.requestRender('asset-disposed');\n },\n };\n }\n\n clear(url?: string): void {\n if (url === undefined) {\n this.cache.clear();\n this.legacyWarnings.clear();\n return;\n }\n this.cache.delete(url);\n this.legacyWarnings.delete(url);\n }\n\n private async fetchSnapshot(\n url: string,\n ): Promise<{\n readonly bytes: ArrayBuffer;\n readonly snapshot: ICEPreparedAssetSnapshot;\n }> {\n let response: Response;\n try {\n response = await this.fetcher(url);\n } catch (error) {\n throw new Error(\n `ICE3_ASSET_FETCH_FAILED: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n if (!response.ok) {\n throw new Error(`ICE3_ASSET_FETCH_FAILED: HTTP ${response.status}`);\n }\n const bytes = await response.arrayBuffer();\n // glTF resolves external resources relative to the referencing file, so the\n // asset URL is the base for every texture image.\n const snapshot = readPreparedGLB(bytes, { baseUrl: url });\n return { bytes, snapshot };\n }\n}\n\nfunction assertNotAborted(signal?: AbortSignal): void {\n if (signal?.aborted) {\n throw abortedError();\n }\n}\n\nasync function awaitWithAbort<T>(\n promise: Promise<T>,\n signal?: AbortSignal,\n): Promise<T> {\n if (!signal) return promise;\n assertNotAborted(signal);\n return new Promise<T>((resolve, reject) => {\n const abort = (): void => reject(abortedError());\n signal.addEventListener('abort', abort, { once: true });\n void promise.then(resolve, reject).finally(() => {\n signal.removeEventListener('abort', abort);\n });\n });\n}\n\nfunction abortedError(): Error {\n return new Error('ICE3_ASSET_ABORTED: asset loading was aborted');\n}\n", "import {\n ICEFrustum,\n type ICEGeometryBounds,\n type ICEPerspectiveCamera,\n} from '@ice3/core';\nimport type { ICETilesetTile } from '@ice3/assets';\nimport type { ICEViewport } from '@ice3/renderer';\n\nexport interface ICETilesetSchedulerOptions {\n readonly maxResidentTiles: number;\n readonly maxResidentBytes: number;\n readonly prefetchMarginRatio: number;\n readonly unloadMarginRatio: number;\n}\n\nexport interface ICETilesetWorkSetInput {\n readonly assetBounds: ICEGeometryBounds;\n readonly tiles: readonly ICETilesetTile[];\n readonly camera: ICEPerspectiveCamera;\n readonly viewport: ICEViewport;\n readonly residentBytes: ReadonlyMap<string, number>;\n}\n\nexport interface ICETilesetWorkSet {\n readonly visible: readonly ICETilesetTile[];\n readonly prefetch: readonly ICETilesetTile[];\n readonly retainIds: ReadonlySet<string>;\n readonly ordered: readonly ICETilesetTile[];\n readonly budgetExceeded: boolean;\n}\n\nexport class ICETilesetScheduler {\n private readonly maxResidentTiles: number;\n private readonly maxResidentBytes: number;\n private readonly prefetchMarginRatio: number;\n private readonly unloadMarginRatio: number;\n\n constructor(options: ICETilesetSchedulerOptions) {\n if (\n !Number.isInteger(options.maxResidentTiles)\n || options.maxResidentTiles < 1\n ) {\n throw new RangeError('ICE maxResidentTiles must be a positive integer');\n }\n if (\n !Number.isFinite(options.maxResidentBytes)\n || options.maxResidentBytes <= 0\n ) {\n throw new RangeError('ICE maxResidentBytes must be positive');\n }\n if (\n !Number.isFinite(options.prefetchMarginRatio)\n || options.prefetchMarginRatio <= 0\n || !Number.isFinite(options.unloadMarginRatio)\n || options.unloadMarginRatio <= options.prefetchMarginRatio\n ) {\n throw new RangeError('ICE tile margin ratios are invalid');\n }\n this.maxResidentTiles = options.maxResidentTiles;\n this.maxResidentBytes = options.maxResidentBytes;\n this.prefetchMarginRatio = options.prefetchMarginRatio;\n this.unloadMarginRatio = options.unloadMarginRatio;\n }\n\n get residentTileLimit(): number {\n return this.maxResidentTiles;\n }\n\n get residentByteLimit(): number {\n return this.maxResidentBytes;\n }\n\n update(input: ICETilesetWorkSetInput): ICETilesetWorkSet {\n const aspect = input.viewport.width / Math.max(1, input.viewport.height);\n const viewProjection = input.camera.getViewProjectionMatrix(aspect);\n const strict = ICEFrustum.fromViewProjection(viewProjection);\n const prefetchFrustum = ICEFrustum.fromViewProjection(viewProjection);\n const unloadFrustum = ICEFrustum.fromViewProjection(viewProjection);\n const sceneRadius = Math.hypot(\n input.assetBounds.max[0] - input.assetBounds.min[0],\n input.assetBounds.max[1] - input.assetBounds.min[1],\n input.assetBounds.max[2] - input.assetBounds.min[2],\n ) / 2;\n const prefetchMargin = sceneRadius * this.prefetchMarginRatio;\n const unloadMargin = sceneRadius * this.unloadMarginRatio;\n const eye = input.camera.getPosition().toArray();\n const visible = input.tiles.filter((entry) => (\n strict.intersectsBounds(entry.bounds)\n ));\n const visibleIds = new Set(visible.map((entry) => entry.id));\n const prefetch = input.tiles.filter((entry) => (\n !visibleIds.has(entry.id)\n && prefetchFrustum.intersectsBounds(entry.bounds, prefetchMargin)\n ));\n const retainIds = new Set(\n input.tiles\n .filter((entry) => unloadFrustum.intersectsBounds(\n entry.bounds,\n unloadMargin,\n ))\n .map((entry) => entry.id),\n );\n const rank = new Map(\n visible.map((entry) => [entry.id, 0] as const),\n );\n const byPriority = (left: ICETilesetTile, right: ICETilesetTile): number => (\n (rank.get(left.id) ?? 1) - (rank.get(right.id) ?? 1)\n || distance(left, eye) - distance(right, eye)\n || left.id.localeCompare(right.id, 'en')\n );\n visible.sort(byPriority);\n prefetch.sort(byPriority);\n const byteTotal = [...input.residentBytes.values()].reduce(\n (total, bytes) => total + bytes,\n 0,\n );\n return {\n visible: Object.freeze(visible),\n prefetch: Object.freeze(prefetch),\n retainIds,\n ordered: Object.freeze([...visible, ...prefetch]),\n budgetExceeded: input.residentBytes.size > this.maxResidentTiles\n || byteTotal > this.maxResidentBytes,\n };\n }\n}\n\nfunction distance(\n tile: ICETilesetTile,\n eye: readonly number[],\n): number {\n const center = boundsCenter(tile.bounds);\n return Math.hypot(\n center[0] - eye[0]!,\n center[1] - eye[1]!,\n center[2] - eye[2]!,\n );\n}\n\nfunction boundsCenter(\n bounds: ICEGeometryBounds,\n): readonly [number, number, number] {\n return [\n (bounds.min[0] + bounds.max[0]) / 2,\n (bounds.min[1] + bounds.max[1]) / 2,\n (bounds.min[2] + bounds.max[2]) / 2,\n ];\n}\n", "import type { ICETilesetTile } from '@ice3/assets';\nimport {\n ICEFrustum,\n type ICEGeometryBounds,\n type ICEPerspectiveCamera,\n} from '@ice3/core';\nimport type { ICEViewport } from '@ice3/renderer';\n\nexport interface ICELodSelectionInput {\n readonly root: ICETilesetTile;\n readonly camera: ICEPerspectiveCamera;\n readonly viewport: ICEViewport;\n readonly residentIds: ReadonlySet<string>;\n readonly failedIds: ReadonlySet<string>;\n readonly previousTargetIds?: ReadonlySet<string>;\n readonly maxScreenSpaceErrorPixels: number;\n}\n\nexport interface ICELodSelection {\n readonly target: readonly ICETilesetTile[];\n readonly prefetch: readonly ICETilesetTile[];\n readonly fallbackByTargetId: ReadonlyMap<string, string>;\n}\n\nexport class ICELodSelector {\n select(input: ICELodSelectionInput): ICELodSelection {\n if (\n !Number.isFinite(input.maxScreenSpaceErrorPixels)\n || input.maxScreenSpaceErrorPixels <= 0\n ) {\n throw new Error(\n 'ICE3_TILESET_LOD_INVALID: maxScreenSpaceErrorPixels must be positive',\n );\n }\n const aspect = input.viewport.width / Math.max(1, input.viewport.height);\n const frustum = ICEFrustum.fromViewProjection(\n input.camera.getViewProjectionMatrix(aspect),\n );\n const parentByChild = new Map<string, string>();\n const indexParents = (tile: ICETilesetTile): void => {\n for (const child of tile.children) {\n parentByChild.set(child.id, tile.id);\n indexParents(child);\n }\n };\n indexParents(input.root);\n const targets = new Map<string, ICETilesetTile>();\n const fallbackByTargetId = new Map<string, string>();\n const visit = (\n tile: ICETilesetTile,\n nearestContent?: ICETilesetTile,\n ): void => {\n if (!frustum.intersectsBounds(tile.bounds)) return;\n const hasContent = (tile.contentUris?.length ?? 0) > 0\n || Boolean(tile.contentUri);\n const contentAncestor = hasContent ? tile : nearestContent;\n const previouslyRefined = input.previousTargetIds\n ? [...input.previousTargetIds].some((id) => (\n isDescendant(id, tile.id, parentByChild)\n ))\n : false;\n const threshold = input.maxScreenSpaceErrorPixels\n * (previouslyRefined ? LOD_HYSTERESIS_RATIO : 1);\n const shouldRefine = tile.children.length > 0\n && tile.geometricError > 0\n && screenSpaceError(\n tile,\n input.camera,\n input.viewport,\n ) > threshold;\n if (shouldRefine) {\n const before = targets.size;\n for (const child of tile.children) visit(child, contentAncestor);\n if (targets.size === before && hasContent) {\n addTarget(tile, nearestContent);\n }\n return;\n }\n if (hasContent) {\n addTarget(tile, nearestContent);\n return;\n }\n for (const child of tile.children) visit(child, nearestContent);\n };\n const addTarget = (\n tile: ICETilesetTile,\n nearestContent?: ICETilesetTile,\n ): void => {\n if (input.failedIds.has(tile.id) && nearestContent) {\n targets.set(nearestContent.id, nearestContent);\n return;\n }\n targets.set(tile.id, tile);\n if (nearestContent) {\n fallbackByTargetId.set(tile.id, nearestContent.id);\n }\n };\n\n visit(input.root);\n const visibleTargets = collapseNestedTargets(input.root, targets);\n const targetIds = new Set(visibleTargets.keys());\n for (const id of [...fallbackByTargetId.keys()]) {\n if (!targetIds.has(id)) fallbackByTargetId.delete(id);\n }\n const prefetch = new Map<string, ICETilesetTile>();\n const addPrefetch = (tile: ICETilesetTile): void => {\n if (targetIds.has(tile.id) || input.residentIds.has(tile.id)) return;\n prefetch.set(tile.id, tile);\n };\n for (const tile of visibleTargets.values()) {\n for (const child of tile.children) {\n if (child.contentUris?.length > 0 || child.contentUri) {\n addPrefetch(child);\n } else {\n for (const descendant of child.children) {\n if (descendant.contentUris?.length > 0 || descendant.contentUri) {\n addPrefetch(descendant);\n }\n }\n }\n }\n }\n return {\n target: Object.freeze([...visibleTargets.values()]),\n prefetch: Object.freeze(\n [...prefetch.values()].sort((left, right) => (\n left.id.localeCompare(right.id, 'en')\n )),\n ),\n fallbackByTargetId,\n };\n }\n}\n\nconst LOD_HYSTERESIS_RATIO = 0.75;\n\nfunction collapseNestedTargets(\n root: ICETilesetTile,\n targets: ReadonlyMap<string, ICETilesetTile>,\n): Map<string, ICETilesetTile> {\n const visible = new Map<string, ICETilesetTile>();\n const visit = (tile: ICETilesetTile): void => {\n if (targets.has(tile.id)) {\n visible.set(tile.id, tile);\n return;\n }\n for (const child of tile.children) visit(child);\n };\n visit(root);\n return visible;\n}\n\nfunction isDescendant(\n candidateId: string,\n ancestorId: string,\n parentByChild: ReadonlyMap<string, string>,\n): boolean {\n let current = parentByChild.get(candidateId);\n while (current !== undefined) {\n if (current === ancestorId) return true;\n current = parentByChild.get(current);\n }\n return false;\n}\n\nfunction screenSpaceError(\n tile: ICETilesetTile,\n camera: ICEPerspectiveCamera,\n viewport: ICEViewport,\n): number {\n const distance = Math.max(\n camera.near,\n distanceToBounds(camera.getPosition().toArray(), tile.bounds),\n );\n return tile.geometricError * viewport.height / (\n 2 * distance * Math.tan(camera.fov * Math.PI / 360)\n );\n}\n\nfunction distanceToBounds(\n point: readonly number[],\n bounds: ICEGeometryBounds,\n): number {\n const delta = [0, 1, 2].map((axis) => {\n const value = point[axis]!;\n if (value < bounds.min[axis]!) return bounds.min[axis]! - value;\n if (value > bounds.max[axis]!) return value - bounds.max[axis]!;\n return 0;\n });\n return Math.hypot(delta[0]!, delta[1]!, delta[2]!);\n}\n", "import type { ICERenderBatchPlan } from './ICERenderBatchPlan.js';\n\nexport type ICERenderBatchingMode = 'asset' | 'adaptive' | 'off';\n\nexport interface ICERenderBatchingOptions {\n readonly mode: ICERenderBatchingMode;\n readonly maxWorkers?: number;\n readonly idleTaskBudgetMs?: number;\n readonly uploadBytesPerFrame?: number;\n readonly maxExtraGpuBytes?: number;\n}\n\nexport interface ICEAdaptiveBatchRequest {\n readonly cameraMoving: boolean;\n readonly generation: number;\n readonly plan: ICERenderBatchPlan;\n}\n\nexport type ICEAdaptiveBatchExecutionResult =\n | {\n readonly kind: 'completed';\n readonly estimatedBytes: number;\n }\n | {\n readonly kind: 'failed';\n readonly reason: 'worker' | 'upload';\n readonly error: unknown;\n };\n\nexport type ICEAdaptiveBatchRequestResult =\n | { readonly kind: 'disabled' }\n | { readonly kind: 'deferred' }\n | { readonly kind: 'started'; readonly generation: number }\n | {\n readonly kind: 'rejected';\n readonly reason: 'plan' | 'memory' | 'superseded' | 'busy';\n };\n\nexport interface ICEAdaptiveRenderBatchControllerOptions {\n readonly mode: ICERenderBatchingMode;\n readonly activeGeneration: number;\n readonly maxExtraGpuBytes?: number;\n readonly execute: (\n request: ICEAdaptiveBatchRequest,\n ) => Promise<ICEAdaptiveBatchExecutionResult>;\n readonly onDiagnostic?: (\n code: string,\n generation: number,\n message: string,\n ) => void;\n}\n\nexport class ICEAdaptiveRenderBatchController {\n private generation: number;\n private candidateGeneration: number | undefined;\n private readonly mode: ICERenderBatchingMode;\n private readonly maxExtraGpuBytes: number;\n private readonly execute: ICEAdaptiveRenderBatchControllerOptions['execute'];\n private readonly onDiagnostic:\n ICEAdaptiveRenderBatchControllerOptions['onDiagnostic'];\n private readonly emitted = new Set<string>();\n\n constructor(options: ICEAdaptiveRenderBatchControllerOptions) {\n this.mode = options.mode;\n this.generation = options.activeGeneration;\n this.maxExtraGpuBytes = options.maxExtraGpuBytes ?? 256 * 1024 * 1024;\n this.execute = options.execute;\n this.onDiagnostic = options.onDiagnostic;\n }\n\n get activeGeneration(): number {\n return this.generation;\n }\n\n get candidate(): number | undefined {\n return this.candidateGeneration;\n }\n\n request(request: ICEAdaptiveBatchRequest): ICEAdaptiveBatchRequestResult {\n if (this.mode !== 'adaptive') return { kind: 'disabled' };\n if (request.cameraMoving) return { kind: 'deferred' };\n if (!request.plan.accepted) {\n return { kind: 'rejected', reason: 'plan' };\n }\n if (request.generation <= this.generation) {\n return { kind: 'rejected', reason: 'superseded' };\n }\n if (this.candidateGeneration !== undefined) {\n return { kind: 'rejected', reason: 'busy' };\n }\n if (\n request.plan.estimatedBytes > this.maxExtraGpuBytes\n || request.plan.estimatedBytes > Number.MAX_SAFE_INTEGER\n ) {\n this.diagnostic(\n 'ICE3_RENDER_BATCH_MEMORY_REJECTED',\n request.generation,\n 'Adaptive render batch generation exceeds the extra GPU memory budget',\n );\n return { kind: 'rejected', reason: 'memory' };\n }\n this.candidateGeneration = request.generation;\n this.diagnostic(\n 'ICE3_RENDER_BATCH_ADAPTIVE_STARTED',\n request.generation,\n 'Adaptive render batch generation started',\n );\n void this.execute(request).then(\n (result) => this.finish(request.generation, result),\n (error: unknown) => this.finish(request.generation, {\n kind: 'failed',\n reason: 'worker',\n error,\n }),\n );\n return { kind: 'started', generation: request.generation };\n }\n\n cancel(generation: number): void {\n if (this.candidateGeneration !== generation) return;\n this.candidateGeneration = undefined;\n this.diagnostic(\n 'ICE3_RENDER_BATCH_ADAPTIVE_CANCELLED',\n generation,\n 'Adaptive render batch generation was cancelled',\n );\n }\n\n cameraMotion(): void {\n if (this.candidateGeneration !== undefined) {\n this.cancel(this.candidateGeneration);\n }\n }\n\n dispose(): void {\n if (this.candidateGeneration !== undefined) {\n const generation = this.candidateGeneration;\n this.candidateGeneration = undefined;\n this.emitted.clear();\n this.diagnostic(\n 'ICE3_RENDER_BATCH_ADAPTIVE_CANCELLED',\n generation,\n 'Adaptive render batch generation was cancelled',\n );\n }\n }\n\n private finish(\n generation: number,\n result: ICEAdaptiveBatchExecutionResult,\n ): void {\n if (this.candidateGeneration !== generation) return;\n this.candidateGeneration = undefined;\n if (result.kind === 'completed') {\n this.generation = generation;\n this.diagnostic(\n 'ICE3_RENDER_BATCH_ADAPTIVE_COMPLETED',\n generation,\n 'Adaptive render batch generation is active',\n );\n return;\n }\n this.diagnostic(\n 'ICE3_RENDER_BATCH_ADAPTIVE_FAILED',\n generation,\n `Adaptive ${result.reason} stage failed: ${\n result.error instanceof Error ? result.error.message : String(result.error)\n }`,\n );\n }\n\n private diagnostic(\n code: string,\n generation: number,\n message: string,\n ): void {\n const key = `${code}:${generation}`;\n if (this.emitted.has(key)) return;\n this.emitted.add(key);\n this.onDiagnostic?.(code, generation, message);\n }\n}\n", "import type { ICEBatchWorkerLike } from './ICEBatchWorkerPool.js';\n\nconst WORKER_SOURCE = String.raw`\nself.addEventListener('message', (event) => {\n const request = event.data;\n try {\n if (!request.sources.length) {\n self.postMessage({ type: 'built', generation: request.generation, batches: [] });\n return;\n }\n const materialKey = request.sources[0].materialKey;\n if (!materialKey || request.sources.some((source) => source.materialKey !== materialKey)) {\n throw new Error('ICE3_RENDER_BATCH_WORKER_INVALID: mixed materials');\n }\n const sources = request.sources.map((source) => ({\n id: source.id,\n positions: new Float32Array(source.positions),\n indices: new Uint32Array(source.indices),\n semanticIndices: new Uint32Array(source.semanticIndices),\n semanticIds: source.semanticIds,\n semanticNodeIds: source.semanticNodeIds,\n semanticSelectionIds: source.semanticSelectionIds,\n })).sort((left, right) => left.id.localeCompare(right.id, 'en'));\n const ids = new Set();\n const semanticIds = [];\n const semanticNodeIds = [];\n const semanticSelectionIds = [];\n const semanticBySelectionId = new Map();\n for (const source of sources) {\n if (ids.has(source.id)) throw new Error('ICE3_RENDER_BATCH_WORKER_INVALID: duplicate source');\n ids.add(source.id);\n if (\n source.positions.byteLength % 12 !== 0 ||\n source.indices.byteLength % 12 !== 0 ||\n source.semanticIndices.byteLength !== source.positions.byteLength / 3 ||\n source.semanticIds.length !== source.semanticNodeIds.length ||\n source.semanticIds.length !== source.semanticSelectionIds.length\n ) throw new Error('ICE3_RENDER_BATCH_WORKER_INVALID: source lengths');\n const vertexCount = source.positions.length / 3;\n for (const index of source.indices) if (index >= vertexCount) {\n throw new Error('ICE3_RENDER_BATCH_WORKER_INVALID: source index');\n }\n source.remap = new Uint32Array(source.semanticSelectionIds.length);\n for (let index = 0; index < source.remap.length; index += 1) {\n const selectionId = source.semanticSelectionIds[index];\n let target = semanticBySelectionId.get(selectionId);\n if (target === undefined) {\n target = semanticIds.length;\n semanticBySelectionId.set(selectionId, target);\n semanticIds.push(source.semanticIds[index]);\n semanticNodeIds.push(source.semanticNodeIds[index]);\n semanticSelectionIds.push(selectionId);\n }\n source.remap[index] = target;\n }\n for (const semantic of source.semanticIndices) {\n if (semantic >= source.semanticIds.length) {\n throw new Error('ICE3_RENDER_BATCH_WORKER_INVALID: semantic index');\n }\n }\n }\n const maxTriangles = request.maxTrianglesPerBatch;\n if (!Number.isInteger(maxTriangles) || maxTriangles < 1) {\n throw new Error('ICE3_RENDER_BATCH_WORKER_INVALID: triangle limit');\n }\n const maxBytes = request.maxBytesPerBatch;\n if (!Number.isInteger(maxBytes) || maxBytes < 28) {\n throw new Error('ICE3_RENDER_BATCH_WORKER_INVALID: byte limit');\n }\n const batches = [];\n let positions = [], indices = [], semantics = [], count = 0;\n const min = [Infinity, Infinity, Infinity], max = [-Infinity, -Infinity, -Infinity];\n const finish = () => {\n if (count === 0) return;\n batches.push({\n id: 'adaptive:' + materialKey + ':' + batches.length,\n materialKey,\n positions: new Float32Array(positions).buffer,\n indices: new Uint32Array(indices).buffer,\n semanticIndices: new Uint32Array(semantics).buffer,\n semanticIds,\n semanticNodeIds,\n semanticSelectionIds,\n bounds: { min: [...min], max: [...max] },\n triangleCount: count,\n });\n positions = []; indices = []; semantics = []; count = 0;\n min[0] = min[1] = min[2] = Infinity;\n max[0] = max[1] = max[2] = -Infinity;\n };\n for (const source of sources) {\n for (let offset = 0; offset < source.indices.length; offset += 3) {\n if (count > 0 && (count + 1 > maxTriangles || count * 28 + 28 > maxBytes)) finish();\n for (let corner = offset; corner < offset + 3; corner += 1) {\n const vertex = source.indices[corner];\n indices.push(positions.length / 3);\n const x = source.positions[vertex * 3];\n const y = source.positions[vertex * 3 + 1];\n const z = source.positions[vertex * 3 + 2];\n positions.push(x, y, z);\n semantics.push(source.remap[source.semanticIndices[vertex]]);\n min[0] = Math.min(min[0], x); min[1] = Math.min(min[1], y); min[2] = Math.min(min[2], z);\n max[0] = Math.max(max[0], x); max[1] = Math.max(max[1], y); max[2] = Math.max(max[2], z);\n }\n count += 1;\n }\n }\n finish();\n const transfer = [...new Set(batches.flatMap((batch) => [\n batch.positions, batch.indices, batch.semanticIndices,\n ]))];\n self.postMessage({\n type: 'built',\n generation: request.generation,\n batches,\n }, transfer);\n } catch (error) {\n self.postMessage({\n type: 'failed',\n generation: request.generation,\n message: error instanceof Error ? error.message : String(error),\n });\n }\n});\n`;\n\nexport function createBatchWorker(): ICEBatchWorkerLike {\n if (\n typeof Worker === 'undefined'\n || typeof Blob === 'undefined'\n || typeof URL.createObjectURL !== 'function'\n ) {\n throw new Error('ICE3_RENDER_BATCH_WORKER_UNAVAILABLE: Worker is unavailable');\n }\n const objectUrl = URL.createObjectURL(new Blob(\n [WORKER_SOURCE],\n { type: 'text/javascript' },\n ));\n try {\n const worker = new Worker(objectUrl);\n return {\n postMessage: (message, transfer) => {\n if (transfer) {\n worker.postMessage(message, transfer as Transferable[]);\n } else {\n worker.postMessage(message);\n }\n },\n addEventListener: (type, listener) => {\n worker.addEventListener(type, listener as EventListener);\n },\n removeEventListener: (type, listener) => {\n worker.removeEventListener(type, listener as EventListener);\n },\n terminate: () => {\n worker.terminate();\n URL.revokeObjectURL(objectUrl);\n },\n };\n } catch {\n URL.revokeObjectURL(objectUrl);\n throw new Error(\n 'ICE3_RENDER_BATCH_WORKER_UNAVAILABLE: Worker startup failed',\n );\n }\n}\n", "import { createBatchWorker } from './createBatchWorker.js';\nimport type {\n ICEBatchWorkerRequest,\n ICEBatchWorkerResponse,\n} from './ICEBatchWorkerProtocol.js';\n\nexport interface ICEBatchWorkerLike {\n postMessage(message: unknown, transfer?: readonly Transferable[]): void;\n addEventListener(\n type: string,\n listener: (event: MessageEvent | ErrorEvent) => void,\n ): void;\n removeEventListener(\n type: string,\n listener: (event: MessageEvent | ErrorEvent) => void,\n ): void;\n terminate(): void;\n}\n\nexport interface ICEBatchWorkerPoolOptions {\n readonly maxWorkers?: number;\n readonly workerFactory?: () => ICEBatchWorkerLike;\n}\n\ninterface WorkerJob {\n readonly id: number;\n readonly request: ICEBatchWorkerRequest;\n readonly signal: AbortSignal;\n readonly resolve: (response: ICEBatchWorkerResponse) => void;\n readonly reject: (error: unknown) => void;\n readonly abort: () => void;\n settled: boolean;\n worker?: ICEBatchWorkerLike;\n}\n\nexport class ICEBatchWorkerPool {\n private readonly maxWorkers: number;\n private readonly workerFactory: () => ICEBatchWorkerLike;\n private readonly queue: WorkerJob[] = [];\n private readonly active = new Map<number, WorkerJob>();\n private disposed = false;\n private nextJobId = 1;\n\n constructor(options: ICEBatchWorkerPoolOptions = {}) {\n const requested = options.maxWorkers ?? defaultConcurrency();\n this.maxWorkers = Number.isInteger(requested) && requested > 0\n ? requested\n : 1;\n this.workerFactory = options.workerFactory ?? createBatchWorker;\n }\n\n run(\n request: ICEBatchWorkerRequest,\n signal: AbortSignal,\n ): Promise<ICEBatchWorkerResponse> {\n if (this.disposed) {\n return Promise.resolve(failed(\n request.generation,\n 'ICE3_RENDER_BATCH_WORKER_UNAVAILABLE: worker pool is disposed',\n ));\n }\n if (signal.aborted) return Promise.reject(abortError());\n return new Promise((resolve, reject) => {\n const job: WorkerJob = {\n id: this.nextJobId,\n request,\n signal,\n resolve,\n reject,\n abort: () => this.cancel(job),\n settled: false,\n };\n this.nextJobId += 1;\n signal.addEventListener('abort', job.abort, { once: true });\n this.queue.push(job);\n this.pump();\n });\n }\n\n dispose(): void {\n if (this.disposed) return;\n this.disposed = true;\n for (const job of [...this.queue, ...this.active.values()]) {\n if (job.settled) continue;\n job.settled = true;\n job.signal.removeEventListener('abort', job.abort);\n job.worker?.terminate();\n job.reject(abortError());\n }\n this.queue.length = 0;\n this.active.clear();\n }\n\n private pump(): void {\n while (!this.disposed && this.active.size < this.maxWorkers) {\n const job = this.queue.shift();\n if (!job) return;\n if (job.settled) continue;\n this.start(job);\n }\n }\n\n private start(job: WorkerJob): void {\n let worker: ICEBatchWorkerLike;\n try {\n worker = this.workerFactory();\n } catch (error) {\n this.settle(job, failed(\n job.request.generation,\n `ICE3_RENDER_BATCH_WORKER_UNAVAILABLE: ${\n error instanceof Error ? error.message : String(error)\n }`,\n ));\n return;\n }\n job.worker = worker;\n this.active.set(job.id, job);\n const onMessage = (event: MessageEvent | ErrorEvent): void => {\n const response = (event as MessageEvent).data as\n | ICEBatchWorkerResponse\n | undefined;\n if (\n !response\n || response.generation !== job.request.generation\n ) {\n this.settle(job, failed(\n job.request.generation,\n 'ICE3_RENDER_BATCH_WORKER_FAILED: response generation is invalid',\n ));\n return;\n }\n this.settle(job, response);\n };\n const onError = (event: MessageEvent | ErrorEvent): void => {\n this.settle(job, failed(\n job.request.generation,\n `ICE3_RENDER_BATCH_WORKER_FAILED: ${\n (event as ErrorEvent).message ?? 'worker failed'\n }`,\n ));\n };\n worker.addEventListener('message', onMessage);\n worker.addEventListener('error', onError);\n const transfer = transferList(job.request);\n try {\n worker.postMessage(job.request, transfer);\n } catch (error) {\n worker.removeEventListener('message', onMessage);\n worker.removeEventListener('error', onError);\n this.settle(job, failed(\n job.request.generation,\n `ICE3_RENDER_BATCH_WORKER_FAILED: ${\n error instanceof Error ? error.message : String(error)\n }`,\n ));\n }\n }\n\n private settle(job: WorkerJob, response: ICEBatchWorkerResponse): void {\n if (job.settled) return;\n job.settled = true;\n job.signal.removeEventListener('abort', job.abort);\n job.worker?.terminate();\n const activeJob = this.active.get(job.id);\n if (activeJob === job) this.active.delete(job.id);\n job.resolve(response);\n this.pump();\n }\n\n private cancel(job: WorkerJob): void {\n if (job.settled) return;\n job.settled = true;\n job.signal.removeEventListener('abort', job.abort);\n const queuedIndex = this.queue.indexOf(job);\n if (queuedIndex >= 0) this.queue.splice(queuedIndex, 1);\n job.worker?.terminate();\n const activeJob = this.active.get(job.id);\n if (activeJob === job) this.active.delete(job.id);\n job.reject(abortError());\n this.pump();\n }\n}\n\nfunction transferList(request: ICEBatchWorkerRequest): Transferable[] {\n const buffers = new Set<ArrayBuffer>();\n for (const source of request.sources) {\n buffers.add(source.positions);\n buffers.add(source.indices);\n buffers.add(source.semanticIndices);\n }\n return [...buffers];\n}\n\nfunction failed(\n generation: number,\n message: string,\n): ICEBatchWorkerResponse {\n return { type: 'failed', generation, message };\n}\n\nfunction abortError(): DOMException {\n return new DOMException('Batch worker request was aborted', 'AbortError');\n}\n\nfunction defaultConcurrency(): number {\n return Math.min(\n 4,\n Math.max(\n 1,\n (globalThis.navigator?.hardwareConcurrency ?? 2) - 1,\n ),\n );\n}\n", "import type {\n ICERenderBatchCandidate,\n ICERenderBatchPlan,\n ICERenderBatchPlanInput,\n} from './ICERenderBatchPlan.js';\n\nconst DRAW_GAIN_MS = 0.1;\nconst WORKER_OVERHEAD_MS = 0.25;\nconst COPY_BYTES_PER_MS = 2 * 1024 * 1024;\nconst UPLOAD_BYTES_PER_MS = 1024 * 1024;\nconst MEMORY_BYTES_PER_MS = 64 * 1024 * 1024 / 0.02;\nconst MINIMUM_GAIN_MS = 0.2;\n\ninterface Candidate {\n readonly batch: ICERenderBatchCandidate;\n readonly visibleIndex: number;\n}\n\nexport class ICERenderBatchPlanner {\n plan(input: ICERenderBatchPlanInput): ICERenderBatchPlan {\n if (!validInput(input)) return rejected(input.generation);\n const visible = [...new Set(input.visibleBatchIds)];\n const visibleIndex = new Map(\n visible.map((id, index) => [id, index] as const),\n );\n const byId = new Map<string, ICERenderBatchCandidate>();\n for (const batch of input.batches) {\n if (byId.has(batch.id) || !validCandidate(batch)) {\n return rejected(input.generation);\n }\n byId.set(batch.id, batch);\n }\n const candidates: Candidate[] = [];\n for (const id of visible) {\n const batch = byId.get(id);\n if (batch) candidates.push({ batch, visibleIndex: visibleIndex.get(id)! });\n }\n candidates.sort((left, right) => (\n left.batch.materialKey.localeCompare(right.batch.materialKey, 'en')\n || left.visibleIndex - right.visibleIndex\n || left.batch.byteLength - right.batch.byteLength\n || left.batch.id.localeCompare(right.batch.id, 'en')\n ));\n if (candidates.length < 2) {\n return rejected(input.generation, candidates);\n }\n const sourceBytes = candidates.reduce(\n (total, candidate) => total + candidate.batch.byteLength,\n 0,\n );\n const candidateBytes = candidates.reduce(\n (total, candidate) => total + candidate.batch.triangleCount * 28,\n 0,\n );\n const estimatedBytes = sourceBytes + candidateBytes;\n const drawCallsSaved = candidates.length - new Set(\n candidates.map((candidate) => candidate.batch.materialKey),\n ).size;\n const estimatedGainMs = drawCallsSaved * DRAW_GAIN_MS;\n const estimatedCostMs = WORKER_OVERHEAD_MS\n + estimatedBytes / COPY_BYTES_PER_MS\n + estimatedBytes / UPLOAD_BYTES_PER_MS\n + estimatedBytes / MEMORY_BYTES_PER_MS;\n return {\n generation: input.generation,\n sourceBatchIds: candidates.map((candidate) => candidate.batch.id),\n estimatedDrawCallsSaved: drawCallsSaved,\n estimatedBytes,\n estimatedGainMs,\n estimatedCostMs,\n accepted: drawCallsSaved > 0\n && estimatedBytes <= input.maxExtraGpuBytes\n && estimatedGainMs >= MINIMUM_GAIN_MS\n && estimatedGainMs > estimatedCostMs,\n };\n }\n}\n\nfunction rejected(\n generation: number,\n candidates: readonly Candidate[] = [],\n): ICERenderBatchPlan {\n return {\n generation: Number.isInteger(generation) && generation >= 0\n ? generation\n : 0,\n sourceBatchIds: candidates.map((candidate) => candidate.batch.id),\n estimatedDrawCallsSaved: 0,\n estimatedBytes: 0,\n estimatedGainMs: 0,\n estimatedCostMs: 0,\n accepted: false,\n };\n}\n\nfunction validInput(input: ICERenderBatchPlanInput): boolean {\n return Number.isInteger(input.generation)\n && input.generation >= 0\n && Number.isFinite(input.maxExtraGpuBytes)\n && input.maxExtraGpuBytes >= 0\n && Array.isArray(input.visibleBatchIds)\n && Array.isArray(input.batches);\n}\n\nfunction validCandidate(batch: ICERenderBatchCandidate): boolean {\n return typeof batch.id === 'string'\n && batch.id.length > 0\n && typeof batch.materialKey === 'string'\n && Number.isFinite(batch.triangleCount)\n && batch.triangleCount >= 0\n && Number.isInteger(batch.byteLength)\n && batch.byteLength >= 0;\n}\n", "import {\n ICEBasicMaterial,\n ICEEventDispatcher,\n ICEIndexedGeometry,\n ICEMesh,\n ICENode,\n ICEScene,\n type ICEGeometry,\n type ICEGeometryBounds,\n type ICEMatrix4Tuple,\n type ICEPerspectiveCamera,\n} from '@ice3/core';\nimport {\n queueBatchGeneration,\n type ICEBatchGenerationHandle,\n type ICEBatchUploadBuffer,\n} from '@ice3/renderer';\nimport {\n readTileset,\n type ICETilesetSnapshot,\n type ICETilesetTile,\n} from '@ice3/assets';\nimport type { ICE3 } from '../ICE3.js';\nimport { ICEAssetLoader, type ICEAssetHandle } from './ICEAssetLoader.js';\nimport {\n ICETilesetScheduler,\n type ICETilesetWorkSet,\n} from './ICETilesetScheduler.js';\nimport {\n ICELodSelector,\n type ICELodSelection,\n} from './ICELodSelector.js';\nimport {\n ICEAdaptiveRenderBatchController,\n type ICEAdaptiveBatchExecutionResult,\n type ICEAdaptiveBatchRequest,\n type ICERenderBatchingOptions,\n} from '../batching/ICEAdaptiveRenderBatchController.js';\nimport {\n ICEBatchWorkerPool,\n} from '../batching/ICEBatchWorkerPool.js';\nimport type {\n ICEBatchWorkerOutput,\n ICEBatchWorkerSource,\n} from '../batching/ICEBatchWorkerProtocol.js';\nimport { ICERenderBatchPlanner } from '../batching/ICERenderBatchPlanner.js';\nimport { ICERenderBatch } from './ICERenderBatch.js';\n\nexport type ICETilesetTileState =\n | 'pending'\n | 'loading'\n | 'loaded'\n | 'failed'\n | 'evicted';\n\nexport interface ICETilesetStats {\n readonly total: number;\n readonly pending: number;\n readonly loading: number;\n readonly loaded: number;\n readonly failed: number;\n readonly evicted: number;\n readonly visible: number;\n readonly resident: number;\n readonly residentBytes: number;\n readonly residentContents: number;\n readonly loadingContents: number;\n readonly lod: ICELodStats;\n}\n\nexport interface ICELodStats {\n readonly target: number;\n readonly resident: number;\n readonly coarseResident: number;\n readonly fineResident: number;\n readonly transitioning: number;\n readonly fallback: number;\n readonly maxScreenSpaceErrorPixels: number;\n}\n\nexport interface ICETilesetEvent {\n readonly stats: ICETilesetStats;\n readonly tileId?: string;\n}\n\nexport interface ICETilesetLoaderOptions {\n readonly fetch?: typeof globalThis.fetch;\n readonly camera: ICEPerspectiveCamera;\n readonly maxConcurrentTiles?: number;\n readonly maxResidentTiles?: number;\n readonly maxResidentBytes?: number;\n readonly prefetchMarginRatio?: number;\n readonly unloadMarginRatio?: number;\n readonly maxCommitsPerFrame?: number;\n readonly maxScreenSpaceErrorPixels?: number;\n readonly lodSettleDelayMs?: number;\n readonly renderBatching?: ICERenderBatchingOptions;\n}\n\nexport interface ICETilesetOpenOptions {\n readonly signal?: AbortSignal;\n}\n\nexport class ICETilesetLoader {\n private readonly fetcher: typeof globalThis.fetch;\n private readonly camera: ICEPerspectiveCamera;\n private readonly maxConcurrentTiles: number;\n private readonly maxCommitsPerFrame: number;\n private readonly scheduler: ICETilesetScheduler;\n private readonly maxScreenSpaceErrorPixels: number;\n private readonly lodSettleDelayMs: number;\n private readonly renderBatching: ICERenderBatchingOptions | undefined;\n\n constructor(\n private readonly engine: ICE3,\n options: ICETilesetLoaderOptions,\n ) {\n if (!options.camera) {\n throw new Error(\n 'ICE3_TILESET_CAMERA_REQUIRED: Tileset scheduling requires a camera',\n );\n }\n this.fetcher = options.fetch ?? globalThis.fetch.bind(globalThis);\n this.camera = options.camera;\n this.maxConcurrentTiles = options.maxConcurrentTiles ?? 2;\n this.maxCommitsPerFrame = options.maxCommitsPerFrame ?? 1;\n this.maxScreenSpaceErrorPixels = options.maxScreenSpaceErrorPixels ?? 16;\n this.lodSettleDelayMs = options.lodSettleDelayMs ?? 180;\n this.renderBatching = options.renderBatching;\n if (\n options.renderBatching\n && (\n !['asset', 'adaptive', 'off'].includes(options.renderBatching.mode)\n || (\n options.renderBatching.maxWorkers !== undefined\n && (\n !Number.isInteger(options.renderBatching.maxWorkers)\n || options.renderBatching.maxWorkers < 1\n )\n )\n || (\n options.renderBatching.idleTaskBudgetMs !== undefined\n && (\n !Number.isFinite(options.renderBatching.idleTaskBudgetMs)\n || options.renderBatching.idleTaskBudgetMs < 0\n )\n )\n || (\n options.renderBatching.uploadBytesPerFrame !== undefined\n && (\n !Number.isInteger(options.renderBatching.uploadBytesPerFrame)\n || options.renderBatching.uploadBytesPerFrame < 1\n )\n )\n || (\n options.renderBatching.maxExtraGpuBytes !== undefined\n && (\n !Number.isFinite(options.renderBatching.maxExtraGpuBytes)\n || options.renderBatching.maxExtraGpuBytes < 0\n )\n )\n )\n ) {\n throw new Error(\n 'ICE3_TILESET_INVALID: adaptive batching options are invalid',\n );\n }\n if (\n !Number.isInteger(this.maxConcurrentTiles)\n || this.maxConcurrentTiles < 1\n || !Number.isInteger(this.maxCommitsPerFrame)\n || this.maxCommitsPerFrame < 1\n ) {\n throw new Error(\n 'ICE3_TILESET_INVALID: concurrency and commit limits must be positive integers',\n );\n }\n if (\n !Number.isFinite(this.maxScreenSpaceErrorPixels)\n || this.maxScreenSpaceErrorPixels <= 0\n ) {\n throw new Error(\n 'ICE3_TILESET_LOD_INVALID: maxScreenSpaceErrorPixels must be positive',\n );\n }\n if (\n !Number.isInteger(this.lodSettleDelayMs)\n || this.lodSettleDelayMs < 0\n ) {\n throw new Error(\n 'ICE3_TILESET_LOD_INVALID: lodSettleDelayMs must be a non-negative integer',\n );\n }\n this.scheduler = new ICETilesetScheduler({\n maxResidentTiles: options.maxResidentTiles ?? 64,\n maxResidentBytes: options.maxResidentBytes ?? 805_306_368,\n prefetchMarginRatio: options.prefetchMarginRatio ?? 0.20,\n unloadMarginRatio: options.unloadMarginRatio ?? 1.0,\n });\n }\n\n async open(\n url: string,\n options: ICETilesetOpenOptions = {},\n ): Promise<ICETilesetHandle> {\n throwIfAborted(options.signal);\n const absoluteUrl = typeof globalThis.location === 'undefined'\n ? url\n : new URL(url, globalThis.location.href).href;\n let response: Response;\n try {\n response = await this.fetcher(\n absoluteUrl,\n options.signal ? { signal: options.signal } : {},\n );\n } catch (error) {\n if (options.signal?.aborted) {\n throw abortedTilesetError();\n }\n throw new Error(\n `ICE3_TILESET_INVALID: Tileset request failed: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n if (!response.ok) {\n throw new Error(`ICE3_TILESET_INVALID: HTTP ${response.status}`);\n }\n throwIfAborted(options.signal);\n const text = await response.text();\n throwIfAborted(options.signal);\n const snapshot = readTileset(text, absoluteUrl);\n const handle = new ICETilesetHandle(\n this.engine,\n snapshot,\n this.camera,\n this.scheduler,\n this.fetcher,\n this.maxConcurrentTiles,\n this.maxCommitsPerFrame,\n this.maxScreenSpaceErrorPixels,\n this.lodSettleDelayMs,\n this.renderBatching,\n options.signal,\n );\n handle.start();\n return handle;\n }\n}\n\nexport class ICETilesetHandle extends ICEEventDispatcher {\n readonly scene: ICEScene;\n readonly bounds: ICEGeometryBounds;\n private readonly states = new Map<string, ICETilesetTileState>();\n private readonly tilesById = new Map<string, ICETilesetTile>();\n private readonly resident = new Map<string, ICEResidentTile>();\n private readonly candidates = new Map<string, ICETileCandidate>();\n private readonly activeIds = new Set<string>();\n private readonly prefetchIds = new Set<string>();\n private readonly failedLodFallbacks = new Set<string>();\n private readonly lodAncestorCache = new Map<\n string,\n readonly ICETilesetTile[]\n >();\n private readonly idleWaiters: ICEIdleWaiter[] = [];\n private readonly assetLoader: ICEAssetLoader;\n private readonly lodSelector = new ICELodSelector();\n private readonly abortController = new AbortController();\n private readonly readyPromise: Promise<void>;\n private readonly lodSettleDelayMs: number;\n private requestQueue: ICETilesetTile[] = [];\n private commitQueue: string[] = [];\n private workSet: ICETilesetWorkSet | undefined;\n private residentBytes = 0;\n private activeRequests = 0;\n private resolveReady!: () => void;\n private rejectReady!: (reason: unknown) => void;\n private readySettled = false;\n private started = false;\n private disposed = false;\n private removeCallerAbort: (() => void) | undefined;\n private workSetUpdateScheduled = false;\n private workSetDirty = true;\n private workSetForce = false;\n private lastSignature = '';\n private commitScheduled = false;\n private budgetWarningActive = false;\n private idleEmitted = false;\n private lodSelection: ICELodSelection | undefined;\n private lastLodTarget = '';\n private lastLodFallbacks = '';\n private cameraMoving = false;\n private lodSettleTimer: ReturnType<typeof setTimeout> | undefined;\n private motionFallbackId: string | undefined;\n private readonly adaptiveController: ICEAdaptiveRenderBatchController | undefined;\n private readonly batchWorkerPool: ICEBatchWorkerPool | undefined;\n private readonly adaptivePlanner = new ICERenderBatchPlanner();\n private readonly adaptiveUploadBytesPerFrame: number;\n private readonly adaptiveMaxExtraGpuBytes: number;\n private readonly adaptiveIdleTaskBudgetMs: number;\n private adaptiveAbortController: AbortController | undefined;\n private adaptiveUploadHandle: ICEBatchGenerationHandle | undefined;\n private adaptiveState: ICEAdaptiveSceneState | undefined;\n private adaptivePlanningSignature = '';\n private readonly renderBatchingMode: ICERenderBatchingOptions['mode'];\n private visibleCoverageIds = new Set<string>();\n\n constructor(\n private readonly engine: ICE3,\n private readonly snapshot: ICETilesetSnapshot,\n private readonly camera: ICEPerspectiveCamera,\n private readonly scheduler: ICETilesetScheduler,\n fetch: typeof globalThis.fetch,\n private readonly maxConcurrentTiles: number,\n private readonly maxCommitsPerFrame: number,\n private readonly maxScreenSpaceErrorPixels: number,\n lodSettleDelayMs: number,\n renderBatching: ICERenderBatchingOptions | undefined,\n callerSignal?: AbortSignal,\n ) {\n super();\n this.scene = new ICEScene({ id: `${snapshot.assetId}:scene` });\n this.bounds = snapshot.bounds;\n this.lodSettleDelayMs = lodSettleDelayMs;\n this.renderBatchingMode = renderBatching?.mode ?? 'asset';\n this.adaptiveUploadBytesPerFrame =\n renderBatching?.uploadBytesPerFrame ?? 8 * 1024 * 1024;\n this.adaptiveMaxExtraGpuBytes =\n renderBatching?.maxExtraGpuBytes ?? 256 * 1024 * 1024;\n this.adaptiveIdleTaskBudgetMs =\n renderBatching?.idleTaskBudgetMs ?? 4;\n if (renderBatching?.mode === 'adaptive') {\n this.batchWorkerPool = new ICEBatchWorkerPool({\n ...(renderBatching.maxWorkers === undefined\n ? {}\n : { maxWorkers: renderBatching.maxWorkers }),\n });\n this.adaptiveController = new ICEAdaptiveRenderBatchController({\n mode: 'adaptive',\n activeGeneration: 1,\n maxExtraGpuBytes: this.adaptiveMaxExtraGpuBytes,\n execute: (request) => this.executeAdaptiveBatch(request),\n onDiagnostic: (code, generation, message) => {\n this.engine.reportDiagnostic(\n code,\n `${message} (generation ${generation})`,\n 'info',\n );\n },\n });\n }\n this.assetLoader = new ICEAssetLoader(engine, {\n fetch: (input, init) => fetch(input, {\n ...(init ?? {}),\n signal: this.abortController.signal,\n }),\n });\n for (const tile of snapshot.tiles) {\n this.states.set(tile.id, 'pending');\n this.tilesById.set(tile.id, tile);\n }\n this.readyPromise = new Promise<void>((resolve, reject) => {\n this.resolveReady = resolve;\n this.rejectReady = reject;\n });\n void this.readyPromise.catch(() => {});\n if (callerSignal) {\n if (callerSignal.aborted) this.abort();\n else {\n const abort = (): void => this.abort();\n callerSignal.addEventListener('abort', abort, { once: true });\n this.removeCallerAbort = () => {\n callerSignal.removeEventListener('abort', abort);\n };\n }\n }\n }\n\n get stats(): ICETilesetStats {\n const values = [...this.states.values()];\n const targetTiles = this.lodSelection?.target ?? [];\n const coverageIds = this.lodCoverageIds(targetTiles);\n const residentCut = [...coverageIds].filter((id) => (\n this.resident.has(id)\n )).length;\n const coarseResident = [...this.resident.keys()].filter((id) => (\n (this.tilesById.get(id)?.children.length ?? 0) > 0\n )).length;\n const unavailableTargets = targetTiles.filter((tile) => (\n !this.resident.has(tile.id)\n ));\n const transitioning = this.lodNextTiles(targetTiles).length;\n const fallbacks = new Set([\n ...[...coverageIds].filter((id) => (\n unavailableTargets.some((tile) => (\n this.lodAncestorIds(tile.id).includes(id)\n ))\n )),\n ...this.failedLodFallbacks,\n ]);\n const lod = Object.freeze({\n target: this.lodSelection?.target.length ?? 0,\n resident: residentCut,\n coarseResident,\n fineResident: this.resident.size - coarseResident,\n transitioning,\n fallback: fallbacks.size,\n maxScreenSpaceErrorPixels: this.maxScreenSpaceErrorPixels,\n });\n return Object.freeze({\n total: this.states.size,\n pending: values.filter((value) => value === 'pending').length,\n loading: values.filter((value) => value === 'loading').length,\n loaded: this.resident.size,\n failed: values.filter((value) => value === 'failed').length,\n evicted: values.filter((value) => value === 'evicted').length,\n visible: this.workSet?.visible.length ?? 0,\n resident: this.resident.size,\n residentContents: [...this.resident.values()].reduce(\n (total, tile) => total + tile.contentUris.length,\n 0,\n ),\n loadingContents: [...this.states]\n .filter(([, state]) => state === 'loading')\n .reduce((total, [id]) => (\n total + (this.tilesById.get(id)?.contentUris.length ?? 0)\n ), 0),\n residentBytes: this.residentBytes,\n lod,\n });\n }\n\n get adaptiveStats(): Readonly<{\n mode: ICERenderBatchingOptions['mode'];\n activeGeneration: number;\n candidateGeneration?: number;\n adaptiveBatchCount: number;\n }> {\n const candidate = this.adaptiveController?.candidate;\n return Object.freeze({\n mode: this.renderBatchingMode,\n activeGeneration: this.adaptiveController?.activeGeneration ?? 1,\n ...(candidate === undefined ? {} : { candidateGeneration: candidate }),\n adaptiveBatchCount: this.adaptiveState?.nodes.length ?? 0,\n });\n }\n\n private lodAncestors(tileId: string): readonly ICETilesetTile[] {\n const cached = this.lodAncestorCache.get(tileId);\n if (cached) return cached;\n const search = (\n tile: ICETilesetTile,\n ancestors: readonly ICETilesetTile[],\n ): readonly ICETilesetTile[] | undefined => {\n if (tile.id === tileId) return ancestors;\n const next = tile.contentUris.length > 0\n ? [...ancestors, tile]\n : ancestors;\n for (const child of tile.children) {\n const found = search(child, next);\n if (found) return found;\n }\n return undefined;\n };\n const ancestors = search(this.snapshot.root, []) ?? [];\n this.lodAncestorCache.set(tileId, ancestors);\n return ancestors;\n }\n\n private lodAncestorIds(tileId: string): readonly string[] {\n return this.lodAncestors(tileId).map((tile) => tile.id);\n }\n\n private lodCoverageId(tile: ICETilesetTile | undefined): string | undefined {\n if (!tile) return undefined;\n if (this.resident.has(tile.id)) return tile.id;\n const residentAncestor = [...this.lodAncestors(tile.id)]\n .reverse()\n .find((ancestor) => this.resident.has(ancestor.id));\n return residentAncestor?.id;\n }\n\n private lodCoverageIds(\n targets: readonly ICETilesetTile[],\n ): Set<string> {\n return new Set(\n targets\n .map((tile) => this.lodCoverageId(tile))\n .filter((id): id is string => Boolean(id)),\n );\n }\n\n private lodNextTiles(\n targets: readonly ICETilesetTile[],\n ): ICETilesetTile[] {\n const output = new Map<string, ICETilesetTile>();\n for (const target of targets) {\n if (this.resident.has(target.id)) continue;\n const ancestors = this.lodAncestors(target.id);\n const deepestResident = ancestors.findLastIndex((tile) => (\n this.resident.has(tile.id)\n ));\n const next = [\n ...(deepestResident < 0\n ? ancestors\n : ancestors.slice(deepestResident + 1)),\n target,\n ].find((tile) => this.states.get(tile.id) !== 'failed');\n if (!next) continue;\n if (\n this.residentBudgetReached()\n && this.lodCoverageId(target)\n ) {\n continue;\n }\n output.set(next.id, next);\n }\n return [...output.values()];\n }\n\n private lodUnsettledIds(): string[] {\n const targets = (this.lodSelection?.target ?? []).filter((tile) => (\n !this.resident.has(tile.id)\n && this.states.get(tile.id) !== 'failed'\n ));\n const next = this.lodNextTiles(targets);\n if (next.length === 0) return [];\n return [...new Set([\n ...next.map((tile) => tile.id),\n ...targets.map((tile) => tile.id),\n ])];\n }\n\n private recordLodFailure(tileId: string): void {\n const coverage = this.lodCoverageId(this.tilesById.get(tileId));\n if (coverage && !this.failedLodFallbacks.has(coverage)) {\n this.failedLodFallbacks.add(coverage);\n this.engine.reportDiagnostic(\n 'ICE3_TILESET_LOD_FALLBACK',\n 'Finer Tileset content is unavailable; retaining coarse coverage',\n 'warning',\n );\n }\n }\n\n tileState(tileId: string): ICETilesetTileState | undefined {\n return this.states.get(tileId);\n }\n\n whenReady(): Promise<void> {\n return this.readyPromise;\n }\n\n whenIdle(): Promise<void> {\n const pending = new Set<string>([\n ...this.requestQueue\n .map((tile) => tile.id)\n .filter((id) => !this.prefetchIds.has(id)),\n ...this.commitQueue.filter((id) => !this.prefetchIds.has(id)),\n ...this.lodUnsettledIds(),\n ...[...this.states]\n .filter(([id, state]) => (\n !this.prefetchIds.has(id)\n && (state === 'pending' || state === 'loading')\n ))\n .map(([id]) => id),\n ]);\n if (this.cameraMoving) pending.add('@lod-settle');\n if (pending.size === 0 && !this.workSetUpdateScheduled) {\n return Promise.resolve();\n }\n return new Promise<void>((resolve) => {\n this.idleWaiters.push({ watchedIds: pending, resolve });\n });\n }\n\n dispose(): void {\n if (this.disposed) return;\n this.disposed = true;\n this.cancelAdaptiveCandidate();\n this.restoreAdaptiveScene();\n this.adaptiveController?.dispose();\n this.batchWorkerPool?.dispose();\n this.removeCallerAbort?.();\n this.removeCallerAbort = undefined;\n this.engine.off('AFTER_RENDER', this.handleAfterRender);\n if (this.lodSettleTimer !== undefined) {\n clearTimeout(this.lodSettleTimer);\n this.lodSettleTimer = undefined;\n }\n this.abortController.abort();\n for (const [id, state] of this.states) {\n if (state === 'pending' || state === 'loading') {\n this.states.set(id, 'evicted');\n }\n }\n for (const candidate of this.candidates.values()) {\n candidate.container.dispose();\n for (const uri of candidate.contentUris) this.assetLoader.clear(uri);\n }\n this.candidates.clear();\n if (!this.readySettled) {\n this.readySettled = true;\n this.rejectReady(abortedTilesetError());\n }\n for (const waiter of this.idleWaiters.splice(0)) waiter.resolve();\n for (const resident of this.resident.values()) {\n for (const geometry of resident.geometries) {\n this.engine.releaseRenderBatchGeometry(geometry);\n }\n }\n this.resident.clear();\n this.residentBytes = 0;\n const sceneIds = new Set<string>();\n collectNodeIDs(this.scene, sceneIds);\n if (this.engine.getSelection().some((id) => sceneIds.has(id))) {\n this.engine.setSelection([]);\n }\n this.scene.dispose();\n this.assetLoader.clear();\n this.removeAllListeners();\n }\n\n start(): void {\n if (this.started || this.disposed) return;\n this.started = true;\n this.engine.on('AFTER_RENDER', this.handleAfterRender);\n this.requestWorkSetUpdate();\n }\n\n private readonly handleAfterRender = (): void => {\n this.requestWorkSetUpdate();\n };\n\n private requestWorkSetUpdate(force = false): void {\n if (this.disposed) return;\n this.workSetDirty = true;\n this.workSetForce ||= force;\n if (this.workSetUpdateScheduled) return;\n this.workSetUpdateScheduled = true;\n queueMicrotask(() => {\n this.workSetUpdateScheduled = false;\n if (!this.workSetDirty || this.disposed) return;\n this.workSetDirty = false;\n this.updateWorkSet();\n });\n }\n\n private updateWorkSet(): void {\n if (this.disposed) return;\n const viewport = this.engine.getDiagnostics().viewport;\n const aspect = viewport.width / Math.max(1, viewport.height);\n const viewProjection = this.camera.getViewProjectionMatrix(aspect);\n const signature = [\n viewport.width,\n viewport.height,\n ...viewProjection.elements,\n ].join(':');\n const cameraChanged = this.lastSignature !== ''\n && signature !== this.lastSignature;\n if (signature === this.lastSignature && !this.workSetForce) {\n this.settleIdleWaiters();\n return;\n }\n this.workSetForce = false;\n this.lastSignature = signature;\n if (cameraChanged) this.enterCameraMotion();\n const previousTargetIds = new Set(\n this.lodSelection?.target.map((tile) => tile.id) ?? [],\n );\n const lodSelection = this.lodSelector.select({\n root: this.snapshot.root,\n camera: this.camera,\n viewport,\n residentIds: new Set(this.resident.keys()),\n failedIds: new Set(\n [...this.states]\n .filter(([, state]) => state === 'failed')\n .map(([id]) => id),\n ),\n previousTargetIds,\n maxScreenSpaceErrorPixels: this.maxScreenSpaceErrorPixels,\n });\n this.lodSelection = lodSelection;\n const lodTarget = lodSelection.target.map((tile) => tile.id).join('|');\n if (this.lastLodTarget && lodTarget !== this.lastLodTarget) {\n this.trigger<ICETilesetEvent>('TILESET_LOD_CHANGED', {\n stats: this.stats,\n });\n }\n this.lastLodTarget = lodTarget;\n const fallbacks = [...lodSelection.fallbackByTargetId]\n .map(([targetId, fallbackId]) => `${targetId}:${fallbackId}`)\n .join('|');\n if (fallbacks !== this.lastLodFallbacks) {\n this.trigger<ICETilesetEvent>('TILESET_LOD_FALLBACK', {\n stats: this.stats,\n });\n }\n this.lastLodFallbacks = fallbacks;\n const targetTiles = [...lodSelection.target];\n const coverageTiles = [...this.lodCoverageIds(targetTiles)]\n .map((id) => this.tilesById.get(id))\n .filter((tile): tile is ICETilesetTile => Boolean(tile));\n const nextTiles = this.lodNextTiles(targetTiles);\n const prefetchTiles = this.residentBudgetReached()\n ? []\n : [...lodSelection.prefetch];\n this.prefetchIds.clear();\n for (const tile of prefetchTiles) this.prefetchIds.add(tile.id);\n const candidateMap = new Map<string, ICETilesetTile>();\n for (const tile of [\n ...coverageTiles,\n ...nextTiles,\n ...prefetchTiles,\n ]) {\n candidateMap.set(tile.id, tile);\n }\n for (const id of this.resident.keys()) {\n const tile = this.tilesById.get(id);\n if (tile) candidateMap.set(id, tile);\n }\n const workSet = this.scheduler.update({\n assetBounds: this.bounds,\n tiles: [...candidateMap.values()],\n camera: this.camera,\n viewport,\n residentBytes: new Map(\n [...this.resident].map(([id, tile]) => [id, tile.bytes]),\n ),\n });\n this.workSet = workSet;\n this.idleEmitted = false;\n\n this.promoteReadyVisibleTargets();\n const retainingTransitionCoverage = this.cameraMoving\n || this.hasPendingVisibleTargets();\n if (!retainingTransitionCoverage) {\n for (const id of [...this.resident.keys()]) {\n if (\n !workSet.retainIds.has(id)\n && (\n (this.lodSelection?.target.length ?? 0) === 0\n || id !== this.motionFallbackId\n )\n ) {\n this.unloadTile(id);\n }\n }\n }\n for (const id of [...this.candidates.keys()]) {\n if (!workSet.retainIds.has(id)) this.discardCandidate(id);\n }\n\n if (!retainingTransitionCoverage) this.enforceResidentBudget();\n const desired = [...nextTiles, ...prefetchTiles];\n const desiredIds = new Set(desired.map((tile) => tile.id));\n const pending: ICETilesetTile[] = [];\n for (const tile of this.snapshot.tiles) {\n if (this.activeIds.has(tile.id)) {\n if (this.states.get(tile.id) !== 'failed') {\n this.states.set(\n tile.id,\n desiredIds.has(tile.id) ? 'loading' : 'evicted',\n );\n }\n continue;\n }\n if (\n this.resident.has(tile.id)\n || this.candidates.has(tile.id)\n ) {\n continue;\n }\n if (this.states.get(tile.id) === 'failed') continue;\n if (desiredIds.has(tile.id)) {\n this.states.set(tile.id, 'pending');\n pending.push(tile);\n } else {\n this.states.set(tile.id, 'evicted');\n }\n }\n for (const tileId of this.activeIds) {\n if (\n this.states.get(tileId) !== 'failed'\n && !desiredIds.has(tileId)\n && !workSet.retainIds.has(tileId)\n ) {\n this.states.set(tileId, 'evicted');\n }\n }\n const rank = new Map(\n desired.map((tile, index) => [tile.id, index] as const),\n );\n this.requestQueue = pending.sort((left, right) => (\n (rank.get(left.id) ?? Number.MAX_SAFE_INTEGER)\n - (rank.get(right.id) ?? Number.MAX_SAFE_INTEGER)\n ));\n this.commitQueue.sort((left, right) => (\n (rank.get(left) ?? Number.MAX_SAFE_INTEGER)\n - (rank.get(right) ?? Number.MAX_SAFE_INTEGER)\n ));\n this.pumpRequests();\n this.scheduleCommit();\n this.updateBudgetWarning();\n this.settleIdleWaiters();\n }\n\n private pumpRequests(): void {\n if (this.disposed) return;\n while (\n this.activeRequests < this.maxConcurrentTiles\n && this.requestQueue.length > 0\n ) {\n const tile = this.requestQueue.shift()!;\n if (this.states.get(tile.id) !== 'pending') continue;\n const visible = this.workSet?.visible.some(\n (entry) => entry.id === tile.id,\n ) ?? false;\n if (!visible && this.residentBudgetReached()) {\n this.states.set(tile.id, 'evicted');\n continue;\n }\n this.activeIds.add(tile.id);\n this.activeRequests += 1;\n this.states.set(tile.id, 'loading');\n this.emit('TILESET_TILE_LOADING', tile.id);\n void this.loadTile(tile).finally(() => {\n this.activeIds.delete(tile.id);\n this.activeRequests -= 1;\n this.pumpRequests();\n this.settleIdleWaiters();\n });\n }\n }\n\n private async loadTile(tile: ICETilesetTile): Promise<void> {\n const loadedHandles: ICEAssetHandle[] = [];\n try {\n if (tile.contentUris.length === 0) {\n throw new Error('tile has no content URI');\n }\n const container = new ICENode({\n id: `${this.snapshot.assetId}:tile:${tile.id}`,\n ...(tile.transform\n ? { matrix: tile.transform as ICEMatrix4Tuple }\n : {}),\n });\n let bytes = 0;\n for (const [index, uri] of tile.contentUris.entries()) {\n const loaded = await this.assetLoader.load(uri, {\n signal: this.abortController.signal,\n });\n loadedHandles.push(loaded);\n if (this.disposed || !this.workSet?.retainIds.has(tile.id)) {\n for (const handle of loadedHandles) handle.dispose();\n for (const contentUri of tile.contentUris) {\n this.assetLoader.clear(contentUri);\n }\n container.dispose();\n if (!this.disposed) this.states.set(tile.id, 'evicted');\n return;\n }\n bytes += estimateSceneBytes(loaded.scene);\n const chunk = new ICENode({ id: `${container.id}:content:${index}` });\n for (const child of [...loaded.scene.children]) chunk.addChild(child);\n container.addChild(chunk);\n loaded.dispose();\n }\n this.candidates.set(tile.id, {\n tile,\n container,\n bytes,\n contentUris: tile.contentUris,\n });\n this.commitQueue.push(tile.id);\n this.scheduleCommit();\n this.settleIdleWaiters();\n } catch (error) {\n for (const handle of loadedHandles) handle.dispose();\n for (const uri of tile.contentUris) this.assetLoader.clear(uri);\n if (this.disposed || isAbortError(error)) return;\n if (!this.workSet?.retainIds.has(tile.id)) {\n this.states.set(tile.id, 'evicted');\n return;\n }\n this.states.set(tile.id, 'failed');\n if (this.prefetchIds.has(tile.id)) {\n this.states.set(tile.id, 'evicted');\n return;\n }\n this.engine.reportDiagnostic(\n 'ICE3_TILESET_TILE_FAILED',\n error instanceof Error ? error.message : String(error),\n );\n this.emit('TILESET_TILE_FAILED', tile.id);\n this.recordLodFailure(tile.id);\n this.rejectReadyIfVisibleSetFailed();\n this.requestWorkSetUpdate(true);\n this.settleIdleWaiters();\n }\n }\n\n private scheduleCommit(): void {\n if (\n this.disposed\n || this.commitScheduled\n || this.commitQueue.length === 0\n ) {\n return;\n }\n this.commitScheduled = true;\n requestFrame(() => {\n this.commitScheduled = false;\n if (this.disposed) return;\n this.commitBatch();\n });\n }\n\n private commitBatch(): void {\n let committed = 0;\n while (\n committed < this.maxCommitsPerFrame\n && this.commitQueue.length > 0\n ) {\n const tileId = this.commitQueue.shift()!;\n const candidate = this.candidates.get(tileId);\n if (!candidate) continue;\n this.candidates.delete(tileId);\n if (!this.workSet?.retainIds.has(tileId)) {\n this.discardCandidateRecord(candidate);\n this.states.set(tileId, 'evicted');\n continue;\n }\n const visible = this.workSet.visible.some(\n (tile) => tile.id === tileId,\n );\n if (!visible && !this.canCommitWithinBudget(candidate)) {\n this.discardCandidateRecord(candidate);\n this.states.set(tileId, 'evicted');\n continue;\n }\n committed += 1;\n const preparedGeometries: ICEGeometry[] = [];\n try {\n this.cancelAdaptiveCandidate();\n this.restoreAdaptiveScene();\n if (this.scene.findByID(candidate.container.id)) {\n throw new Error(`ICE3_TILESET_DUPLICATE_ID: ${candidate.container.id}`);\n }\n for (const geometry of collectNodeGeometries(candidate.container)) {\n this.engine.prepareRenderBatchGeometry(geometry);\n preparedGeometries.push(geometry);\n }\n candidate.container.visible = false;\n this.scene.addChild(candidate.container);\n this.resident.set(tileId, {\n tile: candidate.tile,\n container: candidate.container,\n bytes: candidate.bytes,\n contentUris: candidate.contentUris,\n geometries: preparedGeometries,\n });\n this.residentBytes += candidate.bytes;\n this.states.set(tileId, 'loaded');\n this.emit('TILESET_TILE_LOADED', tileId);\n } catch (error) {\n for (const geometry of preparedGeometries) {\n this.engine.releaseRenderBatchGeometry(geometry);\n }\n candidate.container.dispose();\n for (const uri of candidate.contentUris) this.assetLoader.clear(uri);\n this.states.set(tileId, 'failed');\n this.engine.reportDiagnostic(\n 'ICE3_TILESET_TILE_FAILED',\n error instanceof Error ? error.message : String(error),\n );\n this.emit('TILESET_TILE_FAILED', tileId);\n this.rejectReadyIfVisibleSetFailed();\n }\n }\n if (!this.cameraMoving) this.promoteReadyVisibleTargets();\n if (this.lodSelection) this.requestWorkSetUpdate(true);\n if (!this.cameraMoving && !this.hasPendingVisibleTargets()) {\n this.enforceResidentBudget();\n }\n this.updateBudgetWarning();\n this.scheduleCommit();\n this.settleIdleWaiters();\n }\n\n private discardCandidate(tileId: string): void {\n const candidate = this.candidates.get(tileId);\n if (!candidate) return;\n this.candidates.delete(tileId);\n this.commitQueue = this.commitQueue.filter((id) => id !== tileId);\n this.discardCandidateRecord(candidate);\n this.states.set(tileId, 'evicted');\n }\n\n private discardCandidateRecord(candidate: ICETileCandidate): void {\n candidate.container.dispose();\n for (const uri of candidate.contentUris) this.assetLoader.clear(uri);\n }\n\n private unloadTile(tileId: string): void {\n this.cancelAdaptiveCandidate();\n this.restoreAdaptiveScene();\n const record = this.resident.get(tileId);\n if (!record) return;\n this.scene.removeChild(record.container, { dispose: true });\n for (const geometry of record.geometries) {\n this.engine.releaseRenderBatchGeometry(geometry);\n }\n this.resident.delete(tileId);\n this.residentBytes = Math.max(0, this.residentBytes - record.bytes);\n for (const uri of record.contentUris) this.assetLoader.clear(uri);\n this.states.set(tileId, 'evicted');\n this.emit('TILESET_TILE_UNLOADED', tileId);\n this.engine.requestRender('tileset-tile-unloaded');\n }\n\n private hasPendingVisibleTargets(): boolean {\n return (this.lodSelection?.target ?? []).some((tile) => (\n !this.resident.has(tile.id)\n ));\n }\n\n private enterCameraMotion(): void {\n this.cancelAdaptiveCandidate();\n this.restoreAdaptiveScene();\n if (this.lodSettleDelayMs === 0) {\n this.cameraMoving = false;\n this.requestWorkSetUpdate(true);\n return;\n }\n if (!this.cameraMoving) {\n this.cameraMoving = true;\n }\n if (this.lodSettleTimer !== undefined) {\n clearTimeout(this.lodSettleTimer);\n }\n this.lodSettleTimer = setTimeout(() => {\n this.lodSettleTimer = undefined;\n if (this.disposed) return;\n this.cameraMoving = false;\n this.requestWorkSetUpdate(true);\n }, this.lodSettleDelayMs);\n }\n\n private promoteReadyVisibleTargets(): void {\n const targets = (this.lodSelection?.target ?? []).filter((target) => (\n !this.cameraMoving\n || ![...this.visibleCoverageIds].some((visibleId) => (\n visibleId === target.id\n || this.lodAncestorIds(target.id).includes(visibleId)\n || this.lodAncestorIds(visibleId).includes(target.id)\n ))\n ));\n const targetIds = this.lodReadyVisibleCoverage(targets);\n for (const tileId of this.visibleCoverageIds) {\n if (\n !this.resident.has(tileId)\n || !this.workSet?.retainIds.has(tileId)\n ) {\n continue;\n }\n const relatedToTarget = [...targetIds].some((id) => (\n id === tileId\n || this.lodAncestorIds(id).includes(tileId)\n ));\n const coveredByTargetAncestor = this.lodAncestorIds(tileId)\n .some((id) => targetIds.has(id));\n if (!relatedToTarget && !coveredByTargetAncestor) {\n targetIds.add(tileId);\n }\n }\n if (targetIds.size === 0) return;\n const fallbackIds = new Set(\n [...(this.lodSelection?.fallbackByTargetId.values() ?? [])]\n .filter((id) => this.resident.has(id)),\n );\n this.motionFallbackId = fallbackIds.values().next().value;\n for (const [tileId, resident] of this.resident) {\n resident.container.visible = targetIds.has(tileId);\n }\n for (const tileId of targetIds) {\n const fallbackId = this.lodSelection?.fallbackByTargetId.get(tileId);\n if (fallbackId) this.failedLodFallbacks.delete(fallbackId);\n }\n this.visibleCoverageIds = targetIds;\n this.engine.requestRender('tileset-visible-target-committed');\n if (!this.readySettled) {\n this.readySettled = true;\n this.resolveReady();\n this.trigger<ICETilesetEvent>('TILESET_READY', {\n stats: this.stats,\n });\n }\n }\n\n private lodReadyVisibleCoverage(\n targets: readonly ICETilesetTile[],\n ): Set<string> {\n const exact = new Set<string>();\n const fallback = new Set<string>();\n for (const target of targets) {\n if (this.resident.has(target.id)) {\n exact.add(target.id);\n continue;\n }\n const coverage = this.lodCoverageId(target);\n if (coverage) fallback.add(coverage);\n }\n const visible = new Set<string>();\n for (const id of [...exact, ...fallback]) {\n const tile = this.tilesById.get(id);\n if (!tile) continue;\n const coveredByFallback = this.lodAncestors(id).some((ancestor) => (\n fallback.has(ancestor.id)\n ));\n if (!coveredByFallback) visible.add(id);\n }\n for (const id of [...visible]) {\n const coveredByDescendant = [...visible].some((candidate) => (\n candidate !== id && this.lodAncestorIds(candidate).includes(id)\n ));\n if (coveredByDescendant) visible.delete(id);\n }\n return visible;\n }\n\n private rejectReadyIfVisibleSetFailed(): void {\n if (this.readySettled || !this.workSet) return;\n const visible = this.workSet.visible;\n if (\n visible.length > 0\n && visible.every((tile) => this.states.get(tile.id) === 'failed')\n ) {\n this.readySettled = true;\n this.rejectReady(new Error('All visible Tileset partitions failed'));\n }\n }\n\n private updateBudgetWarning(): void {\n const exceeded = this.residentBudgetExceeded();\n if (exceeded && !this.budgetWarningActive) {\n this.engine.reportDiagnostic(\n 'ICE3_TILESET_RESIDENT_BUDGET_EXCEEDED',\n 'Tileset residency exceeds the soft resident budget',\n 'warning',\n );\n }\n this.budgetWarningActive = exceeded;\n }\n\n private residentBudgetReached(): boolean {\n return this.resident.size >= this.scheduler.residentTileLimit\n || this.residentBytes >= this.scheduler.residentByteLimit;\n }\n\n private residentBudgetExceeded(): boolean {\n return this.resident.size > this.scheduler.residentTileLimit\n || this.residentBytes > this.scheduler.residentByteLimit;\n }\n\n private canCommitWithinBudget(candidate: ICETileCandidate): boolean {\n return this.resident.size < this.scheduler.residentTileLimit\n && this.residentBytes + candidate.bytes\n <= this.scheduler.residentByteLimit;\n }\n\n private enforceResidentBudget(): void {\n if (!this.residentBudgetExceeded()) return;\n const visibleIds = new Set(\n this.workSet?.visible.map((tile) => tile.id) ?? [],\n );\n for (const id of [...this.resident.keys()]) {\n if (!visibleIds.has(id)) this.unloadTile(id);\n }\n for (const id of [...this.candidates.keys()]) {\n if (!visibleIds.has(id)) this.discardCandidate(id);\n }\n }\n\n private maybeStartAdaptiveBatch(): void {\n if (\n !this.adaptiveController\n || this.cameraMoving\n || this.adaptiveState\n || this.adaptivePlanningSignature === this.lastSignature\n ) {\n return;\n }\n const batches = collectAdaptiveSourceBatches(\n this.scene,\n performance.now() + this.adaptiveIdleTaskBudgetMs,\n );\n if (batches.length < 2) return;\n const plan = this.adaptivePlanner.plan({\n generation: this.adaptiveController.activeGeneration + 1,\n visibleBatchIds: batches.map((batch) => batch.id),\n batches: batches.map((batch) => ({\n id: batch.id,\n materialKey: batch.materialKey,\n triangleCount: batch.geometry.indices.length / 3,\n byteLength: geometryByteLength(batch),\n bounds: batch.geometry.getBounds(),\n })),\n maxExtraGpuBytes: this.adaptiveMaxExtraGpuBytes,\n });\n if (!plan.accepted) {\n if (plan.estimatedBytes > this.adaptiveMaxExtraGpuBytes) {\n this.engine.reportDiagnostic(\n 'ICE3_RENDER_BATCH_MEMORY_REJECTED',\n `Adaptive render batch generation exceeds the extra GPU memory budget (generation ${plan.generation})`,\n 'warning',\n );\n }\n return;\n }\n this.adaptivePlanningSignature = this.lastSignature;\n this.adaptiveController.request({\n cameraMoving: this.cameraMoving,\n generation: plan.generation,\n plan,\n });\n }\n\n private async executeAdaptiveBatch(\n request: ICEAdaptiveBatchRequest,\n ): Promise<ICEAdaptiveBatchExecutionResult> {\n if (!this.batchWorkerPool) {\n return {\n kind: 'failed',\n reason: 'worker',\n error: new Error('ICE3_RENDER_BATCH_WORKER_UNAVAILABLE'),\n };\n }\n const sourceById = new Map(\n collectAdaptiveSourceBatches(this.scene).map((batch) => [\n batch.id,\n batch,\n ] as const),\n );\n this.adaptiveAbortController?.abort();\n const controller = new AbortController();\n this.adaptiveAbortController = controller;\n const materialByKey = new Map<string, ICEBasicMaterial>();\n const groups = new Map<string, ICEBatchWorkerSource[]>();\n for (const id of request.plan.sourceBatchIds) {\n const batch = sourceById.get(id);\n if (!batch) continue;\n await yieldMainThread();\n if (controller.signal.aborted) {\n return {\n kind: 'failed',\n reason: 'worker',\n error: new DOMException('Adaptive source staging aborted', 'AbortError'),\n };\n }\n materialByKey.set(batch.materialKey, batch.material);\n const group = groups.get(batch.materialKey) ?? [];\n const source = await workerSource(batch, controller.signal);\n if (controller.signal.aborted) {\n return {\n kind: 'failed',\n reason: 'worker',\n error: new DOMException('Adaptive source staging aborted', 'AbortError'),\n };\n }\n group.push(source);\n groups.set(batch.materialKey, group);\n }\n if (groups.size === 0) {\n return {\n kind: 'failed',\n reason: 'worker',\n error: new Error('ICE3_RENDER_BATCH_ADAPTIVE_EMPTY'),\n };\n }\n let responses;\n try {\n responses = await Promise.all(\n [...groups.values()].map((sources) => this.batchWorkerPool!.run({\n type: 'build',\n generation: request.generation,\n maxTrianglesPerBatch: 500_000,\n maxBytesPerBatch: 32 * 1024 * 1024,\n sources,\n }, controller.signal)),\n );\n } catch (error) {\n if (controller.signal.aborted) {\n return { kind: 'failed', reason: 'worker', error };\n }\n return { kind: 'failed', reason: 'worker', error };\n }\n const failed = responses.find((response) => response.type === 'failed');\n if (failed?.type === 'failed') {\n return {\n kind: 'failed',\n reason: 'worker',\n error: new Error(failed.message),\n };\n }\n const outputs = responses.flatMap((response) => (\n response.type === 'built' ? response.batches : []\n ));\n const uploadBuffers = outputs.map((output) => uploadBuffer(output));\n return new Promise((resolve) => {\n let settled = false;\n const finish = (\n result: ICEAdaptiveBatchExecutionResult,\n ): void => {\n if (settled) return;\n settled = true;\n controller.signal.removeEventListener('abort', abort);\n resolve(result);\n };\n const abort = (): void => {\n this.adaptiveUploadHandle?.cancel();\n finish({\n kind: 'failed',\n reason: 'upload',\n error: new DOMException('Adaptive batch upload aborted', 'AbortError'),\n });\n };\n controller.signal.addEventListener('abort', abort, { once: true });\n this.adaptiveUploadHandle = queueBatchGeneration(uploadBuffers, {\n generation: request.generation,\n bytesPerFrame: this.adaptiveUploadBytesPerFrame,\n isCurrent: () => !controller.signal.aborted,\n upload: (buffer) => {\n const geometry = new ICEIndexedGeometry({\n id: buffer.id,\n positions: buffer.positions,\n indices: buffer.indices,\n semanticIndices: buffer.semanticIndices,\n });\n this.engine.prepareRenderBatchGeometry(geometry);\n return {\n buffer,\n geometry,\n material: materialByKey.get(buffer.materialKey)!,\n };\n },\n release: (resource) => {\n this.engine.releaseRenderBatchGeometry(\n (resource as ICEAdaptiveUploadedResource).geometry,\n );\n },\n onActivate: (_generation, resources) => {\n this.activateAdaptiveScene(\n request.generation,\n request.plan.sourceBatchIds,\n resources as readonly ICEAdaptiveUploadedResource[],\n );\n },\n onUploaded: () => {\n finish({\n kind: 'completed',\n estimatedBytes: request.plan.estimatedBytes,\n });\n },\n onFailed: (_generation, error) => {\n finish({ kind: 'failed', reason: 'upload', error });\n },\n });\n });\n }\n\n private activateAdaptiveScene(\n generation: number,\n sourceIds: readonly string[],\n resources: readonly ICEAdaptiveUploadedResource[],\n ): void {\n this.restoreAdaptiveScene();\n const sourceVisibility = new Map<ICERenderBatch, boolean>();\n const sourceNodes: ICERenderBatch[] = [];\n const adaptiveNodes = resources.map((resource, index) => (\n new ICERenderBatch({\n id: `adaptive:${generation}:${index}`,\n displayName: `adaptive-render-batch-${index}`,\n geometry: resource.geometry,\n material: resource.material,\n semanticIds: resource.buffer.semanticIds,\n semanticNodeIds: resource.buffer.semanticNodeIds,\n semanticSelectionIds: resource.buffer.semanticSelectionIds,\n materialKey: resource.buffer.materialKey,\n })\n ));\n const added: ICERenderBatch[] = [];\n try {\n for (const id of sourceIds) {\n const node = this.scene.findByID(id);\n if (!(node instanceof ICERenderBatch)) continue;\n sourceVisibility.set(node, node.visible);\n sourceNodes.push(node);\n node.visible = false;\n }\n for (const node of adaptiveNodes) {\n this.scene.addChild(node);\n added.push(node);\n }\n this.adaptiveState = {\n generation,\n nodes: adaptiveNodes,\n resources,\n sourceNodes,\n sourceVisibility,\n };\n this.engine.requestRender('adaptive-render-batch-activated');\n } catch (error) {\n for (const node of added) {\n this.scene.removeChild(node, { dispose: true });\n }\n for (const [node, visible] of sourceVisibility) {\n node.visible = visible;\n }\n this.engine.requestRender('adaptive-render-batch-restored');\n throw error;\n }\n }\n\n private restoreAdaptiveScene(): void {\n const state = this.adaptiveState;\n if (!state) return;\n this.adaptiveState = undefined;\n for (const node of state.nodes) {\n if (this.scene.findByID(node.id)) {\n this.scene.removeChild(node, { dispose: true });\n }\n }\n for (const resource of state.resources) {\n this.engine.releaseRenderBatchGeometry(resource.geometry);\n }\n for (const [node, visible] of state.sourceVisibility) {\n node.visible = visible;\n }\n this.engine.requestRender('adaptive-render-batch-restored');\n }\n\n private cancelAdaptiveCandidate(): void {\n this.adaptiveController?.cameraMotion();\n this.adaptiveAbortController?.abort();\n this.adaptivePlanningSignature = '';\n }\n\n private settleIdleWaiters(): void {\n const unsettled = new Set<string>([\n ...this.requestQueue\n .map((tile) => tile.id)\n .filter((id) => !this.prefetchIds.has(id)),\n ...this.commitQueue.filter((id) => !this.prefetchIds.has(id)),\n ...this.lodUnsettledIds(),\n ...[...this.states]\n .filter(([id, state]) => (\n !this.prefetchIds.has(id)\n && (state === 'pending' || state === 'loading')\n ))\n .map(([id]) => id),\n ]);\n if (this.cameraMoving) unsettled.add('@lod-settle');\n for (const waiter of [...this.idleWaiters]) {\n if ([...waiter.watchedIds].every((id) => !unsettled.has(id))) {\n this.idleWaiters.splice(this.idleWaiters.indexOf(waiter), 1);\n waiter.resolve();\n }\n }\n if (\n unsettled.size === 0\n && !this.idleEmitted\n && !this.workSetUpdateScheduled\n ) {\n this.maybeStartAdaptiveBatch();\n this.idleEmitted = true;\n this.trigger<ICETilesetEvent>('TILESET_IDLE', { stats: this.stats });\n }\n }\n\n private abort(): void {\n if (!this.disposed) this.dispose();\n }\n\n private emit(type: string, tileId: string): void {\n this.trigger<ICETilesetEvent>(type, {\n tileId,\n stats: this.stats,\n });\n }\n}\n\ninterface ICEResidentTile {\n readonly tile: ICETilesetTile;\n readonly container: ICENode;\n readonly bytes: number;\n readonly contentUris: readonly string[];\n readonly geometries: readonly ICEGeometry[];\n}\n\ninterface ICEAdaptiveSceneState {\n readonly generation: number;\n readonly nodes: readonly ICERenderBatch[];\n readonly resources: readonly ICEAdaptiveUploadedResource[];\n readonly sourceNodes: readonly ICERenderBatch[];\n readonly sourceVisibility: ReadonlyMap<ICERenderBatch, boolean>;\n}\n\ninterface ICEAdaptiveUploadedResource {\n readonly buffer: ICEBatchUploadBuffer;\n readonly geometry: ICEIndexedGeometry;\n readonly material: ICEBasicMaterial;\n}\n\nfunction collectAdaptiveSourceBatches(\n scene: ICEScene,\n deadline = Infinity,\n): ICERenderBatch[] {\n const output: ICERenderBatch[] = [];\n const visit = (node: ICENode, parentVisible: boolean): void => {\n if (output.length % 256 === 0 && performance.now() > deadline) return;\n const visible = parentVisible && node.visible;\n if (\n visible\n && node instanceof ICERenderBatch\n && !node.geometry.edgeIndices?.length\n && node.geometry.semanticIndices\n ) {\n output.push(node);\n }\n for (const child of node.children) visit(child, visible);\n };\n visit(scene, true);\n return output;\n}\n\nfunction geometryByteLength(batch: ICERenderBatch): number {\n return batch.geometry.positions.byteLength\n + batch.geometry.indices.byteLength\n + (batch.geometry.semanticIndices?.byteLength ?? 0);\n}\n\nasync function workerSource(\n batch: ICERenderBatch,\n signal: AbortSignal,\n): Promise<ICEBatchWorkerSource> {\n const semanticIndices = batch.geometry.semanticIndices!;\n return {\n id: batch.id,\n materialKey: batch.materialKey,\n positions: (\n await copyFloat32(batch.geometry.positions, signal)\n ).buffer as ArrayBuffer,\n indices: (\n await copyUint32(batch.geometry.indices, signal)\n ).buffer as ArrayBuffer,\n semanticIndices: (\n await copyUint32(semanticIndices, signal)\n ).buffer as ArrayBuffer,\n semanticIds: batch.semanticIds,\n semanticNodeIds: batch.semanticNodeIds,\n semanticSelectionIds: batch.semanticSelectionIds,\n };\n}\n\nasync function copyFloat32(\n source: Float32Array,\n signal: AbortSignal,\n): Promise<Float32Array> {\n const target = new Float32Array(source.length);\n for (let offset = 0; offset < source.length; offset += 262_144) {\n target.set(source.subarray(offset, offset + 262_144), offset);\n if (signal.aborted) break;\n await yieldMainThread();\n }\n return target;\n}\n\nasync function copyUint32(\n source: Uint16Array | Uint32Array,\n signal: AbortSignal,\n): Promise<Uint32Array> {\n const target = new Uint32Array(source.length);\n for (let offset = 0; offset < source.length; offset += 262_144) {\n target.set(source.subarray(offset, offset + 262_144), offset);\n if (signal.aborted) break;\n await yieldMainThread();\n }\n return target;\n}\n\nfunction uploadBuffer(\n output: ICEBatchWorkerOutput,\n): ICEBatchUploadBuffer {\n const positions = new Float32Array(output.positions);\n const indices = new Uint32Array(output.indices);\n const semanticIndices = new Uint32Array(output.semanticIndices);\n return {\n id: output.id,\n materialKey: output.materialKey,\n positions,\n indices,\n semanticIndices,\n semanticIds: output.semanticIds,\n semanticNodeIds: output.semanticNodeIds,\n semanticSelectionIds: output.semanticSelectionIds,\n bounds: output.bounds,\n triangleCount: output.triangleCount,\n byteLength: positions.byteLength\n + indices.byteLength\n + semanticIndices.byteLength,\n };\n}\n\nfunction yieldMainThread(): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, 0));\n}\n\ninterface ICETileCandidate extends Omit<\n ICEResidentTile,\n 'tile' | 'geometries'\n> {\n readonly tile: ICETilesetTile;\n}\n\ninterface ICEIdleWaiter {\n readonly watchedIds: ReadonlySet<string>;\n readonly resolve: () => void;\n}\n\nfunction requestFrame(callback: FrameRequestCallback): void {\n if (typeof globalThis.requestAnimationFrame === 'function') {\n globalThis.requestAnimationFrame(callback);\n } else {\n setTimeout(() => callback(performance.now()), 0);\n }\n}\n\nfunction estimateSceneBytes(scene: ICEScene): number {\n let total = 0;\n for (const geometry of collectNodeGeometries(scene)) {\n total += geometry.positions.byteLength;\n total += geometry.indices.byteLength;\n total += geometry.edgeIndices?.byteLength ?? 0;\n total += geometry.colors?.byteLength ?? 0;\n total += geometry.semanticIndices?.byteLength ?? 0;\n }\n return total;\n}\n\nfunction collectNodeGeometries(node: ICENode): ICEGeometry[] {\n const geometries = new Set<ICEGeometry>();\n const visit = (current: ICENode): void => {\n if (current instanceof ICEMesh) geometries.add(current.geometry);\n if (current instanceof ICERenderBatch) geometries.add(current.geometry);\n for (const child of current.children) visit(child);\n };\n visit(node);\n return [...geometries];\n}\n\nfunction collectNodeIDs(node: ICENode, output: Set<string>): void {\n output.add(node.id);\n for (const child of node.children) collectNodeIDs(child, output);\n}\n\nfunction throwIfAborted(signal?: AbortSignal): void {\n if (signal?.aborted) throw abortedTilesetError();\n}\n\nfunction isAbortError(error: unknown): boolean {\n return error instanceof DOMException && error.name === 'AbortError';\n}\n\nfunction abortedTilesetError(): Error {\n return new Error('ICE3_TILESET_ABORTED: Tileset loading was aborted');\n}\n", "import {\n applyPreviewGeometryDelta,\n parsePreviewGeometryPacket,\n type ICEPreviewGeometryPacket,\n} from '@ice3/assets';\nimport type {\n ICEGeometryBufferUpdate,\n ICEIndexedGeometry,\n ICEScene,\n} from '@ice3/core';\nimport {\n buildPreviewPacketScene,\n type ICEBuiltPreviewPacket,\n} from './ICEAssetSceneBuilder.js';\n\nexport type ICEPreviewPacketFallbackReason =\n | 'packet-unavailable'\n | 'packet-invalid'\n | 'packet-revision-mismatch';\n\nexport type ICEPreviewPacketLoadResult =\n | {\n readonly kind: 'packet';\n readonly packet: ICEPreviewGeometryPacket;\n }\n | {\n readonly kind: 'fallback';\n readonly reason: ICEPreviewPacketFallbackReason;\n };\n\nexport interface ICEPreviewPacketLoaderOptions {\n readonly fetch?: typeof fetch;\n readonly pinGeometry?: (\n geometry: ICEIndexedGeometry,\n update?: ICEGeometryBufferUpdate,\n ) => void;\n}\n\nexport class ICEPreviewPacketLoader {\n private readonly fetcher: typeof fetch;\n private readonly pinGeometry: ICEPreviewPacketLoaderOptions['pinGeometry'];\n private geometries: ReadonlyMap<string, ICEIndexedGeometry> = new Map();\n private publishedScene: ICEScene | null = null;\n\n constructor(options: ICEPreviewPacketLoaderOptions | typeof fetch = {}) {\n const normalized = typeof options === 'function'\n ? { fetch: options }\n : options;\n this.fetcher = normalized.fetch ?? globalThis.fetch.bind(globalThis);\n this.pinGeometry = normalized.pinGeometry;\n }\n\n get scene(): ICEScene | null {\n return this.publishedScene;\n }\n\n get currentGeometries(): ReadonlyMap<string, ICEIndexedGeometry> {\n return this.geometries;\n }\n\n async load(\n url: string,\n current?: ICEPreviewGeometryPacket,\n ): Promise<ICEPreviewPacketLoadResult> {\n let bytes: Uint8Array;\n try {\n const response = await this.fetcher(url, {\n headers: {\n accept: 'application/vnd.ice3.preview-geometry; version=1',\n },\n });\n if (!response.ok) {\n return { kind: 'fallback', reason: 'packet-unavailable' };\n }\n bytes = new Uint8Array(await response.arrayBuffer());\n } catch {\n return { kind: 'fallback', reason: 'packet-unavailable' };\n }\n\n let incoming: ICEPreviewGeometryPacket;\n try {\n incoming = parsePreviewGeometryPacket(bytes);\n } catch {\n return { kind: 'fallback', reason: 'packet-invalid' };\n }\n let packet = incoming;\n if (incoming.parentRevision !== null) {\n if (!current || incoming.parentRevision !== current.revision) {\n return { kind: 'fallback', reason: 'packet-revision-mismatch' };\n }\n packet = applyPreviewGeometryDelta(current, incoming);\n }\n\n let built: ICEBuiltPreviewPacket;\n try {\n built = buildPreviewPacketScene(packet, this.geometries);\n if (this.pinGeometry) {\n for (const [geometryId, update] of built.geometryUpdates) {\n const geometry = built.geometries.get(geometryId);\n if (!geometry) {\n throw new Error('ICE3_PREVIEW_PACKET_INVALID: geometry is missing');\n }\n this.pinGeometry(geometry, update);\n }\n }\n } catch {\n return { kind: 'fallback', reason: 'packet-invalid' };\n }\n\n this.geometries = built.geometries;\n this.publishedScene = built.scene;\n return { kind: 'packet', packet };\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["visit", "location", "key", "VERTEX_SOURCE", "FRAGMENT_SOURCE", "index", "normalize", "distance", "VERTEX_SOURCE", "FRAGMENT_SOURCE", "VERTEX_SOURCE", "FRAGMENT_SOURCE", "failed", "encoder", "equalNumberArrays", "equalOptionalNumberArrays", "key", "contentFingerprint", "encoder", "sameBytes", "record", "encoder", "STORAGE_USAGE", "STORAGE_USAGE", "STORAGE_USAGE", "encoder", "index", "encoder", "add", "VERTEX_USAGE", "UNIFORM_USAGE", "SELECTION_RGBA", "EDGE_PIXEL_OFFSETS", "encoder", "drawCountPowerOfTwo", "canvas", "context", "image", "normalize", "cross", "visit", "distance", "visit", "distance", "node", "distance", "visit", "assetError", "profile", "nonNegativeInteger", "document", "record", "numbers", "transformPoint", "visit", "distance", "fetch", "ancestors", "record", "failed", "visit"]
7
7
  }