@babylonjs/lite-compat 1.5.0-preview → 1.6.0-preview
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.
- package/README.md +3 -2
- package/index.d.ts +711 -0
- package/index.js +1171 -4
- package/index.js.map +1 -1
- package/package.json +4 -4
package/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/math/color.ts","../src/math/scalar.ts","../src/math/constants.ts","../src/math/plane.ts","../src/math/ray.ts","../src/math/frustum.ts","../src/math/size.ts","../src/math/curve.ts","../src/culling/bounding.ts","../src/misc/observable.ts","../src/engine/engine.ts","../src/scene/abstract-scene.ts","../src/cameras/cameras.ts","../src/materials/materials.ts","../src/animations/animation.ts","../src/scene/scene.ts","../src/lights/lights.ts","../src/meshes/csg.ts","../src/meshes/compression.ts","../src/morph/morph.ts","../src/meshes/gaussian-splatting.ts","../src/textures/textures.ts","../src/loading/loaded-mesh.ts","../src/loading/scene-loader.ts","../src/loading/assets-manager.ts","../src/loading/material-variants.ts","../src/picking/gpu-picker.ts","../src/gizmos/gizmos.ts","../src/behaviors/behaviors.ts","../src/sprites/sprites.ts","../src/shadows/shadow-generator.ts","../src/materials/node-material.ts","../src/materials/grid-material.ts","../src/animations/easing.ts","../src/misc/tools.ts","../src/misc/misc-utils.ts","../src/misc/engine-constants.ts","../src/actions/actions.ts","../src/unsupported/unsupported-apis.ts","../src/unsupported/unsupported-extended.ts"],"sourcesContent":["/**\n * Babylon.js-compatible colour classes (`Color3`, `Color4`).\n *\n * Mutable, backed by `r`/`g`/`b`/`a` fields. `asArray()` yields the tuple shape\n * (`[r, g, b]` / `[r, g, b, a]`) consumed by the Babylon Lite material and light\n * APIs.\n */\n\nexport class Color3 {\n public constructor(\n public r: number = 0,\n public g: number = 0,\n public b: number = 0\n ) {}\n\n public set(r: number, g: number, b: number): this {\n this.r = r;\n this.g = g;\n this.b = b;\n return this;\n }\n\n public copyFrom(source: Color3): this {\n this.r = source.r;\n this.g = source.g;\n this.b = source.b;\n return this;\n }\n\n public scale(scale: number): Color3 {\n return new Color3(this.r * scale, this.g * scale, this.b * scale);\n }\n\n public scaleInPlace(scale: number): this {\n this.r *= scale;\n this.g *= scale;\n this.b *= scale;\n return this;\n }\n\n public multiply(other: Color3): Color3 {\n return new Color3(this.r * other.r, this.g * other.g, this.b * other.b);\n }\n\n public add(other: Color3): Color3 {\n return new Color3(this.r + other.r, this.g + other.g, this.b + other.b);\n }\n\n public clone(): Color3 {\n return new Color3(this.r, this.g, this.b);\n }\n\n public equals(other: Color3): boolean {\n return this.r === other.r && this.g === other.g && this.b === other.b;\n }\n\n public asArray(): [number, number, number] {\n return [this.r, this.g, this.b];\n }\n\n public toColor4(alpha = 1): Color4 {\n return new Color4(this.r, this.g, this.b, alpha);\n }\n\n public toHexString(): string {\n const intR = Math.round(Math.min(Math.max(this.r, 0), 1) * 255);\n const intG = Math.round(Math.min(Math.max(this.g, 0), 1) * 255);\n const intB = Math.round(Math.min(Math.max(this.b, 0), 1) * 255);\n return \"#\" + toHex(intR) + toHex(intG) + toHex(intB);\n }\n\n public static Black(): Color3 {\n return new Color3(0, 0, 0);\n }\n\n public static White(): Color3 {\n return new Color3(1, 1, 1);\n }\n\n public static Red(): Color3 {\n return new Color3(1, 0, 0);\n }\n\n public static Green(): Color3 {\n return new Color3(0, 1, 0);\n }\n\n public static Blue(): Color3 {\n return new Color3(0, 0, 1);\n }\n\n public static FromArray(array: ArrayLike<number>, offset = 0): Color3 {\n return new Color3(array[offset] ?? 0, array[offset + 1] ?? 0, array[offset + 2] ?? 0);\n }\n\n public static FromInts(r: number, g: number, b: number): Color3 {\n return new Color3(r / 255, g / 255, b / 255);\n }\n\n public static FromHexString(hex: string): Color3 {\n if (hex.charAt(0) !== \"#\" || hex.length < 7) {\n return new Color3(0, 0, 0);\n }\n const r = parseInt(hex.substring(1, 3), 16);\n const g = parseInt(hex.substring(3, 5), 16);\n const b = parseInt(hex.substring(5, 7), 16);\n return Color3.FromInts(r, g, b);\n }\n\n public static Lerp(start: Color3, end: Color3, amount: number): Color3 {\n return new Color3(start.r + (end.r - start.r) * amount, start.g + (end.g - start.g) * amount, start.b + (end.b - start.b) * amount);\n }\n}\n\nexport class Color4 {\n public constructor(\n public r: number = 0,\n public g: number = 0,\n public b: number = 0,\n public a: number = 1\n ) {}\n\n public set(r: number, g: number, b: number, a: number): this {\n this.r = r;\n this.g = g;\n this.b = b;\n this.a = a;\n return this;\n }\n\n public copyFrom(source: Color4): this {\n this.r = source.r;\n this.g = source.g;\n this.b = source.b;\n this.a = source.a;\n return this;\n }\n\n public scale(scale: number): Color4 {\n return new Color4(this.r * scale, this.g * scale, this.b * scale, this.a * scale);\n }\n\n public add(other: Color4): Color4 {\n return new Color4(this.r + other.r, this.g + other.g, this.b + other.b, this.a + other.a);\n }\n\n public clone(): Color4 {\n return new Color4(this.r, this.g, this.b, this.a);\n }\n\n public equals(other: Color4): boolean {\n return this.r === other.r && this.g === other.g && this.b === other.b && this.a === other.a;\n }\n\n public asArray(): [number, number, number, number] {\n return [this.r, this.g, this.b, this.a];\n }\n\n public static FromArray(array: ArrayLike<number>, offset = 0): Color4 {\n return new Color4(array[offset] ?? 0, array[offset + 1] ?? 0, array[offset + 2] ?? 0, array[offset + 3] ?? 1);\n }\n\n public static FromInts(r: number, g: number, b: number, a: number): Color4 {\n return new Color4(r / 255, g / 255, b / 255, a / 255);\n }\n}\n\nfunction toHex(value: number): string {\n const hex = value.toString(16).toUpperCase();\n return hex.length === 1 ? \"0\" + hex : hex;\n}\n","/** Babylon.js-compatible scalar helpers and a small set of math constants. */\n\nexport const Epsilon = 0.001;\nexport const ToRadians = Math.PI / 180;\nexport const ToDegrees = 180 / Math.PI;\n\n/** Babylon.js `Scalar` namespace — common scalar utilities. */\nexport const Scalar = {\n Clamp(value: number, min = 0, max = 1): number {\n return Math.min(max, Math.max(min, value));\n },\n Lerp(start: number, end: number, amount: number): number {\n return start + (end - start) * amount;\n },\n InverseLerp(a: number, b: number, value: number): number {\n return a === b ? 0 : (value - a) / (b - a);\n },\n DegreesToRadians(degrees: number): number {\n return degrees * ToRadians;\n },\n RadiansToDegrees(radians: number): number {\n return radians * ToDegrees;\n },\n WithinEpsilon(a: number, b: number, epsilon = 1.401298e-45): boolean {\n return Math.abs(a - b) <= epsilon;\n },\n Normalize(value: number, min: number, max: number): number {\n return (value - min) / (max - min);\n },\n Denormalize(normalized: number, min: number, max: number): number {\n return normalized * (max - min) + min;\n },\n};\n","/** Babylon.js-compatible spatial constants (`Axis`, `Space`). */\n\nimport { Vector3 } from \"./vector.js\";\n\n// Lazily-cached axis singletons: stable identity (matching Babylon.js, where\n// `Axis.X/Y/Z` are shared constants) and no allocation until first accessed.\nlet _axisX: Vector3 | undefined;\nlet _axisY: Vector3 | undefined;\nlet _axisZ: Vector3 | undefined;\n\nexport const Axis = {\n get X(): Vector3 {\n return (_axisX ??= new Vector3(1, 0, 0));\n },\n get Y(): Vector3 {\n return (_axisY ??= new Vector3(0, 1, 0));\n },\n get Z(): Vector3 {\n return (_axisZ ??= new Vector3(0, 0, 1));\n },\n};\n\nexport enum Space {\n LOCAL = 0,\n WORLD = 1,\n BONE = 2,\n}\n","/** Babylon.js-compatible `Plane` (pure JS). */\n\nimport { Vector3 } from \"./vector.js\";\nimport type { Matrix } from \"./matrix.js\";\n\nexport class Plane {\n /** Normal x/y/z and signed distance `d` from the origin (`normal · p + d = 0`). */\n public normal: Vector3;\n public d: number;\n\n public constructor(a: number, b: number, c: number, d: number) {\n this.normal = new Vector3(a, b, c);\n this.d = d;\n }\n\n public asArray(): [number, number, number, number] {\n return [this.normal.x, this.normal.y, this.normal.z, this.d];\n }\n\n public clone(): Plane {\n return new Plane(this.normal.x, this.normal.y, this.normal.z, this.d);\n }\n\n public normalize(): this {\n const norm = Math.sqrt(this.normal.x * this.normal.x + this.normal.y * this.normal.y + this.normal.z * this.normal.z);\n const inv = norm === 0 ? 0 : 1 / norm;\n this.normal.scaleInPlace(inv);\n this.d *= inv;\n return this;\n }\n\n /** Signed distance from `point` to this plane. */\n public signedDistanceTo(point: Vector3): number {\n return Vector3.Dot(point, this.normal) + this.d;\n }\n\n public dotCoordinate(point: Vector3): number {\n return this.normal.x * point.x + this.normal.y * point.y + this.normal.z * point.z + this.d;\n }\n\n public static FromArray(array: ArrayLike<number>): Plane {\n return new Plane(array[0] ?? 0, array[1] ?? 0, array[2] ?? 0, array[3] ?? 0);\n }\n\n public static FromPositionAndNormal(origin: Vector3, normal: Vector3): Plane {\n const n = normal.clone().normalize();\n const d = -(n.x * origin.x + n.y * origin.y + n.z * origin.z);\n return new Plane(n.x, n.y, n.z, d);\n }\n\n public static FromPoints(point1: Vector3, point2: Vector3, point3: Vector3): Plane {\n const normal = Vector3.Cross(point2.subtract(point1), point3.subtract(point1)).normalize();\n return Plane.FromPositionAndNormal(point1, normal);\n }\n\n /** Transform a copy of this plane by the transpose of the inverse of `transformation`. */\n public transform(transformation: Matrix): Plane {\n // For a correct plane transform the caller passes the inverse-transpose;\n // here we apply the matrix directly to (normal, d) as a row-vector.\n const m = transformation.m;\n const x = this.normal.x;\n const y = this.normal.y;\n const z = this.normal.z;\n const d = this.d;\n const nx = x * m[0]! + y * m[1]! + z * m[2]! + d * m[3]!;\n const ny = x * m[4]! + y * m[5]! + z * m[6]! + d * m[7]!;\n const nz = x * m[8]! + y * m[9]! + z * m[10]! + d * m[11]!;\n const nd = x * m[12]! + y * m[13]! + z * m[14]! + d * m[15]!;\n return new Plane(nx, ny, nz, nd);\n }\n}\n","/** Babylon.js-compatible `Ray` (pure JS). */\n\nimport { Vector3 } from \"./vector.js\";\nimport type { Plane } from \"./plane.js\";\n\nexport class Ray {\n public origin: Vector3;\n public direction: Vector3;\n public length: number;\n\n public constructor(origin: Vector3, direction: Vector3, length: number = Number.MAX_VALUE) {\n this.origin = origin;\n this.direction = direction;\n this.length = length;\n }\n\n public clone(): Ray {\n return new Ray(this.origin.clone(), this.direction.clone(), this.length);\n }\n\n /** Distance at which this ray crosses `plane`, or `null` if parallel / behind. */\n public intersectsPlane(plane: Plane): number | null {\n const dot = Vector3.Dot(plane.normal, this.direction);\n if (Math.abs(dot) < 1e-9) {\n return null;\n }\n const t = -(Vector3.Dot(plane.normal, this.origin) + plane.d) / dot;\n return t < 0 ? null : t;\n }\n\n /** True if this ray passes within `sphereRadius` of `spherePosition`. */\n public intersectsSphere(spherePosition: Vector3, sphereRadius: number): boolean {\n const x = spherePosition.x - this.origin.x;\n const y = spherePosition.y - this.origin.y;\n const z = spherePosition.z - this.origin.z;\n const pyth = x * x + y * y + z * z;\n const rr = sphereRadius * sphereRadius;\n if (pyth <= rr) {\n return true;\n }\n const dot = x * this.direction.x + y * this.direction.y + z * this.direction.z;\n if (dot < 0) {\n return false;\n }\n const temp = pyth - dot * dot;\n return temp <= rr;\n }\n\n public static Zero(): Ray {\n return new Ray(Vector3.Zero(), new Vector3(0, 0, 1), Number.MAX_VALUE);\n }\n\n public static CreateNew(x: number, y: number, z: number, dx: number, dy: number, dz: number, length = Number.MAX_VALUE): Ray {\n return new Ray(new Vector3(x, y, z), new Vector3(dx, dy, dz), length);\n }\n}\n","/** Babylon.js-compatible `Frustum` (pure JS): extract clip planes from a matrix. */\n\nimport { Plane } from \"./plane.js\";\nimport type { Matrix } from \"./matrix.js\";\n\nexport const Frustum = {\n /** Extract the 6 frustum planes from a view-projection `transform`. */\n GetPlanes(transform: Matrix): Plane[] {\n const planes: Plane[] = [];\n for (let i = 0; i < 6; i++) {\n planes.push(new Plane(0, 0, 0, 0));\n }\n Frustum.GetPlanesToRef(transform, planes);\n return planes;\n },\n\n /** Extract the 6 frustum planes from `transform` into the supplied `planes` array. */\n GetPlanesToRef(transform: Matrix, planes: Plane[]): void {\n const m = transform.m;\n // Left\n set(planes[0]!, m[3]! + m[0]!, m[7]! + m[4]!, m[11]! + m[8]!, m[15]! + m[12]!);\n // Right\n set(planes[1]!, m[3]! - m[0]!, m[7]! - m[4]!, m[11]! - m[8]!, m[15]! - m[12]!);\n // Bottom\n set(planes[2]!, m[3]! + m[1]!, m[7]! + m[5]!, m[11]! + m[9]!, m[15]! + m[13]!);\n // Top\n set(planes[3]!, m[3]! - m[1]!, m[7]! - m[5]!, m[11]! - m[9]!, m[15]! - m[13]!);\n // Near\n set(planes[4]!, m[3]! + m[2]!, m[7]! + m[6]!, m[11]! + m[10]!, m[15]! + m[14]!);\n // Far\n set(planes[5]!, m[3]! - m[2]!, m[7]! - m[6]!, m[11]! - m[10]!, m[15]! - m[14]!);\n },\n};\n\nfunction set(plane: Plane, a: number, b: number, c: number, d: number): void {\n plane.normal.set(a, b, c);\n plane.d = d;\n plane.normalize();\n}\n","/** Babylon.js-compatible `Size` and `Viewport` (pure JS). */\n\nexport class Size {\n public constructor(\n public width: number = 0,\n public height: number = 0\n ) {}\n\n public get surface(): number {\n return this.width * this.height;\n }\n\n public clone(): Size {\n return new Size(this.width, this.height);\n }\n\n public equals(other: Size): boolean {\n return this.width === other.width && this.height === other.height;\n }\n\n public add(other: Size): Size {\n return new Size(this.width + other.width, this.height + other.height);\n }\n\n public static Zero(): Size {\n return new Size(0, 0);\n }\n}\n\nexport class Viewport {\n public constructor(\n public x: number,\n public y: number,\n public width: number,\n public height: number\n ) {}\n\n /** Resolve this normalized viewport to pixel coordinates for a render target. */\n public toGlobal(renderWidth: number, renderHeight: number): Viewport {\n return new Viewport(this.x * renderWidth, this.y * renderHeight, this.width * renderWidth, this.height * renderHeight);\n }\n\n public clone(): Viewport {\n return new Viewport(this.x, this.y, this.width, this.height);\n }\n}\n","/** Babylon.js-compatible curve/path helpers: `Angle`, `Curve3`, `Path3D` (pure JS). */\n\nimport { Vector3 } from \"./vector.js\";\n\nexport class Angle {\n public constructor(private readonly _radians: number) {}\n\n public radians(): number {\n return this._radians;\n }\n\n public degrees(): number {\n return (this._radians * 180) / Math.PI;\n }\n\n public static FromRadians(radians: number): Angle {\n return new Angle(radians);\n }\n\n public static FromDegrees(degrees: number): Angle {\n return new Angle((degrees * Math.PI) / 180);\n }\n}\n\n/** A 3D curve built from an ordered list of points. */\nexport class Curve3 {\n public constructor(private readonly _points: Vector3[]) {}\n\n public getPoints(): Vector3[] {\n return this._points;\n }\n\n /** Total polyline length along the curve points. */\n public length(): number {\n let total = 0;\n for (let i = 1; i < this._points.length; i++) {\n total += Vector3.Distance(this._points[i]!, this._points[i - 1]!);\n }\n return total;\n }\n\n /** Concatenate another curve (dropping the duplicated join point). */\n public continue(curve: Curve3): Curve3 {\n const points = this._points.slice();\n const other = curve.getPoints();\n for (let i = 1; i < other.length; i++) {\n points.push(other[i]!.clone());\n }\n return new Curve3(points);\n }\n\n /** Quadratic Bézier from `v0` → `v2` with control `v1`, sampled `nbPoints` times. */\n public static CreateQuadraticBezier(v0: Vector3, v1: Vector3, v2: Vector3, nbPoints: number): Curve3 {\n const count = Math.max(nbPoints, 2);\n const points: Vector3[] = [];\n for (let i = 0; i <= count; i++) {\n const t = i / count;\n const u = 1 - t;\n const x = u * u * v0.x + 2 * u * t * v1.x + t * t * v2.x;\n const y = u * u * v0.y + 2 * u * t * v1.y + t * t * v2.y;\n const z = u * u * v0.z + 2 * u * t * v1.z + t * t * v2.z;\n points.push(new Vector3(x, y, z));\n }\n return new Curve3(points);\n }\n\n /** Cubic Bézier from `v0` → `v3` with controls `v1`, `v2`, sampled `nbPoints` times. */\n public static CreateCubicBezier(v0: Vector3, v1: Vector3, v2: Vector3, v3: Vector3, nbPoints: number): Curve3 {\n const count = Math.max(nbPoints, 2);\n const points: Vector3[] = [];\n for (let i = 0; i <= count; i++) {\n const t = i / count;\n const u = 1 - t;\n const w0 = u * u * u;\n const w1 = 3 * u * u * t;\n const w2 = 3 * u * t * t;\n const w3 = t * t * t;\n points.push(new Vector3(w0 * v0.x + w1 * v1.x + w2 * v2.x + w3 * v3.x, w0 * v0.y + w1 * v1.y + w2 * v2.y + w3 * v3.y, w0 * v0.z + w1 * v1.z + w2 * v2.z + w3 * v3.z));\n }\n return new Curve3(points);\n }\n}\n\n/** A 3D path with cumulative-distance queries over its points. */\nexport class Path3D {\n private readonly _curve: Vector3[];\n private readonly _distances: number[] = [];\n private _length = 0;\n\n public constructor(points: Vector3[]) {\n this._curve = points.map((p) => p.clone());\n this._distances[0] = 0;\n for (let i = 1; i < this._curve.length; i++) {\n this._length += Vector3.Distance(this._curve[i]!, this._curve[i - 1]!);\n this._distances[i] = this._length;\n }\n }\n\n public getCurve(): Vector3[] {\n return this._curve;\n }\n\n public getPoints(): Vector3[] {\n return this._curve;\n }\n\n public length(): number {\n return this._length;\n }\n\n /** Distances of each point from the path start, normalized to [0, 1] when `length > 0`. */\n public getDistances(): number[] {\n return this._distances;\n }\n}\n","/**\n * Babylon.js-compatible bounding volumes (`BoundingBox`, `BoundingSphere`,\n * `BoundingInfo`) — pure JS over the compat math types.\n */\n\nimport { Vector3 } from \"../math/vector.js\";\nimport type { Matrix } from \"../math/matrix.js\";\n\nexport class BoundingSphere {\n public center: Vector3;\n public radius: number;\n public minimum: Vector3;\n public maximum: Vector3;\n\n public constructor(min: Vector3, max: Vector3) {\n this.minimum = min.clone();\n this.maximum = max.clone();\n this.center = Vector3.Lerp(min, max, 0.5);\n this.radius = max.subtract(min).length() * 0.5;\n }\n\n public intersectsPoint(point: Vector3): boolean {\n return Vector3.DistanceSquared(this.center, point) <= this.radius * this.radius;\n }\n\n public static Intersects(a: BoundingSphere, b: BoundingSphere): boolean {\n const r = a.radius + b.radius;\n return Vector3.DistanceSquared(a.center, b.center) <= r * r;\n }\n}\n\nexport class BoundingBox {\n public minimum: Vector3;\n public maximum: Vector3;\n public center: Vector3;\n public extendSize: Vector3;\n /** World-space AABB corners. Equal to `minimum`/`maximum` when the box is\n * already built in world space (as the loader's `getBoundingInfo` does). */\n public minimumWorld: Vector3;\n public maximumWorld: Vector3;\n /** The 8 corner points (min/max combinations). */\n public vectors: Vector3[];\n\n public constructor(min: Vector3, max: Vector3) {\n this.minimum = min.clone();\n this.maximum = max.clone();\n this.minimumWorld = min.clone();\n this.maximumWorld = max.clone();\n this.center = Vector3.Lerp(min, max, 0.5);\n this.extendSize = max.subtract(min).scale(0.5);\n this.vectors = [\n new Vector3(min.x, min.y, min.z),\n new Vector3(max.x, max.y, max.z),\n new Vector3(max.x, min.y, min.z),\n new Vector3(min.x, max.y, min.z),\n new Vector3(min.x, min.y, max.z),\n new Vector3(max.x, max.y, min.z),\n new Vector3(min.x, max.y, max.z),\n new Vector3(max.x, min.y, max.z),\n ];\n }\n\n public intersectsPoint(point: Vector3): boolean {\n return (\n point.x >= this.minimum.x &&\n point.x <= this.maximum.x &&\n point.y >= this.minimum.y &&\n point.y <= this.maximum.y &&\n point.z >= this.minimum.z &&\n point.z <= this.maximum.z\n );\n }\n\n public static Intersects(a: BoundingBox, b: BoundingBox): boolean {\n return (\n a.minimum.x <= b.maximum.x &&\n a.maximum.x >= b.minimum.x &&\n a.minimum.y <= b.maximum.y &&\n a.maximum.y >= b.minimum.y &&\n a.minimum.z <= b.maximum.z &&\n a.maximum.z >= b.minimum.z\n );\n }\n}\n\nexport class BoundingInfo {\n public boundingBox: BoundingBox;\n public boundingSphere: BoundingSphere;\n\n public constructor(min: Vector3, max: Vector3) {\n this.boundingBox = new BoundingBox(min, max);\n this.boundingSphere = new BoundingSphere(min, max);\n }\n\n public get minimum(): Vector3 {\n return this.boundingBox.minimum;\n }\n\n public get maximum(): Vector3 {\n return this.boundingBox.maximum;\n }\n\n public intersectsPoint(point: Vector3): boolean {\n return this.boundingSphere.intersectsPoint(point) && this.boundingBox.intersectsPoint(point);\n }\n\n /** World-matrix-aware reframe is not modelled here; reframe by rebuilding from transformed corners. */\n public reConstruct(min: Vector3, max: Vector3, _worldMatrix?: Matrix): void {\n this.boundingBox = new BoundingBox(min, max);\n this.boundingSphere = new BoundingSphere(min, max);\n }\n}\n","/**\n * Minimal Babylon.js-compatible `Observable`.\n *\n * Supports the common surface used by ported scenes: `add`, `addOnce`, `remove`,\n * `removeCallback`, `notifyObservers`, `hasObservers`, and `clear`. This is pure\n * JS with no Babylon Lite dependency and is fully unit-testable.\n */\n\nexport type ObserverCallback<T> = (eventData: T) => void;\n\nexport class Observable<T> {\n private _observers: ObserverCallback<T>[] = [];\n\n public add(callback: ObserverCallback<T>): ObserverCallback<T> {\n this._observers.push(callback);\n return callback;\n }\n\n public addOnce(callback: ObserverCallback<T>): ObserverCallback<T> {\n const wrapper: ObserverCallback<T> = (eventData) => {\n this.removeCallback(wrapper);\n callback(eventData);\n };\n this._observers.push(wrapper);\n return wrapper;\n }\n\n public remove(callback: ObserverCallback<T> | null | undefined): boolean {\n return callback ? this.removeCallback(callback) : false;\n }\n\n public removeCallback(callback: ObserverCallback<T>): boolean {\n const index = this._observers.indexOf(callback);\n if (index !== -1) {\n this._observers.splice(index, 1);\n return true;\n }\n return false;\n }\n\n public notifyObservers(eventData?: T): void {\n // Iterate a copy so observers can add/remove during notification.\n for (const observer of this._observers.slice()) {\n observer(eventData as T);\n }\n }\n\n public hasObservers(): boolean {\n return this._observers.length > 0;\n }\n\n public clear(): void {\n this._observers = [];\n }\n}\n","/**\n * Babylon.js-compatible engine wrappers.\n *\n * The class hierarchy mirrors Babylon.js exactly: `AbstractEngine` is the base,\n * `ThinEngine extends AbstractEngine`, `Engine extends ThinEngine`, and\n * `WebGPUEngine extends AbstractEngine` (so `Engine` and `WebGPUEngine` are\n * siblings, as in Babylon.js). All shared behaviour lives on `AbstractEngine`;\n * because Babylon Lite is WebGPU-only, every concrete engine is backed by the\n * same Lite WebGPU context, so `new Engine(...)` and `new WebGPUEngine(...)`\n * behave identically.\n *\n * Babylon.js exposes a synchronous constructor plus an async `initAsync()` for\n * WebGPU. Babylon Lite acquires the GPU device in an async `createEngine()`.\n * The wrapper mirrors the Babylon.js shape: construct, then `await initAsync()`.\n *\n * Because Lite drives its own render loop through `startEngine`, `runRenderLoop`\n * is implemented by registering the callback through each scene's\n * before-render hook and kicking off Lite's loop. The startup is async under the\n * hood (Lite must register scenes before the first frame); `runRenderLoop`\n * returns immediately and rendering begins on a subsequent tick.\n */\n\nimport { createEngine, startEngine, stopEngine, resizeEngine, setEngineSize, disposeEngine, registerScene, registerSceneWithShadowSupport, onBeforeRender } from \"babylon-lite\";\nimport type { EngineContext, EngineOptions, RenderCanvas } from \"babylon-lite\";\n\nimport { LiteCompatError, unsupported } from \"../error.js\";\nimport { Observable } from \"../misc/observable.js\";\nimport type { Scene } from \"../scene/scene.js\";\n\nexport abstract class AbstractEngine {\n /** @internal The underlying Lite engine context. Populated by `initAsync()`. */\n public _lite!: EngineContext;\n\n /**\n * @internal Whether this engine has no GPU device (a {@link NullEngine}). Headless\n * engines drive a pure-JS animation/observable loop instead of Babylon Lite's\n * GPU render loop, so the compat `Scene` skips its Lite scene-context setup.\n */\n public _headless = false;\n\n protected readonly _canvas: RenderCanvas;\n private readonly _options: EngineOptions | undefined;\n protected readonly _scenes: Scene[] = [];\n protected readonly _loopCallbacks: Array<() => void> = [];\n protected _initialized = false;\n private _started = false;\n /** @internal Active `requestAnimationFrame` id for the scene-less loop, if any. */\n protected _rafId: number | null = null;\n\n /**\n * Babylon.js `engine.useReverseDepthBuffer`. Babylon Lite owns its depth\n * configuration internally, so this is a settable no-op kept for API shape.\n */\n public useReverseDepthBuffer = false;\n\n /** Babylon.js `engine.onResizeObservable` — fires after `resize()` / `setSize()`. */\n public readonly onResizeObservable = new Observable<AbstractEngine>();\n\n /** @internal Babylon.js hardware-scaling level. Babylon Lite manages device-pixel-ratio itself; stored for parity. */\n private _hardwareScalingLevel = 1;\n\n /** @internal Latest per-frame delta in ms, updated by each scene's before-render hook. */\n public _lastDeltaMs = 16;\n\n /** @internal Last clear colour passed to `engine.clear(...)` (consumed by the scene-less sprite path). */\n public _lastClearColor: { r: number; g: number; b: number; a: number } = { r: 0, g: 0, b: 0, a: 1 };\n\n /** @internal Whether `engine.clear(...)` was ever called (sprite renderers overlay a scene if not). */\n public _clearRequested = false;\n\n /** @internal Deferred startup work (thunks) awaited before the engine starts — e.g. sprite-atlas loads. */\n private readonly _startupWork: Array<() => Promise<void>> = [];\n\n /**\n * @internal Deferred work awaited *after* the main scenes are registered but\n * before the engine starts — e.g. utility-layer (gizmo) registration, which\n * must happen after its gizmos are created and after the main scene is\n * registered (Babylon Lite's `registerUtilityLayer` ordering).\n */\n private readonly _lateWork: Array<() => Promise<void>> = [];\n\n public constructor(canvas: RenderCanvas, options?: ({ antialias?: boolean; adaptToDeviceRatio?: boolean; useLargeWorldRendering?: boolean } & EngineOptions) | boolean) {\n this._canvas = canvas;\n // Babylon.js's WebGPUEngine takes an options object as the second arg;\n // accept a bare boolean too (some older call sites pass `antialias`).\n const opts = typeof options === \"object\" ? { ...options } : undefined;\n // Babylon.js exposes floating-origin / large-world rendering through a\n // single `useLargeWorldRendering` flag. Babylon Lite splits it into\n // `useHighPrecisionMatrix` + `useFloatingOrigin` (the latter requires the\n // former). Translate so compat scenes that pass the BJS flag light up LWR.\n if (opts && (opts as { useLargeWorldRendering?: boolean }).useLargeWorldRendering) {\n delete (opts as { useLargeWorldRendering?: boolean }).useLargeWorldRendering;\n opts.useHighPrecisionMatrix = true;\n opts.useFloatingOrigin = true;\n }\n this._options = opts;\n }\n\n /** Acquire the GPU device and build the Lite engine context. */\n public async initAsync(): Promise<void> {\n if (this._initialized) {\n return;\n }\n this._lite = await createEngine(this._canvas, this._options);\n this._initialized = true;\n }\n\n public getRenderingCanvas(): RenderCanvas {\n return this._canvas;\n }\n\n /**\n * Babylon.js `engine.getDeltaTime()` — milliseconds elapsed since the previous\n * frame. Updated from each scene's Lite before-render hook (which receives the\n * frame delta); defaults to ~16ms before the first frame.\n */\n public getDeltaTime(): number {\n return this._lastDeltaMs;\n }\n\n /**\n * Babylon.js `engine.isNDCHalfZRange`. WebGPU's clip space uses a `[0, 1]`\n * depth range, so this is always `true` under Babylon Lite.\n */\n public get isNDCHalfZRange(): boolean {\n return true;\n }\n\n /** Babylon.js `engine.isWebGPU` — Babylon Lite is WebGPU-only, so always `true`. */\n public get isWebGPU(): boolean {\n return true;\n }\n\n /**\n * Babylon.js `engine.getCaps()` — engine capability flags. Only the\n * compressed-texture-format flags ported scenes branch on are derived (from the\n * Lite WebGPU device's enabled features); the rest report Babylon Lite's fixed\n * WebGPU baseline. A headless `NullEngine` has no device, so all flags are off.\n */\n public getCaps(): Record<string, unknown> {\n const device = (this._lite as { _device?: { features?: { has(name: string): boolean } } } | undefined)?._device;\n const has = (name: string): boolean => !!device?.features?.has(name);\n return {\n astc: has(\"texture-compression-astc\"),\n s3tc: has(\"texture-compression-bc\"),\n bc7: has(\"texture-compression-bc\"),\n etc2: has(\"texture-compression-etc2\"),\n // ETC1 is a distinct format family with no WebGPU feature flag — never\n // report it as available (an ETC2 device can decode ETC1 content, but\n // advertising `etc1` can steer upstream selection to a non-existent path).\n etc1: false,\n pvrtc: false,\n // WebGPU baseline capabilities Babylon Lite always provides.\n textureFloat: true,\n textureHalfFloat: true,\n textureFloatLinearFiltering: true,\n maxTextureSize: 8192,\n instancedArrays: true,\n uintIndices: true,\n };\n }\n\n /** Babylon.js `engine.scenes` — every scene created against this engine. */\n public get scenes(): Scene[] {\n return this._scenes;\n }\n\n /** Babylon.js `engine.getRenderWidth()` — backing render-target width in pixels. */\n public getRenderWidth(): number {\n return (this._canvas as { width?: number }).width ?? 0;\n }\n\n /** Babylon.js `engine.getRenderHeight()` — backing render-target height in pixels. */\n public getRenderHeight(): number {\n return (this._canvas as { height?: number }).height ?? 0;\n }\n\n /** Babylon.js `engine.getScreenAspectRatio()` — render-target width / height. */\n public getScreenAspectRatio(): number {\n const h = this.getRenderHeight();\n return h !== 0 ? this.getRenderWidth() / h : 1;\n }\n\n /**\n * Babylon.js `engine.getAspectRatio(camera?, useScreen?)`. Babylon Lite renders\n * each scene through a single full-canvas viewport, so the camera viewport does\n * not subdivide the surface — this is the screen aspect ratio.\n */\n public getAspectRatio(_camera?: unknown, _useScreen?: boolean): number {\n return this.getScreenAspectRatio();\n }\n\n /** Babylon.js `engine.getFps()` — frames-per-second estimate from the last frame delta. */\n public getFps(): number {\n return this._lastDeltaMs > 0 ? 1000 / this._lastDeltaMs : 60;\n }\n\n /**\n * Babylon.js `engine.getHardwareScalingLevel()`. Babylon Lite manages its own\n * device-pixel-ratio scaling, so this returns the stored parity value.\n */\n public getHardwareScalingLevel(): number {\n return this._hardwareScalingLevel;\n }\n\n /** Babylon.js `engine.setHardwareScalingLevel(level)` — stored for parity (Lite self-manages DPR). */\n public setHardwareScalingLevel(level: number): void {\n this._hardwareScalingLevel = level;\n }\n\n /** Babylon.js `engine.getRenderingCanvasClientRect()` — the canvas client rect, or `null` for offscreen canvases. */\n public getRenderingCanvasClientRect(): { x: number; y: number; width: number; height: number } | null {\n const c = this._canvas as { getBoundingClientRect?: () => { x: number; y: number; width: number; height: number } };\n return typeof c.getBoundingClientRect === \"function\" ? c.getBoundingClientRect() : null;\n }\n\n /**\n * Babylon.js `engine.clear(color?, backBuffer?, depth?, stencil?)`. Babylon\n * Lite owns clearing through its render contexts (scenes / sprite renderers),\n * so this records the requested clear colour (used by the scene-less sprite\n * renderer path) and is otherwise a no-op.\n */\n public clear(color?: { r: number; g: number; b: number; a: number }, _backBuffer?: boolean, _depth?: boolean, _stencil?: boolean): void {\n this._clearRequested = true;\n if (color) {\n this._lastClearColor = { r: color.r, g: color.g, b: color.b, a: color.a ?? 1 };\n }\n }\n\n /** @internal Register deferred startup work (a thunk) awaited before the engine starts. */\n public _registerStartupWork(work: () => Promise<void>): void {\n this._startupWork.push(work);\n }\n\n /** @internal Register deferred work awaited after the main scenes register but before the engine starts. */\n public _registerLateWork(work: () => Promise<void>): void {\n this._lateWork.push(work);\n }\n\n /** @internal Scenes register themselves on construction. */\n public _registerScene(scene: Scene): void {\n this._scenes.push(scene);\n // Wire already-registered loop callbacks into the new scene.\n for (const cb of this._loopCallbacks) {\n onBeforeRender(scene._lite, () => cb());\n }\n }\n\n public runRenderLoop(callback: () => void): void {\n this._ensureInitialized(\"runRenderLoop\");\n this._loopCallbacks.push(callback);\n for (const scene of this._scenes) {\n onBeforeRender(scene._lite, () => callback());\n }\n void this._start().then(() => {\n // Scene-less render loops (e.g. the `SpriteRenderer` 2D path) have no\n // scene before-render hook to drive the callback. Run them on a\n // `requestAnimationFrame` loop so per-frame work (e.g. sprite-sheet\n // animation that mutates `cellIndex` each tick) actually advances.\n // Babylon Lite's own render loop draws the registered sprite renderer;\n // we just need to push the updated sprite data before each frame.\n if (this._scenes.length === 0 && this._rafId === null && typeof requestAnimationFrame === \"function\") {\n const tick = (): void => {\n for (const cb of this._loopCallbacks) {\n cb();\n }\n this._rafId = requestAnimationFrame(tick);\n };\n this._rafId = requestAnimationFrame(tick);\n }\n });\n }\n\n public stopRenderLoop(): void {\n if (this._rafId !== null && typeof cancelAnimationFrame === \"function\") {\n cancelAnimationFrame(this._rafId);\n this._rafId = null;\n }\n if (this._initialized) {\n stopEngine(this._lite);\n }\n }\n\n public resize(): void {\n this._ensureInitialized(\"resize\");\n resizeEngine(this._lite);\n this.onResizeObservable.notifyObservers(this);\n }\n\n public setSize(width: number, height: number): void {\n this._ensureInitialized(\"setSize\");\n setEngineSize(this._lite, width, height);\n this.onResizeObservable.notifyObservers(this);\n }\n\n public dispose(): void {\n if (this._rafId !== null && typeof cancelAnimationFrame === \"function\") {\n cancelAnimationFrame(this._rafId);\n this._rafId = null;\n }\n if (this._initialized) {\n disposeEngine(this._lite);\n }\n }\n\n /** Babylon.js manual frame-pump entry point — unsupported (Lite's frame graph owns the frame). */\n public beginFrame(): never {\n return unsupported(\"WebGPUEngine.beginFrame\", \"Babylon Lite's frame graph owns the frame loop; drive rendering with `runRenderLoop`.\");\n }\n\n /** Babylon.js manual frame-pump exit point — unsupported (Lite's frame graph owns the frame). */\n public endFrame(): never {\n return unsupported(\"WebGPUEngine.endFrame\", \"Babylon Lite's frame graph owns the frame loop; drive rendering with `runRenderLoop`.\");\n }\n\n private async _start(): Promise<void> {\n if (this._started) {\n return;\n }\n this._started = true;\n // Run deferred startup work (e.g. sprite-atlas loads) first, so any\n // resources a render context needs exist before the first frame.\n if (this._startupWork.length > 0) {\n await Promise.all(this._startupWork.map((w) => w()));\n this._startupWork.length = 0;\n }\n for (const scene of this._scenes) {\n // Build shadow generators first so NME materials can sample them at parse\n // time (Babylon Lite wires shadow receivers into the NME graph on parse).\n scene._buildShadowGenerators();\n await scene._parseNodeMaterials();\n await scene._awaitPendingTextures();\n scene._bakeGroundUvs();\n scene._flushPendingAdds();\n scene._buildMorphTargets();\n await scene._loadPendingEnvironment();\n if (scene._hasShadows()) {\n await registerSceneWithShadowSupport(scene._lite);\n } else {\n await registerScene(scene._lite);\n }\n }\n // Late work runs after the main scenes are registered (e.g. utility-layer\n // gizmo registration, which Babylon Lite registers after the main scene).\n if (this._lateWork.length > 0) {\n await Promise.all(this._lateWork.map((w) => w()));\n this._lateWork.length = 0;\n }\n await startEngine(this._lite);\n }\n\n private _ensureInitialized(api: string): void {\n if (!this._initialized) {\n throw new LiteCompatError(`${this.constructor.name}.${api}`, \"Call `await engine.initAsync()` before using the engine.\");\n }\n }\n}\n\n/**\n * Babylon.js's headless/abstract WebGL engine layer. In Babylon.js\n * `ThinEngine extends AbstractEngine` and is the lightweight (no scene-graph)\n * engine; the compat layer carries no extra behaviour over {@link AbstractEngine}\n * (everything is WebGPU-backed), so this exists purely to reproduce the class\n * name and inheritance chain.\n */\nexport class ThinEngine extends AbstractEngine {}\n\n/**\n * Babylon.js's full WebGL engine. In Babylon.js `Engine extends ThinEngine`\n * (sibling to {@link WebGPUEngine}, both rooted at {@link AbstractEngine}).\n * Babylon Lite is WebGPU-only, so a compat `Engine` is still backed by the same\n * Lite WebGPU context; this class exists to mirror Babylon.js's name + hierarchy.\n */\nexport class Engine extends ThinEngine {}\n\n/**\n * Babylon.js's WebGPU engine. In Babylon.js `WebGPUEngine extends AbstractEngine`\n * (sibling to {@link Engine}). This is the natural engine for the compat layer\n * since Babylon Lite is WebGPU-only.\n */\nexport class WebGPUEngine extends AbstractEngine {}\n\n/** A degenerate canvas stand-in for the deviceless {@link NullEngine}. */\nconst NULL_CANVAS = { width: 0, height: 0 } as unknown as RenderCanvas;\n\n/**\n * Babylon.js's `NullEngine` — a headless engine with no GPU device, used to run\n * scene logic (animations, observables, frame timing) without rendering. Babylon\n * Lite has no headless context, so the compat `NullEngine` builds nothing on the\n * GPU: it drives a pure-JS `requestAnimationFrame` loop that advances each scene's\n * CPU animations and fires its before/after-render observables. Scenes constructed\n * against it skip the Lite scene-context build (see `Scene`'s headless branch), so\n * only the deviceless surface (CPU animations, manual 2D-canvas drawing, etc.)\n * works — there is no WebGPU rendering. Extends {@link WebGPUEngine} so it is\n * accepted everywhere a compat engine is (e.g. `new Scene(engine)`).\n */\nexport class NullEngine extends WebGPUEngine {\n public constructor() {\n super(NULL_CANVAS);\n this._headless = true;\n // No GPU device to acquire — usable immediately, no `initAsync()` needed.\n this._initialized = true;\n }\n\n /** No GPU device to acquire. */\n public override async initAsync(): Promise<void> {\n // Headless: nothing to initialise.\n }\n\n /**\n * Drive a pure-JS frame loop: each tick advances every registered scene's CPU\n * animations + render observables, then runs the user callback(s). No GPU work.\n */\n public override runRenderLoop(callback: () => void): void {\n this._loopCallbacks.push(callback);\n if (this._rafId !== null || typeof requestAnimationFrame !== \"function\") {\n return;\n }\n const now = (): number => (typeof performance !== \"undefined\" ? performance.now() : Date.now());\n let last = now();\n const tick = (): void => {\n const current = now();\n const deltaMs = current - last;\n last = current;\n for (const scene of this._scenes) {\n scene._tick(deltaMs);\n }\n for (const cb of this._loopCallbacks) {\n cb();\n }\n this._rafId = requestAnimationFrame(tick);\n };\n this._rafId = requestAnimationFrame(tick);\n }\n\n /** @internal Track the scene for the headless tick loop (no Lite before-render wiring). */\n public override _registerScene(scene: Scene): void {\n if (!this._scenes.includes(scene)) {\n this._scenes.push(scene);\n }\n }\n}\n","/**\n * Babylon.js-compatible `AbstractScene` — the base of the `Scene` class.\n *\n * In Babylon.js the scene class chain is `Scene extends AbstractScene`, where\n * `AbstractScene` owns the entity collections (`meshes`, `cameras`, `lights`,\n * `materials`, …) and the by-name lookups over them. The compat layer mirrors\n * that split so `instanceof AbstractScene` and the inherited collection API\n * behave as ported code expects. {@link Scene} adds the engine-backed rendering,\n * environment, animation, and lifecycle surface on top.\n */\n\nimport type { Node } from \"../node/node.js\";\nimport type { Camera } from \"../cameras/cameras.js\";\nimport type { Light } from \"../lights/lights.js\";\nimport type { TransformNode } from \"../meshes/meshes.js\";\nimport type { Material } from \"../materials/materials.js\";\n\nexport abstract class AbstractScene {\n /** @internal Compat meshes surfaced through `scene.meshes` (e.g. Gaussian-Splatting). */\n protected readonly _trackedMeshes: TransformNode[] = [];\n /** @internal Cameras constructed against this scene (`scene.cameras`). */\n protected readonly _cameras: Camera[] = [];\n /** @internal Lights constructed against this scene (`scene.lights`). */\n protected readonly _lights: Light[] = [];\n /** @internal Materials constructed against this scene (`scene.materials`). */\n protected readonly _materials: Material[] = [];\n\n /**\n * Babylon.js `scene.meshes`. Babylon Lite does not expose a public scene-mesh\n * registry, so this tracks the meshes the compat layer creates against a scene\n * which need lookup (currently Gaussian-Splatting meshes surfaced through the\n * loader). Other primitives register with the Lite scene directly.\n */\n public get meshes(): TransformNode[] {\n return this._trackedMeshes;\n }\n\n /** Babylon.js `scene.cameras` — every camera constructed against this scene. */\n public get cameras(): Camera[] {\n return this._cameras;\n }\n\n /** Babylon.js `scene.lights` — every light constructed against this scene. */\n public get lights(): Light[] {\n return this._lights;\n }\n\n /** Babylon.js `scene.materials` — every material constructed against this scene. */\n public get materials(): Material[] {\n return this._materials;\n }\n\n /** @internal Track a compat mesh so it appears in `scene.meshes`. */\n public _registerMesh(mesh: TransformNode): void {\n if (!this._trackedMeshes.includes(mesh)) {\n this._trackedMeshes.push(mesh);\n }\n }\n\n /** @internal Register a camera so it appears in `scene.cameras`. */\n public _registerCamera(camera: Camera): void {\n if (!this._cameras.includes(camera)) {\n this._cameras.push(camera);\n }\n }\n\n /** @internal Register a light so it appears in `scene.lights`. */\n public _registerLight(light: Light): void {\n if (!this._lights.includes(light)) {\n this._lights.push(light);\n }\n }\n\n /** @internal Register a material so it appears in `scene.materials`. */\n public _registerMaterial(material: Material): void {\n if (!this._materials.includes(material)) {\n this._materials.push(material);\n }\n }\n\n /** @internal Remove a node from the camera / light / mesh registries on dispose. */\n public _unregisterNode(node: Node): void {\n const ci = this._cameras.indexOf(node as unknown as Camera);\n if (ci !== -1) {\n this._cameras.splice(ci, 1);\n }\n const li = this._lights.indexOf(node as unknown as Light);\n if (li !== -1) {\n this._lights.splice(li, 1);\n }\n const mi = this._trackedMeshes.indexOf(node as unknown as TransformNode);\n if (mi !== -1) {\n this._trackedMeshes.splice(mi, 1);\n }\n }\n\n /** @internal Remove a material from `scene.materials` on dispose. */\n public _unregisterMaterial(material: Material): void {\n const i = this._materials.indexOf(material);\n if (i !== -1) {\n this._materials.splice(i, 1);\n }\n }\n\n /** Babylon.js `scene.getCameraByName(name)` — first camera with a matching name, else `null`. */\n public getCameraByName(name: string): Camera | null {\n return this._cameras.find((c) => c.name === name) ?? null;\n }\n\n /** Babylon.js `scene.getCameraById(id)` — first camera whose `id` matches, else `null`. */\n public getCameraById(id: string): Camera | null {\n return this._cameras.find((c) => (c as unknown as { id?: string }).id === id) ?? null;\n }\n\n /** Babylon.js `scene.getLightByName(name)` — first light with a matching name, else `null`. */\n public getLightByName(name: string): Light | null {\n return this._lights.find((l) => l.name === name) ?? null;\n }\n\n /** Babylon.js `scene.getLightById(id)` — first light whose `id` matches, else `null`. */\n public getLightById(id: string): Light | null {\n return this._lights.find((l) => (l as unknown as { id?: string }).id === id) ?? null;\n }\n\n /** Babylon.js `scene.getMaterialByName(name)` — first material with a matching name, else `null`. */\n public getMaterialByName(name: string): Material | null {\n return this._materials.find((m) => m.name === name) ?? null;\n }\n\n /** Babylon.js `scene.getMaterialById(id)` — first material whose `id` matches, else `null`. */\n public getMaterialById(id: string): Material | null {\n return this._materials.find((m) => (m as unknown as { id?: string }).id === id) ?? null;\n }\n\n /**\n * Babylon.js `scene.getMeshByName(name)`. Babylon Lite has no public scene-mesh\n * registry, so this searches the compat meshes tracked through `scene.meshes`\n * (currently meshes the loader surfaces, e.g. Gaussian-Splatting). Returns `null`\n * when not found, matching Babylon.js.\n */\n public getMeshByName(name: string): TransformNode | null {\n return this._trackedMeshes.find((m) => m.name === name) ?? null;\n }\n\n /** Babylon.js `scene.getMeshById(id)` — first tracked mesh whose `id` matches, else `null`. */\n public getMeshById(id: string): TransformNode | null {\n return this._trackedMeshes.find((m) => (m as unknown as { id?: string }).id === id) ?? null;\n }\n\n /** Babylon.js legacy `scene.getMeshByID(id)` — alias of {@link getMeshById}. */\n public getMeshByID(id: string): TransformNode | null {\n return this.getMeshById(id);\n }\n\n /** Babylon.js `scene.getNodeByName(name)` — searches tracked meshes, cameras, and lights. */\n public getNodeByName(name: string): Node | null {\n return this._trackedMeshes.find((m) => m.name === name) ?? this._cameras.find((c) => c.name === name) ?? this._lights.find((l) => l.name === name) ?? null;\n }\n\n /** Babylon.js `scene.getNodeById(id)` — searches tracked meshes, cameras, and lights by `id`. */\n public getNodeById(id: string): Node | null {\n const byId = (n: { id?: string }): boolean => n.id === id;\n return (\n this._trackedMeshes.find((m) => byId(m as unknown as { id?: string })) ??\n this._cameras.find((c) => byId(c as unknown as { id?: string })) ??\n this._lights.find((l) => byId(l as unknown as { id?: string })) ??\n null\n );\n }\n}\n","/**\n * Babylon.js-compatible camera classes implemented over the Babylon Lite camera\n * factories.\n *\n * Babylon.js cameras take the scene in their constructor and become the active\n * camera; these wrappers do the same by assigning `scene.activeCamera` when a\n * scene is supplied. `attachControl()` is a method here (Lite separates it into\n * standalone functions) and returns the detach handle Lite already provides.\n */\n\nimport {\n createArcRotateCamera,\n createFreeCamera,\n createGeospatialCamera,\n setGeospatialOrientation,\n attachGeospatialControls,\n attachControl as liteAttachControl,\n attachFreeControl,\n getCameraPosition,\n getViewMatrix as liteGetViewMatrix,\n getProjectionMatrix as liteGetProjectionMatrix,\n onBeforeRender,\n} from \"babylon-lite\";\nimport type { ArcRotateCamera as LiteArcRotateCamera, FreeCamera as LiteFreeCamera, GeospatialCamera as LiteGeospatialCamera, Camera as LiteCamera } from \"babylon-lite\";\n\nimport { unsupported } from \"../error.js\";\nimport { Vector3 } from \"../math/vector.js\";\nimport { Matrix } from \"../math/matrix.js\";\nimport { Node } from \"../node/node.js\";\nimport type { Scene } from \"../scene/scene.js\";\n\n/** Babylon.js `Camera` — base class for all cameras (derives from `Node`). */\nexport abstract class Camera extends Node {\n /** @internal Underlying Babylon Lite camera. */\n public abstract readonly _lite: LiteCamera;\n private _detach: (() => void) | undefined;\n\n protected constructor(name: string, scene?: Scene) {\n super(name, scene);\n scene?._registerCamera(this);\n }\n\n public override getClassName(): string {\n return \"Camera\";\n }\n\n public get fov(): number {\n return this._lite.fov;\n }\n public set fov(value: number) {\n this._lite.fov = value;\n }\n\n public get minZ(): number {\n return this._lite.nearPlane;\n }\n public set minZ(value: number) {\n this._lite.nearPlane = value;\n }\n\n public get maxZ(): number {\n return this._lite.farPlane;\n }\n public set maxZ(value: number) {\n this._lite.farPlane = value;\n }\n\n /** World-space position of the camera. */\n public get globalPosition(): Vector3 {\n const p = getCameraPosition(this._lite);\n return new Vector3(p.x, p.y, p.z);\n }\n\n /** Babylon.js `camera.getViewMatrix()` — the camera's view matrix. */\n public getViewMatrix(): Matrix {\n return Matrix.FromArray(liteGetViewMatrix(this._lite));\n }\n\n /** Babylon.js `camera.getProjectionMatrix()` — the camera's projection matrix. */\n public getProjectionMatrix(): Matrix {\n return Matrix.FromArray(liteGetProjectionMatrix(this._lite, this._aspectRatio()));\n }\n\n private _aspectRatio(): number {\n const scene = this._scene;\n const canvas = scene?.getEngine().getRenderingCanvas() as { width?: number; height?: number } | undefined;\n const w = canvas?.width ?? 1;\n const h = canvas?.height ?? 1;\n return h !== 0 ? w / h : 1;\n }\n\n public abstract attachControl(canvas: HTMLCanvasElement, noPreventDefault?: boolean): void;\n\n public detachControl(): void {\n if (this._detach) {\n this._detach();\n this._detach = undefined;\n }\n }\n\n /** @internal Store the detach handle returned by Lite's attach function. */\n protected _setDetach(detach: () => void): void {\n this._detach = detach;\n }\n\n protected _makeActive(scene: Scene | undefined): void {\n // Babylon.js sets `scene.activeCamera` to the **first** camera constructed\n // against a scene; later cameras are added but do not steal the active\n // slot (e.g. a `CameraGizmo`'s subject camera must not become the view).\n if (scene && !scene.activeCamera) {\n scene.activeCamera = this;\n }\n }\n}\n\nexport class ArcRotateCamera extends Camera {\n /** @internal Underlying Babylon Lite arc-rotate camera. */\n public readonly _lite: LiteArcRotateCamera;\n\n public constructor(name: string, alpha: number, beta: number, radius: number, target: Vector3, scene?: Scene);\n /** @internal Adopt an already-built Lite arc-rotate camera (e.g. from `createDefaultCamera`) instead of creating a new one. */\n public constructor(name: string, alpha: number, beta: number, radius: number, target: Vector3, scene: Scene | undefined, adoptLite: LiteArcRotateCamera);\n public constructor(name: string, alpha: number, beta: number, radius: number, target: Vector3, scene?: Scene, adoptLite?: LiteArcRotateCamera) {\n super(name, scene);\n this._lite = adoptLite ?? createArcRotateCamera(alpha, beta, radius, { x: target.x, y: target.y, z: target.z });\n if (!adoptLite) {\n this._makeActive(scene);\n }\n }\n\n public override getClassName(): string {\n return \"ArcRotateCamera\";\n }\n\n public get alpha(): number {\n return this._lite.alpha;\n }\n public set alpha(value: number) {\n this._lite.alpha = value;\n }\n\n public get beta(): number {\n return this._lite.beta;\n }\n public set beta(value: number) {\n this._lite.beta = value;\n }\n\n public get radius(): number {\n return this._lite.radius;\n }\n public set radius(value: number) {\n this._lite.radius = value;\n }\n\n public get target(): Vector3 {\n const t = this._lite.target;\n return new Vector3(t.x, t.y, t.z);\n }\n public set target(value: Vector3) {\n this._lite.target = { x: value.x, y: value.y, z: value.z };\n }\n\n /** Babylon.js `setTarget` — point the arc-rotate camera at a world-space target. */\n public setTarget(target: Vector3): void {\n this.target = target;\n }\n\n public get lowerRadiusLimit(): number | undefined {\n return this._lite.lowerRadiusLimit;\n }\n public set lowerRadiusLimit(value: number | undefined) {\n this._lite.lowerRadiusLimit = value;\n }\n\n public get upperRadiusLimit(): number | undefined {\n return this._lite.upperRadiusLimit;\n }\n public set upperRadiusLimit(value: number | undefined) {\n this._lite.upperRadiusLimit = value;\n }\n\n public attachControl(canvas: HTMLCanvasElement, _noPreventDefault?: boolean): void {\n const detach = liteAttachControl(this._lite, canvas, this._scene?._lite);\n this._setDetach(detach);\n }\n\n /** @internal Wrap an already-built Lite arc-rotate camera (e.g. from `createDefaultCamera`). */\n public static _adopt(name: string, lite: LiteArcRotateCamera, scene?: Scene): ArcRotateCamera {\n return new ArcRotateCamera(name, lite.alpha, lite.beta, lite.radius, new Vector3(lite.target.x, lite.target.y, lite.target.z), scene, lite);\n }\n}\n\n/**\n * Babylon.js `TargetCamera` — a free-moving camera with a look-at target. Base\n * for `FreeCamera`/`UniversalCamera`/`TouchCamera`/`FlyCamera`/`FollowCamera`.\n */\nexport class TargetCamera extends Camera {\n /** @internal Underlying Babylon Lite free camera. */\n public readonly _lite: LiteFreeCamera;\n\n public constructor(name: string, position: Vector3, scene?: Scene);\n /** @internal Adopt an already-built Lite free camera (e.g. one parsed from a `.babylon` file) instead of creating a new one. */\n public constructor(name: string, position: Vector3, scene: Scene | undefined, adoptLite: LiteFreeCamera);\n public constructor(name: string, position: Vector3, scene?: Scene, adoptLite?: LiteFreeCamera) {\n super(name, scene);\n this._lite = adoptLite ?? createFreeCamera({ x: position.x, y: position.y, z: position.z }, { x: position.x, y: position.y, z: position.z - 1 });\n this._makeActive(scene);\n }\n\n public override getClassName(): string {\n return \"TargetCamera\";\n }\n\n public get position(): Vector3 {\n const p = this._lite.position;\n return new Vector3(p.x, p.y, p.z);\n }\n public set position(value: Vector3) {\n this._lite.position.set(value.x, value.y, value.z);\n }\n\n public get speed(): number {\n return this._lite.speed;\n }\n public set speed(value: number) {\n this._lite.speed = value;\n }\n\n /** Babylon.js `setTarget` — aim the camera at a world-space point. */\n public setTarget(target: Vector3): void {\n this._lite.target.set(target.x, target.y, target.z);\n }\n\n public attachControl(canvas: HTMLCanvasElement, _noPreventDefault?: boolean): void {\n const detach = attachFreeControl(this._lite, canvas, this._scene?._lite);\n this._setDetach(detach);\n }\n}\n\n/** Babylon.js `FreeCamera` — keyboard/mouse free camera. */\nexport class FreeCamera extends TargetCamera {\n public override getClassName(): string {\n return \"FreeCamera\";\n }\n\n /** @internal Wrap an already-built Lite free camera (e.g. one parsed from a `.babylon` file). */\n public static _adopt(name: string, lite: LiteFreeCamera, scene?: Scene): FreeCamera {\n const p = lite.position;\n return new FreeCamera(name, new Vector3(p.x, p.y, p.z), scene, lite);\n }\n}\n\n/** Babylon.js `UniversalCamera` — touch-friendly free camera. */\nexport class UniversalCamera extends FreeCamera {\n public override getClassName(): string {\n return \"UniversalCamera\";\n }\n}\n\n/** Babylon.js `TouchCamera` — touch-controlled free camera. */\nexport class TouchCamera extends FreeCamera {\n public override getClassName(): string {\n return \"TouchCamera\";\n }\n}\n\n/** Babylon.js `GamepadCamera` — gamepad-controlled free camera. */\nexport class GamepadCamera extends UniversalCamera {\n public override getClassName(): string {\n return \"GamepadCamera\";\n }\n}\n\n/** Babylon.js `FlyCamera` — 6-DOF free-flight camera. */\nexport class FlyCamera extends TargetCamera {\n public override getClassName(): string {\n return \"FlyCamera\";\n }\n}\n\ninterface LockedTarget {\n position: { x: number; y: number; z: number };\n}\n\n/**\n * Babylon.js `FollowCamera` — follows a `lockedTarget` at a fixed radius /\n * height / rotation offset, updated each frame via the scene's before-render hook.\n */\nexport class FollowCamera extends TargetCamera {\n public lockedTarget: LockedTarget | null = null;\n public radius = 12;\n public heightOffset = 4;\n /** Rotation offset around the target, in degrees. */\n public rotationOffset = 0;\n\n public constructor(name: string, position: Vector3, scene?: Scene, lockedTarget?: LockedTarget) {\n super(name, position, scene);\n this.lockedTarget = lockedTarget ?? null;\n if (scene) {\n onBeforeRender(scene._lite, () => this._follow());\n }\n }\n\n public override getClassName(): string {\n return \"FollowCamera\";\n }\n\n private _follow(): void {\n const target = this.lockedTarget;\n if (!target) {\n return;\n }\n const radians = (this.rotationOffset * Math.PI) / 180;\n const x = target.position.x + this.radius * Math.sin(radians);\n const z = target.position.z + this.radius * Math.cos(radians);\n const y = target.position.y + this.heightOffset;\n this._lite.position.set(x, y, z);\n this.setTarget(new Vector3(target.position.x, target.position.y, target.position.z));\n }\n}\n\n/**\n * Babylon.js `GeospatialCamera` — globe-orbit camera anchored to a surface\n * `center` (ECEF), orbiting at `radius` with `yaw`/`pitch`. Wraps Babylon Lite's\n * `createGeospatialCamera` + `setGeospatialOrientation` (which clamps pitch\n * against the effective max for the current radius, so each orientation field is\n * applied through Lite with the others left at their current values).\n */\nexport class GeospatialCamera extends Camera {\n /** @internal Underlying Babylon Lite geospatial camera. */\n public readonly _lite: LiteGeospatialCamera;\n\n public constructor(name: string, scene?: Scene, options?: { planetRadius: number }) {\n super(name, scene);\n this._lite = createGeospatialCamera({ planetRadius: options?.planetRadius ?? 1 });\n this._makeActive(scene);\n }\n\n public override getClassName(): string {\n return \"GeospatialCamera\";\n }\n\n /** Anchored surface point the camera orbits (ECEF coordinates). */\n public get center(): Vector3 {\n const c = this._lite.center;\n return new Vector3(c.x, c.y, c.z);\n }\n public set center(value: Vector3) {\n setGeospatialOrientation(this._lite, { center: { x: value.x, y: value.y, z: value.z } });\n }\n\n /** Distance from the camera to its centre point. */\n public get radius(): number {\n return this._lite.radius;\n }\n public set radius(value: number) {\n setGeospatialOrientation(this._lite, { radius: value });\n }\n\n /** Yaw about the geocentric up axis (0 = north, π/2 = east). */\n public get yaw(): number {\n return this._lite.yaw;\n }\n public set yaw(value: number) {\n setGeospatialOrientation(this._lite, { yaw: value });\n }\n\n /** Pitch from looking straight down (0) to the horizon (π/2). */\n public get pitch(): number {\n return this._lite.pitch;\n }\n public set pitch(value: number) {\n setGeospatialOrientation(this._lite, { pitch: value });\n }\n\n public attachControl(canvas: HTMLCanvasElement, _noPreventDefault?: boolean): void {\n if (this._scene) {\n const detach = attachGeospatialControls(this._lite, canvas, this._scene._lite);\n this._setDetach(detach);\n }\n }\n}\n\n/** Babylon.js `DeviceOrientationCamera` — device-orientation input is not available in Babylon Lite. */\nexport class DeviceOrientationCamera {\n public constructor() {\n unsupported(\"DeviceOrientationCamera\", \"Device-orientation input is not part of Babylon Lite.\");\n }\n}\n\n/** Babylon.js `WebXRCamera` — WebXR is not part of Babylon Lite. */\nexport class WebXRCamera {\n public constructor() {\n unsupported(\"WebXRCamera\", \"WebXR is not part of Babylon Lite.\");\n }\n}\n\n/** Babylon.js `AnaglyphArcRotateCamera` — stereoscopic camera rigs are not implemented in Babylon Lite. */\nexport class AnaglyphArcRotateCamera {\n public constructor() {\n unsupported(\"AnaglyphArcRotateCamera\", \"Stereoscopic camera rigs are not implemented in Babylon Lite. (An anaglyph post-process exists separately.)\");\n }\n}\n","/**\n * Babylon.js-compatible material classes over the Babylon Lite material\n * factories.\n *\n * The Lite material is plain-data props (`_lite`); assign it to a mesh via\n * `mesh.material = material`. Property setters mutate the props and mark the\n * material UBO dirty (matching Babylon.js's \"mutate then it just works\"\n * behaviour). Only the common property subset is mapped; rarely-used Babylon.js\n * material properties are intentionally omitted.\n */\n\nimport { createStandardMaterial, createPbrMaterial, markMaterialUboDirty, createSolidTexture2D } from \"babylon-lite\";\nimport type { StandardMaterialProps, PbrMaterialProps, ClearCoatProps, SheenProps, AnisotropyProps, IridescenceProps, Texture2D, EngineContext } from \"babylon-lite\";\n\nimport { Color3 } from \"../math/color.js\";\nimport type { Scene } from \"../scene/scene.js\";\nimport type { BaseTexture, CubeTexture } from \"../textures/textures.js\";\n\ntype Tuple3 = [number, number, number];\ntype Tuple4 = [number, number, number, number];\n\n/** Babylon.js `Material` — base class for all materials. */\nexport abstract class Material {\n public name: string;\n /** Common transparency mode flag (Babylon.js `Material.transparencyMode`). */\n public transparencyMode: number | null = null;\n /** Back-face culling toggle (Babylon.js `Material.backFaceCulling`). */\n private _backFaceCulling = true;\n public get backFaceCulling(): boolean {\n return this._backFaceCulling;\n }\n public set backFaceCulling(value: boolean) {\n this._backFaceCulling = value;\n this._applyBackFaceCulling(value);\n this._markDirty();\n }\n /** @internal Per-material hook to push culling onto the Lite props (Standard vs PBR differ). */\n protected _applyBackFaceCulling(_value: boolean): void {\n // Base/NME materials: no Lite culling field to set.\n }\n /** Wireframe rendering toggle (not honoured by all Lite materials). */\n public wireframe = false;\n /** @internal Underlying Babylon Lite material props. */\n public abstract readonly _lite: StandardMaterialProps | PbrMaterialProps;\n\n /** @internal Owning compat scene, when constructed against one. */\n protected _scene: Scene | undefined;\n\n protected constructor(name: string, scene?: Scene) {\n this.name = name;\n this._scene = scene;\n scene?._registerMaterial(this);\n }\n\n public getClassName(): string {\n return \"Material\";\n }\n\n protected _markDirty(): void {\n markMaterialUboDirty(this._lite);\n }\n\n /**\n * @internal Finalize GPU-facing resources before the mesh is registered.\n * Base materials need nothing; PBR overrides this to synthesize the solid\n * textures Babylon Lite's PBR pipeline requires from factor-only materials.\n */\n public _ensureRenderable(_engine: EngineContext): void {\n // No-op for the base/standard material.\n }\n\n public dispose(): void {\n // No GPU resources are owned by the props object directly; textures are\n // disposed through their own handles. Drop the material from its scene's\n // `scene.materials` registry.\n this._scene?._unregisterMaterial(this);\n }\n}\n\n/** Babylon.js `PushMaterial` — intermediate base; behaves like {@link Material} here. */\nexport abstract class PushMaterial extends Material {\n public override getClassName(): string {\n return \"PushMaterial\";\n }\n}\n\nfunction readColor3(tuple: Tuple3 | undefined): Color3 {\n return tuple ? new Color3(tuple[0], tuple[1], tuple[2]) : new Color3(0, 0, 0);\n}\n\nexport class StandardMaterial extends PushMaterial {\n /** @internal Underlying Babylon Lite standard-material props. */\n public readonly _lite: StandardMaterialProps;\n\n public constructor(name: string, scene?: Scene) {\n super(name, scene);\n this._lite = createStandardMaterial();\n }\n\n public override getClassName(): string {\n return \"StandardMaterial\";\n }\n\n public get diffuseColor(): Color3 {\n return readColor3(this._lite.diffuseColor);\n }\n public set diffuseColor(value: Color3) {\n this._lite.diffuseColor = [value.r, value.g, value.b];\n this._markDirty();\n }\n\n public get specularColor(): Color3 {\n return readColor3(this._lite.specularColor);\n }\n public set specularColor(value: Color3) {\n this._lite.specularColor = [value.r, value.g, value.b];\n this._markDirty();\n }\n\n public get emissiveColor(): Color3 {\n return readColor3(this._lite.emissiveColor);\n }\n public set emissiveColor(value: Color3) {\n this._lite.emissiveColor = [value.r, value.g, value.b];\n this._markDirty();\n }\n\n public get ambientColor(): Color3 {\n return readColor3(this._lite.ambientColor);\n }\n public set ambientColor(value: Color3) {\n this._lite.ambientColor = [value.r, value.g, value.b];\n this._markDirty();\n }\n\n public get disableLighting(): boolean {\n return this._lite.disableLighting;\n }\n public set disableLighting(value: boolean) {\n this._lite.disableLighting = value;\n this._markDirty();\n }\n\n protected override _applyBackFaceCulling(value: boolean): void {\n this._lite.backFaceCulling = value;\n }\n\n public get alpha(): number {\n return this._lite.alpha;\n }\n public set alpha(value: number) {\n this._lite.alpha = value;\n this._markDirty();\n }\n\n public get diffuseTexture(): BaseTexture | null {\n return this._diffuseTexture;\n }\n public set diffuseTexture(texture: BaseTexture | null) {\n this._diffuseTexture = texture;\n this._lite.diffuseTexture = (texture?._lite as Texture2D | undefined) ?? null;\n this._markDirty();\n }\n\n /**\n * Babylon.js `StandardMaterial.alphaCutOff` — alpha-test threshold. Fragments\n * whose diffuse-texture alpha is below this value are discarded. Babylon Lite's\n * Standard pipeline alpha-tests against the diffuse texture's alpha when\n * `alphaCutOff > 0`, so this is wired directly.\n */\n public get alphaCutOff(): number {\n return this._lite.alphaCutOff;\n }\n public set alphaCutOff(value: number) {\n this._lite.alphaCutOff = value;\n this._markDirty();\n }\n\n /**\n * Babylon.js `StandardMaterial.useAlphaFromDiffuseTexture`. Babylon Lite's\n * alpha test already samples the diffuse texture's alpha (enabled via\n * `alphaCutOff`), so this is accepted for parity.\n */\n public useAlphaFromDiffuseTexture = false;\n\n public get bumpTexture(): BaseTexture | null {\n return this._bumpTexture;\n }\n public set bumpTexture(texture: BaseTexture | null) {\n this._bumpTexture = texture;\n this._lite.bumpTexture = (texture?._lite as Texture2D | undefined) ?? null;\n this._markDirty();\n }\n\n public get emissiveTexture(): BaseTexture | null {\n return this._emissiveTexture;\n }\n public set emissiveTexture(texture: BaseTexture | null) {\n this._emissiveTexture = texture;\n this._lite.emissiveTexture = (texture?._lite as Texture2D | undefined) ?? null;\n this._markDirty();\n }\n\n private _diffuseTexture: BaseTexture | null = null;\n private _bumpTexture: BaseTexture | null = null;\n private _emissiveTexture: BaseTexture | null = null;\n\n /**\n * @internal Re-bind texture maps to the Lite material. Babylon.js `Texture`s\n * load asynchronously, so when `material.diffuseTexture = new Texture(url)` ran\n * the Lite handle was still undefined. By engine-start the scene has awaited the\n * loads, so copy the now-resolved handles (and UV tiling) onto the Lite props.\n */\n public override _ensureRenderable(_engine: EngineContext): void {\n const diff = this._diffuseTexture as { _lite?: Texture2D; uScale?: number; vScale?: number } | null;\n if (diff?._lite) {\n this._lite.diffuseTexture = diff._lite;\n if (diff.uScale !== undefined && diff.vScale !== undefined) {\n this._lite.uvScale = [diff.uScale, diff.vScale];\n }\n }\n const bump = this._bumpTexture as { _lite?: Texture2D } | null;\n if (bump?._lite) {\n this._lite.bumpTexture = bump._lite;\n }\n const emissive = this._emissiveTexture as { _lite?: Texture2D } | null;\n if (emissive?._lite) {\n this._lite.emissiveTexture = emissive._lite;\n }\n this._markDirty();\n }\n}\n\n/**\n * Babylon.js `PBRClearCoatConfiguration` — the `pbr.clearCoat` sub-object.\n * Proxies the common clearcoat fields onto a Babylon Lite `ClearCoatProps`.\n */\nexport class PBRClearCoatConfiguration {\n public constructor(\n private readonly _props: ClearCoatProps,\n private readonly _markDirty: () => void\n ) {}\n\n public get isEnabled(): boolean {\n return this._props.isEnabled ?? false;\n }\n public set isEnabled(value: boolean) {\n this._props.isEnabled = value;\n this._markDirty();\n }\n\n public get intensity(): number {\n return this._props.intensity ?? 1;\n }\n public set intensity(value: number) {\n this._props.intensity = value;\n this._markDirty();\n }\n\n public get roughness(): number {\n return this._props.roughness ?? 0;\n }\n public set roughness(value: number) {\n this._props.roughness = value;\n this._markDirty();\n }\n\n public get indexOfRefraction(): number {\n return this._props.indexOfRefraction ?? 1.5;\n }\n public set indexOfRefraction(value: number) {\n this._props.indexOfRefraction = value;\n this._markDirty();\n }\n}\n\n/** Babylon.js `PBRSheenConfiguration` — the `pbr.sheen` sub-object over Lite `SheenProps`. */\nexport class PBRSheenConfiguration {\n public constructor(\n private readonly _props: SheenProps,\n private readonly _markDirty: () => void\n ) {}\n\n public get isEnabled(): boolean {\n return this._props.isEnabled;\n }\n public set isEnabled(value: boolean) {\n this._props.isEnabled = value;\n this._markDirty();\n }\n\n public get intensity(): number {\n return this._props.intensity ?? 1;\n }\n public set intensity(value: number) {\n this._props.intensity = value;\n this._markDirty();\n }\n\n public get roughness(): number {\n return this._props.roughness ?? 0;\n }\n public set roughness(value: number) {\n this._props.roughness = value;\n this._markDirty();\n }\n\n public get color(): Color3 {\n const c = this._props.color ?? [1, 1, 1];\n return new Color3(c[0], c[1], c[2]);\n }\n public set color(value: Color3) {\n this._props.color = [value.r, value.g, value.b];\n this._markDirty();\n }\n\n /** Babylon.js `sheen.texture`. Binds the Lite handle if the texture has resolved. */\n public set texture(value: { _lite?: Texture2D } | null) {\n if (value?._lite) {\n this._props.texture = value._lite;\n this._markDirty();\n }\n }\n}\n\n/** Babylon.js `PBRAnisotropicConfiguration` — the `pbr.anisotropy` sub-object over Lite `AnisotropyProps`. */\nexport class PBRAnisotropicConfiguration {\n public constructor(\n private readonly _props: AnisotropyProps,\n private readonly _markDirty: () => void\n ) {}\n\n public get isEnabled(): boolean {\n return this._props.isEnabled;\n }\n public set isEnabled(value: boolean) {\n this._props.isEnabled = value;\n this._markDirty();\n }\n\n public get intensity(): number {\n return this._props.intensity ?? 1;\n }\n public set intensity(value: number) {\n this._props.intensity = value;\n this._markDirty();\n }\n\n public get direction(): { x: number; y: number } {\n const d = this._props.direction ?? [1, 0];\n return { x: d[0], y: d[1] };\n }\n public set direction(value: { x: number; y: number }) {\n this._props.direction = [value.x, value.y];\n this._markDirty();\n }\n}\n\n/** Babylon.js `PBRIridescenceConfiguration` — the `pbr.iridescence` sub-object over Lite `IridescenceProps`. */\nexport class PBRIridescenceConfiguration {\n public constructor(\n private readonly _props: IridescenceProps,\n private readonly _markDirty: () => void\n ) {}\n\n public get isEnabled(): boolean {\n return this._props.isEnabled ?? false;\n }\n public set isEnabled(value: boolean) {\n this._props.isEnabled = value;\n this._markDirty();\n }\n\n public get intensity(): number {\n return this._props.intensity ?? 1;\n }\n public set intensity(value: number) {\n this._props.intensity = value;\n this._markDirty();\n }\n\n public get indexOfRefraction(): number {\n return this._props.indexOfRefraction ?? 1.3;\n }\n public set indexOfRefraction(value: number) {\n this._props.indexOfRefraction = value;\n this._markDirty();\n }\n\n public get minimumThickness(): number {\n return this._props.minimumThickness ?? 100;\n }\n public set minimumThickness(value: number) {\n this._props.minimumThickness = value;\n this._markDirty();\n }\n\n public get maximumThickness(): number {\n return this._props.maximumThickness ?? 400;\n }\n public set maximumThickness(value: number) {\n this._props.maximumThickness = value;\n this._markDirty();\n }\n}\n\nexport class PBRMaterial extends PushMaterial {\n /** @internal Underlying Babylon Lite PBR-material props. */\n public readonly _lite: PbrMaterialProps;\n\n public constructor(name: string, scene?: Scene) {\n super(name, scene);\n this._lite = createPbrMaterial();\n if (!this._lite.baseColorFactor) {\n this._lite.baseColorFactor = [1, 1, 1, 1];\n }\n }\n\n public override getClassName(): string {\n return \"PBRMaterial\";\n }\n\n public get albedoColor(): Color3 {\n const f = this._lite.baseColorFactor;\n return f ? new Color3(f[0], f[1], f[2]) : new Color3(1, 1, 1);\n }\n public set albedoColor(value: Color3) {\n const f: Tuple4 = this._lite.baseColorFactor ?? [1, 1, 1, 1];\n this._lite.baseColorFactor = [value.r, value.g, value.b, f[3]];\n this._markDirty();\n }\n\n /**\n * Babylon.js `pbr.albedoTexture` (glTF base-color map). The texture loads\n * asynchronously, so the resolved Lite handle (+ sRGB flag) is bound in\n * {@link _ensureRenderable} at engine start rather than here.\n */\n public get albedoTexture(): BaseTexture | null {\n return this._albedoTexture;\n }\n public set albedoTexture(texture: BaseTexture | null) {\n this._albedoTexture = texture;\n this._markDirty();\n }\n\n private _albedoTexture: BaseTexture | null = null;\n\n public get metallic(): number {\n return this._lite.metallicFactor ?? 1;\n }\n public set metallic(value: number) {\n this._lite.metallicFactor = value;\n this._markDirty();\n }\n\n public get roughness(): number {\n return this._lite.roughnessFactor ?? 1;\n }\n public set roughness(value: number) {\n this._lite.roughnessFactor = value;\n this._markDirty();\n }\n\n public get emissiveColor(): Color3 {\n return readColor3(this._lite.emissiveColor);\n }\n public set emissiveColor(value: Color3) {\n this._lite.emissiveColor = [value.r, value.g, value.b];\n this._markDirty();\n }\n\n /**\n * Babylon.js `pbr.usePhysicalLightFalloff`. When false, point/spot lights use\n * Standard-style linear range falloff instead of physical inverse-square.\n * Default true (matches Babylon.js PBRMaterial).\n */\n public get usePhysicalLightFalloff(): boolean {\n return this._lite.usePhysicalLightFalloff ?? true;\n }\n public set usePhysicalLightFalloff(value: boolean) {\n this._lite.usePhysicalLightFalloff = value;\n this._markDirty();\n }\n\n public get alpha(): number {\n return this._lite.alpha ?? 1;\n }\n public set alpha(value: number) {\n this._lite.alpha = value;\n this._markDirty();\n }\n\n /**\n * Babylon.js `material.forceIrradianceInFragment`. Babylon Lite computes\n * irradiance in the fragment stage already, so this is accepted for parity.\n */\n public forceIrradianceInFragment = false;\n\n protected override _applyBackFaceCulling(value: boolean): void {\n this._lite.doubleSided = !value;\n }\n\n /**\n * Babylon.js `pbr.clearCoat` sub-configuration. Lazily allocates the Lite\n * `clearCoat` props on first access and proxies the common fields\n * (`isEnabled`, `intensity`, `roughness`, `indexOfRefraction`) onto them.\n */\n public get clearCoat(): PBRClearCoatConfiguration {\n if (!this._clearCoat) {\n if (!this._lite.clearCoat) {\n this._lite.clearCoat = { isEnabled: false };\n }\n this._clearCoat = new PBRClearCoatConfiguration(this._lite.clearCoat, () => this._markDirty());\n }\n return this._clearCoat;\n }\n\n private _clearCoat?: PBRClearCoatConfiguration;\n\n /** Babylon.js `pbr.sheen` sub-configuration (Lite `SheenProps`). */\n public get sheen(): PBRSheenConfiguration {\n if (!this._sheen) {\n if (!this._lite.sheen) {\n this._lite.sheen = { isEnabled: false };\n }\n this._sheen = new PBRSheenConfiguration(this._lite.sheen, () => this._markDirty());\n }\n return this._sheen;\n }\n\n private _sheen?: PBRSheenConfiguration;\n\n /** Babylon.js `pbr.anisotropy` sub-configuration (Lite `AnisotropyProps`). */\n public get anisotropy(): PBRAnisotropicConfiguration {\n if (!this._anisotropy) {\n if (!this._lite.anisotropy) {\n this._lite.anisotropy = { isEnabled: false };\n }\n this._anisotropy = new PBRAnisotropicConfiguration(this._lite.anisotropy, () => this._markDirty());\n }\n return this._anisotropy;\n }\n\n private _anisotropy?: PBRAnisotropicConfiguration;\n\n /** Babylon.js `pbr.iridescence` sub-configuration (Lite `IridescenceProps`). */\n public get iridescence(): PBRIridescenceConfiguration {\n if (!this._iridescence) {\n if (!this._lite.iridescence) {\n this._lite.iridescence = { isEnabled: false };\n }\n this._iridescence = new PBRIridescenceConfiguration(this._lite.iridescence, () => this._markDirty());\n }\n return this._iridescence;\n }\n\n private _iridescence?: PBRIridescenceConfiguration;\n\n /**\n * Babylon.js `material.environmentTexture` / `reflectionTexture`. Babylon Lite\n * applies image-based lighting scene-wide rather than per-material, so a cube\n * environment assigned to a material is routed to the owning scene's\n * environment (the dominant single-IBL case Babylon.js scenes use).\n */\n public get environmentTexture(): CubeTexture | null {\n return this._scene?.environmentTexture ?? null;\n }\n public set environmentTexture(value: CubeTexture | null) {\n if (this._scene) {\n this._scene.environmentTexture = value;\n }\n }\n\n public get reflectionTexture(): CubeTexture | null {\n return this.environmentTexture;\n }\n public set reflectionTexture(value: CubeTexture | null) {\n this.environmentTexture = value;\n }\n\n /** @internal Bind resolved textures and synthesize the solid textures Babylon Lite's PBR pipeline requires from a factor-only material. */\n public override _ensureRenderable(engine: EngineContext): void {\n const lite = this._lite;\n // Bind a now-resolved albedo texture (Babylon.js `Texture`s load asynchronously,\n // so the Lite handle was undefined when `material.albedoTexture = …` ran). BJS\n // `PBRMaterial.albedoTexture` is sRGB/gamma space by default, so flag `gammaAlbedo`.\n const albedo = this._albedoTexture as { _lite?: Texture2D; gammaSpace?: boolean } | null;\n if (albedo?._lite) {\n lite.baseColorTexture = albedo._lite;\n lite.gammaAlbedo = albedo.gammaSpace ?? true;\n }\n // Babylon Lite's PBR pipeline samples baseColorTexture/ormTexture unconditionally,\n // so a factor-only Babylon.js PBR material (colours but no maps) must be backed by\n // 1×1 solid textures. Bake the factors into the textures and neutralize the factors\n // so each contribution is applied exactly once.\n if (!lite.baseColorTexture) {\n const f = lite.baseColorFactor ?? [1, 1, 1, 1];\n lite.baseColorTexture = createSolidTexture2D(engine, f[0], f[1], f[2], f[3]);\n lite.baseColorFactor = [1, 1, 1, 1];\n }\n if (!lite.ormTexture) {\n const rough = lite.roughnessFactor ?? 1;\n const metal = lite.metallicFactor ?? 1;\n lite.ormTexture = createSolidTexture2D(engine, 1, rough, metal);\n lite.roughnessFactor = 1;\n lite.metallicFactor = 1;\n }\n }\n}\n\n/**\n * Babylon.js `PBRMetallicRoughnessMaterial` — a simplified façade over\n * {@link PBRMaterial} exposing the metallic-roughness workflow directly.\n */\nexport class PBRMetallicRoughnessMaterial extends PBRMaterial {\n public override getClassName(): string {\n return \"PBRMetallicRoughnessMaterial\";\n }\n\n /** Alias of `albedoColor` (glTF \"base color\"). */\n public get baseColor(): Color3 {\n return this.albedoColor;\n }\n public set baseColor(value: Color3) {\n this.albedoColor = value;\n }\n}\n\n/**\n * Babylon.js `PBRSpecularGlossinessMaterial` — the spec/gloss workflow is\n * supported when loaded from glTF (`KHR_materials_pbrSpecularGlossiness`), but a\n * standalone manual spec/gloss material is not mapped onto Lite's metallic-roughness\n * PBR. The constructor builds a metallic-roughness PBR material and exposes a\n * `diffuseColor`/`glossiness` façade; results will not match BJS spec/gloss exactly.\n */\nexport class PBRSpecularGlossinessMaterial extends PBRMaterial {\n public override getClassName(): string {\n return \"PBRSpecularGlossinessMaterial\";\n }\n\n public get diffuseColor(): Color3 {\n return this.albedoColor;\n }\n public set diffuseColor(value: Color3) {\n this.albedoColor = value;\n }\n\n /** Maps glossiness → (1 - roughness). */\n public get glossiness(): number {\n return 1 - this.roughness;\n }\n public set glossiness(value: number) {\n this.roughness = 1 - value;\n }\n}\n","/**\n * Babylon.js-compatible `Animation` keyframe model + `AnimationGroup`.\n *\n * `Animation` is a pure-JS keyframe container with CPU evaluation (`evaluate`),\n * the Babylon.js data-type / loop-mode constants, and `setKeys`/`getKeys`. This\n * is fully testable without a GPU. `AnimationGroup` provides the structural\n * grouping/playback-state surface; frame-accurate playback is driven through the\n * native Babylon Lite animation manager when wired to a scene (not modelled here).\n */\n\nimport { goToFrame as liteGoToFrame, playAnimation, pauseAnimation, stopAnimation, setAnimationAdditive } from \"babylon-lite\";\nimport type { AnimationGroup as LiteAnimationGroup, EngineContext } from \"babylon-lite\";\n\nexport interface IAnimationKey {\n frame: number;\n value: number | number[];\n /** Babylon.js per-key interpolation hint (`AnimationKeyInterpolation`). */\n interpolation?: number;\n}\n\n/**\n * Babylon.js `AnimationKeyInterpolation` — how the segment starting at a key is\n * interpolated. `STEP` holds the key's value until the next key (no blend).\n */\nexport const AnimationKeyInterpolation = {\n NONE: 0,\n STEP: 1,\n} as const;\n\nexport const AnimationTypes = {\n ANIMATIONTYPE_FLOAT: 0,\n ANIMATIONTYPE_VECTOR3: 1,\n ANIMATIONTYPE_QUATERNION: 2,\n ANIMATIONTYPE_MATRIX: 3,\n ANIMATIONTYPE_COLOR3: 4,\n ANIMATIONTYPE_VECTOR2: 5,\n ANIMATIONTYPE_COLOR4: 6,\n} as const;\n\nexport const AnimationLoopModes = {\n ANIMATIONLOOPMODE_RELATIVE: 0,\n ANIMATIONLOOPMODE_CYCLE: 1,\n ANIMATIONLOOPMODE_CONSTANT: 2,\n} as const;\n\nexport class Animation {\n public static readonly ANIMATIONTYPE_FLOAT = AnimationTypes.ANIMATIONTYPE_FLOAT;\n public static readonly ANIMATIONTYPE_VECTOR3 = AnimationTypes.ANIMATIONTYPE_VECTOR3;\n public static readonly ANIMATIONTYPE_QUATERNION = AnimationTypes.ANIMATIONTYPE_QUATERNION;\n public static readonly ANIMATIONTYPE_MATRIX = AnimationTypes.ANIMATIONTYPE_MATRIX;\n public static readonly ANIMATIONTYPE_COLOR3 = AnimationTypes.ANIMATIONTYPE_COLOR3;\n public static readonly ANIMATIONLOOPMODE_RELATIVE = AnimationLoopModes.ANIMATIONLOOPMODE_RELATIVE;\n public static readonly ANIMATIONLOOPMODE_CYCLE = AnimationLoopModes.ANIMATIONLOOPMODE_CYCLE;\n public static readonly ANIMATIONLOOPMODE_CONSTANT = AnimationLoopModes.ANIMATIONLOOPMODE_CONSTANT;\n\n private _keys: IAnimationKey[] = [];\n\n public constructor(\n public name: string,\n public targetProperty: string,\n public framePerSecond: number,\n public dataType: number = AnimationTypes.ANIMATIONTYPE_FLOAT,\n public loopMode: number = AnimationLoopModes.ANIMATIONLOOPMODE_CYCLE\n ) {}\n\n public setKeys(keys: IAnimationKey[]): void {\n this._keys = keys.slice().sort((a, b) => a.frame - b.frame);\n }\n\n public getKeys(): IAnimationKey[] {\n return this._keys;\n }\n\n public getHighestFrame(): number {\n return this._keys.length > 0 ? this._keys[this._keys.length - 1]!.frame : 0;\n }\n\n /** Linearly evaluate the animated value at `frame` (clamped to the key range). */\n public evaluate(frame: number): number | number[] {\n const keys = this._keys;\n if (keys.length === 0) {\n return 0;\n }\n if (frame <= keys[0]!.frame) {\n return keys[0]!.value;\n }\n if (frame >= keys[keys.length - 1]!.frame) {\n return keys[keys.length - 1]!.value;\n }\n for (let i = 0; i < keys.length - 1; i++) {\n const a = keys[i]!;\n const b = keys[i + 1]!;\n // Half-open `[a, b)` so an exact key frame belongs to the segment it\n // starts (matters for STEP, where the value changes _at_ the next key).\n if (frame >= a.frame && frame < b.frame) {\n // Babylon.js `AnimationKeyInterpolation.STEP` holds the start key's\n // value across the whole segment (no blend to the next key).\n if (a.interpolation === AnimationKeyInterpolation.STEP) {\n return a.value;\n }\n const t = (frame - a.frame) / (b.frame - a.frame);\n return lerpValue(a.value, b.value, t);\n }\n }\n return keys[keys.length - 1]!.value;\n }\n\n /** Babylon.js helper: build a one-shot float animation between two values. */\n public static CreateAndStartAnimation(name: string, _target: unknown, targetProperty: string, framePerSecond: number, totalFrame: number, from: number, to: number): Animation {\n const anim = new Animation(name, targetProperty, framePerSecond);\n anim.setKeys([\n { frame: 0, value: from },\n { frame: totalFrame, value: to },\n ]);\n return anim;\n }\n}\n\nfunction lerpValue(a: number | number[], b: number | number[], t: number): number | number[] {\n if (typeof a === \"number\" && typeof b === \"number\") {\n return a + (b - a) * t;\n }\n const av = a as number[];\n const bv = b as number[];\n return av.map((value, i) => value + ((bv[i] ?? value) - value) * t);\n}\n\ntype AnimValue = number | number[];\n\nfunction scaleValue(value: AnimValue, scale: number): AnimValue {\n return typeof value === \"number\" ? value * scale : value.map((v) => v * scale);\n}\n\nfunction addValue(acc: AnimValue, value: AnimValue): AnimValue {\n if (typeof acc === \"number\" && typeof value === \"number\") {\n return acc + value;\n }\n const a = acc as number[];\n const v = value as number[];\n return a.map((x, i) => x + (v[i] ?? 0));\n}\n\nfunction zeroLike(value: AnimValue): AnimValue {\n return typeof value === \"number\" ? 0 : (value as number[]).map(() => 0);\n}\n\n/**\n * @internal Pre-animation baseline of each blended property, captured the first\n * time a structural group starts. Babylon.js mixes this \"original value\" back in\n * when a property's total animation weight is below 1 (so partially-weighted\n * blends settle toward the rest pose); keyed by target object → dotted path.\n */\nconst structuralOriginals = new WeakMap<object, Map<string, AnimValue>>();\n\nfunction readPath(target: object, path: string): AnimValue {\n const parts = path.split(\".\");\n let obj = target as Record<string, unknown>;\n for (let i = 0; i < parts.length - 1; i++) {\n const next = obj[parts[i]!];\n if (next == null) {\n return 0;\n }\n obj = next as Record<string, unknown>;\n }\n const leaf = obj[parts[parts.length - 1]!];\n return typeof leaf === \"number\" ? leaf : 0;\n}\n\nfunction captureOriginal(target: object, path: string): void {\n let perTarget = structuralOriginals.get(target);\n if (!perTarget) {\n perTarget = new Map();\n structuralOriginals.set(target, perTarget);\n }\n if (!perTarget.has(path)) {\n perTarget.set(path, readPath(target, path));\n }\n}\n\n/** @internal Assign an animated value to `target` following a dotted property path (e.g. `\"position.x\"`). */\nfunction applyAnimatedValue(target: unknown, path: string, value: number | number[]): void {\n const parts = path.split(\".\");\n let obj = target as Record<string, unknown>;\n for (let i = 0; i < parts.length - 1; i++) {\n const next = obj[parts[i]!];\n if (next == null) {\n return;\n }\n obj = next as Record<string, unknown>;\n }\n const leaf = parts[parts.length - 1]!;\n if (Array.isArray(value)) {\n const slot = obj[leaf] as { set?: (...n: number[]) => void } | undefined;\n if (slot && typeof slot.set === \"function\") {\n slot.set(...value);\n } else {\n obj[leaf] = value;\n }\n } else {\n obj[leaf] = value;\n }\n}\n\n/**\n * Babylon.js `Animatable` — a running animation on a target, driven per-frame on\n * the CPU by evaluating each `Animation`'s keyframes and writing the result onto\n * the target's (dotted) property path.\n */\nexport class Animatable {\n public masterFrame = 0;\n public speedRatio: number;\n private _paused = false;\n private _stopped = false;\n\n public constructor(\n private readonly _target: unknown,\n private readonly _animations: Animation[],\n private readonly _from: number,\n private readonly _to: number,\n private readonly _loop: boolean,\n speedRatio: number\n ) {\n this.speedRatio = speedRatio;\n this.masterFrame = _from;\n this._apply();\n }\n\n /** @internal Advance the animation by `deltaMs`, called once per scene frame. */\n public _tick(deltaMs: number): void {\n if (this._paused || this._stopped) {\n return;\n }\n const fps = this._animations[0]?.framePerSecond ?? 60;\n this.masterFrame += (deltaMs / 1000) * fps * this.speedRatio;\n if (this.masterFrame > this._to) {\n if (this._loop) {\n const span = this._to - this._from || 1;\n this.masterFrame = this._from + ((this.masterFrame - this._from) % span);\n } else {\n this.masterFrame = this._to;\n this._stopped = true;\n }\n }\n this._apply();\n }\n\n public goToFrame(frame: number): void {\n this.masterFrame = frame;\n this._apply();\n }\n\n public pause(): void {\n this._paused = true;\n }\n\n public restart(): void {\n this._paused = false;\n this._stopped = false;\n this.masterFrame = this._from;\n }\n\n public stop(): void {\n this._stopped = true;\n }\n\n public get animationStarted(): boolean {\n return !this._stopped;\n }\n\n private _apply(): void {\n for (const anim of this._animations) {\n applyAnimatedValue(this._target, anim.targetProperty, anim.evaluate(this.masterFrame));\n }\n }\n}\n\nexport type AnimationGroupState = \"init\" | \"playing\" | \"paused\" | \"stopped\";\n\n/**\n * @internal Surface a structural `AnimationGroup` needs from its host scene to be\n * stepped + weight-blended each frame. Typed structurally to avoid a Scene import\n * cycle.\n */\nexport interface StructuralAnimationHost {\n /** @internal Register a structural group to be stepped + blended each frame. */\n _registerStructuralGroup(group: AnimationGroup): void;\n /** @internal Re-run weighted blending across all structural groups. */\n _recomputeStructuralBlends(): void;\n}\n\n/**\n * @internal Surface a **loaded** glTF/.babylon `AnimationGroup` needs from its\n * host scene to enable Babylon Lite's weighted / additive skeletal blending.\n * Implemented structurally by the compat `Scene` to avoid an import cycle.\n */\nexport interface LoadedAnimationBlendHost {\n /**\n * @internal Route the scene's loaded Lite animation groups through a\n * scene-owned `AnimationManager` with blending enabled (idempotent).\n */\n _enableLoadedBlend(): void;\n}\n\n/**\n * Babylon.js `AnimationGroup` — a named collection of targeted animations with\n * playback state. This is the **single** `AnimationGroup` type, matching Babylon.js;\n * there is no separate \"loaded\" subtype. Two construction paths map onto Lite:\n *\n * - **Structural** (`new AnimationGroup(name, scene?)`): a CPU-side collection\n * built by ported code via `addTargetedAnimation`. When `start`ed it registers\n * with the scene and is stepped each frame on the CPU; multiple groups that\n * animate the same property are **weight-blended** (Babylon.js manual weighted\n * / cross-fade blending) before the result is written to the target.\n * - **Loaded** (`AnimationGroup._fromLite`, used to populate `scene.animationGroups`\n * from glTF / `.babylon` clips): a thin wrapper over a Babylon Lite loaded group.\n * The playback methods (`goToFrame`/`play`/`pause`/`stop`/`reset`) and the\n * `from`/`to`/`isPlaying`/`speedRatio`/`loopAnimation`/`weight`/`animatables`\n * accessors delegate to the Lite group so ported scenes can freeze/seek a\n * loaded animation at a deterministic frame.\n */\nexport class AnimationGroup {\n public readonly targetedAnimations: Array<{ animation: Animation; target: unknown }> = [];\n public onAnimationGroupEndObservable?: () => void;\n\n /** @internal Babylon Lite loaded-group backing (set only on the loaded path). */\n public _lite?: LiteAnimationGroup;\n /** @internal Engine context used to drive Lite-backed playback. */\n private _engine?: EngineContext;\n /** @internal Host scene that owns the loaded-group blend manager (loaded path). */\n private _blendHost?: LoadedAnimationBlendHost;\n\n private _from = 0;\n private _to = 0;\n private _state: AnimationGroupState = \"init\";\n private _speedRatio = 1;\n private _loopAnimation = false;\n /** @internal Blend weight for the structural path (loaded path reads `_lite.weight`). */\n private _weight = 1;\n /** @internal Current frame for the structural path. */\n private _currentFrame = 0;\n /** @internal Host scene that steps + blends this structural group each frame. */\n private readonly _host?: StructuralAnimationHost;\n\n public constructor(\n public name: string,\n scene?: unknown\n ) {\n this._host = (scene as StructuralAnimationHost | undefined) ?? undefined;\n }\n\n /** @internal Build an `AnimationGroup` backed by a Babylon Lite loaded group. */\n public static _fromLite(lite: LiteAnimationGroup, engine: EngineContext, blendHost?: LoadedAnimationBlendHost): AnimationGroup {\n const group = new AnimationGroup(lite.name);\n group._lite = lite;\n group._engine = engine;\n group._blendHost = blendHost;\n return group;\n }\n\n /**\n * Babylon.js `AnimationGroup.MakeAnimationAdditive(group)` — convert a loaded\n * group into an additive layer (reference frame 0) and enable the scene's\n * weighted-blend manager. Returns the same group (Babylon Lite mutates in\n * place rather than cloning).\n */\n public static MakeAnimationAdditive(group: AnimationGroup): AnimationGroup {\n if (group._lite) {\n setAnimationAdditive(group._lite, { referenceFrame: 0 });\n group._blendHost?._enableLoadedBlend();\n }\n return group;\n }\n\n /** First frame of the clip. Always 0 for loaded clips. */\n public get from(): number {\n return this._lite ? 0 : this._from;\n }\n\n /** Last frame of the clip. */\n public get to(): number {\n return this._lite ? this._lite.duration * (this._lite.frameRate ?? 60) : this._to;\n }\n\n public get isPlaying(): boolean {\n return this._lite ? this._lite.isPlaying : this._state === \"playing\";\n }\n\n public get state(): AnimationGroupState {\n if (this._lite) {\n return this._lite.isPlaying ? \"playing\" : \"paused\";\n }\n return this._state;\n }\n\n public get speedRatio(): number {\n return this._lite ? this._lite.speedRatio : this._speedRatio;\n }\n public set speedRatio(value: number) {\n if (this._lite) {\n this._lite.speedRatio = value;\n } else {\n this._speedRatio = value;\n }\n }\n\n public get loopAnimation(): boolean {\n return this._lite ? this._lite.loopAnimation : this._loopAnimation;\n }\n public set loopAnimation(value: boolean) {\n if (this._lite) {\n this._lite.loopAnimation = value;\n } else {\n this._loopAnimation = value;\n }\n }\n\n public get weight(): number {\n return this._lite ? this._lite.weight : this._weight;\n }\n public set weight(value: number) {\n if (this._lite) {\n this._lite.weight = value;\n // A non-unit weight on a loaded clip means the scene must blend its\n // groups (Babylon.js manual weighted blend). Enable the scene's\n // weighted-blend manager (idempotent; no-op for the default weight 1).\n if (value !== 1) {\n this._blendHost?._enableLoadedBlend();\n }\n } else {\n this._weight = value;\n this._host?._recomputeStructuralBlends();\n }\n }\n\n /**\n * Babylon.js `AnimationGroup.animatables`. For loaded groups Babylon Lite drives\n * the whole group as one unit, so this surfaces a single animatable whose\n * `masterFrame` reflects the group's current frame. Structural groups built\n * without a running scene report no animatables.\n */\n public get animatables(): Array<{ masterFrame: number }> {\n if (this._lite) {\n const frameRate = this._lite.frameRate ?? 60;\n return [{ masterFrame: this._lite.currentTime * frameRate }];\n }\n return [];\n }\n\n public addTargetedAnimation(animation: Animation, target: unknown): { animation: Animation; target: unknown } {\n const entry = { animation, target };\n this.targetedAnimations.push(entry);\n this._from = Math.min(this._from, 0);\n this._to = Math.max(this._to, animation.getHighestFrame());\n return entry;\n }\n\n /**\n * Babylon.js `start(loop?, speedRatio?, from?, to?)`. On the structural path this\n * registers the group with its host scene, captures the targets' rest-pose\n * baselines, and begins CPU stepping + weight blending. On the loaded path it\n * seeks to `from` and plays — except a zero-length range (`from === to`) is a\n * **held single-frame pose** (e.g. an additive pose layer), which must hold\n * rather than play: Babylon Lite's group advance ignores the BJS play range and\n * would otherwise loop the (often ~2-frame) pose clip every frame, flickering.\n */\n public start(loop = true, speedRatio = 1, from?: number, to?: number): this {\n if (this._lite) {\n const frameRate = this._lite.frameRate ?? 60;\n if (from !== undefined) {\n this._lite.currentTime = from / frameRate;\n }\n this._lite.speedRatio = speedRatio;\n this._lite.loopAnimation = loop;\n if (from !== undefined && to !== undefined && from === to) {\n // Held single-frame pose — seek and hold (do not advance/loop).\n // `play` then `pause` clears Lite's internal `_stopped` flag (set by a\n // prior `stop()`) while leaving the clip paused, so the weighted mixer\n // still includes this group (a `_stopped` group is excluded from\n // blending, which would drop the whole shared-skeleton blend).\n playAnimation(this._lite);\n pauseAnimation(this._lite);\n return this;\n }\n return this.play(loop);\n }\n this._loopAnimation = loop;\n this._speedRatio = speedRatio;\n if (from !== undefined) {\n this._from = from;\n }\n if (to !== undefined) {\n this._to = to;\n }\n this._currentFrame = this._from;\n this._state = \"playing\";\n for (const { target, animation } of this.targetedAnimations) {\n captureOriginal(target as object, animation.targetProperty);\n }\n this._host?._registerStructuralGroup(this);\n this._host?._recomputeStructuralBlends();\n return this;\n }\n\n /** Babylon.js `goToFrame(frame)` — seek to a frame (loaded groups seek + hold via Lite; structural groups re-blend). */\n public goToFrame(frame: number): this {\n if (this._lite && this._engine) {\n liteGoToFrame(this._lite, frame, this._engine);\n } else {\n this._currentFrame = frame;\n this._host?._recomputeStructuralBlends();\n }\n return this;\n }\n\n public play(loop?: boolean): this {\n if (this._lite) {\n if (loop !== undefined) {\n this._lite.loopAnimation = loop;\n }\n playAnimation(this._lite);\n } else {\n this._state = \"playing\";\n }\n return this;\n }\n\n public pause(): this {\n if (this._lite) {\n pauseAnimation(this._lite);\n } else {\n this._state = \"paused\";\n }\n return this;\n }\n\n public stop(): this {\n if (this._lite) {\n stopAnimation(this._lite);\n } else {\n this._state = \"stopped\";\n }\n return this;\n }\n\n public reset(): this {\n if (this._lite && this._engine) {\n liteGoToFrame(this._lite, 0, this._engine);\n } else {\n this._state = \"init\";\n }\n return this;\n }\n\n /** @internal Whether this structural group currently contributes to blending (started, not stopped). */\n public _isStructuralActive(): boolean {\n return !this._lite && (this._state === \"playing\" || this._state === \"paused\");\n }\n\n /** @internal Advance a playing structural group's frame by `deltaMs` (with loop wrap). */\n public _advanceStructural(deltaMs: number): void {\n if (this._lite || this._state !== \"playing\") {\n return;\n }\n const fps = this.targetedAnimations[0]?.animation.framePerSecond ?? 60;\n this._currentFrame += (deltaMs / 1000) * fps * this._speedRatio;\n if (this._currentFrame > this._to) {\n if (this._loopAnimation) {\n const span = this._to - this._from || 1;\n this._currentFrame = this._from + ((this._currentFrame - this._from) % span);\n } else {\n this._currentFrame = this._to;\n this._state = \"stopped\";\n }\n }\n }\n\n /**\n * @internal Babylon.js manual weighted / cross-fade blending. Groups of\n * animations targeting the same (target, property) are mixed by weight: when\n * the total weight exceeds 1 the contributions are normalized, and when it is\n * below 1 the property's captured rest-pose baseline fills the remainder.\n */\n public static _blendStructuralGroups(groups: readonly AnimationGroup[]): void {\n interface Holder {\n target: object;\n path: string;\n total: number;\n contributions: Array<{ value: AnimValue; weight: number }>;\n }\n const holders = new Map<object, Map<string, Holder>>();\n for (const group of groups) {\n if (!group._isStructuralActive()) {\n continue;\n }\n const weight = group._weight;\n for (const { target, animation } of group.targetedAnimations) {\n const obj = target as object;\n const path = animation.targetProperty;\n const value = animation.evaluate(group._currentFrame);\n let perTarget = holders.get(obj);\n if (!perTarget) {\n perTarget = new Map();\n holders.set(obj, perTarget);\n }\n let holder = perTarget.get(path);\n if (!holder) {\n holder = { target: obj, path, total: 0, contributions: [] };\n perTarget.set(path, holder);\n }\n holder.total += weight;\n holder.contributions.push({ value, weight });\n }\n }\n for (const perTarget of holders.values()) {\n for (const holder of perTarget.values()) {\n const original = structuralOriginals.get(holder.target)?.get(holder.path) ?? 0;\n let final: AnimValue;\n if (holder.total === 0) {\n final = original;\n } else {\n let normalizer = 1;\n if (holder.total < 1) {\n final = scaleValue(original, 1 - holder.total);\n } else {\n normalizer = holder.total;\n final = zeroLike(holder.contributions[0]!.value);\n }\n for (const c of holder.contributions) {\n final = addValue(final, scaleValue(c.value, c.weight / normalizer));\n }\n }\n applyAnimatedValue(holder.target, holder.path, final);\n }\n }\n }\n}\n","/**\n * Babylon.js-compatible `Scene` implemented over a Babylon Lite `SceneContext`.\n *\n * The wrapper owns a Lite `SceneContext` (`_lite`) and proxies the common\n * Babylon.js scene surface: `clearColor`, `activeCamera`, the before/after-render\n * observables, default camera creation, and disposal. Entities created by the\n * compat light/camera/mesh wrappers register themselves against `_lite`.\n *\n * `scene.render()` is a no-op: Babylon Lite drives rendering through the engine's\n * loop (`runRenderLoop` / `startEngine`). Manual single-frame rendering is not\n * supported in this compat layer.\n */\n\nimport {\n createSceneContext,\n disposeScene,\n onBeforeRender,\n createDefaultCamera as liteCreateDefaultCamera,\n setFog,\n setClipPlane,\n loadEnvironment,\n loadDdsEnvironment,\n createHemisphericLight,\n addToScene,\n createAnimationManager,\n addAnimationGroup,\n enableAnimationBlending,\n updateAnimationManager,\n} from \"babylon-lite\";\nimport type { SceneContext, Camera as LiteCamera, ArcRotateCamera as LiteArcRotateCamera, FreeCamera as LiteFreeCamera, AnimationManager } from \"babylon-lite\";\n\nimport { Color3, Color4 } from \"../math/color.js\";\nimport type { Plane } from \"../math/plane.js\";\nimport { unsupported } from \"../error.js\";\nimport { Observable } from \"../misc/observable.js\";\nimport type { Camera } from \"../cameras/cameras.js\";\nimport { ArcRotateCamera, FreeCamera } from \"../cameras/cameras.js\";\nimport { StandardMaterial } from \"../materials/materials.js\";\nimport { Animatable } from \"../animations/animation.js\";\nimport type { Animation } from \"../animations/animation.js\";\nimport { AnimationGroup } from \"../animations/animation.js\";\nimport type { CubeTexture } from \"../textures/textures.js\";\nimport type { WebGPUEngine } from \"../engine/engine.js\";\nimport { AbstractScene } from \"./abstract-scene.js\";\n\n/** Babylon.js EnvironmentHelper default skybox/ground/BRDF assets (match the Lite ports). */\nconst DEFAULT_SKYBOX_URL = \"https://assets.babylonjs.com/core/environments/backgroundSkybox.dds\";\nconst DEFAULT_GROUND_URL = \"https://assets.babylonjs.com/core/environments/backgroundGround.png\";\nconst DEFAULT_BRDF_URL = \"/brdf-lut.png\";\n/** Babylon.js `createDefaultEnvironment` IBL fallback when no `environmentTexture` is set. */\nconst DEFAULT_ENV_URL = \"https://assets.babylonjs.com/environments/environmentSpecular.env\";\n\ninterface DefaultEnvironmentOptions {\n createSkybox?: boolean;\n createGround?: boolean;\n skyboxSize?: number;\n /** Babylon.js EnvironmentHelper: set up tone mapping / exposure / contrast (default true). */\n setupImageProcessing?: boolean;\n /** Babylon.js EnvironmentHelper camera exposure (default 0.8). */\n cameraExposure?: number;\n /** Babylon.js EnvironmentHelper camera contrast (default 1.2). */\n cameraContrast?: number;\n /** Babylon.js EnvironmentHelper tone-mapping toggle (default true). */\n toneMappingEnabled?: boolean;\n /** @internal When set, the skybox is the environment texture itself (Babylon.js `createDefaultSkybox`). */\n skyboxFromEnv?: boolean;\n /** @internal Apply EnvironmentHelper image processing (only set by `createDefaultEnvironment`). */\n applyImageProcessing?: boolean;\n}\n\n/**\n * Minimal `SceneContext` stand-in for a headless ({@link NullEngine}) scene, which\n * has no Lite GPU context. It satisfies only the plain data accessors a deviceless\n * scene may touch (`clearColor` / `camera` / `imageProcessing` / `animationGroups`);\n * no Lite scene method is ever invoked on it.\n */\nfunction createHeadlessLite(): SceneContext {\n return {\n clearColor: { r: 0, g: 0, b: 0, a: 1 },\n camera: null,\n imageProcessing: { exposure: 1, contrast: 1, toneMappingEnabled: false },\n animationGroups: [],\n } as unknown as SceneContext;\n}\n\nexport class Scene extends AbstractScene {\n /** @internal Underlying Babylon Lite scene context. */\n public readonly _lite: SceneContext;\n\n /** Babylon.js fog-mode constants. */\n public static readonly FOGMODE_NONE = 0;\n public static readonly FOGMODE_EXP = 1;\n public static readonly FOGMODE_EXP2 = 2;\n public static readonly FOGMODE_LINEAR = 3;\n\n /** Fires before each scene render (wired to Lite's before-render hook). */\n public readonly onBeforeRenderObservable = new Observable<Scene>();\n /** Fires before animations are evaluated each frame (used by ported cross-fade drivers). */\n public readonly onBeforeAnimationsObservable = new Observable<Scene>();\n /** Fires after each scene render. */\n public readonly onAfterRenderObservable = new Observable<Scene>();\n /** Fires once when the scene is disposed. */\n public readonly onDisposeObservable = new Observable<Scene>();\n\n /**\n * Babylon.js `scene.animationGroups` / `scene.animatables`. Loaded glTF /\n * `.babylon` animation clips live on the Lite scene; `animationGroups` returns\n * BJS-shaped `AnimationGroup`s over them (so scenes can `goToFrame`/`pause`/`stop`\n * to freeze a model at a deterministic frame). `animatables` surfaces the running\n * CPU `Animatable`s started via `beginDirectAnimation`.\n */\n public get animationGroups(): AnimationGroup[] {\n const liteGroups = this._lite.animationGroups ?? [];\n return liteGroups.map((g) => {\n let wrapper = this._animationGroupCache.get(g);\n if (!wrapper) {\n wrapper = AnimationGroup._fromLite(g, this._engine._lite, this);\n this._animationGroupCache.set(g, wrapper);\n }\n return wrapper;\n });\n }\n\n /** Babylon.js `scene.getAnimationGroupByName(name)` — first loaded animation group with a matching name, else `null`. */\n public getAnimationGroupByName(name: string): AnimationGroup | null {\n return this.animationGroups.find((g) => g.name === name) ?? null;\n }\n\n public get animatables(): Animatable[] {\n return this._runningAnimatables;\n }\n\n private readonly _engine: WebGPUEngine;\n private _activeCamera: Camera | null = null;\n private _defaultMaterial: StandardMaterial | null = null;\n private _fogMode = 0;\n private _fogStart = 0;\n private _fogEnd = 1000;\n private _fogDensity = 0.1;\n private _fogColor = new Color3(0.2, 0.2, 0.3);\n /**\n * @internal Mesh scene-adds deferred until the engine starts. Babylon Lite\n * locks a mesh into a render group (standard vs PBR) at `addToScene` time by\n * reading its material, whereas Babylon.js code routinely creates a mesh and\n * assigns `mesh.material` a line later. Deferring the add until engine start\n * lets those assignments settle so the mesh lands in the correct group.\n */\n private readonly _pendingAdds: Array<() => void> = [];\n private _started = false;\n private _envTexture: CubeTexture | null = null;\n private _defaultEnvOptions: DefaultEnvironmentOptions | null = null;\n private readonly _shadowGenerators: Array<{ _build(engine: import(\"babylon-lite\").EngineContext): void; _liteGen?: unknown }> = [];\n private readonly _pendingTextures: Array<Promise<void>> = [];\n private readonly _pendingGroundBakes: Array<() => void> = [];\n private readonly _pendingMorphBuilds: Array<{ mesh: { _lite: unknown }; manager: { _build(mesh: never, engine: import(\"babylon-lite\").EngineContext): void } }> = [];\n private readonly _runningAnimatables: Animatable[] = [];\n private readonly _animationGroupCache = new WeakMap<object, AnimationGroup>();\n /** @internal Structural `AnimationGroup`s stepped + weight-blended each frame. */\n private readonly _structuralGroups: AnimationGroup[] = [];\n /** @internal Lite manager that weight/additive-blends loaded glTF groups (lazily created). */\n private _blendManager: AnimationManager | null = null;\n private _ambientColor = new Color3(0, 0, 0);\n private _environmentIntensity = 1;\n /** @internal Whether this scene is bound to a headless `NullEngine` (no GPU context). */\n private _headless = false;\n /** @internal Tracks whether at least one frame has ticked (gates `onAfterRenderObservable`). */\n private _renderedAFrame = false;\n /** @internal `NodeMaterial`s whose async parse the engine drives after shadow generators are built. */\n private readonly _nodeMaterials: Array<{ _parse(engine: import(\"babylon-lite\").EngineContext, shadowGenerators: readonly unknown[]): Promise<void> }> = [];\n\n /** @internal Process-unique scene-id source (Babylon.js `scene.uniqueId` / `getUniqueId()`). */\n private static _uidCounter = 0;\n /** Babylon.js `scene.uniqueId` — a process-unique numeric id. */\n public readonly uniqueId = ++Scene._uidCounter;\n\n public constructor(engine: WebGPUEngine) {\n super();\n this._engine = engine;\n if (engine._headless) {\n // Headless (`NullEngine`): no Lite scene context — the engine drives a\n // pure-JS tick loop (see `NullEngine.runRenderLoop`) that calls `_tick`.\n // Only the deviceless surface (CPU animations, manual canvas drawing)\n // works; there is no GPU rendering. The stub `_lite` satisfies the few\n // plain accessors a headless scene may touch (camera / clearColor / …).\n this._headless = true;\n this._lite = createHeadlessLite();\n engine._registerScene(this);\n return;\n }\n this._lite = createSceneContext(engine._lite);\n // Babylon Lite exposes a before-render hook but no after-render hook. We\n // fire `onBeforeRenderObservable` on each tick, and approximate\n // `onAfterRenderObservable` by firing it at the start of the *next* tick\n // (i.e. after the previous frame has rendered). `addOnce` after-render\n // listeners therefore resolve one frame later than they would in BJS.\n onBeforeRender(this._lite, (deltaMs: number) => this._tick(deltaMs));\n engine._registerScene(this);\n }\n\n /**\n * @internal Per-frame update: advance CPU animations and fire the render\n * observables. Driven by Babylon Lite's before-render hook for GPU engines, or\n * by the `NullEngine` `requestAnimationFrame` loop for headless engines.\n */\n public _tick(deltaMs: number): void {\n // Record the frame delta so `engine.getDeltaTime()` (read inside before-render\n // observers) reflects the current frame.\n this._engine._lastDeltaMs = deltaMs;\n this.onBeforeAnimationsObservable.notifyObservers(this);\n if (this._blendManager) {\n updateAnimationManager(this._blendManager, deltaMs);\n }\n for (const a of this._runningAnimatables) {\n a._tick(deltaMs);\n }\n if (this._structuralGroups.length > 0) {\n for (const g of this._structuralGroups) {\n g._advanceStructural(deltaMs);\n }\n AnimationGroup._blendStructuralGroups(this._structuralGroups);\n }\n if (this._renderedAFrame) {\n this.onAfterRenderObservable.notifyObservers(this);\n }\n this._renderedAFrame = true;\n this.onBeforeRenderObservable.notifyObservers(this);\n }\n\n public getEngine(): WebGPUEngine {\n return this._engine;\n }\n\n /** Babylon.js `scene.getClassName()`. */\n public getClassName(): string {\n return \"Scene\";\n }\n\n /** Babylon.js `scene.getUniqueId()` — the process-unique scene id. */\n public getUniqueId(): number {\n return this.uniqueId;\n }\n\n /**\n * @internal Add a mesh to the Lite scene, deferring until engine start if the\n * engine has not started yet (so a later `mesh.material = …` is captured in the\n * correct render group). After start, adds happen immediately and Lite's\n * material-swap path handles re-routing.\n */\n public _deferAdd(add: () => void): void {\n if (this._started) {\n add();\n } else {\n this._pendingAdds.push(add);\n }\n }\n\n /** @internal Flush deferred mesh adds. Called by the engine just before `registerScene`. */\n public _flushPendingAdds(): void {\n this._started = true;\n for (const add of this._pendingAdds) {\n add();\n }\n this._pendingAdds.length = 0;\n }\n\n /** @internal Register a compat `ShadowGenerator` to be built at engine start. */\n public _registerShadowGenerator(gen: { _build(engine: import(\"babylon-lite\").EngineContext): void }): void {\n this._shadowGenerators.push(gen);\n }\n\n /** @internal Track an async texture load so the engine can await it before building the scene. */\n public _trackTextureLoad(promise: Promise<void>): void {\n this._pendingTextures.push(promise);\n }\n\n /** @internal Await all in-flight texture loads (so material maps are GPU-ready at build). */\n public async _awaitPendingTextures(): Promise<void> {\n if (this._pendingTextures.length > 0) {\n await Promise.all(this._pendingTextures);\n this._pendingTextures.length = 0;\n }\n }\n\n /**\n * @internal Register a deferred ground-UV bake (for `CreateGroundFromHeightMap` with a\n * PBR `albedoTexture` whose `uScale`/`vScale` tiling must be baked into the geometry,\n * since Babylon Lite's PBR pipeline has no material-level UV scale). Run by\n * {@link _bakeGroundUvs} after textures load, so the material's `albedoTexture` (assigned\n * by user code after the heightmap resolves) is in place and its tiling is read correctly.\n */\n public _registerGroundUvBake(bake: () => void): void {\n this._pendingGroundBakes.push(bake);\n }\n\n /** @internal Run deferred ground-UV bakes. Called by the engine after `_awaitPendingTextures`. */\n public _bakeGroundUvs(): void {\n for (const bake of this._pendingGroundBakes) {\n bake();\n }\n this._pendingGroundBakes.length = 0;\n }\n\n /**\n * @internal Register a mesh's compat `MorphTargetManager` to be built at engine\n * start. Building is deferred so the mesh's base CPU geometry (set by primitive\n * builders / `VertexData.applyToMesh`) exists when per-target deltas are computed.\n */\n public _registerMorphTargetManager(mesh: { _lite: unknown }, manager: { _build(mesh: never, engine: import(\"babylon-lite\").EngineContext): void }): void {\n this._pendingMorphBuilds.push({ mesh, manager });\n }\n\n /** @internal Build all registered morph-target managers. Called by the engine before registration. */\n public _buildMorphTargets(): void {\n const engine = this._engine._lite;\n for (const { mesh, manager } of this._pendingMorphBuilds) {\n manager._build(mesh as never, engine);\n }\n this._pendingMorphBuilds.length = 0;\n }\n\n /** @internal Whether any shadow generator is present (engine uses shadow-aware registration). */\n public _hasShadows(): boolean {\n return this._shadowGenerators.length > 0;\n }\n\n /** @internal Build all registered shadow generators. Called after meshes are added. */\n public _buildShadowGenerators(): void {\n const engine = this._engine._lite;\n for (const gen of this._shadowGenerators) {\n gen._build(engine);\n }\n }\n\n /** @internal Register a `NodeMaterial` whose parse the engine drives after shadow build. */\n public _registerNodeMaterial(material: { _parse(engine: import(\"babylon-lite\").EngineContext, shadowGenerators: readonly unknown[]): Promise<void> }): void {\n this._nodeMaterials.push(material);\n }\n\n /**\n * @internal Parse all registered `NodeMaterial`s, passing the scene's built Lite\n * shadow generators so NME shadow-receiver blocks sample them (Babylon.js wires\n * shadows into the scene globally; Babylon Lite takes them at NME parse time).\n * Must run after `_buildShadowGenerators` so the Lite generators exist.\n */\n public async _parseNodeMaterials(): Promise<void> {\n if (this._nodeMaterials.length === 0) {\n return;\n }\n const engine = this._engine._lite;\n const liteGens = this._shadowGenerators.map((g) => g._liteGen).filter((g): g is unknown => g !== undefined);\n await Promise.all(this._nodeMaterials.map((m) => m._parse(engine, liteGens)));\n this._nodeMaterials.length = 0;\n }\n\n /**\n * Babylon.js `scene.defaultMaterial` — a shared `StandardMaterial` applied to\n * meshes that have no material assigned. Babylon Lite requires every mesh to\n * carry a material to render, so the mesh wrappers assign this lazily-created\n * default; reading it (or assigning a replacement) matches Babylon.js.\n */\n public get defaultMaterial(): StandardMaterial {\n if (!this._defaultMaterial) {\n this._defaultMaterial = new StandardMaterial(\"default material\", this);\n }\n return this._defaultMaterial;\n }\n public set defaultMaterial(value: StandardMaterial) {\n this._defaultMaterial = value;\n }\n\n public get clearColor(): Color4 {\n const c = this._lite.clearColor;\n return new Color4(c.r, c.g, c.b, c.a ?? 1);\n }\n public set clearColor(value: Color4) {\n // Babylon.js accepts a `Color3` here (alpha defaults to 1). A `Color3` has no\n // `a`, which would otherwise reach WebGPU's render pass as `undefined`.\n this._lite.clearColor = { r: value.r, g: value.g, b: value.b, a: value.a ?? 1 };\n }\n\n public get activeCamera(): Camera | null {\n return this._activeCamera;\n }\n public set activeCamera(camera: Camera | null) {\n this._activeCamera = camera;\n this._lite.camera = (camera?._lite as LiteCamera | undefined) ?? null;\n }\n\n /**\n * @internal Surface a camera parsed from a loaded asset (`.babylon` files carry\n * their own camera) as the compat `scene.activeCamera`. Babylon Lite's\n * `addToScene` sets `scene._lite.camera` from the asset, but the compat scene\n * only tracks cameras created through the wrapper classes — so after a load with\n * no explicit camera we wrap the Lite one here. Loaded `.babylon` cameras are\n * always free cameras (see `parseBabylonCamera`).\n */\n public _surfaceLoadedCamera(): void {\n if (this._activeCamera || !this._lite.camera) {\n return;\n }\n FreeCamera._adopt(\"camera\", this._lite.camera as LiteFreeCamera, this);\n }\n\n /** Image-processing exposure proxy (Babylon.js `imageProcessingConfiguration.exposure`). */\n public get imageProcessingConfiguration(): { exposure: number; contrast: number; toneMappingEnabled: boolean } {\n return this._lite.imageProcessing;\n }\n\n /** Babylon.js `scene.performancePriority` — accepted for parity; Babylon Lite tunes its own pipeline. */\n public performancePriority = 0;\n\n /**\n * Babylon.js `scene.ambientColor` — the scene-wide ambient term multiplied into\n * each material's ambient contribution. Babylon Lite bakes ambient at the\n * material level (the `.babylon` loader folds `scene.ambientColor` into each\n * material), so this is stored for parity; the BJS default `(0,0,0)` is a no-op.\n */\n public get ambientColor(): Color3 {\n return this._ambientColor;\n }\n public set ambientColor(value: Color3) {\n this._ambientColor = value;\n }\n\n /**\n * Babylon.js `scene.environmentIntensity` — a global multiplier on IBL\n * contribution. Babylon Lite applies environment intensity per PBR material;\n * this is stored for parity (the BJS default `1` is a no-op).\n */\n public get environmentIntensity(): number {\n return this._environmentIntensity;\n }\n public set environmentIntensity(value: number) {\n this._environmentIntensity = value;\n }\n\n /**\n * Babylon.js `scene.useRightHandedSystem`. Babylon Lite's coordinate system is\n * fixed; this is stored for parity (the BJS WebGPU default is left-handed —\n * `false` — so the common case is a no-op).\n */\n public useRightHandedSystem = false;\n\n /** Babylon.js `scene.registerBeforeRender(cb)` — convenience over `onBeforeRenderObservable`. */\n public registerBeforeRender(callback: () => void): void {\n this.onBeforeRenderObservable.add(callback);\n }\n\n /** Babylon.js `scene.unregisterBeforeRender(cb)`. */\n public unregisterBeforeRender(callback: () => void): void {\n this.onBeforeRenderObservable.removeCallback(callback);\n }\n\n /** Babylon.js `scene.registerAfterRender(cb)` — convenience over `onAfterRenderObservable`. */\n public registerAfterRender(callback: () => void): void {\n this.onAfterRenderObservable.add(callback);\n }\n\n /** Babylon.js `scene.unregisterAfterRender(cb)`. */\n public unregisterAfterRender(callback: () => void): void {\n this.onAfterRenderObservable.removeCallback(callback);\n }\n\n /** Babylon.js `scene.attachControl` — camera input is attached per-camera in the compat layer; no-op. */\n public attachControl(_attachUp?: boolean, _attachDown?: boolean, _attachMove?: boolean): void {\n // Camera control is wired through `camera.attachControl(canvas)`.\n }\n\n /** Babylon.js `scene.detachControl` — no-op (see {@link attachControl}). */\n public detachControl(): void {\n // No-op.\n }\n\n // ── Fog (Babylon.js `scene.fogMode/fogStart/fogEnd/fogDensity/fogColor`) ──\n\n public get fogMode(): number {\n return this._fogMode;\n }\n public set fogMode(value: number) {\n this._fogMode = value;\n this._applyFog();\n }\n\n public get fogStart(): number {\n return this._fogStart;\n }\n public set fogStart(value: number) {\n this._fogStart = value;\n this._applyFog();\n }\n\n public get fogEnd(): number {\n return this._fogEnd;\n }\n public set fogEnd(value: number) {\n this._fogEnd = value;\n this._applyFog();\n }\n\n public get fogDensity(): number {\n return this._fogDensity;\n }\n public set fogDensity(value: number) {\n this._fogDensity = value;\n this._applyFog();\n }\n\n public get fogColor(): Color3 {\n return this._fogColor;\n }\n public set fogColor(value: Color3) {\n this._fogColor = value;\n this._applyFog();\n }\n\n /** @internal Push the current fog config into the Lite scene UBO. */\n private _applyFog(): void {\n setFog(this._lite, {\n mode: this._fogMode as 0 | 1 | 2 | 3,\n density: this._fogDensity,\n start: this._fogStart,\n end: this._fogEnd,\n color: [this._fogColor.r, this._fogColor.g, this._fogColor.b],\n });\n }\n\n // ── Clip plane (Babylon.js `scene.clipPlane`) ──\n\n private _clipPlane: Plane | null = null;\n\n /**\n * Babylon.js `scene.clipPlane` — a single world-space clip plane\n * (`normal · p + d = 0`); fragments on the negative side are discarded.\n * Routed to Babylon Lite's opt-in `setClipPlane`.\n */\n public get clipPlane(): Plane | null {\n return this._clipPlane;\n }\n public set clipPlane(value: Plane | null) {\n this._clipPlane = value;\n if (value) {\n setClipPlane(this._lite, [value.normal.x, value.normal.y, value.normal.z, value.d]);\n } else {\n setClipPlane(this._lite, [0, 0, 0, 0]);\n }\n }\n\n // ── Environment / IBL (Babylon.js `scene.environmentTexture` + `createDefaultEnvironment`) ──\n\n public get environmentTexture(): CubeTexture | null {\n return this._envTexture;\n }\n public set environmentTexture(value: CubeTexture | null) {\n this._envTexture = value;\n }\n\n /**\n * Babylon.js `scene.createDefaultEnvironment` — adds an IBL skybox and ground.\n * Babylon Lite performs this through `loadEnvironment` (deferred to engine start),\n * combining the environment URL recorded via `scene.environmentTexture` with\n * Babylon.js's default skybox/ground assets.\n */\n public createDefaultEnvironment(options: DefaultEnvironmentOptions = {}): { dispose(): void } {\n this._defaultEnvOptions = {\n createSkybox: true,\n createGround: true,\n ...options,\n // Babylon.js EnvironmentHelper sets up image processing by default.\n applyImageProcessing: options.setupImageProcessing !== false,\n };\n return { dispose(): void {} };\n }\n\n /**\n * Babylon.js `scene.createDefaultSkybox(texture, pbr?, scale?, blur?, setGlobalEnv?)` —\n * adds a skybox built from the given environment texture. Babylon Lite reuses the\n * loaded `.env` specular cubemap as an HDR skybox, so this records the env URL (if\n * not already set) and flags a skybox-from-environment load at engine start.\n */\n public createDefaultSkybox(texture?: CubeTexture, _pbr?: boolean, scale?: number, _blur?: number, _setGlobalEnv?: boolean): { dispose(): void } {\n if (texture) {\n this._envTexture = texture;\n }\n this._defaultEnvOptions = {\n ...(this._defaultEnvOptions ?? {}),\n createSkybox: true,\n createGround: false,\n skyboxFromEnv: true,\n ...(scale !== undefined ? { skyboxSize: scale } : {}),\n };\n return { dispose(): void {} };\n }\n\n /**\n * @internal Load the pending environment (IBL + skybox/ground) into the Lite\n * scene. Awaited by the engine before `registerScene` so the GPU env textures\n * exist when the scene builds.\n */\n public async _loadPendingEnvironment(): Promise<void> {\n // Babylon.js `createDefaultEnvironment` lights the scene from a built-in\n // environment even when no `environmentTexture` is assigned; fall back to\n // the default specular env so IBL-only scenes are lit correctly.\n const envUrl = this._envTexture?.url ?? (this._defaultEnvOptions ? DEFAULT_ENV_URL : undefined);\n if (!envUrl) {\n return;\n }\n const opts = this._defaultEnvOptions;\n const skyboxUrl = opts?.skyboxFromEnv ? envUrl : opts?.createSkybox ? DEFAULT_SKYBOX_URL : undefined;\n // Babylon.js `scene.environmentTexture = …` / `CubeTexture.CreateFromPrefilteredData`\n // does NOT change image processing — tone mapping stays at the scene's current\n // value (Babylon.js default: off). Babylon Lite's `loadEnvironment`/`loadDdsEnvironment`,\n // however, force tone mapping on (exposure 0.8 / contrast 1.2). That side effect is\n // wrong for ported code that only assigns `environmentTexture` (e.g. NME scenes), but it\n // happens to mirror what Babylon.js's `createDefaultEnvironment` (EnvironmentHelper) does.\n // Snapshot the scene's image-processing state and restore it after the env load so the\n // side effect is invisible; if `createDefaultEnvironment` was used we re-apply the\n // EnvironmentHelper image processing explicitly below — matching Babylon.js semantics.\n const ip = this._lite.imageProcessing;\n const ipSnapshot = { exposure: ip.exposure, contrast: ip.contrast, toneMappingEnabled: ip.toneMappingEnabled };\n // Babylon.js `CubeTexture.CreateFromPrefilteredData` accepts both `.env`\n // and `.dds` prefiltered environments. Babylon Lite splits these into two\n // loaders: `loadEnvironment` (`.env`) and `loadDdsEnvironment` (`.dds`).\n if (envUrl.toLowerCase().endsWith(\".dds\")) {\n await loadDdsEnvironment(this._lite, envUrl, {\n brdfUrl: DEFAULT_BRDF_URL,\n skipSkybox: !opts?.createSkybox,\n skipGround: !opts?.createGround,\n });\n } else {\n await loadEnvironment(this._lite, envUrl, {\n brdfUrl: DEFAULT_BRDF_URL,\n skyboxUrl,\n skipSkybox: !opts?.createSkybox,\n groundTextureUrl: opts?.createGround ? DEFAULT_GROUND_URL : undefined,\n skipGround: !opts?.createGround,\n skyboxSize: opts?.skyboxSize ?? 1000,\n });\n }\n ip.exposure = ipSnapshot.exposure;\n ip.contrast = ipSnapshot.contrast;\n ip.toneMappingEnabled = ipSnapshot.toneMappingEnabled;\n // Babylon.js EnvironmentHelper (`createDefaultEnvironment`) sets up image processing\n // by default: tone mapping on with exposure 0.8 / contrast 1.2 (all overridable). Apply\n // it here so `createDefaultEnvironment` scenes (e.g. PBR sphere grids) keep their tone\n // mapping while plain `environmentTexture` scenes (e.g. NME) do not.\n if (opts?.applyImageProcessing) {\n ip.toneMappingEnabled = opts.toneMappingEnabled ?? true;\n ip.exposure = opts.cameraExposure ?? 0.8;\n ip.contrast = opts.cameraContrast ?? 1.2;\n }\n }\n\n /** Create and activate a default arc-rotate camera framing the scene. */\n public createDefaultCamera(_createArcRotateCamera = true, _replace = true, _attachControl = false): Camera {\n const lite = liteCreateDefaultCamera(this._lite) as LiteArcRotateCamera;\n const camera = ArcRotateCamera._adopt(\"default camera\", lite, this);\n this._activeCamera = camera;\n return camera;\n }\n\n /** Babylon.js `createDefaultCameraOrLight` — default framing camera plus a default hemispheric light. */\n public createDefaultCameraOrLight(createArcRotateCamera = false, replace = false, attachControl = false): void {\n this.createDefaultCamera(createArcRotateCamera, replace, attachControl);\n addToScene(this._lite, createHemisphericLight([0, 1, 0], 1.0));\n }\n\n /** Babylon.js render hook. No-op under Babylon Lite's engine-driven loop. */\n public render(): void {\n // Intentionally empty: Lite renders registered scenes via startEngine.\n }\n\n /**\n * Babylon.js readiness gate. Babylon Lite builds its scene synchronously and\n * defers GPU work into `registerScene`/`startEngine` (driven by the engine's\n * render loop), so there is nothing to await here — resolve immediately.\n */\n public whenReadyAsync(): Promise<void> {\n return Promise.resolve();\n }\n\n /** Babylon.js synchronous readiness check — always ready in the compat layer. */\n public isReady(): boolean {\n return true;\n }\n\n /** Synchronous CPU picking — unsupported. Babylon Lite uses async GPU picking. */\n public pick(): never {\n return unsupported(\n \"Scene.pick\",\n \"Babylon Lite uses asynchronous GPU picking. Use the compat `GPUPicker` class (Babylon.js parity) or the native `createGpuPicker` + `pickAsync` API.\"\n );\n }\n\n /** Synchronous ray picking — unsupported. */\n public pickWithRay(): never {\n return unsupported(\"Scene.pickWithRay\", \"Synchronous CPU ray-mesh intersection is not implemented in Babylon Lite.\");\n }\n\n /**\n * Babylon.js `scene.beginDirectAnimation(target, animations, from, to, loop, speedRatio?)`.\n * Drives the given `Animation`s on the CPU each frame, writing onto the target's\n * (dotted) property path. Returns an `Animatable` with `goToFrame`/`pause`/`stop`.\n */\n public beginDirectAnimation(target: unknown, animations: Animation[], from: number, to: number, loop = false, speedRatio = 1): Animatable {\n const animatable = new Animatable(target, animations, from, to, loop, speedRatio);\n this._runningAnimatables.push(animatable);\n return animatable;\n }\n\n /** @internal Register a structural `AnimationGroup` to be stepped + blended each frame. */\n public _registerStructuralGroup(group: AnimationGroup): void {\n if (!this._structuralGroups.includes(group)) {\n this._structuralGroups.push(group);\n }\n }\n\n /** @internal Re-run weighted blending across all structural groups (after a seek/weight change). */\n public _recomputeStructuralBlends(): void {\n AnimationGroup._blendStructuralGroups(this._structuralGroups);\n }\n\n /**\n * @internal Route the scene's loaded Lite animation groups through a\n * scene-owned `AnimationManager` with weighted/additive blending enabled.\n *\n * Babylon.js treats the scene as an implicit animation mixer, so any loaded\n * group whose weight ≠ 1 (or that is made additive) must blend with its\n * siblings on the shared skeleton. Babylon Lite makes the manager explicit and\n * blending opt-in (`enableAnimationBlending`). When a glTF container is added,\n * Lite installs a per-group last-writer-wins tick (scene-core `addToScene`); we\n * detach each group's controller (`_ctrl`) so that tick skips them and the\n * weighted mixer — which drives groups via `_gltfMixer`, not `_ctrl` — owns the\n * pose instead. Idempotent.\n */\n public _enableLoadedBlend(): void {\n const liteGroups = this._lite.animationGroups ?? [];\n if (liteGroups.length === 0) {\n return;\n }\n if (!this._blendManager) {\n this._blendManager = createAnimationManager({ engine: this._engine._lite });\n enableAnimationBlending(this._blendManager);\n }\n for (const g of liteGroups) {\n addAnimationGroup(this._blendManager, g);\n (g as { _ctrl?: unknown })._ctrl = undefined;\n }\n }\n\n /**\n * Babylon.js `scene.beginAnimation(target, from, to, loop, speedRatio?)`. Runs\n * the animations already attached to `target.animations`.\n */\n public beginAnimation(target: { animations?: Animation[] }, from: number, to: number, loop = false, speedRatio = 1): Animatable {\n return this.beginDirectAnimation(target, target.animations ?? [], from, to, loop, speedRatio);\n }\n\n public dispose(): void {\n this.onDisposeObservable.notifyObservers(this);\n // A headless scene has no Lite context to dispose (see `createHeadlessLite`).\n if (!this._headless) {\n disposeScene(this._lite);\n }\n }\n}\n","/**\n * Babylon.js-compatible light classes implemented over the Babylon Lite light\n * factories.\n *\n * Babylon.js lights take the scene in their constructor and auto-register; these\n * wrappers do the same by calling `addToScene` when a scene is supplied. The\n * underlying Lite light is exposed as `_lite` for advanced interop.\n *\n * Colour properties (`diffuse`, `specular`, `groundColor`) are write-through on\n * assignment: `light.diffuse = new Color3(...)` propagates immediately. In-place\n * mutation of a returned colour (`light.diffuse.r = x`) does not propagate; assign\n * a new colour instead. Direction/position are backed by Lite's observable vectors\n * and propagate on `.x/.y/.z` writes.\n */\n\nimport { addToScene, createHemisphericLight, createDirectionalLight, createPointLight, createSpotLight } from \"babylon-lite\";\nimport type {\n HemisphericLight as LiteHemisphericLight,\n DirectionalLight as LiteDirectionalLight,\n PointLight as LitePointLight,\n SpotLight as LiteSpotLight,\n LightBase,\n} from \"babylon-lite\";\n\nimport { Color3 } from \"../math/color.js\";\nimport { Vector3 } from \"../math/vector.js\";\nimport { Node } from \"../node/node.js\";\nimport type { Scene } from \"../scene/scene.js\";\n\ntype Tuple3 = [number, number, number];\n\n/** Babylon.js `Light` — base class for all lights (derives from `Node`). */\nexport abstract class Light extends Node {\n /** @internal Underlying Babylon Lite light. */\n public abstract readonly _lite: LightBase;\n\n protected constructor(name: string, scene?: Scene) {\n super(name, scene);\n scene?._registerLight(this);\n }\n\n public override getClassName(): string {\n return \"Light\";\n }\n\n public abstract get intensity(): number;\n public abstract set intensity(value: number);\n\n /** Detach this light's shadow generator (compat for `light.shadowEnabled = false`). */\n public set shadowEnabled(enabled: boolean) {\n if (!enabled) {\n this._lite.shadowGenerator = undefined;\n }\n }\n\n public override dispose(): void {\n // Lite removes lights through the scene; without a back-reference the\n // caller should use `removeFromScene`. Detaching the shadow generator is\n // the safe, scene-free cleanup we can do here.\n this._lite.shadowGenerator = undefined;\n super.dispose();\n }\n}\n\nfunction readColor(tuple: Tuple3): Color3 {\n return new Color3(tuple[0], tuple[1], tuple[2]);\n}\n\nfunction writeColor(tuple: Tuple3, value: Color3): void {\n tuple[0] = value.r;\n tuple[1] = value.g;\n tuple[2] = value.b;\n}\n\nfunction readVector(vec: { x: number; y: number; z: number }): Vector3 {\n return new Vector3(vec.x, vec.y, vec.z);\n}\n\nexport class HemisphericLight extends Light {\n /** @internal Underlying Babylon Lite hemispheric light. */\n public readonly _lite: LiteHemisphericLight;\n\n public constructor(name: string, direction: Vector3, scene?: Scene) {\n super(name, scene);\n this._lite = createHemisphericLight(direction.asArray());\n if (scene) {\n addToScene(scene._lite, this._lite);\n }\n }\n\n public override getClassName(): string {\n return \"HemisphericLight\";\n }\n\n public get intensity(): number {\n return this._lite.intensity;\n }\n public set intensity(value: number) {\n this._lite.intensity = value;\n }\n\n public get direction(): Vector3 {\n return readVector(this._lite.direction);\n }\n public set direction(value: Vector3) {\n this._lite.direction.set(value.x, value.y, value.z);\n }\n\n public get diffuse(): Color3 {\n return readColor(this._lite.diffuseColor);\n }\n public set diffuse(value: Color3) {\n writeColor(this._lite.diffuseColor, value);\n }\n\n public get specular(): Color3 {\n return readColor(this._lite.specularColor);\n }\n public set specular(value: Color3) {\n writeColor(this._lite.specularColor, value);\n }\n\n public get groundColor(): Color3 {\n return readColor(this._lite.groundColor);\n }\n public set groundColor(value: Color3) {\n writeColor(this._lite.groundColor, value);\n }\n}\n\nexport class DirectionalLight extends Light {\n /** @internal Underlying Babylon Lite directional light. */\n public readonly _lite: LiteDirectionalLight;\n\n public constructor(name: string, direction: Vector3, scene?: Scene) {\n super(name, scene);\n this._lite = createDirectionalLight(direction.asArray());\n if (scene) {\n addToScene(scene._lite, this._lite);\n }\n }\n\n public override getClassName(): string {\n return \"DirectionalLight\";\n }\n\n public get intensity(): number {\n return this._lite.intensity;\n }\n public set intensity(value: number) {\n this._lite.intensity = value;\n }\n\n public get direction(): Vector3 {\n return readVector(this._lite.direction);\n }\n public set direction(value: Vector3) {\n this._lite.direction.set(value.x, value.y, value.z);\n }\n\n public get position(): Vector3 {\n return readVector(this._lite.position);\n }\n public set position(value: Vector3) {\n this._lite.position.set(value.x, value.y, value.z);\n }\n\n public get diffuse(): Color3 {\n return readColor(this._lite.diffuse);\n }\n public set diffuse(value: Color3) {\n writeColor(this._lite.diffuse, value);\n }\n\n public get specular(): Color3 {\n return readColor(this._lite.specular);\n }\n public set specular(value: Color3) {\n writeColor(this._lite.specular, value);\n }\n}\n\nexport class PointLight extends Light {\n /** @internal Underlying Babylon Lite point light. */\n public readonly _lite: LitePointLight;\n\n public constructor(name: string, position: Vector3, scene?: Scene) {\n super(name, scene);\n this._lite = createPointLight(position.asArray());\n if (scene) {\n addToScene(scene._lite, this._lite);\n }\n }\n\n public override getClassName(): string {\n return \"PointLight\";\n }\n\n public get intensity(): number {\n return this._lite.intensity;\n }\n public set intensity(value: number) {\n this._lite.intensity = value;\n }\n\n public get range(): number {\n return this._lite.range;\n }\n public set range(value: number) {\n this._lite.range = value;\n }\n\n public get position(): Vector3 {\n return readVector(this._lite.position);\n }\n public set position(value: Vector3) {\n this._lite.position.set(value.x, value.y, value.z);\n }\n\n public get diffuse(): Color3 {\n return readColor(this._lite.diffuse);\n }\n public set diffuse(value: Color3) {\n writeColor(this._lite.diffuse, value);\n }\n\n public get specular(): Color3 {\n return readColor(this._lite.specular);\n }\n public set specular(value: Color3) {\n writeColor(this._lite.specular, value);\n }\n}\n\nexport class SpotLight extends Light {\n /** @internal Underlying Babylon Lite spot light. */\n public readonly _lite: LiteSpotLight;\n\n public constructor(name: string, position: Vector3, direction: Vector3, angle: number, exponent: number, scene?: Scene) {\n super(name, scene);\n this._lite = createSpotLight(position.asArray(), direction.asArray(), angle, exponent);\n if (scene) {\n addToScene(scene._lite, this._lite);\n }\n }\n\n public override getClassName(): string {\n return \"SpotLight\";\n }\n\n public get intensity(): number {\n return this._lite.intensity;\n }\n public set intensity(value: number) {\n this._lite.intensity = value;\n }\n\n public get angle(): number {\n return this._lite.angle;\n }\n public set angle(value: number) {\n this._lite.angle = value;\n }\n\n public get exponent(): number {\n return this._lite.exponent;\n }\n public set exponent(value: number) {\n this._lite.exponent = value;\n }\n\n public get range(): number {\n return this._lite.range;\n }\n public set range(value: number) {\n this._lite.range = value;\n }\n\n public get position(): Vector3 {\n return readVector(this._lite.position);\n }\n public set position(value: Vector3) {\n this._lite.position.set(value.x, value.y, value.z);\n }\n\n public get direction(): Vector3 {\n return readVector(this._lite.direction);\n }\n public set direction(value: Vector3) {\n this._lite.direction.set(value.x, value.y, value.z);\n }\n\n public get diffuse(): Color3 {\n return readColor(this._lite.diffuse);\n }\n public set diffuse(value: Color3) {\n writeColor(this._lite.diffuse, value);\n }\n\n public get specular(): Color3 {\n return readColor(this._lite.specular);\n }\n public set specular(value: Color3) {\n writeColor(this._lite.specular, value);\n }\n}\n","/**\n * Babylon.js `CSG` (legacy) and `CSG2` (Manifold-based) constructive solid\n * geometry, wrapped over Babylon Lite's native CSG API.\n *\n * Babylon.js exposes two object-oriented CSG surfaces:\n * - `CSG.FromMesh(mesh)` → `.subtract` / `.intersect` / `.union` → `.toMesh(name, material, scene)`\n * - `CSG2.FromMesh(mesh)` → `.subtract` / `.intersect` / `.add` → `.toMesh(name, scene)` (+ `.dispose()`),\n * after `await InitializeCSG2Async()`.\n *\n * Babylon Lite ships the equivalent as standalone functions\n * (`createCsgFromMesh` / `csgSubtract` / … / `createMeshFromCsg`, and the CSG2\n * `createCsg2FromMesh` / `csg2Subtract` / … / `createMeshesFromCsg2`). These\n * classes adapt the function API to Babylon.js's method-chaining shape.\n *\n * CSG (legacy) `toMesh` takes an explicit material and produces a single mesh.\n * CSG2 preserves per-source materials: each `FromMesh` records its source mesh's\n * material against a unique slot, operations union those slot→material maps, and\n * `toMesh` triangulates into one Lite mesh per slot (`createMeshesFromCsg2`),\n * returning a single compat `Mesh` with the remaining sub-meshes parented under it\n * so positioning the result moves them together — matching Babylon.js's single\n * multi-material `toMesh` return.\n */\n\nimport {\n createCsgFromMesh,\n csgSubtract,\n csgIntersect,\n csgUnion,\n createMeshFromCsg,\n initializeCsg2Async,\n createCsg2FromMesh,\n csg2Subtract,\n csg2Intersect,\n csg2Add,\n createMeshesFromCsg2,\n disposeCsg2,\n addToScene,\n type CsgSolid,\n type Csg2Solid,\n type Material as LiteMaterial,\n} from \"babylon-lite\";\n\nimport { Mesh } from \"./meshes.js\";\nimport type { Scene } from \"../scene/scene.js\";\nimport type { StandardMaterial, PBRMaterial } from \"../materials/materials.js\";\nimport type { NodeMaterial } from \"../materials/node-material.js\";\n\ntype CompatMaterial = StandardMaterial | PBRMaterial | NodeMaterial;\n\n/** A compat mesh exposes its backing Lite mesh as `_lite`. */\ninterface MeshLike {\n _lite: import(\"babylon-lite\").Mesh;\n}\n\n/** @internal Add a freshly-built CSG result mesh to its scene at engine start. */\nfunction deferAddCsgMesh(mesh: Mesh, scene: Scene, material?: CompatMaterial): void {\n scene._deferAdd(() => {\n const engine = scene.getEngine()._lite;\n if (material) {\n material._ensureRenderable(engine);\n mesh._lite.material = material._lite as never;\n }\n addToScene(scene._lite, mesh._lite);\n });\n}\n\n/**\n * Babylon.js `CSG` — legacy constructive solid geometry. Build from a mesh with\n * {@link FromMesh}, combine with {@link subtract} / {@link intersect} /\n * {@link union}, then materialize with {@link toMesh}.\n */\nexport class CSG {\n private constructor(private readonly _lite: CsgSolid) {}\n\n /** Babylon.js `CSG.FromMesh(mesh)`. */\n public static FromMesh(mesh: MeshLike): CSG {\n return new CSG(createCsgFromMesh(mesh._lite));\n }\n\n /** Babylon.js `csg.subtract(other)` — `this − other`. */\n public subtract(other: CSG): CSG {\n return new CSG(csgSubtract(this._lite, other._lite));\n }\n\n /** Babylon.js `csg.intersect(other)`. */\n public intersect(other: CSG): CSG {\n return new CSG(csgIntersect(this._lite, other._lite));\n }\n\n /** Babylon.js `csg.union(other)`. */\n public union(other: CSG): CSG {\n return new CSG(csgUnion(this._lite, other._lite));\n }\n\n /** Babylon.js `csg.toMesh(name, material, scene)` — triangulate into a single mesh. */\n public toMesh(name: string, material: CompatMaterial | null, scene: Scene): Mesh {\n const engine = scene.getEngine()._lite;\n const lite = createMeshFromCsg(engine, this._lite, name);\n const mesh = new Mesh(name, lite, scene);\n deferAddCsgMesh(mesh, scene, material ?? undefined);\n return mesh;\n }\n}\n\n/** Module-wide unique material-slot counter for CSG2 (`MATERIAL_ID_RESERVE_COUNT` = 65536). */\nlet nextCsg2Slot = 0;\n\n/**\n * Babylon.js `CSG2` — Manifold-based constructive solid geometry that preserves\n * per-source-mesh materials. Call `await InitializeCSG2Async()` once before use.\n */\nexport class CSG2 {\n private constructor(\n private readonly _lite: Csg2Solid,\n /** Slot → source material, accumulated across operations. */\n private readonly _materials: Map<number, CompatMaterial>\n ) {}\n\n /** Babylon.js `CSG2.FromMesh(mesh)` — records the mesh's material against a unique slot. */\n public static FromMesh(mesh: MeshLike & { material?: CompatMaterial | null }): CSG2 {\n const slot = nextCsg2Slot++;\n const materials = new Map<number, CompatMaterial>();\n if (mesh.material) {\n materials.set(slot, mesh.material);\n }\n return new CSG2(createCsg2FromMesh(mesh._lite, slot), materials);\n }\n\n private _combine(lite: Csg2Solid, other: CSG2): CSG2 {\n const materials = new Map(this._materials);\n for (const [slot, material] of other._materials) {\n materials.set(slot, material);\n }\n return new CSG2(lite, materials);\n }\n\n /** Babylon.js `csg.subtract(other)` — `this − other`. */\n public subtract(other: CSG2): CSG2 {\n return this._combine(csg2Subtract(this._lite, other._lite), other);\n }\n\n /** Babylon.js `csg.intersect(other)`. */\n public intersect(other: CSG2): CSG2 {\n return this._combine(csg2Intersect(this._lite, other._lite), other);\n }\n\n /** Babylon.js `csg.add(other)` — union. */\n public add(other: CSG2): CSG2 {\n return this._combine(csg2Add(this._lite, other._lite), other);\n }\n\n /**\n * Babylon.js `csg.toMesh(name, scene)` — triangulate into a single mesh,\n * preserving each source mesh's material across the result's faces.\n */\n public toMesh(name: string, scene: Scene): Mesh {\n const engine = scene.getEngine()._lite;\n // Build a slot-indexed Lite material array (sparse; only referenced slots are read).\n const materials: LiteMaterial[] = [];\n for (const [slot, material] of this._materials) {\n material._ensureRenderable(engine);\n materials[slot] = material._lite as never;\n }\n const liteMeshes = createMeshesFromCsg2(engine, this._lite, materials, name);\n // `createMeshesFromCsg2` already assigned each sub-mesh its Lite material; wrapping\n // the first in a compat `Mesh` clobbers it with the scene default, so restore it.\n const savedMaterials = liteMeshes.map((m) => m.material);\n const root = new Mesh(name, liteMeshes[0]!, scene);\n root._lite.material = savedMaterials[0] as never;\n scene._deferAdd(() => addToScene(scene._lite, root._lite));\n // Parent the remaining material sub-meshes under the returned mesh so the whole\n // result moves as one (Babylon.js returns a single multi-material mesh).\n for (let i = 1; i < liteMeshes.length; i++) {\n const sub = liteMeshes[i]!;\n sub.material = savedMaterials[i] as never;\n (sub as unknown as { parent: unknown }).parent = root._lite;\n scene._deferAdd(() => addToScene(scene._lite, sub));\n }\n return root;\n }\n\n /** Babylon.js `csg.dispose()` — release the underlying Manifold solid. */\n public dispose(): void {\n disposeCsg2(this._lite);\n }\n}\n\n/** Babylon.js `InitializeCSG2Async()` — load the Manifold runtime before any `CSG2` use. */\nexport async function InitializeCSG2Async(): Promise<void> {\n await initializeCsg2Async();\n}\n","/**\n * Babylon.js `MeshoptCompression` (`@babylonjs/core/Meshes/Compression/meshoptCompression`).\n *\n * In Babylon.js this singleton owns the meshopt decoder used by the glTF\n * `EXT_meshopt_compression` loader extension, and apps configure its decoder URL\n * via the static `Configuration`. Babylon Lite decodes meshopt-compressed buffers\n * itself inside its glTF loader feature (`gltf-feature-meshopt`), so no external\n * decoder needs wiring. This compat shim therefore accepts the `Configuration`\n * assignment ported code performs (a no-op here) so the import resolves and the\n * asset still loads — the actual decode happens in Lite.\n */\nexport class MeshoptCompression {\n /**\n * Babylon.js `MeshoptCompression.Configuration` — the decoder location. Stored\n * for API parity but unused: Babylon Lite's glTF loader carries its own meshopt\n * decoder, so setting this has no effect on decoding.\n */\n public static Configuration: { decoder: { url: string } } = { decoder: { url: \"\" } };\n\n private static _default: MeshoptCompression | null = null;\n\n /** Babylon.js `MeshoptCompression.Default` — the lazily-created shared instance. */\n public static get Default(): MeshoptCompression {\n if (!MeshoptCompression._default) {\n MeshoptCompression._default = new MeshoptCompression();\n }\n return MeshoptCompression._default;\n }\n}\n","/**\n * Babylon.js-compatible `MorphTarget` / `MorphTargetManager` over the Babylon\n * Lite native morph API (`createMorphTargets` / `setMorphTargetWeights`).\n *\n * Babylon.js morph targets carry **absolute** vertex positions/normals\n * (`target.setPositions(abs)`); Babylon Lite's `createMorphTargets` consumes\n * per-target **deltas** (target − base). The manager defers building the Lite\n * morph until engine start (when the owning mesh's base CPU geometry exists),\n * computes the deltas, and assigns the resulting `MorphTargetData` onto the\n * Lite mesh so the Standard/NME pipelines sample it. Weight changes\n * (`target.influence = …`) re-upload via `setMorphTargetWeights`.\n */\n\nimport { createMorphTargets, setMorphTargetWeights } from \"babylon-lite\";\nimport type { EngineContext, MorphTargetData } from \"babylon-lite\";\n\nimport type { Scene } from \"../scene/scene.js\";\nimport type { Mesh } from \"../meshes/meshes.js\";\n\n/** Babylon.js `MorphTarget` — a single named morph influence with absolute target geometry. */\nexport class MorphTarget {\n public name: string;\n /** @internal Absolute target positions (Babylon.js `setPositions`). */\n public _positions: Float32Array | null = null;\n /** @internal Absolute target normals (Babylon.js `setNormals`). */\n public _normals: Float32Array | null = null;\n /** @internal Owning manager, set on `addTarget`, used to push weight updates. */\n public _manager: MorphTargetManager | undefined;\n private _influence: number;\n\n public constructor(name: string, influence = 0, _scene?: Scene) {\n this.name = name;\n this._influence = influence;\n }\n\n public get influence(): number {\n return this._influence;\n }\n public set influence(value: number) {\n this._influence = value;\n this._manager?._syncWeights();\n }\n\n /** Babylon.js `MorphTarget.setPositions(data)` — absolute target positions. */\n public setPositions(data: Float32Array | number[] | null): void {\n this._positions = data ? (data instanceof Float32Array ? data : Float32Array.from(data)) : null;\n }\n\n /** Babylon.js `MorphTarget.getPositions()`. */\n public getPositions(): Float32Array | null {\n return this._positions;\n }\n\n /** Babylon.js `MorphTarget.setNormals(data)` — absolute target normals. */\n public setNormals(data: Float32Array | number[] | null): void {\n this._normals = data ? (data instanceof Float32Array ? data : Float32Array.from(data)) : null;\n }\n\n /** Babylon.js `MorphTarget.getNormals()`. */\n public getNormals(): Float32Array | null {\n return this._normals;\n }\n}\n\n/** Babylon.js `MorphTargetManager` — owns a mesh's morph targets (Babylon Lite supports up to 4). */\nexport class MorphTargetManager {\n /** @internal */\n public _engine: EngineContext | undefined;\n /** @internal Built Lite morph data (created at engine start). */\n public _lite: MorphTargetData | undefined;\n private readonly _targets: MorphTarget[] = [];\n\n public constructor(_scene?: Scene) {\n // Scene retained implicitly via the mesh that adopts this manager.\n }\n\n public get numTargets(): number {\n return this._targets.length;\n }\n\n public getTarget(index: number): MorphTarget {\n return this._targets[index]!;\n }\n\n /** Babylon.js `MorphTargetManager.addTarget(target)`. */\n public addTarget(target: MorphTarget): void {\n target._manager = this;\n this._targets.push(target);\n }\n\n /**\n * @internal Build the Lite morph data from the mesh's base CPU geometry and\n * each target's absolute positions/normals (converted to deltas), then assign\n * it onto the Lite mesh. Called by the engine at start, once geometry exists.\n */\n public _build(mesh: Mesh, engine: EngineContext): void {\n const lite = mesh._lite as { _cpuPositions?: Float32Array; _cpuNormals?: Float32Array; morphTargets?: MorphTargetData | null };\n const base = lite._cpuPositions;\n if (!base) {\n return;\n }\n this._engine = engine;\n const vertexCount = base.length / 3;\n const baseNormals = lite._cpuNormals;\n const targets = this._targets.slice(0, 4).map((t) => {\n const abs = t._positions;\n const positions = new Float32Array(base.length);\n if (abs) {\n for (let i = 0; i < base.length; i++) {\n positions[i] = (abs[i] ?? 0) - base[i]!;\n }\n }\n let normals: Float32Array | null = null;\n if (t._normals && baseNormals) {\n normals = new Float32Array(baseNormals.length);\n for (let i = 0; i < baseNormals.length; i++) {\n normals[i] = (t._normals[i] ?? 0) - baseNormals[i]!;\n }\n }\n return { positions, normals };\n });\n const weights = this._targets.slice(0, 4).map((t) => t.influence);\n this._lite = createMorphTargets(engine, targets, vertexCount, weights);\n lite.morphTargets = this._lite;\n }\n\n /** @internal Re-upload current target influences to the GPU weights buffer. */\n public _syncWeights(): void {\n if (!this._lite || !this._engine) {\n return;\n }\n const weights = this._targets.slice(0, 4).map((t) => t.influence);\n setMorphTargetWeights(this._engine, this._lite, weights);\n }\n}\n","/**\n * Babylon.js-compatible `GaussianSplattingMesh` over Babylon Lite's splat loaders.\n *\n * Babylon Lite fully backs Gaussian Splatting: `loadSplat` (`.ply` / `.splat` /\n * compressed-PLY), `loadSOG`, and `loadSPZ` each return a `GaussianSplattingMesh`\n * (a `SceneNode` carrying the splat cloud), with `splatsData` / `updateData` for\n * in-place edits and `bakeCurrentTransformIntoVertices` to fold the node transform\n * into the splat data. This wrapper exposes that through the Babylon.js\n * `GaussianSplattingMesh` shape so ported scenes (`new GaussianSplattingMesh(...)` +\n * `loadFileAsync`, or `ImportMeshAsync` of a splat URL) run unchanged.\n *\n * Babylon.js constructs the mesh synchronously and populates it via\n * `loadFileAsync`; Babylon Lite loads atomically. We bridge this by holding a\n * lightweight placeholder transform node until the splat loads, buffering any\n * transforms set in the meantime, then adopting the loaded Lite node.\n */\n\nimport { loadSplat, loadSOG, loadSPZ, bakeCurrentTransformIntoVertices, createTransformNode } from \"babylon-lite\";\nimport type { GaussianSplattingMesh as LiteGsMesh, GsShaderFragment, SceneNode } from \"babylon-lite\";\n\nimport { TransformNode } from \"./meshes.js\";\nimport type { Scene } from \"../scene/scene.js\";\nimport type { Vector3 } from \"../math/vector.js\";\nimport { liteBackedVector3 } from \"../math/vector.js\";\n\n/** Lite loader chosen by file extension (mirrors the BJS splat plugin dispatch). */\nfunction liteLoaderFor(url: string): (scene: import(\"babylon-lite\").SceneContext, url: string, fragments?: readonly GsShaderFragment[]) => Promise<LiteGsMesh> {\n const lower = url.split(\"?\")[0]!.toLowerCase();\n if (lower.endsWith(\".sog\") || lower.endsWith(\".zip\")) {\n return loadSOG;\n }\n if (lower.endsWith(\".spz\")) {\n return loadSPZ;\n }\n // `.ply`, `.splat`, and compressed-PLY all flow through `loadSplat`.\n return loadSplat;\n}\n\n/** `.splat` row stride: position(3f) + scale(3f) + rgba(4×u8) + rot(4×u8) = 32 bytes. */\nconst SPLAT_ROW_BYTES = 32;\nconst SPLAT_ROW_FLOATS = SPLAT_ROW_BYTES / 4;\nconst SPLAT_Y_FLOAT_INDEX = 1;\n\n/**\n * @internal Return a copy of a `.splat` buffer with every row's centre Y negated\n * (the position-space half of Babylon.js's `flipY`). Used to reproduce\n * `updateData(..., { flipY: false })`. Only the 32-byte `.splat` row layout is\n * handled; other buffers are returned unchanged.\n */\nfunction mirrorSplatRowY(buffer: ArrayBuffer): ArrayBuffer {\n if (buffer.byteLength % SPLAT_ROW_BYTES !== 0) {\n return buffer;\n }\n const copy = buffer.slice(0);\n const floats = new Float32Array(copy);\n for (let f = SPLAT_Y_FLOAT_INDEX; f < floats.length; f += SPLAT_ROW_FLOATS) {\n floats[f] = -floats[f]!;\n }\n return copy;\n}\n\n/**\n * Babylon.js `GaussianSplattingMesh`. Derives from `TransformNode` so the loaded\n * cloud's `position` / `rotation` / `scaling` proxy onto the Lite splat node.\n */\nexport class GaussianSplattingMesh extends TransformNode {\n /** @internal The loaded Lite splat node (undefined until `loadFileAsync` resolves). */\n private _gs?: LiteGsMesh;\n /** @internal The constructor's deferred URL, loaded by `loadFileAsync()` with no argument. */\n private readonly _ctorUrl: string | null;\n /** @internal Optional Lite shader-fragment plugins applied at load (scene 126). */\n private _fragments?: readonly GsShaderFragment[];\n\n public constructor(name: string, url?: string | null, scene?: Scene, _keepInRam?: boolean) {\n // A placeholder transform node carries any transforms set before the splat\n // loads; it is never added to the scene (Lite `loadSplat` registers the real\n // splat node). Transforms are copied onto the loaded node in `loadFileAsync`.\n super(name, scene, createTransformNode(name));\n this._ctorUrl = url ?? null;\n }\n\n public override getClassName(): string {\n return \"GaussianSplattingMesh\";\n }\n\n /** @internal The transform-carrying Lite node: the loaded splat node once present, else the placeholder. */\n private get _xform(): SceneNode {\n return this._gs ?? this._node;\n }\n\n public override get position(): Vector3 {\n return liteBackedVector3(this._xform.position);\n }\n public override set position(value: Vector3) {\n this._xform.position.set(value.x, value.y, value.z);\n }\n\n public override get rotation(): Vector3 {\n return liteBackedVector3(this._xform.rotation);\n }\n public override set rotation(value: Vector3) {\n this._xform.rotation.set(value.x, value.y, value.z);\n }\n\n public override get scaling(): Vector3 {\n return liteBackedVector3(this._xform.scaling);\n }\n public override set scaling(value: Vector3) {\n this._xform.scaling.set(value.x, value.y, value.z);\n }\n\n /** @internal Set the Lite shader-fragment plugins applied on the next load (compat material-plugin path). */\n public _setFragments(fragments: readonly GsShaderFragment[]): void {\n this._fragments = fragments;\n }\n\n /**\n * Babylon.js `gs.loadFileAsync(url?)` — fetch + parse a splat asset and adopt\n * the resulting Lite node. With no argument, loads the constructor URL.\n */\n public async loadFileAsync(url?: string): Promise<GaussianSplattingMesh> {\n const target = url ?? this._ctorUrl;\n if (!target) {\n throw new Error(\"GaussianSplattingMesh.loadFileAsync: no URL provided (and none given to the constructor).\");\n }\n const scene = this._scene;\n if (!scene) {\n throw new Error(\"GaussianSplattingMesh.loadFileAsync requires a scene (pass one to the constructor).\");\n }\n const lite = await liteLoaderFor(target)(scene._lite, target, this._fragments);\n this._adopt(lite);\n return this;\n }\n\n /** @internal Adopt a loaded Lite splat node: carry over placeholder transforms + name, and register on the scene. */\n private _adopt(lite: LiteGsMesh): void {\n const placeholder = this._node;\n lite.position.set(placeholder.position.x, placeholder.position.y, placeholder.position.z);\n lite.scaling.set(placeholder.scaling.x, placeholder.scaling.y, placeholder.scaling.z);\n lite.rotation.set(placeholder.rotation.x, placeholder.rotation.y, placeholder.rotation.z);\n lite.name = this.name;\n this._gs = lite;\n this._scene?._registerMesh(this);\n }\n\n /** @internal Wrap an already-loaded Lite splat node (used by the loader's `ImportMeshAsync` path). */\n public static _fromLite(lite: LiteGsMesh, scene: Scene): GaussianSplattingMesh {\n const mesh = new GaussianSplattingMesh(lite.name, null, scene);\n mesh._gs = lite;\n scene._registerMesh(mesh);\n return mesh;\n }\n\n /** Babylon.js `gs.splatsData` — the raw 32-byte/splat row buffer (for inspection / `updateData`). */\n public get splatsData(): ArrayBuffer | null {\n return this._gs ? this._gs.splatsData : null;\n }\n\n /**\n * Babylon.js `gs.updateData(buffer, sh?, options?)` — replace the splat data in\n * place. Babylon Lite always applies its loader's Y convention on update; the\n * `sh` argument is accepted for signature parity and ignored.\n *\n * `options.flipY === false` is honoured: Babylon.js's `.splat` loader flips Y\n * on load by default, so `flipY:false` re-uploads the buffer **without** that\n * flip — i.e. mirrored relative to the default-loaded pose, which ported scenes\n * then correct with `scaling.y = -1`. Lite has no per-call flip flag and always\n * applies its (flip-on-load-equivalent) convention, so we mirror the row Y here\n * to reproduce the `flipY:false` pose before handing the buffer to Lite.\n */\n public updateData(splatBuffer: ArrayBuffer, _sh?: unknown, options?: { flipY?: boolean }): void {\n const buffer = options?.flipY === false ? mirrorSplatRowY(splatBuffer) : splatBuffer;\n this._gs?.updateData(buffer);\n }\n\n /** Babylon.js `gs.bakeCurrentTransformIntoVertices()` — fold the node transform into the splat data. */\n public bakeCurrentTransformIntoVertices(): void {\n if (this._gs) {\n bakeCurrentTransformIntoVertices(this._gs);\n }\n }\n\n /** @internal Babylon.js's worker-throttle flag; ported scenes poll it to detect the first sort. */\n public get _canPostToWorker(): boolean {\n return this._gs ? this._gs._canPostToWorker : false;\n }\n\n /** @internal The loaded Lite splat node, for the GPU picker's result mapping (undefined until loaded). */\n public get _pickLiteNode(): LiteGsMesh | undefined {\n return this._gs;\n }\n}\n","/**\n * Babylon.js-compatible texture wrappers over Babylon Lite's `loadTexture2D`.\n *\n * Babylon.js's `Texture` constructor is synchronous and loads in the background.\n * Babylon Lite loads textures asynchronously. The compat `Texture` kicks off the\n * load in its constructor and resolves `_lite` when ready; assign the texture to\n * a material after `await texture.whenReadyAsync()` (or construct via\n * `Texture.LoadAsync`) so the GPU handle is present when the material binds.\n */\n\nimport { loadTexture2D, loadBasisTexture2D, loadKtxTexture2D, createTexture2DFromPixels, updateTexture2DFromPixels } from \"babylon-lite\";\nimport type { Texture2D, Texture2DOptions, EngineContext } from \"babylon-lite\";\n\nimport { unsupported } from \"../error.js\";\nimport { Observable } from \"../misc/observable.js\";\nimport type { Scene } from \"../scene/scene.js\";\n\n/** Compression suffix → `loadKtxTexture2D` token, recognised in a pre-resolved KTX URL. */\nconst KTX_SUFFIX_RE = /(-astc|-dxt|-etc2|-pvrtc)\\.ktx(\\?.*)?$/i;\n\n/**\n * @internal Recognise a pre-resolved compressed KTX URL and split it into the\n * `{ baseUrl, suffix }` pair Babylon Lite's `loadKtxTexture2D` expects (which\n * takes a base image URL plus a format suffix and reconstructs the KTX URL\n * itself), or `null` when the URL is not a compressed KTX.\n *\n * Babylon.js code selects the format via `engine.getCaps()` and hands `Texture`\n * a single fully-qualified `.ktx` URL (e.g. `…/grid-dxt.ktx`), so the base is the\n * `.png` fallback (`…/grid.png`) and the suffix is `-dxt.ktx`. Any query string\n * (auth / cache-busting / signed-URL params) is preserved on the base URL so it\n * survives onto both the KTX fetch and the `.png` fallback.\n */\nexport function resolveKtxUrl(url: string): { baseUrl: string; suffix: string } | null {\n const ktx = url.match(KTX_SUFFIX_RE);\n if (!ktx) {\n return null;\n }\n return { baseUrl: url.replace(KTX_SUFFIX_RE, \".png$2\"), suffix: ktx[1]! + \".ktx\" };\n}\n\n/**\n * Pick the right Babylon Lite loader for a texture URL:\n * - `.basis` → `loadBasisTexture2D` (GPU-format transcode; manages its own V-flip).\n * - a pre-resolved compressed KTX (`…-dxt.ktx` etc.) → `loadKtxTexture2D` (see\n * {@link resolveKtxUrl}), which re-checks device support and falls back to the\n * base image.\n * - everything else → the raster `loadTexture2D`.\n *\n * The basis/KTX loaders manage their own V-orientation, so the raster-only\n * `invertY` / `mipMaps` options are ignored there — passing the same opts is safe.\n */\nfunction loadCompatTexture(engine: EngineContext, url: string, opts: Texture2DOptions): Promise<Texture2D> {\n const path = url.split(/[?#]/)[0]!.toLowerCase();\n if (path.endsWith(\".basis\")) {\n return loadBasisTexture2D(engine, url, opts);\n }\n const ktx = resolveKtxUrl(url);\n if (ktx) {\n return loadKtxTexture2D(engine, ktx.baseUrl, [ktx.suffix], opts);\n }\n return loadTexture2D(engine, url, opts);\n}\n\nexport abstract class BaseTexture {\n public name = \"\";\n /** @internal The underlying Lite texture handle. Undefined until the async load resolves. */\n public _lite: Texture2D | undefined;\n\n public getClassName(): string {\n return \"BaseTexture\";\n }\n\n public abstract whenReadyAsync(): Promise<void>;\n\n public dispose(): void {\n // Lite texture lifetimes are managed by the GPU resource pool; explicit\n // disposal is a no-op in the compat layer.\n }\n}\n\nexport class Texture extends BaseTexture {\n private readonly _ready: Promise<void>;\n /** Babylon.js sampling-mode constants (numeric parity). */\n public static readonly NEAREST_SAMPLINGMODE = 1;\n public static readonly BILINEAR_SAMPLINGMODE = 2;\n public static readonly TRILINEAR_SAMPLINGMODE = 3;\n public static readonly NEAREST_NEAREST = 8;\n public static readonly LINEAR_LINEAR = 11;\n /** Babylon.js coordinate-mode constants (numeric parity). */\n public static readonly CLAMP_ADDRESSMODE = 0;\n public static readonly WRAP_ADDRESSMODE = 1;\n public static readonly MIRROR_ADDRESSMODE = 2;\n /** Babylon.js texture UV tiling (applied to the Lite material at bind time). */\n public uScale = 1;\n public vScale = 1;\n public uOffset = 0;\n public vOffset = 0;\n public hasAlpha = false;\n public coordinatesIndex = 0;\n /** Babylon.js sampling mode passed at construction (`NEAREST_SAMPLINGMODE` = 1, etc.). */\n public readonly samplingMode: number;\n /** @internal The Scene or engine this texture was created against (for `clone`). */\n private readonly _source: Scene | { _lite: import(\"babylon-lite\").EngineContext };\n\n public constructor(\n url: string,\n sceneOrEngine: Scene | { _lite: import(\"babylon-lite\").EngineContext },\n noMipmapOrOptions?: unknown,\n invertY?: boolean,\n _samplingMode?: number,\n onLoad?: (() => void) | null\n ) {\n super();\n this.name = url;\n // Babylon.js `Texture(url, scene, noMipmapOrOptions?, invertY?, samplingMode?)`.\n // The third argument is either a `noMipmap` boolean or an options object; parse\n // both shapes so the load matches what the ported code asked for.\n let noMipmap = false;\n let invertYOpt = invertY;\n let samplingMode = _samplingMode;\n if (typeof noMipmapOrOptions === \"boolean\") {\n noMipmap = noMipmapOrOptions;\n } else if (noMipmapOrOptions && typeof noMipmapOrOptions === \"object\") {\n const o = noMipmapOrOptions as { noMipmap?: boolean; invertY?: boolean; samplingMode?: number };\n noMipmap = o.noMipmap ?? false;\n invertYOpt = invertYOpt ?? o.invertY;\n samplingMode = samplingMode ?? o.samplingMode;\n }\n // Babylon.js `Texture.invertY` defaults to true; honour an explicit `false`.\n this._invertY = invertYOpt ?? true;\n this._noMipmap = noMipmap;\n this.samplingMode = samplingMode ?? Texture.BILINEAR_SAMPLINGMODE;\n this._source = sceneOrEngine;\n // Babylon.js's `Texture` accepts either a `Scene` or a `ThinEngine`. When a\n // scene is passed, the load is tracked so the scene awaits it at build; when\n // a bare engine is passed (e.g. the scene-less `SpriteRenderer` path), there\n // is no scene to track against, so the caller awaits readiness itself.\n const scene = (sceneOrEngine as Scene).getEngine ? (sceneOrEngine as Scene) : undefined;\n const engineWrapper = scene ? undefined : (sceneOrEngine as { _lite: import(\"babylon-lite\").EngineContext; _registerStartupWork?: (w: () => Promise<void>) => void });\n const engine = scene ? scene.getEngine()._lite : engineWrapper!._lite;\n // Honour `invertY` / `noMipmap` only on the material (scene-based) path. The\n // bare-engine path feeds Babylon Lite's sprite renderer, which applies its own\n // V-orientation, so it keeps `loadTexture2D`'s defaults (matching the Lite ports).\n // Map the Babylon.js sampling mode to Lite's min/mag filters: `NEAREST_SAMPLINGMODE`\n // must load with nearest filtering, else the alpha of an alpha-tested (cutout)\n // texture is bilinear-filtered and the discard boundary shifts — invisible on\n // axis-aligned sprites but a large divergence on rotated cutout billboards.\n const nearest = this.samplingMode === Texture.NEAREST_SAMPLINGMODE || this.samplingMode === Texture.NEAREST_NEAREST;\n const filterOpts: { minFilter?: \"nearest\" | \"linear\"; magFilter?: \"nearest\" | \"linear\" } = nearest ? { minFilter: \"nearest\", magFilter: \"nearest\" } : {};\n const loadOpts = scene ? { invertY: this._invertY, mipMaps: !this._noMipmap, ...filterOpts } : {};\n\n this._ready = loadCompatTexture(engine, url, loadOpts).then((tex) => {\n this._lite = tex;\n if (onLoad) {\n onLoad();\n }\n });\n // Let the scene await this load before it builds renderables, so the GPU\n // handle exists when the owning material binds (Babylon.js loads in the\n // background but its render loop simply waits a frame; we wait at build).\n scene?._trackTextureLoad(this._ready);\n // Scene-less path (bare engine): register the load as engine startup work\n // so `texture.isReady()` is true by the time the render loop first runs.\n engineWrapper?._registerStartupWork?.(() => this._ready);\n }\n\n /** @internal Upload-time vertical flip / mipmap flags, preserved across `clone`. */\n private readonly _invertY: boolean;\n private readonly _noMipmap: boolean;\n\n public override getClassName(): string {\n return \"Texture\";\n }\n\n /**\n * Babylon.js `texture.clone()` — a new `Texture` over the same source URL.\n * UV tiling/offset and sampling are copied; the clone re-resolves the GPU\n * handle (tracked against the same scene so it is ready at build).\n */\n public clone(): Texture {\n const c = new Texture(this.name, this._source, this._noMipmap, this._invertY, this.samplingMode);\n c.uScale = this.uScale;\n c.vScale = this.vScale;\n c.uOffset = this.uOffset;\n c.vOffset = this.vOffset;\n c.hasAlpha = this.hasAlpha;\n c.coordinatesIndex = this.coordinatesIndex;\n return c;\n }\n\n public override whenReadyAsync(): Promise<void> {\n return this._ready;\n }\n\n /** Babylon.js `BaseTexture.isReady()` — true once the GPU handle has resolved. */\n public isReady(): boolean {\n return this._lite !== undefined;\n }\n\n /** Load a texture and resolve once its GPU handle is available. */\n public static async LoadAsync(url: string, scene: Scene): Promise<Texture> {\n const texture = new Texture(url, scene);\n await texture.whenReadyAsync();\n return texture;\n }\n}\n\n/**\n * Babylon.js `RawTexture` — a texture created from raw pixel bytes. Backed by\n * Babylon Lite's `createTexture2DFromPixels`; the GPU handle is available\n * synchronously after construction.\n */\nexport class RawTexture extends BaseTexture {\n private readonly _scene: Scene;\n\n public constructor(data: Uint8Array, width: number, height: number, scene: Scene) {\n super();\n this._scene = scene;\n this._lite = createTexture2DFromPixels(scene.getEngine()._lite, data, width, height);\n }\n\n public override getClassName(): string {\n return \"RawTexture\";\n }\n\n /** Replace the texture's pixel contents. */\n public update(data: Uint8Array): void {\n if (this._lite) {\n updateTexture2DFromPixels(this._scene.getEngine()._lite, this._lite, data);\n }\n }\n\n public override whenReadyAsync(): Promise<void> {\n return Promise.resolve();\n }\n\n public static CreateRGBATexture(data: Uint8Array, width: number, height: number, scene: Scene): RawTexture {\n return new RawTexture(data, width, height, scene);\n }\n}\n\n/**\n * Babylon.js `DynamicTexture` — a canvas-backed texture. Draw into\n * `getContext()`, then call `update()` to upload the canvas pixels to the GPU.\n * Backed by Babylon Lite's pixel-texture path.\n */\nexport class DynamicTexture extends BaseTexture {\n private readonly _scene: Scene;\n private readonly _canvas: HTMLCanvasElement;\n private readonly _context: CanvasRenderingContext2D;\n private readonly _width: number;\n private readonly _height: number;\n\n public constructor(name: string, options: { width: number; height: number }, scene: Scene) {\n super();\n this.name = name;\n this._scene = scene;\n this._width = options.width;\n this._height = options.height;\n this._canvas = document.createElement(\"canvas\");\n this._canvas.width = options.width;\n this._canvas.height = options.height;\n const ctx = this._canvas.getContext(\"2d\");\n if (!ctx) {\n throw new Error(\"DynamicTexture: 2D canvas context unavailable.\");\n }\n this._context = ctx;\n }\n\n public override getClassName(): string {\n return \"DynamicTexture\";\n }\n\n public getContext(): CanvasRenderingContext2D {\n return this._context;\n }\n\n public getSize(): { width: number; height: number } {\n return { width: this._width, height: this._height };\n }\n\n /** Draw `text` and refresh the GPU texture. */\n public drawText(text: string, x: number, y: number, font: string, color: string, clearColor: string | null): void {\n const ctx = this._context;\n if (clearColor) {\n ctx.fillStyle = clearColor;\n ctx.fillRect(0, 0, this._width, this._height);\n }\n ctx.font = font;\n ctx.fillStyle = color;\n ctx.fillText(text, x, y);\n this.update();\n }\n\n /** Upload the current canvas pixels to the GPU. */\n public update(): void {\n const image = this._context.getImageData(0, 0, this._width, this._height);\n const data = new Uint8Array(image.data.buffer);\n if (!this._lite) {\n this._lite = createTexture2DFromPixels(this._scene.getEngine()._lite, data, this._width, this._height);\n } else {\n updateTexture2DFromPixels(this._scene.getEngine()._lite, this._lite, data);\n }\n }\n\n public override whenReadyAsync(): Promise<void> {\n return Promise.resolve();\n }\n}\n\n/**\n * Babylon.js `CubeTexture` — environment/skybox cube map. Babylon Lite loads\n * environments through `loadEnvironment` (IBL + skybox registered on the scene)\n * rather than as a standalone GPU texture object. This compat `CubeTexture`\n * therefore acts as a lightweight handle that records the environment URL; the\n * actual GPU work happens when it is assigned to `scene.environmentTexture` and\n * the engine starts (see `Scene` env handling).\n */\nexport class CubeTexture {\n /** Source URL of the (prefiltered) environment. */\n public readonly url: string;\n /** Babylon.js `coordinatesMode` (skybox = 5). Recorded for API parity. */\n public coordinatesMode = 0;\n public name: string;\n public gammaSpace = true;\n public level = 1;\n /** Fires when the cube map is \"ready\" (resolved on a microtask in this compat layer). */\n public readonly onLoadObservable = new Observable<CubeTexture>();\n private _ready = false;\n\n public constructor(\n url: string,\n _scene?: unknown,\n _extensions?: unknown,\n _noMipmap?: boolean,\n _files?: unknown,\n onLoad?: (() => void) | null,\n _onError?: unknown,\n _format?: unknown,\n _prefiltered?: boolean\n ) {\n this.url = url;\n this.name = url;\n // Babylon.js fires onLoad once the cube map is ready; some scenes await it\n // before continuing. We resolve on a microtask since the actual GPU upload\n // is deferred to `loadEnvironment` at engine start.\n setTimeout(() => {\n this._ready = true;\n if (onLoad) {\n onLoad();\n }\n this.onLoadObservable.notifyObservers(this);\n }, 0);\n }\n\n /** Babylon.js `BaseTexture.isReady()`. */\n public isReady(): boolean {\n return this._ready;\n }\n\n /** Babylon.js `CubeTexture.CreateFromPrefilteredData(url, scene)`. */\n public static CreateFromPrefilteredData(url: string, scene?: unknown): CubeTexture {\n return new CubeTexture(url, scene);\n }\n\n public dispose(): void {\n // GPU resources are owned by the scene's environment, disposed with the scene.\n }\n}\n\n/** Babylon.js `HDRCubeTexture` — see {@link CubeTexture}; use native `loadHdrEnvironment`. */\nexport class HDRCubeTexture {\n public constructor() {\n unsupported(\"HDRCubeTexture\", \"Use the native `loadHdrEnvironment` API; a standalone HDR cube texture object is not wrapped.\");\n }\n}\n\n/** Babylon.js `RenderTargetTexture` — offscreen render target. Use the native frame-graph RTT APIs. */\nexport class RenderTargetTexture {\n public constructor() {\n unsupported(\"RenderTargetTexture\", \"Offscreen rendering uses Babylon Lite's frame-graph render-target APIs (`createRenderTargetTexture` / render tasks).\");\n }\n}\n","/**\n * Lightweight handles for meshes produced by the loaders (`ImportMeshAsync` etc.).\n *\n * Babylon.js loaders return a flat `meshes` array whose entries expose\n * `getBoundingInfo()` (with min/max), `refreshBoundingInfo()`, and\n * `getVerticesData()` — used by scenes to frame a camera around a loaded model.\n * Babylon Lite returns a root-node hierarchy; the tree-shakeable\n * `getContainerMeshes` helper flattens it to its renderable `Mesh` nodes, which we\n * wrap here.\n *\n * Bounds are reported in the node's **local** geometry space (`mesh.boundMin` /\n * `mesh.boundMax`), matching how Babylon Lite's own `createDefaultCamera` frames\n * loaded models — it reads the same local bounds without applying the node world\n * matrix, and the renderer (notably for skinned meshes) draws at that same local\n * scale. Returning world-transformed bounds here would make the camera-framing\n * math in model-viewer scenes disagree with the Lite render.\n */\n\nimport { getContainerMeshes } from \"babylon-lite\";\nimport type { AssetContainer as LiteAssetContainer, Mesh as LiteMesh } from \"babylon-lite\";\n\nimport { Vector3 } from \"../math/vector.js\";\nimport { BoundingInfo } from \"../culling/bounding.js\";\n\n/**\n * A Babylon.js-shaped handle over a single loaded Babylon Lite mesh. Exposes the\n * subset used by model-framing scenes: local bounding info, vertex data, and name.\n */\nexport class LoadedMesh {\n public readonly name: string;\n private readonly _mesh: LiteMesh;\n /** @internal The asset container this mesh was loaded from (for `KHR_materials_variants`). */\n public readonly _container: LiteAssetContainer | undefined;\n\n public constructor(mesh: LiteMesh, container?: LiteAssetContainer) {\n this._mesh = mesh;\n this.name = mesh.name ?? \"\";\n this._container = container;\n }\n\n /** @internal The underlying Babylon Lite mesh (e.g. for the navmesh wrapper's geometry merge). */\n public get _lite(): LiteMesh {\n return this._mesh;\n }\n\n /** Babylon.js `refreshBoundingInfo()` — bounds are read on demand, so this is a no-op. */\n public refreshBoundingInfo(_options?: unknown): LoadedMesh {\n return this;\n }\n\n /** Babylon.js `getBoundingInfo()` — local-space AABB of this mesh (see module note). */\n public getBoundingInfo(): BoundingInfo {\n const lo = this._mesh.boundMin;\n const hi = this._mesh.boundMax;\n if (lo && hi) {\n return new BoundingInfo(new Vector3(lo[0], lo[1], lo[2]), new Vector3(hi[0], hi[1], hi[2]));\n }\n return new BoundingInfo(new Vector3(0, 0, 0), new Vector3(0, 0, 0));\n }\n\n /** Babylon.js `getVerticesData(kind)` — CPU position buffer (positions only). */\n public getVerticesData(kind: string): Float32Array | null {\n const positions = this._mesh._cpuPositions;\n return kind === \"position\" ? (positions ?? null) : null;\n }\n\n /** Babylon.js `getTotalVertices()`. */\n public getTotalVertices(): number {\n const positions = this._mesh._cpuPositions;\n return positions ? positions.length / 3 : 0;\n }\n}\n\n/**\n * Wrap every renderable mesh in a loaded Babylon Lite asset container as a\n * `LoadedMesh`, matching the flat `meshes` array Babylon.js loaders return.\n *\n * Babylon.js loaders place a synthetic `__root__` transform node at\n * `result.meshes[0]` (the renderable meshes follow it). Babylon Lite builds the\n * same `__root__` (`entities[0]` for glTF) but `getContainerMeshes` returns only\n * renderable meshes. Prepend that root so index-based access (`result.meshes[1]`,\n * used by the navigation scenes) lines up with Babylon.js.\n */\nexport function collectLoadedMeshes(container: LiteAssetContainer): LoadedMesh[] {\n const renderable = getContainerMeshes(container);\n const result: LoadedMesh[] = [];\n // The glTF loader's root is a transform node (no GPU geometry) that parents the\n // renderable meshes — include it at index 0 to mirror Babylon.js `__root__`.\n // Detected as a non-renderable entity that has a `children` array (lights, which\n // BJS `meshes` excludes, are leaf nodes without one).\n for (const entity of container.entities) {\n const node = entity as unknown as { _gpu?: unknown; children?: unknown[] };\n if (!node._gpu && Array.isArray(node.children) && !renderable.includes(entity as unknown as LiteMesh)) {\n result.push(new LoadedMesh(entity as unknown as LiteMesh, container));\n }\n }\n for (const mesh of renderable) {\n result.push(new LoadedMesh(mesh, container));\n }\n return result;\n}\n","/**\n * Babylon.js-compatible `SceneLoader` and `AssetContainer` over Babylon Lite's\n * `loadGltf` / `loadBabylon`.\n *\n * Coverage note: the Lite asset container exposes a root-node hierarchy plus\n * animation groups rather than the flat `meshes` array Babylon.js returns. This\n * compat layer surfaces the underlying container (`_lite`) and the animation\n * groups, and registers everything through `addToScene`. A fully BJS-shaped flat\n * mesh list is not reconstructed in this initial pass.\n */\n\nimport { addToScene, loadGltf, loadBabylon } from \"babylon-lite\";\nimport type { AssetContainer as LiteAssetContainer, AnimationGroup } from \"babylon-lite\";\n\nimport { unsupported } from \"../error.js\";\nimport { collectLoadedMeshes, type LoadedMesh } from \"./loaded-mesh.js\";\nimport { GaussianSplattingMesh } from \"../meshes/gaussian-splatting.js\";\nimport type { Scene } from \"../scene/scene.js\";\n\n/** Path portion of a URL, without any query string (`?…`) or hash fragment (`#…`). */\nfunction urlPath(url: string): string {\n return url.split(/[?#]/)[0]!;\n}\n\n/** Splat asset extensions Babylon Lite can parse (`loadSplat` / `loadSOG` / `loadSPZ`). */\nfunction isSplatUrl(url: string): boolean {\n const u = urlPath(url).toLowerCase();\n return u.endsWith(\".ply\") || u.endsWith(\".splat\") || u.endsWith(\".sog\") || u.endsWith(\".spz\");\n}\n\n/** True when a URL points at a `.babylon` file, ignoring any query string or hash. */\nfunction isBabylonUrl(url: string): boolean {\n return urlPath(url).toLowerCase().endsWith(\".babylon\");\n}\n\n/** Last path segment of a URL, used to name a loaded Gaussian-Splatting mesh. */\nfunction baseName(url: string): string {\n const path = urlPath(url);\n return path.slice(path.lastIndexOf(\"/\") + 1) || \"splat\";\n}\n\nexport class AssetContainer {\n /** @internal Underlying Babylon Lite asset container. */\n public readonly _lite: LiteAssetContainer;\n\n public constructor(lite: LiteAssetContainer) {\n this._lite = lite;\n }\n\n public get animationGroups(): AnimationGroup[] {\n return this._lite.animationGroups ?? [];\n }\n\n /** Flat list of renderable meshes (Babylon.js-shaped handles over the loaded node tree). */\n public get meshes(): LoadedMesh[] {\n return collectLoadedMeshes(this._lite);\n }\n\n /** Add every entity, animation group, camera, and clear colour to the scene. */\n public addAllToScene(scene: Scene): void {\n addToScene(scene._lite, this._lite);\n scene._surfaceLoadedCamera();\n }\n\n public dispose(): void {\n // Lite owns container GPU resources through the scene; explicit container\n // disposal is a no-op until removed from the scene.\n }\n}\n\ninterface ImportResult {\n meshes: Array<LoadedMesh | GaussianSplattingMesh>;\n particleSystems: unknown[];\n skeletons: unknown[];\n animationGroups: AnimationGroup[];\n transformNodes: unknown[];\n lights: unknown[];\n /** The underlying Lite asset container (compat extension; absent for splat assets). */\n container?: AssetContainer;\n}\n\n/** @internal Load a splat URL into a `GaussianSplattingMesh` (shared by every loader entry point). */\nasync function loadSplatResult(url: string, scene: Scene): Promise<ImportResult> {\n const gs = new GaussianSplattingMesh(baseName(url), null, scene);\n await gs.loadFileAsync(url);\n return { meshes: [gs], particleSystems: [], skeletons: [], animationGroups: [], transformNodes: [], lights: [] };\n}\n\nfunction joinUrl(rootUrl: string, fileName: string): string {\n if (!fileName) {\n return rootUrl;\n }\n if (/^(https?:)?\\/\\//.test(fileName) || fileName.startsWith(\"/\")) {\n return fileName;\n }\n return rootUrl.endsWith(\"/\") || rootUrl === \"\" ? rootUrl + fileName : rootUrl + \"/\" + fileName;\n}\n\nasync function load(rootUrl: string, fileName: string, scene: Scene): Promise<AssetContainer> {\n const url = joinUrl(rootUrl, fileName);\n const engine = scene.getEngine()._lite;\n // Detect the format from the path (ignoring query/hash), but hand the full URL\n // to the loader so any query string is preserved.\n const lite = isBabylonUrl(url) ? await loadBabylon(engine, url) : await loadGltf(engine, url);\n return new AssetContainer(lite);\n}\n\n/** Babylon.js `SceneLoader` — async glTF/.babylon loading into a compat scene. */\nexport const SceneLoader = {\n /** Import meshes (and the rest of the asset) into the scene. */\n async ImportMeshAsync(_meshNames: unknown, rootUrl: string, sceneFilename: string, scene: Scene): Promise<ImportResult> {\n const url = joinUrl(rootUrl, sceneFilename);\n if (isSplatUrl(url)) {\n return loadSplatResult(url, scene);\n }\n const container = await load(rootUrl, sceneFilename, scene);\n container.addAllToScene(scene);\n return {\n meshes: container.meshes,\n particleSystems: [],\n skeletons: [],\n animationGroups: container.animationGroups,\n transformNodes: [],\n lights: [],\n container,\n };\n },\n\n /** Append an asset's contents to the scene. */\n async AppendAsync(rootUrl: string, sceneFilename: string, scene: Scene): Promise<Scene> {\n const url = joinUrl(rootUrl, sceneFilename);\n if (isSplatUrl(url)) {\n await loadSplatResult(url, scene);\n return scene;\n }\n const container = await load(rootUrl, sceneFilename, scene);\n container.addAllToScene(scene);\n return scene;\n },\n\n /** Load an asset into a container without adding it to the scene. */\n async LoadAssetContainerAsync(rootUrl: string, sceneFilename: string, scene: Scene): Promise<AssetContainer> {\n return load(rootUrl, sceneFilename, scene);\n },\n\n /** Plugin registration — out of scope (side-effectful global registry). */\n RegisterPlugin(): never {\n return unsupported(\n \"SceneLoader.RegisterPlugin\",\n \"Loader plugin registration is out of scope for the compat layer (it relies on a side-effectful global registry). Import the loader you need directly.\"\n );\n },\n};\n\n// ── Function-style loaders (Babylon.js 7+ `@babylonjs/core/Loading/sceneLoader`) ──\n\n/** Babylon.js `ImportMeshAsync(source, scene, options?)` — imports an asset into the scene. */\nexport async function ImportMeshAsync(source: string, scene: Scene, _options?: unknown): Promise<ImportResult> {\n if (isSplatUrl(source)) {\n return loadSplatResult(source, scene);\n }\n const container = await loadFromSource(source, scene);\n container.addAllToScene(scene);\n return {\n meshes: container.meshes,\n particleSystems: [],\n skeletons: [],\n animationGroups: container.animationGroups,\n transformNodes: [],\n lights: [],\n container,\n };\n}\n\n/** Babylon.js `AppendSceneAsync(source, scene, options?)` — appends an asset's contents to the scene. */\nexport async function AppendSceneAsync(source: string, scene: Scene, _options?: unknown): Promise<Scene> {\n if (isSplatUrl(source)) {\n await loadSplatResult(source, scene);\n return scene;\n }\n const container = await loadFromSource(source, scene);\n container.addAllToScene(scene);\n return scene;\n}\n\n/** Babylon.js `LoadAssetContainerAsync(source, scene, options?)` — loads into a container without adding. */\nexport async function LoadAssetContainerAsync(source: string, scene: Scene, _options?: unknown): Promise<AssetContainer> {\n return loadFromSource(source, scene);\n}\n\n/** @internal Load a glTF/.babylon asset from a single source URL (function-loader form). */\nasync function loadFromSource(source: string, scene: Scene): Promise<AssetContainer> {\n const engine = scene.getEngine()._lite;\n // Detect the format from the path (ignoring query/hash), but pass the full URL\n // to the loader so any query string is preserved.\n const lite = isBabylonUrl(source) ? await loadBabylon(engine, source) : await loadGltf(engine, source);\n return new AssetContainer(lite);\n}\n","/**\n * Babylon.js-compatible `AssetsManager` — a pure task scheduler built on top of\n * the compat loaders. The scheduling/observable surface has no Babylon Lite or\n * GPU dependency and is fully unit-testable; the concrete mesh/texture task types\n * delegate to the compat loaders.\n */\n\nimport { Observable } from \"../misc/observable.js\";\n\nexport type TaskState = \"init\" | \"running\" | \"done\" | \"error\";\n\n/** Base class for an asset-loading task. Subclasses implement {@link runAsync}. */\nexport abstract class AbstractAssetTask {\n public name: string;\n public state: TaskState = \"init\";\n public errorObject: { message: string; exception?: unknown } | undefined;\n\n public onSuccess?: (task: this) => void;\n public onError?: (task: this, message?: string, exception?: unknown) => void;\n\n public constructor(name: string) {\n this.name = name;\n }\n\n public get isCompleted(): boolean {\n return this.state === \"done\";\n }\n\n /** Run the task. Subclasses populate their result fields here. */\n public abstract runAsync(): Promise<void>;\n\n /** @internal Run with success/error bookkeeping. */\n public async _run(): Promise<void> {\n this.state = \"running\";\n try {\n await this.runAsync();\n this.state = \"done\";\n this.onSuccess?.(this);\n } catch (exception) {\n this.state = \"error\";\n const message = exception instanceof Error ? exception.message : String(exception);\n this.errorObject = { message, exception };\n this.onError?.(this, message, exception);\n throw exception;\n }\n }\n}\n\n/** A task whose work is provided as a plain async function (useful for custom assets and tests). */\nexport class CustomAssetTask<T> extends AbstractAssetTask {\n public result: T | undefined;\n\n public constructor(\n name: string,\n private readonly _loader: () => Promise<T>\n ) {\n super(name);\n }\n\n public override async runAsync(): Promise<void> {\n this.result = await this._loader();\n }\n}\n\nexport class AssetsManager {\n public readonly onProgressObservable = new Observable<{ remainingCount: number; totalCount: number; task: AbstractAssetTask }>();\n public readonly onTaskSuccessObservable = new Observable<AbstractAssetTask>();\n public readonly onTaskErrorObservable = new Observable<AbstractAssetTask>();\n public readonly onFinishObservable = new Observable<AbstractAssetTask[]>();\n\n // Kept for Babylon.js API parity only. The compat AssetsManager has no\n // loading-screen UI, and `loadAsync` never rejects on task failure (per-task\n // errors surface via `onTaskErrorObservable`), so neither flag affects\n // loading behavior.\n public useDefaultLoadingScreen = false;\n public autoHideLoadingUI = false;\n\n private readonly _tasks: AbstractAssetTask[] = [];\n private _isLoading = false;\n\n public get tasks(): readonly AbstractAssetTask[] {\n return this._tasks;\n }\n\n public addTask<T extends AbstractAssetTask>(task: T): T {\n this._tasks.push(task);\n return task;\n }\n\n /** Add a custom async task and return it (handy for non-mesh/texture assets and tests). */\n public addCustomTask<T>(name: string, loader: () => Promise<T>): CustomAssetTask<T> {\n return this.addTask(new CustomAssetTask<T>(name, loader));\n }\n\n public reset(): this {\n this._tasks.length = 0;\n return this;\n }\n\n /** Run all queued tasks sequentially, emitting progress, and resolve when done. */\n public async loadAsync(): Promise<AbstractAssetTask[]> {\n if (this._isLoading) {\n throw new Error(\"AssetsManager is already loading.\");\n }\n this._isLoading = true;\n const total = this._tasks.length;\n const completed: AbstractAssetTask[] = [];\n\n try {\n for (const task of this._tasks) {\n try {\n await task._run();\n this.onTaskSuccessObservable.notifyObservers(task);\n } catch {\n this.onTaskErrorObservable.notifyObservers(task);\n }\n completed.push(task);\n this.onProgressObservable.notifyObservers({ remainingCount: total - completed.length, totalCount: total, task });\n }\n this.onFinishObservable.notifyObservers(this._tasks.slice());\n return completed;\n } finally {\n this._isLoading = false;\n }\n }\n}\n","/**\n * Babylon.js `KHR_materials_variants` glTF loader extension\n * (`@babylonjs/loaders/glTF/2.0/Extensions/KHR_materials_variants`).\n *\n * Babylon.js exposes the extension's static helpers to switch a loaded asset\n * between material variants at runtime. Babylon Lite decodes the same extension\n * in its glTF loader and exposes `selectVariant` / `getVariantNames` /\n * `resetVariant` keyed by the asset container. The Babylon.js helpers are keyed\n * by the asset's **root mesh** instead, so this wrapper recovers the container\n * from the `LoadedMesh` the loader returned (`result.meshes[0]`) and delegates.\n */\n\nimport { selectVariant, getVariantNames, resetVariant } from \"babylon-lite\";\nimport type { AssetContainer as LiteAssetContainer } from \"babylon-lite\";\n\n/** Recover the Lite asset container a loaded-mesh handle came from. */\nfunction containerOf(rootMesh: unknown): LiteAssetContainer | undefined {\n return (rootMesh as { _container?: LiteAssetContainer } | null)?._container;\n}\n\n/**\n * Babylon.js `KHR_materials_variants` extension helpers. Mirrors the static\n * surface ported code calls (`SelectVariant` / `GetAvailableVariants` / `Reset`)\n * over Babylon Lite's container-keyed variant API.\n */\nexport const KHR_materials_variants = {\n /** Switch the loaded asset to the named material variant. */\n SelectVariant(rootMesh: unknown, variantName: string): void {\n const container = containerOf(rootMesh);\n if (container) {\n selectVariant(container, variantName);\n }\n },\n\n /** The variant names available on the loaded asset (empty when it has none). */\n GetAvailableVariants(rootMesh: unknown): readonly string[] {\n const container = containerOf(rootMesh);\n return container ? getVariantNames(container) : [];\n },\n\n /** Restore the asset's default (variant-free) materials. */\n Reset(rootMesh: unknown): void {\n const container = containerOf(rootMesh);\n if (container) {\n resetVariant(container);\n }\n },\n};\n","/**\n * Babylon.js-compatible `GPUPicker` over Babylon Lite's GPU picker\n * (`createGpuPicker` / `pickAsync` / `disposePicker`).\n *\n * Babylon.js's `GPUPicker` is **asynchronous** GPU picking — which is exactly\n * what Babylon Lite provides — so this is a real wrapper, not a stub. You set a\n * picking list of meshes, then `pickAsync(x, y)` resolves with the picked mesh\n * (or `null`).\n *\n * Coverage notes vs. Babylon.js:\n * - `setPickingList`, `addPickingList`, `clearPickingList`, `pickAsync`,\n * `multiPickAsync`, `pickingInProgress`, and `dispose` are implemented.\n * - The `{ mesh, material }` list-item form is accepted, but the custom picking\n * material is ignored (Lite assigns picking ids internally).\n * - `boxPickAsync` is not supported (Lite has no box-pick primitive) and throws.\n * - Hardware `InstancedMesh` picking is not represented; thin-instance picking is\n * surfaced through `thinInstanceIndex` exactly as Babylon.js does.\n */\n\nimport { createGpuPicker, pickAsync as litePickAsync, disposePicker } from \"babylon-lite\";\nimport type { GpuPicker, Mesh as LiteMesh, GaussianSplattingMesh as LiteGsMesh } from \"babylon-lite\";\n\nimport { unsupported } from \"../error.js\";\nimport { Mesh } from \"../meshes/meshes.js\";\nimport { GaussianSplattingMesh } from \"../meshes/gaussian-splatting.js\";\nimport type { Scene } from \"../scene/scene.js\";\n\n/** A pickable compat mesh: a regular `Mesh` or a `GaussianSplattingMesh`. */\ntype PickableMesh = Mesh | GaussianSplattingMesh;\n\n/** Result of a single GPU pick. Mirrors Babylon.js `IGPUPickingInfo`. */\nexport interface IGPUPickingInfo {\n mesh: PickableMesh;\n thinInstanceIndex?: number;\n}\n\n/** Result of a multi-point GPU pick. Mirrors Babylon.js `IGPUMultiPickingInfo`. */\nexport interface IGPUMultiPickingInfo {\n meshes: Array<PickableMesh | null>;\n thinInstanceIndexes?: number[];\n}\n\ntype PickListItem = PickableMesh | { mesh: PickableMesh; material?: unknown };\n\nfunction meshOf(item: PickListItem): PickableMesh {\n return item instanceof Mesh || item instanceof GaussianSplattingMesh ? item : item.mesh;\n}\n\n/** @internal The backing Lite node used as the picker's identity key for a compat mesh. */\nfunction liteNodeOf(mesh: PickableMesh): LiteMesh | LiteGsMesh | undefined {\n return mesh instanceof GaussianSplattingMesh ? mesh._pickLiteNode : mesh._lite;\n}\n\nexport class GPUPicker {\n private _picker: GpuPicker | null = null;\n private _scene: Scene | null = null;\n /** Maps Lite nodes (regular mesh or splat node) back to the compat meshes the caller supplied. */\n private readonly _liteToCompat = new Map<LiteMesh | LiteGsMesh, PickableMesh>();\n /** Regular Lite meshes that are pickable (drives the Lite `pickAsync` filter; GS meshes bypass it). */\n private _pickable = new Set<LiteMesh>();\n private _inProgress = false;\n\n /** True while an async pick is running (Babylon.js parity). */\n public get pickingInProgress(): boolean {\n return this._inProgress;\n }\n\n /** Replace the picking list. Passing `null` clears it. */\n public setPickingList(list: PickListItem[] | null): void {\n this.clearPickingList();\n if (list && list.length > 0) {\n this.addPickingList(list);\n }\n }\n\n /** Add meshes to the current picking list. */\n public addPickingList(list: PickListItem[]): void {\n if (!list || list.length === 0) {\n return;\n }\n const first = meshOf(list[0]!);\n const scene = first.getScene();\n if (!scene) {\n unsupported(\"GPUPicker.setPickingList\", \"Picking-list meshes must belong to a Scene (create them with a scene argument).\");\n }\n if (!this._picker || this._scene !== scene) {\n // Switching to a different scene: release the previous Lite picker so\n // we don't leak its GPU resources.\n if (this._picker) {\n disposePicker(this._picker);\n }\n this._scene = scene;\n this._picker = createGpuPicker(scene._lite);\n }\n for (const item of list) {\n const mesh = meshOf(item);\n const liteNode = liteNodeOf(mesh);\n if (!liteNode) {\n // A GaussianSplattingMesh whose splat is not loaded yet has no node to\n // key on; it becomes pickable once loaded and re-added.\n continue;\n }\n this._liteToCompat.set(liteNode, mesh);\n // Only regular meshes participate in the Lite filter; the Lite picker\n // auto-includes scene splat meshes (its GS pass ignores the filter).\n if (mesh instanceof Mesh) {\n this._pickable.add(mesh._lite);\n }\n }\n }\n\n /** Clear the picking list and release its bookkeeping. */\n public clearPickingList(): void {\n this._liteToCompat.clear();\n this._pickable = new Set<LiteMesh>();\n }\n\n /** Pick the mesh at canvas coordinates `(x, y)`. Resolves to `null` on a miss. */\n public async pickAsync(x: number, y: number, disposeWhenDone = false): Promise<IGPUPickingInfo | null> {\n if (this._inProgress || !this._picker || this._liteToCompat.size === 0) {\n return null;\n }\n this._inProgress = true;\n try {\n const info = await litePickAsync(this._picker, x, y, { filter: (mesh) => this._pickable.has(mesh) });\n if (!info.hit || !info.pickedMesh) {\n return null;\n }\n const mesh = this._liteToCompat.get(info.pickedMesh as LiteMesh | LiteGsMesh);\n if (!mesh) {\n return null;\n }\n return info.thinInstanceIndex >= 0 ? { mesh, thinInstanceIndex: info.thinInstanceIndex } : { mesh };\n } finally {\n this._inProgress = false;\n if (disposeWhenDone) {\n this.dispose();\n }\n }\n }\n\n /** Pick at several points. Always returns one entry per coordinate (mesh or `null`). */\n public async multiPickAsync(xy: Array<{ x: number; y: number }>, disposeWhenDone = false): Promise<IGPUMultiPickingInfo | null> {\n if (this._inProgress || !this._picker || this._liteToCompat.size === 0 || xy.length === 0) {\n return null;\n }\n const meshes: Array<PickableMesh | null> = [];\n const thinInstanceIndexes: number[] = [];\n for (const point of xy) {\n // Sequential: Lite picks one pixel per call.\n const result = await this.pickAsync(point.x, point.y);\n meshes.push(result?.mesh ?? null);\n thinInstanceIndexes.push(result?.thinInstanceIndex ?? 0);\n }\n if (disposeWhenDone) {\n this.dispose();\n }\n return { meshes, thinInstanceIndexes };\n }\n\n /** Box picking is not implemented in Babylon Lite. */\n public boxPickAsync(): never {\n return unsupported(\"GPUPicker.boxPickAsync\", \"Box (area) picking is not implemented in Babylon Lite. Use `multiPickAsync` over the points you need.\");\n }\n\n /** Release GPU picking resources. */\n public dispose(): void {\n if (this._picker) {\n disposePicker(this._picker);\n this._picker = null;\n }\n this._scene = null;\n this.clearPickingList();\n }\n}\n","/**\n * Babylon.js-compatible gizmos over Babylon Lite's gizmo suite.\n *\n * Babylon.js gizmos take a `UtilityLayerRenderer` and attach to a node via\n * `attachedMesh`/`attachedNode`. Babylon Lite mirrors this with\n * `createUtilityLayer` + `create*Gizmo(engine, layer)` + `attach*ToNode`. These\n * wrappers reproduce the Babylon.js class shape and the `attachedMesh` setter.\n */\n\nimport {\n createUtilityLayer,\n registerUtilityLayer,\n disposeUtilityLayer,\n createPositionGizmo,\n attachPositionGizmoToNode,\n disposePositionGizmo,\n setPositionGizmoLocalCoordinates,\n createRotationGizmo,\n attachRotationGizmoToNode,\n disposeRotationGizmo,\n setRotationGizmoLocalCoordinates,\n createScaleGizmo,\n attachScaleGizmoToNode,\n disposeScaleGizmo,\n setScaleGizmoLocalCoordinates,\n createBoundingBoxGizmo,\n attachBoundingBoxGizmoToNode,\n disposeBoundingBoxGizmo,\n createLightGizmo,\n attachLightGizmoToLight,\n disposeLightGizmo,\n createCameraGizmo,\n attachCameraGizmoToCamera,\n disposeCameraGizmo,\n createAxisDragGizmo,\n attachAxisDragGizmoToNode,\n disposeAxisDragGizmo,\n createPlaneRotationGizmo,\n attachPlaneRotationGizmoToNode,\n disposePlaneRotationGizmo,\n createPlaneDragGizmo,\n attachPlaneDragGizmoToNode,\n disposePlaneDragGizmo,\n createAxisScaleGizmo,\n attachAxisScaleGizmoToNode,\n disposeAxisScaleGizmo,\n} from \"babylon-lite\";\nimport type {\n UtilityLayer as LiteUtilityLayer,\n PositionGizmo as LitePositionGizmo,\n RotationGizmo as LiteRotationGizmo,\n ScaleGizmo as LiteScaleGizmo,\n BoundingBoxGizmo as LiteBoundingBoxGizmo,\n LightGizmo as LiteLightGizmo,\n CameraGizmo as LiteCameraGizmo,\n AxisDragGizmo as LiteAxisDragGizmo,\n PlaneRotationGizmo as LitePlaneRotationGizmo,\n PlaneDragGizmo as LitePlaneDragGizmo,\n AxisScaleGizmo as LiteAxisScaleGizmo,\n EngineContext,\n SceneNode,\n} from \"babylon-lite\";\n\nimport type { Scene } from \"../scene/scene.js\";\nimport type { AbstractMesh, Mesh } from \"../meshes/meshes.js\";\nimport type { Node } from \"../node/node.js\";\nimport type { Light } from \"../lights/lights.js\";\nimport type { Camera } from \"../cameras/cameras.js\";\nimport type { Vector3 } from \"../math/vector.js\";\nimport type { Color3 } from \"../math/color.js\";\n\n/** Babylon.js `UtilityLayerRenderer` — the overlay scene gizmos render into. */\nexport class UtilityLayerRenderer {\n /** @internal Underlying Babylon Lite utility layer. */\n public readonly _lite: LiteUtilityLayer;\n /** @internal Lite engine backing the layer (gizmo factories need it explicitly). */\n public readonly _engine: EngineContext;\n private _registered = false;\n\n public constructor(scene: Scene) {\n this._engine = scene.getEngine()._lite;\n this._lite = createUtilityLayer(this._engine, scene._lite);\n // Babylon Lite registers a utility layer *after* its gizmos are created and\n // after the main scene is registered. Gizmo creation is synchronous (all\n // gizmos exist by the time the engine starts), so defer registration to the\n // engine's late-work phase to capture every gizmo.\n scene.getEngine()._registerLateWork(() => this._ensureRegistered());\n }\n\n /** @internal Ensure the layer is registered with the engine (idempotent). */\n public _ensureRegistered(): Promise<void> {\n if (this._registered) {\n return Promise.resolve();\n }\n this._registered = true;\n return registerUtilityLayer(this._lite);\n }\n\n public dispose(): void {\n disposeUtilityLayer(this._lite);\n }\n}\n\n/** Shared base for compat gizmos (Babylon.js `Gizmo`). */\nabstract class GizmoBase {\n /** @internal The utility layer this gizmo renders into. */\n public readonly _layer: UtilityLayerRenderer;\n\n protected constructor(layer: UtilityLayerRenderer) {\n this._layer = layer;\n // The utility layer registers itself with the engine during the engine's\n // late-work phase (after all gizmos are created), so no eager registration\n // is needed here.\n }\n\n public abstract get attachedMesh(): AbstractMesh | null;\n public abstract set attachedMesh(value: AbstractMesh | null);\n\n public abstract dispose(): void;\n}\n\nexport class PositionGizmo extends GizmoBase {\n /** @internal */\n public readonly _lite: LitePositionGizmo;\n private _attached: AbstractMesh | null = null;\n\n public constructor(layer: UtilityLayerRenderer) {\n super(layer);\n this._lite = createPositionGizmo(layer._engine, layer._lite);\n // Babylon.js `Gizmo.updateGizmoRotationToMatchAttachedMesh` defaults to true.\n setPositionGizmoLocalCoordinates(this._lite, true);\n }\n\n /** Babylon.js `Gizmo.updateGizmoRotationToMatchAttachedMesh` — orient widgets to the node's local axes. */\n public set updateGizmoRotationToMatchAttachedMesh(value: boolean) {\n setPositionGizmoLocalCoordinates(this._lite, value);\n }\n\n public get attachedMesh(): AbstractMesh | null {\n return this._attached;\n }\n public set attachedMesh(value: AbstractMesh | null) {\n this._attached = value;\n attachPositionGizmoToNode(this._lite, (value?._lite as SceneNode | undefined) ?? null);\n }\n\n public get attachedNode(): AbstractMesh | null {\n return this._attached;\n }\n public set attachedNode(value: AbstractMesh | null) {\n this.attachedMesh = value;\n }\n\n public override dispose(): void {\n disposePositionGizmo(this._lite, this._layer._lite);\n }\n}\n\nexport class RotationGizmo extends GizmoBase {\n /** @internal */\n public readonly _lite: LiteRotationGizmo;\n private _attached: AbstractMesh | null = null;\n\n public constructor(layer: UtilityLayerRenderer) {\n super(layer);\n this._lite = createRotationGizmo(layer._engine, layer._lite);\n // Babylon.js `Gizmo.updateGizmoRotationToMatchAttachedMesh` defaults to true.\n setRotationGizmoLocalCoordinates(this._lite, true);\n }\n\n /** Babylon.js `Gizmo.updateGizmoRotationToMatchAttachedMesh` — orient widgets to the node's local axes. */\n public set updateGizmoRotationToMatchAttachedMesh(value: boolean) {\n setRotationGizmoLocalCoordinates(this._lite, value);\n }\n\n public get attachedMesh(): AbstractMesh | null {\n return this._attached;\n }\n public set attachedMesh(value: AbstractMesh | null) {\n this._attached = value;\n attachRotationGizmoToNode(this._lite, (value?._lite as SceneNode | undefined) ?? null);\n }\n\n public get attachedNode(): AbstractMesh | null {\n return this._attached;\n }\n public set attachedNode(value: AbstractMesh | null) {\n this.attachedMesh = value;\n }\n\n public override dispose(): void {\n disposeRotationGizmo(this._lite, this._layer._lite);\n }\n}\n\nexport class ScaleGizmo extends GizmoBase {\n /** @internal */\n public readonly _lite: LiteScaleGizmo;\n private _attached: AbstractMesh | null = null;\n\n public constructor(layer: UtilityLayerRenderer) {\n super(layer);\n this._lite = createScaleGizmo(layer._engine, layer._lite);\n // Babylon.js `Gizmo.updateGizmoRotationToMatchAttachedMesh` defaults to true.\n setScaleGizmoLocalCoordinates(this._lite, true);\n }\n\n /** Babylon.js `Gizmo.updateGizmoRotationToMatchAttachedMesh` — orient widgets to the node's local axes. */\n public set updateGizmoRotationToMatchAttachedMesh(value: boolean) {\n setScaleGizmoLocalCoordinates(this._lite, value);\n }\n\n public get attachedMesh(): AbstractMesh | null {\n return this._attached;\n }\n public set attachedMesh(value: AbstractMesh | null) {\n this._attached = value;\n attachScaleGizmoToNode(this._lite, (value?._lite as SceneNode | undefined) ?? null);\n }\n\n public get attachedNode(): AbstractMesh | null {\n return this._attached;\n }\n public set attachedNode(value: AbstractMesh | null) {\n this.attachedMesh = value;\n }\n\n public override dispose(): void {\n disposeScaleGizmo(this._lite, this._layer._lite);\n }\n}\n\nexport class BoundingBoxGizmo extends GizmoBase {\n /** @internal */\n public readonly _lite: LiteBoundingBoxGizmo;\n private _attached: AbstractMesh | null = null;\n\n /**\n * Babylon.js `BoundingBoxGizmo(color?, utilityLayer?)`. The first argument may\n * be the gizmo colour (when a layer is also supplied) or the utility layer.\n */\n public constructor(colorOrLayer: Color3 | UtilityLayerRenderer, layer?: UtilityLayerRenderer) {\n const resolvedLayer = layer ?? (colorOrLayer as UtilityLayerRenderer);\n const color = layer ? (colorOrLayer as Color3) : undefined;\n super(resolvedLayer);\n this._lite = createBoundingBoxGizmo(resolvedLayer._engine, resolvedLayer._lite, color ? { color: [color.r, color.g, color.b] } : {});\n }\n\n public get attachedMesh(): AbstractMesh | null {\n return this._attached;\n }\n public set attachedMesh(value: AbstractMesh | null) {\n this._attached = value;\n attachBoundingBoxGizmoToNode(this._lite, nodeLite(value));\n }\n\n public get attachedNode(): AbstractMesh | null {\n return this._attached;\n }\n public set attachedNode(value: AbstractMesh | null) {\n this.attachedMesh = value;\n }\n\n /** Babylon.js `BoundingBoxGizmo.enableDragBehavior()` — enables body-drag (Lite enables it by default). */\n public enableDragBehavior(): void {\n // Babylon Lite's bounding-box gizmo wires body-drag through its own pointer\n // behaviour; no explicit opt-in is required.\n }\n\n public override dispose(): void {\n disposeBoundingBoxGizmo(this._lite, this._layer._lite);\n }\n}\n\nexport class LightGizmo {\n /** @internal */\n public readonly _lite: LiteLightGizmo;\n /** @internal */\n public readonly _layer: UtilityLayerRenderer;\n private _attached: Light | null = null;\n\n public constructor(layer: UtilityLayerRenderer) {\n this._layer = layer;\n this._lite = createLightGizmo(layer._engine, layer._lite);\n }\n\n public get light(): Light | null {\n return this._attached;\n }\n public set light(value: Light | null) {\n this._attached = value;\n attachLightGizmoToLight(this._lite, value?._lite ?? null);\n }\n\n /**\n * Babylon.js `LightGizmo.attachedMesh` — the gizmo's visual root. Babylon.js\n * code reads this to reposition the gizmo for lights without a position (e.g.\n * hemispheric). Returns a thin proxy over the Lite gizmo's `root` node whose\n * `position` writes through to it.\n */\n public get attachedMesh(): { position: Vector3 } {\n const root = this._lite.root;\n return {\n get position(): Vector3 {\n return root.position as unknown as Vector3;\n },\n set position(v: Vector3) {\n root.position.set(v.x, v.y, v.z);\n },\n };\n }\n\n public dispose(): void {\n disposeLightGizmo(this._lite, this._layer._lite);\n }\n}\n\nexport class CameraGizmo {\n /** @internal */\n public readonly _lite: LiteCameraGizmo;\n /** @internal */\n public readonly _layer: UtilityLayerRenderer;\n private _attached: Camera | null = null;\n\n public constructor(layer: UtilityLayerRenderer) {\n this._layer = layer;\n this._lite = createCameraGizmo(layer._engine, layer._lite);\n }\n\n public get camera(): Camera | null {\n return this._attached;\n }\n public set camera(value: Camera | null) {\n this._attached = value;\n attachCameraGizmoToCamera(this._lite, value?._lite ?? null);\n }\n\n public dispose(): void {\n disposeCameraGizmo(this._lite, this._layer._lite);\n }\n}\n\n/**\n * Babylon.js single-axis / single-plane gizmos. Babylon.js constructs these with\n * `(axis, color, utilityLayer)` and attaches to a node via `attachedNode`. Each\n * maps to a Babylon Lite single-axis gizmo factory.\n *\n * @internal Resolve the Lite scene node for a compat node (mesh `_lite` or\n * transform `_node`).\n */\nfunction nodeLite(value: Node | null): SceneNode | null {\n if (!value) {\n return null;\n }\n const n = value as { _lite?: SceneNode; _node?: SceneNode };\n return n._lite ?? n._node ?? null;\n}\n\n/** Babylon.js `AxisDragGizmo` — drags the attached node along a single world axis. */\nexport class AxisDragGizmo extends GizmoBase {\n /** @internal */\n public readonly _lite: LiteAxisDragGizmo;\n private _attached: Node | null = null;\n\n public constructor(dragAxis: Vector3, color: Color3, layer: UtilityLayerRenderer) {\n super(layer);\n this._lite = createAxisDragGizmo(layer._engine, layer._lite, {\n dragAxis: { x: dragAxis.x, y: dragAxis.y, z: dragAxis.z },\n color: [color.r, color.g, color.b],\n });\n }\n\n public get attachedMesh(): AbstractMesh | null {\n return this._attached as AbstractMesh | null;\n }\n public set attachedMesh(value: AbstractMesh | null) {\n this.attachedNode = value;\n }\n\n public get attachedNode(): Node | null {\n return this._attached;\n }\n public set attachedNode(value: Node | null) {\n this._attached = value;\n attachAxisDragGizmoToNode(this._lite, nodeLite(value));\n }\n\n public override dispose(): void {\n disposeAxisDragGizmo(this._lite, this._layer._lite);\n }\n}\n\n/** Babylon.js `PlaneRotationGizmo` — rotates the attached node about a plane normal. */\nexport class PlaneRotationGizmo extends GizmoBase {\n /** @internal */\n public readonly _lite: LitePlaneRotationGizmo;\n private _attached: Node | null = null;\n\n public constructor(planeNormal: Vector3, color: Color3, layer: UtilityLayerRenderer) {\n super(layer);\n this._lite = createPlaneRotationGizmo(layer._engine, layer._lite, {\n planeNormal: { x: planeNormal.x, y: planeNormal.y, z: planeNormal.z },\n color: [color.r, color.g, color.b],\n });\n }\n\n public get attachedMesh(): AbstractMesh | null {\n return this._attached as AbstractMesh | null;\n }\n public set attachedMesh(value: AbstractMesh | null) {\n this.attachedNode = value;\n }\n\n public get attachedNode(): Node | null {\n return this._attached;\n }\n public set attachedNode(value: Node | null) {\n this._attached = value;\n attachPlaneRotationGizmoToNode(this._lite, nodeLite(value));\n }\n\n public override dispose(): void {\n disposePlaneRotationGizmo(this._lite, this._layer._lite);\n }\n}\n\n/** Babylon.js `PlaneDragGizmo` — drags the attached node within a plane. */\nexport class PlaneDragGizmo extends GizmoBase {\n /** @internal */\n public readonly _lite: LitePlaneDragGizmo;\n private _attached: Node | null = null;\n\n public constructor(dragPlaneNormal: Vector3, color: Color3, layer: UtilityLayerRenderer) {\n super(layer);\n this._lite = createPlaneDragGizmo(layer._engine, layer._lite, {\n dragPlaneNormal: { x: dragPlaneNormal.x, y: dragPlaneNormal.y, z: dragPlaneNormal.z },\n color: [color.r, color.g, color.b],\n });\n }\n\n public get attachedMesh(): AbstractMesh | null {\n return this._attached as AbstractMesh | null;\n }\n public set attachedMesh(value: AbstractMesh | null) {\n this.attachedNode = value;\n }\n\n public get attachedNode(): Node | null {\n return this._attached;\n }\n public set attachedNode(value: Node | null) {\n this._attached = value;\n attachPlaneDragGizmoToNode(this._lite, nodeLite(value));\n }\n\n public override dispose(): void {\n disposePlaneDragGizmo(this._lite, this._layer._lite);\n }\n}\n\n/** Babylon.js `AxisScaleGizmo` — scales the attached node along a single axis. */\nexport class AxisScaleGizmo extends GizmoBase {\n /** @internal */\n public readonly _lite: LiteAxisScaleGizmo;\n private _attached: Node | null = null;\n\n public constructor(dragAxis: Vector3, color: Color3, layer: UtilityLayerRenderer) {\n super(layer);\n this._lite = createAxisScaleGizmo(layer._engine, layer._lite, {\n dragAxis: { x: dragAxis.x, y: dragAxis.y, z: dragAxis.z },\n color: [color.r, color.g, color.b],\n });\n }\n\n public get attachedMesh(): AbstractMesh | null {\n return this._attached as AbstractMesh | null;\n }\n public set attachedMesh(value: AbstractMesh | null) {\n this.attachedNode = value;\n }\n\n public get attachedNode(): Node | null {\n return this._attached;\n }\n public set attachedNode(value: Node | null) {\n this._attached = value;\n attachAxisScaleGizmoToNode(this._lite, nodeLite(value));\n }\n\n public override dispose(): void {\n disposeAxisScaleGizmo(this._lite, this._layer._lite);\n }\n}\n\n/**\n * Babylon.js `GizmoManager` — coordinates the position/rotation/scale/bounding-box\n * gizmos over a shared utility layer and a single attached mesh.\n */\nexport class GizmoManager {\n public readonly gizmos: {\n positionGizmo: PositionGizmo | null;\n rotationGizmo: RotationGizmo | null;\n scaleGizmo: ScaleGizmo | null;\n boundingBoxGizmo: BoundingBoxGizmo | null;\n } = { positionGizmo: null, rotationGizmo: null, scaleGizmo: null, boundingBoxGizmo: null };\n\n private readonly _layer: UtilityLayerRenderer;\n private _attached: AbstractMesh | null = null;\n\n public constructor(scene: Scene) {\n this._layer = new UtilityLayerRenderer(scene);\n }\n\n public set positionGizmoEnabled(enabled: boolean) {\n this._toggle(\"positionGizmo\", enabled, () => new PositionGizmo(this._layer));\n }\n public set rotationGizmoEnabled(enabled: boolean) {\n this._toggle(\"rotationGizmo\", enabled, () => new RotationGizmo(this._layer));\n }\n public set scaleGizmoEnabled(enabled: boolean) {\n this._toggle(\"scaleGizmo\", enabled, () => new ScaleGizmo(this._layer));\n }\n public set boundingBoxGizmoEnabled(enabled: boolean) {\n this._toggle(\"boundingBoxGizmo\", enabled, () => new BoundingBoxGizmo(this._layer));\n }\n\n public attachToMesh(mesh: Mesh | null): void {\n this._attached = mesh;\n if (this.gizmos.positionGizmo) {\n this.gizmos.positionGizmo.attachedMesh = mesh;\n }\n if (this.gizmos.rotationGizmo) {\n this.gizmos.rotationGizmo.attachedMesh = mesh;\n }\n if (this.gizmos.scaleGizmo) {\n this.gizmos.scaleGizmo.attachedMesh = mesh;\n }\n if (this.gizmos.boundingBoxGizmo) {\n this.gizmos.boundingBoxGizmo.attachedMesh = mesh;\n }\n }\n\n public dispose(): void {\n this.gizmos.positionGizmo?.dispose();\n this.gizmos.rotationGizmo?.dispose();\n this.gizmos.scaleGizmo?.dispose();\n this.gizmos.boundingBoxGizmo?.dispose();\n this._layer.dispose();\n }\n\n private _toggle<K extends \"positionGizmo\" | \"rotationGizmo\" | \"scaleGizmo\" | \"boundingBoxGizmo\">(\n key: K,\n enabled: boolean,\n make: () => PositionGizmo | RotationGizmo | ScaleGizmo | BoundingBoxGizmo\n ): void {\n if (enabled && !this.gizmos[key]) {\n const gizmo = make() as never;\n this.gizmos[key] = gizmo;\n this.gizmos[key]!.attachedMesh = this._attached;\n } else if (!enabled && this.gizmos[key]) {\n this.gizmos[key]!.dispose();\n this.gizmos[key] = null;\n }\n }\n}\n","/**\n * Babylon.js-compatible camera/mesh behaviors.\n *\n * Camera behaviors (`AutoRotationBehavior`, `BouncingBehavior`,\n * `FramingBehavior`) operate on the compat `ArcRotateCamera` via the scene's\n * before-render hook. `AutoRotationBehavior` is fully functional; bouncing and\n * framing implement the structural surface plus their core action without\n * Babylon.js's tweened animations (so they are `⚡ Partial`).\n */\n\nimport { onBeforeRender } from \"babylon-lite\";\n\nimport type { ArcRotateCamera } from \"../cameras/cameras.js\";\n\n/** Babylon.js `Behavior<T>` interface. */\nexport interface Behavior<T> {\n readonly name: string;\n init(): void;\n attach(target: T): void;\n detach(): void;\n}\n\n/** Idle auto-rotation of an `ArcRotateCamera` (spins `alpha` when not interacting). */\nexport class AutoRotationBehavior implements Behavior<ArcRotateCamera> {\n public readonly name = \"AutoRotation\";\n /** Idle rotation speed in radians/second. */\n public idleRotationSpeed = 0.05;\n private _camera: ArcRotateCamera | null = null;\n private _detach: (() => void) | undefined;\n\n public init(): void {\n // no-op\n }\n\n public attach(camera: ArcRotateCamera): void {\n this._camera = camera;\n const scene = camera.getScene();\n if (!scene) {\n return;\n }\n // onBeforeRender passes the frame delta in milliseconds.\n const cb = (deltaMs: number): void => {\n if (this._camera) {\n this._camera.alpha += this.idleRotationSpeed * (deltaMs / 1000);\n }\n };\n onBeforeRender(scene._lite, cb);\n this._detach = () => {\n this._camera = null;\n };\n }\n\n public detach(): void {\n this._detach?.();\n this._detach = undefined;\n }\n}\n\n/** Clamps an `ArcRotateCamera`'s radius to a [lower, upper] band (no bounce tween). */\nexport class BouncingBehavior implements Behavior<ArcRotateCamera> {\n public readonly name = \"Bouncing\";\n public lowerRadiusTransitionRange = 2;\n public upperRadiusTransitionRange = -2;\n private _camera: ArcRotateCamera | null = null;\n private _detach: (() => void) | undefined;\n\n public init(): void {\n // no-op\n }\n\n public attach(camera: ArcRotateCamera): void {\n this._camera = camera;\n const scene = camera.getScene();\n if (!scene) {\n return;\n }\n const cb = (): void => {\n const cam = this._camera;\n if (!cam) {\n return;\n }\n if (cam.lowerRadiusLimit != null && cam.radius < cam.lowerRadiusLimit) {\n cam.radius = cam.lowerRadiusLimit;\n }\n if (cam.upperRadiusLimit != null && cam.radius > cam.upperRadiusLimit) {\n cam.radius = cam.upperRadiusLimit;\n }\n };\n onBeforeRender(scene._lite, cb);\n this._detach = () => {\n this._camera = null;\n };\n }\n\n public detach(): void {\n this._detach?.();\n this._detach = undefined;\n }\n}\n\n/** Frames an `ArcRotateCamera` on a target by setting its radius (no zoom tween). */\nexport class FramingBehavior implements Behavior<ArcRotateCamera> {\n public readonly name = \"Framing\";\n public radius = 10;\n private _camera: ArcRotateCamera | null = null;\n\n public init(): void {\n // no-op\n }\n\n public attach(camera: ArcRotateCamera): void {\n this._camera = camera;\n }\n\n public detach(): void {\n this._camera = null;\n }\n\n /** Set the camera radius to frame a target of the given world-space radius. */\n public zoomOnBoundingRadius(boundingRadius: number): void {\n if (this._camera) {\n this._camera.radius = boundingRadius * 2.5;\n }\n }\n}\n","/**\n * Babylon.js-compatible `SpriteManager` / `Sprite` over Babylon Lite's\n * camera-facing billboard sprite system.\n *\n * Babylon.js positions sprites in **world space** (`sprite.position` is a\n * `Vector3`, `sprite.width`/`height` are world units) and renders them as\n * camera-facing billboards. Babylon Lite's `createFacingBillboardSystem` +\n * `addBillboardSpriteIndex` use the exact same world-space model\n * (`position: [x,y,z]`, `sizeWorld: [w,h]`), so the mapping is direct.\n *\n * The atlas image loads asynchronously, so the `SpriteManager` constructor\n * defers building the Lite billboard system until engine start: it tracks the\n * atlas-load promise via `scene._trackTextureLoad` and registers a\n * `scene._deferAdd` callback that — once the atlas is ready — builds the system,\n * pushes every `Sprite`'s current props, and attaches it to the scene.\n */\n\nimport {\n loadSpriteAtlas,\n createFacingBillboardSystem,\n addBillboardSpriteIndex,\n updateBillboardSpriteIndex,\n addFacingBillboardSystem,\n billboardBlendAlpha,\n billboardBlendAdditive,\n createSprite2DLayer,\n addSprite2DIndex,\n updateSprite2DIndex,\n createSpriteRenderer,\n registerSpriteRenderer,\n spriteBlendAlpha,\n spriteBlendPremultiplied,\n spriteBlendAdditive,\n} from \"babylon-lite\";\nimport type { SpriteAtlas, FacingBillboardSpriteSystem, BillboardBlendDescriptor, BillboardSpriteInit, Sprite2DLayer, SpriteBlendMode } from \"babylon-lite\";\n\nimport { Vector3 } from \"../math/vector.js\";\nimport { Color4 } from \"../math/color.js\";\nimport type { Scene } from \"../scene/scene.js\";\nimport type { WebGPUEngine } from \"../engine/engine.js\";\n\ninterface CellSize {\n width: number;\n height: number;\n}\n\n/** Babylon.js `Constants.ALPHA_ONEONE` (additive). */\nconst ALPHA_ONEONE = 6;\n/** Babylon.js `Constants.ALPHA_ADD`. */\nconst ALPHA_ADD = 1;\n\n/**\n * Babylon.js `SpriteManager` — owns a sprite atlas and a pool of `Sprite`s that\n * render as camera-facing billboards. Backed by a Lite facing-billboard system.\n */\nexport class SpriteManager {\n public name: string;\n /** Babylon.js `manager.disableDepthWrite`. Accepted for parity (Lite billboards self-manage depth). */\n public disableDepthWrite = false;\n /** Babylon.js `manager.blendMode` (`Constants.ALPHA_*`). Mapped to a Lite billboard blend at build. */\n public blendMode = 2;\n\n /** @internal Sprites created against this manager, in creation order. */\n public readonly _sprites: Sprite[] = [];\n /** @internal The Lite billboard system, built at engine start. */\n public _lite?: FacingBillboardSpriteSystem;\n\n private _atlas?: SpriteAtlas;\n\n public constructor(name: string, url: string, capacity: number, cellSize: CellSize, scene: Scene, _epsilon = 0.01, samplingMode = 2) {\n this.name = name;\n const engine = scene.getEngine()._lite;\n // Babylon.js `Texture.NEAREST_SAMPLINGMODE` is 1; everything else (bi/tri-\n // linear) maps to Lite's \"linear\".\n const sampling = samplingMode === 1 ? \"nearest\" : \"linear\";\n // Kick off the async atlas load; resolve stores the atlas for the\n // deferred build. Tracked so the engine awaits it before building.\n scene._trackTextureLoad(\n loadSpriteAtlas(engine, url, {\n gridSize: [cellSize.width, cellSize.height],\n sampling,\n }).then((atlas) => {\n this._atlas = atlas;\n })\n );\n // Build the billboard system once the atlas is ready (after pending\n // textures are awaited) and attach it to the scene.\n scene._deferAdd(() => {\n if (!this._atlas) {\n return;\n }\n const blendMode = this._mapBlendMode();\n const system = createFacingBillboardSystem(this._atlas, { capacity, blendMode });\n for (const sprite of this._sprites) {\n sprite._applyTo(system);\n }\n this._lite = system;\n addFacingBillboardSystem(scene._lite, system);\n });\n }\n\n /** @internal Map the Babylon.js `Constants.ALPHA_*` blend mode to a Lite billboard blend. */\n private _mapBlendMode(): BillboardBlendDescriptor {\n if (this.blendMode === ALPHA_ONEONE || this.blendMode === ALPHA_ADD) {\n return billboardBlendAdditive;\n }\n return billboardBlendAlpha;\n }\n}\n\n/**\n * Babylon.js `Sprite` — a single camera-facing billboard in a `SpriteManager`'s\n * atlas. World-space position + size; cell index selects the atlas frame.\n *\n * Properties are **live**: once the manager has built its Lite billboard system\n * (at engine start), mutating a sprite property pushes an\n * `updateBillboardSpriteIndex` patch so per-frame animation (e.g. advancing\n * `cellIndex` or toggling `isVisible`) is reflected on the GPU. Before the\n * system is built, property writes are buffered and flushed once in `_applyTo`.\n *\n * Note: `position`/`color` are object values; reassigning them\n * (`sprite.position = new Vector3(...)`) pushes a patch, but mutating a\n * component in place (`sprite.position.x = …`) does not — call the setter (or\n * reassign) to push a live update.\n */\nexport class Sprite {\n public name: string;\n\n private _position = new Vector3(0, 0, 0);\n private _width = 1;\n private _height = 1;\n private _cellIndex = 0;\n private _angle = 0;\n private _color = new Color4(1, 1, 1, 1);\n private _invertU = false;\n private _invertV = false;\n private _visible = true;\n\n /** @internal The Lite billboard system this sprite belongs to (set in `_applyTo`). */\n private _system?: FacingBillboardSpriteSystem;\n /** @internal This sprite's instance index in `_system` (set in `_applyTo`). */\n private _index = -1;\n\n public constructor(name: string, manager: SpriteManager) {\n this.name = name;\n manager._sprites.push(this);\n }\n\n public get position(): Vector3 {\n return this._position;\n }\n public set position(value: Vector3) {\n this._position = value;\n this._patch({ position: [value.x, value.y, value.z] });\n }\n\n public get width(): number {\n return this._width;\n }\n public set width(value: number) {\n this._width = value;\n this._patch({ sizeWorld: [value, this._height] });\n }\n\n public get height(): number {\n return this._height;\n }\n public set height(value: number) {\n this._height = value;\n this._patch({ sizeWorld: [this._width, value] });\n }\n\n public get cellIndex(): number {\n return this._cellIndex;\n }\n public set cellIndex(value: number) {\n this._cellIndex = value;\n this._patch({ frame: value });\n }\n\n public get angle(): number {\n return this._angle;\n }\n public set angle(value: number) {\n this._angle = value;\n this._patch({ rotation: value });\n }\n\n public get color(): Color4 {\n return this._color;\n }\n public set color(value: Color4) {\n this._color = value;\n this._patch({ color: [value.r, value.g, value.b, value.a] });\n }\n\n public get invertU(): boolean {\n return this._invertU;\n }\n public set invertU(value: boolean) {\n this._invertU = value;\n this._patch({ flipX: value });\n }\n\n public get invertV(): boolean {\n return this._invertV;\n }\n public set invertV(value: boolean) {\n this._invertV = value;\n this._patch({ flipY: value });\n }\n\n public get isVisible(): boolean {\n return this._visible;\n }\n public set isVisible(value: boolean) {\n this._visible = value;\n this._patch({ visible: value });\n }\n\n /** @internal Add this sprite to the Lite billboard system and record its index for live updates. */\n public _applyTo(system: FacingBillboardSpriteSystem): void {\n this._index = addBillboardSpriteIndex(system, {\n position: [this._position.x, this._position.y, this._position.z],\n sizeWorld: [this._width, this._height],\n frame: this._cellIndex,\n rotation: this._angle,\n color: [this._color.r, this._color.g, this._color.b, this._color.a],\n flipX: this._invertU,\n flipY: this._invertV,\n visible: this._visible,\n });\n this._system = system;\n }\n\n /** @internal Push a live property patch to the Lite billboard system (no-op before build). */\n private _patch(patch: Partial<BillboardSpriteInit>): void {\n if (this._system && this._index >= 0) {\n updateBillboardSpriteIndex(this._system, this._index, patch);\n }\n }\n}\n\n/** Babylon.js `Constants.ALPHA_PREMULTIPLIED`. */\nconst ALPHA_PREMULTIPLIED = 7;\n\n/**\n * Babylon.js `ThinSprite` — a lightweight pixel-space sprite drawn by a\n * {@link SpriteRenderer}. Position is in screen pixels (origin bottom-left, +Y\n * up, matching the orthographic projection BJS sprite scenes set up); size is in\n * pixels; `cellIndex` selects the atlas frame.\n */\nexport class ThinSprite {\n public position = new Vector3(0, 0, 0);\n public width = 1;\n public height = 1;\n public cellIndex = 0;\n public angle = 0;\n public color = new Color4(1, 1, 1, 1);\n public invertU = false;\n public invertV = false;\n public isVisible = true;\n}\n\ninterface ThinSpriteLike {\n position: { x: number; y: number };\n width: number;\n height: number;\n cellIndex: number;\n angle: number;\n color: { r: number; g: number; b: number; a: number };\n invertU: boolean;\n invertV: boolean;\n isVisible: boolean;\n}\n\n/**\n * Babylon.js `SpriteRenderer` — the low-level, scene-less pixel-space sprite\n * pass. Babylon.js scenes build an array of {@link ThinSprite}s and call\n * `renderer.render(sprites, dt, view, projection)` from their own render loop\n * with an orthographic pixel projection.\n *\n * Babylon Lite's equivalent is `createSpriteRenderer` + a pixel-space\n * `Sprite2DLayer`. The atlas image loads asynchronously, so the renderer\n * registers the atlas load as engine startup work (evaluated once `cellWidth`/\n * `cellHeight` are set), then builds + registers a self-drawing Lite sprite\n * renderer on the first `render(...)` call (the engine invokes the loop callback\n * once after startup for scene-less loops). Subsequent `render(...)` calls push\n * live per-sprite updates so animated scenes stay in sync.\n *\n * Coordinate mapping: BJS sprite positions are bottom-left-origin pixels (the\n * scenes use `OrthoOffCenterLH(0, w, 0, h)` and set `y = canvas.height - topY`),\n * whereas Lite `Sprite2DLayer` uses top-left-origin pixels — so the Y axis is\n * flipped (`positionPx.y = canvasHeight - sprite.position.y`) and the rotation\n * sign is negated to match.\n */\nexport class SpriteRenderer {\n public texture: { name: string; samplingMode?: number } | null = null;\n public cellWidth = 0;\n public cellHeight = 0;\n public disableDepthWrite = false;\n /** Babylon.js `Constants.ALPHA_*` blend mode. `ALPHA_PREMULTIPLIED` maps to Lite's premultiplied path. */\n public blendMode = 2;\n /** @internal Babylon.js scenes poll this to gate readiness; true once the Lite renderer is built. */\n public _shadersLoaded = false;\n\n private readonly _engine: WebGPUEngine;\n private readonly _capacity: number;\n private _atlas?: SpriteAtlas;\n private _layer?: Sprite2DLayer;\n private _built = false;\n private readonly _indices: number[] = [];\n private _sprites: ThinSpriteLike[] = [];\n\n public constructor(engine: WebGPUEngine, capacity = 256, _epsilon = 0.01, _scene?: unknown) {\n this._engine = engine;\n this._capacity = capacity;\n // Defer the atlas load to engine startup: the thunk runs after the scene\n // setup code has assigned `texture`/`cellWidth`/`cellHeight`.\n engine._registerStartupWork(async () => {\n if (!this.texture) {\n return;\n }\n const premultiplied = this.blendMode === ALPHA_PREMULTIPLIED;\n this._atlas = await loadSpriteAtlas(engine._lite, this.texture.name, {\n gridSize: [this.cellWidth, this.cellHeight],\n sampling: this.texture.samplingMode === 1 ? \"nearest\" : \"linear\",\n premultipliedAlpha: premultiplied,\n });\n });\n }\n\n /** @internal Map the Babylon.js blend mode to a Lite sprite blend descriptor. */\n private _blend(): SpriteBlendMode {\n if (this.blendMode === ALPHA_PREMULTIPLIED) {\n return spriteBlendPremultiplied;\n }\n if (this.blendMode === 1 || this.blendMode === 6) {\n return spriteBlendAdditive;\n }\n return spriteBlendAlpha;\n }\n\n /**\n * Babylon.js `renderer.render(sprites, deltaTime, viewMatrix, projectionMatrix)`.\n * The matrices are owned by Babylon Lite's pixel-space sprite pass, so they are\n * accepted for API parity but not consumed. First call builds + registers the\n * Lite sprite renderer; later calls push per-sprite updates.\n */\n public render(sprites: readonly ThinSpriteLike[], _deltaTime?: number, _view?: unknown, _projection?: unknown): void {\n this._sprites = sprites as ThinSpriteLike[];\n if (!this._atlas) {\n return;\n }\n const canvasHeight = this._engine.getRenderingCanvas().height;\n if (!this._built) {\n const layer = createSprite2DLayer(this._atlas, { capacity: this._capacity, depth: \"none\", blendMode: this._blend() });\n for (const s of this._sprites) {\n this._indices.push(addSprite2DIndex(layer, this._spriteProps(s, canvasHeight)));\n }\n this._layer = layer;\n const renderer = createSpriteRenderer(this._engine._lite, {\n layers: [layer],\n // Only clear if the scene drove a `engine.clear(...)` (scene-less 2D\n // path); when overlaying a 3D scene the renderer must preserve the\n // already-rendered colour, so it draws without clearing.\n clear: this._engine._clearRequested,\n clearValue: { ...this._engine._lastClearColor },\n });\n registerSpriteRenderer(renderer);\n this._built = true;\n this._shadersLoaded = true;\n return;\n }\n // Live update path (animated scenes): re-sync each sprite's props.\n const layer = this._layer!;\n for (let i = 0; i < this._sprites.length; i++) {\n updateSprite2DIndex(layer, this._indices[i]!, this._spriteProps(this._sprites[i]!, canvasHeight));\n }\n }\n\n /** @internal Convert a BJS `ThinSprite` to Lite `Sprite2DProps` (Y-flip + rotation negate). */\n private _spriteProps(s: ThinSpriteLike, canvasHeight: number): Parameters<typeof addSprite2DIndex>[1] {\n return {\n positionPx: [s.position.x, canvasHeight - s.position.y],\n sizePx: [s.width, s.height],\n frame: s.cellIndex,\n rotation: -s.angle,\n color: [s.color.r, s.color.g, s.color.b, s.color.a],\n flipX: s.invertU,\n flipY: s.invertV,\n visible: s.isVisible,\n };\n }\n}\n","/**\n * Babylon.js-compatible `ShadowGenerator` over the Babylon Lite shadow factories.\n *\n * Babylon.js constructs a `ShadowGenerator(mapSize, light)`, toggles technique\n * flags (`usePercentageCloserFiltering`, `useBlurExponentialShadowMap`, …), and\n * registers casters via `addShadowCaster(mesh)`. Babylon Lite instead has\n * dedicated factories (`createEsmDirectionalShadowGenerator`,\n * `createPcfDirectionalShadowGenerator`, `createPcfSpotlightShadowGenerator`) and\n * requires the scene to be registered with `registerSceneWithShadowSupport`.\n *\n * This wrapper records the BJS-style configuration up front and defers the actual\n * Lite generator creation to engine start (when the GPU device and all caster\n * meshes exist), then wires `light.shadowGenerator` + caster meshes. The owning\n * scene flips to shadow-aware registration when any generator is present.\n */\n\nimport { createEsmDirectionalShadowGenerator, createPcfDirectionalShadowGenerator, createPcfSpotlightShadowGenerator, setShadowTaskCasterMeshes } from \"babylon-lite\";\nimport type { EngineContext, Mesh as LiteMesh } from \"babylon-lite\";\n\nimport type { Light } from \"../lights/lights.js\";\nimport type { AbstractMesh } from \"../meshes/meshes.js\";\n\nexport class ShadowGenerator {\n private readonly _mapSize: number;\n private readonly _light: Light;\n private readonly _casters: AbstractMesh[] = [];\n /** @internal The built Lite shadow generator (set in `_build`). Used to wire NME receivers. */\n public _liteGen: unknown;\n\n public getClassName(): string {\n return \"ShadowGenerator\";\n }\n\n // ── BJS technique flags / tunables (read at build time) ──\n /** Percentage-closer filtering. */\n public usePercentageCloserFiltering = false;\n /** Contact-hardening (treated as PCF here). */\n public useContactHardeningShadow = false;\n /** Blurred exponential shadow map (the Babylon.js default soft-shadow path for directional lights). */\n public useBlurExponentialShadowMap = false;\n public useExponentialShadowMap = false;\n public useBlurCloseExponentialShadowMap = false;\n public useCloseExponentialShadowMap = false;\n public usePoissonSampling = false;\n public useKernelBlur = false;\n public blurKernel = 1;\n public blurScale = 2;\n public bias = 0.00005;\n public normalBias = 0;\n public darkness = 0;\n public depthScale = 50;\n public frustumEdgeFalloff = 0;\n public forceBackFacesOnly = false;\n /** Babylon.js ortho projection bounds (directional). */\n public orthoMinZ: number | undefined;\n public orthoMaxZ: number | undefined;\n\n public constructor(mapSize: number, light: Light) {\n this._mapSize = mapSize;\n this._light = light;\n const scene = light.getScene();\n if (scene) {\n scene._registerShadowGenerator(this);\n }\n }\n\n /** Babylon.js `addShadowCaster(mesh, includeDescendants?)`. */\n public addShadowCaster(mesh: AbstractMesh, _includeDescendants = true): ShadowGenerator {\n if (!this._casters.includes(mesh)) {\n this._casters.push(mesh);\n }\n return this;\n }\n\n /** Babylon.js `removeShadowCaster(mesh)`. */\n public removeShadowCaster(mesh: AbstractMesh): ShadowGenerator {\n const i = this._casters.indexOf(mesh);\n if (i >= 0) {\n this._casters.splice(i, 1);\n }\n return this;\n }\n\n /** Babylon.js `getShadowMap()` — returns a minimal render-list holder for parity. */\n public getShadowMap(): { renderList: AbstractMesh[] } {\n return { renderList: this._casters };\n }\n\n public getDarkness(): number {\n return this.darkness;\n }\n public setDarkness(value: number): ShadowGenerator {\n this.darkness = value;\n return this;\n }\n\n public getLight(): Light {\n return this._light;\n }\n\n public dispose(): void {\n this._light._lite.shadowGenerator = undefined;\n }\n\n /**\n * @internal Build the underlying Lite shadow generator and wire casters. Called\n * by the engine at start, after meshes are added and before the scene registers.\n */\n public _build(engine: EngineContext): void {\n const liteLight = this._light._lite as never;\n const className = this._light.getClassName();\n const usePcf = this.usePercentageCloserFiltering || this.useContactHardeningShadow || this.usePoissonSampling;\n\n let liteGen;\n if (className === \"SpotLight\") {\n // Lite has only a PCF spot generator.\n liteGen = createPcfSpotlightShadowGenerator(engine, liteLight, {\n mapSize: this._mapSize,\n bias: this.bias,\n darkness: this.darkness,\n normalBias: this.normalBias,\n });\n } else if (usePcf) {\n liteGen = createPcfDirectionalShadowGenerator(engine, liteLight, {\n mapSize: this._mapSize,\n bias: this.bias,\n darkness: this.darkness,\n normalBias: this.normalBias,\n ...(this.orthoMinZ !== undefined ? { orthoMinZ: this.orthoMinZ } : {}),\n ...(this.orthoMaxZ !== undefined ? { orthoMaxZ: this.orthoMaxZ } : {}),\n });\n } else {\n // Default directional soft shadow: ESM (Babylon.js default + blur variants).\n liteGen = createEsmDirectionalShadowGenerator(engine, liteLight, {\n mapSize: this._mapSize,\n depthScale: this.depthScale,\n bias: this.bias,\n blurKernel: this.useKernelBlur || this.useBlurExponentialShadowMap ? this.blurKernel : 1,\n blurScale: this.blurScale,\n darkness: this.darkness,\n frustumEdgeFalloff: this.frustumEdgeFalloff,\n ...(this.orthoMinZ !== undefined ? { orthoMinZ: this.orthoMinZ } : {}),\n ...(this.orthoMaxZ !== undefined ? { orthoMaxZ: this.orthoMaxZ } : {}),\n });\n }\n\n (liteLight as { shadowGenerator?: unknown }).shadowGenerator = liteGen;\n this._liteGen = liteGen;\n const casterMeshes = this._casters.map((m) => m._lite as LiteMesh);\n setShadowTaskCasterMeshes(liteGen, casterMeshes);\n }\n}\n\n/**\n * Babylon.js `CascadedShadowGenerator` — cascaded shadow maps for large directional\n * scenes. Mapped onto Babylon Lite's CSM generator is a larger task; for now this\n * extends {@link ShadowGenerator} and falls back to the standard directional path,\n * which renders (a single cascade's worth of) shadows rather than throwing.\n */\nexport class CascadedShadowGenerator extends ShadowGenerator {\n public numCascades = 4;\n public lambda = 0.5;\n public stabilizeCascades = false;\n public depthClamp = true;\n public autoCalcDepthBounds = false;\n\n public override getClassName(): string {\n return \"CascadedShadowGenerator\";\n }\n}\n","/**\n * Babylon.js-compatible `NodeMaterial` over Babylon Lite's NME parser.\n *\n * Babylon.js exposes a synchronous `NodeMaterial.Parse(json, scene)`, optional\n * `getBlockByName(name).texture = …` overrides, then `build()`. Babylon Lite\n * instead parses an NME graph asynchronously via `parseNodeMaterialFromSnippet`,\n * taking texture overrides up front (keyed by block name) and emitting/compiling\n * the pipeline in one shot.\n *\n * The compat wrapper bridges the two: `Parse` returns immediately with an\n * unparsed handle and records the source; `getBlockByName` returns a thin proxy\n * that captures per-block texture assignments; the real (async) parse is deferred\n * to engine start — registered with the scene so it is awaited (alongside its\n * override textures) before the scene builds. `build()` is a no-op.\n */\n\nimport { parseNodeMaterialFromSnippet } from \"babylon-lite\";\nimport type { EngineContext, NodeMaterial as LiteNodeMaterial, Texture2D } from \"babylon-lite\";\n\nimport type { Scene } from \"../scene/scene.js\";\n\ninterface TextureLike {\n _lite?: Texture2D;\n whenReadyAsync?(): Promise<void>;\n}\n\n/** A thin proxy for a Babylon.js NME block, capturing texture assignments. */\nclass NodeMaterialBlockProxy {\n public constructor(\n private readonly _owner: NodeMaterial,\n private readonly _name: string\n ) {}\n\n public set texture(value: TextureLike | null) {\n this._owner._setBlockTexture(this._name, value);\n }\n public get texture(): TextureLike | null {\n return this._owner._getBlockTexture(this._name);\n }\n}\n\nexport class NodeMaterial {\n public name: string;\n public backFaceCulling = true;\n /** @internal The compiled Lite node material. Undefined until the async parse resolves. */\n public _lite: LiteNodeMaterial | undefined;\n\n private readonly _json: object | string;\n private readonly _textureOverrides: Record<string, TextureLike> = {};\n\n public constructor(name: string, _scene: Scene, json: object | string = {}) {\n this.name = name;\n this._json = json;\n }\n\n public getClassName(): string {\n return \"NodeMaterial\";\n }\n\n /** Babylon.js `getBlockByName(name)` — returns a proxy that captures texture overrides. */\n public getBlockByName(name: string): NodeMaterialBlockProxy {\n return new NodeMaterialBlockProxy(this, name);\n }\n\n /** @internal */\n public _setBlockTexture(name: string, value: TextureLike | null): void {\n if (value) {\n this._textureOverrides[name] = value;\n } else {\n delete this._textureOverrides[name];\n }\n }\n\n /** @internal */\n public _getBlockTexture(name: string): TextureLike | null {\n return this._textureOverrides[name] ?? null;\n }\n\n /** Babylon.js `NodeMaterial.build()` — Lite builds during parse, so this is a no-op. */\n public build(_verbose?: boolean): void {\n // Intentionally empty.\n }\n\n /** @internal Parse already happened via the scene-tracked promise; nothing to finalize. */\n public _ensureRenderable(_engine: EngineContext): void {\n // No-op: `_lite` is set when the tracked parse promise resolves.\n }\n\n public dispose(): void {\n // GPU resources owned by the scene; disposed with it.\n }\n\n /** @internal Resolve override textures, then parse + compile the NME graph. */\n public async _parse(engine: EngineContext, shadowGenerators: readonly unknown[] = []): Promise<void> {\n // Yield once so any synchronous `getBlockByName(name).texture = …` overrides\n // set immediately after `Parse()` are recorded before we read them.\n await Promise.resolve();\n const overrides = Object.entries(this._textureOverrides);\n await Promise.all(overrides.map(([, tex]) => tex.whenReadyAsync?.() ?? Promise.resolve()));\n const textures: Record<string, Texture2D> = {};\n for (const [blockName, tex] of overrides) {\n if (tex._lite) {\n textures[blockName] = tex._lite;\n }\n }\n this._lite = await parseNodeMaterialFromSnippet(engine, \"\", {\n json: this._json,\n ...(overrides.length ? { textures } : {}),\n // Babylon.js wires shadows into the scene globally; Babylon Lite takes them\n // at NME parse time, so NME shadow-receiver blocks sample the scene's\n // generators (e.g. ground `receiveShadows` in scenes 65/66).\n ...(shadowGenerators.length ? { shadowGenerators: shadowGenerators as never } : {}),\n });\n }\n\n /**\n * Babylon.js `NodeMaterial.Parse(source, scene, rootUrl?)` — parse an NME graph\n * from inline JSON. Returns synchronously; the actual GPU compile runs async and\n * is driven by the engine (after shadow generators are built) before the scene\n * builds, so NME shadow-receiver blocks can sample the scene's shadow generators.\n */\n public static Parse(source: object | string, scene: Scene, _rootUrl?: string): NodeMaterial {\n const material = new NodeMaterial(\"nodeMaterial\", scene, source);\n scene._registerNodeMaterial(material);\n return material;\n }\n}\n","/**\n * Babylon.js `@babylonjs/materials` `GridMaterial` over Babylon Lite's native\n * `createGridMaterial`.\n *\n * Babylon.js' `GridMaterial` is constructed empty and then has its appearance set\n * via mutable properties (`mainColor`, `lineColor`, `gridRatio`, …). Babylon Lite\n * instead bakes the grid options into a `ShaderMaterial` at creation time. The\n * compat wrapper accumulates the Babylon.js property assignments and builds the\n * Lite grid material lazily in {@link _ensureRenderable} (engine start, after all\n * properties are set), then exposes it as `_lite` so the mesh binds it.\n */\n\nimport { createGridMaterial } from \"babylon-lite\";\nimport type { EngineContext, ShaderMaterial as LiteShaderMaterial } from \"babylon-lite\";\n\nimport { Color3 } from \"../math/color.js\";\nimport { Vector3 } from \"../math/vector.js\";\nimport type { Scene } from \"../scene/scene.js\";\n\nexport class GridMaterial {\n public name: string;\n /** Background color between the lines (Babylon.js default black). */\n public mainColor = new Color3(0, 0, 0);\n /** Color of the grid lines (Babylon.js default teal). */\n public lineColor = new Color3(0.2, 0.2, 0.2);\n /** Spacing of the grid in object-space units. */\n public gridRatio = 1;\n /** Object-space offset added before computing the grid. */\n public gridOffset = new Vector3(0, 0, 0);\n /** Every Nth line is a major line. */\n public majorUnitFrequency = 10;\n /** Visibility of the minor (non-major) lines, `0..1`. */\n public minorUnitVisibility = 0.33;\n /** Opacity of the grid outside the lines; `<1` enables the transparent path. */\n public opacity = 1;\n /** Cosine-based antialiasing of the lines. */\n public antialias = true;\n /** Combine axes with `max` instead of additive sum. */\n public useMaxLine = false;\n /**\n * Babylon.js `@babylonjs/materials` 9.x `linesOnly` — show only the lines with\n * transparency between them. Babylon Lite expresses this via the opacity (`<1`)\n * transparent path, so enabling it forces that path.\n */\n public linesOnly = false;\n /** Back-face culling toggle. */\n public backFaceCulling = true;\n /** Babylon.js `Material.transparencyMode` (accepted for parity). */\n public transparencyMode: number | null = null;\n /** Wireframe toggle (not honoured by the grid material). */\n public wireframe = false;\n\n /** @internal The built Lite grid shader material (created at engine start). */\n public _lite: LiteShaderMaterial | undefined;\n\n public constructor(name: string, _scene?: Scene) {\n this.name = name;\n }\n\n public getClassName(): string {\n return \"GridMaterial\";\n }\n\n /**\n * @internal Build the Lite grid material from the accumulated Babylon.js\n * properties. Called by the engine just before the owning mesh is registered.\n */\n public _ensureRenderable(_engine: EngineContext): void {\n // `linesOnly` maps to Babylon Lite's transparent (opacity < 1) path; if the\n // caller left opacity at 1, nudge it just under 1 so the lines-only blend runs.\n const opacity = this.linesOnly && this.opacity >= 1 ? 0.9999 : this.opacity;\n this._lite = createGridMaterial({\n name: this.name,\n mainColor: [this.mainColor.r, this.mainColor.g, this.mainColor.b],\n lineColor: [this.lineColor.r, this.lineColor.g, this.lineColor.b],\n gridRatio: this.gridRatio,\n gridOffset: [this.gridOffset.x, this.gridOffset.y, this.gridOffset.z],\n majorUnitFrequency: this.majorUnitFrequency,\n minorUnitVisibility: this.minorUnitVisibility,\n opacity,\n antialias: this.antialias,\n useMaxLine: this.useMaxLine,\n backFaceCulling: this.backFaceCulling,\n });\n }\n\n public dispose(): void {\n // GPU resources are owned by the scene; disposed with it.\n }\n}\n","/**\n * Babylon.js-compatible easing functions (pure, no Babylon Lite dependency).\n *\n * These mirror Babylon.js's `EasingFunction` hierarchy and easing modes for use\n * with property animations. They are fully unit-testable.\n */\n\nexport const EASINGMODE_EASEIN = 0;\nexport const EASINGMODE_EASEOUT = 1;\nexport const EASINGMODE_EASEINOUT = 2;\n\nexport abstract class EasingFunction {\n public static readonly EASINGMODE_EASEIN = EASINGMODE_EASEIN;\n public static readonly EASINGMODE_EASEOUT = EASINGMODE_EASEOUT;\n public static readonly EASINGMODE_EASEINOUT = EASINGMODE_EASEINOUT;\n\n private _mode = EASINGMODE_EASEIN;\n\n public setEasingMode(mode: number): void {\n this._mode = Math.min(2, Math.max(0, mode));\n }\n\n public getEasingMode(): number {\n return this._mode;\n }\n\n /** The raw ease-in curve, implemented by each subclass over `gradient` in [0, 1]. */\n public abstract easeInCore(gradient: number): number;\n\n public ease(gradient: number): number {\n switch (this._mode) {\n case EASINGMODE_EASEIN:\n return this.easeInCore(gradient);\n case EASINGMODE_EASEOUT:\n return 1 - this.easeInCore(1 - gradient);\n default:\n return gradient >= 0.5 ? 1 - this.easeInCore((1 - gradient) * 2) * 0.5 : this.easeInCore(gradient * 2) * 0.5;\n }\n }\n}\n\nexport class CircleEase extends EasingFunction {\n public easeInCore(gradient: number): number {\n const g = Math.max(0, Math.min(1, gradient));\n return 1 - Math.sqrt(1 - g * g);\n }\n}\n\nexport class QuadraticEase extends EasingFunction {\n public easeInCore(gradient: number): number {\n return gradient * gradient;\n }\n}\n\nexport class CubicEase extends EasingFunction {\n public easeInCore(gradient: number): number {\n return gradient * gradient * gradient;\n }\n}\n\nexport class QuarticEase extends EasingFunction {\n public easeInCore(gradient: number): number {\n return gradient * gradient * gradient * gradient;\n }\n}\n\nexport class QuinticEase extends EasingFunction {\n public easeInCore(gradient: number): number {\n return gradient * gradient * gradient * gradient * gradient;\n }\n}\n\nexport class SineEase extends EasingFunction {\n public easeInCore(gradient: number): number {\n return 1 - Math.sin((Math.PI / 2) * (1 - gradient));\n }\n}\n\nexport class ExponentialEase extends EasingFunction {\n public constructor(private readonly exponent: number = 2) {\n super();\n }\n\n public easeInCore(gradient: number): number {\n if (this.exponent <= 0) {\n return gradient;\n }\n return (Math.exp(this.exponent * gradient) - 1) / (Math.exp(this.exponent) - 1);\n }\n}\n\nexport class BackEase extends EasingFunction {\n public constructor(private readonly amplitude: number = 1) {\n super();\n }\n\n public easeInCore(gradient: number): number {\n const num = Math.max(0, this.amplitude);\n return Math.pow(gradient, 3) - gradient * num * Math.sin(Math.PI * gradient);\n }\n}\n\nexport class ElasticEase extends EasingFunction {\n public constructor(\n private readonly oscillations: number = 3,\n private readonly springiness: number = 3\n ) {\n super();\n }\n\n public easeInCore(gradient: number): number {\n const num2 = Math.max(0, this.oscillations);\n const num3 = Math.max(0, this.springiness);\n const num = num3 === 0 ? gradient : (Math.exp(num3 * gradient) - 1) / (Math.exp(num3) - 1);\n return num * Math.sin((2 * Math.PI * num2 + Math.PI / 2) * gradient);\n }\n}\n\nexport class BounceEase extends EasingFunction {\n public constructor(\n private readonly bounces: number = 3,\n private readonly bounciness: number = 2\n ) {\n super();\n }\n\n public easeInCore(gradient: number): number {\n const num = Math.max(0, this.bounces);\n let bounciness = this.bounciness;\n if (bounciness <= 1) {\n bounciness = 1.001;\n }\n const num2 = Math.pow(bounciness, num);\n const num3 = 1 - bounciness;\n const num4 = (1 - num2) / num3 + num2 * 0.5;\n const num5 = gradient * num4;\n const num6 = Math.log(-num5 * (1 - bounciness) + 1) / Math.log(bounciness);\n const num7 = Math.floor(num6);\n const num8 = num7 + 1;\n const num9 = (1 - Math.pow(bounciness, num7)) / (num3 * num4);\n const num10 = (1 - Math.pow(bounciness, num8)) / (num3 * num4);\n const num11 = (num9 + num10) * 0.5;\n const num12 = gradient - num11;\n const num13 = num11 - num9;\n return (-Math.pow(1 / bounciness, num - num7) / (num13 * num13)) * (num12 - num13) * (num12 + num13);\n }\n}\n","/** Babylon.js-compatible `Tools` helpers (the small, pure subset). */\n\nexport const Tools = {\n /** High-resolution timestamp in milliseconds. */\n Now(): number {\n return typeof performance !== \"undefined\" ? performance.now() : Date.now();\n },\n\n ToRadians(degrees: number): number {\n return (degrees * Math.PI) / 180;\n },\n\n ToDegrees(radians: number): number {\n return (radians * 180) / Math.PI;\n },\n\n /** Clamp `value` into the inclusive `[min, max]` range. */\n Clamp(value: number, min = 0, max = 1): number {\n return Math.min(max, Math.max(min, value));\n },\n\n /** Generate an RFC4122 v4 UUID (used by Babylon.js for unique ids). */\n RandomId(): string {\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === \"x\" ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n },\n};\n","/**\n * Babylon.js-compatible Misc utilities — the pure-JS subset that has no Babylon\n * Lite or GPU dependency: `SmartArray`, `StringDictionary`, `Tags`,\n * `PerformanceMonitor`, and `ColorGradient`/`FactorGradient`.\n */\n\n/** A pre-sized, reusable array that tracks a logical `length` separately from capacity. */\nexport class SmartArray<T> {\n public data: Array<T | undefined>;\n public length = 0;\n\n public constructor(capacity: number) {\n this.data = new Array<T | undefined>(capacity);\n }\n\n public push(value: T): void {\n this.data[this.length++] = value;\n if (this.length > this.data.length) {\n this.data.length = this.length;\n }\n }\n\n public reset(): void {\n this.length = 0;\n }\n\n public concat(array: { length: number; data: Array<T | undefined> }): void {\n for (let i = 0; i < array.length; i++) {\n this.push(array.data[i] as T);\n }\n }\n\n public dispose(): void {\n this.reset();\n this.data.length = 0;\n }\n}\n\n/** A string-keyed dictionary with the Babylon.js `StringDictionary` surface. */\nexport class StringDictionary<T> {\n private _store: Record<string, T> = {};\n\n public get count(): number {\n return Object.keys(this._store).length;\n }\n\n public add(key: string, value: T): boolean {\n if (key in this._store) {\n return false;\n }\n this._store[key] = value;\n return true;\n }\n\n public set(key: string, value: T): boolean {\n if (!(key in this._store)) {\n return false;\n }\n this._store[key] = value;\n return true;\n }\n\n public get(key: string): T | undefined {\n return this._store[key];\n }\n\n public getOrAddWithFactory(key: string, factory: (key: string) => T): T {\n let value = this._store[key];\n if (value === undefined) {\n value = factory(key);\n this._store[key] = value;\n }\n return value;\n }\n\n public contains(key: string): boolean {\n return key in this._store;\n }\n\n public remove(key: string): boolean {\n if (key in this._store) {\n delete this._store[key];\n return true;\n }\n return false;\n }\n\n public clear(): void {\n this._store = {};\n }\n\n public forEach(callback: (key: string, value: T) => void): void {\n for (const key of Object.keys(this._store)) {\n callback(key, this._store[key]!);\n }\n }\n}\n\ninterface Taggable {\n _tags?: Record<string, true>;\n}\n\n/** Babylon.js `Tags` — space-separated tag strings attached to arbitrary objects. */\nexport const Tags = {\n EnableFor(obj: Taggable): void {\n obj._tags ??= {};\n },\n\n HasTags(obj: Taggable): boolean {\n return !!obj._tags && Object.keys(obj._tags).length > 0;\n },\n\n AddTagsTo(obj: Taggable, tags: string): void {\n obj._tags ??= {};\n for (const tag of tags.split(/\\s+/).filter(Boolean)) {\n obj._tags[tag] = true;\n }\n },\n\n RemoveTagsFrom(obj: Taggable, tags: string): void {\n if (!obj._tags) {\n return;\n }\n for (const tag of tags.split(/\\s+/).filter(Boolean)) {\n delete obj._tags[tag];\n }\n },\n\n MatchesQuery(obj: Taggable, tag: string): boolean {\n return !!obj._tags && obj._tags[tag] === true;\n },\n\n GetTags(obj: Taggable): string[] {\n return obj._tags ? Object.keys(obj._tags) : [];\n },\n};\n\n/** Rolling FPS/frame-time monitor (Babylon.js `PerformanceMonitor`). */\nexport class PerformanceMonitor {\n private _samples: number[] = [];\n private _max: number;\n private _lastTime: number | null = null;\n private _enabled = true;\n\n public constructor(frameSampleSize = 30) {\n this._max = frameSampleSize;\n }\n\n public sampleFrame(timeMs: number = now()): void {\n if (!this._enabled) {\n return;\n }\n if (this._lastTime !== null) {\n const delta = timeMs - this._lastTime;\n this._samples.push(delta);\n if (this._samples.length > this._max) {\n this._samples.shift();\n }\n }\n this._lastTime = timeMs;\n }\n\n public get averageFrameTime(): number {\n if (this._samples.length === 0) {\n return 0;\n }\n return this._samples.reduce((a, b) => a + b, 0) / this._samples.length;\n }\n\n public get averageFPS(): number {\n const avg = this.averageFrameTime;\n return avg > 0 ? 1000 / avg : 0;\n }\n\n public get isSaturated(): boolean {\n return this._samples.length >= this._max;\n }\n\n public enable(): void {\n this._enabled = true;\n }\n\n public disable(): void {\n this._enabled = false;\n }\n\n public reset(): void {\n this._samples = [];\n this._lastTime = null;\n }\n}\n\n/** A gradient value bound to a [0, 1] position (Babylon.js `FactorGradient`). */\nexport class FactorGradient {\n public constructor(\n public gradient: number,\n public factor1: number,\n public factor2: number = factor1\n ) {}\n\n public getFactor(): number {\n return this.factor1;\n }\n}\n\n/** An RGBA color bound to a [0, 1] position (Babylon.js `ColorGradient`). */\nexport class ColorGradient {\n public constructor(\n public gradient: number,\n public color1: [number, number, number, number],\n public color2?: [number, number, number, number]\n ) {}\n}\n\nfunction now(): number {\n return typeof performance !== \"undefined\" ? performance.now() : Date.now();\n}\n\n/** Babylon.js `Logger` — level-gated console logging. */\nexport const Logger = {\n NoneLogLevel: 0,\n MessageLogLevel: 1,\n WarningLogLevel: 2,\n ErrorLogLevel: 4,\n AllLogLevel: 7,\n\n /** Current log-level bitmask. */\n LogLevels: 7,\n\n Log(message: string): void {\n if (this.LogLevels & this.MessageLogLevel) {\n // eslint-disable-next-line no-console\n console.log(\"BJS - \" + message);\n }\n },\n\n Warn(message: string): void {\n if (this.LogLevels & this.WarningLogLevel) {\n console.warn(\"BJS - \" + message);\n }\n },\n\n Error(message: string): void {\n if (this.LogLevels & this.ErrorLogLevel) {\n console.error(\"BJS - \" + message);\n }\n },\n};\n\n/** Babylon.js `PrecisionDate` — high-resolution timestamp source. */\nexport const PrecisionDate = {\n get Now(): number {\n return now();\n },\n};\n","/**\n * Babylon.js engine-level enums and constant bags that scenes import for their\n * numeric values. These carry no behaviour in the compat layer — they exist so\n * that code reading `ScenePerformancePriority.Aggressive`,\n * `ImageProcessingConfiguration.TONEMAPPING_ACES`, or\n * `Constants.MATERIAL_CounterClockWiseSideOrientation` resolves to the same\n * numbers Babylon.js uses.\n */\n\n/** Babylon.js `ScenePerformancePriority`. */\nexport enum ScenePerformancePriority {\n BackwardCompatible = 0,\n Intermediate = 1,\n Aggressive = 2,\n}\n\n/**\n * Babylon.js `ShaderLanguage` — the shader-source language selector. Babylon Lite\n * is WGSL-only, but the enum is surfaced (with Babylon.js's numeric values) so\n * scenes that import it to author `WGSL` shaders resolve the symbol; a `GLSL`\n * `ShaderMaterial`/`EffectWrapper` still fails loudly at construction.\n */\nexport enum ShaderLanguage {\n GLSL = 0,\n WGSL = 1,\n}\n\n/**\n * Babylon.js `ImageProcessingConfiguration` — only the tone-mapping constants are\n * surfaced (the live exposure/contrast/tone-mapping toggle is exposed through\n * `scene.imageProcessingConfiguration`).\n */\nexport class ImageProcessingConfiguration {\n public static readonly TONEMAPPING_STANDARD = 0;\n public static readonly TONEMAPPING_ACES = 1;\n public static readonly TONEMAPPING_KHR_PBR_NEUTRAL = 2;\n}\n\n/**\n * Babylon.js `Constants` — the small subset of numeric constants referenced by\n * the ported scenes. Extend as needed.\n */\nexport const Constants = {\n MATERIAL_ClockWiseSideOrientation: 0,\n MATERIAL_CounterClockWiseSideOrientation: 1,\n MATERIAL_TriangleFillMode: 0,\n MATERIAL_WireFrameFillMode: 1,\n MATERIAL_PointFillMode: 2,\n ALPHA_DISABLE: 0,\n ALPHA_ADD: 1,\n ALPHA_COMBINE: 2,\n ALPHA_ONEONE: 6,\n ALPHA_PREMULTIPLIED: 7,\n MATERIAL_OPAQUE: 0,\n MATERIAL_ALPHATEST: 1,\n MATERIAL_ALPHABLEND: 2,\n TEXTURE_CLAMP_ADDRESSMODE: 0,\n TEXTURE_WRAP_ADDRESSMODE: 1,\n TEXTURE_MIRROR_ADDRESSMODE: 2,\n} as const;\n","/**\n * Babylon.js-compatible Actions: `ActionManager`, `Action`, the common concrete\n * actions, and `Condition` variants.\n *\n * This is the structural/behavioural surface in pure JS. Triggers are not yet\n * auto-wired to Babylon Lite's input pipeline (that needs a unified pointer\n * pipe — see `COMPAT-STATUS.md`), so actions are dispatched manually via\n * `ActionManager.processTrigger(trigger)`. The action/condition execution model\n * itself is fully implemented and testable.\n */\n\n/** Babylon.js `ActionManager` trigger constants (subset). */\nexport const ActionManagerTriggers = {\n NothingTrigger: 0,\n OnPickTrigger: 1,\n OnLeftPickTrigger: 2,\n OnRightPickTrigger: 3,\n OnCenterPickTrigger: 4,\n OnPickDownTrigger: 5,\n OnDoublePickTrigger: 6,\n OnPickUpTrigger: 7,\n OnPickOutTrigger: 16,\n OnPointerOverTrigger: 10,\n OnPointerOutTrigger: 11,\n OnEveryFrameTrigger: 14,\n} as const;\n\ninterface ActionEvent {\n source: unknown;\n pointerX: number;\n pointerY: number;\n meshUnderPointer: unknown;\n additionalData?: unknown;\n}\n\n/** Base class for actions. `execute` is implemented by subclasses. */\nexport abstract class Action {\n public trigger: number;\n /** Condition gating execution. When set, `execute` runs only if it evaluates true. */\n public condition: Condition | undefined;\n\n private _nextActiveAction: Action | null = null;\n\n public constructor(trigger: number, condition?: Condition) {\n this.trigger = trigger;\n this.condition = condition;\n }\n\n public abstract execute(evt?: ActionEvent): void;\n\n /** Chain another action to run after this one (Babylon.js `then`). */\n public then(action: Action): Action {\n this._nextActiveAction = action;\n return action;\n }\n\n /** @internal Run this action (honouring its condition) and any chained action. */\n public _executeCurrent(evt?: ActionEvent): void {\n if (this.condition && !this.condition.isValid()) {\n return;\n }\n this.execute(evt);\n this._nextActiveAction?._executeCurrent(evt);\n }\n}\n\n/** Runs a user callback when triggered. */\nexport class ExecuteCodeAction extends Action {\n public constructor(\n trigger: number,\n private readonly _func: (evt?: ActionEvent) => void,\n condition?: Condition\n ) {\n super(trigger, condition);\n }\n\n public execute(evt?: ActionEvent): void {\n this._func(evt);\n }\n}\n\n/** Sets `target[propertyPath] = value` when triggered. */\nexport class SetValueAction extends Action {\n public constructor(\n trigger: number,\n private readonly _target: Record<string, unknown>,\n private readonly _propertyPath: string,\n private readonly _value: unknown,\n condition?: Condition\n ) {\n super(trigger, condition);\n }\n\n public execute(): void {\n setByPath(this._target, this._propertyPath, this._value);\n }\n}\n\n/** Adds `value` to `target[propertyPath]` when triggered. */\nexport class IncrementValueAction extends Action {\n public constructor(\n trigger: number,\n private readonly _target: Record<string, unknown>,\n private readonly _propertyPath: string,\n private readonly _value: number,\n condition?: Condition\n ) {\n super(trigger, condition);\n }\n\n public execute(): void {\n const current = getByPath(this._target, this._propertyPath);\n if (typeof current === \"number\") {\n setByPath(this._target, this._propertyPath, current + this._value);\n }\n }\n}\n\n/** Base class for action conditions. */\nexport abstract class Condition {\n public abstract isValid(): boolean;\n}\n\nexport const ValueConditionOperators = {\n IsEqual: 0,\n IsDifferent: 1,\n IsGreater: 2,\n IsLesser: 3,\n} as const;\n\n/** Compares `target[propertyPath]` against a value with an operator. */\nexport class ValueCondition extends Condition {\n public constructor(\n private readonly _target: Record<string, unknown>,\n private readonly _propertyPath: string,\n private readonly _value: number,\n private readonly _operator: number = ValueConditionOperators.IsEqual\n ) {\n super();\n }\n\n public isValid(): boolean {\n const current = getByPath(this._target, this._propertyPath);\n if (typeof current !== \"number\") {\n return false;\n }\n switch (this._operator) {\n case ValueConditionOperators.IsEqual:\n return current === this._value;\n case ValueConditionOperators.IsDifferent:\n return current !== this._value;\n case ValueConditionOperators.IsGreater:\n return current > this._value;\n case ValueConditionOperators.IsLesser:\n return current < this._value;\n default:\n return false;\n }\n }\n}\n\n/** Evaluates a user predicate. */\nexport class PredicateCondition extends Condition {\n public constructor(private readonly _predicate: () => boolean) {\n super();\n }\n\n public isValid(): boolean {\n return this._predicate();\n }\n}\n\n/**\n * Babylon.js `ActionManager`. Register actions with `registerAction`, then\n * dispatch them with `processTrigger(trigger, evt?)`. (Automatic trigger\n * dispatch from input is not yet wired — see module docs.)\n */\nexport class ActionManager {\n public static readonly Triggers = ActionManagerTriggers;\n\n public readonly actions: Action[] = [];\n\n public registerAction(action: Action): Action {\n this.actions.push(action);\n return action;\n }\n\n public unregisterAction(action: Action): boolean {\n const index = this.actions.indexOf(action);\n if (index !== -1) {\n this.actions.splice(index, 1);\n return true;\n }\n return false;\n }\n\n public hasSpecificTrigger(trigger: number): boolean {\n return this.actions.some((a) => a.trigger === trigger);\n }\n\n /** Dispatch every registered action matching `trigger`. */\n public processTrigger(trigger: number, evt?: ActionEvent): void {\n for (const action of this.actions) {\n if (action.trigger === trigger) {\n action._executeCurrent(evt);\n }\n }\n }\n}\n\nfunction getByPath(target: Record<string, unknown>, path: string): unknown {\n const parts = path.split(\".\");\n let current: unknown = target;\n for (const part of parts) {\n if (current == null || typeof current !== \"object\") {\n return undefined;\n }\n current = (current as Record<string, unknown>)[part];\n }\n return current;\n}\n\nfunction setByPath(target: Record<string, unknown>, path: string, value: unknown): void {\n const parts = path.split(\".\");\n let current: Record<string, unknown> = target;\n for (let i = 0; i < parts.length - 1; i++) {\n current = current[parts[i]!] as Record<string, unknown>;\n if (current == null) {\n return;\n }\n }\n current[parts[parts.length - 1]!] = value;\n}\n","/**\n * Stubs for Babylon.js core/loader APIs that are **known but not supported** by\n * Babylon Lite.\n *\n * Every entry here throws {@link LiteCompatError} on use (construction or call),\n * so a ported scene fails loudly with a clear pointer instead of either a\n * confusing \"X is not exported from the compat package\" error or, worse, a\n * silently-wrong render. These mirror the `❌ Not supported` /\n * `⛔ Out of scope` rows in `COMPAT-STATUS.md`.\n *\n * As Babylon Lite gains a capability, the corresponding stub here should be\n * replaced by a real wrapper (and its `COMPAT-STATUS.md` row upgraded).\n */\n\nimport { unsupported } from \"../error.js\";\n\n// ─── Materials ───────────────────────────────────────────────────────\nexport class MultiMaterial {\n public constructor() {\n unsupported(\"MultiMaterial\", \"Babylon Lite uses one material per renderable. Split the mesh geometry by material into separate meshes instead.\");\n }\n}\n\nexport class ShaderMaterial {\n public constructor() {\n unsupported(\"ShaderMaterial\", \"Babylon Lite is WGSL-only. Use the native `createShaderMaterial` (WGSL) API; there is no automatic GLSL translation.\");\n }\n}\n\nexport class BackgroundMaterial {\n public constructor() {\n unsupported(\"BackgroundMaterial\", \"Standalone BackgroundMaterial is not wrapped. Use the compat `Scene` environment helpers / native `loadEnvironment` instead.\");\n }\n}\n\n// ─── Lights ──────────────────────────────────────────────────────────\nexport class RectAreaLight {\n public constructor() {\n unsupported(\"RectAreaLight\", \"Area lights are not implemented in Babylon Lite. Use Point/Spot/Directional/Hemispheric lights.\");\n }\n}\n\nexport class ClusteredLightContainer {\n public constructor() {\n unsupported(\"ClusteredLightContainer\", \"Clustered lighting is not exposed by the Babylon Lite public API; the compat layer cannot wrap it.\");\n }\n}\n\n// ─── Particles ───────────────────────────────────────────────────────\nexport class ParticleSystem {\n public constructor() {\n unsupported(\"ParticleSystem\", \"Particle systems are not implemented in Babylon Lite.\");\n }\n}\n\nexport class GPUParticleSystem {\n public constructor() {\n unsupported(\"GPUParticleSystem\", \"Particle systems are not implemented in Babylon Lite.\");\n }\n}\n\nexport class SolidParticleSystem {\n public constructor() {\n unsupported(\"SolidParticleSystem\", \"Solid particle systems are not implemented in Babylon Lite. Consider native thin instances for many-copies use cases.\");\n }\n}\n\n// ─── Effect layers ───────────────────────────────────────────────────\nexport class HighlightLayer {\n public constructor() {\n unsupported(\"HighlightLayer\", \"Effect layers are not implemented in Babylon Lite.\");\n }\n}\n\nexport class GlowLayer {\n public constructor() {\n unsupported(\"GlowLayer\", \"Effect layers are not implemented in Babylon Lite. For a bloom-style glow, use the native bloom post-process task.\");\n }\n}\n\n// ─── Mesh-attached renderers / projectors ────────────────────────────\nexport class LinesMesh {\n public constructor() {\n unsupported(\"LinesMesh\", \"Line meshes are not implemented in Babylon Lite.\");\n }\n}\n\nexport class GreasedLineMesh {\n public constructor() {\n unsupported(\"GreasedLineMesh\", \"Greased-line meshes are not implemented in Babylon Lite.\");\n }\n}\n\nexport class EdgesRenderer {\n public constructor() {\n unsupported(\"EdgesRenderer\", \"Edge rendering is not implemented in Babylon Lite.\");\n }\n}\n\nexport class OutlineRenderer {\n public constructor() {\n unsupported(\"OutlineRenderer\", \"Mesh outline rendering is not implemented in Babylon Lite.\");\n }\n}\n\n// ─── Textures ────────────────────────────────────────────────────────\nexport class MirrorTexture {\n public constructor() {\n unsupported(\"MirrorTexture\", \"Mirror/reflection textures are not implemented in Babylon Lite. Build one from a native render-target texture + clip plane if required.\");\n }\n}\n\n// ─── Audio ───────────────────────────────────────────────────────────\nexport class Sound {\n public constructor() {\n unsupported(\"Sound\", \"Audio is not part of Babylon Lite. Use the Web Audio API directly.\");\n }\n}\n\n// ─── Serialization ───────────────────────────────────────────────────\n/** Babylon.js scene serializer. Babylon Lite uses different data structures and does not round-trip `.babylon`. */\nexport const SceneSerializer = {\n Serialize(): never {\n return unsupported(\"SceneSerializer.Serialize\", \"Babylon Lite does not implement `.babylon` scene serialization.\");\n },\n SerializeMesh(): never {\n return unsupported(\"SceneSerializer.SerializeMesh\", \"Babylon Lite does not implement mesh serialization.\");\n },\n};\n","/**\n * Throwing stubs for additional Babylon.js core/loaders symbols that Babylon\n * Lite either does not implement, or exposes only through a different native API\n * that the compat layer does not wrap 1:1.\n *\n * Every stub throws {@link LiteCompatError} on use with a pointer to the native\n * Babylon Lite alternative where one exists. This keeps the completeness\n * invariant — every core/loaders symbol resolves to an import and fails loudly\n * rather than silently.\n */\n\nimport { unsupported } from \"../error.js\";\n\n// ─── Bones / Skeletons / Morph ───────────────────────────────────────\nexport class Skeleton {\n public constructor() {\n unsupported(\"Skeleton\", \"Skeletons are produced by the glTF loader in Babylon Lite and driven by `createAnimationController`; they are not constructed manually.\");\n }\n}\n\nexport class Bone {\n public constructor() {\n unsupported(\"Bone\", \"Bones are produced by the glTF loader in Babylon Lite; manual bone construction is not wrapped.\");\n }\n}\n\n// ─── Probes / Layers / Rendering ─────────────────────────────────────\nexport class ReflectionProbe {\n public constructor() {\n unsupported(\"ReflectionProbe\", \"Dynamic reflection probes are not implemented in Babylon Lite.\");\n }\n}\n\nexport class Layer {\n public constructor() {\n unsupported(\"Layer\", \"2D background/foreground layers are not wrapped. Use the native effect-render-task APIs for fullscreen overlays.\");\n }\n}\n\nexport class EffectLayer {\n public constructor() {\n unsupported(\"EffectLayer\", \"Effect layers are not implemented in Babylon Lite.\");\n }\n}\n\nexport class DepthRenderer {\n public constructor() {\n unsupported(\"DepthRenderer\", \"Use the native linear-depth material / geometry-renderer task instead.\");\n }\n}\n\nexport class GeometryBufferRenderer {\n public constructor() {\n unsupported(\"GeometryBufferRenderer\", \"Use the native `createGeometryRendererTask` (G-buffer) API instead.\");\n }\n}\n\nexport class BoundingBoxRenderer {\n public constructor() {\n unsupported(\"BoundingBoxRenderer\", \"Bounding-box rendering is not implemented in Babylon Lite.\");\n }\n}\n\n// ─── Post-processes ──────────────────────────────────────────────────\n// The visual effects below exist in Babylon Lite as frame-graph post-process\n// tasks (e.g. `createBloomPostProcessTask`), but the Babylon.js camera-attached\n// `PostProcess` class model is not wrapped. Use the native task APIs.\nexport class PostProcess {\n public constructor() {\n unsupported(\n \"PostProcess\",\n \"Babylon Lite uses frame-graph post-process tasks rather than camera-attached PostProcess objects. Use the native `create*PostProcessTask` APIs.\"\n );\n }\n}\n\nfunction postProcessStub(name: string, nativeTask: string): { new (): never } {\n return class {\n public constructor() {\n unsupported(name, `Use the native \\`${nativeTask}\\` frame-graph task instead of the Babylon.js PostProcess class.`);\n }\n } as unknown as { new (): never };\n}\n\nexport const BlackAndWhitePostProcess = postProcessStub(\"BlackAndWhitePostProcess\", \"createBlackAndWhitePostProcessTask\");\nexport const BlurPostProcess = postProcessStub(\"BlurPostProcess\", \"createBlurPostProcessTask\");\nexport const BloomEffect = postProcessStub(\"BloomEffect\", \"createBloomPostProcessTask\");\nexport const ChromaticAberrationPostProcess = postProcessStub(\"ChromaticAberrationPostProcess\", \"createChromaticAberrationPostProcessTask\");\nexport const DepthOfFieldEffect = postProcessStub(\"DepthOfFieldEffect\", \"createDepthOfFieldPostProcessTask\");\n\nexport class DefaultRenderingPipeline {\n public constructor() {\n unsupported(\n \"DefaultRenderingPipeline\",\n \"Compose the native frame-graph post-process tasks (bloom, depth-of-field, chromatic aberration, image processing) instead of the Babylon.js DefaultRenderingPipeline.\"\n );\n }\n}\n\nexport class FxaaPostProcess {\n public constructor() {\n unsupported(\"FxaaPostProcess\", \"FXAA is not implemented in Babylon Lite.\");\n }\n}\n\nexport class SSAO2RenderingPipeline {\n public constructor() {\n unsupported(\"SSAO2RenderingPipeline\", \"SSAO is not implemented in Babylon Lite.\");\n }\n}\n\n// ─── Particles ───────────────────────────────────────────────────────\nexport class ParticleHelper {\n public constructor() {\n unsupported(\"ParticleHelper\", \"Particle systems are not implemented in Babylon Lite.\");\n }\n}\n\nexport class ParticleSystemSet {\n public constructor() {\n unsupported(\"ParticleSystemSet\", \"Particle systems are not implemented in Babylon Lite.\");\n }\n}\n\nexport class PointsCloudSystem {\n public constructor() {\n unsupported(\"PointsCloudSystem\", \"Point-cloud systems are not implemented in Babylon Lite. For Gaussian splats use the native splat loaders.\");\n }\n}\n\n// ─── Physics ─────────────────────────────────────────────────────────\n// Babylon Lite ships a Havok-V2 subset via `createHavokWorld` /\n// `createPhysicsAggregate` etc. The Babylon.js plugin/aggregate class model is\n// not wrapped 1:1; use the native physics functions.\nexport class HavokPlugin {\n public constructor() {\n unsupported(\"HavokPlugin\", \"Use the native `createHavokWorld` API; the Babylon.js physics-plugin object is not wrapped.\");\n }\n}\n\nexport class PhysicsAggregate {\n public constructor() {\n unsupported(\"PhysicsAggregate\", \"Use the native `createPhysicsAggregate` API instead of the Babylon.js PhysicsAggregate class.\");\n }\n}\n\nexport class PhysicsBody {\n public constructor() {\n unsupported(\"PhysicsBody\", \"Use the native `createPhysicsBody` API.\");\n }\n}\n\nexport class PhysicsShape {\n public constructor() {\n unsupported(\"PhysicsShape\", \"Use the native `createPhysicsShape` API.\");\n }\n}\n\nexport class CannonJSPlugin {\n public constructor() {\n unsupported(\"CannonJSPlugin\", \"Babylon Lite physics is Havok-V2 only.\");\n }\n}\n\nexport class AmmoJSPlugin {\n public constructor() {\n unsupported(\"AmmoJSPlugin\", \"Babylon Lite physics is Havok-V2 only.\");\n }\n}\n\n// ─── Navigation ──────────────────────────────────────────────────────\nexport class RecastJSPlugin {\n public constructor() {\n unsupported(\"RecastJSPlugin\", \"Use the native Recast-V2 navigation API (`createNavigationPluginAsync`, `createNavMesh`, `createNavCrowd`).\");\n }\n}\n\n// ─── Audio ───────────────────────────────────────────────────────────\nexport class AudioEngine {\n public constructor() {\n unsupported(\"AudioEngine\", \"Audio is not part of Babylon Lite. Use the Web Audio API directly.\");\n }\n}\n\nexport class WeightedSound {\n public constructor() {\n unsupported(\"WeightedSound\", \"Audio is not part of Babylon Lite.\");\n }\n}\n\n// ─── Loaders (formats not present in Babylon Lite) ───────────────────\nexport class OBJFileLoader {\n public constructor() {\n unsupported(\"OBJFileLoader\", \"The OBJ format is not supported by Babylon Lite. Convert to glTF.\");\n }\n}\n\nexport class STLFileLoader {\n public constructor() {\n unsupported(\"STLFileLoader\", \"The STL format is not supported by Babylon Lite. Convert to glTF.\");\n }\n}\n\nexport class FBXFileLoader {\n public constructor() {\n unsupported(\"FBXFileLoader\", \"The FBX format is not supported by Babylon Lite. Convert to glTF.\");\n }\n}\n\nexport class BVHFileLoader {\n public constructor() {\n unsupported(\"BVHFileLoader\", \"The BVH format is not supported by Babylon Lite.\");\n }\n}\n\n// ─── Sprites ─────────────────────────────────────────────────────────\n// `SpriteManager` / `Sprite` are wrapped over Lite's facing-billboard system\n// (see ../sprites/sprites.ts). `SpriteMap` / `SpritePackedManager` remain\n// unsupported (tile-map / packed-atlas variants are not wrapped).\nexport class SpriteMap {\n public constructor() {\n unsupported(\"SpriteMap\", \"Tile-map sprites are not wrapped; use the native sprite APIs.\");\n }\n}\n\nexport class SpritePackedManager {\n public constructor() {\n unsupported(\"SpritePackedManager\", \"Use the native Babylon Lite sprite APIs.\");\n }\n}\n\n// ─── Misc (device / optimisation surfaces not wrapped) ───────────────\nexport class VirtualJoystick {\n public constructor() {\n unsupported(\"VirtualJoystick\", \"The virtual joystick UI is not part of Babylon Lite.\");\n }\n}\n\nexport class SceneOptimizer {\n public constructor() {\n unsupported(\"SceneOptimizer\", \"Automatic scene optimisation is not implemented in the compat layer.\");\n }\n}\n"],"names":["g","b","Space","c","d","n","m","t","i","_a","h","now","liteGetViewMatrix","liteGetProjectionMatrix","liteAttachControl","f","liteGoToFrame","liteCreateDefaultCamera","createArcRotateCamera","attachControl","litePickAsync","mesh","layer","ScenePerformancePriority","ShaderLanguage"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/math/color.ts","../src/math/scalar.ts","../src/math/constants.ts","../src/math/plane.ts","../src/math/ray.ts","../src/math/frustum.ts","../src/math/size.ts","../src/math/curve.ts","../src/culling/bounding.ts","../src/misc/observable.ts","../src/engine/engine.ts","../src/scene/abstract-scene.ts","../src/cameras/cameras.ts","../src/materials/materials.ts","../src/animations/animation.ts","../src/scene/scene.ts","../src/lights/lights.ts","../src/meshes/csg.ts","../src/meshes/compression.ts","../src/morph/morph.ts","../src/meshes/gaussian-splatting.ts","../src/textures/textures.ts","../src/loading/loaded-mesh.ts","../src/loading/scene-loader.ts","../src/loading/assets-manager.ts","../src/loading/material-variants.ts","../src/picking/gpu-picker.ts","../src/gizmos/gizmos.ts","../src/behaviors/behaviors.ts","../src/sprites/sprites.ts","../src/shadows/shadow-generator.ts","../src/materials/node-material.ts","../src/materials/grid-material.ts","../src/animations/easing.ts","../src/misc/tools.ts","../src/misc/misc-utils.ts","../src/misc/engine-constants.ts","../src/actions/actions.ts","../src/audio/audio-enums.ts","../src/audio/audio.ts","../src/unsupported/unsupported-apis.ts","../src/unsupported/unsupported-extended.ts"],"sourcesContent":["/**\n * Babylon.js-compatible colour classes (`Color3`, `Color4`).\n *\n * Mutable, backed by `r`/`g`/`b`/`a` fields. `asArray()` yields the tuple shape\n * (`[r, g, b]` / `[r, g, b, a]`) consumed by the Babylon Lite material and light\n * APIs.\n */\n\nexport class Color3 {\n public constructor(\n public r: number = 0,\n public g: number = 0,\n public b: number = 0\n ) {}\n\n public set(r: number, g: number, b: number): this {\n this.r = r;\n this.g = g;\n this.b = b;\n return this;\n }\n\n public copyFrom(source: Color3): this {\n this.r = source.r;\n this.g = source.g;\n this.b = source.b;\n return this;\n }\n\n public scale(scale: number): Color3 {\n return new Color3(this.r * scale, this.g * scale, this.b * scale);\n }\n\n public scaleInPlace(scale: number): this {\n this.r *= scale;\n this.g *= scale;\n this.b *= scale;\n return this;\n }\n\n public multiply(other: Color3): Color3 {\n return new Color3(this.r * other.r, this.g * other.g, this.b * other.b);\n }\n\n public add(other: Color3): Color3 {\n return new Color3(this.r + other.r, this.g + other.g, this.b + other.b);\n }\n\n public clone(): Color3 {\n return new Color3(this.r, this.g, this.b);\n }\n\n public equals(other: Color3): boolean {\n return this.r === other.r && this.g === other.g && this.b === other.b;\n }\n\n public asArray(): [number, number, number] {\n return [this.r, this.g, this.b];\n }\n\n public toColor4(alpha = 1): Color4 {\n return new Color4(this.r, this.g, this.b, alpha);\n }\n\n public toHexString(): string {\n const intR = Math.round(Math.min(Math.max(this.r, 0), 1) * 255);\n const intG = Math.round(Math.min(Math.max(this.g, 0), 1) * 255);\n const intB = Math.round(Math.min(Math.max(this.b, 0), 1) * 255);\n return \"#\" + toHex(intR) + toHex(intG) + toHex(intB);\n }\n\n public static Black(): Color3 {\n return new Color3(0, 0, 0);\n }\n\n public static White(): Color3 {\n return new Color3(1, 1, 1);\n }\n\n public static Red(): Color3 {\n return new Color3(1, 0, 0);\n }\n\n public static Green(): Color3 {\n return new Color3(0, 1, 0);\n }\n\n public static Blue(): Color3 {\n return new Color3(0, 0, 1);\n }\n\n public static FromArray(array: ArrayLike<number>, offset = 0): Color3 {\n return new Color3(array[offset] ?? 0, array[offset + 1] ?? 0, array[offset + 2] ?? 0);\n }\n\n public static FromInts(r: number, g: number, b: number): Color3 {\n return new Color3(r / 255, g / 255, b / 255);\n }\n\n public static FromHexString(hex: string): Color3 {\n if (hex.charAt(0) !== \"#\" || hex.length < 7) {\n return new Color3(0, 0, 0);\n }\n const r = parseInt(hex.substring(1, 3), 16);\n const g = parseInt(hex.substring(3, 5), 16);\n const b = parseInt(hex.substring(5, 7), 16);\n return Color3.FromInts(r, g, b);\n }\n\n public static Lerp(start: Color3, end: Color3, amount: number): Color3 {\n return new Color3(start.r + (end.r - start.r) * amount, start.g + (end.g - start.g) * amount, start.b + (end.b - start.b) * amount);\n }\n}\n\nexport class Color4 {\n public constructor(\n public r: number = 0,\n public g: number = 0,\n public b: number = 0,\n public a: number = 1\n ) {}\n\n public set(r: number, g: number, b: number, a: number): this {\n this.r = r;\n this.g = g;\n this.b = b;\n this.a = a;\n return this;\n }\n\n public copyFrom(source: Color4): this {\n this.r = source.r;\n this.g = source.g;\n this.b = source.b;\n this.a = source.a;\n return this;\n }\n\n public scale(scale: number): Color4 {\n return new Color4(this.r * scale, this.g * scale, this.b * scale, this.a * scale);\n }\n\n public add(other: Color4): Color4 {\n return new Color4(this.r + other.r, this.g + other.g, this.b + other.b, this.a + other.a);\n }\n\n public clone(): Color4 {\n return new Color4(this.r, this.g, this.b, this.a);\n }\n\n public equals(other: Color4): boolean {\n return this.r === other.r && this.g === other.g && this.b === other.b && this.a === other.a;\n }\n\n public asArray(): [number, number, number, number] {\n return [this.r, this.g, this.b, this.a];\n }\n\n public static FromArray(array: ArrayLike<number>, offset = 0): Color4 {\n return new Color4(array[offset] ?? 0, array[offset + 1] ?? 0, array[offset + 2] ?? 0, array[offset + 3] ?? 1);\n }\n\n public static FromInts(r: number, g: number, b: number, a: number): Color4 {\n return new Color4(r / 255, g / 255, b / 255, a / 255);\n }\n}\n\nfunction toHex(value: number): string {\n const hex = value.toString(16).toUpperCase();\n return hex.length === 1 ? \"0\" + hex : hex;\n}\n","/** Babylon.js-compatible scalar helpers and a small set of math constants. */\n\nexport const Epsilon = 0.001;\nexport const ToRadians = Math.PI / 180;\nexport const ToDegrees = 180 / Math.PI;\n\n/** Babylon.js `Scalar` namespace — common scalar utilities. */\nexport const Scalar = {\n Clamp(value: number, min = 0, max = 1): number {\n return Math.min(max, Math.max(min, value));\n },\n Lerp(start: number, end: number, amount: number): number {\n return start + (end - start) * amount;\n },\n InverseLerp(a: number, b: number, value: number): number {\n return a === b ? 0 : (value - a) / (b - a);\n },\n DegreesToRadians(degrees: number): number {\n return degrees * ToRadians;\n },\n RadiansToDegrees(radians: number): number {\n return radians * ToDegrees;\n },\n WithinEpsilon(a: number, b: number, epsilon = 1.401298e-45): boolean {\n return Math.abs(a - b) <= epsilon;\n },\n Normalize(value: number, min: number, max: number): number {\n return (value - min) / (max - min);\n },\n Denormalize(normalized: number, min: number, max: number): number {\n return normalized * (max - min) + min;\n },\n};\n","/** Babylon.js-compatible spatial constants (`Axis`, `Space`). */\n\nimport { Vector3 } from \"./vector.js\";\n\n// Lazily-cached axis singletons: stable identity (matching Babylon.js, where\n// `Axis.X/Y/Z` are shared constants) and no allocation until first accessed.\nlet _axisX: Vector3 | undefined;\nlet _axisY: Vector3 | undefined;\nlet _axisZ: Vector3 | undefined;\n\nexport const Axis = {\n get X(): Vector3 {\n return (_axisX ??= new Vector3(1, 0, 0));\n },\n get Y(): Vector3 {\n return (_axisY ??= new Vector3(0, 1, 0));\n },\n get Z(): Vector3 {\n return (_axisZ ??= new Vector3(0, 0, 1));\n },\n};\n\nexport enum Space {\n LOCAL = 0,\n WORLD = 1,\n BONE = 2,\n}\n","/** Babylon.js-compatible `Plane` (pure JS). */\n\nimport { Vector3 } from \"./vector.js\";\nimport type { Matrix } from \"./matrix.js\";\n\nexport class Plane {\n /** Normal x/y/z and signed distance `d` from the origin (`normal · p + d = 0`). */\n public normal: Vector3;\n public d: number;\n\n public constructor(a: number, b: number, c: number, d: number) {\n this.normal = new Vector3(a, b, c);\n this.d = d;\n }\n\n public asArray(): [number, number, number, number] {\n return [this.normal.x, this.normal.y, this.normal.z, this.d];\n }\n\n public clone(): Plane {\n return new Plane(this.normal.x, this.normal.y, this.normal.z, this.d);\n }\n\n public normalize(): this {\n const norm = Math.sqrt(this.normal.x * this.normal.x + this.normal.y * this.normal.y + this.normal.z * this.normal.z);\n const inv = norm === 0 ? 0 : 1 / norm;\n this.normal.scaleInPlace(inv);\n this.d *= inv;\n return this;\n }\n\n /** Signed distance from `point` to this plane. */\n public signedDistanceTo(point: Vector3): number {\n return Vector3.Dot(point, this.normal) + this.d;\n }\n\n public dotCoordinate(point: Vector3): number {\n return this.normal.x * point.x + this.normal.y * point.y + this.normal.z * point.z + this.d;\n }\n\n public static FromArray(array: ArrayLike<number>): Plane {\n return new Plane(array[0] ?? 0, array[1] ?? 0, array[2] ?? 0, array[3] ?? 0);\n }\n\n public static FromPositionAndNormal(origin: Vector3, normal: Vector3): Plane {\n const n = normal.clone().normalize();\n const d = -(n.x * origin.x + n.y * origin.y + n.z * origin.z);\n return new Plane(n.x, n.y, n.z, d);\n }\n\n public static FromPoints(point1: Vector3, point2: Vector3, point3: Vector3): Plane {\n const normal = Vector3.Cross(point2.subtract(point1), point3.subtract(point1)).normalize();\n return Plane.FromPositionAndNormal(point1, normal);\n }\n\n /** Transform a copy of this plane by the transpose of the inverse of `transformation`. */\n public transform(transformation: Matrix): Plane {\n // For a correct plane transform the caller passes the inverse-transpose;\n // here we apply the matrix directly to (normal, d) as a row-vector.\n const m = transformation.m;\n const x = this.normal.x;\n const y = this.normal.y;\n const z = this.normal.z;\n const d = this.d;\n const nx = x * m[0]! + y * m[1]! + z * m[2]! + d * m[3]!;\n const ny = x * m[4]! + y * m[5]! + z * m[6]! + d * m[7]!;\n const nz = x * m[8]! + y * m[9]! + z * m[10]! + d * m[11]!;\n const nd = x * m[12]! + y * m[13]! + z * m[14]! + d * m[15]!;\n return new Plane(nx, ny, nz, nd);\n }\n}\n","/** Babylon.js-compatible `Ray` (pure JS). */\n\nimport { Vector3 } from \"./vector.js\";\nimport type { Plane } from \"./plane.js\";\n\nexport class Ray {\n public origin: Vector3;\n public direction: Vector3;\n public length: number;\n\n public constructor(origin: Vector3, direction: Vector3, length: number = Number.MAX_VALUE) {\n this.origin = origin;\n this.direction = direction;\n this.length = length;\n }\n\n public clone(): Ray {\n return new Ray(this.origin.clone(), this.direction.clone(), this.length);\n }\n\n /** Distance at which this ray crosses `plane`, or `null` if parallel / behind. */\n public intersectsPlane(plane: Plane): number | null {\n const dot = Vector3.Dot(plane.normal, this.direction);\n if (Math.abs(dot) < 1e-9) {\n return null;\n }\n const t = -(Vector3.Dot(plane.normal, this.origin) + plane.d) / dot;\n return t < 0 ? null : t;\n }\n\n /** True if this ray passes within `sphereRadius` of `spherePosition`. */\n public intersectsSphere(spherePosition: Vector3, sphereRadius: number): boolean {\n const x = spherePosition.x - this.origin.x;\n const y = spherePosition.y - this.origin.y;\n const z = spherePosition.z - this.origin.z;\n const pyth = x * x + y * y + z * z;\n const rr = sphereRadius * sphereRadius;\n if (pyth <= rr) {\n return true;\n }\n const dot = x * this.direction.x + y * this.direction.y + z * this.direction.z;\n if (dot < 0) {\n return false;\n }\n const temp = pyth - dot * dot;\n return temp <= rr;\n }\n\n public static Zero(): Ray {\n return new Ray(Vector3.Zero(), new Vector3(0, 0, 1), Number.MAX_VALUE);\n }\n\n public static CreateNew(x: number, y: number, z: number, dx: number, dy: number, dz: number, length = Number.MAX_VALUE): Ray {\n return new Ray(new Vector3(x, y, z), new Vector3(dx, dy, dz), length);\n }\n}\n","/** Babylon.js-compatible `Frustum` (pure JS): extract clip planes from a matrix. */\n\nimport { Plane } from \"./plane.js\";\nimport type { Matrix } from \"./matrix.js\";\n\nexport const Frustum = {\n /** Extract the 6 frustum planes from a view-projection `transform`. */\n GetPlanes(transform: Matrix): Plane[] {\n const planes: Plane[] = [];\n for (let i = 0; i < 6; i++) {\n planes.push(new Plane(0, 0, 0, 0));\n }\n Frustum.GetPlanesToRef(transform, planes);\n return planes;\n },\n\n /** Extract the 6 frustum planes from `transform` into the supplied `planes` array. */\n GetPlanesToRef(transform: Matrix, planes: Plane[]): void {\n const m = transform.m;\n // Left\n set(planes[0]!, m[3]! + m[0]!, m[7]! + m[4]!, m[11]! + m[8]!, m[15]! + m[12]!);\n // Right\n set(planes[1]!, m[3]! - m[0]!, m[7]! - m[4]!, m[11]! - m[8]!, m[15]! - m[12]!);\n // Bottom\n set(planes[2]!, m[3]! + m[1]!, m[7]! + m[5]!, m[11]! + m[9]!, m[15]! + m[13]!);\n // Top\n set(planes[3]!, m[3]! - m[1]!, m[7]! - m[5]!, m[11]! - m[9]!, m[15]! - m[13]!);\n // Near\n set(planes[4]!, m[3]! + m[2]!, m[7]! + m[6]!, m[11]! + m[10]!, m[15]! + m[14]!);\n // Far\n set(planes[5]!, m[3]! - m[2]!, m[7]! - m[6]!, m[11]! - m[10]!, m[15]! - m[14]!);\n },\n};\n\nfunction set(plane: Plane, a: number, b: number, c: number, d: number): void {\n plane.normal.set(a, b, c);\n plane.d = d;\n plane.normalize();\n}\n","/** Babylon.js-compatible `Size` and `Viewport` (pure JS). */\n\nexport class Size {\n public constructor(\n public width: number = 0,\n public height: number = 0\n ) {}\n\n public get surface(): number {\n return this.width * this.height;\n }\n\n public clone(): Size {\n return new Size(this.width, this.height);\n }\n\n public equals(other: Size): boolean {\n return this.width === other.width && this.height === other.height;\n }\n\n public add(other: Size): Size {\n return new Size(this.width + other.width, this.height + other.height);\n }\n\n public static Zero(): Size {\n return new Size(0, 0);\n }\n}\n\nexport class Viewport {\n public constructor(\n public x: number,\n public y: number,\n public width: number,\n public height: number\n ) {}\n\n /** Resolve this normalized viewport to pixel coordinates for a render target. */\n public toGlobal(renderWidth: number, renderHeight: number): Viewport {\n return new Viewport(this.x * renderWidth, this.y * renderHeight, this.width * renderWidth, this.height * renderHeight);\n }\n\n public clone(): Viewport {\n return new Viewport(this.x, this.y, this.width, this.height);\n }\n}\n","/** Babylon.js-compatible curve/path helpers: `Angle`, `Curve3`, `Path3D` (pure JS). */\n\nimport { Vector3 } from \"./vector.js\";\n\nexport class Angle {\n public constructor(private readonly _radians: number) {}\n\n public radians(): number {\n return this._radians;\n }\n\n public degrees(): number {\n return (this._radians * 180) / Math.PI;\n }\n\n public static FromRadians(radians: number): Angle {\n return new Angle(radians);\n }\n\n public static FromDegrees(degrees: number): Angle {\n return new Angle((degrees * Math.PI) / 180);\n }\n}\n\n/** A 3D curve built from an ordered list of points. */\nexport class Curve3 {\n public constructor(private readonly _points: Vector3[]) {}\n\n public getPoints(): Vector3[] {\n return this._points;\n }\n\n /** Total polyline length along the curve points. */\n public length(): number {\n let total = 0;\n for (let i = 1; i < this._points.length; i++) {\n total += Vector3.Distance(this._points[i]!, this._points[i - 1]!);\n }\n return total;\n }\n\n /** Concatenate another curve (dropping the duplicated join point). */\n public continue(curve: Curve3): Curve3 {\n const points = this._points.slice();\n const other = curve.getPoints();\n for (let i = 1; i < other.length; i++) {\n points.push(other[i]!.clone());\n }\n return new Curve3(points);\n }\n\n /** Quadratic Bézier from `v0` → `v2` with control `v1`, sampled `nbPoints` times. */\n public static CreateQuadraticBezier(v0: Vector3, v1: Vector3, v2: Vector3, nbPoints: number): Curve3 {\n const count = Math.max(nbPoints, 2);\n const points: Vector3[] = [];\n for (let i = 0; i <= count; i++) {\n const t = i / count;\n const u = 1 - t;\n const x = u * u * v0.x + 2 * u * t * v1.x + t * t * v2.x;\n const y = u * u * v0.y + 2 * u * t * v1.y + t * t * v2.y;\n const z = u * u * v0.z + 2 * u * t * v1.z + t * t * v2.z;\n points.push(new Vector3(x, y, z));\n }\n return new Curve3(points);\n }\n\n /** Cubic Bézier from `v0` → `v3` with controls `v1`, `v2`, sampled `nbPoints` times. */\n public static CreateCubicBezier(v0: Vector3, v1: Vector3, v2: Vector3, v3: Vector3, nbPoints: number): Curve3 {\n const count = Math.max(nbPoints, 2);\n const points: Vector3[] = [];\n for (let i = 0; i <= count; i++) {\n const t = i / count;\n const u = 1 - t;\n const w0 = u * u * u;\n const w1 = 3 * u * u * t;\n const w2 = 3 * u * t * t;\n const w3 = t * t * t;\n points.push(new Vector3(w0 * v0.x + w1 * v1.x + w2 * v2.x + w3 * v3.x, w0 * v0.y + w1 * v1.y + w2 * v2.y + w3 * v3.y, w0 * v0.z + w1 * v1.z + w2 * v2.z + w3 * v3.z));\n }\n return new Curve3(points);\n }\n}\n\n/** A 3D path with cumulative-distance queries over its points. */\nexport class Path3D {\n private readonly _curve: Vector3[];\n private readonly _distances: number[] = [];\n private _length = 0;\n\n public constructor(points: Vector3[]) {\n this._curve = points.map((p) => p.clone());\n this._distances[0] = 0;\n for (let i = 1; i < this._curve.length; i++) {\n this._length += Vector3.Distance(this._curve[i]!, this._curve[i - 1]!);\n this._distances[i] = this._length;\n }\n }\n\n public getCurve(): Vector3[] {\n return this._curve;\n }\n\n public getPoints(): Vector3[] {\n return this._curve;\n }\n\n public length(): number {\n return this._length;\n }\n\n /** Distances of each point from the path start, normalized to [0, 1] when `length > 0`. */\n public getDistances(): number[] {\n return this._distances;\n }\n}\n","/**\n * Babylon.js-compatible bounding volumes (`BoundingBox`, `BoundingSphere`,\n * `BoundingInfo`) — pure JS over the compat math types.\n */\n\nimport { Vector3 } from \"../math/vector.js\";\nimport type { Matrix } from \"../math/matrix.js\";\n\nexport class BoundingSphere {\n public center: Vector3;\n public radius: number;\n public minimum: Vector3;\n public maximum: Vector3;\n\n public constructor(min: Vector3, max: Vector3) {\n this.minimum = min.clone();\n this.maximum = max.clone();\n this.center = Vector3.Lerp(min, max, 0.5);\n this.radius = max.subtract(min).length() * 0.5;\n }\n\n public intersectsPoint(point: Vector3): boolean {\n return Vector3.DistanceSquared(this.center, point) <= this.radius * this.radius;\n }\n\n public static Intersects(a: BoundingSphere, b: BoundingSphere): boolean {\n const r = a.radius + b.radius;\n return Vector3.DistanceSquared(a.center, b.center) <= r * r;\n }\n}\n\nexport class BoundingBox {\n public minimum: Vector3;\n public maximum: Vector3;\n public center: Vector3;\n public extendSize: Vector3;\n /** World-space AABB corners. Equal to `minimum`/`maximum` when the box is\n * already built in world space (as the loader's `getBoundingInfo` does). */\n public minimumWorld: Vector3;\n public maximumWorld: Vector3;\n /** The 8 corner points (min/max combinations). */\n public vectors: Vector3[];\n\n public constructor(min: Vector3, max: Vector3) {\n this.minimum = min.clone();\n this.maximum = max.clone();\n this.minimumWorld = min.clone();\n this.maximumWorld = max.clone();\n this.center = Vector3.Lerp(min, max, 0.5);\n this.extendSize = max.subtract(min).scale(0.5);\n this.vectors = [\n new Vector3(min.x, min.y, min.z),\n new Vector3(max.x, max.y, max.z),\n new Vector3(max.x, min.y, min.z),\n new Vector3(min.x, max.y, min.z),\n new Vector3(min.x, min.y, max.z),\n new Vector3(max.x, max.y, min.z),\n new Vector3(min.x, max.y, max.z),\n new Vector3(max.x, min.y, max.z),\n ];\n }\n\n public intersectsPoint(point: Vector3): boolean {\n return (\n point.x >= this.minimum.x &&\n point.x <= this.maximum.x &&\n point.y >= this.minimum.y &&\n point.y <= this.maximum.y &&\n point.z >= this.minimum.z &&\n point.z <= this.maximum.z\n );\n }\n\n public static Intersects(a: BoundingBox, b: BoundingBox): boolean {\n return (\n a.minimum.x <= b.maximum.x &&\n a.maximum.x >= b.minimum.x &&\n a.minimum.y <= b.maximum.y &&\n a.maximum.y >= b.minimum.y &&\n a.minimum.z <= b.maximum.z &&\n a.maximum.z >= b.minimum.z\n );\n }\n}\n\nexport class BoundingInfo {\n public boundingBox: BoundingBox;\n public boundingSphere: BoundingSphere;\n\n public constructor(min: Vector3, max: Vector3) {\n this.boundingBox = new BoundingBox(min, max);\n this.boundingSphere = new BoundingSphere(min, max);\n }\n\n public get minimum(): Vector3 {\n return this.boundingBox.minimum;\n }\n\n public get maximum(): Vector3 {\n return this.boundingBox.maximum;\n }\n\n public intersectsPoint(point: Vector3): boolean {\n return this.boundingSphere.intersectsPoint(point) && this.boundingBox.intersectsPoint(point);\n }\n\n /** World-matrix-aware reframe is not modelled here; reframe by rebuilding from transformed corners. */\n public reConstruct(min: Vector3, max: Vector3, _worldMatrix?: Matrix): void {\n this.boundingBox = new BoundingBox(min, max);\n this.boundingSphere = new BoundingSphere(min, max);\n }\n}\n","/**\n * Minimal Babylon.js-compatible `Observable`.\n *\n * Supports the common surface used by ported scenes: `add`, `addOnce`, `remove`,\n * `removeCallback`, `notifyObservers`, `hasObservers`, and `clear`. This is pure\n * JS with no Babylon Lite dependency and is fully unit-testable.\n */\n\nexport type ObserverCallback<T> = (eventData: T) => void;\n\nexport class Observable<T> {\n private _observers: ObserverCallback<T>[] = [];\n\n public add(callback: ObserverCallback<T>): ObserverCallback<T> {\n this._observers.push(callback);\n return callback;\n }\n\n public addOnce(callback: ObserverCallback<T>): ObserverCallback<T> {\n const wrapper: ObserverCallback<T> = (eventData) => {\n this.removeCallback(wrapper);\n callback(eventData);\n };\n this._observers.push(wrapper);\n return wrapper;\n }\n\n public remove(callback: ObserverCallback<T> | null | undefined): boolean {\n return callback ? this.removeCallback(callback) : false;\n }\n\n public removeCallback(callback: ObserverCallback<T>): boolean {\n const index = this._observers.indexOf(callback);\n if (index !== -1) {\n this._observers.splice(index, 1);\n return true;\n }\n return false;\n }\n\n public notifyObservers(eventData?: T): void {\n // Iterate a copy so observers can add/remove during notification.\n for (const observer of this._observers.slice()) {\n observer(eventData as T);\n }\n }\n\n public hasObservers(): boolean {\n return this._observers.length > 0;\n }\n\n public clear(): void {\n this._observers = [];\n }\n}\n","/**\n * Babylon.js-compatible engine wrappers.\n *\n * The class hierarchy mirrors Babylon.js exactly: `AbstractEngine` is the base,\n * `ThinEngine extends AbstractEngine`, `Engine extends ThinEngine`, and\n * `WebGPUEngine extends AbstractEngine` (so `Engine` and `WebGPUEngine` are\n * siblings, as in Babylon.js). All shared behaviour lives on `AbstractEngine`;\n * because Babylon Lite is WebGPU-only, every concrete engine is backed by the\n * same Lite WebGPU context, so `new Engine(...)` and `new WebGPUEngine(...)`\n * behave identically.\n *\n * Babylon.js exposes a synchronous constructor plus an async `initAsync()` for\n * WebGPU. Babylon Lite acquires the GPU device in an async `createEngine()`.\n * The wrapper mirrors the Babylon.js shape: construct, then `await initAsync()`.\n *\n * Because Lite drives its own render loop through `startEngine`, `runRenderLoop`\n * is implemented by registering the callback through each scene's\n * before-render hook and kicking off Lite's loop. The startup is async under the\n * hood (Lite must register scenes before the first frame); `runRenderLoop`\n * returns immediately and rendering begins on a subsequent tick.\n */\n\nimport { createEngine, startEngine, stopEngine, resizeEngine, setEngineSize, disposeEngine, registerScene, registerSceneWithShadowSupport, onBeforeRender } from \"babylon-lite\";\nimport type { EngineContext, EngineOptions, RenderCanvas } from \"babylon-lite\";\n\nimport { LiteCompatError, unsupported } from \"../error.js\";\nimport { Observable } from \"../misc/observable.js\";\nimport type { Scene } from \"../scene/scene.js\";\n\nexport abstract class AbstractEngine {\n /** @internal The underlying Lite engine context. Populated by `initAsync()`. */\n public _lite!: EngineContext;\n\n /**\n * @internal Whether this engine has no GPU device (a {@link NullEngine}). Headless\n * engines drive a pure-JS animation/observable loop instead of Babylon Lite's\n * GPU render loop, so the compat `Scene` skips its Lite scene-context setup.\n */\n public _headless = false;\n\n protected readonly _canvas: RenderCanvas;\n private readonly _options: EngineOptions | undefined;\n protected readonly _scenes: Scene[] = [];\n protected readonly _loopCallbacks: Array<() => void> = [];\n protected _initialized = false;\n private _started = false;\n /** @internal Active `requestAnimationFrame` id for the scene-less loop, if any. */\n protected _rafId: number | null = null;\n\n /**\n * Babylon.js `engine.useReverseDepthBuffer`. Babylon Lite owns its depth\n * configuration internally, so this is a settable no-op kept for API shape.\n */\n public useReverseDepthBuffer = false;\n\n /** Babylon.js `engine.onResizeObservable` — fires after `resize()` / `setSize()`. */\n public readonly onResizeObservable = new Observable<AbstractEngine>();\n\n /** @internal Babylon.js hardware-scaling level. Babylon Lite manages device-pixel-ratio itself; stored for parity. */\n private _hardwareScalingLevel = 1;\n\n /** @internal Latest per-frame delta in ms, updated by each scene's before-render hook. */\n public _lastDeltaMs = 16;\n\n /** @internal Last clear colour passed to `engine.clear(...)` (consumed by the scene-less sprite path). */\n public _lastClearColor: { r: number; g: number; b: number; a: number } = { r: 0, g: 0, b: 0, a: 1 };\n\n /** @internal Whether `engine.clear(...)` was ever called (sprite renderers overlay a scene if not). */\n public _clearRequested = false;\n\n /** @internal Deferred startup work (thunks) awaited before the engine starts — e.g. sprite-atlas loads. */\n private readonly _startupWork: Array<() => Promise<void>> = [];\n\n /**\n * @internal Deferred work awaited *after* the main scenes are registered but\n * before the engine starts — e.g. utility-layer (gizmo) registration, which\n * must happen after its gizmos are created and after the main scene is\n * registered (Babylon Lite's `registerUtilityLayer` ordering).\n */\n private readonly _lateWork: Array<() => Promise<void>> = [];\n\n public constructor(canvas: RenderCanvas, options?: ({ antialias?: boolean; adaptToDeviceRatio?: boolean; useLargeWorldRendering?: boolean } & EngineOptions) | boolean) {\n this._canvas = canvas;\n // Babylon.js's WebGPUEngine takes an options object as the second arg;\n // accept a bare boolean too (some older call sites pass `antialias`).\n const opts = typeof options === \"object\" ? { ...options } : undefined;\n // Babylon.js exposes floating-origin / large-world rendering through a\n // single `useLargeWorldRendering` flag. Babylon Lite splits it into\n // `useHighPrecisionMatrix` + `useFloatingOrigin` (the latter requires the\n // former). Translate so compat scenes that pass the BJS flag light up LWR.\n if (opts && (opts as { useLargeWorldRendering?: boolean }).useLargeWorldRendering) {\n delete (opts as { useLargeWorldRendering?: boolean }).useLargeWorldRendering;\n opts.useHighPrecisionMatrix = true;\n opts.useFloatingOrigin = true;\n }\n this._options = opts;\n }\n\n /** Acquire the GPU device and build the Lite engine context. */\n public async initAsync(): Promise<void> {\n if (this._initialized) {\n return;\n }\n this._lite = await createEngine(this._canvas, this._options);\n this._initialized = true;\n }\n\n public getRenderingCanvas(): RenderCanvas {\n return this._canvas;\n }\n\n /**\n * Babylon.js `engine.getDeltaTime()` — milliseconds elapsed since the previous\n * frame. Updated from each scene's Lite before-render hook (which receives the\n * frame delta); defaults to ~16ms before the first frame.\n */\n public getDeltaTime(): number {\n return this._lastDeltaMs;\n }\n\n /**\n * Babylon.js `engine.isNDCHalfZRange`. WebGPU's clip space uses a `[0, 1]`\n * depth range, so this is always `true` under Babylon Lite.\n */\n public get isNDCHalfZRange(): boolean {\n return true;\n }\n\n /** Babylon.js `engine.isWebGPU` — Babylon Lite is WebGPU-only, so always `true`. */\n public get isWebGPU(): boolean {\n return true;\n }\n\n /**\n * Babylon.js `engine.getCaps()` — engine capability flags. Only the\n * compressed-texture-format flags ported scenes branch on are derived (from the\n * Lite WebGPU device's enabled features); the rest report Babylon Lite's fixed\n * WebGPU baseline. A headless `NullEngine` has no device, so all flags are off.\n */\n public getCaps(): Record<string, unknown> {\n const device = (this._lite as { _device?: { features?: { has(name: string): boolean } } } | undefined)?._device;\n const has = (name: string): boolean => !!device?.features?.has(name);\n return {\n astc: has(\"texture-compression-astc\"),\n s3tc: has(\"texture-compression-bc\"),\n bc7: has(\"texture-compression-bc\"),\n etc2: has(\"texture-compression-etc2\"),\n // ETC1 is a distinct format family with no WebGPU feature flag — never\n // report it as available (an ETC2 device can decode ETC1 content, but\n // advertising `etc1` can steer upstream selection to a non-existent path).\n etc1: false,\n pvrtc: false,\n // WebGPU baseline capabilities Babylon Lite always provides.\n textureFloat: true,\n textureHalfFloat: true,\n textureFloatLinearFiltering: true,\n maxTextureSize: 8192,\n instancedArrays: true,\n uintIndices: true,\n };\n }\n\n /** Babylon.js `engine.scenes` — every scene created against this engine. */\n public get scenes(): Scene[] {\n return this._scenes;\n }\n\n /** Babylon.js `engine.getRenderWidth()` — backing render-target width in pixels. */\n public getRenderWidth(): number {\n return (this._canvas as { width?: number }).width ?? 0;\n }\n\n /** Babylon.js `engine.getRenderHeight()` — backing render-target height in pixels. */\n public getRenderHeight(): number {\n return (this._canvas as { height?: number }).height ?? 0;\n }\n\n /** Babylon.js `engine.getScreenAspectRatio()` — render-target width / height. */\n public getScreenAspectRatio(): number {\n const h = this.getRenderHeight();\n return h !== 0 ? this.getRenderWidth() / h : 1;\n }\n\n /**\n * Babylon.js `engine.getAspectRatio(camera?, useScreen?)`. Babylon Lite renders\n * each scene through a single full-canvas viewport, so the camera viewport does\n * not subdivide the surface — this is the screen aspect ratio.\n */\n public getAspectRatio(_camera?: unknown, _useScreen?: boolean): number {\n return this.getScreenAspectRatio();\n }\n\n /** Babylon.js `engine.getFps()` — frames-per-second estimate from the last frame delta. */\n public getFps(): number {\n return this._lastDeltaMs > 0 ? 1000 / this._lastDeltaMs : 60;\n }\n\n /**\n * Babylon.js `engine.getHardwareScalingLevel()`. Babylon Lite manages its own\n * device-pixel-ratio scaling, so this returns the stored parity value.\n */\n public getHardwareScalingLevel(): number {\n return this._hardwareScalingLevel;\n }\n\n /** Babylon.js `engine.setHardwareScalingLevel(level)` — stored for parity (Lite self-manages DPR). */\n public setHardwareScalingLevel(level: number): void {\n this._hardwareScalingLevel = level;\n }\n\n /** Babylon.js `engine.getRenderingCanvasClientRect()` — the canvas client rect, or `null` for offscreen canvases. */\n public getRenderingCanvasClientRect(): { x: number; y: number; width: number; height: number } | null {\n const c = this._canvas as { getBoundingClientRect?: () => { x: number; y: number; width: number; height: number } };\n return typeof c.getBoundingClientRect === \"function\" ? c.getBoundingClientRect() : null;\n }\n\n /**\n * Babylon.js `engine.clear(color?, backBuffer?, depth?, stencil?)`. Babylon\n * Lite owns clearing through its render contexts (scenes / sprite renderers),\n * so this records the requested clear colour (used by the scene-less sprite\n * renderer path) and is otherwise a no-op.\n */\n public clear(color?: { r: number; g: number; b: number; a: number }, _backBuffer?: boolean, _depth?: boolean, _stencil?: boolean): void {\n this._clearRequested = true;\n if (color) {\n this._lastClearColor = { r: color.r, g: color.g, b: color.b, a: color.a ?? 1 };\n }\n }\n\n /** @internal Register deferred startup work (a thunk) awaited before the engine starts. */\n public _registerStartupWork(work: () => Promise<void>): void {\n this._startupWork.push(work);\n }\n\n /** @internal Register deferred work awaited after the main scenes register but before the engine starts. */\n public _registerLateWork(work: () => Promise<void>): void {\n this._lateWork.push(work);\n }\n\n /** @internal Scenes register themselves on construction. */\n public _registerScene(scene: Scene): void {\n this._scenes.push(scene);\n // Wire already-registered loop callbacks into the new scene.\n for (const cb of this._loopCallbacks) {\n onBeforeRender(scene._lite, () => cb());\n }\n }\n\n public runRenderLoop(callback: () => void): void {\n this._ensureInitialized(\"runRenderLoop\");\n this._loopCallbacks.push(callback);\n for (const scene of this._scenes) {\n onBeforeRender(scene._lite, () => callback());\n }\n void this._start().then(() => {\n // Scene-less render loops (e.g. the `SpriteRenderer` 2D path) have no\n // scene before-render hook to drive the callback. Run them on a\n // `requestAnimationFrame` loop so per-frame work (e.g. sprite-sheet\n // animation that mutates `cellIndex` each tick) actually advances.\n // Babylon Lite's own render loop draws the registered sprite renderer;\n // we just need to push the updated sprite data before each frame.\n if (this._scenes.length === 0 && this._rafId === null && typeof requestAnimationFrame === \"function\") {\n const tick = (): void => {\n for (const cb of this._loopCallbacks) {\n cb();\n }\n this._rafId = requestAnimationFrame(tick);\n };\n this._rafId = requestAnimationFrame(tick);\n }\n });\n }\n\n public stopRenderLoop(): void {\n if (this._rafId !== null && typeof cancelAnimationFrame === \"function\") {\n cancelAnimationFrame(this._rafId);\n this._rafId = null;\n }\n if (this._initialized) {\n stopEngine(this._lite);\n }\n }\n\n public resize(): void {\n this._ensureInitialized(\"resize\");\n resizeEngine(this._lite);\n this.onResizeObservable.notifyObservers(this);\n }\n\n public setSize(width: number, height: number): void {\n this._ensureInitialized(\"setSize\");\n setEngineSize(this._lite, width, height);\n this.onResizeObservable.notifyObservers(this);\n }\n\n public dispose(): void {\n if (this._rafId !== null && typeof cancelAnimationFrame === \"function\") {\n cancelAnimationFrame(this._rafId);\n this._rafId = null;\n }\n if (this._initialized) {\n disposeEngine(this._lite);\n }\n }\n\n /** Babylon.js manual frame-pump entry point — unsupported (Lite's frame graph owns the frame). */\n public beginFrame(): never {\n return unsupported(\"WebGPUEngine.beginFrame\", \"Babylon Lite's frame graph owns the frame loop; drive rendering with `runRenderLoop`.\");\n }\n\n /** Babylon.js manual frame-pump exit point — unsupported (Lite's frame graph owns the frame). */\n public endFrame(): never {\n return unsupported(\"WebGPUEngine.endFrame\", \"Babylon Lite's frame graph owns the frame loop; drive rendering with `runRenderLoop`.\");\n }\n\n private async _start(): Promise<void> {\n if (this._started) {\n return;\n }\n this._started = true;\n // Run deferred startup work (e.g. sprite-atlas loads) first, so any\n // resources a render context needs exist before the first frame.\n if (this._startupWork.length > 0) {\n await Promise.all(this._startupWork.map((w) => w()));\n this._startupWork.length = 0;\n }\n for (const scene of this._scenes) {\n // Build shadow generators first so NME materials can sample them at parse\n // time (Babylon Lite wires shadow receivers into the NME graph on parse).\n scene._buildShadowGenerators();\n await scene._parseNodeMaterials();\n await scene._awaitPendingTextures();\n scene._bakeGroundUvs();\n scene._flushPendingAdds();\n scene._buildMorphTargets();\n await scene._loadPendingEnvironment();\n if (scene._hasShadows()) {\n await registerSceneWithShadowSupport(scene._lite);\n } else {\n await registerScene(scene._lite);\n }\n }\n // Late work runs after the main scenes are registered (e.g. utility-layer\n // gizmo registration, which Babylon Lite registers after the main scene).\n if (this._lateWork.length > 0) {\n await Promise.all(this._lateWork.map((w) => w()));\n this._lateWork.length = 0;\n }\n await startEngine(this._lite);\n }\n\n private _ensureInitialized(api: string): void {\n if (!this._initialized) {\n throw new LiteCompatError(`${this.constructor.name}.${api}`, \"Call `await engine.initAsync()` before using the engine.\");\n }\n }\n}\n\n/**\n * Babylon.js's headless/abstract WebGL engine layer. In Babylon.js\n * `ThinEngine extends AbstractEngine` and is the lightweight (no scene-graph)\n * engine; the compat layer carries no extra behaviour over {@link AbstractEngine}\n * (everything is WebGPU-backed), so this exists purely to reproduce the class\n * name and inheritance chain.\n */\nexport class ThinEngine extends AbstractEngine {}\n\n/**\n * Babylon.js's full WebGL engine. In Babylon.js `Engine extends ThinEngine`\n * (sibling to {@link WebGPUEngine}, both rooted at {@link AbstractEngine}).\n * Babylon Lite is WebGPU-only, so a compat `Engine` is still backed by the same\n * Lite WebGPU context; this class exists to mirror Babylon.js's name + hierarchy.\n */\nexport class Engine extends ThinEngine {}\n\n/**\n * Babylon.js's WebGPU engine. In Babylon.js `WebGPUEngine extends AbstractEngine`\n * (sibling to {@link Engine}). This is the natural engine for the compat layer\n * since Babylon Lite is WebGPU-only.\n */\nexport class WebGPUEngine extends AbstractEngine {}\n\n/** A degenerate canvas stand-in for the deviceless {@link NullEngine}. */\nconst NULL_CANVAS = { width: 0, height: 0 } as unknown as RenderCanvas;\n\n/**\n * Babylon.js's `NullEngine` — a headless engine with no GPU device, used to run\n * scene logic (animations, observables, frame timing) without rendering. Babylon\n * Lite has no headless context, so the compat `NullEngine` builds nothing on the\n * GPU: it drives a pure-JS `requestAnimationFrame` loop that advances each scene's\n * CPU animations and fires its before/after-render observables. Scenes constructed\n * against it skip the Lite scene-context build (see `Scene`'s headless branch), so\n * only the deviceless surface (CPU animations, manual 2D-canvas drawing, etc.)\n * works — there is no WebGPU rendering. Extends {@link WebGPUEngine} so it is\n * accepted everywhere a compat engine is (e.g. `new Scene(engine)`).\n */\nexport class NullEngine extends WebGPUEngine {\n public constructor() {\n super(NULL_CANVAS);\n this._headless = true;\n // No GPU device to acquire — usable immediately, no `initAsync()` needed.\n this._initialized = true;\n }\n\n /** No GPU device to acquire. */\n public override async initAsync(): Promise<void> {\n // Headless: nothing to initialise.\n }\n\n /**\n * Drive a pure-JS frame loop: each tick advances every registered scene's CPU\n * animations + render observables, then runs the user callback(s). No GPU work.\n */\n public override runRenderLoop(callback: () => void): void {\n this._loopCallbacks.push(callback);\n if (this._rafId !== null || typeof requestAnimationFrame !== \"function\") {\n return;\n }\n const now = (): number => (typeof performance !== \"undefined\" ? performance.now() : Date.now());\n let last = now();\n const tick = (): void => {\n const current = now();\n const deltaMs = current - last;\n last = current;\n for (const scene of this._scenes) {\n scene._tick(deltaMs);\n }\n for (const cb of this._loopCallbacks) {\n cb();\n }\n this._rafId = requestAnimationFrame(tick);\n };\n this._rafId = requestAnimationFrame(tick);\n }\n\n /** @internal Track the scene for the headless tick loop (no Lite before-render wiring). */\n public override _registerScene(scene: Scene): void {\n if (!this._scenes.includes(scene)) {\n this._scenes.push(scene);\n }\n }\n}\n","/**\n * Babylon.js-compatible `AbstractScene` — the base of the `Scene` class.\n *\n * In Babylon.js the scene class chain is `Scene extends AbstractScene`, where\n * `AbstractScene` owns the entity collections (`meshes`, `cameras`, `lights`,\n * `materials`, …) and the by-name lookups over them. The compat layer mirrors\n * that split so `instanceof AbstractScene` and the inherited collection API\n * behave as ported code expects. {@link Scene} adds the engine-backed rendering,\n * environment, animation, and lifecycle surface on top.\n */\n\nimport type { Node } from \"../node/node.js\";\nimport type { Camera } from \"../cameras/cameras.js\";\nimport type { Light } from \"../lights/lights.js\";\nimport type { TransformNode } from \"../meshes/meshes.js\";\nimport type { Material } from \"../materials/materials.js\";\n\nexport abstract class AbstractScene {\n /** @internal Compat meshes surfaced through `scene.meshes` (e.g. Gaussian-Splatting). */\n protected readonly _trackedMeshes: TransformNode[] = [];\n /** @internal Cameras constructed against this scene (`scene.cameras`). */\n protected readonly _cameras: Camera[] = [];\n /** @internal Lights constructed against this scene (`scene.lights`). */\n protected readonly _lights: Light[] = [];\n /** @internal Materials constructed against this scene (`scene.materials`). */\n protected readonly _materials: Material[] = [];\n\n /**\n * Babylon.js `scene.meshes`. Babylon Lite does not expose a public scene-mesh\n * registry, so this tracks the meshes the compat layer creates against a scene\n * which need lookup (currently Gaussian-Splatting meshes surfaced through the\n * loader). Other primitives register with the Lite scene directly.\n */\n public get meshes(): TransformNode[] {\n return this._trackedMeshes;\n }\n\n /** Babylon.js `scene.cameras` — every camera constructed against this scene. */\n public get cameras(): Camera[] {\n return this._cameras;\n }\n\n /** Babylon.js `scene.lights` — every light constructed against this scene. */\n public get lights(): Light[] {\n return this._lights;\n }\n\n /** Babylon.js `scene.materials` — every material constructed against this scene. */\n public get materials(): Material[] {\n return this._materials;\n }\n\n /** @internal Track a compat mesh so it appears in `scene.meshes`. */\n public _registerMesh(mesh: TransformNode): void {\n if (!this._trackedMeshes.includes(mesh)) {\n this._trackedMeshes.push(mesh);\n }\n }\n\n /** @internal Register a camera so it appears in `scene.cameras`. */\n public _registerCamera(camera: Camera): void {\n if (!this._cameras.includes(camera)) {\n this._cameras.push(camera);\n }\n }\n\n /** @internal Register a light so it appears in `scene.lights`. */\n public _registerLight(light: Light): void {\n if (!this._lights.includes(light)) {\n this._lights.push(light);\n }\n }\n\n /** @internal Register a material so it appears in `scene.materials`. */\n public _registerMaterial(material: Material): void {\n if (!this._materials.includes(material)) {\n this._materials.push(material);\n }\n }\n\n /** @internal Remove a node from the camera / light / mesh registries on dispose. */\n public _unregisterNode(node: Node): void {\n const ci = this._cameras.indexOf(node as unknown as Camera);\n if (ci !== -1) {\n this._cameras.splice(ci, 1);\n }\n const li = this._lights.indexOf(node as unknown as Light);\n if (li !== -1) {\n this._lights.splice(li, 1);\n }\n const mi = this._trackedMeshes.indexOf(node as unknown as TransformNode);\n if (mi !== -1) {\n this._trackedMeshes.splice(mi, 1);\n }\n }\n\n /** @internal Remove a material from `scene.materials` on dispose. */\n public _unregisterMaterial(material: Material): void {\n const i = this._materials.indexOf(material);\n if (i !== -1) {\n this._materials.splice(i, 1);\n }\n }\n\n /** Babylon.js `scene.getCameraByName(name)` — first camera with a matching name, else `null`. */\n public getCameraByName(name: string): Camera | null {\n return this._cameras.find((c) => c.name === name) ?? null;\n }\n\n /** Babylon.js `scene.getCameraById(id)` — first camera whose `id` matches, else `null`. */\n public getCameraById(id: string): Camera | null {\n return this._cameras.find((c) => (c as unknown as { id?: string }).id === id) ?? null;\n }\n\n /** Babylon.js `scene.getLightByName(name)` — first light with a matching name, else `null`. */\n public getLightByName(name: string): Light | null {\n return this._lights.find((l) => l.name === name) ?? null;\n }\n\n /** Babylon.js `scene.getLightById(id)` — first light whose `id` matches, else `null`. */\n public getLightById(id: string): Light | null {\n return this._lights.find((l) => (l as unknown as { id?: string }).id === id) ?? null;\n }\n\n /** Babylon.js `scene.getMaterialByName(name)` — first material with a matching name, else `null`. */\n public getMaterialByName(name: string): Material | null {\n return this._materials.find((m) => m.name === name) ?? null;\n }\n\n /** Babylon.js `scene.getMaterialById(id)` — first material whose `id` matches, else `null`. */\n public getMaterialById(id: string): Material | null {\n return this._materials.find((m) => (m as unknown as { id?: string }).id === id) ?? null;\n }\n\n /**\n * Babylon.js `scene.getMeshByName(name)`. Babylon Lite has no public scene-mesh\n * registry, so this searches the compat meshes tracked through `scene.meshes`\n * (currently meshes the loader surfaces, e.g. Gaussian-Splatting). Returns `null`\n * when not found, matching Babylon.js.\n */\n public getMeshByName(name: string): TransformNode | null {\n return this._trackedMeshes.find((m) => m.name === name) ?? null;\n }\n\n /** Babylon.js `scene.getMeshById(id)` — first tracked mesh whose `id` matches, else `null`. */\n public getMeshById(id: string): TransformNode | null {\n return this._trackedMeshes.find((m) => (m as unknown as { id?: string }).id === id) ?? null;\n }\n\n /** Babylon.js legacy `scene.getMeshByID(id)` — alias of {@link getMeshById}. */\n public getMeshByID(id: string): TransformNode | null {\n return this.getMeshById(id);\n }\n\n /** Babylon.js `scene.getNodeByName(name)` — searches tracked meshes, cameras, and lights. */\n public getNodeByName(name: string): Node | null {\n return this._trackedMeshes.find((m) => m.name === name) ?? this._cameras.find((c) => c.name === name) ?? this._lights.find((l) => l.name === name) ?? null;\n }\n\n /** Babylon.js `scene.getNodeById(id)` — searches tracked meshes, cameras, and lights by `id`. */\n public getNodeById(id: string): Node | null {\n const byId = (n: { id?: string }): boolean => n.id === id;\n return (\n this._trackedMeshes.find((m) => byId(m as unknown as { id?: string })) ??\n this._cameras.find((c) => byId(c as unknown as { id?: string })) ??\n this._lights.find((l) => byId(l as unknown as { id?: string })) ??\n null\n );\n }\n}\n","/**\n * Babylon.js-compatible camera classes implemented over the Babylon Lite camera\n * factories.\n *\n * Babylon.js cameras take the scene in their constructor and become the active\n * camera; these wrappers do the same by assigning `scene.activeCamera` when a\n * scene is supplied. `attachControl()` is a method here (Lite separates it into\n * standalone functions) and returns the detach handle Lite already provides.\n */\n\nimport {\n createArcRotateCamera,\n createFreeCamera,\n createGeospatialCamera,\n setGeospatialOrientation,\n attachGeospatialControls,\n attachControl as liteAttachControl,\n attachFreeControl,\n getCameraPosition,\n getViewMatrix as liteGetViewMatrix,\n getProjectionMatrix as liteGetProjectionMatrix,\n onBeforeRender,\n} from \"babylon-lite\";\nimport type { ArcRotateCamera as LiteArcRotateCamera, FreeCamera as LiteFreeCamera, GeospatialCamera as LiteGeospatialCamera, Camera as LiteCamera } from \"babylon-lite\";\n\nimport { unsupported } from \"../error.js\";\nimport { Vector3 } from \"../math/vector.js\";\nimport { Matrix } from \"../math/matrix.js\";\nimport { Node } from \"../node/node.js\";\nimport type { Scene } from \"../scene/scene.js\";\n\n/** Babylon.js `Camera` — base class for all cameras (derives from `Node`). */\nexport abstract class Camera extends Node {\n /** @internal Underlying Babylon Lite camera. */\n public abstract readonly _lite: LiteCamera;\n private _detach: (() => void) | undefined;\n\n protected constructor(name: string, scene?: Scene) {\n super(name, scene);\n scene?._registerCamera(this);\n }\n\n public override getClassName(): string {\n return \"Camera\";\n }\n\n public get fov(): number {\n return this._lite.fov;\n }\n public set fov(value: number) {\n this._lite.fov = value;\n }\n\n public get minZ(): number {\n return this._lite.nearPlane;\n }\n public set minZ(value: number) {\n this._lite.nearPlane = value;\n }\n\n public get maxZ(): number {\n return this._lite.farPlane;\n }\n public set maxZ(value: number) {\n this._lite.farPlane = value;\n }\n\n /** World-space position of the camera. */\n public get globalPosition(): Vector3 {\n const p = getCameraPosition(this._lite);\n return new Vector3(p.x, p.y, p.z);\n }\n\n /** Babylon.js `camera.getViewMatrix()` — the camera's view matrix. */\n public getViewMatrix(): Matrix {\n return Matrix.FromArray(liteGetViewMatrix(this._lite));\n }\n\n /** Babylon.js `camera.getProjectionMatrix()` — the camera's projection matrix. */\n public getProjectionMatrix(): Matrix {\n return Matrix.FromArray(liteGetProjectionMatrix(this._lite, this._aspectRatio()));\n }\n\n private _aspectRatio(): number {\n const scene = this._scene;\n const canvas = scene?.getEngine().getRenderingCanvas() as { width?: number; height?: number } | undefined;\n const w = canvas?.width ?? 1;\n const h = canvas?.height ?? 1;\n return h !== 0 ? w / h : 1;\n }\n\n public abstract attachControl(canvas: HTMLCanvasElement, noPreventDefault?: boolean): void;\n\n public detachControl(): void {\n if (this._detach) {\n this._detach();\n this._detach = undefined;\n }\n }\n\n /** @internal Store the detach handle returned by Lite's attach function. */\n protected _setDetach(detach: () => void): void {\n this._detach = detach;\n }\n\n protected _makeActive(scene: Scene | undefined): void {\n // Babylon.js sets `scene.activeCamera` to the **first** camera constructed\n // against a scene; later cameras are added but do not steal the active\n // slot (e.g. a `CameraGizmo`'s subject camera must not become the view).\n if (scene && !scene.activeCamera) {\n scene.activeCamera = this;\n }\n }\n}\n\nexport class ArcRotateCamera extends Camera {\n /** @internal Underlying Babylon Lite arc-rotate camera. */\n public readonly _lite: LiteArcRotateCamera;\n\n public constructor(name: string, alpha: number, beta: number, radius: number, target: Vector3, scene?: Scene);\n /** @internal Adopt an already-built Lite arc-rotate camera (e.g. from `createDefaultCamera`) instead of creating a new one. */\n public constructor(name: string, alpha: number, beta: number, radius: number, target: Vector3, scene: Scene | undefined, adoptLite: LiteArcRotateCamera);\n public constructor(name: string, alpha: number, beta: number, radius: number, target: Vector3, scene?: Scene, adoptLite?: LiteArcRotateCamera) {\n super(name, scene);\n this._lite = adoptLite ?? createArcRotateCamera(alpha, beta, radius, { x: target.x, y: target.y, z: target.z });\n if (!adoptLite) {\n this._makeActive(scene);\n }\n }\n\n public override getClassName(): string {\n return \"ArcRotateCamera\";\n }\n\n public get alpha(): number {\n return this._lite.alpha;\n }\n public set alpha(value: number) {\n this._lite.alpha = value;\n }\n\n public get beta(): number {\n return this._lite.beta;\n }\n public set beta(value: number) {\n this._lite.beta = value;\n }\n\n public get radius(): number {\n return this._lite.radius;\n }\n public set radius(value: number) {\n this._lite.radius = value;\n }\n\n public get target(): Vector3 {\n const t = this._lite.target;\n return new Vector3(t.x, t.y, t.z);\n }\n public set target(value: Vector3) {\n this._lite.target = { x: value.x, y: value.y, z: value.z };\n }\n\n /** Babylon.js `setTarget` — point the arc-rotate camera at a world-space target. */\n public setTarget(target: Vector3): void {\n this.target = target;\n }\n\n public get lowerRadiusLimit(): number | undefined {\n return this._lite.lowerRadiusLimit;\n }\n public set lowerRadiusLimit(value: number | undefined) {\n this._lite.lowerRadiusLimit = value;\n }\n\n public get upperRadiusLimit(): number | undefined {\n return this._lite.upperRadiusLimit;\n }\n public set upperRadiusLimit(value: number | undefined) {\n this._lite.upperRadiusLimit = value;\n }\n\n public attachControl(canvas: HTMLCanvasElement, _noPreventDefault?: boolean): void {\n const detach = liteAttachControl(this._lite, canvas, this._scene?._lite);\n this._setDetach(detach);\n }\n\n /** @internal Wrap an already-built Lite arc-rotate camera (e.g. from `createDefaultCamera`). */\n public static _adopt(name: string, lite: LiteArcRotateCamera, scene?: Scene): ArcRotateCamera {\n return new ArcRotateCamera(name, lite.alpha, lite.beta, lite.radius, new Vector3(lite.target.x, lite.target.y, lite.target.z), scene, lite);\n }\n}\n\n/**\n * Babylon.js `TargetCamera` — a free-moving camera with a look-at target. Base\n * for `FreeCamera`/`UniversalCamera`/`TouchCamera`/`FlyCamera`/`FollowCamera`.\n */\nexport class TargetCamera extends Camera {\n /** @internal Underlying Babylon Lite free camera. */\n public readonly _lite: LiteFreeCamera;\n\n public constructor(name: string, position: Vector3, scene?: Scene);\n /** @internal Adopt an already-built Lite free camera (e.g. one parsed from a `.babylon` file) instead of creating a new one. */\n public constructor(name: string, position: Vector3, scene: Scene | undefined, adoptLite: LiteFreeCamera);\n public constructor(name: string, position: Vector3, scene?: Scene, adoptLite?: LiteFreeCamera) {\n super(name, scene);\n this._lite = adoptLite ?? createFreeCamera({ x: position.x, y: position.y, z: position.z }, { x: position.x, y: position.y, z: position.z - 1 });\n this._makeActive(scene);\n }\n\n public override getClassName(): string {\n return \"TargetCamera\";\n }\n\n public get position(): Vector3 {\n const p = this._lite.position;\n return new Vector3(p.x, p.y, p.z);\n }\n public set position(value: Vector3) {\n this._lite.position.set(value.x, value.y, value.z);\n }\n\n public get speed(): number {\n return this._lite.speed;\n }\n public set speed(value: number) {\n this._lite.speed = value;\n }\n\n /** Babylon.js `setTarget` — aim the camera at a world-space point. */\n public setTarget(target: Vector3): void {\n this._lite.target.set(target.x, target.y, target.z);\n }\n\n public attachControl(canvas: HTMLCanvasElement, _noPreventDefault?: boolean): void {\n const detach = attachFreeControl(this._lite, canvas, this._scene?._lite);\n this._setDetach(detach);\n }\n}\n\n/** Babylon.js `FreeCamera` — keyboard/mouse free camera. */\nexport class FreeCamera extends TargetCamera {\n public override getClassName(): string {\n return \"FreeCamera\";\n }\n\n /** @internal Wrap an already-built Lite free camera (e.g. one parsed from a `.babylon` file). */\n public static _adopt(name: string, lite: LiteFreeCamera, scene?: Scene): FreeCamera {\n const p = lite.position;\n return new FreeCamera(name, new Vector3(p.x, p.y, p.z), scene, lite);\n }\n}\n\n/** Babylon.js `UniversalCamera` — touch-friendly free camera. */\nexport class UniversalCamera extends FreeCamera {\n public override getClassName(): string {\n return \"UniversalCamera\";\n }\n}\n\n/** Babylon.js `TouchCamera` — touch-controlled free camera. */\nexport class TouchCamera extends FreeCamera {\n public override getClassName(): string {\n return \"TouchCamera\";\n }\n}\n\n/** Babylon.js `GamepadCamera` — gamepad-controlled free camera. */\nexport class GamepadCamera extends UniversalCamera {\n public override getClassName(): string {\n return \"GamepadCamera\";\n }\n}\n\n/** Babylon.js `FlyCamera` — 6-DOF free-flight camera. */\nexport class FlyCamera extends TargetCamera {\n public override getClassName(): string {\n return \"FlyCamera\";\n }\n}\n\ninterface LockedTarget {\n position: { x: number; y: number; z: number };\n}\n\n/**\n * Babylon.js `FollowCamera` — follows a `lockedTarget` at a fixed radius /\n * height / rotation offset, updated each frame via the scene's before-render hook.\n */\nexport class FollowCamera extends TargetCamera {\n public lockedTarget: LockedTarget | null = null;\n public radius = 12;\n public heightOffset = 4;\n /** Rotation offset around the target, in degrees. */\n public rotationOffset = 0;\n\n public constructor(name: string, position: Vector3, scene?: Scene, lockedTarget?: LockedTarget) {\n super(name, position, scene);\n this.lockedTarget = lockedTarget ?? null;\n if (scene) {\n onBeforeRender(scene._lite, () => this._follow());\n }\n }\n\n public override getClassName(): string {\n return \"FollowCamera\";\n }\n\n private _follow(): void {\n const target = this.lockedTarget;\n if (!target) {\n return;\n }\n const radians = (this.rotationOffset * Math.PI) / 180;\n const x = target.position.x + this.radius * Math.sin(radians);\n const z = target.position.z + this.radius * Math.cos(radians);\n const y = target.position.y + this.heightOffset;\n this._lite.position.set(x, y, z);\n this.setTarget(new Vector3(target.position.x, target.position.y, target.position.z));\n }\n}\n\n/**\n * Babylon.js `GeospatialCamera` — globe-orbit camera anchored to a surface\n * `center` (ECEF), orbiting at `radius` with `yaw`/`pitch`. Wraps Babylon Lite's\n * `createGeospatialCamera` + `setGeospatialOrientation` (which clamps pitch\n * against the effective max for the current radius, so each orientation field is\n * applied through Lite with the others left at their current values).\n */\nexport class GeospatialCamera extends Camera {\n /** @internal Underlying Babylon Lite geospatial camera. */\n public readonly _lite: LiteGeospatialCamera;\n\n public constructor(name: string, scene?: Scene, options?: { planetRadius: number }) {\n super(name, scene);\n this._lite = createGeospatialCamera({ planetRadius: options?.planetRadius ?? 1 });\n this._makeActive(scene);\n }\n\n public override getClassName(): string {\n return \"GeospatialCamera\";\n }\n\n /** Anchored surface point the camera orbits (ECEF coordinates). */\n public get center(): Vector3 {\n const c = this._lite.center;\n return new Vector3(c.x, c.y, c.z);\n }\n public set center(value: Vector3) {\n setGeospatialOrientation(this._lite, { center: { x: value.x, y: value.y, z: value.z } });\n }\n\n /** Distance from the camera to its centre point. */\n public get radius(): number {\n return this._lite.radius;\n }\n public set radius(value: number) {\n setGeospatialOrientation(this._lite, { radius: value });\n }\n\n /** Yaw about the geocentric up axis (0 = north, π/2 = east). */\n public get yaw(): number {\n return this._lite.yaw;\n }\n public set yaw(value: number) {\n setGeospatialOrientation(this._lite, { yaw: value });\n }\n\n /** Pitch from looking straight down (0) to the horizon (π/2). */\n public get pitch(): number {\n return this._lite.pitch;\n }\n public set pitch(value: number) {\n setGeospatialOrientation(this._lite, { pitch: value });\n }\n\n public attachControl(canvas: HTMLCanvasElement, _noPreventDefault?: boolean): void {\n if (this._scene) {\n const detach = attachGeospatialControls(this._lite, canvas, this._scene._lite);\n this._setDetach(detach);\n }\n }\n}\n\n/** Babylon.js `DeviceOrientationCamera` — device-orientation input is not available in Babylon Lite. */\nexport class DeviceOrientationCamera {\n public constructor() {\n unsupported(\"DeviceOrientationCamera\", \"Device-orientation input is not part of Babylon Lite.\");\n }\n}\n\n/** Babylon.js `WebXRCamera` — WebXR is not part of Babylon Lite. */\nexport class WebXRCamera {\n public constructor() {\n unsupported(\"WebXRCamera\", \"WebXR is not part of Babylon Lite.\");\n }\n}\n\n/** Babylon.js `AnaglyphArcRotateCamera` — stereoscopic camera rigs are not implemented in Babylon Lite. */\nexport class AnaglyphArcRotateCamera {\n public constructor() {\n unsupported(\"AnaglyphArcRotateCamera\", \"Stereoscopic camera rigs are not implemented in Babylon Lite. (An anaglyph post-process exists separately.)\");\n }\n}\n","/**\n * Babylon.js-compatible material classes over the Babylon Lite material\n * factories.\n *\n * The Lite material is plain-data props (`_lite`); assign it to a mesh via\n * `mesh.material = material`. Property setters mutate the props and mark the\n * material UBO dirty (matching Babylon.js's \"mutate then it just works\"\n * behaviour). Only the common property subset is mapped; rarely-used Babylon.js\n * material properties are intentionally omitted.\n */\n\nimport { createStandardMaterial, createPbrMaterial, markMaterialUboDirty, createSolidTexture2D } from \"babylon-lite\";\nimport type { StandardMaterialProps, PbrMaterialProps, ClearCoatProps, SheenProps, AnisotropyProps, IridescenceProps, Texture2D, EngineContext } from \"babylon-lite\";\n\nimport { Color3 } from \"../math/color.js\";\nimport type { Scene } from \"../scene/scene.js\";\nimport type { BaseTexture, CubeTexture } from \"../textures/textures.js\";\n\ntype Tuple3 = [number, number, number];\ntype Tuple4 = [number, number, number, number];\n\n/** Babylon.js `Material` — base class for all materials. */\nexport abstract class Material {\n public name: string;\n /** Common transparency mode flag (Babylon.js `Material.transparencyMode`). */\n public transparencyMode: number | null = null;\n /** Back-face culling toggle (Babylon.js `Material.backFaceCulling`). */\n private _backFaceCulling = true;\n public get backFaceCulling(): boolean {\n return this._backFaceCulling;\n }\n public set backFaceCulling(value: boolean) {\n this._backFaceCulling = value;\n this._applyBackFaceCulling(value);\n this._markDirty();\n }\n /** @internal Per-material hook to push culling onto the Lite props (Standard vs PBR differ). */\n protected _applyBackFaceCulling(_value: boolean): void {\n // Base/NME materials: no Lite culling field to set.\n }\n /** Wireframe rendering toggle (not honoured by all Lite materials). */\n public wireframe = false;\n /** @internal Underlying Babylon Lite material props. */\n public abstract readonly _lite: StandardMaterialProps | PbrMaterialProps;\n\n /** @internal Owning compat scene, when constructed against one. */\n protected _scene: Scene | undefined;\n\n protected constructor(name: string, scene?: Scene) {\n this.name = name;\n this._scene = scene;\n scene?._registerMaterial(this);\n }\n\n public getClassName(): string {\n return \"Material\";\n }\n\n protected _markDirty(): void {\n markMaterialUboDirty(this._lite);\n }\n\n /**\n * @internal Finalize GPU-facing resources before the mesh is registered.\n * Base materials need nothing; PBR overrides this to synthesize the solid\n * textures Babylon Lite's PBR pipeline requires from factor-only materials.\n */\n public _ensureRenderable(_engine: EngineContext): void {\n // No-op for the base/standard material.\n }\n\n public dispose(): void {\n // No GPU resources are owned by the props object directly; textures are\n // disposed through their own handles. Drop the material from its scene's\n // `scene.materials` registry.\n this._scene?._unregisterMaterial(this);\n }\n}\n\n/** Babylon.js `PushMaterial` — intermediate base; behaves like {@link Material} here. */\nexport abstract class PushMaterial extends Material {\n public override getClassName(): string {\n return \"PushMaterial\";\n }\n}\n\nfunction readColor3(tuple: Tuple3 | undefined): Color3 {\n return tuple ? new Color3(tuple[0], tuple[1], tuple[2]) : new Color3(0, 0, 0);\n}\n\nexport class StandardMaterial extends PushMaterial {\n /** @internal Underlying Babylon Lite standard-material props. */\n public readonly _lite: StandardMaterialProps;\n\n public constructor(name: string, scene?: Scene) {\n super(name, scene);\n this._lite = createStandardMaterial();\n }\n\n public override getClassName(): string {\n return \"StandardMaterial\";\n }\n\n public get diffuseColor(): Color3 {\n return readColor3(this._lite.diffuseColor);\n }\n public set diffuseColor(value: Color3) {\n this._lite.diffuseColor = [value.r, value.g, value.b];\n this._markDirty();\n }\n\n public get specularColor(): Color3 {\n return readColor3(this._lite.specularColor);\n }\n public set specularColor(value: Color3) {\n this._lite.specularColor = [value.r, value.g, value.b];\n this._markDirty();\n }\n\n public get emissiveColor(): Color3 {\n return readColor3(this._lite.emissiveColor);\n }\n public set emissiveColor(value: Color3) {\n this._lite.emissiveColor = [value.r, value.g, value.b];\n this._markDirty();\n }\n\n public get ambientColor(): Color3 {\n return readColor3(this._lite.ambientColor);\n }\n public set ambientColor(value: Color3) {\n this._lite.ambientColor = [value.r, value.g, value.b];\n this._markDirty();\n }\n\n public get disableLighting(): boolean {\n return this._lite.disableLighting;\n }\n public set disableLighting(value: boolean) {\n this._lite.disableLighting = value;\n this._markDirty();\n }\n\n protected override _applyBackFaceCulling(value: boolean): void {\n this._lite.backFaceCulling = value;\n }\n\n public get alpha(): number {\n return this._lite.alpha;\n }\n public set alpha(value: number) {\n this._lite.alpha = value;\n this._markDirty();\n }\n\n public get diffuseTexture(): BaseTexture | null {\n return this._diffuseTexture;\n }\n public set diffuseTexture(texture: BaseTexture | null) {\n this._diffuseTexture = texture;\n this._lite.diffuseTexture = (texture?._lite as Texture2D | undefined) ?? null;\n this._markDirty();\n }\n\n /**\n * Babylon.js `StandardMaterial.alphaCutOff` — alpha-test threshold. Fragments\n * whose diffuse-texture alpha is below this value are discarded. Babylon Lite's\n * Standard pipeline alpha-tests against the diffuse texture's alpha when\n * `alphaCutOff > 0`, so this is wired directly.\n */\n public get alphaCutOff(): number {\n return this._lite.alphaCutOff;\n }\n public set alphaCutOff(value: number) {\n this._lite.alphaCutOff = value;\n this._markDirty();\n }\n\n /**\n * Babylon.js `StandardMaterial.useAlphaFromDiffuseTexture`. Babylon Lite's\n * alpha test already samples the diffuse texture's alpha (enabled via\n * `alphaCutOff`), so this is accepted for parity.\n */\n public useAlphaFromDiffuseTexture = false;\n\n public get bumpTexture(): BaseTexture | null {\n return this._bumpTexture;\n }\n public set bumpTexture(texture: BaseTexture | null) {\n this._bumpTexture = texture;\n this._lite.bumpTexture = (texture?._lite as Texture2D | undefined) ?? null;\n this._markDirty();\n }\n\n public get emissiveTexture(): BaseTexture | null {\n return this._emissiveTexture;\n }\n public set emissiveTexture(texture: BaseTexture | null) {\n this._emissiveTexture = texture;\n this._lite.emissiveTexture = (texture?._lite as Texture2D | undefined) ?? null;\n this._markDirty();\n }\n\n private _diffuseTexture: BaseTexture | null = null;\n private _bumpTexture: BaseTexture | null = null;\n private _emissiveTexture: BaseTexture | null = null;\n\n /**\n * @internal Re-bind texture maps to the Lite material. Babylon.js `Texture`s\n * load asynchronously, so when `material.diffuseTexture = new Texture(url)` ran\n * the Lite handle was still undefined. By engine-start the scene has awaited the\n * loads, so copy the now-resolved handles (and UV tiling) onto the Lite props.\n */\n public override _ensureRenderable(_engine: EngineContext): void {\n const diff = this._diffuseTexture as { _lite?: Texture2D; uScale?: number; vScale?: number } | null;\n if (diff?._lite) {\n this._lite.diffuseTexture = diff._lite;\n if (diff.uScale !== undefined && diff.vScale !== undefined) {\n this._lite.uvScale = [diff.uScale, diff.vScale];\n }\n }\n const bump = this._bumpTexture as { _lite?: Texture2D } | null;\n if (bump?._lite) {\n this._lite.bumpTexture = bump._lite;\n }\n const emissive = this._emissiveTexture as { _lite?: Texture2D } | null;\n if (emissive?._lite) {\n this._lite.emissiveTexture = emissive._lite;\n }\n this._markDirty();\n }\n}\n\n/**\n * Babylon.js `PBRClearCoatConfiguration` — the `pbr.clearCoat` sub-object.\n * Proxies the common clearcoat fields onto a Babylon Lite `ClearCoatProps`.\n */\nexport class PBRClearCoatConfiguration {\n public constructor(\n private readonly _props: ClearCoatProps,\n private readonly _markDirty: () => void\n ) {}\n\n public get isEnabled(): boolean {\n return this._props.isEnabled ?? false;\n }\n public set isEnabled(value: boolean) {\n this._props.isEnabled = value;\n this._markDirty();\n }\n\n public get intensity(): number {\n return this._props.intensity ?? 1;\n }\n public set intensity(value: number) {\n this._props.intensity = value;\n this._markDirty();\n }\n\n public get roughness(): number {\n return this._props.roughness ?? 0;\n }\n public set roughness(value: number) {\n this._props.roughness = value;\n this._markDirty();\n }\n\n public get indexOfRefraction(): number {\n return this._props.indexOfRefraction ?? 1.5;\n }\n public set indexOfRefraction(value: number) {\n this._props.indexOfRefraction = value;\n this._markDirty();\n }\n}\n\n/** Babylon.js `PBRSheenConfiguration` — the `pbr.sheen` sub-object over Lite `SheenProps`. */\nexport class PBRSheenConfiguration {\n public constructor(\n private readonly _props: SheenProps,\n private readonly _markDirty: () => void\n ) {}\n\n public get isEnabled(): boolean {\n return this._props.isEnabled;\n }\n public set isEnabled(value: boolean) {\n this._props.isEnabled = value;\n this._markDirty();\n }\n\n public get intensity(): number {\n return this._props.intensity ?? 1;\n }\n public set intensity(value: number) {\n this._props.intensity = value;\n this._markDirty();\n }\n\n public get roughness(): number {\n return this._props.roughness ?? 0;\n }\n public set roughness(value: number) {\n this._props.roughness = value;\n this._markDirty();\n }\n\n public get color(): Color3 {\n const c = this._props.color ?? [1, 1, 1];\n return new Color3(c[0], c[1], c[2]);\n }\n public set color(value: Color3) {\n this._props.color = [value.r, value.g, value.b];\n this._markDirty();\n }\n\n /** Babylon.js `sheen.texture`. Binds the Lite handle if the texture has resolved. */\n public set texture(value: { _lite?: Texture2D } | null) {\n if (value?._lite) {\n this._props.texture = value._lite;\n this._markDirty();\n }\n }\n}\n\n/** Babylon.js `PBRAnisotropicConfiguration` — the `pbr.anisotropy` sub-object over Lite `AnisotropyProps`. */\nexport class PBRAnisotropicConfiguration {\n public constructor(\n private readonly _props: AnisotropyProps,\n private readonly _markDirty: () => void\n ) {}\n\n public get isEnabled(): boolean {\n return this._props.isEnabled;\n }\n public set isEnabled(value: boolean) {\n this._props.isEnabled = value;\n this._markDirty();\n }\n\n public get intensity(): number {\n return this._props.intensity ?? 1;\n }\n public set intensity(value: number) {\n this._props.intensity = value;\n this._markDirty();\n }\n\n public get direction(): { x: number; y: number } {\n const d = this._props.direction ?? [1, 0];\n return { x: d[0], y: d[1] };\n }\n public set direction(value: { x: number; y: number }) {\n this._props.direction = [value.x, value.y];\n this._markDirty();\n }\n}\n\n/** Babylon.js `PBRIridescenceConfiguration` — the `pbr.iridescence` sub-object over Lite `IridescenceProps`. */\nexport class PBRIridescenceConfiguration {\n public constructor(\n private readonly _props: IridescenceProps,\n private readonly _markDirty: () => void\n ) {}\n\n public get isEnabled(): boolean {\n return this._props.isEnabled ?? false;\n }\n public set isEnabled(value: boolean) {\n this._props.isEnabled = value;\n this._markDirty();\n }\n\n public get intensity(): number {\n return this._props.intensity ?? 1;\n }\n public set intensity(value: number) {\n this._props.intensity = value;\n this._markDirty();\n }\n\n public get indexOfRefraction(): number {\n return this._props.indexOfRefraction ?? 1.3;\n }\n public set indexOfRefraction(value: number) {\n this._props.indexOfRefraction = value;\n this._markDirty();\n }\n\n public get minimumThickness(): number {\n return this._props.minimumThickness ?? 100;\n }\n public set minimumThickness(value: number) {\n this._props.minimumThickness = value;\n this._markDirty();\n }\n\n public get maximumThickness(): number {\n return this._props.maximumThickness ?? 400;\n }\n public set maximumThickness(value: number) {\n this._props.maximumThickness = value;\n this._markDirty();\n }\n}\n\nexport class PBRMaterial extends PushMaterial {\n /** @internal Underlying Babylon Lite PBR-material props. */\n public readonly _lite: PbrMaterialProps;\n\n public constructor(name: string, scene?: Scene) {\n super(name, scene);\n this._lite = createPbrMaterial();\n if (!this._lite.baseColorFactor) {\n this._lite.baseColorFactor = [1, 1, 1, 1];\n }\n }\n\n public override getClassName(): string {\n return \"PBRMaterial\";\n }\n\n public get albedoColor(): Color3 {\n const f = this._lite.baseColorFactor;\n return f ? new Color3(f[0], f[1], f[2]) : new Color3(1, 1, 1);\n }\n public set albedoColor(value: Color3) {\n const f: Tuple4 = this._lite.baseColorFactor ?? [1, 1, 1, 1];\n this._lite.baseColorFactor = [value.r, value.g, value.b, f[3]];\n this._markDirty();\n }\n\n /**\n * Babylon.js `pbr.albedoTexture` (glTF base-color map). The texture loads\n * asynchronously, so the resolved Lite handle (+ sRGB flag) is bound in\n * {@link _ensureRenderable} at engine start rather than here.\n */\n public get albedoTexture(): BaseTexture | null {\n return this._albedoTexture;\n }\n public set albedoTexture(texture: BaseTexture | null) {\n this._albedoTexture = texture;\n this._markDirty();\n }\n\n private _albedoTexture: BaseTexture | null = null;\n\n public get metallic(): number {\n return this._lite.metallicFactor ?? 1;\n }\n public set metallic(value: number) {\n this._lite.metallicFactor = value;\n this._markDirty();\n }\n\n public get roughness(): number {\n return this._lite.roughnessFactor ?? 1;\n }\n public set roughness(value: number) {\n this._lite.roughnessFactor = value;\n this._markDirty();\n }\n\n public get emissiveColor(): Color3 {\n return readColor3(this._lite.emissiveColor);\n }\n public set emissiveColor(value: Color3) {\n this._lite.emissiveColor = [value.r, value.g, value.b];\n this._markDirty();\n }\n\n /**\n * Babylon.js `pbr.usePhysicalLightFalloff`. When false, point/spot lights use\n * Standard-style linear range falloff instead of physical inverse-square.\n * Default true (matches Babylon.js PBRMaterial).\n */\n public get usePhysicalLightFalloff(): boolean {\n return this._lite.usePhysicalLightFalloff ?? true;\n }\n public set usePhysicalLightFalloff(value: boolean) {\n this._lite.usePhysicalLightFalloff = value;\n this._markDirty();\n }\n\n public get alpha(): number {\n return this._lite.alpha ?? 1;\n }\n public set alpha(value: number) {\n this._lite.alpha = value;\n this._markDirty();\n }\n\n /**\n * Babylon.js `material.forceIrradianceInFragment`. Babylon Lite computes\n * irradiance in the fragment stage already, so this is accepted for parity.\n */\n public forceIrradianceInFragment = false;\n\n protected override _applyBackFaceCulling(value: boolean): void {\n this._lite.doubleSided = !value;\n }\n\n /**\n * Babylon.js `pbr.clearCoat` sub-configuration. Lazily allocates the Lite\n * `clearCoat` props on first access and proxies the common fields\n * (`isEnabled`, `intensity`, `roughness`, `indexOfRefraction`) onto them.\n */\n public get clearCoat(): PBRClearCoatConfiguration {\n if (!this._clearCoat) {\n if (!this._lite.clearCoat) {\n this._lite.clearCoat = { isEnabled: false };\n }\n this._clearCoat = new PBRClearCoatConfiguration(this._lite.clearCoat, () => this._markDirty());\n }\n return this._clearCoat;\n }\n\n private _clearCoat?: PBRClearCoatConfiguration;\n\n /** Babylon.js `pbr.sheen` sub-configuration (Lite `SheenProps`). */\n public get sheen(): PBRSheenConfiguration {\n if (!this._sheen) {\n if (!this._lite.sheen) {\n this._lite.sheen = { isEnabled: false };\n }\n this._sheen = new PBRSheenConfiguration(this._lite.sheen, () => this._markDirty());\n }\n return this._sheen;\n }\n\n private _sheen?: PBRSheenConfiguration;\n\n /** Babylon.js `pbr.anisotropy` sub-configuration (Lite `AnisotropyProps`). */\n public get anisotropy(): PBRAnisotropicConfiguration {\n if (!this._anisotropy) {\n if (!this._lite.anisotropy) {\n this._lite.anisotropy = { isEnabled: false };\n }\n this._anisotropy = new PBRAnisotropicConfiguration(this._lite.anisotropy, () => this._markDirty());\n }\n return this._anisotropy;\n }\n\n private _anisotropy?: PBRAnisotropicConfiguration;\n\n /** Babylon.js `pbr.iridescence` sub-configuration (Lite `IridescenceProps`). */\n public get iridescence(): PBRIridescenceConfiguration {\n if (!this._iridescence) {\n if (!this._lite.iridescence) {\n this._lite.iridescence = { isEnabled: false };\n }\n this._iridescence = new PBRIridescenceConfiguration(this._lite.iridescence, () => this._markDirty());\n }\n return this._iridescence;\n }\n\n private _iridescence?: PBRIridescenceConfiguration;\n\n /**\n * Babylon.js `material.environmentTexture` / `reflectionTexture`. Babylon Lite\n * applies image-based lighting scene-wide rather than per-material, so a cube\n * environment assigned to a material is routed to the owning scene's\n * environment (the dominant single-IBL case Babylon.js scenes use).\n */\n public get environmentTexture(): CubeTexture | null {\n return this._scene?.environmentTexture ?? null;\n }\n public set environmentTexture(value: CubeTexture | null) {\n if (this._scene) {\n this._scene.environmentTexture = value;\n }\n }\n\n public get reflectionTexture(): CubeTexture | null {\n return this.environmentTexture;\n }\n public set reflectionTexture(value: CubeTexture | null) {\n this.environmentTexture = value;\n }\n\n /** @internal Bind resolved textures and synthesize the solid textures Babylon Lite's PBR pipeline requires from a factor-only material. */\n public override _ensureRenderable(engine: EngineContext): void {\n const lite = this._lite;\n // Bind a now-resolved albedo texture (Babylon.js `Texture`s load asynchronously,\n // so the Lite handle was undefined when `material.albedoTexture = …` ran). BJS\n // `PBRMaterial.albedoTexture` is sRGB/gamma space by default, so flag `gammaAlbedo`.\n const albedo = this._albedoTexture as { _lite?: Texture2D; gammaSpace?: boolean } | null;\n if (albedo?._lite) {\n lite.baseColorTexture = albedo._lite;\n lite.gammaAlbedo = albedo.gammaSpace ?? true;\n }\n // Babylon Lite's PBR pipeline samples baseColorTexture/ormTexture unconditionally,\n // so a factor-only Babylon.js PBR material (colours but no maps) must be backed by\n // 1×1 solid textures. Bake the factors into the textures and neutralize the factors\n // so each contribution is applied exactly once.\n if (!lite.baseColorTexture) {\n const f = lite.baseColorFactor ?? [1, 1, 1, 1];\n lite.baseColorTexture = createSolidTexture2D(engine, f[0], f[1], f[2], f[3]);\n lite.baseColorFactor = [1, 1, 1, 1];\n }\n if (!lite.ormTexture) {\n const rough = lite.roughnessFactor ?? 1;\n const metal = lite.metallicFactor ?? 1;\n lite.ormTexture = createSolidTexture2D(engine, 1, rough, metal);\n lite.roughnessFactor = 1;\n lite.metallicFactor = 1;\n }\n }\n}\n\n/**\n * Babylon.js `PBRMetallicRoughnessMaterial` — a simplified façade over\n * {@link PBRMaterial} exposing the metallic-roughness workflow directly.\n */\nexport class PBRMetallicRoughnessMaterial extends PBRMaterial {\n public override getClassName(): string {\n return \"PBRMetallicRoughnessMaterial\";\n }\n\n /** Alias of `albedoColor` (glTF \"base color\"). */\n public get baseColor(): Color3 {\n return this.albedoColor;\n }\n public set baseColor(value: Color3) {\n this.albedoColor = value;\n }\n}\n\n/**\n * Babylon.js `PBRSpecularGlossinessMaterial` — the spec/gloss workflow is\n * supported when loaded from glTF (`KHR_materials_pbrSpecularGlossiness`), but a\n * standalone manual spec/gloss material is not mapped onto Lite's metallic-roughness\n * PBR. The constructor builds a metallic-roughness PBR material and exposes a\n * `diffuseColor`/`glossiness` façade; results will not match BJS spec/gloss exactly.\n */\nexport class PBRSpecularGlossinessMaterial extends PBRMaterial {\n public override getClassName(): string {\n return \"PBRSpecularGlossinessMaterial\";\n }\n\n public get diffuseColor(): Color3 {\n return this.albedoColor;\n }\n public set diffuseColor(value: Color3) {\n this.albedoColor = value;\n }\n\n /** Maps glossiness → (1 - roughness). */\n public get glossiness(): number {\n return 1 - this.roughness;\n }\n public set glossiness(value: number) {\n this.roughness = 1 - value;\n }\n}\n","/**\n * Babylon.js-compatible `Animation` keyframe model + `AnimationGroup`.\n *\n * `Animation` is a pure-JS keyframe container with CPU evaluation (`evaluate`),\n * the Babylon.js data-type / loop-mode constants, and `setKeys`/`getKeys`. This\n * is fully testable without a GPU. `AnimationGroup` provides the structural\n * grouping/playback-state surface; frame-accurate playback is driven through the\n * native Babylon Lite animation manager when wired to a scene (not modelled here).\n */\n\nimport { goToFrame as liteGoToFrame, playAnimation, pauseAnimation, stopAnimation, setAnimationAdditive } from \"babylon-lite\";\nimport type { AnimationGroup as LiteAnimationGroup, EngineContext } from \"babylon-lite\";\n\nexport interface IAnimationKey {\n frame: number;\n value: number | number[];\n /** Babylon.js per-key interpolation hint (`AnimationKeyInterpolation`). */\n interpolation?: number;\n}\n\n/**\n * Babylon.js `AnimationKeyInterpolation` — how the segment starting at a key is\n * interpolated. `STEP` holds the key's value until the next key (no blend).\n */\nexport const AnimationKeyInterpolation = {\n NONE: 0,\n STEP: 1,\n} as const;\n\nexport const AnimationTypes = {\n ANIMATIONTYPE_FLOAT: 0,\n ANIMATIONTYPE_VECTOR3: 1,\n ANIMATIONTYPE_QUATERNION: 2,\n ANIMATIONTYPE_MATRIX: 3,\n ANIMATIONTYPE_COLOR3: 4,\n ANIMATIONTYPE_VECTOR2: 5,\n ANIMATIONTYPE_COLOR4: 6,\n} as const;\n\nexport const AnimationLoopModes = {\n ANIMATIONLOOPMODE_RELATIVE: 0,\n ANIMATIONLOOPMODE_CYCLE: 1,\n ANIMATIONLOOPMODE_CONSTANT: 2,\n} as const;\n\nexport class Animation {\n public static readonly ANIMATIONTYPE_FLOAT = AnimationTypes.ANIMATIONTYPE_FLOAT;\n public static readonly ANIMATIONTYPE_VECTOR3 = AnimationTypes.ANIMATIONTYPE_VECTOR3;\n public static readonly ANIMATIONTYPE_QUATERNION = AnimationTypes.ANIMATIONTYPE_QUATERNION;\n public static readonly ANIMATIONTYPE_MATRIX = AnimationTypes.ANIMATIONTYPE_MATRIX;\n public static readonly ANIMATIONTYPE_COLOR3 = AnimationTypes.ANIMATIONTYPE_COLOR3;\n public static readonly ANIMATIONLOOPMODE_RELATIVE = AnimationLoopModes.ANIMATIONLOOPMODE_RELATIVE;\n public static readonly ANIMATIONLOOPMODE_CYCLE = AnimationLoopModes.ANIMATIONLOOPMODE_CYCLE;\n public static readonly ANIMATIONLOOPMODE_CONSTANT = AnimationLoopModes.ANIMATIONLOOPMODE_CONSTANT;\n\n private _keys: IAnimationKey[] = [];\n\n public constructor(\n public name: string,\n public targetProperty: string,\n public framePerSecond: number,\n public dataType: number = AnimationTypes.ANIMATIONTYPE_FLOAT,\n public loopMode: number = AnimationLoopModes.ANIMATIONLOOPMODE_CYCLE\n ) {}\n\n public setKeys(keys: IAnimationKey[]): void {\n this._keys = keys.slice().sort((a, b) => a.frame - b.frame);\n }\n\n public getKeys(): IAnimationKey[] {\n return this._keys;\n }\n\n public getHighestFrame(): number {\n return this._keys.length > 0 ? this._keys[this._keys.length - 1]!.frame : 0;\n }\n\n /** Linearly evaluate the animated value at `frame` (clamped to the key range). */\n public evaluate(frame: number): number | number[] {\n const keys = this._keys;\n if (keys.length === 0) {\n return 0;\n }\n if (frame <= keys[0]!.frame) {\n return keys[0]!.value;\n }\n if (frame >= keys[keys.length - 1]!.frame) {\n return keys[keys.length - 1]!.value;\n }\n for (let i = 0; i < keys.length - 1; i++) {\n const a = keys[i]!;\n const b = keys[i + 1]!;\n // Half-open `[a, b)` so an exact key frame belongs to the segment it\n // starts (matters for STEP, where the value changes _at_ the next key).\n if (frame >= a.frame && frame < b.frame) {\n // Babylon.js `AnimationKeyInterpolation.STEP` holds the start key's\n // value across the whole segment (no blend to the next key).\n if (a.interpolation === AnimationKeyInterpolation.STEP) {\n return a.value;\n }\n const t = (frame - a.frame) / (b.frame - a.frame);\n return lerpValue(a.value, b.value, t);\n }\n }\n return keys[keys.length - 1]!.value;\n }\n\n /** Babylon.js helper: build a one-shot float animation between two values. */\n public static CreateAndStartAnimation(name: string, _target: unknown, targetProperty: string, framePerSecond: number, totalFrame: number, from: number, to: number): Animation {\n const anim = new Animation(name, targetProperty, framePerSecond);\n anim.setKeys([\n { frame: 0, value: from },\n { frame: totalFrame, value: to },\n ]);\n return anim;\n }\n}\n\nfunction lerpValue(a: number | number[], b: number | number[], t: number): number | number[] {\n if (typeof a === \"number\" && typeof b === \"number\") {\n return a + (b - a) * t;\n }\n const av = a as number[];\n const bv = b as number[];\n return av.map((value, i) => value + ((bv[i] ?? value) - value) * t);\n}\n\ntype AnimValue = number | number[];\n\nfunction scaleValue(value: AnimValue, scale: number): AnimValue {\n return typeof value === \"number\" ? value * scale : value.map((v) => v * scale);\n}\n\nfunction addValue(acc: AnimValue, value: AnimValue): AnimValue {\n if (typeof acc === \"number\" && typeof value === \"number\") {\n return acc + value;\n }\n const a = acc as number[];\n const v = value as number[];\n return a.map((x, i) => x + (v[i] ?? 0));\n}\n\nfunction zeroLike(value: AnimValue): AnimValue {\n return typeof value === \"number\" ? 0 : (value as number[]).map(() => 0);\n}\n\n/**\n * @internal Pre-animation baseline of each blended property, captured the first\n * time a structural group starts. Babylon.js mixes this \"original value\" back in\n * when a property's total animation weight is below 1 (so partially-weighted\n * blends settle toward the rest pose); keyed by target object → dotted path.\n */\nconst structuralOriginals = new WeakMap<object, Map<string, AnimValue>>();\n\nfunction readPath(target: object, path: string): AnimValue {\n const parts = path.split(\".\");\n let obj = target as Record<string, unknown>;\n for (let i = 0; i < parts.length - 1; i++) {\n const next = obj[parts[i]!];\n if (next == null) {\n return 0;\n }\n obj = next as Record<string, unknown>;\n }\n const leaf = obj[parts[parts.length - 1]!];\n return typeof leaf === \"number\" ? leaf : 0;\n}\n\nfunction captureOriginal(target: object, path: string): void {\n let perTarget = structuralOriginals.get(target);\n if (!perTarget) {\n perTarget = new Map();\n structuralOriginals.set(target, perTarget);\n }\n if (!perTarget.has(path)) {\n perTarget.set(path, readPath(target, path));\n }\n}\n\n/** @internal Assign an animated value to `target` following a dotted property path (e.g. `\"position.x\"`). */\nfunction applyAnimatedValue(target: unknown, path: string, value: number | number[]): void {\n const parts = path.split(\".\");\n let obj = target as Record<string, unknown>;\n for (let i = 0; i < parts.length - 1; i++) {\n const next = obj[parts[i]!];\n if (next == null) {\n return;\n }\n obj = next as Record<string, unknown>;\n }\n const leaf = parts[parts.length - 1]!;\n if (Array.isArray(value)) {\n const slot = obj[leaf] as { set?: (...n: number[]) => void } | undefined;\n if (slot && typeof slot.set === \"function\") {\n slot.set(...value);\n } else {\n obj[leaf] = value;\n }\n } else {\n obj[leaf] = value;\n }\n}\n\n/**\n * Babylon.js `Animatable` — a running animation on a target, driven per-frame on\n * the CPU by evaluating each `Animation`'s keyframes and writing the result onto\n * the target's (dotted) property path.\n */\nexport class Animatable {\n public masterFrame = 0;\n public speedRatio: number;\n private _paused = false;\n private _stopped = false;\n\n public constructor(\n private readonly _target: unknown,\n private readonly _animations: Animation[],\n private readonly _from: number,\n private readonly _to: number,\n private readonly _loop: boolean,\n speedRatio: number\n ) {\n this.speedRatio = speedRatio;\n this.masterFrame = _from;\n this._apply();\n }\n\n /** @internal Advance the animation by `deltaMs`, called once per scene frame. */\n public _tick(deltaMs: number): void {\n if (this._paused || this._stopped) {\n return;\n }\n const fps = this._animations[0]?.framePerSecond ?? 60;\n this.masterFrame += (deltaMs / 1000) * fps * this.speedRatio;\n if (this.masterFrame > this._to) {\n if (this._loop) {\n const span = this._to - this._from || 1;\n this.masterFrame = this._from + ((this.masterFrame - this._from) % span);\n } else {\n this.masterFrame = this._to;\n this._stopped = true;\n }\n }\n this._apply();\n }\n\n public goToFrame(frame: number): void {\n this.masterFrame = frame;\n this._apply();\n }\n\n public pause(): void {\n this._paused = true;\n }\n\n public restart(): void {\n this._paused = false;\n this._stopped = false;\n this.masterFrame = this._from;\n }\n\n public stop(): void {\n this._stopped = true;\n }\n\n public get animationStarted(): boolean {\n return !this._stopped;\n }\n\n private _apply(): void {\n for (const anim of this._animations) {\n applyAnimatedValue(this._target, anim.targetProperty, anim.evaluate(this.masterFrame));\n }\n }\n}\n\nexport type AnimationGroupState = \"init\" | \"playing\" | \"paused\" | \"stopped\";\n\n/**\n * @internal Surface a structural `AnimationGroup` needs from its host scene to be\n * stepped + weight-blended each frame. Typed structurally to avoid a Scene import\n * cycle.\n */\nexport interface StructuralAnimationHost {\n /** @internal Register a structural group to be stepped + blended each frame. */\n _registerStructuralGroup(group: AnimationGroup): void;\n /** @internal Re-run weighted blending across all structural groups. */\n _recomputeStructuralBlends(): void;\n}\n\n/**\n * @internal Surface a **loaded** glTF/.babylon `AnimationGroup` needs from its\n * host scene to enable Babylon Lite's weighted / additive skeletal blending.\n * Implemented structurally by the compat `Scene` to avoid an import cycle.\n */\nexport interface LoadedAnimationBlendHost {\n /**\n * @internal Route the scene's loaded Lite animation groups through a\n * scene-owned `AnimationManager` with blending enabled (idempotent).\n */\n _enableLoadedBlend(): void;\n}\n\n/**\n * Babylon.js `AnimationGroup` — a named collection of targeted animations with\n * playback state. This is the **single** `AnimationGroup` type, matching Babylon.js;\n * there is no separate \"loaded\" subtype. Two construction paths map onto Lite:\n *\n * - **Structural** (`new AnimationGroup(name, scene?)`): a CPU-side collection\n * built by ported code via `addTargetedAnimation`. When `start`ed it registers\n * with the scene and is stepped each frame on the CPU; multiple groups that\n * animate the same property are **weight-blended** (Babylon.js manual weighted\n * / cross-fade blending) before the result is written to the target.\n * - **Loaded** (`AnimationGroup._fromLite`, used to populate `scene.animationGroups`\n * from glTF / `.babylon` clips): a thin wrapper over a Babylon Lite loaded group.\n * The playback methods (`goToFrame`/`play`/`pause`/`stop`/`reset`) and the\n * `from`/`to`/`isPlaying`/`speedRatio`/`loopAnimation`/`weight`/`animatables`\n * accessors delegate to the Lite group so ported scenes can freeze/seek a\n * loaded animation at a deterministic frame.\n */\nexport class AnimationGroup {\n public readonly targetedAnimations: Array<{ animation: Animation; target: unknown }> = [];\n public onAnimationGroupEndObservable?: () => void;\n\n /** @internal Babylon Lite loaded-group backing (set only on the loaded path). */\n public _lite?: LiteAnimationGroup;\n /** @internal Engine context used to drive Lite-backed playback. */\n private _engine?: EngineContext;\n /** @internal Host scene that owns the loaded-group blend manager (loaded path). */\n private _blendHost?: LoadedAnimationBlendHost;\n\n private _from = 0;\n private _to = 0;\n private _state: AnimationGroupState = \"init\";\n private _speedRatio = 1;\n private _loopAnimation = false;\n /** @internal Blend weight for the structural path (loaded path reads `_lite.weight`). */\n private _weight = 1;\n /** @internal Current frame for the structural path. */\n private _currentFrame = 0;\n /** @internal Host scene that steps + blends this structural group each frame. */\n private readonly _host?: StructuralAnimationHost;\n\n public constructor(\n public name: string,\n scene?: unknown\n ) {\n this._host = (scene as StructuralAnimationHost | undefined) ?? undefined;\n }\n\n /** @internal Build an `AnimationGroup` backed by a Babylon Lite loaded group. */\n public static _fromLite(lite: LiteAnimationGroup, engine: EngineContext, blendHost?: LoadedAnimationBlendHost): AnimationGroup {\n const group = new AnimationGroup(lite.name);\n group._lite = lite;\n group._engine = engine;\n group._blendHost = blendHost;\n return group;\n }\n\n /**\n * Babylon.js `AnimationGroup.MakeAnimationAdditive(group)` — convert a loaded\n * group into an additive layer (reference frame 0) and enable the scene's\n * weighted-blend manager. Returns the same group (Babylon Lite mutates in\n * place rather than cloning).\n */\n public static MakeAnimationAdditive(group: AnimationGroup): AnimationGroup {\n if (group._lite) {\n setAnimationAdditive(group._lite, { referenceFrame: 0 });\n group._blendHost?._enableLoadedBlend();\n }\n return group;\n }\n\n /** First frame of the clip. Always 0 for loaded clips. */\n public get from(): number {\n return this._lite ? 0 : this._from;\n }\n\n /** Last frame of the clip. */\n public get to(): number {\n return this._lite ? this._lite.duration * (this._lite.frameRate ?? 60) : this._to;\n }\n\n public get isPlaying(): boolean {\n return this._lite ? this._lite.isPlaying : this._state === \"playing\";\n }\n\n public get state(): AnimationGroupState {\n if (this._lite) {\n return this._lite.isPlaying ? \"playing\" : \"paused\";\n }\n return this._state;\n }\n\n public get speedRatio(): number {\n return this._lite ? this._lite.speedRatio : this._speedRatio;\n }\n public set speedRatio(value: number) {\n if (this._lite) {\n this._lite.speedRatio = value;\n } else {\n this._speedRatio = value;\n }\n }\n\n public get loopAnimation(): boolean {\n return this._lite ? this._lite.loopAnimation : this._loopAnimation;\n }\n public set loopAnimation(value: boolean) {\n if (this._lite) {\n this._lite.loopAnimation = value;\n } else {\n this._loopAnimation = value;\n }\n }\n\n public get weight(): number {\n return this._lite ? this._lite.weight : this._weight;\n }\n public set weight(value: number) {\n if (this._lite) {\n this._lite.weight = value;\n // A non-unit weight on a loaded clip means the scene must blend its\n // groups (Babylon.js manual weighted blend). Enable the scene's\n // weighted-blend manager (idempotent; no-op for the default weight 1).\n if (value !== 1) {\n this._blendHost?._enableLoadedBlend();\n }\n } else {\n this._weight = value;\n this._host?._recomputeStructuralBlends();\n }\n }\n\n /**\n * Babylon.js `AnimationGroup.animatables`. For loaded groups Babylon Lite drives\n * the whole group as one unit, so this surfaces a single animatable whose\n * `masterFrame` reflects the group's current frame. Structural groups built\n * without a running scene report no animatables.\n */\n public get animatables(): Array<{ masterFrame: number }> {\n if (this._lite) {\n const frameRate = this._lite.frameRate ?? 60;\n return [{ masterFrame: this._lite.currentTime * frameRate }];\n }\n return [];\n }\n\n public addTargetedAnimation(animation: Animation, target: unknown): { animation: Animation; target: unknown } {\n const entry = { animation, target };\n this.targetedAnimations.push(entry);\n this._from = Math.min(this._from, 0);\n this._to = Math.max(this._to, animation.getHighestFrame());\n return entry;\n }\n\n /**\n * Babylon.js `start(loop?, speedRatio?, from?, to?)`. On the structural path this\n * registers the group with its host scene, captures the targets' rest-pose\n * baselines, and begins CPU stepping + weight blending. On the loaded path it\n * seeks to `from` and plays — except a zero-length range (`from === to`) is a\n * **held single-frame pose** (e.g. an additive pose layer), which must hold\n * rather than play: Babylon Lite's group advance ignores the BJS play range and\n * would otherwise loop the (often ~2-frame) pose clip every frame, flickering.\n */\n public start(loop = true, speedRatio = 1, from?: number, to?: number): this {\n if (this._lite) {\n const frameRate = this._lite.frameRate ?? 60;\n if (from !== undefined) {\n this._lite.currentTime = from / frameRate;\n }\n this._lite.speedRatio = speedRatio;\n this._lite.loopAnimation = loop;\n if (from !== undefined && to !== undefined && from === to) {\n // Held single-frame pose — seek and hold (do not advance/loop).\n // `play` then `pause` clears Lite's internal `_stopped` flag (set by a\n // prior `stop()`) while leaving the clip paused, so the weighted mixer\n // still includes this group (a `_stopped` group is excluded from\n // blending, which would drop the whole shared-skeleton blend).\n playAnimation(this._lite);\n pauseAnimation(this._lite);\n return this;\n }\n return this.play(loop);\n }\n this._loopAnimation = loop;\n this._speedRatio = speedRatio;\n if (from !== undefined) {\n this._from = from;\n }\n if (to !== undefined) {\n this._to = to;\n }\n this._currentFrame = this._from;\n this._state = \"playing\";\n for (const { target, animation } of this.targetedAnimations) {\n captureOriginal(target as object, animation.targetProperty);\n }\n this._host?._registerStructuralGroup(this);\n this._host?._recomputeStructuralBlends();\n return this;\n }\n\n /** Babylon.js `goToFrame(frame)` — seek to a frame (loaded groups seek + hold via Lite; structural groups re-blend). */\n public goToFrame(frame: number): this {\n if (this._lite && this._engine) {\n liteGoToFrame(this._lite, frame, this._engine);\n } else {\n this._currentFrame = frame;\n this._host?._recomputeStructuralBlends();\n }\n return this;\n }\n\n public play(loop?: boolean): this {\n if (this._lite) {\n if (loop !== undefined) {\n this._lite.loopAnimation = loop;\n }\n playAnimation(this._lite);\n } else {\n this._state = \"playing\";\n }\n return this;\n }\n\n public pause(): this {\n if (this._lite) {\n pauseAnimation(this._lite);\n } else {\n this._state = \"paused\";\n }\n return this;\n }\n\n public stop(): this {\n if (this._lite) {\n stopAnimation(this._lite);\n } else {\n this._state = \"stopped\";\n }\n return this;\n }\n\n public reset(): this {\n if (this._lite && this._engine) {\n liteGoToFrame(this._lite, 0, this._engine);\n } else {\n this._state = \"init\";\n }\n return this;\n }\n\n /** @internal Whether this structural group currently contributes to blending (started, not stopped). */\n public _isStructuralActive(): boolean {\n return !this._lite && (this._state === \"playing\" || this._state === \"paused\");\n }\n\n /** @internal Advance a playing structural group's frame by `deltaMs` (with loop wrap). */\n public _advanceStructural(deltaMs: number): void {\n if (this._lite || this._state !== \"playing\") {\n return;\n }\n const fps = this.targetedAnimations[0]?.animation.framePerSecond ?? 60;\n this._currentFrame += (deltaMs / 1000) * fps * this._speedRatio;\n if (this._currentFrame > this._to) {\n if (this._loopAnimation) {\n const span = this._to - this._from || 1;\n this._currentFrame = this._from + ((this._currentFrame - this._from) % span);\n } else {\n this._currentFrame = this._to;\n this._state = \"stopped\";\n }\n }\n }\n\n /**\n * @internal Babylon.js manual weighted / cross-fade blending. Groups of\n * animations targeting the same (target, property) are mixed by weight: when\n * the total weight exceeds 1 the contributions are normalized, and when it is\n * below 1 the property's captured rest-pose baseline fills the remainder.\n */\n public static _blendStructuralGroups(groups: readonly AnimationGroup[]): void {\n interface Holder {\n target: object;\n path: string;\n total: number;\n contributions: Array<{ value: AnimValue; weight: number }>;\n }\n const holders = new Map<object, Map<string, Holder>>();\n for (const group of groups) {\n if (!group._isStructuralActive()) {\n continue;\n }\n const weight = group._weight;\n for (const { target, animation } of group.targetedAnimations) {\n const obj = target as object;\n const path = animation.targetProperty;\n const value = animation.evaluate(group._currentFrame);\n let perTarget = holders.get(obj);\n if (!perTarget) {\n perTarget = new Map();\n holders.set(obj, perTarget);\n }\n let holder = perTarget.get(path);\n if (!holder) {\n holder = { target: obj, path, total: 0, contributions: [] };\n perTarget.set(path, holder);\n }\n holder.total += weight;\n holder.contributions.push({ value, weight });\n }\n }\n for (const perTarget of holders.values()) {\n for (const holder of perTarget.values()) {\n const original = structuralOriginals.get(holder.target)?.get(holder.path) ?? 0;\n let final: AnimValue;\n if (holder.total === 0) {\n final = original;\n } else {\n let normalizer = 1;\n if (holder.total < 1) {\n final = scaleValue(original, 1 - holder.total);\n } else {\n normalizer = holder.total;\n final = zeroLike(holder.contributions[0]!.value);\n }\n for (const c of holder.contributions) {\n final = addValue(final, scaleValue(c.value, c.weight / normalizer));\n }\n }\n applyAnimatedValue(holder.target, holder.path, final);\n }\n }\n }\n}\n","/**\n * Babylon.js-compatible `Scene` implemented over a Babylon Lite `SceneContext`.\n *\n * The wrapper owns a Lite `SceneContext` (`_lite`) and proxies the common\n * Babylon.js scene surface: `clearColor`, `activeCamera`, the before/after-render\n * observables, default camera creation, and disposal. Entities created by the\n * compat light/camera/mesh wrappers register themselves against `_lite`.\n *\n * `scene.render()` is a no-op: Babylon Lite drives rendering through the engine's\n * loop (`runRenderLoop` / `startEngine`). Manual single-frame rendering is not\n * supported in this compat layer.\n */\n\nimport {\n createSceneContext,\n disposeScene,\n onBeforeRender,\n createDefaultCamera as liteCreateDefaultCamera,\n setFog,\n setClipPlane,\n loadEnvironment,\n loadDdsEnvironment,\n createHemisphericLight,\n addToScene,\n createAnimationManager,\n addAnimationGroup,\n enableAnimationBlending,\n updateAnimationManager,\n} from \"babylon-lite\";\nimport type { SceneContext, Camera as LiteCamera, ArcRotateCamera as LiteArcRotateCamera, FreeCamera as LiteFreeCamera, AnimationManager } from \"babylon-lite\";\n\nimport { Color3, Color4 } from \"../math/color.js\";\nimport type { Plane } from \"../math/plane.js\";\nimport { unsupported } from \"../error.js\";\nimport { Observable } from \"../misc/observable.js\";\nimport type { Camera } from \"../cameras/cameras.js\";\nimport { ArcRotateCamera, FreeCamera } from \"../cameras/cameras.js\";\nimport { StandardMaterial } from \"../materials/materials.js\";\nimport { Animatable } from \"../animations/animation.js\";\nimport type { Animation } from \"../animations/animation.js\";\nimport { AnimationGroup } from \"../animations/animation.js\";\nimport type { CubeTexture } from \"../textures/textures.js\";\nimport type { WebGPUEngine } from \"../engine/engine.js\";\nimport { AbstractScene } from \"./abstract-scene.js\";\n\n/** Babylon.js EnvironmentHelper default skybox/ground/BRDF assets (match the Lite ports). */\nconst DEFAULT_SKYBOX_URL = \"https://assets.babylonjs.com/core/environments/backgroundSkybox.dds\";\nconst DEFAULT_GROUND_URL = \"https://assets.babylonjs.com/core/environments/backgroundGround.png\";\nconst DEFAULT_BRDF_URL = \"/brdf-lut.png\";\n/** Babylon.js `createDefaultEnvironment` IBL fallback when no `environmentTexture` is set. */\nconst DEFAULT_ENV_URL = \"https://assets.babylonjs.com/environments/environmentSpecular.env\";\n\ninterface DefaultEnvironmentOptions {\n createSkybox?: boolean;\n createGround?: boolean;\n skyboxSize?: number;\n /** Babylon.js EnvironmentHelper: set up tone mapping / exposure / contrast (default true). */\n setupImageProcessing?: boolean;\n /** Babylon.js EnvironmentHelper camera exposure (default 0.8). */\n cameraExposure?: number;\n /** Babylon.js EnvironmentHelper camera contrast (default 1.2). */\n cameraContrast?: number;\n /** Babylon.js EnvironmentHelper tone-mapping toggle (default true). */\n toneMappingEnabled?: boolean;\n /** @internal When set, the skybox is the environment texture itself (Babylon.js `createDefaultSkybox`). */\n skyboxFromEnv?: boolean;\n /** @internal Apply EnvironmentHelper image processing (only set by `createDefaultEnvironment`). */\n applyImageProcessing?: boolean;\n}\n\n/**\n * Minimal `SceneContext` stand-in for a headless ({@link NullEngine}) scene, which\n * has no Lite GPU context. It satisfies only the plain data accessors a deviceless\n * scene may touch (`clearColor` / `camera` / `imageProcessing` / `animationGroups`);\n * no Lite scene method is ever invoked on it.\n */\nfunction createHeadlessLite(): SceneContext {\n return {\n clearColor: { r: 0, g: 0, b: 0, a: 1 },\n camera: null,\n imageProcessing: { exposure: 1, contrast: 1, toneMappingEnabled: false },\n animationGroups: [],\n } as unknown as SceneContext;\n}\n\nexport class Scene extends AbstractScene {\n /** @internal Underlying Babylon Lite scene context. */\n public readonly _lite: SceneContext;\n\n /** Babylon.js fog-mode constants. */\n public static readonly FOGMODE_NONE = 0;\n public static readonly FOGMODE_EXP = 1;\n public static readonly FOGMODE_EXP2 = 2;\n public static readonly FOGMODE_LINEAR = 3;\n\n /** Fires before each scene render (wired to Lite's before-render hook). */\n public readonly onBeforeRenderObservable = new Observable<Scene>();\n /** Fires before animations are evaluated each frame (used by ported cross-fade drivers). */\n public readonly onBeforeAnimationsObservable = new Observable<Scene>();\n /** Fires after each scene render. */\n public readonly onAfterRenderObservable = new Observable<Scene>();\n /** Fires once when the scene is disposed. */\n public readonly onDisposeObservable = new Observable<Scene>();\n\n /**\n * Babylon.js `scene.animationGroups` / `scene.animatables`. Loaded glTF /\n * `.babylon` animation clips live on the Lite scene; `animationGroups` returns\n * BJS-shaped `AnimationGroup`s over them (so scenes can `goToFrame`/`pause`/`stop`\n * to freeze a model at a deterministic frame). `animatables` surfaces the running\n * CPU `Animatable`s started via `beginDirectAnimation`.\n */\n public get animationGroups(): AnimationGroup[] {\n const liteGroups = this._lite.animationGroups ?? [];\n return liteGroups.map((g) => {\n let wrapper = this._animationGroupCache.get(g);\n if (!wrapper) {\n wrapper = AnimationGroup._fromLite(g, this._engine._lite, this);\n this._animationGroupCache.set(g, wrapper);\n }\n return wrapper;\n });\n }\n\n /** Babylon.js `scene.getAnimationGroupByName(name)` — first loaded animation group with a matching name, else `null`. */\n public getAnimationGroupByName(name: string): AnimationGroup | null {\n return this.animationGroups.find((g) => g.name === name) ?? null;\n }\n\n public get animatables(): Animatable[] {\n return this._runningAnimatables;\n }\n\n private readonly _engine: WebGPUEngine;\n private _activeCamera: Camera | null = null;\n private _defaultMaterial: StandardMaterial | null = null;\n private _fogMode = 0;\n private _fogStart = 0;\n private _fogEnd = 1000;\n private _fogDensity = 0.1;\n private _fogColor = new Color3(0.2, 0.2, 0.3);\n /**\n * @internal Mesh scene-adds deferred until the engine starts. Babylon Lite\n * locks a mesh into a render group (standard vs PBR) at `addToScene` time by\n * reading its material, whereas Babylon.js code routinely creates a mesh and\n * assigns `mesh.material` a line later. Deferring the add until engine start\n * lets those assignments settle so the mesh lands in the correct group.\n */\n private readonly _pendingAdds: Array<() => void> = [];\n private _started = false;\n private _envTexture: CubeTexture | null = null;\n private _defaultEnvOptions: DefaultEnvironmentOptions | null = null;\n private readonly _shadowGenerators: Array<{ _build(engine: import(\"babylon-lite\").EngineContext): void; _liteGen?: unknown }> = [];\n private readonly _pendingTextures: Array<Promise<void>> = [];\n private readonly _pendingGroundBakes: Array<() => void> = [];\n private readonly _pendingMorphBuilds: Array<{ mesh: { _lite: unknown }; manager: { _build(mesh: never, engine: import(\"babylon-lite\").EngineContext): void } }> = [];\n private readonly _runningAnimatables: Animatable[] = [];\n private readonly _animationGroupCache = new WeakMap<object, AnimationGroup>();\n /** @internal Structural `AnimationGroup`s stepped + weight-blended each frame. */\n private readonly _structuralGroups: AnimationGroup[] = [];\n /** @internal Lite manager that weight/additive-blends loaded glTF groups (lazily created). */\n private _blendManager: AnimationManager | null = null;\n private _ambientColor = new Color3(0, 0, 0);\n private _environmentIntensity = 1;\n /** @internal Whether this scene is bound to a headless `NullEngine` (no GPU context). */\n private _headless = false;\n /** @internal Tracks whether at least one frame has ticked (gates `onAfterRenderObservable`). */\n private _renderedAFrame = false;\n /** @internal `NodeMaterial`s whose async parse the engine drives after shadow generators are built. */\n private readonly _nodeMaterials: Array<{ _parse(engine: import(\"babylon-lite\").EngineContext, shadowGenerators: readonly unknown[]): Promise<void> }> = [];\n\n /** @internal Process-unique scene-id source (Babylon.js `scene.uniqueId` / `getUniqueId()`). */\n private static _uidCounter = 0;\n /** Babylon.js `scene.uniqueId` — a process-unique numeric id. */\n public readonly uniqueId = ++Scene._uidCounter;\n\n public constructor(engine: WebGPUEngine) {\n super();\n this._engine = engine;\n if (engine._headless) {\n // Headless (`NullEngine`): no Lite scene context — the engine drives a\n // pure-JS tick loop (see `NullEngine.runRenderLoop`) that calls `_tick`.\n // Only the deviceless surface (CPU animations, manual canvas drawing)\n // works; there is no GPU rendering. The stub `_lite` satisfies the few\n // plain accessors a headless scene may touch (camera / clearColor / …).\n this._headless = true;\n this._lite = createHeadlessLite();\n engine._registerScene(this);\n return;\n }\n this._lite = createSceneContext(engine._lite);\n // Babylon Lite exposes a before-render hook but no after-render hook. We\n // fire `onBeforeRenderObservable` on each tick, and approximate\n // `onAfterRenderObservable` by firing it at the start of the *next* tick\n // (i.e. after the previous frame has rendered). `addOnce` after-render\n // listeners therefore resolve one frame later than they would in BJS.\n onBeforeRender(this._lite, (deltaMs: number) => this._tick(deltaMs));\n engine._registerScene(this);\n }\n\n /**\n * @internal Per-frame update: advance CPU animations and fire the render\n * observables. Driven by Babylon Lite's before-render hook for GPU engines, or\n * by the `NullEngine` `requestAnimationFrame` loop for headless engines.\n */\n public _tick(deltaMs: number): void {\n // Record the frame delta so `engine.getDeltaTime()` (read inside before-render\n // observers) reflects the current frame.\n this._engine._lastDeltaMs = deltaMs;\n this.onBeforeAnimationsObservable.notifyObservers(this);\n if (this._blendManager) {\n updateAnimationManager(this._blendManager, deltaMs);\n }\n for (const a of this._runningAnimatables) {\n a._tick(deltaMs);\n }\n if (this._structuralGroups.length > 0) {\n for (const g of this._structuralGroups) {\n g._advanceStructural(deltaMs);\n }\n AnimationGroup._blendStructuralGroups(this._structuralGroups);\n }\n if (this._renderedAFrame) {\n this.onAfterRenderObservable.notifyObservers(this);\n }\n this._renderedAFrame = true;\n this.onBeforeRenderObservable.notifyObservers(this);\n }\n\n public getEngine(): WebGPUEngine {\n return this._engine;\n }\n\n /** Babylon.js `scene.getClassName()`. */\n public getClassName(): string {\n return \"Scene\";\n }\n\n /** Babylon.js `scene.getUniqueId()` — the process-unique scene id. */\n public getUniqueId(): number {\n return this.uniqueId;\n }\n\n /**\n * @internal Add a mesh to the Lite scene, deferring until engine start if the\n * engine has not started yet (so a later `mesh.material = …` is captured in the\n * correct render group). After start, adds happen immediately and Lite's\n * material-swap path handles re-routing.\n */\n public _deferAdd(add: () => void): void {\n if (this._started) {\n add();\n } else {\n this._pendingAdds.push(add);\n }\n }\n\n /** @internal Flush deferred mesh adds. Called by the engine just before `registerScene`. */\n public _flushPendingAdds(): void {\n this._started = true;\n for (const add of this._pendingAdds) {\n add();\n }\n this._pendingAdds.length = 0;\n }\n\n /** @internal Register a compat `ShadowGenerator` to be built at engine start. */\n public _registerShadowGenerator(gen: { _build(engine: import(\"babylon-lite\").EngineContext): void }): void {\n this._shadowGenerators.push(gen);\n }\n\n /** @internal Track an async texture load so the engine can await it before building the scene. */\n public _trackTextureLoad(promise: Promise<void>): void {\n this._pendingTextures.push(promise);\n }\n\n /** @internal Await all in-flight texture loads (so material maps are GPU-ready at build). */\n public async _awaitPendingTextures(): Promise<void> {\n if (this._pendingTextures.length > 0) {\n await Promise.all(this._pendingTextures);\n this._pendingTextures.length = 0;\n }\n }\n\n /**\n * @internal Register a deferred ground-UV bake (for `CreateGroundFromHeightMap` with a\n * PBR `albedoTexture` whose `uScale`/`vScale` tiling must be baked into the geometry,\n * since Babylon Lite's PBR pipeline has no material-level UV scale). Run by\n * {@link _bakeGroundUvs} after textures load, so the material's `albedoTexture` (assigned\n * by user code after the heightmap resolves) is in place and its tiling is read correctly.\n */\n public _registerGroundUvBake(bake: () => void): void {\n this._pendingGroundBakes.push(bake);\n }\n\n /** @internal Run deferred ground-UV bakes. Called by the engine after `_awaitPendingTextures`. */\n public _bakeGroundUvs(): void {\n for (const bake of this._pendingGroundBakes) {\n bake();\n }\n this._pendingGroundBakes.length = 0;\n }\n\n /**\n * @internal Register a mesh's compat `MorphTargetManager` to be built at engine\n * start. Building is deferred so the mesh's base CPU geometry (set by primitive\n * builders / `VertexData.applyToMesh`) exists when per-target deltas are computed.\n */\n public _registerMorphTargetManager(mesh: { _lite: unknown }, manager: { _build(mesh: never, engine: import(\"babylon-lite\").EngineContext): void }): void {\n this._pendingMorphBuilds.push({ mesh, manager });\n }\n\n /** @internal Build all registered morph-target managers. Called by the engine before registration. */\n public _buildMorphTargets(): void {\n const engine = this._engine._lite;\n for (const { mesh, manager } of this._pendingMorphBuilds) {\n manager._build(mesh as never, engine);\n }\n this._pendingMorphBuilds.length = 0;\n }\n\n /** @internal Whether any shadow generator is present (engine uses shadow-aware registration). */\n public _hasShadows(): boolean {\n return this._shadowGenerators.length > 0;\n }\n\n /** @internal Build all registered shadow generators. Called after meshes are added. */\n public _buildShadowGenerators(): void {\n const engine = this._engine._lite;\n for (const gen of this._shadowGenerators) {\n gen._build(engine);\n }\n }\n\n /** @internal Register a `NodeMaterial` whose parse the engine drives after shadow build. */\n public _registerNodeMaterial(material: { _parse(engine: import(\"babylon-lite\").EngineContext, shadowGenerators: readonly unknown[]): Promise<void> }): void {\n this._nodeMaterials.push(material);\n }\n\n /**\n * @internal Parse all registered `NodeMaterial`s, passing the scene's built Lite\n * shadow generators so NME shadow-receiver blocks sample them (Babylon.js wires\n * shadows into the scene globally; Babylon Lite takes them at NME parse time).\n * Must run after `_buildShadowGenerators` so the Lite generators exist.\n */\n public async _parseNodeMaterials(): Promise<void> {\n if (this._nodeMaterials.length === 0) {\n return;\n }\n const engine = this._engine._lite;\n const liteGens = this._shadowGenerators.map((g) => g._liteGen).filter((g): g is unknown => g !== undefined);\n await Promise.all(this._nodeMaterials.map((m) => m._parse(engine, liteGens)));\n this._nodeMaterials.length = 0;\n }\n\n /**\n * Babylon.js `scene.defaultMaterial` — a shared `StandardMaterial` applied to\n * meshes that have no material assigned. Babylon Lite requires every mesh to\n * carry a material to render, so the mesh wrappers assign this lazily-created\n * default; reading it (or assigning a replacement) matches Babylon.js.\n */\n public get defaultMaterial(): StandardMaterial {\n if (!this._defaultMaterial) {\n this._defaultMaterial = new StandardMaterial(\"default material\", this);\n }\n return this._defaultMaterial;\n }\n public set defaultMaterial(value: StandardMaterial) {\n this._defaultMaterial = value;\n }\n\n public get clearColor(): Color4 {\n const c = this._lite.clearColor;\n return new Color4(c.r, c.g, c.b, c.a ?? 1);\n }\n public set clearColor(value: Color4) {\n // Babylon.js accepts a `Color3` here (alpha defaults to 1). A `Color3` has no\n // `a`, which would otherwise reach WebGPU's render pass as `undefined`.\n this._lite.clearColor = { r: value.r, g: value.g, b: value.b, a: value.a ?? 1 };\n }\n\n public get activeCamera(): Camera | null {\n return this._activeCamera;\n }\n public set activeCamera(camera: Camera | null) {\n this._activeCamera = camera;\n this._lite.camera = (camera?._lite as LiteCamera | undefined) ?? null;\n }\n\n /**\n * @internal Surface a camera parsed from a loaded asset (`.babylon` files carry\n * their own camera) as the compat `scene.activeCamera`. Babylon Lite's\n * `addToScene` sets `scene._lite.camera` from the asset, but the compat scene\n * only tracks cameras created through the wrapper classes — so after a load with\n * no explicit camera we wrap the Lite one here. Loaded `.babylon` cameras are\n * always free cameras (see `parseBabylonCamera`).\n */\n public _surfaceLoadedCamera(): void {\n if (this._activeCamera || !this._lite.camera) {\n return;\n }\n FreeCamera._adopt(\"camera\", this._lite.camera as LiteFreeCamera, this);\n }\n\n /** Image-processing exposure proxy (Babylon.js `imageProcessingConfiguration.exposure`). */\n public get imageProcessingConfiguration(): { exposure: number; contrast: number; toneMappingEnabled: boolean } {\n return this._lite.imageProcessing;\n }\n\n /** Babylon.js `scene.performancePriority` — accepted for parity; Babylon Lite tunes its own pipeline. */\n public performancePriority = 0;\n\n /**\n * Babylon.js `scene.ambientColor` — the scene-wide ambient term multiplied into\n * each material's ambient contribution. Babylon Lite bakes ambient at the\n * material level (the `.babylon` loader folds `scene.ambientColor` into each\n * material), so this is stored for parity; the BJS default `(0,0,0)` is a no-op.\n */\n public get ambientColor(): Color3 {\n return this._ambientColor;\n }\n public set ambientColor(value: Color3) {\n this._ambientColor = value;\n }\n\n /**\n * Babylon.js `scene.environmentIntensity` — a global multiplier on IBL\n * contribution. Babylon Lite applies environment intensity per PBR material;\n * this is stored for parity (the BJS default `1` is a no-op).\n */\n public get environmentIntensity(): number {\n return this._environmentIntensity;\n }\n public set environmentIntensity(value: number) {\n this._environmentIntensity = value;\n }\n\n /**\n * Babylon.js `scene.useRightHandedSystem`. Babylon Lite's coordinate system is\n * fixed; this is stored for parity (the BJS WebGPU default is left-handed —\n * `false` — so the common case is a no-op).\n */\n public useRightHandedSystem = false;\n\n /** Babylon.js `scene.registerBeforeRender(cb)` — convenience over `onBeforeRenderObservable`. */\n public registerBeforeRender(callback: () => void): void {\n this.onBeforeRenderObservable.add(callback);\n }\n\n /** Babylon.js `scene.unregisterBeforeRender(cb)`. */\n public unregisterBeforeRender(callback: () => void): void {\n this.onBeforeRenderObservable.removeCallback(callback);\n }\n\n /** Babylon.js `scene.registerAfterRender(cb)` — convenience over `onAfterRenderObservable`. */\n public registerAfterRender(callback: () => void): void {\n this.onAfterRenderObservable.add(callback);\n }\n\n /** Babylon.js `scene.unregisterAfterRender(cb)`. */\n public unregisterAfterRender(callback: () => void): void {\n this.onAfterRenderObservable.removeCallback(callback);\n }\n\n /** Babylon.js `scene.attachControl` — camera input is attached per-camera in the compat layer; no-op. */\n public attachControl(_attachUp?: boolean, _attachDown?: boolean, _attachMove?: boolean): void {\n // Camera control is wired through `camera.attachControl(canvas)`.\n }\n\n /** Babylon.js `scene.detachControl` — no-op (see {@link attachControl}). */\n public detachControl(): void {\n // No-op.\n }\n\n // ── Fog (Babylon.js `scene.fogMode/fogStart/fogEnd/fogDensity/fogColor`) ──\n\n public get fogMode(): number {\n return this._fogMode;\n }\n public set fogMode(value: number) {\n this._fogMode = value;\n this._applyFog();\n }\n\n public get fogStart(): number {\n return this._fogStart;\n }\n public set fogStart(value: number) {\n this._fogStart = value;\n this._applyFog();\n }\n\n public get fogEnd(): number {\n return this._fogEnd;\n }\n public set fogEnd(value: number) {\n this._fogEnd = value;\n this._applyFog();\n }\n\n public get fogDensity(): number {\n return this._fogDensity;\n }\n public set fogDensity(value: number) {\n this._fogDensity = value;\n this._applyFog();\n }\n\n public get fogColor(): Color3 {\n return this._fogColor;\n }\n public set fogColor(value: Color3) {\n this._fogColor = value;\n this._applyFog();\n }\n\n /** @internal Push the current fog config into the Lite scene UBO. */\n private _applyFog(): void {\n setFog(this._lite, {\n mode: this._fogMode as 0 | 1 | 2 | 3,\n density: this._fogDensity,\n start: this._fogStart,\n end: this._fogEnd,\n color: [this._fogColor.r, this._fogColor.g, this._fogColor.b],\n });\n }\n\n // ── Clip plane (Babylon.js `scene.clipPlane`) ──\n\n private _clipPlane: Plane | null = null;\n\n /**\n * Babylon.js `scene.clipPlane` — a single world-space clip plane\n * (`normal · p + d = 0`); fragments on the negative side are discarded.\n * Routed to Babylon Lite's opt-in `setClipPlane`.\n */\n public get clipPlane(): Plane | null {\n return this._clipPlane;\n }\n public set clipPlane(value: Plane | null) {\n this._clipPlane = value;\n if (value) {\n setClipPlane(this._lite, [value.normal.x, value.normal.y, value.normal.z, value.d]);\n } else {\n setClipPlane(this._lite, [0, 0, 0, 0]);\n }\n }\n\n // ── Environment / IBL (Babylon.js `scene.environmentTexture` + `createDefaultEnvironment`) ──\n\n public get environmentTexture(): CubeTexture | null {\n return this._envTexture;\n }\n public set environmentTexture(value: CubeTexture | null) {\n this._envTexture = value;\n }\n\n /**\n * Babylon.js `scene.createDefaultEnvironment` — adds an IBL skybox and ground.\n * Babylon Lite performs this through `loadEnvironment` (deferred to engine start),\n * combining the environment URL recorded via `scene.environmentTexture` with\n * Babylon.js's default skybox/ground assets.\n */\n public createDefaultEnvironment(options: DefaultEnvironmentOptions = {}): { dispose(): void } {\n this._defaultEnvOptions = {\n createSkybox: true,\n createGround: true,\n ...options,\n // Babylon.js EnvironmentHelper sets up image processing by default.\n applyImageProcessing: options.setupImageProcessing !== false,\n };\n return { dispose(): void {} };\n }\n\n /**\n * Babylon.js `scene.createDefaultSkybox(texture, pbr?, scale?, blur?, setGlobalEnv?)` —\n * adds a skybox built from the given environment texture. Babylon Lite reuses the\n * loaded `.env` specular cubemap as an HDR skybox, so this records the env URL (if\n * not already set) and flags a skybox-from-environment load at engine start.\n */\n public createDefaultSkybox(texture?: CubeTexture, _pbr?: boolean, scale?: number, _blur?: number, _setGlobalEnv?: boolean): { dispose(): void } {\n if (texture) {\n this._envTexture = texture;\n }\n this._defaultEnvOptions = {\n ...(this._defaultEnvOptions ?? {}),\n createSkybox: true,\n createGround: false,\n skyboxFromEnv: true,\n ...(scale !== undefined ? { skyboxSize: scale } : {}),\n };\n return { dispose(): void {} };\n }\n\n /**\n * @internal Load the pending environment (IBL + skybox/ground) into the Lite\n * scene. Awaited by the engine before `registerScene` so the GPU env textures\n * exist when the scene builds.\n */\n public async _loadPendingEnvironment(): Promise<void> {\n // Babylon.js `createDefaultEnvironment` lights the scene from a built-in\n // environment even when no `environmentTexture` is assigned; fall back to\n // the default specular env so IBL-only scenes are lit correctly.\n const envUrl = this._envTexture?.url ?? (this._defaultEnvOptions ? DEFAULT_ENV_URL : undefined);\n if (!envUrl) {\n return;\n }\n const opts = this._defaultEnvOptions;\n const skyboxUrl = opts?.skyboxFromEnv ? envUrl : opts?.createSkybox ? DEFAULT_SKYBOX_URL : undefined;\n // Babylon.js `scene.environmentTexture = …` / `CubeTexture.CreateFromPrefilteredData`\n // does NOT change image processing — tone mapping stays at the scene's current\n // value (Babylon.js default: off). Babylon Lite's `loadEnvironment`/`loadDdsEnvironment`,\n // however, force tone mapping on (exposure 0.8 / contrast 1.2). That side effect is\n // wrong for ported code that only assigns `environmentTexture` (e.g. NME scenes), but it\n // happens to mirror what Babylon.js's `createDefaultEnvironment` (EnvironmentHelper) does.\n // Snapshot the scene's image-processing state and restore it after the env load so the\n // side effect is invisible; if `createDefaultEnvironment` was used we re-apply the\n // EnvironmentHelper image processing explicitly below — matching Babylon.js semantics.\n const ip = this._lite.imageProcessing;\n const ipSnapshot = { exposure: ip.exposure, contrast: ip.contrast, toneMappingEnabled: ip.toneMappingEnabled };\n // Babylon.js `CubeTexture.CreateFromPrefilteredData` accepts both `.env`\n // and `.dds` prefiltered environments. Babylon Lite splits these into two\n // loaders: `loadEnvironment` (`.env`) and `loadDdsEnvironment` (`.dds`).\n if (envUrl.toLowerCase().endsWith(\".dds\")) {\n await loadDdsEnvironment(this._lite, envUrl, {\n brdfUrl: DEFAULT_BRDF_URL,\n skipSkybox: !opts?.createSkybox,\n skipGround: !opts?.createGround,\n });\n } else {\n await loadEnvironment(this._lite, envUrl, {\n brdfUrl: DEFAULT_BRDF_URL,\n skyboxUrl,\n skipSkybox: !opts?.createSkybox,\n groundTextureUrl: opts?.createGround ? DEFAULT_GROUND_URL : undefined,\n skipGround: !opts?.createGround,\n skyboxSize: opts?.skyboxSize ?? 1000,\n });\n }\n ip.exposure = ipSnapshot.exposure;\n ip.contrast = ipSnapshot.contrast;\n ip.toneMappingEnabled = ipSnapshot.toneMappingEnabled;\n // Babylon.js EnvironmentHelper (`createDefaultEnvironment`) sets up image processing\n // by default: tone mapping on with exposure 0.8 / contrast 1.2 (all overridable). Apply\n // it here so `createDefaultEnvironment` scenes (e.g. PBR sphere grids) keep their tone\n // mapping while plain `environmentTexture` scenes (e.g. NME) do not.\n if (opts?.applyImageProcessing) {\n ip.toneMappingEnabled = opts.toneMappingEnabled ?? true;\n ip.exposure = opts.cameraExposure ?? 0.8;\n ip.contrast = opts.cameraContrast ?? 1.2;\n }\n }\n\n /** Create and activate a default arc-rotate camera framing the scene. */\n public createDefaultCamera(_createArcRotateCamera = true, _replace = true, _attachControl = false): Camera {\n const lite = liteCreateDefaultCamera(this._lite) as LiteArcRotateCamera;\n const camera = ArcRotateCamera._adopt(\"default camera\", lite, this);\n this._activeCamera = camera;\n return camera;\n }\n\n /** Babylon.js `createDefaultCameraOrLight` — default framing camera plus a default hemispheric light. */\n public createDefaultCameraOrLight(createArcRotateCamera = false, replace = false, attachControl = false): void {\n this.createDefaultCamera(createArcRotateCamera, replace, attachControl);\n addToScene(this._lite, createHemisphericLight([0, 1, 0], 1.0));\n }\n\n /** Babylon.js render hook. No-op under Babylon Lite's engine-driven loop. */\n public render(): void {\n // Intentionally empty: Lite renders registered scenes via startEngine.\n }\n\n /**\n * Babylon.js readiness gate. Babylon Lite builds its scene synchronously and\n * defers GPU work into `registerScene`/`startEngine` (driven by the engine's\n * render loop), so there is nothing to await here — resolve immediately.\n */\n public whenReadyAsync(): Promise<void> {\n return Promise.resolve();\n }\n\n /** Babylon.js synchronous readiness check — always ready in the compat layer. */\n public isReady(): boolean {\n return true;\n }\n\n /** Synchronous CPU picking — unsupported. Babylon Lite uses async GPU picking. */\n public pick(): never {\n return unsupported(\n \"Scene.pick\",\n \"Babylon Lite uses asynchronous GPU picking. Use the compat `GPUPicker` class (Babylon.js parity) or the native `createGpuPicker` + `pickAsync` API.\"\n );\n }\n\n /** Synchronous ray picking — unsupported. */\n public pickWithRay(): never {\n return unsupported(\"Scene.pickWithRay\", \"Synchronous CPU ray-mesh intersection is not implemented in Babylon Lite.\");\n }\n\n /**\n * Babylon.js `scene.beginDirectAnimation(target, animations, from, to, loop, speedRatio?)`.\n * Drives the given `Animation`s on the CPU each frame, writing onto the target's\n * (dotted) property path. Returns an `Animatable` with `goToFrame`/`pause`/`stop`.\n */\n public beginDirectAnimation(target: unknown, animations: Animation[], from: number, to: number, loop = false, speedRatio = 1): Animatable {\n const animatable = new Animatable(target, animations, from, to, loop, speedRatio);\n this._runningAnimatables.push(animatable);\n return animatable;\n }\n\n /** @internal Register a structural `AnimationGroup` to be stepped + blended each frame. */\n public _registerStructuralGroup(group: AnimationGroup): void {\n if (!this._structuralGroups.includes(group)) {\n this._structuralGroups.push(group);\n }\n }\n\n /** @internal Re-run weighted blending across all structural groups (after a seek/weight change). */\n public _recomputeStructuralBlends(): void {\n AnimationGroup._blendStructuralGroups(this._structuralGroups);\n }\n\n /**\n * @internal Route the scene's loaded Lite animation groups through a\n * scene-owned `AnimationManager` with weighted/additive blending enabled.\n *\n * Babylon.js treats the scene as an implicit animation mixer, so any loaded\n * group whose weight ≠ 1 (or that is made additive) must blend with its\n * siblings on the shared skeleton. Babylon Lite makes the manager explicit and\n * blending opt-in (`enableAnimationBlending`). When a glTF container is added,\n * Lite installs a per-group last-writer-wins tick (scene-core `addToScene`); we\n * detach each group's controller (`_ctrl`) so that tick skips them and the\n * weighted mixer — which drives groups via `_gltfMixer`, not `_ctrl` — owns the\n * pose instead. Idempotent.\n */\n public _enableLoadedBlend(): void {\n const liteGroups = this._lite.animationGroups ?? [];\n if (liteGroups.length === 0) {\n return;\n }\n if (!this._blendManager) {\n this._blendManager = createAnimationManager({ engine: this._engine._lite });\n enableAnimationBlending(this._blendManager);\n }\n for (const g of liteGroups) {\n addAnimationGroup(this._blendManager, g);\n (g as { _ctrl?: unknown })._ctrl = undefined;\n }\n }\n\n /**\n * Babylon.js `scene.beginAnimation(target, from, to, loop, speedRatio?)`. Runs\n * the animations already attached to `target.animations`.\n */\n public beginAnimation(target: { animations?: Animation[] }, from: number, to: number, loop = false, speedRatio = 1): Animatable {\n return this.beginDirectAnimation(target, target.animations ?? [], from, to, loop, speedRatio);\n }\n\n public dispose(): void {\n this.onDisposeObservable.notifyObservers(this);\n // A headless scene has no Lite context to dispose (see `createHeadlessLite`).\n if (!this._headless) {\n disposeScene(this._lite);\n }\n }\n}\n","/**\n * Babylon.js-compatible light classes implemented over the Babylon Lite light\n * factories.\n *\n * Babylon.js lights take the scene in their constructor and auto-register; these\n * wrappers do the same by calling `addToScene` when a scene is supplied. The\n * underlying Lite light is exposed as `_lite` for advanced interop.\n *\n * Colour properties (`diffuse`, `specular`, `groundColor`) are write-through on\n * assignment: `light.diffuse = new Color3(...)` propagates immediately. In-place\n * mutation of a returned colour (`light.diffuse.r = x`) does not propagate; assign\n * a new colour instead. Direction/position are backed by Lite's observable vectors\n * and propagate on `.x/.y/.z` writes.\n */\n\nimport { addToScene, createHemisphericLight, createDirectionalLight, createPointLight, createSpotLight } from \"babylon-lite\";\nimport type {\n HemisphericLight as LiteHemisphericLight,\n DirectionalLight as LiteDirectionalLight,\n PointLight as LitePointLight,\n SpotLight as LiteSpotLight,\n LightBase,\n} from \"babylon-lite\";\n\nimport { Color3 } from \"../math/color.js\";\nimport { Vector3 } from \"../math/vector.js\";\nimport { Node } from \"../node/node.js\";\nimport type { Scene } from \"../scene/scene.js\";\n\ntype Tuple3 = [number, number, number];\n\n/** Babylon.js `Light` — base class for all lights (derives from `Node`). */\nexport abstract class Light extends Node {\n /** @internal Underlying Babylon Lite light. */\n public abstract readonly _lite: LightBase;\n\n protected constructor(name: string, scene?: Scene) {\n super(name, scene);\n scene?._registerLight(this);\n }\n\n public override getClassName(): string {\n return \"Light\";\n }\n\n public abstract get intensity(): number;\n public abstract set intensity(value: number);\n\n /** Detach this light's shadow generator (compat for `light.shadowEnabled = false`). */\n public set shadowEnabled(enabled: boolean) {\n if (!enabled) {\n this._lite.shadowGenerator = undefined;\n }\n }\n\n public override dispose(): void {\n // Lite removes lights through the scene; without a back-reference the\n // caller should use `removeFromScene`. Detaching the shadow generator is\n // the safe, scene-free cleanup we can do here.\n this._lite.shadowGenerator = undefined;\n super.dispose();\n }\n}\n\nfunction readColor(tuple: Tuple3): Color3 {\n return new Color3(tuple[0], tuple[1], tuple[2]);\n}\n\nfunction writeColor(tuple: Tuple3, value: Color3): void {\n tuple[0] = value.r;\n tuple[1] = value.g;\n tuple[2] = value.b;\n}\n\nfunction readVector(vec: { x: number; y: number; z: number }): Vector3 {\n return new Vector3(vec.x, vec.y, vec.z);\n}\n\nexport class HemisphericLight extends Light {\n /** @internal Underlying Babylon Lite hemispheric light. */\n public readonly _lite: LiteHemisphericLight;\n\n public constructor(name: string, direction: Vector3, scene?: Scene) {\n super(name, scene);\n this._lite = createHemisphericLight(direction.asArray());\n if (scene) {\n addToScene(scene._lite, this._lite);\n }\n }\n\n public override getClassName(): string {\n return \"HemisphericLight\";\n }\n\n public get intensity(): number {\n return this._lite.intensity;\n }\n public set intensity(value: number) {\n this._lite.intensity = value;\n }\n\n public get direction(): Vector3 {\n return readVector(this._lite.direction);\n }\n public set direction(value: Vector3) {\n this._lite.direction.set(value.x, value.y, value.z);\n }\n\n public get diffuse(): Color3 {\n return readColor(this._lite.diffuseColor);\n }\n public set diffuse(value: Color3) {\n writeColor(this._lite.diffuseColor, value);\n }\n\n public get specular(): Color3 {\n return readColor(this._lite.specularColor);\n }\n public set specular(value: Color3) {\n writeColor(this._lite.specularColor, value);\n }\n\n public get groundColor(): Color3 {\n return readColor(this._lite.groundColor);\n }\n public set groundColor(value: Color3) {\n writeColor(this._lite.groundColor, value);\n }\n}\n\nexport class DirectionalLight extends Light {\n /** @internal Underlying Babylon Lite directional light. */\n public readonly _lite: LiteDirectionalLight;\n\n public constructor(name: string, direction: Vector3, scene?: Scene) {\n super(name, scene);\n this._lite = createDirectionalLight(direction.asArray());\n if (scene) {\n addToScene(scene._lite, this._lite);\n }\n }\n\n public override getClassName(): string {\n return \"DirectionalLight\";\n }\n\n public get intensity(): number {\n return this._lite.intensity;\n }\n public set intensity(value: number) {\n this._lite.intensity = value;\n }\n\n public get direction(): Vector3 {\n return readVector(this._lite.direction);\n }\n public set direction(value: Vector3) {\n this._lite.direction.set(value.x, value.y, value.z);\n }\n\n public get position(): Vector3 {\n return readVector(this._lite.position);\n }\n public set position(value: Vector3) {\n this._lite.position.set(value.x, value.y, value.z);\n }\n\n public get diffuse(): Color3 {\n return readColor(this._lite.diffuse);\n }\n public set diffuse(value: Color3) {\n writeColor(this._lite.diffuse, value);\n }\n\n public get specular(): Color3 {\n return readColor(this._lite.specular);\n }\n public set specular(value: Color3) {\n writeColor(this._lite.specular, value);\n }\n}\n\nexport class PointLight extends Light {\n /** @internal Underlying Babylon Lite point light. */\n public readonly _lite: LitePointLight;\n\n public constructor(name: string, position: Vector3, scene?: Scene) {\n super(name, scene);\n this._lite = createPointLight(position.asArray());\n if (scene) {\n addToScene(scene._lite, this._lite);\n }\n }\n\n public override getClassName(): string {\n return \"PointLight\";\n }\n\n public get intensity(): number {\n return this._lite.intensity;\n }\n public set intensity(value: number) {\n this._lite.intensity = value;\n }\n\n public get range(): number {\n return this._lite.range;\n }\n public set range(value: number) {\n this._lite.range = value;\n }\n\n public get position(): Vector3 {\n return readVector(this._lite.position);\n }\n public set position(value: Vector3) {\n this._lite.position.set(value.x, value.y, value.z);\n }\n\n public get diffuse(): Color3 {\n return readColor(this._lite.diffuse);\n }\n public set diffuse(value: Color3) {\n writeColor(this._lite.diffuse, value);\n }\n\n public get specular(): Color3 {\n return readColor(this._lite.specular);\n }\n public set specular(value: Color3) {\n writeColor(this._lite.specular, value);\n }\n}\n\nexport class SpotLight extends Light {\n /** @internal Underlying Babylon Lite spot light. */\n public readonly _lite: LiteSpotLight;\n\n public constructor(name: string, position: Vector3, direction: Vector3, angle: number, exponent: number, scene?: Scene) {\n super(name, scene);\n this._lite = createSpotLight(position.asArray(), direction.asArray(), angle, exponent);\n if (scene) {\n addToScene(scene._lite, this._lite);\n }\n }\n\n public override getClassName(): string {\n return \"SpotLight\";\n }\n\n public get intensity(): number {\n return this._lite.intensity;\n }\n public set intensity(value: number) {\n this._lite.intensity = value;\n }\n\n public get angle(): number {\n return this._lite.angle;\n }\n public set angle(value: number) {\n this._lite.angle = value;\n }\n\n public get exponent(): number {\n return this._lite.exponent;\n }\n public set exponent(value: number) {\n this._lite.exponent = value;\n }\n\n public get range(): number {\n return this._lite.range;\n }\n public set range(value: number) {\n this._lite.range = value;\n }\n\n public get position(): Vector3 {\n return readVector(this._lite.position);\n }\n public set position(value: Vector3) {\n this._lite.position.set(value.x, value.y, value.z);\n }\n\n public get direction(): Vector3 {\n return readVector(this._lite.direction);\n }\n public set direction(value: Vector3) {\n this._lite.direction.set(value.x, value.y, value.z);\n }\n\n public get diffuse(): Color3 {\n return readColor(this._lite.diffuse);\n }\n public set diffuse(value: Color3) {\n writeColor(this._lite.diffuse, value);\n }\n\n public get specular(): Color3 {\n return readColor(this._lite.specular);\n }\n public set specular(value: Color3) {\n writeColor(this._lite.specular, value);\n }\n}\n","/**\n * Babylon.js `CSG` (legacy) and `CSG2` (Manifold-based) constructive solid\n * geometry, wrapped over Babylon Lite's native CSG API.\n *\n * Babylon.js exposes two object-oriented CSG surfaces:\n * - `CSG.FromMesh(mesh)` → `.subtract` / `.intersect` / `.union` → `.toMesh(name, material, scene)`\n * - `CSG2.FromMesh(mesh)` → `.subtract` / `.intersect` / `.add` → `.toMesh(name, scene)` (+ `.dispose()`),\n * after `await InitializeCSG2Async()`.\n *\n * Babylon Lite ships the equivalent as standalone functions\n * (`createCsgFromMesh` / `csgSubtract` / … / `createMeshFromCsg`, and the CSG2\n * `createCsg2FromMesh` / `csg2Subtract` / … / `createMeshesFromCsg2`). These\n * classes adapt the function API to Babylon.js's method-chaining shape.\n *\n * CSG (legacy) `toMesh` takes an explicit material and produces a single mesh.\n * CSG2 preserves per-source materials: each `FromMesh` records its source mesh's\n * material against a unique slot, operations union those slot→material maps, and\n * `toMesh` triangulates into one Lite mesh per slot (`createMeshesFromCsg2`),\n * returning a single compat `Mesh` with the remaining sub-meshes parented under it\n * so positioning the result moves them together — matching Babylon.js's single\n * multi-material `toMesh` return.\n */\n\nimport {\n createCsgFromMesh,\n csgSubtract,\n csgIntersect,\n csgUnion,\n createMeshFromCsg,\n initializeCsg2Async,\n createCsg2FromMesh,\n csg2Subtract,\n csg2Intersect,\n csg2Add,\n createMeshesFromCsg2,\n disposeCsg2,\n addToScene,\n type CsgSolid,\n type Csg2Solid,\n type Material as LiteMaterial,\n} from \"babylon-lite\";\n\nimport { Mesh } from \"./meshes.js\";\nimport type { Scene } from \"../scene/scene.js\";\nimport type { StandardMaterial, PBRMaterial } from \"../materials/materials.js\";\nimport type { NodeMaterial } from \"../materials/node-material.js\";\n\ntype CompatMaterial = StandardMaterial | PBRMaterial | NodeMaterial;\n\n/** A compat mesh exposes its backing Lite mesh as `_lite`. */\ninterface MeshLike {\n _lite: import(\"babylon-lite\").Mesh;\n}\n\n/** @internal Add a freshly-built CSG result mesh to its scene at engine start. */\nfunction deferAddCsgMesh(mesh: Mesh, scene: Scene, material?: CompatMaterial): void {\n scene._deferAdd(() => {\n const engine = scene.getEngine()._lite;\n if (material) {\n material._ensureRenderable(engine);\n mesh._lite.material = material._lite as never;\n }\n addToScene(scene._lite, mesh._lite);\n });\n}\n\n/**\n * Babylon.js `CSG` — legacy constructive solid geometry. Build from a mesh with\n * {@link FromMesh}, combine with {@link subtract} / {@link intersect} /\n * {@link union}, then materialize with {@link toMesh}.\n */\nexport class CSG {\n private constructor(private readonly _lite: CsgSolid) {}\n\n /** Babylon.js `CSG.FromMesh(mesh)`. */\n public static FromMesh(mesh: MeshLike): CSG {\n return new CSG(createCsgFromMesh(mesh._lite));\n }\n\n /** Babylon.js `csg.subtract(other)` — `this − other`. */\n public subtract(other: CSG): CSG {\n return new CSG(csgSubtract(this._lite, other._lite));\n }\n\n /** Babylon.js `csg.intersect(other)`. */\n public intersect(other: CSG): CSG {\n return new CSG(csgIntersect(this._lite, other._lite));\n }\n\n /** Babylon.js `csg.union(other)`. */\n public union(other: CSG): CSG {\n return new CSG(csgUnion(this._lite, other._lite));\n }\n\n /** Babylon.js `csg.toMesh(name, material, scene)` — triangulate into a single mesh. */\n public toMesh(name: string, material: CompatMaterial | null, scene: Scene): Mesh {\n const engine = scene.getEngine()._lite;\n const lite = createMeshFromCsg(engine, this._lite, name);\n const mesh = new Mesh(name, lite, scene);\n deferAddCsgMesh(mesh, scene, material ?? undefined);\n return mesh;\n }\n}\n\n/** Module-wide unique material-slot counter for CSG2 (`MATERIAL_ID_RESERVE_COUNT` = 65536). */\nlet nextCsg2Slot = 0;\n\n/**\n * Babylon.js `CSG2` — Manifold-based constructive solid geometry that preserves\n * per-source-mesh materials. Call `await InitializeCSG2Async()` once before use.\n */\nexport class CSG2 {\n private constructor(\n private readonly _lite: Csg2Solid,\n /** Slot → source material, accumulated across operations. */\n private readonly _materials: Map<number, CompatMaterial>\n ) {}\n\n /** Babylon.js `CSG2.FromMesh(mesh)` — records the mesh's material against a unique slot. */\n public static FromMesh(mesh: MeshLike & { material?: CompatMaterial | null }): CSG2 {\n const slot = nextCsg2Slot++;\n const materials = new Map<number, CompatMaterial>();\n if (mesh.material) {\n materials.set(slot, mesh.material);\n }\n return new CSG2(createCsg2FromMesh(mesh._lite, slot), materials);\n }\n\n private _combine(lite: Csg2Solid, other: CSG2): CSG2 {\n const materials = new Map(this._materials);\n for (const [slot, material] of other._materials) {\n materials.set(slot, material);\n }\n return new CSG2(lite, materials);\n }\n\n /** Babylon.js `csg.subtract(other)` — `this − other`. */\n public subtract(other: CSG2): CSG2 {\n return this._combine(csg2Subtract(this._lite, other._lite), other);\n }\n\n /** Babylon.js `csg.intersect(other)`. */\n public intersect(other: CSG2): CSG2 {\n return this._combine(csg2Intersect(this._lite, other._lite), other);\n }\n\n /** Babylon.js `csg.add(other)` — union. */\n public add(other: CSG2): CSG2 {\n return this._combine(csg2Add(this._lite, other._lite), other);\n }\n\n /**\n * Babylon.js `csg.toMesh(name, scene)` — triangulate into a single mesh,\n * preserving each source mesh's material across the result's faces.\n */\n public toMesh(name: string, scene: Scene): Mesh {\n const engine = scene.getEngine()._lite;\n // Build a slot-indexed Lite material array (sparse; only referenced slots are read).\n const materials: LiteMaterial[] = [];\n for (const [slot, material] of this._materials) {\n material._ensureRenderable(engine);\n materials[slot] = material._lite as never;\n }\n const liteMeshes = createMeshesFromCsg2(engine, this._lite, materials, name);\n // `createMeshesFromCsg2` already assigned each sub-mesh its Lite material; wrapping\n // the first in a compat `Mesh` clobbers it with the scene default, so restore it.\n const savedMaterials = liteMeshes.map((m) => m.material);\n const root = new Mesh(name, liteMeshes[0]!, scene);\n root._lite.material = savedMaterials[0] as never;\n scene._deferAdd(() => addToScene(scene._lite, root._lite));\n // Parent the remaining material sub-meshes under the returned mesh so the whole\n // result moves as one (Babylon.js returns a single multi-material mesh).\n for (let i = 1; i < liteMeshes.length; i++) {\n const sub = liteMeshes[i]!;\n sub.material = savedMaterials[i] as never;\n (sub as unknown as { parent: unknown }).parent = root._lite;\n scene._deferAdd(() => addToScene(scene._lite, sub));\n }\n return root;\n }\n\n /** Babylon.js `csg.dispose()` — release the underlying Manifold solid. */\n public dispose(): void {\n disposeCsg2(this._lite);\n }\n}\n\n/** Babylon.js `InitializeCSG2Async()` — load the Manifold runtime before any `CSG2` use. */\nexport async function InitializeCSG2Async(): Promise<void> {\n await initializeCsg2Async();\n}\n","/**\n * Babylon.js `MeshoptCompression` (`@babylonjs/core/Meshes/Compression/meshoptCompression`).\n *\n * In Babylon.js this singleton owns the meshopt decoder used by the glTF\n * `EXT_meshopt_compression` loader extension, and apps configure its decoder URL\n * via the static `Configuration`. Babylon Lite decodes meshopt-compressed buffers\n * itself inside its glTF loader feature (`gltf-feature-meshopt`), so no external\n * decoder needs wiring. This compat shim therefore accepts the `Configuration`\n * assignment ported code performs (a no-op here) so the import resolves and the\n * asset still loads — the actual decode happens in Lite.\n */\nexport class MeshoptCompression {\n /**\n * Babylon.js `MeshoptCompression.Configuration` — the decoder location. Stored\n * for API parity but unused: Babylon Lite's glTF loader carries its own meshopt\n * decoder, so setting this has no effect on decoding.\n */\n public static Configuration: { decoder: { url: string } } = { decoder: { url: \"\" } };\n\n private static _default: MeshoptCompression | null = null;\n\n /** Babylon.js `MeshoptCompression.Default` — the lazily-created shared instance. */\n public static get Default(): MeshoptCompression {\n if (!MeshoptCompression._default) {\n MeshoptCompression._default = new MeshoptCompression();\n }\n return MeshoptCompression._default;\n }\n}\n","/**\n * Babylon.js-compatible `MorphTarget` / `MorphTargetManager` over the Babylon\n * Lite native morph API (`createMorphTargets` / `setMorphTargetWeights`).\n *\n * Babylon.js morph targets carry **absolute** vertex positions/normals\n * (`target.setPositions(abs)`); Babylon Lite's `createMorphTargets` consumes\n * per-target **deltas** (target − base). The manager defers building the Lite\n * morph until engine start (when the owning mesh's base CPU geometry exists),\n * computes the deltas, and assigns the resulting `MorphTargetData` onto the\n * Lite mesh so the Standard/NME pipelines sample it. Weight changes\n * (`target.influence = …`) re-upload via `setMorphTargetWeights`.\n */\n\nimport { createMorphTargets, setMorphTargetWeights } from \"babylon-lite\";\nimport type { EngineContext, MorphTargetData } from \"babylon-lite\";\n\nimport type { Scene } from \"../scene/scene.js\";\nimport type { Mesh } from \"../meshes/meshes.js\";\n\n/** Babylon.js `MorphTarget` — a single named morph influence with absolute target geometry. */\nexport class MorphTarget {\n public name: string;\n /** @internal Absolute target positions (Babylon.js `setPositions`). */\n public _positions: Float32Array | null = null;\n /** @internal Absolute target normals (Babylon.js `setNormals`). */\n public _normals: Float32Array | null = null;\n /** @internal Owning manager, set on `addTarget`, used to push weight updates. */\n public _manager: MorphTargetManager | undefined;\n private _influence: number;\n\n public constructor(name: string, influence = 0, _scene?: Scene) {\n this.name = name;\n this._influence = influence;\n }\n\n public get influence(): number {\n return this._influence;\n }\n public set influence(value: number) {\n this._influence = value;\n this._manager?._syncWeights();\n }\n\n /** Babylon.js `MorphTarget.setPositions(data)` — absolute target positions. */\n public setPositions(data: Float32Array | number[] | null): void {\n this._positions = data ? (data instanceof Float32Array ? data : Float32Array.from(data)) : null;\n }\n\n /** Babylon.js `MorphTarget.getPositions()`. */\n public getPositions(): Float32Array | null {\n return this._positions;\n }\n\n /** Babylon.js `MorphTarget.setNormals(data)` — absolute target normals. */\n public setNormals(data: Float32Array | number[] | null): void {\n this._normals = data ? (data instanceof Float32Array ? data : Float32Array.from(data)) : null;\n }\n\n /** Babylon.js `MorphTarget.getNormals()`. */\n public getNormals(): Float32Array | null {\n return this._normals;\n }\n}\n\n/** Babylon.js `MorphTargetManager` — owns a mesh's morph targets (Babylon Lite supports up to 4). */\nexport class MorphTargetManager {\n /** @internal */\n public _engine: EngineContext | undefined;\n /** @internal Built Lite morph data (created at engine start). */\n public _lite: MorphTargetData | undefined;\n private readonly _targets: MorphTarget[] = [];\n\n public constructor(_scene?: Scene) {\n // Scene retained implicitly via the mesh that adopts this manager.\n }\n\n public get numTargets(): number {\n return this._targets.length;\n }\n\n public getTarget(index: number): MorphTarget {\n return this._targets[index]!;\n }\n\n /** Babylon.js `MorphTargetManager.addTarget(target)`. */\n public addTarget(target: MorphTarget): void {\n target._manager = this;\n this._targets.push(target);\n }\n\n /**\n * @internal Build the Lite morph data from the mesh's base CPU geometry and\n * each target's absolute positions/normals (converted to deltas), then assign\n * it onto the Lite mesh. Called by the engine at start, once geometry exists.\n */\n public _build(mesh: Mesh, engine: EngineContext): void {\n const lite = mesh._lite as { _cpuPositions?: Float32Array; _cpuNormals?: Float32Array; morphTargets?: MorphTargetData | null };\n const base = lite._cpuPositions;\n if (!base) {\n return;\n }\n this._engine = engine;\n const vertexCount = base.length / 3;\n const baseNormals = lite._cpuNormals;\n const targets = this._targets.slice(0, 4).map((t) => {\n const abs = t._positions;\n const positions = new Float32Array(base.length);\n if (abs) {\n for (let i = 0; i < base.length; i++) {\n positions[i] = (abs[i] ?? 0) - base[i]!;\n }\n }\n let normals: Float32Array | null = null;\n if (t._normals && baseNormals) {\n normals = new Float32Array(baseNormals.length);\n for (let i = 0; i < baseNormals.length; i++) {\n normals[i] = (t._normals[i] ?? 0) - baseNormals[i]!;\n }\n }\n return { positions, normals };\n });\n const weights = this._targets.slice(0, 4).map((t) => t.influence);\n this._lite = createMorphTargets(engine, targets, vertexCount, weights);\n lite.morphTargets = this._lite;\n }\n\n /** @internal Re-upload current target influences to the GPU weights buffer. */\n public _syncWeights(): void {\n if (!this._lite || !this._engine) {\n return;\n }\n const weights = this._targets.slice(0, 4).map((t) => t.influence);\n setMorphTargetWeights(this._engine, this._lite, weights);\n }\n}\n","/**\n * Babylon.js-compatible `GaussianSplattingMesh` over Babylon Lite's splat loaders.\n *\n * Babylon Lite fully backs Gaussian Splatting: `loadSplat` (`.ply` / `.splat` /\n * compressed-PLY), `loadSOG`, and `loadSPZ` each return a `GaussianSplattingMesh`\n * (a `SceneNode` carrying the splat cloud), with `splatsData` / `updateData` for\n * in-place edits and `bakeCurrentTransformIntoVertices` to fold the node transform\n * into the splat data. This wrapper exposes that through the Babylon.js\n * `GaussianSplattingMesh` shape so ported scenes (`new GaussianSplattingMesh(...)` +\n * `loadFileAsync`, or `ImportMeshAsync` of a splat URL) run unchanged.\n *\n * Babylon.js constructs the mesh synchronously and populates it via\n * `loadFileAsync`; Babylon Lite loads atomically. We bridge this by holding a\n * lightweight placeholder transform node until the splat loads, buffering any\n * transforms set in the meantime, then adopting the loaded Lite node.\n */\n\nimport { loadSplat, loadSOG, loadSPZ, bakeCurrentTransformIntoVertices, createTransformNode } from \"babylon-lite\";\nimport type { GaussianSplattingMesh as LiteGsMesh, GsShaderFragment, SceneNode } from \"babylon-lite\";\n\nimport { TransformNode } from \"./meshes.js\";\nimport type { Scene } from \"../scene/scene.js\";\nimport type { Vector3 } from \"../math/vector.js\";\nimport { liteBackedVector3 } from \"../math/vector.js\";\n\n/** Lite loader chosen by file extension (mirrors the BJS splat plugin dispatch). */\nfunction liteLoaderFor(url: string): (scene: import(\"babylon-lite\").SceneContext, url: string, fragments?: readonly GsShaderFragment[]) => Promise<LiteGsMesh> {\n const lower = url.split(\"?\")[0]!.toLowerCase();\n if (lower.endsWith(\".sog\") || lower.endsWith(\".zip\")) {\n return loadSOG;\n }\n if (lower.endsWith(\".spz\")) {\n return loadSPZ;\n }\n // `.ply`, `.splat`, and compressed-PLY all flow through `loadSplat`.\n return loadSplat;\n}\n\n/** `.splat` row stride: position(3f) + scale(3f) + rgba(4×u8) + rot(4×u8) = 32 bytes. */\nconst SPLAT_ROW_BYTES = 32;\nconst SPLAT_ROW_FLOATS = SPLAT_ROW_BYTES / 4;\nconst SPLAT_Y_FLOAT_INDEX = 1;\n\n/**\n * @internal Return a copy of a `.splat` buffer with every row's centre Y negated\n * (the position-space half of Babylon.js's `flipY`). Used to reproduce\n * `updateData(..., { flipY: false })`. Only the 32-byte `.splat` row layout is\n * handled; other buffers are returned unchanged.\n */\nfunction mirrorSplatRowY(buffer: ArrayBuffer): ArrayBuffer {\n if (buffer.byteLength % SPLAT_ROW_BYTES !== 0) {\n return buffer;\n }\n const copy = buffer.slice(0);\n const floats = new Float32Array(copy);\n for (let f = SPLAT_Y_FLOAT_INDEX; f < floats.length; f += SPLAT_ROW_FLOATS) {\n floats[f] = -floats[f]!;\n }\n return copy;\n}\n\n/**\n * Babylon.js `GaussianSplattingMesh`. Derives from `TransformNode` so the loaded\n * cloud's `position` / `rotation` / `scaling` proxy onto the Lite splat node.\n */\nexport class GaussianSplattingMesh extends TransformNode {\n /** @internal The loaded Lite splat node (undefined until `loadFileAsync` resolves). */\n private _gs?: LiteGsMesh;\n /** @internal The constructor's deferred URL, loaded by `loadFileAsync()` with no argument. */\n private readonly _ctorUrl: string | null;\n /** @internal Optional Lite shader-fragment plugins applied at load (scene 126). */\n private _fragments?: readonly GsShaderFragment[];\n\n public constructor(name: string, url?: string | null, scene?: Scene, _keepInRam?: boolean) {\n // A placeholder transform node carries any transforms set before the splat\n // loads; it is never added to the scene (Lite `loadSplat` registers the real\n // splat node). Transforms are copied onto the loaded node in `loadFileAsync`.\n super(name, scene, createTransformNode(name));\n this._ctorUrl = url ?? null;\n }\n\n public override getClassName(): string {\n return \"GaussianSplattingMesh\";\n }\n\n /** @internal The transform-carrying Lite node: the loaded splat node once present, else the placeholder. */\n private get _xform(): SceneNode {\n return this._gs ?? this._node;\n }\n\n public override get position(): Vector3 {\n return liteBackedVector3(this._xform.position);\n }\n public override set position(value: Vector3) {\n this._xform.position.set(value.x, value.y, value.z);\n }\n\n public override get rotation(): Vector3 {\n return liteBackedVector3(this._xform.rotation);\n }\n public override set rotation(value: Vector3) {\n this._xform.rotation.set(value.x, value.y, value.z);\n }\n\n public override get scaling(): Vector3 {\n return liteBackedVector3(this._xform.scaling);\n }\n public override set scaling(value: Vector3) {\n this._xform.scaling.set(value.x, value.y, value.z);\n }\n\n /** @internal Set the Lite shader-fragment plugins applied on the next load (compat material-plugin path). */\n public _setFragments(fragments: readonly GsShaderFragment[]): void {\n this._fragments = fragments;\n }\n\n /**\n * Babylon.js `gs.loadFileAsync(url?)` — fetch + parse a splat asset and adopt\n * the resulting Lite node. With no argument, loads the constructor URL.\n */\n public async loadFileAsync(url?: string): Promise<GaussianSplattingMesh> {\n const target = url ?? this._ctorUrl;\n if (!target) {\n throw new Error(\"GaussianSplattingMesh.loadFileAsync: no URL provided (and none given to the constructor).\");\n }\n const scene = this._scene;\n if (!scene) {\n throw new Error(\"GaussianSplattingMesh.loadFileAsync requires a scene (pass one to the constructor).\");\n }\n const lite = await liteLoaderFor(target)(scene._lite, target, this._fragments);\n this._adopt(lite);\n return this;\n }\n\n /** @internal Adopt a loaded Lite splat node: carry over placeholder transforms + name, and register on the scene. */\n private _adopt(lite: LiteGsMesh): void {\n const placeholder = this._node;\n lite.position.set(placeholder.position.x, placeholder.position.y, placeholder.position.z);\n lite.scaling.set(placeholder.scaling.x, placeholder.scaling.y, placeholder.scaling.z);\n lite.rotation.set(placeholder.rotation.x, placeholder.rotation.y, placeholder.rotation.z);\n lite.name = this.name;\n this._gs = lite;\n this._scene?._registerMesh(this);\n }\n\n /** @internal Wrap an already-loaded Lite splat node (used by the loader's `ImportMeshAsync` path). */\n public static _fromLite(lite: LiteGsMesh, scene: Scene): GaussianSplattingMesh {\n const mesh = new GaussianSplattingMesh(lite.name, null, scene);\n mesh._gs = lite;\n scene._registerMesh(mesh);\n return mesh;\n }\n\n /** Babylon.js `gs.splatsData` — the raw 32-byte/splat row buffer (for inspection / `updateData`). */\n public get splatsData(): ArrayBuffer | null {\n return this._gs ? this._gs.splatsData : null;\n }\n\n /**\n * Babylon.js `gs.updateData(buffer, sh?, options?)` — replace the splat data in\n * place. Babylon Lite always applies its loader's Y convention on update; the\n * `sh` argument is accepted for signature parity and ignored.\n *\n * `options.flipY === false` is honoured: Babylon.js's `.splat` loader flips Y\n * on load by default, so `flipY:false` re-uploads the buffer **without** that\n * flip — i.e. mirrored relative to the default-loaded pose, which ported scenes\n * then correct with `scaling.y = -1`. Lite has no per-call flip flag and always\n * applies its (flip-on-load-equivalent) convention, so we mirror the row Y here\n * to reproduce the `flipY:false` pose before handing the buffer to Lite.\n */\n public updateData(splatBuffer: ArrayBuffer, _sh?: unknown, options?: { flipY?: boolean }): void {\n const buffer = options?.flipY === false ? mirrorSplatRowY(splatBuffer) : splatBuffer;\n this._gs?.updateData(buffer);\n }\n\n /** Babylon.js `gs.bakeCurrentTransformIntoVertices()` — fold the node transform into the splat data. */\n public bakeCurrentTransformIntoVertices(): void {\n if (this._gs) {\n bakeCurrentTransformIntoVertices(this._gs);\n }\n }\n\n /** @internal Babylon.js's worker-throttle flag; ported scenes poll it to detect the first sort. */\n public get _canPostToWorker(): boolean {\n return this._gs ? this._gs._canPostToWorker : false;\n }\n\n /** @internal The loaded Lite splat node, for the GPU picker's result mapping (undefined until loaded). */\n public get _pickLiteNode(): LiteGsMesh | undefined {\n return this._gs;\n }\n}\n","/**\n * Babylon.js-compatible texture wrappers over Babylon Lite's `loadTexture2D`.\n *\n * Babylon.js's `Texture` constructor is synchronous and loads in the background.\n * Babylon Lite loads textures asynchronously. The compat `Texture` kicks off the\n * load in its constructor and resolves `_lite` when ready; assign the texture to\n * a material after `await texture.whenReadyAsync()` (or construct via\n * `Texture.LoadAsync`) so the GPU handle is present when the material binds.\n */\n\nimport { loadTexture2D, loadBasisTexture2D, loadKtxTexture2D, createTexture2DFromPixels, updateTexture2DFromPixels } from \"babylon-lite\";\nimport type { Texture2D, Texture2DOptions, EngineContext } from \"babylon-lite\";\n\nimport { unsupported } from \"../error.js\";\nimport { Observable } from \"../misc/observable.js\";\nimport type { Scene } from \"../scene/scene.js\";\n\n/** Compression suffix → `loadKtxTexture2D` token, recognised in a pre-resolved KTX URL. */\nconst KTX_SUFFIX_RE = /(-astc|-dxt|-etc2|-pvrtc)\\.ktx(\\?.*)?$/i;\n\n/**\n * @internal Recognise a pre-resolved compressed KTX URL and split it into the\n * `{ baseUrl, suffix }` pair Babylon Lite's `loadKtxTexture2D` expects (which\n * takes a base image URL plus a format suffix and reconstructs the KTX URL\n * itself), or `null` when the URL is not a compressed KTX.\n *\n * Babylon.js code selects the format via `engine.getCaps()` and hands `Texture`\n * a single fully-qualified `.ktx` URL (e.g. `…/grid-dxt.ktx`), so the base is the\n * `.png` fallback (`…/grid.png`) and the suffix is `-dxt.ktx`. Any query string\n * (auth / cache-busting / signed-URL params) is preserved on the base URL so it\n * survives onto both the KTX fetch and the `.png` fallback.\n */\nexport function resolveKtxUrl(url: string): { baseUrl: string; suffix: string } | null {\n const ktx = url.match(KTX_SUFFIX_RE);\n if (!ktx) {\n return null;\n }\n return { baseUrl: url.replace(KTX_SUFFIX_RE, \".png$2\"), suffix: ktx[1]! + \".ktx\" };\n}\n\n/**\n * Pick the right Babylon Lite loader for a texture URL:\n * - `.basis` → `loadBasisTexture2D` (GPU-format transcode; manages its own V-flip).\n * - a pre-resolved compressed KTX (`…-dxt.ktx` etc.) → `loadKtxTexture2D` (see\n * {@link resolveKtxUrl}), which re-checks device support and falls back to the\n * base image.\n * - everything else → the raster `loadTexture2D`.\n *\n * The basis/KTX loaders manage their own V-orientation, so the raster-only\n * `invertY` / `mipMaps` options are ignored there — passing the same opts is safe.\n */\nfunction loadCompatTexture(engine: EngineContext, url: string, opts: Texture2DOptions): Promise<Texture2D> {\n const path = url.split(/[?#]/)[0]!.toLowerCase();\n if (path.endsWith(\".basis\")) {\n return loadBasisTexture2D(engine, url, opts);\n }\n const ktx = resolveKtxUrl(url);\n if (ktx) {\n return loadKtxTexture2D(engine, ktx.baseUrl, [ktx.suffix], opts);\n }\n return loadTexture2D(engine, url, opts);\n}\n\nexport abstract class BaseTexture {\n public name = \"\";\n /** @internal The underlying Lite texture handle. Undefined until the async load resolves. */\n public _lite: Texture2D | undefined;\n\n public getClassName(): string {\n return \"BaseTexture\";\n }\n\n public abstract whenReadyAsync(): Promise<void>;\n\n public dispose(): void {\n // Lite texture lifetimes are managed by the GPU resource pool; explicit\n // disposal is a no-op in the compat layer.\n }\n}\n\nexport class Texture extends BaseTexture {\n private readonly _ready: Promise<void>;\n /** Babylon.js sampling-mode constants (numeric parity). */\n public static readonly NEAREST_SAMPLINGMODE = 1;\n public static readonly BILINEAR_SAMPLINGMODE = 2;\n public static readonly TRILINEAR_SAMPLINGMODE = 3;\n public static readonly NEAREST_NEAREST = 8;\n public static readonly LINEAR_LINEAR = 11;\n /** Babylon.js coordinate-mode constants (numeric parity). */\n public static readonly CLAMP_ADDRESSMODE = 0;\n public static readonly WRAP_ADDRESSMODE = 1;\n public static readonly MIRROR_ADDRESSMODE = 2;\n /** Babylon.js texture UV tiling (applied to the Lite material at bind time). */\n public uScale = 1;\n public vScale = 1;\n public uOffset = 0;\n public vOffset = 0;\n public hasAlpha = false;\n public coordinatesIndex = 0;\n /** Babylon.js sampling mode passed at construction (`NEAREST_SAMPLINGMODE` = 1, etc.). */\n public readonly samplingMode: number;\n /** @internal The Scene or engine this texture was created against (for `clone`). */\n private readonly _source: Scene | { _lite: import(\"babylon-lite\").EngineContext };\n\n public constructor(\n url: string,\n sceneOrEngine: Scene | { _lite: import(\"babylon-lite\").EngineContext },\n noMipmapOrOptions?: unknown,\n invertY?: boolean,\n _samplingMode?: number,\n onLoad?: (() => void) | null\n ) {\n super();\n this.name = url;\n // Babylon.js `Texture(url, scene, noMipmapOrOptions?, invertY?, samplingMode?)`.\n // The third argument is either a `noMipmap` boolean or an options object; parse\n // both shapes so the load matches what the ported code asked for.\n let noMipmap = false;\n let invertYOpt = invertY;\n let samplingMode = _samplingMode;\n if (typeof noMipmapOrOptions === \"boolean\") {\n noMipmap = noMipmapOrOptions;\n } else if (noMipmapOrOptions && typeof noMipmapOrOptions === \"object\") {\n const o = noMipmapOrOptions as { noMipmap?: boolean; invertY?: boolean; samplingMode?: number };\n noMipmap = o.noMipmap ?? false;\n invertYOpt = invertYOpt ?? o.invertY;\n samplingMode = samplingMode ?? o.samplingMode;\n }\n // Babylon.js `Texture.invertY` defaults to true; honour an explicit `false`.\n this._invertY = invertYOpt ?? true;\n this._noMipmap = noMipmap;\n this.samplingMode = samplingMode ?? Texture.BILINEAR_SAMPLINGMODE;\n this._source = sceneOrEngine;\n // Babylon.js's `Texture` accepts either a `Scene` or a `ThinEngine`. When a\n // scene is passed, the load is tracked so the scene awaits it at build; when\n // a bare engine is passed (e.g. the scene-less `SpriteRenderer` path), there\n // is no scene to track against, so the caller awaits readiness itself.\n const scene = (sceneOrEngine as Scene).getEngine ? (sceneOrEngine as Scene) : undefined;\n const engineWrapper = scene ? undefined : (sceneOrEngine as { _lite: import(\"babylon-lite\").EngineContext; _registerStartupWork?: (w: () => Promise<void>) => void });\n const engine = scene ? scene.getEngine()._lite : engineWrapper!._lite;\n // Honour `invertY` / `noMipmap` only on the material (scene-based) path. The\n // bare-engine path feeds Babylon Lite's sprite renderer, which applies its own\n // V-orientation, so it keeps `loadTexture2D`'s defaults (matching the Lite ports).\n // Map the Babylon.js sampling mode to Lite's min/mag filters: `NEAREST_SAMPLINGMODE`\n // must load with nearest filtering, else the alpha of an alpha-tested (cutout)\n // texture is bilinear-filtered and the discard boundary shifts — invisible on\n // axis-aligned sprites but a large divergence on rotated cutout billboards.\n const nearest = this.samplingMode === Texture.NEAREST_SAMPLINGMODE || this.samplingMode === Texture.NEAREST_NEAREST;\n const filterOpts: { minFilter?: \"nearest\" | \"linear\"; magFilter?: \"nearest\" | \"linear\" } = nearest ? { minFilter: \"nearest\", magFilter: \"nearest\" } : {};\n const loadOpts = scene ? { invertY: this._invertY, mipMaps: !this._noMipmap, ...filterOpts } : {};\n\n this._ready = loadCompatTexture(engine, url, loadOpts).then((tex) => {\n this._lite = tex;\n if (onLoad) {\n onLoad();\n }\n });\n // Let the scene await this load before it builds renderables, so the GPU\n // handle exists when the owning material binds (Babylon.js loads in the\n // background but its render loop simply waits a frame; we wait at build).\n scene?._trackTextureLoad(this._ready);\n // Scene-less path (bare engine): register the load as engine startup work\n // so `texture.isReady()` is true by the time the render loop first runs.\n engineWrapper?._registerStartupWork?.(() => this._ready);\n }\n\n /** @internal Upload-time vertical flip / mipmap flags, preserved across `clone`. */\n private readonly _invertY: boolean;\n private readonly _noMipmap: boolean;\n\n public override getClassName(): string {\n return \"Texture\";\n }\n\n /**\n * Babylon.js `texture.clone()` — a new `Texture` over the same source URL.\n * UV tiling/offset and sampling are copied; the clone re-resolves the GPU\n * handle (tracked against the same scene so it is ready at build).\n */\n public clone(): Texture {\n const c = new Texture(this.name, this._source, this._noMipmap, this._invertY, this.samplingMode);\n c.uScale = this.uScale;\n c.vScale = this.vScale;\n c.uOffset = this.uOffset;\n c.vOffset = this.vOffset;\n c.hasAlpha = this.hasAlpha;\n c.coordinatesIndex = this.coordinatesIndex;\n return c;\n }\n\n public override whenReadyAsync(): Promise<void> {\n return this._ready;\n }\n\n /** Babylon.js `BaseTexture.isReady()` — true once the GPU handle has resolved. */\n public isReady(): boolean {\n return this._lite !== undefined;\n }\n\n /** Load a texture and resolve once its GPU handle is available. */\n public static async LoadAsync(url: string, scene: Scene): Promise<Texture> {\n const texture = new Texture(url, scene);\n await texture.whenReadyAsync();\n return texture;\n }\n}\n\n/**\n * Babylon.js `RawTexture` — a texture created from raw pixel bytes. Backed by\n * Babylon Lite's `createTexture2DFromPixels`; the GPU handle is available\n * synchronously after construction.\n */\nexport class RawTexture extends BaseTexture {\n private readonly _scene: Scene;\n\n public constructor(data: Uint8Array, width: number, height: number, scene: Scene) {\n super();\n this._scene = scene;\n this._lite = createTexture2DFromPixels(scene.getEngine()._lite, data, width, height);\n }\n\n public override getClassName(): string {\n return \"RawTexture\";\n }\n\n /** Replace the texture's pixel contents. */\n public update(data: Uint8Array): void {\n if (this._lite) {\n updateTexture2DFromPixels(this._scene.getEngine()._lite, this._lite, data);\n }\n }\n\n public override whenReadyAsync(): Promise<void> {\n return Promise.resolve();\n }\n\n public static CreateRGBATexture(data: Uint8Array, width: number, height: number, scene: Scene): RawTexture {\n return new RawTexture(data, width, height, scene);\n }\n}\n\n/**\n * Babylon.js `DynamicTexture` — a canvas-backed texture. Draw into\n * `getContext()`, then call `update()` to upload the canvas pixels to the GPU.\n * Backed by Babylon Lite's pixel-texture path.\n */\nexport class DynamicTexture extends BaseTexture {\n private readonly _scene: Scene;\n private readonly _canvas: HTMLCanvasElement;\n private readonly _context: CanvasRenderingContext2D;\n private readonly _width: number;\n private readonly _height: number;\n\n public constructor(name: string, options: { width: number; height: number }, scene: Scene) {\n super();\n this.name = name;\n this._scene = scene;\n this._width = options.width;\n this._height = options.height;\n this._canvas = document.createElement(\"canvas\");\n this._canvas.width = options.width;\n this._canvas.height = options.height;\n const ctx = this._canvas.getContext(\"2d\");\n if (!ctx) {\n throw new Error(\"DynamicTexture: 2D canvas context unavailable.\");\n }\n this._context = ctx;\n }\n\n public override getClassName(): string {\n return \"DynamicTexture\";\n }\n\n public getContext(): CanvasRenderingContext2D {\n return this._context;\n }\n\n public getSize(): { width: number; height: number } {\n return { width: this._width, height: this._height };\n }\n\n /** Draw `text` and refresh the GPU texture. */\n public drawText(text: string, x: number, y: number, font: string, color: string, clearColor: string | null): void {\n const ctx = this._context;\n if (clearColor) {\n ctx.fillStyle = clearColor;\n ctx.fillRect(0, 0, this._width, this._height);\n }\n ctx.font = font;\n ctx.fillStyle = color;\n ctx.fillText(text, x, y);\n this.update();\n }\n\n /** Upload the current canvas pixels to the GPU. */\n public update(): void {\n const image = this._context.getImageData(0, 0, this._width, this._height);\n const data = new Uint8Array(image.data.buffer);\n if (!this._lite) {\n this._lite = createTexture2DFromPixels(this._scene.getEngine()._lite, data, this._width, this._height);\n } else {\n updateTexture2DFromPixels(this._scene.getEngine()._lite, this._lite, data);\n }\n }\n\n public override whenReadyAsync(): Promise<void> {\n return Promise.resolve();\n }\n}\n\n/**\n * Babylon.js `CubeTexture` — environment/skybox cube map. Babylon Lite loads\n * environments through `loadEnvironment` (IBL + skybox registered on the scene)\n * rather than as a standalone GPU texture object. This compat `CubeTexture`\n * therefore acts as a lightweight handle that records the environment URL; the\n * actual GPU work happens when it is assigned to `scene.environmentTexture` and\n * the engine starts (see `Scene` env handling).\n */\nexport class CubeTexture {\n /** Source URL of the (prefiltered) environment. */\n public readonly url: string;\n /** Babylon.js `coordinatesMode` (skybox = 5). Recorded for API parity. */\n public coordinatesMode = 0;\n public name: string;\n public gammaSpace = true;\n public level = 1;\n /** Fires when the cube map is \"ready\" (resolved on a microtask in this compat layer). */\n public readonly onLoadObservable = new Observable<CubeTexture>();\n private _ready = false;\n\n public constructor(\n url: string,\n _scene?: unknown,\n _extensions?: unknown,\n _noMipmap?: boolean,\n _files?: unknown,\n onLoad?: (() => void) | null,\n _onError?: unknown,\n _format?: unknown,\n _prefiltered?: boolean\n ) {\n this.url = url;\n this.name = url;\n // Babylon.js fires onLoad once the cube map is ready; some scenes await it\n // before continuing. We resolve on a microtask since the actual GPU upload\n // is deferred to `loadEnvironment` at engine start.\n setTimeout(() => {\n this._ready = true;\n if (onLoad) {\n onLoad();\n }\n this.onLoadObservable.notifyObservers(this);\n }, 0);\n }\n\n /** Babylon.js `BaseTexture.isReady()`. */\n public isReady(): boolean {\n return this._ready;\n }\n\n /** Babylon.js `CubeTexture.CreateFromPrefilteredData(url, scene)`. */\n public static CreateFromPrefilteredData(url: string, scene?: unknown): CubeTexture {\n return new CubeTexture(url, scene);\n }\n\n public dispose(): void {\n // GPU resources are owned by the scene's environment, disposed with the scene.\n }\n}\n\n/** Babylon.js `HDRCubeTexture` — see {@link CubeTexture}; use native `loadHdrEnvironment`. */\nexport class HDRCubeTexture {\n public constructor() {\n unsupported(\"HDRCubeTexture\", \"Use the native `loadHdrEnvironment` API; a standalone HDR cube texture object is not wrapped.\");\n }\n}\n\n/** Babylon.js `RenderTargetTexture` — offscreen render target. Use the native frame-graph RTT APIs. */\nexport class RenderTargetTexture {\n public constructor() {\n unsupported(\"RenderTargetTexture\", \"Offscreen rendering uses Babylon Lite's frame-graph render-target APIs (`createRenderTargetTexture` / render tasks).\");\n }\n}\n","/**\n * Lightweight handles for meshes produced by the loaders (`ImportMeshAsync` etc.).\n *\n * Babylon.js loaders return a flat `meshes` array whose entries expose\n * `getBoundingInfo()` (with min/max), `refreshBoundingInfo()`, and\n * `getVerticesData()` — used by scenes to frame a camera around a loaded model.\n * Babylon Lite returns a root-node hierarchy; the tree-shakeable\n * `getContainerMeshes` helper flattens it to its renderable `Mesh` nodes, which we\n * wrap here.\n *\n * Bounds are reported in the node's **local** geometry space (`mesh.boundMin` /\n * `mesh.boundMax`), matching how Babylon Lite's own `createDefaultCamera` frames\n * loaded models — it reads the same local bounds without applying the node world\n * matrix, and the renderer (notably for skinned meshes) draws at that same local\n * scale. Returning world-transformed bounds here would make the camera-framing\n * math in model-viewer scenes disagree with the Lite render.\n */\n\nimport { getContainerMeshes } from \"babylon-lite\";\nimport type { AssetContainer as LiteAssetContainer, Mesh as LiteMesh } from \"babylon-lite\";\n\nimport { Vector3 } from \"../math/vector.js\";\nimport { BoundingInfo } from \"../culling/bounding.js\";\n\n/**\n * A Babylon.js-shaped handle over a single loaded Babylon Lite mesh. Exposes the\n * subset used by model-framing scenes: local bounding info, vertex data, and name.\n */\nexport class LoadedMesh {\n public readonly name: string;\n private readonly _mesh: LiteMesh;\n /** @internal The asset container this mesh was loaded from (for `KHR_materials_variants`). */\n public readonly _container: LiteAssetContainer | undefined;\n\n public constructor(mesh: LiteMesh, container?: LiteAssetContainer) {\n this._mesh = mesh;\n this.name = mesh.name ?? \"\";\n this._container = container;\n }\n\n /** @internal The underlying Babylon Lite mesh (e.g. for the navmesh wrapper's geometry merge). */\n public get _lite(): LiteMesh {\n return this._mesh;\n }\n\n /** Babylon.js `refreshBoundingInfo()` — bounds are read on demand, so this is a no-op. */\n public refreshBoundingInfo(_options?: unknown): LoadedMesh {\n return this;\n }\n\n /** Babylon.js `getBoundingInfo()` — local-space AABB of this mesh (see module note). */\n public getBoundingInfo(): BoundingInfo {\n const lo = this._mesh.boundMin;\n const hi = this._mesh.boundMax;\n if (lo && hi) {\n return new BoundingInfo(new Vector3(lo[0], lo[1], lo[2]), new Vector3(hi[0], hi[1], hi[2]));\n }\n return new BoundingInfo(new Vector3(0, 0, 0), new Vector3(0, 0, 0));\n }\n\n /** Babylon.js `getVerticesData(kind)` — CPU position buffer (positions only). */\n public getVerticesData(kind: string): Float32Array | null {\n const positions = this._mesh._cpuPositions;\n return kind === \"position\" ? (positions ?? null) : null;\n }\n\n /** Babylon.js `getTotalVertices()`. */\n public getTotalVertices(): number {\n const positions = this._mesh._cpuPositions;\n return positions ? positions.length / 3 : 0;\n }\n}\n\n/**\n * Wrap every renderable mesh in a loaded Babylon Lite asset container as a\n * `LoadedMesh`, matching the flat `meshes` array Babylon.js loaders return.\n *\n * Babylon.js loaders place a synthetic `__root__` transform node at\n * `result.meshes[0]` (the renderable meshes follow it). Babylon Lite builds the\n * same `__root__` (`entities[0]` for glTF) but `getContainerMeshes` returns only\n * renderable meshes. Prepend that root so index-based access (`result.meshes[1]`,\n * used by the navigation scenes) lines up with Babylon.js.\n */\nexport function collectLoadedMeshes(container: LiteAssetContainer): LoadedMesh[] {\n const renderable = getContainerMeshes(container);\n const result: LoadedMesh[] = [];\n // The glTF loader's root is a transform node (no GPU geometry) that parents the\n // renderable meshes — include it at index 0 to mirror Babylon.js `__root__`.\n // Detected as a non-renderable entity that has a `children` array (lights, which\n // BJS `meshes` excludes, are leaf nodes without one).\n for (const entity of container.entities) {\n const node = entity as unknown as { _gpu?: unknown; children?: unknown[] };\n if (!node._gpu && Array.isArray(node.children) && !renderable.includes(entity as unknown as LiteMesh)) {\n result.push(new LoadedMesh(entity as unknown as LiteMesh, container));\n }\n }\n for (const mesh of renderable) {\n result.push(new LoadedMesh(mesh, container));\n }\n return result;\n}\n","/**\n * Babylon.js-compatible `SceneLoader` and `AssetContainer` over Babylon Lite's\n * `loadGltf` / `loadBabylon`.\n *\n * Coverage note: the Lite asset container exposes a root-node hierarchy plus\n * animation groups rather than the flat `meshes` array Babylon.js returns. This\n * compat layer surfaces the underlying container (`_lite`) and the animation\n * groups, and registers everything through `addToScene`. A fully BJS-shaped flat\n * mesh list is not reconstructed in this initial pass.\n */\n\nimport { addToScene, loadGltf, loadBabylon } from \"babylon-lite\";\nimport type { AssetContainer as LiteAssetContainer, AnimationGroup } from \"babylon-lite\";\n\nimport { unsupported } from \"../error.js\";\nimport { collectLoadedMeshes, type LoadedMesh } from \"./loaded-mesh.js\";\nimport { GaussianSplattingMesh } from \"../meshes/gaussian-splatting.js\";\nimport type { Scene } from \"../scene/scene.js\";\n\n/** Path portion of a URL, without any query string (`?…`) or hash fragment (`#…`). */\nfunction urlPath(url: string): string {\n return url.split(/[?#]/)[0]!;\n}\n\n/** Splat asset extensions Babylon Lite can parse (`loadSplat` / `loadSOG` / `loadSPZ`). */\nfunction isSplatUrl(url: string): boolean {\n const u = urlPath(url).toLowerCase();\n return u.endsWith(\".ply\") || u.endsWith(\".splat\") || u.endsWith(\".sog\") || u.endsWith(\".spz\");\n}\n\n/** True when a URL points at a `.babylon` file, ignoring any query string or hash. */\nfunction isBabylonUrl(url: string): boolean {\n return urlPath(url).toLowerCase().endsWith(\".babylon\");\n}\n\n/** Last path segment of a URL, used to name a loaded Gaussian-Splatting mesh. */\nfunction baseName(url: string): string {\n const path = urlPath(url);\n return path.slice(path.lastIndexOf(\"/\") + 1) || \"splat\";\n}\n\nexport class AssetContainer {\n /** @internal Underlying Babylon Lite asset container. */\n public readonly _lite: LiteAssetContainer;\n\n public constructor(lite: LiteAssetContainer) {\n this._lite = lite;\n }\n\n public get animationGroups(): AnimationGroup[] {\n return this._lite.animationGroups ?? [];\n }\n\n /** Flat list of renderable meshes (Babylon.js-shaped handles over the loaded node tree). */\n public get meshes(): LoadedMesh[] {\n return collectLoadedMeshes(this._lite);\n }\n\n /** Add every entity, animation group, camera, and clear colour to the scene. */\n public addAllToScene(scene: Scene): void {\n addToScene(scene._lite, this._lite);\n scene._surfaceLoadedCamera();\n }\n\n public dispose(): void {\n // Lite owns container GPU resources through the scene; explicit container\n // disposal is a no-op until removed from the scene.\n }\n}\n\ninterface ImportResult {\n meshes: Array<LoadedMesh | GaussianSplattingMesh>;\n particleSystems: unknown[];\n skeletons: unknown[];\n animationGroups: AnimationGroup[];\n transformNodes: unknown[];\n lights: unknown[];\n /** The underlying Lite asset container (compat extension; absent for splat assets). */\n container?: AssetContainer;\n}\n\n/** @internal Load a splat URL into a `GaussianSplattingMesh` (shared by every loader entry point). */\nasync function loadSplatResult(url: string, scene: Scene): Promise<ImportResult> {\n const gs = new GaussianSplattingMesh(baseName(url), null, scene);\n await gs.loadFileAsync(url);\n return { meshes: [gs], particleSystems: [], skeletons: [], animationGroups: [], transformNodes: [], lights: [] };\n}\n\nfunction joinUrl(rootUrl: string, fileName: string): string {\n if (!fileName) {\n return rootUrl;\n }\n if (/^(https?:)?\\/\\//.test(fileName) || fileName.startsWith(\"/\")) {\n return fileName;\n }\n return rootUrl.endsWith(\"/\") || rootUrl === \"\" ? rootUrl + fileName : rootUrl + \"/\" + fileName;\n}\n\nasync function load(rootUrl: string, fileName: string, scene: Scene): Promise<AssetContainer> {\n const url = joinUrl(rootUrl, fileName);\n const engine = scene.getEngine()._lite;\n // Detect the format from the path (ignoring query/hash), but hand the full URL\n // to the loader so any query string is preserved.\n const lite = isBabylonUrl(url) ? await loadBabylon(engine, url) : await loadGltf(engine, url);\n return new AssetContainer(lite);\n}\n\n/** Babylon.js `SceneLoader` — async glTF/.babylon loading into a compat scene. */\nexport const SceneLoader = {\n /** Import meshes (and the rest of the asset) into the scene. */\n async ImportMeshAsync(_meshNames: unknown, rootUrl: string, sceneFilename: string, scene: Scene): Promise<ImportResult> {\n const url = joinUrl(rootUrl, sceneFilename);\n if (isSplatUrl(url)) {\n return loadSplatResult(url, scene);\n }\n const container = await load(rootUrl, sceneFilename, scene);\n container.addAllToScene(scene);\n return {\n meshes: container.meshes,\n particleSystems: [],\n skeletons: [],\n animationGroups: container.animationGroups,\n transformNodes: [],\n lights: [],\n container,\n };\n },\n\n /** Append an asset's contents to the scene. */\n async AppendAsync(rootUrl: string, sceneFilename: string, scene: Scene): Promise<Scene> {\n const url = joinUrl(rootUrl, sceneFilename);\n if (isSplatUrl(url)) {\n await loadSplatResult(url, scene);\n return scene;\n }\n const container = await load(rootUrl, sceneFilename, scene);\n container.addAllToScene(scene);\n return scene;\n },\n\n /** Load an asset into a container without adding it to the scene. */\n async LoadAssetContainerAsync(rootUrl: string, sceneFilename: string, scene: Scene): Promise<AssetContainer> {\n return load(rootUrl, sceneFilename, scene);\n },\n\n /** Plugin registration — out of scope (side-effectful global registry). */\n RegisterPlugin(): never {\n return unsupported(\n \"SceneLoader.RegisterPlugin\",\n \"Loader plugin registration is out of scope for the compat layer (it relies on a side-effectful global registry). Import the loader you need directly.\"\n );\n },\n};\n\n// ── Function-style loaders (Babylon.js 7+ `@babylonjs/core/Loading/sceneLoader`) ──\n\n/** Babylon.js `ImportMeshAsync(source, scene, options?)` — imports an asset into the scene. */\nexport async function ImportMeshAsync(source: string, scene: Scene, _options?: unknown): Promise<ImportResult> {\n if (isSplatUrl(source)) {\n return loadSplatResult(source, scene);\n }\n const container = await loadFromSource(source, scene);\n container.addAllToScene(scene);\n return {\n meshes: container.meshes,\n particleSystems: [],\n skeletons: [],\n animationGroups: container.animationGroups,\n transformNodes: [],\n lights: [],\n container,\n };\n}\n\n/** Babylon.js `AppendSceneAsync(source, scene, options?)` — appends an asset's contents to the scene. */\nexport async function AppendSceneAsync(source: string, scene: Scene, _options?: unknown): Promise<Scene> {\n if (isSplatUrl(source)) {\n await loadSplatResult(source, scene);\n return scene;\n }\n const container = await loadFromSource(source, scene);\n container.addAllToScene(scene);\n return scene;\n}\n\n/** Babylon.js `LoadAssetContainerAsync(source, scene, options?)` — loads into a container without adding. */\nexport async function LoadAssetContainerAsync(source: string, scene: Scene, _options?: unknown): Promise<AssetContainer> {\n return loadFromSource(source, scene);\n}\n\n/** @internal Load a glTF/.babylon asset from a single source URL (function-loader form). */\nasync function loadFromSource(source: string, scene: Scene): Promise<AssetContainer> {\n const engine = scene.getEngine()._lite;\n // Detect the format from the path (ignoring query/hash), but pass the full URL\n // to the loader so any query string is preserved.\n const lite = isBabylonUrl(source) ? await loadBabylon(engine, source) : await loadGltf(engine, source);\n return new AssetContainer(lite);\n}\n","/**\n * Babylon.js-compatible `AssetsManager` — a pure task scheduler built on top of\n * the compat loaders. The scheduling/observable surface has no Babylon Lite or\n * GPU dependency and is fully unit-testable; the concrete mesh/texture task types\n * delegate to the compat loaders.\n */\n\nimport { Observable } from \"../misc/observable.js\";\n\nexport type TaskState = \"init\" | \"running\" | \"done\" | \"error\";\n\n/** Base class for an asset-loading task. Subclasses implement {@link runAsync}. */\nexport abstract class AbstractAssetTask {\n public name: string;\n public state: TaskState = \"init\";\n public errorObject: { message: string; exception?: unknown } | undefined;\n\n public onSuccess?: (task: this) => void;\n public onError?: (task: this, message?: string, exception?: unknown) => void;\n\n public constructor(name: string) {\n this.name = name;\n }\n\n public get isCompleted(): boolean {\n return this.state === \"done\";\n }\n\n /** Run the task. Subclasses populate their result fields here. */\n public abstract runAsync(): Promise<void>;\n\n /** @internal Run with success/error bookkeeping. */\n public async _run(): Promise<void> {\n this.state = \"running\";\n try {\n await this.runAsync();\n this.state = \"done\";\n this.onSuccess?.(this);\n } catch (exception) {\n this.state = \"error\";\n const message = exception instanceof Error ? exception.message : String(exception);\n this.errorObject = { message, exception };\n this.onError?.(this, message, exception);\n throw exception;\n }\n }\n}\n\n/** A task whose work is provided as a plain async function (useful for custom assets and tests). */\nexport class CustomAssetTask<T> extends AbstractAssetTask {\n public result: T | undefined;\n\n public constructor(\n name: string,\n private readonly _loader: () => Promise<T>\n ) {\n super(name);\n }\n\n public override async runAsync(): Promise<void> {\n this.result = await this._loader();\n }\n}\n\nexport class AssetsManager {\n public readonly onProgressObservable = new Observable<{ remainingCount: number; totalCount: number; task: AbstractAssetTask }>();\n public readonly onTaskSuccessObservable = new Observable<AbstractAssetTask>();\n public readonly onTaskErrorObservable = new Observable<AbstractAssetTask>();\n public readonly onFinishObservable = new Observable<AbstractAssetTask[]>();\n\n // Kept for Babylon.js API parity only. The compat AssetsManager has no\n // loading-screen UI, and `loadAsync` never rejects on task failure (per-task\n // errors surface via `onTaskErrorObservable`), so neither flag affects\n // loading behavior.\n public useDefaultLoadingScreen = false;\n public autoHideLoadingUI = false;\n\n private readonly _tasks: AbstractAssetTask[] = [];\n private _isLoading = false;\n\n public get tasks(): readonly AbstractAssetTask[] {\n return this._tasks;\n }\n\n public addTask<T extends AbstractAssetTask>(task: T): T {\n this._tasks.push(task);\n return task;\n }\n\n /** Add a custom async task and return it (handy for non-mesh/texture assets and tests). */\n public addCustomTask<T>(name: string, loader: () => Promise<T>): CustomAssetTask<T> {\n return this.addTask(new CustomAssetTask<T>(name, loader));\n }\n\n public reset(): this {\n this._tasks.length = 0;\n return this;\n }\n\n /** Run all queued tasks sequentially, emitting progress, and resolve when done. */\n public async loadAsync(): Promise<AbstractAssetTask[]> {\n if (this._isLoading) {\n throw new Error(\"AssetsManager is already loading.\");\n }\n this._isLoading = true;\n const total = this._tasks.length;\n const completed: AbstractAssetTask[] = [];\n\n try {\n for (const task of this._tasks) {\n try {\n await task._run();\n this.onTaskSuccessObservable.notifyObservers(task);\n } catch {\n this.onTaskErrorObservable.notifyObservers(task);\n }\n completed.push(task);\n this.onProgressObservable.notifyObservers({ remainingCount: total - completed.length, totalCount: total, task });\n }\n this.onFinishObservable.notifyObservers(this._tasks.slice());\n return completed;\n } finally {\n this._isLoading = false;\n }\n }\n}\n","/**\n * Babylon.js `KHR_materials_variants` glTF loader extension\n * (`@babylonjs/loaders/glTF/2.0/Extensions/KHR_materials_variants`).\n *\n * Babylon.js exposes the extension's static helpers to switch a loaded asset\n * between material variants at runtime. Babylon Lite decodes the same extension\n * in its glTF loader and exposes `selectVariant` / `getVariantNames` /\n * `resetVariant` keyed by the asset container. The Babylon.js helpers are keyed\n * by the asset's **root mesh** instead, so this wrapper recovers the container\n * from the `LoadedMesh` the loader returned (`result.meshes[0]`) and delegates.\n */\n\nimport { selectVariant, getVariantNames, resetVariant } from \"babylon-lite\";\nimport type { AssetContainer as LiteAssetContainer } from \"babylon-lite\";\n\n/** Recover the Lite asset container a loaded-mesh handle came from. */\nfunction containerOf(rootMesh: unknown): LiteAssetContainer | undefined {\n return (rootMesh as { _container?: LiteAssetContainer } | null)?._container;\n}\n\n/**\n * Babylon.js `KHR_materials_variants` extension helpers. Mirrors the static\n * surface ported code calls (`SelectVariant` / `GetAvailableVariants` / `Reset`)\n * over Babylon Lite's container-keyed variant API.\n */\nexport const KHR_materials_variants = {\n /** Switch the loaded asset to the named material variant. */\n SelectVariant(rootMesh: unknown, variantName: string): void {\n const container = containerOf(rootMesh);\n if (container) {\n selectVariant(container, variantName);\n }\n },\n\n /** The variant names available on the loaded asset (empty when it has none). */\n GetAvailableVariants(rootMesh: unknown): readonly string[] {\n const container = containerOf(rootMesh);\n return container ? getVariantNames(container) : [];\n },\n\n /** Restore the asset's default (variant-free) materials. */\n Reset(rootMesh: unknown): void {\n const container = containerOf(rootMesh);\n if (container) {\n resetVariant(container);\n }\n },\n};\n","/**\n * Babylon.js-compatible `GPUPicker` over Babylon Lite's GPU picker\n * (`createGpuPicker` / `pickAsync` / `disposePicker`).\n *\n * Babylon.js's `GPUPicker` is **asynchronous** GPU picking — which is exactly\n * what Babylon Lite provides — so this is a real wrapper, not a stub. You set a\n * picking list of meshes, then `pickAsync(x, y)` resolves with the picked mesh\n * (or `null`).\n *\n * Coverage notes vs. Babylon.js:\n * - `setPickingList`, `addPickingList`, `clearPickingList`, `pickAsync`,\n * `multiPickAsync`, `pickingInProgress`, and `dispose` are implemented.\n * - The `{ mesh, material }` list-item form is accepted, but the custom picking\n * material is ignored (Lite assigns picking ids internally).\n * - `boxPickAsync` is not supported (Lite has no box-pick primitive) and throws.\n * - Hardware `InstancedMesh` picking is not represented; thin-instance picking is\n * surfaced through `thinInstanceIndex` exactly as Babylon.js does.\n */\n\nimport { createGpuPicker, pickAsync as litePickAsync, disposePicker } from \"babylon-lite\";\nimport type { GpuPicker, Mesh as LiteMesh, GaussianSplattingMesh as LiteGsMesh } from \"babylon-lite\";\n\nimport { unsupported } from \"../error.js\";\nimport { Mesh } from \"../meshes/meshes.js\";\nimport { GaussianSplattingMesh } from \"../meshes/gaussian-splatting.js\";\nimport type { Scene } from \"../scene/scene.js\";\n\n/** A pickable compat mesh: a regular `Mesh` or a `GaussianSplattingMesh`. */\ntype PickableMesh = Mesh | GaussianSplattingMesh;\n\n/** Result of a single GPU pick. Mirrors Babylon.js `IGPUPickingInfo`. */\nexport interface IGPUPickingInfo {\n mesh: PickableMesh;\n thinInstanceIndex?: number;\n}\n\n/** Result of a multi-point GPU pick. Mirrors Babylon.js `IGPUMultiPickingInfo`. */\nexport interface IGPUMultiPickingInfo {\n meshes: Array<PickableMesh | null>;\n thinInstanceIndexes?: number[];\n}\n\ntype PickListItem = PickableMesh | { mesh: PickableMesh; material?: unknown };\n\nfunction meshOf(item: PickListItem): PickableMesh {\n return item instanceof Mesh || item instanceof GaussianSplattingMesh ? item : item.mesh;\n}\n\n/** @internal The backing Lite node used as the picker's identity key for a compat mesh. */\nfunction liteNodeOf(mesh: PickableMesh): LiteMesh | LiteGsMesh | undefined {\n return mesh instanceof GaussianSplattingMesh ? mesh._pickLiteNode : mesh._lite;\n}\n\nexport class GPUPicker {\n private _picker: GpuPicker | null = null;\n private _scene: Scene | null = null;\n /** Maps Lite nodes (regular mesh or splat node) back to the compat meshes the caller supplied. */\n private readonly _liteToCompat = new Map<LiteMesh | LiteGsMesh, PickableMesh>();\n /** Regular Lite meshes that are pickable (drives the Lite `pickAsync` filter; GS meshes bypass it). */\n private _pickable = new Set<LiteMesh>();\n private _inProgress = false;\n\n /** True while an async pick is running (Babylon.js parity). */\n public get pickingInProgress(): boolean {\n return this._inProgress;\n }\n\n /** Replace the picking list. Passing `null` clears it. */\n public setPickingList(list: PickListItem[] | null): void {\n this.clearPickingList();\n if (list && list.length > 0) {\n this.addPickingList(list);\n }\n }\n\n /** Add meshes to the current picking list. */\n public addPickingList(list: PickListItem[]): void {\n if (!list || list.length === 0) {\n return;\n }\n const first = meshOf(list[0]!);\n const scene = first.getScene();\n if (!scene) {\n unsupported(\"GPUPicker.setPickingList\", \"Picking-list meshes must belong to a Scene (create them with a scene argument).\");\n }\n if (!this._picker || this._scene !== scene) {\n // Switching to a different scene: release the previous Lite picker so\n // we don't leak its GPU resources.\n if (this._picker) {\n disposePicker(this._picker);\n }\n this._scene = scene;\n this._picker = createGpuPicker(scene._lite);\n }\n for (const item of list) {\n const mesh = meshOf(item);\n const liteNode = liteNodeOf(mesh);\n if (!liteNode) {\n // A GaussianSplattingMesh whose splat is not loaded yet has no node to\n // key on; it becomes pickable once loaded and re-added.\n continue;\n }\n this._liteToCompat.set(liteNode, mesh);\n // Only regular meshes participate in the Lite filter; the Lite picker\n // auto-includes scene splat meshes (its GS pass ignores the filter).\n if (mesh instanceof Mesh) {\n this._pickable.add(mesh._lite);\n }\n }\n }\n\n /** Clear the picking list and release its bookkeeping. */\n public clearPickingList(): void {\n this._liteToCompat.clear();\n this._pickable = new Set<LiteMesh>();\n }\n\n /** Pick the mesh at canvas coordinates `(x, y)`. Resolves to `null` on a miss. */\n public async pickAsync(x: number, y: number, disposeWhenDone = false): Promise<IGPUPickingInfo | null> {\n if (this._inProgress || !this._picker || this._liteToCompat.size === 0) {\n return null;\n }\n this._inProgress = true;\n try {\n const info = await litePickAsync(this._picker, x, y, { filter: (mesh) => this._pickable.has(mesh) });\n if (!info.hit || !info.pickedMesh) {\n return null;\n }\n const mesh = this._liteToCompat.get(info.pickedMesh as LiteMesh | LiteGsMesh);\n if (!mesh) {\n return null;\n }\n return info.thinInstanceIndex >= 0 ? { mesh, thinInstanceIndex: info.thinInstanceIndex } : { mesh };\n } finally {\n this._inProgress = false;\n if (disposeWhenDone) {\n this.dispose();\n }\n }\n }\n\n /** Pick at several points. Always returns one entry per coordinate (mesh or `null`). */\n public async multiPickAsync(xy: Array<{ x: number; y: number }>, disposeWhenDone = false): Promise<IGPUMultiPickingInfo | null> {\n if (this._inProgress || !this._picker || this._liteToCompat.size === 0 || xy.length === 0) {\n return null;\n }\n const meshes: Array<PickableMesh | null> = [];\n const thinInstanceIndexes: number[] = [];\n for (const point of xy) {\n // Sequential: Lite picks one pixel per call.\n const result = await this.pickAsync(point.x, point.y);\n meshes.push(result?.mesh ?? null);\n thinInstanceIndexes.push(result?.thinInstanceIndex ?? 0);\n }\n if (disposeWhenDone) {\n this.dispose();\n }\n return { meshes, thinInstanceIndexes };\n }\n\n /** Box picking is not implemented in Babylon Lite. */\n public boxPickAsync(): never {\n return unsupported(\"GPUPicker.boxPickAsync\", \"Box (area) picking is not implemented in Babylon Lite. Use `multiPickAsync` over the points you need.\");\n }\n\n /** Release GPU picking resources. */\n public dispose(): void {\n if (this._picker) {\n disposePicker(this._picker);\n this._picker = null;\n }\n this._scene = null;\n this.clearPickingList();\n }\n}\n","/**\n * Babylon.js-compatible gizmos over Babylon Lite's gizmo suite.\n *\n * Babylon.js gizmos take a `UtilityLayerRenderer` and attach to a node via\n * `attachedMesh`/`attachedNode`. Babylon Lite mirrors this with\n * `createUtilityLayer` + `create*Gizmo(engine, layer)` + `attach*ToNode`. These\n * wrappers reproduce the Babylon.js class shape and the `attachedMesh` setter.\n */\n\nimport {\n createUtilityLayer,\n registerUtilityLayer,\n disposeUtilityLayer,\n createPositionGizmo,\n attachPositionGizmoToNode,\n disposePositionGizmo,\n setPositionGizmoLocalCoordinates,\n createRotationGizmo,\n attachRotationGizmoToNode,\n disposeRotationGizmo,\n setRotationGizmoLocalCoordinates,\n createScaleGizmo,\n attachScaleGizmoToNode,\n disposeScaleGizmo,\n setScaleGizmoLocalCoordinates,\n createBoundingBoxGizmo,\n attachBoundingBoxGizmoToNode,\n disposeBoundingBoxGizmo,\n createLightGizmo,\n attachLightGizmoToLight,\n disposeLightGizmo,\n createCameraGizmo,\n attachCameraGizmoToCamera,\n disposeCameraGizmo,\n createAxisDragGizmo,\n attachAxisDragGizmoToNode,\n disposeAxisDragGizmo,\n createPlaneRotationGizmo,\n attachPlaneRotationGizmoToNode,\n disposePlaneRotationGizmo,\n createPlaneDragGizmo,\n attachPlaneDragGizmoToNode,\n disposePlaneDragGizmo,\n createAxisScaleGizmo,\n attachAxisScaleGizmoToNode,\n disposeAxisScaleGizmo,\n} from \"babylon-lite\";\nimport type {\n UtilityLayer as LiteUtilityLayer,\n PositionGizmo as LitePositionGizmo,\n RotationGizmo as LiteRotationGizmo,\n ScaleGizmo as LiteScaleGizmo,\n BoundingBoxGizmo as LiteBoundingBoxGizmo,\n LightGizmo as LiteLightGizmo,\n CameraGizmo as LiteCameraGizmo,\n AxisDragGizmo as LiteAxisDragGizmo,\n PlaneRotationGizmo as LitePlaneRotationGizmo,\n PlaneDragGizmo as LitePlaneDragGizmo,\n AxisScaleGizmo as LiteAxisScaleGizmo,\n EngineContext,\n SceneNode,\n} from \"babylon-lite\";\n\nimport type { Scene } from \"../scene/scene.js\";\nimport type { AbstractMesh, Mesh } from \"../meshes/meshes.js\";\nimport type { Node } from \"../node/node.js\";\nimport type { Light } from \"../lights/lights.js\";\nimport type { Camera } from \"../cameras/cameras.js\";\nimport type { Vector3 } from \"../math/vector.js\";\nimport type { Color3 } from \"../math/color.js\";\n\n/** Babylon.js `UtilityLayerRenderer` — the overlay scene gizmos render into. */\nexport class UtilityLayerRenderer {\n /** @internal Underlying Babylon Lite utility layer. */\n public readonly _lite: LiteUtilityLayer;\n /** @internal Lite engine backing the layer (gizmo factories need it explicitly). */\n public readonly _engine: EngineContext;\n private _registered = false;\n\n public constructor(scene: Scene) {\n this._engine = scene.getEngine()._lite;\n this._lite = createUtilityLayer(this._engine, scene._lite);\n // Babylon Lite registers a utility layer *after* its gizmos are created and\n // after the main scene is registered. Gizmo creation is synchronous (all\n // gizmos exist by the time the engine starts), so defer registration to the\n // engine's late-work phase to capture every gizmo.\n scene.getEngine()._registerLateWork(() => this._ensureRegistered());\n }\n\n /** @internal Ensure the layer is registered with the engine (idempotent). */\n public _ensureRegistered(): Promise<void> {\n if (this._registered) {\n return Promise.resolve();\n }\n this._registered = true;\n return registerUtilityLayer(this._lite);\n }\n\n public dispose(): void {\n disposeUtilityLayer(this._lite);\n }\n}\n\n/** Shared base for compat gizmos (Babylon.js `Gizmo`). */\nabstract class GizmoBase {\n /** @internal The utility layer this gizmo renders into. */\n public readonly _layer: UtilityLayerRenderer;\n\n protected constructor(layer: UtilityLayerRenderer) {\n this._layer = layer;\n // The utility layer registers itself with the engine during the engine's\n // late-work phase (after all gizmos are created), so no eager registration\n // is needed here.\n }\n\n public abstract get attachedMesh(): AbstractMesh | null;\n public abstract set attachedMesh(value: AbstractMesh | null);\n\n public abstract dispose(): void;\n}\n\nexport class PositionGizmo extends GizmoBase {\n /** @internal */\n public readonly _lite: LitePositionGizmo;\n private _attached: AbstractMesh | null = null;\n\n public constructor(layer: UtilityLayerRenderer) {\n super(layer);\n this._lite = createPositionGizmo(layer._engine, layer._lite);\n // Babylon.js `Gizmo.updateGizmoRotationToMatchAttachedMesh` defaults to true.\n setPositionGizmoLocalCoordinates(this._lite, true);\n }\n\n /** Babylon.js `Gizmo.updateGizmoRotationToMatchAttachedMesh` — orient widgets to the node's local axes. */\n public set updateGizmoRotationToMatchAttachedMesh(value: boolean) {\n setPositionGizmoLocalCoordinates(this._lite, value);\n }\n\n public get attachedMesh(): AbstractMesh | null {\n return this._attached;\n }\n public set attachedMesh(value: AbstractMesh | null) {\n this._attached = value;\n attachPositionGizmoToNode(this._lite, (value?._lite as SceneNode | undefined) ?? null);\n }\n\n public get attachedNode(): AbstractMesh | null {\n return this._attached;\n }\n public set attachedNode(value: AbstractMesh | null) {\n this.attachedMesh = value;\n }\n\n public override dispose(): void {\n disposePositionGizmo(this._lite, this._layer._lite);\n }\n}\n\nexport class RotationGizmo extends GizmoBase {\n /** @internal */\n public readonly _lite: LiteRotationGizmo;\n private _attached: AbstractMesh | null = null;\n\n public constructor(layer: UtilityLayerRenderer) {\n super(layer);\n this._lite = createRotationGizmo(layer._engine, layer._lite);\n // Babylon.js `Gizmo.updateGizmoRotationToMatchAttachedMesh` defaults to true.\n setRotationGizmoLocalCoordinates(this._lite, true);\n }\n\n /** Babylon.js `Gizmo.updateGizmoRotationToMatchAttachedMesh` — orient widgets to the node's local axes. */\n public set updateGizmoRotationToMatchAttachedMesh(value: boolean) {\n setRotationGizmoLocalCoordinates(this._lite, value);\n }\n\n public get attachedMesh(): AbstractMesh | null {\n return this._attached;\n }\n public set attachedMesh(value: AbstractMesh | null) {\n this._attached = value;\n attachRotationGizmoToNode(this._lite, (value?._lite as SceneNode | undefined) ?? null);\n }\n\n public get attachedNode(): AbstractMesh | null {\n return this._attached;\n }\n public set attachedNode(value: AbstractMesh | null) {\n this.attachedMesh = value;\n }\n\n public override dispose(): void {\n disposeRotationGizmo(this._lite, this._layer._lite);\n }\n}\n\nexport class ScaleGizmo extends GizmoBase {\n /** @internal */\n public readonly _lite: LiteScaleGizmo;\n private _attached: AbstractMesh | null = null;\n\n public constructor(layer: UtilityLayerRenderer) {\n super(layer);\n this._lite = createScaleGizmo(layer._engine, layer._lite);\n // Babylon.js `Gizmo.updateGizmoRotationToMatchAttachedMesh` defaults to true.\n setScaleGizmoLocalCoordinates(this._lite, true);\n }\n\n /** Babylon.js `Gizmo.updateGizmoRotationToMatchAttachedMesh` — orient widgets to the node's local axes. */\n public set updateGizmoRotationToMatchAttachedMesh(value: boolean) {\n setScaleGizmoLocalCoordinates(this._lite, value);\n }\n\n public get attachedMesh(): AbstractMesh | null {\n return this._attached;\n }\n public set attachedMesh(value: AbstractMesh | null) {\n this._attached = value;\n attachScaleGizmoToNode(this._lite, (value?._lite as SceneNode | undefined) ?? null);\n }\n\n public get attachedNode(): AbstractMesh | null {\n return this._attached;\n }\n public set attachedNode(value: AbstractMesh | null) {\n this.attachedMesh = value;\n }\n\n public override dispose(): void {\n disposeScaleGizmo(this._lite, this._layer._lite);\n }\n}\n\nexport class BoundingBoxGizmo extends GizmoBase {\n /** @internal */\n public readonly _lite: LiteBoundingBoxGizmo;\n private _attached: AbstractMesh | null = null;\n\n /**\n * Babylon.js `BoundingBoxGizmo(color?, utilityLayer?)`. The first argument may\n * be the gizmo colour (when a layer is also supplied) or the utility layer.\n */\n public constructor(colorOrLayer: Color3 | UtilityLayerRenderer, layer?: UtilityLayerRenderer) {\n const resolvedLayer = layer ?? (colorOrLayer as UtilityLayerRenderer);\n const color = layer ? (colorOrLayer as Color3) : undefined;\n super(resolvedLayer);\n this._lite = createBoundingBoxGizmo(resolvedLayer._engine, resolvedLayer._lite, color ? { color: [color.r, color.g, color.b] } : {});\n }\n\n public get attachedMesh(): AbstractMesh | null {\n return this._attached;\n }\n public set attachedMesh(value: AbstractMesh | null) {\n this._attached = value;\n attachBoundingBoxGizmoToNode(this._lite, nodeLite(value));\n }\n\n public get attachedNode(): AbstractMesh | null {\n return this._attached;\n }\n public set attachedNode(value: AbstractMesh | null) {\n this.attachedMesh = value;\n }\n\n /** Babylon.js `BoundingBoxGizmo.enableDragBehavior()` — enables body-drag (Lite enables it by default). */\n public enableDragBehavior(): void {\n // Babylon Lite's bounding-box gizmo wires body-drag through its own pointer\n // behaviour; no explicit opt-in is required.\n }\n\n public override dispose(): void {\n disposeBoundingBoxGizmo(this._lite, this._layer._lite);\n }\n}\n\nexport class LightGizmo {\n /** @internal */\n public readonly _lite: LiteLightGizmo;\n /** @internal */\n public readonly _layer: UtilityLayerRenderer;\n private _attached: Light | null = null;\n\n public constructor(layer: UtilityLayerRenderer) {\n this._layer = layer;\n this._lite = createLightGizmo(layer._engine, layer._lite);\n }\n\n public get light(): Light | null {\n return this._attached;\n }\n public set light(value: Light | null) {\n this._attached = value;\n attachLightGizmoToLight(this._lite, value?._lite ?? null);\n }\n\n /**\n * Babylon.js `LightGizmo.attachedMesh` — the gizmo's visual root. Babylon.js\n * code reads this to reposition the gizmo for lights without a position (e.g.\n * hemispheric). Returns a thin proxy over the Lite gizmo's `root` node whose\n * `position` writes through to it.\n */\n public get attachedMesh(): { position: Vector3 } {\n const root = this._lite.root;\n return {\n get position(): Vector3 {\n return root.position as unknown as Vector3;\n },\n set position(v: Vector3) {\n root.position.set(v.x, v.y, v.z);\n },\n };\n }\n\n public dispose(): void {\n disposeLightGizmo(this._lite, this._layer._lite);\n }\n}\n\nexport class CameraGizmo {\n /** @internal */\n public readonly _lite: LiteCameraGizmo;\n /** @internal */\n public readonly _layer: UtilityLayerRenderer;\n private _attached: Camera | null = null;\n\n public constructor(layer: UtilityLayerRenderer) {\n this._layer = layer;\n this._lite = createCameraGizmo(layer._engine, layer._lite);\n }\n\n public get camera(): Camera | null {\n return this._attached;\n }\n public set camera(value: Camera | null) {\n this._attached = value;\n attachCameraGizmoToCamera(this._lite, value?._lite ?? null);\n }\n\n public dispose(): void {\n disposeCameraGizmo(this._lite, this._layer._lite);\n }\n}\n\n/**\n * Babylon.js single-axis / single-plane gizmos. Babylon.js constructs these with\n * `(axis, color, utilityLayer)` and attaches to a node via `attachedNode`. Each\n * maps to a Babylon Lite single-axis gizmo factory.\n *\n * @internal Resolve the Lite scene node for a compat node (mesh `_lite` or\n * transform `_node`).\n */\nfunction nodeLite(value: Node | null): SceneNode | null {\n if (!value) {\n return null;\n }\n const n = value as { _lite?: SceneNode; _node?: SceneNode };\n return n._lite ?? n._node ?? null;\n}\n\n/** Babylon.js `AxisDragGizmo` — drags the attached node along a single world axis. */\nexport class AxisDragGizmo extends GizmoBase {\n /** @internal */\n public readonly _lite: LiteAxisDragGizmo;\n private _attached: Node | null = null;\n\n public constructor(dragAxis: Vector3, color: Color3, layer: UtilityLayerRenderer) {\n super(layer);\n this._lite = createAxisDragGizmo(layer._engine, layer._lite, {\n dragAxis: { x: dragAxis.x, y: dragAxis.y, z: dragAxis.z },\n color: [color.r, color.g, color.b],\n });\n }\n\n public get attachedMesh(): AbstractMesh | null {\n return this._attached as AbstractMesh | null;\n }\n public set attachedMesh(value: AbstractMesh | null) {\n this.attachedNode = value;\n }\n\n public get attachedNode(): Node | null {\n return this._attached;\n }\n public set attachedNode(value: Node | null) {\n this._attached = value;\n attachAxisDragGizmoToNode(this._lite, nodeLite(value));\n }\n\n public override dispose(): void {\n disposeAxisDragGizmo(this._lite, this._layer._lite);\n }\n}\n\n/** Babylon.js `PlaneRotationGizmo` — rotates the attached node about a plane normal. */\nexport class PlaneRotationGizmo extends GizmoBase {\n /** @internal */\n public readonly _lite: LitePlaneRotationGizmo;\n private _attached: Node | null = null;\n\n public constructor(planeNormal: Vector3, color: Color3, layer: UtilityLayerRenderer) {\n super(layer);\n this._lite = createPlaneRotationGizmo(layer._engine, layer._lite, {\n planeNormal: { x: planeNormal.x, y: planeNormal.y, z: planeNormal.z },\n color: [color.r, color.g, color.b],\n });\n }\n\n public get attachedMesh(): AbstractMesh | null {\n return this._attached as AbstractMesh | null;\n }\n public set attachedMesh(value: AbstractMesh | null) {\n this.attachedNode = value;\n }\n\n public get attachedNode(): Node | null {\n return this._attached;\n }\n public set attachedNode(value: Node | null) {\n this._attached = value;\n attachPlaneRotationGizmoToNode(this._lite, nodeLite(value));\n }\n\n public override dispose(): void {\n disposePlaneRotationGizmo(this._lite, this._layer._lite);\n }\n}\n\n/** Babylon.js `PlaneDragGizmo` — drags the attached node within a plane. */\nexport class PlaneDragGizmo extends GizmoBase {\n /** @internal */\n public readonly _lite: LitePlaneDragGizmo;\n private _attached: Node | null = null;\n\n public constructor(dragPlaneNormal: Vector3, color: Color3, layer: UtilityLayerRenderer) {\n super(layer);\n this._lite = createPlaneDragGizmo(layer._engine, layer._lite, {\n dragPlaneNormal: { x: dragPlaneNormal.x, y: dragPlaneNormal.y, z: dragPlaneNormal.z },\n color: [color.r, color.g, color.b],\n });\n }\n\n public get attachedMesh(): AbstractMesh | null {\n return this._attached as AbstractMesh | null;\n }\n public set attachedMesh(value: AbstractMesh | null) {\n this.attachedNode = value;\n }\n\n public get attachedNode(): Node | null {\n return this._attached;\n }\n public set attachedNode(value: Node | null) {\n this._attached = value;\n attachPlaneDragGizmoToNode(this._lite, nodeLite(value));\n }\n\n public override dispose(): void {\n disposePlaneDragGizmo(this._lite, this._layer._lite);\n }\n}\n\n/** Babylon.js `AxisScaleGizmo` — scales the attached node along a single axis. */\nexport class AxisScaleGizmo extends GizmoBase {\n /** @internal */\n public readonly _lite: LiteAxisScaleGizmo;\n private _attached: Node | null = null;\n\n public constructor(dragAxis: Vector3, color: Color3, layer: UtilityLayerRenderer) {\n super(layer);\n this._lite = createAxisScaleGizmo(layer._engine, layer._lite, {\n dragAxis: { x: dragAxis.x, y: dragAxis.y, z: dragAxis.z },\n color: [color.r, color.g, color.b],\n });\n }\n\n public get attachedMesh(): AbstractMesh | null {\n return this._attached as AbstractMesh | null;\n }\n public set attachedMesh(value: AbstractMesh | null) {\n this.attachedNode = value;\n }\n\n public get attachedNode(): Node | null {\n return this._attached;\n }\n public set attachedNode(value: Node | null) {\n this._attached = value;\n attachAxisScaleGizmoToNode(this._lite, nodeLite(value));\n }\n\n public override dispose(): void {\n disposeAxisScaleGizmo(this._lite, this._layer._lite);\n }\n}\n\n/**\n * Babylon.js `GizmoManager` — coordinates the position/rotation/scale/bounding-box\n * gizmos over a shared utility layer and a single attached mesh.\n */\nexport class GizmoManager {\n public readonly gizmos: {\n positionGizmo: PositionGizmo | null;\n rotationGizmo: RotationGizmo | null;\n scaleGizmo: ScaleGizmo | null;\n boundingBoxGizmo: BoundingBoxGizmo | null;\n } = { positionGizmo: null, rotationGizmo: null, scaleGizmo: null, boundingBoxGizmo: null };\n\n private readonly _layer: UtilityLayerRenderer;\n private _attached: AbstractMesh | null = null;\n\n public constructor(scene: Scene) {\n this._layer = new UtilityLayerRenderer(scene);\n }\n\n public set positionGizmoEnabled(enabled: boolean) {\n this._toggle(\"positionGizmo\", enabled, () => new PositionGizmo(this._layer));\n }\n public set rotationGizmoEnabled(enabled: boolean) {\n this._toggle(\"rotationGizmo\", enabled, () => new RotationGizmo(this._layer));\n }\n public set scaleGizmoEnabled(enabled: boolean) {\n this._toggle(\"scaleGizmo\", enabled, () => new ScaleGizmo(this._layer));\n }\n public set boundingBoxGizmoEnabled(enabled: boolean) {\n this._toggle(\"boundingBoxGizmo\", enabled, () => new BoundingBoxGizmo(this._layer));\n }\n\n public attachToMesh(mesh: Mesh | null): void {\n this._attached = mesh;\n if (this.gizmos.positionGizmo) {\n this.gizmos.positionGizmo.attachedMesh = mesh;\n }\n if (this.gizmos.rotationGizmo) {\n this.gizmos.rotationGizmo.attachedMesh = mesh;\n }\n if (this.gizmos.scaleGizmo) {\n this.gizmos.scaleGizmo.attachedMesh = mesh;\n }\n if (this.gizmos.boundingBoxGizmo) {\n this.gizmos.boundingBoxGizmo.attachedMesh = mesh;\n }\n }\n\n public dispose(): void {\n this.gizmos.positionGizmo?.dispose();\n this.gizmos.rotationGizmo?.dispose();\n this.gizmos.scaleGizmo?.dispose();\n this.gizmos.boundingBoxGizmo?.dispose();\n this._layer.dispose();\n }\n\n private _toggle<K extends \"positionGizmo\" | \"rotationGizmo\" | \"scaleGizmo\" | \"boundingBoxGizmo\">(\n key: K,\n enabled: boolean,\n make: () => PositionGizmo | RotationGizmo | ScaleGizmo | BoundingBoxGizmo\n ): void {\n if (enabled && !this.gizmos[key]) {\n const gizmo = make() as never;\n this.gizmos[key] = gizmo;\n this.gizmos[key]!.attachedMesh = this._attached;\n } else if (!enabled && this.gizmos[key]) {\n this.gizmos[key]!.dispose();\n this.gizmos[key] = null;\n }\n }\n}\n","/**\n * Babylon.js-compatible camera/mesh behaviors.\n *\n * Camera behaviors (`AutoRotationBehavior`, `BouncingBehavior`,\n * `FramingBehavior`) operate on the compat `ArcRotateCamera` via the scene's\n * before-render hook. `AutoRotationBehavior` is fully functional; bouncing and\n * framing implement the structural surface plus their core action without\n * Babylon.js's tweened animations (so they are `⚡ Partial`).\n */\n\nimport { onBeforeRender } from \"babylon-lite\";\n\nimport type { ArcRotateCamera } from \"../cameras/cameras.js\";\n\n/** Babylon.js `Behavior<T>` interface. */\nexport interface Behavior<T> {\n readonly name: string;\n init(): void;\n attach(target: T): void;\n detach(): void;\n}\n\n/** Idle auto-rotation of an `ArcRotateCamera` (spins `alpha` when not interacting). */\nexport class AutoRotationBehavior implements Behavior<ArcRotateCamera> {\n public readonly name = \"AutoRotation\";\n /** Idle rotation speed in radians/second. */\n public idleRotationSpeed = 0.05;\n private _camera: ArcRotateCamera | null = null;\n private _detach: (() => void) | undefined;\n\n public init(): void {\n // no-op\n }\n\n public attach(camera: ArcRotateCamera): void {\n this._camera = camera;\n const scene = camera.getScene();\n if (!scene) {\n return;\n }\n // onBeforeRender passes the frame delta in milliseconds.\n const cb = (deltaMs: number): void => {\n if (this._camera) {\n this._camera.alpha += this.idleRotationSpeed * (deltaMs / 1000);\n }\n };\n onBeforeRender(scene._lite, cb);\n this._detach = () => {\n this._camera = null;\n };\n }\n\n public detach(): void {\n this._detach?.();\n this._detach = undefined;\n }\n}\n\n/** Clamps an `ArcRotateCamera`'s radius to a [lower, upper] band (no bounce tween). */\nexport class BouncingBehavior implements Behavior<ArcRotateCamera> {\n public readonly name = \"Bouncing\";\n public lowerRadiusTransitionRange = 2;\n public upperRadiusTransitionRange = -2;\n private _camera: ArcRotateCamera | null = null;\n private _detach: (() => void) | undefined;\n\n public init(): void {\n // no-op\n }\n\n public attach(camera: ArcRotateCamera): void {\n this._camera = camera;\n const scene = camera.getScene();\n if (!scene) {\n return;\n }\n const cb = (): void => {\n const cam = this._camera;\n if (!cam) {\n return;\n }\n if (cam.lowerRadiusLimit != null && cam.radius < cam.lowerRadiusLimit) {\n cam.radius = cam.lowerRadiusLimit;\n }\n if (cam.upperRadiusLimit != null && cam.radius > cam.upperRadiusLimit) {\n cam.radius = cam.upperRadiusLimit;\n }\n };\n onBeforeRender(scene._lite, cb);\n this._detach = () => {\n this._camera = null;\n };\n }\n\n public detach(): void {\n this._detach?.();\n this._detach = undefined;\n }\n}\n\n/** Frames an `ArcRotateCamera` on a target by setting its radius (no zoom tween). */\nexport class FramingBehavior implements Behavior<ArcRotateCamera> {\n public readonly name = \"Framing\";\n public radius = 10;\n private _camera: ArcRotateCamera | null = null;\n\n public init(): void {\n // no-op\n }\n\n public attach(camera: ArcRotateCamera): void {\n this._camera = camera;\n }\n\n public detach(): void {\n this._camera = null;\n }\n\n /** Set the camera radius to frame a target of the given world-space radius. */\n public zoomOnBoundingRadius(boundingRadius: number): void {\n if (this._camera) {\n this._camera.radius = boundingRadius * 2.5;\n }\n }\n}\n","/**\n * Babylon.js-compatible `SpriteManager` / `Sprite` over Babylon Lite's\n * camera-facing billboard sprite system.\n *\n * Babylon.js positions sprites in **world space** (`sprite.position` is a\n * `Vector3`, `sprite.width`/`height` are world units) and renders them as\n * camera-facing billboards. Babylon Lite's `createFacingBillboardSystem` +\n * `addBillboardSpriteIndex` use the exact same world-space model\n * (`position: [x,y,z]`, `sizeWorld: [w,h]`), so the mapping is direct.\n *\n * The atlas image loads asynchronously, so the `SpriteManager` constructor\n * defers building the Lite billboard system until engine start: it tracks the\n * atlas-load promise via `scene._trackTextureLoad` and registers a\n * `scene._deferAdd` callback that — once the atlas is ready — builds the system,\n * pushes every `Sprite`'s current props, and attaches it to the scene.\n */\n\nimport {\n loadSpriteAtlas,\n createFacingBillboardSystem,\n addBillboardSpriteIndex,\n updateBillboardSpriteIndex,\n addFacingBillboardSystem,\n billboardBlendAlpha,\n billboardBlendAdditive,\n createSprite2DLayer,\n addSprite2DIndex,\n updateSprite2DIndex,\n createSpriteRenderer,\n registerSpriteRenderer,\n spriteBlendAlpha,\n spriteBlendPremultiplied,\n spriteBlendAdditive,\n} from \"babylon-lite\";\nimport type { SpriteAtlas, FacingBillboardSpriteSystem, BillboardBlendDescriptor, BillboardSpriteInit, Sprite2DLayer, SpriteBlendMode } from \"babylon-lite\";\n\nimport { Vector3 } from \"../math/vector.js\";\nimport { Color4 } from \"../math/color.js\";\nimport type { Scene } from \"../scene/scene.js\";\nimport type { WebGPUEngine } from \"../engine/engine.js\";\n\ninterface CellSize {\n width: number;\n height: number;\n}\n\n/** Babylon.js `Constants.ALPHA_ONEONE` (additive). */\nconst ALPHA_ONEONE = 6;\n/** Babylon.js `Constants.ALPHA_ADD`. */\nconst ALPHA_ADD = 1;\n\n/**\n * Babylon.js `SpriteManager` — owns a sprite atlas and a pool of `Sprite`s that\n * render as camera-facing billboards. Backed by a Lite facing-billboard system.\n */\nexport class SpriteManager {\n public name: string;\n /** Babylon.js `manager.disableDepthWrite`. Accepted for parity (Lite billboards self-manage depth). */\n public disableDepthWrite = false;\n /** Babylon.js `manager.blendMode` (`Constants.ALPHA_*`). Mapped to a Lite billboard blend at build. */\n public blendMode = 2;\n\n /** @internal Sprites created against this manager, in creation order. */\n public readonly _sprites: Sprite[] = [];\n /** @internal The Lite billboard system, built at engine start. */\n public _lite?: FacingBillboardSpriteSystem;\n\n private _atlas?: SpriteAtlas;\n\n public constructor(name: string, url: string, capacity: number, cellSize: CellSize, scene: Scene, _epsilon = 0.01, samplingMode = 2) {\n this.name = name;\n const engine = scene.getEngine()._lite;\n // Babylon.js `Texture.NEAREST_SAMPLINGMODE` is 1; everything else (bi/tri-\n // linear) maps to Lite's \"linear\".\n const sampling = samplingMode === 1 ? \"nearest\" : \"linear\";\n // Kick off the async atlas load; resolve stores the atlas for the\n // deferred build. Tracked so the engine awaits it before building.\n scene._trackTextureLoad(\n loadSpriteAtlas(engine, url, {\n gridSize: [cellSize.width, cellSize.height],\n sampling,\n }).then((atlas) => {\n this._atlas = atlas;\n })\n );\n // Build the billboard system once the atlas is ready (after pending\n // textures are awaited) and attach it to the scene.\n scene._deferAdd(() => {\n if (!this._atlas) {\n return;\n }\n const blendMode = this._mapBlendMode();\n const system = createFacingBillboardSystem(this._atlas, { capacity, blendMode });\n for (const sprite of this._sprites) {\n sprite._applyTo(system);\n }\n this._lite = system;\n addFacingBillboardSystem(scene._lite, system);\n });\n }\n\n /** @internal Map the Babylon.js `Constants.ALPHA_*` blend mode to a Lite billboard blend. */\n private _mapBlendMode(): BillboardBlendDescriptor {\n if (this.blendMode === ALPHA_ONEONE || this.blendMode === ALPHA_ADD) {\n return billboardBlendAdditive;\n }\n return billboardBlendAlpha;\n }\n}\n\n/**\n * Babylon.js `Sprite` — a single camera-facing billboard in a `SpriteManager`'s\n * atlas. World-space position + size; cell index selects the atlas frame.\n *\n * Properties are **live**: once the manager has built its Lite billboard system\n * (at engine start), mutating a sprite property pushes an\n * `updateBillboardSpriteIndex` patch so per-frame animation (e.g. advancing\n * `cellIndex` or toggling `isVisible`) is reflected on the GPU. Before the\n * system is built, property writes are buffered and flushed once in `_applyTo`.\n *\n * Note: `position`/`color` are object values; reassigning them\n * (`sprite.position = new Vector3(...)`) pushes a patch, but mutating a\n * component in place (`sprite.position.x = …`) does not — call the setter (or\n * reassign) to push a live update.\n */\nexport class Sprite {\n public name: string;\n\n private _position = new Vector3(0, 0, 0);\n private _width = 1;\n private _height = 1;\n private _cellIndex = 0;\n private _angle = 0;\n private _color = new Color4(1, 1, 1, 1);\n private _invertU = false;\n private _invertV = false;\n private _visible = true;\n\n /** @internal The Lite billboard system this sprite belongs to (set in `_applyTo`). */\n private _system?: FacingBillboardSpriteSystem;\n /** @internal This sprite's instance index in `_system` (set in `_applyTo`). */\n private _index = -1;\n\n public constructor(name: string, manager: SpriteManager) {\n this.name = name;\n manager._sprites.push(this);\n }\n\n public get position(): Vector3 {\n return this._position;\n }\n public set position(value: Vector3) {\n this._position = value;\n this._patch({ position: [value.x, value.y, value.z] });\n }\n\n public get width(): number {\n return this._width;\n }\n public set width(value: number) {\n this._width = value;\n this._patch({ sizeWorld: [value, this._height] });\n }\n\n public get height(): number {\n return this._height;\n }\n public set height(value: number) {\n this._height = value;\n this._patch({ sizeWorld: [this._width, value] });\n }\n\n public get cellIndex(): number {\n return this._cellIndex;\n }\n public set cellIndex(value: number) {\n this._cellIndex = value;\n this._patch({ frame: value });\n }\n\n public get angle(): number {\n return this._angle;\n }\n public set angle(value: number) {\n this._angle = value;\n this._patch({ rotation: value });\n }\n\n public get color(): Color4 {\n return this._color;\n }\n public set color(value: Color4) {\n this._color = value;\n this._patch({ color: [value.r, value.g, value.b, value.a] });\n }\n\n public get invertU(): boolean {\n return this._invertU;\n }\n public set invertU(value: boolean) {\n this._invertU = value;\n this._patch({ flipX: value });\n }\n\n public get invertV(): boolean {\n return this._invertV;\n }\n public set invertV(value: boolean) {\n this._invertV = value;\n this._patch({ flipY: value });\n }\n\n public get isVisible(): boolean {\n return this._visible;\n }\n public set isVisible(value: boolean) {\n this._visible = value;\n this._patch({ visible: value });\n }\n\n /** @internal Add this sprite to the Lite billboard system and record its index for live updates. */\n public _applyTo(system: FacingBillboardSpriteSystem): void {\n this._index = addBillboardSpriteIndex(system, {\n position: [this._position.x, this._position.y, this._position.z],\n sizeWorld: [this._width, this._height],\n frame: this._cellIndex,\n rotation: this._angle,\n color: [this._color.r, this._color.g, this._color.b, this._color.a],\n flipX: this._invertU,\n flipY: this._invertV,\n visible: this._visible,\n });\n this._system = system;\n }\n\n /** @internal Push a live property patch to the Lite billboard system (no-op before build). */\n private _patch(patch: Partial<BillboardSpriteInit>): void {\n if (this._system && this._index >= 0) {\n updateBillboardSpriteIndex(this._system, this._index, patch);\n }\n }\n}\n\n/** Babylon.js `Constants.ALPHA_PREMULTIPLIED`. */\nconst ALPHA_PREMULTIPLIED = 7;\n\n/**\n * Babylon.js `ThinSprite` — a lightweight pixel-space sprite drawn by a\n * {@link SpriteRenderer}. Position is in screen pixels (origin bottom-left, +Y\n * up, matching the orthographic projection BJS sprite scenes set up); size is in\n * pixels; `cellIndex` selects the atlas frame.\n */\nexport class ThinSprite {\n public position = new Vector3(0, 0, 0);\n public width = 1;\n public height = 1;\n public cellIndex = 0;\n public angle = 0;\n public color = new Color4(1, 1, 1, 1);\n public invertU = false;\n public invertV = false;\n public isVisible = true;\n}\n\ninterface ThinSpriteLike {\n position: { x: number; y: number };\n width: number;\n height: number;\n cellIndex: number;\n angle: number;\n color: { r: number; g: number; b: number; a: number };\n invertU: boolean;\n invertV: boolean;\n isVisible: boolean;\n}\n\n/**\n * Babylon.js `SpriteRenderer` — the low-level, scene-less pixel-space sprite\n * pass. Babylon.js scenes build an array of {@link ThinSprite}s and call\n * `renderer.render(sprites, dt, view, projection)` from their own render loop\n * with an orthographic pixel projection.\n *\n * Babylon Lite's equivalent is `createSpriteRenderer` + a pixel-space\n * `Sprite2DLayer`. The atlas image loads asynchronously, so the renderer\n * registers the atlas load as engine startup work (evaluated once `cellWidth`/\n * `cellHeight` are set), then builds + registers a self-drawing Lite sprite\n * renderer on the first `render(...)` call (the engine invokes the loop callback\n * once after startup for scene-less loops). Subsequent `render(...)` calls push\n * live per-sprite updates so animated scenes stay in sync.\n *\n * Coordinate mapping: BJS sprite positions are bottom-left-origin pixels (the\n * scenes use `OrthoOffCenterLH(0, w, 0, h)` and set `y = canvas.height - topY`),\n * whereas Lite `Sprite2DLayer` uses top-left-origin pixels — so the Y axis is\n * flipped (`positionPx.y = canvasHeight - sprite.position.y`) and the rotation\n * sign is negated to match.\n */\nexport class SpriteRenderer {\n public texture: { name: string; samplingMode?: number } | null = null;\n public cellWidth = 0;\n public cellHeight = 0;\n public disableDepthWrite = false;\n /** Babylon.js `Constants.ALPHA_*` blend mode. `ALPHA_PREMULTIPLIED` maps to Lite's premultiplied path. */\n public blendMode = 2;\n /** @internal Babylon.js scenes poll this to gate readiness; true once the Lite renderer is built. */\n public _shadersLoaded = false;\n\n private readonly _engine: WebGPUEngine;\n private readonly _capacity: number;\n private _atlas?: SpriteAtlas;\n private _layer?: Sprite2DLayer;\n private _built = false;\n private readonly _indices: number[] = [];\n private _sprites: ThinSpriteLike[] = [];\n\n public constructor(engine: WebGPUEngine, capacity = 256, _epsilon = 0.01, _scene?: unknown) {\n this._engine = engine;\n this._capacity = capacity;\n // Defer the atlas load to engine startup: the thunk runs after the scene\n // setup code has assigned `texture`/`cellWidth`/`cellHeight`.\n engine._registerStartupWork(async () => {\n if (!this.texture) {\n return;\n }\n const premultiplied = this.blendMode === ALPHA_PREMULTIPLIED;\n this._atlas = await loadSpriteAtlas(engine._lite, this.texture.name, {\n gridSize: [this.cellWidth, this.cellHeight],\n sampling: this.texture.samplingMode === 1 ? \"nearest\" : \"linear\",\n premultipliedAlpha: premultiplied,\n });\n });\n }\n\n /** @internal Map the Babylon.js blend mode to a Lite sprite blend descriptor. */\n private _blend(): SpriteBlendMode {\n if (this.blendMode === ALPHA_PREMULTIPLIED) {\n return spriteBlendPremultiplied;\n }\n if (this.blendMode === 1 || this.blendMode === 6) {\n return spriteBlendAdditive;\n }\n return spriteBlendAlpha;\n }\n\n /**\n * Babylon.js `renderer.render(sprites, deltaTime, viewMatrix, projectionMatrix)`.\n * The matrices are owned by Babylon Lite's pixel-space sprite pass, so they are\n * accepted for API parity but not consumed. First call builds + registers the\n * Lite sprite renderer; later calls push per-sprite updates.\n */\n public render(sprites: readonly ThinSpriteLike[], _deltaTime?: number, _view?: unknown, _projection?: unknown): void {\n this._sprites = sprites as ThinSpriteLike[];\n if (!this._atlas) {\n return;\n }\n const canvasHeight = this._engine.getRenderingCanvas().height;\n if (!this._built) {\n const layer = createSprite2DLayer(this._atlas, { capacity: this._capacity, depth: \"none\", blendMode: this._blend() });\n for (const s of this._sprites) {\n this._indices.push(addSprite2DIndex(layer, this._spriteProps(s, canvasHeight)));\n }\n this._layer = layer;\n const renderer = createSpriteRenderer(this._engine._lite, {\n layers: [layer],\n // Only clear if the scene drove a `engine.clear(...)` (scene-less 2D\n // path); when overlaying a 3D scene the renderer must preserve the\n // already-rendered colour, so it draws without clearing.\n clear: this._engine._clearRequested,\n clearValue: { ...this._engine._lastClearColor },\n });\n registerSpriteRenderer(renderer);\n this._built = true;\n this._shadersLoaded = true;\n return;\n }\n // Live update path (animated scenes): re-sync each sprite's props.\n const layer = this._layer!;\n for (let i = 0; i < this._sprites.length; i++) {\n updateSprite2DIndex(layer, this._indices[i]!, this._spriteProps(this._sprites[i]!, canvasHeight));\n }\n }\n\n /** @internal Convert a BJS `ThinSprite` to Lite `Sprite2DProps` (Y-flip + rotation negate). */\n private _spriteProps(s: ThinSpriteLike, canvasHeight: number): Parameters<typeof addSprite2DIndex>[1] {\n return {\n positionPx: [s.position.x, canvasHeight - s.position.y],\n sizePx: [s.width, s.height],\n frame: s.cellIndex,\n rotation: -s.angle,\n color: [s.color.r, s.color.g, s.color.b, s.color.a],\n flipX: s.invertU,\n flipY: s.invertV,\n visible: s.isVisible,\n };\n }\n}\n","/**\n * Babylon.js-compatible `ShadowGenerator` over the Babylon Lite shadow factories.\n *\n * Babylon.js constructs a `ShadowGenerator(mapSize, light)`, toggles technique\n * flags (`usePercentageCloserFiltering`, `useBlurExponentialShadowMap`, …), and\n * registers casters via `addShadowCaster(mesh)`. Babylon Lite instead has\n * dedicated factories (`createEsmDirectionalShadowGenerator`,\n * `createPcfDirectionalShadowGenerator`, `createPcfSpotlightShadowGenerator`) and\n * requires the scene to be registered with `registerSceneWithShadowSupport`.\n *\n * This wrapper records the BJS-style configuration up front and defers the actual\n * Lite generator creation to engine start (when the GPU device and all caster\n * meshes exist), then wires `light.shadowGenerator` + caster meshes. The owning\n * scene flips to shadow-aware registration when any generator is present.\n */\n\nimport { createEsmDirectionalShadowGenerator, createPcfDirectionalShadowGenerator, createPcfSpotlightShadowGenerator, setShadowTaskCasterMeshes } from \"babylon-lite\";\nimport type { EngineContext, Mesh as LiteMesh } from \"babylon-lite\";\n\nimport type { Light } from \"../lights/lights.js\";\nimport type { AbstractMesh } from \"../meshes/meshes.js\";\n\nexport class ShadowGenerator {\n private readonly _mapSize: number;\n private readonly _light: Light;\n private readonly _casters: AbstractMesh[] = [];\n /** @internal The built Lite shadow generator (set in `_build`). Used to wire NME receivers. */\n public _liteGen: unknown;\n\n public getClassName(): string {\n return \"ShadowGenerator\";\n }\n\n // ── BJS technique flags / tunables (read at build time) ──\n /** Percentage-closer filtering. */\n public usePercentageCloserFiltering = false;\n /** Contact-hardening (treated as PCF here). */\n public useContactHardeningShadow = false;\n /** Blurred exponential shadow map (the Babylon.js default soft-shadow path for directional lights). */\n public useBlurExponentialShadowMap = false;\n public useExponentialShadowMap = false;\n public useBlurCloseExponentialShadowMap = false;\n public useCloseExponentialShadowMap = false;\n public usePoissonSampling = false;\n public useKernelBlur = false;\n public blurKernel = 1;\n public blurScale = 2;\n public bias = 0.00005;\n public normalBias = 0;\n public darkness = 0;\n public depthScale = 50;\n public frustumEdgeFalloff = 0;\n public forceBackFacesOnly = false;\n /** Babylon.js ortho projection bounds (directional). */\n public orthoMinZ: number | undefined;\n public orthoMaxZ: number | undefined;\n\n public constructor(mapSize: number, light: Light) {\n this._mapSize = mapSize;\n this._light = light;\n const scene = light.getScene();\n if (scene) {\n scene._registerShadowGenerator(this);\n }\n }\n\n /** Babylon.js `addShadowCaster(mesh, includeDescendants?)`. */\n public addShadowCaster(mesh: AbstractMesh, _includeDescendants = true): ShadowGenerator {\n if (!this._casters.includes(mesh)) {\n this._casters.push(mesh);\n }\n return this;\n }\n\n /** Babylon.js `removeShadowCaster(mesh)`. */\n public removeShadowCaster(mesh: AbstractMesh): ShadowGenerator {\n const i = this._casters.indexOf(mesh);\n if (i >= 0) {\n this._casters.splice(i, 1);\n }\n return this;\n }\n\n /** Babylon.js `getShadowMap()` — returns a minimal render-list holder for parity. */\n public getShadowMap(): { renderList: AbstractMesh[] } {\n return { renderList: this._casters };\n }\n\n public getDarkness(): number {\n return this.darkness;\n }\n public setDarkness(value: number): ShadowGenerator {\n this.darkness = value;\n return this;\n }\n\n public getLight(): Light {\n return this._light;\n }\n\n public dispose(): void {\n this._light._lite.shadowGenerator = undefined;\n }\n\n /**\n * @internal Build the underlying Lite shadow generator and wire casters. Called\n * by the engine at start, after meshes are added and before the scene registers.\n */\n public _build(engine: EngineContext): void {\n const liteLight = this._light._lite as never;\n const className = this._light.getClassName();\n const usePcf = this.usePercentageCloserFiltering || this.useContactHardeningShadow || this.usePoissonSampling;\n\n let liteGen;\n if (className === \"SpotLight\") {\n // Lite has only a PCF spot generator.\n liteGen = createPcfSpotlightShadowGenerator(engine, liteLight, {\n mapSize: this._mapSize,\n bias: this.bias,\n darkness: this.darkness,\n normalBias: this.normalBias,\n });\n } else if (usePcf) {\n liteGen = createPcfDirectionalShadowGenerator(engine, liteLight, {\n mapSize: this._mapSize,\n bias: this.bias,\n darkness: this.darkness,\n normalBias: this.normalBias,\n ...(this.orthoMinZ !== undefined ? { orthoMinZ: this.orthoMinZ } : {}),\n ...(this.orthoMaxZ !== undefined ? { orthoMaxZ: this.orthoMaxZ } : {}),\n });\n } else {\n // Default directional soft shadow: ESM (Babylon.js default + blur variants).\n liteGen = createEsmDirectionalShadowGenerator(engine, liteLight, {\n mapSize: this._mapSize,\n depthScale: this.depthScale,\n bias: this.bias,\n blurKernel: this.useKernelBlur || this.useBlurExponentialShadowMap ? this.blurKernel : 1,\n blurScale: this.blurScale,\n darkness: this.darkness,\n frustumEdgeFalloff: this.frustumEdgeFalloff,\n ...(this.orthoMinZ !== undefined ? { orthoMinZ: this.orthoMinZ } : {}),\n ...(this.orthoMaxZ !== undefined ? { orthoMaxZ: this.orthoMaxZ } : {}),\n });\n }\n\n (liteLight as { shadowGenerator?: unknown }).shadowGenerator = liteGen;\n this._liteGen = liteGen;\n const casterMeshes = this._casters.map((m) => m._lite as LiteMesh);\n setShadowTaskCasterMeshes(liteGen, casterMeshes);\n }\n}\n\n/**\n * Babylon.js `CascadedShadowGenerator` — cascaded shadow maps for large directional\n * scenes. Mapped onto Babylon Lite's CSM generator is a larger task; for now this\n * extends {@link ShadowGenerator} and falls back to the standard directional path,\n * which renders (a single cascade's worth of) shadows rather than throwing.\n */\nexport class CascadedShadowGenerator extends ShadowGenerator {\n public numCascades = 4;\n public lambda = 0.5;\n public stabilizeCascades = false;\n public depthClamp = true;\n public autoCalcDepthBounds = false;\n\n public override getClassName(): string {\n return \"CascadedShadowGenerator\";\n }\n}\n","/**\n * Babylon.js-compatible `NodeMaterial` over Babylon Lite's NME parser.\n *\n * Babylon.js exposes a synchronous `NodeMaterial.Parse(json, scene)`, optional\n * `getBlockByName(name).texture = …` overrides, then `build()`. Babylon Lite\n * instead parses an NME graph asynchronously via `parseNodeMaterialFromSnippet`,\n * taking texture overrides up front (keyed by block name) and emitting/compiling\n * the pipeline in one shot.\n *\n * The compat wrapper bridges the two: `Parse` returns immediately with an\n * unparsed handle and records the source; `getBlockByName` returns a thin proxy\n * that captures per-block texture assignments; the real (async) parse is deferred\n * to engine start — registered with the scene so it is awaited (alongside its\n * override textures) before the scene builds. `build()` is a no-op.\n */\n\nimport { parseNodeMaterialFromSnippet } from \"babylon-lite\";\nimport type { EngineContext, NodeMaterial as LiteNodeMaterial, Texture2D } from \"babylon-lite\";\n\nimport type { Scene } from \"../scene/scene.js\";\n\ninterface TextureLike {\n _lite?: Texture2D;\n whenReadyAsync?(): Promise<void>;\n}\n\n/** A thin proxy for a Babylon.js NME block, capturing texture assignments. */\nclass NodeMaterialBlockProxy {\n public constructor(\n private readonly _owner: NodeMaterial,\n private readonly _name: string\n ) {}\n\n public set texture(value: TextureLike | null) {\n this._owner._setBlockTexture(this._name, value);\n }\n public get texture(): TextureLike | null {\n return this._owner._getBlockTexture(this._name);\n }\n}\n\nexport class NodeMaterial {\n public name: string;\n public backFaceCulling = true;\n /** @internal The compiled Lite node material. Undefined until the async parse resolves. */\n public _lite: LiteNodeMaterial | undefined;\n\n private readonly _json: object | string;\n private readonly _textureOverrides: Record<string, TextureLike> = {};\n\n public constructor(name: string, _scene: Scene, json: object | string = {}) {\n this.name = name;\n this._json = json;\n }\n\n public getClassName(): string {\n return \"NodeMaterial\";\n }\n\n /** Babylon.js `getBlockByName(name)` — returns a proxy that captures texture overrides. */\n public getBlockByName(name: string): NodeMaterialBlockProxy {\n return new NodeMaterialBlockProxy(this, name);\n }\n\n /** @internal */\n public _setBlockTexture(name: string, value: TextureLike | null): void {\n if (value) {\n this._textureOverrides[name] = value;\n } else {\n delete this._textureOverrides[name];\n }\n }\n\n /** @internal */\n public _getBlockTexture(name: string): TextureLike | null {\n return this._textureOverrides[name] ?? null;\n }\n\n /** Babylon.js `NodeMaterial.build()` — Lite builds during parse, so this is a no-op. */\n public build(_verbose?: boolean): void {\n // Intentionally empty.\n }\n\n /** @internal Parse already happened via the scene-tracked promise; nothing to finalize. */\n public _ensureRenderable(_engine: EngineContext): void {\n // No-op: `_lite` is set when the tracked parse promise resolves.\n }\n\n public dispose(): void {\n // GPU resources owned by the scene; disposed with it.\n }\n\n /** @internal Resolve override textures, then parse + compile the NME graph. */\n public async _parse(engine: EngineContext, shadowGenerators: readonly unknown[] = []): Promise<void> {\n // Yield once so any synchronous `getBlockByName(name).texture = …` overrides\n // set immediately after `Parse()` are recorded before we read them.\n await Promise.resolve();\n const overrides = Object.entries(this._textureOverrides);\n await Promise.all(overrides.map(([, tex]) => tex.whenReadyAsync?.() ?? Promise.resolve()));\n const textures: Record<string, Texture2D> = {};\n for (const [blockName, tex] of overrides) {\n if (tex._lite) {\n textures[blockName] = tex._lite;\n }\n }\n this._lite = await parseNodeMaterialFromSnippet(engine, \"\", {\n json: this._json,\n ...(overrides.length ? { textures } : {}),\n // Babylon.js wires shadows into the scene globally; Babylon Lite takes them\n // at NME parse time, so NME shadow-receiver blocks sample the scene's\n // generators (e.g. ground `receiveShadows` in scenes 65/66).\n ...(shadowGenerators.length ? { shadowGenerators: shadowGenerators as never } : {}),\n });\n }\n\n /**\n * Babylon.js `NodeMaterial.Parse(source, scene, rootUrl?)` — parse an NME graph\n * from inline JSON. Returns synchronously; the actual GPU compile runs async and\n * is driven by the engine (after shadow generators are built) before the scene\n * builds, so NME shadow-receiver blocks can sample the scene's shadow generators.\n */\n public static Parse(source: object | string, scene: Scene, _rootUrl?: string): NodeMaterial {\n const material = new NodeMaterial(\"nodeMaterial\", scene, source);\n scene._registerNodeMaterial(material);\n return material;\n }\n}\n","/**\n * Babylon.js `@babylonjs/materials` `GridMaterial` over Babylon Lite's native\n * `createGridMaterial`.\n *\n * Babylon.js' `GridMaterial` is constructed empty and then has its appearance set\n * via mutable properties (`mainColor`, `lineColor`, `gridRatio`, …). Babylon Lite\n * instead bakes the grid options into a `ShaderMaterial` at creation time. The\n * compat wrapper accumulates the Babylon.js property assignments and builds the\n * Lite grid material lazily in {@link _ensureRenderable} (engine start, after all\n * properties are set), then exposes it as `_lite` so the mesh binds it.\n */\n\nimport { createGridMaterial } from \"babylon-lite\";\nimport type { EngineContext, ShaderMaterial as LiteShaderMaterial } from \"babylon-lite\";\n\nimport { Color3 } from \"../math/color.js\";\nimport { Vector3 } from \"../math/vector.js\";\nimport type { Scene } from \"../scene/scene.js\";\n\nexport class GridMaterial {\n public name: string;\n /** Background color between the lines (Babylon.js default black). */\n public mainColor = new Color3(0, 0, 0);\n /** Color of the grid lines (Babylon.js default teal). */\n public lineColor = new Color3(0.2, 0.2, 0.2);\n /** Spacing of the grid in object-space units. */\n public gridRatio = 1;\n /** Object-space offset added before computing the grid. */\n public gridOffset = new Vector3(0, 0, 0);\n /** Every Nth line is a major line. */\n public majorUnitFrequency = 10;\n /** Visibility of the minor (non-major) lines, `0..1`. */\n public minorUnitVisibility = 0.33;\n /** Opacity of the grid outside the lines; `<1` enables the transparent path. */\n public opacity = 1;\n /** Cosine-based antialiasing of the lines. */\n public antialias = true;\n /** Combine axes with `max` instead of additive sum. */\n public useMaxLine = false;\n /**\n * Babylon.js `@babylonjs/materials` 9.x `linesOnly` — show only the lines with\n * transparency between them. Babylon Lite expresses this via the opacity (`<1`)\n * transparent path, so enabling it forces that path.\n */\n public linesOnly = false;\n /** Back-face culling toggle. */\n public backFaceCulling = true;\n /** Babylon.js `Material.transparencyMode` (accepted for parity). */\n public transparencyMode: number | null = null;\n /** Wireframe toggle (not honoured by the grid material). */\n public wireframe = false;\n\n /** @internal The built Lite grid shader material (created at engine start). */\n public _lite: LiteShaderMaterial | undefined;\n\n public constructor(name: string, _scene?: Scene) {\n this.name = name;\n }\n\n public getClassName(): string {\n return \"GridMaterial\";\n }\n\n /**\n * @internal Build the Lite grid material from the accumulated Babylon.js\n * properties. Called by the engine just before the owning mesh is registered.\n */\n public _ensureRenderable(_engine: EngineContext): void {\n // `linesOnly` maps to Babylon Lite's transparent (opacity < 1) path; if the\n // caller left opacity at 1, nudge it just under 1 so the lines-only blend runs.\n const opacity = this.linesOnly && this.opacity >= 1 ? 0.9999 : this.opacity;\n this._lite = createGridMaterial({\n name: this.name,\n mainColor: [this.mainColor.r, this.mainColor.g, this.mainColor.b],\n lineColor: [this.lineColor.r, this.lineColor.g, this.lineColor.b],\n gridRatio: this.gridRatio,\n gridOffset: [this.gridOffset.x, this.gridOffset.y, this.gridOffset.z],\n majorUnitFrequency: this.majorUnitFrequency,\n minorUnitVisibility: this.minorUnitVisibility,\n opacity,\n antialias: this.antialias,\n useMaxLine: this.useMaxLine,\n backFaceCulling: this.backFaceCulling,\n });\n }\n\n public dispose(): void {\n // GPU resources are owned by the scene; disposed with it.\n }\n}\n","/**\n * Babylon.js-compatible easing functions (pure, no Babylon Lite dependency).\n *\n * These mirror Babylon.js's `EasingFunction` hierarchy and easing modes for use\n * with property animations. They are fully unit-testable.\n */\n\nexport const EASINGMODE_EASEIN = 0;\nexport const EASINGMODE_EASEOUT = 1;\nexport const EASINGMODE_EASEINOUT = 2;\n\nexport abstract class EasingFunction {\n public static readonly EASINGMODE_EASEIN = EASINGMODE_EASEIN;\n public static readonly EASINGMODE_EASEOUT = EASINGMODE_EASEOUT;\n public static readonly EASINGMODE_EASEINOUT = EASINGMODE_EASEINOUT;\n\n private _mode = EASINGMODE_EASEIN;\n\n public setEasingMode(mode: number): void {\n this._mode = Math.min(2, Math.max(0, mode));\n }\n\n public getEasingMode(): number {\n return this._mode;\n }\n\n /** The raw ease-in curve, implemented by each subclass over `gradient` in [0, 1]. */\n public abstract easeInCore(gradient: number): number;\n\n public ease(gradient: number): number {\n switch (this._mode) {\n case EASINGMODE_EASEIN:\n return this.easeInCore(gradient);\n case EASINGMODE_EASEOUT:\n return 1 - this.easeInCore(1 - gradient);\n default:\n return gradient >= 0.5 ? 1 - this.easeInCore((1 - gradient) * 2) * 0.5 : this.easeInCore(gradient * 2) * 0.5;\n }\n }\n}\n\nexport class CircleEase extends EasingFunction {\n public easeInCore(gradient: number): number {\n const g = Math.max(0, Math.min(1, gradient));\n return 1 - Math.sqrt(1 - g * g);\n }\n}\n\nexport class QuadraticEase extends EasingFunction {\n public easeInCore(gradient: number): number {\n return gradient * gradient;\n }\n}\n\nexport class CubicEase extends EasingFunction {\n public easeInCore(gradient: number): number {\n return gradient * gradient * gradient;\n }\n}\n\nexport class QuarticEase extends EasingFunction {\n public easeInCore(gradient: number): number {\n return gradient * gradient * gradient * gradient;\n }\n}\n\nexport class QuinticEase extends EasingFunction {\n public easeInCore(gradient: number): number {\n return gradient * gradient * gradient * gradient * gradient;\n }\n}\n\nexport class SineEase extends EasingFunction {\n public easeInCore(gradient: number): number {\n return 1 - Math.sin((Math.PI / 2) * (1 - gradient));\n }\n}\n\nexport class ExponentialEase extends EasingFunction {\n public constructor(private readonly exponent: number = 2) {\n super();\n }\n\n public easeInCore(gradient: number): number {\n if (this.exponent <= 0) {\n return gradient;\n }\n return (Math.exp(this.exponent * gradient) - 1) / (Math.exp(this.exponent) - 1);\n }\n}\n\nexport class BackEase extends EasingFunction {\n public constructor(private readonly amplitude: number = 1) {\n super();\n }\n\n public easeInCore(gradient: number): number {\n const num = Math.max(0, this.amplitude);\n return Math.pow(gradient, 3) - gradient * num * Math.sin(Math.PI * gradient);\n }\n}\n\nexport class ElasticEase extends EasingFunction {\n public constructor(\n private readonly oscillations: number = 3,\n private readonly springiness: number = 3\n ) {\n super();\n }\n\n public easeInCore(gradient: number): number {\n const num2 = Math.max(0, this.oscillations);\n const num3 = Math.max(0, this.springiness);\n const num = num3 === 0 ? gradient : (Math.exp(num3 * gradient) - 1) / (Math.exp(num3) - 1);\n return num * Math.sin((2 * Math.PI * num2 + Math.PI / 2) * gradient);\n }\n}\n\nexport class BounceEase extends EasingFunction {\n public constructor(\n private readonly bounces: number = 3,\n private readonly bounciness: number = 2\n ) {\n super();\n }\n\n public easeInCore(gradient: number): number {\n const num = Math.max(0, this.bounces);\n let bounciness = this.bounciness;\n if (bounciness <= 1) {\n bounciness = 1.001;\n }\n const num2 = Math.pow(bounciness, num);\n const num3 = 1 - bounciness;\n const num4 = (1 - num2) / num3 + num2 * 0.5;\n const num5 = gradient * num4;\n const num6 = Math.log(-num5 * (1 - bounciness) + 1) / Math.log(bounciness);\n const num7 = Math.floor(num6);\n const num8 = num7 + 1;\n const num9 = (1 - Math.pow(bounciness, num7)) / (num3 * num4);\n const num10 = (1 - Math.pow(bounciness, num8)) / (num3 * num4);\n const num11 = (num9 + num10) * 0.5;\n const num12 = gradient - num11;\n const num13 = num11 - num9;\n return (-Math.pow(1 / bounciness, num - num7) / (num13 * num13)) * (num12 - num13) * (num12 + num13);\n }\n}\n","/** Babylon.js-compatible `Tools` helpers (the small, pure subset). */\n\nexport const Tools = {\n /** High-resolution timestamp in milliseconds. */\n Now(): number {\n return typeof performance !== \"undefined\" ? performance.now() : Date.now();\n },\n\n ToRadians(degrees: number): number {\n return (degrees * Math.PI) / 180;\n },\n\n ToDegrees(radians: number): number {\n return (radians * 180) / Math.PI;\n },\n\n /** Clamp `value` into the inclusive `[min, max]` range. */\n Clamp(value: number, min = 0, max = 1): number {\n return Math.min(max, Math.max(min, value));\n },\n\n /** Generate an RFC4122 v4 UUID (used by Babylon.js for unique ids). */\n RandomId(): string {\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === \"x\" ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n },\n};\n","/**\n * Babylon.js-compatible Misc utilities — the pure-JS subset that has no Babylon\n * Lite or GPU dependency: `SmartArray`, `StringDictionary`, `Tags`,\n * `PerformanceMonitor`, and `ColorGradient`/`FactorGradient`.\n */\n\n/** A pre-sized, reusable array that tracks a logical `length` separately from capacity. */\nexport class SmartArray<T> {\n public data: Array<T | undefined>;\n public length = 0;\n\n public constructor(capacity: number) {\n this.data = new Array<T | undefined>(capacity);\n }\n\n public push(value: T): void {\n this.data[this.length++] = value;\n if (this.length > this.data.length) {\n this.data.length = this.length;\n }\n }\n\n public reset(): void {\n this.length = 0;\n }\n\n public concat(array: { length: number; data: Array<T | undefined> }): void {\n for (let i = 0; i < array.length; i++) {\n this.push(array.data[i] as T);\n }\n }\n\n public dispose(): void {\n this.reset();\n this.data.length = 0;\n }\n}\n\n/** A string-keyed dictionary with the Babylon.js `StringDictionary` surface. */\nexport class StringDictionary<T> {\n private _store: Record<string, T> = {};\n\n public get count(): number {\n return Object.keys(this._store).length;\n }\n\n public add(key: string, value: T): boolean {\n if (key in this._store) {\n return false;\n }\n this._store[key] = value;\n return true;\n }\n\n public set(key: string, value: T): boolean {\n if (!(key in this._store)) {\n return false;\n }\n this._store[key] = value;\n return true;\n }\n\n public get(key: string): T | undefined {\n return this._store[key];\n }\n\n public getOrAddWithFactory(key: string, factory: (key: string) => T): T {\n let value = this._store[key];\n if (value === undefined) {\n value = factory(key);\n this._store[key] = value;\n }\n return value;\n }\n\n public contains(key: string): boolean {\n return key in this._store;\n }\n\n public remove(key: string): boolean {\n if (key in this._store) {\n delete this._store[key];\n return true;\n }\n return false;\n }\n\n public clear(): void {\n this._store = {};\n }\n\n public forEach(callback: (key: string, value: T) => void): void {\n for (const key of Object.keys(this._store)) {\n callback(key, this._store[key]!);\n }\n }\n}\n\ninterface Taggable {\n _tags?: Record<string, true>;\n}\n\n/** Babylon.js `Tags` — space-separated tag strings attached to arbitrary objects. */\nexport const Tags = {\n EnableFor(obj: Taggable): void {\n obj._tags ??= {};\n },\n\n HasTags(obj: Taggable): boolean {\n return !!obj._tags && Object.keys(obj._tags).length > 0;\n },\n\n AddTagsTo(obj: Taggable, tags: string): void {\n obj._tags ??= {};\n for (const tag of tags.split(/\\s+/).filter(Boolean)) {\n obj._tags[tag] = true;\n }\n },\n\n RemoveTagsFrom(obj: Taggable, tags: string): void {\n if (!obj._tags) {\n return;\n }\n for (const tag of tags.split(/\\s+/).filter(Boolean)) {\n delete obj._tags[tag];\n }\n },\n\n MatchesQuery(obj: Taggable, tag: string): boolean {\n return !!obj._tags && obj._tags[tag] === true;\n },\n\n GetTags(obj: Taggable): string[] {\n return obj._tags ? Object.keys(obj._tags) : [];\n },\n};\n\n/** Rolling FPS/frame-time monitor (Babylon.js `PerformanceMonitor`). */\nexport class PerformanceMonitor {\n private _samples: number[] = [];\n private _max: number;\n private _lastTime: number | null = null;\n private _enabled = true;\n\n public constructor(frameSampleSize = 30) {\n this._max = frameSampleSize;\n }\n\n public sampleFrame(timeMs: number = now()): void {\n if (!this._enabled) {\n return;\n }\n if (this._lastTime !== null) {\n const delta = timeMs - this._lastTime;\n this._samples.push(delta);\n if (this._samples.length > this._max) {\n this._samples.shift();\n }\n }\n this._lastTime = timeMs;\n }\n\n public get averageFrameTime(): number {\n if (this._samples.length === 0) {\n return 0;\n }\n return this._samples.reduce((a, b) => a + b, 0) / this._samples.length;\n }\n\n public get averageFPS(): number {\n const avg = this.averageFrameTime;\n return avg > 0 ? 1000 / avg : 0;\n }\n\n public get isSaturated(): boolean {\n return this._samples.length >= this._max;\n }\n\n public enable(): void {\n this._enabled = true;\n }\n\n public disable(): void {\n this._enabled = false;\n }\n\n public reset(): void {\n this._samples = [];\n this._lastTime = null;\n }\n}\n\n/** A gradient value bound to a [0, 1] position (Babylon.js `FactorGradient`). */\nexport class FactorGradient {\n public constructor(\n public gradient: number,\n public factor1: number,\n public factor2: number = factor1\n ) {}\n\n public getFactor(): number {\n return this.factor1;\n }\n}\n\n/** An RGBA color bound to a [0, 1] position (Babylon.js `ColorGradient`). */\nexport class ColorGradient {\n public constructor(\n public gradient: number,\n public color1: [number, number, number, number],\n public color2?: [number, number, number, number]\n ) {}\n}\n\nfunction now(): number {\n return typeof performance !== \"undefined\" ? performance.now() : Date.now();\n}\n\n/** Babylon.js `Logger` — level-gated console logging. */\nexport const Logger = {\n NoneLogLevel: 0,\n MessageLogLevel: 1,\n WarningLogLevel: 2,\n ErrorLogLevel: 4,\n AllLogLevel: 7,\n\n /** Current log-level bitmask. */\n LogLevels: 7,\n\n Log(message: string): void {\n if (this.LogLevels & this.MessageLogLevel) {\n // eslint-disable-next-line no-console\n console.log(\"BJS - \" + message);\n }\n },\n\n Warn(message: string): void {\n if (this.LogLevels & this.WarningLogLevel) {\n console.warn(\"BJS - \" + message);\n }\n },\n\n Error(message: string): void {\n if (this.LogLevels & this.ErrorLogLevel) {\n console.error(\"BJS - \" + message);\n }\n },\n};\n\n/** Babylon.js `PrecisionDate` — high-resolution timestamp source. */\nexport const PrecisionDate = {\n get Now(): number {\n return now();\n },\n};\n","/**\n * Babylon.js engine-level enums and constant bags that scenes import for their\n * numeric values. These carry no behaviour in the compat layer — they exist so\n * that code reading `ScenePerformancePriority.Aggressive`,\n * `ImageProcessingConfiguration.TONEMAPPING_ACES`, or\n * `Constants.MATERIAL_CounterClockWiseSideOrientation` resolves to the same\n * numbers Babylon.js uses.\n */\n\n/** Babylon.js `ScenePerformancePriority`. */\nexport enum ScenePerformancePriority {\n BackwardCompatible = 0,\n Intermediate = 1,\n Aggressive = 2,\n}\n\n/**\n * Babylon.js `ShaderLanguage` — the shader-source language selector. Babylon Lite\n * is WGSL-only, but the enum is surfaced (with Babylon.js's numeric values) so\n * scenes that import it to author `WGSL` shaders resolve the symbol; a `GLSL`\n * `ShaderMaterial`/`EffectWrapper` still fails loudly at construction.\n */\nexport enum ShaderLanguage {\n GLSL = 0,\n WGSL = 1,\n}\n\n/**\n * Babylon.js `ImageProcessingConfiguration` — only the tone-mapping constants are\n * surfaced (the live exposure/contrast/tone-mapping toggle is exposed through\n * `scene.imageProcessingConfiguration`).\n */\nexport class ImageProcessingConfiguration {\n public static readonly TONEMAPPING_STANDARD = 0;\n public static readonly TONEMAPPING_ACES = 1;\n public static readonly TONEMAPPING_KHR_PBR_NEUTRAL = 2;\n}\n\n/**\n * Babylon.js `Constants` — the small subset of numeric constants referenced by\n * the ported scenes. Extend as needed.\n */\nexport const Constants = {\n MATERIAL_ClockWiseSideOrientation: 0,\n MATERIAL_CounterClockWiseSideOrientation: 1,\n MATERIAL_TriangleFillMode: 0,\n MATERIAL_WireFrameFillMode: 1,\n MATERIAL_PointFillMode: 2,\n ALPHA_DISABLE: 0,\n ALPHA_ADD: 1,\n ALPHA_COMBINE: 2,\n ALPHA_ONEONE: 6,\n ALPHA_PREMULTIPLIED: 7,\n MATERIAL_OPAQUE: 0,\n MATERIAL_ALPHATEST: 1,\n MATERIAL_ALPHABLEND: 2,\n TEXTURE_CLAMP_ADDRESSMODE: 0,\n TEXTURE_WRAP_ADDRESSMODE: 1,\n TEXTURE_MIRROR_ADDRESSMODE: 2,\n} as const;\n","/**\n * Babylon.js-compatible Actions: `ActionManager`, `Action`, the common concrete\n * actions, and `Condition` variants.\n *\n * This is the structural/behavioural surface in pure JS. Triggers are not yet\n * auto-wired to Babylon Lite's input pipeline (that needs a unified pointer\n * pipe — see `COMPAT-STATUS.md`), so actions are dispatched manually via\n * `ActionManager.processTrigger(trigger)`. The action/condition execution model\n * itself is fully implemented and testable.\n */\n\n/** Babylon.js `ActionManager` trigger constants (subset). */\nexport const ActionManagerTriggers = {\n NothingTrigger: 0,\n OnPickTrigger: 1,\n OnLeftPickTrigger: 2,\n OnRightPickTrigger: 3,\n OnCenterPickTrigger: 4,\n OnPickDownTrigger: 5,\n OnDoublePickTrigger: 6,\n OnPickUpTrigger: 7,\n OnPickOutTrigger: 16,\n OnPointerOverTrigger: 10,\n OnPointerOutTrigger: 11,\n OnEveryFrameTrigger: 14,\n} as const;\n\ninterface ActionEvent {\n source: unknown;\n pointerX: number;\n pointerY: number;\n meshUnderPointer: unknown;\n additionalData?: unknown;\n}\n\n/** Base class for actions. `execute` is implemented by subclasses. */\nexport abstract class Action {\n public trigger: number;\n /** Condition gating execution. When set, `execute` runs only if it evaluates true. */\n public condition: Condition | undefined;\n\n private _nextActiveAction: Action | null = null;\n\n public constructor(trigger: number, condition?: Condition) {\n this.trigger = trigger;\n this.condition = condition;\n }\n\n public abstract execute(evt?: ActionEvent): void;\n\n /** Chain another action to run after this one (Babylon.js `then`). */\n public then(action: Action): Action {\n this._nextActiveAction = action;\n return action;\n }\n\n /** @internal Run this action (honouring its condition) and any chained action. */\n public _executeCurrent(evt?: ActionEvent): void {\n if (this.condition && !this.condition.isValid()) {\n return;\n }\n this.execute(evt);\n this._nextActiveAction?._executeCurrent(evt);\n }\n}\n\n/** Runs a user callback when triggered. */\nexport class ExecuteCodeAction extends Action {\n public constructor(\n trigger: number,\n private readonly _func: (evt?: ActionEvent) => void,\n condition?: Condition\n ) {\n super(trigger, condition);\n }\n\n public execute(evt?: ActionEvent): void {\n this._func(evt);\n }\n}\n\n/** Sets `target[propertyPath] = value` when triggered. */\nexport class SetValueAction extends Action {\n public constructor(\n trigger: number,\n private readonly _target: Record<string, unknown>,\n private readonly _propertyPath: string,\n private readonly _value: unknown,\n condition?: Condition\n ) {\n super(trigger, condition);\n }\n\n public execute(): void {\n setByPath(this._target, this._propertyPath, this._value);\n }\n}\n\n/** Adds `value` to `target[propertyPath]` when triggered. */\nexport class IncrementValueAction extends Action {\n public constructor(\n trigger: number,\n private readonly _target: Record<string, unknown>,\n private readonly _propertyPath: string,\n private readonly _value: number,\n condition?: Condition\n ) {\n super(trigger, condition);\n }\n\n public execute(): void {\n const current = getByPath(this._target, this._propertyPath);\n if (typeof current === \"number\") {\n setByPath(this._target, this._propertyPath, current + this._value);\n }\n }\n}\n\n/** Base class for action conditions. */\nexport abstract class Condition {\n public abstract isValid(): boolean;\n}\n\nexport const ValueConditionOperators = {\n IsEqual: 0,\n IsDifferent: 1,\n IsGreater: 2,\n IsLesser: 3,\n} as const;\n\n/** Compares `target[propertyPath]` against a value with an operator. */\nexport class ValueCondition extends Condition {\n public constructor(\n private readonly _target: Record<string, unknown>,\n private readonly _propertyPath: string,\n private readonly _value: number,\n private readonly _operator: number = ValueConditionOperators.IsEqual\n ) {\n super();\n }\n\n public isValid(): boolean {\n const current = getByPath(this._target, this._propertyPath);\n if (typeof current !== \"number\") {\n return false;\n }\n switch (this._operator) {\n case ValueConditionOperators.IsEqual:\n return current === this._value;\n case ValueConditionOperators.IsDifferent:\n return current !== this._value;\n case ValueConditionOperators.IsGreater:\n return current > this._value;\n case ValueConditionOperators.IsLesser:\n return current < this._value;\n default:\n return false;\n }\n }\n}\n\n/** Evaluates a user predicate. */\nexport class PredicateCondition extends Condition {\n public constructor(private readonly _predicate: () => boolean) {\n super();\n }\n\n public isValid(): boolean {\n return this._predicate();\n }\n}\n\n/**\n * Babylon.js `ActionManager`. Register actions with `registerAction`, then\n * dispatch them with `processTrigger(trigger, evt?)`. (Automatic trigger\n * dispatch from input is not yet wired — see module docs.)\n */\nexport class ActionManager {\n public static readonly Triggers = ActionManagerTriggers;\n\n public readonly actions: Action[] = [];\n\n public registerAction(action: Action): Action {\n this.actions.push(action);\n return action;\n }\n\n public unregisterAction(action: Action): boolean {\n const index = this.actions.indexOf(action);\n if (index !== -1) {\n this.actions.splice(index, 1);\n return true;\n }\n return false;\n }\n\n public hasSpecificTrigger(trigger: number): boolean {\n return this.actions.some((a) => a.trigger === trigger);\n }\n\n /** Dispatch every registered action matching `trigger`. */\n public processTrigger(trigger: number, evt?: ActionEvent): void {\n for (const action of this.actions) {\n if (action.trigger === trigger) {\n action._executeCurrent(evt);\n }\n }\n }\n}\n\nfunction getByPath(target: Record<string, unknown>, path: string): unknown {\n const parts = path.split(\".\");\n let current: unknown = target;\n for (const part of parts) {\n if (current == null || typeof current !== \"object\") {\n return undefined;\n }\n current = (current as Record<string, unknown>)[part];\n }\n return current;\n}\n\nfunction setByPath(target: Record<string, unknown>, path: string, value: unknown): void {\n const parts = path.split(\".\");\n let current: Record<string, unknown> = target;\n for (let i = 0; i < parts.length - 1; i++) {\n current = current[parts[i]!] as Record<string, unknown>;\n if (current == null) {\n return;\n }\n }\n current[parts[parts.length - 1]!] = value;\n}\n","/**\n * Babylon.js AudioV2 enums and small shared helpers.\n *\n * These mirror the `@babylonjs/core` `AudioV2` `const enum`s exactly (same member\n * names and values) so ported code that reads e.g. `SoundState.Started` or\n * `AudioParameterRampShape.Linear` resolves identically.\n */\n\nimport type { RampOptions as LiteRampOptions } from \"babylon-lite\";\n\n/** Playback state of a sound (mirrors `@babylonjs/core` `SoundState`). */\nexport const SoundState = {\n Stopping: 0,\n Stopped: 1,\n Starting: 2,\n Started: 3,\n FailedToStart: 4,\n Paused: 5,\n} as const;\nexport type SoundState = (typeof SoundState)[keyof typeof SoundState];\n\n/** Ramp shape used when changing an audio parameter (mirrors `AudioParameterRampShape`). */\nexport const AudioParameterRampShape = {\n Linear: \"linear\",\n Exponential: \"exponential\",\n Logarithmic: \"logarithmic\",\n None: \"none\",\n} as const;\nexport type AudioParameterRampShape = (typeof AudioParameterRampShape)[keyof typeof AudioParameterRampShape];\n\n/** Which transform components a spatial sound/listener follows (mirrors `SpatialAudioAttachmentType`). */\nexport const SpatialAudioAttachmentType = {\n Position: 1,\n Rotation: 2,\n PositionAndRotation: 3,\n} as const;\nexport type SpatialAudioAttachmentType = (typeof SpatialAudioAttachmentType)[keyof typeof SpatialAudioAttachmentType];\n\n/** FFT window sizes accepted by the analyzer (mirrors `AudioAnalyzerFFTSizeType`). */\nexport type AudioAnalyzerFFTSizeType = 32 | 64 | 128 | 256 | 512 | 1024 | 2048 | 4096 | 8192 | 16384 | 32768;\n\n/** Engine context state (mirrors `AudioEngineV2State`). */\nexport type AudioEngineV2State = \"closed\" | \"interrupted\" | \"running\" | \"suspended\";\n\n/** Babylon.js `IAudioParameterRampOptions`. */\nexport interface IAudioParameterRampOptions {\n /** Ramp time, in seconds. */\n duration: number;\n /** Ramp shape. */\n shape: AudioParameterRampShape;\n}\n\n/**\n * Maps a Babylon.js ramp option bag to the Lite `RampOptions` shape. The shape\n * string values are identical between the two APIs, so this is a structural pass\n * through.\n * @internal\n */\nexport function toLiteRamp(options?: Partial<IAudioParameterRampOptions> | null): LiteRampOptions | undefined {\n if (!options) {\n return undefined;\n }\n return { duration: options.duration, shape: options.shape };\n}\n","/**\n * Babylon.js AudioV2 (`AudioEngineV2` and friends) implemented on top of the\n * Babylon Lite audio port.\n *\n * The Lite audio API is pure state + standalone functions (`createAudioEngineAsync`,\n * `playSound`, `setBusVolume`, …); Babylon.js AudioV2 is a class hierarchy of\n * `AbstractAudioNode` subclasses with mutable properties. This module reproduces\n * the BJS class names, inheritance chain, and public members exactly, holding the\n * corresponding Lite handle as `_lite` and proxying property get/set + methods to\n * the Lite functions.\n *\n * Inheritance chain mirrored from `@babylonjs/core`:\n *\n * AbstractAudioNode\n * └─ AbstractNamedAudioNode\n * └─ AbstractAudioOutNode (volume / analyzer)\n * ├─ AbstractAudioBus → AudioBus / MainAudioBus\n * └─ AbstractSoundSource\n * └─ AbstractSound → StaticSound / StreamingSound\n *\n * No module-level Web Audio allocation happens at import time, so a consumer that\n * never touches audio pays nothing.\n */\n\nimport {\n createAudioEngineAsync,\n disposeAudioEngine,\n unlockAudioEngineAsync,\n setMasterVolume,\n getMasterVolume,\n createSoundAsync,\n playSound,\n pauseSound,\n resumeSound,\n stopSound,\n disposeSound,\n setSoundVolume,\n createStreamingSoundAsync,\n preloadStreamingInstanceAsync,\n preloadStreamingInstancesAsync,\n playStreamingSound,\n pauseStreamingSound,\n resumeStreamingSound,\n stopStreamingSound,\n disposeStreamingSound,\n setStreamingSoundVolume,\n createAudioBusAsync,\n disposeAudioBus,\n setBusVolume,\n createSoundBufferAsync,\n createSoundSourceAsync,\n createMicrophoneSoundSourceAsync,\n setSoundSourceVolume,\n disposeSoundSource,\n enableSpatial,\n setSpatialPosition,\n setSpatialOrientation,\n setSpatialListener,\n setSpatialListenerPosition,\n updateSpatialAudio,\n enableStereo,\n setStereoPan,\n enableAnalyzer,\n getByteFrequencyData,\n getFloatFrequencyData,\n getByteTimeDomainData,\n getFloatTimeDomainData,\n} from \"babylon-lite\";\nimport type {\n AudioEngine as LiteAudioEngine,\n AudioEngineOptions as LiteAudioEngineOptions,\n StaticSound as LiteStaticSound,\n StreamingSound as LiteStreamingSound,\n AudioBus as LiteAudioBus,\n MainBus as LiteMainBus,\n SoundBuffer as LiteSoundBuffer,\n AudioInputSource as LiteAudioInputSource,\n PrimaryAudioBus as LitePrimaryAudioBus,\n StaticSoundOptions as LiteStaticSoundOptions,\n StreamingSoundOptions as LiteStreamingSoundOptions,\n SpatialSoundOptions as LiteSpatialSoundOptions,\n AudioGraphHost as LiteHost,\n} from \"babylon-lite\";\n\nimport { Observable } from \"../misc/observable.js\";\nimport { Vector3 } from \"../math/vector.js\";\nimport { Quaternion } from \"../math/quaternion.js\";\nimport { unsupported } from \"../error.js\";\nimport { SpatialAudioAttachmentType, toLiteRamp, type SoundState, type AudioAnalyzerFFTSizeType, type AudioEngineV2State, type IAudioParameterRampOptions } from \"./audio-enums.js\";\n\n/** A bus a sound or bus can output to (mirrors AudioV2 `PrimaryAudioBus`). */\nexport type PrimaryAudioBus = MainAudioBus | AudioBus;\n\n/** A node that can have a world transform (subset of the compat `Node`). */\nexport interface SpatialNodeLike {\n getAbsolutePosition?: () => { x: number; y: number; z: number };\n absolutePosition?: { x: number; y: number; z: number };\n position?: { x: number; y: number; z: number };\n rotationQuaternion?: { x: number; y: number; z: number; w: number } | null;\n}\n\nfunction readNodePosition(node: SpatialNodeLike | null): { x: number; y: number; z: number } | null {\n if (!node) {\n return null;\n }\n return node.getAbsolutePosition?.() ?? node.absolutePosition ?? node.position ?? null;\n}\n\nfunction readNodeRotation(node: SpatialNodeLike | null): { x: number; y: number; z: number; w: number } | null {\n return node?.rotationQuaternion ?? null;\n}\n\n// ───────────────────────────── Options interfaces ────────────────────────────\n\n/** Babylon.js `IAudioEngineV2Options` (subset backed by Lite). */\nexport interface IAudioEngineV2Options {\n /** Default parameter ramp duration, in seconds. Defaults to `0.01`. */\n parameterRampDuration: number;\n /** Initial output volume. Defaults to `1`. */\n volume: number;\n}\n\n/** Babylon.js `IWebAudioEngineOptions`. */\nexport interface IWebAudioEngineOptions extends IAudioEngineV2Options {\n /** An existing audio context (pass an `OfflineAudioContext` for headless rendering). */\n audioContext: BaseAudioContext;\n /** Auto-resume the context on user interaction. Defaults to `true`. */\n resumeOnInteraction: boolean;\n /** Auto-resume the context if the browser pauses playback. Defaults to `true`. */\n resumeOnPause: boolean;\n /** Retry interval (ms) for `resumeOnPause`. Defaults to `1000`. */\n resumeOnPauseRetryInterval: number;\n}\n\n/** Babylon.js `IVolumeAudioOptions`. */\nexport interface IVolumeAudioOptions {\n /** Volume / gain. Defaults to `1`. */\n volume: number;\n}\n\n/** Babylon.js `IAudioAnalyzerOptions`. */\nexport interface IAudioAnalyzerOptions {\n /** Build the analyzer immediately. Defaults to `false`. */\n analyzerEnabled: boolean;\n /** FFT window size. Defaults to `2048`. */\n analyzerFFTSize: AudioAnalyzerFFTSizeType;\n /** Minimum dB. Defaults to `-100`. */\n analyzerMinDecibels: number;\n /** Maximum dB. Defaults to `-30`. */\n analyzerMaxDecibels: number;\n /** Time-averaging constant `[0, 1]`. Defaults to `0.8`. */\n analyzerSmoothing: number;\n}\n\n/** Babylon.js `IStereoAudioOptions`. */\nexport interface IStereoAudioOptions {\n /** Build stereo immediately. Defaults to `false`. */\n stereoEnabled: boolean;\n /** Pan `-1` (left) to `1` (right). Defaults to `0`. */\n stereoPan: number;\n}\n\n/** Babylon.js `ISpatialAudioOptions` (subset backed by Lite). */\nexport interface ISpatialAudioOptions {\n /** Build spatial immediately. */\n spatialEnabled: boolean;\n /** Cone inner angle, radians. */\n spatialConeInnerAngle: number;\n /** Cone outer angle, radians. */\n spatialConeOuterAngle: number;\n /** Volume outside the cone. */\n spatialConeOuterVolume: number;\n /** Distance attenuation model. */\n spatialDistanceModel: DistanceModelType;\n /** Max distance. */\n spatialMaxDistance: number;\n /** Reference / min distance. */\n spatialMinDistance: number;\n /** Source facing direction. */\n spatialOrientation: Vector3;\n /** Enable left/right panning. */\n spatialPanningEnabled: boolean;\n /** Panning algorithm. */\n spatialPanningModel: PanningModelType;\n /** Source world position. */\n spatialPosition: Vector3;\n /** Roll-off factor. */\n spatialRolloffFactor: number;\n /** Source rotation quaternion. */\n spatialRotationQuaternion: Quaternion;\n}\n\n/** Babylon.js `IStaticSoundBufferOptions`. */\nexport interface IStaticSoundBufferOptions {\n /** Skip codec checks when the source is a URL list. Defaults to `false`. */\n skipCodecCheck: boolean;\n}\n\n/** Babylon.js `IAbstractSoundOptions` (subset). */\nexport interface IAbstractSoundOptions extends Partial<IVolumeAudioOptions> {\n /** Play immediately once ready. Defaults to `false`. */\n autoplay?: boolean;\n /** Maximum simultaneous instances. Defaults to `Infinity`. */\n maxInstances?: number;\n /** Loop playback. Defaults to `false`. */\n loop?: boolean;\n /** Start offset in seconds. Defaults to `0`. */\n startOffset?: number;\n /** Output bus. */\n outBus?: PrimaryAudioBus;\n}\n\n/** Babylon.js `IStaticSoundOptions`. */\nexport interface IStaticSoundOptions extends IAbstractSoundOptions, Partial<IStaticSoundBufferOptions> {\n /** Play duration in seconds (`0` = full). */\n duration?: number;\n /** Loop end, seconds. */\n loopEnd?: number;\n /** Loop start, seconds. */\n loopStart?: number;\n /** Detune in cents. */\n pitch?: number;\n /** Playback rate multiplier. */\n playbackRate?: number;\n}\n\n/** Babylon.js `IStaticSoundPlayOptions`. */\nexport interface IStaticSoundPlayOptions {\n /** Loop playback. */\n loop?: boolean;\n /** Start offset in seconds. */\n startOffset?: number;\n /** Play duration in seconds. */\n duration?: number;\n /** Loop start, seconds. */\n loopStart?: number;\n /** Loop end, seconds. */\n loopEnd?: number;\n /** Per-instance volume. */\n volume?: number;\n /** Delay before playback, seconds. */\n waitTime?: number;\n}\n\n/** Babylon.js `IStaticSoundStopOptions`. */\nexport interface IStaticSoundStopOptions {\n /** Delay before stopping, seconds. */\n waitTime?: number;\n}\n\n/** Babylon.js `IStaticSoundCloneOptions`. */\nexport interface IStaticSoundCloneOptions {\n /** Clone the underlying buffer (Lite reuses the same buffer). Defaults to `false`. */\n cloneBuffer?: boolean;\n /** Output bus for the clone. */\n outBus?: PrimaryAudioBus | null;\n}\n\n/** Babylon.js `IStreamingSoundOptions`. */\nexport interface IStreamingSoundOptions extends IAbstractSoundOptions {\n /** Number of instances to preload. Defaults to `1`. */\n preloadCount?: number;\n}\n\n/** Babylon.js `IStreamingSoundPlayOptions`. */\nexport interface IStreamingSoundPlayOptions {\n /** Loop playback. */\n loop?: boolean;\n /** Start offset in seconds. */\n startOffset?: number;\n /** Per-instance volume. */\n volume?: number;\n}\n\n/** Babylon.js `IAudioBusOptions` (subset). */\nexport interface IAudioBusOptions extends Partial<IVolumeAudioOptions> {\n /** Output bus. Defaults to the engine's default main bus. */\n outBus?: PrimaryAudioBus;\n}\n\n/** Babylon.js `IMainAudioBusOptions`. */\nexport interface IMainAudioBusOptions extends Partial<IVolumeAudioOptions> {}\n\n/** Babylon.js `ISoundSourceOptions` (subset). */\nexport interface ISoundSourceOptions extends Partial<IVolumeAudioOptions> {\n /** Name. */\n name?: string;\n /** Output bus. */\n outBus?: PrimaryAudioBus | null;\n /** Auto-assign the default main bus when `outBus` is null. */\n outBusAutoDefault?: boolean;\n}\n\n// ───────────────────────────── Node base classes ─────────────────────────────\n\n/** Babylon.js `AbstractAudioNode` — the root of the AudioV2 node hierarchy. */\nexport abstract class AbstractAudioNode {\n /** The engine that owns this node. */\n public readonly engine: AudioEngineV2;\n /** Fires when this node is disposed. */\n public readonly onDisposeObservable = new Observable<AbstractAudioNode>();\n\n protected constructor(engine: AudioEngineV2) {\n this.engine = engine;\n }\n\n /** Disposes the node. */\n public dispose(): void {\n this.onDisposeObservable.notifyObservers(this);\n this.onDisposeObservable.clear();\n }\n\n /** The class name (mirrors Babylon.js `getClassName()`). */\n public abstract getClassName(): string;\n}\n\n/** Payload for `AbstractNamedAudioNode.onNameChangedObservable`. */\nexport interface IAudioNodeNameChange {\n /** The new name. */\n newName: string;\n /** The previous name. */\n oldName: string;\n /** The node whose name changed. */\n node: AbstractNamedAudioNode;\n}\n\n/** Babylon.js `AbstractNamedAudioNode` — an `AbstractAudioNode` with a mutable name. */\nexport abstract class AbstractNamedAudioNode extends AbstractAudioNode {\n /** Fires when {@link name} changes. */\n public readonly onNameChangedObservable = new Observable<IAudioNodeNameChange>();\n private _name: string;\n\n protected constructor(name: string, engine: AudioEngineV2) {\n super(engine);\n this._name = name;\n engine._addNode(this);\n }\n\n /** The node name. */\n public get name(): string {\n return this._name;\n }\n public set name(value: string) {\n const oldName = this._name;\n if (oldName === value) {\n return;\n }\n this._name = value;\n this.onNameChangedObservable.notifyObservers({ newName: value, oldName, node: this });\n }\n\n public override dispose(): void {\n this.engine._removeNode(this);\n this.onNameChangedObservable.clear();\n super.dispose();\n }\n}\n\n/**\n * Babylon.js `AbstractAudioOutNode` — a named node with a volume and a lazily\n * created analyzer.\n */\nexport abstract class AbstractAudioOutNode extends AbstractNamedAudioNode {\n protected _volume = 1;\n private _analyzer: AbstractAudioAnalyzer | null = null;\n\n /** The node output volume. */\n public get volume(): number {\n return this._volume;\n }\n public set volume(value: number) {\n this.setVolume(value);\n }\n\n /** Lazily-built audio analyzer for this node's output. */\n public get analyzer(): AbstractAudioAnalyzer {\n return (this._analyzer ??= new AbstractAudioAnalyzer(this._spatialHost()));\n }\n\n /** Sets the volume, optionally ramping. */\n public setVolume(value: number, options?: Partial<IAudioParameterRampOptions> | null): void {\n this._volume = value;\n this._applyVolume(value, options);\n }\n\n public override dispose(): void {\n this._analyzer?.dispose();\n this._analyzer = null;\n super.dispose();\n }\n\n /** @internal Apply the volume to the backing Lite handle. */\n protected abstract _applyVolume(value: number, options?: Partial<IAudioParameterRampOptions> | null): void;\n /** @internal The Lite host used to back spatial/stereo/analyzer sub-nodes. */\n protected abstract _spatialHost(): LiteHost;\n}\n\n// ───────────────────────────── Sub-properties ────────────────────────────────\n\n/** Babylon.js `AbstractStereoAudio` — the `sound.stereo` / `bus.stereo` sub-property. */\nexport class AbstractStereoAudio {\n private readonly _host: LiteHost;\n private _pan = 0;\n private _enabled = false;\n\n /** @internal */\n public constructor(host: LiteHost) {\n this._host = host;\n }\n\n /** Stereo pan, `-1` (left) to `1` (right). */\n public get pan(): number {\n return this._pan;\n }\n public set pan(value: number) {\n this._pan = value;\n if (!this._enabled) {\n enableStereo(this._host, { pan: value });\n this._enabled = true;\n } else {\n setStereoPan(this._host, value);\n }\n }\n}\n\n/** Babylon.js `AbstractAudioAnalyzer` — the `sound.analyzer` / `bus.analyzer` sub-property. */\nexport class AbstractAudioAnalyzer {\n private readonly _host: LiteHost;\n private _fftSize: AudioAnalyzerFFTSizeType = 2048;\n private _minDecibels = -100;\n private _maxDecibels = -30;\n private _smoothing = 0.8;\n private _enabled = false;\n\n /** @internal */\n public constructor(host: LiteHost) {\n this._host = host;\n }\n\n /** FFT window size. */\n public get fftSize(): AudioAnalyzerFFTSizeType {\n return this._fftSize;\n }\n public set fftSize(value: AudioAnalyzerFFTSizeType) {\n this._fftSize = value;\n this._reapply();\n }\n\n /** Number of frequency bins (`fftSize / 2`). */\n public get frequencyBinCount(): number {\n return this._fftSize / 2;\n }\n\n /** Whether the analyzer is enabled. */\n public get isEnabled(): boolean {\n return this._enabled;\n }\n\n /** Minimum dB. */\n public get minDecibels(): number {\n return this._minDecibels;\n }\n public set minDecibels(value: number) {\n this._minDecibels = value;\n this._reapply();\n }\n\n /** Maximum dB. */\n public get maxDecibels(): number {\n return this._maxDecibels;\n }\n public set maxDecibels(value: number) {\n this._maxDecibels = value;\n this._reapply();\n }\n\n /** Time-averaging constant `[0, 1]`. */\n public get smoothing(): number {\n return this._smoothing;\n }\n public set smoothing(value: number) {\n this._smoothing = value;\n this._reapply();\n }\n\n /** Builds (enables) the analyzer tap. */\n public async enableAsync(): Promise<void> {\n this._apply();\n }\n\n /** Returns the byte frequency-domain data. Empty when disabled. */\n public getByteFrequencyData(): Uint8Array {\n if (!this._enabled) {\n return new Uint8Array(0);\n }\n const out = new Uint8Array(this.frequencyBinCount);\n getByteFrequencyData(this._host, out);\n return out;\n }\n\n /** Returns the float frequency-domain data. Empty when disabled. */\n public getFloatFrequencyData(): Float32Array {\n if (!this._enabled) {\n return new Float32Array(0);\n }\n const out = new Float32Array(this.frequencyBinCount);\n getFloatFrequencyData(this._host, out);\n return out;\n }\n\n /** Returns the byte time-domain data. Empty when disabled. */\n public getByteTimeDomainData(): Uint8Array {\n if (!this._enabled) {\n return new Uint8Array(0);\n }\n const out = new Uint8Array(this._fftSize);\n getByteTimeDomainData(this._host, out);\n return out;\n }\n\n /** Returns the float time-domain data. Empty when disabled. */\n public getFloatTimeDomainData(): Float32Array {\n if (!this._enabled) {\n return new Float32Array(0);\n }\n const out = new Float32Array(this._fftSize);\n getFloatTimeDomainData(this._host, out);\n return out;\n }\n\n /** Disposes the analyzer (Lite tears it down with the host). */\n public dispose(): void {\n this._enabled = false;\n }\n\n private _apply(): void {\n enableAnalyzer(this._host, {\n fftSize: this._fftSize,\n minDecibels: this._minDecibels,\n maxDecibels: this._maxDecibels,\n smoothing: this._smoothing,\n });\n this._enabled = true;\n }\n\n private _reapply(): void {\n if (this._enabled) {\n this._apply();\n }\n }\n}\n\n/** Babylon.js `AbstractSpatialAudio` — the `sound.spatial` / `bus.spatial` sub-property. */\nexport class AbstractSpatialAudio {\n private readonly _host: LiteHost;\n private _enabled = false;\n\n private _position = new Vector3(0, 0, 0);\n private _orientation = new Vector3(1, 0, 0);\n private _rotationQuaternion = new Quaternion(0, 0, 0, 1);\n\n /** Cone inner angle, radians. */\n public coneInnerAngle = 2 * Math.PI;\n /** Cone outer angle, radians. */\n public coneOuterAngle = 2 * Math.PI;\n /** Volume outside the cone. */\n public coneOuterVolume = 0;\n /** Distance attenuation model. */\n public distanceModel: DistanceModelType = \"linear\";\n /** Max distance. */\n public maxDistance = 10000;\n /** Reference / min distance. */\n public minDistance = 1;\n /** Minimum time between auto-updates, seconds. */\n public minUpdateTime = 0;\n /** Enable left/right panning. */\n public panningEnabled = true;\n /** Panning algorithm. */\n public panningModel: PanningModelType = \"equalpower\";\n /** Roll-off factor. */\n public rolloffFactor = 1;\n /** Whether following a scene node. */\n public useBoundingBox = false;\n /** Which transform components are followed. */\n public attachmentType: SpatialAudioAttachmentType = SpatialAudioAttachmentType.PositionAndRotation;\n\n private _attachedNode: SpatialNodeLike | null = null;\n\n /** @internal */\n public constructor(host: LiteHost) {\n this._host = host;\n }\n\n /** Source world position. */\n public get position(): Vector3 {\n return this._position;\n }\n public set position(value: Vector3) {\n this._position = value;\n this._ensure();\n setSpatialPosition(this._host, value);\n }\n\n /** Source facing direction. */\n public get orientation(): Vector3 {\n return this._orientation;\n }\n public set orientation(value: Vector3) {\n this._orientation = value;\n this._ensure();\n setSpatialOrientation(this._host, value);\n }\n\n /** Source rotation quaternion. */\n public get rotationQuaternion(): Quaternion {\n return this._rotationQuaternion;\n }\n public set rotationQuaternion(value: Quaternion) {\n this._rotationQuaternion = value;\n this._reapply();\n }\n\n /** Whether attached to a scene node. */\n public get isAttached(): boolean {\n return this._attachedNode !== null;\n }\n\n /** The scene node this source follows, if any. */\n public get attachedNode(): SpatialNodeLike | null {\n return this._attachedNode;\n }\n\n /** Follows a scene node's world transform. */\n public attach(sceneNode: SpatialNodeLike | null, useBoundingBox = false, attachmentType: SpatialAudioAttachmentType = SpatialAudioAttachmentType.PositionAndRotation): void {\n this._attachedNode = sceneNode;\n this.useBoundingBox = useBoundingBox;\n this.attachmentType = attachmentType;\n this._ensure();\n this.update();\n }\n\n /** Stops following a scene node. */\n public detach(): void {\n this._attachedNode = null;\n }\n\n /** Pulls the attached node's current world position/rotation into the source. */\n public update(): void {\n const node = this._attachedNode;\n if (!node) {\n return;\n }\n let dirty = false;\n if ((this.attachmentType & SpatialAudioAttachmentType.Position) !== 0) {\n const pos = readNodePosition(node);\n if (pos) {\n this._position = new Vector3(pos.x, pos.y, pos.z);\n dirty = true;\n }\n }\n if ((this.attachmentType & SpatialAudioAttachmentType.Rotation) !== 0) {\n const quat = readNodeRotation(node);\n if (quat) {\n this._rotationQuaternion = new Quaternion(quat.x, quat.y, quat.z, quat.w);\n dirty = true;\n }\n }\n if (dirty) {\n enableSpatial(this._host, this._options());\n this._enabled = true;\n }\n }\n\n /** Disposes the spatial sub-node (Lite tears it down with the host). */\n public dispose(): void {\n this._attachedNode = null;\n this._enabled = false;\n }\n\n private _ensure(): void {\n if (!this._enabled) {\n enableSpatial(this._host, this._options());\n this._enabled = true;\n }\n }\n\n private _reapply(): void {\n if (this._enabled) {\n enableSpatial(this._host, this._options());\n }\n }\n\n private _options(): LiteSpatialSoundOptions {\n return {\n position: this._position,\n orientation: this._orientation,\n rotationQuaternion: this._rotationQuaternion,\n panningEnabled: this.panningEnabled,\n panningModel: this.panningModel,\n distanceModel: this.distanceModel,\n minDistance: this.minDistance,\n maxDistance: this.maxDistance,\n rolloffFactor: this.rolloffFactor,\n coneInnerAngle: this.coneInnerAngle,\n coneOuterAngle: this.coneOuterAngle,\n coneOuterVolume: this.coneOuterVolume,\n };\n }\n}\n\n/** Babylon.js `AbstractSpatialAudioListener` — the engine's `listener` (the \"ears\"). */\nexport class AbstractSpatialAudioListener {\n private readonly _engine: LiteAudioEngine;\n private _position = new Vector3(0, 0, 0);\n private _rotation = new Vector3(0, 0, 0);\n private _rotationQuaternion = new Quaternion(0, 0, 0, 1);\n private _attachedNode: SpatialNodeLike | null = null;\n\n /** Minimum time between auto-updates, seconds. */\n public minUpdateTime = 0;\n\n /** @internal */\n public constructor(engine: LiteAudioEngine) {\n this._engine = engine;\n }\n\n /** Whether attached to a scene node. */\n public get isAttached(): boolean {\n return this._attachedNode !== null;\n }\n\n /** The scene node the listener follows, if any. */\n public get attachedNode(): SpatialNodeLike | null {\n return this._attachedNode;\n }\n\n /** Listener world position. */\n public get position(): Vector3 {\n return this._position;\n }\n public set position(value: Vector3) {\n this._position = value;\n setSpatialListenerPosition(this._engine, value);\n }\n\n /** Listener Euler rotation. */\n public get rotation(): Vector3 {\n return this._rotation;\n }\n public set rotation(value: Vector3) {\n this._rotation = value;\n }\n\n /** Listener rotation quaternion. */\n public get rotationQuaternion(): Quaternion {\n return this._rotationQuaternion;\n }\n public set rotationQuaternion(value: Quaternion) {\n this._rotationQuaternion = value;\n setSpatialListener(this._engine, { rotationQuaternion: value });\n }\n\n /** Follows a scene node's world transform. */\n public attach(sceneNode: SpatialNodeLike | null): void {\n this._attachedNode = sceneNode;\n this.update();\n }\n\n /** Stops following a scene node. */\n public detach(): void {\n this._attachedNode = null;\n }\n\n /** Pulls the attached node's current world position/rotation into the listener. */\n public update(): void {\n const node = this._attachedNode;\n const pos = readNodePosition(node);\n if (pos) {\n this._position = new Vector3(pos.x, pos.y, pos.z);\n setSpatialListenerPosition(this._engine, pos);\n }\n const quat = readNodeRotation(node);\n if (quat) {\n this._rotationQuaternion = new Quaternion(quat.x, quat.y, quat.z, quat.w);\n setSpatialListener(this._engine, { rotationQuaternion: this._rotationQuaternion });\n }\n updateSpatialAudio(this._engine);\n }\n}\n\n// ───────────────────────────── Buses ─────────────────────────────────────────\n\n/** Babylon.js `AbstractAudioBus` — base class for both bus kinds. */\nexport abstract class AbstractAudioBus extends AbstractAudioOutNode {}\n\n/** Babylon.js `AudioBus` — a generic mixer bus. */\nexport class AudioBus extends AbstractAudioBus {\n /** @internal The backing Lite bus. */\n public readonly _lite: LiteAudioBus;\n private _spatial: AbstractSpatialAudio | null = null;\n private _stereo: AbstractStereoAudio | null = null;\n private _outBus: PrimaryAudioBus | null;\n\n /** @internal */\n public constructor(engine: AudioEngineV2, lite: LiteAudioBus, outBus: PrimaryAudioBus | null, volume = 1) {\n super(lite.name, engine);\n this._lite = lite;\n this._outBus = outBus;\n this._volume = volume;\n }\n\n /** The output bus this bus routes to. */\n public get outBus(): PrimaryAudioBus | null {\n return this._outBus;\n }\n public set outBus(value: PrimaryAudioBus | null) {\n if (this._outBus === value) {\n return;\n }\n rerouteLiteOutBus(this._lite, unwrapBus(value) ?? null);\n this._outBus = value;\n }\n\n /** Lazily-built spatial sub-property. */\n public get spatial(): AbstractSpatialAudio {\n return (this._spatial ??= new AbstractSpatialAudio(this._lite));\n }\n\n /** Lazily-built stereo sub-property. */\n public get stereo(): AbstractStereoAudio {\n return (this._stereo ??= new AbstractStereoAudio(this._lite));\n }\n\n public getClassName(): string {\n return \"AudioBus\";\n }\n\n public override dispose(): void {\n disposeAudioBus(this._lite);\n super.dispose();\n }\n\n protected _applyVolume(value: number, options?: Partial<IAudioParameterRampOptions> | null): void {\n setBusVolume(this._lite, value, toLiteRamp(options));\n }\n\n protected _spatialHost(): LiteHost {\n return this._lite;\n }\n}\n\n/** Babylon.js `MainAudioBus` — a bus that connects directly to the engine output. */\nexport class MainAudioBus extends AbstractAudioBus {\n /** @internal The backing Lite main bus. */\n public readonly _lite: LiteMainBus;\n\n /** @internal */\n public constructor(engine: AudioEngineV2, lite: LiteMainBus) {\n super(lite.name, engine);\n this._lite = lite;\n }\n\n public getClassName(): string {\n return \"MainAudioBus\";\n }\n\n protected _applyVolume(value: number, options?: Partial<IAudioParameterRampOptions> | null): void {\n setBusVolume(this._lite as LitePrimaryAudioBus, value, toLiteRamp(options));\n }\n\n protected _spatialHost(): LiteHost {\n // The Lite main bus is not an `AudioGraphHost`; spatial/stereo/analyzer\n // are not available on a main bus (matching the BJS `MainAudioBus`, which\n // exposes neither). Accessing `.analyzer` on a main bus is unsupported.\n return unsupported(\"MainAudioBus.analyzer\", \"Main buses have no analyzer; attach one to a sound or generic AudioBus instead.\");\n }\n}\n\n// ───────────────────────────── Sound source / sounds ─────────────────────────\n\n/** Babylon.js `AbstractSoundSource` — an out-node with an output bus + spatial/stereo. */\nexport abstract class AbstractSoundSource extends AbstractAudioOutNode {\n private _spatial: AbstractSpatialAudio | null = null;\n private _stereo: AbstractStereoAudio | null = null;\n protected _outBus: PrimaryAudioBus | null;\n\n protected constructor(name: string, engine: AudioEngineV2, outBus: PrimaryAudioBus | null) {\n super(name, engine);\n this._outBus = outBus;\n }\n\n /** The output bus this source routes to. */\n public get outBus(): PrimaryAudioBus | null {\n return this._outBus;\n }\n public set outBus(value: PrimaryAudioBus | null) {\n if (this._outBus === value) {\n return;\n }\n rerouteLiteOutBus(this._spatialHost(), unwrapBus(value) ?? null);\n this._outBus = value;\n }\n\n /** Lazily-built spatial sub-property. */\n public get spatial(): AbstractSpatialAudio {\n return (this._spatial ??= new AbstractSpatialAudio(this._spatialHost()));\n }\n\n /** Lazily-built stereo sub-property. */\n public get stereo(): AbstractStereoAudio {\n return (this._stereo ??= new AbstractStereoAudio(this._spatialHost()));\n }\n}\n\n/** A live input source (e.g. microphone) wrapping a Lite `AudioInputSource`. */\nexport class SoundSource extends AbstractSoundSource {\n /** @internal The backing Lite input source. */\n public readonly _lite: LiteAudioInputSource;\n\n /** @internal */\n public constructor(engine: AudioEngineV2, lite: LiteAudioInputSource, outBus: PrimaryAudioBus | null, volume = 1) {\n super(lite.name, engine, outBus);\n this._lite = lite;\n this._volume = volume;\n }\n\n public getClassName(): string {\n return \"SoundSource\";\n }\n\n public override dispose(): void {\n disposeSoundSource(this._lite);\n super.dispose();\n }\n\n protected _applyVolume(value: number, options?: Partial<IAudioParameterRampOptions> | null): void {\n setSoundSourceVolume(this._lite, value, toLiteRamp(options));\n }\n\n protected _spatialHost(): LiteHost {\n return this._lite;\n }\n}\n\n/** Babylon.js `AbstractSound` — a playable sound (static or streaming). */\nexport abstract class AbstractSound extends AbstractSoundSource {\n /** Fires when the sound finishes (all instances ended). */\n public readonly onEndedObservable = new Observable<AbstractSound>();\n\n protected constructor(name: string, engine: AudioEngineV2, outBus: PrimaryAudioBus | null) {\n super(name, engine, outBus);\n engine._addSound(this);\n }\n\n /** Number of live playing instances. */\n public abstract get activeInstancesCount(): number;\n /** Whether the sound auto-plays on creation. */\n public abstract get autoplay(): boolean;\n /** Current playback state. */\n public abstract get state(): SoundState;\n\n /** Whether the sound loops. */\n public abstract get loop(): boolean;\n public abstract set loop(value: boolean);\n\n /** Start offset, seconds. */\n public abstract get startOffset(): number;\n public abstract set startOffset(value: number);\n\n /** Maximum simultaneous instances. */\n public abstract get maxInstances(): number;\n public abstract set maxInstances(value: number);\n\n /** Current playback time of the newest instance, seconds. */\n public abstract get currentTime(): number;\n public abstract set currentTime(value: number);\n\n /** Plays the sound. */\n public abstract play(options?: Partial<IStaticSoundPlayOptions & IStreamingSoundPlayOptions>): void;\n /** Pauses the sound. */\n public abstract pause(): void;\n /** Resumes the sound. */\n public abstract resume(options?: Partial<IStaticSoundPlayOptions & IStreamingSoundPlayOptions>): void;\n /** Stops the sound. */\n public abstract stop(options?: Partial<IStaticSoundStopOptions>): void;\n\n public override dispose(): void {\n this.engine._removeSound(this);\n this.onEndedObservable.clear();\n super.dispose();\n }\n}\n\n/** Babylon.js `StaticSoundBuffer` — a decoded buffer wrapping a Lite `SoundBuffer`. */\nexport class StaticSoundBuffer {\n /** The engine that owns this buffer. */\n public readonly engine: AudioEngineV2;\n /** The buffer name. */\n public name: string;\n /** @internal The backing Lite sound buffer. */\n public readonly _lite: LiteSoundBuffer;\n\n /** @internal */\n public constructor(engine: AudioEngineV2, lite: LiteSoundBuffer, name = \"StaticSoundBuffer\") {\n this.engine = engine;\n this._lite = lite;\n this.name = name;\n }\n\n /** Sample rate, Hz. */\n public get sampleRate(): number {\n return this._lite.sampleRate;\n }\n /** Length in sample frames. */\n public get length(): number {\n return this._lite.length;\n }\n /** Duration, seconds. */\n public get duration(): number {\n return this._lite.duration;\n }\n /** Number of channels. */\n public get channelCount(): number {\n return this._lite.channelCount;\n }\n\n /** Clones the buffer. Lite buffers are immutable, so the clone shares the data. */\n public clone(options?: Partial<{ name: string }>): StaticSoundBuffer {\n return new StaticSoundBuffer(this.engine, this._lite, options?.name ?? this.name);\n }\n}\n\n/** Babylon.js `StaticSound` — a buffer-backed sound wrapping a Lite `StaticSound`. */\nexport class StaticSound extends AbstractSound {\n /** @internal The backing Lite static sound. */\n public readonly _lite: LiteStaticSound;\n private readonly _autoplay: boolean;\n private _buffer: StaticSoundBuffer;\n\n /** @internal */\n public constructor(engine: AudioEngineV2, lite: LiteStaticSound, buffer: StaticSoundBuffer, outBus: PrimaryAudioBus | null, autoplay: boolean, name?: string, volume = 1) {\n super(name ?? lite.name ?? \"Sound\", engine, outBus);\n this._lite = lite;\n this._buffer = buffer;\n this._autoplay = autoplay;\n this._volume = volume;\n lite.onEnded.add(() => this.onEndedObservable.notifyObservers(this));\n }\n\n /** The decoded buffer this sound plays. */\n public get buffer(): StaticSoundBuffer {\n return this._buffer;\n }\n\n public get activeInstancesCount(): number {\n return this._lite.instanceCount;\n }\n public get autoplay(): boolean {\n return this._autoplay;\n }\n public get state(): SoundState {\n return this._lite.state as SoundState;\n }\n\n public get loop(): boolean {\n return this._lite._options.loop;\n }\n public set loop(value: boolean) {\n this._lite._options.loop = value;\n }\n\n public get startOffset(): number {\n return this._lite._options.startOffset;\n }\n public set startOffset(value: number) {\n this._lite._options.startOffset = value;\n }\n\n public get maxInstances(): number {\n return this._lite._options.maxInstances;\n }\n public set maxInstances(value: number) {\n this._lite._options.maxInstances = value;\n }\n\n public get duration(): number {\n return this._lite._options.duration;\n }\n public set duration(value: number) {\n this._lite._options.duration = value;\n }\n\n public get loopStart(): number {\n return this._lite._options.loopStart;\n }\n public set loopStart(value: number) {\n this._lite._options.loopStart = value;\n }\n\n public get loopEnd(): number {\n return this._lite._options.loopEnd;\n }\n public set loopEnd(value: number) {\n this._lite._options.loopEnd = value;\n }\n\n public get pitch(): number {\n return this._lite._options.pitch;\n }\n public set pitch(value: number) {\n this._lite._options.pitch = value;\n for (const instance of this._lite._instances) {\n if (instance._sourceNode) {\n instance._sourceNode.detune.value = value;\n }\n }\n }\n\n public get playbackRate(): number {\n return this._lite._options.playbackRate;\n }\n public set playbackRate(value: number) {\n this._lite._options.playbackRate = value;\n for (const instance of this._lite._instances) {\n if (instance._sourceNode) {\n instance._sourceNode.playbackRate.value = value;\n }\n }\n }\n\n public get currentTime(): number {\n return this.startOffset;\n }\n public set currentTime(value: number) {\n this.startOffset = value;\n }\n\n public play(options?: Partial<IStaticSoundPlayOptions>): void {\n playSound(this._lite, options);\n }\n\n public pause(): void {\n pauseSound(this._lite);\n }\n\n public resume(options?: Partial<IStaticSoundPlayOptions>): void {\n resumeSound(this._lite, options);\n }\n\n public stop(options?: Partial<IStaticSoundStopOptions>): void {\n stopSound(this._lite, options);\n }\n\n /** Clones the sound (shares the decoded buffer). */\n public async cloneAsync(options?: Partial<IStaticSoundCloneOptions>): Promise<StaticSound> {\n const outBus = (options?.outBus as PrimaryAudioBus | undefined) ?? this._outBus ?? undefined;\n return this.engine.createSoundAsync(this.name, this._buffer, { outBus });\n }\n\n public getClassName(): string {\n return \"StaticSound\";\n }\n\n public override dispose(): void {\n disposeSound(this._lite);\n super.dispose();\n }\n\n protected _applyVolume(value: number, options?: Partial<IAudioParameterRampOptions> | null): void {\n setSoundVolume(this._lite, value, toLiteRamp(options));\n }\n\n protected _spatialHost(): LiteHost {\n return this._lite;\n }\n}\n\n/** Babylon.js `StreamingSound` — a media-element-backed sound. */\nexport class StreamingSound extends AbstractSound {\n /** @internal The backing Lite streaming sound. */\n public readonly _lite: LiteStreamingSound;\n private readonly _autoplay: boolean;\n private _loop: boolean;\n private _startOffset: number;\n private _maxInstances: number;\n\n /** @internal */\n public constructor(engine: AudioEngineV2, lite: LiteStreamingSound, outBus: PrimaryAudioBus | null, options: Partial<IStreamingSoundOptions>, name?: string) {\n super(name ?? lite.name ?? \"Sound\", engine, outBus);\n this._lite = lite;\n this._autoplay = options.autoplay ?? false;\n this._loop = options.loop ?? false;\n this._startOffset = options.startOffset ?? 0;\n this._maxInstances = options.maxInstances ?? Infinity;\n this._volume = options.volume ?? 1;\n lite.onEnded.add(() => this.onEndedObservable.notifyObservers(this));\n }\n\n /** Number of instances configured to preload. */\n public get preloadCount(): number {\n return this._lite._options.preloadCount;\n }\n\n /** Number of instances that have finished preloading. */\n public get preloadCompletedCount(): number {\n return this._lite.preloadCompletedCount;\n }\n\n public get activeInstancesCount(): number {\n return this._lite.instanceCount;\n }\n public get autoplay(): boolean {\n return this._autoplay;\n }\n public get state(): SoundState {\n return this._lite.state as SoundState;\n }\n\n public get loop(): boolean {\n return this._loop;\n }\n public set loop(value: boolean) {\n this._loop = value;\n this._lite._options.loop = value;\n }\n\n public get startOffset(): number {\n return this._startOffset;\n }\n public set startOffset(value: number) {\n this._startOffset = value;\n this._lite._options.startOffset = value;\n }\n\n public get maxInstances(): number {\n return this._maxInstances;\n }\n public set maxInstances(value: number) {\n this._maxInstances = value;\n this._lite._options.maxInstances = value;\n }\n\n public get currentTime(): number {\n return this._startOffset;\n }\n public set currentTime(value: number) {\n this.startOffset = value;\n }\n\n public play(options?: Partial<IStreamingSoundPlayOptions>): void {\n playStreamingSound(this._lite, options);\n }\n\n public pause(): void {\n pauseStreamingSound(this._lite);\n }\n\n public resume(options?: Partial<IStreamingSoundPlayOptions>): void {\n resumeStreamingSound(this._lite, options);\n }\n\n public stop(): void {\n stopStreamingSound(this._lite);\n }\n\n /** Preloads a single instance. */\n public preloadInstanceAsync(): Promise<void> {\n return preloadStreamingInstanceAsync(this._lite);\n }\n\n /** Preloads `count` instances. */\n public preloadInstancesAsync(count: number): Promise<void> {\n return preloadStreamingInstancesAsync(this._lite, count);\n }\n\n public getClassName(): string {\n return \"StreamingSound\";\n }\n\n public override dispose(): void {\n disposeStreamingSound(this._lite);\n super.dispose();\n }\n\n protected _applyVolume(value: number, options?: Partial<IAudioParameterRampOptions> | null): void {\n setStreamingSoundVolume(this._lite, value, toLiteRamp(options));\n }\n\n protected _spatialHost(): LiteHost {\n return this._lite;\n }\n}\n\n// ───────────────────────────── Engine ────────────────────────────────────────\n\nconst FormatMimeTypes: { [key: string]: string } = {\n aac: \"audio/aac\",\n ac3: \"audio/ac3\",\n flac: \"audio/flac\",\n m4a: \"audio/mp4\",\n mp3: 'audio/mpeg; codecs=\"mp3\"',\n mp4: \"audio/mp4\",\n ogg: 'audio/ogg; codecs=\"vorbis\"',\n wav: \"audio/wav\",\n webm: 'audio/webm; codecs=\"vorbis\"',\n};\n\n/** Source accepted by `createSoundAsync` / `createSoundBufferAsync`. */\nexport type StaticSoundSource = ArrayBuffer | AudioBuffer | StaticSoundBuffer | string | string[];\n\nfunction unwrapBus(bus: PrimaryAudioBus | null | undefined): LitePrimaryAudioBus | undefined {\n if (!bus) {\n return undefined;\n }\n return (bus as AudioBus | MainAudioBus)._lite as LitePrimaryAudioBus;\n}\n\n/** The Web Audio input node a Lite primary bus exposes (mirrors Lite's internal `getBusInputNode`). */\nfunction liteBusInputNode(bus: LitePrimaryAudioBus): AudioNode {\n return \"_graph\" in bus ? (bus as LiteAudioBus)._graph._in : (bus as LiteMainBus)._in;\n}\n\n/**\n * Re-routes a Lite graph-bearing handle (sound, source, or generic bus) from its\n * current output bus to `newOutBus`, mirroring AudioV2's `outBus` setter. Lite\n * exposes no public re-route entry point, so this rewires the single stable tail\n * link (the sub-graph's `_out` node to the target bus input) directly, exactly as\n * Lite wires it at creation time.\n */\nfunction rerouteLiteOutBus(host: LiteHost, newOutBus: LitePrimaryAudioBus | null): void {\n const out = host._graph._out;\n const oldOutBus = host._outBus;\n if (oldOutBus) {\n try {\n out.disconnect(liteBusInputNode(oldOutBus));\n } catch {\n // The tail may not be connected yet (e.g. a microphone source created\n // without an output bus); ignore.\n }\n }\n if (newOutBus) {\n out.connect(liteBusInputNode(newOutBus));\n }\n (host as { _outBus: LitePrimaryAudioBus | null })._outBus = newOutBus;\n}\n\nfunction unwrapBufferSource(source: StaticSoundSource): ArrayBuffer | AudioBuffer | LiteSoundBuffer | string | string[] {\n if (source instanceof StaticSoundBuffer) {\n return source._lite;\n }\n return source;\n}\n\n/**\n * Babylon.js `AudioEngineV2` — the AudioV2 engine. Backed by a Lite audio engine.\n * Created via {@link CreateAudioEngineAsync}.\n */\nexport class AudioEngineV2 {\n private static _Instances: AudioEngineV2[] = [];\n /** All live audio engines. */\n public static get Instances(): readonly AudioEngineV2[] {\n return AudioEngineV2._Instances;\n }\n\n /** Fires when a named node is added to the engine. */\n public readonly onNodeAddedObservable = new Observable<AbstractNamedAudioNode>();\n /** Fires when a named node is removed from the engine. */\n public readonly onNodeRemovedObservable = new Observable<AbstractNamedAudioNode>();\n /** Fires when the engine is disposed. */\n public readonly onDisposeObservable = new Observable<AudioEngineV2>();\n\n /** @internal The backing Lite audio engine. */\n public readonly _lite: LiteAudioEngine;\n\n private readonly _sounds = new Set<AbstractSound>();\n private readonly _nodes = new Set<AbstractNamedAudioNode>();\n private _defaultMainBus: MainAudioBus | null = null;\n private _listener: AbstractSpatialAudioListener | null = null;\n private _mainOut: AbstractAudioNode | null = null;\n\n /** @internal */\n public constructor(lite: LiteAudioEngine) {\n this._lite = lite;\n AudioEngineV2._Instances.push(this);\n }\n\n /** The audio context's current time, seconds. */\n public get currentTime(): number {\n return this._lite.currentTime;\n }\n\n /** The context state. */\n public get state(): AudioEngineV2State {\n return this._lite.state;\n }\n\n /** Master output volume. */\n public get volume(): number {\n return getMasterVolume(this._lite);\n }\n public set volume(value: number) {\n setMasterVolume(this._lite, value);\n }\n\n /** Default parameter ramp duration, seconds. */\n public get parameterRampDuration(): number {\n return this._lite._rampDuration;\n }\n public set parameterRampDuration(value: number) {\n this._lite._rampDuration = value;\n }\n\n /** The default main bus all sounds route to. */\n public get defaultMainBus(): MainAudioBus | null {\n return (this._defaultMainBus ??= new MainAudioBus(this, this._lite._mainBus));\n }\n\n /** The spatial-audio listener (the \"ears\"). */\n public get listener(): AbstractSpatialAudioListener {\n return (this._listener ??= new AbstractSpatialAudioListener(this._lite));\n }\n\n /** The engine output node. */\n public get mainOut(): AbstractAudioNode {\n return (this._mainOut ??= new MainOutNode(this));\n }\n\n /** All live sounds. */\n public get sounds(): readonly AbstractSound[] {\n return Array.from(this._sounds);\n }\n\n /** All live named nodes. */\n public get nodes(): ReadonlySet<AbstractNamedAudioNode> {\n return this._nodes;\n }\n\n /** Sets the master volume, optionally ramping. */\n public setVolume(value: number, options?: Partial<IAudioParameterRampOptions>): void {\n setMasterVolume(this._lite, value, toLiteRamp(options));\n }\n\n /** Whether the given audio format/extension can be decoded. */\n public isFormatValid(format: string): boolean {\n const mimeType = FormatMimeTypes[format.toLowerCase()];\n if (mimeType === undefined) {\n return false;\n }\n if (typeof Audio === \"undefined\") {\n return true;\n }\n return new Audio().canPlayType(mimeType) !== \"\";\n }\n\n /** Suspends the engine context. */\n public async pauseAsync(): Promise<void> {\n const ctx = this._lite._ctx as AudioContext;\n if (typeof ctx.suspend === \"function\" && ctx.state === \"running\") {\n await ctx.suspend();\n }\n }\n\n /** Resumes the engine context. */\n public async resumeAsync(): Promise<void> {\n await unlockAudioEngineAsync(this._lite);\n }\n\n /** Resumes the engine context (alias of {@link resumeAsync}). */\n public async unlockAsync(): Promise<void> {\n await unlockAudioEngineAsync(this._lite);\n }\n\n /** Creates a buffer-backed sound. */\n public async createSoundAsync(name: string, source: StaticSoundSource, options?: Partial<IStaticSoundOptions>): Promise<StaticSound> {\n const liteOptions = toLiteStaticSoundOptions(name, options);\n const lite = await createSoundAsync(this._lite, unwrapBufferSource(source), liteOptions);\n const buffer = new StaticSoundBuffer(this, lite.buffer, name);\n return new StaticSound(this, lite, buffer, (options?.outBus as PrimaryAudioBus | undefined) ?? this.defaultMainBus, options?.autoplay ?? false, name, options?.volume ?? 1);\n }\n\n /** Creates a decoded sound buffer. */\n public async createSoundBufferAsync(source: StaticSoundSource, options?: Partial<IStaticSoundBufferOptions>): Promise<StaticSoundBuffer> {\n const lite = await createSoundBufferAsync(this._lite, unwrapBufferSource(source), { skipCodecCheck: options?.skipCodecCheck });\n return new StaticSoundBuffer(this, lite);\n }\n\n /** Creates a streaming, media-element-backed sound. */\n public async createStreamingSoundAsync(name: string, source: HTMLMediaElement | string | string[], options?: Partial<IStreamingSoundOptions>): Promise<StreamingSound> {\n const liteOptions: LiteStreamingSoundOptions = {\n autoplay: options?.autoplay,\n loop: options?.loop,\n maxInstances: options?.maxInstances,\n outBus: unwrapBus(options?.outBus) as LitePrimaryAudioBus | undefined,\n preloadCount: options?.preloadCount,\n startOffset: options?.startOffset,\n volume: options?.volume,\n };\n const lite = await createStreamingSoundAsync(this._lite, source, liteOptions);\n return new StreamingSound(this, lite, (options?.outBus as PrimaryAudioBus | undefined) ?? this.defaultMainBus, options ?? {}, name);\n }\n\n /** Creates a generic mixer bus. */\n public async createBusAsync(name: string, options?: Partial<IAudioBusOptions>): Promise<AudioBus> {\n const lite = await createAudioBusAsync(this._lite, name, {\n volume: options?.volume,\n outBus: unwrapBus(options?.outBus) as LitePrimaryAudioBus | undefined,\n });\n return new AudioBus(this, lite, (options?.outBus as PrimaryAudioBus | undefined) ?? this.defaultMainBus, options?.volume ?? 1);\n }\n\n /**\n * Creates a main bus. Babylon Lite builds a single default main bus per engine\n * and does not expose creating additional ones, so this resolves the default\n * main bus.\n */\n public async createMainBusAsync(_name: string, _options?: Partial<IMainAudioBusOptions>): Promise<MainAudioBus> {\n return this.defaultMainBus as MainAudioBus;\n }\n\n /** Wraps an arbitrary Web Audio node as a sound source. */\n public async createSoundSourceAsync(name: string, source: AudioNode, options?: Partial<ISoundSourceOptions>): Promise<SoundSource> {\n const lite = await createSoundSourceAsync(this._lite, source, {\n name,\n outBus: unwrapBus(options?.outBus) as LitePrimaryAudioBus | undefined,\n outBusAutoDefault: options?.outBusAutoDefault,\n volume: options?.volume,\n });\n return new SoundSource(this, lite, (options?.outBus as PrimaryAudioBus | undefined) ?? null, options?.volume ?? 1);\n }\n\n /** Creates a microphone-backed sound source. */\n public async createMicrophoneSoundSourceAsync(name: string, options?: Partial<ISoundSourceOptions>): Promise<SoundSource> {\n const lite = await createMicrophoneSoundSourceAsync(this._lite, {\n name,\n outBus: unwrapBus(options?.outBus) as LitePrimaryAudioBus | undefined,\n outBusAutoDefault: options?.outBusAutoDefault,\n volume: options?.volume,\n });\n return new SoundSource(this, lite, (options?.outBus as PrimaryAudioBus | undefined) ?? null, options?.volume ?? 1);\n }\n\n /** Disposes the engine and all its sounds/buses. */\n public dispose(): void {\n disposeAudioEngine(this._lite);\n this.onDisposeObservable.notifyObservers(this);\n this.onDisposeObservable.clear();\n this.onNodeAddedObservable.clear();\n this.onNodeRemovedObservable.clear();\n this._sounds.clear();\n this._nodes.clear();\n const i = AudioEngineV2._Instances.indexOf(this);\n if (i !== -1) {\n AudioEngineV2._Instances.splice(i, 1);\n }\n if (LastCreatedEngine === this) {\n LastCreatedEngine = null;\n }\n }\n\n /** @internal */\n public _addSound(sound: AbstractSound): void {\n this._sounds.add(sound);\n }\n /** @internal */\n public _removeSound(sound: AbstractSound): void {\n this._sounds.delete(sound);\n }\n /** @internal */\n public _addNode(node: AbstractNamedAudioNode): void {\n this._nodes.add(node);\n this.onNodeAddedObservable.notifyObservers(node);\n }\n /** @internal */\n public _removeNode(node: AbstractNamedAudioNode): void {\n if (this._nodes.delete(node)) {\n this.onNodeRemovedObservable.notifyObservers(node);\n }\n }\n}\n\n/** The engine output node returned by `engine.mainOut`. */\nclass MainOutNode extends AbstractAudioNode {\n public constructor(engine: AudioEngineV2) {\n super(engine);\n }\n public getClassName(): string {\n return \"_MainAudioOut\";\n }\n}\n\n// ───────────────────────────── Option mapping ────────────────────────────────\n\nfunction toLiteStaticSoundOptions(_name: string, options?: Partial<IStaticSoundOptions>): LiteStaticSoundOptions {\n return {\n autoplay: options?.autoplay,\n duration: options?.duration,\n loop: options?.loop,\n loopEnd: options?.loopEnd,\n loopStart: options?.loopStart,\n maxInstances: options?.maxInstances,\n outBus: unwrapBus(options?.outBus) as LitePrimaryAudioBus | undefined,\n pitch: options?.pitch,\n playbackRate: options?.playbackRate,\n startOffset: options?.startOffset,\n volume: options?.volume,\n skipCodecCheck: options?.skipCodecCheck,\n };\n}\n\nfunction toLiteEngineOptions(options?: Partial<IWebAudioEngineOptions>): LiteAudioEngineOptions {\n return {\n audioContext: options?.audioContext,\n volume: options?.volume,\n parameterRampDuration: options?.parameterRampDuration,\n resumeOnInteraction: options?.resumeOnInteraction,\n resumeOnPause: options?.resumeOnPause,\n resumeOnPauseRetryInterval: options?.resumeOnPauseRetryInterval,\n };\n}\n\n// ───────────────────────────── Factory functions ─────────────────────────────\n\n/**\n * Module-level \"last created engine\", mirroring Babylon.js. Assigning a primitive\n * default is bundler-safe (no allocation at import time) and the compat package is\n * excluded from Lite bundle ceilings.\n */\nlet LastCreatedEngine: AudioEngineV2 | null = null;\n\n/** Babylon.js `OnAudioEngineV2CreatedObservable` — fires when an engine is created. */\nexport const OnAudioEngineV2CreatedObservable = new Observable<AudioEngineV2>();\n\n/** Babylon.js `LastCreatedAudioEngine()` — the most recently created engine, if any. */\nexport function LastCreatedAudioEngine(): AudioEngineV2 | null {\n return LastCreatedEngine;\n}\n\nfunction resolveEngine(engine?: AudioEngineV2 | null): AudioEngineV2 {\n const resolved = engine ?? LastCreatedEngine;\n if (!resolved) {\n return unsupported(\"AudioV2 factory\", \"No audio engine available. Call CreateAudioEngineAsync(...) first or pass an engine.\");\n }\n return resolved;\n}\n\n/** Babylon.js `CreateAudioEngineAsync` — creates and initialises an AudioV2 engine. */\nexport async function CreateAudioEngineAsync(options?: Partial<IWebAudioEngineOptions>): Promise<AudioEngineV2> {\n const lite = await createAudioEngineAsync(toLiteEngineOptions(options));\n const engine = new AudioEngineV2(lite);\n LastCreatedEngine = engine;\n OnAudioEngineV2CreatedObservable.notifyObservers(engine);\n return engine;\n}\n\n/** Babylon.js `CreateSoundAsync`. */\nexport function CreateSoundAsync(name: string, source: StaticSoundSource, options?: Partial<IStaticSoundOptions>, engine?: AudioEngineV2 | null): Promise<StaticSound> {\n return resolveEngine(engine).createSoundAsync(name, source, options);\n}\n\n/** Babylon.js `CreateSoundBufferAsync`. */\nexport function CreateSoundBufferAsync(source: StaticSoundSource, options?: Partial<IStaticSoundBufferOptions>, engine?: AudioEngineV2 | null): Promise<StaticSoundBuffer> {\n return resolveEngine(engine).createSoundBufferAsync(source, options);\n}\n\n/** Babylon.js `CreateStreamingSoundAsync`. */\nexport function CreateStreamingSoundAsync(\n name: string,\n source: HTMLMediaElement | string | string[],\n options?: Partial<IStreamingSoundOptions>,\n engine?: AudioEngineV2 | null\n): Promise<StreamingSound> {\n return resolveEngine(engine).createStreamingSoundAsync(name, source, options);\n}\n\n/** Babylon.js `CreateAudioBusAsync`. */\nexport function CreateAudioBusAsync(name: string, options?: Partial<IAudioBusOptions>, engine?: AudioEngineV2 | null): Promise<AudioBus> {\n return resolveEngine(engine).createBusAsync(name, options);\n}\n\n/** Babylon.js `CreateMainAudioBusAsync`. */\nexport function CreateMainAudioBusAsync(name: string, options?: Partial<IMainAudioBusOptions>, engine?: AudioEngineV2 | null): Promise<MainAudioBus> {\n return resolveEngine(engine).createMainBusAsync(name, options);\n}\n\n/** Babylon.js `CreateSoundSourceAsync`. */\nexport function CreateSoundSourceAsync(name: string, source: AudioNode, options?: Partial<ISoundSourceOptions>, engine?: AudioEngineV2 | null): Promise<SoundSource> {\n return resolveEngine(engine).createSoundSourceAsync(name, source, options);\n}\n\n/** Babylon.js `CreateMicrophoneSoundSourceAsync`. */\nexport function CreateMicrophoneSoundSourceAsync(name: string, options?: Partial<ISoundSourceOptions>, engine?: AudioEngineV2 | null): Promise<SoundSource> {\n return resolveEngine(engine).createMicrophoneSoundSourceAsync(name, options);\n}\n","/**\n * Stubs for Babylon.js core/loader APIs that are **known but not supported** by\n * Babylon Lite.\n *\n * Every entry here throws {@link LiteCompatError} on use (construction or call),\n * so a ported scene fails loudly with a clear pointer instead of either a\n * confusing \"X is not exported from the compat package\" error or, worse, a\n * silently-wrong render. These mirror the `❌ Not supported` /\n * `⛔ Out of scope` rows in `COMPAT-STATUS.md`.\n *\n * As Babylon Lite gains a capability, the corresponding stub here should be\n * replaced by a real wrapper (and its `COMPAT-STATUS.md` row upgraded).\n */\n\nimport { unsupported } from \"../error.js\";\n\n// ─── Materials ───────────────────────────────────────────────────────\nexport class MultiMaterial {\n public constructor() {\n unsupported(\"MultiMaterial\", \"Babylon Lite uses one material per renderable. Split the mesh geometry by material into separate meshes instead.\");\n }\n}\n\nexport class ShaderMaterial {\n public constructor() {\n unsupported(\"ShaderMaterial\", \"Babylon Lite is WGSL-only. Use the native `createShaderMaterial` (WGSL) API; there is no automatic GLSL translation.\");\n }\n}\n\nexport class BackgroundMaterial {\n public constructor() {\n unsupported(\"BackgroundMaterial\", \"Standalone BackgroundMaterial is not wrapped. Use the compat `Scene` environment helpers / native `loadEnvironment` instead.\");\n }\n}\n\n// ─── Lights ──────────────────────────────────────────────────────────\nexport class RectAreaLight {\n public constructor() {\n unsupported(\"RectAreaLight\", \"Area lights are not implemented in Babylon Lite. Use Point/Spot/Directional/Hemispheric lights.\");\n }\n}\n\nexport class ClusteredLightContainer {\n public constructor() {\n unsupported(\"ClusteredLightContainer\", \"Clustered lighting is not exposed by the Babylon Lite public API; the compat layer cannot wrap it.\");\n }\n}\n\n// ─── Particles ───────────────────────────────────────────────────────\nexport class ParticleSystem {\n public constructor() {\n unsupported(\"ParticleSystem\", \"Particle systems are not implemented in Babylon Lite.\");\n }\n}\n\nexport class GPUParticleSystem {\n public constructor() {\n unsupported(\"GPUParticleSystem\", \"Particle systems are not implemented in Babylon Lite.\");\n }\n}\n\nexport class SolidParticleSystem {\n public constructor() {\n unsupported(\"SolidParticleSystem\", \"Solid particle systems are not implemented in Babylon Lite. Consider native thin instances for many-copies use cases.\");\n }\n}\n\n// ─── Effect layers ───────────────────────────────────────────────────\nexport class HighlightLayer {\n public constructor() {\n unsupported(\"HighlightLayer\", \"Effect layers are not implemented in Babylon Lite.\");\n }\n}\n\nexport class GlowLayer {\n public constructor() {\n unsupported(\"GlowLayer\", \"Effect layers are not implemented in Babylon Lite. For a bloom-style glow, use the native bloom post-process task.\");\n }\n}\n\n// ─── Mesh-attached renderers / projectors ────────────────────────────\nexport class LinesMesh {\n public constructor() {\n unsupported(\"LinesMesh\", \"Line meshes are not implemented in Babylon Lite.\");\n }\n}\n\nexport class GreasedLineMesh {\n public constructor() {\n unsupported(\"GreasedLineMesh\", \"Greased-line meshes are not implemented in Babylon Lite.\");\n }\n}\n\nexport class EdgesRenderer {\n public constructor() {\n unsupported(\"EdgesRenderer\", \"Edge rendering is not implemented in Babylon Lite.\");\n }\n}\n\nexport class OutlineRenderer {\n public constructor() {\n unsupported(\"OutlineRenderer\", \"Mesh outline rendering is not implemented in Babylon Lite.\");\n }\n}\n\n// ─── Textures ────────────────────────────────────────────────────────\nexport class MirrorTexture {\n public constructor() {\n unsupported(\"MirrorTexture\", \"Mirror/reflection textures are not implemented in Babylon Lite. Build one from a native render-target texture + clip plane if required.\");\n }\n}\n\n// ─── Audio ───────────────────────────────────────────────────────────\nexport class Sound {\n public constructor() {\n unsupported(\"Sound\", \"Audio is not part of Babylon Lite. Use the Web Audio API directly.\");\n }\n}\n\n// ─── Serialization ───────────────────────────────────────────────────\n/** Babylon.js scene serializer. Babylon Lite uses different data structures and does not round-trip `.babylon`. */\nexport const SceneSerializer = {\n Serialize(): never {\n return unsupported(\"SceneSerializer.Serialize\", \"Babylon Lite does not implement `.babylon` scene serialization.\");\n },\n SerializeMesh(): never {\n return unsupported(\"SceneSerializer.SerializeMesh\", \"Babylon Lite does not implement mesh serialization.\");\n },\n};\n","/**\n * Throwing stubs for additional Babylon.js core/loaders symbols that Babylon\n * Lite either does not implement, or exposes only through a different native API\n * that the compat layer does not wrap 1:1.\n *\n * Every stub throws {@link LiteCompatError} on use with a pointer to the native\n * Babylon Lite alternative where one exists. This keeps the completeness\n * invariant — every core/loaders symbol resolves to an import and fails loudly\n * rather than silently.\n */\n\nimport { unsupported } from \"../error.js\";\n\n// ─── Bones / Skeletons / Morph ───────────────────────────────────────\nexport class Skeleton {\n public constructor() {\n unsupported(\"Skeleton\", \"Skeletons are produced by the glTF loader in Babylon Lite and driven by `createAnimationController`; they are not constructed manually.\");\n }\n}\n\nexport class Bone {\n public constructor() {\n unsupported(\"Bone\", \"Bones are produced by the glTF loader in Babylon Lite; manual bone construction is not wrapped.\");\n }\n}\n\n// ─── Probes / Layers / Rendering ─────────────────────────────────────\nexport class ReflectionProbe {\n public constructor() {\n unsupported(\"ReflectionProbe\", \"Dynamic reflection probes are not implemented in Babylon Lite.\");\n }\n}\n\nexport class Layer {\n public constructor() {\n unsupported(\"Layer\", \"2D background/foreground layers are not wrapped. Use the native effect-render-task APIs for fullscreen overlays.\");\n }\n}\n\nexport class EffectLayer {\n public constructor() {\n unsupported(\"EffectLayer\", \"Effect layers are not implemented in Babylon Lite.\");\n }\n}\n\nexport class DepthRenderer {\n public constructor() {\n unsupported(\"DepthRenderer\", \"Use the native linear-depth material / geometry-renderer task instead.\");\n }\n}\n\nexport class GeometryBufferRenderer {\n public constructor() {\n unsupported(\"GeometryBufferRenderer\", \"Use the native `createGeometryRendererTask` (G-buffer) API instead.\");\n }\n}\n\nexport class BoundingBoxRenderer {\n public constructor() {\n unsupported(\"BoundingBoxRenderer\", \"Bounding-box rendering is not implemented in Babylon Lite.\");\n }\n}\n\n// ─── Post-processes ──────────────────────────────────────────────────\n// The visual effects below exist in Babylon Lite as frame-graph post-process\n// tasks (e.g. `createBloomPostProcessTask`), but the Babylon.js camera-attached\n// `PostProcess` class model is not wrapped. Use the native task APIs.\nexport class PostProcess {\n public constructor() {\n unsupported(\n \"PostProcess\",\n \"Babylon Lite uses frame-graph post-process tasks rather than camera-attached PostProcess objects. Use the native `create*PostProcessTask` APIs.\"\n );\n }\n}\n\nfunction postProcessStub(name: string, nativeTask: string): { new (): never } {\n return class {\n public constructor() {\n unsupported(name, `Use the native \\`${nativeTask}\\` frame-graph task instead of the Babylon.js PostProcess class.`);\n }\n } as unknown as { new (): never };\n}\n\nexport const BlackAndWhitePostProcess = postProcessStub(\"BlackAndWhitePostProcess\", \"createBlackAndWhitePostProcessTask\");\nexport const BlurPostProcess = postProcessStub(\"BlurPostProcess\", \"createBlurPostProcessTask\");\nexport const BloomEffect = postProcessStub(\"BloomEffect\", \"createBloomPostProcessTask\");\nexport const ChromaticAberrationPostProcess = postProcessStub(\"ChromaticAberrationPostProcess\", \"createChromaticAberrationPostProcessTask\");\nexport const DepthOfFieldEffect = postProcessStub(\"DepthOfFieldEffect\", \"createDepthOfFieldPostProcessTask\");\n\nexport class DefaultRenderingPipeline {\n public constructor() {\n unsupported(\n \"DefaultRenderingPipeline\",\n \"Compose the native frame-graph post-process tasks (bloom, depth-of-field, chromatic aberration, image processing) instead of the Babylon.js DefaultRenderingPipeline.\"\n );\n }\n}\n\nexport class FxaaPostProcess {\n public constructor() {\n unsupported(\"FxaaPostProcess\", \"FXAA is not implemented in Babylon Lite.\");\n }\n}\n\nexport class SSAO2RenderingPipeline {\n public constructor() {\n unsupported(\"SSAO2RenderingPipeline\", \"SSAO is not implemented in Babylon Lite.\");\n }\n}\n\n// ─── Particles ───────────────────────────────────────────────────────\nexport class ParticleHelper {\n public constructor() {\n unsupported(\"ParticleHelper\", \"Particle systems are not implemented in Babylon Lite.\");\n }\n}\n\nexport class ParticleSystemSet {\n public constructor() {\n unsupported(\"ParticleSystemSet\", \"Particle systems are not implemented in Babylon Lite.\");\n }\n}\n\nexport class PointsCloudSystem {\n public constructor() {\n unsupported(\"PointsCloudSystem\", \"Point-cloud systems are not implemented in Babylon Lite. For Gaussian splats use the native splat loaders.\");\n }\n}\n\n// ─── Physics ─────────────────────────────────────────────────────────\n// Babylon Lite ships a Havok-V2 subset via `createHavokWorld` /\n// `createPhysicsAggregate` etc. The Babylon.js plugin/aggregate class model is\n// not wrapped 1:1; use the native physics functions.\nexport class HavokPlugin {\n public constructor() {\n unsupported(\"HavokPlugin\", \"Use the native `createHavokWorld` API; the Babylon.js physics-plugin object is not wrapped.\");\n }\n}\n\nexport class PhysicsAggregate {\n public constructor() {\n unsupported(\"PhysicsAggregate\", \"Use the native `createPhysicsAggregate` API instead of the Babylon.js PhysicsAggregate class.\");\n }\n}\n\nexport class PhysicsBody {\n public constructor() {\n unsupported(\"PhysicsBody\", \"Use the native `createPhysicsBody` API.\");\n }\n}\n\nexport class PhysicsShape {\n public constructor() {\n unsupported(\"PhysicsShape\", \"Use the native `createPhysicsShape` API.\");\n }\n}\n\nexport class CannonJSPlugin {\n public constructor() {\n unsupported(\"CannonJSPlugin\", \"Babylon Lite physics is Havok-V2 only.\");\n }\n}\n\nexport class AmmoJSPlugin {\n public constructor() {\n unsupported(\"AmmoJSPlugin\", \"Babylon Lite physics is Havok-V2 only.\");\n }\n}\n\n// ─── Navigation ──────────────────────────────────────────────────────\nexport class RecastJSPlugin {\n public constructor() {\n unsupported(\"RecastJSPlugin\", \"Use the native Recast-V2 navigation API (`createNavigationPluginAsync`, `createNavMesh`, `createNavCrowd`).\");\n }\n}\n\n// ─── Audio ───────────────────────────────────────────────────────────\nexport class AudioEngine {\n public constructor() {\n unsupported(\"AudioEngine\", \"Audio is not part of Babylon Lite. Use the Web Audio API directly.\");\n }\n}\n\nexport class WeightedSound {\n public constructor() {\n unsupported(\"WeightedSound\", \"Audio is not part of Babylon Lite.\");\n }\n}\n\n// ─── Loaders (formats not present in Babylon Lite) ───────────────────\nexport class OBJFileLoader {\n public constructor() {\n unsupported(\"OBJFileLoader\", \"The OBJ format is not supported by Babylon Lite. Convert to glTF.\");\n }\n}\n\nexport class STLFileLoader {\n public constructor() {\n unsupported(\"STLFileLoader\", \"The STL format is not supported by Babylon Lite. Convert to glTF.\");\n }\n}\n\nexport class FBXFileLoader {\n public constructor() {\n unsupported(\"FBXFileLoader\", \"The FBX format is not supported by Babylon Lite. Convert to glTF.\");\n }\n}\n\nexport class BVHFileLoader {\n public constructor() {\n unsupported(\"BVHFileLoader\", \"The BVH format is not supported by Babylon Lite.\");\n }\n}\n\n// ─── Sprites ─────────────────────────────────────────────────────────\n// `SpriteManager` / `Sprite` are wrapped over Lite's facing-billboard system\n// (see ../sprites/sprites.ts). `SpriteMap` / `SpritePackedManager` remain\n// unsupported (tile-map / packed-atlas variants are not wrapped).\nexport class SpriteMap {\n public constructor() {\n unsupported(\"SpriteMap\", \"Tile-map sprites are not wrapped; use the native sprite APIs.\");\n }\n}\n\nexport class SpritePackedManager {\n public constructor() {\n unsupported(\"SpritePackedManager\", \"Use the native Babylon Lite sprite APIs.\");\n }\n}\n\n// ─── Misc (device / optimisation surfaces not wrapped) ───────────────\nexport class VirtualJoystick {\n public constructor() {\n unsupported(\"VirtualJoystick\", \"The virtual joystick UI is not part of Babylon Lite.\");\n }\n}\n\nexport class SceneOptimizer {\n public constructor() {\n unsupported(\"SceneOptimizer\", \"Automatic scene optimisation is not implemented in the compat layer.\");\n }\n}\n"],"names":["g","b","Space","c","d","n","m","t","i","_a","h","now","liteGetViewMatrix","liteGetProjectionMatrix","liteAttachControl","f","liteGoToFrame","liteCreateDefaultCamera","createArcRotateCamera","attachControl","litePickAsync","mesh","layer","ScenePerformancePriority","ShaderLanguage"],"mappings":"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"}
|