@drawcall/lod 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (147) hide show
  1. package/README.md +10 -69
  2. package/dist/at.d.ts +2 -0
  3. package/dist/at.js +8 -0
  4. package/dist/at.js.map +1 -0
  5. package/dist/baked/codec.d.ts +6 -3
  6. package/dist/baked/codec.js +22 -16
  7. package/dist/baked/codec.js.map +1 -1
  8. package/dist/baked/coverage.d.ts +3 -0
  9. package/dist/baked/coverage.js +45 -0
  10. package/dist/baked/coverage.js.map +1 -0
  11. package/dist/baked/index.d.ts +4 -0
  12. package/dist/baked/index.js +3 -35
  13. package/dist/baked/index.js.map +1 -1
  14. package/dist/baked/low.d.ts +2 -2
  15. package/dist/baked/low.js +4 -4
  16. package/dist/baked/low.js.map +1 -1
  17. package/dist/bounds.d.ts +12 -2
  18. package/dist/bounds.js +72 -10
  19. package/dist/bounds.js.map +1 -1
  20. package/dist/compile.d.ts +4 -0
  21. package/dist/compile.js +100 -0
  22. package/dist/compile.js.map +1 -0
  23. package/dist/deferred.d.ts +12 -0
  24. package/dist/deferred.js +27 -0
  25. package/dist/deferred.js.map +1 -0
  26. package/dist/dispose.d.ts +7 -3
  27. package/dist/dispose.js +33 -4
  28. package/dist/dispose.js.map +1 -1
  29. package/dist/fade.d.ts +5 -13
  30. package/dist/fade.js +62 -28
  31. package/dist/fade.js.map +1 -1
  32. package/dist/impostor/bake/index.d.ts +1 -0
  33. package/dist/impostor/bake/index.js +1 -0
  34. package/dist/impostor/bake/index.js.map +1 -1
  35. package/dist/impostor/bake/materials.js +11 -1
  36. package/dist/impostor/bake/materials.js.map +1 -1
  37. package/dist/impostor/codec.d.ts +2 -7
  38. package/dist/impostor/codec.js +16 -27
  39. package/dist/impostor/codec.js.map +1 -1
  40. package/dist/impostor/mesh/card.js +4 -1
  41. package/dist/impostor/mesh/card.js.map +1 -1
  42. package/dist/impostor/mesh/index.d.ts +6 -4
  43. package/dist/impostor/mesh/index.js +8 -10
  44. package/dist/impostor/mesh/index.js.map +1 -1
  45. package/dist/impostor/mesh/material.d.ts +7 -5
  46. package/dist/impostor/mesh/material.js +29 -26
  47. package/dist/impostor/mesh/material.js.map +1 -1
  48. package/dist/impostor/mesh/surface.d.ts +20 -16
  49. package/dist/impostor/mesh/surface.js +74 -55
  50. package/dist/impostor/mesh/surface.js.map +1 -1
  51. package/dist/impostor/octahedral.d.ts +1 -8
  52. package/dist/impostor/octahedral.js +3 -18
  53. package/dist/impostor/octahedral.js.map +1 -1
  54. package/dist/index.d.ts +7 -6
  55. package/dist/index.js +5 -4
  56. package/dist/index.js.map +1 -1
  57. package/dist/instanced/args.js +2 -2
  58. package/dist/instanced/args.js.map +1 -1
  59. package/dist/instanced/{bounds.d.ts → blocks.d.ts} +25 -9
  60. package/dist/instanced/{bounds.js → blocks.js} +76 -53
  61. package/dist/instanced/blocks.js.map +1 -0
  62. package/dist/instanced/dirty.d.ts +3 -0
  63. package/dist/instanced/dirty.js +40 -5
  64. package/dist/instanced/dirty.js.map +1 -1
  65. package/dist/instanced/index.d.ts +25 -51
  66. package/dist/instanced/index.js +189 -413
  67. package/dist/instanced/index.js.map +1 -1
  68. package/dist/instanced/meshes.d.ts +54 -13
  69. package/dist/instanced/meshes.js +178 -41
  70. package/dist/instanced/meshes.js.map +1 -1
  71. package/dist/instanced/parts.d.ts +14 -0
  72. package/dist/instanced/parts.js +79 -0
  73. package/dist/instanced/parts.js.map +1 -0
  74. package/dist/instanced/raycast.d.ts +13 -0
  75. package/dist/instanced/raycast.js +53 -0
  76. package/dist/instanced/raycast.js.map +1 -0
  77. package/dist/instanced/select.d.ts +17 -9
  78. package/dist/instanced/select.js +114 -63
  79. package/dist/instanced/select.js.map +1 -1
  80. package/dist/instanced/store.d.ts +31 -0
  81. package/dist/instanced/store.js +96 -0
  82. package/dist/instanced/store.js.map +1 -0
  83. package/dist/levels.d.ts +71 -48
  84. package/dist/levels.js +99 -74
  85. package/dist/levels.js.map +1 -1
  86. package/dist/loader/bundle.d.ts +25 -0
  87. package/dist/loader/bundle.js +241 -0
  88. package/dist/loader/bundle.js.map +1 -0
  89. package/dist/loader/cache.d.ts +15 -15
  90. package/dist/loader/cache.js +71 -33
  91. package/dist/loader/cache.js.map +1 -1
  92. package/dist/loader/provenance.d.ts +30 -0
  93. package/dist/loader/provenance.js +105 -0
  94. package/dist/loader/provenance.js.map +1 -0
  95. package/dist/loader/url.d.ts +13 -0
  96. package/dist/loader/url.js +31 -0
  97. package/dist/loader/url.js.map +1 -0
  98. package/dist/loader.d.ts +30 -74
  99. package/dist/loader.js +191 -186
  100. package/dist/loader.js.map +1 -1
  101. package/dist/lod.d.ts +20 -31
  102. package/dist/lod.js +105 -96
  103. package/dist/lod.js.map +1 -1
  104. package/dist/material.js +9 -4
  105. package/dist/material.js.map +1 -1
  106. package/dist/mesh/codec.d.ts +4 -0
  107. package/dist/mesh/codec.js +192 -0
  108. package/dist/mesh/codec.js.map +1 -0
  109. package/dist/queue.d.ts +2 -0
  110. package/dist/queue.js +33 -0
  111. package/dist/queue.js.map +1 -0
  112. package/dist/residency.d.ts +44 -0
  113. package/dist/residency.js +205 -0
  114. package/dist/residency.js.map +1 -0
  115. package/dist/simplify.js +5 -3
  116. package/dist/simplify.js.map +1 -1
  117. package/dist/source/{error.d.ts → deviation.d.ts} +3 -3
  118. package/dist/source/{error.js → deviation.js} +6 -6
  119. package/dist/source/deviation.js.map +1 -0
  120. package/dist/source/source.d.ts +1 -1
  121. package/dist/source/source.js +1 -1
  122. package/dist/three.d.ts +17 -5
  123. package/dist/three.js +24 -3
  124. package/dist/three.js.map +1 -1
  125. package/dist/tsl.d.ts +5 -5
  126. package/dist/tsl.js +12 -19
  127. package/dist/tsl.js.map +1 -1
  128. package/dist/view.d.ts +16 -1
  129. package/dist/view.js +57 -1
  130. package/dist/view.js.map +1 -1
  131. package/dist/wind/index.d.ts +2 -2
  132. package/dist/wind/index.js +31 -28
  133. package/dist/wind/index.js.map +1 -1
  134. package/dist/wind/sway.d.ts +2 -1
  135. package/package.json +9 -3
  136. package/skills/lod/SKILL.md +71 -109
  137. package/dist/impostor/cache.d.ts +0 -15
  138. package/dist/impostor/cache.js +0 -44
  139. package/dist/impostor/cache.js.map +0 -1
  140. package/dist/instanced/bounds.js.map +0 -1
  141. package/dist/lazy.d.ts +0 -64
  142. package/dist/lazy.js +0 -187
  143. package/dist/lazy.js.map +0 -1
  144. package/dist/loader/dispose.d.ts +0 -3
  145. package/dist/loader/dispose.js +0 -25
  146. package/dist/loader/dispose.js.map +0 -1
  147. package/dist/source/error.js.map +0 -1
