@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
@@ -0,0 +1,464 @@
1
+ import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
2
+ import { ComputeShader } from "../../shader/ComputeShader.js";
3
+ import { AABB3_STRUCT } from "../../shader/chunk/geometry/aabb3/AABB3_STRUCT.js";
4
+ import {
5
+ chunk_geometry_read_triangle_bounds
6
+ } from "../../shader/chunk/geometry/format/chunk_geometry_read_triangle_bounds.js";
7
+ import { F32_MAX_DEFINITION } from "../../shader/chunk/math/F32_MAX_DEFINITION.js";
8
+ import { BVH8_BLAS_MAX_DEPTH } from "../../shader/chunk/bvh/bvh8/webgpu/BVH8_MAX_DEPTH.js";
9
+ import { chunk_bvh8_node_grid } from "../../shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_node_grid.js";
10
+ import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
11
+ import { atomic_u32, u32 } from "../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
12
+ import { WebGPUArray } from "../../shader/type/WebGPUArray.js";
13
+ import { GEOMETRY_ATTRIBUTE_DATA_TYPE } from "../GEOMETRY_ATTRIBUTE_DATA_TYPE.js";
14
+ import { GEOMETRY_METADATA_STRUCT } from "../GEOMETRY_METADATA_STRUCT.js";
15
+ import { MESHLET_METADATA_STRUCT } from "../meshlet/encoding/MESHLET_METADATA_STRUCT.js";
16
+ import { BLAS8_REFIT_TARGET_STRUCT } from "./BLAS8_REFIT_TARGET_STRUCT.js";
17
+
18
+ /**
19
+ * Nodes per workgroup. A workgroup serves one tree and one aligned run of this many of its nodes,
20
+ * which is what the lookup's second word counts in.
21
+ *
22
+ * @type {number}
23
+ */
24
+ export const BLAS8_REFIT_BATCH_WORKGROUP_SIZE = 64;
25
+
26
+ /**
27
+ * `u32` words of spine a node takes: its box's six floats, 24 bits to a word, under a flag.
28
+ *
29
+ * @type {number}
30
+ */
31
+ export const BLAS8_REFIT_SPINE_STRIDE_WORDS = 8;
32
+
33
+ const resources = new ShaderResourceSetDescriptor();
34
+
35
+ // Workgroups already covered by earlier sub-dispatches of the same batch, for a batch larger than
36
+ // the device's per-dimension cap. Four bytes, per dispatch: immediate data.
37
+ resources.setImmediate("dispatch_offset", u32);
38
+
39
+ resources.createGroup()
40
+ // one row per tree in the batch
41
+ .addStorageBuffer("targets", WebGPUArray.from(BLAS8_REFIT_TARGET_STRUCT), false)
42
+ // `(target_index, node_base)` per workgroup, flat
43
+ .addStorageBuffer("lookup", WebGPUArray.from(u32), false)
44
+ // The node arena, flat. Of a node, this kernel reads words 4 to 7 — its child block, its triangle
45
+ // run and its metas — and writes the rest: its origin, exponents and quantized boxes. Nothing it
46
+ // writes does it read, of any node.
47
+ .addStorageBuffer("nodes", WebGPUArray.from(u32), true)
48
+ // every node's box as its own lane found it, for the lane of the node above; zero at the start of
49
+ // every batch, which reads "not here yet"
50
+ .addStorageBuffer("spine", WebGPUArray.from(atomic_u32), true)
51
+ .addStorageBuffer("geometries", WebGPUArray.from(GEOMETRY_METADATA_STRUCT), false)
52
+ .addStorageBuffer("meshlet_metadata", WebGPUArray.from(MESHLET_METADATA_STRUCT), false)
53
+ .addStorageBuffer("meshlet_data", GEOMETRY_ATTRIBUTE_DATA_TYPE, false);
54
+
55
+ const body = CodeChunk.from(
56
+ //language=WGSL
57
+ `
58
+ const NODE_STRIDE = 20u;
59
+ const NODE_CHILD_BASE = 4u;
60
+ const NODE_TRIANGLE_BASE = 5u;
61
+ const NODE_METAS = 6u;
62
+ const NODE_BOXES = 8u;
63
+
64
+ const SPINE_STRIDE = ${BLAS8_REFIT_SPINE_STRIDE_WORDS}u;
65
+ const SPINE_HERE = 0x80000000u;
66
+ const SPINE_BITS = 0x00ffffffu;
67
+
68
+ // how many rounds a lane looks for its children's boxes before finding the missing ones out for itself;
69
+ // the prefix scan's count
70
+ const LOOKS = 4u;
71
+
72
+ // what a node's four words of topology say
73
+ struct Blas8RefitShape {
74
+ child_base: u32,
75
+ triangle_base: u32,
76
+ metas: vec2<u32>,
77
+ // a bit per slot that holds a child node
78
+ internal: u32,
79
+ }
80
+
81
+ struct Blas8RefitLook {
82
+ found: bool,
83
+ box: ${AABB3_STRUCT.wgsl_ref},
84
+ }
85
+
86
+ fn blas8_refit_shape(node_word: u32) -> Blas8RefitShape {
87
+ let metas = vec2<u32>(nodes[node_word + NODE_METAS], nodes[node_word + NODE_METAS + 1u]);
88
+
89
+ // a child node's meta has 24 or more in its low five bits: bits 3 and 4 both set
90
+ let first = metas.x & (metas.x >> 1u) & 0x08080808u;
91
+ let second = metas.y & (metas.y >> 1u) & 0x08080808u;
92
+
93
+ let internal =
94
+ ((first >> 3u) & 1u) | ((first >> 10u) & 2u) | ((first >> 17u) & 4u) | ((first >> 24u) & 8u)
95
+ | ((second << 1u) & 16u) | ((second >> 6u) & 32u) | ((second >> 13u) & 64u) | ((second >> 20u) & 128u);
96
+
97
+ return Blas8RefitShape(nodes[node_word + NODE_CHILD_BASE], nodes[node_word + NODE_TRIANGLE_BASE], metas, internal);
98
+ }
99
+
100
+ fn blas8_refit_slot_meta(shape: Blas8RefitShape, slot: u32) -> u32 {
101
+ return (select(shape.metas.y, shape.metas.x, slot < 4u) >> ((slot & 3u) * 8u)) & 0xffu;
102
+ }
103
+
104
+ fn blas8_refit_empty_box() -> ${AABB3_STRUCT.wgsl_ref} {
105
+ return ${AABB3_STRUCT.wgsl_ref}(vec3<f32>(F32_MAX), vec3<f32>(-F32_MAX));
106
+ }
107
+
108
+ // the box of the triangles a leaf slot names, as the vertices stand now
109
+ fn blas8_refit_slot_triangles(
110
+ geometry: ${GEOMETRY_METADATA_STRUCT.wgsl_ref},
111
+ triangle_base: u32,
112
+ slot_meta: u32,
113
+ ) -> ${AABB3_STRUCT.wgsl_ref} {
114
+ var box = blas8_refit_empty_box();
115
+
116
+ let first = triangle_base + (slot_meta & 31u);
117
+ let count = countOneBits(slot_meta >> 5u);
118
+
119
+ for (var i = 0u; i < count; i++) {
120
+ let triangle = geometry_read_triangle_bounds(geometry, first + i);
121
+
122
+ box.min = min(box.min, triangle.min);
123
+ box.max = max(box.max, triangle.max);
124
+ }
125
+
126
+ return box;
127
+ }
128
+
129
+ // A node's box goes into the spine as 192 bits, 24 to a word, each word under its own flag: a reader
130
+ // that finds all eight flags has the box, and one that does not has nothing, whatever order the
131
+ // stores reach it in.
132
+ fn blas8_refit_publish(spine_word: u32, box: ${AABB3_STRUCT.wgsl_ref}) {
133
+ let low = bitcast<vec3<u32>>(box.min);
134
+ let high = bitcast<vec3<u32>>(box.max);
135
+
136
+ atomicStore(&spine[spine_word], SPINE_HERE | (low.x & SPINE_BITS));
137
+ atomicStore(&spine[spine_word + 1u], SPINE_HERE | (low.x >> 24u) | ((low.y & 0xffffu) << 8u));
138
+ atomicStore(&spine[spine_word + 2u], SPINE_HERE | (low.y >> 16u) | ((low.z & 0xffu) << 16u));
139
+ atomicStore(&spine[spine_word + 3u], SPINE_HERE | (low.z >> 8u));
140
+ atomicStore(&spine[spine_word + 4u], SPINE_HERE | (high.x & SPINE_BITS));
141
+ atomicStore(&spine[spine_word + 5u], SPINE_HERE | (high.x >> 24u) | ((high.y & 0xffffu) << 8u));
142
+ atomicStore(&spine[spine_word + 6u], SPINE_HERE | (high.y >> 16u) | ((high.z & 0xffu) << 16u));
143
+ atomicStore(&spine[spine_word + 7u], SPINE_HERE | (high.z >> 8u));
144
+ }
145
+
146
+ fn blas8_refit_look(spine_word: u32) -> Blas8RefitLook {
147
+ var seen: Blas8RefitLook;
148
+ seen.found = false;
149
+
150
+ let w0 = atomicLoad(&spine[spine_word]);
151
+
152
+ if ((w0 & SPINE_HERE) == 0u) {
153
+ return seen;
154
+ }
155
+
156
+ let w1 = atomicLoad(&spine[spine_word + 1u]);
157
+ let w2 = atomicLoad(&spine[spine_word + 2u]);
158
+ let w3 = atomicLoad(&spine[spine_word + 3u]);
159
+ let w4 = atomicLoad(&spine[spine_word + 4u]);
160
+ let w5 = atomicLoad(&spine[spine_word + 5u]);
161
+ let w6 = atomicLoad(&spine[spine_word + 6u]);
162
+ let w7 = atomicLoad(&spine[spine_word + 7u]);
163
+
164
+ if ((w1 & w2 & w3 & w4 & w5 & w6 & w7 & SPINE_HERE) == 0u) {
165
+ return seen;
166
+ }
167
+
168
+ seen.found = true;
169
+
170
+ seen.box.min = bitcast<vec3<f32>>(vec3<u32>(
171
+ (w0 & SPINE_BITS) | ((w1 & 0xffu) << 24u),
172
+ ((w1 & SPINE_BITS) >> 8u) | ((w2 & 0xffffu) << 16u),
173
+ ((w2 & SPINE_BITS) >> 16u) | ((w3 & SPINE_BITS) << 8u),
174
+ ));
175
+
176
+ seen.box.max = bitcast<vec3<f32>>(vec3<u32>(
177
+ (w4 & SPINE_BITS) | ((w5 & 0xffu) << 24u),
178
+ ((w5 & SPINE_BITS) >> 8u) | ((w6 & 0xffffu) << 16u),
179
+ ((w6 & SPINE_BITS) >> 16u) | ((w7 & SPINE_BITS) << 8u),
180
+ ));
181
+
182
+ return seen;
183
+ }
184
+
185
+ // The box of everything under a node, found without waiting for anyone: from the triangles, except
186
+ // where a node on the way down has published, whose box is then taken as it stands.
187
+ fn blas8_refit_subtree_box(
188
+ tree: ${BLAS8_REFIT_TARGET_STRUCT.wgsl_ref},
189
+ geometry: ${GEOMETRY_METADATA_STRUCT.wgsl_ref},
190
+ root: u32,
191
+ ) -> ${AABB3_STRUCT.wgsl_ref} {
192
+ var box = blas8_refit_empty_box();
193
+
194
+ // a node, and its child slots still to take; one entry a level
195
+ var stack: array<vec2u, ${BVH8_BLAS_MAX_DEPTH}>;
196
+ var pointer = 0u;
197
+
198
+ var node = root;
199
+ var pending = 0u;
200
+ var arriving = true;
201
+
202
+ loop {
203
+ let shape = blas8_refit_shape((tree.node_offset + node) * NODE_STRIDE);
204
+
205
+ if (arriving) {
206
+ for (var slot = 0u; slot < 8u; slot++) {
207
+ let slot_meta = blas8_refit_slot_meta(shape, slot);
208
+
209
+ if (slot_meta == 0u || (shape.internal & (1u << slot)) != 0u) {
210
+ continue;
211
+ }
212
+
213
+ let triangles = blas8_refit_slot_triangles(geometry, shape.triangle_base, slot_meta);
214
+
215
+ box.min = min(box.min, triangles.min);
216
+ box.max = max(box.max, triangles.max);
217
+ }
218
+
219
+ pending = shape.internal;
220
+ }
221
+
222
+ if (pending == 0u) {
223
+ if (pointer == 0u) {
224
+ break;
225
+ }
226
+
227
+ pointer--;
228
+
229
+ node = stack[pointer].x;
230
+ pending = stack[pointer].y;
231
+ arriving = false;
232
+
233
+ continue;
234
+ }
235
+
236
+ let slot = countTrailingZeros(pending);
237
+
238
+ pending &= pending - 1u;
239
+
240
+ let child = shape.child_base + countOneBits(shape.internal & ((1u << slot) - 1u));
241
+
242
+ let seen = blas8_refit_look((tree.spine_offset + child) * SPINE_STRIDE);
243
+
244
+ if (seen.found) {
245
+ box.min = min(box.min, seen.box.min);
246
+ box.max = max(box.max, seen.box.max);
247
+
248
+ arriving = false;
249
+
250
+ continue;
251
+ }
252
+
253
+ if (pending != 0u && pointer < ${BVH8_BLAS_MAX_DEPTH}u) {
254
+ stack[pointer] = vec2u(node, pending);
255
+ pointer++;
256
+ }
257
+
258
+ node = child;
259
+ arriving = true;
260
+ }
261
+
262
+ return box;
263
+ }
264
+
265
+ @compute @workgroup_size(${BLAS8_REFIT_BATCH_WORKGROUP_SIZE}, 1, 1)
266
+ fn main(
267
+ @builtin(workgroup_id) wg: vec3<u32>,
268
+ @builtin(local_invocation_id) lid: vec3<u32>,
269
+ ) {
270
+ // Which tree, and which run of its nodes: one lookup pair per workgroup.
271
+ let pair = (wg.x + dispatch_offset) * 2u;
272
+
273
+ // ("target" is a reserved word in WGSL)
274
+ let tree = targets[lookup[pair]];
275
+
276
+ let ordinal = lookup[pair + 1u] + lid.x;
277
+
278
+ if (ordinal >= tree.node_count) {
279
+ // the tail of a tree's last run; the next workgroup is another tree's
280
+ return;
281
+ }
282
+
283
+ // Last node first. A child's index is above its parent's, so the order workgroups are started in
284
+ // is the order the nodes depend on each other in, and a lane mostly finds what it looks for.
285
+ let node = tree.node_count - 1u - ordinal;
286
+
287
+ let node_word = (tree.node_offset + node) * NODE_STRIDE;
288
+
289
+ let geometry = geometries[tree.geometry_index];
290
+
291
+ let shape = blas8_refit_shape(node_word);
292
+
293
+ var slot_low: array<vec3<f32>, 8>;
294
+ var slot_high: array<vec3<f32>, 8>;
295
+
296
+ var box = blas8_refit_empty_box();
297
+
298
+ // The slots of triangles first. They are this lane's own work and take it a while, and for that
299
+ // while the lanes of the nodes below are at theirs: by the time this one turns to its child
300
+ // nodes, a child with only triangles under it has published.
301
+ for (var slot = 0u; slot < 8u; slot++) {
302
+ let slot_meta = blas8_refit_slot_meta(shape, slot);
303
+
304
+ if (slot_meta == 0u || (shape.internal & (1u << slot)) != 0u) {
305
+ continue;
306
+ }
307
+
308
+ let under = blas8_refit_slot_triangles(geometry, shape.triangle_base, slot_meta);
309
+
310
+ slot_low[slot] = under.min;
311
+ slot_high[slot] = under.max;
312
+
313
+ box.min = min(box.min, under.min);
314
+ box.max = max(box.max, under.max);
315
+ }
316
+
317
+ let spine_word = (tree.spine_offset + node) * SPINE_STRIDE;
318
+
319
+ // A node with nothing but triangles under it has its box now, and says so now: before any lane
320
+ // of this workgroup turns to its children, which may be this node.
321
+ if (shape.internal == 0u) {
322
+ blas8_refit_publish(spine_word, box);
323
+ }
324
+
325
+ // The child nodes, looked for in rounds: every one still missing, once a round. A node whose
326
+ // children have all turned up publishes there and then, inside the round, which is what lets the
327
+ // node above it find it in the next.
328
+ var missing = shape.internal;
329
+
330
+ for (var round = 0u; round < LOOKS && missing != 0u; round++) {
331
+ var unseen = missing;
332
+
333
+ while (unseen != 0u) {
334
+ let slot = countTrailingZeros(unseen);
335
+
336
+ unseen &= unseen - 1u;
337
+
338
+ let child = shape.child_base + countOneBits(shape.internal & ((1u << slot) - 1u));
339
+
340
+ let seen = blas8_refit_look((tree.spine_offset + child) * SPINE_STRIDE);
341
+
342
+ if (!seen.found) {
343
+ continue;
344
+ }
345
+
346
+ missing &= ~(1u << slot);
347
+
348
+ slot_low[slot] = seen.box.min;
349
+ slot_high[slot] = seen.box.max;
350
+
351
+ box.min = min(box.min, seen.box.min);
352
+ box.max = max(box.max, seen.box.max);
353
+ }
354
+
355
+ if (missing == 0u) {
356
+ blas8_refit_publish(spine_word, box);
357
+ }
358
+ }
359
+
360
+ if (missing != 0u) {
361
+ // not here, and not waited for
362
+ while (missing != 0u) {
363
+ let slot = countTrailingZeros(missing);
364
+
365
+ missing &= missing - 1u;
366
+
367
+ let child = shape.child_base + countOneBits(shape.internal & ((1u << slot) - 1u));
368
+
369
+ let under = blas8_refit_subtree_box(tree, geometry, child);
370
+
371
+ slot_low[slot] = under.min;
372
+ slot_high[slot] = under.max;
373
+
374
+ box.min = min(box.min, under.min);
375
+ box.max = max(box.max, under.max);
376
+ }
377
+
378
+ blas8_refit_publish(spine_word, box);
379
+ }
380
+
381
+ // this node, on the grid of its own box, and each slot's box in bytes on it
382
+ let grid = bvh8_node_grid(box.min, box.max);
383
+
384
+ var boxes: array<u32, 12>;
385
+
386
+ for (var slot = 0u; slot < 8u; slot++) {
387
+ if (blas8_refit_slot_meta(shape, slot) == 0u) {
388
+ continue;
389
+ }
390
+
391
+ let q_low = bvh8_node_grid_low(grid, slot_low[slot]);
392
+ let q_high = bvh8_node_grid_high(grid, slot_high[slot]);
393
+
394
+ let word = slot >> 2u;
395
+ let shift = (slot & 3u) * 8u;
396
+
397
+ // per axis: two words of low bytes, then two of high
398
+ boxes[word] |= q_low.x << shift;
399
+ boxes[2u + word] |= q_high.x << shift;
400
+ boxes[4u + word] |= q_low.y << shift;
401
+ boxes[6u + word] |= q_high.y << shift;
402
+ boxes[8u + word] |= q_low.z << shift;
403
+ boxes[10u + word] |= q_high.z << shift;
404
+ }
405
+
406
+ nodes[node_word] = bitcast<u32>(box.min.x);
407
+ nodes[node_word + 1u] = bitcast<u32>(box.min.y);
408
+ nodes[node_word + 2u] = bitcast<u32>(box.min.z);
409
+ nodes[node_word + 3u] = grid.exponent.x | (grid.exponent.y << 8u) | (grid.exponent.z << 16u) | (shape.internal << 24u);
410
+
411
+ for (var i = 0u; i < 12u; i++) {
412
+ nodes[node_word + NODE_BOXES + i] = boxes[i];
413
+ }
414
+ }
415
+ `, [
416
+ F32_MAX_DEFINITION,
417
+ AABB3_STRUCT.declaration_chunk,
418
+ GEOMETRY_METADATA_STRUCT.declaration_chunk,
419
+ BLAS8_REFIT_TARGET_STRUCT.declaration_chunk,
420
+ chunk_geometry_read_triangle_bounds,
421
+ chunk_bvh8_node_grid,
422
+ ]);
423
+
424
+ /**
425
+ * Refit every BVH8 in a batch, from one dispatch.
426
+ *
427
+ * One lane per node, across every tree the batch lists. A node holds its slots' boxes on a grid of
428
+ * its own box, so a lane has two things to find: the box of everything under each of its slots, and
429
+ * from their union its own. A slot of triangles is read off the vertex buffer as it stands *now*. A
430
+ * slot that is a child node depends on that child's lane — as a tile of a prefix scan depends on the
431
+ * tiles before it, and this takes the scan's shape (`graph_prefix_scan_csdldf`):
432
+ *
433
+ * - **Published under a flag.** A lane leaves its node's box in the `spine`, box and flag in the same
434
+ * atomic words, as soon as it has it. A reader has the whole box or none of it.
435
+ * - **Looked for, not waited for.** A lane looks for its children's boxes a fixed number of rounds,
436
+ * and publishes the moment the last turns up. What has not turned up by then the lane finds out
437
+ * for itself, from the triangles under that child, taking as it stands the box of any node on the
438
+ * way down that has published. Nothing spins on another lane,
439
+ * and nothing depends on when a store reaches whom.
440
+ * - **Never in place.** Everything a lane reads to find a box out — the vertices, and the four words
441
+ * of a node that say what it holds — no lane writes. Everything a lane writes, no lane reads.
442
+ * - **In the order of the dependency.** Lanes take a tree's nodes last to first, and a child's index
443
+ * is above its parent's, so a device that starts workgroups in order runs the children first. Within
444
+ * a lane the order is the same: its own triangles, its box published if that is all there is to it,
445
+ * and only then a look at its children. A device that keeps neither order is slower and no less
446
+ * right.
447
+ *
448
+ * So there are no counters, no parents, no seeding pass and nothing to repair: a zeroed spine, then
449
+ * this, whatever the trees' depth.
450
+ *
451
+ * Boxes are rounded outward at every step that rounds, so a refitted node holds what is under it
452
+ * exactly as a built one does; it is not the same node the builder would write, whose arithmetic is
453
+ * exact where this is `f32`.
454
+ *
455
+ * For a skinned mesh this runs against the per-instance clone, after the skinning pass has deformed
456
+ * its vertex region; `geometry_index` on the row is the clone's.
457
+ *
458
+ * @type {ComputeShader}
459
+ */
460
+ export const shader_blas8_refit_batch = ComputeShader.from({
461
+ label: "BLAS8/RefitBatch",
462
+ resources,
463
+ body,
464
+ });
@@ -69,6 +69,18 @@ export class MeshletBatch {
69
69
  attribute_index: Uint32Array;
70
70
  attribute_position: Float32Array;
71
71
  };
