@woosh/meep-engine 3.69.0 → 3.70.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 (398) hide show
  1. package/CHANGELOG.md +30 -1
  2. package/build/bundle-worker-terrain.js +1 -1
  3. package/package.json +1 -1
  4. package/src/core/bvh8/build/BVH8Converter.d.ts +16 -0
  5. package/src/core/bvh8/build/BVH8Converter.d.ts.map +1 -1
  6. package/src/core/bvh8/build/BVH8Converter.js +64 -37
  7. package/src/core/bvh8/build/bvh8_assign_slots_greedy.d.ts +25 -0
  8. package/src/core/bvh8/build/bvh8_assign_slots_greedy.d.ts.map +1 -0
  9. package/src/core/bvh8/build/bvh8_assign_slots_greedy.js +68 -0
  10. package/src/core/bvh8/build/bvh8_from_proxy.d.ts.map +1 -1
  11. package/src/core/bvh8/build/bvh8_from_proxy.js +2 -33
  12. package/src/core/bvh8/build/bvh8_node_fit_slots.d.ts +22 -0
  13. package/src/core/bvh8/build/bvh8_node_fit_slots.d.ts.map +1 -0
  14. package/src/core/bvh8/build/bvh8_node_fit_slots.js +115 -0
  15. package/src/core/bvh8/bvh8_depth.d.ts +8 -0
  16. package/src/core/bvh8/bvh8_depth.d.ts.map +1 -0
  17. package/src/core/bvh8/bvh8_depth.js +39 -0
  18. package/src/core/math/complex/complex_fft_radix2.d.ts +19 -0
  19. package/src/core/math/complex/complex_fft_radix2.d.ts.map +1 -0
  20. package/src/core/math/complex/complex_fft_radix2.js +71 -0
  21. package/src/engine/graphics3/GPUFluidSystem.d.ts +17 -4
  22. package/src/engine/graphics3/GPUFluidSystem.d.ts.map +1 -1
  23. package/src/engine/graphics3/GPUFluidSystem.js +113 -16
  24. package/src/engine/physics/cloth/playground/wind_main.js +7 -6
  25. package/src/engine/physics/cloth/wind/AbstractClothWind.d.ts +2 -2
  26. package/src/engine/physics/cloth/wind/AbstractClothWind.js +2 -2
  27. package/src/engine/physics/cloth/wind/ClothFluidWind.d.ts +3 -3
  28. package/src/engine/physics/cloth/wind/ClothFluidWind.d.ts.map +1 -1
  29. package/src/engine/physics/cloth/wind/ClothFluidWind.js +7 -9
  30. package/src/engine/physics/cloth/wind/ClothGPUFluidWind.d.ts +10 -10
  31. package/src/engine/physics/cloth/wind/ClothGPUFluidWind.d.ts.map +1 -1
  32. package/src/engine/physics/cloth/wind/ClothGPUFluidWind.js +14 -22
  33. package/src/engine/physics/fluid/FluidAtmosphere.d.ts +16 -2
  34. package/src/engine/physics/fluid/FluidAtmosphere.d.ts.map +1 -1
  35. package/src/engine/physics/fluid/FluidAtmosphere.js +17 -3
  36. package/src/engine/physics/fluid/ecs/FluidEffectorsComponentSerializationAdapter.d.ts +1 -2
  37. package/src/engine/physics/fluid/ecs/FluidEffectorsComponentSerializationAdapter.d.ts.map +1 -1
  38. package/src/engine/physics/fluid/ecs/FluidEffectorsComponentSerializationAdapter.js +1 -2
  39. package/src/engine/physics/fluid/ecs/FluidEffectorsSystem.d.ts +8 -5
  40. package/src/engine/physics/fluid/ecs/FluidEffectorsSystem.d.ts.map +1 -1
  41. package/src/engine/physics/fluid/ecs/FluidEffectorsSystem.js +60 -17
  42. package/src/engine/physics/fluid/effector/AbstractFluidEffector.d.ts +1 -1
  43. package/src/engine/physics/fluid/effector/AbstractFluidEffector.js +1 -1
  44. package/src/engine/physics/fluid/effector/GlobalFluidEffector.d.ts +33 -47
  45. package/src/engine/physics/fluid/effector/GlobalFluidEffector.d.ts.map +1 -1
  46. package/src/engine/physics/fluid/effector/GlobalFluidEffector.js +38 -176
  47. package/src/engine/physics/fluid/effector/GlobalFluidEffectorSerializationAdapter.d.ts +8 -11
  48. package/src/engine/physics/fluid/effector/GlobalFluidEffectorSerializationAdapter.d.ts.map +1 -1
  49. package/src/engine/physics/fluid/effector/GlobalFluidEffectorSerializationAdapter.js +13 -24
  50. package/src/engine/physics/fluid/effector/GlobalFluidEffectorSerializationUpgrader_0_1.d.ts +16 -0
  51. package/src/engine/physics/fluid/effector/GlobalFluidEffectorSerializationUpgrader_0_1.d.ts.map +1 -0
  52. package/src/engine/physics/fluid/effector/GlobalFluidEffectorSerializationUpgrader_0_1.js +35 -0
  53. package/src/engine/physics/fluid/fluid_apply_atmosphere.d.ts +1 -1
  54. package/src/engine/physics/fluid/fluid_apply_atmosphere.js +1 -1
  55. package/src/engine/physics/fluid/turbulence/FLUID_TURBULENCE_TILE.d.ts +28 -0
  56. package/src/engine/physics/fluid/turbulence/FLUID_TURBULENCE_TILE.d.ts.map +1 -0
  57. package/src/engine/physics/fluid/turbulence/FLUID_TURBULENCE_TILE.js +29 -0
  58. package/src/engine/physics/fluid/turbulence/fluid_atmosphere_velocity_at.d.ts +16 -0
  59. package/src/engine/physics/fluid/turbulence/fluid_atmosphere_velocity_at.d.ts.map +1 -0
  60. package/src/engine/physics/fluid/turbulence/fluid_atmosphere_velocity_at.js +49 -0
  61. package/src/engine/physics/fluid/turbulence/fluid_turbulence_inverse_tile_size.d.ts +11 -0
  62. package/src/engine/physics/fluid/turbulence/fluid_turbulence_inverse_tile_size.d.ts.map +1 -0
  63. package/src/engine/physics/fluid/turbulence/fluid_turbulence_inverse_tile_size.js +18 -0
  64. package/src/engine/physics/fluid/turbulence/fluid_turbulence_tile_data.d.ts +25 -0
  65. package/src/engine/physics/fluid/turbulence/fluid_turbulence_tile_data.d.ts.map +1 -0
  66. package/src/engine/physics/fluid/turbulence/fluid_turbulence_tile_data.js +65 -0
  67. package/src/engine/physics/fluid/turbulence/fluid_turbulence_tile_generate.d.ts +56 -0
  68. package/src/engine/physics/fluid/turbulence/fluid_turbulence_tile_generate.d.ts.map +1 -0
  69. package/src/engine/physics/fluid/turbulence/fluid_turbulence_tile_generate.js +313 -0
  70. package/src/engine/physics/fluid/turbulence/fluid_turbulence_tile_sample.d.ts +16 -0
  71. package/src/engine/physics/fluid/turbulence/fluid_turbulence_tile_sample.d.ts.map +1 -0
  72. package/src/engine/physics/fluid/turbulence/fluid_turbulence_tile_sample.js +69 -0
  73. package/src/generation/foliage/mesh/branch_ring_triangulate.d.ts +1 -1
  74. package/src/generation/foliage/mesh/branch_ring_triangulate.js +1 -1
  75. package/src/shade/playground/bvh_repro/README.md +8 -6
  76. package/src/shade/playground/bvh_repro/index.html +125 -124
  77. package/src/shade/playground/bvh_repro/main.js +259 -254
  78. package/src/shade/playground/foliage_wind/foliage_world.d.ts.map +1 -1
  79. package/src/shade/playground/foliage_wind/foliage_world.js +7 -4
  80. package/src/shade/playground/grass_surfaces/main.js +3 -2
  81. package/src/shade/playground/particle_ecs/bonfire_wind.d.ts +23 -13
  82. package/src/shade/playground/particle_ecs/bonfire_wind.d.ts.map +1 -1
  83. package/src/shade/playground/particle_ecs/bonfire_wind.js +30 -33
  84. package/src/shade/playground/skinned_blas_refit/README.md +26 -14
  85. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_leaf_triangles.d.ts +14 -9
  86. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_leaf_triangles.d.ts.map +1 -1
  87. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_leaf_triangles.js +126 -127
  88. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_points.js +95 -95
  89. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_visibility.d.ts +9 -1
  90. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_visibility.d.ts.map +1 -1
  91. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_visibility.js +146 -135
  92. package/src/shade/playground/skinned_blas_refit/verify_clone_leaves.d.ts +6 -6
  93. package/src/shade/playground/skinned_blas_refit/verify_clone_leaves.d.ts.map +1 -1
  94. package/src/shade/playground/skinned_blas_refit/verify_clone_leaves.js +148 -134
  95. package/src/shade/playground/skinned_blas_refit/verify_leaf_triangles.d.ts +11 -8
  96. package/src/shade/playground/skinned_blas_refit/verify_leaf_triangles.d.ts.map +1 -1
  97. package/src/shade/playground/skinned_blas_refit/verify_leaf_triangles.js +342 -202
  98. package/src/shade/playground/skinned_blas_refit/verify_skinned_blas_refit.d.ts +12 -13
  99. package/src/shade/playground/skinned_blas_refit/verify_skinned_blas_refit.d.ts.map +1 -1
  100. package/src/shade/playground/skinned_blas_refit/verify_skinned_blas_refit.js +136 -116
  101. package/src/shade/playground/skinned_blas_refit/verify_traversal_reachability.d.ts +4 -4
  102. package/src/shade/playground/skinned_blas_refit/verify_traversal_reachability.d.ts.map +1 -1
  103. package/src/shade/playground/skinned_blas_refit/verify_traversal_reachability.js +255 -249
  104. package/src/shade/playground/water_surface/main.js +6 -3
  105. package/src/shade/renderer/animation/GPUAnimationManager.js +2 -2
  106. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts.map +1 -1
  107. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.js +7 -8
  108. package/src/shade/renderer/fluid/FLUID_FAR_FIELD_STRUCT.d.ts +111 -0
  109. package/src/shade/renderer/fluid/FLUID_FAR_FIELD_STRUCT.d.ts.map +1 -0
  110. package/src/shade/renderer/fluid/FLUID_FAR_FIELD_STRUCT.js +162 -0
  111. package/src/shade/renderer/fluid/GPUFluidCascade.d.ts +37 -8
  112. package/src/shade/renderer/fluid/GPUFluidCascade.d.ts.map +1 -1
  113. package/src/shade/renderer/fluid/GPUFluidCascade.js +149 -47
  114. package/src/shade/renderer/fluid/GPUFluidCascadeStack.d.ts +10 -3
  115. package/src/shade/renderer/fluid/GPUFluidCascadeStack.d.ts.map +1 -1
  116. package/src/shade/renderer/fluid/GPUFluidCascadeStack.js +69 -10
  117. package/src/shade/renderer/fluid/chunk_fluid_far_field.d.ts +19 -0
  118. package/src/shade/renderer/fluid/chunk_fluid_far_field.d.ts.map +1 -0
  119. package/src/shade/renderer/fluid/chunk_fluid_far_field.js +43 -0
  120. package/src/shade/renderer/fluid/coupling/FLUID_CASCADE_PARENT_STRUCT.d.ts +10 -9
  121. package/src/shade/renderer/fluid/coupling/FLUID_CASCADE_PARENT_STRUCT.d.ts.map +1 -1
  122. package/src/shade/renderer/fluid/coupling/FLUID_CASCADE_PARENT_STRUCT.js +14 -12
  123. package/src/shade/renderer/fluid/coupling/FLUID_CASCADE_RESTRICT_STRUCT.d.ts +3 -2
  124. package/src/shade/renderer/fluid/coupling/FLUID_CASCADE_RESTRICT_STRUCT.d.ts.map +1 -1
  125. package/src/shade/renderer/fluid/coupling/FLUID_CASCADE_RESTRICT_STRUCT.js +7 -5
  126. package/src/shade/renderer/fluid/coupling/chunk_fluid_cascade_epilogue.d.ts +17 -9
  127. package/src/shade/renderer/fluid/coupling/chunk_fluid_cascade_epilogue.d.ts.map +1 -1
  128. package/src/shade/renderer/fluid/coupling/chunk_fluid_cascade_epilogue.js +58 -18
  129. package/src/shade/renderer/fluid/coupling/chunk_fluid_cascade_parent.d.ts +23 -11
  130. package/src/shade/renderer/fluid/coupling/chunk_fluid_cascade_parent.d.ts.map +1 -1
  131. package/src/shade/renderer/fluid/coupling/chunk_fluid_cascade_parent.js +371 -335
  132. package/src/shade/renderer/fluid/coupling/shader_fluid_cascade_fill.d.ts.map +1 -1
  133. package/src/shade/renderer/fluid/coupling/shader_fluid_cascade_fill.js +2 -1
  134. package/src/shade/renderer/fluid/coupling/shader_fluid_cascade_ghosts.d.ts.map +1 -1
  135. package/src/shade/renderer/fluid/coupling/shader_fluid_cascade_ghosts.js +109 -108
  136. package/src/shade/renderer/fluid/coupling/shader_fluid_cascade_restrict.d.ts +5 -3
  137. package/src/shade/renderer/fluid/coupling/shader_fluid_cascade_restrict.d.ts.map +1 -1
  138. package/src/shade/renderer/fluid/coupling/shader_fluid_cascade_restrict.js +24 -12
  139. package/src/shade/renderer/fluid/mac/FLUID_MAC_STEP_STRUCT.d.ts +6 -2
  140. package/src/shade/renderer/fluid/mac/FLUID_MAC_STEP_STRUCT.d.ts.map +1 -1
  141. package/src/shade/renderer/fluid/mac/FLUID_MAC_STEP_STRUCT.js +10 -5
  142. package/src/shade/renderer/fluid/mac/FluidMacPasses.d.ts +20 -21
  143. package/src/shade/renderer/fluid/mac/FluidMacPasses.d.ts.map +1 -1
  144. package/src/shade/renderer/fluid/mac/FluidMacPasses.js +453 -427
  145. package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_correct.d.ts.map +1 -1
  146. package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_correct.js +2 -1
  147. package/src/shade/renderer/fluid/publish/FluidWindPublish.d.ts +13 -5
  148. package/src/shade/renderer/fluid/publish/FluidWindPublish.d.ts.map +1 -1
  149. package/src/shade/renderer/fluid/publish/FluidWindPublish.js +20 -10
  150. package/src/shade/renderer/fluid/publish/chunk_fluid_wind_publish_cell.d.ts +2 -2
  151. package/src/shade/renderer/fluid/publish/chunk_fluid_wind_publish_cell.js +2 -2
  152. package/src/shade/renderer/fluid/publish/shader_fluid_wind_publish.d.ts +5 -3
  153. package/src/shade/renderer/fluid/publish/shader_fluid_wind_publish.d.ts.map +1 -1
  154. package/src/shade/renderer/fluid/publish/shader_fluid_wind_publish.js +147 -142
  155. package/src/shade/renderer/fluid/query/GPUFluidQueries.js +2 -2
  156. package/src/shade/renderer/geometry/GPUGeometryManager.d.ts.map +1 -1
  157. package/src/shade/renderer/geometry/GPUGeometryManager.js +5 -7
  158. package/src/shade/renderer/geometry/MeshletGeometry.d.ts +4 -1
  159. package/src/shade/renderer/geometry/MeshletGeometry.d.ts.map +1 -1
  160. package/src/shade/renderer/geometry/MeshletGeometry.js +4 -1
  161. package/src/shade/renderer/geometry/MeshletGeometrySerializationAdapter.d.ts +20 -0
  162. package/src/shade/renderer/geometry/MeshletGeometrySerializationAdapter.d.ts.map +1 -1
  163. package/src/shade/renderer/geometry/MeshletGeometrySerializationAdapter.js +35 -3
  164. package/src/shade/renderer/geometry/blas_from_meshlets.d.ts +9 -3
  165. package/src/shade/renderer/geometry/blas_from_meshlets.d.ts.map +1 -1
  166. package/src/shade/renderer/geometry/blas_from_meshlets.js +16 -30
  167. package/src/shade/renderer/geometry/bvh/BLAS8_REFIT_TARGET_STRUCT.d.ts +14 -0
  168. package/src/shade/renderer/geometry/bvh/BLAS8_REFIT_TARGET_STRUCT.d.ts.map +1 -0
  169. package/src/shade/renderer/geometry/bvh/BLAS8_REFIT_TARGET_STRUCT.js +33 -0
  170. package/src/shade/renderer/geometry/bvh/GPUBLASRefitBatch.d.ts +18 -21
  171. package/src/shade/renderer/geometry/bvh/GPUBLASRefitBatch.d.ts.map +1 -1
  172. package/src/shade/renderer/geometry/bvh/GPUBLASRefitBatch.js +78 -158
  173. package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.d.ts +18 -39
  174. package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.d.ts.map +1 -1
  175. package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.js +39 -398
  176. package/src/shade/renderer/geometry/bvh/GPUGeometryMeshletsBVH.d.ts +6 -7
  177. package/src/shade/renderer/geometry/bvh/GPUGeometryMeshletsBVH.d.ts.map +1 -1
  178. package/src/shade/renderer/geometry/bvh/GPUGeometryMeshletsBVH.js +5 -7
  179. package/src/shade/renderer/geometry/bvh/bvh8_build_for_meshlets.d.ts +36 -0
  180. package/src/shade/renderer/geometry/bvh/bvh8_build_for_meshlets.d.ts.map +1 -0
  181. package/src/shade/renderer/geometry/bvh/bvh8_build_for_meshlets.js +179 -0
  182. package/src/shade/renderer/geometry/bvh/meshlet_batch_to_clustered_bvh.d.ts +30 -0
  183. package/src/shade/renderer/geometry/bvh/meshlet_batch_to_clustered_bvh.d.ts.map +1 -0
  184. package/src/shade/renderer/geometry/bvh/meshlet_batch_to_clustered_bvh.js +207 -0
  185. package/src/shade/renderer/geometry/bvh/shader_blas8_refit_batch.d.ts +52 -0
  186. package/src/shade/renderer/geometry/bvh/shader_blas8_refit_batch.d.ts.map +1 -0
  187. package/src/shade/renderer/geometry/bvh/shader_blas8_refit_batch.js +464 -0
  188. package/src/shade/renderer/geometry/meshlet/MeshletBatch.d.ts +12 -0
  189. package/src/shade/renderer/geometry/meshlet/MeshletBatch.d.ts.map +1 -1
  190. package/src/shade/renderer/geometry/meshlet/MeshletBatch.js +37 -0
  191. package/src/shade/renderer/geometry/sdf/bake/shader_mesh_sdf_classify.d.ts.map +1 -1
  192. package/src/shade/renderer/geometry/sdf/bake/shader_mesh_sdf_classify.js +4 -4
  193. package/src/shade/renderer/geometry/sdf/bake/shader_mesh_sdf_evaluate.d.ts.map +1 -1
  194. package/src/shade/renderer/geometry/sdf/bake/shader_mesh_sdf_evaluate.js +2 -2
  195. package/src/shade/renderer/geometry/sdf/chunk_blas_query_band_sdf.d.ts.map +1 -1
  196. package/src/shade/renderer/geometry/sdf/chunk_blas_query_band_sdf.js +2 -2
  197. package/src/shade/renderer/geometry/sdf/shader_sdf_visualize.d.ts.map +1 -1
  198. package/src/shade/renderer/geometry/sdf/shader_sdf_visualize.js +4 -4
  199. package/src/shade/renderer/geometry/sdf/surface/shader_mesh_surface_trace.d.ts.map +1 -1
  200. package/src/shade/renderer/geometry/sdf/surface/shader_mesh_surface_trace.js +2 -2
  201. package/src/shade/renderer/geometry/sr_create_group_RTX.d.ts.map +1 -1
  202. package/src/shade/renderer/geometry/sr_create_group_RTX.js +4 -4
  203. package/src/shade/renderer/global_illumination/brick4/gpu/bake/brick4_bake_basic.d.ts.map +1 -1
  204. package/src/shade/renderer/global_illumination/brick4/gpu/bake/brick4_bake_basic.js +1 -0
  205. package/src/shade/renderer/global_illumination/lpv/bake/GPULightProbeVolumeRenderer.d.ts.map +1 -1
  206. package/src/shade/renderer/global_illumination/lpv/bake/GPULightProbeVolumeRenderer.js +1 -0
  207. package/src/shade/renderer/global_illumination/lpv/placement/graph_generate_probe_locations.d.ts.map +1 -1
  208. package/src/shade/renderer/global_illumination/lpv/placement/graph_generate_probe_locations.js +372 -376
  209. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MESH_BRICK.d.ts +9 -10
  210. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MESH_BRICK.d.ts.map +1 -1
  211. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MESH_BRICK.js +10 -11
  212. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_walk.d.ts +2 -2
  213. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_walk.js +2 -2
  214. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_gather.d.ts +12 -8
  215. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_gather.d.ts.map +1 -1
  216. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_gather.js +109 -60
  217. package/src/shade/renderer/global_illumination/probe_clipmap/debug/graph_probe_clipmap_debug_mesh_sdf.js +2 -2
  218. package/src/shade/renderer/global_illumination/probe_clipmap/debug/graph_probe_clipmap_debug_mesh_surfaces.js +2 -2
  219. package/src/shade/renderer/gpu_primitive/bvh/BVH_BUFFER_LAYOUT.d.ts +2 -2
  220. package/src/shade/renderer/gpu_primitive/bvh/BVH_BUFFER_LAYOUT.js +70 -70
  221. package/src/shade/renderer/gpu_primitive/bvh/BVH_BUILD_SETTINGS_STRUCT.d.ts +6 -7
  222. package/src/shade/renderer/gpu_primitive/bvh/BVH_BUILD_SETTINGS_STRUCT.d.ts.map +1 -1
  223. package/src/shade/renderer/gpu_primitive/bvh/BVH_BUILD_SETTINGS_STRUCT.js +6 -7
  224. package/src/shade/renderer/gpu_primitive/bvh/graph_bvh_build_lbvh.d.ts +3 -3
  225. package/src/shade/renderer/gpu_primitive/bvh/graph_bvh_build_lbvh.js +3 -3
  226. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_build_single_workgroup.js +1 -1
  227. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_emit_hierarchy.d.ts +2 -2
  228. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_emit_hierarchy.js +3 -3
  229. package/src/shade/renderer/gpu_primitive/bvh8/BVH8_TREE_BUFFER_LAYOUT.d.ts +69 -0
  230. package/src/shade/renderer/gpu_primitive/bvh8/BVH8_TREE_BUFFER_LAYOUT.d.ts.map +1 -0
  231. package/src/shade/renderer/gpu_primitive/bvh8/BVH8_TREE_BUFFER_LAYOUT.js +89 -0
  232. package/src/shade/renderer/gpu_primitive/bvh8/bvh8_encode_from_bvh2.d.ts +41 -0
  233. package/src/shade/renderer/gpu_primitive/bvh8/bvh8_encode_from_bvh2.d.ts.map +1 -0
  234. package/src/shade/renderer/gpu_primitive/bvh8/bvh8_encode_from_bvh2.js +348 -0
  235. package/src/shade/renderer/gpu_primitive/bvh8/check_bvh8_tree.d.ts +34 -0
  236. package/src/shade/renderer/gpu_primitive/bvh8/check_bvh8_tree.d.ts.map +1 -0
  237. package/src/shade/renderer/gpu_primitive/bvh8/check_bvh8_tree.js +291 -0
  238. package/src/shade/renderer/gpu_primitive/bvh8/chunk_bvh8_encode_assign.d.ts +31 -0
  239. package/src/shade/renderer/gpu_primitive/bvh8/chunk_bvh8_encode_assign.d.ts.map +1 -0
  240. package/src/shade/renderer/gpu_primitive/bvh8/chunk_bvh8_encode_assign.js +175 -0
  241. package/src/shade/renderer/gpu_primitive/bvh8/chunk_bvh8_encode_depth.d.ts +27 -0
  242. package/src/shade/renderer/gpu_primitive/bvh8/chunk_bvh8_encode_depth.d.ts.map +1 -0
  243. package/src/shade/renderer/gpu_primitive/bvh8/chunk_bvh8_encode_depth.js +48 -0
  244. package/src/shade/renderer/gpu_primitive/bvh8/chunk_bvh8_encode_gather.d.ts +26 -0
  245. package/src/shade/renderer/gpu_primitive/bvh8/chunk_bvh8_encode_gather.d.ts.map +1 -0
  246. package/src/shade/renderer/gpu_primitive/bvh8/chunk_bvh8_encode_gather.js +118 -0
  247. package/src/shade/renderer/gpu_primitive/bvh8/chunk_bvh8_encode_node.d.ts +22 -0
  248. package/src/shade/renderer/gpu_primitive/bvh8/chunk_bvh8_encode_node.d.ts.map +1 -0
  249. package/src/shade/renderer/gpu_primitive/bvh8/chunk_bvh8_encode_node.js +143 -0
  250. package/src/shade/renderer/gpu_primitive/bvh8/chunk_bvh8_encode_sums.d.ts +36 -0
  251. package/src/shade/renderer/gpu_primitive/bvh8/chunk_bvh8_encode_sums.d.ts.map +1 -0
  252. package/src/shade/renderer/gpu_primitive/bvh8/chunk_bvh8_encode_sums.js +97 -0
  253. package/src/shade/renderer/gpu_primitive/bvh8/graph_bvh8_encode_from_bvh2.d.ts +49 -0
  254. package/src/shade/renderer/gpu_primitive/bvh8/graph_bvh8_encode_from_bvh2.d.ts.map +1 -0
  255. package/src/shade/renderer/gpu_primitive/bvh8/graph_bvh8_encode_from_bvh2.js +265 -0
  256. package/src/shade/renderer/gpu_primitive/bvh8/shader_bvh8_encode_assign.d.ts +37 -0
  257. package/src/shade/renderer/gpu_primitive/bvh8/shader_bvh8_encode_assign.d.ts.map +1 -0
  258. package/src/shade/renderer/gpu_primitive/bvh8/shader_bvh8_encode_assign.js +109 -0
  259. package/src/shade/renderer/gpu_primitive/bvh8/shader_bvh8_encode_count.d.ts +15 -0
  260. package/src/shade/renderer/gpu_primitive/bvh8/shader_bvh8_encode_count.d.ts.map +1 -0
  261. package/src/shade/renderer/gpu_primitive/bvh8/shader_bvh8_encode_count.js +85 -0
  262. package/src/shade/renderer/gpu_primitive/bvh8/shader_bvh8_encode_count_single_workgroup.d.ts +26 -0
  263. package/src/shade/renderer/gpu_primitive/bvh8/shader_bvh8_encode_count_single_workgroup.d.ts.map +1 -0
  264. package/src/shade/renderer/gpu_primitive/bvh8/shader_bvh8_encode_count_single_workgroup.js +200 -0
  265. package/src/shade/renderer/gpu_primitive/bvh8/shader_bvh8_encode_parents.d.ts +19 -0
  266. package/src/shade/renderer/gpu_primitive/bvh8/shader_bvh8_encode_parents.d.ts.map +1 -0
  267. package/src/shade/renderer/gpu_primitive/bvh8/shader_bvh8_encode_parents.js +81 -0
  268. package/src/shade/renderer/gpu_primitive/bvh8/shader_bvh8_encode_write.d.ts +14 -0
  269. package/src/shade/renderer/gpu_primitive/bvh8/shader_bvh8_encode_write.d.ts.map +1 -0
  270. package/src/shade/renderer/gpu_primitive/bvh8/shader_bvh8_encode_write.js +101 -0
  271. package/src/shade/renderer/gpu_primitive/bvh8/verify_gpu_bvh8_encode.d.ts +19 -0
  272. package/src/shade/renderer/gpu_primitive/bvh8/verify_gpu_bvh8_encode.d.ts.map +1 -0
  273. package/src/shade/renderer/gpu_primitive/bvh8/verify_gpu_bvh8_encode.js +361 -0
  274. package/src/shade/renderer/grass/surface/shader_grass_surface_bake.d.ts.map +1 -1
  275. package/src/shade/renderer/grass/surface/shader_grass_surface_bake.js +5 -6
  276. package/src/shade/renderer/lightmap/GPULightMap.d.ts.map +1 -1
  277. package/src/shade/renderer/lightmap/GPULightMap.js +1 -0
  278. package/src/shade/renderer/path_tracer/accumulating/AccumulatingPathTracer.d.ts.map +1 -1
  279. package/src/shade/renderer/path_tracer/accumulating/AccumulatingPathTracer.js +1 -0
  280. package/src/shade/renderer/path_tracer/graph_path_trace_scene.d.ts.map +1 -1
  281. package/src/shade/renderer/path_tracer/graph_path_trace_scene.js +1 -0
  282. package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.d.ts +8 -4
  283. package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.d.ts.map +1 -1
  284. package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.js +60 -33
  285. package/src/shade/renderer/scene/verify_gpu_tlas_build.d.ts +6 -6
  286. package/src/shade/renderer/scene/verify_gpu_tlas_build.d.ts.map +1 -1
  287. package/src/shade/renderer/scene/verify_gpu_tlas_build.js +23 -53
  288. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/BVH8_INODE_STRUCT.d.ts +3 -1
  289. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/BVH8_INODE_STRUCT.d.ts.map +1 -1
  290. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/BVH8_INODE_STRUCT.js +5 -3
  291. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/BVH8_MAX_DEPTH.d.ts +28 -0
  292. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/BVH8_MAX_DEPTH.d.ts.map +1 -0
  293. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/BVH8_MAX_DEPTH.js +29 -0
  294. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_node_grid.d.ts +25 -0
  295. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_node_grid.d.ts.map +1 -0
  296. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_node_grid.js +97 -0
  297. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_node_intersect.d.ts +8 -0
  298. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_node_intersect.d.ts.map +1 -1
  299. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_node_intersect.js +23 -14
  300. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_node_slot_distances.d.ts +36 -0
  301. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_node_slot_distances.d.ts.map +1 -0
  302. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_node_slot_distances.js +222 -0
  303. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_ray_direction_rcp.d.ts +20 -0
  304. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_ray_direction_rcp.d.ts.map +1 -0
  305. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_ray_direction_rcp.js +30 -0
  306. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_tree_read.d.ts +30 -0
  307. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_tree_read.d.ts.map +1 -0
  308. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_tree_read.js +91 -0
  309. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_waiting_slots.d.ts +23 -0
  310. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_waiting_slots.d.ts.map +1 -0
  311. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_waiting_slots.js +40 -0
  312. package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_blas_nearest.d.ts +22 -0
  313. package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_blas_nearest.d.ts.map +1 -1
  314. package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_blas_nearest.js +121 -70
  315. package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_blas_occluded.d.ts +13 -1
  316. package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_blas_occluded.d.ts.map +1 -1
  317. package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_blas_occluded.js +117 -61
  318. package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_nearest.d.ts +21 -0
  319. package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_nearest.d.ts.map +1 -1
  320. package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_nearest.js +111 -72
  321. package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_nearest_among.d.ts +1 -2
  322. package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_nearest_among.d.ts.map +1 -1
  323. package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_nearest_among.js +83 -54
  324. package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_occluded.d.ts +14 -0
  325. package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_occluded.d.ts.map +1 -1
  326. package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_occluded.js +92 -60
  327. package/src/shade/renderer/shader/chunk/sdf/chunk_point_query_blas_nearest.d.ts +22 -0
  328. package/src/shade/renderer/shader/chunk/sdf/chunk_point_query_blas_nearest.d.ts.map +1 -1
  329. package/src/shade/renderer/shader/chunk/sdf/chunk_point_query_blas_nearest.js +153 -106
  330. package/src/shade/renderer/shader/chunk/sdf/chunk_scene_point_query_nearest.d.ts +21 -0
  331. package/src/shade/renderer/shader/chunk/sdf/chunk_scene_point_query_nearest.d.ts.map +1 -1
  332. package/src/shade/renderer/shader/chunk/sdf/chunk_scene_point_query_nearest.js +115 -74
  333. package/src/shade/renderer/shader/chunk/sdf/chunk_scene_sdf_raymarch.d.ts +5 -2
  334. package/src/shade/renderer/shader/chunk/sdf/chunk_scene_sdf_raymarch.d.ts.map +1 -1
  335. package/src/shade/renderer/shader/chunk/sdf/chunk_scene_sdf_raymarch.js +89 -63
  336. package/src/shade/renderer/shader/chunk/sdf/chunk_sdf_query_distance.d.ts +15 -0
  337. package/src/shade/renderer/shader/chunk/sdf/chunk_sdf_query_distance.d.ts.map +1 -1
  338. package/src/shade/renderer/shader/chunk/sdf/chunk_sdf_query_distance.js +108 -63
  339. package/src/shade/renderer/shadow/sdf/chunk_ray_query_sdf_raycast.d.ts +14 -0
  340. package/src/shade/renderer/shadow/sdf/chunk_ray_query_sdf_raycast.d.ts.map +1 -1
  341. package/src/shade/renderer/shadow/sdf/chunk_ray_query_sdf_raycast.js +94 -60
  342. package/src/shade/renderer/shadow/sdf/graph_draw_sdf_shadows.d.ts.map +1 -1
  343. package/src/shade/renderer/shadow/sdf/graph_draw_sdf_shadows.js +4 -4
  344. package/src/shade/renderer/volumetrics/graph_build_volumetrics.js +2 -2
  345. package/src/shade/renderer/water/query/shader_water_surface_query.d.ts.map +1 -1
  346. package/src/shade/renderer/water/query/shader_water_surface_query.js +227 -227
  347. package/src/shade/renderer/water/surface/particles/chunk_water_particle_step.d.ts.map +1 -1
  348. package/src/shade/renderer/water/surface/particles/chunk_water_particle_step.js +7 -4
  349. package/src/shade/renderer/water/surface/particles/shader_water_particles.js +2 -2
  350. package/src/shade/renderer/wind/GPUSceneWind.d.ts +36 -4
  351. package/src/shade/renderer/wind/GPUSceneWind.d.ts.map +1 -1
  352. package/src/shade/renderer/wind/GPUSceneWind.js +150 -4
  353. package/src/shade/renderer/wind/WIND_FIELD_STRUCT.d.ts +9 -3
  354. package/src/shade/renderer/wind/WIND_FIELD_STRUCT.d.ts.map +1 -1
  355. package/src/shade/renderer/wind/WIND_FIELD_STRUCT.js +13 -3
  356. package/src/shade/renderer/wind/WIND_FIELD_UNIFORM.d.ts +6 -6
  357. package/src/shade/renderer/wind/WIND_FIELD_UNIFORM.js +6 -6
  358. package/src/shade/renderer/wind/chunk_fluid_turbulence.d.ts +39 -0
  359. package/src/shade/renderer/wind/chunk_fluid_turbulence.d.ts.map +1 -0
  360. package/src/shade/renderer/wind/chunk_fluid_turbulence.js +63 -0
  361. package/src/shade/renderer/wind/chunk_wind_field_sample_cascades.d.ts +10 -7
  362. package/src/shade/renderer/wind/chunk_wind_field_sample_cascades.d.ts.map +1 -1
  363. package/src/shade/renderer/wind/chunk_wind_field_sample_cascades.js +34 -11
  364. package/src/shade/renderer/wind/chunk_wind_field_sample_uniform.d.ts +2 -2
  365. package/src/shade/renderer/wind/chunk_wind_field_sample_uniform.js +2 -2
  366. package/src/shade/renderer/wind/wind_field_add_resources.d.ts +6 -4
  367. package/src/shade/renderer/wind/wind_field_add_resources.d.ts.map +1 -1
  368. package/src/shade/renderer/wind/wind_field_add_resources.js +9 -6
  369. package/src/shade/renderer/geometry/bvh/BLAS_REFIT_TARGET_STRUCT.d.ts +0 -18
  370. package/src/shade/renderer/geometry/bvh/BLAS_REFIT_TARGET_STRUCT.d.ts.map +0 -1
  371. package/src/shade/renderer/geometry/bvh/BLAS_REFIT_TARGET_STRUCT.js +0 -50
  372. package/src/shade/renderer/geometry/bvh/bvh2_derive_topology.d.ts +0 -23
  373. package/src/shade/renderer/geometry/bvh/bvh2_derive_topology.d.ts.map +0 -1
  374. package/src/shade/renderer/geometry/bvh/bvh2_derive_topology.js +0 -87
  375. package/src/shade/renderer/geometry/bvh/shader_blas_refit_batch.d.ts +0 -42
  376. package/src/shade/renderer/geometry/bvh/shader_blas_refit_batch.d.ts.map +0 -1
  377. package/src/shade/renderer/geometry/bvh/shader_blas_refit_batch.js +0 -141
  378. package/src/shade/renderer/geometry/bvh/shader_blas_refit_batch_seed.d.ts +0 -21
  379. package/src/shade/renderer/geometry/bvh/shader_blas_refit_batch_seed.d.ts.map +0 -1
  380. package/src/shade/renderer/geometry/bvh/shader_blas_refit_batch_seed.js +0 -75
  381. package/src/shade/renderer/geometry/meshlet_batch_to_bvh.d.ts +0 -17
  382. package/src/shade/renderer/geometry/meshlet_batch_to_bvh.d.ts.map +0 -1
  383. package/src/shade/renderer/geometry/meshlet_batch_to_bvh.js +0 -247
  384. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_ray_query_blas_occlusion.d.ts +0 -7
  385. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_ray_query_blas_occlusion.d.ts.map +0 -1
  386. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_ray_query_blas_occlusion.js +0 -226
  387. package/src/shade/renderer/shader/chunk/light/lpv/chunk_lpv_mask_visibility_via_rays.d.ts +0 -8
  388. package/src/shade/renderer/shader/chunk/light/lpv/chunk_lpv_mask_visibility_via_rays.d.ts.map +0 -1
  389. package/src/shade/renderer/shader/chunk/light/lpv/chunk_lpv_mask_visibility_via_rays.js +0 -45
  390. package/src/shade/renderer/shader/chunk/light/sample/chunk_ray_sample_light.d.ts +0 -3
  391. package/src/shade/renderer/shader/chunk/light/sample/chunk_ray_sample_light.d.ts.map +0 -1
  392. package/src/shade/renderer/shader/chunk/light/sample/chunk_ray_sample_light.js +0 -105
  393. package/src/shade/renderer/shadow/sdf/chunk_ray_query_sdf_distance.d.ts +0 -6
  394. package/src/shade/renderer/shadow/sdf/chunk_ray_query_sdf_distance.d.ts.map +0 -1
  395. package/src/shade/renderer/shadow/sdf/chunk_ray_query_sdf_distance.js +0 -86
  396. package/src/shade/renderer/shadow/sdf/chunk_ray_query_sdf_raycast_traversal_count.d.ts +0 -2
  397. package/src/shade/renderer/shadow/sdf/chunk_ray_query_sdf_raycast_traversal_count.d.ts.map +0 -1
  398. package/src/shade/renderer/shadow/sdf/chunk_ray_query_sdf_raycast_traversal_count.js +0 -136
