@voluma/vlam 0.2.4 → 0.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -4
- package/dist/chunk-loader-DlNwggfG.js +1859 -0
- package/dist/chunk-loader-DlNwggfG.js.map +1 -0
- package/dist/{compute-sorter.d.ts → core/compute-sorter.d.ts} +1 -1
- package/dist/core/index.d.ts +45 -0
- package/dist/{splat-scene.d.ts → core/merged-splat-mesh.d.ts} +14 -15
- package/dist/{orientation.d.ts → core/orientation.d.ts} +7 -7
- package/dist/{relighting.d.ts → core/relighting.d.ts} +1 -1
- package/dist/{source-transform.d.ts → core/source-transform.d.ts} +4 -4
- package/dist/{splat-budget.d.ts → core/splat-budget.d.ts} +2 -2
- package/dist/{splat-data.d.ts → core/splat-data.d.ts} +4 -4
- package/dist/{splat-mesh-material.d.ts → core/splat-mesh-material.d.ts} +2 -2
- package/dist/{splat-mesh-types.d.ts → core/splat-mesh-types.d.ts} +19 -10
- package/dist/{splat-mesh.d.ts → core/splat-mesh.d.ts} +4 -4
- package/dist/{splat-modifier.d.ts → core/splat-modifier.d.ts} +5 -5
- package/dist/{webgpu-limits.d.ts → core/webgpu-limits.d.ts} +0 -59
- package/dist/{effects.d.ts → effects/index.d.ts} +14 -13
- package/dist/effects.js.map +1 -1
- package/dist/formats/ksplat/index.d.ts +1 -1
- package/dist/formats/ksplat/parse-ksplat.d.ts +1 -1
- package/dist/formats/ksplat.js.map +1 -1
- package/dist/formats/lcc/collision-mesh.d.ts +3 -3
- package/dist/formats/lcc/collision-partition.d.ts +1 -1
- package/dist/formats/lcc/lcc.d.ts +3 -3
- package/dist/formats/lcc/lcc2.d.ts +2 -2
- package/dist/formats/lcc/parse-lcc.d.ts +1 -1
- package/dist/formats/lcc.js +17 -16
- package/dist/formats/lcc.js.map +1 -1
- package/dist/formats/ply/index.d.ts +1 -1
- package/dist/formats/ply/parse-compressed-ply.d.ts +2 -2
- package/dist/formats/ply/parse-splat-ply.d.ts +4 -4
- package/dist/formats/ply.js +1 -1
- package/dist/formats/ply.js.map +1 -1
- package/dist/formats/rad/frontier-worker-protocol.d.ts +8 -1
- package/dist/formats/rad/index.d.ts +2 -2
- package/dist/formats/rad/parse-rad.d.ts +2 -2
- package/dist/formats/rad/rad-foveated-source.d.ts +3 -3
- package/dist/formats/rad/rad.d.ts +7 -7
- package/dist/formats/rad.js +3 -3
- package/dist/formats/rad.js.map +1 -1
- package/dist/formats/sog/index.d.ts +1 -1
- package/dist/formats/sog/parse-sog.d.ts +6 -6
- package/dist/formats/sog.js.map +1 -1
- package/dist/formats/splat/index.d.ts +1 -1
- package/dist/formats/splat/parse-splat.d.ts +1 -1
- package/dist/formats/splat.js.map +1 -1
- package/dist/formats/spz/index.d.ts +1 -1
- package/dist/formats/spz/parse-spz.d.ts +1 -1
- package/dist/formats/spz.js.map +1 -1
- package/dist/half-float-Cs4FDq8Q.js.map +1 -1
- package/dist/index.js +253 -9047
- package/dist/index.js.map +1 -1
- package/dist/{chunk-loader.d.ts → loaders/chunk-loader.d.ts} +4 -4
- package/dist/loaders/index.d.ts +15 -0
- package/dist/{load-scene.d.ts → loaders/load-splat-data.d.ts} +16 -14
- package/dist/{load-worker-protocol.d.ts → loaders/load-worker-protocol.d.ts} +2 -2
- package/dist/{loading.d.ts → loaders/loading.d.ts} +8 -8
- package/dist/loaders.js +26 -0
- package/dist/loaders.js.map +1 -0
- package/dist/loading-wLo8vRbA.js.map +1 -1
- package/dist/{splat-mesh-types-CTN_duw2.js → lod-scheduler-B0a_uBlv.js} +133 -140
- package/dist/lod-scheduler-B0a_uBlv.js.map +1 -0
- package/dist/logging-BfPdd7NJ.js.map +1 -1
- package/dist/{ply-header-BwgExCn-.js → ply-header-B9WllbPg.js} +3 -3
- package/dist/ply-header-B9WllbPg.js.map +1 -0
- package/dist/radix-sorter-BrbUg_CV.js +178 -0
- package/dist/radix-sorter-BrbUg_CV.js.map +1 -0
- package/dist/relighting-Tiwep8yd.js +977 -0
- package/dist/relighting-Tiwep8yd.js.map +1 -0
- package/dist/selection/index.d.ts +13 -0
- package/dist/{selection-volume.d.ts → selection/selection-volume.d.ts} +1 -1
- package/dist/{splat-partition.d.ts → selection/splat-partition.d.ts} +2 -2
- package/dist/selection.js +137 -0
- package/dist/selection.js.map +1 -0
- package/dist/sh-pack-D5wAe5gg.js.map +1 -1
- package/dist/{splat-budget-DXew_86c.js → splat-budget-DuVZspPQ.js} +7 -7
- package/dist/splat-budget-DuVZspPQ.js.map +1 -0
- package/dist/splat-data-BZM5dhhx.js.map +1 -1
- package/dist/splat-mesh-CsLOQb08.js +1942 -0
- package/dist/splat-mesh-CsLOQb08.js.map +1 -0
- package/dist/splat-mesh-types-BZIko-_9.js +18 -0
- package/dist/splat-mesh-types-BZIko-_9.js.map +1 -0
- package/dist/static-lod/index.d.ts +12 -0
- package/dist/{static-lod-splat-mesh.d.ts → static-lod/static-lod-splat-mesh.d.ts} +3 -3
- package/dist/{static-lod-worker-protocol.d.ts → static-lod/static-lod-worker-protocol.d.ts} +1 -1
- package/dist/{static-lod.d.ts → static-lod/static-lod.d.ts} +1 -1
- package/dist/{static-lod-worker-D2fyqQZO.js → static-lod-worker-DktKnJkR.js} +46 -46
- package/dist/{static-lod-worker-D2fyqQZO.js.map → static-lod-worker-DktKnJkR.js.map} +1 -1
- package/dist/static-lod.js +148 -0
- package/dist/static-lod.js.map +1 -0
- package/dist/{budget-governor.d.ts → streaming/budget-governor.d.ts} +4 -4
- package/dist/{camera-budget-governor.d.ts → streaming/camera-budget-governor.d.ts} +11 -11
- package/dist/{chunk-cache-budget.d.ts → streaming/chunk-cache-budget.d.ts} +5 -5
- package/dist/{chunk-fetch-scheduler.d.ts → streaming/chunk-fetch-scheduler.d.ts} +4 -4
- package/dist/{dataset-source.d.ts → streaming/dataset-source.d.ts} +1 -1
- package/dist/streaming/index.d.ts +23 -0
- package/dist/{lod-scheduler.d.ts → streaming/lod-scheduler.d.ts} +1 -1
- package/dist/{lod-source.d.ts → streaming/lod-source.d.ts} +9 -9
- package/dist/{streamed-splat-mesh-utils.d.ts → streaming/streamed-splat-mesh-utils.d.ts} +2 -2
- package/dist/{streamed-splat-mesh.d.ts → streaming/streamed-splat-mesh.d.ts} +66 -32
- package/dist/streaming.js +2911 -0
- package/dist/streaming.js.map +1 -0
- package/dist/unified/index.d.ts +11 -0
- package/dist/{unified-splat-renderer.d.ts → unified/unified-splat-mesh.d.ts} +23 -16
- package/dist/unified/unified-work-buffer.d.ts +66 -0
- package/dist/{work-buffer-gather.d.ts → unified/work-buffer-gather.d.ts} +6 -6
- package/dist/{work-buffer-material.d.ts → unified/work-buffer-material.d.ts} +1 -1
- package/dist/unified.js +746 -0
- package/dist/unified.js.map +1 -0
- package/dist/webgpu-limits-Y3CI_6_6.js +43 -0
- package/dist/webgpu-limits-Y3CI_6_6.js.map +1 -0
- package/package.json +27 -7
- package/dist/index.d.ts +0 -54
- package/dist/ply-header-BwgExCn-.js.map +0 -1
- package/dist/splat-budget-DXew_86c.js.map +0 -1
- package/dist/splat-mesh-types-CTN_duw2.js.map +0 -1
- /package/dist/{create-splat-renderer.d.ts → core/create-splat-renderer.d.ts} +0 -0
- /package/dist/{depth-of-field.d.ts → core/depth-of-field.d.ts} +0 -0
- /package/dist/{half-float.d.ts → core/half-float.d.ts} +0 -0
- /package/dist/{logging.d.ts → core/logging.d.ts} +0 -0
- /package/dist/{radix-sort.d.ts → core/radix-sort.d.ts} +0 -0
- /package/dist/{radix-sorter.d.ts → core/radix-sorter.d.ts} +0 -0
- /package/dist/{relighting-pass.d.ts → core/relighting-pass.d.ts} +0 -0
- /package/dist/{sh-pack.d.ts → core/sh-pack.d.ts} +0 -0
- /package/dist/{sort-scheduler.d.ts → core/sort-scheduler.d.ts} +0 -0
- /package/dist/{sort-worker-protocol.d.ts → core/sort-worker-protocol.d.ts} +0 -0
- /package/dist/{sorter.d.ts → core/sorter.d.ts} +0 -0
- /package/dist/{splat-depth-pack.d.ts → core/splat-depth-pack.d.ts} +0 -0
- /package/dist/{splat-mesh-picking.d.ts → core/splat-mesh-picking.d.ts} +0 -0
- /package/dist/{splat-mesh-pool.d.ts → core/splat-mesh-pool.d.ts} +0 -0
- /package/dist/{splat-modifier-stack.d.ts → core/splat-modifier-stack.d.ts} +0 -0
- /package/dist/{splat-query.d.ts → core/splat-query.d.ts} +0 -0
- /package/dist/{splat-sort-bounds.d.ts → core/splat-sort-bounds.d.ts} +0 -0
- /package/dist/{storage-attribute-mirror.d.ts → core/storage-attribute-mirror.d.ts} +0 -0
- /package/dist/{worker-sorter.d.ts → core/worker-sorter.d.ts} +0 -0
- /package/dist/{xr-view.d.ts → core/xr-view.d.ts} +0 -0
- /package/dist/{ply-header.d.ts → loaders/ply-header.d.ts} +0 -0
- /package/dist/{lod-manifest.d.ts → streaming/lod-manifest.d.ts} +0 -0
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `@voluma/vlam/unified` - one WebGPU draw over several splat sources.
|
|
3
|
+
*
|
|
4
|
+
* {@link UnifiedSplatMesh} concatenates static and streamed meshes into a
|
|
5
|
+
* shared work buffer so overlapping clouds inter-sort. WebGL2 is unsupported;
|
|
6
|
+
* {@link supportsUnifiedSplatMesh} reports that after renderer init.
|
|
7
|
+
*
|
|
8
|
+
* @module unified
|
|
9
|
+
*/
|
|
10
|
+
export { UnifiedSplatMesh, supportsUnifiedSplatMesh, type UnifiedSplatPickResult, type UnifiedSplatMeshOptions, type UnifiedSplatSourceOptions, } from './unified-splat-mesh';
|
|
11
|
+
export { estimateLargestStorageBufferBytes, estimateUnifiedWorkBufferBytes, estimateUnifiedWorkBufferPeakBytes, WORK_BUFFER_CENTERS_BYTES_PER_SPLAT, WORK_BUFFER_BYTES_PER_SLOT, } from './unified-work-buffer';
|
|
@@ -1,18 +1,19 @@
|
|
|
1
1
|
import * as THREE from 'three/webgpu';
|
|
2
|
-
import { type DepthOfFieldSettings } from '
|
|
3
|
-
import { type RelightingSettings, type RelightingUniforms } from '
|
|
4
|
-
import { SplatMesh } from '
|
|
5
|
-
import type { SplatPickOptions, SplatPickResult } from '
|
|
6
|
-
/** Registration settings for one source in a {@link
|
|
2
|
+
import { type DepthOfFieldSettings } from '../core/depth-of-field';
|
|
3
|
+
import { type RelightingSettings, type RelightingUniforms } from '../core/relighting';
|
|
4
|
+
import { SplatMesh } from '../core/splat-mesh';
|
|
5
|
+
import type { SplatPickOptions, SplatPickResult } from '../core/splat-mesh';
|
|
6
|
+
/** Registration settings for one source in a {@link UnifiedSplatMesh}. */
|
|
7
7
|
export interface UnifiedSplatSourceOptions {
|
|
8
|
-
/** Whole-source opacity applied after
|
|
8
|
+
/** Whole-source display opacity applied after gather falloff. Defaults to `1`.
|
|
9
|
+
* Does not change RAD LOD classification or splat shape. */
|
|
9
10
|
opacity?: number;
|
|
10
11
|
/** Whether this source contributes to the unified draw. Defaults to `true`. */
|
|
11
12
|
visible?: boolean;
|
|
12
13
|
/** Higher values survive a fixed work-buffer overflow first. Defaults to `0`. */
|
|
13
14
|
priority?: number;
|
|
14
15
|
/**
|
|
15
|
-
* Cache a modifier-bearing source until {@link
|
|
16
|
+
* Cache a modifier-bearing source until {@link UnifiedSplatMesh.invalidateSource}
|
|
16
17
|
* is called. Defaults to `false`, which safely re-gathers live modifier
|
|
17
18
|
* uniforms every frame.
|
|
18
19
|
*
|
|
@@ -23,7 +24,7 @@ export interface UnifiedSplatSourceOptions {
|
|
|
23
24
|
cacheModifiers?: boolean;
|
|
24
25
|
}
|
|
25
26
|
/**
|
|
26
|
-
* Result of a successful {@link
|
|
27
|
+
* Result of a successful {@link UnifiedSplatMesh.pick}: the frontmost hit
|
|
27
28
|
* across every visible registered source, tagged with the source it landed on.
|
|
28
29
|
*/
|
|
29
30
|
export interface UnifiedSplatPickResult extends SplatPickResult {
|
|
@@ -35,7 +36,7 @@ export interface UnifiedSplatPickResult extends SplatPickResult {
|
|
|
35
36
|
*
|
|
36
37
|
* @experimental May change in a minor release.
|
|
37
38
|
*/
|
|
38
|
-
export interface
|
|
39
|
+
export interface UnifiedSplatMeshOptions {
|
|
39
40
|
/** Composite source colors in display (sRGB) space. Defaults to `false`. */
|
|
40
41
|
srgbOutput?: boolean;
|
|
41
42
|
/**
|
|
@@ -49,11 +50,11 @@ export interface UnifiedSplatRendererOptions {
|
|
|
49
50
|
sortStrategy?: 'counting' | 'exact';
|
|
50
51
|
}
|
|
51
52
|
/**
|
|
52
|
-
* Returns true when `renderer` can drive {@link
|
|
53
|
+
* Returns true when `renderer` can drive {@link UnifiedSplatMesh}.
|
|
53
54
|
* Heterogeneous gather/sort/draw is WebGPU-only; WebGL2 hosts keep standalone
|
|
54
|
-
* `SplatMesh` draws or static {@link
|
|
55
|
+
* `SplatMesh` draws or static {@link MergedSplatMesh}.
|
|
55
56
|
*/
|
|
56
|
-
export declare function
|
|
57
|
+
export declare function supportsUnifiedSplatMesh(renderer: object): boolean;
|
|
57
58
|
/**
|
|
58
59
|
* One gather → global-sort → draw path for static and streamed splat sources.
|
|
59
60
|
* Sources retain their own residency and update lifecycle; this mesh gathers
|
|
@@ -63,11 +64,11 @@ export declare function supportsUnifiedSplatRenderer(renderer: object): boolean;
|
|
|
63
64
|
* registered source mesh instead - sorter bounds and the draw material both
|
|
64
65
|
* consume world-space centers written by gather.
|
|
65
66
|
*
|
|
66
|
-
* WebGPU only. Prefer {@link
|
|
67
|
+
* WebGPU only. Prefer {@link supportsUnifiedSplatMesh} before construction.
|
|
67
68
|
*
|
|
68
69
|
* @experimental May change in a minor release.
|
|
69
70
|
*/
|
|
70
|
-
export declare class
|
|
71
|
+
export declare class UnifiedSplatMesh extends THREE.Mesh {
|
|
71
72
|
private readonly workBuffer;
|
|
72
73
|
private readonly workSourceIndex;
|
|
73
74
|
/** The sorted draw-order buffer; lives outside the geometry, freed on dispose. */
|
|
@@ -131,7 +132,7 @@ export declare class UnifiedSplatRenderer extends THREE.Mesh {
|
|
|
131
132
|
private overflowedSourceCount;
|
|
132
133
|
private overflowedSplatCount;
|
|
133
134
|
private disposed;
|
|
134
|
-
constructor(renderer: THREE.WebGPURenderer, capacity: number, options?:
|
|
135
|
+
constructor(renderer: THREE.WebGPURenderer, capacity: number, options?: UnifiedSplatMeshOptions);
|
|
135
136
|
/** Fixed work-buffer splat capacity chosen at construction. */
|
|
136
137
|
get capacity(): number;
|
|
137
138
|
/** Registers a source. The caller keeps ownership and may still query it. */
|
|
@@ -149,7 +150,13 @@ export declare class UnifiedSplatRenderer extends THREE.Mesh {
|
|
|
149
150
|
get droppedSourceCount(): number;
|
|
150
151
|
/** Number of active splats omitted in the most recent update due to capacity. */
|
|
151
152
|
get droppedSplatCount(): number;
|
|
152
|
-
/**
|
|
153
|
+
/**
|
|
154
|
+
* Sets whole-source display opacity without rebuilding the gather pipeline.
|
|
155
|
+
*
|
|
156
|
+
* This scales the completed fragment after RAD merged-vs-leaf classification
|
|
157
|
+
* and falloff. It must never alter LOD selection or splat shape; hosts such as
|
|
158
|
+
* marker crossfades rely on that. Values `<= 0` skip drawing the source.
|
|
159
|
+
*/
|
|
153
160
|
setSourceOpacity(source: SplatMesh, opacity: number): void;
|
|
154
161
|
/** Shows or hides a source without changing its residency. */
|
|
155
162
|
setSourceVisible(source: SplatMesh, visible: boolean): void;
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Byte costs of {@link UnifiedSplatMesh}'s GPU work buffer.
|
|
3
|
+
*
|
|
4
|
+
* Kept off the core entry so hosts that never composite sources do not pay
|
|
5
|
+
* for the accounting, and so the numbers cannot drift from the renderer
|
|
6
|
+
* that allocates those buffers.
|
|
7
|
+
*/
|
|
8
|
+
/** Bytes per splat in the largest unified work-buffer attribute (RGBA32F centers). */
|
|
9
|
+
export declare const WORK_BUFFER_CENTERS_BYTES_PER_SPLAT = 16;
|
|
10
|
+
/**
|
|
11
|
+
* Bytes per work-buffer slot across *all* of its attributes: centers, colors,
|
|
12
|
+
* covarianceA and covarianceB at RGBA32F (16 each), plus the isotropic mix and
|
|
13
|
+
* screen-radius scalars (4 each).
|
|
14
|
+
*/
|
|
15
|
+
export declare const WORK_BUFFER_BYTES_PER_SLOT: number;
|
|
16
|
+
/**
|
|
17
|
+
* Byte size of the largest single storage-buffer bind VLAM allocates for a
|
|
18
|
+
* given splat capacity (unified work-buffer centers: `capacity × 16`).
|
|
19
|
+
*
|
|
20
|
+
* Use with adapter/device limits to decide whether to raise `requiredLimits`
|
|
21
|
+
* or lower the budget before constructing {@link UnifiedSplatMesh}.
|
|
22
|
+
*/
|
|
23
|
+
export declare function estimateLargestStorageBufferBytes(capacity: number): number;
|
|
24
|
+
/**
|
|
25
|
+
* Estimates what a {@link UnifiedSplatMesh}'s work buffer costs, in bytes,
|
|
26
|
+
* once the scene has rendered a frame.
|
|
27
|
+
*
|
|
28
|
+
* This used to be double the figure below, and the doubling was not a detail.
|
|
29
|
+
* Every `THREE.StorageBufferAttribute` is constructed around a JS typed array,
|
|
30
|
+
* and three's WebGPU backend never releases it: the
|
|
31
|
+
* `attribute.onUploadCallback()` call that would is missing from the backend's
|
|
32
|
+
* buffer upload path. So a work buffer of N slots cost
|
|
33
|
+
* N × {@link WORK_BUFFER_BYTES_PER_SLOT} on the GPU *and* the same again on the
|
|
34
|
+
* JS heap, permanently, even though nothing ever reads the CPU copy back - the
|
|
35
|
+
* gather pass writes these buffers entirely on the GPU.
|
|
36
|
+
*
|
|
37
|
+
* `WorkBuffer.releaseCpuMirrors` now drops those mirrors after the first
|
|
38
|
+
* dispatch that uploads them (see `storage-attribute-mirror`), so steady state
|
|
39
|
+
* is the GPU side alone. The *peak* is still double - the array has to exist
|
|
40
|
+
* for the upload copy - which is what
|
|
41
|
+
* {@link estimateUnifiedWorkBufferPeakBytes} reports.
|
|
42
|
+
*
|
|
43
|
+
* Either figure is invisible to `estimateSplatPoolBytes`, which prices the
|
|
44
|
+
* splat *pool* and knows nothing about the unified renderer's scratch space. A
|
|
45
|
+
* host sizing a scene for a memory-constrained device wants both.
|
|
46
|
+
*
|
|
47
|
+
* @param capacity - Work-buffer capacity in splats.
|
|
48
|
+
* @returns Estimated steady-state bytes.
|
|
49
|
+
* @throws {RangeError} if `capacity` is not a non-negative finite number.
|
|
50
|
+
*/
|
|
51
|
+
export declare function estimateUnifiedWorkBufferBytes(capacity: number): number;
|
|
52
|
+
/**
|
|
53
|
+
* Peak bytes a {@link UnifiedSplatMesh}'s work buffer occupies: the window
|
|
54
|
+
* between construction and the first dispatch, while the GPU buffer and the JS
|
|
55
|
+
* array three copied it from are both alive.
|
|
56
|
+
*
|
|
57
|
+
* Ask this one when the question is "will allocating this scene succeed" - an
|
|
58
|
+
* out-of-memory failure happens against the peak. Ask
|
|
59
|
+
* {@link estimateUnifiedWorkBufferBytes} when the question is "what will this
|
|
60
|
+
* scene hold once it is up".
|
|
61
|
+
*
|
|
62
|
+
* @param capacity - Work-buffer capacity in splats.
|
|
63
|
+
* @returns Estimated bytes, GPU plus the not-yet-released CPU mirror.
|
|
64
|
+
* @throws {RangeError} if `capacity` is not a non-negative finite number.
|
|
65
|
+
*/
|
|
66
|
+
export declare function estimateUnifiedWorkBufferPeakBytes(capacity: number): number;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as THREE from 'three/webgpu';
|
|
2
|
-
import { type SplatShInputs, type Vec3Uniform } from '
|
|
3
|
-
import type { SplatModifier } from '
|
|
2
|
+
import { type SplatShInputs, type Vec3Uniform } from '../core/splat-mesh-material';
|
|
3
|
+
import type { SplatModifier } from '../core/splat-modifier';
|
|
4
4
|
/**
|
|
5
5
|
* GPU gather pass for Phase 0 of the unified renderer. It resolves a source
|
|
6
6
|
* pool's active local centers into a shared world-space storage buffer. The
|
|
@@ -12,7 +12,7 @@ import type { SplatModifier } from './splat-modifier';
|
|
|
12
12
|
/** Shared GPU storage for every gathered source in one unified frame. */
|
|
13
13
|
export declare class WorkBuffer {
|
|
14
14
|
readonly capacity: number;
|
|
15
|
-
/** World-space center xyz; w is
|
|
15
|
+
/** World-space center xyz; w is display opacity (`visibility × source opacity ×` RAD modifier ratio). */
|
|
16
16
|
readonly centers: THREE.StorageBufferAttribute;
|
|
17
17
|
/** Resolved color and opacity per work slot. */
|
|
18
18
|
readonly colors: THREE.StorageBufferAttribute;
|
|
@@ -86,8 +86,8 @@ export declare class WorkBufferGather {
|
|
|
86
86
|
srgbOutput?: boolean;
|
|
87
87
|
/**
|
|
88
88
|
* Source stores Spark LOD alpha (`alpha ÷ 2`, `.rad`). Recover the full
|
|
89
|
-
* `alpha ∈ [0,2]`
|
|
90
|
-
*
|
|
89
|
+
* `alpha ∈ [0,2]` into `colors.a` from the *original* texture channel so the
|
|
90
|
+
* shared draw material can classify merged vs leaf without seeing fades.
|
|
91
91
|
*/
|
|
92
92
|
lodAlpha?: boolean;
|
|
93
93
|
/** Reuse one target across all source gather passes. */
|
|
@@ -99,7 +99,7 @@ export declare class WorkBufferGather {
|
|
|
99
99
|
* Compiles this gather's compute pipeline without gathering anything.
|
|
100
100
|
*
|
|
101
101
|
* WebGPU compiles a compute pipeline lazily, at its first dispatch - not when
|
|
102
|
-
* the node graph is built. Measured on a 13-
|
|
102
|
+
* the node graph is built. Measured on a 13-mesh scene, a source's *first*
|
|
103
103
|
* `gather` took up to 2.0s while every later dispatch of the same pipeline
|
|
104
104
|
* took under 0.4ms, and because `gather` runs inside `update` that compile
|
|
105
105
|
* landed whole in one render frame. Running it through the async path here
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as THREE from 'three/webgpu';
|
|
2
|
-
import type { FloatUniform, Vec2Uniform } from '
|
|
2
|
+
import type { FloatUniform, Vec2Uniform } from '../core/splat-mesh-material';
|
|
3
3
|
/**
|
|
4
4
|
* Creates the unified EWA draw material for gathered world-space splats.
|
|
5
5
|
*
|