@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/bounds.js
CHANGED
|
@@ -38,8 +38,8 @@ function walk(node, placement, visit) {
|
|
|
38
38
|
export function detailed(node) {
|
|
39
39
|
if (!isLOD(node))
|
|
40
40
|
return node.children.filter((child) => child.visible);
|
|
41
|
-
const source = node.levels[0];
|
|
42
|
-
return source ? [source
|
|
41
|
+
const source = node.levels[0]?.object;
|
|
42
|
+
return source ? [source] : [];
|
|
43
43
|
}
|
|
44
44
|
/** `node`'s matrix in its parent's space, up to date. */
|
|
45
45
|
function local(node) {
|
|
@@ -55,7 +55,10 @@ export function showDetail(root) {
|
|
|
55
55
|
}
|
|
56
56
|
if (isLOD(root)) {
|
|
57
57
|
root.autoUpdate = false;
|
|
58
|
-
root.levels.forEach((level, i) =>
|
|
58
|
+
root.levels.forEach((level, i) => {
|
|
59
|
+
if (level.object)
|
|
60
|
+
level.object.visible = i === 0;
|
|
61
|
+
});
|
|
59
62
|
}
|
|
60
63
|
for (const child of detailed(root))
|
|
61
64
|
showDetail(child);
|
|
@@ -94,12 +97,52 @@ export function forEachVertex(root, visit) {
|
|
|
94
97
|
visit(mesh.getVertexPosition(i, point).applyMatrix4(placement));
|
|
95
98
|
});
|
|
96
99
|
}
|
|
97
|
-
/**
|
|
100
|
+
/** Conservative full-detail bounds from cached geometry boxes and deferred metadata, in the root's space. */
|
|
98
101
|
export function boundingBox(root) {
|
|
99
102
|
const box = new Box3();
|
|
100
|
-
|
|
103
|
+
boxes(root, new Matrix4(), box);
|
|
101
104
|
return box;
|
|
102
105
|
}
|
|
106
|
+
function boxes(node, placement, box) {
|
|
107
|
+
if (isInstancedLod(node)) {
|
|
108
|
+
const source = node.levels[0];
|
|
109
|
+
if (!source)
|
|
110
|
+
return;
|
|
111
|
+
const own = levelBox(source);
|
|
112
|
+
const instance = new Matrix4();
|
|
113
|
+
for (let i = 0; i < node.count; i++)
|
|
114
|
+
box.union(own.clone().applyMatrix4(node.getMatrixAt(i, instance).premultiply(placement)));
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
if (isLOD(node) && !node.levels[0]?.object) {
|
|
118
|
+
const metadata = node.levels[0]?.box;
|
|
119
|
+
if (metadata)
|
|
120
|
+
box.union(metadata.clone().applyMatrix4(placement));
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
if (isMesh(node) && [node.material].flat().some((material) => material.visible && material.colorWrite)) {
|
|
124
|
+
if (isBatchedMesh(node)) {
|
|
125
|
+
if (!node.boundingBox)
|
|
126
|
+
node.computeBoundingBox();
|
|
127
|
+
if (node.boundingBox)
|
|
128
|
+
box.union(node.boundingBox.clone().applyMatrix4(placement));
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
if (!node.geometry.boundingBox)
|
|
132
|
+
node.geometry.computeBoundingBox();
|
|
133
|
+
const own = node.geometry.boundingBox;
|
|
134
|
+
if (own && (isInstancedMesh(node) || isImpostorMesh(node))) {
|
|
135
|
+
const instance = new Matrix4();
|
|
136
|
+
for (let i = 0; i < node.count; i++)
|
|
137
|
+
box.union(own.clone().applyMatrix4(node.getMatrixAt(i, instance).premultiply(placement)));
|
|
138
|
+
}
|
|
139
|
+
else if (own)
|
|
140
|
+
box.union(own.clone().applyMatrix4(placement));
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
for (const child of detailed(node))
|
|
144
|
+
boxes(child, local(child).premultiply(placement), box);
|
|
145
|
+
}
|
|
103
146
|
/** The centre and half diagonal of `boundingBox(root)`: an impostor baked from `root` has the same box. */
|
|
104
147
|
export function boundingSphere(root) {
|
|
105
148
|
const sphere = sphereOf(boundingBox(root));
|
|
@@ -114,14 +157,33 @@ const sphereOf = (box) => (box.isEmpty() ? null : new Sphere(box.getCenter(new V
|
|
|
114
157
|
* own space, `placed` in its parent's (the Lod's). `who` names the caller in the error.
|
|
115
158
|
*/
|
|
116
159
|
export function measureLevels(levels, who) {
|
|
117
|
-
for (const
|
|
118
|
-
const own = sphereOf(boundingBox(
|
|
160
|
+
for (const { object, box } of levels) {
|
|
161
|
+
const own = sphereOf(object ? boundingBox(object) : (box ?? new Box3()));
|
|
119
162
|
if (!own)
|
|
120
163
|
continue;
|
|
121
|
-
|
|
122
|
-
level.updateMatrix();
|
|
123
|
-
return { own, placed: own.clone().applyMatrix4(level.matrix) };
|
|
164
|
+
return { own, placed: object ? own.clone().applyMatrix4(local(object)) : own.clone() };
|
|
124
165
|
}
|
|
125
166
|
throw new Error(`${who}: no level has visible geometry to measure`);
|
|
126
167
|
}
|
|
168
|
+
/** A level's bounds in its owner's space, including an eager object's transform. */
|
|
169
|
+
export function levelBox(level) {
|
|
170
|
+
if (level.box)
|
|
171
|
+
return level.box.clone();
|
|
172
|
+
return level.object ? boundingBox(level.object).applyMatrix4(local(level.object)) : new Box3();
|
|
173
|
+
}
|
|
174
|
+
/** Fill absent mesh bounds conservatively from a deferred level's declared box, without reading vertices. */
|
|
175
|
+
export function prepareBounds(root, box) {
|
|
176
|
+
const visit = (node, placement) => {
|
|
177
|
+
if (isMesh(node)) {
|
|
178
|
+
if (placement.determinant() === 0)
|
|
179
|
+
throw new Error("Lod: mesh placement must be invertible");
|
|
180
|
+
const geometry = node.geometry;
|
|
181
|
+
geometry.boundingBox ??= box.clone().applyMatrix4(placement.clone().invert());
|
|
182
|
+
geometry.boundingSphere ??= geometry.boundingBox.getBoundingSphere(new Sphere());
|
|
183
|
+
}
|
|
184
|
+
for (const child of node.children)
|
|
185
|
+
visit(child, local(child).premultiply(placement));
|
|
186
|
+
};
|
|
187
|
+
visit(root, local(root));
|
|
188
|
+
}
|
|
127
189
|
//# sourceMappingURL=bounds.js.map
|
package/dist/bounds.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bounds.js","sourceRoot":"","sources":["../src/bounds.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAA4B,MAAM,cAAc,CAAC;AACxF,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,cAAc,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAE3G,2FAA2F;AAE3F;;;;;;;GAOG;AACH,MAAM,UAAU,WAAW,CAAC,IAAc,EAAE,KAA+C;IACzF,IAAI,CAAC,IAAI,EAAE,IAAI,OAAO,EAAE,EAAE,KAAK,CAAC,CAAC;AACnC,CAAC;AAED,+EAA+E;AAC/E,SAAS,IAAI,CAAC,IAAc,EAAE,SAAkB,EAAE,KAA+C;IAC/F,IAAI,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;QACzB,4EAA4E;QAC5E,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC;QACtC,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,MAAM,QAAQ,GAAG,IAAI,OAAO,EAAE,CAAC;QAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE;YAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC,CAAC;QAC1I,OAAO;IACT,CAAC;IACD,IAAI,eAAe,CAAC,IAAI,CAAC,IAAI,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;QAClD,MAAM,QAAQ,GAAG,IAAI,OAAO,EAAE,CAAC;QAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE;YAAE,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC;IACzG,CAAC;SAAM,IAAI,MAAM,CAAC,IAAI,CAAC;QAAE,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAChD,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,IAAI,CAAC;QAAE,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC,CAAC;AAC9F,CAAC;AAED,mHAAmH;AACnH,MAAM,UAAU,QAAQ,CAAC,IAAc;IACrC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACxE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"bounds.js","sourceRoot":"","sources":["../src/bounds.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { Object3D } from "three/webgpu";
|
|
2
|
+
import type { RenderContext } from "./view.js";
|
|
3
|
+
/** Prepare the same target and MRT as the viewing draw, even if normal rendering has since restored the canvas. */
|
|
4
|
+
export declare function compileLevel(object: Object3D, context: RenderContext): Promise<void>;
|
package/dist/compile.js
ADDED
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { gpuQueue, isMesh, isNode, isTexture } from "./three.js";
|
|
2
|
+
import { pause } from "./pause.js";
|
|
3
|
+
/** Prepare the same target and MRT as the viewing draw, even if normal rendering has since restored the canvas. */
|
|
4
|
+
export async function compileLevel(object, context) {
|
|
5
|
+
// Throttle new uploads behind submitted work instead of blocking inside writeTexture.
|
|
6
|
+
const queue = gpuQueue(context.renderer);
|
|
7
|
+
for (const texture of textures(object)) {
|
|
8
|
+
await queue.onSubmittedWorkDone();
|
|
9
|
+
context.renderer.initTexture(texture);
|
|
10
|
+
await pause();
|
|
11
|
+
}
|
|
12
|
+
const meshes = [];
|
|
13
|
+
const collect = (node) => {
|
|
14
|
+
if (isMesh(node))
|
|
15
|
+
meshes.push(node);
|
|
16
|
+
};
|
|
17
|
+
object.traverse(collect);
|
|
18
|
+
for (const mesh of meshes) {
|
|
19
|
+
const groups = mesh.geometry.groups;
|
|
20
|
+
if (!Array.isArray(mesh.material)) {
|
|
21
|
+
await queue.onSubmittedWorkDone();
|
|
22
|
+
await compileMesh(mesh, context);
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
for (const group of groups) {
|
|
26
|
+
await queue.onSubmittedWorkDone();
|
|
27
|
+
let pending;
|
|
28
|
+
try {
|
|
29
|
+
mesh.geometry.groups = [group];
|
|
30
|
+
pending = compileMesh(mesh, context);
|
|
31
|
+
}
|
|
32
|
+
finally {
|
|
33
|
+
mesh.geometry.groups = groups;
|
|
34
|
+
}
|
|
35
|
+
await pending;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
function compileMesh(mesh, context) {
|
|
40
|
+
const { renderer, camera, scene } = context;
|
|
41
|
+
const target = renderer.getRenderTarget();
|
|
42
|
+
const mrt = renderer.getMRT();
|
|
43
|
+
const cubeFace = renderer.getActiveCubeFace();
|
|
44
|
+
const mipLevel = renderer.getActiveMipmapLevel();
|
|
45
|
+
const culled = mesh.frustumCulled;
|
|
46
|
+
const visible = mesh.visible;
|
|
47
|
+
const children = mesh.children;
|
|
48
|
+
const background = scene.background;
|
|
49
|
+
const backgroundNode = scene.backgroundNode;
|
|
50
|
+
try {
|
|
51
|
+
renderer.setRenderTarget(context.target, context.cubeFace, context.mipLevel);
|
|
52
|
+
renderer.setMRT(context.mrt);
|
|
53
|
+
// Demanded levels can still be hidden or outside the last view.
|
|
54
|
+
mesh.frustumCulled = false;
|
|
55
|
+
mesh.visible = true;
|
|
56
|
+
mesh.children = [];
|
|
57
|
+
// r185 compiles backgrounds first, which would postpone this mesh until after renderer state is restored.
|
|
58
|
+
scene.background = null;
|
|
59
|
+
scene.backgroundNode = null;
|
|
60
|
+
// r185 starts only the first material before yielding; isolate one draw so setup sees its captured target/MRT.
|
|
61
|
+
return renderer.compileAsync(mesh, camera, scene);
|
|
62
|
+
}
|
|
63
|
+
finally {
|
|
64
|
+
scene.background = background;
|
|
65
|
+
scene.backgroundNode = backgroundNode;
|
|
66
|
+
mesh.children = children;
|
|
67
|
+
mesh.frustumCulled = culled;
|
|
68
|
+
mesh.visible = visible;
|
|
69
|
+
renderer.setRenderTarget(target, cubeFace, mipLevel);
|
|
70
|
+
renderer.setMRT(mrt);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
function textures(object) {
|
|
74
|
+
const found = new Set();
|
|
75
|
+
const visited = new Set();
|
|
76
|
+
const visit = (node) => {
|
|
77
|
+
if (visited.has(node))
|
|
78
|
+
return;
|
|
79
|
+
visited.add(node);
|
|
80
|
+
const value = Reflect.get(node, "value");
|
|
81
|
+
if (isTexture(value))
|
|
82
|
+
found.add(value);
|
|
83
|
+
for (const child of node.getChildren())
|
|
84
|
+
visit(child);
|
|
85
|
+
};
|
|
86
|
+
object.traverse((node) => {
|
|
87
|
+
if (!isMesh(node))
|
|
88
|
+
return;
|
|
89
|
+
for (const material of [node.material].flat()) {
|
|
90
|
+
for (const value of Object.values(material)) {
|
|
91
|
+
if (isTexture(value))
|
|
92
|
+
found.add(value);
|
|
93
|
+
else if (isNode(value))
|
|
94
|
+
visit(value);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
return found;
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=compile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compile.js","sourceRoot":"","sources":["../src/compile.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Object3D } from "three/webgpu";
|
|
2
|
+
type Load = () => Promise<Object3D>;
|
|
3
|
+
interface Loading {
|
|
4
|
+
promise: Promise<Object3D>;
|
|
5
|
+
object?: Object3D;
|
|
6
|
+
error?: Error;
|
|
7
|
+
}
|
|
8
|
+
/** The load `loadOnce` started for `load`, if any. */
|
|
9
|
+
export declare const loading: (load: Load) => Loading | undefined;
|
|
10
|
+
/** Material dependencies and owners share one load and one resource lifetime. */
|
|
11
|
+
export declare function loadOnce(load: Load): Loading;
|
|
12
|
+
export {};
|
package/dist/deferred.js
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { isObject3D } from "./three.js";
|
|
2
|
+
const started = new WeakMap();
|
|
3
|
+
/** The load `loadOnce` started for `load`, if any. */
|
|
4
|
+
export const loading = (load) => started.get(load);
|
|
5
|
+
/** Material dependencies and owners share one load and one resource lifetime. */
|
|
6
|
+
export function loadOnce(load) {
|
|
7
|
+
const existing = started.get(load);
|
|
8
|
+
if (existing)
|
|
9
|
+
return existing;
|
|
10
|
+
const entry = {
|
|
11
|
+
promise: Promise.resolve()
|
|
12
|
+
.then(load)
|
|
13
|
+
.then((object) => {
|
|
14
|
+
if (!isObject3D(object))
|
|
15
|
+
throw new Error("Lod: load must return an Object3D");
|
|
16
|
+
entry.object = object;
|
|
17
|
+
return object;
|
|
18
|
+
})
|
|
19
|
+
.catch((error) => {
|
|
20
|
+
entry.error = error instanceof Error ? error : new Error("Lod: load failed", { cause: error });
|
|
21
|
+
throw entry.error;
|
|
22
|
+
}),
|
|
23
|
+
};
|
|
24
|
+
started.set(load, entry);
|
|
25
|
+
return entry;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=deferred.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deferred.js","sourceRoot":"","sources":["../src/deferred.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAQxC,MAAM,OAAO,GAAG,IAAI,OAAO,EAAiB,CAAC;AAE7C,sDAAsD;AACtD,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,IAAU,EAAuB,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAE9E,iFAAiF;AACjF,MAAM,UAAU,QAAQ,CAAC,IAAU;IACjC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACnC,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC9B,MAAM,KAAK,GAAY;QACrB,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE;aACvB,IAAI,CAAC,IAAI,CAAC;aACV,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;YACf,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;YAC9E,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;YACtB,OAAO,MAAM,CAAC;QAChB,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;YACxB,KAAK,CAAC,KAAK,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,kBAAkB,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;YAC/F,MAAM,KAAK,CAAC,KAAK,CAAC;QACpB,CAAC,CAAC;KACL,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACzB,OAAO,KAAK,CAAC;AACf,CAAC"}
|
package/dist/dispose.d.ts
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { Object3D } from "three/webgpu";
|
|
2
|
+
/** Derived geometry keeps its source materials; their owner releases them. */
|
|
3
|
+
export declare function borrowMaterials(root: Object3D): void;
|
|
4
|
+
/** Clones share source geometry, materials and textures; only their own draw state is released here. */
|
|
5
|
+
export declare function disposeCopies(node: Object3D): void;
|
|
2
6
|
/** Free what `node` and its descendants hold; a nested LOD or an ImpostorMesh frees itself. */
|
|
3
7
|
export declare function disposeTree(node: Object3D): void;
|
|
4
|
-
/**
|
|
5
|
-
export declare function
|
|
8
|
+
/** Cleanup must not replace the failure that rejected a load or prevent the other levels from being released. */
|
|
9
|
+
export declare function disposeRejected(node: Object3D): void;
|
package/dist/dispose.js
CHANGED
|
@@ -1,22 +1,42 @@
|
|
|
1
1
|
import { originalOf } from "./material.js";
|
|
2
|
-
import { isImpostorMesh, isLOD, isMesh, isTexture } from "./three.js";
|
|
2
|
+
import { isGLTSScene, isImpostorMesh, isInstancedMesh, isLOD, isMesh, isTexture } from "./three.js";
|
|
3
|
+
const borrowed = new WeakSet();
|
|
4
|
+
/** Derived geometry keeps its source materials; their owner releases them. */
|
|
5
|
+
export function borrowMaterials(root) {
|
|
6
|
+
root.traverse((node) => {
|
|
7
|
+
if (isMesh(node))
|
|
8
|
+
borrowed.add(node);
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
/** Clones share source geometry, materials and textures; only their own draw state is released here. */
|
|
12
|
+
export function disposeCopies(node) {
|
|
13
|
+
if ((isImpostorMesh(node) || isLOD(node)) && "dispose" in node && typeof node.dispose === "function") {
|
|
14
|
+
node.dispose();
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
if (isInstancedMesh(node))
|
|
18
|
+
node.dispose();
|
|
19
|
+
for (const child of node.children)
|
|
20
|
+
disposeCopies(child);
|
|
21
|
+
}
|
|
3
22
|
/** Free what `node` and its descendants hold; a nested LOD or an ImpostorMesh frees itself. */
|
|
4
23
|
export function disposeTree(node) {
|
|
5
24
|
// ImpostorMesh, InstancedMesh, a nested Lod, a GLTS scene.
|
|
6
25
|
if ("dispose" in node && typeof node.dispose === "function") {
|
|
7
26
|
node.dispose();
|
|
8
|
-
if (isImpostorMesh(node) || isLOD(node))
|
|
27
|
+
if (isImpostorMesh(node) || isLOD(node) || isGLTSScene(node))
|
|
9
28
|
return;
|
|
10
29
|
}
|
|
11
30
|
if (isMesh(node)) {
|
|
12
31
|
node.geometry.dispose();
|
|
13
|
-
|
|
32
|
+
if (!borrowed.has(node))
|
|
33
|
+
disposeMaterials(node);
|
|
14
34
|
}
|
|
15
35
|
for (const child of node.children)
|
|
16
36
|
disposeTree(child);
|
|
17
37
|
}
|
|
18
38
|
/** Free `mesh`'s materials and their textures: the originals of level copies, which free their copies (see `levelMaterial`). */
|
|
19
|
-
|
|
39
|
+
function disposeMaterials(mesh) {
|
|
20
40
|
for (const material of new Set([mesh.material].flat().map(originalOf))) {
|
|
21
41
|
const values = Object.values(material);
|
|
22
42
|
for (const value of values)
|
|
@@ -25,4 +45,13 @@ export function disposeMaterials(mesh) {
|
|
|
25
45
|
material.dispose();
|
|
26
46
|
}
|
|
27
47
|
}
|
|
48
|
+
/** Cleanup must not replace the failure that rejected a load or prevent the other levels from being released. */
|
|
49
|
+
export function disposeRejected(node) {
|
|
50
|
+
try {
|
|
51
|
+
disposeTree(node);
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
console.error("LodLoader: failed to dispose a rejected load", error);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
28
57
|
//# sourceMappingURL=dispose.js.map
|
package/dist/dispose.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dispose.js","sourceRoot":"","sources":["../src/dispose.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"dispose.js","sourceRoot":"","sources":["../src/dispose.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEpG,MAAM,QAAQ,GAAG,IAAI,OAAO,EAAQ,CAAC;AAErC,8EAA8E;AAC9E,MAAM,UAAU,eAAe,CAAC,IAAc;IAC5C,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,EAAE;QACrB,IAAI,MAAM,CAAC,IAAI,CAAC;YAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,wGAAwG;AACxG,MAAM,UAAU,aAAa,CAAC,IAAc;IAC1C,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,SAAS,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;QACrG,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,OAAO;IACT,CAAC;IACD,IAAI,eAAe,CAAC,IAAI,CAAC;QAAE,IAAI,CAAC,OAAO,EAAE,CAAC;IAC1C,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ;QAAE,aAAa,CAAC,KAAK,CAAC,CAAC;AAC1D,CAAC;AAED,+FAA+F;AAC/F,MAAM,UAAU,WAAW,CAAC,IAAc;IACxC,2DAA2D;IAC3D,IAAI,SAAS,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;QAC5D,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC;YAAE,OAAO;IACvE,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QACjB,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAClD,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ;QAAE,WAAW,CAAC,KAAK,CAAC,CAAC;AACxD,CAAC;AAED,gIAAgI;AAChI,SAAS,gBAAgB,CAAC,IAAU;IAClC,KAAK,MAAM,QAAQ,IAAI,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;QACvE,MAAM,MAAM,GAAc,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAClD,KAAK,MAAM,KAAK,IAAI,MAAM;YAAE,IAAI,SAAS,CAAC,KAAK,CAAC;gBAAE,KAAK,CAAC,OAAO,EAAE,CAAC;QAClE,QAAQ,CAAC,OAAO,EAAE,CAAC;IACrB,CAAC;AACH,CAAC;AAED,iHAAiH;AACjH,MAAM,UAAU,eAAe,CAAC,IAAc;IAC5C,IAAI,CAAC;QACH,WAAW,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,8CAA8C,EAAE,KAAK,CAAC,CAAC;IACvE,CAAC;AACH,CAAC"}
|
package/dist/fade.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Color, type Node, type
|
|
1
|
+
import { Color, StorageBufferAttribute, type Node, type NodeBuilder, type Object3D } from "three/webgpu";
|
|
2
2
|
/** How a mesh of a level is drawn, which says where its fade and shadow size come from. */
|
|
3
3
|
export type Draw = {
|
|
4
4
|
kind: "object";
|
|
@@ -23,22 +23,14 @@ export declare const drawOf: (mesh: Object3D) => Draw | undefined;
|
|
|
23
23
|
export declare const tint: import("three/webgpu").UniformNode<"color", Color>;
|
|
24
24
|
/** Interleaved gradient noise over the pixels of the target being drawn. */
|
|
25
25
|
export declare const dither: (pixel: Node<"vec2">) => Node<"float">;
|
|
26
|
-
/**
|
|
27
|
-
* Whether `object` is an ImpostorMesh of one instance, which reads it per object: more,
|
|
28
|
-
* or slots the GPU writes (an InstancedLod's indirect draws), come from its storage buffer.
|
|
29
|
-
*/
|
|
30
|
-
export declare const isSingle: (object: Object3D) => boolean;
|
|
31
|
-
/** The instance matrix of this draw, for an InstancedMesh or ImpostorMesh with its matrices in a storage buffer; else null. */
|
|
26
|
+
/** This draw's instance matrix when its matrices live in storage, else null. */
|
|
32
27
|
export declare function instanceMatrixOf(object: Object3D): Node<"mat4"> | null;
|
|
28
|
+
export declare const instanceColor: import("three/webgpu").VaryingNode<"vec3">;
|
|
29
|
+
/** Apply the level's shared instance bindings before its own deformation, as Three does for InstancedMesh. */
|
|
30
|
+
export declare function placeInstances(builder: NodeBuilder): void;
|
|
33
31
|
/** This draw's signed fade. */
|
|
34
32
|
export declare const fade: import("three/src/nodes/TSL.js").FnNode<[], Node<"float">>;
|
|
35
33
|
/** Whether this pixel is this draw's, by its fade: false on the other level's pixels. */
|
|
36
34
|
export declare const keepsPixel: import("three/src/nodes/TSL.js").FnNode<[], Node<"bool">>;
|
|
37
|
-
/**
|
|
38
|
-
* Whether this draw is too small for the shadow map being drawn: narrower than a texel
|
|
39
|
-
* of an orthographic (directional light's) map, it would cover a texel centre only by
|
|
40
|
-
* chance, flickering as it or the map moves. Only valid in shadow passes.
|
|
41
|
-
*/
|
|
42
|
-
export declare const tooSmallToCast: import("three/src/nodes/TSL.js").FnNode<[], Node<"bool">>;
|
|
43
35
|
/** `position` in shadow passes, or nothing (a point) when the draw is too small to cast. */
|
|
44
36
|
export declare const castPosition: (position: Node<"vec3">) => Node<"vec3">;
|
package/dist/fade.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { Color, Matrix4 } from "three/webgpu";
|
|
2
|
-
import { Fn, cameraProjectionMatrix, dot, float, fract, instanceIndex, modelWorldMatrix, screenCoordinate, screenSize, select, uniform, varying, vec2, vec3, } from "three/tsl";
|
|
3
|
-
import { isImpostorMesh, storageMatrices } from "./three.js";
|
|
4
|
-
import { column,
|
|
1
|
+
import { Color, Matrix4, StorageBufferAttribute, StorageInstancedBufferAttribute } from "three/webgpu";
|
|
2
|
+
import { Fn, cameraProjectionMatrix, dot, float, fract, instanceIndex, modelWorldMatrix, normalLocal, positionLocal, transformNormal, varyingProperty, screenCoordinate, screenSize, select, storage, uniform, varying, vec2, vec3, } from "three/tsl";
|
|
3
|
+
import { isImpostorMesh, isLodInstances, storageMatrices } from "./three.js";
|
|
4
|
+
import { column, instanceGroup, isOrthographic, maxScale } from "./tsl.js";
|
|
5
5
|
const draws = new WeakMap();
|
|
6
6
|
/** Draw `mesh` as `draw` says: its materials read it while it renders. */
|
|
7
7
|
export const setDraw = (mesh, draw) => void draws.set(mesh, draw);
|
|
@@ -13,16 +13,10 @@ const objectFade = uniform(0).onObjectUpdate(({ object }) => {
|
|
|
13
13
|
const draw = of(object);
|
|
14
14
|
return draw?.kind === "object" ? draw.fade : 0;
|
|
15
15
|
});
|
|
16
|
-
|
|
17
|
-
// A mesh no level draws is never too small to cast. An ImpostorMesh of one instance
|
|
18
|
-
// reads its own here too, however it is drawn: such meshes share one shader.
|
|
16
|
+
// A mesh no level draws is never too small to cast.
|
|
19
17
|
const objectDiameter = uniform(0).onObjectUpdate(({ object }) => {
|
|
20
18
|
const draw = of(object);
|
|
21
|
-
|
|
22
|
-
return draw.diameter;
|
|
23
|
-
if (draw?.kind !== "instances" || !object || !isImpostorMesh(object) || !isSingle(object))
|
|
24
|
-
return 3.4e38;
|
|
25
|
-
return 2 * draw.radius * placement.fromArray(object.instanceMatrix.array).premultiply(object.matrixWorld).getMaxScaleOnAxis();
|
|
19
|
+
return draw?.kind === "object" ? draw.diameter : 3.4e38;
|
|
26
20
|
});
|
|
27
21
|
const instanceRadius = uniform(0).onObjectUpdate(({ object }) => {
|
|
28
22
|
const draw = of(object);
|
|
@@ -32,27 +26,65 @@ const instanceRadius = uniform(0).onObjectUpdate(({ object }) => {
|
|
|
32
26
|
export const tint = uniform(new Color(1, 1, 1)).onObjectUpdate(({ object }) => of(object)?.tint ?? WHITE);
|
|
33
27
|
/** Interleaved gradient noise over the pixels of the target being drawn. */
|
|
34
28
|
export const dither = (pixel) => fract(float(52.9829189).mul(fract(dot(pixel, vec2(0.06711056, 0.00583715)))));
|
|
35
|
-
|
|
36
|
-
const
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
29
|
+
const identity = new StorageInstancedBufferAttribute(new Float32Array(new Matrix4().elements), 16);
|
|
30
|
+
const matrices = storage(identity, "mat4", 0)
|
|
31
|
+
.setName("lodInstanceMatrices")
|
|
32
|
+
.setGroup(instanceGroup)
|
|
33
|
+
.toReadOnly()
|
|
34
|
+
.onObjectUpdate(({ object }) => {
|
|
35
|
+
const attribute = object && storageMatrices(object);
|
|
36
|
+
if (!attribute)
|
|
37
|
+
throw new Error("Lod: instance draw has no matrices");
|
|
38
|
+
return attribute;
|
|
39
|
+
});
|
|
40
|
+
const zero = new StorageBufferAttribute(new Float32Array(1), 1);
|
|
41
|
+
const fades = storage(zero, "float", 0)
|
|
42
|
+
.setName("lodInstanceFades")
|
|
43
|
+
.setGroup(instanceGroup)
|
|
44
|
+
.toReadOnly()
|
|
45
|
+
.onObjectUpdate(({ object }) => {
|
|
46
|
+
const draw = of(object);
|
|
47
|
+
return draw?.kind === "instances" && draw.fades ? draw.fades : zero;
|
|
48
|
+
});
|
|
49
|
+
const fadeIndex = uniform(0, "uint").onObjectUpdate(({ object }) => {
|
|
50
|
+
const draw = of(object);
|
|
51
|
+
return Number(draw?.kind === "instances" && draw.fades !== null);
|
|
52
|
+
});
|
|
53
|
+
const instanceCaster = uniform(false).onObjectUpdate(({ object }) => of(object)?.kind === "instances");
|
|
54
|
+
/** This draw's instance matrix when its matrices live in storage, else null. */
|
|
43
55
|
export function instanceMatrixOf(object) {
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
56
|
+
return storageMatrices(object) ? matrices.element(instanceIndex) : null;
|
|
57
|
+
}
|
|
58
|
+
const white = new StorageInstancedBufferAttribute(new Float32Array([1, 1, 1, 1]), 4);
|
|
59
|
+
const colors = storage(white, "vec4", 0)
|
|
60
|
+
.setName("lodInstanceColors")
|
|
61
|
+
.setGroup(instanceGroup)
|
|
62
|
+
.toReadOnly()
|
|
63
|
+
.onObjectUpdate(({ object }) => (object && (isImpostorMesh(object) || isLodInstances(object)) && object.instanceColor) || white);
|
|
64
|
+
const colorIndex = uniform(0, "uint").onObjectUpdate(({ object }) => Number(!!object && (isImpostorMesh(object) || isLodInstances(object)) && object.instanceColor !== null));
|
|
65
|
+
export const instanceColor = varying(colors.element(instanceIndex.mul(colorIndex)).xyz).setInterpolation("flat");
|
|
66
|
+
/** Apply the level's shared instance bindings before its own deformation, as Three does for InstancedMesh. */
|
|
67
|
+
export function placeInstances(builder) {
|
|
68
|
+
if (!isLodInstances(builder.object))
|
|
69
|
+
return;
|
|
70
|
+
const matrix = matrices.element(instanceIndex);
|
|
71
|
+
positionLocal.assign(matrix.mul(positionLocal).xyz);
|
|
72
|
+
if (builder.geometry.hasAttribute("normal"))
|
|
73
|
+
normalLocal.assign(transformNormal(normalLocal, matrix));
|
|
74
|
+
if (builder.object.instanceColor)
|
|
75
|
+
varyingProperty("vec3", "vInstanceColor").assign(instanceColor);
|
|
48
76
|
}
|
|
49
77
|
/** This draw's signed fade. */
|
|
50
78
|
export const fade = Fn((builder) => {
|
|
79
|
+
if (isImpostorMesh(builder.object))
|
|
80
|
+
return varying(fades.element(instanceIndex.mul(fadeIndex)))
|
|
81
|
+
.setInterpolation("flat")
|
|
82
|
+
.add(objectFade);
|
|
51
83
|
const draw = draws.get(builder.object);
|
|
52
84
|
if (draw?.kind !== "instances" || !draw.fades)
|
|
53
85
|
return objectFade;
|
|
54
86
|
// Constant across the primitive: keep compute-written slots out of fragment bindings.
|
|
55
|
-
return varying(
|
|
87
|
+
return varying(fades.element(instanceIndex)).setInterpolation("flat");
|
|
56
88
|
});
|
|
57
89
|
/** Whether this pixel is this draw's, by its fade: false on the other level's pixels. */
|
|
58
90
|
export const keepsPixel = Fn(() => {
|
|
@@ -65,10 +97,12 @@ export const keepsPixel = Fn(() => {
|
|
|
65
97
|
* of an orthographic (directional light's) map, it would cover a texel centre only by
|
|
66
98
|
* chance, flickering as it or the map moves. Only valid in shadow passes.
|
|
67
99
|
*/
|
|
68
|
-
|
|
100
|
+
const tooSmallToCast = Fn((builder) => {
|
|
69
101
|
const object = builder.object;
|
|
70
|
-
const
|
|
71
|
-
const
|
|
102
|
+
const card = isImpostorMesh(object);
|
|
103
|
+
const instance = card || draws.get(object)?.kind === "instances" ? instanceMatrixOf(object) : null;
|
|
104
|
+
const instanced = instance ? maxScale(modelWorldMatrix.mul(instance)).mul(instanceRadius).mul(2) : objectDiameter;
|
|
105
|
+
const diameter = card ? select(instanceCaster, instanced, objectDiameter) : instanced;
|
|
72
106
|
// projection[1][1] is 2 × zoom / (top - bottom)
|
|
73
107
|
const texel = float(2).div(column(cameraProjectionMatrix, 1).y.mul(screenSize.y));
|
|
74
108
|
return isOrthographic(cameraProjectionMatrix).and(diameter.lessThan(texel));
|
package/dist/fade.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fade.js","sourceRoot":"","sources":["../src/fade.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,OAAO,
|
|
1
|
+
{"version":3,"file":"fade.js","sourceRoot":"","sources":["../src/fade.ts"],"names":[],"mappings":"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"}
|
|
@@ -44,6 +44,7 @@ export interface BakeImpostorOptions {
|
|
|
44
44
|
* per map: base colour + coverage, object-space normal + depth,
|
|
45
45
|
* occlusion/roughness/metalness and, if needed, emissive. A material that changes three's
|
|
46
46
|
* default specular adds the object's mean specular (see `Impostor.specular`).
|
|
47
|
+
* Custom lighting behavior is not baked; the resulting surface is lit at draw time.
|
|
47
48
|
*/
|
|
48
49
|
export declare function bakeImpostor(object: Object3D, options?: BakeImpostorOptions): Promise<Impostor>;
|
|
49
50
|
/** Loader entry: rooms attached for the close source are absent from distant bakes. */
|
|
@@ -23,6 +23,7 @@ const PAD = 0.06;
|
|
|
23
23
|
* per map: base colour + coverage, object-space normal + depth,
|
|
24
24
|
* occlusion/roughness/metalness and, if needed, emissive. A material that changes three's
|
|
25
25
|
* default specular adds the object's mean specular (see `Impostor.specular`).
|
|
26
|
+
* Custom lighting behavior is not baked; the resulting surface is lit at draw time.
|
|
26
27
|
*/
|
|
27
28
|
export function bakeImpostor(object, options = {}) {
|
|
28
29
|
return bake(object, options);
|