@adobe/data 0.9.74 → 0.9.76

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 (317) hide show
  1. package/dist/ecs/database/transactional-store/create-transactional-store.js +7 -1
  2. package/dist/ecs/database/transactional-store/create-transactional-store.js.map +1 -1
  3. package/dist/ecs/database/transactional-store/create-transactional-store.test.js +42 -0
  4. package/dist/ecs/database/transactional-store/create-transactional-store.test.js.map +1 -1
  5. package/dist/functions/serialization/codec.js +4 -0
  6. package/dist/functions/serialization/codec.js.map +1 -1
  7. package/dist/functions/serialization/serialization.test.js +10 -0
  8. package/dist/functions/serialization/serialization.test.js.map +1 -1
  9. package/dist/math/i32/public.d.ts +2 -1
  10. package/dist/math/i32/public.js +2 -1
  11. package/dist/math/i32/public.js.map +1 -1
  12. package/dist/math/i32/shift-right.d.ts +2 -0
  13. package/dist/math/i32/shift-right.js +3 -0
  14. package/dist/math/i32/shift-right.js.map +1 -0
  15. package/dist/math/u32/count-leading-zeros.d.ts +2 -0
  16. package/dist/math/u32/count-leading-zeros.js +3 -0
  17. package/dist/math/u32/count-leading-zeros.js.map +1 -0
  18. package/dist/math/u32/count-one-bits.d.ts +2 -0
  19. package/dist/math/u32/count-one-bits.js +11 -0
  20. package/dist/math/u32/count-one-bits.js.map +1 -0
  21. package/dist/math/u32/count-trailing-zeros.d.ts +2 -0
  22. package/dist/math/u32/count-trailing-zeros.js +14 -0
  23. package/dist/math/u32/count-trailing-zeros.js.map +1 -0
  24. package/dist/math/u32/public.d.ts +6 -1
  25. package/dist/math/u32/public.js +6 -1
  26. package/dist/math/u32/public.js.map +1 -1
  27. package/dist/math/u32/reverse-bits.d.ts +2 -0
  28. package/dist/math/u32/reverse-bits.js +11 -0
  29. package/dist/math/u32/reverse-bits.js.map +1 -0
  30. package/dist/math/u32/shift-right.d.ts +2 -0
  31. package/dist/math/u32/shift-right.js +3 -0
  32. package/dist/math/u32/shift-right.js.map +1 -0
  33. package/dist/math/vec2/f32/f32.d.ts +4 -0
  34. package/dist/math/vec2/f32/f32.js +3 -0
  35. package/dist/math/vec2/f32/f32.js.map +1 -0
  36. package/dist/math/vec2/f32/functions.d.ts +50 -0
  37. package/dist/math/vec2/f32/functions.js +87 -0
  38. package/dist/math/vec2/f32/functions.js.map +1 -0
  39. package/dist/math/vec2/f32/layout.d.ts +1 -0
  40. package/dist/math/vec2/f32/layout.js +5 -0
  41. package/dist/math/vec2/f32/layout.js.map +1 -0
  42. package/dist/math/vec2/f32/public.d.ts +3 -0
  43. package/dist/math/vec2/f32/public.js +5 -0
  44. package/dist/math/vec2/f32/public.js.map +1 -0
  45. package/dist/math/vec2/f32/schema.d.ts +11 -0
  46. package/dist/math/vec2/f32/schema.js +10 -0
  47. package/dist/math/vec2/f32/schema.js.map +1 -0
  48. package/dist/math/vec2/i32/functions.d.ts +21 -0
  49. package/dist/math/vec2/i32/functions.js +39 -0
  50. package/dist/math/vec2/i32/functions.js.map +1 -0
  51. package/dist/math/vec2/i32/i32.d.ts +4 -0
  52. package/dist/math/vec2/i32/i32.js +3 -0
  53. package/dist/math/vec2/i32/i32.js.map +1 -0
  54. package/dist/math/vec2/i32/layout.d.ts +1 -0
  55. package/dist/math/vec2/i32/layout.js +5 -0
  56. package/dist/math/vec2/i32/layout.js.map +1 -0
  57. package/dist/math/vec2/i32/public.d.ts +3 -0
  58. package/dist/math/vec2/i32/public.js +5 -0
  59. package/dist/math/vec2/i32/public.js.map +1 -0
  60. package/dist/math/vec2/i32/schema.d.ts +12 -0
  61. package/dist/math/vec2/i32/schema.js +10 -0
  62. package/dist/math/vec2/i32/schema.js.map +1 -0
  63. package/dist/math/vec2/index.d.ts +61 -4
  64. package/dist/math/vec2/index.js +56 -1
  65. package/dist/math/vec2/index.js.map +1 -1
  66. package/dist/math/vec2/public.d.ts +5 -3
  67. package/dist/math/vec2/public.js +6 -3
  68. package/dist/math/vec2/public.js.map +1 -1
  69. package/dist/math/vec2/u32/functions.d.ts +20 -0
  70. package/dist/math/vec2/u32/functions.js +58 -0
  71. package/dist/math/vec2/u32/functions.js.map +1 -0
  72. package/dist/math/vec2/u32/layout.d.ts +1 -0
  73. package/dist/math/vec2/u32/layout.js +5 -0
  74. package/dist/math/vec2/u32/layout.js.map +1 -0
  75. package/dist/math/vec2/u32/public.d.ts +3 -0
  76. package/dist/math/vec2/u32/public.js +5 -0
  77. package/dist/math/vec2/u32/public.js.map +1 -0
  78. package/dist/math/vec2/u32/schema.d.ts +12 -0
  79. package/dist/math/vec2/u32/schema.js +10 -0
  80. package/dist/math/vec2/u32/schema.js.map +1 -0
  81. package/dist/math/vec2/u32/u32.d.ts +4 -0
  82. package/dist/math/vec2/u32/u32.js +3 -0
  83. package/dist/math/vec2/u32/u32.js.map +1 -0
  84. package/dist/math/vec3/f32/f32.d.ts +4 -0
  85. package/dist/math/vec3/f32/f32.js +3 -0
  86. package/dist/math/vec3/f32/f32.js.map +1 -0
  87. package/dist/math/vec3/f32/functions.d.ts +59 -0
  88. package/dist/math/vec3/f32/functions.js +139 -0
  89. package/dist/math/vec3/f32/functions.js.map +1 -0
  90. package/dist/math/vec3/f32/layout.d.ts +1 -0
  91. package/dist/math/vec3/f32/layout.js +5 -0
  92. package/dist/math/vec3/f32/layout.js.map +1 -0
  93. package/dist/math/vec3/f32/public.d.ts +3 -0
  94. package/dist/math/vec3/f32/public.js +5 -0
  95. package/dist/math/vec3/f32/public.js.map +1 -0
  96. package/dist/math/vec3/f32/schema.d.ts +11 -0
  97. package/dist/math/vec3/f32/schema.js +10 -0
  98. package/dist/math/vec3/f32/schema.js.map +1 -0
  99. package/dist/math/vec3/i32/functions.d.ts +23 -0
  100. package/dist/math/vec3/i32/functions.js +78 -0
  101. package/dist/math/vec3/i32/functions.js.map +1 -0
  102. package/dist/math/vec3/i32/i32.d.ts +4 -0
  103. package/dist/math/vec3/i32/i32.js +3 -0
  104. package/dist/math/vec3/i32/i32.js.map +1 -0
  105. package/dist/math/vec3/i32/layout.d.ts +1 -0
  106. package/dist/math/vec3/i32/layout.js +5 -0
  107. package/dist/math/vec3/i32/layout.js.map +1 -0
  108. package/dist/math/vec3/i32/public.d.ts +3 -0
  109. package/dist/math/vec3/i32/public.js +5 -0
  110. package/dist/math/vec3/i32/public.js.map +1 -0
  111. package/dist/math/vec3/i32/schema.d.ts +12 -0
  112. package/dist/math/vec3/i32/schema.js +10 -0
  113. package/dist/math/vec3/i32/schema.js.map +1 -0
  114. package/dist/math/vec3/index.d.ts +67 -4
  115. package/dist/math/vec3/index.js +62 -1
  116. package/dist/math/vec3/index.js.map +1 -1
  117. package/dist/math/vec3/public.d.ts +5 -3
  118. package/dist/math/vec3/public.js +6 -3
  119. package/dist/math/vec3/public.js.map +1 -1
  120. package/dist/math/vec3/u32/functions.d.ts +23 -0
  121. package/dist/math/vec3/u32/functions.js +85 -0
  122. package/dist/math/vec3/u32/functions.js.map +1 -0
  123. package/dist/math/vec3/u32/layout.d.ts +1 -0
  124. package/dist/math/vec3/u32/layout.js +5 -0
  125. package/dist/math/vec3/u32/layout.js.map +1 -0
  126. package/dist/math/vec3/u32/public.d.ts +3 -0
  127. package/dist/math/vec3/u32/public.js +5 -0
  128. package/dist/math/vec3/u32/public.js.map +1 -0
  129. package/dist/math/vec3/u32/schema.d.ts +12 -0
  130. package/dist/math/vec3/u32/schema.js +10 -0
  131. package/dist/math/vec3/u32/schema.js.map +1 -0
  132. package/dist/math/vec3/u32/u32.d.ts +4 -0
  133. package/dist/math/vec3/u32/u32.js +3 -0
  134. package/dist/math/vec3/u32/u32.js.map +1 -0
  135. package/dist/math/vec4/f32/f32.d.ts +4 -0
  136. package/dist/math/vec4/f32/f32.js +3 -0
  137. package/dist/math/vec4/f32/f32.js.map +1 -0
  138. package/dist/math/vec4/f32/functions.d.ts +49 -0
  139. package/dist/math/vec4/f32/functions.js +130 -0
  140. package/dist/math/vec4/f32/functions.js.map +1 -0
  141. package/dist/math/vec4/f32/layout.d.ts +1 -0
  142. package/dist/math/vec4/f32/layout.js +5 -0
  143. package/dist/math/vec4/f32/layout.js.map +1 -0
  144. package/dist/math/vec4/f32/public.d.ts +3 -0
  145. package/dist/math/vec4/f32/public.js +5 -0
  146. package/dist/math/vec4/f32/public.js.map +1 -0
  147. package/dist/math/vec4/f32/schema.d.ts +11 -0
  148. package/dist/math/vec4/f32/schema.js +10 -0
  149. package/dist/math/vec4/f32/schema.js.map +1 -0
  150. package/dist/math/vec4/i32/functions.d.ts +23 -0
  151. package/dist/math/vec4/i32/functions.js +91 -0
  152. package/dist/math/vec4/i32/functions.js.map +1 -0
  153. package/dist/math/vec4/i32/i32.d.ts +4 -0
  154. package/dist/math/vec4/i32/i32.js +3 -0
  155. package/dist/math/vec4/i32/i32.js.map +1 -0
  156. package/dist/math/vec4/i32/layout.d.ts +1 -0
  157. package/dist/math/vec4/i32/layout.js +5 -0
  158. package/dist/math/vec4/i32/layout.js.map +1 -0
  159. package/dist/math/vec4/i32/public.d.ts +3 -0
  160. package/dist/math/vec4/i32/public.js +5 -0
  161. package/dist/math/vec4/i32/public.js.map +1 -0
  162. package/dist/math/vec4/i32/schema.d.ts +12 -0
  163. package/dist/math/vec4/i32/schema.js +10 -0
  164. package/dist/math/vec4/i32/schema.js.map +1 -0
  165. package/dist/math/vec4/index.d.ts +60 -4
  166. package/dist/math/vec4/index.js +55 -1
  167. package/dist/math/vec4/index.js.map +1 -1
  168. package/dist/math/vec4/public.d.ts +5 -3
  169. package/dist/math/vec4/public.js +6 -3
  170. package/dist/math/vec4/public.js.map +1 -1
  171. package/dist/math/vec4/u32/functions.d.ts +22 -0
  172. package/dist/math/vec4/u32/functions.js +99 -0
  173. package/dist/math/vec4/u32/functions.js.map +1 -0
  174. package/dist/math/vec4/u32/layout.d.ts +1 -0
  175. package/dist/math/vec4/u32/layout.js +5 -0
  176. package/dist/math/vec4/u32/layout.js.map +1 -0
  177. package/dist/math/vec4/u32/public.d.ts +3 -0
  178. package/dist/math/vec4/u32/public.js +5 -0
  179. package/dist/math/vec4/u32/public.js.map +1 -0
  180. package/dist/math/vec4/u32/schema.d.ts +12 -0
  181. package/dist/math/vec4/u32/schema.js +10 -0
  182. package/dist/math/vec4/u32/schema.js.map +1 -0
  183. package/dist/math/vec4/u32/u32.d.ts +4 -0
  184. package/dist/math/vec4/u32/u32.js +3 -0
  185. package/dist/math/vec4/u32/u32.js.map +1 -0
  186. package/dist/schema/boolean/schema.d.ts +1 -0
  187. package/dist/schema/boolean/schema.js +2 -1
  188. package/dist/schema/boolean/schema.js.map +1 -1
  189. package/dist/schema/from-archetype.d.ts +14 -0
  190. package/dist/schema/from-archetype.js +9 -0
  191. package/dist/schema/from-archetype.js.map +1 -0
  192. package/dist/schema/from-components.d.ts +14 -0
  193. package/dist/schema/from-components.js +9 -0
  194. package/dist/schema/from-components.js.map +1 -0
  195. package/dist/schema/from-components.test.d.ts +1 -0
  196. package/dist/schema/from-components.test.js +49 -0
  197. package/dist/schema/from-components.test.js.map +1 -0
  198. package/dist/schema/from-components.type-test.d.ts +1 -0
  199. package/dist/schema/from-components.type-test.js +40 -0
  200. package/dist/schema/from-components.type-test.js.map +1 -0
  201. package/dist/schema/public.d.ts +2 -0
  202. package/dist/schema/public.js +2 -0
  203. package/dist/schema/public.js.map +1 -1
  204. package/dist/schema/to-type.d.ts +2 -0
  205. package/dist/schema/to-type.js.map +1 -1
  206. package/dist/table/copy-column-to-gpu-buffer.js +10 -2
  207. package/dist/table/copy-column-to-gpu-buffer.js.map +1 -1
  208. package/dist/tsconfig.tsbuildinfo +1 -1
  209. package/dist/typed-buffer/create-boolean-buffer.d.ts +6 -0
  210. package/dist/typed-buffer/create-boolean-buffer.js +83 -0
  211. package/dist/typed-buffer/create-boolean-buffer.js.map +1 -0
  212. package/dist/typed-buffer/create-boolean-buffer.test.d.ts +1 -0
  213. package/dist/typed-buffer/create-boolean-buffer.test.js +159 -0
  214. package/dist/typed-buffer/create-boolean-buffer.test.js.map +1 -0
  215. package/dist/typed-buffer/create-typed-buffer.js +4 -0
  216. package/dist/typed-buffer/create-typed-buffer.js.map +1 -1
  217. package/dist/typed-buffer/index.d.ts +1 -0
  218. package/dist/typed-buffer/index.js +1 -0
  219. package/dist/typed-buffer/index.js.map +1 -1
  220. package/dist/typed-buffer/register-typed-buffer-codecs.js +20 -2
  221. package/dist/typed-buffer/register-typed-buffer-codecs.js.map +1 -1
  222. package/dist/typed-buffer/typed-buffer.d.ts +4 -1
  223. package/dist/typed-buffer/typed-buffer.js +1 -0
  224. package/dist/typed-buffer/typed-buffer.js.map +1 -1
  225. package/dist/types/volume/axis-line-callback.d.ts +14 -0
  226. package/dist/types/volume/axis-line-callback.js +3 -0
  227. package/dist/types/volume/axis-line-callback.js.map +1 -0
  228. package/dist/types/volume/block-callback.d.ts +9 -0
  229. package/dist/types/volume/block-callback.js +3 -0
  230. package/dist/types/volume/block-callback.js.map +1 -0
  231. package/dist/types/volume/block-span.d.ts +9 -0
  232. package/dist/types/volume/block-span.js +3 -0
  233. package/dist/types/volume/block-span.js.map +1 -0
  234. package/dist/types/volume/create-dense/create-dense.d.ts +6 -0
  235. package/dist/types/volume/create-dense/create-dense.js +9 -0
  236. package/dist/types/volume/create-dense/create-dense.js.map +1 -0
  237. package/dist/types/volume/create-dense/create-dense.test.d.ts +1 -0
  238. package/dist/types/volume/create-dense/create-dense.test.js +121 -0
  239. package/dist/types/volume/create-dense/create-dense.test.js.map +1 -0
  240. package/dist/types/volume/create-dense/dense-volume.d.ts +17 -0
  241. package/dist/types/volume/create-dense/dense-volume.js +51 -0
  242. package/dist/types/volume/create-dense/dense-volume.js.map +1 -0
  243. package/dist/types/volume/create-dense/is-dense-volume.d.ts +2 -0
  244. package/dist/types/volume/create-dense/is-dense-volume.js +4 -0
  245. package/dist/types/volume/create-dense/is-dense-volume.js.map +1 -0
  246. package/dist/types/volume/create-dense/register-dense-volume-codecs.d.ts +1 -0
  247. package/dist/types/volume/create-dense/register-dense-volume-codecs.js +33 -0
  248. package/dist/types/volume/create-dense/register-dense-volume-codecs.js.map +1 -0
  249. package/dist/types/volume/create-sparse-block/block-dims.d.ts +35 -0
  250. package/dist/types/volume/create-sparse-block/block-dims.js +93 -0
  251. package/dist/types/volume/create-sparse-block/block-dims.js.map +1 -0
  252. package/dist/types/volume/create-sparse-block/block-key.d.ts +9 -0
  253. package/dist/types/volume/create-sparse-block/block-key.js +23 -0
  254. package/dist/types/volume/create-sparse-block/block-key.js.map +1 -0
  255. package/dist/types/volume/create-sparse-block/create-sparse-block.d.ts +6 -0
  256. package/dist/types/volume/create-sparse-block/create-sparse-block.js +9 -0
  257. package/dist/types/volume/create-sparse-block/create-sparse-block.js.map +1 -0
  258. package/dist/types/volume/create-sparse-block/create-sparse-block.test.d.ts +1 -0
  259. package/dist/types/volume/create-sparse-block/create-sparse-block.test.js +287 -0
  260. package/dist/types/volume/create-sparse-block/create-sparse-block.test.js.map +1 -0
  261. package/dist/types/volume/create-sparse-block/is-sparse-block-volume.d.ts +2 -0
  262. package/dist/types/volume/create-sparse-block/is-sparse-block-volume.js +4 -0
  263. package/dist/types/volume/create-sparse-block/is-sparse-block-volume.js.map +1 -0
  264. package/dist/types/volume/create-sparse-block/iterate-sparse-block-axis.d.ts +19 -0
  265. package/dist/types/volume/create-sparse-block/iterate-sparse-block-axis.js +160 -0
  266. package/dist/types/volume/create-sparse-block/iterate-sparse-block-axis.js.map +1 -0
  267. package/dist/types/volume/create-sparse-block/pack-block-key.d.ts +1 -0
  268. package/dist/types/volume/create-sparse-block/pack-block-key.js +3 -0
  269. package/dist/types/volume/create-sparse-block/pack-block-key.js.map +1 -0
  270. package/dist/types/volume/create-sparse-block/register-sparse-block-volume-codecs.d.ts +1 -0
  271. package/dist/types/volume/create-sparse-block/register-sparse-block-volume-codecs.js +37 -0
  272. package/dist/types/volume/create-sparse-block/register-sparse-block-volume-codecs.js.map +1 -0
  273. package/dist/types/volume/create-sparse-block/sparse-block-volume.d.ts +29 -0
  274. package/dist/types/volume/create-sparse-block/sparse-block-volume.js +133 -0
  275. package/dist/types/volume/create-sparse-block/sparse-block-volume.js.map +1 -0
  276. package/dist/types/volume/create-sparse-block/unpack-block-key.d.ts +5 -0
  277. package/dist/types/volume/create-sparse-block/unpack-block-key.js +7 -0
  278. package/dist/types/volume/create-sparse-block/unpack-block-key.js.map +1 -0
  279. package/dist/types/volume/get-dense-index.d.ts +2 -0
  280. package/dist/types/volume/get-dense-index.js +6 -0
  281. package/dist/types/volume/get-dense-index.js.map +1 -0
  282. package/dist/types/volume/get-dense-index.test.d.ts +1 -0
  283. package/dist/types/volume/get-dense-index.test.js +17 -0
  284. package/dist/types/volume/get-dense-index.test.js.map +1 -0
  285. package/dist/types/volume/is-in-bounds.d.ts +2 -0
  286. package/dist/types/volume/is-in-bounds.js +6 -0
  287. package/dist/types/volume/is-in-bounds.js.map +1 -0
  288. package/dist/types/volume/is-in-bounds.test.d.ts +1 -0
  289. package/dist/types/volume/is-in-bounds.test.js +12 -0
  290. package/dist/types/volume/is-in-bounds.test.js.map +1 -0
  291. package/dist/types/volume/iterate-axis.d.ts +7 -0
  292. package/dist/types/volume/iterate-axis.js +58 -0
  293. package/dist/types/volume/iterate-axis.js.map +1 -0
  294. package/dist/types/volume/iterate-sparse-block-axis.test.d.ts +1 -0
  295. package/dist/types/volume/iterate-sparse-block-axis.test.js +11 -0
  296. package/dist/types/volume/iterate-sparse-block-axis.test.js.map +1 -0
  297. package/dist/types/volume/iterate-sparse-block.benchmark.test.d.ts +1 -0
  298. package/dist/types/volume/iterate-sparse-block.benchmark.test.js +80 -0
  299. package/dist/types/volume/iterate-sparse-block.benchmark.test.js.map +1 -0
  300. package/dist/types/volume/iterate-test-helpers.d.ts +14 -0
  301. package/dist/types/volume/iterate-test-helpers.js +41 -0
  302. package/dist/types/volume/iterate-test-helpers.js.map +1 -0
  303. package/dist/types/volume/public.d.ts +7 -0
  304. package/dist/types/volume/public.js +6 -0
  305. package/dist/types/volume/public.js.map +1 -0
  306. package/dist/types/volume/sparse-block-iterate-benchmark.d.ts +49 -0
  307. package/dist/types/volume/sparse-block-iterate-benchmark.js +131 -0
  308. package/dist/types/volume/sparse-block-iterate-benchmark.js.map +1 -0
  309. package/dist/types/volume/volume.d.ts +13 -0
  310. package/dist/types/volume/volume.js +3 -0
  311. package/dist/types/volume/volume.js.map +1 -0
  312. package/package.json +1 -1
  313. package/references/data-lit/package.json +1 -1
  314. package/references/data-lit-tictactoe/package.json +1 -1
  315. package/references/data-react/package.json +1 -1
  316. package/references/data-react-hello/package.json +1 -1
  317. package/references/data-react-pixie/package.json +1 -1
