@sparkjsdev/spark 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.
Files changed (60) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +212 -0
  3. package/dist/assets/worker-DQiiPuma.js.map +1 -0
  4. package/dist/assets/worker-DnqMl73p.js.map +1 -0
  5. package/dist/spark.cjs.js +12696 -0
  6. package/dist/spark.cjs.js.map +1 -0
  7. package/dist/spark.cjs.min.js +1086 -0
  8. package/dist/spark.cjs.min.js.map +1 -0
  9. package/dist/spark.module.js +12679 -0
  10. package/dist/spark.module.js.map +1 -0
  11. package/dist/spark.module.min.js +10048 -0
  12. package/dist/spark.module.min.js.map +1 -0
  13. package/dist/types/ForgeRenderer.d.ts +136 -0
  14. package/dist/types/ForgeViewpoint.d.ts +83 -0
  15. package/dist/types/PackedSplats.d.ts +87 -0
  16. package/dist/types/Readback.d.ts +50 -0
  17. package/dist/types/RgbaArray.d.ts +44 -0
  18. package/dist/types/SplatAccumulator.d.ts +27 -0
  19. package/dist/types/SplatEdit.d.ts +94 -0
  20. package/dist/types/SplatGenerator.d.ts +61 -0
  21. package/dist/types/SplatGeometry.d.ts +7 -0
  22. package/dist/types/SplatLoader.d.ts +80 -0
  23. package/dist/types/SplatMesh.d.ts +85 -0
  24. package/dist/types/SplatSkinning.d.ts +29 -0
  25. package/dist/types/antisplat.d.ts +5 -0
  26. package/dist/types/controls.d.ts +114 -0
  27. package/dist/types/defines.d.ts +17 -0
  28. package/dist/types/dyno/base.d.ts +174 -0
  29. package/dist/types/dyno/control.d.ts +6 -0
  30. package/dist/types/dyno/convert.d.ts +190 -0
  31. package/dist/types/dyno/logic.d.ts +103 -0
  32. package/dist/types/dyno/math.d.ts +214 -0
  33. package/dist/types/dyno/mathTypes.d.ts +47 -0
  34. package/dist/types/dyno/output.d.ts +25 -0
  35. package/dist/types/dyno/program.d.ts +30 -0
  36. package/dist/types/dyno/splats.d.ts +156 -0
  37. package/dist/types/dyno/texture.d.ts +50 -0
  38. package/dist/types/dyno/transform.d.ts +59 -0
  39. package/dist/types/dyno/trig.d.ts +94 -0
  40. package/dist/types/dyno/types.d.ts +62 -0
  41. package/dist/types/dyno/uniforms.d.ts +374 -0
  42. package/dist/types/dyno/util.d.ts +139 -0
  43. package/dist/types/dyno/value.d.ts +32 -0
  44. package/dist/types/dyno/vecmat.d.ts +226 -0
  45. package/dist/types/dyno.d.ts +16 -0
  46. package/dist/types/generators/snow.d.ts +65 -0
  47. package/dist/types/generators/static.d.ts +9 -0
  48. package/dist/types/generators.d.ts +2 -0
  49. package/dist/types/hands.d.ts +95 -0
  50. package/dist/types/index.d.ts +20 -0
  51. package/dist/types/ksplat.d.ts +6 -0
  52. package/dist/types/ply.d.ts +31 -0
  53. package/dist/types/shaders.d.ts +1 -0
  54. package/dist/types/splatConstructors.d.ts +46 -0
  55. package/dist/types/splatWorker.d.ts +20 -0
  56. package/dist/types/spz.d.ts +50 -0
  57. package/dist/types/utils.d.ts +150 -0
  58. package/dist/types/vrButton.d.ts +6 -0
  59. package/dist/types/worker.d.ts +1 -0
  60. package/package.json +63 -0