@@ -4,15 +4,14 @@
4
4
  */
5
5
  export const MESH_BRICK_BATCH: number;
6
6
  /**
7
- * Nodes a walk keeps on a level of its frontier; the rest are handed on to the next round. Eight
8
- * nodes a lane a level at most.
7
+ * Nodes a walk keeps on a level of its frontier; the rest are handed on to the next round. A node
8
+ * gives a level eight at most.
9
9
  *
10
- * Measured on Zorah's TLAS (12,608 leaves, 27 levels deep), the widest level of a cell's walk is
11
- * 758 nodes at cascade 2 and 2,410 at cascade 5; at this frontier and tasks of
12
- * {@link MESH_BRICK_BATCH} nodes every walk ends in its third round. The frontier is 4 KiB of the
13
- * walk's 5.1 KiB of workgroup memory, and the iGPU's walk is bound by how many workgroups that memory
14
- * lets in: against 1,024 nodes, which ended every walk in its second round, the walks of a full
15
- * rebuild of Zorah's windows went from 71.1 to 43.0 ms there, and stayed even on the 4090.
10
+ * An integrated GPU's walk is bound by how many workgroups its memory lets in, and the frontier's two
11
+ * lists are the larger part of that memory. Measured on Zorah's TLAS (12,597 leaves) over the frames
12
+ * in which the windows fill: at 512 nodes every walk ends in its second
13
+ * round and the walks take 842 ms there in all; at 256, in its third, 448; at 128, in its fourth,
14
+ * 474.
16
15
  * @type {number}
17
16
  */