72
+ /**
73
+ * Re-order the triangles of one meshlet: triangle `i` becomes the triangle that was at `order[i]`.
74
+ *
75
+ * Only the meshlet's index section is rewritten, in place. Vertices, attributes, bounds and the
76
+ * meshlet's address are untouched, so the meshlet draws exactly what it drew before; what changes is
77
+ * which triangle a `(meshlet, triangle)` id names. Anything that recorded such an id beforehand —
78
+ * a BLAS leaf, most of all — names a different triangle afterwards.
79
+ *
80
+ * @param {number} meshlet_id
81
+ * @param {Uint8Array|number[]} order a permutation of `0 .. primitive_count - 1`
82
+ */
83
+ reorder_triangles(meshlet_id: number, order: Uint8Array | number[]): void;
72
84
  build_bounds(): void;
73
85
  /**
74
86
  *
@@ -1 +1 @@
1
- {"version":3,"file":"MeshletBatch.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/geometry/meshlet/MeshletBatch.js"],"names":[],"mappings":"AA4DA;;GAEG;AACH;IAiBI;;;OAGG;IACH,oCAGC;IAXD,+BAEC;IA6BD;;;OAGG;IACH,wCAGC;IAfD;;;OAGG;IACH,mCAEC;IAuBD;;;OAGG;IACH,yBAEC;IAdD;;;OAGG;IACH,oBAEC;IAUD;;;OAGG;IACH,8BAEC;IAED;;;OAGG;IACH,QAFa,MAAM,CASlB;IAED;;;OAGG;IACH,cAFW,YAAY,WAQtB;IAED;;;;OAIG;IACH,YAFa,MAAM,CAiHlB;IAED;;;OAGG;IACH,iBAEC;IAED;;;;OAIG;IACH,wBAHW,MAAM,GACL,EAAE,CAeb;IAED;;;OAGG;IACH,yBAFW,MAAM;;;;MAgChB;IAiMD,qBA+BC;IAED;;;OAGG;IACH,gBAFW,QAAQ,QASlB;IAIL;;;;OAIG;IACH,yBAFU,OAAO,CAEoB;;CAPpC;uBA7iBY,OAAO,gBAAgB,EAAE,QAAQ"}
1
+ {"version":3,"file":"MeshletBatch.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/geometry/meshlet/MeshletBatch.js"],"names":[],"mappings":"AA4DA;;GAEG;AACH;IAiBI;;;OAGG;IACH,oCAGC;IAXD,+BAEC;IA6BD;;;OAGG;IACH,wCAGC;IAfD;;;OAGG;IACH,mCAEC;IAuBD;;;OAGG;IACH,yBAEC;IAdD;;;OAGG;IACH,oBAEC;IAUD;;;OAGG;IACH,8BAEC;IAED;;;OAGG;IACH,QAFa,MAAM,CASlB;IAED;;;OAGG;IACH,cAFW,YAAY,WAQtB;IAED;;;;OAIG;IACH,YAFa,MAAM,CAiHlB;IAED;;;OAGG;IACH,iBAEC;IAED;;;;OAIG;IACH,wBAHW,MAAM,GACL,EAAE,CAeb;IAED;;;OAGG;IACH,yBAFW,MAAM;;;;MAgChB;IAED;;;;;;;;;;OAUG;IACH,8BAHW,MAAM,SACN,UAAU,GAAC,MAAM,EAAE,QA0B7B;IAiMD,qBA+BC;IAED;;;OAGG;IACH,gBAFW,QAAQ,QASlB;IAIL;;;;OAIG;IACH,yBAFU,OAAO,CAEoB;;CAPpC;uBAllBY,OAAO,gBAAgB,EAAE,QAAQ"}
@@ -349,6 +349,43 @@ export class MeshletBatch {
349
349
  }
350
350
  }
351
351
 
352
+ /**
353
+ * Re-order the triangles of one meshlet: triangle `i` becomes the triangle that was at `order[i]`.
354
+ *
355
+ * Only the meshlet's index section is rewritten, in place. Vertices, attributes, bounds and the
356
+ * meshlet's address are untouched, so the meshlet draws exactly what it drew before; what changes is
357
+ * which triangle a `(meshlet, triangle)` id names. Anything that recorded such an id beforehand —
358
+ * a BLAS leaf, most of all — names a different triangle afterwards.
359
+ *
360
+ * @param {number} meshlet_id
361
+ * @param {Uint8Array|number[]} order a permutation of `0 .. primitive_count - 1`
362
+ */
363
+ reorder_triangles(meshlet_id, order) {
364
+ assert.isNonNegativeInteger(meshlet_id, 'meshlet_id');
365
+ assert.lessThan(meshlet_id, this.#count, 'index overflow');
366
+
367
+ const header = this.read_header(meshlet_id);
368
+
369
+ const primitive_count = header.primitive_count;
370
+
371
+ assert.greaterThanOrEqual(order.length, primitive_count, 'order is too short');
372
+
373
+ const bytes = new Uint8Array(this.#data, header.address << 2, primitive_count * 3);
374
+
375
+ const original = bytes.slice();
376
+
377
+ for (let i = 0; i < primitive_count; i++) {
378
+ const source = order[i] * 3;
379
+ const target = i * 3;
380
+
381
+ assert.lessThan(order[i], primitive_count, 'order names a triangle the meshlet does not have');
382
+
383
+ bytes[target] = original[source];
384
+ bytes[target + 1] = original[source + 1];
385
+ bytes[target + 2] = original[source + 2];
386
+ }
387
+ }
388
+
352
389
  /**
353
390
  *
354
391
  * @param {Geometry} geometry
@@ -1 +1 @@
1
- {"version":3,"file":"shader_mesh_sdf_classify.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/geometry/sdf/bake/shader_mesh_sdf_classify.js"],"names":[],"mappings":"AAyCA;;;;;GAKG;AACH,mDAFW,OAAO,2DAA2D,EAAE,6BAA6B,QAS3G;AA/BD;;GAEG;AACH,yCAFU,YAAY,CAeQ;AA6B9B;;;;;;;;;;;;;;;GAeG;AACH,uCAFU,aAAa,CAsDpB;6BA/H0B,sCAAsC;8BAJrC,kCAAkC"}
1
+ {"version":3,"file":"shader_mesh_sdf_classify.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/geometry/sdf/bake/shader_mesh_sdf_classify.js"],"names":[],"mappings":"AAyCA;;;;;GAKG;AACH,mDAFW,OAAO,2DAA2D,EAAE,6BAA6B,QAS3G;AA/BD;;GAEG;AACH,yCAFU,YAAY,CAeQ;AA6B9B;;;;;;;;;;;;;;;GAeG;AACH,uCAFU,aAAa,CAsDpB;6BAjI0B,sCAAsC;8BAJrC,kCAAkC"}
@@ -1,6 +1,4 @@
1
1
  import { UINT32_MAX } from "../../../../../core/binary/UINT32_MAX.js";
2
- import { BVH2_NODE_STRUCT } from "../../../shader/chunk/bvh/BVH2_NODE_STRUCT.js";
3
- import { BVH_TRAVERSAL_STACK_SIZE } from "../../../shader/chunk/bvh/BVH_TRAVERSAL_STACK_SIZE.js";
4
2
  import { chunk_point_query_blas_nearest } from "../../../shader/chunk/sdf/chunk_point_query_blas_nearest.js";
5
3
  import { CodeChunk } from "../../../shader/compiler/CodeChunk.js";
6
4
  import { ComputeShader } from "../../../shader/ComputeShader.js";
@@ -20,6 +18,8 @@ import {
20
18
  MESH_SDF_RANGES_RESOURCE
21
19
  } from "./chunk_mesh_sdf_bake.js";
22
20
  import { MESH_SDF_BAKE_WORKGROUP_SIZE } from "./MESH_SDF_BAKE.js";
21
+ import { BVH8_INODE_STRUCT } from "../../../shader/chunk/bvh/bvh8/webgpu/BVH8_INODE_STRUCT.js";
22
+ import { BVH8_TRAVERSAL_STACK_SIZE } from "../../../shader/chunk/bvh/bvh8/webgpu/BVH8_MAX_DEPTH.js";
23
23
 
24
24
  /**
25
25
  * @type {WebGPUStruct}
@@ -48,7 +48,7 @@ export const MESH_SDF_CLASSIFY_SETTINGS = WebGPUStruct.from({
48
48
  export function mesh_sdf_add_blas_resources(group) {
49
49
  group
50
50
  .addStorageBuffer("blas_lookup", WebGPUArray.u32)
51
- .addStorageBuffer("blas_data", WebGPUArray.from(BVH2_NODE_STRUCT))
51
+ .addStorageBuffer("blas_data", WebGPUArray.from(BVH8_INODE_STRUCT))
52
52
  .addStorageBuffer("geometries", WebGPUArray.from(GEOMETRY_METADATA_STRUCT))
53
53
  .add(MESHLET_METADATA_RESOURCE)
54
54
  .add(GEOMETRY_ATTRIBUTE_DATA_RESOURCE);
@@ -113,7 +113,7 @@ fn main(
113
113
  let centre = mesh_sdf_brick_corner(header, brick) + vec3<f32>(0.5 * f32(MESH_SDF_BRICK_VOXELS) * voxel);
114
114
  let reach = (MESH_SDF_BAND_VOXELS + MESH_SDF_BRICK_HALF_DIAGONAL) * voxel;
115
115
 
116
- var stack: array<u32, ${BVH_TRAVERSAL_STACK_SIZE}>;
116
+ var stack: array<vec2u, ${BVH8_TRAVERSAL_STACK_SIZE}>;
117
117
 
118
118
  let nearest = point_query_blas_nearest(centre, reach, geometry, &stack, 0u);
119
119
 
@@ -1 +1 @@
1
- {"version":3,"file":"shader_mesh_sdf_evaluate.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/geometry/sdf/bake/shader_mesh_sdf_evaluate.js"],"names":[],"mappings":"AAcA;;GAEG;AACH,yCAFU,YAAY,CAWQ;AAe9B;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,uCAFU,aAAa,CAoFpB;6BA3I0B,sCAAsC;8BAJrC,kCAAkC"}
1
+ {"version":3,"file":"shader_mesh_sdf_evaluate.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/geometry/sdf/bake/shader_mesh_sdf_evaluate.js"],"names":[],"mappings":"AAcA;;GAEG;AACH,yCAFU,YAAY,CAWQ;AAe9B;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,uCAFU,aAAa,CAoFpB;6BA5I0B,sCAAsC;8BAJrC,kCAAkC"}
@@ -1,4 +1,3 @@
1
- import { BVH_TRAVERSAL_STACK_SIZE } from "../../../shader/chunk/bvh/BVH_TRAVERSAL_STACK_SIZE.js";
2
1
  import { SURFACE_POINT_3D } from "../../../shader/chunk/sdf/SURFACE_POINT_3D.js";
3
2
  import { CodeChunk } from "../../../shader/compiler/CodeChunk.js";
4
3
  import { ComputeShader } from "../../../shader/ComputeShader.js";
@@ -11,6 +10,7 @@ import { MESH_SDF_HEADERS_RESOURCE } from "../MESH_SDF_RESOURCES.js";
11
10
  import { chunk_mesh_sdf_bake, chunk_mesh_sdf_bake_settle, MESH_SDF_ARENA_RESOURCE } from "./chunk_mesh_sdf_bake.js";
12
11
  import { MESH_SDF_BAKE_WORKGROUP_SIZE } from "./MESH_SDF_BAKE.js";
13
12
  import { mesh_sdf_add_blas_resources } from "./shader_mesh_sdf_classify.js";
13
+ import { BVH8_TRAVERSAL_STACK_SIZE } from "../../../shader/chunk/bvh/bvh8/webgpu/BVH8_MAX_DEPTH.js";
14
14
 
15
15
  /**
16
16
  * @type {WebGPUStruct}
@@ -93,7 +93,7 @@ fn main(
93
93
  let texel = (workgroup_id.x % MESH_SDF_GROUPS_PER_BRICK) * MESH_SDF_BAKE_WORKGROUP_SIZE + lane;
94
94
  let point = mesh_sdf_brick_corner(header, brick) + vec3<f32>(vec3<u32>(texel % t, (texel / t) % t, texel / (t * t))) * voxel;
95
95
 
96
- var stack: array<u32, ${BVH_TRAVERSAL_STACK_SIZE}>;
96
+ var stack: array<vec2u, ${BVH8_TRAVERSAL_STACK_SIZE}>;
97
97
  var contact: ${SURFACE_POINT_3D.wgsl_ref};
98
98
 
99
99
  let band = MESH_SDF_BAND_VOXELS * voxel;
@@ -1 +1 @@
1
- {"version":3,"file":"chunk_blas_query_band_sdf.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/geometry/sdf/chunk_blas_query_band_sdf.js"],"names":[],"mappings":"AAgBA;;;;GAIG;AACH,oCAFU,MAAM,CAEuB;AAEvC;;;GAGG;AACH,kCAFU,MAAM,CAEqE;AAErF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wCAFU,SAAS,CAgHjB;0BAjJwB,oCAAoC"}
1
+ {"version":3,"file":"chunk_blas_query_band_sdf.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/geometry/sdf/chunk_blas_query_band_sdf.js"],"names":[],"mappings":"AAgBA;;;;GAIG;AACH,oCAFU,MAAM,CAEuB;AAEvC;;;GAGG;AACH,kCAFU,MAAM,CAEqE;AAErF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wCAFU,SAAS,CAgHjB;0BAlJwB,oCAAoC"}
@@ -1,5 +1,4 @@
1
1
  import { UINT32_MAX } from "../../../../core/binary/UINT32_MAX.js";
2
- import { BVH_TRAVERSAL_STACK_SIZE } from "../../shader/chunk/bvh/BVH_TRAVERSAL_STACK_SIZE.js";
3
2
  import {
4
3
  chunk_geometry_read_triangle_vertices
5
4
  } from "../../shader/chunk/geometry/format/chunk_geometry_read_triangle_vertices.js";
@@ -13,6 +12,7 @@ import { PI_DECLARATION } from "../../shader/chunk/math/PI_DECLARATION.js";
13
12
  import { chunk_point_query_blas_nearest } from "../../shader/chunk/sdf/chunk_point_query_blas_nearest.js";
14
13
  import { SURFACE_POINT_3D } from "../../shader/chunk/sdf/SURFACE_POINT_3D.js";
15
14
  import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
15
+ import { BVH8_TRAVERSAL_STACK_SIZE } from "../../shader/chunk/bvh/bvh8/webgpu/BVH8_MAX_DEPTH.js";
16
16
 
17
17
  /**
18
18
  * Strata along a side of each of the vote's two hemispheres, as UE 5.4 has them: 7 × 7 directions a
@@ -101,7 +101,7 @@ fn blas_query_band_sdf(
101
101
  band: f32,
102
102
  two_sided: bool,
103
103
  contact: ptr<function, ${SURFACE_POINT_3D.wgsl_ref}>,
104
- traversal_stack: ptr<function, array<u32, ${BVH_TRAVERSAL_STACK_SIZE}>>,
104
+ traversal_stack: ptr<function, array<vec2u, ${BVH8_TRAVERSAL_STACK_SIZE}>>,
105
105
  stack_top: u32
106
106
  ) -> f32 {
107
107
  *contact = point_query_blas_nearest(point, band, geometry_index, traversal_stack, stack_top);
@@ -1 +1 @@
1
- {"version":3,"file":"shader_sdf_visualize.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/geometry/sdf/shader_sdf_visualize.js"],"names":[],"mappings":"AAqKA;;;;;;;;;;;GAWG;AACH;IAT+B,KAAK;IACD,IAAI;IACZ,WAAW,EAA3B,MAAM;IACU,SAAS,EAAzB,MAAM;IACU,gBAAgB,EAAhC,MAAM;IACU,sBAAsB,EAAtC,MAAM;IAEJ,MAAM,CAsGlB;AA3HD,+CASG;4BAvIyB,6BAA6B"}
1
+ {"version":3,"file":"shader_sdf_visualize.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/geometry/sdf/shader_sdf_visualize.js"],"names":[],"mappings":"AAqKA;;;;;;;;;;;GAWG;AACH;IAT+B,KAAK;IACD,IAAI;IACZ,WAAW,EAA3B,MAAM;IACU,SAAS,EAAzB,MAAM;IACU,gBAAgB,EAAhC,MAAM;IACU,sBAAsB,EAAtC,MAAM;IAEJ,MAAM,CAsGlB;AA3HD,+CASG;4BAxIyB,6BAA6B"}
@@ -11,8 +11,7 @@ import {
11
11
  } from "./MESH_SDF_RESOURCES.js";
12
12
  import { CAMERA_UNIFORM_STRUCT } from "../../camera/CAMERA_UNIFORM_STRUCT.js";
13
13
  import { DEPTH_BACKGROUND_VALUE } from "../../depth/DEPTH_BACKGROUND_VALUE.js";
14
- import { BVH2_NODE_STRUCT } from "../../shader/chunk/bvh/BVH2_NODE_STRUCT.js";
15
- import { BVH_STRUCT } from "../../shader/chunk/bvh/BVH_STRUCT.js";
14
+ import { BVH8_TREE_TYPE } from "../../shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_tree_read.js";
16
15
  import { chunk_project_position_from_depth } from "../../shader/chunk/camera/chunk_project_position_from_depth.js";
17
16
  import { chunk_hash_u32_to_v4f32 } from "../../shader/chunk/color/chunk_hash_u32_to_v4f32.js";
18
17
  import {
@@ -34,6 +33,7 @@ import { chunk_ray_query_sdf_raycast } from "../../shadow/sdf/chunk_ray_query_sd
34
33
  import { SDF_DRAW_SETTINGS_STRUCT } from "../../shadow/sdf/SDF_DRAW_SETTINGS_STRUCT.js";
35
34
  import { GEOMETRY_METADATA_STRUCT } from "../GEOMETRY_METADATA_STRUCT.js";
36
35
  import { dynamic_chunk_sdf_construct_normal } from "./dynamic_chunk_sdf_construct_normal.js";
36
+ import { BVH8_INODE_STRUCT } from "../../shader/chunk/bvh/bvh8/webgpu/BVH8_INODE_STRUCT.js";
37
37
 
38
38
  const resources = new ShaderResourceSetDescriptor();
39
39
 
@@ -53,12 +53,12 @@ resources.createGroup()
53
53
  resources.createGroup()
54
54
  .addStorageBuffer("geometries", WebGPUArray.from(GEOMETRY_METADATA_STRUCT))
55
55
  .addStorageBuffer("scene_database", WebGPUArray.from(u32))
56
- .addStorageBuffer("tlas", BVH_STRUCT);
56
+ .addStorageBuffer("tlas", BVH8_TREE_TYPE);
57
57
 
58
58
  // debug
59
59
  resources.createGroup()
60
60
  .addStorageBuffer("blas_lookup", WebGPUArray.u32)
61
- .addStorageBuffer("blas_data", WebGPUArray.from(BVH2_NODE_STRUCT))
61
+ .addStorageBuffer("blas_data", WebGPUArray.from(BVH8_INODE_STRUCT))
62
62
 
63
63
  resources.createGroup()
64
64
  .addUniform("camera", CAMERA_UNIFORM_STRUCT);