@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
package/dist/lod.d.ts CHANGED
@@ -1,30 +1,20 @@
1
1
  import { Object3D, type Camera, type Intersection, type Raycaster } from "three/webgpu";
2
- import { type LevelsEventMap } from "./lazy.js";
3
- import { type LodLevel } from "./levels.js";
2
+ import { type LevelsEventMap } from "./residency.js";
3
+ import { type LevelView, type LodLevel } from "./levels.js";
4
4
  import { WIND_BOUNDS } from "./wind/hooks.js";
5
5
  /**
6
- * Levels of detail of one object, switched by its height on screen. Level 0 is the
7
- * source; each further level is used while the object is at most its `maxPixels` tall
8
- * (see `LodLevel.maxPixels` for the defaults). Near a switch both neighbours draw and
9
- * split the pixels with a dither, so nothing pops; elsewhere exactly one level is visible
10
- * and the others are hidden. Shadows follow the camera's choice and fade with it; nothing
11
- * of the object is drawn into a directional light's shadow map whose texels are wider
12
- * than the whole object: it could cover a texel only by chance.
6
+ * One object's levels, switched by on-screen height with dithered transitions.
7
+ * The renderer updates selection before shadows; each camera uses its last drawn
8
+ * viewport height (1080 until known). Orthographic views switch without fading.
9
+ * Shadows follow selection and omit casters smaller than a shadow texel.
13
10
  *
14
- * three's renderer calls `update(camera)` while it lists the scene (as for its own LOD),
15
- * before shadow maps render; the calls its shadow passes make are ignored. The height
16
- * uses the viewport the camera last drew one of the levels' meshes in, in CSS pixels
17
- * (1080 before that), so several views each get their own. An orthographic camera has
18
- * no distance to dither by: levels switch by on-screen size there too, but at once.
11
+ * Eager and deferred objects are cloned into this owner's space. A nested Lod selects
12
+ * and fades its own levels. Lines, points and sprites draw without fading or reporting
13
+ * viewport height. Raycasts hit the source only.
19
14
  *
20
- * Levels are children of the Lod in its space, any Object3D: meshes, an ImpostorMesh, a
21
- * group, another Lod. Each mesh draws with a faded copy of its material, which every Lod
22
- * drawing that material shares. Lines, points and sprites are drawn but neither fade nor
23
- * tell the Lod the viewport height. A nested Lod hands over to its neighbours at once.
24
- * Raycasts hit the source only.
25
- *
26
- * Levels are read when the Lod is built: meshes added to a level later, or moved within
27
- * it, are neither faded nor measured right. Build a new Lod instead.
15
+ * Build a new Lod after adding or moving meshes within a level: geometry is measured
16
+ * and hooked at construction or arrival. Skinned meshes and ShaderMaterials are
17
+ * refused; use static meshes with node materials or supported built-in materials.
28
18
  */