18
17
  export const MESH_BRICK_FRONTIER: number;
@@ -33,8 +32,8 @@ export const MESH_BRICK_RECORD_WORDS: number;
33
32
  export const MESH_BRICK_ROUNDS: number;
34
33
  /**
35
34
  * Rounds a walk of a TLAS over at most 2^20 leaves can need. A task starts from at most
36
- * {@link MESH_BRICK_BATCH} nodes and hands on only past {@link MESH_BRICK_FRONTIER}, eight times as
37
- * many, so a chain of k rounds needs a level 64·8^(k-1) nodes wide; 2^20 leaves allow k = 6.
35
+ * {@link MESH_BRICK_BATCH} nodes and hands on only past {@link MESH_BRICK_FRONTIER}, four times as
36
+ * many, so a chain of k rounds needs a level 64·4^(k-1) nodes wide; 2^20 leaves allow k = 8.
38
37
  * @type {number}
39
38
  */
40
39
  export const MESH_BRICK_ROUND_LIMIT: number;
@@ -1 +1 @@
1
- {"version":3,"file":"MESH_BRICK.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MESH_BRICK.js"],"names":[],"mappings":"AAkBA;;;GAGG;AACH,+BAFU,MAAM,CAE0C;AAE1D;;;;;;;;;;;GAWG;AACH,kCAFU,MAAM,CAEuB;AAEvC;;;GAGG;AACH,6CAFU,MAAM,CAEgC;AAEhD;;;GAGG;AACH,sCAFU,MAAM,CAEyE;AAEzF;;;GAGG;AACH,gCAFU,MAAM,CAEmB;AAEnC;;;;;GAKG;AACH,qCAFU,MAAM,CAEiI;AASjJ;;;;;GAKG;AACH,2CAFU,MAAM,CAEuD;AAEvE;;;GAGG;AACH,2CAFU,MAAM,CAE6D;AAE7E;;;GAGG;AACH,sCAFU,MAAM,CAEyB;AAEzC;;;;;GAKG;AACH,yCAFU,MAAM,CAE4B;AAO5C;;;GAGG;AACH,2CAFU,MAAM,CAE8B;AAE9C;;;GAGG;AACH,mDAFU,MAAM,CAEsC;AAEtD;;;GAGG;AACH,yCAFU,MAAM,CAE4B;AAE5C;;;GAGG;AACH,iDAFU,MAAM,CAEoC;AAEpD;;;GAGG;AACH,gDAFU,MAAM,CAEmC;AAEnD;;;GAGG;AACH,gDAFU,MAAM,CAEmC;AAEnD;;;GAGG;AACH,iDAFU,MAAM,CAEoC;AAEpD;;;GAGG;AACH,gDAFU,MAAM,CAEmC;AAEnD;;;GAGG;AACH,8CAFU,MAAM,CAEiC;AAEjD;;;GAGG;AACH,iDAFU,MAAM,CAEoC;AAEpD;;;GAGG;AACH,yCAFU,MAAM,CAE6B;AAE7C;;;GAGG;AACH,yCAFU,MAAM,CAEqD;AAErE;;;;GAIG;AACH,uCAFU,MAAM,CAEuD;AAEvE;;;GAGG;AACH,8CAFU,MAAM,CAE4D;AAE5E;;;GAGG;AACH,8CAFU,MAAM,CAEmE;AAEnF;;;GAGG;AACH,0CAFU,MAAM,CAE+D;AAE/E;;;GAGG;AACH,gDAFU,MAAM,CAEiE;AAEjF;;;GAGG;AACH,uCAFU,MAAM,CAE8D"}
1
+ {"version":3,"file":"MESH_BRICK.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MESH_BRICK.js"],"names":[],"mappings":"AAkBA;;;GAGG;AACH,+BAFU,MAAM,CAE0C;AAE1D;;;;;;;;;;GAUG;AACH,kCAFU,MAAM,CAEuB;AAEvC;;;GAGG;AACH,6CAFU,MAAM,CAEgC;AAEhD;;;GAGG;AACH,sCAFU,MAAM,CAEyE;AAEzF;;;GAGG;AACH,gCAFU,MAAM,CAEmB;AAEnC;;;;;GAKG;AACH,qCAFU,MAAM,CAEiI;AASjJ;;;;;GAKG;AACH,2CAFU,MAAM,CAEuD;AAEvE;;;GAGG;AACH,2CAFU,MAAM,CAE6D;AAE7E;;;GAGG;AACH,sCAFU,MAAM,CAEyB;AAEzC;;;;;GAKG;AACH,yCAFU,MAAM,CAE4B;AAO5C;;;GAGG;AACH,2CAFU,MAAM,CAE8B;AAE9C;;;GAGG;AACH,mDAFU,MAAM,CAEsC;AAEtD;;;GAGG;AACH,yCAFU,MAAM,CAE4B;AAE5C;;;GAGG;AACH,iDAFU,MAAM,CAEoC;AAEpD;;;GAGG;AACH,gDAFU,MAAM,CAEmC;AAEnD;;;GAGG;AACH,gDAFU,MAAM,CAEmC;AAEnD;;;GAGG;AACH,iDAFU,MAAM,CAEoC;AAEpD;;;GAGG;AACH,gDAFU,MAAM,CAEmC;AAEnD;;;GAGG;AACH,8CAFU,MAAM,CAEiC;AAEjD;;;GAGG;AACH,iDAFU,MAAM,CAEoC;AAEpD;;;GAGG;AACH,yCAFU,MAAM,CAE6B;AAE7C;;;GAGG;AACH,yCAFU,MAAM,CAEqD;AAErE;;;;GAIG;AACH,uCAFU,MAAM,CAEuD;AAEvE;;;GAGG;AACH,8CAFU,MAAM,CAE4D;AAE5E;;;GAGG;AACH,8CAFU,MAAM,CAEmE;AAEnF;;;GAGG;AACH,0CAFU,MAAM,CAE+D;AAE/E;;;GAGG;AACH,gDAFU,MAAM,CAEiE;AAEjF;;;GAGG;AACH,uCAFU,MAAM,CAE8D"}
@@ -23,18 +23,17 @@ import { BRICK_CELL_WORKGROUP_SIZE } from "../BRICK_CLIPMAP.js";
23
23
  export const MESH_BRICK_BATCH = BRICK_CELL_WORKGROUP_SIZE;