@@ -0,0 +1,133 @@
1
+ // © 2026 Adobe. MIT License. See /LICENSE for details.
2
+ import { packBlockKeyInline } from "./block-key.js";
3
+ import { createBlockDims, normalizeBlockSize } from "./block-dims.js";
4
+ import { buildSparseBlockAxisPlan, runSparseBlockAxisPlan, } from "./iterate-sparse-block-axis.js";
5
+ const defaultFromSchema = (schema) => {
6
+ if (!("default" in schema)) {
7
+ throw new Error("SparseBlockVolume schema must include a default value");
8
+ }
9
+ return schema.default;
10
+ };
11
+ export class SparseBlockVolume {
12
+ #dims;
13
+ #data;
14
+ #blocks = new Map();
15
+ #defaultValue;
16
+ #keyFromWorld;
17
+ #indexFromWorld;
18
+ #volume;
19
+ #size = [0, 0, 0];
20
+ #axisPlans;
21
+ constructor(blockSize, data) {
22
+ this.#dims = createBlockDims(blockSize);
23
+ this.blockSize = this.#dims.size;
24
+ this.#data = data;
25
+ this.#defaultValue = defaultFromSchema(data.schema);
26
+ this.#keyFromWorld = this.#dims.keyFromWorld;
27
+ this.#indexFromWorld = this.#dims.indexFromWorld;
28
+ this.#volume = this.#dims.volume;
29
+ }
30
+ get dims() {
31
+ return this.#dims;
32
+ }
33
+ get size() {
34
+ return this.#size;
35
+ }
36
+ toSerialized() {
37
+ return {
38
+ blockSize: this.blockSize,
39
+ size: this.#size,
40
+ blocks: [...this.#blocks.entries()],
41
+ data: this.#data,
42
+ };
43
+ }
44
+ static fromSerialized(blockSize, data, size, blocks) {
45
+ const volume = new SparseBlockVolume(normalizeBlockSize(blockSize), data);
46
+ volume.#size = size;
47
+ for (const [key, offset] of blocks) {
48
+ volume.#blocks.set(key, offset);
49
+ }
50
+ volume.#axisPlans = undefined;
51
+ return volume;
52
+ }
53
+ get(x, y, z) {
54
+ const offset = this.#blocks.get(this.#keyFromWorld(x, y, z));
55
+ if (offset === undefined) {
56
+ return this.#defaultValue;
57
+ }
58
+ return this.#data.get(this.#indexFromWorld(x, y, z, offset));
59
+ }
60
+ set(x, y, z, value) {
61
+ const offset = this.#ensureBlock(x, y, z);
62
+ this.#data.set(this.#indexFromWorld(x, y, z, offset), value);
63
+ this.#expandSize(x, y, z);
64
+ }
65
+ iterateX(callback) {
66
+ this.#iterateAxis("x", callback);
67
+ }
68
+ iterateY(callback) {
69
+ this.#iterateAxis("y", callback);
70
+ }
71
+ iterateZ(callback) {
72
+ this.#iterateAxis("z", callback);
73
+ }
74
+ iterateBlocks(callback) {
75
+ const entries = [...this.#blocks.entries()].sort((a, b) => a[0] - b[0]);
76
+ const last = entries.length - 1;
77
+ const { shiftX, shiftY, shiftZ, decodeKey } = this.#dims;
78
+ for (let i = 0; i < entries.length; i++) {
79
+ const [key, offset] = entries[i];
80
+ const [bx, by, bz] = decodeKey(key);
81
+ callback(this.#data, {
82
+ origin: [bx << shiftX, by << shiftY, bz << shiftZ],
83
+ size: this.blockSize,
84
+ offset,
85
+ }, i === last);
86
+ }
87
+ }
88
+ #iterateAxis(axis, callback) {
89
+ let plan = this.#axisPlans?.[axis];
90
+ if (plan === undefined) {
91
+ plan = buildSparseBlockAxisPlan(this.#blocks, this.#dims, axis);
92
+ if (plan === undefined) {
93
+ return;
94
+ }
95
+ if (this.#axisPlans === undefined) {
96
+ this.#axisPlans = {};
97
+ }
98
+ this.#axisPlans[axis] = plan;
99
+ }
100
+ runSparseBlockAxisPlan(plan, this.#data, callback);
101
+ }
102
+ #invalidateAxisPlans() {
103
+ this.#axisPlans = undefined;
104
+ }
105
+ #ensureBlock(x, y, z) {
106
+ const key = this.#keyFromWorld(x, y, z);
107
+ let offset = this.#blocks.get(key);
108
+ if (offset === undefined) {
109
+ offset = this.#data.capacity;
110
+ this.#data.capacity = offset + this.#volume;
111
+ for (let i = 0; i < this.#volume; i++) {
112
+ this.#data.set(offset + i, this.#defaultValue);
113
+ }
114
+ this.#blocks.set(key, offset);
115
+ this.#invalidateAxisPlans();
116
+ }
117
+ return offset;
118
+ }
119
+ #expandSize(x, y, z) {
120
+ if (x >= 0) {
121
+ this.#size = [Math.max(this.#size[0], x + 1), this.#size[1], this.#size[2]];
122
+ }
123
+ if (y >= 0) {
124
+ this.#size = [this.#size[0], Math.max(this.#size[1], y + 1), this.#size[2]];
125
+ }
126
+ if (z >= 0) {
127
+ this.#size = [this.#size[0], this.#size[1], Math.max(this.#size[2], z + 1)];
128
+ }
129
+ }
130
+ }
131
+ /** Used when allocating blocks by unpacked coordinates (tests/serialization). */
132
+ export const packBlockKey = packBlockKeyInline;
133
+ //# sourceMappingURL=sparse-block-volume.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sparse-block-volume.js","sourceRoot":"","sources":["../../../../src/types/volume/create-sparse-block/sparse-block-volume.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare const unpackBlockKey: (key: number) => {
2
+ readonly bx: number;
3
+ readonly by: number;
4
+ readonly bz: number;
5
+ };
@@ -0,0 +1,7 @@
1
+ // © 2026 Adobe. MIT License. See /LICENSE for details.
2
+ import { decodeBlockKeyInline } from "./block-key.js";
3
+ export const unpackBlockKey = (key) => {
4
+ const [bx, by, bz] = decodeBlockKeyInline(key);
5
+ return { bx, by, bz };
6
+ };
7
+ //# sourceMappingURL=unpack-block-key.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unpack-block-key.js","sourceRoot":"","sources":["../../../../src/types/volume/create-sparse-block/unpack-block-key.ts"],"names":[],"mappings":"AAAA,uDAAuD;AAEvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAEtD,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,GAAW,EAAqE,EAAE;IAC7G,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC;IAC/C,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;AAC1B,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { Vec3 } from "../../math/index.js";
2
+ export declare const getDenseIndex: (size: Vec3, x: number, y: number, z: number) => number;
@@ -0,0 +1,6 @@
1
+ // © 2026 Adobe. MIT License. See /LICENSE for details.
2
+ export const getDenseIndex = (size, x, y, z) => {
3
+ const [width, height] = size;
4
+ return x + width * (y + z * height);
5
+ };
6
+ //# sourceMappingURL=get-dense-index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-dense-index.js","sourceRoot":"","sources":["../../../src/types/volume/get-dense-index.ts"],"names":[],"mappings":"AAAA,uDAAuD;AAIvD,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,IAAU,EAAE,CAAS,EAAE,CAAS,EAAE,CAAS,EAAU,EAAE;IACjF,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IAC7B,OAAO,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC;AACxC,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,17 @@
1
+ // © 2026 Adobe. MIT License. See /LICENSE for details.
2
+ import { describe, expect, it } from "vitest";
3
+ import { getDenseIndex } from "./get-dense-index.js";
4
+ describe("getDenseIndex", () => {
5
+ it("maps coordinates to row-major dense indices", () => {
6
+ const size = [3, 2, 2];
7
+ expect(getDenseIndex(size, 0, 0, 0)).toBe(0);
8
+ expect(getDenseIndex(size, 2, 0, 0)).toBe(2);
9
+ expect(getDenseIndex(size, 0, 1, 0)).toBe(3);
10
+ expect(getDenseIndex(size, 1, 0, 1)).toBe(7);
11
+ });
12
+ it("matches standard layout for non-cubic block sizes", () => {
13
+ const size = [8, 4, 4];
14
+ expect(getDenseIndex(size, 1, 2, 3)).toBe(1 + 8 * (2 + 4 * 3));
15
+ });
16
+ });
17
+ //# sourceMappingURL=get-dense-index.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-dense-index.test.js","sourceRoot":"","sources":["../../../src/types/volume/get-dense-index.test.ts"],"names":[],"mappings":"AAAA,uDAAuD;AAEvD,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC3B,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACnD,MAAM,IAAI,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAU,CAAC;QAChC,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC7C,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC7C,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC7C,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QACzD,MAAM,IAAI,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAU,CAAC;QAChC,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { Vec3 } from "../../math/index.js";
2
+ export declare const isInBounds: (size: Vec3, x: number, y: number, z: number) => boolean;
@@ -0,0 +1,6 @@
1
+ // © 2026 Adobe. MIT License. See /LICENSE for details.
2
+ export const isInBounds = (size, x, y, z) => {
3
+ const [width, height, depth] = size;
4
+ return x >= 0 && x < width && y >= 0 && y < height && z >= 0 && z < depth;
5
+ };
6
+ //# sourceMappingURL=is-in-bounds.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"is-in-bounds.js","sourceRoot":"","sources":["../../../src/types/volume/is-in-bounds.ts"],"names":[],"mappings":"AAAA,uDAAuD;AAIvD,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,IAAU,EAAE,CAAS,EAAE,CAAS,EAAE,CAAS,EAAW,EAAE;IAC/E,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG,IAAI,CAAC;IACpC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;AAC9E,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,12 @@
1
+ // © 2026 Adobe. MIT License. See /LICENSE for details.
2
+ import { describe, expect, it } from "vitest";
3
+ import { isInBounds } from "./is-in-bounds.js";
4
+ describe("isInBounds", () => {
5
+ it("checks bounds", () => {
6
+ const size = [2, 2, 2];
7
+ expect(isInBounds(size, 0, 0, 0)).toBe(true);
8
+ expect(isInBounds(size, 2, 0, 0)).toBe(false);
9
+ expect(isInBounds(size, -1, 0, 0)).toBe(false);
10
+ });
11
+ });
12
+ //# sourceMappingURL=is-in-bounds.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"is-in-bounds.test.js","sourceRoot":"","sources":["../../../src/types/volume/is-in-bounds.test.ts"],"names":[],"mappings":"AAAA,uDAAuD;AAEvD,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IACxB,EAAE,CAAC,eAAe,EAAE,GAAG,EAAE;QACrB,MAAM,IAAI,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAU,CAAC;QAChC,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7C,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9C,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { Vec3 } from "../../math/index.js";
2
+ import type { TypedBuffer } from "../../typed-buffer/typed-buffer.js";
3
+ import type { AxisLineCallback } from "./axis-line-callback.js";
4
+ export { iterateSparseBlockAxis, buildSparseBlockAxisPlan, runSparseBlockAxisPlan, type SparseBlockAxisPlan, } from "./create-sparse-block/iterate-sparse-block-axis.js";
5
+ export type { BlockDims } from "./create-sparse-block/block-dims.js";
6
+ export type IterateAxis = "x" | "y" | "z";
7
+ export declare const iterateDenseAxis: <T>(size: Vec3, data: TypedBuffer<T>, callback: AxisLineCallback<T>, axis: IterateAxis) => void;
@@ -0,0 +1,58 @@
1
+ // © 2026 Adobe. MIT License. See /LICENSE for details.
2
+ import { getDenseIndex } from "./get-dense-index.js";
3
+ export { iterateSparseBlockAxis, buildSparseBlockAxisPlan, runSparseBlockAxisPlan, } from "./create-sparse-block/iterate-sparse-block-axis.js";
4
+ const denseAxisSpecs = {
5
+ x: (size) => {
6
+ const [width, height, depth] = size;
7
+ return {
8
+ length: width,
9
+ step: 1,
10
+ outer: [depth, height],
11
+ segmentStart: (s, y, z) => getDenseIndex(s, 0, y, z),
12
+ origin: (y, z) => [0, y, z],
13
+ isLast: (y, z, lastY, lastZ) => y === lastY && z === lastZ,
14
+ };
15
+ },
16
+ y: (size) => {
17
+ const [width, height, depth] = size;
18
+ return {
19
+ length: height,
20
+ step: width,
21
+ outer: [depth, width],
22
+ segmentStart: (s, x, z) => getDenseIndex(s, x, 0, z),
23
+ origin: (x, z) => [x, 0, z],
24
+ isLast: (x, z, lastX, lastZ) => x === lastX && z === lastZ,
25
+ };
26
+ },
27
+ z: (size) => {
28
+ const [width, height, depth] = size;
29
+ const plane = width * height;
30
+ return {
31
+ length: depth,
32
+ step: plane,
33
+ outer: [height, width],
34
+ segmentStart: (s, x, y) => getDenseIndex(s, x, y, 0),
35
+ origin: (x, y) => [x, y, 0],
36
+ isLast: (x, y, lastX, lastY) => x === lastX && y === lastY,
37
+ };
38
+ },
39
+ };
40
+ export const iterateDenseAxis = (size, data, callback, axis) => {
41
+ const [width, height, depth] = size;
42
+ if (width === 0 || height === 0 || depth === 0) {
43
+ return;
44
+ }
45
+ const spec = denseAxisSpecs[axis](size);
46
+ const [outerCount, innerCount] = spec.outer;
47
+ const segments = [0, spec.length];
48
+ const lastOuter = outerCount - 1;
49
+ const lastInner = innerCount - 1;
50
+ for (let outer = 0; outer < outerCount; outer++) {
51
+ for (let inner = 0; inner < innerCount; inner++) {
52
+ segments[0] = spec.segmentStart(size, inner, outer);
53
+ const [x, y, z] = spec.origin(inner, outer);
54
+ callback(data, segments, spec.step, x, y, z, spec.isLast(inner, outer, lastInner, lastOuter));
55
+ }
56
+ }
57
+ };
58
+ //# sourceMappingURL=iterate-axis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iterate-axis.js","sourceRoot":"","sources":["../../../src/types/volume/iterate-axis.ts"],"names":[],"mappings":"AAAA,uDAAuD;AAKvD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EACH,sBAAsB,EACtB,wBAAwB,EACxB,sBAAsB,GAEzB,MAAM,oDAAoD,CAAC;AAc5D,MAAM,cAAc,GAAuD;IACvE,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE;QACR,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG,IAAI,CAAC;QACpC,OAAO;YACH,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,CAAC;YACP,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,CAAU;YAC/B,YAAY,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YACpD,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAU;YACpC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,KAAK;SAC7D,CAAC;IACN,CAAC;IACD,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE;QACR,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG,IAAI,CAAC;QACpC,OAAO;YACH,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,KAAK;YACX,KAAK,EAAE,CAAC,KAAK,EAAE,KAAK,CAAU;YAC9B,YAAY,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YACpD,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAU;YACpC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,KAAK;SAC7D,CAAC;IACN,CAAC;IACD,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE;QACR,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG,IAAI,CAAC;QACpC,MAAM,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC;QAC7B,OAAO;YACH,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,KAAK;YACX,KAAK,EAAE,CAAC,MAAM,EAAE,KAAK,CAAU;YAC/B,YAAY,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YACpD,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAU;YACpC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,KAAK;SAC7D,CAAC;IACN,CAAC;CACJ,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC5B,IAAU,EACV,IAAoB,EACpB,QAA6B,EAC7B,IAAiB,EACb,EAAE;IACN,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG,IAAI,CAAC;IACpC,IAAI,KAAK,KAAK,CAAC,IAAI,MAAM,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;QAC7C,OAAO;IACX,CAAC;IAED,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC;IAC5C,MAAM,QAAQ,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAClC,MAAM,SAAS,GAAG,UAAU,GAAG,CAAC,CAAC;IACjC,MAAM,SAAS,GAAG,UAAU,GAAG,CAAC,CAAC;IAEjC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,UAAU,EAAE,KAAK,EAAE,EAAE,CAAC;QAC9C,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,UAAU,EAAE,KAAK,EAAE,EAAE,CAAC;YAC9C,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;YACpD,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAC5C,QAAQ,CACJ,IAAI,EACJ,QAAQ,EACR,IAAI,CAAC,IAAI,EACT,CAAC,EACD,CAAC,EACD,CAAC,EACD,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC,CAClD,CAAC;QACN,CAAC;IACL,CAAC;AACL,CAAC,CAAC"}
@@ -0,0 +1,11 @@
1
+ // © 2026 Adobe. MIT License. See /LICENSE for details.
2
+ import { describe, expect, it } from "vitest";
3
+ import { packPlaneKey } from "./create-sparse-block/pack-block-key.js";
4
+ describe("packPlaneKey", () => {
5
+ it("round-trips two slice coordinates in sort order", () => {
6
+ const a = packPlaneKey(-1, 2);
7
+ const b = packPlaneKey(-1, 3);
8
+ expect(a).toBeLessThan(b);
9
+ });
10
+ });
11
+ //# sourceMappingURL=iterate-sparse-block-axis.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iterate-sparse-block-axis.test.js","sourceRoot":"","sources":["../../../src/types/volume/iterate-sparse-block-axis.test.ts"],"names":[],"mappings":"AAAA,uDAAuD;AAEvD,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,yCAAyC,CAAC;AAEvE,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC1B,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACvD,MAAM,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC9B,MAAM,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC9B,MAAM,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
@@ -0,0 +1,80 @@
1
+ // © 2026 Adobe. MIT License. See /LICENSE for details.
2
+ import { describe, it } from "vitest";
3
+ import { buildSparseBlockIterateScene, formatSparseBlockIterateBenchmark, measureIterateOnce, runSparseBlockIterateBenchmark, } from "./sparse-block-iterate-benchmark.js";
4
+ // Informational only — logs throughput for manual/regression review, never fails CI.
5
+ // pnpm test -- src/types/volume/iterate-sparse-block.benchmark.test.ts
6
+ const BLOCK_SIZE = 16;
7
+ const AXES = ["x", "y", "z"];
8
+ const LAYOUTS = ["adjacent", "fragmented"];
9
+ describe("sparse block iterate benchmarks", () => {
10
+ it.each(AXES)("merge stats adjacent vs fragmented (%s)", (axis) => {
11
+ const adjacent = buildSparseBlockIterateScene({
12
+ layout: "adjacent",
13
+ blocks: 32,
14
+ blockSize: BLOCK_SIZE,
15
+ axis,
16
+ });
17
+ const fragmented = buildSparseBlockIterateScene({
18
+ layout: "fragmented",
19
+ blocks: 32,
20
+ blockSize: BLOCK_SIZE,
21
+ axis,
22
+ });
23
+ const adj = measureIterateOnce(adjacent, axis);
24
+ const frag = measureIterateOnce(fragmented, axis);
25
+ // eslint-disable-next-line no-console
26
+ console.log(`\n${axis} merge stats · adjacent ${adj.callbacks} callbacks / ${adj.segmentPairs} pairs`
27
+ + ` · fragmented ${frag.callbacks} callbacks / ${frag.segmentPairs} pairs`
28
+ + ` · ${adj.voxelsAlongAxis} voxels each\n`);
29
+ });
30
+ it.each(AXES)("throughput adjacent vs fragmented on %s", (axis) => {
31
+ const scene = {
32
+ blocks: 64,
33
+ blockSize: BLOCK_SIZE,
34
+ axis,
35
+ };
36
+ const adjacent = buildSparseBlockIterateScene({ ...scene, layout: "adjacent" });
37
+ const fragmented = buildSparseBlockIterateScene({ ...scene, layout: "fragmented" });
38
+ const adjacentResult = runSparseBlockIterateBenchmark(adjacent, { ...scene, layout: "adjacent" }, {
39
+ warmupIterations: 100,
40
+ timedIterations: 600,
41
+ });
42
+ const fragmentedResult = runSparseBlockIterateBenchmark(fragmented, { ...scene, layout: "fragmented" }, {
43
+ warmupIterations: 100,
44
+ timedIterations: 600,
45
+ });
46
+ // eslint-disable-next-line no-console
47
+ console.log(`\n${axis} throughput (${BLOCK_SIZE}³ blocks)\n`
48
+ + `${formatSparseBlockIterateBenchmark(adjacentResult)}\n\n`
49
+ + `${formatSparseBlockIterateBenchmark(fragmentedResult)}\n`);
50
+ }, 60_000);
51
+ it("reports iterateX/Y/Z throughput for adjacent and fragmented layouts", () => {
52
+ const scenes = AXES.flatMap(axis => LAYOUTS.map(layout => ({ layout, blocks: 64, axis })));
53
+ const lines = [];
54
+ for (const scene of scenes) {
55
+ const volume = buildSparseBlockIterateScene({ ...scene, blockSize: BLOCK_SIZE });
56
+ const result = runSparseBlockIterateBenchmark(volume, scene, {
57
+ warmupIterations: 60,
58
+ timedIterations: 300,
59
+ });
60
+ lines.push(formatSparseBlockIterateBenchmark(result));
61
+ }
62
+ // eslint-disable-next-line no-console
63
+ console.log(`\nsparse block iterate (${BLOCK_SIZE}³ blocks)\n${lines.join("\n\n")}\n`);
64
+ }, 60_000);
65
+ it.each([
66
+ { label: "16³", blockSize: [16, 16, 16] },
67
+ { label: "32×16×8", blockSize: [32, 16, 8] },
68
+ ])("reports adjacent throughput for non-cubic $label", ({ blockSize, label }) => {
69
+ const blocks = 64;
70
+ const layout = "adjacent";
71
+ const lines = [];
72
+ for (const axis of AXES) {
73
+ const volume = buildSparseBlockIterateScene({ blockSize, layout, blocks, axis });
74
+ lines.push(formatSparseBlockIterateBenchmark(runSparseBlockIterateBenchmark(volume, { blockSize, layout, blocks, axis }, { warmupIterations: 80, timedIterations: 400 })));
75
+ }
76
+ // eslint-disable-next-line no-console
77
+ console.log(`\nsparse block iterate (${label}, 64 adjacent blocks)\n${lines.join("\n\n")}\n`);
78
+ }, 120_000);
79
+ });
80
+ //# sourceMappingURL=iterate-sparse-block.benchmark.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iterate-sparse-block.benchmark.test.js","sourceRoot":"","sources":["../../../src/types/volume/iterate-sparse-block.benchmark.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { TypedBuffer } from "../../typed-buffer/index.js";
2
+ import type { IterateAxis } from "./iterate-axis.js";
3
+ import type { Volume } from "./volume.js";
4
+ export interface SegmentRow {
5
+ readonly x: number;
6
+ readonly y: number;
7
+ readonly z: number;
8
+ readonly values: boolean[];
9
+ readonly step: number;
10
+ readonly pairCount: number;
11
+ readonly done: boolean;
12
+ }
13
+ export declare const readAllSegmentValues: <T>(buffer: TypedBuffer<T>, segments: readonly number[], step: number) => T[];
14
+ export declare const collectAxisSegments: <T>(volume: Volume<T>, axis: IterateAxis) => SegmentRow[];
@@ -0,0 +1,41 @@
1
+ // © 2026 Adobe. MIT License. See /LICENSE for details.
2
+ import { expect } from "vitest";
3
+ export const readAllSegmentValues = (buffer, segments, step) => {
4
+ const values = [];
5
+ for (let i = 0; i < segments.length; i += 2) {
6
+ const offset = segments[i];
7
+ const length = segments[i + 1];
8
+ for (let j = 0; j < length; j++) {
9
+ values.push(buffer.get(offset + j * step));
10
+ }
11
+ }
12
+ return values;
13
+ };
14
+ export const collectAxisSegments = (volume, axis) => {
15
+ const iterate = axis === "x" ? volume.iterateX.bind(volume)
16
+ : axis === "y" ? volume.iterateY.bind(volume)
17
+ : volume.iterateZ.bind(volume);
18
+ const rows = [];
19
+ let segmentsRef;
20
+ iterate((buffer, segments, step, x, y, z, done) => {
21
+ if (segmentsRef === undefined) {
22
+ segmentsRef = segments;
23
+ }
24
+ else {
25
+ expect(segments).toBe(segmentsRef);
26
+ }
27
+ expect(segments.length % 2).toBe(0);
28
+ expect(segments.length).toBeGreaterThan(0);
29
+ rows.push({
30
+ x,
31
+ y,
32
+ z,
33
+ values: readAllSegmentValues(buffer, segments, step),
34
+ step,
35
+ pairCount: segments.length / 2,
36
+ done,
37
+ });
38
+ });
39
+ return rows;
40
+ };
41
+ //# sourceMappingURL=iterate-test-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iterate-test-helpers.js","sourceRoot":"","sources":["../../../src/types/volume/iterate-test-helpers.ts"],"names":[],"mappings":"AAAA,uDAAuD;AAEvD,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAehC,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAChC,MAAsB,EACtB,QAA2B,EAC3B,IAAY,EACT,EAAE;IACL,MAAM,MAAM,GAAQ,EAAE,CAAC;IACvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1C,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC;QAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC9B,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;QAC/C,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC;AAClB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAC/B,MAAiB,EACjB,IAAiB,EACL,EAAE;IACd,MAAM,OAAO,GAAG,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;QACvD,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;YACzC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAEvC,MAAM,IAAI,GAAiB,EAAE,CAAC;IAC9B,IAAI,WAAiC,CAAC;IAEtC,OAAO,CAAC,CAAC,MAAsB,EAAE,QAAkB,EAAE,IAAY,EAAE,CAAS,EAAE,CAAS,EAAE,CAAS,EAAE,IAAa,EAAE,EAAE;QACjH,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YAC5B,WAAW,GAAG,QAAQ,CAAC;QAC3B,CAAC;aAAM,CAAC;YACJ,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACvC,CAAC;QACD,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAE3C,IAAI,CAAC,IAAI,CAAC;YACN,CAAC;YACD,CAAC;YACD,CAAC;YACD,MAAM,EAAE,oBAAoB,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAc;YACjE,IAAI;YACJ,SAAS,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC;YAC9B,IAAI;SACP,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,OAAO,IAAI,CAAC;AAChB,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ export { createDense } from "./create-dense/create-dense.js";
2
+ export { createSparseBlock } from "./create-sparse-block/create-sparse-block.js";
3
+ export type { AxisLineCallback } from "./axis-line-callback.js";
4
+ export type { BlockCallback } from "./block-callback.js";
5
+ export type { BlockSpan } from "./block-span.js";
6
+ export { getDenseIndex } from "./get-dense-index.js";
7
+ export { isInBounds } from "./is-in-bounds.js";
@@ -0,0 +1,6 @@
1
+ // © 2026 Adobe. MIT License. See /LICENSE for details.
2
+ export { createDense } from "./create-dense/create-dense.js";
3
+ export { createSparseBlock } from "./create-sparse-block/create-sparse-block.js";
4
+ export { getDenseIndex } from "./get-dense-index.js";
5
+ export { isInBounds } from "./is-in-bounds.js";
6
+ //# sourceMappingURL=public.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"public.js","sourceRoot":"","sources":["../../../src/types/volume/public.ts"],"names":[],"mappings":"AAAA,uDAAuD;AAEvD,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,8CAA8C,CAAC;AAIjF,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,49 @@
1
+ import type { Vec3 } from "../../math/index.js";
2
+ import type { AxisLineCallback } from "./axis-line-callback.js";
3
+ import type { IterateAxis } from "./iterate-axis.js";
4
+ import type { Volume } from "./volume.js";
5
+ export type SparseBlockIterateLayout = "adjacent" | "fragmented" | "scattered";
6
+ export interface SparseBlockIterateSceneOptions {
7
+ readonly layout: SparseBlockIterateLayout;
8
+ /** Blocks to allocate (along the axis for adjacent/fragmented). */
9
+ readonly blocks: number;
10
+ readonly blockSize?: number | Vec3;
11
+ readonly axis?: IterateAxis;
12
+ }
13
+ export interface IterateInvocationStats {
14
+ readonly callbacks: number;
15
+ readonly segmentPairs: number;
16
+ readonly voxelsAlongAxis: number;
17
+ }
18
+ interface MutableIterateInvocationStats {
19
+ callbacks: number;
20
+ segmentPairs: number;
21
+ voxelsAlongAxis: number;
22
+ }
23
+ export interface SparseBlockIterateBenchmarkOptions {
24
+ readonly axis?: IterateAxis;
25
+ readonly warmupIterations?: number;
26
+ readonly timedIterations?: number;
27
+ }
28
+ export interface SparseBlockIterateBenchmarkResult extends IterateInvocationStats {
29
+ readonly axis: IterateAxis;
30
+ readonly blockCount: number;
31
+ readonly blockSize: string;
32
+ readonly layout: SparseBlockIterateSceneOptions["layout"];
33
+ readonly warmupIterations: number;
34
+ readonly timedIterations: number;
35
+ readonly totalMs: number;
36
+ readonly msPerIteration: number;
37
+ readonly iterationsPerSecond: number;
38
+ readonly voxelsPerSecond: number;
39
+ }
40
+ export declare const createIterateStatsCollector: () => {
41
+ stats: MutableIterateInvocationStats;
42
+ readonly callback: AxisLineCallback<boolean>;
43
+ };
44
+ export declare const buildSparseBlockIterateScene: (options: SparseBlockIterateSceneOptions) => Volume<boolean>;
45
+ export declare const blockCountOf: (volume: Volume<boolean>) => number;
46
+ export declare const measureIterateOnce: (volume: Volume<boolean>, axis: IterateAxis) => IterateInvocationStats;
47
+ export declare const runSparseBlockIterateBenchmark: (volume: Volume<boolean>, scene: SparseBlockIterateSceneOptions, opts?: SparseBlockIterateBenchmarkOptions) => SparseBlockIterateBenchmarkResult;
48
+ export declare const formatSparseBlockIterateBenchmark: (result: SparseBlockIterateBenchmarkResult) => string;
49
+ export {};