@drawcall/lod 0.1.2 → 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 +13 -70
- package/dist/at.d.ts +2 -0
- package/dist/at.js +8 -0
- package/dist/at.js.map +1 -0
- 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 +5 -5
- package/dist/baked/codec.js +58 -158
- 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 +16 -6
- package/dist/baked/index.js +23 -21
- 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.d.ts +2 -2
- package/dist/baked/low.js +9 -8
- 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/codec/mesh.js +220 -0
- package/dist/codec/mesh.js.map +1 -0
- package/dist/dispose.d.ts +11 -4
- package/dist/dispose.js +39 -12
- 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 +23 -14
- package/dist/impostor/bake/index.js +42 -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 +60 -12
- 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 +5 -11
- package/dist/impostor/codec.js +37 -121
- 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 +11 -8
- package/dist/impostor/mesh/card.js.map +1 -1
- package/dist/impostor/mesh/index.d.ts +10 -7
- package/dist/impostor/mesh/index.js +15 -18
- package/dist/impostor/mesh/index.js.map +1 -1
- package/dist/impostor/mesh/material.d.ts +24 -13
- package/dist/impostor/mesh/material.js +67 -51
- package/dist/impostor/mesh/material.js.map +1 -1
- package/dist/impostor/mesh/surface.d.ts +20 -16
- package/dist/impostor/mesh/surface.js +81 -58
- 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/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 +16 -10
- package/dist/index.js +14 -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 -92
- package/dist/instanced/index.js +229 -512
- 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 +46 -14
- package/dist/instanced/meshes.js +137 -22
- 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 +15 -0
- package/dist/instanced/raycast.js +46 -0
- package/dist/instanced/raycast.js.map +1 -0
- 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} +13 -7
- 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 +12 -15
- package/dist/loader/cache.js +64 -33
- 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/dependencies.d.ts +32 -0
- package/dist/loader/dependencies.js +113 -0
- 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 +16 -0
- package/dist/loader/url.js +35 -0
- package/dist/loader/url.js.map +1 -0
- package/dist/lod.d.ts +79 -49
- package/dist/lod.js +209 -153
- 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} +42 -22
- package/dist/simplify/index.js.map +1 -0
- package/dist/{bounds.d.ts → source/detail.d.ts} +4 -13
- package/dist/{bounds.js → source/detail.js} +62 -32
- package/dist/source/detail.js.map +1 -0
- package/dist/source/{error.d.ts → deviation.d.ts} +3 -3
- package/dist/source/{error.js → deviation.js} +12 -12
- package/dist/source/deviation.js.map +1 -0
- 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 +2 -2
- package/dist/source/source.js +2 -2
- 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 +20 -19
- package/dist/three.js +29 -35
- package/dist/three.js.map +1 -1
- package/dist/tsl.d.ts +10 -14
- package/dist/tsl.js +12 -47
- 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 +4 -4
- package/dist/wind/index.js +43 -40
- package/dist/wind/index.js.map +1 -1
- package/dist/wind/sway.d.ts +4 -1
- package/dist/wind/sway.js +4 -1
- package/dist/wind/sway.js.map +1 -1
- package/package.json +24 -8
- package/skills/lod/SKILL.md +147 -108
- package/dist/bounds.js.map +0 -1
- package/dist/fade.d.ts +0 -44
- package/dist/fade.js +0 -78
- package/dist/fade.js.map +0 -1
- 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/args.d.ts +0 -20
- package/dist/instanced/args.js +0 -77
- package/dist/instanced/args.js.map +0 -1
- package/dist/instanced/bounds.d.ts +0 -50
- package/dist/instanced/bounds.js +0 -271
- package/dist/instanced/bounds.js.map +0 -1
- package/dist/instanced/dirty.d.ts +0 -12
- package/dist/instanced/dirty.js +0 -61
- package/dist/instanced/dirty.js.map +0 -1
- package/dist/instanced/select.d.ts +0 -84
- package/dist/instanced/select.js +0 -264
- package/dist/instanced/select.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/levels.d.ts +0 -72
- package/dist/levels.js +0 -146
- package/dist/levels.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/loader.d.ts +0 -99
- package/dist/loader.js +0 -234
- package/dist/loader.js.map +0 -1
- package/dist/material.js.map +0 -1
- package/dist/pause.d.ts +0 -6
- package/dist/pause.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/simplify.js.map +0 -1
- package/dist/source/error.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 -30
- package/dist/view.js +0 -75
- package/dist/view.js.map +0 -1
- /package/dist/{material.d.ts → levels/material.d.ts} +0 -0
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
import { MeshoptEncoder } from "meshoptimizer";
|
|
2
|
+
import { Box3, BufferAttribute, BufferGeometry, Float16BufferAttribute, FloatType, Group, IntType, Mesh, Object3D, Scene, Sphere, Vector3, } from "three/webgpu";
|
|
3
|
+
import { pack, unpack } from "./container.js";
|
|
4
|
+
import { meshoptDecoder } from "../meshopt.js";
|
|
5
|
+
import { isInstancedMesh, isLOD, isMesh, isSkinnedMesh } from "../three.js";
|
|
6
|
+
// The file format of a simplified level: a static hierarchy's geometry and material slots, drawn with its source's
|
|
7
|
+
// materials.
|
|
8
|
+
const arrays = {
|
|
9
|
+
Int8Array,
|
|
10
|
+
Uint8Array,
|
|
11
|
+
Uint8ClampedArray,
|
|
12
|
+
Int16Array,
|
|
13
|
+
Uint16Array,
|
|
14
|
+
Int32Array,
|
|
15
|
+
Uint32Array,
|
|
16
|
+
Float32Array,
|
|
17
|
+
Float64Array,
|
|
18
|
+
};
|
|
19
|
+
const containers = { Scene, Group, Object3D };
|
|
20
|
+
/** The significant bits a float attribute holds, of its 24: each value moves by at most 2^-17 of its magnitude. */
|
|
21
|
+
const BITS = 18;
|
|
22
|
+
/**
|
|
23
|
+
* Store a static hierarchy's geometry and material slots. Decode with the same ordered material list; materials and textures are never serialized.
|
|
24
|
+
* Attributes and indices are meshopt-encoded, and float attributes hold `BITS` significant bits, as meshopt's exponential filter stores them.
|
|
25
|
+
*/
|
|
26
|
+
export async function encodeMeshAsync(object, materials) {
|
|
27
|
+
await MeshoptEncoder.ready;
|
|
28
|
+
const files = [];
|
|
29
|
+
const geometries = [];
|
|
30
|
+
function attribute(value, index) {
|
|
31
|
+
if (value instanceof Float16BufferAttribute)
|
|
32
|
+
fail("unsupported float16 attribute");
|
|
33
|
+
const packed = value instanceof BufferAttribute ? value.array : value.array.slice(0, value.count * value.itemSize);
|
|
34
|
+
if (!(value instanceof BufferAttribute))
|
|
35
|
+
for (let i = 0; i < value.count; i++) {
|
|
36
|
+
const offset = i * value.data.stride + value.offset;
|
|
37
|
+
packed.set(value.array.subarray(offset, offset + value.itemSize), i * value.itemSize);
|
|
38
|
+
}
|
|
39
|
+
const stride = packed.BYTES_PER_ELEMENT * value.itemSize;
|
|
40
|
+
const mode = index ? (stride === 2 || stride === 4 ? (value.count % 3 ? "INDICES" : "TRIANGLES") : null) : stride % 4 || stride > 256 ? null : "ATTRIBUTES";
|
|
41
|
+
const floats = mode === "ATTRIBUTES" && packed instanceof Float32Array ? packed : undefined;
|
|
42
|
+
const bytes = floats
|
|
43
|
+
? MeshoptEncoder.encodeFilterExp(floats, value.count, stride, BITS, "Separate")
|
|
44
|
+
: new Uint8Array(packed.buffer, packed.byteOffset, packed.byteLength);
|
|
45
|
+
files.push(mode ? MeshoptEncoder.encodeGltfBuffer(bytes, value.count, stride, mode, 1) : bytes);
|
|
46
|
+
return {
|
|
47
|
+
file: files.length - 1,
|
|
48
|
+
type: packed.constructor.name,
|
|
49
|
+
count: value.count,
|
|
50
|
+
size: value.itemSize,
|
|
51
|
+
mode,
|
|
52
|
+
filter: floats ? "EXPONENTIAL" : null,
|
|
53
|
+
normalized: value.normalized,
|
|
54
|
+
gpuType: value instanceof BufferAttribute ? value.gpuType : FloatType,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
function node(value) {
|
|
58
|
+
if (isLOD(value) || isSkinnedMesh(value) || isInstancedMesh(value) || !["Mesh", "Group", "Scene", "Object3D"].includes(value.type))
|
|
59
|
+
fail(`cannot persist ${value.type}; sources must contain static meshes and groups`);
|
|
60
|
+
if (value.matrixAutoUpdate)
|
|
61
|
+
value.updateMatrix();
|
|
62
|
+
const geometry = isMesh(value) ? value.geometry : undefined;
|
|
63
|
+
if (geometry && !geometries.includes(geometry))
|
|
64
|
+
geometries.push(geometry);
|
|
65
|
+
const slot = (material) => {
|
|
66
|
+
const index = materials.indexOf(material);
|
|
67
|
+
if (index < 0)
|
|
68
|
+
fail(`material "${material.name}" is not in the source`);
|
|
69
|
+
return index;
|
|
70
|
+
};
|
|
71
|
+
return {
|
|
72
|
+
type: value.type,
|
|
73
|
+
name: value.name,
|
|
74
|
+
matrix: value.matrix.toArray(),
|
|
75
|
+
matrixAutoUpdate: value.matrixAutoUpdate,
|
|
76
|
+
matrixWorldAutoUpdate: value.matrixWorldAutoUpdate,
|
|
77
|
+
visible: value.visible,
|
|
78
|
+
castShadow: value.castShadow,
|
|
79
|
+
receiveShadow: value.receiveShadow,
|
|
80
|
+
frustumCulled: value.frustumCulled,
|
|
81
|
+
renderOrder: value.renderOrder,
|
|
82
|
+
layers: value.layers.mask,
|
|
83
|
+
data: value.userData,
|
|
84
|
+
children: value.children.map(node),
|
|
85
|
+
geometry: geometry && geometries.indexOf(geometry),
|
|
86
|
+
material: isMesh(value) ? (Array.isArray(value.material) ? value.material.map(slot) : slot(value.material)) : undefined,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
const root = node(object);
|
|
90
|
+
const geometry = geometries.map((value) => {
|
|
91
|
+
if (Object.keys(value.morphAttributes).length)
|
|
92
|
+
fail("cannot persist morph targets");
|
|
93
|
+
return {
|
|
94
|
+
bounds: bounds(value),
|
|
95
|
+
name: value.name,
|
|
96
|
+
data: value.userData,
|
|
97
|
+
groups: value.groups.map((group) => [group.start, group.count, group.materialIndex ?? 0]),
|
|
98
|
+
range: [value.drawRange.start, value.drawRange.count === Infinity ? null : value.drawRange.count],
|
|
99
|
+
attributes: Object.fromEntries(Object.entries(value.attributes).map(([name, value]) => [name, attribute(value, false)])),
|
|
100
|
+
index: value.index && attribute(value.index, true),
|
|
101
|
+
};
|
|
102
|
+
});
|
|
103
|
+
return pack({ version: 3, root, geometry }, files);
|
|
104
|
+
}
|
|
105
|
+
/** The hierarchy `encodeMeshAsync` stored, drawn with `materials`, which stay the caller's to free. */
|
|
106
|
+
export async function decodeMeshAsync(input, materials) {
|
|
107
|
+
const { header, files } = await unpack(input, fail);
|
|
108
|
+
const meta = record(header);
|
|
109
|
+
if (meta.version !== 3)
|
|
110
|
+
fail("unsupported version; encode it again");
|
|
111
|
+
const decoder = meshoptDecoder();
|
|
112
|
+
async function attribute(value) {
|
|
113
|
+
const meta = record(value);
|
|
114
|
+
const Type = arrays[string(meta.type)] ?? fail("unsupported attribute type");
|
|
115
|
+
const file = files[integer(meta.file)] ?? fail("missing attribute file");
|
|
116
|
+
const count = integer(meta.count);
|
|
117
|
+
const size = integer(meta.size);
|
|
118
|
+
const stride = Type.BYTES_PER_ELEMENT * size;
|
|
119
|
+
const mode = meta.mode === null ? null : string(meta.mode);
|
|
120
|
+
const filter = meta.filter === null ? undefined : string(meta.filter);
|
|
121
|
+
if (!size || (mode === null && file.length !== count * stride))
|
|
122
|
+
fail("invalid attribute length");
|
|
123
|
+
const { buffer, byteOffset } = mode === null ? file : await decoder.decodeGltfBufferAsync(count, stride, file, mode, filter);
|
|
124
|
+
if (!(buffer instanceof ArrayBuffer))
|
|
125
|
+
fail("shared attribute data");
|
|
126
|
+
const array = new Type(buffer, byteOffset, count * size);
|
|
127
|
+
const result = new BufferAttribute(array, size, boolean(meta.normalized));
|
|
128
|
+
if (meta.gpuType !== FloatType && meta.gpuType !== IntType)
|
|
129
|
+
fail("invalid attribute gpuType");
|
|
130
|
+
result.gpuType = meta.gpuType;
|
|
131
|
+
return result;
|
|
132
|
+
}
|
|
133
|
+
const geometries = await Promise.all(list(meta.geometry).map(async (value) => {
|
|
134
|
+
const meta = record(value);
|
|
135
|
+
const geometry = new BufferGeometry();
|
|
136
|
+
geometry.name = string(meta.name);
|
|
137
|
+
geometry.userData = record(meta.data);
|
|
138
|
+
const attributes = Object.entries(record(meta.attributes));
|
|
139
|
+
const decoded = await Promise.all(attributes.map(([, value]) => attribute(value)));
|
|
140
|
+
attributes.forEach(([name], i) => geometry.setAttribute(name, decoded[i] ?? fail("missing attribute")));
|
|
141
|
+
if (meta.index !== null)
|
|
142
|
+
geometry.setIndex(await attribute(meta.index));
|
|
143
|
+
for (const value of list(meta.groups)) {
|
|
144
|
+
const group = list(value);
|
|
145
|
+
geometry.addGroup(integer(group[0]), integer(group[1]), integer(group[2]));
|
|
146
|
+
}
|
|
147
|
+
const range = list(meta.range);
|
|
148
|
+
geometry.setDrawRange(integer(range[0]), range[1] === null ? Infinity : integer(range[1]));
|
|
149
|
+
if (meta.bounds !== null) {
|
|
150
|
+
const values = list(meta.bounds).map(number);
|
|
151
|
+
if (values.length !== 10)
|
|
152
|
+
fail("invalid bounds");
|
|
153
|
+
geometry.boundingBox = new Box3().setFromArray(values.slice(0, 6));
|
|
154
|
+
geometry.boundingSphere = new Sphere(new Vector3().fromArray(values, 6), values[9]);
|
|
155
|
+
}
|
|
156
|
+
return geometry;
|
|
157
|
+
}));
|
|
158
|
+
const material = (value) => materials[integer(value)] ?? fail("missing source material");
|
|
159
|
+
function node(value) {
|
|
160
|
+
const meta = record(value);
|
|
161
|
+
const geometry = meta.type === "Mesh" ? (geometries[integer(meta.geometry)] ?? fail("missing geometry")) : undefined;
|
|
162
|
+
const result = geometry
|
|
163
|
+
? new Mesh(geometry, Array.isArray(meta.material) ? meta.material.map(material) : material(meta.material))
|
|
164
|
+
: new (containers[string(meta.type)] ?? fail("unsupported node type"))();
|
|
165
|
+
result.name = string(meta.name);
|
|
166
|
+
const matrix = list(meta.matrix);
|
|
167
|
+
if (matrix.length !== 16)
|
|
168
|
+
fail("invalid matrix");
|
|
169
|
+
result.matrix.fromArray(matrix.map(number));
|
|
170
|
+
result.matrix.decompose(result.position, result.quaternion, result.scale);
|
|
171
|
+
for (const key of ["matrixAutoUpdate", "matrixWorldAutoUpdate", "visible", "castShadow", "receiveShadow", "frustumCulled"])
|
|
172
|
+
result[key] = boolean(meta[key]);
|
|
173
|
+
result.renderOrder = number(meta.renderOrder);
|
|
174
|
+
result.layers.mask = number(meta.layers);
|
|
175
|
+
result.userData = record(meta.data);
|
|
176
|
+
for (const child of list(meta.children))
|
|
177
|
+
result.add(node(child));
|
|
178
|
+
return result;
|
|
179
|
+
}
|
|
180
|
+
return node(meta.root);
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* The box and sphere three computes from the positions, stored so decode does not walk them; null without positions. They
|
|
184
|
+
* bound the positions before the filter, which may move a vertex out of them by 2^-17 of its coordinates.
|
|
185
|
+
*/
|
|
186
|
+
function bounds(geometry) {
|
|
187
|
+
if (!geometry.getAttribute("position"))
|
|
188
|
+
return null;
|
|
189
|
+
geometry.computeBoundingBox();
|
|
190
|
+
geometry.computeBoundingSphere();
|
|
191
|
+
const { boundingBox: box, boundingSphere: sphere } = geometry;
|
|
192
|
+
if (!box || !sphere)
|
|
193
|
+
fail("missing bounds");
|
|
194
|
+
return [...box.min.toArray(), ...box.max.toArray(), ...sphere.center.toArray(), sphere.radius];
|
|
195
|
+
}
|
|
196
|
+
function fail(reason, cause) {
|
|
197
|
+
throw new Error(`Invalid mesh cache (${reason})`, { cause });
|
|
198
|
+
}
|
|
199
|
+
function record(value) {
|
|
200
|
+
if (typeof value !== "object" || value === null || Array.isArray(value))
|
|
201
|
+
fail("expected object");
|
|
202
|
+
return Object.fromEntries(Object.entries(value));
|
|
203
|
+
}
|
|
204
|
+
function list(value) {
|
|
205
|
+
return Array.isArray(value) ? value : fail("expected array");
|
|
206
|
+
}
|
|
207
|
+
function string(value) {
|
|
208
|
+
return typeof value === "string" ? value : fail("expected string");
|
|
209
|
+
}
|
|
210
|
+
function boolean(value) {
|
|
211
|
+
return typeof value === "boolean" ? value : fail("expected boolean");
|
|
212
|
+
}
|
|
213
|
+
function number(value) {
|
|
214
|
+
return typeof value === "number" && Number.isFinite(value) ? value : fail("expected finite number");
|
|
215
|
+
}
|
|
216
|
+
function integer(value) {
|
|
217
|
+
const result = number(value);
|
|
218
|
+
return Number.isSafeInteger(result) && result >= 0 ? result : fail("expected nonnegative integer");
|
|
219
|
+
}
|
|
220
|
+
//# sourceMappingURL=mesh.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mesh.js","sourceRoot":"","sources":["../../src/codec/mesh.ts"],"names":[],"mappings":"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"}
|
package/dist/dispose.d.ts
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { Object3D } from "three/webgpu";
|
|
2
|
+
/** Clones share source geometry, materials and textures; only their own draw state is released here. */
|
|
3
|
+
export declare function disposeCopies(node: Object3D): void;
|
|
4
|
+
/** What `disposeTree` frees beside geometry and draw state. */
|
|
5
|
+
export interface DisposeOptions {
|
|
6
|
+
/** whether the tree's materials and their textures are its own; false for a tree drawn with its source's, as a simplified level is */
|
|
7
|
+
materials: boolean;
|
|
8
|
+
}
|
|
2
9
|
/** Free what `node` and its descendants hold; a nested LOD or an ImpostorMesh frees itself. */
|
|
3
|
-
export declare function disposeTree(node: Object3D): void;
|
|
4
|
-
/**
|
|
5
|
-
export declare function
|
|
10
|
+
export declare function disposeTree(node: Object3D, { materials }?: DisposeOptions): void;
|
|
11
|
+
/** Cleanup must not replace the failure that rejected a load or prevent the other levels from being released. */
|
|
12
|
+
export declare function disposeRejected(node: Object3D, options?: DisposeOptions): void;
|
package/dist/dispose.js
CHANGED
|
@@ -1,22 +1,40 @@
|
|
|
1
|
-
import { originalOf } from "./material.js";
|
|
2
|
-
import { isImpostorMesh, isLOD, isMesh, isTexture } from "./three.js";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
if (
|
|
1
|
+
import { originalOf } from "./levels/material.js";
|
|
2
|
+
import { isGLTSScene, isImpostorMesh, isInstancedMesh, isLOD, isMesh, isTexture } from "./three.js";
|
|
3
|
+
// Freeing what a tree of objects holds: whoever made a tree frees it, and only what it made.
|
|
4
|
+
/** Clones share source geometry, materials and textures; only their own draw state is released here. */
|
|
5
|
+
export function disposeCopies(node) {
|
|
6
|
+
if (isImpostorMesh(node) || isLOD(node)) {
|
|
7
7
|
node.dispose();
|
|
8
|
-
|
|
9
|
-
return;
|
|
8
|
+
return;
|
|
10
9
|
}
|
|
10
|
+
// An InstancedMesh's clone has instance buffers of its own. Any other node fires what Object3D.dispose fires, which frees
|
|
11
|
+
// its draw state: a subclass's own dispose may free what the clone shares.
|
|
12
|
+
if (isInstancedMesh(node))
|
|
13
|
+
node.dispose();
|
|
14
|
+
else
|
|
15
|
+
node.dispatchEvent({ type: "dispose" });
|
|
16
|
+
for (const child of node.children)
|
|
17
|
+
disposeCopies(child);
|
|
18
|
+
}
|
|
19
|
+
/** Free what `node` and its descendants hold; a nested LOD or an ImpostorMesh frees itself. */
|
|
20
|
+
export function disposeTree(node, { materials } = { materials: true }) {
|
|
21
|
+
// Every object frees its draw state; an ImpostorMesh, a nested Lod and a GLTS scene free the rest too.
|
|
22
|
+
node.dispose();
|
|
23
|
+
if (isImpostorMesh(node) || isLOD(node) || isGLTSScene(node))
|
|
24
|
+
return;
|
|
11
25
|
if (isMesh(node)) {
|
|
12
26
|
node.geometry.dispose();
|
|
13
|
-
|
|
27
|
+
if (materials)
|
|
28
|
+
disposeMaterials(node);
|
|
14
29
|
}
|
|
15
30
|
for (const child of node.children)
|
|
16
|
-
disposeTree(child);
|
|
31
|
+
disposeTree(child, { materials });
|
|
17
32
|
}
|
|
18
|
-
/**
|
|
19
|
-
|
|
33
|
+
/**
|
|
34
|
+
* Free `mesh`'s materials and their textures: the originals of level copies, which free their copies (see
|
|
35
|
+
* `levelMaterial`). Images stay open: another object, or three's Cache, may share them and upload them again.
|
|
36
|
+
*/
|
|
37
|
+
function disposeMaterials(mesh) {
|
|
20
38
|
for (const material of new Set([mesh.material].flat().map(originalOf))) {
|
|
21
39
|
const values = Object.values(material);
|
|
22
40
|
for (const value of values)
|
|
@@ -25,4 +43,13 @@ export function disposeMaterials(mesh) {
|
|
|
25
43
|
material.dispose();
|
|
26
44
|
}
|
|
27
45
|
}
|
|
46
|
+
/** Cleanup must not replace the failure that rejected a load or prevent the other levels from being released. */
|
|
47
|
+
export function disposeRejected(node, options) {
|
|
48
|
+
try {
|
|
49
|
+
disposeTree(node, options);
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
console.error("LodLoader: failed to dispose a rejected load", error);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
28
55
|
//# 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,
|
|
1
|
+
{"version":3,"file":"dispose.js","sourceRoot":"","sources":["../src/dispose.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEpG,6FAA6F;AAE7F,wGAAwG;AACxG,MAAM,UAAU,aAAa,CAAC,IAAc;IAC1C,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,OAAO;IACT,CAAC;IACD,0HAA0H;IAC1H,2EAA2E;IAC3E,IAAI,eAAe,CAAC,IAAI,CAAC;QAAE,IAAI,CAAC,OAAO,EAAE,CAAC;;QACrC,IAAI,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;IAC7C,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ;QAAE,aAAa,CAAC,KAAK,CAAC,CAAC;AAC1D,CAAC;AAQD,+FAA+F;AAC/F,MAAM,UAAU,WAAW,CAAC,IAAc,EAAE,EAAE,SAAS,KAAqB,EAAE,SAAS,EAAE,IAAI,EAAE;IAC7F,uGAAuG;IACvG,IAAI,CAAC,OAAO,EAAE,CAAC;IACf,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC;QAAE,OAAO;IACrE,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QACjB,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;QACxB,IAAI,SAAS;YAAE,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ;QAAE,WAAW,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;AACvE,CAAC;AAED;;;GAGG;AACH,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,EAAE,OAAwB;IACtE,IAAI,CAAC;QACH,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC7B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,8CAA8C,EAAE,KAAK,CAAC,CAAC;IACvE,CAAC;AACH,CAAC"}
|
package/dist/gpu.d.ts
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { Renderer } from "three/webgpu";
|
|
2
|
+
import { Compiler } from "./levels/compile/index.js";
|
|
3
|
+
import { InstancePagePool } from "./instanced/pages/index.js";
|
|
4
|
+
import { Sorter } from "./instanced/sort.js";
|
|
5
|
+
/** How a LodGpu is sized. */
|
|
6
|
+
export interface LodGpuOptions {
|
|
7
|
+
/**
|
|
8
|
+
* The most instances its InstancedLods hold at once, over all their chunks: 65536 by default. Its pool holds 64 bytes
|
|
9
|
+
* of matrix and 16 of colour per instance room. Chunks that together outgrow it are reported (see
|
|
10
|
+
* `InstancedLod.error`), naming it as the limit to raise. The lists each camera holds are
|
|
11
|
+
* sized by every InstancedLod's own `maxInstanceCount` instead (see `InstancedLodOptions`).
|
|
12
|
+
*/
|
|
13
|
+
maxInstanceCount?: number;
|
|
14
|
+
/** The most chunks its InstancedLods hold at once: 256 by default. `addChunk` past it throws, naming it. */
|
|
15
|
+
maxChunkCount?: number;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* What every Lod and InstancedLod drawing with one renderer shares, as PMREMGenerator is for environment maps: how
|
|
19
|
+
* their levels compile, the page pool every InstancedLod's instances live in, and the passes that sort them for each
|
|
20
|
+
* camera. Make it once the renderer is initialised (`await renderer.init()`), give it to each Lod and InstancedLod, and
|
|
21
|
+
* dispose it once they are disposed.
|
|
22
|
+
*/
|
|
23
|
+
export declare class LodGpu {
|
|
24
|
+
readonly renderer: Renderer;
|
|
25
|
+
/** The pool every InstancedLod's instances live in. */
|
|
26
|
+
readonly pool: InstancePagePool;
|
|
27
|
+
/** The rows, camera buffers and passes every InstancedLod sorts with. */
|
|
28
|
+
readonly sorter: Sorter;
|
|
29
|
+
/** How levels compile for the renderer. */
|
|
30
|
+
readonly compiler: Compiler;
|
|
31
|
+
constructor(renderer: Renderer, { maxInstanceCount, maxChunkCount }?: LodGpuOptions);
|
|
32
|
+
/** Whether it was disposed: then no Lod or InstancedLod can be made with it, and its sort takes no camera. */
|
|
33
|
+
get disposed(): boolean;
|
|
34
|
+
/**
|
|
35
|
+
* Release the pool and the sort's buffers and passes, once every Lod and InstancedLod made with it is disposed. The
|
|
36
|
+
* renderer keeps the wrapper that shares pipelines among level meshes, which costs nothing once they are gone.
|
|
37
|
+
*/
|
|
38
|
+
dispose(): void;
|
|
39
|
+
}
|
package/dist/gpu.js
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { Compiler } from "./levels/compile/index.js";
|
|
2
|
+
import { InstancePagePool } from "./instanced/pages/index.js";
|
|
3
|
+
import { Sorter } from "./instanced/sort.js";
|
|
4
|
+
const DEFAULT_INSTANCES = 65536;
|
|
5
|
+
const DEFAULT_CHUNKS = 256;
|
|
6
|
+
/**
|
|
7
|
+
* What every Lod and InstancedLod drawing with one renderer shares, as PMREMGenerator is for environment maps: how
|
|
8
|
+
* their levels compile, the page pool every InstancedLod's instances live in, and the passes that sort them for each
|
|
9
|
+
* camera. Make it once the renderer is initialised (`await renderer.init()`), give it to each Lod and InstancedLod, and
|
|
10
|
+
* dispose it once they are disposed.
|
|
11
|
+
*/
|
|
12
|
+
export class LodGpu {
|
|
13
|
+
renderer;
|
|
14
|
+
/** The pool every InstancedLod's instances live in. */
|
|
15
|
+
pool;
|
|
16
|
+
/** The rows, camera buffers and passes every InstancedLod sorts with. */
|
|
17
|
+
sorter;
|
|
18
|
+
/** How levels compile for the renderer. */
|
|
19
|
+
compiler;
|
|
20
|
+
constructor(renderer, { maxInstanceCount = DEFAULT_INSTANCES, maxChunkCount = DEFAULT_CHUNKS } = {}) {
|
|
21
|
+
this.renderer = renderer;
|
|
22
|
+
if (!renderer.initialized)
|
|
23
|
+
throw new Error("LodGpu: initialise the renderer first (await renderer.init())");
|
|
24
|
+
this.pool = new InstancePagePool(maxInstanceCount, maxChunkCount);
|
|
25
|
+
this.sorter = new Sorter(renderer, this.pool);
|
|
26
|
+
this.compiler = new Compiler(renderer);
|
|
27
|
+
}
|
|
28
|
+
/** Whether it was disposed: then no Lod or InstancedLod can be made with it, and its sort takes no camera. */
|
|
29
|
+
get disposed() {
|
|
30
|
+
return this.sorter.disposed;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Release the pool and the sort's buffers and passes, once every Lod and InstancedLod made with it is disposed. The
|
|
34
|
+
* renderer keeps the wrapper that shares pipelines among level meshes, which costs nothing once they are gone.
|
|
35
|
+
*/
|
|
36
|
+
dispose() {
|
|
37
|
+
this.sorter.dispose();
|
|
38
|
+
this.pool.dispose();
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=gpu.js.map
|
package/dist/gpu.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gpu.js","sourceRoot":"","sources":["../src/gpu.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAe7C,MAAM,iBAAiB,GAAG,KAAK,CAAC;AAChC,MAAM,cAAc,GAAG,GAAG,CAAC;AAE3B;;;;;GAKG;AACH,MAAM,OAAO,MAAM;IASN;IARX,uDAAuD;IAC9C,IAAI,CAAmB;IAChC,yEAAyE;IAChE,MAAM,CAAS;IACxB,2CAA2C;IAClC,QAAQ,CAAW;IAE5B,YACW,QAAkB,EAC3B,EAAE,gBAAgB,GAAG,iBAAiB,EAAE,aAAa,GAAG,cAAc,KAAoB,EAAE;QADnF,aAAQ,GAAR,QAAQ,CAAU;QAG3B,IAAI,CAAC,QAAQ,CAAC,WAAW;YAAE,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;QAC5G,IAAI,CAAC,IAAI,GAAG,IAAI,gBAAgB,CAAC,gBAAgB,EAAE,aAAa,CAAC,CAAC;QAClE,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9C,IAAI,CAAC,QAAQ,GAAG,IAAI,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACzC,CAAC;IAED,8GAA8G;IAC9G,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;IAC9B,CAAC;IAED;;;OAGG;IACH,OAAO;QACL,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACtB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;IACtB,CAAC;CACF"}
|
|
@@ -4,11 +4,11 @@ import type { ImpostorMap } from "../impostor.js";
|
|
|
4
4
|
* The bake stores the normals two ways (see its materials): the maps hold the surface's
|
|
5
5
|
* own normals, `turned` the shading normals turned toward the camera, each with the share
|
|
6
6
|
* of the surface that shades with the normal rather than its opposite (in orm.a). One way
|
|
7
|
-
*
|
|
7
|
+
* serves the whole impostor, as texels filtered together must mean the same thing.
|
|
8
8
|
* With `specular`, the bake also writes each surface's dielectric specular, of which only
|
|
9
|
-
* the coverage-weighted sum is
|
|
9
|
+
* the coverage-weighted sum is stored, for its mean.
|
|
10
10
|
*/
|
|
11
|
-
export declare class
|
|
11
|
+
export declare class ImpostorAtlasMip {
|
|
12
12
|
readonly maps: ImpostorMap[];
|
|
13
13
|
readonly frames: number;
|
|
14
14
|
readonly cell: number;
|
|
@@ -26,7 +26,7 @@ export declare class Atlas {
|
|
|
26
26
|
/** F0 RGB and F90 summed over the texels by coverage, and the coverage summed. */
|
|
27
27
|
private readonly specularSum;
|
|
28
28
|
constructor(maps: ImpostorMap[], frames: number, cell: number, specular: boolean);
|
|
29
|
-
/**
|
|
29
|
+
/** Use the turned normals: write them over the own normals and their shares. */
|
|
30
30
|
useTurned(): void;
|
|
31
31
|
private layer;
|
|
32
32
|
/**
|
|
@@ -11,11 +11,11 @@ const NEIGHBOURS = [
|
|
|
11
11
|
* The bake stores the normals two ways (see its materials): the maps hold the surface's
|
|
12
12
|
* own normals, `turned` the shading normals turned toward the camera, each with the share
|
|
13
13
|
* of the surface that shades with the normal rather than its opposite (in orm.a). One way
|
|
14
|
-
*
|
|
14
|
+
* serves the whole impostor, as texels filtered together must mean the same thing.
|
|
15
15
|
* With `specular`, the bake also writes each surface's dielectric specular, of which only
|
|
16
|
-
* the coverage-weighted sum is
|
|
16
|
+
* the coverage-weighted sum is stored, for its mean.
|
|
17
17
|
*/
|
|
18
|
-
export class
|
|
18
|
+
export class ImpostorAtlasMip {
|
|
19
19
|
maps;
|
|
20
20
|
frames;
|
|
21
21
|
cell;
|
|
@@ -39,7 +39,7 @@ export class Atlas {
|
|
|
39
39
|
this.coverage = new Float32Array(this.size * this.size);
|
|
40
40
|
this.turned = new Uint8Array(this.size * this.size * 4);
|
|
41
41
|
}
|
|
42
|
-
/**
|
|
42
|
+
/** Use the turned normals: write them over the own normals and their shares. */
|
|
43
43
|
useTurned() {
|
|
44
44
|
const normalDepth = this.layer("normalDepth");
|
|
45
45
|
const orm = this.layer("orm");
|
|
@@ -52,7 +52,7 @@ export class Atlas {
|
|
|
52
52
|
layer(map) {
|
|
53
53
|
const layer = this.layers[this.maps.indexOf(map)];
|
|
54
54
|
if (!layer)
|
|
55
|
-
throw new Error(`
|
|
55
|
+
throw new Error(`ImpostorAtlasMip: no ${map} layer`);
|
|
56
56
|
return layer;
|
|
57
57
|
}
|
|
58
58
|
/**
|
|
@@ -66,7 +66,7 @@ export class Atlas {
|
|
|
66
66
|
const { cell, size, maps, layers } = this;
|
|
67
67
|
const [alpha] = pixels;
|
|
68
68
|
if (!alpha || pixels.length !== maps.length + (this.specular ? 2 : 1))
|
|
69
|
-
throw new Error("
|
|
69
|
+
throw new Error("ImpostorAtlasMip.write: one pixel array per map, then the turned normals, then the specular if baked");
|
|
70
70
|
const sources = [...maps, "turned"];
|
|
71
71
|
const specular = this.specular ? pixels[maps.length + 1] : undefined;
|
|
72
72
|
for (let y = 0; y < cell; y++)
|
|
@@ -104,7 +104,7 @@ export class Atlas {
|
|
|
104
104
|
const source = pixels[m];
|
|
105
105
|
const layer = map === "turned" ? this.turned : layers[m];
|
|
106
106
|
if (!source || !layer)
|
|
107
|
-
throw new Error(`
|
|
107
|
+
throw new Error(`ImpostorAtlasMip.write: no pixels for ${map}`);
|
|
108
108
|
const [r, g, b, a] = average(source);
|
|
109
109
|
if (map === "normalDepth")
|
|
110
110
|
this.agreement.own += cover * Math.hypot(r * 2 - 1, g * 2 - 1, b * 2 - 1);
|
|
@@ -118,7 +118,7 @@ export class Atlas {
|
|
|
118
118
|
meanSpecular() {
|
|
119
119
|
const { value, coverage } = this.specularSum;
|
|
120
120
|
if (!this.specular || coverage === 0)
|
|
121
|
-
throw new Error("
|
|
121
|
+
throw new Error("ImpostorAtlasMip.meanSpecular: no specular was baked");
|
|
122
122
|
const [r = 0, g = 0, b = 0, f90 = 0] = value.map((v) => v / coverage);
|
|
123
123
|
return [r, g, b, f90];
|
|
124
124
|
}
|
|
@@ -162,7 +162,7 @@ export class Atlas {
|
|
|
162
162
|
filled[ny * cell + nx] = 1;
|
|
163
163
|
queue[tail++] = ny * cell + nx;
|
|
164
164
|
const to = ((y0 + ny) * size + x0 + nx) * 4;
|
|
165
|
-
// Base
|
|
165
|
+
// Base coverage stays zero; the other layers' alpha is data (depth) and spreads too.
|
|
166
166
|
this.layers.forEach((layer, m) => {
|
|
167
167
|
const n = this.maps[m] === "base" ? 3 : 4;
|
|
168
168
|
for (let k = 0; k < n; k++)
|
|
@@ -176,9 +176,9 @@ export class Atlas {
|
|
|
176
176
|
}
|
|
177
177
|
/**
|
|
178
178
|
* Pack one texel into `layer` at byte `out`: colour as sRGB if `srgb`, the rest linearly.
|
|
179
|
-
* An averaged normal
|
|
180
|
-
* and is lit by
|
|
181
|
-
* smooth surface turned to the camera.
|
|
179
|
+
* An averaged normal is not renormalised: its length says how far the normals it averages
|
|
180
|
+
* agree, and is lit by. Renormalised, a texel of leaves facing every which way would light
|
|
181
|
+
* as one smooth surface turned to the camera.
|
|
182
182
|
*/
|
|
183
183
|
function store(layer, out, [r, g, b, a], srgb) {
|
|
184
184
|
const encode = srgb ? toSrgb : (v) => Math.round(v * 255);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"atlas.js","sourceRoot":"","sources":["../../../src/impostor/bake/atlas.ts"],"names":[],"mappings":"AAEA,6FAA6F;AAE7F,MAAM,MAAM,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;AAE5H,MAAM,UAAU,GAAG;IACjB,CAAC,CAAC,EAAE,CAAC,CAAC;IACN,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACP,CAAC,CAAC,EAAE,CAAC,CAAC;IACN,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;CACC,CAAC;AAEX;;;;;;;;GAQG;AACH,MAAM,OAAO,
|
|
1
|
+
{"version":3,"file":"atlas.js","sourceRoot":"","sources":["../../../src/impostor/bake/atlas.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type Object3D, type Vector3 } from "three/webgpu";
|
|
2
|
+
import { type Vec3 } from "../octahedral.js";
|
|
3
|
+
/**
|
|
4
|
+
* The smallest square half-size that holds the object in every frame: the largest
|
|
5
|
+
* extent of any vertex along any frame's image axes. Tighter than the bounding
|
|
6
|
+
* sphere, which wastes about a third of every frame on a tree.
|
|
7
|
+
*/
|
|
8
|
+
export declare function fittedHalfSize(source: Object3D, centre: Vector3, directions: Vec3[]): number;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import {} from "three/webgpu";
|
|
2
|
+
import { forEachVertex } from "../../source/detail.js";
|
|
3
|
+
import { frameBasis } from "../octahedral.js";
|
|
4
|
+
/**
|
|
5
|
+
* The smallest square half-size that holds the object in every frame: the largest
|
|
6
|
+
* extent of any vertex along any frame's image axes. Tighter than the bounding
|
|
7
|
+
* sphere, which wastes about a third of every frame on a tree.
|
|
8
|
+
*/
|
|
9
|
+
export function fittedHalfSize(source, centre, directions) {
|
|
10
|
+
const axes = directions.flatMap((n) => {
|
|
11
|
+
const { tangent, bitangent } = frameBasis(n);
|
|
12
|
+
return [tangent, bitangent];
|
|
13
|
+
});
|
|
14
|
+
// Cauchy–Schwarz bounds every projection by radius × axis length, with a little slack for rounding.
|
|
15
|
+
const norm2 = axes.reduce((max, [x, y, z]) => Math.max(max, x * x + y * y + z * z), 0) * (1 + 1e-9);
|
|
16
|
+
let half = 0;
|
|
17
|
+
forEachVertex(source, (p) => {
|
|
18
|
+
p.sub(centre);
|
|
19
|
+
if (p.lengthSq() * norm2 < half * half)
|
|
20
|
+
return;
|
|
21
|
+
for (const a of axes)
|
|
22
|
+
half = Math.max(half, Math.abs(p.x * a[0] + p.y * a[1] + p.z * a[2]));
|
|
23
|
+
});
|
|
24
|
+
if (half === 0)
|
|
25
|
+
throw new Error("bakeImpostor: object has no extent (every vertex is at one point)");
|
|
26
|
+
return half;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=fit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fit.js","sourceRoot":"","sources":["../../../src/impostor/bake/fit.ts"],"names":[],"mappings":"AAAA,OAAO,EAA+B,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAa,MAAM,kBAAkB,CAAC;AAEzD;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,MAAgB,EAAE,MAAe,EAAE,UAAkB;IAClF,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;QACpC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;QAC7C,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;IACH,oGAAoG;IACpG,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACpG,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE;QAC1B,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACd,IAAI,CAAC,CAAC,QAAQ,EAAE,GAAG,KAAK,GAAG,IAAI,GAAG,IAAI;YAAE,OAAO;QAC/C,KAAK,MAAM,CAAC,IAAI,IAAI;YAAE,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9F,CAAC,CAAC,CAAC;IACH,IAAI,IAAI,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAC;IACrG,OAAO,IAAI,CAAC;AACd,CAAC"}
|