@viggle/splat-engine-three 0.0.0-stage → 0.1.0
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/LICENSE +21 -0
- package/README.md +290 -2
- package/dist/chunks/chunk-MM6DJU6S.js +7801 -0
- package/dist/chunks/chunk-MM6DJU6S.js.map +7 -0
- package/dist/index.js +52 -0
- package/dist/index.js.map +7 -0
- package/dist/types/anim/animation-conversion.d.ts +25 -0
- package/dist/types/anim/bind-pose.d.ts +15 -0
- package/dist/types/anim/keyframe-splines.d.ts +59 -0
- package/dist/types/anim/rest-relative.d.ts +32 -0
- package/dist/types/anim/spline.d.ts +14 -0
- package/dist/types/animation.d.ts +216 -0
- package/dist/types/armature.d.ts +524 -0
- package/dist/types/character.d.ts +540 -0
- package/dist/types/engine.d.ts +166 -0
- package/dist/types/environment.d.ts +53 -0
- package/dist/types/index.d.ts +37 -0
- package/dist/types/lighting/color.d.ts +13 -0
- package/dist/types/lighting/point-light.d.ts +33 -0
- package/dist/types/lighting/sky-light.d.ts +22 -0
- package/dist/types/lighting/sun-light.d.ts +34 -0
- package/dist/types/loader/animation/animation-glb.d.ts +117 -0
- package/dist/types/loader/character/index.d.ts +33 -0
- package/dist/types/loader/character/legacy/index.d.ts +34 -0
- package/dist/types/loader/character/legacy/interleaved-splat.d.ts +101 -0
- package/dist/types/loader/character/legacy/planar-splat.d.ts +139 -0
- package/dist/types/loader/character/load.d.ts +33 -0
- package/dist/types/loader/character/types.d.ts +129 -0
- package/dist/types/loader/character/v1/decode.d.ts +32 -0
- package/dist/types/loader/environment/ply.d.ts +16 -0
- package/dist/types/loader/shared/bin-cache.d.ts +19 -0
- package/dist/types/loader/skeleton/index.d.ts +19 -0
- package/dist/types/loader/skeleton/skeleton-data-441.d.ts +5 -0
- package/dist/types/loader/skeleton/skeleton-data.d.ts +6 -0
- package/dist/types/math.d.ts +82 -0
- package/dist/types/skeletal/animation-player.d.ts +185 -0
- package/dist/types/skeletal/bone-mask.d.ts +27 -0
- package/dist/types/skeletal/bone-stretch.d.ts +65 -0
- package/dist/types/skeletal/pose.d.ts +27 -0
- package/dist/types/skeletal/skeleton.d.ts +57 -0
- package/dist/types/skeletal/splat-skinning.d.ts +69 -0
- package/dist/types/splat/backend.d.ts +57 -0
- package/dist/types/splat/bone-binding.d.ts +38 -0
- package/dist/types/splat/depth-sort.d.ts +58 -0
- package/dist/types/splat/packed-splats.d.ts +36 -0
- package/dist/types/splat/splat-mesh.d.ts +71 -0
- package/dist/types/splat/splat.d.ts +186 -0
- package/dist/types/splat/transform-palette.d.ts +42 -0
- package/dist/types/splat/webgl/backend.d.ts +17 -0
- package/dist/types/splat/webgl/shaders.d.ts +2 -0
- package/dist/types/splat/webgl/splat-mesh.d.ts +52 -0
- package/dist/types/splat/webgpu/backend.d.ts +25 -0
- package/dist/types/splat/webgpu/lighting.d.ts +34 -0
- package/dist/types/splat/webgpu/radix-sort.d.ts +46 -0
- package/dist/types/splat/webgpu/splat-mesh.d.ts +71 -0
- package/dist/types/three/loaders.d.ts +77 -0
- package/dist/types/three/splat-character.d.ts +192 -0
- package/dist/types/types.d.ts +30 -0
- package/dist/types/webgpu.d.ts +5 -0
- package/dist/webgpu.js +813 -0
- package/dist/webgpu.js.map +7 -0
- package/package.json +46 -4
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/splat/webgpu/lighting.ts", "../src/splat/webgpu/splat-mesh.ts", "../src/splat/webgpu/radix-sort.ts", "../src/splat/webgpu/backend.ts", "../src/webgpu.ts"],
|
|
4
|
+
"sourcesContent": ["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport * as TSL from 'three/tsl';\nimport { Vector4 } from 'three/webgpu';\n\nimport type { SplatEngine } from '../../engine';\n\n// See splat-mesh.ts for why the TSL node graph is untyped here.\ntype Node = any;\nconst { Fn, If, Loop, float, int, length, uniform, uniformArray } = TSL as any;\n\n/** Point lights the WebGPU backend evaluates per splat. Extra lights are ignored. */\nexport const MAX_POINT_LIGHTS = 16;\n\n/**\n * The engine's lighting registry as TSL uniforms, shared by every WebGPU splat\n * drawable of one engine.\n *\n * @internal\n */\nexport class WebGPULighting {\n private readonly _engine: SplatEngine;\n private readonly _sunColor: Node;\n private readonly _sunIntensity: Node;\n private readonly _ambient: Node;\n private readonly _pointCount: Node;\n private readonly _pointPosRange: Vector4[];\n private readonly _pointColor: Vector4[];\n private readonly _pointPosRangeNode: Node;\n private readonly _pointColorNode: Node;\n private _version = -1;\n\n constructor(engine: SplatEngine) {\n this._engine = engine;\n // Wrapping the engine's own vectors: its lighting sync writes them in place.\n this._sunColor = uniform(engine.lightingUniforms.uSunColor.value);\n this._ambient = uniform(engine.lightingUniforms.uAmbientColor.value);\n this._sunIntensity = uniform(0);\n this._pointCount = uniform(0, 'int');\n this._pointPosRange = Array.from({ length: MAX_POINT_LIGHTS }, () => new Vector4());\n this._pointColor = Array.from({ length: MAX_POINT_LIGHTS }, () => new Vector4());\n this._pointPosRangeNode = uniformArray(this._pointPosRange, 'vec4');\n this._pointColorNode = uniformArray(this._pointColor, 'vec4');\n }\n\n /**\n * Refresh the uniforms from the engine's lighting registry.\n * @returns A number that changes whenever the lighting does.\n */\n sync(): number {\n const engine = this._engine;\n engine.syncLighting();\n if (engine.lightingVersion === this._version) return this._version;\n this._version = engine.lightingVersion;\n\n this._sunIntensity.value = engine.lightingUniforms.uSunIntensity.value;\n let count = 0;\n for (const p of engine.lighting.points) {\n if (!p.enabled) continue;\n if (count === MAX_POINT_LIGHTS) break;\n this._pointPosRange[count].set(p.position.x, p.position.y, p.position.z, p.range);\n this._pointColor[count].set(p.color.r, p.color.g, p.color.b, p.intensity);\n count++;\n }\n this._pointCount.value = count;\n return this._version;\n }\n\n /**\n * The multiplier applied to a splat's baked colour: ambient, plus sun, plus\n * range-attenuated point lights. With no lights it is exactly 1.\n */\n litFactor(worldCenter: Node): Node {\n return Fn(() => {\n const lit = this._ambient.add(this._sunColor.mul(this._sunIntensity)).toVar();\n Loop({ start: int(0), end: this._pointCount, type: 'int', condition: '<' }, ({ i }: { i: Node }) => {\n const posRange = this._pointPosRangeNode.element(i);\n const colorInt = this._pointColorNode.element(i);\n const dist = length(posRange.xyz.sub(worldCenter)).toVar();\n If(dist.lessThan(posRange.w), () => {\n const t = dist.div(posRange.w);\n const atten = float(1).sub(t.mul(t)).toVar();\n lit.addAssign(colorInt.xyz.mul(colorInt.w).mul(atten.mul(atten)));\n });\n });\n return lit;\n })();\n }\n}\n", "/* eslint-disable @typescript-eslint/no-explicit-any */\nimport * as TSL from 'three/tsl';\nimport {\n BufferAttribute,\n DoubleSide,\n InstancedBufferGeometry,\n Matrix3,\n Matrix4,\n NodeMaterial,\n Quaternion,\n SRGBColorSpace,\n Sphere,\n StorageBufferAttribute,\n Vector2,\n Vector3,\n Vector4,\n} from 'three/webgpu';\nimport type { Camera, Mesh } from 'three/webgpu';\n\nimport type { SplatRenderImpl } from '../backend';\nimport type { Splat } from '../splat';\n\nimport type { WebGPULighting } from './lighting';\nimport { GpuRadixSort, SORT_KEY_BITS } from './radix-sort';\n\n// TSL nodes are dynamically typed proxies, and the published typings reject\n// valid programs as soon as storage buffers and bit casts are involved. This\n// file treats the node graph as untyped and relies on the A/B suite instead.\ntype Node = any;\nconst {\n Discard,\n Fn,\n If,\n Loop,\n clamp,\n dot,\n exp,\n float,\n instanceIndex,\n length,\n log,\n max,\n min,\n mix,\n normalize,\n positionGeometry,\n select,\n sqrt,\n storage,\n uint,\n uintBitsToFloat,\n uniform,\n uniformArray,\n unpackHalf2x16,\n uvec4,\n varyingProperty,\n vec2,\n vec3,\n vec4,\n} = TSL as any;\n\n/** Depth buckets the sort distinguishes: one per 16-bit key. */\nconst SORT_BINS = 1 << SORT_KEY_BITS;\nconst WORKGROUP_SIZE = 256;\n\n/** Groups a variant mask can address. The mask travels as a uniform array of this size. */\nexport const MAX_VARIANT_GROUPS = 64;\n\nconst EXP4 = Math.exp(-4);\nconst INV_EXP4 = 1 / (1 - EXP4);\n\nconst _position = new Vector3();\nconst _quaternion = new Quaternion();\nconst _scale = new Vector3();\nconst _viewport = new Vector4();\nconst _sphere = new Sphere();\nconst _viewCenter = new Vector3();\nconst _direction = new Vector3();\n\n/** Size of the per-frame input signature: three matrices plus a handful of scalars. */\nconst INPUT_SLOTS = 80;\n\n/**\n * How one {@link Splat} is drawn under `WebGPURenderer`.\n *\n * Everything per-splat happens in compute, once per splat per frame:\n *\n * 1. project - skin, lift to world space, project the covariance to a\n * screen-space ellipse, shade; write the result to a work\n * buffer along with a 16-bit depth key.\n * 2. sort - a stable radix sort of the keys ({@link GpuRadixSort}),\n * giving splat indices in back-to-front order.\n *\n * Buffers are interleaved so no stage binds more than seven storage buffers:\n * WebGPU only guarantees eight per stage, and some browsers stop there.\n *\n * The vertex stage then only expands each work-buffer entry into a quad. No\n * per-splat work happens on the CPU, which is what lets this backend carry\n * many animated characters: the WebGL backend re-skins every centre on the\n * main thread each frame just to feed its sort.\n *\n * @internal\n */\nexport class WebGPUSplatImpl implements SplatRenderImpl {\n readonly geometry: InstancedBufferGeometry;\n readonly material: NodeMaterial;\n /** Skinning for the sort happens in compute; the CPU never touches a splat. */\n readonly needsCpuCenters = false;\n\n private readonly _host: Mesh;\n private readonly _splat: Splat;\n private readonly _lighting: WebGPULighting;\n\n private _paletteArray!: Float32Array;\n private _paletteAttribute!: StorageBufferAttribute;\n private _paletteVersion = -1;\n private _boneAttribute: StorageBufferAttribute | null = null;\n private _groupAttribute: StorageBufferAttribute | null = null;\n private readonly _variantMask: number[] = new Array(MAX_VARIANT_GROUPS).fill(1);\n /** [sort reset, project] - everything that depends on the camera or the pose. */\n private _projectNodes: Node[] = [];\n /** The sort proper - needed only when the depth ORDER may have changed. */\n private _sortNodes: Node[] = [];\n\n // What the last compute run saw. Compared field by field each frame so an\n // unchanged splat costs a draw call and nothing else.\n private readonly _lastInputs = new Float64Array(INPUT_SLOTS).fill(NaN);\n private readonly _inputs = new Float64Array(INPUT_SLOTS);\n private readonly _lastSortDirection = new Vector3(NaN, NaN, NaN);\n private _buildId = 0;\n private _sortedBuildId = -1;\n private _allNodes: Node[] | null = null;\n\n // Per-drawable uniforms, refreshed in onBeforeRender.\n private readonly _u = {\n model: uniform(new Matrix4()),\n modelLinear: uniform(new Matrix3()),\n modelRotation: uniform(new Vector4(0, 0, 0, 1)),\n modelScale: uniform(new Vector3(1, 1, 1)),\n view: uniform(new Matrix4()),\n viewRow0: uniform(new Vector3()),\n viewRow1: uniform(new Vector3()),\n viewRow2: uniform(new Vector3()),\n projection: uniform(new Matrix4()),\n viewport: uniform(new Vector2(1, 1)),\n minPixelSize: uniform(0),\n // x: far depth, y: 1 / (far - near), along the view axis.\n sortRange: uniform(new Vector2(1, 1)),\n tint: uniform(new Vector4(1, 1, 1, 0)),\n grade: uniform(new Vector2(1, 1)),\n outputLinear: uniform(0),\n variantMask: uniformArray(this._variantMask, 'float'),\n };\n\n constructor(host: Mesh, splat: Splat, lighting: WebGPULighting) {\n const geometry = new InstancedBufferGeometry();\n geometry.setAttribute(\n 'position',\n new BufferAttribute(new Float32Array([-1, -1, 0, 1, -1, 0, 1, 1, 0, -1, 1, 0]), 3),\n );\n geometry.setIndex([0, 1, 2, 0, 2, 3]);\n geometry.instanceCount = splat.numSplats;\n geometry.boundingSphere = new Sphere();\n\n const material = new NodeMaterial();\n material.name = 'SplatMaterial';\n material.transparent = true;\n material.depthTest = true;\n material.depthWrite = false;\n // The ellipse axes can mirror the quad, so its winding is not fixed.\n material.side = DoubleSide;\n material.forceSinglePass = true;\n material.premultipliedAlpha = true;\n material.fog = false;\n\n this.geometry = geometry;\n this.material = material;\n this._host = host;\n this._splat = splat;\n this._lighting = lighting;\n\n this._build();\n this.syncBounds();\n }\n\n /** The sort runs in the same frame as the draw; the order is never stale. */\n get sortPending(): boolean {\n return false;\n }\n\n /** Force the next frame to re-project and re-sort even if nothing appears to have changed. */\n requestSort(): void {\n this._lastInputs[0] = NaN;\n this._lastSortDirection.set(NaN, NaN, NaN);\n }\n\n syncDefines(): void {\n this._build();\n }\n\n syncBounds(): void {\n this._splat.localBounds.getBoundingSphere(this.geometry.boundingSphere!);\n }\n\n syncBoneData(): void {\n const attribute = this._boneAttribute;\n if (!attribute) return;\n packBoneInfluences(this._splat, attribute.array as Uint32Array);\n attribute.needsUpdate = true;\n this.requestSort();\n }\n\n syncVariantGroups(): void {\n const attribute = this._groupAttribute;\n const ids = this._splat.groupIds;\n if (!attribute || !ids) return;\n (attribute.array as Uint32Array).set(ids);\n attribute.needsUpdate = true;\n this.requestSort();\n }\n\n /**\n * (Re)create the storage buffers, compute nodes and material nodes. Runs at\n * construction, and again when a feature toggle changes the shader or the\n * palette outgrows its buffer.\n */\n private _build(): void {\n const splat = this._splat;\n const count = splat.numSplats;\n const packed = splat.packed;\n const u = this._u;\n const lighting = this._lighting;\n const skinned = !!splat.splatWeights;\n\n // ---- Static inputs: the 32 bytes per splat the WebGL textures hold,\n // interleaved as two uvec4 per splat:\n // [2i] centre.xyz as float bits, rotation.xy as two halfs\n // [2i+1] scale.xy | scale.z, rotation.z | colour.rg | colour.ba (halfs)\n const splatData = new Uint32Array(count * 8);\n const srcA = packed.transformA;\n const srcB = new Uint32Array(packed.transformB.buffer, packed.transformB.byteOffset, count * 2);\n const srcC = new Uint32Array(packed.color.buffer, packed.color.byteOffset, count * 2);\n for (let i = 0; i < count; i++) {\n const o = i * 8;\n splatData[o] = srcA[i * 4];\n splatData[o + 1] = srcA[i * 4 + 1];\n splatData[o + 2] = srcA[i * 4 + 2];\n splatData[o + 3] = srcA[i * 4 + 3];\n splatData[o + 4] = srcB[i * 2];\n splatData[o + 5] = srcB[i * 2 + 1];\n splatData[o + 6] = srcC[i * 2];\n splatData[o + 7] = srcC[i * 2 + 1];\n }\n const splats = storage(new StorageBufferAttribute(splatData, 4), 'uvec4', count * 2).toReadOnly();\n\n // ---- Skinning inputs ----\n this._paletteArray = splat.transformPalette.data;\n this._paletteAttribute = new StorageBufferAttribute(this._paletteArray, 4);\n this._paletteVersion = -1;\n const palette = storage(this._paletteAttribute, 'vec4', this._paletteArray.length / 4).toReadOnly();\n let bones: Node = null;\n this._boneAttribute = null;\n if (skinned) {\n // One uvec4 per splat; each component is palette slot (low 16 bits) and\n // weight as unorm16 (high 16 bits).\n this._boneAttribute = new StorageBufferAttribute(packBoneInfluences(splat, new Uint32Array(count * 4)), 4);\n bones = storage(this._boneAttribute, 'uvec4', count).toReadOnly();\n }\n\n // ---- Variant mask: a group id per splat; visibility per group is a uniform ----\n let groupIds: Node = null;\n this._groupAttribute = null;\n if (splat.variantMaskEnabled && splat.groupIds) {\n if (splat.variantMask && splat.variantMask.length > MAX_VARIANT_GROUPS) {\n throw new Error(\n `WebGPUSplatBackend: ${splat.variantMask.length} variant groups requested, ` +\n `but this backend supports at most ${MAX_VARIANT_GROUPS}`,\n );\n }\n this._groupAttribute = new StorageBufferAttribute(Uint32Array.from(splat.groupIds), 1);\n groupIds = storage(this._groupAttribute, 'uint', count).toReadOnly();\n }\n\n // ---- Work buffer: one projected splat as three vec4 ----\n // [3i] clip-space centre\n // [3i+1] the ellipse's two axes, in clip units\n // [3i+2] rgb, alpha\n const workAttribute = new StorageBufferAttribute(new Float32Array(count * 12), 4);\n const workWrite = storage(workAttribute, 'vec4', count * 3);\n\n const sort = new GpuRadixSort(count);\n\n // One bone's 3x4 transform as three rows. An unwritten slot (all-zero\n // linear part) reads as identity, as does slot 0 by construction.\n const readPaletteRows = (slot: Node): [Node, Node, Node] => {\n const base = slot.mul(3).toVar();\n const r0 = palette.element(base).toVar();\n const r1 = palette.element(base.add(1)).toVar();\n const r2 = palette.element(base.add(2)).toVar();\n const empty = max(\n length(vec3(r0.x, r1.x, r2.x)),\n max(length(vec3(r0.y, r1.y, r2.y)), length(vec3(r0.z, r1.z, r2.z))),\n ).lessThanEqual(1e-4);\n return [\n select(empty, vec4(1, 0, 0, 0), r0),\n select(empty, vec4(0, 1, 0, 0), r1),\n select(empty, vec4(0, 0, 1, 0), r2),\n ];\n };\n\n const quatMul = (a: Node, b: Node): Node => vec4(\n a.w.mul(b.x).add(a.x.mul(b.w)).add(a.y.mul(b.z)).sub(a.z.mul(b.y)),\n a.w.mul(b.y).sub(a.x.mul(b.z)).add(a.y.mul(b.w)).add(a.z.mul(b.x)),\n a.w.mul(b.z).add(a.x.mul(b.y)).sub(a.y.mul(b.x)).add(a.z.mul(b.w)),\n a.w.mul(b.w).sub(a.x.mul(b.x)).sub(a.y.mul(b.y)).sub(a.z.mul(b.z)),\n );\n\n const sRGBToLinear = (c: Node): Node => mix(\n c.mul(0.9478672986).add(0.0521327014).pow(vec3(2.4)),\n c.mul(0.0773993808),\n c.lessThanEqual(vec3(0.04045)),\n );\n\n const projectNode = Fn(() => {\n const tA = splats.element(instanceIndex.mul(2)).toVar();\n const tB = splats.element(instanceIndex.mul(2).add(1)).toVar();\n const modelCenter = uintBitsToFloat(tA.xyz).toVar();\n const rotXY = unpackHalf2x16(tA.w).toVar();\n const scaleXY = unpackHalf2x16(tB.x).toVar();\n const scaleZRotZ = unpackHalf2x16(tB.y).toVar();\n const packedRot = vec3(rotXY.x, rotXY.y, scaleZRotZ.y).toVar();\n // xyzw, with w recovered: quaternions are stored on the w >= 0 hemisphere.\n const srcRotation = vec4(packedRot, sqrt(max(float(0), float(1).sub(dot(packedRot, packedRot))))).toVar();\n const srcScale = vec3(scaleXY.x, scaleXY.y, scaleZRotZ.x).toVar();\n\n // ---- Skin: blend up to four bone transforms, row by row ----\n const row0 = vec4(1, 0, 0, 0).toVar();\n const row1 = vec4(0, 1, 0, 0).toVar();\n const row2 = vec4(0, 0, 1, 0).toVar();\n if (skinned) {\n const influences = bones.element(instanceIndex).toVar();\n const idx = influences.bitAnd(uvec4(0xffff)).toVar();\n const weights = vec4(influences.shiftRight(uvec4(16))).div(65535).toVar();\n const total = weights.x.add(weights.y).add(weights.z).add(weights.w).toVar();\n If(total.greaterThan(0.001), () => {\n const b0 = vec4(0).toVar();\n const b1 = vec4(0).toVar();\n const b2 = vec4(0).toVar();\n for (const k of ['x', 'y', 'z', 'w']) {\n If(weights[k].greaterThan(0.001), () => {\n const [p0, p1, p2] = readPaletteRows(idx[k]);\n b0.addAssign(p0.mul(weights[k]));\n b1.addAssign(p1.mul(weights[k]));\n b2.addAssign(p2.mul(weights[k]));\n });\n }\n const inv = float(1).div(total);\n b0.mulAssign(inv);\n b1.mulAssign(inv);\n b2.mulAssign(inv);\n // Keep the blend unless EVERY column collapsed. Linear-blend skinning\n // of two very different rotations leaves one short column; that is\n // still a valid mid-rotation transform.\n const reasonable = max(\n length(vec3(b0.x, b1.x, b2.x)),\n max(length(vec3(b0.y, b1.y, b2.y)), length(vec3(b0.z, b1.z, b2.z))),\n ).greaterThan(1e-4);\n If(reasonable, () => {\n row0.assign(b0);\n row1.assign(b1);\n row2.assign(b2);\n });\n });\n }\n\n const center4 = vec4(modelCenter, 1).toVar();\n const modelDeformed = vec3(dot(row0, center4), dot(row1, center4), dot(row2, center4)).toVar();\n const worldCenter = u.model.mul(vec4(modelDeformed, 1)).xyz.toVar();\n\n const worldRotation = quatMul(u.modelRotation, srcRotation).toVar();\n If(worldRotation.w.lessThan(0), () => { worldRotation.assign(worldRotation.negate()); });\n const worldScale = u.modelScale.mul(srcScale).toVar();\n\n if (skinned) {\n // The full world-space skinning rotation comes from model * palette;\n // the palette's own scale is deliberately dropped (rigid skinning).\n const c0 = u.modelLinear.mul(vec3(row0.x, row1.x, row2.x)).toVar();\n const c1 = u.modelLinear.mul(vec3(row0.y, row1.y, row2.y)).toVar();\n const c2 = u.modelLinear.mul(vec3(row0.z, row1.z, row2.z)).toVar();\n const s = vec3(length(c0), length(c1), length(c2)).toVar();\n If(s.x.greaterThan(1e-5).and(s.y.greaterThan(1e-5)).and(s.z.greaterThan(1e-5)), () => {\n const x = c0.div(s.x).toVar();\n const y = c1.div(s.y).toVar();\n const z = c2.div(s.z).toVar();\n // Rotation matrix (columns x, y, z) to quaternion.\n const q = vec4(0, 0, 0, 1).toVar();\n const trace = x.x.add(y.y).add(z.z).toVar();\n If(trace.greaterThan(0), () => {\n const k = sqrt(trace.add(1)).mul(2).toVar();\n q.assign(vec4(y.z.sub(z.y).div(k), z.x.sub(x.z).div(k), x.y.sub(y.x).div(k), k.mul(0.25)));\n }).ElseIf(x.x.greaterThan(y.y).and(x.x.greaterThan(z.z)), () => {\n const k = sqrt(float(1).add(x.x).sub(y.y).sub(z.z)).mul(2).toVar();\n q.assign(vec4(k.mul(0.25), y.x.add(x.y).div(k), z.x.add(x.z).div(k), y.z.sub(z.y).div(k)));\n }).ElseIf(y.y.greaterThan(z.z), () => {\n const k = sqrt(float(1).add(y.y).sub(x.x).sub(z.z)).mul(2).toVar();\n q.assign(vec4(y.x.add(x.y).div(k), k.mul(0.25), z.y.add(y.z).div(k), z.x.sub(x.z).div(k)));\n }).Else(() => {\n const k = sqrt(float(1).add(z.z).sub(x.x).sub(y.y)).mul(2).toVar();\n q.assign(vec4(z.x.add(x.z).div(k), z.y.add(y.z).div(k), k.mul(0.25), x.y.sub(y.x).div(k)));\n });\n const composed = normalize(quatMul(q, srcRotation)).toVar();\n If(composed.w.lessThan(0), () => { composed.assign(composed.negate()); });\n worldRotation.assign(composed);\n });\n if (splat.nonRigidCovariance) {\n // Bone-length scaling: the palette keeps its per-axis scale and the\n // gaussian stretches with the bone.\n worldScale.mulAssign(s);\n }\n }\n\n // ---- Project the centre ----\n const ortho = u.projection.element(3).w.equal(1);\n const centerView = u.view.mul(vec4(worldCenter, 1)).toVar();\n const centerProj = u.projection.mul(centerView).toVar();\n centerProj.z.assign(clamp(centerProj.z, float(0), centerProj.w.abs()));\n\n // ---- Project the covariance: Sigma = sum_k m_k m_k^T, m_k = scale_k * R[k] ----\n const qx = worldRotation.x, qy = worldRotation.y, qz = worldRotation.z, qw = worldRotation.w;\n const m0 = vec3(\n float(1).sub(qy.mul(qy).add(qz.mul(qz)).mul(2)),\n qx.mul(qy).add(qw.mul(qz)).mul(2),\n qx.mul(qz).sub(qw.mul(qy)).mul(2),\n ).mul(worldScale.x).toVar();\n const m1 = vec3(\n qx.mul(qy).sub(qw.mul(qz)).mul(2),\n float(1).sub(qx.mul(qx).add(qz.mul(qz)).mul(2)),\n qy.mul(qz).add(qw.mul(qx)).mul(2),\n ).mul(worldScale.y).toVar();\n const m2 = vec3(\n qx.mul(qz).add(qw.mul(qy)).mul(2),\n qy.mul(qz).sub(qw.mul(qx)).mul(2),\n float(1).sub(qx.mul(qx).add(qy.mul(qy)).mul(2)),\n ).mul(worldScale.z).toVar();\n\n const focal = u.viewport.x.mul(u.projection.element(0).x).toVar();\n const vp = select(ortho, vec3(0, 0, 1), centerView.xyz).toVar();\n const J1 = focal.div(vp.z).toVar();\n const J2 = vp.xy.mul(J1.negate().div(vp.z)).toVar();\n // Columns of T = W * J, with W the transposed view rotation.\n const t0 = u.viewRow0.mul(J1).add(u.viewRow2.mul(J2.x)).toVar();\n const t1 = u.viewRow1.mul(J1).add(u.viewRow2.mul(J2.y)).toVar();\n const a = vec3(dot(t0, m0), dot(t0, m1), dot(t0, m2)).toVar();\n const b = vec3(dot(t1, m0), dot(t1, m1), dot(t1, m2)).toVar();\n const cov00 = dot(a, a).toVar();\n const cov01 = dot(a, b).toVar();\n const cov11 = dot(b, b).toVar();\n\n const diagonal1 = cov00.add(0.3).toVar();\n const diagonal2 = cov11.add(0.3).toVar();\n const mid = diagonal1.add(diagonal2).mul(0.5).toVar();\n const radius = length(vec2(diagonal1.sub(diagonal2).mul(0.5), cov01)).toVar();\n const lambda1 = mid.add(radius).toVar();\n const lambda2 = max(mid.sub(radius), 0.1).toVar();\n const vmin = min(float(1024), min(u.viewport.x, u.viewport.y)).toVar();\n const l1 = min(sqrt(lambda1.mul(2)), vmin).mul(2).toVar();\n const l2 = min(sqrt(lambda2.mul(2)), vmin).mul(2).toVar();\n const lmax = max(l1, l2).toVar();\n\n const c = vec2(centerProj.w).div(u.viewport).toVar();\n const diagonalVector = normalize(vec2(cov01, lambda1.sub(diagonal1))).toVar();\n const v1 = diagonalVector.mul(l1).mul(c).toVar();\n const v2 = vec2(diagonalVector.y, diagonalVector.x.negate()).mul(l2).mul(c).toVar();\n\n // ---- Colour ----\n const colorRG = unpackHalf2x16(tB.z).toVar();\n const colorBA = unpackHalf2x16(tB.w).toVar();\n const rgb = vec3(colorRG.x, colorRG.y, colorBA.x).toVar();\n const alpha = colorBA.y.toVar();\n if (splat.antiAlias) {\n const detOrig = cov00.mul(cov11).sub(cov01.mul(cov01));\n const detBlur = diagonal1.mul(diagonal2).sub(cov01.mul(cov01));\n alpha.mulAssign(sqrt(max(detOrig.div(detBlur), 0)));\n }\n\n rgb.mulAssign(lighting.litFactor(worldCenter));\n rgb.assign(mix(rgb, u.tint.xyz, clamp(u.tint.w, 0, 1)));\n // Identity grade is a true no-op: skipping it keeps HDR splat colours unclamped.\n If(u.grade.x.notEqual(1).or(u.grade.y.notEqual(1)), () => {\n const graded = rgb.sub(0.5).mul(u.grade.x).add(0.5).toVar();\n const luma = dot(graded, vec3(0.2126, 0.7152, 0.0722));\n rgb.assign(clamp(mix(vec3(luma), graded, u.grade.y), 0, 1));\n });\n rgb.assign(max(rgb, vec3(0)));\n If(u.outputLinear.greaterThan(0.5), () => { rgb.assign(sRGBToLinear(rgb)); });\n\n // ---- Cull ----\n const behind = ortho.not().and(centerView.z.greaterThan(0));\n const tooSmall = lmax.lessThan(u.minPixelSize);\n const offscreen = centerProj.x.abs().sub(lmax.mul(c.x)).greaterThan(centerProj.w)\n .or(centerProj.y.abs().sub(lmax.mul(c.y)).greaterThan(centerProj.w));\n const transparent = alpha.mul(255).lessThanEqual(1);\n const culled = behind.or(tooSmall).or(offscreen).or(transparent).toVar();\n if (groupIds) {\n const hidden = u.variantMask.element(groupIds.element(instanceIndex)).lessThan(0.5);\n culled.assign(culled.or(hidden));\n }\n\n const slot = instanceIndex.mul(3).toVar();\n workWrite.element(slot).assign(select(culled, vec4(0, 0, 2, 1), centerProj));\n workWrite.element(slot.add(1)).assign(select(culled, vec4(0), vec4(v1, v2)));\n workWrite.element(slot.add(2)).assign(vec4(rgb, select(culled, float(0), alpha)));\n\n // ---- Depth key: far splats first ----\n // Keyed on depth alone, culled or not. A static splat keeps its order\n // while the camera only translates, and a splat that was off-screen at\n // the last sort must already be in its right place when it slides in.\n const depth = centerView.z.negate();\n const normalized = clamp(u.sortRange.x.sub(depth).mul(u.sortRange.y), 0, 1);\n const key = uint(normalized.mul(SORT_BINS - 1)).toVar();\n sort.keysWrite.element(instanceIndex).assign(key);\n sort.countFirstDigit(instanceIndex, key);\n })().compute(count, [WORKGROUP_SIZE]).setName('SplatProject');\n\n this._projectNodes = [sort.resetNode, projectNode];\n this._sortNodes = sort.sortNodes;\n this._allNodes = null;\n this._buildId++;\n\n // ---- Draw: expand each work-buffer entry into a quad ----\n const workRead = storage(workAttribute, 'vec4', count * 3).toReadOnly();\n const orderRead = sort.orderRead;\n\n const gaussianUV = varyingProperty('vec2', 'vGaussianUV');\n const gaussianColor = varyingProperty('vec4', 'vGaussianColor');\n\n const material = this.material;\n material.vertexNode = Fn(() => {\n const slot = orderRead.element(instanceIndex).mul(3).toVar();\n const centerProj = workRead.element(slot).toVar();\n const axes = workRead.element(slot.add(1)).toVar();\n const shade = workRead.element(slot.add(2)).toVar();\n\n // Shrink the quad to where the gaussian is still above 1/255: fewer\n // fragments, identical pixels. Culled splats carry alpha 0.\n const clip = min(float(1), sqrt(log(max(shade.w.mul(255), 1))).mul(0.5)).toVar();\n const corner = positionGeometry.xy.toVar();\n const offset = axes.xy.mul(corner.x).add(axes.zw.mul(corner.y)).mul(clip);\n\n gaussianUV.assign(corner.mul(clip));\n gaussianColor.assign(shade);\n return centerProj.add(vec4(offset, 0, 0));\n })();\n\n material.colorNode = Fn(() => {\n const A = dot(gaussianUV, gaussianUV).toVar();\n If(A.greaterThan(1), () => { Discard(); });\n // exp(-4x) rescaled to hit exactly 0 at the quad edge.\n const alpha = exp(A.mul(-4)).sub(EXP4).mul(INV_EXP4).mul(gaussianColor.w).toVar();\n If(alpha.lessThan(1 / 255), () => { Discard(); });\n return vec4(gaussianColor.xyz, alpha);\n })();\n material.needsUpdate = true;\n }\n\n beforeRender(renderer: any, camera: Camera): void {\n const splat = this._splat;\n const u = this._u;\n\n // The palette is the one buffer the CPU writes every frame.\n const palette = splat.transformPalette;\n if (palette.data !== this._paletteArray) {\n this._build();\n }\n if (palette.version !== this._paletteVersion) {\n this._paletteVersion = palette.version;\n this._paletteAttribute.needsUpdate = true;\n }\n\n // Size, in pixels, of what is being drawn into.\n const target = renderer.getRenderTarget();\n if (target) {\n u.viewport.value.set(target.viewport.z, target.viewport.w);\n } else {\n renderer.getViewport(_viewport);\n const pixelRatio = renderer.getPixelRatio();\n u.viewport.value.set(Math.floor(_viewport.z * pixelRatio), Math.floor(_viewport.w * pixelRatio));\n }\n\n // Splat colours are display-referred. They are decoded whenever the\n // renderer will encode them again on the way out; only a renderer set to\n // write its working space straight to the canvas passes them through.\n const linear = target ? target.texture.colorSpace !== SRGBColorSpace : renderer.needsFrameBufferTarget === true;\n u.outputLinear.value = linear ? 1 : 0;\n\n const world = this._host.matrixWorld;\n u.model.value.copy(world);\n u.modelLinear.value.setFromMatrix4(world);\n world.decompose(_position, _quaternion, _scale);\n u.modelRotation.value.set(_quaternion.x, _quaternion.y, _quaternion.z, _quaternion.w);\n u.modelScale.value.copy(_scale);\n\n const view = camera.matrixWorldInverse;\n const ve = view.elements;\n u.view.value.copy(view);\n u.viewRow0.value.set(ve[0], ve[4], ve[8]);\n u.viewRow1.value.set(ve[1], ve[5], ve[9]);\n u.viewRow2.value.set(ve[2], ve[6], ve[10]);\n u.projection.value.copy(camera.projectionMatrix);\n\n u.minPixelSize.value = splat.minPixelSize;\n u.tint.value.copy(splat.tint);\n u.grade.value.copy(splat.grade);\n const mask = splat.variantMask;\n if (mask) for (let i = 0; i < mask.length; i++) this._variantMask[i] = mask[i];\n\n // Depth range to bucket over: the bounding sphere's extent along the view axis.\n _sphere.copy(this.geometry.boundingSphere!).applyMatrix4(world);\n _viewCenter.copy(_sphere.center).applyMatrix4(view);\n const centerDepth = -_viewCenter.z;\n const far = centerDepth + _sphere.radius;\n const near = centerDepth - _sphere.radius;\n u.sortRange.value.set(far, 1 / Math.max(far - near, 1e-6));\n\n const lightingVersion = this._lighting.sync();\n\n // ---- Decide how much of the compute work this frame actually needs ----\n const inputs = this._inputs;\n let n = 0;\n inputs.set(world.elements, n); n += 16;\n inputs.set(ve, n); n += 16;\n inputs.set(camera.projectionMatrix.elements, n); n += 16;\n inputs[n++] = u.viewport.value.x;\n inputs[n++] = u.viewport.value.y;\n inputs[n++] = u.outputLinear.value;\n inputs[n++] = splat.minPixelSize;\n inputs[n++] = splat.tint.x; inputs[n++] = splat.tint.y; inputs[n++] = splat.tint.z; inputs[n++] = splat.tint.w;\n inputs[n++] = splat.grade.x; inputs[n++] = splat.grade.y;\n inputs[n++] = far; inputs[n++] = near;\n inputs[n++] = lightingVersion;\n inputs[n++] = palette.version;\n inputs[n++] = this._buildId;\n inputs[n++] = splat.variantMaskVersion;\n\n const last = this._lastInputs;\n let changed = false;\n for (let i = 0; i < n; i++) {\n if (inputs[i] !== last[i]) { changed = true; break; }\n }\n if (!changed) return;\n last.set(inputs);\n\n // The order only depends on the pose and on the view direction in the\n // splat's own space: depth along it differs from view depth by a constant.\n // A static splat under a translating camera keeps last frame's order.\n const me = world.elements;\n const fx = -ve[2], fy = -ve[6], fz = -ve[10];\n _direction.set(\n me[0] * fx + me[1] * fy + me[2] * fz,\n me[4] * fx + me[5] * fy + me[6] * fz,\n me[8] * fx + me[9] * fy + me[10] * fz,\n );\n const orderMayChange = !!splat.splatWeights || !_direction.equals(this._lastSortDirection) || this._sortedBuildId !== this._buildId;\n if (orderMayChange) {\n this._lastSortDirection.copy(_direction);\n this._sortedBuildId = this._buildId;\n renderer.compute(this._allNodes ??= [...this._projectNodes, ...this._sortNodes]);\n } else {\n renderer.compute(this._projectNodes);\n }\n }\n\n dispose(): void {\n this.geometry.dispose();\n this.material.dispose();\n for (const node of [...this._projectNodes, ...this._sortNodes]) node.dispose?.();\n }\n}\n\n/**\n * Pack each splat's four influences into one uvec4: palette slot in the low\n * 16 bits of each component, weight as unorm16 in the high 16. Bundle weights\n * are stored as bytes, so sixteen bits round-trips them exactly.\n */\nfunction packBoneInfluences(splat: Splat, out: Uint32Array): Uint32Array {\n const slots = splat.boneIndicesData!;\n const weights = splat.boneWeightsData!;\n const n = splat.numSplats * 4;\n for (let i = 0; i < n; i++) {\n const w = Math.max(0, Math.min(65535, Math.round(weights[i] * 65535)));\n out[i] = ((slots[i] & 0xffff) | (w << 16)) >>> 0;\n }\n return out;\n}\n", "/* eslint-disable @typescript-eslint/no-explicit-any */\nimport * as TSL from 'three/tsl';\nimport { StorageBufferAttribute } from 'three/webgpu';\n\n// See splat-mesh.ts for why the TSL node graph is untyped here.\ntype Node = any;\nconst { Fn, If, Loop, atomicAdd, atomicStore, instanceIndex, storage, uint } = TSL as any;\n\n/** Sort keys are 16 bits, sorted as two 8-bit digits. */\nexport const SORT_KEY_BITS = 16;\nconst RADIX = 256;\n/** Elements per block. One invocation scatters one block, serially, which is what keeps the sort stable. */\nconst BLOCK = 256;\n\n/**\n * A stable least-significant-digit radix sort over 16-bit keys, in compute.\n *\n * Stability is the point. The obvious GPU counting sort - histogram, prefix\n * sum, then every element claiming its slot with an atomic add - leaves the\n * order inside a bucket to whichever thread wins the race, and that changes\n * from frame to frame. For splats sharing a depth bucket (a surface seen\n * face-on is full of them) the result is visible shimmer on a perfectly still\n * frame. Here ties always resolve in element-index order, exactly as a CPU\n * counting sort does, so a still frame is bit-stable.\n *\n * Each digit takes three steps:\n *\n * histogram count digits per block of {@link BLOCK} consecutive elements\n * (atomic adds; counts do not depend on thread order).\n * prefix for each digit, in parallel, walk the blocks turning counts\n * into starting offsets; then one thread turns the 256 digit\n * totals into digit bases.\n * scatter one invocation per block walks its elements in order, placing\n * each at its digit's running offset.\n *\n * The first digit's histogram is folded into the caller's own per-element\n * pass through {@link GpuRadixSort.countFirstDigit}, saving a dispatch.\n */\nexport class GpuRadixSort {\n readonly count: number;\n\n /** Write each element's key here (`uint`, low 16 bits significant) before {@link GpuRadixSort.sortNodes} run. */\n readonly keysWrite: Node;\n /** Element indices in ascending key order, valid after {@link GpuRadixSort.sortNodes} have run. */\n readonly orderRead: Node;\n /** Run before the pass that writes keys: clears both digit histograms. */\n readonly resetNode: Node;\n /** Run, in order, after the pass that writes keys. */\n readonly sortNodes: Node[];\n\n private readonly _firstHistogram: Node;\n\n constructor(count: number) {\n this.count = count;\n const blocks = Math.max(1, Math.ceil(count / BLOCK));\n const histogramSize = blocks * RADIX;\n\n const keysAttribute = new StorageBufferAttribute(new Uint32Array(count), 1);\n // Per block, per digit: a count after the histogram step, an offset within\n // the digit after the prefix step, a write cursor during the scatter.\n const histogramAttributes = [\n new StorageBufferAttribute(new Uint32Array(histogramSize), 1),\n new StorageBufferAttribute(new Uint32Array(histogramSize), 1),\n ];\n // Per digit: total, then base.\n const digitAttribute = new StorageBufferAttribute(new Uint32Array(RADIX), 1);\n const halfSortedAttribute = new StorageBufferAttribute(new Uint32Array(count), 1);\n const orderAttribute = new StorageBufferAttribute(new Uint32Array(count), 1);\n\n this.keysWrite = storage(keysAttribute, 'uint', count);\n const keys = storage(keysAttribute, 'uint', count).toReadOnly();\n this.orderRead = storage(orderAttribute, 'uint', count).toReadOnly();\n this._firstHistogram = storage(histogramAttributes[0], 'uint', histogramSize).toAtomic();\n const secondHistogramAtomic = storage(histogramAttributes[1], 'uint', histogramSize).toAtomic();\n const digits = storage(digitAttribute, 'uint', RADIX);\n const halfSortedWrite = storage(halfSortedAttribute, 'uint', count);\n const halfSorted = storage(halfSortedAttribute, 'uint', count).toReadOnly();\n const orderWrite = storage(orderAttribute, 'uint', count);\n\n this.resetNode = Fn(() => {\n atomicStore(this._firstHistogram.element(instanceIndex), uint(0));\n atomicStore(secondHistogramAtomic.element(instanceIndex), uint(0));\n })().compute(histogramSize, [256]).setName('SplatSortReset');\n\n // Counts -> offsets within each digit, one invocation per digit.\n const prefixBlocks = (pass: number): Node => {\n const histogram = storage(histogramAttributes[pass], 'uint', histogramSize);\n return Fn(() => {\n const sum = uint(0).toVar();\n Loop({ start: 0, end: blocks, type: 'uint', name: 'b', condition: '<' }, ({ b }: { b: Node }) => {\n const slot = b.mul(RADIX).add(instanceIndex).toVar();\n const n = histogram.element(slot).toVar();\n histogram.element(slot).assign(sum);\n sum.addAssign(n);\n });\n digits.element(instanceIndex).assign(sum);\n })().compute(RADIX, [64]).setName(`SplatSortPrefixBlocks${pass}`);\n };\n\n // Digit totals -> digit bases, in place, on one thread.\n const prefixDigits = (pass: number): Node => Fn(() => {\n const sum = uint(0).toVar();\n Loop({ start: 0, end: RADIX, type: 'uint', name: 'd', condition: '<' }, ({ d }: { d: Node }) => {\n const n = digits.element(d).toVar();\n digits.element(d).assign(sum);\n sum.addAssign(n);\n });\n })().compute(1).setName(`SplatSortPrefixDigits${pass}`);\n\n // One invocation per block, walking its elements in order.\n const scatter = (pass: number, input: Node | null, output: Node): Node => {\n const histogram = storage(histogramAttributes[pass], 'uint', histogramSize);\n const digitBases = storage(digitAttribute, 'uint', RADIX).toReadOnly();\n return Fn(() => {\n const first = instanceIndex.mul(BLOCK).toVar();\n Loop({ start: 0, end: BLOCK, type: 'uint', name: 'j', condition: '<' }, ({ j }: { j: Node }) => {\n const position = first.add(j).toVar();\n If(position.lessThan(uint(count)), () => {\n const element = (input ? input.element(position) : position).toVar();\n const key = keys.element(element).toVar();\n const digit = (pass === 0 ? key.bitAnd(uint(RADIX - 1)) : key.shiftRight(uint(8)).bitAnd(uint(RADIX - 1))).toVar();\n const slot = instanceIndex.mul(RADIX).add(digit).toVar();\n const within = histogram.element(slot).toVar();\n histogram.element(slot).assign(within.add(1));\n output.element(digitBases.element(digit).add(within)).assign(element);\n });\n });\n })().compute(blocks, [64]).setName(`SplatSortScatter${pass}`);\n };\n\n // The second digit is counted over the half-sorted order.\n const secondHistogramNode = Fn(() => {\n const element = halfSorted.element(instanceIndex).toVar();\n const digit = keys.element(element).shiftRight(uint(8)).bitAnd(uint(RADIX - 1)).toVar();\n const block = instanceIndex.div(uint(BLOCK));\n atomicAdd(secondHistogramAtomic.element(block.mul(RADIX).add(digit)), uint(1));\n })().compute(count, [256]).setName('SplatSortHistogram1');\n\n this.sortNodes = [\n prefixBlocks(0),\n prefixDigits(0),\n scatter(0, null, halfSortedWrite),\n secondHistogramNode,\n prefixBlocks(1),\n prefixDigits(1),\n scatter(1, halfSorted, orderWrite),\n ];\n }\n\n /**\n * Count `key`'s low digit for the element at `index`. Call from inside the\n * compute pass that writes the keys.\n */\n countFirstDigit(index: Node, key: Node): void {\n const block = index.div(uint(BLOCK));\n const digit = key.bitAnd(uint(RADIX - 1));\n atomicAdd(this._firstHistogram.element(block.mul(RADIX).add(digit)), uint(1));\n }\n}\n", "import type { SplatEngine } from '../../engine';\nimport type { Mesh } from 'three/webgpu';\n\nimport type { SplatBackend, SplatRenderImpl } from '../backend';\nimport type { Splat } from '../splat';\n\nimport { WebGPULighting } from './lighting';\nimport { WebGPUSplatImpl } from './splat-mesh';\n\n/**\n * Splat rendering for `WebGPURenderer` (`three/webgpu`), running on WebGPU.\n *\n * Skinning, projection and the depth sort all run in compute shaders, so the\n * CPU does no per-splat work: adding an animated character costs a pose\n * evaluation and a palette upload, not a pass over its splats.\n *\n * Importing `@viggle/splat-engine-three/webgpu` registers this backend, and\n * splats then use it whenever a `WebGPURenderer` draws them; there is nothing\n * to construct or pass.\n *\n * Requires the renderer's WebGPU backend. `WebGPURenderer`'s WebGL2 fallback\n * (`forceWebGL`, or a browser without WebGPU) has no compute shaders; use\n * `THREE.WebGLRenderer` there instead.\n *\n * @group Engine\n */\nexport class WebGPUSplatBackend implements SplatBackend {\n private readonly _lighting = new WeakMap<SplatEngine, WebGPULighting>();\n\n createImpl(host: Mesh, splat: Splat, engine: SplatEngine): SplatRenderImpl {\n let lighting = this._lighting.get(engine);\n if (!lighting) {\n lighting = new WebGPULighting(engine);\n this._lighting.set(engine, lighting);\n }\n return new WebGPUSplatImpl(host, splat, lighting);\n }\n}\n", "// The entry point for applications that render with `WebGPURenderer`.\n//\n// It is the default entry point plus the WebGPU backend, in the way\n// `three/webgpu` is `three` plus the WebGPU renderer: import everything from\n// here and splats draw under either renderer. Applications on\n// `THREE.WebGLRenderer` use the default entry point and never load\n// `three/webgpu` or `three/tsl`.\nimport { registerWebGPUBackend } from './splat/splat-mesh';\nimport { WebGPUSplatBackend } from './splat/webgpu/backend';\n\nregisterWebGPUBackend(new WebGPUSplatBackend());\n\nexport * from './index';\nexport { WebGPUSplatBackend };\nexport { MAX_POINT_LIGHTS } from './splat/webgpu/lighting';\nexport { MAX_VARIANT_GROUPS } from './splat/webgpu/splat-mesh';\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["TSL", "StorageBufferAttribute", "Vector4", "TSL", "Fn", "If", "Loop", "Fn", "If", "Loop", "float", "instanceIndex", "length", "storage", "uint", "uniform", "uniformArray", "TSL", "Vector4", "StorageBufferAttribute"]
|
|
7
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,48 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@viggle/splat-engine-three",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Gaussian-splat character engine for three.js: load .vsplat character bundles, skin them to a rig, play skeletal animation. A three.js port of @viggle/splat-engine with no PlayCanvas dependency.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"module": "./dist/index.js",
|
|
8
|
+
"types": "./dist/types/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/types/index.d.ts",
|
|
12
|
+
"default": "./dist/index.js"
|
|
13
|
+
},
|
|
14
|
+
"./webgpu": {
|
|
15
|
+
"types": "./dist/types/webgpu.d.ts",
|
|
16
|
+
"default": "./dist/webgpu.js"
|
|
17
|
+
},
|
|
18
|
+
"./package.json": "./package.json"
|
|
19
|
+
},
|
|
20
|
+
"files": [
|
|
21
|
+
"dist",
|
|
22
|
+
"README.md",
|
|
23
|
+
"LICENSE"
|
|
24
|
+
],
|
|
25
|
+
"license": "MIT",
|
|
26
|
+
"scripts": {
|
|
27
|
+
"build": "rm -rf dist && node build.mjs && tsc -p tsconfig.json",
|
|
28
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
29
|
+
"ab": "node ab/run-ab.mjs",
|
|
30
|
+
"bench": "node bench/run-bench.mjs"
|
|
31
|
+
},
|
|
32
|
+
"peerDependencies": {
|
|
33
|
+
"three": ">=0.186.0"
|
|
34
|
+
},
|
|
35
|
+
"devDependencies": {
|
|
36
|
+
"@types/three": "^0.186.0",
|
|
37
|
+
"@viggle/splat-engine": "^0.1.1",
|
|
38
|
+
"esbuild": "^0.25.12",
|
|
39
|
+
"playcanvas": "^2.18.0",
|
|
40
|
+
"playwright": "^1.64.0",
|
|
41
|
+
"pngjs": "^7.0.0",
|
|
42
|
+
"three": "^0.186.1",
|
|
43
|
+
"typescript": "^5.9.3"
|
|
44
|
+
},
|
|
45
|
+
"sideEffects": [
|
|
46
|
+
"./dist/webgpu.js"
|
|
47
|
+
]
|
|
48
|
+
}
|