@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,222 @@
1
+ import { CodeChunk } from "../../../../compiler/CodeChunk.js";
2
+ import { chunk_extract_byte } from "../../../binary/chunk_extract_byte.js";
3
+ import { BVH8_INODE_STRUCT } from "./BVH8_INODE_STRUCT.js";
4
+
5
+ /**
6
+ * Squared distance from a point to the box of each of a BVH8 node's eight slots, and what a walk that
7
+ * is not a ray's needs to know of a slot besides.
8
+ *
9
+ * A node stores one origin and one power-of-two step per axis, and each slot's box as bytes on that
10
+ * grid, four slots to a word. `bvh8_node_slot_distances_sqr` decodes a word at a time. The builder
11
+ * rounded each box's low corner down and its high corner up, so a distance here is never more than
12
+ * the distance to anything under the slot. An empty slot's distance means nothing: mask it with the
13
+ * node's internal mask, or with the slots' runs, both of which leave an empty slot out.
14
+ *
15
+ * `bvh8_node_slot_signed_distances` is the same for a walk that prunes by a signed field: the distance
16
+ * itself, not its square, and below zero inside a box, where it is how far the nearest face is. A
17
+ * slot's box holds everything under the slot, so nothing under it is nearer than that, by sign too.
18
+ *
19
+ * `bvh8_node_slots_meeting` is the question a box asks: a bit per slot whose box it meets, touching
20
+ * counted. An empty slot's bit means nothing there either.
21
+ *
22
+ * Every question a walk asks is answered for the eight slots at once, of either kind of distance:
23
+ *
24
+ * - `bvh8_slots_within` — a bit per slot whose box is nearer than a limit;
25
+ * - `bvh8_nearest_slot_among` — the nearest of the slots named by such bits;
26
+ * - `bvh8_node_slot_runs` and `bvh8_slot_runs_within` — the triangles held by the slots nearer than a
27
+ * limit, a bit per triangle of the node's run, so that a walk weighs triangles one after another
28
+ * with no slot in between;
29
+ * - `bvh8_slot_runs_of` — the same of the slots named by bits.
30
+ *
31
+ * A slot's meta byte is zero for an empty slot, has 24 and up in its low five bits for a child node,
32
+ * and otherwise names triangles: their offset in the node's run in the low five bits, their count in
33
+ * unary above. A node holds at most 24 triangles, so the bits of a run stay below 24 and those a child
34
+ * node's byte makes land above.
35
+ *
36
+ * @type {CodeChunk}
37
+ */
38
+ export const chunk_bvh8_node_slot_distances = CodeChunk.from(
39
+ //language=WGSL
40
+ `
41
+ // a distance to slots 0..3 and to slots 4..7: squared, or signed, as the function that made it says
42
+ struct BVH8SlotDistances {
43
+ first: vec4<f32>,
44
+ second: vec4<f32>,
45
+ }
46
+
47
+ // each slot's triangles as bits of the node's run, slots 0..3 and slots 4..7;
48
+ // a child node's bits are at 24 and up, an empty slot has none
49
+ struct BVH8SlotRuns {
50
+ first: vec4<u32>,
51
+ second: vec4<u32>,
52
+ }
53
+
54
+ fn bvh8_word_bytes(word: u32) -> vec4<f32> {
55
+ return vec4<f32>((vec4<u32>(word) >> vec4<u32>(0u, 8u, 16u, 24u)) & vec4<u32>(0xffu));
56
+ }
57
+
58
+ // how far a coordinate lies beyond four slots' extents along one axis: above zero outside them, and
59
+ // within them below zero by the distance to the nearer end;
60
+ // 'along' is the coordinate measured from the node's origin, 'cell' the grid's step on the axis
61
+ fn bvh8_axis_beyond(low_word: u32, high_word: u32, cell: f32, along: f32) -> vec4<f32> {
62
+ return max(bvh8_word_bytes(low_word) * cell - along, along - bvh8_word_bytes(high_word) * cell);
63
+ }
64
+
65
+ // how far a coordinate lies outside four slots' extents along one axis, zero within them
66
+ fn bvh8_axis_outside(low_word: u32, high_word: u32, cell: f32, along: f32) -> vec4<f32> {
67
+ return max(bvh8_axis_beyond(low_word, high_word, cell, along), vec4<f32>(0.0));
68
+ }
69
+
70
+ // the signed distance to four boxes, from how far the point lies beyond each along the three axes
71
+ fn bvh8_signed_from_beyond(x: vec4<f32>, y: vec4<f32>, z: vec4<f32>) -> vec4<f32> {
72
+ let zero = vec4<f32>(0.0);
73
+
74
+ let outside_x = max(x, zero);
75
+ let outside_y = max(y, zero);
76
+ let outside_z = max(z, zero);
77
+
78
+ return sqrt(outside_x * outside_x + outside_y * outside_y + outside_z * outside_z) + min(max(x, max(y, z)), zero);
79
+ }
80
+
81
+ fn bvh8_node_slot_distances_sqr(node: ${BVH8_INODE_STRUCT.wgsl_ref}, position: vec3<f32>) -> BVH8SlotDistances {
82
+ let exponents = node.data[0].w;
83
+
84
+ let cell = vec3<f32>(
85
+ bitcast<f32>(extract_byte(exponents, 0u) << 23u),
86
+ bitcast<f32>(extract_byte(exponents, 1u) << 23u),
87
+ bitcast<f32>(extract_byte(exponents, 2u) << 23u),
88
+ );
89
+
90
+ let along = position - bitcast<vec3<f32>>(node.data[0].xyz);
91
+
92
+ let x_first = bvh8_axis_outside(node.data[2].x, node.data[2].z, cell.x, along.x);
93
+ let y_first = bvh8_axis_outside(node.data[3].x, node.data[3].z, cell.y, along.y);
94
+ let z_first = bvh8_axis_outside(node.data[4].x, node.data[4].z, cell.z, along.z);
95
+
96
+ let x_second = bvh8_axis_outside(node.data[2].y, node.data[2].w, cell.x, along.x);
97
+ let y_second = bvh8_axis_outside(node.data[3].y, node.data[3].w, cell.y, along.y);
98
+ let z_second = bvh8_axis_outside(node.data[4].y, node.data[4].w, cell.z, along.z);
99
+
100
+ return BVH8SlotDistances(
101
+ x_first * x_first + y_first * y_first + z_first * z_first,
102
+ x_second * x_second + y_second * y_second + z_second * z_second,
103
+ );
104
+ }
105
+
106
+ fn bvh8_node_slot_signed_distances(node: ${BVH8_INODE_STRUCT.wgsl_ref}, position: vec3<f32>) -> BVH8SlotDistances {
107
+ let exponents = node.data[0].w;
108
+
109
+ let cell = vec3<f32>(
110
+ bitcast<f32>(extract_byte(exponents, 0u) << 23u),
111
+ bitcast<f32>(extract_byte(exponents, 1u) << 23u),
112
+ bitcast<f32>(extract_byte(exponents, 2u) << 23u),
113
+ );
114
+
115
+ let along = position - bitcast<vec3<f32>>(node.data[0].xyz);
116
+
117
+ return BVH8SlotDistances(
118
+ bvh8_signed_from_beyond(
119
+ bvh8_axis_beyond(node.data[2].x, node.data[2].z, cell.x, along.x),
120
+ bvh8_axis_beyond(node.data[3].x, node.data[3].z, cell.y, along.y),
121
+ bvh8_axis_beyond(node.data[4].x, node.data[4].z, cell.z, along.z),
122
+ ),
123
+ bvh8_signed_from_beyond(
124
+ bvh8_axis_beyond(node.data[2].y, node.data[2].w, cell.x, along.x),
125
+ bvh8_axis_beyond(node.data[3].y, node.data[3].w, cell.y, along.y),
126
+ bvh8_axis_beyond(node.data[4].y, node.data[4].w, cell.z, along.z),
127
+ ),
128
+ );
129
+ }
130
+
131
+ // a bit per slot whose box meets the box from 'low' to 'high', touching counted
132
+ fn bvh8_node_slots_meeting(node: ${BVH8_INODE_STRUCT.wgsl_ref}, low: vec3<f32>, high: vec3<f32>) -> u32 {
133
+ let exponents = node.data[0].w;
134
+
135
+ let cell = vec3<f32>(
136
+ bitcast<f32>(extract_byte(exponents, 0u) << 23u),
137
+ bitcast<f32>(extract_byte(exponents, 1u) << 23u),
138
+ bitcast<f32>(extract_byte(exponents, 2u) << 23u),
139
+ );
140
+
141
+ let origin = bitcast<vec3<f32>>(node.data[0].xyz);
142
+
143
+ // the box, measured from the node's origin as its slots' are
144
+ let box_low = low - origin;
145
+ let box_high = high - origin;
146
+
147
+ let first = (bvh8_word_bytes(node.data[2].x) * cell.x <= vec4<f32>(box_high.x)) & (bvh8_word_bytes(node.data[2].z) * cell.x >= vec4<f32>(box_low.x))
148
+ & (bvh8_word_bytes(node.data[3].x) * cell.y <= vec4<f32>(box_high.y)) & (bvh8_word_bytes(node.data[3].z) * cell.y >= vec4<f32>(box_low.y))
149
+ & (bvh8_word_bytes(node.data[4].x) * cell.z <= vec4<f32>(box_high.z)) & (bvh8_word_bytes(node.data[4].z) * cell.z >= vec4<f32>(box_low.z));
150
+
151
+ let second = (bvh8_word_bytes(node.data[2].y) * cell.x <= vec4<f32>(box_high.x)) & (bvh8_word_bytes(node.data[2].w) * cell.x >= vec4<f32>(box_low.x))
152
+ & (bvh8_word_bytes(node.data[3].y) * cell.y <= vec4<f32>(box_high.y)) & (bvh8_word_bytes(node.data[3].w) * cell.y >= vec4<f32>(box_low.y))
153
+ & (bvh8_word_bytes(node.data[4].y) * cell.z <= vec4<f32>(box_high.z)) & (bvh8_word_bytes(node.data[4].w) * cell.z >= vec4<f32>(box_low.z));
154
+
155
+ let bits = select(vec4<u32>(0u), vec4<u32>(1u, 2u, 4u, 8u), first)
156
+ | select(vec4<u32>(0u), vec4<u32>(16u, 32u, 64u, 128u), second);
157
+
158
+ return bits.x | bits.y | bits.z | bits.w;
159
+ }
160
+
161
+ // a bit per slot whose box is nearer than the limit
162
+ fn bvh8_slots_within(distances: BVH8SlotDistances, limit_sqr: f32) -> u32 {
163
+ let first = select(vec4<u32>(0u), vec4<u32>(1u, 2u, 4u, 8u), distances.first < vec4<f32>(limit_sqr));
164
+ let second = select(vec4<u32>(0u), vec4<u32>(16u, 32u, 64u, 128u), distances.second < vec4<f32>(limit_sqr));
165
+
166
+ let bits = first | second;
167
+
168
+ return bits.x | bits.y | bits.z | bits.w;
169
+ }
170
+
171
+ // the nearest of the slots named, the lowest of them when several are as near;
172
+ // 'slots' must name one, and none whose distance is infinite
173
+ fn bvh8_nearest_slot_among(distances: BVH8SlotDistances, slots: u32) -> u32 {
174
+ // a slot not named stands as far as a number goes, and is told from a named one that far by its bit
175
+ let far = vec4<f32>(3.4028234e38);
176
+
177
+ let first = select(far, distances.first, (vec4<u32>(slots) & vec4<u32>(1u, 2u, 4u, 8u)) != vec4<u32>(0u));
178
+ let second = select(far, distances.second, (vec4<u32>(slots) & vec4<u32>(16u, 32u, 64u, 128u)) != vec4<u32>(0u));
179
+
180
+ let least_of_pair = min(first, second);
181
+ let least = min(min(least_of_pair.x, least_of_pair.y), min(least_of_pair.z, least_of_pair.w));
182
+
183
+ let first_bits = select(vec4<u32>(0u), vec4<u32>(1u, 2u, 4u, 8u), first == vec4<f32>(least));
184
+ let second_bits = select(vec4<u32>(0u), vec4<u32>(16u, 32u, 64u, 128u), second == vec4<f32>(least));
185
+
186
+ let bits = first_bits | second_bits;
187
+
188
+ return countTrailingZeros((bits.x | bits.y | bits.z | bits.w) & slots);
189
+ }
190
+
191
+ fn bvh8_node_slot_runs(node: ${BVH8_INODE_STRUCT.wgsl_ref}) -> BVH8SlotRuns {
192
+ let shifts = vec4<u32>(0u, 8u, 16u, 24u);
193
+
194
+ let meta_first = (vec4<u32>(node.data[1].z) >> shifts) & vec4<u32>(0xffu);
195
+ let meta_second = (vec4<u32>(node.data[1].w) >> shifts) & vec4<u32>(0xffu);
196
+
197
+ return BVH8SlotRuns(
198
+ (meta_first >> vec4<u32>(5u)) << (meta_first & vec4<u32>(31u)),
199
+ (meta_second >> vec4<u32>(5u)) << (meta_second & vec4<u32>(31u)),
200
+ );
201
+ }
202
+
203
+ // the triangles of the slots named, a bit per triangle of the node's run
204
+ fn bvh8_slot_runs_of(runs: BVH8SlotRuns, slots: u32) -> u32 {
205
+ let bits = select(vec4<u32>(0u), runs.first, (vec4<u32>(slots) & vec4<u32>(1u, 2u, 4u, 8u)) != vec4<u32>(0u))
206
+ | select(vec4<u32>(0u), runs.second, (vec4<u32>(slots) & vec4<u32>(16u, 32u, 64u, 128u)) != vec4<u32>(0u));
207
+
208
+ return (bits.x | bits.y | bits.z | bits.w) & 0xffffffu;
209
+ }
210
+
211
+ // the triangles of the slots whose boxes are nearer than the limit, a bit per triangle of the node's run
212
+ fn bvh8_slot_runs_within(runs: BVH8SlotRuns, distances: BVH8SlotDistances, limit_sqr: f32) -> u32 {
213
+ let bits = select(vec4<u32>(0u), runs.first, distances.first < vec4<f32>(limit_sqr))
214
+ | select(vec4<u32>(0u), runs.second, distances.second < vec4<f32>(limit_sqr));
215
+
216
+ return (bits.x | bits.y | bits.z | bits.w) & 0xffffffu;
217
+ }
218
+ `, [
219
+ BVH8_INODE_STRUCT.declaration_chunk,
220
+ chunk_extract_byte,
221
+ ]
222
+ );
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Reciprocal of a ray's direction for {@link chunk_bvh8_node_intersect}, finite on every axis.
3
+ *
4
+ * The node test places a child's planes as `q * (e / d) + (p - o) / d`. With a component of `d` at
5
+ * zero both terms are infinite, their sum is a NaN, and what `min` and `max` make of a NaN is up to the
6
+ * device: one drops it and reaches every node whose other two slabs the ray crosses, another keeps it
7
+ * and misses the node the ray is inside of. So a component is never let closer to zero than 2^-80, and
8
+ * keeps its sign — `-0.0` counts as positive, which is how {@link chunk_ray_get_octant_inv4} and the
9
+ * node test's own near/far selection read it.
10
+ *
11
+ * 2^-80 is from the reference implementation. Its reciprocal times a distance stays finite for
12
+ * distances up to 2^47, and a ray would have to travel 2^56 units for a component that small to move it
13
+ * by one part in 2^24 of a unit.
14
+ *
15
+ * @see https://github.com/jan-van-bergen/GPU-Raytracer/blob/6559ae2241c8fdea0ddaec959fe1a47ec9b3ab0d/Src/CUDA/Raytracing/BVH8.h#L29
16
+ * @type {CodeChunk}
17
+ */
18
+ export const chunk_bvh8_ray_direction_rcp: CodeChunk;
19
+ import { CodeChunk } from "../../../../compiler/CodeChunk.js";
20
+ //# sourceMappingURL=chunk_bvh8_ray_direction_rcp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk_bvh8_ray_direction_rcp.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_ray_direction_rcp.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;GAgBG;AACH,2CAFU,SAAS,CAYjB;0BA7BwB,mCAAmC"}
@@ -0,0 +1,30 @@
1
+ import { CodeChunk } from "../../../../compiler/CodeChunk.js";
2
+
3
+ /**
4
+ * Reciprocal of a ray's direction for {@link chunk_bvh8_node_intersect}, finite on every axis.
5
+ *
6
+ * The node test places a child's planes as `q * (e / d) + (p - o) / d`. With a component of `d` at
7
+ * zero both terms are infinite, their sum is a NaN, and what `min` and `max` make of a NaN is up to the
8
+ * device: one drops it and reaches every node whose other two slabs the ray crosses, another keeps it
9
+ * and misses the node the ray is inside of. So a component is never let closer to zero than 2^-80, and
10
+ * keeps its sign — `-0.0` counts as positive, which is how {@link chunk_ray_get_octant_inv4} and the
11
+ * node test's own near/far selection read it.
12
+ *
13
+ * 2^-80 is from the reference implementation. Its reciprocal times a distance stays finite for
14
+ * distances up to 2^47, and a ray would have to travel 2^56 units for a component that small to move it
15
+ * by one part in 2^24 of a unit.
16
+ *
17
+ * @see https://github.com/jan-van-bergen/GPU-Raytracer/blob/6559ae2241c8fdea0ddaec959fe1a47ec9b3ab0d/Src/CUDA/Raytracing/BVH8.h#L29
18
+ * @type {CodeChunk}
19
+ */
20
+ export const chunk_bvh8_ray_direction_rcp = CodeChunk.from(
21
+ //language=WGSL
22
+ `
23
+ fn bvh8_ray_direction_rcp(direction: vec3<f32>) -> vec3<f32> {
24
+ // 2^-80
25
+ let least = vec3<f32>(8.271806e-25);
26
+
27
+ return 1.0 / select(max(direction, least), min(direction, -least), direction < vec3<f32>(0.0));
28
+ }
29
+ `
30
+ );
@@ -0,0 +1,30 @@
1
+ /**
2
+ * What a BVH8 that owns its buffer is bound as: the layout of {@link BVH8_TREE_BUFFER_LAYOUT}, every
3
+ * part of which is a whole number of `vec4<u32>`.
4
+ *
5
+ * @type {WebGPUArray}
6
+ */
7
+ export const BVH8_TREE_TYPE: WebGPUArray;
8
+ /**
9
+ * Reads of a BVH8 that owns its buffer ({@link BVH8_TREE_BUFFER_LAYOUT}), bound as
10
+ * {@link BVH8_TREE_TYPE}:
11
+ *
12
+ * ```wgsl
13
+ * fn bvh8_tree_read_node(tree, index: u32) -> BVH8Node
14
+ * fn bvh8_tree_read_payload(tree, node: BVH8Node, offset: u32) -> u32
15
+ * fn bvh8_tree_leaf_count(tree) -> u32
16
+ * fn bvh8_tree_bounds_low(tree) -> vec3<f32>
17
+ * fn bvh8_tree_bounds_high(tree) -> vec3<f32>
18
+ * ```
19
+ *
20
+ * A node's leaf slots each hold one leaf, and a walk has them as bits of the node's run, as it has a
21
+ * mesh's triangles: `bvh8_tree_read_payload` gives the payload of the leaf at an offset in that run.
22
+ *
23
+ * The root is node 0, and a tree of no leaves has one: a walk starts there without asking.
24
+ *
25
+ * @type {CodeChunk}
26
+ */
27
+ export const chunk_bvh8_tree_read: CodeChunk;
28
+ import { WebGPUArray } from "../../../../type/WebGPUArray.js";
29
+ import { CodeChunk } from "../../../../compiler/CodeChunk.js";
30
+ //# sourceMappingURL=chunk_bvh8_tree_read.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk_bvh8_tree_read.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_tree_read.js"],"names":[],"mappings":"AAcA;;;;;GAKG;AACH,6BAFU,WAAW,CAEiC;AAgBtD;;;;;;;;;;;;;;;;;;GAkBG;AACH,mCAFU,SAAS,CAqCjB;4BA/E0B,iCAAiC;0BAFnC,mCAAmC"}
@@ -0,0 +1,91 @@
1
+ import { assert } from "../../../../../../../core/assert.js";
2
+ import {
3
+ BVH8_TREE_BOUNDS_HIGH_WORD,
4
+ BVH8_TREE_BOUNDS_LOW_WORD,
5
+ BVH8_TREE_HEADER_WORDS,
6
+ BVH8_TREE_LEAF_COUNT_WORD,
7
+ BVH8_TREE_NODE_STRIDE_WORDS,
8
+ BVH8_TREE_ORDER_OFFSET_WORD
9
+ } from "../../../../../gpu_primitive/bvh8/BVH8_TREE_BUFFER_LAYOUT.js";
10
+ import { CodeChunk } from "../../../../compiler/CodeChunk.js";
11
+ import { vec4u } from "../../../../type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
12
+ import { WebGPUArray } from "../../../../type/WebGPUArray.js";
13
+ import { BVH8_INODE_STRUCT } from "./BVH8_INODE_STRUCT.js";
14
+
15
+ /**
16
+ * What a BVH8 that owns its buffer is bound as: the layout of {@link BVH8_TREE_BUFFER_LAYOUT}, every
17
+ * part of which is a whole number of `vec4<u32>`.
18
+ *
19
+ * @type {WebGPUArray}
20
+ */
21
+ export const BVH8_TREE_TYPE = WebGPUArray.from(vec4u);
22
+
23
+ // the header's fields are read as components of its two vectors, and a node as five whole vectors
24
+ const HEADER_VECTORS = BVH8_TREE_HEADER_WORDS / 4;
25
+ const NODE_VECTORS = BVH8_TREE_NODE_STRIDE_WORDS / 4;
26
+
27
+ const COMPONENTS = 'xyzw';
28
+
29
+ assert.equal(BVH8_TREE_BOUNDS_LOW_WORD, 0, 'the reads below take the low corner from the first vector');
30
+ assert.equal(BVH8_TREE_BOUNDS_HIGH_WORD, 4, 'the reads below take the high corner from the second vector');
31
+ assert.isInteger(HEADER_VECTORS, 'HEADER_VECTORS');
32
+ assert.equal(NODE_VECTORS, 5, 'the reads below take a node as five vectors');
33
+
34
+ const LEAF_COUNT = `tree[${BVH8_TREE_LEAF_COUNT_WORD >> 2}].${COMPONENTS[BVH8_TREE_LEAF_COUNT_WORD & 3]}`;
35
+ const ORDER_OFFSET = `tree[${BVH8_TREE_ORDER_OFFSET_WORD >> 2}].${COMPONENTS[BVH8_TREE_ORDER_OFFSET_WORD & 3]}`;
36
+
37
+ /**
38
+ * Reads of a BVH8 that owns its buffer ({@link BVH8_TREE_BUFFER_LAYOUT}), bound as
39
+ * {@link BVH8_TREE_TYPE}:
40
+ *
41
+ * ```wgsl
42
+ * fn bvh8_tree_read_node(tree, index: u32) -> BVH8Node
43
+ * fn bvh8_tree_read_payload(tree, node: BVH8Node, offset: u32) -> u32
44
+ * fn bvh8_tree_leaf_count(tree) -> u32
45
+ * fn bvh8_tree_bounds_low(tree) -> vec3<f32>
46
+ * fn bvh8_tree_bounds_high(tree) -> vec3<f32>
47
+ * ```
48
+ *
49
+ * A node's leaf slots each hold one leaf, and a walk has them as bits of the node's run, as it has a
50
+ * mesh's triangles: `bvh8_tree_read_payload` gives the payload of the leaf at an offset in that run.
51
+ *
52
+ * The root is node 0, and a tree of no leaves has one: a walk starts there without asking.
53
+ *
54
+ * @type {CodeChunk}
55
+ */
56
+ export const chunk_bvh8_tree_read = CodeChunk.from(
57
+ //language=WGSL
58
+ `
59
+ fn bvh8_tree_read_node(tree: ptr<storage, array<vec4<u32>>, read>, index: u32) -> ${BVH8_INODE_STRUCT.wgsl_ref} {
60
+ let at = ${HEADER_VECTORS}u + index * ${NODE_VECTORS}u;
61
+
62
+ return ${BVH8_INODE_STRUCT.wgsl_ref}(array<vec4<u32>, 5>(tree[at], tree[at + 1u], tree[at + 2u], tree[at + 3u], tree[at + 4u]));
63
+ }
64
+
65
+ fn bvh8_tree_read_payload(tree: ptr<storage, array<vec4<u32>>, read>, node: ${BVH8_INODE_STRUCT.wgsl_ref}, offset: u32) -> u32 {
66
+ // the node's run starts at its triangle base, in the payloads behind the nodes
67
+ let word = ${ORDER_OFFSET} + node.data[1].y + offset;
68
+
69
+ let four = tree[word >> 2u];
70
+
71
+ // one of the four by two selects: a vector indexed by a variable is put in memory first
72
+ let pair = select(four.xy, four.zw, (word & 2u) != 0u);
73
+
74
+ return select(pair.x, pair.y, (word & 1u) != 0u);
75
+ }
76
+
77
+ fn bvh8_tree_leaf_count(tree: ptr<storage, array<vec4<u32>>, read>) -> u32 {
78
+ return ${LEAF_COUNT};
79
+ }
80
+
81
+ fn bvh8_tree_bounds_low(tree: ptr<storage, array<vec4<u32>>, read>) -> vec3<f32> {
82
+ return bitcast<vec3<f32>>(tree[0].xyz);
83
+ }
84
+
85
+ fn bvh8_tree_bounds_high(tree: ptr<storage, array<vec4<u32>>, read>) -> vec3<f32> {
86
+ return bitcast<vec3<f32>>(tree[1].xyz);
87
+ }
88
+ `, [
89
+ BVH8_INODE_STRUCT.declaration_chunk,
90
+ ]
91
+ );
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Bytes {@link chunk_bvh8_waiting_slots} holds: four to a word, four words.
3
+ * @type {number}
4
+ */
5
+ export const BVH8_WAITING_SLOTS_CAPACITY: number;
6
+ /**
7
+ * Sixteen bytes kept last in, first out, in four words: for each node a walk has left waiting on its
8
+ * traversal stack, which of the node's eight slots are still to visit.
9
+ *
10
+ * A walk that keeps these beside the stack rather than in it writes one word of a stack entry instead
11
+ * of two. A function's array costs by the words that are ever indexed, on hardware that keeps it in
12
+ * registers, and these four words are never indexed: a push or a pop moves all of them by a byte.
13
+ *
14
+ * - `bvh8_waiting_slots_push` puts a byte in front; `slots` must fit a byte. A seventeenth pushes the
15
+ * oldest out.
16
+ * - `bvh8_waiting_slots_latest` is the byte last pushed, zero when there is none.
17
+ * - `bvh8_waiting_slots_pop` drops it.
18
+ *
19
+ * @type {CodeChunk}
20
+ */
21
+ export const chunk_bvh8_waiting_slots: CodeChunk;
22
+ import { CodeChunk } from "../../../../compiler/CodeChunk.js";
23
+ //# sourceMappingURL=chunk_bvh8_waiting_slots.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk_bvh8_waiting_slots.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_waiting_slots.js"],"names":[],"mappings":"AAEA;;;GAGG;AACH,0CAFU,MAAM,CAE8B;AAE9C;;;;;;;;;;;;;;GAcG;AACH,uCAFU,SAAS,CAkBjB;0BAvCwB,mCAAmC"}
@@ -0,0 +1,40 @@
1
+ import { CodeChunk } from "../../../../compiler/CodeChunk.js";
2
+
3
+ /**
4
+ * Bytes {@link chunk_bvh8_waiting_slots} holds: four to a word, four words.
5
+ * @type {number}
6
+ */
7
+ export const BVH8_WAITING_SLOTS_CAPACITY = 16;
8
+
9
+ /**
10
+ * Sixteen bytes kept last in, first out, in four words: for each node a walk has left waiting on its
11
+ * traversal stack, which of the node's eight slots are still to visit.
12
+ *
13
+ * A walk that keeps these beside the stack rather than in it writes one word of a stack entry instead
14
+ * of two. A function's array costs by the words that are ever indexed, on hardware that keeps it in
15
+ * registers, and these four words are never indexed: a push or a pop moves all of them by a byte.
16
+ *
17
+ * - `bvh8_waiting_slots_push` puts a byte in front; `slots` must fit a byte. A seventeenth pushes the
18
+ * oldest out.
19
+ * - `bvh8_waiting_slots_latest` is the byte last pushed, zero when there is none.
20
+ * - `bvh8_waiting_slots_pop` drops it.
21
+ *
22
+ * @type {CodeChunk}
23
+ */
24
+ export const chunk_bvh8_waiting_slots = CodeChunk.from(
25
+ //language=WGSL
26
+ `
27
+ // the latest byte is the low byte of x, the oldest the high byte of w
28
+ fn bvh8_waiting_slots_push(waiting: vec4<u32>, slots: u32) -> vec4<u32> {
29
+ return (waiting << vec4<u32>(8u)) | vec4<u32>(slots, waiting.xyz >> vec3<u32>(24u));
30
+ }
31
+
32
+ fn bvh8_waiting_slots_latest(waiting: vec4<u32>) -> u32 {
33
+ return waiting.x & 0xffu;
34
+ }
35
+
36
+ fn bvh8_waiting_slots_pop(waiting: vec4<u32>) -> vec4<u32> {
37
+ return (waiting >> vec4<u32>(8u)) | (vec4<u32>(waiting.yzw, 0u) << vec4<u32>(24u));
38
+ }
39
+ `
40
+ );
@@ -1,3 +1,25 @@
1
+ /**
2
+ * Nearest hit against one geometry's tree.
3
+ *
4
+ * Two-sided. `t` is -1 on a miss, and on a hit `triangle` is the
5
+ * `(meshlet << 8) | triangle` id and `barycentrics` the hit's coordinates on it. `geometry` and
6
+ * `instance` are left for the caller.
7
+ *
8
+ * A node's triangles are `base_index_triangle` plus an offset, and the sum is the id as it stands — so
9
+ * the tree must address triangles as {@link bvh8_build_for_meshlets} makes it.
10
+ *
11
+ * Children are visited in the order the ray's octant ranks their slots, nearer first, and the ray is
12
+ * shortened at every hit: a node tested after a hit is tested against the shorter ray. Groups already
13
+ * on the stack keep the hits they were given, so a node behind a later hit is still fetched once, and
14
+ * rejected there.
15
+ *
16
+ * `stack` is the caller's, used from `stack_top` up and handed back as it was found. A group of
17
+ * sibling nodes waits on it only while the walk is below one of its members, so the walk needs one
18
+ * entry per level of the tree.
19
+ *
20
+ * @see https://github.com/jan-van-bergen/GPU-Raytracer/blob/6559ae2241c8fdea0ddaec959fe1a47ec9b3ab0d/Src/CUDA/Raytracing/BVH8.h#L277
21
+ * @type {CodeChunk}
22
+ */
1
23
  export const chunk_ray_query_blas_nearest: CodeChunk;
2
24
  import { CodeChunk } from "../../../compiler/CodeChunk.js";
3
25
  //# sourceMappingURL=chunk_ray_query_blas_nearest.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"chunk_ray_query_blas_nearest.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_blas_nearest.js"],"names":[],"mappings":"AAWA,qDAwFE;0BAnGwB,gCAAgC"}
1
+ {"version":3,"file":"chunk_ray_query_blas_nearest.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_blas_nearest.js"],"names":[],"mappings":"AAiBA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,2CAFU,SAAS,CAiHjB;0BAtJwB,gCAAgC"}