@@ -0,0 +1,192 @@
1
+ import { gzipSync, strFromU8, strToU8 } from "fflate";
2
+ import { BufferAttribute, BufferGeometry, Float16BufferAttribute, FloatType, Group, IntType, Mesh, Object3D, Scene, } from "three/webgpu";
3
+ import { borrowMaterials } from "../dispose.js";
4
+ import { isInstancedMesh, isLOD, isMesh, isSkinnedMesh } from "../three.js";
5
+ const arrays = {
6
+ Int8Array,
7
+ Uint8Array,
8
+ Uint8ClampedArray,
9
+ Int16Array,
10
+ Uint16Array,
11
+ Int32Array,
12
+ Uint32Array,
13
+ Float32Array,
14
+ Float64Array,
15
+ };
16
+ const containers = { Scene, Group, Object3D };
17
+ /** Store a static hierarchy's geometry and material slots. Decode with the same ordered material list; materials and textures are never serialized. */
18
+ export function encodeMesh(object, materials) {
19
+ const chunks = [];
20
+ const geometries = [];
21
+ let length = 0;
22
+ function attribute(value) {
23
+ if (value instanceof Float16BufferAttribute)
24
+ fail("unsupported float16 attribute");
25
+ const packed = value instanceof BufferAttribute ? value.array : value.array.slice(0, value.count * value.itemSize);
26
+ if (!(value instanceof BufferAttribute))
27
+ for (let i = 0; i < value.count; i++) {
28
+ const offset = i * value.data.stride + value.offset;
29
+ packed.set(value.array.subarray(offset, offset + value.itemSize), i * value.itemSize);
30
+ }
31
+ const offset = length;
32
+ chunks.push(new Uint8Array(packed.buffer, packed.byteOffset, packed.byteLength));
33
+ length += packed.byteLength;
34
+ return {
35
+ offset,
36
+ length: packed.byteLength,
37
+ type: packed.constructor.name,
38
+ size: value.itemSize,
39
+ normalized: value.normalized,
40
+ gpuType: value instanceof BufferAttribute ? value.gpuType : FloatType,
41
+ };
42
+ }
43
+ function node(value) {
44
+ if (isLOD(value) || isSkinnedMesh(value) || isInstancedMesh(value) || !["Mesh", "Group", "Scene", "Object3D"].includes(value.type))
45
+ fail(`cannot persist ${value.type}; sources must contain static meshes and groups`);
46
+ if (value.matrixAutoUpdate)
47
+ value.updateMatrix();
48
+ const geometry = isMesh(value) ? value.geometry : undefined;
49
+ if (geometry && !geometries.includes(geometry))
50
+ geometries.push(geometry);
51
+ const slot = (material) => {
52
+ const index = materials.indexOf(material);
53
+ if (index < 0)
54
+ fail(`material "${material.name}" is not in the source`);
55
+ return index;
56
+ };
57
+ return {
58
+ type: value.type,
59
+ name: value.name,
60
+ matrix: value.matrix.toArray(),
61
+ matrixAutoUpdate: value.matrixAutoUpdate,
62
+ matrixWorldAutoUpdate: value.matrixWorldAutoUpdate,
63
+ visible: value.visible,
64
+ castShadow: value.castShadow,
65
+ receiveShadow: value.receiveShadow,
66
+ frustumCulled: value.frustumCulled,
67
+ renderOrder: value.renderOrder,
68
+ layers: value.layers.mask,
69
+ data: value.userData,
70
+ children: value.children.map(node),
71
+ geometry: geometry && geometries.indexOf(geometry),
72
+ material: isMesh(value) ? (Array.isArray(value.material) ? value.material.map(slot) : slot(value.material)) : undefined,
73
+ };
74
+ }
75
+ const root = node(object);
76
+ const geometry = geometries.map((value) => {
77
+ if (Object.keys(value.morphAttributes).length)
78
+ fail("cannot persist morph targets");
79
+ return {
80
+ name: value.name,
81
+ data: value.userData,
82
+ groups: value.groups.map((group) => [group.start, group.count, group.materialIndex ?? 0]),
83
+ range: [value.drawRange.start, value.drawRange.count === Infinity ? null : value.drawRange.count],
84
+ attributes: Object.fromEntries(Object.entries(value.attributes).map(([name, value]) => [name, attribute(value)])),
85
+ index: value.index && attribute(value.index),
86
+ };
87
+ });
88
+ const header = strToU8(JSON.stringify({ version: 1, root, geometry }));
89
+ const bytes = new Uint8Array(4 + header.length + length);
90
+ new DataView(bytes.buffer).setUint32(0, header.length, true);
91
+ bytes.set(header, 4);
92
+ let offset = 4 + header.length;
93
+ for (const chunk of chunks) {
94
+ bytes.set(chunk, offset);
95
+ offset += chunk.length;
96
+ }
97
+ return gzipSync(bytes, { level: 1 });
98
+ }
99
+ export async function decodeMeshAsync(input, materials) {
100
+ const bytes = new Uint8Array(await new Response(new Blob([input.slice().buffer]).stream().pipeThrough(new DecompressionStream("gzip"))).arrayBuffer());
101
+ if (bytes.length < 4)
102
+ fail("missing metadata");
103
+ const start = 4 + new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength).getUint32(0, true);
104
+ if (start > bytes.length)
105
+ fail("invalid metadata length");
106
+ const meta = record(JSON.parse(strFromU8(bytes.subarray(4, start))));
107
+ if (meta.version !== 1)
108
+ fail("unsupported version");
109
+ function attribute(value) {
110
+ const meta = record(value);
111
+ const Type = arrays[string(meta.type)] ?? fail("unsupported attribute type");
112
+ const offset = start + integer(meta.offset);
113
+ const length = integer(meta.length);
114
+ const size = integer(meta.size);
115
+ if (!size || length % (Type.BYTES_PER_ELEMENT * size) || offset + length > bytes.length)
116
+ fail("invalid attribute length");
117
+ const result = new BufferAttribute(new Type(bytes.slice(offset, offset + length).buffer), size, boolean(meta.normalized));
118
+ if (meta.gpuType !== FloatType && meta.gpuType !== IntType)
119
+ fail("invalid attribute gpuType");
120
+ result.gpuType = meta.gpuType;
121
+ return result;
122
+ }
123
+ const geometries = list(meta.geometry).map((value) => {
124
+ const meta = record(value);
125
+ const geometry = new BufferGeometry();
126
+ geometry.name = string(meta.name);
127
+ geometry.userData = record(meta.data);
128
+ for (const [name, value] of Object.entries(record(meta.attributes)))
129
+ geometry.setAttribute(name, attribute(value));
130
+ if (meta.index !== null)
131
+ geometry.setIndex(attribute(meta.index));
132
+ for (const value of list(meta.groups)) {
133
+ const group = list(value);
134
+ geometry.addGroup(integer(group[0]), integer(group[1]), integer(group[2]));
135
+ }
136
+ const range = list(meta.range);
137
+ geometry.setDrawRange(integer(range[0]), range[1] === null ? Infinity : integer(range[1]));
138
+ geometry.computeBoundingBox();
139
+ geometry.computeBoundingSphere();
140
+ return geometry;
141
+ });
142
+ const material = (value) => materials[integer(value)] ?? fail("missing source material");
143
+ function node(value) {
144
+ const meta = record(value);
145
+ const geometry = meta.type === "Mesh" ? (geometries[integer(meta.geometry)] ?? fail("missing geometry")) : undefined;
146
+ const result = geometry
147
+ ? new Mesh(geometry, Array.isArray(meta.material) ? meta.material.map(material) : material(meta.material))
148
+ : new (containers[string(meta.type)] ?? fail("unsupported node type"))();
149
+ result.name = string(meta.name);
150
+ const matrix = list(meta.matrix);
151
+ if (matrix.length !== 16)
152
+ fail("invalid matrix");
153
+ result.matrix.fromArray(matrix.map(number));
154
+ result.matrix.decompose(result.position, result.quaternion, result.scale);
155
+ for (const key of ["matrixAutoUpdate", "matrixWorldAutoUpdate", "visible", "castShadow", "receiveShadow", "frustumCulled"])
156
+ result[key] = boolean(meta[key]);
157
+ result.renderOrder = number(meta.renderOrder);
158
+ result.layers.mask = number(meta.layers);
159
+ result.userData = record(meta.data);
160
+ for (const child of list(meta.children))
161
+ result.add(node(child));
162
+ return result;
163
+ }
164
+ const root = node(meta.root);
165
+ borrowMaterials(root);
166
+ return root;
167
+ }
168
+ function fail(reason) {
169
+ throw new Error(`Invalid mesh cache (${reason})`);
170
+ }
171
+ function record(value) {
172
+ if (typeof value !== "object" || value === null || Array.isArray(value))
173
+ fail("expected object");
174
+ return Object.fromEntries(Object.entries(value));
175
+ }
176
+ function list(value) {
177
+ return Array.isArray(value) ? value : fail("expected array");
178
+ }
179
+ function string(value) {
180
+ return typeof value === "string" ? value : fail("expected string");
181
+ }
182
+ function boolean(value) {
183
+ return typeof value === "boolean" ? value : fail("expected boolean");
184
+ }
185
+ function number(value) {
186
+ return typeof value === "number" && Number.isFinite(value) ? value : fail("expected finite number");
187
+ }
188
+ function integer(value) {
189
+ const result = number(value);
190
+ return Number.isSafeInteger(result) && result >= 0 ? result : fail("expected nonnegative integer");
191
+ }
192
+ //# sourceMappingURL=codec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codec.js","sourceRoot":"","sources":["../../src/mesh/codec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ /** Run at most one installation per animation frame across all LODs. */
2
+ export declare function enqueue(run: () => Promise<void>, priority?: number): Promise<void>;
package/dist/queue.js ADDED
@@ -0,0 +1,33 @@
1
+ import { pause } from "./pause.js";
2
+ const queue = [];
3
+ let running = false;
4
+ const frame = () => new Promise((resolve) => requestAnimationFrame(() => resolve()));
5
+ /** Run at most one installation per animation frame across all LODs. */
6
+ export function enqueue(run, priority = 0) {
7
+ const promise = new Promise((resolve, reject) => {
8
+ queue.push({ run, resolve, reject, priority });
9
+ queue.sort((a, b) => b.priority - a.priority);
10
+ });
11
+ if (!running)
12
+ void drain();
13
+ return promise;
14
+ }
15
+ async function drain() {
16
+ running = true;
17
+ while (queue.length) {
18
+ await frame();
19
+ await pause();
20
+ const job = queue.shift();
21
+ if (!job)
22
+ break;
23
+ try {
24
+ await job.run();
25
+ job.resolve();
26
+ }
27
+ catch (error) {
28
+ job.reject(error);
29
+ }
30
+ }
31
+ running = false;
32
+ }
33
+ //# sourceMappingURL=queue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue.js","sourceRoot":"","sources":["../src/queue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AASnC,MAAM,KAAK,GAAU,EAAE,CAAC;AACxB,IAAI,OAAO,GAAG,KAAK,CAAC;AACpB,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,qBAAqB,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;AAE3F,wEAAwE;AACxE,MAAM,UAAU,OAAO,CAAC,GAAwB,EAAE,QAAQ,GAAG,CAAC;IAC5D,MAAM,OAAO,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACpD,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC/C,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IACH,IAAI,CAAC,OAAO;QAAE,KAAK,KAAK,EAAE,CAAC;IAC3B,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,KAAK,UAAU,KAAK;IAClB,OAAO,GAAG,IAAI,CAAC;IACf,OAAO,KAAK,CAAC,MAAM,EAAE,CAAC;QACpB,MAAM,KAAK,EAAE,CAAC;QACd,MAAM,KAAK,EAAE,CAAC;QACd,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;QAC1B,IAAI,CAAC,GAAG;YAAE,MAAM;QAChB,IAAI,CAAC;YACH,MAAM,GAAG,CAAC,GAAG,EAAE,CAAC;YAChB,GAAG,CAAC,OAAO,EAAE,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IACD,OAAO,GAAG,KAAK,CAAC;AAClB,CAAC"}
@@ -0,0 +1,44 @@
1
+ import type { Camera, Object3D, Object3DEventMap } from "three/webgpu";
2
+ import { type Level } from "./levels.js";
3
+ import { type RenderContext } from "./view.js";
4
+ export declare const HANDOVER_MS = 200;
5
+ export interface LevelsEventMap extends Object3DEventMap {
6
+ /** A compiled level has joined this LOD's draws. */
7
+ levelschange: {};
8
+ /** Fetch, decode, or GPU preparation failed; ready fallbacks remain drawable. */
9
+ levelserror: {
10
+ error: Error;
11
+ };
12
+ }
13
+ /** Decode is shared by load function; readiness and handover belong to each owner. */
14
+ export declare class Residency {
15
+ private readonly levels;
16
+ private readonly install;
17
+ private readonly changed;
18
+ private readonly failed;
19
+ readonly ready: Set<Level>;
20
+ fallback: number[];
21
+ previous: number[];
22
+ private start;
23
+ private task;
24
+ private readonly demanded;
25
+ private readonly requested;
26
+ private disposed;
27
+ /** The first failure; it stops further demand. */
28
+ error: Error | undefined;
29
+ constructor(levels: readonly Level[], install: (level: Level, object: Object3D, context: RenderContext) => Promise<void>, changed: () => void, failed: (error: Error) => void);
30
+ reset(): void;
31
+ get progress(): number;
32
+ get pending(): boolean;
33
+ demand(camera: Camera, indices: Iterable<number>): void;
34
+ needsDemand(camera: Camera, meshes: readonly (readonly Object3D[])[]): boolean;
35
+ drawn(camera: Camera, object: Object3D): void;
36
+ update(camera: Camera, meshes?: readonly (readonly Object3D[])[]): void;
37
+ private run;
38
+ private report;
39
+ dispose(release: () => void): void;
40
+ }
41
+ type Pair = readonly [level: number, finer: number, fade: number];
42
+ /** Collapse the old height fade, exchange detail, then restore the new height fade. */
43
+ export declare function handover(before: Pair, after: Pair, progress: number): Pair;
44
+ export {};
@@ -0,0 +1,205 @@
1
+ import { at } from "./at.js";
2
+ import { compileLevel } from "./compile.js";
3
+ import { enqueue } from "./queue.js";
4
+ import { disposeTree } from "./dispose.js";
5
+ import { loadOnce, loading } from "./deferred.js";
6
+ import { fallbacks } from "./levels.js";
7
+ import { renderContext } from "./view.js";
8
+ export const HANDOVER_MS = 200;
9
+ const compiledMeshes = new WeakMap();
10
+ /** The meshes already compiled for `context`. */
11
+ function compiledIn(context) {
12
+ let compiled = compiledMeshes.get(context);
13
+ if (!compiled)
14
+ compiledMeshes.set(context, (compiled = new WeakSet()));
15
+ return compiled;
16
+ }
17
+ /** Decode is shared by load function; readiness and handover belong to each owner. */
18
+ export class Residency {
19
+ levels;
20
+ install;
21
+ changed;
22
+ failed;
23
+ ready = new Set();
24
+ fallback = [];
25
+ previous = [];
26
+ start;
27
+ task;
28
+ demanded = new Set();
29
+ requested = new Set();
30
+ disposed = false;
31
+ /** The first failure; it stops further demand. */
32
+ error;
33
+ constructor(levels, install, changed, failed) {
34
+ this.levels = levels;
35
+ this.install = install;
36
+ this.changed = changed;
37
+ this.failed = failed;
38
+ }
39
+ reset() {
40
+ for (const level of this.levels)
41
+ if (level.object)
42
+ this.ready.add(level);
43
+ this.fallback = fallbacks(this.levels, this.ready);
44
+ }
45
+ get progress() {
46
+ if (this.start === undefined)
47
+ return 1;
48
+ const progress = Math.min((performance.now() - this.start) / HANDOVER_MS, 1);
49
+ if (progress === 1)
50
+ this.start = undefined;
51
+ return progress;
52
+ }
53
+ get pending() {
54
+ if (this.disposed || this.error)
55
+ return false;
56
+ if (this.task?.level)
57
+ return true;
58
+ for (const level of this.demanded)
59
+ if (!this.ready.has(level))
60
+ return true;
61
+ return false;
62
+ }
63
+ demand(camera, indices) {
64
+ this.demanded.clear();
65
+ if (this.disposed || this.error || !renderContext(camera))
66
+ return;
67
+ for (const index of indices) {
68
+ const level = at(this.levels, index);
69
+ this.demanded.add(level);
70
+ const fallback = at(this.fallback, index);
71
+ if (fallback >= 0)
72
+ this.demanded.add(at(this.levels, fallback));
73
+ const load = level.input.load;
74
+ if (!load || this.requested.has(load))
75
+ continue;
76
+ this.requested.add(load);
77
+ void loadOnce(load).promise.catch((error) => this.report(error));
78
+ }
79
+ }
80
+ needsDemand(camera, meshes) {
81
+ if (this.ready.size < this.levels.length || this.progress < 1)
82
+ return true;
83
+ const context = renderContext(camera);
84
+ if (!context)
85
+ return false;
86
+ const compiled = compiledMeshes.get(context);
87
+ return this.levels.some(({ input }, index) => !input.load && meshes[index]?.some((mesh) => !compiled?.has(mesh)));
88
+ }
89
+ drawn(camera, object) {
90
+ // compileAsync also runs draw callbacks; its queued job records success itself.
91
+ if (this.task)
92
+ return;
93
+ const context = renderContext(camera);
94
+ if (!context)
95
+ return;
96
+ compiledIn(context).add(object);
97
+ }
98
+ update(camera, meshes) {
99
+ const context = renderContext(camera);
100
+ if (!context || this.disposed || this.task || this.error || this.progress < 1)
101
+ return;
102
+ const compiled = compiledIn(context);
103
+ const eager = this.levels.findIndex((level, index) => !level.input.load && this.demanded.has(level) && meshes?.[index]?.some((mesh) => !compiled.has(mesh)));
104
+ const pending = meshes?.[eager];
105
+ if (pending) {
106
+ this.run(async () => {
107
+ const results = await Promise.allSettled(pending.map(async (mesh) => {
108
+ if (compiled.has(mesh))
109
+ return;
110
+ await compileLevel(mesh, context);
111
+ compiled.add(mesh);
112
+ }));
113
+ for (const result of results)
114
+ if (result.status === "rejected")
115
+ throw result.reason;
116
+ });
117
+ return;
118
+ }
119
+ for (const level of this.levels) {
120
+ const object = level.input.load && loading(level.input.load)?.object;
121
+ if (!object || !this.demanded.has(level) || this.ready.has(level))
122
+ continue;
123
+ this.run(async () => {
124
+ await this.install(level, object, context);
125
+ if (this.disposed)
126
+ return;
127
+ this.previous = this.fallback;
128
+ this.ready.add(level);
129
+ this.fallback = fallbacks(this.levels, this.ready);
130
+ this.start = performance.now();
131
+ }, level);
132
+ return;
133
+ }
134
+ }
135
+ run(action, level) {
136
+ const done = enqueue(async () => {
137
+ if (!this.disposed)
138
+ await action();
139
+ }, level ? 0 : 1)
140
+ .catch((error) => this.report(error))
141
+ .finally(() => {
142
+ this.task = undefined;
143
+ })
144
+ .then(() => {
145
+ if (level && !this.disposed && this.ready.has(level))
146
+ this.changed();
147
+ });
148
+ this.task = { done, level };
149
+ }
150
+ report(error) {
151
+ if (this.disposed || this.error)
152
+ return;
153
+ this.error = error instanceof Error ? error : new Error("Lod: level failed", { cause: error });
154
+ this.failed(this.error);
155
+ console.error(this.error);
156
+ }
157
+ dispose(release) {
158
+ this.disposed = true;
159
+ const free = () => {
160
+ release();
161
+ const templates = new Set();
162
+ for (const { input } of this.levels) {
163
+ const object = input.object ?? loading(input.load)?.object;
164
+ if (object)
165
+ templates.add(object);
166
+ }
167
+ for (const template of templates)
168
+ disposeTree(template);
169
+ };
170
+ const finish = () => {
171
+ const pending = this.levels.flatMap(({ input }) => {
172
+ const entry = input.load && loading(input.load);
173
+ return entry && !entry.object && !entry.error ? [entry.promise] : [];
174
+ });
175
+ // A mesh decode can begin its source-material dependency after disposal starts.
176
+ if (pending.length)
177
+ void Promise.allSettled(pending).then(free);
178
+ else
179
+ free();
180
+ };
181
+ if (this.task)
182
+ void this.task.done.then(finish);
183
+ else
184
+ finish();
185
+ }
186
+ }
187
+ /** Collapse the old height fade, exchange detail, then restore the new height fade. */
188
+ export function handover(before, after, progress) {
189
+ let [level, finer, fade] = after;
190
+ if (progress >= 1 || (before[0] === level && before[1] === finer))
191
+ return after;
192
+ if (progress < 1 / 3) {
193
+ [level, finer] = before;
194
+ fade = before[2] > 0 ? before[2] + (1 - before[2]) * progress * 3 : 0;
195
+ }
196
+ else if (progress < 2 / 3) {
197
+ level = fade > 0 ? finer : level;
198
+ finer = before[2] > 0 ? before[1] : before[0];
199
+ fade = 1 - (progress - 1 / 3) * 3;
200
+ }
201
+ else
202
+ fade = fade > 0 ? 1 - (1 - fade) * (progress - 2 / 3) * 3 : 0;
203
+ return [level, finer, level === finer ? 0 : fade];
204
+ }
205
+ //# sourceMappingURL=residency.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"residency.js","sourceRoot":"","sources":["../src/residency.ts"],"names":[],"mappings":"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"}
package/dist/simplify.js CHANGED
@@ -2,8 +2,9 @@ import { BufferAttribute, BufferGeometry } from "three/webgpu";
2
2
  import { mergeVertices } from "three/addons/utils/BufferGeometryUtils.js";
