@drawcall/lod 0.3.0 → 0.4.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 +54 -0
  44. package/dist/instanced/clusters.js +151 -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 +26 -39
  59. package/dist/instanced/lists.js +42 -61
  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 +15 -73
  73. package/dist/instanced/rows.js +16 -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 +32 -34
  79. package/dist/instanced/sort.js +162 -132
  80. package/dist/instanced/sort.js.map +1 -1
  81. package/dist/instanced/update.d.ts +16 -12
  82. package/dist/instanced/update.js +57 -84
  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 +331 -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 +24 -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 +7 -7
  155. package/dist/three.js +4 -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
@@ -1 +1 @@
1
- {"version":3,"file":"raycast.js","sourceRoot":"","sources":["../../src/instanced/raycast.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"raycast.js","sourceRoot":"","sources":["../../src/instanced/raycast.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAA+D,MAAM,cAAc,CAAC;AACjH,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAStC,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAC9B,MAAM,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC;AACtB,MAAM,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;AAC5B,MAAM,QAAQ,GAAG,IAAI,OAAO,EAAE,CAAC;AAC/B,MAAM,KAAK,GAAG,IAAI,OAAO,EAAE,CAAC;AAC5B,MAAM,IAAI,GAAmB,EAAE,CAAC;AAEhC;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAa,EAAE,MAAqB,EAAE,QAA2B,EAAE,KAAa,EAAE,SAAoB,EAAE,UAA0B;IACjK,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7E,6GAA6G;IAC7G,MAAM,MAAM,GAAG,IAAI,GAAG,EAAiB,CAAC;IACxC,KAAK,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,MAAM,CAAC,KAAK;QAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IACpF,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC;QAC3C,QAAQ,CAAC,SAAS,CAAC,QAAQ,EAAE,KAAK,GAAG,EAAE,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QAC9D,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;QACvD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,MAAM,CAAC;YAAE,SAAS;QACnE,KAAK,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,MAAM;YACpC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,gBAAgB,CAAC,GAAG,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC;gBAAE,UAAU,CAAC,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;IAClL,CAAC;AACH,CAAC;AAED,6DAA6D;AAC7D,SAAS,MAAM,CAAC,IAAU,EAAE,WAAoB,EAAE,SAAoB;IACpE,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC;IAC7B,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IAChB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;IAC/B,IAAI,CAAC;QACH,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAChC,CAAC;YAAS,CAAC;QACT,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC;IACzB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -1,16 +1,15 @@
1
1
  import { IndirectStorageBufferAttribute, StorageBufferAttribute } from "three/webgpu";
2
- /** vec4s per row of u32s and of f32s: what one InstancedLod sorts by for a camera, in two buffers (see `INTS_AT`). */
2
+ /** vec4s of the row's u32s and of its f32s. */
3
3
  export declare const INT_ROW = 6;
4
4
  export declare const FLOAT_ROW = 12;
5
5
  /**
6
- * Where each vec4 of a row lies. Of its u32s (`INTS_AT`): `levels`, the level count, the coarsest level, the forced
7
- * level as `forcedWord` writes it, and whether the row is sorting (1) or waits as it last sorted (0); `masks`, the
8
- * levels that draw nothing, whether they fade (1 or 0), those loaded and those loaded before; `flags`, whether the
9
- * camera is orthographic, cullDistance is set and its survivors scale (1 or 0), and the row's draw count; `layout`,
10
- * slots per list and the row's first draw; `starts`, per level the first slot of its list, `UNLISTED` for none. Of its
11
- * f32s (`FLOATS_AT`): maxPixels of levels 0 to 3 and 4 to 7, the camera in its space (eye and pixels per unit of
12
- * subtense, or of size, ortho), one instance's source sphere, the arrival's progress, the reach of every level and its
13
- * sway, cullDistance's near and far, cullDistance's camera, and the frustum's six planes.
6
+ * Where each vec4 of the row lies. Of its u32s (`INTS_AT`): `levels`, the level count, the coarsest level and the forced
7
+ * level as `forcedWord` writes it; `masks`, the levels that draw nothing, whether they fade (1 or 0), those loaded and
8
+ * those loaded before; `flags`, whether the camera is orthographic, cullDistance is set and its survivors scale (1 or
9
+ * 0), and the draw count; `layout`, slots per list; `starts`, per level the first slot of its list, `UNLISTED` for none.
10
+ * Of its f32s (`FLOATS_AT`): maxPixels of levels 0 to 3 and 4 to 7, the camera in the Lod's space (eye and pixels per
11
+ * unit of subtense, or of size, ortho), one instance's source sphere, the arrival's progress, the reach of every level
12
+ * and its sway, cullDistance's near and far, cullDistance's camera, and the frustum's six planes.
14
13
  */
15
14
  export declare const INTS_AT: {
16
15
  readonly levels: 0;
@@ -28,12 +27,10 @@ export declare const FLOATS_AT: {
28
27
  readonly cullEye: 5;
29
28
  readonly planes: 6;
30
29
  };
31
- /** The forced level as a row's u32 holds it: one more, so that 0 is none (-1). */
30
+ /** The forced level as the row holds it: one more, so that 0 is none (-1). */
32
31
  export declare const forcedWord: (forced: number) => number;
33
32
  /** The start of a level without a list. */
34
33
  export declare const UNLISTED = 4294967295;
35
- /** Counts kept per row: one per level. */
36
- export declare const COUNTS_PER_ROW = 8;
37
34
  /** Bytes per indirect draw, including the unused final word of a non-indexed draw. */
38
35
  export declare const DRAW_BYTES = 20;
39
36
  /** One indirect draw: a level's mesh, drawing `count` indices (or vertices) from `start`. */
@@ -43,66 +40,11 @@ export interface IndirectDraw {
43
40
  start: number;
44
41
  indexed: boolean;
45
42
  }
46
- /** One camera's buffers, the rows it holds values for, and those due to sort. */
47
- export interface CameraBuffers {
48
- /** Its rows' u32s and f32s. */
49
- words: StorageBufferAttribute;
50
- floats: StorageBufferAttribute;
51
- /** Its lists: per slot, the pool index it draws and its signed fade. */
52
- indices: StorageBufferAttribute;
53
- fades: StorageBufferAttribute;
54
- /** Its indirect draws, five words each, in the order of the rows' draws. */
55
- args: IndirectStorageBufferAttribute;
56
- /** Whether its words go up whole with the next sort, as after a layout: no range of them is marked then. */
57
- whole: boolean;
58
- readonly held: Set<number>;
59
- readonly due: Set<number>;
60
- /** The InstancedLods drawing for the camera. */
61
- users: number;
62
- }
63
- /** The rows of every InstancedLod of a LodGpu, where their lists and draws lie, and the buffers every camera shares. */
64
- export declare class RowLayout {
65
- private readonly rows;
66
- private readonly free;
67
- private slots;
68
- private drawCount;
69
- /** Every row's draws, from its first (see `drawWords`). */
70
- draws: StorageBufferAttribute;
71
- /** Per row and level, how many instances it holds for the camera sorting: the indirect pass clears them. */
72
- counts: StorageBufferAttribute;
73
- /** Whether the rows changed since they were laid out. */
74
- private moved;
75
- /** How many rows there are, freed ones included. */
76
- get length(): number;
77
- /** A row for an InstancedLod whose levels of `listed`, a mask, list up to `listSize` instances each. */
78
- register(listed: number, listSize: number): number;
79
- /** Free `row`: its InstancedLod is disposed. */
80
- unregister(row: number): void;
81
- /** `row` draws `draws` too, after those it has; where they start among its draws. */
82
- appendDraws(row: number, draws: readonly IndirectDraw[]): number;
83
- /** Byte offset of `row`'s first draw in a camera's args. */
84
- argsOffset(row: number): number;
85
- /**
86
- * Lay every row's lists and draws out anew if they moved, with every camera's buffers fitted to them: each gets
87
- * fresh args, as a row's old place holds another's words, and every row it holds is due to sort at its new place.
88
- */
89
- layOut(cameras: Iterable<CameraBuffers>): void;
90
- /** Write `row`'s layout and draw count into `buffers`' words. */
91
- place(buffers: CameraBuffers, row: number): void;
92
- /** A camera's buffers, sized to the layout. */
93
- makeBuffers(): CameraBuffers;
94
- dispose(): void;
95
- private rowAt;
96
- /** Grow `buffers` to the layout, keeping what its rows hold, with fresh args. */
97
- private fit;
98
- }
99
- /** Set `row`'s sorting bit in `buffers` to `sorting`, uploaded with the camera's next sort. */
100
- export declare function setSorting(buffers: CameraBuffers, row: number, sorting: number): void;
101
- /** `count` of `buffers`' words from `at` changed: they go up with the camera's next sort. */
102
- export declare function markWords(buffers: CameraBuffers, at: number, count: number): void;
103
- export declare function disposeBuffers({ words, floats, indices, fades, args }: CameraBuffers): void;
104
- /** A camera's rows, as the u32s and the f32s its buffers hold. */
105
- export declare const wordsOf: ({ words }: CameraBuffers) => Uint32Array<ArrayBufferLike>;
106
- export declare const floatsOf: ({ floats }: CameraBuffers) => Float32Array<ArrayBufferLike>;
107
43
  /** The words of `draws` as the indirect pass reads them: level, count, start and whether indexed, per draw. */
108
44
  export declare function drawWords(draws: readonly IndirectDraw[]): StorageBufferAttribute;
45
+ export declare const wordsBuffer: () => StorageBufferAttribute;
46
+ export declare const floatsBuffer: () => StorageBufferAttribute;
47
+ /** Per level, how many instances its list holds for the camera sorting: the indirect pass clears them. */
48
+ export declare const countsBuffer: () => StorageBufferAttribute;
49
+ /** Indirect draws only the GPU writes, zero until a sort writes them: nothing draws before a sort. */
50
+ export declare const argsBuffer: (draws: number) => IndirectStorageBufferAttribute;
@@ -1,209 +1,36 @@
1
1
  import { IndirectStorageBufferAttribute, StorageBufferAttribute } from "three/webgpu";
2
2
  import { MAX_LEVELS } from "../levels/draw.js";
3
- // Where every InstancedLod of a LodGpu lies in a camera's buffers: its row of what it sorts by, its lists and its
4
- // indirect draws. A row's place follows from the rows before it: once a row was registered, freed or given draws, the
5
- // next use lays every row out anew (see `RowLayout.layOut`).
6
- /** vec4s per row of u32s and of f32s: what one InstancedLod sorts by for a camera, in two buffers (see `INTS_AT`). */
3
+ // What a Lod sorts by for one camera, as the sort passes read it (see update.ts): its row, of u32s and of f32s.
4
+ /** vec4s of the row's u32s and of its f32s. */
7
5
  export const INT_ROW = 6;
8
6
  export const FLOAT_ROW = 12;
9
7
  /**
10
- * Where each vec4 of a row lies. Of its u32s (`INTS_AT`): `levels`, the level count, the coarsest level, the forced
11
- * level as `forcedWord` writes it, and whether the row is sorting (1) or waits as it last sorted (0); `masks`, the
12
- * levels that draw nothing, whether they fade (1 or 0), those loaded and those loaded before; `flags`, whether the
13
- * camera is orthographic, cullDistance is set and its survivors scale (1 or 0), and the row's draw count; `layout`,
14
- * slots per list and the row's first draw; `starts`, per level the first slot of its list, `UNLISTED` for none. Of its
15
- * f32s (`FLOATS_AT`): maxPixels of levels 0 to 3 and 4 to 7, the camera in its space (eye and pixels per unit of
16
- * subtense, or of size, ortho), one instance's source sphere, the arrival's progress, the reach of every level and its
17
- * sway, cullDistance's near and far, cullDistance's camera, and the frustum's six planes.
8
+ * Where each vec4 of the row lies. Of its u32s (`INTS_AT`): `levels`, the level count, the coarsest level and the forced
9
+ * level as `forcedWord` writes it; `masks`, the levels that draw nothing, whether they fade (1 or 0), those loaded and
10
+ * those loaded before; `flags`, whether the camera is orthographic, cullDistance is set and its survivors scale (1 or
11
+ * 0), and the draw count; `layout`, slots per list; `starts`, per level the first slot of its list, `UNLISTED` for none.
12
+ * Of its f32s (`FLOATS_AT`): maxPixels of levels 0 to 3 and 4 to 7, the camera in the Lod's space (eye and pixels per
13
+ * unit of subtense, or of size, ortho), one instance's source sphere, the arrival's progress, the reach of every level
14
+ * and its sway, cullDistance's near and far, cullDistance's camera, and the frustum's six planes.
18
15
  */
19
16
  export const INTS_AT = { levels: 0, masks: 1, flags: 2, layout: 3, starts: 4 };
20
17
  export const FLOATS_AT = { low: 0, high: 1, eye: 2, source: 3, values: 4, cullEye: 5, planes: 6 };
21
- /** The u32 of the sorting bit, in a row's u32s. */
22
- const SORTING_AT = INTS_AT.levels * 4 + 3;
23
- /** The forced level as a row's u32 holds it: one more, so that 0 is none (-1). */
18
+ /** The forced level as the row holds it: one more, so that 0 is none (-1). */
24
19
  export const forcedWord = (forced) => forced + 1;
25
20
  /** The start of a level without a list. */
26
21
  export const UNLISTED = 0xffffffff;
27
- /** Counts kept per row: one per level. */
28
- export const COUNTS_PER_ROW = MAX_LEVELS;
29
22
  /** Bytes per indirect draw, including the unused final word of a non-indexed draw. */
30
23
  export const DRAW_BYTES = 20;
31
- /** The rows of every InstancedLod of a LodGpu, where their lists and draws lie, and the buffers every camera shares. */
32
- export class RowLayout {
33
- rows = [];
34
- free = [];
35
- slots = 0;
36
- drawCount = 0;
37
- /** Every row's draws, from its first (see `drawWords`). */
38
- draws = drawWords([]);
39
- /** Per row and level, how many instances it holds for the camera sorting: the indirect pass clears them. */
40
- counts = countsBuffer(0);
41
- /** Whether the rows changed since they were laid out. */
42
- moved = false;
43
- /** How many rows there are, freed ones included. */
44
- get length() {
45
- return this.rows.length;
46
- }
47
- /** A row for an InstancedLod whose levels of `listed`, a mask, list up to `listSize` instances each. */
48
- register(listed, listSize) {
49
- const row = this.free.pop() ?? this.rows.length;
50
- this.rows[row] = { listed, listSize, draws: [], listBase: 0, drawBase: 0 };
51
- this.moved = true;
52
- return row;
53
- }
54
- /** Free `row`: its InstancedLod is disposed. */
55
- unregister(row) {
56
- this.rows[row] = null;
57
- this.free.push(row);
58
- this.moved = true;
59
- }
60
- /** `row` draws `draws` too, after those it has; where they start among its draws. */
61
- appendDraws(row, draws) {
62
- const { draws: own } = this.rowAt(row);
63
- const first = own.length;
64
- own.push(...draws);
65
- this.moved = true;
66
- return first;
67
- }
68
- /** Byte offset of `row`'s first draw in a camera's args. */
69
- argsOffset(row) {
70
- return this.rowAt(row).drawBase * DRAW_BYTES;
71
- }
72
- /**
73
- * Lay every row's lists and draws out anew if they moved, with every camera's buffers fitted to them: each gets
74
- * fresh args, as a row's old place holds another's words, and every row it holds is due to sort at its new place.
75
- */
76
- layOut(cameras) {
77
- if (!this.moved)
78
- return;
79
- this.moved = false;
80
- let slots = 0;
81
- const all = [];
82
- for (const row of this.rows) {
83
- if (!row)
84
- continue;
85
- row.listBase = slots;
86
- row.drawBase = all.length;
87
- slots += countBits(row.listed) * row.listSize;
88
- all.push(...row.draws);
89
- }
90
- this.slots = slots;
91
- this.drawCount = all.length;
92
- this.draws.dispose();
93
- this.draws = drawWords(all);
94
- if (this.counts.count < this.rows.length * COUNTS_PER_ROW) {
95
- this.counts.dispose();
96
- this.counts = countsBuffer(this.rows.length);
97
- }
98
- for (const buffers of cameras) {
99
- this.fit(buffers);
100
- // Every row of it moved: the whole buffer goes up.
101
- buffers.words.clearUpdateRanges();
102
- buffers.words.needsUpdate = true;
103
- buffers.whole = true;
104
- for (const row of buffers.held) {
105
- this.place(buffers, row);
106
- setSorting(buffers, row, 1);
107
- buffers.due.add(row);
108
- }
109
- }
110
- }
111
- /** Write `row`'s layout and draw count into `buffers`' words. */
112
- place(buffers, row) {
113
- const { listBase, listSize, listed, drawBase, draws } = this.rowAt(row);
114
- const words = wordsOf(buffers);
115
- const base = row * INT_ROW * 4;
116
- words[base + INTS_AT.flags * 4 + 3] = draws.length;
117
- words.set([listSize, drawBase, 0, 0], base + INTS_AT.layout * 4);
118
- let next = listBase;
119
- for (let level = 0; level < COUNTS_PER_ROW; level++) {
120
- const on = (listed & (1 << level)) !== 0;
121
- words[base + INTS_AT.starts * 4 + level] = on ? next : UNLISTED;
122
- if (on)
123
- next += listSize;
124
- }
125
- }
126
- /** A camera's buffers, sized to the layout. */
127
- makeBuffers() {
128
- return {
129
- words: wordsBuffer(this.rows.length),
130
- floats: floatsBuffer(this.rows.length),
131
- indices: new StorageBufferAttribute(new Uint32Array(Math.max(this.slots, 1)), 1),
132
- fades: new StorageBufferAttribute(new Float32Array(Math.max(this.slots, 1)), 1),
133
- args: argsBuffer(this.drawCount),
134
- whole: false,
135
- held: new Set(),
136
- due: new Set(),
137
- users: 0,
138
- };
139
- }
140
- dispose() {
141
- this.draws.dispose();
142
- this.counts.dispose();
143
- }
144
- rowAt(row) {
145
- const found = this.rows[row];
146
- if (!found)
147
- throw new Error(`LodGpu: row ${row} holds no InstancedLod`);
148
- return found;
149
- }
150
- /** Grow `buffers` to the layout, keeping what its rows hold, with fresh args. */
151
- fit(buffers) {
152
- if (buffers.words.count < this.rows.length * INT_ROW) {
153
- const words = wordsBuffer(this.rows.length);
154
- const floats = floatsBuffer(this.rows.length);
155
- new Uint32Array(words.array.buffer).set(wordsOf(buffers));
156
- new Float32Array(floats.array.buffer).set(floatsOf(buffers));
157
- buffers.words.dispose();
158
- buffers.floats.dispose();
159
- buffers.words = words;
160
- buffers.floats = floats;
161
- }
162
- if (buffers.indices.count < this.slots) {
163
- buffers.indices.dispose();
164
- buffers.fades.dispose();
165
- buffers.indices = new StorageBufferAttribute(new Uint32Array(this.slots), 1);
166
- buffers.fades = new StorageBufferAttribute(new Float32Array(this.slots), 1);
167
- }
168
- buffers.args.dispose();
169
- buffers.args = argsBuffer(this.drawCount);
170
- }
171
- }
172
- /** Set `row`'s sorting bit in `buffers` to `sorting`, uploaded with the camera's next sort. */
173
- export function setSorting(buffers, row, sorting) {
174
- const at = row * INT_ROW * 4 + SORTING_AT;
175
- wordsOf(buffers)[at] = sorting;
176
- markWords(buffers, at, 1);
177
- }
178
- /** `count` of `buffers`' words from `at` changed: they go up with the camera's next sort. */
179
- export function markWords(buffers, at, count) {
180
- if (!buffers.whole)
181
- buffers.words.addUpdateRange(at, count);
182
- buffers.words.needsUpdate = true;
183
- }
184
- export function disposeBuffers({ words, floats, indices, fades, args }) {
185
- for (const attribute of [words, floats, indices, fades, args])
186
- attribute.dispose();
187
- }
188
- /** A camera's rows, as the u32s and the f32s its buffers hold. */
189
- export const wordsOf = ({ words }) => new Uint32Array(words.array.buffer);
190
- export const floatsOf = ({ floats }) => new Float32Array(floats.array.buffer);
191
24
  /** The words of `draws` as the indirect pass reads them: level, count, start and whether indexed, per draw. */
192
25
  export function drawWords(draws) {
193
26
  const values = new Uint32Array(Math.max(draws.length, 1) * 4);
194
27
  draws.forEach((draw, i) => values.set([draw.level, draw.count, draw.start, Number(draw.indexed)], i * 4));
195
28
  return new StorageBufferAttribute(values, 4);
196
29
  }
197
- /** Set bits of `mask`. */
198
- function countBits(mask) {
199
- let count = 0;
200
- for (let bits = mask; bits !== 0; bits &= bits - 1)
201
- count++;
202
- return count;
203
- }
204
- const wordsBuffer = (rows) => new StorageBufferAttribute(new Uint32Array(Math.max(rows, 1) * INT_ROW * 4), 4);
205
- const floatsBuffer = (rows) => new StorageBufferAttribute(new Float32Array(Math.max(rows, 1) * FLOAT_ROW * 4), 4);
206
- const countsBuffer = (rows) => new StorageBufferAttribute(new Uint32Array(Math.max(rows, 1) * COUNTS_PER_ROW), 1);
207
- /** Indirect draws only the GPU writes, zero until a sort writes them: a row draws nothing before it sorted. */
208
- const argsBuffer = (draws) => new IndirectStorageBufferAttribute(new Uint32Array(Math.max(draws, 1) * (DRAW_BYTES / 4)), 1);
30
+ export const wordsBuffer = () => new StorageBufferAttribute(new Uint32Array(INT_ROW * 4), 4);
31
+ export const floatsBuffer = () => new StorageBufferAttribute(new Float32Array(FLOAT_ROW * 4), 4);
32
+ /** Per level, how many instances its list holds for the camera sorting: the indirect pass clears them. */
33
+ export const countsBuffer = () => new StorageBufferAttribute(new Uint32Array(MAX_LEVELS), 1);
34
+ /** Indirect draws only the GPU writes, zero until a sort writes them: nothing draws before a sort. */
35
+ export const argsBuffer = (draws) => new IndirectStorageBufferAttribute(new Uint32Array(Math.max(draws, 1) * (DRAW_BYTES / 4)), 1);
209
36
  //# sourceMappingURL=rows.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"rows.js","sourceRoot":"","sources":["../../src/instanced/rows.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rows.js","sourceRoot":"","sources":["../../src/instanced/rows.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,8BAA8B,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACtF,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,gHAAgH;AAEhH,+CAA+C;AAC/C,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,CAAC;AACzB,MAAM,CAAC,MAAM,SAAS,GAAG,EAAE,CAAC;AAE5B;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAW,CAAC;AACxF,MAAM,CAAC,MAAM,SAAS,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAW,CAAC;AAE3G,8EAA8E;AAC9E,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,MAAc,EAAE,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;AAEzD,2CAA2C;AAC3C,MAAM,CAAC,MAAM,QAAQ,GAAG,UAAU,CAAC;AAEnC,sFAAsF;AACtF,MAAM,CAAC,MAAM,UAAU,GAAG,EAAE,CAAC;AAU7B,+GAA+G;AAC/G,MAAM,UAAU,SAAS,CAAC,KAA8B;IACtD,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9D,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC1G,OAAO,IAAI,sBAAsB,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAG,GAAG,EAAE,CAAC,IAAI,sBAAsB,CAAC,IAAI,WAAW,CAAC,OAAO,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC7F,MAAM,CAAC,MAAM,YAAY,GAAG,GAAG,EAAE,CAAC,IAAI,sBAAsB,CAAC,IAAI,YAAY,CAAC,SAAS,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACjG,0GAA0G;AAC1G,MAAM,CAAC,MAAM,YAAY,GAAG,GAAG,EAAE,CAAC,IAAI,sBAAsB,CAAC,IAAI,WAAW,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;AAC7F,sGAAsG;AACtG,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,IAAI,8BAA8B,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import { Sphere } from "three/webgpu";
2
2
  import type { LodLevel } from "../levels/index.js";
3
- /** One instance of an InstancedLod as its levels measure it, in its own space: what heights, bounds and fades are measured by. */
3
+ /** One instance of a Lod as its levels measure it, in its own space: what heights, bounds and fades are measured by. */
4
4
  export declare class InstanceShape {
5
5
  /** The source's sphere, which heights are measured by. */
6
6
  readonly source: Sphere;
@@ -10,6 +10,8 @@ export declare class InstanceShape {
10
10
  readonly ownRadius: number;
11
11
  /** The source's radius padded for sway, where fades and shadow casters are cut off (see `wind`). */
12
12
  fadeRadius: number;
13
+ /** The diagonal of every level's box: how much a cluster's box shows of its instances' scale. */
14
+ readonly extent: number;
13
15
  /** Every level's box. */
14
16
  private readonly envelope;
15
17
  /** How far levels sway beyond `rest`, relative to it. */
@@ -1,6 +1,6 @@
1
- import { Box3, Sphere } from "three/webgpu";
1
+ import { Box3, Sphere, Vector3 } from "three/webgpu";
2
2
  import { levelBox, measureLevels } from "../levels/bounds.js";
3
- /** One instance of an InstancedLod as its levels measure it, in its own space: what heights, bounds and fades are measured by. */
3
+ /** One instance of a Lod as its levels measure it, in its own space: what heights, bounds and fades are measured by. */
4
4
  export class InstanceShape {
5
5
  /** The source's sphere, which heights are measured by. */
6
6
  source = new Sphere();
@@ -10,6 +10,8 @@ export class InstanceShape {
10
10
  ownRadius = 0;
11
11
  /** The source's radius padded for sway, where fades and shadow casters are cut off (see `wind`). */
12
12
  fadeRadius = 0;
13
+ /** The diagonal of every level's box: how much a cluster's box shows of its instances' scale. */
14
+ extent = 0;
13
15
  /** Every level's box. */
14
16
  envelope = new Box3();
15
17
  /** How far levels sway beyond `rest`, relative to it. */
@@ -18,7 +20,7 @@ export class InstanceShape {
18
20
  constructor(inputs) {
19
21
  if (inputs.length === 0)
20
22
  return;
21
- const { own, placed } = measureLevels(inputs, "InstancedLod");
23
+ const { own, placed } = measureLevels(inputs, "Lod");
22
24
  this.ownRadius = own.radius;
23
25
  this.source.copy(placed);
24
26
  this.rest.copy(placed);
@@ -28,6 +30,7 @@ export class InstanceShape {
28
30
  // Metadata includes unloaded levels, so later arrivals cannot pass the envelope.
29
31
  if (this.envelope.isEmpty())
30
32
  return;
33
+ this.extent = this.envelope.getSize(new Vector3()).length();
31
34
  const { center } = this.rest;
32
35
  const { min, max } = this.envelope;
33
36
  this.rest.radius = Math.max(this.rest.radius, Math.hypot(Math.max(Math.abs(min.x - center.x), Math.abs(max.x - center.x)), Math.max(Math.abs(min.y - center.y), Math.abs(max.y - center.y)), Math.max(Math.abs(min.z - center.z), Math.abs(max.z - center.z))));
@@ -1 +1 @@
1
- {"version":3,"file":"shape.js","sourceRoot":"","sources":["../../src/instanced/shape.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"shape.js","sourceRoot":"","sources":["../../src/instanced/shape.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,10 @@
1
1
  import { StorageInstancedBufferAttribute, type Camera, type Frustum, type Renderer, type Sphere, type Vector3 } from "three/webgpu";
2
2
  import type { d } from "typegpu";
3
- import type { DrawLevels } from "../levels/draw.js";
3
+ import { type DrawLevels } from "../levels/draw.js";
4
4
  import type { InstanceSlots } from "../levels/fade.js";
5
5
  import type { Cull } from "./cull.js";
6
- import { type InstancePagePool } from "./pages/index.js";
7
6
  import { type IndirectDraw } from "./rows.js";
8
- /** What one InstancedLod sorts by for a camera, everything in its space. */
7
+ /** What a Lod sorts by for a camera, everything in its space. */
9
8
  export interface RowValues {
10
9
  levels: d.Infer<typeof DrawLevels>;
11
10
  /** The level loading state levelsToDraw reads (see LodLevelLoadManager). */
@@ -22,42 +21,41 @@ export interface RowValues {
22
21
  reach: number;
23
22
  frustum: Frustum;
24
23
  }
25
- /** The rows of every InstancedLod of a LodGpu, every camera's buffers, and the passes sorting into them. */
24
+ /** One Lod's sorts: every camera's buffers, and the passes sorting into them. */
26
25
  export declare class Sorter {
27
- private readonly renderer;
28
- private readonly pool;
29
- private readonly layout;
26
+ private readonly listed;
30
27
  private readonly cameras;
31
- /** Survivors' scaled matrices, made once a row scales them; their CPU array is dropped once a pass wrote them. */
28
+ private readonly draws;
29
+ private drawBuffer;
30
+ private readonly counts;
31
+ /** Survivors' scaled matrices, made once survivors scale; their CPU array is dropped once a pass wrote them. */
32
32
  private scaled;
33
33
  /** Where survivors' scaled matrices go while none scale: never written, as no survivor scales. */
34
34
  private readonly unscaled;
35
35
  private passes;
36
- private isDisposed;
37
- constructor(renderer: Renderer, pool: InstancePagePool);
38
- /** A row for an InstancedLod whose levels of `listed`, a mask, list up to `listSize` instances each. */
39
- register(listed: number, listSize: number): number;
40
- /** Free `row`: its InstancedLod is disposed. */
41
- unregister(row: number): void;
42
- /** `row` draws `draws` too, after those it has; where they start among its draws. */
43
- appendDraws(row: number, draws: readonly IndirectDraw[]): number;
44
- /** Survivors' scaled matrices, every pool index's: one buffer, as pool indices are unique to their InstancedLod. */
45
- get scaledMatrices(): StorageInstancedBufferAttribute;
46
- /** An InstancedLod draws for `camera`: its buffers are made with the first. */
47
- hold(camera: Camera): void;
48
- /** An InstancedLod stops drawing for `camera`, its row `row` dropped from it; the last frees its buffers. */
49
- release(camera: Camera, row: number): void;
50
- /** Where `row`'s lists and draws lie for `camera`. */
51
- slotsOf(camera: Camera, row: number): InstanceSlots;
52
- /** Write `values` as what `row` sorts by for `camera`, sorted at the camera's next draw. */
53
- write(camera: Camera, row: number, values: RowValues): void;
54
- /** Sort every row due for `camera`, in one compute call: before a level mesh draws for it. */
55
- run(camera: Camera): void;
56
- /** Whether it was disposed: then it takes no InstancedLod and no camera. */
57
- get disposed(): boolean;
36
+ /** `listed` tells, as a mask, which levels have an instance list: those that draw something. */
37
+ constructor(listed: number);
38
+ /** The meshes draw `draws` too, after those they have; where they start among the draws. */
39
+ appendDraws(draws: readonly IndirectDraw[]): number;
40
+ /** Survivors' scaled matrices for `capacity` instances. */
41
+ scaledMatrices(capacity: number): StorageInstancedBufferAttribute;
42
+ /** Where `camera`'s lists and indirect draws lie; null before a sort was written for it. */
43
+ slotsOf(camera: Camera): InstanceSlots | null;
44
+ /**
45
+ * Write `values` as what `camera` sorts by, over the instances of `ranges` (start and count, flat), `instances` in
46
+ * all, sorted at the camera's next draw. Its lists grow to hold them, within `limit` bytes per buffer.
47
+ */
48
+ write(camera: Camera, values: RowValues, ranges: readonly number[], instances: number, limit: number): void;
49
+ /** Sort for `camera` on `renderer`, in one compute call, if due: before a level mesh draws for it. */
50
+ run(renderer: Renderer, camera: Camera, matrices: StorageInstancedBufferAttribute): void;
51
+ /** `camera` no longer draws the Lod: its buffers are freed. */
52
+ release(camera: Camera): void;
58
53
  dispose(): void;
59
- private check;
60
- private layOut;
61
- private buffersOf;
62
- private sortBuffers;
54
+ private makeBuffers;
55
+ /** Grow `buffers`' lists to hold `instances` per level, by doubling, each buffer within `limit` bytes. */
56
+ private grow;
57
+ /** Write the blocks of `ranges` into `buffers`: one empty block for none, as a dispatch visits one at least. */
58
+ private writeBlocks;
59
+ /** Write the layout of `buffers`' lists and the draw count into its row. */
60
+ private place;
63
61
  }