24
24
 
25
25
  /**
26
- * Nodes a walk keeps on a level of its frontier; the rest are handed on to the next round. Eight
27
- * nodes a lane a level at most.
26
+ * Nodes a walk keeps on a level of its frontier; the rest are handed on to the next round. A node
27
+ * gives a level eight at most.
28
28
  *
29
- * Measured on Zorah's TLAS (12,608 leaves, 27 levels deep), the widest level of a cell's walk is
30
- * 758 nodes at cascade 2 and 2,410 at cascade 5; at this frontier and tasks of
31
- * {@link MESH_BRICK_BATCH} nodes every walk ends in its third round. The frontier is 4 KiB of the
32
- * walk's 5.1 KiB of workgroup memory, and the iGPU's walk is bound by how many workgroups that memory
33
- * lets in: against 1,024 nodes, which ended every walk in its second round, the walks of a full
34
- * rebuild of Zorah's windows went from 71.1 to 43.0 ms there, and stayed even on the 4090.
29
+ * An integrated GPU's walk is bound by how many workgroups its memory lets in, and the frontier's two
30
+ * lists are the larger part of that memory. Measured on Zorah's TLAS (12,597 leaves) over the frames
31
+ * in which the windows fill: at 512 nodes every walk ends in its second
32
+ * round and the walks take 842 ms there in all; at 256, in its third, 448; at 128, in its fourth,
33
+ * 474.
35
34
  * @type {number}
36
35
  */
