gaussian-splat-lite 1.2.2 → 1.3.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/CHANGELOG.md +32 -2
- package/CONTRIBUTING.md +4 -2
- package/README.md +4 -3
- package/dist/gaussian-splat-lite.cjs +6379 -1441
- package/dist/gaussian-splat-lite.cjs.map +1 -1
- package/dist/gaussian-splat-lite.min.cjs +978 -11
- package/dist/gaussian-splat-lite.min.cjs.map +1 -1
- package/dist/gaussian-splat-lite.module.js +5920 -982
- package/dist/gaussian-splat-lite.module.js.map +1 -1
- package/dist/gaussian-splat-lite.module.min.js +7882 -3373
- package/dist/gaussian-splat-lite.module.min.js.map +1 -1
- package/dist/types/addons/NeuralDenoiseNode.d.cts +72 -0
- package/dist/types/addons/NeuralDenoiseNode.d.ts +72 -0
- package/dist/types/addons/NeuralDenoisePass.d.cts +34 -0
- package/dist/types/addons/NeuralDenoisePass.d.ts +34 -0
- package/dist/types/addons/TAANode.d.cts +46 -33
- package/dist/types/addons/TAANode.d.ts +46 -33
- package/dist/types/addons/TAAPass.d.cts +47 -32
- package/dist/types/addons/TAAPass.d.ts +47 -32
- package/dist/types/addons/neuralDenoiseGL.d.cts +25 -0
- package/dist/types/addons/neuralDenoiseGL.d.ts +25 -0
- package/dist/types/addons/neuralDenoiseGLSL.d.cts +8 -0
- package/dist/types/addons/neuralDenoiseGLSL.d.ts +8 -0
- package/dist/types/addons/neuralDenoisePasses.d.cts +26 -0
- package/dist/types/addons/neuralDenoisePasses.d.ts +26 -0
- package/dist/types/addons/neuralDenoiseShaders.d.cts +38 -0
- package/dist/types/addons/neuralDenoiseShaders.d.ts +38 -0
- package/dist/types/addons/neuralDenoiseWeights.d.cts +118 -0
- package/dist/types/addons/neuralDenoiseWeights.d.ts +118 -0
- package/dist/types/addons/stochasticCoverage.d.cts +14 -0
- package/dist/types/addons/stochasticCoverage.d.ts +14 -0
- package/dist/types/addons/taaShared.d.cts +58 -39
- package/dist/types/addons/taaShared.d.ts +58 -39
- package/dist/types/capture/SplatCapture.d.cts +54 -53
- package/dist/types/capture/SplatCapture.d.ts +54 -53
- package/dist/types/capture/WebGLCapture.d.cts +10 -10
- package/dist/types/capture/WebGLCapture.d.ts +10 -10
- package/dist/types/capture/WebGPUCapture.d.cts +14 -14
- package/dist/types/capture/WebGPUCapture.d.ts +14 -14
- package/dist/types/capture/pixels.d.cts +15 -4
- package/dist/types/capture/pixels.d.ts +15 -4
- package/dist/types/capture/rendererState.d.cts +5 -2
- package/dist/types/capture/rendererState.d.ts +5 -2
- package/dist/types/data/IndexedSplats.d.cts +76 -58
- package/dist/types/data/IndexedSplats.d.ts +76 -58
- package/dist/types/data/RadPagedSplats.d.cts +65 -61
- package/dist/types/data/RadPagedSplats.d.ts +65 -61
- package/dist/types/data/SogRegionSplats.d.cts +25 -19
- package/dist/types/data/SogRegionSplats.d.ts +25 -19
- package/dist/types/data/SplatOpacityTable.d.cts +29 -29
- package/dist/types/data/SplatOpacityTable.d.ts +29 -29
- package/dist/types/data/Splats.d.cts +99 -69
- package/dist/types/data/Splats.d.ts +99 -69
- package/dist/types/data/defines.d.cts +24 -24
- package/dist/types/data/defines.d.ts +24 -24
- package/dist/types/data/raycast.d.cts +13 -9
- package/dist/types/data/raycast.d.ts +13 -9
- package/dist/types/data/splatCodec.d.cts +29 -5
- package/dist/types/data/splatCodec.d.ts +29 -5
- package/dist/types/data/splatData.d.cts +18 -11
- package/dist/types/data/splatData.d.ts +18 -11
- package/dist/types/data/splatRange.d.cts +6 -2
- package/dist/types/data/splatRange.d.ts +6 -2
- package/dist/types/data/textureLayout.d.cts +9 -6
- package/dist/types/data/textureLayout.d.ts +9 -6
- package/dist/types/data/unpack.d.cts +16 -9
- package/dist/types/data/unpack.d.ts +16 -9
- package/dist/types/index.d.cts +65 -19
- package/dist/types/index.d.ts +65 -19
- package/dist/types/loaders/SplatLoader.d.cts +27 -14
- package/dist/types/loaders/SplatLoader.d.ts +27 -14
- package/dist/types/loaders/loadSplatData.d.cts +35 -17
- package/dist/types/loaders/loadSplatData.d.ts +35 -17
- package/dist/types/loaders/loadTypes.d.cts +46 -40
- package/dist/types/loaders/loadTypes.d.ts +46 -40
- package/dist/types/loaders/morton.d.cts +9 -3
- package/dist/types/loaders/morton.d.ts +9 -3
- package/dist/types/loaders/postDecode/builder.d.cts +222 -127
- package/dist/types/loaders/postDecode/builder.d.ts +222 -127
- package/dist/types/loaders/postDecode/compiler.d.cts +25 -11
- package/dist/types/loaders/postDecode/compiler.d.ts +25 -11
- package/dist/types/loaders/postDecode/operations.d.cts +22 -3
- package/dist/types/loaders/postDecode/operations.d.ts +22 -3
- package/dist/types/loaders/postDecode/optimizer.d.cts +5 -2
- package/dist/types/loaders/postDecode/optimizer.d.ts +5 -2
- package/dist/types/loaders/postDecode/program.d.cts +13 -6
- package/dist/types/loaders/postDecode/program.d.ts +13 -6
- package/dist/types/loaders/postDecode/protocol.d.cts +136 -111
- package/dist/types/loaders/postDecode/protocol.d.ts +136 -111
- package/dist/types/loaders/postDecode/registers.d.cts +12 -7
- package/dist/types/loaders/postDecode/registers.d.ts +12 -7
- package/dist/types/loaders/postDecode/runtime.d.cts +9 -2
- package/dist/types/loaders/postDecode/runtime.d.ts +9 -2
- package/dist/types/loaders/rad/RadSource.d.cts +81 -66
- package/dist/types/loaders/rad/RadSource.d.ts +81 -66
- package/dist/types/loaders/rad/radFormat.d.cts +41 -36
- package/dist/types/loaders/rad/radFormat.d.ts +41 -36
- package/dist/types/loaders/rad.d.cts +4 -4
- package/dist/types/loaders/rad.d.ts +4 -4
- package/dist/types/loaders/sog/SogSource.d.cts +14 -4
- package/dist/types/loaders/sog/SogSource.d.ts +14 -4
- package/dist/types/loaders/sog/sogZip.d.cts +12 -12
- package/dist/types/loaders/sog/sogZip.d.ts +12 -12
- package/dist/types/loaders/sog.d.cts +3 -3
- package/dist/types/loaders/sog.d.ts +3 -3
- package/dist/types/loaders/source.d.cts +43 -15
- package/dist/types/loaders/source.d.ts +43 -15
- package/dist/types/loaders/stream/StreamByteBudget.d.cts +4 -4
- package/dist/types/loaders/stream/StreamByteBudget.d.ts +4 -4
- package/dist/types/loaders/stream/StreamCameras.d.cts +27 -18
- package/dist/types/loaders/stream/StreamCameras.d.ts +27 -18
- package/dist/types/loaders/stream/StreamWorkerPool.d.cts +37 -34
- package/dist/types/loaders/stream/StreamWorkerPool.d.ts +37 -34
- package/dist/types/loaders/stream/rad-stream/RadSelectionState.d.cts +15 -11
- package/dist/types/loaders/stream/rad-stream/RadSelectionState.d.ts +15 -11
- package/dist/types/loaders/stream/rad-stream/RadStreamBatch.d.cts +13 -9
- package/dist/types/loaders/stream/rad-stream/RadStreamBatch.d.ts +13 -9
- package/dist/types/loaders/stream/rad-stream/RadStreamLoader.d.cts +64 -49
- package/dist/types/loaders/stream/rad-stream/RadStreamLoader.d.ts +64 -49
- package/dist/types/loaders/stream/rad-stream/RadStreamScheduler.d.cts +110 -102
- package/dist/types/loaders/stream/rad-stream/RadStreamScheduler.d.ts +110 -102
- package/dist/types/loaders/stream/rad-stream/RadStreamWorker.d.cts +3 -3
- package/dist/types/loaders/stream/rad-stream/RadStreamWorker.d.ts +3 -3
- package/dist/types/loaders/stream/rad-stream/prepareRadSelection.d.cts +27 -15
- package/dist/types/loaders/stream/rad-stream/prepareRadSelection.d.ts +27 -15
- package/dist/types/loaders/stream/rad-stream/radFade.d.cts +13 -8
- package/dist/types/loaders/stream/rad-stream/radFade.d.ts +13 -8
- package/dist/types/loaders/stream/rad-stream/radLod.d.cts +26 -26
- package/dist/types/loaders/stream/rad-stream/radLod.d.ts +26 -26
- package/dist/types/loaders/stream/rad-stream/worker.d.cts +3 -59
- package/dist/types/loaders/stream/rad-stream/worker.d.ts +3 -59
- package/dist/types/loaders/stream/rad-stream/workerHandlers.d.cts +85 -59
- package/dist/types/loaders/stream/rad-stream/workerHandlers.d.ts +85 -59
- package/dist/types/loaders/stream/sog-stream/SogStreamBatch.d.cts +17 -12
- package/dist/types/loaders/stream/sog-stream/SogStreamBatch.d.ts +17 -12
- package/dist/types/loaders/stream/sog-stream/SogStreamLoader.d.cts +56 -41
- package/dist/types/loaders/stream/sog-stream/SogStreamLoader.d.ts +56 -41
- package/dist/types/loaders/stream/sog-stream/SogStreamScheduler.d.cts +82 -81
- package/dist/types/loaders/stream/sog-stream/SogStreamScheduler.d.ts +82 -81
- package/dist/types/loaders/stream/sog-stream/SogStreamWorker.d.cts +3 -3
- package/dist/types/loaders/stream/sog-stream/SogStreamWorker.d.ts +3 -3
- package/dist/types/loaders/stream/sog-stream/sogLod.d.cts +59 -44
- package/dist/types/loaders/stream/sog-stream/sogLod.d.ts +59 -44
- package/dist/types/loaders/stream/sog-stream/sogVisibility.d.cts +30 -22
- package/dist/types/loaders/stream/sog-stream/sogVisibility.d.ts +30 -22
- package/dist/types/loaders/stream/sog-stream/worker.d.cts +7 -40
- package/dist/types/loaders/stream/sog-stream/worker.d.ts +7 -40
- package/dist/types/loaders/stream/sog-stream/workerHandlers.d.cts +69 -44
- package/dist/types/loaders/stream/sog-stream/workerHandlers.d.ts +69 -44
- package/dist/types/loaders/stream/streamOptions.d.cts +41 -32
- package/dist/types/loaders/stream/streamOptions.d.ts +41 -32
- package/dist/types/loaders/workerDecode.d.cts +30 -12
- package/dist/types/loaders/workerDecode.d.ts +30 -12
- package/dist/types/patches/threeR186.d.cts +3 -0
- package/dist/types/patches/threeR186.d.ts +3 -0
- package/dist/types/rendering/GaussianSplatRenderer.d.cts +393 -376
- package/dist/types/rendering/GaussianSplatRenderer.d.ts +393 -376
- package/dist/types/rendering/MaterialState.d.cts +9 -0
- package/dist/types/rendering/MaterialState.d.ts +9 -0
- package/dist/types/rendering/SortCenterCache.d.cts +17 -17
- package/dist/types/rendering/SortCenterCache.d.ts +17 -17
- package/dist/types/rendering/SplatAccumulator.d.cts +93 -77
- package/dist/types/rendering/SplatAccumulator.d.ts +93 -77
- package/dist/types/rendering/SplatGeometry.d.cts +2 -2
- package/dist/types/rendering/SplatGeometry.d.ts +2 -2
- package/dist/types/rendering/StochasticSplatMaterial.d.cts +14 -0
- package/dist/types/rendering/StochasticSplatMaterial.d.ts +14 -0
- package/dist/types/rendering/backend.d.cts +30 -18
- package/dist/types/rendering/backend.d.ts +30 -18
- package/dist/types/rendering/blueNoise.d.cts +1 -1
- package/dist/types/rendering/blueNoise.d.ts +1 -1
- package/dist/types/rendering/rendererUtils.d.cts +25 -10
- package/dist/types/rendering/rendererUtils.d.ts +25 -10
- package/dist/types/rendering/tsl/GenerateProgram.d.cts +19 -17
- package/dist/types/rendering/tsl/GenerateProgram.d.ts +19 -17
- package/dist/types/rendering/tsl/ProjectionProgram.d.cts +38 -33
- package/dist/types/rendering/tsl/ProjectionProgram.d.ts +38 -33
- package/dist/types/rendering/tsl/SplatBackend.d.cts +22 -10
- package/dist/types/rendering/tsl/SplatBackend.d.ts +22 -10
- package/dist/types/rendering/tsl/SplatMaterial.d.cts +38 -25
- package/dist/types/rendering/tsl/SplatMaterial.d.ts +38 -25
- package/dist/types/rendering/tsl/shaderUtils.d.cts +55 -17
- package/dist/types/rendering/tsl/shaderUtils.d.ts +55 -17
- package/dist/types/rendering/tsl/stochasticCoverage.d.cts +7 -0
- package/dist/types/rendering/tsl/stochasticCoverage.d.ts +7 -0
- package/dist/types/rendering/tsl/viewUniforms.d.cts +19 -9
- package/dist/types/rendering/tsl/viewUniforms.d.ts +19 -9
- package/dist/types/rendering/uniforms.d.cts +83 -83
- package/dist/types/rendering/uniforms.d.ts +83 -83
- package/dist/types/rendering/webgl/AccumulatorGenerator.d.cts +28 -12
- package/dist/types/rendering/webgl/AccumulatorGenerator.d.ts +28 -12
- package/dist/types/rendering/webgl/OrderingTexture.d.cts +10 -7
- package/dist/types/rendering/webgl/OrderingTexture.d.ts +10 -7
- package/dist/types/rendering/webgl/SplatBackend.d.cts +20 -15
- package/dist/types/rendering/webgl/SplatBackend.d.ts +20 -15
- package/dist/types/rendering/webgl/SplatMaterial.d.cts +9 -4
- package/dist/types/rendering/webgl/SplatMaterial.d.ts +9 -4
- package/dist/types/rendering/webgl/textureUtils.d.cts +10 -3
- package/dist/types/rendering/webgl/textureUtils.d.ts +10 -3
- package/dist/types/rendering/webgl-fallback/AccumulatorGenerator.d.cts +8 -10
- package/dist/types/rendering/webgl-fallback/AccumulatorGenerator.d.ts +8 -10
- package/dist/types/rendering/webgl-fallback/SplatBackend.d.cts +18 -14
- package/dist/types/rendering/webgl-fallback/SplatBackend.d.ts +18 -14
- package/dist/types/rendering/webgpu/ProjectedSplats.d.cts +76 -66
- package/dist/types/rendering/webgpu/ProjectedSplats.d.ts +76 -66
- package/dist/types/rendering/webgpu/ProjectionCache.d.cts +43 -28
- package/dist/types/rendering/webgpu/ProjectionCache.d.ts +43 -28
- package/dist/types/rendering/webgpu/ProjectionKernel.d.cts +22 -0
- package/dist/types/rendering/webgpu/ProjectionKernel.d.ts +22 -0
- package/dist/types/rendering/webgpu/RadixSort.d.cts +44 -40
- package/dist/types/rendering/webgpu/RadixSort.d.ts +44 -40
- package/dist/types/rendering/webgpu/SplatBackend.d.cts +14 -12
- package/dist/types/rendering/webgpu/SplatBackend.d.ts +14 -12
- package/dist/types/runtime/SplatWorker.d.cts +17 -13
- package/dist/types/runtime/SplatWorker.d.ts +17 -13
- package/dist/types/runtime/WorkerRpc.d.cts +26 -20
- package/dist/types/runtime/WorkerRpc.d.ts +26 -20
- package/dist/types/runtime/abort.d.cts +10 -5
- package/dist/types/runtime/abort.d.ts +10 -5
- package/dist/types/runtime/retry.d.cts +6 -6
- package/dist/types/runtime/retry.d.ts +6 -6
- package/dist/types/runtime/wasmCall.d.cts +3 -3
- package/dist/types/runtime/wasmCall.d.ts +3 -3
- package/dist/types/runtime/worker.d.cts +44 -24
- package/dist/types/runtime/worker.d.ts +44 -24
- package/dist/types/runtime/workerServer.d.cts +3 -1
- package/dist/types/runtime/workerServer.d.ts +3 -1
- package/dist/types/scene/SplatEdit.d.cts +74 -67
- package/dist/types/scene/SplatEdit.d.ts +74 -67
- package/dist/types/scene/SplatMesh.d.cts +92 -70
- package/dist/types/scene/SplatMesh.d.ts +92 -70
- package/dist/types/utils/index.d.cts +15 -7
- package/dist/types/utils/index.d.ts +15 -7
- package/dist/types/utils/three.d.cts +3 -3
- package/dist/types/utils/three.d.ts +3 -3
- package/dist/types/utils/transforms.d.cts +10 -3
- package/dist/types/utils/transforms.d.ts +10 -3
- package/docs/GaussianSplatRenderer.md +3 -1
- package/docs/NeuralDenoiseNode.md +148 -0
- package/docs/SplatMesh.md +1 -1
- package/docs/StochasticRendering.md +36 -10
- package/docs/TAAPass.md +20 -3
- package/package.json +9 -11
- package/dist/types/capture/sceneView.d.cts +0 -3
- package/dist/types/capture/sceneView.d.ts +0 -3
- package/dist/types/rendering/tsl/tslCompat.d.cts +0 -68
- package/dist/types/rendering/tsl/tslCompat.d.ts +0 -68
- package/docs/Architecture.md +0 -200
|
@@ -1,90 +1,97 @@
|
|
|
1
1
|
import * as THREE from "three";
|
|
2
2
|
export declare enum SplatEditSdfType {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
3
|
+
ALL = "all",
|
|
4
|
+
PLANE = "plane",
|
|
5
|
+
SPHERE = "sphere",
|
|
6
|
+
BOX = "box",
|
|
7
|
+
ELLIPSOID = "ellipsoid",
|
|
8
|
+
CYLINDER = "cylinder",
|
|
9
|
+
CAPSULE = "capsule",
|
|
10
|
+
INFINITE_CONE = "infinite_cone",
|
|
11
11
|
}
|
|
12
12
|
/** RGBA-only operations supported by the SDF pipeline. */
|
|
13
13
|
export declare enum SplatEditRgbaBlendMode {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
14
|
+
MULTIPLY_RGBA = "multiply_rgba",
|
|
15
|
+
SET_RGBA = "set_rgba",
|
|
16
|
+
ADD_RGBA = "add_rgba",
|
|
17
17
|
}
|
|
18
18
|
export type SplatEditSdfColor = {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
19
|
+
r?: number;
|
|
20
|
+
g?: number;
|
|
21
|
+
b?: number;
|
|
22
22
|
};
|
|
23
23
|
export type SplatEditSdfOptions = {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
24
|
+
type?: SplatEditSdfType;
|
|
25
|
+
invert?: boolean;
|
|
26
|
+
opacity?: number;
|
|
27
|
+
color?: SplatEditSdfColor;
|
|
28
|
+
radius?: number;
|
|
29
29
|
};
|
|
30
30
|
/** A signed-distance shape carrying optional color and opacity channels. */
|
|
31
31
|
export declare class SplatEditSdf extends THREE.Object3D {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
32
|
+
type: SplatEditSdfType;
|
|
33
|
+
invert: boolean;
|
|
34
|
+
opacity?: number;
|
|
35
|
+
color: SplatEditSdfColor;
|
|
36
|
+
radius: number;
|
|
37
|
+
constructor(options?: SplatEditSdfOptions);
|
|
38
38
|
}
|
|
39
39
|
export type SplatEditOptions = {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
40
|
+
name?: string;
|
|
41
|
+
rgbaBlendMode?: SplatEditRgbaBlendMode;
|
|
42
|
+
sdfSmooth?: number;
|
|
43
|
+
softEdge?: number;
|
|
44
|
+
invert?: boolean;
|
|
45
|
+
sdfs?: SplatEditSdf[];
|
|
46
46
|
};
|
|
47
47
|
/** An ordered RGBA operation evaluated over one or more SDF shapes. */
|
|
48
48
|
export declare class SplatEdit extends THREE.Object3D {
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
49
|
+
ordering: number;
|
|
50
|
+
rgbaBlendMode: SplatEditRgbaBlendMode;
|
|
51
|
+
sdfSmooth: number;
|
|
52
|
+
softEdge: number;
|
|
53
|
+
invert: boolean;
|
|
54
|
+
sdfs: SplatEditSdf[] | null;
|
|
55
|
+
static nextOrdering: number;
|
|
56
|
+
constructor(options?: SplatEditOptions);
|
|
57
|
+
addSdf(sdf: SplatEditSdf): void;
|
|
58
|
+
removeSdf(sdf: SplatEditSdf): void;
|
|
59
59
|
}
|
|
60
60
|
export type SplatEditGroup = {
|
|
61
|
-
|
|
62
|
-
|
|
61
|
+
edit: SplatEdit;
|
|
62
|
+
sdfs: SplatEditSdf[];
|
|
63
63
|
};
|
|
64
64
|
/** Encodes SDF geometry/RGBA and edit operations as regular integer textures. */
|
|
65
65
|
export declare class SplatEdits {
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
66
|
+
maxSdfs: number;
|
|
67
|
+
numSdfs: number;
|
|
68
|
+
sdfData: Uint32Array;
|
|
69
|
+
sdfTexture: THREE.DataTexture;
|
|
70
|
+
maxEdits: number;
|
|
71
|
+
numEdits: number;
|
|
72
|
+
editData: Uint32Array;
|
|
73
|
+
editTexture: THREE.DataTexture;
|
|
74
|
+
constructor({
|
|
75
|
+
maxSdfs,
|
|
76
|
+
maxEdits,
|
|
77
|
+
}?: {
|
|
78
|
+
maxSdfs?: number | undefined;
|
|
79
|
+
maxEdits?: number | undefined;
|
|
80
|
+
});
|
|
81
|
+
dispose(): void;
|
|
82
|
+
update(
|
|
83
|
+
groups: SplatEditGroup[],
|
|
84
|
+
coordinateOrigin?: THREE.Vector3,
|
|
85
|
+
shrinkResources?: boolean,
|
|
86
|
+
): {
|
|
87
|
+
updated: boolean;
|
|
88
|
+
};
|
|
89
|
+
private ensureCapacity;
|
|
90
|
+
private encodeEdit;
|
|
91
|
+
private encodeSdf;
|
|
92
|
+
private setSdfUint;
|
|
93
|
+
private setSdfFloat;
|
|
94
|
+
private setEditUint;
|
|
95
|
+
private setEditFloat;
|
|
96
|
+
static emptyTexture: THREE.DataTexture;
|
|
90
97
|
}
|
|
@@ -1,80 +1,102 @@
|
|
|
1
|
-
import { Splats } from '../data/Splats.cjs';
|
|
2
|
-
import { SplatFileType } from '../data/defines.cjs';
|
|
3
|
-
import { SplatFileResolver, SplatProgressEvent } from '../loaders/loadTypes.cjs';
|
|
4
|
-
import { SplatPostDecodeProgram } from '../loaders/postDecode/program.cjs';
|
|
5
|
-
import { SplatEdit, SplatEdits } from './SplatEdit.cjs';
|
|
6
1
|
import * as THREE from "three";
|
|
2
|
+
import type { Splats } from "../data/Splats.cjs";
|
|
3
|
+
import type { SplatFileType } from "../data/defines.cjs";
|
|
4
|
+
import type {
|
|
5
|
+
SplatFileResolver,
|
|
6
|
+
SplatProgressEvent,
|
|
7
|
+
} from "../loaders/loadTypes.cjs";
|
|
8
|
+
import type { SplatPostDecodeProgram } from "../loaders/postDecode/program.cjs";
|
|
9
|
+
import type { SplatEdit, SplatEdits } from "./SplatEdit.cjs";
|
|
7
10
|
export type SplatMeshOptions = {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
time: number;
|
|
25
|
-
deltaTime: number;
|
|
26
|
-
}) => void;
|
|
27
|
-
};
|
|
28
|
-
export type SplatMeshFrameContext = {
|
|
11
|
+
url?: string;
|
|
12
|
+
file?: Blob;
|
|
13
|
+
fileBytes?: Uint8Array | ArrayBuffer;
|
|
14
|
+
fileType?: SplatFileType;
|
|
15
|
+
fileName?: string;
|
|
16
|
+
resolveFile?: SplatFileResolver;
|
|
17
|
+
/** Declarative per-splat transform executed in the decode worker. */
|
|
18
|
+
postDecode?: SplatPostDecodeProgram;
|
|
19
|
+
splats?: Splats;
|
|
20
|
+
onProgress?: (event: SplatProgressEvent) => void;
|
|
21
|
+
onLoad?: (mesh: SplatMesh) => Promise<void> | void;
|
|
22
|
+
editable?: boolean;
|
|
23
|
+
raycastable?: boolean;
|
|
24
|
+
minRaycastOpacity?: number;
|
|
25
|
+
onFrame?: (context: {
|
|
26
|
+
mesh: SplatMesh;
|
|
29
27
|
time: number;
|
|
30
28
|
deltaTime: number;
|
|
31
|
-
|
|
29
|
+
}) => void;
|
|
30
|
+
};
|
|
31
|
+
export type SplatMeshFrameContext = {
|
|
32
|
+
time: number;
|
|
33
|
+
deltaTime: number;
|
|
34
|
+
globalEdits: SplatEdit[];
|
|
35
|
+
/** Compact SDF edit storage during an explicit renderer shrink. */
|
|
36
|
+
shrinkResources?: boolean;
|
|
32
37
|
};
|
|
33
38
|
export type SplatIntersection = THREE.Intersection<SplatMesh> & {
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
39
|
+
/** Current readable index in this mesh's Splats. */
|
|
40
|
+
index: number;
|
|
41
|
+
/** Original file index; for streamed SOG, relative to this batch's chunk. */
|
|
42
|
+
sourceIndex: number;
|
|
38
43
|
};
|
|
39
44
|
/** A scene object backed by a fixed encoded splat source and RGBA SDF edits. */
|
|
40
45
|
export declare class SplatMesh extends THREE.Object3D {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
46
|
+
private lastInitialization?;
|
|
47
|
+
private readiness;
|
|
48
|
+
private onLoad?;
|
|
49
|
+
get isInitialized(): boolean;
|
|
50
|
+
get initialized(): Promise<SplatMesh>;
|
|
51
|
+
private followInitialization;
|
|
52
|
+
splats?: Splats;
|
|
53
|
+
numSplats: number;
|
|
54
|
+
recolor: THREE.Color;
|
|
55
|
+
opacity: number;
|
|
56
|
+
maxSh: number;
|
|
57
|
+
edits: SplatEdit[] | null;
|
|
58
|
+
editable: boolean;
|
|
59
|
+
raycastable: boolean;
|
|
60
|
+
minRaycastOpacity: number;
|
|
61
|
+
sdfEdits: SplatEdits | null;
|
|
62
|
+
onFrame?: SplatMeshOptions["onFrame"];
|
|
63
|
+
version: number;
|
|
64
|
+
sortVersion: number;
|
|
65
|
+
centerVersion: number;
|
|
66
|
+
mappingVersion: number;
|
|
67
|
+
private lastSplats?;
|
|
68
|
+
private lastNumSplats;
|
|
69
|
+
private lastMaxSh;
|
|
70
|
+
private lastMatrixWorld;
|
|
71
|
+
private hasLastMatrixWorld;
|
|
72
|
+
private lastRecolor;
|
|
73
|
+
private sdfCoordinateOrigin;
|
|
74
|
+
constructor(options?: SplatMeshOptions);
|
|
75
|
+
forEachSplat(
|
|
76
|
+
callback: (
|
|
77
|
+
index: number,
|
|
78
|
+
center: THREE.Vector3,
|
|
79
|
+
scales: THREE.Vector3,
|
|
80
|
+
quaternion: THREE.Quaternion,
|
|
81
|
+
opacity: number,
|
|
82
|
+
color: THREE.Color,
|
|
83
|
+
) => void,
|
|
84
|
+
): void;
|
|
85
|
+
dispose(): void;
|
|
86
|
+
/** Copy cached local bounds; false includes scale/rotation and shape at source alpha 0.01. */
|
|
87
|
+
getBoundingBox(centersOnly?: boolean, target?: THREE.Box3): THREE.Box3;
|
|
88
|
+
frameUpdate(
|
|
89
|
+
{ time, deltaTime, globalEdits, shrinkResources }: SplatMeshFrameContext,
|
|
90
|
+
callbacks?: boolean,
|
|
91
|
+
): void;
|
|
92
|
+
/** Edits applying to this mesh, in order, each with its SDF shapes. */
|
|
93
|
+
private collectEditGroups;
|
|
94
|
+
updateVersion({
|
|
95
|
+
sort,
|
|
96
|
+
}?: {
|
|
97
|
+
sort?: boolean;
|
|
98
|
+
}): void;
|
|
99
|
+
updateMappingVersion(): void;
|
|
100
|
+
set needsUpdate(value: boolean);
|
|
101
|
+
raycast(raycaster: THREE.Raycaster, intersects: THREE.Intersection[]): void;
|
|
80
102
|
}
|
|
@@ -1,80 +1,102 @@
|
|
|
1
|
-
import { Splats } from '../data/Splats';
|
|
2
|
-
import { SplatFileType } from '../data/defines';
|
|
3
|
-
import { SplatFileResolver, SplatProgressEvent } from '../loaders/loadTypes';
|
|
4
|
-
import { SplatPostDecodeProgram } from '../loaders/postDecode/program';
|
|
5
|
-
import { SplatEdit, SplatEdits } from './SplatEdit';
|
|
6
1
|
import * as THREE from "three";
|
|
2
|
+
import type { Splats } from "../data/Splats.js";
|
|
3
|
+
import type { SplatFileType } from "../data/defines.js";
|
|
4
|
+
import type {
|
|
5
|
+
SplatFileResolver,
|
|
6
|
+
SplatProgressEvent,
|
|
7
|
+
} from "../loaders/loadTypes.js";
|
|
8
|
+
import type { SplatPostDecodeProgram } from "../loaders/postDecode/program.js";
|
|
9
|
+
import type { SplatEdit, SplatEdits } from "./SplatEdit.js";
|
|
7
10
|
export type SplatMeshOptions = {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
time: number;
|
|
25
|
-
deltaTime: number;
|
|
26
|
-
}) => void;
|
|
27
|
-
};
|
|
28
|
-
export type SplatMeshFrameContext = {
|
|
11
|
+
url?: string;
|
|
12
|
+
file?: Blob;
|
|
13
|
+
fileBytes?: Uint8Array | ArrayBuffer;
|
|
14
|
+
fileType?: SplatFileType;
|
|
15
|
+
fileName?: string;
|
|
16
|
+
resolveFile?: SplatFileResolver;
|
|
17
|
+
/** Declarative per-splat transform executed in the decode worker. */
|
|
18
|
+
postDecode?: SplatPostDecodeProgram;
|
|
19
|
+
splats?: Splats;
|
|
20
|
+
onProgress?: (event: SplatProgressEvent) => void;
|
|
21
|
+
onLoad?: (mesh: SplatMesh) => Promise<void> | void;
|
|
22
|
+
editable?: boolean;
|
|
23
|
+
raycastable?: boolean;
|
|
24
|
+
minRaycastOpacity?: number;
|
|
25
|
+
onFrame?: (context: {
|
|
26
|
+
mesh: SplatMesh;
|
|
29
27
|
time: number;
|
|
30
28
|
deltaTime: number;
|
|
31
|
-
|
|
29
|
+
}) => void;
|
|
30
|
+
};
|
|
31
|
+
export type SplatMeshFrameContext = {
|
|
32
|
+
time: number;
|
|
33
|
+
deltaTime: number;
|
|
34
|
+
globalEdits: SplatEdit[];
|
|
35
|
+
/** Compact SDF edit storage during an explicit renderer shrink. */
|
|
36
|
+
shrinkResources?: boolean;
|
|
32
37
|
};
|
|
33
38
|
export type SplatIntersection = THREE.Intersection<SplatMesh> & {
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
39
|
+
/** Current readable index in this mesh's Splats. */
|
|
40
|
+
index: number;
|
|
41
|
+
/** Original file index; for streamed SOG, relative to this batch's chunk. */
|
|
42
|
+
sourceIndex: number;
|
|
38
43
|
};
|
|
39
44
|
/** A scene object backed by a fixed encoded splat source and RGBA SDF edits. */
|
|
40
45
|
export declare class SplatMesh extends THREE.Object3D {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
46
|
+
private lastInitialization?;
|
|
47
|
+
private readiness;
|
|
48
|
+
private onLoad?;
|
|
49
|
+
get isInitialized(): boolean;
|
|
50
|
+
get initialized(): Promise<SplatMesh>;
|
|
51
|
+
private followInitialization;
|
|
52
|
+
splats?: Splats;
|
|
53
|
+
numSplats: number;
|
|
54
|
+
recolor: THREE.Color;
|
|
55
|
+
opacity: number;
|
|
56
|
+
maxSh: number;
|
|
57
|
+
edits: SplatEdit[] | null;
|
|
58
|
+
editable: boolean;
|
|
59
|
+
raycastable: boolean;
|
|
60
|
+
minRaycastOpacity: number;
|
|
61
|
+
sdfEdits: SplatEdits | null;
|
|
62
|
+
onFrame?: SplatMeshOptions["onFrame"];
|
|
63
|
+
version: number;
|
|
64
|
+
sortVersion: number;
|
|
65
|
+
centerVersion: number;
|
|
66
|
+
mappingVersion: number;
|
|
67
|
+
private lastSplats?;
|
|
68
|
+
private lastNumSplats;
|
|
69
|
+
private lastMaxSh;
|
|
70
|
+
private lastMatrixWorld;
|
|
71
|
+
private hasLastMatrixWorld;
|
|
72
|
+
private lastRecolor;
|
|
73
|
+
private sdfCoordinateOrigin;
|
|
74
|
+
constructor(options?: SplatMeshOptions);
|
|
75
|
+
forEachSplat(
|
|
76
|
+
callback: (
|
|
77
|
+
index: number,
|
|
78
|
+
center: THREE.Vector3,
|
|
79
|
+
scales: THREE.Vector3,
|
|
80
|
+
quaternion: THREE.Quaternion,
|
|
81
|
+
opacity: number,
|
|
82
|
+
color: THREE.Color,
|
|
83
|
+
) => void,
|
|
84
|
+
): void;
|
|
85
|
+
dispose(): void;
|
|
86
|
+
/** Copy cached local bounds; false includes scale/rotation and shape at source alpha 0.01. */
|
|
87
|
+
getBoundingBox(centersOnly?: boolean, target?: THREE.Box3): THREE.Box3;
|
|
88
|
+
frameUpdate(
|
|
89
|
+
{ time, deltaTime, globalEdits, shrinkResources }: SplatMeshFrameContext,
|
|
90
|
+
callbacks?: boolean,
|
|
91
|
+
): void;
|
|
92
|
+
/** Edits applying to this mesh, in order, each with its SDF shapes. */
|
|
93
|
+
private collectEditGroups;
|
|
94
|
+
updateVersion({
|
|
95
|
+
sort,
|
|
96
|
+
}?: {
|
|
97
|
+
sort?: boolean;
|
|
98
|
+
}): void;
|
|
99
|
+
updateMappingVersion(): void;
|
|
100
|
+
set needsUpdate(value: boolean);
|
|
101
|
+
raycast(raycaster: THREE.Raycaster, intersects: THREE.Intersection[]): void;
|
|
80
102
|
}
|
|
@@ -1,7 +1,15 @@
|
|
|
1
|
-
export { encodeQuatOctXy1010R12 } from
|
|
2
|
-
export { getTextureSize } from
|
|
3
|
-
export { decodeQuatOctXy1010R12, decodeSplat } from
|
|
4
|
-
export {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
1
|
+
export { encodeQuatOctXy1010R12 } from "../data/splatCodec.cjs";
|
|
2
|
+
export { getTextureSize } from "../data/textureLayout.cjs";
|
|
3
|
+
export { decodeQuatOctXy1010R12, decodeSplat } from "../data/unpack.cjs";
|
|
4
|
+
export {
|
|
5
|
+
IDENT_VERTEX_SHADER,
|
|
6
|
+
uploadU32DataTextureRows,
|
|
7
|
+
} from "../rendering/webgl/textureUtils.cjs";
|
|
8
|
+
export { getTransferable } from "../runtime/transferable.cjs";
|
|
9
|
+
export {
|
|
10
|
+
floatBitsToUint,
|
|
11
|
+
fromHalf,
|
|
12
|
+
toHalf,
|
|
13
|
+
uintBitsToFloat,
|
|
14
|
+
} from "./numeric.cjs";
|
|
15
|
+
export { resolveTimer, threeRevision } from "./three.cjs";
|
|
@@ -1,7 +1,15 @@
|
|
|
1
|
-
export { encodeQuatOctXy1010R12 } from
|
|
2
|
-
export { getTextureSize } from
|
|
3
|
-
export { decodeQuatOctXy1010R12, decodeSplat } from
|
|
4
|
-
export {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
1
|
+
export { encodeQuatOctXy1010R12 } from "../data/splatCodec.js";
|
|
2
|
+
export { getTextureSize } from "../data/textureLayout.js";
|
|
3
|
+
export { decodeQuatOctXy1010R12, decodeSplat } from "../data/unpack.js";
|
|
4
|
+
export {
|
|
5
|
+
IDENT_VERTEX_SHADER,
|
|
6
|
+
uploadU32DataTextureRows,
|
|
7
|
+
} from "../rendering/webgl/textureUtils.js";
|
|
8
|
+
export { getTransferable } from "../runtime/transferable.js";
|
|
9
|
+
export {
|
|
10
|
+
floatBitsToUint,
|
|
11
|
+
fromHalf,
|
|
12
|
+
toHalf,
|
|
13
|
+
uintBitsToFloat,
|
|
14
|
+
} from "./numeric.js";
|
|
15
|
+
export { resolveTimer, threeRevision } from "./three.js";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import * as THREE from "three";
|
|
1
|
+
import type * as THREE from "three";
|
|
2
2
|
export declare function resolveTimer(timer?: THREE.Timer): {
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
timer: THREE.Timer;
|
|
4
|
+
ownsTimer: boolean;
|
|
5
5
|
};
|
|
6
6
|
export declare const threeRevision: number;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import * as THREE from "three";
|
|
1
|
+
import type * as THREE from "three";
|
|
2
2
|
export declare function resolveTimer(timer?: THREE.Timer): {
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
timer: THREE.Timer;
|
|
4
|
+
ownsTimer: boolean;
|
|
5
5
|
};
|
|
6
6
|
export declare const threeRevision: number;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import * as THREE from "three";
|
|
1
|
+
import type * as THREE from "three";
|
|
2
2
|
/**
|
|
3
3
|
* Extracts the positive per-axis scale and approximate rotation used by the
|
|
4
4
|
* PlayCanvas-style splat work-buffer transform.
|
|
@@ -7,7 +7,11 @@ import * as THREE from "three";
|
|
|
7
7
|
* zero. When possible, the missing basis axis is reconstructed from the other
|
|
8
8
|
* two so degenerate transforms retain a stable orientation.
|
|
9
9
|
*/
|
|
10
|
-
export declare function decomposeSplatTransform(
|
|
10
|
+
export declare function decomposeSplatTransform(
|
|
11
|
+
matrix: THREE.Matrix4,
|
|
12
|
+
scale: THREE.Vector3,
|
|
13
|
+
rotation: THREE.Quaternion,
|
|
14
|
+
): boolean;
|
|
11
15
|
/**
|
|
12
16
|
* Re-expresses an affine transform so it consumes positions relative to
|
|
13
17
|
* `origin` instead of absolute world positions.
|
|
@@ -16,4 +20,7 @@ export declare function decomposeSplatTransform(matrix: THREE.Matrix4, scale: TH
|
|
|
16
20
|
* A * (p - origin) + (A * origin + t), which is the same result without doing
|
|
17
21
|
* a large-coordinate subtraction in float32 shader code.
|
|
18
22
|
*/
|
|
19
|
-
export declare function rebaseAffineTransform(
|
|
23
|
+
export declare function rebaseAffineTransform(
|
|
24
|
+
matrix: THREE.Matrix4,
|
|
25
|
+
origin: THREE.Vector3,
|
|
26
|
+
): THREE.Matrix4;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import * as THREE from "three";
|
|
1
|
+
import type * as THREE from "three";
|
|
2
2
|
/**
|
|
3
3
|
* Extracts the positive per-axis scale and approximate rotation used by the
|
|
4
4
|
* PlayCanvas-style splat work-buffer transform.
|
|
@@ -7,7 +7,11 @@ import * as THREE from "three";
|
|
|
7
7
|
* zero. When possible, the missing basis axis is reconstructed from the other
|
|
8
8
|
* two so degenerate transforms retain a stable orientation.
|
|
9
9
|
*/
|
|
10
|
-
export declare function decomposeSplatTransform(
|
|
10
|
+
export declare function decomposeSplatTransform(
|
|
11
|
+
matrix: THREE.Matrix4,
|
|
12
|
+
scale: THREE.Vector3,
|
|
13
|
+
rotation: THREE.Quaternion,
|
|
14
|
+
): boolean;
|
|
11
15
|
/**
|
|
12
16
|
* Re-expresses an affine transform so it consumes positions relative to
|
|
13
17
|
* `origin` instead of absolute world positions.
|
|
@@ -16,4 +20,7 @@ export declare function decomposeSplatTransform(matrix: THREE.Matrix4, scale: TH
|
|
|
16
20
|
* A * (p - origin) + (A * origin + t), which is the same result without doing
|
|
17
21
|
* a large-coordinate subtraction in float32 shader code.
|
|
18
22
|
*/
|
|
19
|
-
export declare function rebaseAffineTransform(
|
|
23
|
+
export declare function rebaseAffineTransform(
|
|
24
|
+
matrix: THREE.Matrix4,
|
|
25
|
+
origin: THREE.Vector3,
|
|
26
|
+
): THREE.Matrix4;
|
|
@@ -69,13 +69,15 @@ See [Stochastic rendering](StochasticRendering.md) for setup.
|
|
|
69
69
|
| API | Description |
|
|
70
70
|
| --- | --- |
|
|
71
71
|
| `update({ scene, camera })` | Bring the Splats up to date with the scene and camera; returns a promise. Only needed with `autoUpdate = false` |
|
|
72
|
-
| `shrinkResources({ scene, camera })` | Update, then release memory that is no longer needed, for example after removing
|
|
72
|
+
| `shrinkResources({ scene, camera })` | Update, then release memory that is no longer needed, for example after removing models or SDF edits; returns a promise |
|
|
73
73
|
| `clearSplats()` | Clear the Splats from the display without removing models from the scene |
|
|
74
74
|
| `dispose()` | Release this renderer's resources |
|
|
75
75
|
| `stochasticActive` | Read-only. Whether stochastic rendering is currently being drawn; it changes shortly after you set `stochastic` |
|
|
76
76
|
| `stochasticSample` | Noise pattern index, `0` by default. Set `autoAdvanceStochasticSample = false` to control it yourself |
|
|
77
77
|
| `synchronousSort` | Read-only. `true` when Splats are always sorted before they are drawn, as on native WebGPU |
|
|
78
78
|
|
|
79
|
+
Custom settings on `splatRenderer.material` are preserved when switching between sorted and stochastic rendering.
|
|
80
|
+
|
|
79
81
|
To update manually after the scene or camera changes:
|
|
80
82
|
|
|
81
83
|
```js
|