@drawcall/lod 0.2.0 → 0.4.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/README.md +6 -7
- package/dist/bake.d.ts +36 -0
- package/dist/bake.js +176 -0
- package/dist/bake.js.map +1 -0
- package/dist/baked/codec.d.ts +3 -6
- package/dist/baked/codec.js +48 -154
- package/dist/baked/codec.js.map +1 -1
- package/dist/baked/coverage.d.ts +6 -3
- package/dist/baked/coverage.js +6 -3
- package/dist/baked/coverage.js.map +1 -1
- package/dist/baked/fields.d.ts +9 -0
- package/dist/baked/fields.js +22 -0
- package/dist/baked/fields.js.map +1 -0
- package/dist/baked/index.d.ts +14 -8
- package/dist/baked/index.js +24 -22
- package/dist/baked/index.js.map +1 -1
- package/dist/baked/interior/faces.d.ts +4 -3
- package/dist/baked/interior/faces.js +16 -11
- package/dist/baked/interior/faces.js.map +1 -1
- package/dist/baked/interior/material.d.ts +7 -10
- package/dist/baked/interior/material.js +29 -36
- package/dist/baked/interior/material.js.map +1 -1
- package/dist/baked/interior/rooms.d.ts +1 -1
- package/dist/baked/interior/rooms.js +2 -2
- package/dist/baked/interior/rooms.js.map +1 -1
- package/dist/baked/low.js +5 -4
- package/dist/baked/low.js.map +1 -1
- package/dist/baked/raster.js +6 -6
- package/dist/baked/raster.js.map +1 -1
- package/dist/baked/textures.d.ts +17 -0
- package/dist/baked/textures.js +95 -0
- package/dist/baked/textures.js.map +1 -0
- package/dist/baked/transfer.js +19 -18
- package/dist/baked/transfer.js.map +1 -1
- package/dist/baked/unwrap.js +4 -3
- package/dist/baked/unwrap.js.map +1 -1
- package/dist/baked/xatlas.js.map +1 -1
- package/dist/codec/container.d.ts +8 -0
- package/dist/codec/container.js +63 -0
- package/dist/codec/container.js.map +1 -0
- package/dist/codec/mesh.d.ts +8 -0
- package/dist/{mesh/codec.js → codec/mesh.js} +80 -52
- package/dist/codec/mesh.js.map +1 -0
- package/dist/dispose.d.ts +8 -5
- package/dist/dispose.js +22 -24
- package/dist/dispose.js.map +1 -1
- package/dist/foliage.d.ts +32 -0
- package/dist/foliage.js +137 -0
- package/dist/foliage.js.map +1 -0
- package/dist/impostor/bake/atlas.d.ts +4 -4
- package/dist/impostor/bake/atlas.js +12 -12
- package/dist/impostor/bake/atlas.js.map +1 -1
- package/dist/impostor/bake/fit.d.ts +8 -0
- package/dist/impostor/bake/fit.js +28 -0
- package/dist/impostor/bake/fit.js.map +1 -0
- package/dist/impostor/bake/index.d.ts +22 -14
- package/dist/impostor/bake/index.js +50 -134
- package/dist/impostor/bake/index.js.map +1 -1
- package/dist/impostor/bake/materials.d.ts +3 -3
- package/dist/impostor/bake/materials.js +51 -13
- package/dist/impostor/bake/materials.js.map +1 -1
- package/dist/impostor/bake/sheet.d.ts +8 -0
- package/dist/impostor/bake/sheet.js +90 -0
- package/dist/impostor/bake/sheet.js.map +1 -0
- package/dist/impostor/bake/source.d.ts +3 -2
- package/dist/impostor/bake/source.js +9 -20
- package/dist/impostor/bake/source.js.map +1 -1
- package/dist/impostor/codec.d.ts +4 -5
- package/dist/impostor/codec.js +36 -109
- package/dist/impostor/codec.js.map +1 -1
- package/dist/impostor/impostor.d.ts +31 -7
- package/dist/impostor/impostor.js +21 -6
- package/dist/impostor/impostor.js.map +1 -1
- package/dist/impostor/ktx2/encode.d.ts +26 -0
- package/dist/impostor/ktx2/encode.js +120 -0
- package/dist/impostor/ktx2/encode.js.map +1 -0
- package/dist/impostor/ktx2/transcode.d.ts +3 -0
- package/dist/impostor/ktx2/transcode.js +99 -0
- package/dist/impostor/ktx2/transcode.js.map +1 -0
- package/dist/impostor/ktx2/uastc.d.ts +7 -0
- package/dist/impostor/ktx2/uastc.js +65 -0
- package/dist/impostor/ktx2/uastc.js.map +1 -0
- package/dist/impostor/ktx2/wasm/encoder.d.ts +4 -0
- package/dist/impostor/ktx2/wasm/encoder.js +10 -0
- package/dist/impostor/ktx2/wasm/encoder.js.map +1 -0
- package/dist/impostor/ktx2/wasm/transcoder.d.ts +3 -0
- package/dist/impostor/ktx2/wasm/transcoder.js +9 -0
- package/dist/impostor/ktx2/wasm/transcoder.js.map +1 -0
- package/dist/impostor/ktx2/worker.d.ts +1 -0
- package/dist/impostor/ktx2/worker.js +10 -0
- package/dist/impostor/ktx2/worker.js.map +1 -0
- package/dist/impostor/mesh/card.d.ts +4 -4
- package/dist/impostor/mesh/card.js +7 -7
- package/dist/impostor/mesh/card.js.map +1 -1
- package/dist/impostor/mesh/index.d.ts +7 -6
- package/dist/impostor/mesh/index.js +10 -11
- package/dist/impostor/mesh/index.js.map +1 -1
- package/dist/impostor/mesh/material.d.ts +18 -9
- package/dist/impostor/mesh/material.js +40 -27
- package/dist/impostor/mesh/material.js.map +1 -1
- package/dist/impostor/mesh/surface.d.ts +1 -1
- package/dist/impostor/mesh/surface.js +13 -9
- package/dist/impostor/mesh/surface.js.map +1 -1
- package/dist/impostor/mesh/textures.d.ts +3 -3
- package/dist/impostor/mesh/textures.js +24 -34
- package/dist/impostor/mesh/textures.js.map +1 -1
- package/dist/index.d.ts +13 -11
- package/dist/index.js +12 -10
- package/dist/index.js.map +1 -1
- package/dist/instanced/camera.d.ts +34 -0
- package/dist/instanced/camera.js +45 -0
- package/dist/instanced/camera.js.map +1 -0
- package/dist/instanced/clusters.d.ts +54 -0
- package/dist/instanced/clusters.js +151 -0
- package/dist/instanced/clusters.js.map +1 -0
- package/dist/instanced/cull.d.ts +28 -0
- package/dist/instanced/cull.js +22 -0
- package/dist/instanced/cull.js.map +1 -0
- package/dist/instanced/instances.d.ts +39 -0
- package/dist/instanced/instances.js +104 -0
- package/dist/instanced/instances.js.map +1 -0
- package/dist/instanced/key.d.ts +19 -0
- package/dist/instanced/key.js +45 -0
- package/dist/instanced/key.js.map +1 -0
- package/dist/instanced/levels.d.ts +60 -0
- package/dist/instanced/levels.js +131 -0
- package/dist/instanced/levels.js.map +1 -0
- package/dist/instanced/lists.d.ts +57 -0
- package/dist/instanced/lists.js +114 -0
- package/dist/instanced/lists.js.map +1 -0
- package/dist/instanced/measure.d.ts +28 -0
- package/dist/instanced/measure.js +203 -0
- package/dist/instanced/measure.js.map +1 -0
- package/dist/instanced/meshes.d.ts +44 -51
- package/dist/instanced/meshes.js +167 -179
- package/dist/instanced/meshes.js.map +1 -1
- package/dist/instanced/mirror.d.ts +24 -0
- package/dist/instanced/mirror.js +76 -0
- package/dist/instanced/mirror.js.map +1 -0
- package/dist/instanced/raycast.d.ts +10 -11
- package/dist/instanced/raycast.js +31 -41
- package/dist/instanced/raycast.js.map +1 -1
- package/dist/instanced/rows.d.ts +50 -0
- package/dist/instanced/rows.js +36 -0
- package/dist/instanced/rows.js.map +1 -0
- package/dist/instanced/shape.d.ts +27 -0
- package/dist/instanced/shape.js +54 -0
- package/dist/instanced/shape.js.map +1 -0
- package/dist/instanced/sort.d.ts +61 -0
- package/dist/instanced/sort.js +192 -0
- package/dist/instanced/sort.js.map +1 -0
- package/dist/instanced/update.d.ts +34 -0
- package/dist/instanced/update.js +180 -0
- package/dist/instanced/update.js.map +1 -0
- package/dist/levels/bounds.d.ts +21 -0
- package/dist/levels/bounds.js +42 -0
- package/dist/levels/bounds.js.map +1 -0
- package/dist/levels/cameras.d.ts +48 -0
- package/dist/levels/cameras.js +122 -0
- package/dist/levels/cameras.js.map +1 -0
- package/dist/levels/compile/contexts.d.ts +30 -0
- package/dist/levels/compile/contexts.js +18 -0
- package/dist/levels/compile/contexts.js.map +1 -0
- package/dist/levels/compile/index.d.ts +41 -0
- package/dist/levels/compile/index.js +193 -0
- package/dist/levels/compile/index.js.map +1 -0
- package/dist/levels/compile/pipelines.d.ts +26 -0
- package/dist/levels/compile/pipelines.js +172 -0
- package/dist/levels/compile/pipelines.js.map +1 -0
- package/dist/levels/compiles.d.ts +29 -0
- package/dist/levels/compiles.js +50 -0
- package/dist/levels/compiles.js.map +1 -0
- package/dist/levels/draw.d.ts +102 -0
- package/dist/levels/draw.js +401 -0
- package/dist/levels/draw.js.map +1 -0
- package/dist/levels/fade.d.ts +60 -0
- package/dist/levels/fade.js +129 -0
- package/dist/levels/fade.js.map +1 -0
- package/dist/levels/index.d.ts +99 -0
- package/dist/levels/index.js +155 -0
- package/dist/levels/index.js.map +1 -0
- package/dist/levels/item.d.ts +38 -0
- package/dist/levels/item.js +89 -0
- package/dist/levels/item.js.map +1 -0
- package/dist/levels/load.d.ts +31 -0
- package/dist/levels/load.js +144 -0
- package/dist/levels/load.js.map +1 -0
- package/dist/levels/manager.d.ts +158 -0
- package/dist/levels/manager.js +352 -0
- package/dist/levels/manager.js.map +1 -0
- package/dist/{material.d.ts → levels/material.d.ts} +2 -2
- package/dist/{material.js → levels/material.js} +6 -5
- package/dist/levels/material.js.map +1 -0
- package/dist/levels/renderer.d.ts +32 -0
- package/dist/levels/renderer.js +57 -0
- package/dist/levels/renderer.js.map +1 -0
- package/dist/levels/requests.d.ts +52 -0
- package/dist/levels/requests.js +97 -0
- package/dist/levels/requests.js.map +1 -0
- package/dist/levels/screen.d.ts +14 -0
- package/dist/levels/screen.js +21 -0
- package/dist/levels/screen.js.map +1 -0
- package/dist/loader/build.d.ts +10 -0
- package/dist/loader/build.js +28 -0
- package/dist/loader/build.js.map +1 -0
- package/dist/loader/context.d.ts +44 -0
- package/dist/loader/context.js +96 -0
- package/dist/loader/context.js.map +1 -0
- package/dist/loader/entry.d.ts +4 -0
- package/dist/loader/entry.js +43 -0
- package/dist/loader/entry.js.map +1 -0
- package/dist/loader/index.d.ts +76 -0
- package/dist/loader/index.js +272 -0
- package/dist/loader/index.js.map +1 -0
- package/dist/loader/level.d.ts +41 -0
- package/dist/loader/level.js +140 -0
- package/dist/loader/level.js.map +1 -0
- package/dist/loader/node.d.ts +26 -0
- package/dist/loader/node.js +199 -0
- package/dist/loader/node.js.map +1 -0
- package/dist/loader/request.d.ts +54 -0
- package/dist/loader/request.js +19 -0
- package/dist/loader/request.js.map +1 -0
- package/dist/loader/url.d.ts +10 -6
- package/dist/loader/url.js +22 -14
- package/dist/loader/url.js.map +1 -1
- package/dist/lod.d.ts +144 -43
- package/dist/lod.js +354 -163
- package/dist/lod.js.map +1 -1
- package/dist/meshopt.d.ts +6 -0
- package/dist/meshopt.js +20 -0
- package/dist/meshopt.js.map +1 -0
- package/dist/node-process.d.ts +5 -0
- package/dist/node-process.js +6 -0
- package/dist/node-process.js.map +1 -0
- package/dist/node.d.ts +2 -0
- package/dist/node.js +5 -0
- package/dist/node.js.map +1 -0
- package/dist/simplify/cards.d.ts +14 -0
- package/dist/simplify/cards.js +128 -0
- package/dist/simplify/cards.js.map +1 -0
- package/dist/{simplify.d.ts → simplify/index.d.ts} +8 -5
- package/dist/{simplify.js → simplify/index.js} +45 -27
- package/dist/simplify/index.js.map +1 -0
- package/dist/{bounds.d.ts → source/detail.d.ts} +9 -23
- package/dist/{bounds.js → source/detail.js} +28 -58
- package/dist/source/detail.js.map +1 -0
- package/dist/source/deviation.js +6 -6
- package/dist/source/deviation.js.map +1 -1
- package/dist/source/{shading.d.ts → evaluator.d.ts} +10 -10
- package/dist/source/{shading.js → evaluator.js} +5 -5
- package/dist/source/evaluator.js.map +1 -0
- package/dist/source/{trace.d.ts → raycaster.d.ts} +6 -6
- package/dist/source/{trace.js → raycaster.js} +8 -8
- package/dist/source/raycaster.js.map +1 -0
- package/dist/source/{texels.d.ts → sampler.d.ts} +1 -1
- package/dist/source/{texels.js → sampler.js} +8 -5
- package/dist/source/sampler.js.map +1 -0
- package/dist/source/source.d.ts +1 -1
- package/dist/source/source.js +1 -1
- package/dist/source/source.js.map +1 -1
- package/dist/source/surface.js +1 -1
- package/dist/source/surface.js.map +1 -1
- package/dist/task.d.ts +6 -0
- package/dist/{pause.js → task.js} +5 -5
- package/dist/task.js.map +1 -0
- package/dist/three.d.ts +19 -30
- package/dist/three.js +30 -57
- package/dist/three.js.map +1 -1
- package/dist/tsl.d.ts +8 -12
- package/dist/tsl.js +11 -39
- package/dist/tsl.js.map +1 -1
- package/dist/typegpu.d.ts +37 -0
- package/dist/typegpu.js +37 -0
- package/dist/typegpu.js.map +1 -0
- package/dist/wind/bounds.js +3 -3
- package/dist/wind/bounds.js.map +1 -1
- package/dist/wind/hooks.d.ts +7 -4
- package/dist/wind/hooks.js +5 -2
- package/dist/wind/hooks.js.map +1 -1
- package/dist/wind/index.d.ts +4 -4
- package/dist/wind/index.js +25 -23
- package/dist/wind/index.js.map +1 -1
- package/dist/wind/sway.d.ts +2 -0
- package/dist/wind/sway.js +4 -1
- package/dist/wind/sway.js.map +1 -1
- package/package.json +24 -10
- package/skills/lod/SKILL.md +120 -32
- package/dist/bounds.js.map +0 -1
- package/dist/compile.d.ts +0 -4
- package/dist/compile.js +0 -100
- package/dist/compile.js.map +0 -1
- package/dist/deferred.d.ts +0 -12
- package/dist/deferred.js +0 -27
- package/dist/deferred.js.map +0 -1
- package/dist/fade.d.ts +0 -36
- package/dist/fade.js +0 -112
- package/dist/fade.js.map +0 -1
- package/dist/instanced/args.d.ts +0 -20
- package/dist/instanced/args.js +0 -77
- package/dist/instanced/args.js.map +0 -1
- package/dist/instanced/blocks.d.ts +0 -66
- package/dist/instanced/blocks.js +0 -294
- package/dist/instanced/blocks.js.map +0 -1
- package/dist/instanced/dirty.d.ts +0 -15
- package/dist/instanced/dirty.js +0 -96
- package/dist/instanced/dirty.js.map +0 -1
- package/dist/instanced/index.d.ts +0 -90
- package/dist/instanced/index.js +0 -349
- package/dist/instanced/index.js.map +0 -1
- package/dist/instanced/parts.d.ts +0 -14
- package/dist/instanced/parts.js +0 -79
- package/dist/instanced/parts.js.map +0 -1
- package/dist/instanced/select.d.ts +0 -92
- package/dist/instanced/select.js +0 -315
- package/dist/instanced/select.js.map +0 -1
- package/dist/instanced/store.d.ts +0 -31
- package/dist/instanced/store.js +0 -96
- package/dist/instanced/store.js.map +0 -1
- package/dist/levels.d.ts +0 -95
- package/dist/levels.js +0 -171
- package/dist/levels.js.map +0 -1
- package/dist/loader/bundle.d.ts +0 -25
- package/dist/loader/bundle.js +0 -241
- package/dist/loader/bundle.js.map +0 -1
- package/dist/loader/cache.d.ts +0 -15
- package/dist/loader/cache.js +0 -75
- package/dist/loader/cache.js.map +0 -1
- package/dist/loader/provenance.d.ts +0 -30
- package/dist/loader/provenance.js +0 -105
- package/dist/loader/provenance.js.map +0 -1
- package/dist/loader.d.ts +0 -55
- package/dist/loader.js +0 -239
- package/dist/loader.js.map +0 -1
- package/dist/material.js.map +0 -1
- package/dist/mesh/codec.d.ts +0 -4
- package/dist/mesh/codec.js.map +0 -1
- package/dist/pause.d.ts +0 -6
- package/dist/pause.js.map +0 -1
- package/dist/queue.d.ts +0 -2
- package/dist/queue.js +0 -33
- package/dist/queue.js.map +0 -1
- package/dist/renderer.d.ts +0 -21
- package/dist/renderer.js +0 -83
- package/dist/renderer.js.map +0 -1
- package/dist/residency.d.ts +0 -44
- package/dist/residency.js +0 -205
- package/dist/residency.js.map +0 -1
- package/dist/simplify.js.map +0 -1
- package/dist/source/shading.js.map +0 -1
- package/dist/source/texels.js.map +0 -1
- package/dist/source/trace.js.map +0 -1
- package/dist/view.d.ts +0 -45
- package/dist/view.js +0 -131
- package/dist/view.js.map +0 -1
package/dist/instanced/select.js
DELETED
|
@@ -1,315 +0,0 @@
|
|
|
1
|
-
import { StorageBufferAttribute, StorageInstancedBufferAttribute, Vector3, Vector4, } from "three/webgpu";
|
|
2
|
-
import { Fn, If, Loop, Return, atomicAdd, atomicLoad, atomicStore, distance, float, instanceIndex, int, max, smoothstep, storage, uint, uniform, vec4, } from "three/tsl";
|
|
3
|
-
import { at } from "../at.js";
|
|
4
|
-
import { FADE } from "../levels.js";
|
|
5
|
-
import { maxScale } from "../tsl.js";
|
|
6
|
-
import { ARGS_BYTES, args } from "./args.js";
|
|
7
|
-
const CURRENT = [];
|
|
8
|
-
export class Selection {
|
|
9
|
-
draws;
|
|
10
|
-
/** The instances' matrices, as `setMatrixAt` writes them. */
|
|
11
|
-
matrices;
|
|
12
|
-
/** The instances' colours (RGB, padded to four floats), once there are any. */
|
|
13
|
-
colors = null;
|
|
14
|
-
count;
|
|
15
|
-
slots;
|
|
16
|
-
/** Per level, its first slot, or null for a level that draws nothing. */
|
|
17
|
-
first;
|
|
18
|
-
/** Shared page containing this selection's draws, `ARGS_BYTES` apart. */
|
|
19
|
-
get args() {
|
|
20
|
-
return this.slice.attribute;
|
|
21
|
-
}
|
|
22
|
-
/** Byte offset of this selection's first draw in its page. */
|
|
23
|
-
get argsOffset() {
|
|
24
|
-
return this.slice.offset;
|
|
25
|
-
}
|
|
26
|
-
// What the view sets before each selection (see InstancedLod.update).
|
|
27
|
-
eye = uniform(new Vector3());
|
|
28
|
-
/** Pixels per unit of subtense (perspective) or of size (orthographic), × Lod.quality. */
|
|
29
|
-
scale = uniform(0);
|
|
30
|
-
ortho = uniform(0, "uint");
|
|
31
|
-
fades = uniform(0, "uint");
|
|
32
|
-
/** The level every instance draws, or -1. */
|
|
33
|
-
forced = uniform(-1, "int");
|
|
34
|
-
/** Per level, its maxPixels (any finite stand-in for level 0's Infinity). */
|
|
35
|
-
maxPixels;
|
|
36
|
-
counts;
|
|
37
|
-
slice;
|
|
38
|
-
routes;
|
|
39
|
-
previous;
|
|
40
|
-
// Crowd dimensions are data; equal ladders share shader modules regardless of capacity.
|
|
41
|
-
starts;
|
|
42
|
-
bounds = uniform(new Vector4());
|
|
43
|
-
progress = uniform(1);
|
|
44
|
-
drawCount = uniform(0, "uint");
|
|
45
|
-
records = storage(new StorageBufferAttribute(new Uint32Array(4), 4), "uvec4", 0)
|
|
46
|
-
.setName("lodDraws")
|
|
47
|
-
.toReadOnly();
|
|
48
|
-
arguments = storage(new StorageBufferAttribute(new Uint32Array(5), 1), "uint", 0).setName("lodDrawArgs");
|
|
49
|
-
// Allocation location must not specialize the arguments pass for every crowd.
|
|
50
|
-
argsStart = uniform(0, "uint");
|
|
51
|
-
kernels = null;
|
|
52
|
-
/**
|
|
53
|
-
* The renderers whose buffers hold the selection for the view and instances as they are
|
|
54
|
-
* (each renderer keeps its own copy of the buffers): see `aim` and `changed`.
|
|
55
|
-
*/
|
|
56
|
-
current = new WeakMap();
|
|
57
|
-
revision = 0;
|
|
58
|
-
stable;
|
|
59
|
-
colorRenderers = new WeakSet();
|
|
60
|
-
rendererCount = 0;
|
|
61
|
-
constructor(
|
|
62
|
-
/** 16 floats per instance */
|
|
63
|
-
matrices,
|
|
64
|
-
/** One instance's bounding sphere, in its own space. */
|
|
65
|
-
sphere,
|
|
66
|
-
/** Per level, whether it draws anything. */
|
|
67
|
-
drawing, draws, fallback) {
|
|
68
|
-
this.draws = draws;
|
|
69
|
-
const count = matrices.length / 16;
|
|
70
|
-
this.count = count;
|
|
71
|
-
this.matrices = new StorageBufferAttribute(matrices, 16);
|
|
72
|
-
let next = 0;
|
|
73
|
-
this.first = drawing.map((draws) => (draws ? next++ * count : null));
|
|
74
|
-
this.starts = this.first.map((first) => uniform(first ?? 0, "uint"));
|
|
75
|
-
this.bounds.value.set(sphere.center.x, sphere.center.y, sphere.center.z, sphere.radius);
|
|
76
|
-
const slots = Math.max(next * count, 1);
|
|
77
|
-
this.slots = { matrices: new StorageInstancedBufferAttribute(slots, 16), fades: new StorageBufferAttribute(slots, 1), colors: null };
|
|
78
|
-
this.maxPixels = drawing.map(() => uniform(0));
|
|
79
|
-
this.counts = new StorageBufferAttribute(new Uint32Array(drawing.length), 1);
|
|
80
|
-
this.slice = this.allocate(draws);
|
|
81
|
-
this.argsStart.value = this.argsOffset / 4;
|
|
82
|
-
this.routes = fallback.map((level) => uniform(level, "int"));
|
|
83
|
-
this.previous = fallback.map((level) => uniform(level, "int"));
|
|
84
|
-
this.writeDraws(draws);
|
|
85
|
-
}
|
|
86
|
-
allocate(draws) {
|
|
87
|
-
const values = new Uint32Array((draws.length * ARGS_BYTES) / 4);
|
|
88
|
-
draws.forEach((draw, k) => {
|
|
89
|
-
const base = (k * ARGS_BYTES) / 4;
|
|
90
|
-
const first = at(this.first, draw.level);
|
|
91
|
-
if (first === null)
|
|
92
|
-
throw new Error("InstancedLod: a draw of a level that draws nothing");
|
|
93
|
-
// indexed: count, instances, first index, base vertex, first instance;
|
|
94
|
-
// else: count, instances, first vertex, first instance.
|
|
95
|
-
values[base] = draw.count;
|
|
96
|
-
values[base + 2] = draw.start;
|
|
97
|
-
values[base + (draw.indexed ? 4 : 3)] = first;
|
|
98
|
-
});
|
|
99
|
-
return args.take(values);
|
|
100
|
-
}
|
|
101
|
-
/** Slots and kernels survive arrivals; only the variable-size draw table is replaced. */
|
|
102
|
-
append(draws) {
|
|
103
|
-
const offset = this.draws.length * ARGS_BYTES;
|
|
104
|
-
const previous = this.slice;
|
|
105
|
-
this.draws = [...this.draws, ...draws];
|
|
106
|
-
this.slice = this.allocate(this.draws);
|
|
107
|
-
this.argsStart.value = this.argsOffset / 4;
|
|
108
|
-
this.writeDraws(this.draws);
|
|
109
|
-
previous.dispose();
|
|
110
|
-
this.changed();
|
|
111
|
-
return offset;
|
|
112
|
-
}
|
|
113
|
-
/** Residency is data, including the previous route for the arrival's dither fade. */
|
|
114
|
-
route(fallback, fade = false) {
|
|
115
|
-
fallback.forEach((level, i) => {
|
|
116
|
-
const route = at(this.routes, i);
|
|
117
|
-
const previous = at(this.previous, i);
|
|
118
|
-
previous.value = fade ? route.value : level;
|
|
119
|
-
route.value = level;
|
|
120
|
-
});
|
|
121
|
-
this.progress.value = fade ? 0 : 1;
|
|
122
|
-
this.changed();
|
|
123
|
-
}
|
|
124
|
-
writeDraws(draws) {
|
|
125
|
-
const values = new Uint32Array(Math.max(draws.length, 1) * 4);
|
|
126
|
-
draws.forEach((draw, i) => values.set([draw.level, draw.count, draw.start, Number(draw.indexed)], i * 4));
|
|
127
|
-
const previous = this.records.value;
|
|
128
|
-
this.records.value = new StorageBufferAttribute(values, 4);
|
|
129
|
-
this.arguments.value = this.args;
|
|
130
|
-
this.drawCount.value = draws.length;
|
|
131
|
-
previous.dispose();
|
|
132
|
-
}
|
|
133
|
-
/** Select for this view next; the uniforms are set and compared here. */
|
|
134
|
-
aim(eye, scale, ortho, fades, forced, levels, stable) {
|
|
135
|
-
const same = this.eye.value.equals(eye) &&
|
|
136
|
-
this.scale.value === scale &&
|
|
137
|
-
this.ortho.value === Number(ortho) &&
|
|
138
|
-
this.fades.value === Number(fades) &&
|
|
139
|
-
this.forced.value === (forced ?? -1) &&
|
|
140
|
-
levels.every((level, l) => at(this.maxPixels, l).value === Math.min(level.maxPixels, 3.4e38));
|
|
141
|
-
// The caller can prove that changed views still produce the same solid slots.
|
|
142
|
-
const reuse = stable !== undefined && stable === this.stable;
|
|
143
|
-
this.stable = stable;
|
|
144
|
-
if (same)
|
|
145
|
-
return;
|
|
146
|
-
if (!reuse)
|
|
147
|
-
this.revision++;
|
|
148
|
-
this.eye.value.copy(eye);
|
|
149
|
-
this.scale.value = scale;
|
|
150
|
-
this.ortho.value = Number(ortho);
|
|
151
|
-
this.fades.value = Number(fades);
|
|
152
|
-
this.forced.value = forced ?? -1;
|
|
153
|
-
// any finite stand-in for level 0's Infinity
|
|
154
|
-
levels.forEach((level, l) => {
|
|
155
|
-
at(this.maxPixels, l).value = Math.min(level.maxPixels, 3.4e38);
|
|
156
|
-
});
|
|
157
|
-
}
|
|
158
|
-
/** The instances changed since the last selection. */
|
|
159
|
-
changed() {
|
|
160
|
-
this.revision++;
|
|
161
|
-
this.stable = undefined;
|
|
162
|
-
}
|
|
163
|
-
/** The passes `renderer` has to run for the selection to be current in its buffers, or none. */
|
|
164
|
-
take(renderer) {
|
|
165
|
-
if (this.current.get(renderer) === this.revision)
|
|
166
|
-
return CURRENT;
|
|
167
|
-
const first = !this.current.has(renderer);
|
|
168
|
-
if (first) {
|
|
169
|
-
this.rendererCount = Math.min(2, this.rendererCount + 1);
|
|
170
|
-
}
|
|
171
|
-
// Three clears updateRanges globally after one backend uploads them. A second,
|
|
172
|
-
// lagging renderer needs the whole current source, including earlier edits.
|
|
173
|
-
// Initial buffer creation also leaves ranges uncleared; start it with none.
|
|
174
|
-
if (first || this.rendererCount > 1) {
|
|
175
|
-
this.matrices.clearUpdateRanges();
|
|
176
|
-
}
|
|
177
|
-
if (this.colors && (!this.colorRenderers.has(renderer) || this.rendererCount > 1)) {
|
|
178
|
-
this.colorRenderers.add(renderer);
|
|
179
|
-
this.colors.clearUpdateRanges();
|
|
180
|
-
}
|
|
181
|
-
this.current.set(renderer, this.revision);
|
|
182
|
-
return this.passes();
|
|
183
|
-
}
|
|
184
|
-
/** Carry `colors` (4 floats per instance) with the instances from now on, into the slots. */
|
|
185
|
-
useColors(colors) {
|
|
186
|
-
if (this.colors)
|
|
187
|
-
return;
|
|
188
|
-
this.colors = new StorageBufferAttribute(colors, 4);
|
|
189
|
-
this.slots.colors = new StorageInstancedBufferAttribute(this.slots.matrices.count, 4);
|
|
190
|
-
for (const kernel of this.kernels ?? [])
|
|
191
|
-
kernel.dispose();
|
|
192
|
-
this.kernels = null;
|
|
193
|
-
this.changed();
|
|
194
|
-
}
|
|
195
|
-
/** Frees its buffers and passes. */
|
|
196
|
-
dispose() {
|
|
197
|
-
const { slots } = this;
|
|
198
|
-
for (const attribute of [this.matrices, this.colors, this.counts, slots.matrices, slots.fades, slots.colors])
|
|
199
|
-
attribute?.dispose();
|
|
200
|
-
for (const kernel of this.kernels ?? [])
|
|
201
|
-
kernel.dispose();
|
|
202
|
-
this.kernels = null;
|
|
203
|
-
this.slice.dispose();
|
|
204
|
-
this.records.value.dispose();
|
|
205
|
-
}
|
|
206
|
-
passes() {
|
|
207
|
-
this.kernels ??= [this.selectPass(), this.argumentsPass()];
|
|
208
|
-
return this.kernels;
|
|
209
|
-
}
|
|
210
|
-
/** The pass that fills the slots. */
|
|
211
|
-
selectPass() {
|
|
212
|
-
const { count, colors, slots } = this;
|
|
213
|
-
const matrices = storage(this.matrices, "mat4", 0).setName("lodSourceMatrices");
|
|
214
|
-
const sources = colors ? storage(colors, "vec4", 0).setName("lodSourceColors") : null;
|
|
215
|
-
const counts = storage(this.counts, "uint", 0).setName("lodCounts").toAtomic();
|
|
216
|
-
const out = {
|
|
217
|
-
matrices: storage(slots.matrices, "mat4", 0).setName("lodSlotMatrices"),
|
|
218
|
-
fades: storage(slots.fades, "float", 0).setName("lodSlotFades"),
|
|
219
|
-
colors: slots.colors && storage(slots.colors, "vec4", 0).setName("lodSlotColors"),
|
|
220
|
-
};
|
|
221
|
-
return Fn(() => {
|
|
222
|
-
const m = matrices.element(instanceIndex).toVar();
|
|
223
|
-
const r = this.bounds.w.mul(maxScale(m)).toVar();
|
|
224
|
-
If(r.equal(0), () => Return());
|
|
225
|
-
const centre = m.mul(vec4(this.bounds.xyz, 1)).xyz;
|
|
226
|
-
const size = r.mul(2).mul(this.scale);
|
|
227
|
-
const height = this.ortho
|
|
228
|
-
.equal(uint(1))
|
|
229
|
-
.select(size, size.div(max(distance(centre, this.eye), 1e-6)))
|
|
230
|
-
.toVar();
|
|
231
|
-
// The levels' maxPixels fall from level to level: the last one it fits is its level.
|
|
232
|
-
const chosen = int(0).toVar();
|
|
233
|
-
const top = float(0).toVar();
|
|
234
|
-
this.maxPixels.forEach((maxPixels, l) => {
|
|
235
|
-
if (l === 0)
|
|
236
|
-
return;
|
|
237
|
-
If(height.lessThanEqual(maxPixels), () => {
|
|
238
|
-
chosen.assign(l);
|
|
239
|
-
top.assign(maxPixels);
|
|
240
|
-
});
|
|
241
|
-
});
|
|
242
|
-
If(this.forced.greaterThanEqual(0), () => void chosen.assign(this.forced));
|
|
243
|
-
const t = float(0).toVar();
|
|
244
|
-
If(this.fades.equal(uint(1)).and(chosen.greaterThan(0)), () => void t.assign(smoothstep(top.mul(1 - FADE), top, height)));
|
|
245
|
-
const selected = chosen.toVar();
|
|
246
|
-
const finer = chosen.sub(1).toVar();
|
|
247
|
-
const before = chosen.toVar();
|
|
248
|
-
const beforeFiner = chosen.sub(1).toVar();
|
|
249
|
-
this.routes.forEach((route, level) => {
|
|
250
|
-
If(chosen.equal(level), () => {
|
|
251
|
-
selected.assign(route);
|
|
252
|
-
finer.assign(this.routes[level - 1] ?? route);
|
|
253
|
-
before.assign(this.previous[level] ?? route);
|
|
254
|
-
beforeFiner.assign(this.previous[level - 1] ?? this.previous[level] ?? route);
|
|
255
|
-
});
|
|
256
|
-
});
|
|
257
|
-
const afterFade = selected.equal(finer).select(float(0), t).toVar();
|
|
258
|
-
const beforeFade = before.equal(beforeFiner).select(float(0), t).toVar();
|
|
259
|
-
t.assign(afterFade);
|
|
260
|
-
// Mirrors residency.handover: only two slots per instance, including at a height boundary.
|
|
261
|
-
If(this.progress.lessThan(1).and(before.notEqual(selected).or(beforeFiner.notEqual(finer))), () => {
|
|
262
|
-
If(this.progress.lessThan(1 / 3), () => {
|
|
263
|
-
selected.assign(before);
|
|
264
|
-
finer.assign(beforeFiner);
|
|
265
|
-
t.assign(beforeFade.greaterThan(0).select(beforeFade.add(float(1).sub(beforeFade).mul(this.progress).mul(3)), float(0)));
|
|
266
|
-
})
|
|
267
|
-
.ElseIf(this.progress.lessThan(2 / 3), () => {
|
|
268
|
-
selected.assign(afterFade.greaterThan(0).select(finer, selected));
|
|
269
|
-
finer.assign(beforeFade.greaterThan(0).select(beforeFiner, before));
|
|
270
|
-
t.assign(float(1).sub(this.progress.sub(1 / 3).mul(3)));
|
|
271
|
-
})
|
|
272
|
-
.Else(() => {
|
|
273
|
-
t.assign(afterFade.greaterThan(0).select(float(1).sub(float(1)
|
|
274
|
-
.sub(afterFade)
|
|
275
|
-
.mul(this.progress.sub(2 / 3))
|
|
276
|
-
.mul(3)), float(0)));
|
|
277
|
-
});
|
|
278
|
-
If(selected.equal(finer), () => void t.assign(0));
|
|
279
|
-
});
|
|
280
|
-
const emit = (level, first, fade) => {
|
|
281
|
-
const slot = atomicAdd(counts.element(level), uint(1)).add(first).toVar();
|
|
282
|
-
out.matrices.element(slot).assign(m);
|
|
283
|
-
out.fades.element(slot).assign(fade);
|
|
284
|
-
if (out.colors && sources)
|
|
285
|
-
out.colors.element(slot).assign(sources.element(instanceIndex));
|
|
286
|
-
};
|
|
287
|
-
this.first.forEach((first, level) => {
|
|
288
|
-
if (first === null)
|
|
289
|
-
return;
|
|
290
|
-
const start = at(this.starts, level);
|
|
291
|
-
If(selected.equal(level), () => emit(level, start, t));
|
|
292
|
-
// The finer neighbour fading out with it.
|
|
293
|
-
If(finer.equal(level).and(t.greaterThan(0)), () => emit(level, start, t.negate()));
|
|
294
|
-
});
|
|
295
|
-
})().compute(count);
|
|
296
|
-
}
|
|
297
|
-
argumentsPass() {
|
|
298
|
-
const counts = storage(this.counts, "uint", 0).setName("lodCounts").toAtomic();
|
|
299
|
-
return Fn(() => {
|
|
300
|
-
Loop({ start: uint(0), end: this.drawCount, type: "uint", condition: "<" }, ({ i }) => {
|
|
301
|
-
const draw = this.records.element(i).toVar();
|
|
302
|
-
const first = uint(0).toVar();
|
|
303
|
-
this.starts.forEach((value, level) => If(draw.x.equal(level), () => void first.assign(value)));
|
|
304
|
-
const base = this.argsStart.add(i.mul(ARGS_BYTES / 4));
|
|
305
|
-
this.arguments.element(base).assign(draw.y);
|
|
306
|
-
this.arguments.element(base.add(1)).assign(atomicLoad(counts.element(draw.x)));
|
|
307
|
-
this.arguments.element(base.add(2)).assign(draw.z);
|
|
308
|
-
this.arguments.element(base.add(3)).assign(draw.w.equal(1).select(uint(0), first));
|
|
309
|
-
this.arguments.element(base.add(4)).assign(draw.w.equal(1).select(first, uint(0)));
|
|
310
|
-
});
|
|
311
|
-
this.first.forEach((_, l) => atomicStore(counts.element(l), uint(0)));
|
|
312
|
-
})().compute(1);
|
|
313
|
-
}
|
|
314
|
-
}
|
|
315
|
-
//# sourceMappingURL=select.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"select.js","sourceRoot":"","sources":["../../src/instanced/select.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import { Matrix4, type Color } from "three/webgpu";
|
|
2
|
-
import type { Blocks } from "./blocks.js";
|
|
3
|
-
import type { Selection } from "./select.js";
|
|
4
|
-
/** The CPU side of every instance, as `setMatrixAt` and `setColorAt` write it, and its edits not yet measured and uploaded. */
|
|
5
|
-
export declare class Store {
|
|
6
|
-
readonly count: number;
|
|
7
|
-
/** Instance matrices, 16 floats each: the selection uploads them from here. */
|
|
8
|
-
readonly matrices: Float32Array;
|
|
9
|
-
/** Instance colours, 4 floats each, once `setColor` was called. */
|
|
10
|
-
colors: Float32Array | null;
|
|
11
|
-
/** Each instance's bounding sphere, centre and radius, in the InstancedLod's space. */
|
|
12
|
-
readonly spheres: Float32Array;
|
|
13
|
-
private readonly matrixChanges;
|
|
14
|
-
private readonly colorChanges;
|
|
15
|
-
/** Where edits upload to, while there is one. */
|
|
16
|
-
private selection;
|
|
17
|
-
constructor(count: number);
|
|
18
|
-
check(index: number): void;
|
|
19
|
-
setMatrix(index: number, matrix: Matrix4): void;
|
|
20
|
-
getMatrix(index: number, matrix: Matrix4): Matrix4;
|
|
21
|
-
setColor(index: number, color: Color): void;
|
|
22
|
-
/** White unless set. */
|
|
23
|
-
getColor(index: number, color: Color): Color;
|
|
24
|
-
/** Upload edits to `selection` from now on, colours included once there are any; null stops uploading. */
|
|
25
|
-
attach(selection: Selection | null): void;
|
|
26
|
-
/** Take `source`'s matrices and colours, all of them pending. */
|
|
27
|
-
copy(source: Store): void;
|
|
28
|
-
/** Measure only changed matrices into `blocks`; matrix and colour uploads have separate ranges. */
|
|
29
|
-
measure(blocks: Blocks): void;
|
|
30
|
-
private measureChanges;
|
|
31
|
-
}
|
package/dist/instanced/store.js
DELETED
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
import { Matrix4 } from "three/webgpu";
|
|
2
|
-
import { Dirty, upload } from "./dirty.js";
|
|
3
|
-
const IDENTITY = new Matrix4();
|
|
4
|
-
/** The CPU side of every instance, as `setMatrixAt` and `setColorAt` write it, and its edits not yet measured and uploaded. */
|
|
5
|
-
export class Store {
|
|
6
|
-
count;
|
|
7
|
-
/** Instance matrices, 16 floats each: the selection uploads them from here. */
|
|
8
|
-
matrices;
|
|
9
|
-
/** Instance colours, 4 floats each, once `setColor` was called. */
|
|
10
|
-
colors = null;
|
|
11
|
-
/** Each instance's bounding sphere, centre and radius, in the InstancedLod's space. */
|
|
12
|
-
spheres;
|
|
13
|
-
matrixChanges;
|
|
14
|
-
colorChanges;
|
|
15
|
-
/** Where edits upload to, while there is one. */
|
|
16
|
-
selection = null;
|
|
17
|
-
constructor(count) {
|
|
18
|
-
this.count = count;
|
|
19
|
-
this.matrices = new Float32Array(count * 16);
|
|
20
|
-
this.spheres = new Float32Array(count * 4);
|
|
21
|
-
for (let i = 0; i < count; i++)
|
|
22
|
-
IDENTITY.toArray(this.matrices, i * 16);
|
|
23
|
-
this.matrixChanges = new Dirty(count);
|
|
24
|
-
this.colorChanges = new Dirty(count);
|
|
25
|
-
this.matrixChanges.all();
|
|
26
|
-
}
|
|
27
|
-
check(index) {
|
|
28
|
-
if (!Number.isInteger(index) || index < 0 || index >= this.count)
|
|
29
|
-
throw new Error(`InstancedLod: index ${index} is not in 0..${this.count - 1}`);
|
|
30
|
-
}
|
|
31
|
-
setMatrix(index, matrix) {
|
|
32
|
-
this.check(index);
|
|
33
|
-
matrix.toArray(this.matrices, index * 16);
|
|
34
|
-
this.matrixChanges.add(index);
|
|
35
|
-
}
|
|
36
|
-
getMatrix(index, matrix) {
|
|
37
|
-
this.check(index);
|
|
38
|
-
return matrix.fromArray(this.matrices, index * 16);
|
|
39
|
-
}
|
|
40
|
-
setColor(index, color) {
|
|
41
|
-
this.check(index);
|
|
42
|
-
if (!this.colors) {
|
|
43
|
-
this.colors = new Float32Array(this.count * 4).fill(1);
|
|
44
|
-
if (this.selection) {
|
|
45
|
-
this.selection.useColors(this.colors);
|
|
46
|
-
this.colorChanges.all();
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
color.toArray(this.colors, index * 4);
|
|
50
|
-
this.colorChanges.add(index);
|
|
51
|
-
}
|
|
52
|
-
/** White unless set. */
|
|
53
|
-
getColor(index, color) {
|
|
54
|
-
this.check(index);
|
|
55
|
-
return this.colors ? color.fromArray(this.colors, index * 4) : color.setRGB(1, 1, 1);
|
|
56
|
-
}
|
|
57
|
-
/** Upload edits to `selection` from now on, colours included once there are any; null stops uploading. */
|
|
58
|
-
attach(selection) {
|
|
59
|
-
this.selection = selection;
|
|
60
|
-
if (selection && this.colors)
|
|
61
|
-
selection.useColors(this.colors);
|
|
62
|
-
}
|
|
63
|
-
/** Take `source`'s matrices and colours, all of them pending. */
|
|
64
|
-
copy(source) {
|
|
65
|
-
this.matrices.set(source.matrices);
|
|
66
|
-
this.colors = source.colors?.slice() ?? null;
|
|
67
|
-
this.matrixChanges.all();
|
|
68
|
-
if (this.colors)
|
|
69
|
-
this.colorChanges.all();
|
|
70
|
-
}
|
|
71
|
-
/** Measure only changed matrices into `blocks`; matrix and colour uploads have separate ranges. */
|
|
72
|
-
measure(blocks) {
|
|
73
|
-
if (this.matrixChanges.empty && this.colorChanges.empty)
|
|
74
|
-
return;
|
|
75
|
-
this.measureChanges(blocks);
|
|
76
|
-
}
|
|
77
|
-
// Keep the closure-bearing work out of the unchanged path: V8 can allocate a
|
|
78
|
-
// lexical context on entry even when a function returns before its callbacks.
|
|
79
|
-
measureChanges(blocks) {
|
|
80
|
-
const { selection } = this;
|
|
81
|
-
const matricesChanged = !this.matrixChanges.empty;
|
|
82
|
-
this.matrixChanges.drain((start, end) => {
|
|
83
|
-
blocks.measure(start, end);
|
|
84
|
-
if (selection)
|
|
85
|
-
upload(selection.matrices, start, end);
|
|
86
|
-
});
|
|
87
|
-
this.colorChanges.drain((start, end) => {
|
|
88
|
-
if (selection?.colors)
|
|
89
|
-
upload(selection.colors, start, end);
|
|
90
|
-
});
|
|
91
|
-
selection?.changed();
|
|
92
|
-
if (matricesChanged)
|
|
93
|
-
blocks.refit();
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
//# sourceMappingURL=store.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/instanced/store.ts"],"names":[],"mappings":"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"}
|
package/dist/levels.d.ts
DELETED
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
import { Color, type Box3, type Object3D } from "three/webgpu";
|
|
2
|
-
/** Share of each level's range over which its finer neighbour fades out. */
|
|
3
|
-
export declare const FADE = 0.1;
|
|
4
|
-
/** A reusable level description. Deferred objects arrive already placed in the owner's space. */
|
|
5
|
-
export type LodLevel = {
|
|
6
|
-
object: Object3D;
|
|
7
|
-
maxPixels?: number;
|
|
8
|
-
load?: never;
|
|
9
|
-
box?: never;
|
|
10
|
-
} | {
|
|
11
|
-
load: () => Promise<Object3D>;
|
|
12
|
-
maxPixels: number;
|
|
13
|
-
box: Box3;
|
|
14
|
-
object?: never;
|
|
15
|
-
};
|
|
16
|
-
/** One level of an owner, as `Lod.levels` and `InstancedLod.levels` show it. */
|
|
17
|
-
export interface LevelView {
|
|
18
|
-
/** Level 0 is the source. */
|
|
19
|
-
readonly index: number;
|
|
20
|
-
/**
|
|
21
|
-
* The level's object, undefined until a deferred level has arrived. For a Lod it is
|
|
22
|
-
* drawn, and its visibility is the Lod's switch. For an InstancedLod it is the template
|
|
23
|
-
* the level's instanced meshes are made from: never in the scene, so `levelOf` tells
|
|
24
|
-
* what draws.
|
|
25
|
-
*/
|
|
26
|
-
readonly object: Object3D | undefined;
|
|
27
|
-
/** A deferred level's bounds in the owner's space. */
|
|
28
|
-
readonly box: Box3 | undefined;
|
|
29
|
-
/**
|
|
30
|
-
* Largest on-screen height, in CSS pixels × Lod.quality, at which this level draws.
|
|
31
|
-
* Level 0 is Infinity. Every later threshold must be at most 0.9 of its predecessor.
|
|
32
|
-
* Defaults use measured surface deviation, impostor texels, or half the previous
|
|
33
|
-
* threshold (512 for level 1), raised where needed to leave room for fades.
|
|
34
|
-
*/
|
|
35
|
-
maxPixels: number;
|
|
36
|
-
}
|
|
37
|
-
/** One owner's resolved threshold and drawable, separate from its reusable description. */
|
|
38
|
-
export declare class Level implements LevelView {
|
|
39
|
-
readonly input: LodLevel;
|
|
40
|
-
readonly index: number;
|
|
41
|
-
private readonly ladder;
|
|
42
|
-
readonly tint: Color;
|
|
43
|
-
readonly box: Box3 | undefined;
|
|
44
|
-
object: Object3D | undefined;
|
|
45
|
-
nested: boolean;
|
|
46
|
-
explicit: number | null;
|
|
47
|
-
base: number;
|
|
48
|
-
value: number;
|
|
49
|
-
constructor(input: LodLevel, index: number, ladder: readonly Level[]);
|
|
50
|
-
get maxPixels(): number;
|
|
51
|
-
set maxPixels(value: number);
|
|
52
|
-
}
|
|
53
|
-
/** Surface deviation from the source, in the source's units. */
|
|
54
|
-
export declare const recordDeviation: (level: Object3D, deviation: number) => void;
|
|
55
|
-
export declare const deviationOf: (level: Object3D) => number | undefined;
|
|
56
|
-
/** Descriptions for a new owner, retaining threshold edits and sharing deferred decode. */
|
|
57
|
-
export declare function cloneLevels(levels: readonly Level[]): LodLevel[];
|
|
58
|
-
/** What a level's default threshold is measured from: surface deviation, else impostor texels. */
|
|
59
|
-
interface Measured {
|
|
60
|
-
deviation?: number;
|
|
61
|
-
texels?: number;
|
|
62
|
-
}
|
|
63
|
-
export declare function measure(object: Object3D): Measured;
|
|
64
|
-
/** A level to resolve: `measured` is absent for a deferred level, whose own maxPixels stands in. */
|
|
65
|
-
interface Measurable {
|
|
66
|
-
maxPixels?: number;
|
|
67
|
-
measured?: Measured;
|
|
68
|
-
}
|
|
69
|
-
/** Resolve thresholds from measurements without constructing renderer state. */
|
|
70
|
-
export declare function resolveThresholds(levels: readonly Measurable[], diameter: number): number[];
|
|
71
|
-
/** Resolve defaults once, retaining writable owner thresholds. */
|
|
72
|
-
export declare function estimate(levels: readonly Level[], diameter: number): void;
|
|
73
|
-
/** Throws when neighbouring fades overlap. */
|
|
74
|
-
export declare function validate(levels: readonly {
|
|
75
|
-
maxPixels: number;
|
|
76
|
-
}[]): void;
|
|
77
|
-
/** The level drawn at `height`: the last one it fits, or `forceLevel`. */
|
|
78
|
-
export declare function levelAt(levels: readonly Level[], height: number, forceLevel: number | null): Level;
|
|
79
|
-
/** The coarsest level whose maxPixels `height` still fits; level 0 fits any height. */
|
|
80
|
-
export declare function lastFitting(levels: readonly {
|
|
81
|
-
maxPixels: number;
|
|
82
|
-
}[], height: number): number;
|
|
83
|
-
/**
|
|
84
|
-
* How far `level` has faded in over its finer neighbour at `height`, in [0, 1): 0 when
|
|
85
|
-
* no fade is under way (the finer level is gone). See fade.ts for how both draw it.
|
|
86
|
-
*/
|
|
87
|
-
export declare function fadeProgress(levels: readonly Level[], level: Level, height: number): number;
|
|
88
|
-
/** Give each level its debug tint, or white. */
|
|
89
|
-
export declare function tintLevels(levels: readonly Level[], debug: boolean): void;
|
|
90
|
-
export declare const DEMAND = 0.8;
|
|
91
|
-
/** Logical demand and the next finer fade partner, including a small approach margin. */
|
|
92
|
-
export declare function demandLevels(levels: readonly Level[], height: number, forced: number | null): Level[];
|
|
93
|
-
/** Nearest ready finer level, else nearest coarser; -1 draws nothing until one is ready. */
|
|
94
|
-
export declare function fallbacks(levels: readonly Level[], ready: ReadonlySet<Level>): number[];
|
|
95
|
-
export {};
|