@drawcall/lod 0.3.0 → 0.5.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.
Files changed (204) hide show
  1. package/README.md +5 -8
  2. package/dist/bake.d.ts +16 -2
  3. package/dist/bake.js +92 -4
  4. package/dist/bake.js.map +1 -1
  5. package/dist/baked/index.d.ts +2 -2
  6. package/dist/baked/index.js +2 -2
  7. package/dist/baked/interior/faces.js +4 -2
  8. package/dist/baked/interior/faces.js.map +1 -1
  9. package/dist/baked/interior/material.js +1 -1
  10. package/dist/baked/interior/material.js.map +1 -1
  11. package/dist/baked/interior/rooms.d.ts +1 -1
  12. package/dist/baked/interior/rooms.js +1 -1
  13. package/dist/dispose.d.ts +3 -3
  14. package/dist/dispose.js +6 -6
  15. package/dist/dispose.js.map +1 -1
  16. package/dist/foliage.d.ts +32 -0
  17. package/dist/foliage.js +137 -0
  18. package/dist/foliage.js.map +1 -0
  19. package/dist/impostor/bake/index.d.ts +3 -3
  20. package/dist/impostor/bake/index.js +12 -3
  21. package/dist/impostor/bake/index.js.map +1 -1
  22. package/dist/impostor/bake/source.d.ts +2 -1
  23. package/dist/impostor/bake/source.js +2 -2
  24. package/dist/impostor/bake/source.js.map +1 -1
  25. package/dist/impostor/impostor.d.ts +1 -1
  26. package/dist/impostor/impostor.js +1 -1
  27. package/dist/impostor/ktx2/encode.js +5 -2
  28. package/dist/impostor/ktx2/encode.js.map +1 -1
  29. package/dist/impostor/ktx2/uastc.js +3 -2
  30. package/dist/impostor/ktx2/uastc.js.map +1 -1
  31. package/dist/impostor/ktx2/worker.js +0 -2
  32. package/dist/impostor/ktx2/worker.js.map +1 -1
  33. package/dist/impostor/mesh/card.d.ts +1 -1
  34. package/dist/impostor/mesh/index.d.ts +2 -2
  35. package/dist/impostor/mesh/index.js +3 -3
  36. package/dist/impostor/mesh/index.js.map +1 -1
  37. package/dist/index.d.ts +3 -6
  38. package/dist/index.js +3 -6
  39. package/dist/index.js.map +1 -1
  40. package/dist/instanced/camera.d.ts +13 -25
  41. package/dist/instanced/camera.js +17 -42
  42. package/dist/instanced/camera.js.map +1 -1
  43. package/dist/instanced/clusters.d.ts +68 -0
  44. package/dist/instanced/clusters.js +172 -0
  45. package/dist/instanced/clusters.js.map +1 -0
  46. package/dist/instanced/cull.d.ts +3 -3
  47. package/dist/instanced/cull.js +2 -2
  48. package/dist/instanced/cull.js.map +1 -1
  49. package/dist/instanced/instances.d.ts +39 -0
  50. package/dist/instanced/instances.js +104 -0
  51. package/dist/instanced/instances.js.map +1 -0
  52. package/dist/instanced/key.d.ts +1 -1
  53. package/dist/instanced/key.js +1 -1
  54. package/dist/instanced/key.js.map +1 -1
  55. package/dist/instanced/levels.d.ts +9 -9
  56. package/dist/instanced/levels.js +7 -6
  57. package/dist/instanced/levels.js.map +1 -1
  58. package/dist/instanced/lists.d.ts +29 -39
  59. package/dist/instanced/lists.js +45 -62
  60. package/dist/instanced/lists.js.map +1 -1
  61. package/dist/instanced/measure.d.ts +2 -2
  62. package/dist/instanced/measure.js +2 -2
  63. package/dist/instanced/meshes.d.ts +11 -9
  64. package/dist/instanced/meshes.js +26 -16
  65. package/dist/instanced/meshes.js.map +1 -1
  66. package/dist/instanced/mirror.d.ts +16 -12
  67. package/dist/instanced/mirror.js +51 -12
  68. package/dist/instanced/mirror.js.map +1 -1
  69. package/dist/instanced/raycast.d.ts +6 -9
  70. package/dist/instanced/raycast.js +15 -18
  71. package/dist/instanced/raycast.js.map +1 -1
  72. package/dist/instanced/rows.d.ts +22 -73
  73. package/dist/instanced/rows.js +24 -189
  74. package/dist/instanced/rows.js.map +1 -1
  75. package/dist/instanced/shape.d.ts +3 -1
  76. package/dist/instanced/shape.js +6 -3
  77. package/dist/instanced/shape.js.map +1 -1
  78. package/dist/instanced/sort.d.ts +36 -34
  79. package/dist/instanced/sort.js +168 -132
  80. package/dist/instanced/sort.js.map +1 -1
  81. package/dist/instanced/update.d.ts +17 -12
  82. package/dist/instanced/update.js +64 -85
  83. package/dist/instanced/update.js.map +1 -1
  84. package/dist/levels/compile/index.d.ts +4 -2
  85. package/dist/levels/compile/index.js +10 -2
  86. package/dist/levels/compile/index.js.map +1 -1
  87. package/dist/levels/compile/pipelines.d.ts +1 -1
  88. package/dist/levels/compile/pipelines.js +1 -6
  89. package/dist/levels/compile/pipelines.js.map +1 -1
  90. package/dist/levels/draw.d.ts +1 -1
  91. package/dist/levels/draw.js +3 -3
  92. package/dist/levels/fade.d.ts +13 -22
  93. package/dist/levels/fade.js +17 -38
  94. package/dist/levels/fade.js.map +1 -1
  95. package/dist/levels/index.d.ts +7 -7
  96. package/dist/levels/index.js +1 -1
  97. package/dist/levels/item.d.ts +10 -10
  98. package/dist/levels/item.js +15 -23
  99. package/dist/levels/item.js.map +1 -1
  100. package/dist/levels/load.d.ts +1 -1
  101. package/dist/levels/load.js +5 -3
  102. package/dist/levels/load.js.map +1 -1
  103. package/dist/levels/manager.d.ts +30 -31
  104. package/dist/levels/manager.js +75 -62
  105. package/dist/levels/manager.js.map +1 -1
  106. package/dist/levels/material.d.ts +2 -2
  107. package/dist/levels/material.js +2 -2
  108. package/dist/levels/renderer.d.ts +8 -5
  109. package/dist/levels/renderer.js +20 -4
  110. package/dist/levels/renderer.js.map +1 -1
  111. package/dist/levels/requests.d.ts +4 -1
  112. package/dist/levels/requests.js +3 -1
  113. package/dist/levels/requests.js.map +1 -1
  114. package/dist/loader/context.d.ts +9 -11
  115. package/dist/loader/context.js +12 -7
  116. package/dist/loader/context.js.map +1 -1
  117. package/dist/loader/entry.d.ts +4 -0
  118. package/dist/loader/entry.js +43 -0
  119. package/dist/loader/entry.js.map +1 -0
  120. package/dist/loader/index.d.ts +49 -35
  121. package/dist/loader/index.js +123 -135
  122. package/dist/loader/index.js.map +1 -1
  123. package/dist/loader/level.js +5 -5
  124. package/dist/loader/level.js.map +1 -1
  125. package/dist/loader/node.d.ts +26 -0
  126. package/dist/loader/node.js +199 -0
  127. package/dist/loader/node.js.map +1 -0
  128. package/dist/loader/request.d.ts +11 -44
  129. package/dist/loader/request.js +7 -47
  130. package/dist/loader/request.js.map +1 -1
  131. package/dist/loader/url.d.ts +10 -9
  132. package/dist/loader/url.js +21 -17
  133. package/dist/loader/url.js.map +1 -1
  134. package/dist/lod.d.ts +122 -62
  135. package/dist/lod.js +332 -187
  136. package/dist/lod.js.map +1 -1
  137. package/dist/meshopt.d.ts +1 -1
  138. package/dist/meshopt.js +3 -2
  139. package/dist/meshopt.js.map +1 -1
  140. package/dist/node-process.d.ts +5 -0
  141. package/dist/node-process.js +6 -0
  142. package/dist/node-process.js.map +1 -0
  143. package/dist/node.d.ts +2 -0
  144. package/dist/node.js +5 -0
  145. package/dist/node.js.map +1 -0
  146. package/dist/simplify/index.d.ts +2 -2
  147. package/dist/simplify/index.js +7 -7
  148. package/dist/simplify/index.js.map +1 -1
  149. package/dist/source/detail.d.ts +7 -2
  150. package/dist/source/detail.js +26 -22
  151. package/dist/source/detail.js.map +1 -1
  152. package/dist/source/sampler.js +5 -2
  153. package/dist/source/sampler.js.map +1 -1
  154. package/dist/three.d.ts +8 -7
  155. package/dist/three.js +5 -4
  156. package/dist/three.js.map +1 -1
  157. package/dist/wind/bounds.js +1 -1
  158. package/dist/wind/bounds.js.map +1 -1
  159. package/dist/wind/hooks.d.ts +1 -1
  160. package/dist/wind/hooks.js +1 -1
  161. package/dist/wind/index.d.ts +3 -3
  162. package/dist/wind/index.js +11 -9
  163. package/dist/wind/index.js.map +1 -1
  164. package/package.json +10 -6
  165. package/skills/lod/SKILL.md +65 -54
  166. package/dist/gpu.d.ts +0 -39
  167. package/dist/gpu.js +0 -41
  168. package/dist/gpu.js.map +0 -1
  169. package/dist/instanced/chunk.d.ts +0 -97
  170. package/dist/instanced/chunk.js +0 -156
  171. package/dist/instanced/chunk.js.map +0 -1
  172. package/dist/instanced/chunks.d.ts +0 -60
  173. package/dist/instanced/chunks.js +0 -208
  174. package/dist/instanced/chunks.js.map +0 -1
  175. package/dist/instanced/index.d.ts +0 -120
  176. package/dist/instanced/index.js +0 -290
  177. package/dist/instanced/index.js.map +0 -1
  178. package/dist/instanced/pages/buffers.d.ts +0 -37
  179. package/dist/instanced/pages/buffers.js +0 -15
  180. package/dist/instanced/pages/buffers.js.map +0 -1
  181. package/dist/instanced/pages/chunk.d.ts +0 -51
  182. package/dist/instanced/pages/chunk.js +0 -81
  183. package/dist/instanced/pages/chunk.js.map +0 -1
  184. package/dist/instanced/pages/index.d.ts +0 -74
  185. package/dist/instanced/pages/index.js +0 -269
  186. package/dist/instanced/pages/index.js.map +0 -1
  187. package/dist/instanced/pages/passes.d.ts +0 -21
  188. package/dist/instanced/pages/passes.js +0 -52
  189. package/dist/instanced/pages/passes.js.map +0 -1
  190. package/dist/instanced/pages/slots.d.ts +0 -11
  191. package/dist/instanced/pages/slots.js +0 -90
  192. package/dist/instanced/pages/slots.js.map +0 -1
  193. package/dist/instanced/pages/workgroup.d.ts +0 -14
  194. package/dist/instanced/pages/workgroup.js +0 -38
  195. package/dist/instanced/pages/workgroup.js.map +0 -1
  196. package/dist/levels/wait.d.ts +0 -27
  197. package/dist/levels/wait.js +0 -61
  198. package/dist/levels/wait.js.map +0 -1
  199. package/dist/loader/cache.d.ts +0 -12
  200. package/dist/loader/cache.js +0 -68
  201. package/dist/loader/cache.js.map +0 -1
  202. package/dist/loader/dependencies.d.ts +0 -32
  203. package/dist/loader/dependencies.js +0 -113
  204. package/dist/loader/dependencies.js.map +0 -1