@@ -0,0 +1,46 @@
1
+ import { PackedSplats } from './PackedSplats';
2
+ import { SplatMesh } from './SplatMesh';
3
+ import * as THREE from "three";
4
+ export declare function constructGrid({ splats, extents, stepSize, pointRadius, pointShadowScale, opacity, color, }: {
5
+ splats: PackedSplats;
6
+ extents: THREE.Box3;
7
+ stepSize?: number;
8
+ pointRadius?: number;
9
+ pointShadowScale?: number;
10
+ opacity?: number;
11
+ color?: THREE.Color | ((color: THREE.Color, point: THREE.Vector3) => void);
12
+ }): void;
13
+ export declare function constructAxes({ splats, scale, axisRadius, axisShadowScale, origins, }: {
14
+ splats: PackedSplats;
15
+ scale?: number;
16
+ axisRadius?: number;
17
+ axisShadowScale?: number;
18
+ origins?: THREE.Vector3[];
19
+ }): void;
20
+ export declare function constructSpherePoints({ splats, origin, radius, maxDepth, filter, pointRadius, pointThickness, color, }: {
21
+ splats: PackedSplats;
22
+ origin?: THREE.Vector3;
23
+ radius?: number;
24
+ maxDepth?: number;
25
+ filter?: ((point: THREE.Vector3) => boolean) | null;
26
+ pointRadius?: number;
27
+ pointThickness?: number;
28
+ color?: THREE.Color | ((color: THREE.Color, point: THREE.Vector3) => void);
29
+ }): void;
30
+ export declare function textSplats({ text, font, fontSize, color, rgb, dotRadius, textAlign, lineHeight, objectScale, }: {
31
+ text: string;
32
+ font?: string;
33
+ fontSize?: number;
34
+ color?: THREE.Color;
35
+ rgb?: THREE.Color;
36
+ dotRadius?: number;
37
+ textAlign?: "left" | "center" | "right" | "start" | "end";
38
+ lineHeight?: number;
39
+ objectScale?: number;
40
+ }): SplatMesh;
41
+ export declare function imageSplats({ url, dotRadius, subXY, forEachSplat, }: {
42
+ url: string;
43
+ dotRadius?: number;
44
+ subXY?: number;
45
+ forEachSplat?: (width: number, height: number, index: number, center: THREE.Vector3, scales: THREE.Vector3, quaternion: THREE.Quaternion, opacity: number, color: THREE.Color) => number | null;
46
+ }): SplatMesh;
@@ -0,0 +1,20 @@
1
+ export declare class SplatWorker {
2
+ worker: Worker;
3
+ messages: Record<number, {
4
+ resolve: (value: unknown) => void;
5
+ reject: (reason?: unknown) => void;
6
+ }>;
7
+ messageIdNext: number;
8
+ constructor();
9
+ makeMessageId(): number;
10
+ makeMessagePromiseId(): {
11
+ id: number;
12
+ promise: Promise<unknown>;
13
+ };
14
+ onMessage(event: MessageEvent): void;
15
+ call(name: string, args: unknown): Promise<unknown>;
16
+ }
17
+ export declare function setWorkerPool(count?: number): void;
18
+ export declare function allocWorker(): Promise<SplatWorker>;
19
+ export declare function freeWorker(worker: SplatWorker): void;
20
+ export declare function withWorker<T>(callback: (worker: SplatWorker) => Promise<T>): Promise<T>;
@@ -0,0 +1,50 @@
1
+ import { TranscodeSpzInput } from './SplatLoader';
2
+ import { GunzipReader } from './utils';
3
+ export declare class SpzReader {
4
+ fileBytes: Uint8Array;
5
+ reader: GunzipReader;
6
+ version: number;
7
+ numSplats: number;
8
+ shDegree: number;
9
+ fractionalBits: number;
10
+ flags: number;
11
+ flagAntiAlias: boolean;
12
+ reserved: number;
13
+ parsed: boolean;
14
+ constructor({ fileBytes }: {
15
+ fileBytes: Uint8Array | ArrayBuffer;
16
+ });
17
+ parseSplats(centerCallback?: (index: number, x: number, y: number, z: number) => void, alphaCallback?: (index: number, alpha: number) => void, rgbCallback?: (index: number, r: number, g: number, b: number) => void, scalesCallback?: (index: number, scaleX: number, scaleY: number, scaleZ: number) => void, quatCallback?: (index: number, quatX: number, quatY: number, quatZ: number, quatW: number) => void, shCallback?: (index: number, sh1: Float32Array, sh2?: Float32Array, sh3?: Float32Array) => void): void;
18
+ }
19
+ export declare const SPZ_MAGIC = 1347635022;
20
+ export declare const SPZ_VERSION = 2;
21
+ export declare const FLAG_ANTIALIASED = 1;
22
+ export declare class SpzWriter {
23
+ buffer: ArrayBuffer;
24
+ view: DataView;
25
+ numSplats: number;
26
+ shDegree: number;
27
+ fractionalBits: number;
28
+ fraction: number;
29
+ flagAntiAlias: boolean;
30
+ clippedCount: number;
31
+ constructor({ numSplats, shDegree, fractionalBits, flagAntiAlias, }: {
32
+ numSplats: number;
33
+ shDegree: number;
34
+ fractionalBits?: number;
35
+ flagAntiAlias?: boolean;
36
+ });
37
+ setCenter(index: number, x: number, y: number, z: number): void;
38
+ setAlpha(index: number, alpha: number): void;
39
+ static scaleRgb(r: number): number;
40
+ setRgb(index: number, r: number, g: number, b: number): void;
41
+ setScale(index: number, scaleX: number, scaleY: number, scaleZ: number): void;
42
+ setQuat(index: number, quatX: number, quatY: number, quatZ: number, quatW: number): void;
43
+ static quantizeSh(sh: number, bits: number): number;
44
+ setSh(index: number, sh1: Float32Array, sh2?: Float32Array, sh3?: Float32Array): void;
45
+ finalize(): Promise<Uint8Array>;
46
+ }
47
+ export declare function transcodeSpz(input: TranscodeSpzInput): Promise<{
48
+ fileBytes: Uint8Array<ArrayBufferLike>;
49
+ clippedCount: number;
50
+ }>;
@@ -0,0 +1,150 @@
1
+ import { Gunzip } from 'fflate';
2
+ import * as THREE from "three";
3
+ export declare function floatBitsToUint(f: number): number;
4
+ export declare function uintBitsToFloat(u: number): number;
5
+ export declare function toHalf(f: number): number;
6
+ export declare function fromHalf(h: number): number;
7
+ export declare function floatToUint8(v: number): number;
8
+ export declare function floatToSint8(v: number): number;
9
+ export declare function Uint8ToFloat(v: number): number;
10
+ export declare function Sint8ToFloat(v: number): number;
11
+ export declare class DataCache {
12
+ maxItems: number;
13
+ asyncFetch: (key: string) => Promise<unknown>;
14
+ items: {
15
+ key: string;
16
+ data: unknown;
17
+ }[];
18
+ constructor({ asyncFetch, maxItems, }: {
19
+ asyncFetch: (key: string) => Promise<unknown>;
20
+ maxItems?: number;
21
+ });
22
+ getFetch(key: string): Promise<unknown>;
23
+ }
24
+ export declare function mapObject(obj: Record<string, unknown>, fn: (value: unknown, key: string) => unknown): Record<string, unknown>;
25
+ export declare function mapFilterObject(obj: Record<string, unknown>, fn: (value: unknown, key: string) => unknown): Record<string, unknown>;
26
+ export declare function getArrayBuffers(ctx: unknown): Transferable[];
27
+ export declare function newArray<T>(n: number, initFunction: (index: number) => T): T[];
28
+ export declare class FreeList<T, Args> {
29
+ items: T[];
30
+ allocate: (args: Args) => T;
31
+ dispose?: (item: T) => void;
32
+ valid: (item: T, args: Args) => boolean;
33
+ constructor({ allocate, dispose, valid, }: {
34
+ allocate: (args: Args) => T;
35
+ dispose?: (item: T) => void;
36
+ valid: (item: T, args: Args) => boolean;
37
+ });
38
+ alloc(args: Args): T;
39
+ free(item: T): void;
40
+ disposeAll(): void;
41
+ }
42
+ export declare function setPackedSplat(packedSplats: Uint32Array, index: number, x: number, y: number, z: number, scaleX: number, scaleY: number, scaleZ: number, quatX: number, quatY: number, quatZ: number, quatW: number, opacity: number, r: number, g: number, b: number): void;
43
+ export declare function setPackedSplatCenter(packedSplats: Uint32Array, index: number, x: number, y: number, z: number): void;
44
+ export declare function setPackedSplatScales(packedSplats: Uint32Array, index: number, scaleX: number, scaleY: number, scaleZ: number): void;
45
+ export declare function setPackedSplatQuat(packedSplats: Uint32Array, index: number, quatX: number, quatY: number, quatZ: number, quatW: number): void;
46
+ export declare function setPackedSplatRgb(packedSplats: Uint32Array, index: number, r: number, g: number, b: number): void;
47
+ export declare function setPackedSplatOpacity(packedSplats: Uint32Array, index: number, opacity: number): void;
48
+ export declare function unpackSplat(packedSplats: Uint32Array, index: number): {
49
+ center: THREE.Vector3;
50
+ scales: THREE.Vector3;
51
+ quaternion: THREE.Quaternion;
52
+ color: THREE.Color;
53
+ opacity: number;
54
+ };
55
+ export declare function getTextureSize(numSplats: number): {
56
+ width: number;
57
+ height: number;
58
+ depth: number;
59
+ maxSplats: number;
60
+ };
61
+ export declare function computeMaxSplats(numSplats: number): number;
62
+ export declare function isMobile(): boolean;
63
+ export declare function isAndroid(): boolean;
64
+ export declare function isOculus(): boolean;
65
+ export declare function flipPixels(pixels: Uint8Array, width: number, height: number): Uint8Array;
66
+ export declare function pixelsToPngUrl(pixels: Uint8Array, width: number, height: number): string;
67
+ export declare function cloneClock(clock: THREE.Clock): THREE.Clock;
68
+ export declare function omitUndefined<T extends object>(obj: T): Partial<T>;
69
+ export declare const IDENT_VERTEX_SHADER: string;
70
+ export declare function averagePositions(positions: THREE.Vector3[]): THREE.Vector3;
71
+ export declare function averageQuaternions(quaternions: THREE.Quaternion[]): THREE.Quaternion;
72
+ export declare function coinciDist(matrix1: THREE.Matrix4, matrix2: THREE.Matrix4): {
73
+ distance: number;
74
+ coincidence: number;
75
+ };
76
+ export declare function withinDist({ matrix1, matrix2, maxDistance, }: {
77
+ matrix1: THREE.Matrix4;
78
+ matrix2: THREE.Matrix4;
79
+ maxDistance: number;
80
+ }): boolean;
81
+ export declare function withinCoinciDist({ matrix1, matrix2, maxDistance, minCoincidence, }: {
82
+ matrix1: THREE.Matrix4;
83
+ matrix2: THREE.Matrix4;
84
+ maxDistance: number;
85
+ minCoincidence?: number;
86
+ }): boolean;
87
+ export declare function coorientDist(matrix1: THREE.Matrix4, matrix2: THREE.Matrix4): {
88
+ distance: number;
89
+ coorient: number;
90
+ };
91
+ export declare function withinCoorientDist({ matrix1, matrix2, maxDistance, minCoorient, }: {
92
+ matrix1: THREE.Matrix4;
93
+ matrix2: THREE.Matrix4;
94
+ maxDistance: number;
95
+ minCoorient?: number;
96
+ }): boolean;
97
+ export declare function epsilonSign(value: number, epsilon?: number): number;
98
+ export declare function encodeQuatXyz888(q: THREE.Quaternion): number;
99
+ export declare function decodeQuatXyz888(encoded: number, out: THREE.Quaternion): THREE.Quaternion;
100
+ /**
101
+ * Encodes a THREE.Quaternion into a 24‐bit integer.
102
+ *
103
+ * Bit layout (LSB → MSB):
104
+ * - Bits 0–7: quantized U (8 bits)
105
+ * - Bits 8–15: quantized V (8 bits)
106
+ * - Bits 16–23: quantized angle θ (8 bits) from [0,π]
107
+ *
108
+ * This version uses folded octahedral mapping (all inline).
109
+ */
110
+ export declare function encodeQuatOctXy88R8(q: THREE.Quaternion): number;
111
+ /**
112
+ * Decodes a 24‐bit encoded quaternion (packed in a number) back to a THREE.Quaternion.
113
+ *
114
+ * Assumes the same bit layout as in encodeQuatOctXy88R8.
115
+ */
116
+ export declare function decodeQuatOctXy88R8(encoded: number, out: THREE.Quaternion): THREE.Quaternion;
117
+ /**
118
+ * Encodes a THREE.Quaternion into a 24‑bit unsigned integer
119
+ * by converting it to Euler angles (roll, pitch, yaw).
120
+ * The Euler angles are assumed to be in radians in the range [-π, π].
121
+ * Each angle is normalized to [0,1] and quantized to 8 bits.
122
+ * Bit layout (LSB→MSB):
123
+ * - Bits 0–7: roll (quantized)
124
+ * - Bits 8–15: pitch (quantized)
125
+ * - Bits 16–23: yaw (quantized)
126
+ */
127
+ export declare function encodeQuatEulerXyz888(q: THREE.Quaternion): number;
128
+ /**
129
+ * Decodes a 24‑bit unsigned integer into a THREE.Quaternion
130
+ * by unpacking three 8‑bit values (roll, pitch, yaw) in the range [0,255]
131
+ * and then converting them back to Euler angles in [-π, π] and to a quaternion.
132
+ */
133
+ export declare function decodeQuatEulerXyz888(encoded: number, out: THREE.Quaternion): THREE.Quaternion;
134
+ export declare function encodeSh1Rgb(sh1Array: Uint32Array, index: number, sh1Rgb: Float32Array): void;
135
+ export declare function encodeSh2Rgb(sh2Array: Uint32Array, index: number, sh2Rgb: Float32Array): void;
136
+ export declare function encodeSh3Rgb(sh3Array: Uint32Array, index: number, sh3Rgb: Float32Array): void;
137
+ export declare function decompressPartialGzip(fileBytes: Uint8Array, numBytes: number): Uint8Array;
138
+ export declare class GunzipReader {
139
+ fileBytes: Uint8Array;
140
+ chunkBytes: number;
141
+ offset: number;
142
+ chunks: Uint8Array[];
143
+ totalBytes: number;
144
+ gunzip: Gunzip;
145
+ constructor({ fileBytes, chunkBytes, }: {
146
+ fileBytes: Uint8Array;
147
+ chunkBytes?: number;
148
+ });
149
+ read(numBytes: number): Uint8Array;
150
+ }
@@ -0,0 +1,6 @@
1
+ import type * as THREE from "three";
2
+ export declare class VRButton {
3
+ static createButton(renderer: THREE.WebGLRenderer, sessionInit?: XRSessionInit): HTMLElement | null;
4
+ static registerSessionGrantedListener(): null | undefined;
5
+ static xrSessionIsGranted: boolean;
6
+ }
@@ -0,0 +1 @@
1
+ export {};
package/package.json ADDED
@@ -0,0 +1,63 @@
1
+ {
2
+ "name": "@sparkjsdev/spark",
3
+ "version": "0.1.0",
4
+ "description": "An advanced 3D Gaussian Splatting renderer for THREE.js",
5
+ "homepage": "https://sparkjs.dev/",
6
+ "type": "module",
7
+ "main": "./dist/spark.cjs.js",
8
+ "module": "./dist/spark.module.js",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/types/index.d.ts",
12
+ "import": "./dist/spark.module.js",
13
+ "require": "./dist/spark.cjs.js"
14
+ }
15
+ },
16
+ "scripts": {
17
+ "assets:clean": "node scripts/clean-assets.js",
18
+ "assets:compress": "node scripts/compress-to-spz.js",
19
+ "assets:download": "node scripts/download-assets.js",
20
+ "build": "npm run build:production && npm run build:dev",
21
+ "build:dev": "vite build --mode dev",
22
+ "build:production": "vite build --mode production",
23
+ "build:wasm": "node rust/build_wasm.js",
24
+ "build:watch": "onchange 'src/**/*.{ts,glsl}' -- npm run build:dev",
25
+ "clean": "rm -rf dist/ && rm -rf node_modules/ && rm -rf rust/target/ && rm -rf rust/forge-internal-rs/pkg/ && npm run assets:clean",
26
+ "dev": "npm run build:dev && (vite --host & npm run build:watch)",
27
+ "docs": "node scripts/clean-site-files.js && node scripts/copy-site-files.js && mkdocs serve",
28
+ "format": "biome format .",
29
+ "format:fix": "biome format . --fix",
30
+ "lint": "biome check .",
31
+ "lint:fix": "biome check . --fix",
32
+ "lint:summary": "biome check --reporter=summary",
33
+ "prepare": "npm run build:wasm && lefthook install",
34
+ "site:build": "npm run build && npm run site:clean && mkdocs build && node scripts/copy-site-files.js",
35
+ "site:clean": "node scripts/clean-site.js",
36
+ "site:deploy": "node scripts/deploy-site.js",
37
+ "site:serve": "node scripts/serve-site.js site",
38
+ "start": "npm run dev",
39
+ "test": "node --no-warnings --loader ts-node/esm --test test/**/*.test.ts"
40
+ },
41
+ "repository": "sparkjs/spark",
42
+ "files": ["dist"],
43
+ "license": "MIT",
44
+ "devDependencies": {
45
+ "@biomejs/biome": "1.9.4",
46
+ "@types/three": "0.172.0",
47
+ "lefthook": "1.11.12",
48
+ "lil-gui": "^0.20.0",
49
+ "onchange": "7.1.0",
50
+ "stats.js": "^0.17.0",
51
+ "three": "^0.172.0",
52
+ "ts-node": "10.9.2",
53
+ "typescript": "^5.7.3",
54
+ "vite": "^6.0.11",
55
+ "vite-plugin-dts": "^4.5.4",
56
+ "vite-plugin-glsl": "^1.3.1"
57
+ },
58
+ "dependencies": {
59
+ "fflate": "^0.8.2",
60
+ "forge-internal-rs": "file:rust/forge-internal-rs/pkg"
61
+ },
62
+ "keywords": ["3d", "three.js", "gsplats", "3dgs", "gaussian", "splats"]
63
+ }