@drawcall/lod 0.2.0 → 0.3.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 +8 -6
- package/dist/bake.d.ts +22 -0
- package/dist/bake.js +88 -0
- package/dist/bake.js.map +1 -0
- package/dist/baked/codec.d.ts +3 -6
- package/dist/baked/codec.js +48 -154
- package/dist/baked/codec.js.map +1 -1
- package/dist/baked/coverage.d.ts +6 -3
- package/dist/baked/coverage.js +6 -3
- package/dist/baked/coverage.js.map +1 -1
- package/dist/baked/fields.d.ts +9 -0
- package/dist/baked/fields.js +22 -0
- package/dist/baked/fields.js.map +1 -0
- package/dist/baked/index.d.ts +12 -6
- package/dist/baked/index.js +22 -20
- package/dist/baked/index.js.map +1 -1
- package/dist/baked/interior/faces.d.ts +4 -3
- package/dist/baked/interior/faces.js +13 -10
- package/dist/baked/interior/faces.js.map +1 -1
- package/dist/baked/interior/material.d.ts +7 -10
- package/dist/baked/interior/material.js +29 -36
- package/dist/baked/interior/material.js.map +1 -1
- package/dist/baked/interior/rooms.js +1 -1
- package/dist/baked/interior/rooms.js.map +1 -1
- package/dist/baked/low.js +5 -4
- package/dist/baked/low.js.map +1 -1
- package/dist/baked/raster.js +6 -6
- package/dist/baked/raster.js.map +1 -1
- package/dist/baked/textures.d.ts +17 -0
- package/dist/baked/textures.js +95 -0
- package/dist/baked/textures.js.map +1 -0
- package/dist/baked/transfer.js +19 -18
- package/dist/baked/transfer.js.map +1 -1
- package/dist/baked/unwrap.js +4 -3
- package/dist/baked/unwrap.js.map +1 -1
- package/dist/baked/xatlas.js.map +1 -1
- package/dist/codec/container.d.ts +8 -0
- package/dist/codec/container.js +63 -0
- package/dist/codec/container.js.map +1 -0
- package/dist/codec/mesh.d.ts +8 -0
- package/dist/{mesh/codec.js → codec/mesh.js} +80 -52
- package/dist/codec/mesh.js.map +1 -0
- package/dist/dispose.d.ts +7 -4
- package/dist/dispose.js +20 -22
- package/dist/dispose.js.map +1 -1
- package/dist/gpu.d.ts +39 -0
- package/dist/gpu.js +41 -0
- package/dist/gpu.js.map +1 -0
- package/dist/impostor/bake/atlas.d.ts +4 -4
- package/dist/impostor/bake/atlas.js +12 -12
- package/dist/impostor/bake/atlas.js.map +1 -1
- package/dist/impostor/bake/fit.d.ts +8 -0
- package/dist/impostor/bake/fit.js +28 -0
- package/dist/impostor/bake/fit.js.map +1 -0
- package/dist/impostor/bake/index.d.ts +22 -14
- package/dist/impostor/bake/index.js +41 -134
- package/dist/impostor/bake/index.js.map +1 -1
- package/dist/impostor/bake/materials.d.ts +3 -3
- package/dist/impostor/bake/materials.js +51 -13
- package/dist/impostor/bake/materials.js.map +1 -1
- package/dist/impostor/bake/sheet.d.ts +8 -0
- package/dist/impostor/bake/sheet.js +90 -0
- package/dist/impostor/bake/sheet.js.map +1 -0
- package/dist/impostor/bake/source.d.ts +2 -2
- package/dist/impostor/bake/source.js +8 -19
- package/dist/impostor/bake/source.js.map +1 -1
- package/dist/impostor/codec.d.ts +4 -5
- package/dist/impostor/codec.js +36 -109
- package/dist/impostor/codec.js.map +1 -1
- package/dist/impostor/impostor.d.ts +31 -7
- package/dist/impostor/impostor.js +21 -6
- package/dist/impostor/impostor.js.map +1 -1
- package/dist/impostor/ktx2/encode.d.ts +26 -0
- package/dist/impostor/ktx2/encode.js +117 -0
- package/dist/impostor/ktx2/encode.js.map +1 -0
- package/dist/impostor/ktx2/transcode.d.ts +3 -0
- package/dist/impostor/ktx2/transcode.js +99 -0
- package/dist/impostor/ktx2/transcode.js.map +1 -0
- package/dist/impostor/ktx2/uastc.d.ts +7 -0
- package/dist/impostor/ktx2/uastc.js +64 -0
- package/dist/impostor/ktx2/uastc.js.map +1 -0
- package/dist/impostor/ktx2/wasm/encoder.d.ts +4 -0
- package/dist/impostor/ktx2/wasm/encoder.js +10 -0
- package/dist/impostor/ktx2/wasm/encoder.js.map +1 -0
- package/dist/impostor/ktx2/wasm/transcoder.d.ts +3 -0
- package/dist/impostor/ktx2/wasm/transcoder.js +9 -0
- package/dist/impostor/ktx2/wasm/transcoder.js.map +1 -0
- package/dist/impostor/ktx2/worker.d.ts +1 -0
- package/dist/impostor/ktx2/worker.js +12 -0
- package/dist/impostor/ktx2/worker.js.map +1 -0
- package/dist/impostor/mesh/card.d.ts +3 -3
- package/dist/impostor/mesh/card.js +7 -7
- package/dist/impostor/mesh/card.js.map +1 -1
- package/dist/impostor/mesh/index.d.ts +5 -4
- package/dist/impostor/mesh/index.js +8 -9
- package/dist/impostor/mesh/index.js.map +1 -1
- package/dist/impostor/mesh/material.d.ts +18 -9
- package/dist/impostor/mesh/material.js +40 -27
- package/dist/impostor/mesh/material.js.map +1 -1
- package/dist/impostor/mesh/surface.d.ts +1 -1
- package/dist/impostor/mesh/surface.js +13 -9
- package/dist/impostor/mesh/surface.js.map +1 -1
- package/dist/impostor/mesh/textures.d.ts +3 -3
- package/dist/impostor/mesh/textures.js +24 -34
- package/dist/impostor/mesh/textures.js.map +1 -1
- package/dist/index.d.ts +15 -10
- package/dist/index.js +13 -8
- package/dist/index.js.map +1 -1
- package/dist/instanced/camera.d.ts +46 -0
- package/dist/instanced/camera.js +70 -0
- package/dist/instanced/camera.js.map +1 -0
- package/dist/instanced/chunk.d.ts +97 -0
- package/dist/instanced/chunk.js +156 -0
- package/dist/instanced/chunk.js.map +1 -0
- package/dist/instanced/chunks.d.ts +60 -0
- package/dist/instanced/chunks.js +208 -0
- package/dist/instanced/chunks.js.map +1 -0
- package/dist/instanced/cull.d.ts +28 -0
- package/dist/instanced/cull.js +22 -0
- package/dist/instanced/cull.js.map +1 -0
- package/dist/instanced/index.d.ts +96 -66
- package/dist/instanced/index.js +229 -288
- package/dist/instanced/index.js.map +1 -1
- package/dist/instanced/key.d.ts +19 -0
- package/dist/instanced/key.js +45 -0
- package/dist/instanced/key.js.map +1 -0
- package/dist/instanced/levels.d.ts +60 -0
- package/dist/instanced/levels.js +130 -0
- package/dist/instanced/levels.js.map +1 -0
- package/dist/instanced/lists.d.ts +70 -0
- package/dist/instanced/lists.js +133 -0
- package/dist/instanced/lists.js.map +1 -0
- package/dist/instanced/measure.d.ts +28 -0
- package/dist/instanced/measure.js +203 -0
- package/dist/instanced/measure.js.map +1 -0
- package/dist/instanced/meshes.d.ts +42 -51
- package/dist/instanced/meshes.js +158 -180
- package/dist/instanced/meshes.js.map +1 -1
- package/dist/instanced/mirror.d.ts +20 -0
- package/dist/instanced/mirror.js +37 -0
- package/dist/instanced/mirror.js.map +1 -0
- package/dist/instanced/pages/buffers.d.ts +37 -0
- package/dist/instanced/pages/buffers.js +15 -0
- package/dist/instanced/pages/buffers.js.map +1 -0
- package/dist/instanced/pages/chunk.d.ts +51 -0
- package/dist/instanced/pages/chunk.js +81 -0
- package/dist/instanced/pages/chunk.js.map +1 -0
- package/dist/instanced/pages/index.d.ts +74 -0
- package/dist/instanced/pages/index.js +269 -0
- package/dist/instanced/pages/index.js.map +1 -0
- package/dist/instanced/pages/passes.d.ts +21 -0
- package/dist/instanced/pages/passes.js +52 -0
- package/dist/instanced/pages/passes.js.map +1 -0
- package/dist/instanced/pages/slots.d.ts +11 -0
- package/dist/instanced/pages/slots.js +90 -0
- package/dist/instanced/pages/slots.js.map +1 -0
- package/dist/instanced/pages/workgroup.d.ts +14 -0
- package/dist/instanced/pages/workgroup.js +38 -0
- package/dist/instanced/pages/workgroup.js.map +1 -0
- package/dist/instanced/raycast.d.ts +13 -11
- package/dist/instanced/raycast.js +33 -40
- package/dist/instanced/raycast.js.map +1 -1
- package/dist/instanced/rows.d.ts +108 -0
- package/dist/instanced/rows.js +209 -0
- package/dist/instanced/rows.js.map +1 -0
- package/dist/instanced/shape.d.ts +25 -0
- package/dist/instanced/shape.js +51 -0
- package/dist/instanced/shape.js.map +1 -0
- package/dist/instanced/sort.d.ts +63 -0
- package/dist/instanced/sort.js +162 -0
- package/dist/instanced/sort.js.map +1 -0
- package/dist/instanced/update.d.ts +30 -0
- package/dist/instanced/update.js +207 -0
- package/dist/instanced/update.js.map +1 -0
- package/dist/levels/bounds.d.ts +21 -0
- package/dist/levels/bounds.js +42 -0
- package/dist/levels/bounds.js.map +1 -0
- package/dist/levels/cameras.d.ts +48 -0
- package/dist/levels/cameras.js +122 -0
- package/dist/levels/cameras.js.map +1 -0
- package/dist/levels/compile/contexts.d.ts +30 -0
- package/dist/levels/compile/contexts.js +18 -0
- package/dist/levels/compile/contexts.js.map +1 -0
- package/dist/levels/compile/index.d.ts +39 -0
- package/dist/levels/compile/index.js +185 -0
- package/dist/levels/compile/index.js.map +1 -0
- package/dist/levels/compile/pipelines.d.ts +26 -0
- package/dist/levels/compile/pipelines.js +177 -0
- package/dist/levels/compile/pipelines.js.map +1 -0
- package/dist/levels/compiles.d.ts +29 -0
- package/dist/levels/compiles.js +50 -0
- package/dist/levels/compiles.js.map +1 -0
- package/dist/levels/draw.d.ts +102 -0
- package/dist/levels/draw.js +401 -0
- package/dist/levels/draw.js.map +1 -0
- package/dist/levels/fade.d.ts +69 -0
- package/dist/levels/fade.js +150 -0
- package/dist/levels/fade.js.map +1 -0
- package/dist/levels/index.d.ts +99 -0
- package/dist/levels/index.js +155 -0
- package/dist/levels/index.js.map +1 -0
- package/dist/levels/item.d.ts +38 -0
- package/dist/levels/item.js +97 -0
- package/dist/levels/item.js.map +1 -0
- package/dist/levels/load.d.ts +31 -0
- package/dist/levels/load.js +142 -0
- package/dist/levels/load.js.map +1 -0
- package/dist/levels/manager.d.ts +159 -0
- package/dist/levels/manager.js +339 -0
- package/dist/levels/manager.js.map +1 -0
- package/dist/{material.js → levels/material.js} +4 -3
- package/dist/levels/material.js.map +1 -0
- package/dist/levels/renderer.d.ts +29 -0
- package/dist/levels/renderer.js +41 -0
- package/dist/levels/renderer.js.map +1 -0
- package/dist/levels/requests.d.ts +49 -0
- package/dist/levels/requests.js +95 -0
- package/dist/levels/requests.js.map +1 -0
- package/dist/levels/screen.d.ts +14 -0
- package/dist/levels/screen.js +21 -0
- package/dist/levels/screen.js.map +1 -0
- package/dist/levels/wait.d.ts +27 -0
- package/dist/levels/wait.js +61 -0
- package/dist/levels/wait.js.map +1 -0
- package/dist/loader/build.d.ts +10 -0
- package/dist/loader/build.js +28 -0
- package/dist/loader/build.js.map +1 -0
- package/dist/loader/cache.d.ts +6 -9
- package/dist/loader/cache.js +17 -24
- package/dist/loader/cache.js.map +1 -1
- package/dist/loader/context.d.ts +46 -0
- package/dist/loader/context.js +91 -0
- package/dist/loader/context.js.map +1 -0
- package/dist/loader/{provenance.d.ts → dependencies.d.ts} +5 -3
- package/dist/loader/{provenance.js → dependencies.js} +12 -4
- package/dist/loader/dependencies.js.map +1 -0
- package/dist/loader/index.d.ts +62 -0
- package/dist/loader/index.js +284 -0
- package/dist/loader/index.js.map +1 -0
- package/dist/loader/level.d.ts +41 -0
- package/dist/loader/level.js +140 -0
- package/dist/loader/level.js.map +1 -0
- package/dist/loader/request.d.ts +87 -0
- package/dist/loader/request.js +59 -0
- package/dist/loader/request.js.map +1 -0
- package/dist/loader/url.d.ts +5 -2
- package/dist/loader/url.js +10 -6
- package/dist/loader/url.js.map +1 -1
- package/dist/lod.d.ts +81 -40
- package/dist/lod.js +196 -149
- package/dist/lod.js.map +1 -1
- package/dist/meshopt.d.ts +6 -0
- package/dist/meshopt.js +19 -0
- package/dist/meshopt.js.map +1 -0
- package/dist/simplify/cards.d.ts +14 -0
- package/dist/simplify/cards.js +128 -0
- package/dist/simplify/cards.js.map +1 -0
- package/dist/{simplify.d.ts → simplify/index.d.ts} +7 -4
- package/dist/{simplify.js → simplify/index.js} +41 -23
- package/dist/simplify/index.js.map +1 -0
- package/dist/{bounds.d.ts → source/detail.d.ts} +4 -23
- package/dist/{bounds.js → source/detail.js} +19 -51
- package/dist/source/detail.js.map +1 -0
- package/dist/source/deviation.js +6 -6
- package/dist/source/deviation.js.map +1 -1
- package/dist/source/{shading.d.ts → evaluator.d.ts} +10 -10
- package/dist/source/{shading.js → evaluator.js} +5 -5
- package/dist/source/evaluator.js.map +1 -0
- package/dist/source/{trace.d.ts → raycaster.d.ts} +6 -6
- package/dist/source/{trace.js → raycaster.js} +8 -8
- package/dist/source/raycaster.js.map +1 -0
- package/dist/source/{texels.d.ts → sampler.d.ts} +1 -1
- package/dist/source/{texels.js → sampler.js} +3 -3
- package/dist/source/sampler.js.map +1 -0
- package/dist/source/source.d.ts +1 -1
- package/dist/source/source.js +1 -1
- package/dist/source/source.js.map +1 -1
- package/dist/source/surface.js +1 -1
- package/dist/source/surface.js.map +1 -1
- package/dist/task.d.ts +6 -0
- package/dist/{pause.js → task.js} +5 -5
- package/dist/task.js.map +1 -0
- package/dist/three.d.ts +13 -24
- package/dist/three.js +26 -53
- package/dist/three.js.map +1 -1
- package/dist/tsl.d.ts +8 -12
- package/dist/tsl.js +11 -39
- package/dist/tsl.js.map +1 -1
- package/dist/typegpu.d.ts +37 -0
- package/dist/typegpu.js +37 -0
- package/dist/typegpu.js.map +1 -0
- package/dist/wind/bounds.js +2 -2
- package/dist/wind/bounds.js.map +1 -1
- package/dist/wind/hooks.d.ts +7 -4
- package/dist/wind/hooks.js +5 -2
- package/dist/wind/hooks.js.map +1 -1
- package/dist/wind/index.d.ts +2 -2
- package/dist/wind/index.js +15 -15
- package/dist/wind/index.js.map +1 -1
- package/dist/wind/sway.d.ts +2 -0
- package/dist/wind/sway.js +4 -1
- package/dist/wind/sway.js.map +1 -1
- package/package.json +18 -8
- package/skills/lod/SKILL.md +108 -31
- package/dist/bounds.js.map +0 -1
- package/dist/compile.d.ts +0 -4
- package/dist/compile.js +0 -100
- package/dist/compile.js.map +0 -1
- package/dist/deferred.d.ts +0 -12
- package/dist/deferred.js +0 -27
- package/dist/deferred.js.map +0 -1
- package/dist/fade.d.ts +0 -36
- package/dist/fade.js +0 -112
- package/dist/fade.js.map +0 -1
- package/dist/instanced/args.d.ts +0 -20
- package/dist/instanced/args.js +0 -77
- package/dist/instanced/args.js.map +0 -1
- package/dist/instanced/blocks.d.ts +0 -66
- package/dist/instanced/blocks.js +0 -294
- package/dist/instanced/blocks.js.map +0 -1
- package/dist/instanced/dirty.d.ts +0 -15
- package/dist/instanced/dirty.js +0 -96
- package/dist/instanced/dirty.js.map +0 -1
- package/dist/instanced/parts.d.ts +0 -14
- package/dist/instanced/parts.js +0 -79
- package/dist/instanced/parts.js.map +0 -1
- package/dist/instanced/select.d.ts +0 -92
- package/dist/instanced/select.js +0 -315
- package/dist/instanced/select.js.map +0 -1
- package/dist/instanced/store.d.ts +0 -31
- package/dist/instanced/store.js +0 -96
- package/dist/instanced/store.js.map +0 -1
- package/dist/levels.d.ts +0 -95
- package/dist/levels.js +0 -171
- package/dist/levels.js.map +0 -1
- package/dist/loader/bundle.d.ts +0 -25
- package/dist/loader/bundle.js +0 -241
- package/dist/loader/bundle.js.map +0 -1
- package/dist/loader/provenance.js.map +0 -1
- package/dist/loader.d.ts +0 -55
- package/dist/loader.js +0 -239
- package/dist/loader.js.map +0 -1
- package/dist/material.js.map +0 -1
- package/dist/mesh/codec.d.ts +0 -4
- package/dist/mesh/codec.js.map +0 -1
- package/dist/pause.d.ts +0 -6
- package/dist/pause.js.map +0 -1
- package/dist/queue.d.ts +0 -2
- package/dist/queue.js +0 -33
- package/dist/queue.js.map +0 -1
- package/dist/renderer.d.ts +0 -21
- package/dist/renderer.js +0 -83
- package/dist/renderer.js.map +0 -1
- package/dist/residency.d.ts +0 -44
- package/dist/residency.js +0 -205
- package/dist/residency.js.map +0 -1
- package/dist/simplify.js.map +0 -1
- package/dist/source/shading.js.map +0 -1
- package/dist/source/texels.js.map +0 -1
- package/dist/source/trace.js.map +0 -1
- package/dist/view.d.ts +0 -45
- package/dist/view.js +0 -131
- package/dist/view.js.map +0 -1
- /package/dist/{material.d.ts → levels/material.d.ts} +0 -0
package/dist/lod.js
CHANGED
|
@@ -1,220 +1,267 @@
|
|
|
1
1
|
import { Object3D, Sphere } from "three/webgpu";
|
|
2
2
|
import { at } from "./at.js";
|
|
3
|
-
import {
|
|
4
|
-
import { measureLevels, prepareBounds } from "./bounds.js";
|
|
3
|
+
import { measureLevels, prepareBounds } from "./levels/bounds.js";
|
|
5
4
|
import { disposeCopies } from "./dispose.js";
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
5
|
+
import { EncodedLevels, emptyLevels, levelsFrom, tintOf } from "./levels/index.js";
|
|
6
|
+
import { FADE, drawnLevel, levelsToDraw } from "./levels/draw.js";
|
|
7
|
+
import { setFadeSource } from "./levels/fade.js";
|
|
8
|
+
import { levelsToLoad } from "./levels/load.js";
|
|
9
|
+
import { LodLevelLoadManager } from "./levels/manager.js";
|
|
10
|
+
import { levelMaterial } from "./levels/material.js";
|
|
11
|
+
import { screenHeight, screenOf } from "./levels/screen.js";
|
|
12
|
+
import { inShadowMap } from "./levels/renderer.js";
|
|
13
|
+
import { isImpostorMesh, isLOD, isLine, isMesh, isPoints, rejectSkinned, sameClass } from "./three.js";
|
|
14
|
+
import { WIND } from "./wind/hooks.js";
|
|
13
15
|
import { copyWind, refreshWind } from "./wind/index.js";
|
|
14
|
-
const view = new View();
|
|
15
16
|
/**
|
|
16
|
-
* One object's levels, switched by on-screen height with dithered
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
17
|
+
* One object's levels, switched by on-screen height with dithered fades. three's renderer calls `update` with each
|
|
18
|
+
* camera before it draws, shadow maps' included; each camera measures at the height it draws at, measured in each
|
|
19
|
+
* render (outside one, the canvas's). Orthographic cameras switch without fading. Shadows follow what the camera draws
|
|
20
|
+
* and omit casters smaller than a shadow texel; levels cast into three's shadow maps, not into a light whose shadow
|
|
21
|
+
* map a custom shadow node replaces. Nothing draws until the coarsest level that draws something has loaded, which
|
|
22
|
+
* loads first; a deferred level loads when a camera first needs it, once that one has loaded, and meanwhile the
|
|
23
|
+
* nearest loaded coarser level draws in its place.
|
|
20
24
|
*
|
|
21
|
-
*
|
|
22
|
-
* and fades its own levels. Lines, points and sprites draw without
|
|
23
|
-
*
|
|
25
|
+
* Arriving levels' texture uploads are paced to about one uncompressed 2048² RGBA texture's bytes per frame. Levels
|
|
26
|
+
* are cloned into the Lod. A nested Lod switches and fades its own levels. Lines, points and sprites draw without
|
|
27
|
+
* fading. Raycasts hit the source only. A Lod draws with its LodGpu's renderer only.
|
|
24
28
|
*
|
|
25
|
-
* Build a new Lod after adding or moving meshes within a level: geometry is measured
|
|
26
|
-
*
|
|
27
|
-
*
|
|
29
|
+
* Build a new Lod after adding or moving meshes within a level: geometry is measured and hooked at construction or
|
|
30
|
+
* arrival. Skinned meshes and ShaderMaterials are refused; use static meshes with node materials or supported built-in
|
|
31
|
+
* materials.
|
|
28
32
|
*/
|
|
29
33
|
export class Lod extends Object3D {
|
|
34
|
+
gpu;
|
|
30
35
|
/** Multiplies every measured height: below 1, cheaper levels take over sooner. */
|
|
31
36
|
static quality = 1;
|
|
32
37
|
/** Tint every level by its index, to see which level draws where. */
|
|
33
38
|
static debug = false;
|
|
34
|
-
/**
|
|
35
|
-
* Share of a level's range its fade spans: from `maxPixels × (1 - fade)` up to its
|
|
36
|
-
* `maxPixels`, the finer level draws too.
|
|
37
|
-
*/
|
|
39
|
+
/** Share of a level's range its fade spans: from `maxPixels × (1 - fade)` up to its `maxPixels`, the finer level draws too. */
|
|
38
40
|
static fade = FADE;
|
|
39
41
|
isLOD = true;
|
|
40
42
|
/** Let the renderer call `update` with its camera every frame. */
|
|
41
43
|
autoUpdate = true;
|
|
42
|
-
/** Draw only this level, without fades. */
|
|
44
|
+
/** Draw only this level, without fades, once the coarsest level that draws something has loaded. */
|
|
43
45
|
forceLevel = null;
|
|
44
|
-
levels
|
|
45
|
-
|
|
46
|
-
/**
|
|
47
|
-
|
|
48
|
-
/**
|
|
46
|
+
/** The levels, each `object` this Lod's own copy once there is one. Set `maxPixels` to move a switch. */
|
|
47
|
+
levels = [];
|
|
48
|
+
/** The levels as they were given, which a copy is made from. */
|
|
49
|
+
inputs = [];
|
|
50
|
+
/** Per level, where its meshes' fade comes from. */
|
|
51
|
+
fades = [];
|
|
52
|
+
/** Per level, whether its object is a Lod, which fades its own levels. */
|
|
53
|
+
nested = [];
|
|
54
|
+
/**
|
|
55
|
+
* Per loaded level, what in it may cast (see `shadowCasters`): found when it is built or joins, read every shadow
|
|
56
|
+
* map.
|
|
57
|
+
*/
|
|
58
|
+
casters = [];
|
|
59
|
+
/** The levels as levelsToDraw reads them. */
|
|
60
|
+
encoded;
|
|
61
|
+
/** Bounding sphere of the source (see `measureLevels`) in the Lod's own space. */
|
|
49
62
|
sphere = new Sphere();
|
|
50
63
|
casterRadius = 0;
|
|
64
|
+
loads;
|
|
51
65
|
disposed = false;
|
|
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
|
-
}
|
|
59
66
|
/**
|
|
60
|
-
* `levels[0]` is the source. Empty only as the target of `copy`. A source that draws
|
|
61
|
-
*
|
|
62
|
-
*
|
|
67
|
+
* `levels[0]` is the source. Empty only as the target of `copy`. A source that draws nothing (an empty Object3D, for
|
|
68
|
+
* detail another system draws) is measured by the first level that draws something. `gpu` is what it shares with
|
|
69
|
+
* every Lod drawing with its renderer.
|
|
63
70
|
*/
|
|
64
|
-
constructor(levels =
|
|
71
|
+
constructor(levels, gpu, options = {}) {
|
|
65
72
|
super();
|
|
66
|
-
this.
|
|
67
|
-
|
|
68
|
-
|
|
73
|
+
this.gpu = gpu;
|
|
74
|
+
const { loads, encoded } = this.build(levels);
|
|
75
|
+
this.loads = loads;
|
|
76
|
+
this.encoded = encoded;
|
|
77
|
+
this.loads.item.given = options.manager;
|
|
69
78
|
}
|
|
70
79
|
build(inputs) {
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
const { object
|
|
80
|
+
this.inputs = inputs;
|
|
81
|
+
if (inputs.length > 0) {
|
|
82
|
+
const { own, placed } = measureLevels(inputs, "Lod");
|
|
83
|
+
this.sphere = placed;
|
|
84
|
+
this.casterRadius = placed.radius;
|
|
85
|
+
this.levels.push(...levelsFrom(inputs, 2 * own.radius, "Lod"));
|
|
86
|
+
}
|
|
87
|
+
const encoded = new EncodedLevels(this.levels, emptyLevels(inputs), "Lod");
|
|
88
|
+
this.levels.forEach(({ object }, i) => {
|
|
89
|
+
const fade = { kind: "object", fade: 0, diameter: 0, tint: tintOf(i, false) };
|
|
90
|
+
this.fades.push(fade);
|
|
91
|
+
this.nested.push(object ? isLOD(object) : false);
|
|
92
|
+
this.casters.push(object ? shadowCasters(object) : null);
|
|
81
93
|
if (!object)
|
|
82
94
|
return;
|
|
83
95
|
rejectSkinned(object, "Lod");
|
|
84
96
|
this.add(object);
|
|
85
|
-
this.hook(object,
|
|
86
|
-
drawable ||= drawsMesh(object);
|
|
97
|
+
this.hook(object, fade, isLOD(object), object);
|
|
87
98
|
});
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
}
|
|
94
|
-
/** Fade the meshes under `node` by `
|
|
95
|
-
hook(node,
|
|
99
|
+
const loads = new LodLevelLoadManager(this, this.gpu, `Lod ${this.uuid}`, inputs, encoded.get(null, true), (level, loaded) => this.prepare(level, loaded), (level) => {
|
|
100
|
+
const object = this.levels[level]?.object;
|
|
101
|
+
return object ? [object] : [];
|
|
102
|
+
}, null);
|
|
103
|
+
return { loads, encoded };
|
|
104
|
+
}
|
|
105
|
+
/** Fade the meshes under `node` by `fade`; an inner Lod fades its own. */
|
|
106
|
+
hook(node, fade, nested, level) {
|
|
96
107
|
const inner = nested || (node !== level && isLOD(node));
|
|
97
|
-
if (isMesh(node)) {
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
node.material = Array.isArray(node.material) ? node.material.map((m) => levelMaterial(m)) : levelMaterial(node.material);
|
|
103
|
-
}
|
|
104
|
-
watchViewport(node);
|
|
108
|
+
if (isMesh(node) && !inner) {
|
|
109
|
+
setFadeSource(node, fade);
|
|
110
|
+
// An ImpostorMesh reads its draw itself.
|
|
111
|
+
if (!isImpostorMesh(node))
|
|
112
|
+
node.material = Array.isArray(node.material) ? node.material.map((m) => levelMaterial(m)) : levelMaterial(node.material);
|
|
105
113
|
}
|
|
106
114
|
for (const child of node.children)
|
|
107
|
-
this.hook(child,
|
|
108
|
-
}
|
|
109
|
-
[WIND_BOUNDS](padding) {
|
|
110
|
-
this.casterRadius += padding;
|
|
115
|
+
this.hook(child, fade, inner, level);
|
|
111
116
|
}
|
|
112
|
-
/**
|
|
113
|
-
|
|
114
|
-
const
|
|
115
|
-
if (this.disposed || entries.length === 0 || inShadowPass(this))
|
|
116
|
-
return;
|
|
117
|
-
validate(entries);
|
|
118
|
-
view.begin(camera, viewportHeight(camera) ?? TYPICAL_HEIGHT, this.forceLevel);
|
|
119
|
-
tintLevels(entries, Lod.debug);
|
|
120
|
-
const height = view.pixels(this.matrixWorld, this.sphere) * Lod.quality;
|
|
121
|
-
const desired = levelAt(entries, height, this.forceLevel);
|
|
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
|
-
}
|
|
136
|
-
const diameter = 2 * this.casterRadius * this.matrixWorld.getMaxScaleOnAxis();
|
|
137
|
-
entries.forEach((each, i) => {
|
|
138
|
-
const draw = at(draws, i);
|
|
139
|
-
draw.fade = i === level ? t : i === finer ? -t : 0;
|
|
140
|
-
draw.diameter = diameter;
|
|
141
|
-
if (each.object)
|
|
142
|
-
each.object.visible = i === level || (t > 0 && i === finer);
|
|
143
|
-
});
|
|
144
|
-
}
|
|
145
|
-
async install(level, template, context) {
|
|
146
|
-
const object = template.clone();
|
|
117
|
+
/** A copy of `loaded`, level `index`'s object, parented hidden for world matrices and wind until it joins. */
|
|
118
|
+
prepare(index, loaded) {
|
|
119
|
+
const object = loaded.clone();
|
|
147
120
|
const nested = isLOD(object);
|
|
121
|
+
const level = at(this.levels, index);
|
|
148
122
|
object.visible = false;
|
|
149
123
|
rejectSkinned(object, "Lod");
|
|
150
124
|
if (level.box)
|
|
151
125
|
prepareBounds(object, level.box);
|
|
152
|
-
this.hook(object, at(this.
|
|
153
|
-
// Parented hidden only for world matrices and wind; the level arrives after compiling.
|
|
126
|
+
this.hook(object, at(this.fades, index), nested, object);
|
|
154
127
|
this.add(object);
|
|
155
128
|
object.updateWorldMatrix(true, true);
|
|
156
129
|
refreshWind(this, object);
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
130
|
+
return {
|
|
131
|
+
object,
|
|
132
|
+
join: () => {
|
|
133
|
+
level.object = object;
|
|
134
|
+
this.nested[index] = nested;
|
|
135
|
+
this.casters[index] = shadowCasters(object);
|
|
136
|
+
},
|
|
137
|
+
discard: () => {
|
|
138
|
+
this.remove(object);
|
|
139
|
+
disposeCopies(object);
|
|
140
|
+
},
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
get pending() {
|
|
144
|
+
return this.loads.pending;
|
|
145
|
+
}
|
|
146
|
+
get error() {
|
|
147
|
+
return this.loads.error;
|
|
148
|
+
}
|
|
149
|
+
/** Where the item of levels a camera misses goes (see `LodOptions.manager`). */
|
|
150
|
+
get manager() {
|
|
151
|
+
return this.loads.item.manager;
|
|
152
|
+
}
|
|
153
|
+
set manager(manager) {
|
|
154
|
+
this.loads.item.given = manager;
|
|
155
|
+
}
|
|
156
|
+
/** Switch and fade the levels for `camera`, and load those it needs. What fails is reported (see `error`): three is rendering. */
|
|
157
|
+
update(camera) {
|
|
158
|
+
// A shadow map draws nothing of a Lod whose levels cast nothing; one not loaded yet may.
|
|
159
|
+
const shadow = inShadowMap(this);
|
|
160
|
+
if (shadow && !this.casters.some((casters) => !casters || casters.some((node) => node.castShadow)))
|
|
168
161
|
return;
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
162
|
+
this.loads.guard(() => this.show(camera, shadow));
|
|
163
|
+
}
|
|
164
|
+
/** Show the levels for `camera`, a shadow map's when `shadow`. */
|
|
165
|
+
show(camera, shadow) {
|
|
166
|
+
if (this.disposed || this.levels.length === 0)
|
|
167
|
+
return;
|
|
168
|
+
// A shadow map draws the levels its scene's camera chose.
|
|
169
|
+
if (shadow)
|
|
170
|
+
return void this.loads.request(camera, 0, true);
|
|
171
|
+
const { height, levels } = this.measure(camera, false);
|
|
172
|
+
const loaded = this.loads.request(camera, levelsToLoad([[height, height]], this.encoded.heights(levels)), false);
|
|
173
|
+
let { level, finer, fade } = levelsToDraw(height, levels, loaded, this.loads.before, this.loads.progress);
|
|
174
|
+
// A nested Lod fades its own levels: the switch to or from one is immediate.
|
|
175
|
+
if (this.nested[level] || this.nested[finer])
|
|
176
|
+
fade = 0;
|
|
177
|
+
const diameter = 2 * this.casterRadius * this.matrixWorld.getMaxScaleOnAxis();
|
|
178
|
+
this.levels.forEach(({ object }, i) => {
|
|
179
|
+
const source = at(this.fades, i);
|
|
180
|
+
source.fade = i === level ? fade : i === finer ? -fade : 0;
|
|
181
|
+
source.diameter = diameter;
|
|
182
|
+
source.tint = tintOf(i, Lod.debug);
|
|
183
|
+
if (object)
|
|
184
|
+
object.visible = i === level || (fade > 0 && i === finer);
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
/** The source's height on `camera`'s screen, and the levels as levelsToDraw reads them there. */
|
|
188
|
+
measure(camera, shadow) {
|
|
189
|
+
const screen = screenOf(camera, this.loads.heightOf(camera, shadow));
|
|
190
|
+
const height = screenHeight(this.sphere, this.matrixWorld, screen) * Lod.quality;
|
|
191
|
+
return { height, levels: this.encoded.get(this.forceLevel, !screen.ortho) };
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* The index of the level that draws most of the Lod's pixels for `camera` from where it is, with the levels loaded
|
|
195
|
+
* now and no arrival under way (see `drawnLevel`); null while no level it could draw is loaded.
|
|
196
|
+
*/
|
|
197
|
+
getLevel(camera) {
|
|
198
|
+
if (this.levels.length === 0)
|
|
199
|
+
return null;
|
|
200
|
+
const { height, levels } = this.measure(camera, inShadowMap(this));
|
|
201
|
+
return drawnLevel(levelsToDraw(height, levels, this.loads.loaded, this.loads.loaded, 1));
|
|
202
|
+
}
|
|
203
|
+
[WIND](padding) {
|
|
204
|
+
if (this.loads.started)
|
|
205
|
+
throw new Error("Lod: apply wind before the first render");
|
|
206
|
+
this.casterRadius += padding;
|
|
174
207
|
}
|
|
175
208
|
raycast(raycaster, intersects) {
|
|
176
|
-
const source = this.
|
|
177
|
-
if (source
|
|
178
|
-
raycaster.intersectObject(source
|
|
209
|
+
const source = this.levels[0]?.object;
|
|
210
|
+
if (source)
|
|
211
|
+
raycaster.intersectObject(source, true, intersects);
|
|
179
212
|
// Stop the raycaster from descending into the other levels.
|
|
180
213
|
return false;
|
|
181
214
|
}
|
|
182
215
|
/**
|
|
183
|
-
* Copies `source`'s levels into this empty Lod (it throws otherwise). The copies share
|
|
184
|
-
*
|
|
185
|
-
*
|
|
216
|
+
* Copies `source`'s levels into this empty Lod (it throws otherwise). The copies share geometry, materials and
|
|
217
|
+
* textures with `source`, as three's clone does; the settings, LoadingManager, wind and each level's `maxPixels`
|
|
218
|
+
* come along.
|
|
186
219
|
*/
|
|
187
220
|
copy(source) {
|
|
188
|
-
if (this.
|
|
221
|
+
if (this.levels.length > 0)
|
|
189
222
|
throw new Error("Lod.copy: copy into an empty Lod");
|
|
190
223
|
super.copy(source, false);
|
|
191
|
-
|
|
192
|
-
|
|
224
|
+
const { loads, encoded } = this.build(source.inputs.map((input, i) => ({ ...input, maxPixels: at(source.levels, i).maxPixels })));
|
|
225
|
+
this.loads = loads;
|
|
226
|
+
this.encoded = encoded;
|
|
227
|
+
this.loads.item.given = source.loads.item.given;
|
|
193
228
|
this.forceLevel = source.forceLevel;
|
|
194
229
|
this.autoUpdate = source.autoUpdate;
|
|
195
230
|
copyWind(source, this);
|
|
196
231
|
return this;
|
|
197
232
|
}
|
|
198
|
-
|
|
233
|
+
clone() {
|
|
234
|
+
const clone = new Lod([], this.gpu).copy(this);
|
|
235
|
+
if (!sameClass(this, clone))
|
|
236
|
+
throw new Error("Lod.clone: a subclass must override clone");
|
|
237
|
+
return clone;
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Release what the Lod made of its levels, once nothing it prepares or compiles still uses them. Objects you give or
|
|
241
|
+
* load are yours to dispose; LodLoader's are freed when the last Lod holding them is disposed (see `LodLevel.hold`).
|
|
242
|
+
*/
|
|
199
243
|
dispose() {
|
|
200
244
|
if (this.disposed)
|
|
201
245
|
return;
|
|
202
246
|
this.disposed = true;
|
|
203
|
-
|
|
204
|
-
this.
|
|
205
|
-
for (const { object } of this.
|
|
247
|
+
super.dispose();
|
|
248
|
+
this.loads.dispose(() => {
|
|
249
|
+
for (const { object } of this.levels)
|
|
206
250
|
if (object)
|
|
207
251
|
disposeCopies(object);
|
|
208
252
|
});
|
|
209
253
|
}
|
|
210
254
|
}
|
|
211
|
-
/**
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
255
|
+
/**
|
|
256
|
+
* What three's shadow pass may draw under `root`, itself included: its meshes, lines and points, cast if `castShadow`
|
|
257
|
+
* is set.
|
|
258
|
+
*/
|
|
259
|
+
function shadowCasters(root) {
|
|
260
|
+
const found = [];
|
|
261
|
+
root.traverse((node) => {
|
|
262
|
+
if (isMesh(node) || isLine(node) || isPoints(node))
|
|
263
|
+
found.push(node);
|
|
264
|
+
});
|
|
218
265
|
return found;
|
|
219
266
|
}
|
|
220
267
|
//# 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,
|
|
1
|
+
{"version":3,"file":"lod.js","sourceRoot":"","sources":["../src/lod.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { MeshoptDecoder } from "three/addons/libs/meshopt_decoder.module.js";
|
|
2
|
+
/**
|
|
3
|
+
* three's meshopt decoder, which decodes in two workers from the first use on: sources' glTF buffers and mesh caches.
|
|
4
|
+
* Where there are no workers, as in Node, it decodes on the calling thread. Process-wide, as three's own decoder is.
|
|
5
|
+
*/
|
|
6
|
+
export declare function meshoptDecoder(): typeof MeshoptDecoder;
|
package/dist/meshopt.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { MeshoptDecoder } from "three/addons/libs/meshopt_decoder.module.js";
|
|
2
|
+
/**
|
|
3
|
+
* Whether the decoder's workers were started. useWorkers starts no second set, but each call rebuilds the workers'
|
|
4
|
+
* source (the whole decoder WASM as text) into a new Blob; decodes ask for the decoder often (codec/mesh.ts), so it
|
|
5
|
+
* is started once.
|
|
6
|
+
*/
|
|
7
|
+
let workers = false;
|
|
8
|
+
/**
|
|
9
|
+
* three's meshopt decoder, which decodes in two workers from the first use on: sources' glTF buffers and mesh caches.
|
|
10
|
+
* Where there are no workers, as in Node, it decodes on the calling thread. Process-wide, as three's own decoder is.
|
|
11
|
+
*/
|
|
12
|
+
export function meshoptDecoder() {
|
|
13
|
+
if (!workers && MeshoptDecoder.supported && typeof Worker !== "undefined") {
|
|
14
|
+
MeshoptDecoder.useWorkers(2);
|
|
15
|
+
workers = true;
|
|
16
|
+
}
|
|
17
|
+
return MeshoptDecoder;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=meshopt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"meshopt.js","sourceRoot":"","sources":["../src/meshopt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,6CAA6C,CAAC;AAE7E;;;;GAIG;AACH,IAAI,OAAO,GAAG,KAAK,CAAC;AAEpB;;;GAGG;AACH,MAAM,UAAU,cAAc;IAC5B,IAAI,CAAC,OAAO,IAAI,cAAc,CAAC,SAAS,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;QAC1E,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAC7B,OAAO,GAAG,IAAI,CAAC;IACjB,CAAC;IACD,OAAO,cAAc,CAAC;AACxB,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type Mesh } from "three/webgpu";
|
|
2
|
+
/** Per material of `mesh`, whether it alpha-tests a texture, so draws cards. */
|
|
3
|
+
export declare function cardMaterials(mesh: Mesh): boolean[];
|
|
4
|
+
/**
|
|
5
|
+
* About `ratio` of the cards (connected parts, touching where vertices share a position)
|
|
6
|
+
* of the triangles `indices`, spread evenly over them by meshopt's point simplifier on the
|
|
7
|
+
* cards' centres. Each picked card is enlarged about its centre, in `positions`, so the picked
|
|
8
|
+
* cards cover as much area as all did; a card larger than most grows only as far as a
|
|
9
|
+
* card of the median size does, or a long spray would reach far out of the crown, and no
|
|
10
|
+
* card grows past the bounds of all, which a level must stay inside.
|
|
11
|
+
* Edge collapse would instead shrink and warp each card, and so cut most of an
|
|
12
|
+
* alpha-tested texture (needles, leaves) away.
|
|
13
|
+
*/
|
|
14
|
+
export declare function decimateCards(indices: Uint32Array, positions: Float32Array, ratio: number): Uint32Array;
|