3
3
  import { MeshoptSimplifier } from "meshoptimizer";
4
4
  import { detailed } from "./bounds.js";
5
- import { recordError } from "./levels.js";
6
- import { measureError } from "./source/error.js";
5
+ import { borrowMaterials } from "./dispose.js";
6
+ import { recordDeviation } from "./levels.js";
7
+ import { measureDeviation } from "./source/deviation.js";
7
8
  import { readSource } from "./source/source.js";
8
9
  import { merge } from "./source/surface.js";
9
10
  import { isImpostorMesh, isInstancedLod, isMesh, isSkinnedMesh } from "./three.js";
@@ -25,7 +26,7 @@ import { isImpostorMesh, isInstancedLod, isMesh, isSkinnedMesh } from "./three.j
25
26
  */
26
27
  export async function simplify(object, options = {}) {
27
28
  const copy = await decimate(object, options.ratio ?? 0.5);
28
- recordError(copy, measureError(readSource(object, "simplify", "measure"), merge(copy, "simplify")).error);
29
+ recordDeviation(copy, measureDeviation(readSource(object, "simplify", "measure"), merge(copy, "simplify")).deviation);
29
30
  return copy;
30
31
  }
31
32
  /** A copy of `object` decimated to `ratio`, as `simplify` makes it, without measuring it. */