37
- export const MESH_BRICK_FRONTIER = 512;
36
+ export const MESH_BRICK_FRONTIER = 256;
38
37
 
39
38
  /**
40
39
  * Words of a record's header: its build slot, then how many entries it holds.
@@ -56,8 +55,8 @@ export const MESH_BRICK_ROUNDS = 2;
56
55
 
57
56
  /**
58
57
  * Rounds a walk of a TLAS over at most 2^20 leaves can need. A task starts from at most
59
- * {@link MESH_BRICK_BATCH} nodes and hands on only past {@link MESH_BRICK_FRONTIER}, eight times as
60
- * many, so a chain of k rounds needs a level 64·8^(k-1) nodes wide; 2^20 leaves allow k = 6.
58
+ * {@link MESH_BRICK_BATCH} nodes and hands on only past {@link MESH_BRICK_FRONTIER}, four times as
59
+ * many, so a chain of k rounds needs a level 64·4^(k-1) nodes wide; 2^20 leaves allow k = 8.
61
60
  * @type {number}
62
61
  */
63
62
  export const MESH_BRICK_ROUND_LIMIT = 1 + Math.ceil(Math.log2((1 << 20) / MESH_BRICK_BATCH) / Math.log2(MESH_BRICK_FRONTIER / MESH_BRICK_BATCH));
