@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,203 @@
|
|
|
1
|
+
import { Matrix4, Vector3 } from "three/webgpu";
|
|
2
|
+
import { d, std, tgpu } from "typegpu";
|
|
3
|
+
import { drawnLevel, levelsToDraw } from "../levels/draw.js";
|
|
4
|
+
// How one instance draws, the same on the CPU and in the sort (see update.ts): whether cullDistance thins it out and
|
|
5
|
+
// how much its survivors grow, and its height on screen.
|
|
6
|
+
/** The largest a survivor of `cullDistance` grows: what it reaches where 1/64 of the instances draw. */
|
|
7
|
+
export const MAX_SURVIVOR_SCALE = 8;
|
|
8
|
+
/** Three xorshift steps: shifts and xors only, exact in JavaScript's 32-bit integer operators as on the GPU. */
|
|
9
|
+
const xorshift = /*#__PURE__*/(globalThis.__TYPEGPU_AUTONAME__ ?? (a => a))(tgpu.fn([d.u32], d.u32)(/*#__PURE__*/($ => (globalThis.__TYPEGPU_META__ ??= new WeakMap()).set($.f = value => {
|
|
10
|
+
"use gpu";
|
|
11
|
+
|
|
12
|
+
let h = d.u32(value);
|
|
13
|
+
h = d.u32(h ^ h << 13);
|
|
14
|
+
h = d.u32(h ^ h >>> 17);
|
|
15
|
+
h = d.u32(h ^ h << 5);
|
|
16
|
+
return h;
|
|
17
|
+
}, {
|
|
18
|
+
v: 2,
|
|
19
|
+
name: undefined,
|
|
20
|
+
ast: {
|
|
21
|
+
params: [{
|
|
22
|
+
type: "i",
|
|
23
|
+
name: "value"
|
|
24
|
+
}],
|
|
25
|
+
body: [0, [[12, "h", [6, "d.u32", ["value"]]], [2, "h", "=", [6, "d.u32", [[1, "h", "^", [1, "h", "<<", [5, "13"]]]]]], [2, "h", "=", [6, "d.u32", [[1, "h", "^", [1, "h", ">>>", [5, "17"]]]]]], [2, "h", "=", [6, "d.u32", [[1, "h", "^", [1, "h", "<<", [5, "5"]]]]]], [10, "h"]]]
|
|
26
|
+
},
|
|
27
|
+
externals: {
|
|
28
|
+
"d.u32": () => d.u32
|
|
29
|
+
}
|
|
30
|
+
}) && $.f)({})), "xorshift");
|
|
31
|
+
/**
|
|
32
|
+
* The bits of `origin`, an instance's translation, hashed into [0, 1): what thins it out (see `CullDistance`), the
|
|
33
|
+
* same on the CPU and the GPU.
|
|
34
|
+
*/
|
|
35
|
+
export const originHash = /*#__PURE__*/(globalThis.__TYPEGPU_AUTONAME__ ?? (a => a))(tgpu.fn([d.vec3f], d.f32)(/*#__PURE__*/($ => (globalThis.__TYPEGPU_META__ ??= new WeakMap()).set($.f = origin => {
|
|
36
|
+
"use gpu";
|
|
37
|
+
|
|
38
|
+
const bits = std.bitcastF32toU32(origin);
|
|
39
|
+
let h = xorshift(bits.x ^ d.u32(0x9e3779b9));
|
|
40
|
+
h = xorshift(h ^ bits.y);
|
|
41
|
+
h = xorshift(h ^ bits.z);
|
|
42
|
+
h = xorshift(h);
|
|
43
|
+
return __tsover_div(d.f32(h >>> 8), 16777216);
|
|
44
|
+
}, {
|
|
45
|
+
v: 2,
|
|
46
|
+
name: undefined,
|
|
47
|
+
ast: {
|
|
48
|
+
params: [{
|
|
49
|
+
type: "i",
|
|
50
|
+
name: "origin"
|
|
51
|
+
}],
|
|
52
|
+
body: [0, [[13, "bits", [6, "std.bitcastF32toU32", ["origin"]]], [12, "h", [6, "xorshift", [[1, [7, "bits", "x"], "^", [6, "d.u32", [[5, "2654435769"]]]]]]], [2, "h", "=", [6, "xorshift", [[1, "h", "^", [7, "bits", "y"]]]]], [2, "h", "=", [6, "xorshift", [[1, "h", "^", [7, "bits", "z"]]]]], [2, "h", "=", [6, "xorshift", ["h"]]], [10, [1, [6, "d.f32", [[1, "h", ">>>", [5, "8"]]]], "/", [5, "16777216"]]]]]
|
|
53
|
+
},
|
|
54
|
+
externals: {
|
|
55
|
+
"std.bitcastF32toU32": () => std.bitcastF32toU32,
|
|
56
|
+
"xorshift": () => xorshift,
|
|
57
|
+
"d.u32": () => d.u32,
|
|
58
|
+
"d.f32": () => d.f32
|
|
59
|
+
}
|
|
60
|
+
}) && $.f)({})), "originHash");
|
|
61
|
+
/**
|
|
62
|
+
* How an instance at `origin`, `distance` from the cullDistance camera, draws (see `CullDistance`): 0 thinned out,
|
|
63
|
+
* else the scale it draws at: 1, or with `survivors` 1/√share, share the share of instances drawn at its distance.
|
|
64
|
+
*/
|
|
65
|
+
export const cullScale = /*#__PURE__*/(globalThis.__TYPEGPU_AUTONAME__ ?? (a => a))(tgpu.fn([d.vec3f, d.f32, d.f32, d.f32, d.u32], d.f32)(/*#__PURE__*/($ => (globalThis.__TYPEGPU_META__ ??= new WeakMap()).set($.f = (origin, distance, near, far, survivors) => {
|
|
66
|
+
"use gpu";
|
|
67
|
+
|
|
68
|
+
const share = std.clamp(__tsover_div(__tsover_sub(far, distance), __tsover_sub(far, near)), 0, 1);
|
|
69
|
+
if (originHash(origin) >= share) return 0;
|
|
70
|
+
if (survivors === 0) return 1;
|
|
71
|
+
return std.min(__tsover_div(1, std.sqrt(share)), MAX_SURVIVOR_SCALE);
|
|
72
|
+
}, {
|
|
73
|
+
v: 2,
|
|
74
|
+
name: undefined,
|
|
75
|
+
ast: {
|
|
76
|
+
params: [{
|
|
77
|
+
type: "i",
|
|
78
|
+
name: "origin"
|
|
79
|
+
}, {
|
|
80
|
+
type: "i",
|
|
81
|
+
name: "distance"
|
|
82
|
+
}, {
|
|
83
|
+
type: "i",
|
|
84
|
+
name: "near"
|
|
85
|
+
}, {
|
|
86
|
+
type: "i",
|
|
87
|
+
name: "far"
|
|
88
|
+
}, {
|
|
89
|
+
type: "i",
|
|
90
|
+
name: "survivors"
|
|
91
|
+
}],
|
|
92
|
+
body: [0, [[13, "share", [6, "std.clamp", [[1, [1, "far", "-", "distance"], "/", [1, "far", "-", "near"]], [5, "0"], [5, "1"]]]], [11, [1, [6, "originHash", ["origin"]], ">=", "share"], [10, [5, "0"]]], [11, [1, "survivors", "===", [5, "0"]], [10, [5, "1"]]], [10, [6, "std.min", [[1, [5, "1"], "/", [6, "std.sqrt", ["share"]]], "MAX_SURVIVOR_SCALE"]]]]]
|
|
93
|
+
},
|
|
94
|
+
externals: {
|
|
95
|
+
"std.clamp": () => std.clamp,
|
|
96
|
+
"originHash": () => originHash,
|
|
97
|
+
"std.min": () => std.min,
|
|
98
|
+
"std.sqrt": () => std.sqrt,
|
|
99
|
+
"MAX_SURVIVOR_SCALE": () => MAX_SURVIVOR_SCALE
|
|
100
|
+
}
|
|
101
|
+
}) && $.f)({})), "cullScale");
|
|
102
|
+
/** The longest `matrix` scales an axis. */
|
|
103
|
+
const longestAxis = /*#__PURE__*/(globalThis.__TYPEGPU_AUTONAME__ ?? (a => a))(tgpu.fn([d.mat4x4f], d.f32)(/*#__PURE__*/($ => (globalThis.__TYPEGPU_META__ ??= new WeakMap()).set($.f = matrix => {
|
|
104
|
+
"use gpu";
|
|
105
|
+
|
|
106
|
+
const x = std.length(std.mul(matrix, d.vec4f(1, 0, 0, 0)).xyz);
|
|
107
|
+
const y = std.length(std.mul(matrix, d.vec4f(0, 1, 0, 0)).xyz);
|
|
108
|
+
const z = std.length(std.mul(matrix, d.vec4f(0, 0, 1, 0)).xyz);
|
|
109
|
+
return std.max(x, std.max(y, z));
|
|
110
|
+
}, {
|
|
111
|
+
v: 2,
|
|
112
|
+
name: undefined,
|
|
113
|
+
ast: {
|
|
114
|
+
params: [{
|
|
115
|
+
type: "i",
|
|
116
|
+
name: "matrix"
|
|
117
|
+
}],
|
|
118
|
+
body: [0, [[13, "x", [6, "std.length", [[7, [6, "std.mul", ["matrix", [6, "d.vec4f", [[5, "1"], [5, "0"], [5, "0"], [5, "0"]]]]], "xyz"]]]], [13, "y", [6, "std.length", [[7, [6, "std.mul", ["matrix", [6, "d.vec4f", [[5, "0"], [5, "1"], [5, "0"], [5, "0"]]]]], "xyz"]]]], [13, "z", [6, "std.length", [[7, [6, "std.mul", ["matrix", [6, "d.vec4f", [[5, "0"], [5, "0"], [5, "1"], [5, "0"]]]]], "xyz"]]]], [10, [6, "std.max", ["x", [6, "std.max", ["y", "z"]]]]]]]
|
|
119
|
+
},
|
|
120
|
+
externals: {
|
|
121
|
+
"std.length": () => std.length,
|
|
122
|
+
"std.mul": () => std.mul,
|
|
123
|
+
"d.vec4f": () => d.vec4f,
|
|
124
|
+
"std.max": () => std.max
|
|
125
|
+
}
|
|
126
|
+
}) && $.f)({})), "longestAxis");
|
|
127
|
+
/**
|
|
128
|
+
* Where an instance at `matrix` stands for a camera, `source` the source's sphere (centre, radius) grown by `grow`:
|
|
129
|
+
* the source's centre (xyz), and its height on screen (w) seen from `eye` with `scale` pixels per unit of subtense, or
|
|
130
|
+
* of size with `ortho` 1, as a Lod measures its own on the CPU (see screen.ts: 2 r q / d).
|
|
131
|
+
*/
|
|
132
|
+
export const instanceOnScreen = /*#__PURE__*/(globalThis.__TYPEGPU_AUTONAME__ ?? (a => a))(tgpu.fn([d.mat4x4f, d.vec4f, d.f32, d.vec3f, d.f32, d.u32], d.vec4f)(/*#__PURE__*/($ => (globalThis.__TYPEGPU_META__ ??= new WeakMap()).set($.f = (matrix, source, grow, eye, scale, ortho) => {
|
|
133
|
+
"use gpu";
|
|
134
|
+
|
|
135
|
+
const centre = std.mul(matrix, d.vec4f(std.mul(source.xyz, grow), 1)).xyz;
|
|
136
|
+
const size = __tsover_mul(__tsover_mul(__tsover_mul(__tsover_mul(source.w, longestAxis(matrix)), grow), 2), scale);
|
|
137
|
+
if (ortho === 1) return d.vec4f(centre, size);
|
|
138
|
+
return d.vec4f(centre, __tsover_div(size, std.max(std.distance(centre, eye), 1e-6)));
|
|
139
|
+
}, {
|
|
140
|
+
v: 2,
|
|
141
|
+
name: undefined,
|
|
142
|
+
ast: {
|
|
143
|
+
params: [{
|
|
144
|
+
type: "i",
|
|
145
|
+
name: "matrix"
|
|
146
|
+
}, {
|
|
147
|
+
type: "i",
|
|
148
|
+
name: "source"
|
|
149
|
+
}, {
|
|
150
|
+
type: "i",
|
|
151
|
+
name: "grow"
|
|
152
|
+
}, {
|
|
153
|
+
type: "i",
|
|
154
|
+
name: "eye"
|
|
155
|
+
}, {
|
|
156
|
+
type: "i",
|
|
157
|
+
name: "scale"
|
|
158
|
+
}, {
|
|
159
|
+
type: "i",
|
|
160
|
+
name: "ortho"
|
|
161
|
+
}],
|
|
162
|
+
body: [0, [[13, "centre", [7, [6, "std.mul", ["matrix", [6, "d.vec4f", [[6, "std.mul", [[7, "source", "xyz"], "grow"]], [5, "1"]]]]], "xyz"]], [13, "size", [1, [1, [1, [1, [7, "source", "w"], "*", [6, "longestAxis", ["matrix"]]], "*", "grow"], "*", [5, "2"]], "*", "scale"]], [11, [1, "ortho", "===", [5, "1"]], [10, [6, "d.vec4f", ["centre", "size"]]]], [10, [6, "d.vec4f", ["centre", [1, "size", "/", [6, "std.max", [[6, "std.distance", ["centre", "eye"]], [5, "0.000001"]]]]]]]]]
|
|
163
|
+
},
|
|
164
|
+
externals: {
|
|
165
|
+
"std.mul": () => std.mul,
|
|
166
|
+
"d.vec4f": () => d.vec4f,
|
|
167
|
+
"longestAxis": () => longestAxis,
|
|
168
|
+
"std.max": () => std.max,
|
|
169
|
+
"std.distance": () => std.distance
|
|
170
|
+
}
|
|
171
|
+
}) && $.f)({})), "instanceOnScreen");
|
|
172
|
+
const instance = new Matrix4();
|
|
173
|
+
const origin = new Vector3();
|
|
174
|
+
const toVec3f = ({
|
|
175
|
+
x,
|
|
176
|
+
y,
|
|
177
|
+
z
|
|
178
|
+
}) => d.vec3f(x, y, z);
|
|
179
|
+
/**
|
|
180
|
+
* The level the instance at `offset` of `matrices` draws most of its pixels with (see `InstancedLodChunk.getLevelAt`),
|
|
181
|
+
* thinned out by `cull` and seen by `camera`, both in the InstancedLod's space, of the levels of `loaded`, `source` the
|
|
182
|
+
* source's sphere; null if it draws nothing.
|
|
183
|
+
*/
|
|
184
|
+
export function instanceLevel(matrices, offset, cull, camera, source, loaded) {
|
|
185
|
+
instance.fromArray(matrices, offset);
|
|
186
|
+
if (instance.getMaxScaleOnAxis() === 0) return null;
|
|
187
|
+
origin.setFromMatrixPosition(instance);
|
|
188
|
+
const grow = cull ? cullScale(toVec3f(origin), origin.distanceTo(cull.eye), cull.near, cull.far, Number(cull.survivors)) : 1;
|
|
189
|
+
if (grow === 0) return null;
|
|
190
|
+
const {
|
|
191
|
+
levels,
|
|
192
|
+
eye,
|
|
193
|
+
scale,
|
|
194
|
+
ortho
|
|
195
|
+
} = camera;
|
|
196
|
+
const {
|
|
197
|
+
center,
|
|
198
|
+
radius
|
|
199
|
+
} = source;
|
|
200
|
+
const height = instanceOnScreen(d.mat4x4f(...instance.elements), d.vec4f(center.x, center.y, center.z, radius), grow, toVec3f(eye), scale, Number(ortho)).w;
|
|
201
|
+
return drawnLevel(levelsToDraw(height, levels, loaded, loaded, 1));
|
|
202
|
+
}
|
|
203
|
+
//# sourceMappingURL=measure.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["Matrix4","Vector3","d","std","tgpu","drawnLevel","levelsToDraw","MAX_SURVIVOR_SCALE","xorshift","globalThis","__TYPEGPU_AUTONAME__","a","fn","u32","$","__TYPEGPU_META__","WeakMap","set","f","value","h","v","name","undefined","ast","params","type","body","externals","d.u32","originHash","vec3f","f32","origin","bits","bitcastF32toU32","x","y","z","__tsover_div","std.bitcastF32toU32","d.f32","cullScale","distance","near","far","survivors","share","clamp","__tsover_sub","min","sqrt","std.clamp","std.min","std.sqrt","longestAxis","mat4x4f","matrix","length","mul","vec4f","xyz","max","std.length","std.mul","d.vec4f","std.max","instanceOnScreen","source","grow","eye","scale","ortho","centre","size","__tsover_mul","w","std.distance","instance","toVec3f","instanceLevel","matrices","offset","cull","camera","loaded","fromArray","getMaxScaleOnAxis","setFromMatrixPosition","distanceTo","Number","levels","center","radius","height","elements"],"sources":["../../src/instanced/measure.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
|
@@ -1,14 +1,46 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import type
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
export
|
|
13
|
-
/**
|
|
14
|
-
|
|
1
|
+
import { type Box3, type Camera, type Color, Matrix4, Mesh, type Object3D, type Sphere } from "three/webgpu";
|
|
2
|
+
import { type DrawnInstances, type InstanceSlots } from "../levels/fade.js";
|
|
3
|
+
import { type IndirectDraw } from "./rows.js";
|
|
4
|
+
/** A mesh of a level's object and one of its material groups, placed in the instance's space. */
|
|
5
|
+
export interface Part {
|
|
6
|
+
template: Mesh;
|
|
7
|
+
placement: Matrix4;
|
|
8
|
+
group: number;
|
|
9
|
+
draw: IndirectDraw;
|
|
10
|
+
}
|
|
11
|
+
/** What every level mesh of one InstancedLod draws from. */
|
|
12
|
+
export interface MeshInputs {
|
|
13
|
+
/** The instances, which a mesh made later draws too. */
|
|
14
|
+
readonly instances: DrawnInstances;
|
|
15
|
+
/**
|
|
16
|
+
* Around every instance, in the InstancedLod's space: what its meshes are culled by, and their box, which three's
|
|
17
|
+
* Box3.setFromObject reads.
|
|
18
|
+
*/
|
|
19
|
+
readonly bounds: Sphere;
|
|
20
|
+
readonly box: Box3;
|
|
21
|
+
/** Per camera, the instances in each level's list and where its indirect draws lie. */
|
|
22
|
+
readonly slots: (camera: Camera) => InstanceSlots;
|
|
23
|
+
/** One instance's bounding radius in its own space, which shadow casters are cut off at. */
|
|
24
|
+
readonly radius: number;
|
|
25
|
+
/**
|
|
26
|
+
* Where `camera`'s indirect draws lie as a mesh draws for it with `renderer`, its lists sorted: the camera's due sorts,
|
|
27
|
+
* every InstancedLod's, run now. Never throws: three is rendering.
|
|
28
|
+
*/
|
|
29
|
+
readonly drawFor: (renderer: unknown, camera: Camera) => InstanceSlots["args"];
|
|
30
|
+
}
|
|
31
|
+
/** `object`'s meshes and material groups, placed once in the instance's space, for level `level`. */
|
|
32
|
+
export declare function partsOf(object: Object3D, level: number): Part[];
|
|
33
|
+
/** A level's meshes, which draw once their indirect draws lie among a camera's (see `drawFrom`). */
|
|
34
|
+
export interface LevelMeshes {
|
|
35
|
+
readonly meshes: Mesh[];
|
|
36
|
+
/** The meshes' indirect draws, in order. */
|
|
37
|
+
readonly draws: IndirectDraw[];
|
|
38
|
+
/** Draw from the camera's draw `first` on, where `draws` were appended (see `InstanceSlots.args`). */
|
|
39
|
+
drawFrom(first: number): void;
|
|
40
|
+
}
|
|
41
|
+
/** The meshes drawing `parts`, tinted by `tint`. */
|
|
42
|
+
export declare function levelMeshes(parts: readonly Part[], tint: Color, inputs: MeshInputs): LevelMeshes;
|
|
43
|
+
/** Release `mesh`, which may never have been added. */
|
|
44
|
+
export declare function freeMesh(mesh: Mesh): void;
|
|
45
|
+
/** Point every mesh of `meshes` at `instances.matrices`, which changed: survivors scale, or no longer do. */
|
|
46
|
+
export declare function drawMatrices(meshes: readonly Mesh[], instances: DrawnInstances): void;
|
package/dist/instanced/meshes.js
CHANGED
|
@@ -1,9 +1,32 @@
|
|
|
1
|
-
import { BufferGeometry, Matrix4 } from "three/webgpu";
|
|
2
|
-
import {
|
|
3
|
-
|
|
1
|
+
import { BufferGeometry, Matrix4, Mesh } from "three/webgpu";
|
|
2
|
+
import { setFadeSource } from "../levels/fade.js";
|
|
3
|
+
import { levelMaterial } from "../levels/material.js";
|
|
4
|
+
import { impostorInstances } from "../impostor/mesh/index.js";
|
|
5
|
+
import { isImpostorMesh, isInstancedMesh, isLOD, isMesh, rejectSkinned } from "../three.js";
|
|
6
|
+
import { DRAW_BYTES } from "./rows.js";
|
|
7
|
+
// The meshes that draw an InstancedLod's level: one plain three Mesh per mesh and material group of its object, or an
|
|
8
|
+
// ImpostorMesh for an impostor, each drawing every instance in its level's list for a camera with one indirect draw.
|
|
4
9
|
const IDENTITY = new Matrix4();
|
|
5
|
-
/**
|
|
6
|
-
export function
|
|
10
|
+
/** `object`'s meshes and material groups, placed once in the instance's space, for level `level`. */
|
|
11
|
+
export function partsOf(object, level) {
|
|
12
|
+
rejectSkinned(object, "InstancedLod");
|
|
13
|
+
object.updateWorldMatrix(true, true);
|
|
14
|
+
const outside = object.parent ? object.parent.matrixWorld.clone().invert() : new Matrix4();
|
|
15
|
+
const found = [];
|
|
16
|
+
object.traverse((node) => {
|
|
17
|
+
if (isLOD(node))
|
|
18
|
+
throw new Error("InstancedLod: levels cannot contain a Lod or InstancedLod; nest them with Lod");
|
|
19
|
+
if (isInstancedMesh(node) && !isImpostorMesh(node))
|
|
20
|
+
throw new Error(`InstancedLod: levels cannot contain an InstancedMesh ("${node.name}")`);
|
|
21
|
+
if (!isMesh(node))
|
|
22
|
+
return;
|
|
23
|
+
const placement = outside.clone().multiply(node.matrixWorld);
|
|
24
|
+
ranges(node).forEach((range, group) => found.push({ template: node, placement, group, draw: { level, ...range } }));
|
|
25
|
+
});
|
|
26
|
+
return found;
|
|
27
|
+
}
|
|
28
|
+
/** The index (or vertex) ranges `mesh` draws, clipped to its draw range, in group order, empty draws included. */
|
|
29
|
+
function ranges(mesh) {
|
|
7
30
|
const { geometry } = mesh;
|
|
8
31
|
const indexed = geometry.index !== null;
|
|
9
32
|
const total = geometry.index?.count ?? geometry.getAttribute("position").count;
|
|
@@ -14,8 +37,91 @@ export function ranges(mesh) {
|
|
|
14
37
|
return { count: Math.max(0, end - first), start: first, indexed };
|
|
15
38
|
});
|
|
16
39
|
}
|
|
17
|
-
/** The
|
|
18
|
-
export function
|
|
40
|
+
/** The meshes drawing `parts`, tinted by `tint`. */
|
|
41
|
+
export function levelMeshes(parts, tint, inputs) {
|
|
42
|
+
let first = null;
|
|
43
|
+
const offset = (i) => (first === null ? null : (first + i) * DRAW_BYTES);
|
|
44
|
+
return {
|
|
45
|
+
meshes: parts.map((part, i) => levelMesh(part, () => offset(i), tint, inputs)),
|
|
46
|
+
draws: parts.map((part) => part.draw),
|
|
47
|
+
drawFrom: (start) => void (first = start),
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
/** Release `mesh`, which may never have been added. */
|
|
51
|
+
export function freeMesh(mesh) {
|
|
52
|
+
// ImpostorMesh.dispose also destroys its instance buffers, which are the InstancedLod's.
|
|
53
|
+
if (isImpostorMesh(mesh))
|
|
54
|
+
mesh.material.release();
|
|
55
|
+
mesh.geometry.dispose();
|
|
56
|
+
}
|
|
57
|
+
/** Point every mesh of `meshes` at `instances.matrices`, which changed: survivors scale, or no longer do. */
|
|
58
|
+
export function drawMatrices(meshes, instances) {
|
|
59
|
+
for (const mesh of meshes)
|
|
60
|
+
if (isImpostorMesh(mesh))
|
|
61
|
+
mesh.instanceMatrix = instances.matrices;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Material group `group` of `template` drawn for every instance in level `level`'s list, from byte `offset()` of a
|
|
65
|
+
* camera's draws, once there is one.
|
|
66
|
+
*/
|
|
67
|
+
function levelMesh({ template, placement, group }, offset, tint, inputs) {
|
|
68
|
+
const { instances, bounds, box, slots, radius, drawFor } = inputs;
|
|
69
|
+
// An impostor card is placed in the shader; any other mesh draws its geometry moved into the instance's space, so
|
|
70
|
+
// the instance matrix is all it needs.
|
|
71
|
+
const mesh = isImpostorMesh(template) ? card(template, placement, inputs) : plain(template, placement, group, instances);
|
|
72
|
+
setFadeSource(mesh, {
|
|
73
|
+
kind: "instances",
|
|
74
|
+
slots,
|
|
75
|
+
radius,
|
|
76
|
+
tint,
|
|
77
|
+
level: isImpostorMesh(template) ? undefined : { instances, space: placement.clone().invert() },
|
|
78
|
+
});
|
|
79
|
+
mesh.name = template.name;
|
|
80
|
+
mesh.castShadow = template.castShadow;
|
|
81
|
+
mesh.receiveShadow = template.receiveShadow;
|
|
82
|
+
if (!isImpostorMesh(mesh))
|
|
83
|
+
mesh.geometry.boundingSphere = bounds;
|
|
84
|
+
mesh.geometry.boundingBox = box;
|
|
85
|
+
const previous = mesh.onBeforeRender;
|
|
86
|
+
// Each camera draws the instances in its own lists. A level compiling to join draws nothing yet: its pipelines do not
|
|
87
|
+
// depend on the indirect draw.
|
|
88
|
+
mesh.onBeforeRender = (renderer, scene, camera, geometry, material, drawn) => {
|
|
89
|
+
previous.call(mesh, renderer, scene, camera, geometry, material, drawn);
|
|
90
|
+
const start = offset();
|
|
91
|
+
if (start === null)
|
|
92
|
+
return;
|
|
93
|
+
const args = drawFor(renderer, camera);
|
|
94
|
+
mesh.geometry.setIndirect(args.attribute, args.offset + start);
|
|
95
|
+
};
|
|
96
|
+
return mesh;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* A plain mesh drawing `template`'s geometry moved by `placement`, with a geometry of its own, which its draws point
|
|
100
|
+
* at their camera's indirect draws, over the moved one's buffers.
|
|
101
|
+
*/
|
|
102
|
+
function plain(template, placement, group, instances) {
|
|
103
|
+
const moved = placed(template.geometry, placement);
|
|
104
|
+
const geometry = new BufferGeometry();
|
|
105
|
+
geometry.index = moved.index;
|
|
106
|
+
for (const [name, attribute] of Object.entries(moved.attributes))
|
|
107
|
+
geometry.setAttribute(name, attribute);
|
|
108
|
+
geometry.morphAttributes = moved.morphAttributes;
|
|
109
|
+
// three's NodeMaterial multiplies a draw's colour by the varying vInstanceColor wherever its object has an
|
|
110
|
+
// instanceColor; placeInstances (see fade.ts) writes it.
|
|
111
|
+
return Object.assign(new Mesh(geometry, groupMaterial(template, group)), { instanceColor: instances.colors });
|
|
112
|
+
}
|
|
113
|
+
/** An impostor's cards for the instances in a level's list. */
|
|
114
|
+
function card(template, placement, { instances, bounds }) {
|
|
115
|
+
const mesh = impostorInstances(template, 0, placement);
|
|
116
|
+
// Indirect draws give the count. Three otherwise keys a card's shader by its count, one per object.
|
|
117
|
+
mesh.count = 1;
|
|
118
|
+
mesh.instanceMatrix = instances.matrices;
|
|
119
|
+
mesh.instanceColor = instances.colors;
|
|
120
|
+
mesh.boundingSphere = bounds;
|
|
121
|
+
return mesh;
|
|
122
|
+
}
|
|
123
|
+
/** The level material of `mesh`'s material group `group`. */
|
|
124
|
+
function groupMaterial(mesh, group) {
|
|
19
125
|
if (!Array.isArray(mesh.material))
|
|
20
126
|
return levelMaterial(mesh.material);
|
|
21
127
|
const index = mesh.geometry.groups[group]?.materialIndex ?? 0;
|
|
@@ -24,22 +130,13 @@ export function groupMaterial(mesh, group) {
|
|
|
24
130
|
throw new Error(`InstancedLod: "${mesh.name}" has no material ${index}`);
|
|
25
131
|
return levelMaterial(material);
|
|
26
132
|
}
|
|
27
|
-
/**
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
for (const [name, attribute] of Object.entries(geometry.attributes))
|
|
32
|
-
view.setAttribute(name, attribute);
|
|
33
|
-
view.morphAttributes = geometry.morphAttributes;
|
|
34
|
-
view.boundingBox = geometry.boundingBox;
|
|
35
|
-
view.boundingSphere = geometry.boundingSphere;
|
|
36
|
-
view.setIndirect(selection.args, selection.argsOffset + offset);
|
|
37
|
-
return view;
|
|
38
|
-
}
|
|
39
|
-
/** Placed copies of geometries, shared by every InstancedLod drawing the same mesh the same way. */
|
|
133
|
+
/**
|
|
134
|
+
* Placed copies of geometries, shared by every InstancedLod drawing the same mesh the same way: a side table, as three's
|
|
135
|
+
* BufferGeometry has no room for a package's state.
|
|
136
|
+
*/
|
|
40
137
|
const copies = new WeakMap();
|
|
41
138
|
/** `geometry` moved by `placement`: itself for the identity, else a copy made once. */
|
|
42
|
-
|
|
139
|
+
function placed(geometry, placement) {
|
|
43
140
|
if (placement.equals(IDENTITY))
|
|
44
141
|
return geometry;
|
|
45
142
|
const known = copies.get(geometry) ?? [];
|
|
@@ -47,7 +144,25 @@ export function placed(geometry, placement) {
|
|
|
47
144
|
const hit = known.find((entry) => entry.placement.equals(placement));
|
|
48
145
|
if (hit)
|
|
49
146
|
return hit.geometry;
|
|
50
|
-
const copy = geometry.clone()
|
|
147
|
+
const copy = geometry.clone();
|
|
148
|
+
const box = copy.boundingBox;
|
|
149
|
+
const sphere = copy.boundingSphere;
|
|
150
|
+
// applyMatrix4 otherwise recomputes both bounds by walking the transformed vertices.
|
|
151
|
+
copy.boundingBox = null;
|
|
152
|
+
copy.boundingSphere = null;
|
|
153
|
+
// Translations leave normals and tangents unchanged; scanning them stalls large source arrivals.
|
|
154
|
+
if (placement.clone().setPosition(0, 0, 0).equals(IDENTITY)) {
|
|
155
|
+
const position = copy.getAttribute("position");
|
|
156
|
+
if (position) {
|
|
157
|
+
position.applyMatrix4(placement);
|
|
158
|
+
position.needsUpdate = true;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
else
|
|
162
|
+
copy.applyMatrix4(placement);
|
|
163
|
+
copy.boundingBox = box?.applyMatrix4(placement) ?? null;
|
|
164
|
+
copy.boundingSphere = sphere?.applyMatrix4(placement) ?? null;
|
|
165
|
+
geometry.addEventListener("dispose", () => copy.dispose());
|
|
51
166
|
known.push({ placement: placement.clone(), geometry: copy });
|
|
52
167
|
return copy;
|
|
53
168
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"meshes.js","sourceRoot":"","sources":["../../src/instanced/meshes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,OAAO,
|
|
1
|
+
{"version":3,"file":"meshes.js","sourceRoot":"","sources":["../../src/instanced/meshes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { StorageBufferAttribute, type InstancedBufferAttribute } from "three/webgpu";
|
|
2
|
+
/**
|
|
3
|
+
* A storage attribute over a CPU chunk attribute's array, which the page pool reads it through, uploading what the app
|
|
4
|
+
* marks changed in it: binding the app's own attribute through storage() would flag it as a storage attribute, which
|
|
5
|
+
* three then pads (an RGB colour to four floats) and treats as one wherever else the app draws it.
|
|
6
|
+
*/
|
|
7
|
+
export declare class Mirror {
|
|
8
|
+
readonly source: InstancedBufferAttribute;
|
|
9
|
+
/** A matrix per item, or floats one by one, which three never pads. */
|
|
10
|
+
readonly attribute: StorageBufferAttribute;
|
|
11
|
+
/** The source's version it last took in. */
|
|
12
|
+
private version;
|
|
13
|
+
constructor(source: InstancedBufferAttribute);
|
|
14
|
+
/**
|
|
15
|
+
* Take in the source's edits, whose array it shares: upload the ranges the app marked changed (all of it without any),
|
|
16
|
+
* which three would upload and clear were it drawing the source itself. Whether the source changed.
|
|
17
|
+
*/
|
|
18
|
+
refresh(): boolean;
|
|
19
|
+
dispose(): void;
|
|
20
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { StorageBufferAttribute } from "three/webgpu";
|
|
2
|
+
/**
|
|
3
|
+
* A storage attribute over a CPU chunk attribute's array, which the page pool reads it through, uploading what the app
|
|
4
|
+
* marks changed in it: binding the app's own attribute through storage() would flag it as a storage attribute, which
|
|
5
|
+
* three then pads (an RGB colour to four floats) and treats as one wherever else the app draws it.
|
|
6
|
+
*/
|
|
7
|
+
export class Mirror {
|
|
8
|
+
source;
|
|
9
|
+
/** A matrix per item, or floats one by one, which three never pads. */
|
|
10
|
+
attribute;
|
|
11
|
+
/** The source's version it last took in. */
|
|
12
|
+
version;
|
|
13
|
+
constructor(source) {
|
|
14
|
+
this.source = source;
|
|
15
|
+
this.attribute = new StorageBufferAttribute(source.array, source.itemSize === 16 ? 16 : 1);
|
|
16
|
+
this.version = source.version;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Take in the source's edits, whose array it shares: upload the ranges the app marked changed (all of it without any),
|
|
20
|
+
* which three would upload and clear were it drawing the source itself. Whether the source changed.
|
|
21
|
+
*/
|
|
22
|
+
refresh() {
|
|
23
|
+
const { source, attribute } = this;
|
|
24
|
+
if (source.version === this.version)
|
|
25
|
+
return false;
|
|
26
|
+
this.version = source.version;
|
|
27
|
+
for (const { start, count } of source.updateRanges)
|
|
28
|
+
attribute.addUpdateRange(start, count);
|
|
29
|
+
source.clearUpdateRanges();
|
|
30
|
+
attribute.needsUpdate = true;
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
dispose() {
|
|
34
|
+
this.attribute.dispose();
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=mirror.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mirror.js","sourceRoot":"","sources":["../../src/instanced/mirror.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAiC,MAAM,cAAc,CAAC;AAErF;;;;GAIG;AACH,MAAM,OAAO,MAAM;IAMI;IALrB,uEAAuE;IAC9D,SAAS,CAAyB;IAC3C,4CAA4C;IACpC,OAAO,CAAS;IAExB,YAAqB,MAAgC;QAAhC,WAAM,GAAN,MAAM,CAA0B;QACnD,IAAI,CAAC,SAAS,GAAG,IAAI,sBAAsB,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,QAAQ,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3F,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;IAChC,CAAC;IAED;;;OAGG;IACH,OAAO;QACL,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC;QACnC,IAAI,MAAM,CAAC,OAAO,KAAK,IAAI,CAAC,OAAO;YAAE,OAAO,KAAK,CAAC;QAClD,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAC9B,KAAK,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,MAAM,CAAC,YAAY;YAAE,SAAS,CAAC,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC3F,MAAM,CAAC,iBAAiB,EAAE,CAAC;QAC3B,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO;QACL,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;CACF"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { StorageBufferAttribute, StorageInstancedBufferAttribute } from "three/webgpu";
|
|
2
|
+
/** Bits of an occupied page's entry that hold its page; those above hold its InstancedLod's row. */
|
|
3
|
+
export declare const PAGE_BITS = 16;
|
|
4
|
+
/** A page pool's sizes and buffers, which its passes read. */
|
|
5
|
+
export interface PoolBuffers {
|
|
6
|
+
readonly pages: number;
|
|
7
|
+
readonly slots: number;
|
|
8
|
+
/** The free page count, then the free page ids. */
|
|
9
|
+
readonly stack: StorageBufferAttribute;
|
|
10
|
+
/** Per window of a chunk's range, from its slot's first window (see `sources`): the page it holds. */
|
|
11
|
+
readonly table: StorageBufferAttribute;
|
|
12
|
+
/** Per window of a chunk's range: the window's instances, then where they start among the chunk's. */
|
|
13
|
+
readonly windows: StorageBufferAttribute;
|
|
14
|
+
/**
|
|
15
|
+
* Per slot, written by the CPU: its chunk's first window, its windows, its generation, and its InstancedLod's row
|
|
16
|
+
* plus one (0 while it holds no chunk).
|
|
17
|
+
*/
|
|
18
|
+
readonly sources: StorageBufferAttribute;
|
|
19
|
+
/**
|
|
20
|
+
* Per slot, written by the GPU, two vec4s: the generation it got to, its pages, its instances and the pages it needs;
|
|
21
|
+
* then the first window its pages are listed from.
|
|
22
|
+
*/
|
|
23
|
+
readonly states: StorageBufferAttribute;
|
|
24
|
+
/** How many pages chunks hold, then per page held its id and its InstancedLod's row (see `PAGE_BITS`). */
|
|
25
|
+
readonly occupied: StorageBufferAttribute;
|
|
26
|
+
/** Every pool index's instance matrix and colour (RGB and a pad), as the level meshes draw them. */
|
|
27
|
+
readonly matrices: StorageInstancedBufferAttribute;
|
|
28
|
+
readonly colors: StorageInstancedBufferAttribute;
|
|
29
|
+
}
|
|
30
|
+
/** `pool`'s buffers as one pass uses them: a node each, since a pass may not bind a buffer it writes twice. */
|
|
31
|
+
export declare function nodes(pool: PoolBuffers): {
|
|
32
|
+
stack: import("three/webgpu").StorageBufferNode<"uint">;
|
|
33
|
+
table: import("three/webgpu").StorageBufferNode<"uint">;
|
|
34
|
+
windows: import("three/webgpu").StorageBufferNode<"uint">;
|
|
35
|
+
sources: import("three/webgpu").StorageBufferNode<"uvec4">;
|
|
36
|
+
states: import("three/webgpu").StorageBufferNode<"uvec4">;
|
|
37
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { storage } from "three/tsl";
|
|
2
|
+
// The buffers of a page pool, which its passes read and write (see passes.ts).
|
|
3
|
+
/** Bits of an occupied page's entry that hold its page; those above hold its InstancedLod's row. */
|
|
4
|
+
export const PAGE_BITS = 16;
|
|
5
|
+
/** `pool`'s buffers as one pass uses them: a node each, since a pass may not bind a buffer it writes twice. */
|
|
6
|
+
export function nodes(pool) {
|
|
7
|
+
return {
|
|
8
|
+
stack: storage(pool.stack, "uint", 0).toAtomic(),
|
|
9
|
+
table: storage(pool.table, "uint", 0),
|
|
10
|
+
windows: storage(pool.windows, "uint", 0),
|
|
11
|
+
sources: storage(pool.sources, "uvec4", 0).toReadOnly(),
|
|
12
|
+
states: storage(pool.states, "uvec4", 0),
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=buffers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buffers.js","sourceRoot":"","sources":["../../../src/instanced/pages/buffers.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,+EAA+E;AAE/E,oGAAoG;AACpG,MAAM,CAAC,MAAM,SAAS,GAAG,EAAE,CAAC;AA6B5B,+GAA+G;AAC/G,MAAM,UAAU,KAAK,CAAC,IAAiB;IACrC,OAAO;QACL,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE;QAChD,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QACrC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QACzC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,UAAU,EAAE;QACvD,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;KACzC,CAAC;AACJ,CAAC"}
|