@@ -43,6 +44,7 @@ export async function decimate(object, ratio) {
43
44
  });
44
45
  const copy = object.clone(true);
45
46
  decimateTree(copy, ratio, new Map());
47
+ borrowMaterials(copy);
46
48
  return copy;
47
49
  }
48
50
  /** Decimate the meshes of `node` drawn at full detail; `done` maps each geometry to its simplified one. */
@@ -1 +1 @@
1
- {"version":3,"file":"simplify.js","sourceRoot":"","sources":["../src/simplify.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"simplify.js","sourceRoot":"","sources":["../src/simplify.ts"],"names":[],"mappings":"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"}
@@ -4,11 +4,11 @@ import { type Surface } from "./surface.js";
4
4
  * How far a level's surface `low` is from `source`'s: the distances from points spread
5
5
  * evenly by area over each surface to the other, measured with a BVH. Source points
6
6
  * nobody sees from outside (a floor inside, the inner side of a partition) are left out:
7
- * they need no counterpart on the level. `error` is the 99.9th percentile of the
7
+ * they need no counterpart on the level. `deviation` is the 99.9th percentile of the
8
8
  * distances, `widest` the largest. A high percentile, as what a level moves (a part
9
9
  * collapsed or cut off) is often a sliver of the area.
10
10
  */
11
- export declare function measureError(source: Source, low: Surface): {
12
- error: number;
11
+ export declare function measureDeviation(source: Source, low: Surface): {
12
+ deviation: number;
13
13
  widest: number;
14
14
  };
@@ -3,17 +3,17 @@ import { MeshBVH } from "three-mesh-bvh";
3
3
  import { Shading } from "./shading.js";
4
4
  import { triangleArea } from "./surface.js";
5
5
  import { Tracer } from "./trace.js";
6
- /** Points sampled per surface to measure the error. */
6
+ /** Points sampled per surface to measure the deviation. */
7
7
  const SAMPLES = 20000;
8
8
  /**
9
9
  * How far a level's surface `low` is from `source`'s: the distances from points spread
10
10
  * evenly by area over each surface to the other, measured with a BVH. Source points
11
11
  * nobody sees from outside (a floor inside, the inner side of a partition) are left out:
12
- * they need no counterpart on the level. `error` is the 99.9th percentile of the
12
+ * they need no counterpart on the level. `deviation` is the 99.9th percentile of the
13
13
  * distances, `widest` the largest. A high percentile, as what a level moves (a part
14
14
  * collapsed or cut off) is often a sliver of the area.
15
15
  */
16
- export function measureError(source, low) {
16
+ export function measureDeviation(source, low) {
17
17
  const geometry = new BufferGeometry();
18
18
  geometry.setAttribute("position", new BufferAttribute(low.positions, 3));
19
19
  // The BVH reorders the index it is built on.
@@ -27,12 +27,12 @@ export function measureError(source, low) {
27
27
  distances.push(closest(toLow, point));
28
28
  });
29
29
  const sorted = Float64Array.from(distances).sort();
30
- return { error: sorted[Math.floor(0.999 * (sorted.length - 1))] ?? 0, widest: sorted[sorted.length - 1] ?? 0 };
30
+ return { deviation: sorted[Math.floor(0.999 * (sorted.length - 1))] ?? 0, widest: sorted[sorted.length - 1] ?? 0 };
31
31
  }
32
32
  const hit = { point: new Vector3(), distance: 0, faceIndex: 0 };
33
33
  function closest(bvh, point) {
34
34
  if (!bvh.closestPointToPoint(point, hit))
35
- throw new Error("@drawcall/lod: no closest point to measure the error by");
35
+ throw new Error("@drawcall/lod: no closest point to measure the deviation by");
36
36
  return hit.distance;
37
37
  }
38
38
  /**
@@ -91,4 +91,4 @@ function measure(from, visit) {
91
91
  visit(point, t);
92
92
  }
93
93
  }
94
- //# sourceMappingURL=error.js.map
94
+ //# sourceMappingURL=deviation.js.map