@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
@@ -1,114 +1,153 @@
1
1
  import { chunk_scene_database_access } from "../../../../scene/chunk_scene_database_access.js";
2
2
  import { CodeChunk } from "../../../compiler/CodeChunk.js";
3
- import { BVH_NULL_NODE_DEFINITION } from "../../bvh/BVH_NULL_NODE_DEFINITION.js";
4
- import { BVH_TRAVERSAL_STACK_SIZE } from "../../bvh/BVH_TRAVERSAL_STACK_SIZE.js";
5
- import { chunk_aabb3_intersects_ray } from "../aabb3/chunk_aabb3_intersects_ray.js";
3
+ import { chunk_first_bit_high } from "../../binary/chunk_first_bit_high.js";
4
+ import { BVH8_TRAVERSAL_STACK_SIZE } from "../../bvh/bvh8/webgpu/BVH8_MAX_DEPTH.js";
5
+ import { chunk_bvh8_node_intersect } from "../../bvh/bvh8/webgpu/chunk_bvh8_node_intersect.js";
6
+ import { chunk_bvh8_ray_direction_rcp } from "../../bvh/bvh8/webgpu/chunk_bvh8_ray_direction_rcp.js";
7
+ import { chunk_bvh8_tree_read } from "../../bvh/bvh8/webgpu/chunk_bvh8_tree_read.js";
8
+ import { chunk_ray_get_octant_inv4 } from "../../bvh/bvh8/webgpu/chunk_ray_get_octant_inv4.js";
6
9
  import { chunk_mat4_inverse } from "../mat4/chunk_mat4_inverse.js";
7
-
8
10
  import { chunk_ray_query_blas_nearest } from "./chunk_ray_query_blas_nearest.js";
9
11
  import { chunk_ray_transform_m4 } from "./chunk_ray_transform_m4.js";
10
12
  import { RAY_HIT_INFO } from "./RAY_HIT_INFO.js";
11
13
  import { RAY_STRUCT } from "./RAY_STRUCT.js";
12
14
 