@@ -13,8 +13,8 @@
13
13
  * An iteration of a level appends the children it finds to the next level's list at places `start`
14
14
  * to `end`, as their reservations came; the frontier keeps the places below
15
15
  * {@link MESH_BRICK_FRONTIER}, and every child at or past it is handed on, at its place counted from
16
- * whichever is later of `start` and the frontier. An iteration appends two children a lane at most,
17
- * so it hands on at most twice {@link MESH_BRICK_BATCH}.
16
+ * whichever is later of `start` and the frontier. An iteration appends eight children a lane at most,
17
+ * so it hands on at most eight times {@link MESH_BRICK_BATCH}.
18
18
  *
19
19
  * @type {CodeChunk}
20
20
  */
@@ -26,8 +26,8 @@ import {
26
26
  * An iteration of a level appends the children it finds to the next level's list at places `start`
27
27
  * to `end`, as their reservations came; the frontier keeps the places below
28
28
  * {@link MESH_BRICK_FRONTIER}, and every child at or past it is handed on, at its place counted from
29
- * whichever is later of `start` and the frontier. An iteration appends two children a lane at most,
30
- * so it hands on at most twice {@link MESH_BRICK_BATCH}.
29
+ * whichever is later of `start` and the frontier. An iteration appends eight children a lane at most,
30
+ * so it hands on at most eight times {@link MESH_BRICK_BATCH}.
31
31
  *
32
32
  * @type {CodeChunk}
33
33
  */
@@ -7,9 +7,10 @@ export const MESH_BRICK_GATHER_SETTINGS: WebGPUStruct;
7
7
  * whose box comes within the band of a taken cell, gathered whole, a workgroup a walk.
8
8
  *
9
9
  * A walk expands the TLAS a level at a time, as the cooperative query does (`chunk_bvh_query_aabb_cooperative`):
10
- * each node of the level is tested by a lane against the cell grown by the cascade's band, the children
11
- * of an overlapping internal node go on the next level, and an overlapping leaf is a row when
12
- * `mesh_brick_accept` takes it. Nothing is dropped:
10
+ * each node of the level is read by a lane, and its eight slots tested against the cell grown by the
11
+ * cascade's band. The child nodes of the slots the box meets go on the next level. An instance in a
12
+ * slot the box meets is a row when its own box meets it too — a slot's is the instance's rounded outward
13
+ * to the node's grid — and `mesh_brick_accept` takes it. Nothing is dropped:
13
14
  * - a level keeps {@link MESH_BRICK_FRONTIER} nodes, and the children that fall past them are handed on in
14
15
  * task records of up to {@link MESH_BRICK_BATCH} nodes, each a walk of the next round, which this same
15
16
  * kernel runs from them;
@@ -26,12 +27,15 @@ export const MESH_BRICK_GATHER_SETTINGS: WebGPUStruct;
26
27
  * a command dispatches was written this frame.
27
28
  *
28
29
  * An iteration of a level costs the workgroup a barrier and a `workgroupUniformLoad`, and a barrier
29
- * more after one whose hand-off copied records out: lane 0 hands every lane where the next iteration's
30
- * children start and, on the level's last, how many nodes the next level holds.
30
+ * more after one whose hand-off copied rows out: lane 0 hands every lane where the next iteration's
31
+ * children start and, on the level's last, how many nodes the next level holds. A lane writes its own
32
+ * children past the frontier straight into the task records the hand-off kept for them.
31
33
  *
32
- * Per lane and level, at most {@link MESH_BRICK_FRONTIER} / {@link MESH_BRICK_BATCH} node reads, accepts
33
- * and appends, over at most {@link BVH_QUERY_AABB_LEVEL_BUDGET} levels; per iteration, two task entries
34
- * and two batch entries copied at most.
34
+ * Per lane and level, at most {@link MESH_BRICK_FRONTIER} / {@link MESH_BRICK_BATCH} node reads, each
35
+ * with at most eight accepts and eight appends of either kind, over at most
36
+ * {@link BVH_QUERY_AABB_LEVEL_BUDGET} levels — a budget for a binary tree, a third of which a tree of
37
+ * three binary levels a node needs; per iteration, eight task entries written and nine batch entries
38
+ * copied at most.
35
39
  *
36
40
  * @type {ComputeShader}
37
41
  */
@@ -1 +1 @@
1
- {"version":3,"file":"shader_mesh_brick_gather.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_gather.js"],"names":[],"mappings":"AAyCA;;GAEG;AACH,yCAFU,YAAY,CAeQ;AA0V9B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,uCAFU,aAAa,CAMpB;6BApa0B,yCAAyC;8BAJxC,qCAAqC"}
1
+ {"version":3,"file":"shader_mesh_brick_gather.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_gather.js"],"names":[],"mappings":"AA4CA;;GAEG;AACH,yCAFU,YAAY,CAeQ;AAoY9B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,uCAFU,aAAa,CAMpB;6BAld0B,yCAAyC;8BAJxC,qCAAqC"}
@@ -1,13 +1,16 @@
1
1
  import { assert } from "../../../../../../core/assert.js";
2
2
  import { WebGPUExtensionType } from "../../../../../descriptor/WebGPUExtensionType.js";
3
3
  import { MESH_SDF_HEADERS_RESOURCE } from "../../../../geometry/sdf/MESH_SDF_RESOURCES.js";
4
- import { BVH2_NODE_STRUCT } from "../../../../shader/chunk/bvh/BVH2_NODE_STRUCT.js";
5
- import { BVH_NULL_NODE_DEFINITION } from "../../../../shader/chunk/bvh/BVH_NULL_NODE_DEFINITION.js";
6
- import { BVH_STRUCT } from "../../../../shader/chunk/bvh/BVH_STRUCT.js";
4
+ import { chunk_scene_database_access } from "../../../../scene/chunk_scene_database_access.js";
5
+ import { BVH8_INODE_STRUCT } from "../../../../shader/chunk/bvh/bvh8/webgpu/BVH8_INODE_STRUCT.js";
7
6
  import {
8
- BVH_QUERY_AABB_LEVEL_BUDGET,
9
- chunk_bvh_query_aabb_frontier
10
- } from "../../../../shader/chunk/bvh/chunk_bvh_query_aabb_frontier.js";
7
+ chunk_bvh8_node_slot_distances
8
+ } from "../../../../shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_node_slot_distances.js";
9
+ import { BVH8_TREE_TYPE, chunk_bvh8_tree_read } from "../../../../shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_tree_read.js";
10
+ import { BVH_QUERY_AABB_LEVEL_BUDGET } from "../../../../shader/chunk/bvh/chunk_bvh_query_aabb_frontier.js";
11
+ import {
12
+ chunk_aabb3_intersects_aabb3
13
+ } from "../../../../shader/chunk/geometry/aabb3/chunk_aabb3_intersects_aabb3.js";
11
14
  import { CLIPMAP_LEVEL_ARRAY } from "../../../../shader/chunk/clipmap/CLIPMAP_LEVEL_STRUCT.js";
12
15
  import { chunk_folded_workgroup_index } from "../../../../shader/chunk/grid/chunk_folded_workgroup_index.js";