@@ -0,0 +1,172 @@
1
+ import { Box3, Sphere, Vector3 } from "three/webgpu";
2
+ import { at } from "../at.js";
3
+ import { isBox3, isStorageBuffer, isStorageInstanced } from "../three.js";
4
+ import { MAX_SURVIVOR_SCALE } from "./measure.js";
5
+ import { NO_LIVE_COUNT } from "./rows.js";
6
+ const area = { start: 0, size: 0, box: null, low: 0, high: 0, liveCount: undefined };
7
+ const grownBox = new Box3();
8
+ const measuredScratch = new Box3();
9
+ const size3 = new Vector3();
10
+ /**
11
+ * Call `visit` with each cluster of `lod` that holds instances, in one reused Area: its box grown by how far survivors
12
+ * of a cullDistance grow past it, by up to `grow`, about their origins.
13
+ */
14
+ function forEachArea(lod, measured, shape, grow, visit) {
15
+ const { clusters, count } = lod;
16
+ const fallback = lod.boundingBox ?? (measured && measuredBox(measured, shape, measuredScratch));
17
+ const clusterOf = (start, size, box, minScale, maxScale, liveCount) => {
18
+ if (size <= 0 || box?.isEmpty())
19
+ return;
20
+ area.start = start;
21
+ area.size = size;
22
+ area.liveCount = liveCount;
23
+ area.low = minScale ?? measured?.minScale ?? 0;
24
+ area.high = maxScale ?? measured?.maxScale ?? (box && shape.extent > 0 ? box.getSize(size3).length() / shape.extent : Infinity);
25
+ area.box = box && grownBox.copy(box).expandByScalar(shape.originReach * area.high * (grow - 1));
26
+ visit(area);
27
+ };
28
+ if (!clusters)
29
+ return clusterOf(0, count, fallback);
30
+ for (const { start, count: size, boundingBox, minScale, maxScale, liveCount } of clusters)
31
+ clusterOf(start, Math.min(size, count - start), boundingBox, minScale, maxScale, liveCount);
32
+ }
33
+ /**
34
+ * Bound every cluster of `lod` into `bounds`, its survivors grown by up to `grow`: what the level meshes are culled and
35
+ * boxed by, which three's Box3.setFromObject reads. Unbounded instances give an infinite sphere and an empty box.
36
+ */
37
+ export function boundClusters(lod, measured, shape, grow, bounds) {
38
+ let unbounded = false;
39
+ bounds.box.makeEmpty();
40
+ forEachArea(lod, measured, shape, grow, ({ box }) => {
41
+ if (box)
42
+ bounds.box.union(box);
43
+ else
44
+ unbounded = true;
45
+ });
46
+ if (unbounded)
47
+ bounds.sphere.set(bounds.sphere.center.set(0, 0, 0), Infinity);
48
+ else if (bounds.box.isEmpty())
49
+ bounds.sphere.makeEmpty();
50
+ else
51
+ bounds.box.getBoundingSphere(bounds.sphere);
52
+ }
53
+ /** What a camera sees of a Lod's instances (see `ClusterView.see`). */
54
+ export class ClusterView {
55
+ /** The ranges the camera sees, start, count and item of `liveCounts` (NO_LIVE_COUNT for none), flat, clipped to `count`. */
56
+ ranges = [];
57
+ /** The live counts of the ranges seen; null while none has one. */
58
+ liveCounts = null;
59
+ /** How many instances the ranges hold. */
60
+ instances = 0;
61
+ /** Whether every range seen lies wholly inside the camera's frustum. */
62
+ inside = true;
63
+ /** The heights the instances of every cluster within cullDistance can have, shortest and tallest: what loads. */
64
+ heights = [];
65
+ /** The same, of the clusters seen: what draws. */
66
+ seen = [];
67
+ /** Whether nothing bounds the instances: a storage instanceMatrix with neither clusters nor a boundingBox. */
68
+ unbounded = false;
69
+ /** See the instances of `lod` from `camera` through `frustum`, both in the Lod's space, thinned out by `cull`. */
70
+ see(lod, measured, shape, frustum, camera, cull) {
71
+ this.ranges.length = this.heights.length = this.seen.length = 0;
72
+ this.instances = 0;
73
+ this.liveCounts = null;
74
+ this.inside = true;
75
+ this.unbounded = false;
76
+ const grow = cull?.survivors ? MAX_SURVIVOR_SCALE : 1;
77
+ forEachArea(lod, measured, shape, grow, ({ start, size, box, low, high, liveCount }) => {
78
+ if (!box)
79
+ this.unbounded = true;
80
+ if (cull && box && box.distanceToPoint(cull.eye) >= cull.far)
81
+ return;
82
+ const heights = heightsIn(box, low, high * grow, shape, camera);
83
+ this.heights.push(heights);
84
+ if (box && !frustum.intersectsBox(box))
85
+ return;
86
+ this.seen.push(heights);
87
+ this.ranges.push(start, size, liveCount?.index ?? NO_LIVE_COUNT);
88
+ if (liveCount)
89
+ this.liveCounts = liveCount.attribute;
90
+ this.instances += size;
91
+ this.inside &&= box !== null && inside(frustum, box);
92
+ });
93
+ }
94
+ }
95
+ /** The box around `measured`'s instances at every level and its sway. */
96
+ export function measuredBox({ originBox, maxScale }, shape, into = new Box3()) {
97
+ if (originBox.isEmpty())
98
+ return into.makeEmpty();
99
+ return into.copy(originBox).expandByScalar(shape.originReach * maxScale);
100
+ }
101
+ /**
102
+ * The heights on `camera`'s screen that instances inside `box` (anywhere for none) scaled from `low` to `high` can have:
103
+ * the shortest at its farthest, the tallest at its nearest.
104
+ */
105
+ function heightsIn(box, low, high, { source }, { eye, scale, ortho }) {
106
+ const diameter = 2 * source.radius * scale;
107
+ if (ortho)
108
+ return [diameter * low, diameter * high];
109
+ if (!box)
110
+ return [0, Infinity];
111
+ const near = Math.max(box.distanceToPoint(eye), 1e-6);
112
+ return [(diameter * low) / farthest(box, eye), (diameter * high) / near];
113
+ }
114
+ /** The distance from `point` to the farthest point of `box`. */
115
+ function farthest(box, point) {
116
+ const { min, max } = box;
117
+ return Math.hypot(Math.max(Math.abs(point.x - min.x), Math.abs(point.x - max.x)), Math.max(Math.abs(point.y - min.y), Math.abs(point.y - max.y)), Math.max(Math.abs(point.z - min.z), Math.abs(point.z - max.z)));
118
+ }
119
+ /** Whether `box` lies wholly inside `frustum`: its corner nearest each plane's outside lies inside. */
120
+ function inside(frustum, box) {
121
+ return frustum.planes.every(({ normal, constant }) => {
122
+ const x = normal.x > 0 ? box.min.x : box.max.x;
123
+ const y = normal.y > 0 ? box.min.y : box.max.y;
124
+ const z = normal.z > 0 ? box.min.z : box.max.z;
125
+ return normal.x * x + normal.y * y + normal.z * z + constant > 0;
126
+ });
127
+ }
128
+ /**
129
+ * Throws unless `clusters` are ranges of a Lod's `capacity` instances, disjoint, each with a box, its scales and its
130
+ * liveCount as `LodCluster` says. Disjointness is checked again only once a range changed: `last` holds the ranges last
131
+ * checked.
132
+ */
133
+ export function checkClusters(clusters, capacity, last) {
134
+ let changed = last.length !== clusters.length * 2;
135
+ let shared = null;
136
+ clusters.forEach(({ start, count, boundingBox, minScale, maxScale, liveCount }, i) => {
137
+ if (!Number.isInteger(start) || !Number.isInteger(count) || start < 0 || count < 0 || start + count > capacity)
138
+ throw new RangeError(`Lod: cluster ${i}, ${count} instances from ${start}, passes the ${capacity} of its instanceMatrix`);
139
+ if (!isBox3(boundingBox))
140
+ throw new TypeError(`Lod: cluster ${i} has no boundingBox`);
141
+ if (minScale !== undefined && !(minScale >= 0 && Number.isFinite(minScale)))
142
+ throw new RangeError(`Lod: cluster ${i}'s minScale must be finite and >= 0, not ${minScale}`);
143
+ if (maxScale !== undefined && !(maxScale >= (minScale ?? 0) && Number.isFinite(maxScale)))
144
+ throw new RangeError(`Lod: cluster ${i}'s maxScale must be finite and >= its minScale, not ${maxScale}`);
145
+ if (liveCount)
146
+ shared = checkLiveCount(liveCount, i, shared);
147
+ if (last[2 * i] !== start || last[2 * i + 1] !== count)
148
+ changed = true;
149
+ });
150
+ if (!changed)
151
+ return;
152
+ last.length = 0;
153
+ for (const { start, count } of clusters)
154
+ last.push(start, count);
155
+ const sorted = [...clusters.keys()].filter((i) => at(clusters, i).count > 0).sort((a, b) => at(clusters, a).start - at(clusters, b).start);
156
+ for (let k = 1; k < sorted.length; k++) {
157
+ const [before, after] = [at(sorted, k - 1), at(sorted, k)];
158
+ if (at(clusters, before).start + at(clusters, before).count > at(clusters, after).start)
159
+ throw new RangeError(`Lod: clusters ${before} and ${after} overlap: clusters are disjoint`);
160
+ }
161
+ }
162
+ /** Throws unless `liveCount`, cluster `i`'s, is a u32 of a storage attribute, `shared` if another cluster's was; its attribute. */
163
+ function checkLiveCount({ attribute, index }, i, shared) {
164
+ if (!(isStorageBuffer(attribute) || isStorageInstanced(attribute)) || !(attribute.array instanceof Uint32Array) || attribute.itemSize !== 1)
165
+ throw new TypeError(`Lod: cluster ${i}'s liveCount.attribute must be a storage attribute of one u32 per item`);
166
+ if (!Number.isInteger(index) || index < 0 || index >= attribute.count)
167
+ throw new RangeError(`Lod: cluster ${i}'s liveCount.index, ${index}, is not one of its attribute's ${attribute.count} items`);
168
+ if (shared && shared !== attribute)
169
+ throw new TypeError(`Lod: cluster ${i}'s liveCount.attribute differs from another cluster's: a Lod's clusters share one`);
170
+ return attribute;
171
+ }
172
+ //# sourceMappingURL=clusters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clusters.js","sourceRoot":"","sources":["../../src/instanced/clusters.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAmF,MAAM,cAAc,CAAC;AACtI,OAAO,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AAC9B,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAI1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AA4C1C,MAAM,IAAI,GAAS,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;AAC3F,MAAM,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAC;AAC5B,MAAM,eAAe,GAAG,IAAI,IAAI,EAAE,CAAC;AACnC,MAAM,KAAK,GAAG,IAAI,OAAO,EAAE,CAAC;AAE5B;;;GAGG;AACH,SAAS,WAAW,CAAC,GAAkB,EAAE,QAAyB,EAAE,KAAoB,EAAE,IAAY,EAAE,KAA2B;IACjI,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC;IAChC,MAAM,QAAQ,GAAG,GAAG,CAAC,WAAW,IAAI,CAAC,QAAQ,IAAI,WAAW,CAAC,QAAQ,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC;IAChG,MAAM,SAAS,GAAG,CAAC,KAAa,EAAE,IAAY,EAAE,GAAgB,EAAE,QAAiB,EAAE,QAAiB,EAAE,SAAwB,EAAE,EAAE;QAClI,IAAI,IAAI,IAAI,CAAC,IAAI,GAAG,EAAE,OAAO,EAAE;YAAE,OAAO;QACxC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,GAAG,GAAG,QAAQ,IAAI,QAAQ,EAAE,QAAQ,IAAI,CAAC,CAAC;QAC/C,IAAI,CAAC,IAAI,GAAG,QAAQ,IAAI,QAAQ,EAAE,QAAQ,IAAI,CAAC,GAAG,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QAChI,IAAI,CAAC,GAAG,GAAG,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;QAChG,KAAK,CAAC,IAAI,CAAC,CAAC;IACd,CAAC,CAAC;IACF,IAAI,CAAC,QAAQ;QAAE,OAAO,SAAS,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;IACpD,KAAK,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,QAAQ;QACvF,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,GAAG,KAAK,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;AAChG,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,GAAkB,EAAE,QAAyB,EAAE,KAAoB,EAAE,IAAY,EAAE,MAAqC;IACpJ,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC;IACvB,WAAW,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE;QAClD,IAAI,GAAG;YAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;;YAC1B,SAAS,GAAG,IAAI,CAAC;IACxB,CAAC,CAAC,CAAC;IACH,IAAI,SAAS;QAAE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;SACzE,IAAI,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE;QAAE,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;;QACpD,MAAM,CAAC,GAAG,CAAC,iBAAiB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AACnD,CAAC;AAED,uEAAuE;AACvE,MAAM,OAAO,WAAW;IACtB,4HAA4H;IACnH,MAAM,GAAa,EAAE,CAAC;IAC/B,mEAAmE;IACnE,UAAU,GAAqC,IAAI,CAAC;IACpD,0CAA0C;IAC1C,SAAS,GAAG,CAAC,CAAC;IACd,wEAAwE;IACxE,MAAM,GAAG,IAAI,CAAC;IACd,iHAAiH;IACxG,OAAO,GAAuB,EAAE,CAAC;IAC1C,kDAAkD;IACzC,IAAI,GAAuB,EAAE,CAAC;IACvC,8GAA8G;IAC9G,SAAS,GAAG,KAAK,CAAC;IAElB,kHAAkH;IAClH,GAAG,CAAC,GAAkB,EAAE,QAAyB,EAAE,KAAoB,EAAE,OAAgB,EAAE,MAAmB,EAAE,IAAiB;QAC/H,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QAChE,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;QACnB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACvB,MAAM,IAAI,GAAG,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC;QACtD,WAAW,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE;YACrF,IAAI,CAAC,GAAG;gBAAE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YAChC,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG;gBAAE,OAAO;YACrE,MAAM,OAAO,GAAG,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,GAAG,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;YAChE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC3B,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC;gBAAE,OAAO;YAC/C,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACxB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,IAAI,aAAa,CAAC,CAAC;YACjE,IAAI,SAAS;gBAAE,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC,SAAS,CAAC;YACrD,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC;YACvB,IAAI,CAAC,MAAM,KAAK,GAAG,KAAK,IAAI,IAAI,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AASD,yEAAyE;AACzE,MAAM,UAAU,WAAW,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAY,EAAE,KAAoB,EAAE,IAAI,GAAG,IAAI,IAAI,EAAE;IACpG,IAAI,SAAS,CAAC,OAAO,EAAE;QAAE,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC;IACjD,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,WAAW,GAAG,QAAQ,CAAC,CAAC;AAC3E,CAAC;AAED;;;GAGG;AACH,SAAS,SAAS,CAAC,GAAgB,EAAE,GAAW,EAAE,IAAY,EAAE,EAAE,MAAM,EAAiB,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAe;IAC3H,MAAM,QAAQ,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC;IAC3C,IAAI,KAAK;QAAE,OAAO,CAAC,QAAQ,GAAG,GAAG,EAAE,QAAQ,GAAG,IAAI,CAAC,CAAC;IACpD,IAAI,CAAC,GAAG;QAAE,OAAO,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;IACtD,OAAO,CAAC,CAAC,QAAQ,GAAG,GAAG,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;AAC3E,CAAC;AAED,gEAAgE;AAChE,SAAS,QAAQ,CAAC,GAAS,EAAE,KAAc;IACzC,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC;IACzB,OAAO,IAAI,CAAC,KAAK,CACf,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,EAC9D,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,EAC9D,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAC/D,CAAC;AACJ,CAAC;AAED,uGAAuG;AACvG,SAAS,MAAM,CAAC,OAAgB,EAAE,GAAS;IACzC,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE;QACnD,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QAC/C,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QAC/C,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QAC/C,OAAO,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,QAAQ,GAAG,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,QAA+B,EAAE,QAAgB,EAAE,IAAc;IAC7F,IAAI,OAAO,GAAG,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;IAClD,IAAI,MAAM,GAAqC,IAAI,CAAC;IACpD,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,CAAC,EAAE,EAAE;QACnF,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,KAAK,GAAG,QAAQ;YAC5G,MAAM,IAAI,UAAU,CAAC,gBAAgB,CAAC,KAAK,KAAK,mBAAmB,KAAK,gBAAgB,QAAQ,wBAAwB,CAAC,CAAC;QAC5H,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;YAAE,MAAM,IAAI,SAAS,CAAC,gBAAgB,CAAC,qBAAqB,CAAC,CAAC;QACtF,IAAI,QAAQ,KAAK,SAAS,IAAI,CAAC,CAAC,QAAQ,IAAI,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAAE,MAAM,IAAI,UAAU,CAAC,gBAAgB,CAAC,4CAA4C,QAAQ,EAAE,CAAC,CAAC;QAC3K,IAAI,QAAQ,KAAK,SAAS,IAAI,CAAC,CAAC,QAAQ,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACvF,MAAM,IAAI,UAAU,CAAC,gBAAgB,CAAC,uDAAuD,QAAQ,EAAE,CAAC,CAAC;QAC3G,IAAI,SAAS;YAAE,MAAM,GAAG,cAAc,CAAC,SAAS,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;QAC7D,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK;YAAE,OAAO,GAAG,IAAI,CAAC;IACzE,CAAC,CAAC,CAAC;IACH,IAAI,CAAC,OAAO;QAAE,OAAO;IACrB,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IAChB,KAAK,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,QAAQ;QAAE,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACjE,MAAM,MAAM,GAAG,CAAC,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAC3I,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;QAC3D,IAAI,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,KAAK;YACrF,MAAM,IAAI,UAAU,CAAC,iBAAiB,MAAM,QAAQ,KAAK,iCAAiC,CAAC,CAAC;IAChG,CAAC;AACH,CAAC;AAED,mIAAmI;AACnI,SAAS,cAAc,CAAC,EAAE,SAAS,EAAE,KAAK,EAAgB,EAAE,CAAS,EAAE,MAAwC;IAC7G,IAAI,CAAC,CAAC,eAAe,CAAC,SAAS,CAAC,IAAI,kBAAkB,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,KAAK,YAAY,WAAW,CAAC,IAAI,SAAS,CAAC,QAAQ,KAAK,CAAC;QACzI,MAAM,IAAI,SAAS,CAAC,gBAAgB,CAAC,wEAAwE,CAAC,CAAC;IACjH,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,IAAI,SAAS,CAAC,KAAK;QACnE,MAAM,IAAI,UAAU,CAAC,gBAAgB,CAAC,uBAAuB,KAAK,mCAAmC,SAAS,CAAC,KAAK,QAAQ,CAAC,CAAC;IAChI,IAAI,MAAM,IAAI,MAAM,KAAK,SAAS;QAAE,MAAM,IAAI,SAAS,CAAC,gBAAgB,CAAC,mFAAmF,CAAC,CAAC;IAC9J,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import { Matrix4, Vector3, type Camera } from "three/webgpu";
2
2
  /**
3
- * How an InstancedLod thins its instances out with distance from `camera`, in every camera, as Fog does: every instance
3
+ * How a Lod thins its instances out with distance from `camera`, in every camera, as Fog does: every instance
4
4
  * draws up to `near` from it, none from `far` on, and in between a share falling linearly, chosen by a hash of each
5
5
  * instance's origin (its matrix's translation), the same on the CPU and the GPU. An instance whose translation changes
6
6
  * rolls a new value: it may appear or vanish as it moves. With `scaleSurvivors`, the instances drawn grow by 1/√share,
@@ -12,7 +12,7 @@ export interface CullDistance {
12
12
  far: number;
13
13
  scaleSurvivors?: boolean;
14
14
  }
15
- /** cullDistance in the InstancedLod's space. */
15
+ /** cullDistance in the Lod's space. */
16
16
  export interface Cull {
17
17
  eye: Vector3;
18
18
  near: number;
@@ -20,7 +20,7 @@ export interface Cull {
20
20
  survivors: boolean;
21
21
  }
22
22
  /**
23
- * `cullDistance`, checked, in the space of `space`, an InstancedLod's world matrix, written into `target`; null for
23
+ * `cullDistance`, checked, in the space of `space`, a Lod's world matrix, written into `target`; null for
24
24
  * none. Nothing holds on to what it answers past a sort: the sort and its keys copy its values.
25
25
  */
26
26
  export declare function cullIn(cullDistance: CullDistance | null, space: Matrix4, target: Cull): Cull | null;
@@ -1,7 +1,7 @@
1
1
  import { Matrix4, Vector3 } from "three/webgpu";
2
2
  const inverse = new Matrix4();
3
3
  /**
4
- * `cullDistance`, checked, in the space of `space`, an InstancedLod's world matrix, written into `target`; null for
4
+ * `cullDistance`, checked, in the space of `space`, a Lod's world matrix, written into `target`; null for
5
5
  * none. Nothing holds on to what it answers past a sort: the sort and its keys copy its values.
6
6
  */
7
7
  export function cullIn(cullDistance, space, target) {
@@ -9,7 +9,7 @@ export function cullIn(cullDistance, space, target) {
9
9
  return null;
10
10
  const { camera, near, far, scaleSurvivors = false } = cullDistance;
11
11
  if (!(Number.isFinite(near) && Number.isFinite(far) && near >= 0 && far > near))
12
- throw new RangeError(`InstancedLod: cullDistance needs 0 <= near < far, both finite, got ${near} and ${far}`);
12
+ throw new RangeError(`Lod: cullDistance needs 0 <= near < far, both finite, got ${near} and ${far}`);
13
13
  const scale = space.getMaxScaleOnAxis();
14
14
  target.eye.setFromMatrixPosition(camera.matrixWorld).applyMatrix4(inverse.copy(space).invert());
15
15
  target.near = near / scale;
@@ -1 +1 @@
1
- {"version":3,"file":"cull.js","sourceRoot":"","sources":["../../src/instanced/cull.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,OAAO,EAAe,MAAM,cAAc,CAAC;AAwB7D,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B;;;GAGG;AACH,MAAM,UAAU,MAAM,CAAC,YAAiC,EAAE,KAAc,EAAE,MAAY;IACpF,IAAI,CAAC,YAAY;QAAE,OAAO,IAAI,CAAC;IAC/B,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,cAAc,GAAG,KAAK,EAAE,GAAG,YAAY,CAAC;IACnE,IAAI,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,GAAG,GAAG,IAAI,CAAC;QAC7E,MAAM,IAAI,UAAU,CAAC,sEAAsE,IAAI,QAAQ,GAAG,EAAE,CAAC,CAAC;IAChH,MAAM,KAAK,GAAG,KAAK,CAAC,iBAAiB,EAAE,CAAC;IACxC,MAAM,CAAC,GAAG,CAAC,qBAAqB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;IAChG,MAAM,CAAC,IAAI,GAAG,IAAI,GAAG,KAAK,CAAC;IAC3B,MAAM,CAAC,GAAG,GAAG,GAAG,GAAG,KAAK,CAAC;IACzB,MAAM,CAAC,SAAS,GAAG,cAAc,CAAC;IAClC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,2CAA2C;AAC3C,MAAM,CAAC,MAAM,SAAS,GAAG,GAAS,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC"}
1
+ {"version":3,"file":"cull.js","sourceRoot":"","sources":["../../src/instanced/cull.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,OAAO,EAAe,MAAM,cAAc,CAAC;AAwB7D,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B;;;GAGG;AACH,MAAM,UAAU,MAAM,CAAC,YAAiC,EAAE,KAAc,EAAE,MAAY;IACpF,IAAI,CAAC,YAAY;QAAE,OAAO,IAAI,CAAC;IAC/B,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,cAAc,GAAG,KAAK,EAAE,GAAG,YAAY,CAAC;IACnE,IAAI,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,GAAG,GAAG,IAAI,CAAC;QAC7E,MAAM,IAAI,UAAU,CAAC,6DAA6D,IAAI,QAAQ,GAAG,EAAE,CAAC,CAAC;IACvG,MAAM,KAAK,GAAG,KAAK,CAAC,iBAAiB,EAAE,CAAC;IACxC,MAAM,CAAC,GAAG,CAAC,qBAAqB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;IAChG,MAAM,CAAC,IAAI,GAAG,IAAI,GAAG,KAAK,CAAC;IAC3B,MAAM,CAAC,GAAG,GAAG,GAAG,GAAG,KAAK,CAAC;IACzB,MAAM,CAAC,SAAS,GAAG,cAAc,CAAC;IAClC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,2CAA2C;AAC3C,MAAM,CAAC,MAAM,SAAS,GAAG,GAAS,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC"}
@@ -0,0 +1,39 @@
1
+ import { Box3, type InstancedBufferAttribute, type StorageInstancedBufferAttribute } from "three/webgpu";
2
+ /** A Lod's instancing data, as an InstancedMesh holds it. */
3
+ export interface InstanceAttributes {
4
+ readonly instanceMatrix: InstancedBufferAttribute;
5
+ readonly instanceColor: InstancedBufferAttribute | null;
6
+ readonly count: number;
7
+ }
8
+ /** Of a CPU instanceMatrix's first `count` instances at a scale above 0: their origins' box and scales. */
9
+ export interface Measured {
10
+ readonly originBox: Box3;
11
+ /** No matrix scales its longest axis less. */
12
+ minScale: number;
13
+ /** No matrix stretches any direction more. */
14
+ maxScale: number;
15
+ }
16
+ /** A Lod's instances as storage. */
17
+ export declare class Instances {
18
+ /** Bumped whenever what the storage holds, or how many instances there are, may have changed. */
19
+ version: number;
20
+ /** Measured from a CPU instanceMatrix as it changes; null for a storage one, which the CPU cannot read. */
21
+ measured: Measured | null;
22
+ private matrices;
23
+ private colors;
24
+ private count;
25
+ /** The matrices as the GPU reads them, once taken in. */
26
+ get matrixStorage(): StorageInstancedBufferAttribute;
27
+ /** The colours as the GPU reads them, RGB and a pad: white without. */
28
+ get colorStorage(): StorageInstancedBufferAttribute;
29
+ /**
30
+ * Take in `attributes` as they are: an attribute assigned anew, edits marked by `needsUpdate` (within their update
31
+ * ranges), a new count. A storage instanceMatrix, which the app's GPU passes may write any time, counts as changed
32
+ * at every update. Throws unless they can be drawn.
33
+ */
34
+ refresh({ instanceMatrix, instanceColor, count }: InstanceAttributes): void;
35
+ /** Release the mirrors; the attributes are the app's. */
36
+ dispose(): void;
37
+ }
38
+ /** Measure the first `count` instances of `instanceMatrix` at a scale above 0 into `into`, or a new Measured. */
39
+ export declare function measure(instanceMatrix: InstancedBufferAttribute, count: number, into: Measured | null): Measured;
@@ -0,0 +1,104 @@
1
+ import { Box3, Matrix4, Vector3 } from "three/webgpu";
2
+ import { white } from "../levels/fade.js";
3
+ import { isStorageInstanced, stretch } from "../three.js";
4
+ import { ColorMirror, Mirror } from "./mirror.js";
5
+ const matrix = new Matrix4();
6
+ const origin = new Vector3();
7
+ /** A Lod's instances as storage. */
8
+ export class Instances {
9
+ /** Bumped whenever what the storage holds, or how many instances there are, may have changed. */
10
+ version = 0;
11
+ /** Measured from a CPU instanceMatrix as it changes; null for a storage one, which the CPU cannot read. */
12
+ measured = null;
13
+ matrices = null;
14
+ colors = null;
15
+ count = -1;
16
+ /** The matrices as the GPU reads them, once taken in. */
17
+ get matrixStorage() {
18
+ const found = this.matrices;
19
+ if (!found)
20
+ throw new Error("Lod: its instances are read before they were taken in");
21
+ return found.mirror?.attribute ?? storageOf(found.source);
22
+ }
23
+ /** The colours as the GPU reads them, RGB and a pad: white without. */
24
+ get colorStorage() {
25
+ const found = this.colors;
26
+ return found ? (found.mirror?.attribute ?? storageOf(found.source)) : white;
27
+ }
28
+ /**
29
+ * Take in `attributes` as they are: an attribute assigned anew, edits marked by `needsUpdate` (within their update
30
+ * ranges), a new count. A storage instanceMatrix, which the app's GPU passes may write any time, counts as changed
31
+ * at every update. Throws unless they can be drawn.
32
+ */
33
+ refresh({ instanceMatrix, instanceColor, count }) {
34
+ check(instanceMatrix, instanceColor, count);
35
+ let replaced = false;
36
+ if (this.matrices?.source !== instanceMatrix) {
37
+ this.matrices?.mirror?.dispose();
38
+ this.matrices = { source: instanceMatrix, mirror: isStorageInstanced(instanceMatrix) ? null : new Mirror(instanceMatrix) };
39
+ this.measured = null;
40
+ replaced = true;
41
+ }
42
+ if (this.colors?.source !== (instanceColor ?? undefined)) {
43
+ this.colors?.mirror?.dispose();
44
+ this.colors = instanceColor && { source: instanceColor, mirror: isStorageInstanced(instanceColor) ? null : new ColorMirror(instanceColor) };
45
+ replaced = true;
46
+ }
47
+ const { mirror } = this.matrices;
48
+ const moved = mirror ? mirror.refresh() : true;
49
+ const recoloured = this.colors?.mirror?.refresh() ?? false;
50
+ if (mirror && (moved || replaced || count !== this.count || !this.measured))
51
+ this.measured = measure(instanceMatrix, count, this.measured);
52
+ if (replaced || moved || recoloured || count !== this.count)
53
+ this.version++;
54
+ this.count = count;
55
+ }
56
+ /** Release the mirrors; the attributes are the app's. */
57
+ dispose() {
58
+ this.matrices?.mirror?.dispose();
59
+ this.colors?.mirror?.dispose();
60
+ this.matrices = null;
61
+ this.colors = null;
62
+ }
63
+ }
64
+ /** `attribute`, which `refresh` found a storage attribute. */
65
+ function storageOf(attribute) {
66
+ if (!isStorageInstanced(attribute))
67
+ throw new TypeError("Lod: an attribute read in place is not a storage attribute");
68
+ return attribute;
69
+ }
70
+ /** Throws unless the attributes hold `count` instances as an InstancedMesh's do; a storage colour pads RGB to four floats. */
71
+ function check(instanceMatrix, instanceColor, count) {
72
+ if (instanceMatrix.itemSize !== 16 || !(instanceMatrix.array instanceof Float32Array) || instanceMatrix.normalized)
73
+ throw new TypeError(`Lod: instanceMatrix holds 16 floats per instance, not ${instanceMatrix.itemSize}${instanceMatrix.normalized ? " normalized" : ""}`);
74
+ if (!Number.isInteger(count) || count < 0 || count > instanceMatrix.count)
75
+ throw new RangeError(`Lod: count must be an integer from 0 to instanceMatrix.count, ${instanceMatrix.count}, not ${count}`);
76
+ if (!instanceColor)
77
+ return;
78
+ const size = isStorageInstanced(instanceColor) ? 4 : 3;
79
+ if (instanceColor.itemSize !== size || !(instanceColor.array instanceof Float32Array) || instanceColor.normalized)
80
+ throw new TypeError(`Lod: instanceColor holds ${size} floats per instance${size === 4 ? " in storage" : ""}, not ${instanceColor.itemSize}`);
81
+ if (instanceColor.count < count)
82
+ throw new RangeError(`Lod: instanceColor holds ${instanceColor.count} instances, fewer than count, ${count}`);
83
+ }
84
+ /** Measure the first `count` instances of `instanceMatrix` at a scale above 0 into `into`, or a new Measured. */
85
+ export function measure(instanceMatrix, count, into) {
86
+ const measured = into ?? { originBox: new Box3(), minScale: 0, maxScale: 0 };
87
+ const { array } = instanceMatrix;
88
+ measured.originBox.makeEmpty();
89
+ measured.minScale = Infinity;
90
+ measured.maxScale = 0;
91
+ for (let i = 0; i < count; i++) {
92
+ matrix.fromArray(array, i * 16);
93
+ const scale = matrix.getMaxScaleOnAxis();
94
+ if (scale === 0)
95
+ continue;
96
+ measured.originBox.expandByPoint(origin.setFromMatrixPosition(matrix));
97
+ measured.minScale = Math.min(measured.minScale, scale);
98
+ measured.maxScale = Math.max(measured.maxScale, stretch(matrix));
99
+ }
100
+ if (measured.originBox.isEmpty())
101
+ measured.minScale = measured.maxScale = 0;
102
+ return measured;
103
+ }
104
+ //# sourceMappingURL=instances.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instances.js","sourceRoot":"","sources":["../../src/instanced/instances.ts"],"names":[],"mappings":"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"}
@@ -12,7 +12,7 @@ export declare class Key {
12
12
  put(value: number): this;
13
13
  /** Whether the values written since start differ from the last ones. */
14
14
  end(): boolean;
15
- /** A camera's inputs, everything in the InstancedLod's space: what loading and sorting for it both read. */
15
+ /** A camera's inputs, everything in the Lod's space: what sorting for it reads. */
16
16
  camera(eye: Vector3, scale: number, ortho: boolean, levels: d.Infer<typeof DrawLevels>, cull: Cull | null, source: Sphere): this;
17
17
  /** A camera's inputs but where it looks from: all an orthographic camera measures heights by. */
18
18
  screen(scale: number, ortho: boolean, levels: d.Infer<typeof DrawLevels>, cull: Cull | null, source: Sphere): this;
@@ -26,7 +26,7 @@ export class Key {
26
26
  }
27
27
  return this.changed;
28
28
  }
29
- /** A camera's inputs, everything in the InstancedLod's space: what loading and sorting for it both read. */
29
+ /** A camera's inputs, everything in the Lod's space: what sorting for it reads. */
30
30
  camera(eye, scale, ortho, levels, cull, source) {
31
31
  return this.put(eye.x).put(eye.y).put(eye.z).screen(scale, ortho, levels, cull, source);
32
32
  }
@@ -1 +1 @@
1
- {"version":3,"file":"key.js","sourceRoot":"","sources":["../../src/instanced/key.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"key.js","sourceRoot":"","sources":["../../src/instanced/key.ts"],"names":[],"mappings":"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"}
@@ -5,32 +5,32 @@ import type { PreparedLevel } from "../levels/manager.js";
5
5
  import type { InstanceLists } from "./lists.js";
6
6
  import { type Part } from "./meshes.js";
7
7
  import type { InstanceShape } from "./shape.js";
8
- /** What an InstancedLod's level meshes draw with: its shape, lists and the instances they draw. */
8
+ /** What a Lod's level meshes draw with: its shape, lists and the instances they draw. */
9
9
  export interface Drawing {
10
10
  readonly shape: InstanceShape;
11
11
  readonly lists: InstanceLists;
12
- /** What the level meshes draw: the pool's instances, or while survivors scale, their scaled matrices. */
12
+ /** What the level meshes draw: the Lod's instances, or while survivors scale, their scaled matrices. */
13
13
  readonly drawn: DrawnInstances;
14
14
  }
15
15
  /**
16
- * An InstancedLod's level meshes: per level, the meshes drawing it with its debug tint, made from the level's object
17
- * once there is one and added to the InstancedLod, and the source level's parts, which a raycast hits.
16
+ * A Lod's level meshes: per level, the meshes drawing it with its debug tint, made from the level's object once there
17
+ * is one and added to the Lod, and the source level's parts, which a raycast hits.
18
18
  */
19
19
  export declare class MeshesByLevel {
20
- /** The InstancedLod, which holds the meshes. */
20
+ /** The Lod, which holds the meshes. */
21
21
  private readonly parent;
22
22
  /** Its levels: a level that joins gets its object. */
23
23
  private readonly levels;
24
24
  private readonly drawing;
25
25
  /** Around every instance, survivors grown: what every level mesh is culled and boxed by. */
26
26
  private readonly bounds;
27
- /** Sorts `camera`'s lists as a mesh draws for it with `renderer`. */
27
+ /** Sorts `camera`'s lists as `renderer` draws a mesh for it. */
28
28
  private readonly drawFor;
29
29
  private readonly tints;
30
30
  private readonly byLevel;
31
31
  private sourceParts;
32
32
  constructor(
33
- /** The InstancedLod, which holds the meshes. */
33
+ /** The Lod, which holds the meshes. */
34
34
  parent: Object3D,
35
35
  /** Its levels: a level that joins gets its object. */
36
36
  levels: readonly ThresholdedLevel[], drawing: Drawing,
@@ -39,7 +39,7 @@ export declare class MeshesByLevel {
39
39
  readonly sphere: Sphere;
40
40
  readonly box: Box3;
41
41
  },
42
- /** Sorts `camera`'s lists as a mesh draws for it with `renderer`. */
42
+ /** Sorts `camera`'s lists as `renderer` draws a mesh for it. */
43
43
  drawFor: (renderer: unknown, camera: Camera) => void);
44
44
  /** The source level's parts, which a raycast hits. */
45
45
  get source(): readonly Part[];
@@ -55,6 +55,6 @@ export declare class MeshesByLevel {
55
55
  private meshesOf;
56
56
  /** Level meshes of `loaded`, level `index`'s object, staged for wind and compiling. */
57
57
  prepare(index: number, loaded: Object3D): PreparedLevel;
58
- /** Take every mesh out of the InstancedLod and free it. */
58
+ /** Take every mesh out of the Lod and free it. */
59
59
  dispose(): void;
60
60
  }
@@ -7,8 +7,8 @@ import { has } from "../levels/draw.js";
7
7
  import { refreshWind } from "../wind/index.js";
8
8
  import { freeMesh, levelMeshes, partsOf } from "./meshes.js";
9
9
  /**
10
- * An InstancedLod's level meshes: per level, the meshes drawing it with its debug tint, made from the level's object
11
- * once there is one and added to the InstancedLod, and the source level's parts, which a raycast hits.
10
+ * A Lod's level meshes: per level, the meshes drawing it with its debug tint, made from the level's object once there
11
+ * is one and added to the Lod, and the source level's parts, which a raycast hits.
12
12
  */
13
13
  export class MeshesByLevel {
14
14
  parent;
@@ -20,13 +20,13 @@ export class MeshesByLevel {
20
20
  byLevel = [];
21
21
  sourceParts = [];
22
22
  constructor(
23
- /** The InstancedLod, which holds the meshes. */
23
+ /** The Lod, which holds the meshes. */
24
24
  parent,
25
25
  /** Its levels: a level that joins gets its object. */
26
26
  levels, drawing,
27
27
  /** Around every instance, survivors grown: what every level mesh is culled and boxed by. */
28
28
  bounds,
29
- /** Sorts `camera`'s lists as a mesh draws for it with `renderer`. */
29
+ /** Sorts `camera`'s lists as `renderer` draws a mesh for it. */
30
30
  drawFor) {
31
31
  this.parent = parent;
32
32
  this.levels = levels;
@@ -77,9 +77,10 @@ export class MeshesByLevel {
77
77
  box: this.bounds.box,
78
78
  slots: (camera) => lists.slots(camera),
79
79
  radius: shape.fadeRadius,
80
+ layers: this.parent.layers,
80
81
  drawFor: (renderer, camera) => {
81
82
  this.drawFor(renderer, camera);
82
- return lists.slots(camera).args;
83
+ return lists.slots(camera)?.args ?? null;
83
84
  },
84
85
  });
85
86
  }
@@ -113,7 +114,7 @@ export class MeshesByLevel {
113
114
  },
114
115
  };
115
116
  }
116
- /** Take every mesh out of the InstancedLod and free it. */
117
+ /** Take every mesh out of the Lod and free it. */
117
118
  dispose() {
118
119
  for (const mesh of this.byLevel.flat()) {
119
120
  mesh.removeFromParent();
@@ -1 +1 @@
1
- {"version":3,"file":"levels.js","sourceRoot":"","sources":["../../src/instanced/levels.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"levels.js","sourceRoot":"","sources":["../../src/instanced/levels.ts"],"names":[],"mappings":"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"}