29
19
  export declare class Lod extends Object3D<LevelsEventMap> {
30
20
  /** Multiplies every measured height: below 1, cheaper levels take over sooner. */
@@ -41,7 +31,7 @@ export declare class Lod extends Object3D<LevelsEventMap> {
41
31
  autoUpdate: boolean;
42
32
  /** Draw only this level, without fades. */
43
33
  forceLevel: number | null;
44
- readonly levels: readonly LodLevel[];
34
+ readonly levels: readonly LevelView[];
45
35
  private readonly entries;
46
36
  /** Per level, how its meshes draw. */
47
37
  private readonly draws;
@@ -49,20 +39,22 @@ export declare class Lod extends Object3D<LevelsEventMap> {
49
39
  private sphere;
50
40
  private casterRadius;
51
41
  private disposed;
52
- private readonly installed;
53
- private fallback;
42
+ private readonly residency;
43
+ get pending(): boolean;
44
+ get error(): Error | undefined;
54
45
  /**
55
46
  * `levels[0]` is the source. Empty only as the target of `copy`. A source that draws
56
47
  * nothing (an empty Object3D, for detail another system draws) is measured by the
57
48
  * first level that draws something.
58
49
  */
59
- constructor(levels?: Object3D[]);
50
+ constructor(levels?: readonly LodLevel[]);
60
51
  private build;
61
52
  /** Fade the meshes under `node` by `draw` and learn the viewport height from them; an inner Lod fades its own. */
62
53
  private hook;
63
54
  [WIND_BOUNDS](padding: number): void;
64
- /** Pick and fade levels for `camera`; three's renderer calls this itself while `autoUpdate`. */
55
+ /** Pick and fade levels for `camera`; detail starts after a draw supplies its render context. */
65
56
  update(camera: Camera): void;
57
+ private install;
66
58
  raycast(raycaster: Raycaster, intersects: Intersection[]): boolean;
67
59
  /**
68
60
  * Copies `source`'s levels into this empty Lod (it throws otherwise). The copies share
@@ -70,9 +62,6 @@ export declare class Lod extends Object3D<LevelsEventMap> {
70
62
  * settings and each level's `maxPixels` come along.
71
63
  */
72
64
  copy(source: Lod): this;
73
- /**
74
- * Frees every level, the source included: geometries, materials and their textures.
75
- * Clones share them, so dispose a Lod only once no clone draws any more.
76
- */
65
+ /** Release drawables and templates only after every owner sharing their geometry, materials and textures has stopped drawing. */
77
66
  dispose(): void;
78
67
  }
package/dist/lod.js CHANGED
@@ -1,38 +1,30 @@
1
1
  import { Object3D, Sphere } from "three/webgpu";
2
- import { measureLevels } from "./bounds.js";
3
- import { disposeTree } from "./dispose.js";
2
+ import { at } from "./at.js";
3
+ import { compileLevel } from "./compile.js";
4
+ import { measureLevels, prepareBounds } from "./bounds.js";
5
+ import { disposeCopies } from "./dispose.js";
4
6
  import { setDraw } from "./fade.js";
5
7
  import { levelMaterial } from "./material.js";
6
- import { available, fallbacks, inView } from "./lazy.js";
7
- import { FADE, Level, cloneLevels, copyThresholds, estimate, fadeProgress, levelAt, tintLevels, validate } from "./levels.js";
8
- import { inShadowPass, isLazyImpostor, isImpostorMesh, isLOD, isMesh, rejectSkinned } from "./three.js";
9
- import { TYPICAL_HEIGHT, View, viewportHeight, watchViewport } from "./view.js";
8
+ import { Residency, handover } from "./residency.js";
9
+ import { FADE, Level, cloneLevels, estimate, fadeProgress, levelAt, demandLevels, tintLevels, validate } from "./levels.js";
10
+ import { inShadowPass, isImpostorMesh, isLOD, isMesh, rejectSkinned } from "./three.js";
11
+ import { TYPICAL_HEIGHT, View, viewportHeight, watchViewport, watchContext, unwatchContext, inView } from "./view.js";
10
12
  import { WIND_BOUNDS } from "./wind/hooks.js";
11
13
  import { copyWind, refreshWind } from "./wind/index.js";
12
14
  const view = new View();
13
15
  /**
14
- * Levels of detail of one object, switched by its height on screen. Level 0 is the
15
- * source; each further level is used while the object is at most its `maxPixels` tall
16
- * (see `LodLevel.maxPixels` for the defaults). Near a switch both neighbours draw and
17
- * split the pixels with a dither, so nothing pops; elsewhere exactly one level is visible
18
- * and the others are hidden. Shadows follow the camera's choice and fade with it; nothing
19
- * of the object is drawn into a directional light's shadow map whose texels are wider
20
- * than the whole object: it could cover a texel only by chance.
16
+ * One object's levels, switched by on-screen height with dithered transitions.
17
+ * The renderer updates selection before shadows; each camera uses its last drawn
18
+ * viewport height (1080 until known). Orthographic views switch without fading.
19
+ * Shadows follow selection and omit casters smaller than a shadow texel.
21
20
  *
22
- * three's renderer calls `update(camera)` while it lists the scene (as for its own LOD),
23
- * before shadow maps render; the calls its shadow passes make are ignored. The height
24
- * uses the viewport the camera last drew one of the levels' meshes in, in CSS pixels
25
- * (1080 before that), so several views each get their own. An orthographic camera has
26
- * no distance to dither by: levels switch by on-screen size there too, but at once.
21
+ * Eager and deferred objects are cloned into this owner's space. A nested Lod selects
22
+ * and fades its own levels. Lines, points and sprites draw without fading or reporting
23
+ * viewport height. Raycasts hit the source only.
27
24
  *
28
- * Levels are children of the Lod in its space, any Object3D: meshes, an ImpostorMesh, a
29
- * group, another Lod. Each mesh draws with a faded copy of its material, which every Lod
30
- * drawing that material shares. Lines, points and sprites are drawn but neither fade nor
31
- * tell the Lod the viewport height. A nested Lod hands over to its neighbours at once.
32
- * Raycasts hit the source only.
33
- *
34
- * Levels are read when the Lod is built: meshes added to a level later, or moved within
35
- * it, are neither faded nor measured right. Build a new Lod instead.
25
+ * Build a new Lod after adding or moving meshes within a level: geometry is measured
26
+ * and hooked at construction or arrival. Skinned meshes and ShaderMaterials are
27
+ * refused; use static meshes with node materials or supported built-in materials.
36
28
  */
37
29
  export class Lod extends Object3D {
38
30
  /** Multiplies every measured height: below 1, cheaper levels take over sooner. */
@@ -57,8 +49,13 @@ export class Lod extends Object3D {
57
49
  sphere = new Sphere();
58
50
  casterRadius = 0;
59
51
  disposed = false;
60
- installed = new Set();
61
- fallback = [];
52
+ residency = new Residency(this.entries, (level, object, context) => this.install(level, object, context), () => this.dispatchEvent({ type: "levelschange" }), (error) => this.dispatchEvent({ type: "levelserror", error }));
53
+ get pending() {
54
+ return this.residency.pending;
55
+ }
56
+ get error() {
57
+ return this.residency.error;
58
+ }
62
59
  /**
63
60
  * `levels[0]` is the source. Empty only as the target of `copy`. A source that draws
64
61
  * nothing (an empty Object3D, for detail another system draws) is measured by the
@@ -70,37 +67,29 @@ export class Lod extends Object3D {
70
67
  if (levels.length > 0)
71
68
  this.build(levels);
72
69
  }
73
- build(objects) {
74
- const [source] = objects;
75
- if (!source)
76
- throw new Error("Lod: needs at least the source level");
77
- if (isLazyImpostor(source))
78
- throw new Error("Lod: the source level must be eager");
79
- for (const object of objects)
80
- if (isLazyImpostor(object)) {
81
- object.materialize();
82
- }
83
- for (const object of objects)
84
- rejectSkinned(object, "Lod");
85
- const { own, placed } = measureLevels(objects, "Lod");
70
+ build(inputs) {
71
+ const { own, placed } = measureLevels(inputs, "Lod");
86
72
  this.sphere = placed;
87
73
  this.casterRadius = placed.radius;
88
- this.add(...objects);
89
- objects.forEach((object, i) => {
90
- const level = new Level(object, i, isLOD(object), this.entries);
74
+ let drawable = false;
75
+ inputs.forEach((input, i) => {
76
+ const level = new Level(input, i, this.entries);
91
77
  const draw = { kind: "object", fade: 0, diameter: 0, tint: level.tint };
92
78
  this.entries.push(level);
93
79
  this.draws.push(draw);
80
+ const { object } = level;
81
+ if (!object)
82
+ return;
83
+ rejectSkinned(object, "Lod");
84
+ this.add(object);
94
85
  this.hook(object, draw, level.nested, object);
95
- if (available(object))
96
- this.installed.add(object);
86
+ drawable ||= drawsMesh(object);
97
87
  });
98
88
  estimate(this.entries, 2 * own.radius);
99
- this.fallback = fallbacks(objects);
89
+ this.residency.reset();
100
90
  validate(this.entries);
101
- for (const object of objects)
102
- if (isLazyImpostor(object))
103
- object.retain();
91
+ if (!drawable)
92
+ watchContext(this);
104
93
  }
105
94
  /** Fade the meshes under `node` by `draw` and learn the viewport height from them; an inner Lod fades its own. */
106
95
  hook(node, draw, nested, level) {
@@ -120,61 +109,72 @@ export class Lod extends Object3D {
120
109
  [WIND_BOUNDS](padding) {
121
110
  this.casterRadius += padding;
122
111
  }
123
- /** Pick and fade levels for `camera`; three's renderer calls this itself while `autoUpdate`. */
112
+ /** Pick and fade levels for `camera`; detail starts after a draw supplies its render context. */
124
113
  update(camera) {
125
114
  const { entries, draws } = this;
126
115
  if (this.disposed || entries.length === 0 || inShadowPass(this))
127
116
  return;
128
- let changed = false;
129
- if (this.installed.size < entries.length)
130
- entries.forEach((entry, i) => {
131
- if (!isLazyImpostor(entry.object) || this.installed.has(entry.object))
132
- return;
133
- entry.object.materialize();
134
- if (!available(entry.object))
135
- return;
136
- const draw = draws[i];
137
- if (!draw)
138
- throw new Error("Lod: missing lazy draw");
139
- this.hook(entry.object, draw, false, entry.object);
140
- this.installed.add(entry.object);
141
- changed = true;
142
- });
143
- if (changed) {
144
- this.fallback = fallbacks(entries.map((entry) => entry.object));
145
- refreshWind(this);
146
- this.updateWorldMatrix(true, true);
147
- this.dispatchEvent({ type: "levelschange" });
148
- }
149
117
  validate(entries);
150
118
  view.begin(camera, viewportHeight(camera) ?? TYPICAL_HEIGHT, this.forceLevel);
151
119
  tintLevels(entries, Lod.debug);
152
120
  const height = view.pixels(this.matrixWorld, this.sphere) * Lod.quality;
153
121
  const desired = levelAt(entries, height, this.forceLevel);
154
- if (isLazyImpostor(desired.object) && desired.object.status === "idle" && inView(camera, this.matrixWorld, this.sphere))
155
- desired.object.request();
156
- const fallback = this.fallback;
157
- const level = entries[fallback[desired.index] ?? 0];
158
- let t = view.fades ? fadeProgress(entries, desired, height) : 0;
159
- const neighbour = t > 0 ? entries[desired.index - 1]?.object : undefined;
160
- if (neighbour && isLazyImpostor(neighbour) && neighbour.status === "idle" && inView(camera, this.matrixWorld, this.sphere))
161
- neighbour.request();
162
- const finer = t > 0 ? entries[fallback[desired.index - 1] ?? 0] : undefined;
163
- if (level === finer)
164
- t = 0;
122
+ this.residency.demand(camera, inView(camera, this.matrixWorld, this.sphere) ? demandLevels(entries, height, this.forceLevel).map(({ index }) => index) : []);
123
+ this.residency.update(camera);
124
+ const { fallback, previous } = this.residency;
125
+ const neighbour = Math.max(0, desired.index - 1);
126
+ let level = at(fallback, desired.index);
127
+ let finer = at(fallback, neighbour);
128
+ const fade = view.fades ? fadeProgress(entries, desired, height) : 0;
129
+ let t = level === finer ? 0 : fade;
130
+ const progress = this.residency.progress;
131
+ if (progress < 1) {
132
+ const before = at(previous, desired.index);
133
+ const beforeFiner = at(previous, neighbour);
134
+ [level, finer, t] = handover([before, beforeFiner, before === beforeFiner ? 0 : fade], [level, finer, t], progress);
135
+ }
165
136
  const diameter = 2 * this.casterRadius * this.matrixWorld.getMaxScaleOnAxis();
166
137
  entries.forEach((each, i) => {
167
- const draw = draws[i];
168
- if (!draw)
169
- throw new Error("Lod: a level has no draw");
170
- draw.fade = each === level ? t : each === finer ? -t : 0;
138
+ const draw = at(draws, i);
139
+ draw.fade = i === level ? t : i === finer ? -t : 0;
171
140
  draw.diameter = diameter;
172
- each.object.visible = each === level || (t > 0 && each === finer);
141
+ if (each.object)
142
+ each.object.visible = i === level || (t > 0 && i === finer);
173
143
  });
174
144
  }
145
+ async install(level, template, context) {
146
+ const object = template.clone();
147
+ const nested = isLOD(object);
148
+ object.visible = false;
149
+ rejectSkinned(object, "Lod");
150
+ if (level.box)
151
+ prepareBounds(object, level.box);
152
+ this.hook(object, at(this.draws, level.index), nested, object);
153
+ // Parented hidden only for world matrices and wind; the level arrives after compiling.
154
+ this.add(object);
155
+ object.updateWorldMatrix(true, true);
156
+ refreshWind(this, object);
157
+ try {
158
+ await compileLevel(object, context);
159
+ }
160
+ catch (error) {
161
+ this.remove(object);
162
+ disposeCopies(object);
163
+ throw error;
164
+ }
165
+ if (this.disposed) {
166
+ this.remove(object);
167
+ disposeCopies(object);
168
+ return;
169
+ }
170
+ level.object = object;
171
+ level.nested = nested;
172
+ if (drawsMesh(object))
173
+ unwatchContext(this);
174
+ }
175
175
  raycast(raycaster, intersects) {
176
176
  const source = this.entries[0];
177
- if (source)
177
+ if (source?.object)
178
178
  raycaster.intersectObject(source.object, true, intersects);
179
179
  // Stop the raycaster from descending into the other levels.
180
180
  return false;
@@ -190,22 +190,31 @@ export class Lod extends Object3D {
190
190
  super.copy(source, false);
191
191
  if (source.entries.length > 0)
192
192
  this.build(cloneLevels(source.entries));
193
- copyThresholds(source.entries, this.entries);
194
193
  this.forceLevel = source.forceLevel;
195
194
  this.autoUpdate = source.autoUpdate;
196
195
  copyWind(source, this);
197
196
  return this;
198
197
  }
199
- /**
200
- * Frees every level, the source included: geometries, materials and their textures.
201
- * Clones share them, so dispose a Lod only once no clone draws any more.
202
- */
198
+ /** Release drawables and templates only after every owner sharing their geometry, materials and textures has stopped drawing. */
203
199
  dispose() {
204
200
  if (this.disposed)
205
201
  return;
206
202
  this.disposed = true;
207
- for (const { object } of this.entries)
208
- isLazyImpostor(object) ? object.release() : disposeTree(object);
203
+ unwatchContext(this);
204
+ this.residency.dispose(() => {
205
+ for (const { object } of this.entries)
206
+ if (object)
207
+ disposeCopies(object);
208
+ });
209
209
  }
210
210
  }
211
+ /** Whether `level` holds a mesh that draws once Lod shows it: the level's own visibility is Lod's to switch, its descendants' are not. */
212
+ function drawsMesh(level) {
213
+ let found = isMesh(level);
214
+ for (const child of level.children)
215
+ child.traverseVisible((node) => {
216
+ found ||= isMesh(node);
217
+ });
218
+ return found;
219
+ }
211
220
  //# sourceMappingURL=lod.js.map
package/dist/lod.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"lod.js","sourceRoot":"","sources":["../src/lod.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"lod.js","sourceRoot":"","sources":["../src/lod.ts"],"names":[],"mappings":"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"}
package/dist/material.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { Fn, output, positionLocal, vec4 } from "three/tsl";
2
- import { castPosition, keepsPixel, tint } from "./fade.js";
2
+ import { castPosition, keepsPixel, placeInstances, tint } from "./fade.js";
3
3
  import { toNodeMaterial } from "./three.js";
4
4
  import { isNodeOf } from "./tsl.js";
5
5
  import { sway } from "./wind/sway.js";
@@ -36,12 +36,17 @@ export function levelMaterial(material, swaying = false) {
36
36
  // The tint goes on what the material outputs: its colour slot is left as it is.
37
37
  copy.outputNode = Fn((builder) => (outputNode ? slot(outputNode, "vec4", builder) : output).mul(vec4(tint, 1)))();
38
38
  const position = (builder) => {
39
+ placeInstances(builder);
39
40
  const own = positionNode ? slot(positionNode, "vec3", builder) : positionLocal;
40
41
  return swaying ? sway(own) : own;
41
42
  };
42
- if (swaying || positionNode)
43
- copy.positionNode = Fn(position)();
44
- copy.castShadowPositionNode = Fn((builder) => castPosition(castShadowPositionNode ? slot(castShadowPositionNode, "vec3", builder) : position(builder)))();
43
+ copy.positionNode = Fn(position)();
44
+ copy.castShadowPositionNode = Fn((builder) => {
45
+ if (!castShadowPositionNode)
46
+ return castPosition(position(builder));
47
+ placeInstances(builder);
48
+ return castPosition(slot(castShadowPositionNode, "vec3", builder));
49
+ })();
45
50
  known[kind] = copy;
46
51
  originals.set(copy, original);
47
52
  original.addEventListener("dispose", () => copy.dispose());
@@ -1 +1 @@
1
- {"version":3,"file":"material.js","sourceRoot":"","sources":["../src/material.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"material.js","sourceRoot":"","sources":["../src/material.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { Object3D, type Material } from "three/webgpu";
2
+ /** Store a static hierarchy's geometry and material slots. Decode with the same ordered material list; materials and textures are never serialized. */
3
+ export declare function encodeMesh(object: Object3D, materials: readonly Material[]): Uint8Array;
4
+ export declare function decodeMeshAsync(input: Uint8Array, materials: readonly Material[]): Promise<Object3D>;