13
16
  import {
@@ -76,17 +79,15 @@ resources.createGroup()
76
79
  .addStorageBuffer("mesh_brick_resolves", WebGPUArray.u32, true);
77
80
 
78
81
  resources.createGroup()
79
- .addStorageBuffer("tlas", BVH_STRUCT)
82
+ .addStorageBuffer("tlas", BVH8_TREE_TYPE)
80
83
  .addStorageBuffer("scene_database", WebGPUArray.from(u32))
81
84
  .add(MESH_SDF_HEADERS_RESOURCE);
82
85
 
83
86
  const body = CodeChunk.from(
84
87
  //language=WGSL
85
88
  `
86
- /** children an iteration finds at most: two a lane */
87
- const MESH_BRICK_WALK_SPILL = ${2 * MESH_BRICK_BATCH}u;
88
- /** rows waiting for their batch: fewer than a batch, and an iteration's at most */
89
- const MESH_BRICK_WALK_ROWS = ${2 * MESH_BRICK_BATCH}u;
89
+ /** rows waiting for their batch: fewer than a batch, and an iteration's at most, eight a lane */
90
+ const MESH_BRICK_WALK_ROWS = ${9 * MESH_BRICK_BATCH}u;
90
91
 
91
92
  /** what lane 0 hands the workgroup after an iteration */
92
93
  struct MeshBrickWalkHandoff {
@@ -107,8 +108,6 @@ struct MeshBrickWalkHandoff {
107
108
  var<workgroup> walk_frontier: array<array<u32, MESH_BRICK_FRONTIER>, 2>;
108
109
  // appends asked of each list; past the frontier they were handed on
109
110
  var<workgroup> walk_reserved: array<atomic<u32>, 2>;
110
- // the iteration's children past the frontier, on their way to task records
111
- var<workgroup> walk_spill: array<u32, MESH_BRICK_WALK_SPILL>;
112
111
  // accepted rows, a ring from the first not yet in a batch
113
112
  var<workgroup> walk_rows: array<u32, MESH_BRICK_WALK_ROWS>;
114
113
  var<workgroup> walk_rows_reserved: atomic<u32>;
@@ -117,10 +116,6 @@ var<workgroup> walk_rows_reserved: atomic<u32>;
117
116
  var<workgroup> walk_task: vec3<u32>;
118
117
  var<workgroup> walk_handoff: MeshBrickWalkHandoff;
119
118
 
120
- fn bvh_node(index: u32) -> ${BVH2_NODE_STRUCT.wgsl_ref} {
121
- return tlas.nodes[index];
122
- }
123
-
124
119
  /** lane 0: a flag of the cell's for the frame; the first lists the cell for the resolve */
125
120
  fn mesh_brick_walk_flag(build: u32, flag: u32) {
126
121
  let flags = atomicOr(&mesh_brick_accumulators[mesh_brick_accumulator(build) + MESH_BRICK_ACCUMULATOR_FLAGS], flag);
@@ -202,14 +197,6 @@ fn mesh_brick_walk_tasks(build: u32, spilled: u32) -> vec2<u32> {
202
197
  return tasks;
203
198
  }
204
199
 
205
- fn mesh_brick_walk_place(next: u32, slot: u32, start: u32, child: u32) {
206
- if (slot < MESH_BRICK_FRONTIER) {
207
- walk_frontier[next][slot] = child;
208
- } else {
209
- walk_spill[mesh_brick_walk_spill_index(slot, start)] = child;
210
- }
211
- }
212
-
213
200
  @compute @workgroup_size(${BRICK_CELL_WORKGROUP_SIZE})
214
201
  fn main(
215
202
  @builtin(workgroup_id) workgroup_id: vec3<u32>,
@@ -221,7 +208,8 @@ fn main(
221
208
  if (lane == 0u) {
222
209
  var walks: u32;
223
210
  var build = index;
224
- var roots = select(1u, 0u, tlas.root == BVH_NULL_NODE);
211
+ // a scene of no instances has nothing to walk
212
+ var roots = select(1u, 0u, bvh8_tree_leaf_count(&tlas) == 0u);
225
213
 
226
214
  if (settings.round == 0u) {
227
215
  walks = brick_take[BRICK_TAKE_COUNT];
@@ -257,12 +245,15 @@ fn main(
257
245
  let at = brick_provider_cell(brick_provider_key(build, settings.ring_capacity), settings.resolution);
258
246
 
259
247
  // every instance whose box comes within the band of the cell
260
- let query = array<f32, 6>(at.corner.x - at.band, at.corner.y - at.band, at.corner.z - at.band, at.far.x + at.band, at.far.y + at.band, at.far.z + at.band);
248
+ let query_low = at.corner - vec3<f32>(at.band);
249
+ let query_high = at.far + vec3<f32>(at.band);
250
+ let query = array<f32, 6>(query_low.x, query_low.y, query_low.z, query_high.x, query_high.y, query_high.z);
261
251
 
262
252
  // the first level's nodes, each read back by the lane that wrote it
263
253
  if (settings.round == 0u) {
264
254
  if (lane == 0u) {
265
- walk_frontier[0][0] = tlas.root;
255
+ // the root
256
+ walk_frontier[0][0] = 0u;
266
257
  }
267
258
  } else if (lane < task.z) {
268
259
  walk_frontier[0][lane] = mesh_brick_tasks[mesh_brick_task_in(index) + MESH_BRICK_RECORD_HEADER_WORDS + lane];
@@ -271,7 +262,7 @@ fn main(
271
262
  var expand_count = task.z;
272
263
  // lane 0's: the rows handed to batches so far
273
264
  var rows_taken = 0u;
274
- // the last hand-off copied out of the spill and the ring, which the next iteration fills again
265
+ // the last hand-off copied rows out of the ring, which the next iteration fills again
275
266
  var copied = false;
276
267
 
277
268
  for (var level = 0u; level < ${BVH_QUERY_AABB_LEVEL_BUDGET}u && expand_count != 0u; level++) {
@@ -285,15 +276,33 @@ fn main(
285
276
  for (var iteration = 0u; iteration < iterations; iteration++) {
286
277
  let slot = iteration * MESH_BRICK_BATCH + lane;
287
278
 
288
- var node: ${BVH2_NODE_STRUCT.wgsl_ref};
289
- var kind = BVH_QUERY_AABB_SKIP;
279
+ var node: ${BVH8_INODE_STRUCT.wgsl_ref};
280
+ // of the node's slots: the child nodes the cell's box meets, a bit a slot
281
+ var children = 0u;
282
+ // and the instances taken, a bit each of the node's run
283
+ var taken = 0u;
290
284
 
291
285
  if (slot < expand_count) {
292
- node = bvh_node(walk_frontier[list][slot]);
293
- kind = bvh_query_aabb_classify(node.bounds, node.child_1, query);
286
+ node = bvh8_tree_read_node(&tlas, walk_frontier[list][slot]);
287
+
288
+ let meeting = bvh8_node_slots_meeting(node, query_low, query_high);
289
+
290
+ children = meeting & (node.data[0].w >> 24u);
294
291
 
295
- if (kind == BVH_QUERY_AABB_LEAF && !mesh_brick_accept(node.child_2, node.bounds, at.voxel)) {
296
- kind = BVH_QUERY_AABB_SKIP;
292
+ var run = bvh8_slot_runs_of(bvh8_node_slot_runs(node), meeting);
293
+
294
+ while (run != 0u) {
295
+ let offset = countTrailingZeros(run);
296
+
297
+ run &= run - 1u;
298
+
299
+ // a slot's box is its instance's rounded outward to the node's grid: the row's own box decides
300
+ let row = bvh8_tree_read_payload(&tlas, node, offset);
301
+ let box = scene_read_mesh(&scene_database, row).bounding_box;
302
+
303
+ if (aabb3_intersects_aabb3(box, query) && mesh_brick_accept(row, box, at.voxel)) {
304
+ taken |= 1u << offset;
305
+ }
297
306
  }
298
307
  }
299
308
 
@@ -302,16 +311,38 @@ fn main(
302
311
  }
303
312
 
304
313
  // every lane reserves, asking or not, so the subgroup operations stay uniform
305
- let child = subgroup_reserve_workgroup(&walk_reserved[next], select(0u, 2u, kind == BVH_QUERY_AABB_DESCEND));
306
- let row = subgroup_reserve_workgroup(&walk_rows_reserved, select(0u, 1u, kind == BVH_QUERY_AABB_LEAF));
314
+ let child = subgroup_reserve_workgroup(&walk_reserved[next], countOneBits(children));
315
+ let row = subgroup_reserve_workgroup(&walk_rows_reserved, countOneBits(taken));
316
+
317
+ let imask = node.data[0].w >> 24u;
318
+
319
+ // The children that fit the frontier go on it now. Those past it wait for the task records
320
+ // lane 0 is about to ask for: 'beyond' and 'place' are theirs.
321
+ var beyond = children;
322
+ var place = child;
307
323
 
308
- if (kind == BVH_QUERY_AABB_DESCEND) {
309
- mesh_brick_walk_place(next, child, start, node.child_1);
310
- mesh_brick_walk_place(next, child + 1u, start, node.child_2);
324
+ while (beyond != 0u && place < MESH_BRICK_FRONTIER) {
325
+ let child_slot = countTrailingZeros(beyond);
326
+
327
+ beyond &= beyond - 1u;
328
+
329
+ // the node's children sit in one block, in slot order
330
+ walk_frontier[next][place] = node.data[1].x + countOneBits(imask & ((1u << child_slot) - 1u));
331
+
332
+ place++;
311
333
  }
312
334
 
313
- if (kind == BVH_QUERY_AABB_LEAF) {
314
- walk_rows[row % MESH_BRICK_WALK_ROWS] = node.child_2;
335
+ var rows_left = taken;
336
+ var row_place = row;
337
+
338
+ while (rows_left != 0u) {
339
+ let offset = countTrailingZeros(rows_left);
340
+
341
+ rows_left &= rows_left - 1u;
342
+
343
+ walk_rows[row_place % MESH_BRICK_WALK_ROWS] = bvh8_tree_read_payload(&tlas, node, offset);
344
+
345
+ row_place++;
315
346
  }
316
347
 
317
348
  // every append of the iteration has landed
@@ -350,15 +381,27 @@ fn main(
350
381
 
351
382
  let handoff = workgroupUniformLoad(&walk_handoff);
352
383
 
353
- for (var k = 0u; k < handoff.tasks_kept; k++) {
354
- let i = k * MESH_BRICK_BATCH + lane;
355
- let record = mesh_brick_task_out(handoff.tasks + k);
384
+ // this lane's children past the frontier, each to its place in the task records kept
385
+ while (beyond != 0u) {
386
+ let child_slot = countTrailingZeros(beyond);
356
387
 
357
- if (i < handoff.spilled) {
358
- mesh_brick_tasks[record + MESH_BRICK_RECORD_HEADER_WORDS + lane] = walk_spill[i];
388
+ beyond &= beyond - 1u;
389
+
390
+ let i = mesh_brick_walk_spill_index(place, start);
391
+ let k = i / MESH_BRICK_BATCH;
392
+
393
+ if (k < handoff.tasks_kept) {
394
+ mesh_brick_tasks[mesh_brick_task_out(handoff.tasks + k) + MESH_BRICK_RECORD_HEADER_WORDS + i % MESH_BRICK_BATCH]
395
+ = node.data[1].x + countOneBits(imask & ((1u << child_slot) - 1u));
359
396
  }
360
397
 
361
- if (lane == 0u) {
398
+ place++;
399
+ }
400
+
401
+ if (lane == 0u) {
402
+ for (var k = 0u; k < handoff.tasks_kept; k++) {
403
+ let record = mesh_brick_task_out(handoff.tasks + k);
404
+
362
405
  mesh_brick_tasks[record] = build;
363
406
  mesh_brick_tasks[record + 1u] = min(MESH_BRICK_BATCH, handoff.spilled - k * MESH_BRICK_BATCH);
364
407
  }
@@ -379,7 +422,7 @@ fn main(
379
422
  }
380
423
 
381
424
  start = handoff.end;
382
- copied = handoff.tasks_kept + handoff.batches_kept != 0u;
425
+ copied = handoff.batches_kept != 0u;
383
426
 
384
427
  if (settles) {
385
428
  expand_count = min(handoff.end, MESH_BRICK_FRONTIER);
@@ -391,9 +434,11 @@ fn main(
391
434
  chunk_brick_clipmap,
392
435
  chunk_brick_provider,
393
436
  chunk_folded_workgroup_index,
394
- chunk_bvh_query_aabb_frontier,
395
- BVH_NULL_NODE_DEFINITION,
396
- BVH2_NODE_STRUCT.declaration_chunk,
437
+ BVH8_INODE_STRUCT.declaration_chunk,
438
+ chunk_bvh8_tree_read,
439
+ chunk_bvh8_node_slot_distances,
440
+ chunk_aabb3_intersects_aabb3,
441
+ chunk_scene_database_access,
397
442
  chunk_subgroup_reserve_workgroup,
398
443
  chunk_mesh_brick_instance,
399
444
  chunk_mesh_brick_walk,
@@ -406,9 +451,10 @@ body.addExtension(WebGPUExtensionType.Subgroups);
406
451
  * whose box comes within the band of a taken cell, gathered whole, a workgroup a walk.
407
452
  *
408
453
  * A walk expands the TLAS a level at a time, as the cooperative query does (`chunk_bvh_query_aabb_cooperative`):
409
- * each node of the level is tested by a lane against the cell grown by the cascade's band, the children
410
- * of an overlapping internal node go on the next level, and an overlapping leaf is a row when
411
- * `mesh_brick_accept` takes it. Nothing is dropped:
454
+ * each node of the level is read by a lane, and its eight slots tested against the cell grown by the
455
+ * cascade's band. The child nodes of the slots the box meets go on the next level. An instance in a
456
+ * slot the box meets is a row when its own box meets it too — a slot's is the instance's rounded outward
457
+ * to the node's grid — and `mesh_brick_accept` takes it. Nothing is dropped:
412
458
  * - a level keeps {@link MESH_BRICK_FRONTIER} nodes, and the children that fall past them are handed on in
413
459
  * task records of up to {@link MESH_BRICK_BATCH} nodes, each a walk of the next round, which this same
414
460
  * kernel runs from them;
@@ -425,12 +471,15 @@ body.addExtension(WebGPUExtensionType.Subgroups);
425
471
  * a command dispatches was written this frame.
426
472
  *
427
473
  * An iteration of a level costs the workgroup a barrier and a `workgroupUniformLoad`, and a barrier
428
- * more after one whose hand-off copied records out: lane 0 hands every lane where the next iteration's
429
- * children start and, on the level's last, how many nodes the next level holds.
474
+ * more after one whose hand-off copied rows out: lane 0 hands every lane where the next iteration's
475
+ * children start and, on the level's last, how many nodes the next level holds. A lane writes its own
476
+ * children past the frontier straight into the task records the hand-off kept for them.
430
477
  *
431
- * Per lane and level, at most {@link MESH_BRICK_FRONTIER} / {@link MESH_BRICK_BATCH} node reads, accepts
432
- * and appends, over at most {@link BVH_QUERY_AABB_LEVEL_BUDGET} levels; per iteration, two task entries
433
- * and two batch entries copied at most.
478
+ * Per lane and level, at most {@link MESH_BRICK_FRONTIER} / {@link MESH_BRICK_BATCH} node reads, each
479
+ * with at most eight accepts and eight appends of either kind, over at most
480
+ * {@link BVH_QUERY_AABB_LEVEL_BUDGET} levels — a budget for a binary tree, a third of which a tree of
481
+ * three binary levels a node needs; per iteration, eight task entries written and nine batch entries
482
+ * copied at most.
434
483
  *
435
484
  * @type {ComputeShader}
436
485
  */
@@ -7,7 +7,7 @@ import {
7
7
  MESH_SDF_INDIRECTION_RESOURCE,
8
8
  MESH_SDF_SAMPLER_RESOURCE
9
9
  } from "../../../geometry/sdf/MESH_SDF_RESOURCES.js";
10
- import { BVH_STRUCT } from "../../../shader/chunk/bvh/BVH_STRUCT.js";
10
+ import { BVH8_TREE_TYPE } from "../../../shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_tree_read.js";
11
11
  import { chunk_camera_ray_from_uv } from "../../../shader/chunk/geometry/ray/chunk_camera_ray_from_uv.js";
12
12
  import { F32_MAX_DEFINITION } from "../../../shader/chunk/math/F32_MAX_DEFINITION.js";
13
13
  import { chunk_scene_sdf_raymarch } from "../../../shader/chunk/sdf/chunk_scene_sdf_raymarch.js";
@@ -37,7 +37,7 @@ resources.createGroup()
37
37
  .add(MESH_SDF_ATLAS_RESOURCE)
38
38
  .add(MESH_SDF_SAMPLER_RESOURCE)
39
39
  .addStorageBuffer("scene_database", WebGPUArray.from(u32))
40
- .addStorageBuffer("tlas", BVH_STRUCT);
40
+ .addStorageBuffer("tlas", BVH8_TREE_TYPE);
41
41
 
42
42
  resources.createGroup()
43
43
  .addUniform("camera", CAMERA_UNIFORM_STRUCT);
@@ -16,7 +16,7 @@ import {
16
16
  MESH_SURFACE_ROWS_RESOURCE
17
17
  } from "../../../geometry/sdf/surface/MESH_SURFACE_RESOURCES.js";
18
18
  import { chunk_scene_database_access } from "../../../scene/chunk_scene_database_access.js";
19
- import { BVH_STRUCT } from "../../../shader/chunk/bvh/BVH_STRUCT.js";
19
+ import { BVH8_TREE_TYPE } from "../../../shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_tree_read.js";
20
20
  import { chunk_mat4_inverse } from "../../../shader/chunk/geometry/mat4/chunk_mat4_inverse.js";
21
21
  import { chunk_camera_ray_from_uv } from "../../../shader/chunk/geometry/ray/chunk_camera_ray_from_uv.js";
22
22
  import { F32_MAX_DEFINITION } from "../../../shader/chunk/math/F32_MAX_DEFINITION.js";
@@ -43,7 +43,7 @@ resources.createGroup()
43
43
  .add(MESH_SDF_ATLAS_RESOURCE)
44
44
  .add(MESH_SDF_SAMPLER_RESOURCE)
45
45
  .addStorageBuffer("scene_database", WebGPUArray.from(u32))
46
- .addStorageBuffer("tlas", BVH_STRUCT);
46
+ .addStorageBuffer("tlas", BVH8_TREE_TYPE);
47
47
 
48
48
  resources.createGroup()
49
49
  .add(MESH_SURFACE_RECORDS_RESOURCE)
@@ -13,13 +13,13 @@ export function bvh_buffer_size(leaf_count: number): number;
13
13
  * restated as literals — `.pack()` and WGSL layout rules decide these offsets, and a builder that
14
14
  * hard-codes them is one struct edit away from writing trees nothing can traverse.
15
15
  *
16
- * The layout every RT consumer depends on:
16
+ * The layout every reader of a binary tree depends on:
17
17
  *
18
18
  * [u32 root][node 0][node 1] ... where a node is
19
19
  * [min.x, min.y, min.z, max.x, max.y, max.z : f32][child_1 : u32][child_2 : u32]
20
20
  *
21
21
  * A node is a leaf exactly when `child_1 == BVH_NULL_NODE`, and then `child_2` carries the payload
22
- * (for the TLAS, a row in the scene database's `meshes` table). An internal node always has two
22
+ * (for the tree over a scene's instances, a row in the scene database's `meshes` table). An internal node always has two
23
23
  * real children with meaningful bounds — the distance-ordered point queries dereference both before
24
24
  * descending, so a placeholder child is not an option.
25
25
  *