@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.
- package/README.md +10 -69
- package/dist/at.d.ts +2 -0
- package/dist/at.js +8 -0
- package/dist/at.js.map +1 -0
- package/dist/baked/codec.d.ts +6 -3
- package/dist/baked/codec.js +22 -16
- package/dist/baked/codec.js.map +1 -1
- package/dist/baked/coverage.d.ts +3 -0
- package/dist/baked/coverage.js +45 -0
- package/dist/baked/coverage.js.map +1 -0
- package/dist/baked/index.d.ts +4 -0
- package/dist/baked/index.js +3 -35
- package/dist/baked/index.js.map +1 -1
- package/dist/baked/low.d.ts +2 -2
- package/dist/baked/low.js +4 -4
- package/dist/baked/low.js.map +1 -1
- package/dist/bounds.d.ts +12 -2
- package/dist/bounds.js +72 -10
- package/dist/bounds.js.map +1 -1
- package/dist/compile.d.ts +4 -0
- package/dist/compile.js +100 -0
- package/dist/compile.js.map +1 -0
- package/dist/deferred.d.ts +12 -0
- package/dist/deferred.js +27 -0
- package/dist/deferred.js.map +1 -0
- package/dist/dispose.d.ts +7 -3
- package/dist/dispose.js +33 -4
- package/dist/dispose.js.map +1 -1
- package/dist/fade.d.ts +5 -13
- package/dist/fade.js +62 -28
- package/dist/fade.js.map +1 -1
- package/dist/impostor/bake/index.d.ts +1 -0
- package/dist/impostor/bake/index.js +1 -0
- package/dist/impostor/bake/index.js.map +1 -1
- package/dist/impostor/bake/materials.js +11 -1
- package/dist/impostor/bake/materials.js.map +1 -1
- package/dist/impostor/codec.d.ts +2 -7
- package/dist/impostor/codec.js +16 -27
- package/dist/impostor/codec.js.map +1 -1
- package/dist/impostor/mesh/card.js +4 -1
- package/dist/impostor/mesh/card.js.map +1 -1
- package/dist/impostor/mesh/index.d.ts +6 -4
- package/dist/impostor/mesh/index.js +8 -10
- package/dist/impostor/mesh/index.js.map +1 -1
- package/dist/impostor/mesh/material.d.ts +7 -5
- package/dist/impostor/mesh/material.js +29 -26
- package/dist/impostor/mesh/material.js.map +1 -1
- package/dist/impostor/mesh/surface.d.ts +20 -16
- package/dist/impostor/mesh/surface.js +74 -55
- package/dist/impostor/mesh/surface.js.map +1 -1
- package/dist/impostor/octahedral.d.ts +1 -8
- package/dist/impostor/octahedral.js +3 -18
- package/dist/impostor/octahedral.js.map +1 -1
- package/dist/index.d.ts +7 -6
- package/dist/index.js +5 -4
- package/dist/index.js.map +1 -1
- package/dist/instanced/args.js +2 -2
- package/dist/instanced/args.js.map +1 -1
- package/dist/instanced/{bounds.d.ts → blocks.d.ts} +25 -9
- package/dist/instanced/{bounds.js → blocks.js} +76 -53
- package/dist/instanced/blocks.js.map +1 -0
- package/dist/instanced/dirty.d.ts +3 -0
- package/dist/instanced/dirty.js +40 -5
- package/dist/instanced/dirty.js.map +1 -1
- package/dist/instanced/index.d.ts +25 -51
- package/dist/instanced/index.js +189 -413
- package/dist/instanced/index.js.map +1 -1
- package/dist/instanced/meshes.d.ts +54 -13
- package/dist/instanced/meshes.js +178 -41
- package/dist/instanced/meshes.js.map +1 -1
- package/dist/instanced/parts.d.ts +14 -0
- package/dist/instanced/parts.js +79 -0
- package/dist/instanced/parts.js.map +1 -0
- package/dist/instanced/raycast.d.ts +13 -0
- package/dist/instanced/raycast.js +53 -0
- package/dist/instanced/raycast.js.map +1 -0
- package/dist/instanced/select.d.ts +17 -9
- package/dist/instanced/select.js +114 -63
- package/dist/instanced/select.js.map +1 -1
- package/dist/instanced/store.d.ts +31 -0
- package/dist/instanced/store.js +96 -0
- package/dist/instanced/store.js.map +1 -0
- package/dist/levels.d.ts +71 -48
- package/dist/levels.js +99 -74
- package/dist/levels.js.map +1 -1
- package/dist/loader/bundle.d.ts +25 -0
- package/dist/loader/bundle.js +241 -0
- package/dist/loader/bundle.js.map +1 -0
- package/dist/loader/cache.d.ts +15 -15
- package/dist/loader/cache.js +71 -33
- package/dist/loader/cache.js.map +1 -1
- package/dist/loader/provenance.d.ts +30 -0
- package/dist/loader/provenance.js +105 -0
- package/dist/loader/provenance.js.map +1 -0
- package/dist/loader/url.d.ts +13 -0
- package/dist/loader/url.js +31 -0
- package/dist/loader/url.js.map +1 -0
- package/dist/loader.d.ts +30 -74
- package/dist/loader.js +191 -186
- package/dist/loader.js.map +1 -1
- package/dist/lod.d.ts +20 -31
- package/dist/lod.js +105 -96
- package/dist/lod.js.map +1 -1
- package/dist/material.js +9 -4
- package/dist/material.js.map +1 -1
- package/dist/mesh/codec.d.ts +4 -0
- package/dist/mesh/codec.js +192 -0
- package/dist/mesh/codec.js.map +1 -0
- package/dist/queue.d.ts +2 -0
- package/dist/queue.js +33 -0
- package/dist/queue.js.map +1 -0
- package/dist/residency.d.ts +44 -0
- package/dist/residency.js +205 -0
- package/dist/residency.js.map +1 -0
- package/dist/simplify.js +5 -3
- package/dist/simplify.js.map +1 -1
- package/dist/source/{error.d.ts → deviation.d.ts} +3 -3
- package/dist/source/{error.js → deviation.js} +6 -6
- package/dist/source/deviation.js.map +1 -0
- package/dist/source/source.d.ts +1 -1
- package/dist/source/source.js +1 -1
- package/dist/three.d.ts +17 -5
- package/dist/three.js +24 -3
- package/dist/three.js.map +1 -1
- package/dist/tsl.d.ts +5 -5
- package/dist/tsl.js +12 -19
- package/dist/tsl.js.map +1 -1
- package/dist/view.d.ts +16 -1
- package/dist/view.js +57 -1
- package/dist/view.js.map +1 -1
- package/dist/wind/index.d.ts +2 -2
- package/dist/wind/index.js +31 -28
- package/dist/wind/index.js.map +1 -1
- package/dist/wind/sway.d.ts +2 -1
- package/package.json +9 -3
- package/skills/lod/SKILL.md +71 -109
- package/dist/impostor/cache.d.ts +0 -15
- package/dist/impostor/cache.js +0 -44
- package/dist/impostor/cache.js.map +0 -1
- package/dist/instanced/bounds.js.map +0 -1
- package/dist/lazy.d.ts +0 -64
- package/dist/lazy.js +0 -187
- package/dist/lazy.js.map +0 -1
- package/dist/loader/dispose.d.ts +0 -3
- package/dist/loader/dispose.js +0 -25
- package/dist/loader/dispose.js.map +0 -1
- 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 "./
|
|
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
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
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
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
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
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
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
|
|
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
|
|
53
|
-
|
|
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?:
|
|
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`;
|
|
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 {
|
|
3
|
-
import {
|
|
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 {
|
|
7
|
-
import { FADE, Level, cloneLevels,
|
|
8
|
-
import { inShadowPass,
|
|
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
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
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
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
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
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
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
|
-
|
|
61
|
-
|
|
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(
|
|
74
|
-
const
|
|
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
|
-
|
|
89
|
-
|
|
90
|
-
const level = new Level(
|
|
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
|
-
|
|
96
|
-
this.installed.add(object);
|
|
86
|
+
drawable ||= drawsMesh(object);
|
|
97
87
|
});
|
|
98
88
|
estimate(this.entries, 2 * own.radius);
|
|
99
|
-
this.
|
|
89
|
+
this.residency.reset();
|
|
100
90
|
validate(this.entries);
|
|
101
|
-
|
|
102
|
-
|
|
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`;
|
|
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
|
-
|
|
155
|
-
|
|
156
|
-
const fallback = this.
|
|
157
|
-
const
|
|
158
|
-
let
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
const
|
|
163
|
-
if (
|
|
164
|
-
|
|
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
|
|
168
|
-
|
|
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
|
|
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
|
-
|
|
208
|
-
|
|
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":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAkD,MAAM,cAAc,CAAC;AAChG,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;
|
|
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
|
-
|
|
43
|
-
|
|
44
|
-
|
|
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());
|
package/dist/material.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"material.js","sourceRoot":"","sources":["../src/material.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
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>;
|