15
+ /**
16
+ * The nearest hit of a ray in the scene:
17
+ *
18
+ * ```wgsl
19
+ * fn ray_query_nearest(ray: Ray) -> RayHitInfo
20
+ * ```
21
+ *
22
+ * A hit holds the world distance in `t` (negative for a miss), the instance's `meshes` row in
23
+ * `instance`, its geometry in `geometry`, and `triangle` and `barycentrics` in that geometry.
24
+ *
25
+ * The scene's TLAS is walked with the ray, nearer slots first by the ray's octant, and the ray is
26
+ * shortened at every hit: a node tested after a hit is tested against the shorter ray. The geometry
27
+ * of an instance is entered in its own space ({@link chunk_ray_query_blas_nearest}, two-sided).
28
+ *
29
+ * One stack serves both levels: the BLAS under an instance takes the entries above the TLAS walk's
30
+ * own. A scene of no instances is a tree of one empty node, and is missed.
31
+ *
32
+ * The enclosing shader binds `tlas`, `scene_database` and the BLAS buffers.
33
+ *
34
+ * @type {CodeChunk}
35
+ */
13
36
  export const chunk_ray_query_nearest = CodeChunk.from(
14
37
  //language=WGSL
15
38
  `
16
- fn ray_query_nearest(
17
- ray: ${RAY_STRUCT.wgsl_ref},
18
- ) -> ${RAY_HIT_INFO.wgsl_ref}{
19
- var stack = array<u32, ${BVH_TRAVERSAL_STACK_SIZE}>();
20
-
21
- var node_index = tlas.root;
22
- var pointer = 1u;
23
-
24
- let direction_rcp = 1.0 / ray.direction;
25
-
39
+ fn ray_query_nearest(ray: ${RAY_STRUCT.wgsl_ref}) -> ${RAY_HIT_INFO.wgsl_ref} {
40
+ var stack: array<vec2u, ${BVH8_TRAVERSAL_STACK_SIZE}>;
41
+ var pointer = 0u;
42
+
26
43
  var best_hit: ${RAY_HIT_INFO.wgsl_ref};
27
44
  best_hit.t = -1.0;
28
-
45
+
46
+ // shortened as hits are found
29
47
  var global_ray = ray;
30
-
31
- for(;pointer > 0 && pointer <= ${BVH_TRAVERSAL_STACK_SIZE};){
32
-
33
- let node = tlas.nodes[node_index];
34
-
35
- if(!aabb3_intersects_ray(node.bounds, global_ray.origin, direction_rcp, global_ray.tmax)){
36
-
37
- pointer --;
38
- node_index = stack[pointer];
39
-
40
- continue;
48
+
49
+ let oct_inv4 = ray_get_octant_inv4(ray.direction);
50
+ let direction_rcp = bvh8_ray_direction_rcp(ray.direction);
51
+
52
+ // The group being walked: the nodes of one parent that the ray reaches and that are still to visit
53
+ // x: index of the parent's first child node
54
+ // y: | hits, by traversal priority | pad | imask |
55
+ // | 8 bits | 16 bits | 8 bits |
56
+ // The root is a group of one, already hit.
57
+ var current_group = vec2(0u, 0x80000000u);
58
+
59
+ loop {
60
+ let hits_imask = current_group.y;
61
+
62
+ // nearest of the group's remaining nodes
63
+ let child_index_offset = first_bit_high(hits_imask);
64
+ let child_index_base = current_group.x;
65
+
66
+ current_group.y &= ~(1u << child_index_offset);
67
+
68
+ if ((current_group.y & 0xff000000u) != 0u && pointer < ${BVH8_TRAVERSAL_STACK_SIZE}u) {
69
+ // the rest of the group waits
70
+ stack[pointer] = current_group;
71
+ pointer++;
41
72
  }
42
-
43
- let child_1 = node.child_1;
44
- let child_2 = node.child_2;
45
-
46
- if(child_1 != BVH_NULL_NODE){
47
- // Intermediate node
48
-
49
- node_index = child_1;
50
-
51
- stack[ pointer ] = child_2;
52
-
53
- pointer ++;
54
-
55
- }else{
56
-
57
-
58
- pointer --;
59
- node_index = stack[pointer];
60
-
61
- // leaf, traverse BLAS
62
- // child_2 stores the user_data (mesh_id)
63
- let mesh_id = child_2;
73
+
74
+ // undo the octant ranking to get the node's slot, then count the nodes in the slots below it
75
+ let slot_index = (child_index_offset - 24u) ^ (oct_inv4 & 0xffu);
76
+ let relative_index = countOneBits(hits_imask & ~(0xffffffffu << slot_index));
77
+
78
+ let node = bvh8_tree_read_node(&tlas, child_index_base + relative_index);
79
+
80
+ let hitmask = bvh8_node_intersect(global_ray, direction_rcp, oct_inv4, node);
81
+
82
+ current_group.x = node.data[1].x;
83
+ current_group.y = (hitmask & 0xff000000u) | (node.data[0].w >> 24u);
84
+
85
+ // one bit per instance whose box the ray reaches
86
+ var instance_hits = hitmask & 0x00ffffffu;
87
+
88
+ while (instance_hits != 0u) {
89
+ let offset = countTrailingZeros(instance_hits);
90
+
91
+ instance_hits &= instance_hits - 1u;
92
+
93
+ // a leaf's payload is the instance's meshes row
94
+ let mesh_id = bvh8_tree_read_payload(&tlas, node, offset);
64
95
 
65
96
  let mesh = scene_read_mesh(&scene_database, mesh_id);
66
- let node = scene_read_node(&scene_database, mesh.node);
97
+ let placement = scene_read_node(&scene_database, mesh.node);
67
98
 
68
99
  let geometry_id = mesh.geometry;
69
100
 
70
- let local_ray = ray_transform_m4(global_ray, mat4_inverse(node.global));
101
+ let local_ray = ray_transform_m4(global_ray, mat4_inverse(placement.global));
71
102
 
72
103
  let hit = ray_query_blas_nearest(local_ray, geometry_id, &stack, pointer);
73
104
 
74
- if(hit.t < 0.0){
75
- // miss
105
+ if (hit.t < 0.0) {
76
106
  continue;
77
107
  }
78
108
 
79
109
  let local_hit_position = local_ray.origin + local_ray.direction * hit.t;
80
110
 
81
- let global_hit_position = node.global * vec4(local_hit_position, 1.0);
82
-
83
- let distance = distance( global_ray.origin, global_hit_position.xyz / global_hit_position.w );
84
-
85
- if(distance >= global_ray.tmax){
111
+ let global_hit_position = placement.global * vec4(local_hit_position, 1.0);
112
+
113
+ let reach = distance(global_ray.origin, global_hit_position.xyz / global_hit_position.w);
114
+
115
+ if (reach >= global_ray.tmax) {
86
116
  continue;
87
117
  }
88
-
89
- // found a good hit
90
-
91
- global_ray.tmax = distance;
92
-
118
+
119
+ global_ray.tmax = reach;
120
+
93
121
  best_hit = hit;
94
-
95
- best_hit.t = distance;
122
+
123
+ best_hit.t = reach;
96
124
  best_hit.instance = mesh_id;
97
125
  best_hit.geometry = geometry_id;
98
126
  }
99
-
127
+
128
+ if ((current_group.y & 0xff000000u) == 0u) {
129
+ if (pointer == 0u) {
130
+ break;
131
+ }
132
+
133
+ pointer--;
134
+ current_group = stack[pointer];
135
+ }
100
136
  }
101
-
137
+
102
138
  return best_hit;
103
139
  }
104
- `,
105
- [
140
+ `, [
141
+ RAY_STRUCT.declaration_chunk,
106
142
  RAY_HIT_INFO.declaration_chunk,
107
- BVH_NULL_NODE_DEFINITION,
108
- chunk_ray_transform_m4,
109
- chunk_aabb3_intersects_ray,
143
+ chunk_first_bit_high,
144
+ chunk_ray_get_octant_inv4,
145
+ chunk_bvh8_node_intersect,
146
+ chunk_bvh8_ray_direction_rcp,
147
+ chunk_bvh8_tree_read,
110
148
  chunk_ray_query_blas_nearest,
149
+ chunk_ray_transform_m4,
111
150
  chunk_mat4_inverse,
112
151
  chunk_scene_database_access,
113
152
  ]
114
- );
153
+ );
@@ -27,8 +27,7 @@ export const RAY_QUERY_AMONG_PASS: number;
27
27
  * traced as a geometry other than its own (a stand-in) is traced under the instance's own transform.
28
28
  *
29
29
  * The enclosing shader binds what `ray_query_nearest` reads: `tlas`, `scene_database` and the BLAS
30
- * buffers. The ray's direction is unit length. The TLAS must hold a tree: an empty one
31
- * (`tlas.root == BVH_NULL_NODE`) is the caller's to turn away.
30
+ * buffers. The ray's direction is unit length. A scene of no instances is missed.
32
31
  *
33
32
  * @type {CodeChunk}
34
33
  */
@@ -1 +1 @@
1
- {"version":3,"file":"chunk_ray_query_nearest_among.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_nearest_among.js"],"names":[],"mappings":"AAYA;;;;;GAKG;AACH,mCAFU,MAAM,CAE+B;AAE/C;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,4CAFU,SAAS,CAsGjB;0BAjJwB,gCAAgC"}
1
+ {"version":3,"file":"chunk_ray_query_nearest_among.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_nearest_among.js"],"names":[],"mappings":"AAeA;;;;;GAKG;AACH,mCAFU,MAAM,CAE+B;AAE/C;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,4CAFU,SAAS,CAiIjB;0BA9KwB,gCAAgC"}
@@ -1,9 +1,12 @@
1
1
  import { UINT32_MAX } from "../../../../../../core/binary/UINT32_MAX.js";
2
2
  import { TRANSFORMS_TABLE } from "../../../../scene/chunk_scene_database_access.js";
3
3
  import { CodeChunk } from "../../../compiler/CodeChunk.js";
4
- import { BVH_NULL_NODE_DEFINITION } from "../../bvh/BVH_NULL_NODE_DEFINITION.js";
5
- import { BVH_TRAVERSAL_STACK_SIZE } from "../../bvh/BVH_TRAVERSAL_STACK_SIZE.js";
6
- import { chunk_aabb3_intersects_ray } from "../aabb3/chunk_aabb3_intersects_ray.js";
4
+ import { chunk_first_bit_high } from "../../binary/chunk_first_bit_high.js";
5
+ import { BVH8_TRAVERSAL_STACK_SIZE } from "../../bvh/bvh8/webgpu/BVH8_MAX_DEPTH.js";
6
+ import { chunk_bvh8_node_intersect } from "../../bvh/bvh8/webgpu/chunk_bvh8_node_intersect.js";
7
+ import { chunk_bvh8_ray_direction_rcp } from "../../bvh/bvh8/webgpu/chunk_bvh8_ray_direction_rcp.js";
8
+ import { chunk_bvh8_tree_read } from "../../bvh/bvh8/webgpu/chunk_bvh8_tree_read.js";
9
+ import { chunk_ray_get_octant_inv4 } from "../../bvh/bvh8/webgpu/chunk_ray_get_octant_inv4.js";
7
10
  import { chunk_mat4_inverse } from "../mat4/chunk_mat4_inverse.js";
8
11
  import { chunk_ray_query_blas_nearest } from "./chunk_ray_query_blas_nearest.js";
9
12
  import { chunk_ray_transform_m4 } from "./chunk_ray_transform_m4.js";
@@ -40,8 +43,7 @@ export const RAY_QUERY_AMONG_PASS = UINT32_MAX;
40
43
  * traced as a geometry other than its own (a stand-in) is traced under the instance's own transform.
41
44
  *
42
45
  * The enclosing shader binds what `ray_query_nearest` reads: `tlas`, `scene_database` and the BLAS
43
- * buffers. The ray's direction is unit length. The TLAS must hold a tree: an empty one
44
- * (`tlas.root == BVH_NULL_NODE`) is the caller's to turn away.
46
+ * buffers. The ray's direction is unit length. A scene of no instances is missed.
45
47
  *
46
48
  * @type {CodeChunk}
47
49
  */
@@ -53,83 +55,107 @@ const RAY_QUERY_AMONG_PASS: u32 = ${RAY_QUERY_AMONG_PASS}u;
53
55
  fn ray_query_nearest_among(
54
56
  ray: ${RAY_STRUCT.wgsl_ref},
55
57
  ) -> ${RAY_HIT_INFO.wgsl_ref} {
56
- var stack = array<u32, ${BVH_TRAVERSAL_STACK_SIZE}>();
57
-
58
- var node_index = tlas.root;
59
- var pointer = 1u;
60
-
61
- let direction_rcp = 1.0 / ray.direction;
58
+ // one stack for both levels: the BLAS under an instance takes the entries above this walk's own
59
+ var stack: array<vec2u, ${BVH8_TRAVERSAL_STACK_SIZE}>;
60
+ var pointer = 0u;
62
61
 
63
62
  var best_hit: ${RAY_HIT_INFO.wgsl_ref};
64
63
  best_hit.t = -1.0;
65
64
 
65
+ // shortened as hits are found
66
66
  var global_ray = ray;
67
67
 
68
- for (; pointer > 0u && pointer <= ${BVH_TRAVERSAL_STACK_SIZE}u;) {
68
+ let oct_inv4 = ray_get_octant_inv4(ray.direction);
69
+ let direction_rcp = bvh8_ray_direction_rcp(ray.direction);
69
70
 
70
- let node = tlas.nodes[node_index];
71
+ // The group being walked: the nodes of one parent that the ray reaches and that are still to visit
72
+ // x: index of the parent's first child node
73
+ // y: | hits, by traversal priority | pad | imask |
74
+ // | 8 bits | 16 bits | 8 bits |
75
+ // The root is a group of one, already hit.
76
+ var current_group = vec2(0u, 0x80000000u);
71
77
 
72
- if (!aabb3_intersects_ray(node.bounds, global_ray.origin, direction_rcp, global_ray.tmax)) {
73
- pointer--;
74
- node_index = stack[pointer];
78
+ loop {
79
+ let hits_imask = current_group.y;
80
+
81
+ // nearest of the group's remaining nodes
82
+ let child_index_offset = first_bit_high(hits_imask);
83
+ let child_index_base = current_group.x;
84
+
85
+ current_group.y &= ~(1u << child_index_offset);
75
86
 
76
- continue;
87
+ if ((current_group.y & 0xff000000u) != 0u && pointer < ${BVH8_TRAVERSAL_STACK_SIZE}u) {
88
+ // the rest of the group waits
89
+ stack[pointer] = current_group;
90
+ pointer++;
77
91
  }
78
92
 
79
- let child_1 = node.child_1;
80
- let child_2 = node.child_2;
93
+ // undo the octant ranking to get the node's slot, then count the nodes in the slots below it
94
+ let slot_index = (child_index_offset - 24u) ^ (oct_inv4 & 0xffu);
95
+ let relative_index = countOneBits(hits_imask & ~(0xffffffffu << slot_index));
81
96
 
82
- if (child_1 != BVH_NULL_NODE) {
83
- // an inner node
84
- node_index = child_1;
97
+ let node = bvh8_tree_read_node(&tlas, child_index_base + relative_index);
85
98
 
86
- stack[pointer] = child_2;
99
+ let hitmask = bvh8_node_intersect(global_ray, direction_rcp, oct_inv4, node);
87
100
 
88
- pointer++;
101
+ current_group.x = node.data[1].x;
102
+ current_group.y = (hitmask & 0xff000000u) | (node.data[0].w >> 24u);
89
103
 
90
- continue;
91
- }
104
+ // one bit per instance whose box the ray reaches
105
+ var instance_hits = hitmask & 0x00ffffffu;
92
106
 
93
- pointer--;
94
- node_index = stack[pointer];
107
+ while (instance_hits != 0u) {
108
+ let offset = countTrailingZeros(instance_hits);
95
109
 
96
- // a leaf: child_2 is the instance's meshes row
97
- let mesh_id = child_2;
110
+ instance_hits &= instance_hits - 1u;
98
111
 
99
- let geometry_id = ray_query_among_geometry(mesh_id);
112
+ // a leaf's payload is the instance's meshes row
113
+ let mesh_id = bvh8_tree_read_payload(&tlas, node, offset);
100
114
 
101
- if (geometry_id == RAY_QUERY_AMONG_PASS) {
102
- continue;
103
- }
115
+ let geometry_id = ray_query_among_geometry(mesh_id);
104
116
 
105
- // a mesh row and its transforms row are the same row
106
- let global = ${TRANSFORMS_TABLE.marshalling_method_read_field('global')}(&scene_database, mesh_id);
117
+ if (geometry_id == RAY_QUERY_AMONG_PASS) {
118
+ continue;
119
+ }
107
120
 
108
- let local_ray = ray_transform_m4(global_ray, mat4_inverse(global));
121
+ // a mesh row and its transforms row are the same row
122
+ let global = ${TRANSFORMS_TABLE.marshalling_method_read_field('global')}(&scene_database, mesh_id);
109
123
 
110
- let hit = ray_query_blas_nearest(local_ray, geometry_id, &stack, pointer);
124
+ let local_ray = ray_transform_m4(global_ray, mat4_inverse(global));
111
125
 
112
- if (hit.t < 0.0) {
113
- continue;
114
- }
126
+ let hit = ray_query_blas_nearest(local_ray, geometry_id, &stack, pointer);
115
127
 
116
- let local_hit_position = local_ray.origin + local_ray.direction * hit.t;
128
+ if (hit.t < 0.0) {
129
+ continue;
130
+ }
117
131
 
118
- let global_hit_position = global * vec4(local_hit_position, 1.0);
132
+ let local_hit_position = local_ray.origin + local_ray.direction * hit.t;
119
133
 
120
- let reach = distance(global_ray.origin, global_hit_position.xyz / global_hit_position.w);
134
+ let global_hit_position = global * vec4(local_hit_position, 1.0);
121
135
 
122
- if (reach >= global_ray.tmax) {
123
- continue;
124
- }
136
+ let reach = distance(global_ray.origin, global_hit_position.xyz / global_hit_position.w);
137
+
138
+ if (reach >= global_ray.tmax) {
139
+ continue;
140
+ }
141
+
142
+ global_ray.tmax = reach;
125
143
 
126
- global_ray.tmax = reach;
144
+ best_hit = hit;
127
145
 
128
- best_hit = hit;
146
+ best_hit.t = reach;
147
+ best_hit.instance = mesh_id;
148
+ best_hit.geometry = geometry_id;
149
+ }
150
+
151
+ if ((current_group.y & 0xff000000u) == 0u) {
152
+ if (pointer == 0u) {
153
+ break;
154
+ }
129
155
 
130
- best_hit.t = reach;
131
- best_hit.instance = mesh_id;
132
- best_hit.geometry = geometry_id;
156
+ pointer--;
157
+ current_group = stack[pointer];
158
+ }
133
159
  }
134
160
 
135
161
  return best_hit;
@@ -138,9 +164,12 @@ fn ray_query_nearest_among(
138
164
  [
139
165
  RAY_STRUCT.declaration_chunk,
140
166
  RAY_HIT_INFO.declaration_chunk,
141
- BVH_NULL_NODE_DEFINITION,
167
+ chunk_first_bit_high,
168
+ chunk_ray_get_octant_inv4,
169
+ chunk_bvh8_node_intersect,
170
+ chunk_bvh8_ray_direction_rcp,
171
+ chunk_bvh8_tree_read,
142
172
  chunk_ray_transform_m4,
143
- chunk_aabb3_intersects_ray,
144
173
  chunk_ray_query_blas_nearest,
145
174
  chunk_mat4_inverse,
146
175
  TRANSFORMS_TABLE.chunk_read_field('global'),
@@ -1,4 +1,18 @@
1
1
  /**
2
+ * Whether anything in the scene lies along a ray:
3
+ *
4
+ * ```wgsl
5
+ * fn ray_query_occluded(ray: Ray) -> bool
6
+ * ```
7
+ *
8
+ * The scene's TLAS is walked with the ray, and the geometry of every instance whose box it reaches
9
+ * is asked ({@link chunk_ray_query_blas_occluded}, single-sided) until one answers yes.
10
+ *
11
+ * One stack serves both levels: the BLAS under an instance takes the entries above the TLAS walk's
12
+ * own. A scene of no instances is a tree of one empty node, and occludes nothing.
13
+ *
14
+ * The enclosing shader binds `tlas`, `scene_database` and the BLAS buffers.
15
+ *
2
16
  * @type {CodeChunk}
3
17
  */
4
18
  export const chunk_ray_query_occluded: CodeChunk;
@@ -1 +1 @@
1
- {"version":3,"file":"chunk_ray_query_occluded.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_occluded.js"],"names":[],"mappings":"AAWA;;GAEG;AACH,uCAFU,SAAS,CAwElB;0BAnFyB,gCAAgC"}
1
+ {"version":3,"file":"chunk_ray_query_occluded.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_occluded.js"],"names":[],"mappings":"AAaA;;;;;;;;;;;;;;;;GAgBG;AACH,uCAFU,SAAS,CAwFjB;0BAnHwB,gCAAgC"}
@@ -1,85 +1,117 @@
1
1
  import { chunk_scene_database_access } from "../../../../scene/chunk_scene_database_access.js";
2
2
  import { CodeChunk } from "../../../compiler/CodeChunk.js";
3
- import { BVH_NULL_NODE_DEFINITION } from "../../bvh/BVH_NULL_NODE_DEFINITION.js";
4
- import { BVH_TRAVERSAL_STACK_SIZE } from "../../bvh/BVH_TRAVERSAL_STACK_SIZE.js";
5
- import { chunk_aabb3_intersects_ray } from "../aabb3/chunk_aabb3_intersects_ray.js";
3
+ import { chunk_first_bit_high } from "../../binary/chunk_first_bit_high.js";
4
+ import { BVH8_TRAVERSAL_STACK_SIZE } from "../../bvh/bvh8/webgpu/BVH8_MAX_DEPTH.js";
5
+ import { chunk_bvh8_node_intersect } from "../../bvh/bvh8/webgpu/chunk_bvh8_node_intersect.js";
6
+ import { chunk_bvh8_ray_direction_rcp } from "../../bvh/bvh8/webgpu/chunk_bvh8_ray_direction_rcp.js";
7
+ import { chunk_bvh8_tree_read } from "../../bvh/bvh8/webgpu/chunk_bvh8_tree_read.js";
8
+ import { chunk_ray_get_octant_inv4 } from "../../bvh/bvh8/webgpu/chunk_ray_get_octant_inv4.js";
6
9
  import { chunk_mat4_inverse } from "../mat4/chunk_mat4_inverse.js";
7
10
  import { chunk_ray_query_blas_occluded } from "./chunk_ray_query_blas_occluded.js";
8
11
  import { chunk_ray_transform_m4 } from "./chunk_ray_transform_m4.js";
9
12
  import { RAY_STRUCT } from "./RAY_STRUCT.js";
10
13
 
11
-
12
14
  /**
15
+ * Whether anything in the scene lies along a ray:
16
+ *
17
+ * ```wgsl
18
+ * fn ray_query_occluded(ray: Ray) -> bool
19
+ * ```
20
+ *
21
+ * The scene's TLAS is walked with the ray, and the geometry of every instance whose box it reaches
22
+ * is asked ({@link chunk_ray_query_blas_occluded}, single-sided) until one answers yes.
23
+ *
24
+ * One stack serves both levels: the BLAS under an instance takes the entries above the TLAS walk's
25
+ * own. A scene of no instances is a tree of one empty node, and occludes nothing.
26
+ *
27
+ * The enclosing shader binds `tlas`, `scene_database` and the BLAS buffers.
28
+ *
13
29
  * @type {CodeChunk}
14
30
  */
15
31
  export const chunk_ray_query_occluded = CodeChunk.from(
16
32
  //language=WGSL
17
33
  `
18
- fn ray_query_occluded( ray: ${RAY_STRUCT.wgsl_ref}) -> bool {
19
- var stack = array<u32, ${BVH_TRAVERSAL_STACK_SIZE}>();
20
-
21
- var node_index = tlas.root;
22
- var pointer = 1u;
23
-
24
- // this is a faster version of 'pointer > 0 && pointer <= BVH_TRAVERSAL_STACK_SIZE', saving an extra compare op
25
- for(;(pointer & ${BVH_TRAVERSAL_STACK_SIZE - 1}) != 0;){
26
-
27
- let node = tlas.nodes[node_index];
28
-
29
- if(!aabb3_intersects_ray(node.bounds, ray.origin, 1.0 / ray.direction, ray.tmax)){
30
-
31
- pointer --;
32
- node_index = stack[pointer];
33
-
34
- continue;
34
+ fn ray_query_occluded(ray: ${RAY_STRUCT.wgsl_ref}) -> bool {
35
+ var stack: array<vec2u, ${BVH8_TRAVERSAL_STACK_SIZE}>;
36
+ var pointer = 0u;
37
+
38
+ let oct_inv4 = ray_get_octant_inv4(ray.direction);
39
+ let direction_rcp = bvh8_ray_direction_rcp(ray.direction);
40
+
41
+ // The group being walked: the nodes of one parent that the ray reaches and that are still to visit
42
+ // x: index of the parent's first child node
43
+ // y: | hits, by traversal priority | pad | imask |
44
+ // | 8 bits | 16 bits | 8 bits |
45
+ // The root is a group of one, already hit.
46
+ var current_group = vec2(0u, 0x80000000u);
47
+
48
+ loop {
49
+ let hits_imask = current_group.y;
50
+
51
+ // nearest of the group's remaining nodes
52
+ let child_index_offset = first_bit_high(hits_imask);
53
+ let child_index_base = current_group.x;
54
+
55
+ current_group.y &= ~(1u << child_index_offset);
56
+
57
+ if ((current_group.y & 0xff000000u) != 0u && pointer < ${BVH8_TRAVERSAL_STACK_SIZE}u) {
58
+ // the rest of the group waits
59
+ stack[pointer] = current_group;
60
+ pointer++;
35
61
  }
36
-
37
- let child_1 = node.child_1;
38
- let child_2 = node.child_2;
39
-
40
- if(child_1 != BVH_NULL_NODE){
41
- // Intermediate node
42
-
43
- node_index = child_1;
44
-
45
- stack[ pointer ] = child_2;
46
-
47
- pointer ++;
48
-
49
-
50
- }else{
51
-
52
- pointer --;
53
- node_index = stack[pointer];
54
-
55
- // leaf, traverse BLAS
56
- // child_2 stores the user_data (mesh_id)
57
-
58
- let mesh = scene_read_mesh(&scene_database, child_2);
59
- let node = scene_read_node(&scene_database, mesh.node);
60
-
61
- let geometry_id = mesh.geometry;
62
-
63
- let local_ray = ray_transform_m4(ray, mat4_inverse(node.global));
64
-
65
- if(ray_query_blas_occluded(local_ray, geometry_id, &stack, pointer)){
62
+
63
+ // undo the octant ranking to get the node's slot, then count the nodes in the slots below it
64
+ let slot_index = (child_index_offset - 24u) ^ (oct_inv4 & 0xffu);
65
+ let relative_index = countOneBits(hits_imask & ~(0xffffffffu << slot_index));
66
+
67
+ let node = bvh8_tree_read_node(&tlas, child_index_base + relative_index);
68
+
69
+ let hitmask = bvh8_node_intersect(ray, direction_rcp, oct_inv4, node);
70
+
71
+ current_group.x = node.data[1].x;
72
+ current_group.y = (hitmask & 0xff000000u) | (node.data[0].w >> 24u);
73
+
74
+ // one bit per instance whose box the ray reaches
75
+ var instance_hits = hitmask & 0x00ffffffu;
76
+
77
+ while (instance_hits != 0u) {
78
+ let offset = countTrailingZeros(instance_hits);
79
+
80
+ instance_hits &= instance_hits - 1u;
81
+
82
+ // a leaf's payload is the instance's meshes row
83
+ let mesh = scene_read_mesh(&scene_database, bvh8_tree_read_payload(&tlas, node, offset));
84
+ let placement = scene_read_node(&scene_database, mesh.node);
85
+
86
+ let local_ray = ray_transform_m4(ray, mat4_inverse(placement.global));
87
+
88
+ if (ray_query_blas_occluded(local_ray, mesh.geometry, &stack, pointer)) {
66
89
  return true;
67
90
  }
68
-
69
91
  }
70
-
92
+
93
+ if ((current_group.y & 0xff000000u) == 0u) {
94
+ if (pointer == 0u) {
95
+ break;
96
+ }
97
+
98
+ pointer--;
99
+ current_group = stack[pointer];
100
+ }
71
101
  }
72
-
73
- // no hit
102
+
74
103
  return false;
75
- }`,
76
- [
104
+ }
105
+ `, [
77
106
  RAY_STRUCT.declaration_chunk,
78
- BVH_NULL_NODE_DEFINITION,
107
+ chunk_first_bit_high,
108
+ chunk_ray_get_octant_inv4,
109
+ chunk_bvh8_node_intersect,
110
+ chunk_bvh8_ray_direction_rcp,
111
+ chunk_bvh8_tree_read,
79
112
  chunk_ray_query_blas_occluded,
80
113
  chunk_ray_transform_m4,
81
- chunk_aabb3_intersects_ray,
82
114
  chunk_mat4_inverse,
83
115
  chunk_scene_database_access,
84
116
  ]
85
- )
117
+ );