@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
package/package.json CHANGED
@@ -6,7 +6,7 @@
6
6
  "description": "Advanced 3D game engine",
7
7
  "type": "module",
8
8
  "author": "Alexander Goldring",
9
- "version": "3.69.0",
9
+ "version": "3.70.0",
10
10
  "exports": {
11
11
  "./build/*": "./build/*",
12
12
  "./src/*": "./src/*",
@@ -17,6 +17,22 @@ export class BVH8Converter {
17
17
  * @type {BVH8}
18
18
  */
19
19
  bvh8: BVH8;
20
+ /**
21
+ * Marks the BVH2 nodes that are roots of a primitive cluster, one byte per BVH2 node, non-zero for a
22
+ * root; `null` for a tree with no clusters.
23
+ *
24
+ * A cluster root always becomes a BVH8 node of its own, and no leaf slot is formed out of a BVH2
25
+ * node that holds a cluster root beneath it. Together those two give the guarantee this exists for:
26
+ * every BVH8 node's leaf slots draw their primitives from one cluster, and the run of
27
+ * {@link BVH8#primitives} a cluster's nodes address is contiguous and holds that cluster's primitives
28
+ * and nothing else. A consumer whose primitives are stored per cluster can then re-order each
29
+ * cluster's own storage to match and drop the pool.
30
+ *
31
+ * Cluster subtrees must be disjoint.
32
+ *
33
+ * @type {Uint8Array|null}
34
+ */
35
+ cluster_roots: Uint8Array | null;
20
36
  /**
21
37
  * Fill the decision table for the subtree of the given node, bottom-up.
22
38
  * @param {number} node_index
@@ -1 +1 @@
1
- {"version":3,"file":"BVH8Converter.d.ts","sourceRoot":"","sources":["../../../../../src/core/bvh8/build/BVH8Converter.js"],"names":[],"mappings":"AAmCA;;GAEG;AACH;IAYI;;;;OAIG;IACH,mCAGC;IAnBD;;;OAGG;IACH,UAAI;IAEJ;;OAEG;IACH,WAAI;IAkBJ;;;;OAIG;IACH,2BAHW,MAAM,GACJ,MAAM,CAgJlB;IAED;;;;;;;;OAQG;IACH,yBANW,MAAM,YACN,MAAM,EAAE,GAAC,WAAW,gBACpB,MAAM,KACN,MAAM,GACJ,MAAM,CAoDlB;IAED;;;;;OAKG;IACH,2BAJW,MAAM,YACN,MAAM,EAAE,GAAC,WAAW,eACpB,MAAM,QAkFhB;IAED;;;;;OAKG;IACH,6BAHW,MAAM,GACJ,MAAM,CAiClB;IAED;;;;OAIG;IACH,0BAHW,MAAM,mBACN,MAAM,QAYhB;IAoJD,gBAoBC;;CACJ"}
1
+ {"version":3,"file":"BVH8Converter.d.ts","sourceRoot":"","sources":["../../../../../src/core/bvh8/build/BVH8Converter.js"],"names":[],"mappings":"AAoCA;;GAEG;AACH;IA6BI;;;;OAIG;IACH,mCAGC;IApCD;;;OAGG;IACH,UAAI;IAEJ;;OAEG;IACH,WAAI;IAEJ;;;;;;;;;;;;;;OAcG;IACH,eAFU,UAAU,GAAC,IAAI,CAEL;IAkBpB;;;;OAIG;IACH,2BAHW,MAAM,GACJ,MAAM,CAmLlB;IAED;;;;;;;;OAQG;IACH,yBANW,MAAM,YACN,MAAM,EAAE,GAAC,WAAW,gBACpB,MAAM,KACN,MAAM,GACJ,MAAM,CAoDlB;IAED;;;;;OAKG;IACH,2BAJW,MAAM,YACN,MAAM,EAAE,GAAC,WAAW,eACpB,MAAM,QAoDhB;IAED;;;;;OAKG;IACH,6BAHW,MAAM,GACJ,MAAM,CAiClB;IAED;;;;OAIG;IACH,0BAHW,MAAM,mBACN,MAAM,QAYhB;IAwJD,gBAoBC;;CACJ"}
@@ -3,6 +3,7 @@ import { reinterpret_float32_as_uint32 } from "../../binary/reinterpret_float32_
3
3
  import { NULL_NODE } from "../../bvh2/bvh3/BVH.js";
4
4
  import { BinaryElementPool } from "../../geom/3d/topology/struct/binary/BinaryElementPool.js";
5
5
  import { v3_dot } from "../../geom/vec3/v3_dot.js";
6
+ import { bvh8_assign_slots_greedy } from "./bvh8_assign_slots_greedy.js";
6
7
  import { byte } from "./byte.js";
7
8
  import { encode_bounds_e } from "./encode_bounds_e.js";
8
9
 
@@ -48,6 +49,23 @@ export class BVH8Converter {
48
49
  */
49
50
  bvh8
50
51
 
52
+ /**
53
+ * Marks the BVH2 nodes that are roots of a primitive cluster, one byte per BVH2 node, non-zero for a
54
+ * root; `null` for a tree with no clusters.
55
+ *
56
+ * A cluster root always becomes a BVH8 node of its own, and no leaf slot is formed out of a BVH2
57
+ * node that holds a cluster root beneath it. Together those two give the guarantee this exists for:
58
+ * every BVH8 node's leaf slots draw their primitives from one cluster, and the run of
59
+ * {@link BVH8#primitives} a cluster's nodes address is contiguous and holds that cluster's primitives
60
+ * and nothing else. A consumer whose primitives are stored per cluster can then re-order each
61
+ * cluster's own storage to match and drop the pool.
62
+ *
63
+ * Cluster subtrees must be disjoint.
64
+ *
65
+ * @type {Uint8Array|null}
66
+ */
67
+ cluster_roots = null
68
+
51
69
  /**
52
70
  *
53
71
  * @param {BVH8} bvh8
@@ -90,22 +108,33 @@ export class BVH8Converter {
90
108
 
91
109
  const primitive_counts = new Uint32Array(bvh2.size);
92
110
 
111
+ const cluster_roots = this.cluster_roots;
112
+
113
+ // non-zero where a node holds a cluster root strictly beneath it
114
+ const spans_clusters = new Uint8Array(cluster_roots !== null ? bvh2.size : 0);
115
+
93
116
  for (let k = order.length - 1; k >= 0; k--) {
94
117
  const node = order[k];
95
118
 
96
119
  const node_surface_area = bvh2.node_get_surface_area(node);
97
120
 
121
+ const is_cluster_root = cluster_roots !== null && cluster_roots[node] !== 0;
122
+
98
123
  if (bvh2.node_is_leaf(node)) {
99
124
  const num_primitives = 1;
100
125
 
101
- // SAH cost
102
- const cost_leaf = node_surface_area * num_primitives;
126
+ // SAH cost; a cluster of one primitive is a node holding one leaf slot
127
+ const cost = is_cluster_root
128
+ ? node_surface_area * (num_primitives + 1)
129
+ : node_surface_area * num_primitives;
130
+
131
+ const type = is_cluster_root ? DECISION_TYPE.INTERNAL : DECISION_TYPE.LEAF;
103
132
 
104
133
  for (let i = 0; i < 7; i++) {
105
134
  const decision_ptr = decisions.element_address(node * 7 + i);
106
135
 
107
- decisions.data_view.setUint8(decision_ptr, DECISION_TYPE.LEAF);
108
- decisions.data_view.setFloat32(decision_ptr + DECISION_OFFSET_COST, cost_leaf);
136
+ decisions.data_view.setUint8(decision_ptr, type);
137
+ decisions.data_view.setFloat32(decision_ptr + DECISION_OFFSET_COST, cost);
109
138
  }
110
139
 
111
140
  primitive_counts[node] = num_primitives;
@@ -116,10 +145,21 @@ export class BVH8Converter {
116
145
 
117
146
  const num_primitives = primitive_counts[left] + primitive_counts[right];
118
147
 
148
+ let can_be_leaf = num_primitives <= 3;
149
+
150
+ if (cluster_roots !== null) {
151
+ const spans = (cluster_roots[left] | cluster_roots[right] | spans_clusters[left] | spans_clusters[right]) !== 0;
152
+
153
+ spans_clusters[node] = spans ? 1 : 0;
154
+
155
+ // a leaf slot holds one cluster's primitives, and a cluster root is a node
156
+ can_be_leaf = can_be_leaf && !spans && !is_cluster_root;
157
+ }
158
+
119
159
  // Separate case: i=0 (i=1 in the paper)
120
160
  // create a new subtree root
121
161
  {
122
- const cost_leaf = num_primitives <= 3 ? num_primitives * node_surface_area : Infinity;
162
+ const cost_leaf = can_be_leaf ? num_primitives * node_surface_area : Infinity;
123
163
 
124
164
  let cost_distribute = Infinity;
125
165
 
@@ -164,6 +204,19 @@ export class BVH8Converter {
164
204
  for (let i = 1; i < 7; i++) {
165
205
  const decision_ptr_i = decisions.element_address(node * 7 + i - 1);
166
206
 
207
+ if (is_cluster_root) {
208
+ // a cluster root is one root, however many its parent could afford
209
+ const decision_ptr = decisions.element_address(node * 7 + i);
210
+
211
+ for (let j = 0; j < 7; j++) {
212
+ decisions.data_view.setUint8(decision_ptr + j,
213
+ decisions.data_view.getUint8(decision_ptr_i + j)
214
+ );
215
+ }
216
+
217
+ continue;
218
+ }
219
+
167
220
  let cost_distribute = decisions.data_view.getFloat32(decision_ptr_i + DECISION_OFFSET_COST);
168
221
 
169
222
  let distribute_left = INVALID;
@@ -315,38 +368,8 @@ export class BVH8Converter {
315
368
  }
316
369
 
317
370
  const assignment = new Uint32Array(8);
318
- assignment.fill(INVALID);
319
-
320
- let slot_filled = 0; // bitfield
321
-
322
-
323
- // Greedy child ordering, the paper mentions this as an alternative
324
- // that works about as well as the auction algorithm in practice
325
- while (true) {
326
- let min_cost = Infinity;
327
371
 
328
- let min_slot = INVALID;
329
- let min_index = INVALID;
330
-
331
- // Find the cheapest unfilled slot of any unassigned child
332
- for (let c = 0; c < child_count; c++) {
333
- if (assignment[c] === INVALID) {
334
- for (let s = 0; s < 8; s++) {
335
- if ((slot_filled & (1 << s)) === 0 && cost[c * 8 + s] < min_cost) {
336
- min_cost = cost[c * 8 + s];
337
-
338
- min_slot = s;
339
- min_index = c;
340
- }
341
- }
342
- }
343
- }
344
-
345
- if (min_slot === INVALID) break;
346
-
347
- slot_filled |= 1 << min_slot;
348
- assignment [min_index] = min_slot;
349
- }
372
+ bvh8_assign_slots_greedy(assignment, cost, child_count);
350
373
 
351
374
  // Permute children array according to assignment
352
375
  const children_copy = new Uint32Array(8);
@@ -507,7 +530,11 @@ export class BVH8Converter {
507
530
 
508
531
  const child_decision_ptr = this.#decisions.element_address(child_index * 7);
509
532
 
510
- const child_decision_type = this.#decisions.data_view.getUint8(child_decision_ptr);
533
+ // a BVH2 leaf asked for its children answers with itself: a cluster of one primitive, or a
534
+ // tree of one, and either way this node's one slot is that primitive
535
+ const child_decision_type = child_index === node_index_bvh2
536
+ ? DECISION_TYPE.LEAF
537
+ : this.#decisions.data_view.getUint8(child_decision_ptr);
511
538
 
512
539
  let child_meta = 0;
513
540
 
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Give each child of a wide node one of its eight slots, cheapest pair first.
3
+ *
4
+ * A ray visits a node's slots in an order fixed by the signs of its direction, so which slot a child
5
+ * sits in decides how early a ray going its way reaches it. `cost[child * 8 + slot]` says how badly a
6
+ * child suits a slot; the cheapest (child, slot) pair still open is taken until every child has a
7
+ * slot. Ylitie et al. name this greedy as doing about as well in practice as the auction algorithm
8
+ * they use.
9
+ *
10
+ * Of equal costs the first met wins: children in order, and for a child its slots in order. Two
11
+ * builders that fill the table with the same numbers get the same slots.
12
+ *
13
+ * @param {Uint32Array|number[]} assignment output, a slot per child; {@link BVH8_SLOT_UNASSIGNED}
14
+ * past `child_count`
15
+ * @param {Float32Array|number[]} cost 64 entries, `[child * 8 + slot]`; read for `child < child_count`
16
+ * @param {number} child_count at most 8
17
+ * @returns {number} the slots taken, a bit each
18
+ */
19
+ export function bvh8_assign_slots_greedy(assignment: Uint32Array | number[], cost: Float32Array | number[], child_count: number): number;
20
+ /**
21
+ * What {@link bvh8_assign_slots_greedy} leaves in `assignment` for a child it was not asked about.
22
+ * @type {number}
23
+ */
24
+ export const BVH8_SLOT_UNASSIGNED: number;
25
+ //# sourceMappingURL=bvh8_assign_slots_greedy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bvh8_assign_slots_greedy.d.ts","sourceRoot":"","sources":["../../../../../src/core/bvh8/build/bvh8_assign_slots_greedy.js"],"names":[],"mappings":"AAQA;;;;;;;;;;;;;;;;;GAiBG;AACH,qDANW,WAAW,GAAC,MAAM,EAAE,QAEpB,YAAY,GAAC,MAAM,EAAE,eACrB,MAAM,GACJ,MAAM,CA2ClB;AAjED;;;GAGG;AACH,mCAFU,MAAM,CAE+B"}
@@ -0,0 +1,68 @@
1
+ import { assert } from "../../assert.js";
2
+
3
+ /**
4
+ * What {@link bvh8_assign_slots_greedy} leaves in `assignment` for a child it was not asked about.
5
+ * @type {number}
6
+ */
7
+ export const BVH8_SLOT_UNASSIGNED = 0xFFFFFFFF;
8
+
9
+ /**
10
+ * Give each child of a wide node one of its eight slots, cheapest pair first.
11
+ *
12
+ * A ray visits a node's slots in an order fixed by the signs of its direction, so which slot a child
13
+ * sits in decides how early a ray going its way reaches it. `cost[child * 8 + slot]` says how badly a
14
+ * child suits a slot; the cheapest (child, slot) pair still open is taken until every child has a
15
+ * slot. Ylitie et al. name this greedy as doing about as well in practice as the auction algorithm
16
+ * they use.
17
+ *
18
+ * Of equal costs the first met wins: children in order, and for a child its slots in order. Two
19
+ * builders that fill the table with the same numbers get the same slots.
20
+ *
21
+ * @param {Uint32Array|number[]} assignment output, a slot per child; {@link BVH8_SLOT_UNASSIGNED}
22
+ * past `child_count`
23
+ * @param {Float32Array|number[]} cost 64 entries, `[child * 8 + slot]`; read for `child < child_count`
24
+ * @param {number} child_count at most 8
25
+ * @returns {number} the slots taken, a bit each
26
+ */
27
+ export function bvh8_assign_slots_greedy(assignment, cost, child_count) {
28
+ assert.isNonNegativeInteger(child_count, 'child_count');
29
+ assert.lessThanOrEqual(child_count, 8, 'a node has eight slots');
30
+
31
+ for (let i = 0; i < 8; i++) {
32
+ assignment[i] = BVH8_SLOT_UNASSIGNED;
33
+ }
34
+
35
+ let slot_filled = 0;
36
+
37
+ for (; ;) {
38
+ let min_cost = Infinity;
39
+
40
+ let min_slot = BVH8_SLOT_UNASSIGNED;
41
+ let min_index = BVH8_SLOT_UNASSIGNED;
42
+
43
+ // the cheapest open slot of any child still without one
44
+ for (let c = 0; c < child_count; c++) {
45
+ if (assignment[c] !== BVH8_SLOT_UNASSIGNED) {
46
+ continue;
47
+ }
48
+
49
+ for (let s = 0; s < 8; s++) {
50
+ if ((slot_filled & (1 << s)) === 0 && cost[c * 8 + s] < min_cost) {
51
+ min_cost = cost[c * 8 + s];
52
+
53
+ min_slot = s;
54
+ min_index = c;
55
+ }
56
+ }
57
+ }
58
+
59
+ if (min_slot === BVH8_SLOT_UNASSIGNED) {
60
+ break;
61
+ }
62
+
63
+ slot_filled |= 1 << min_slot;
64
+ assignment[min_index] = min_slot;
65
+ }
66
+
67
+ return slot_filled;
68
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"bvh8_from_proxy.d.ts","sourceRoot":"","sources":["../../../../../src/core/bvh8/build/bvh8_from_proxy.js"],"names":[],"mappings":"AA0OA;;;;;;GAMG;AACH,0EAHW,MAAM,EAAE,kBACR,MAAM,EAAE,QAgBlB"}
1
+ {"version":3,"file":"bvh8_from_proxy.d.ts","sourceRoot":"","sources":["../../../../../src/core/bvh8/build/bvh8_from_proxy.js"],"names":[],"mappings":"AA2MA;;;;;;GAMG;AACH,0EAHW,MAAM,EAAE,kBACR,MAAM,EAAE,QAgBlB"}
@@ -1,6 +1,7 @@
1
1
  import { assert } from "../../assert.js";
2
2
  import { reinterpret_float32_as_uint32 } from "../../binary/reinterpret_float32_as_uint32.js";
3
3
  import { v3_dot } from "../../geom/vec3/v3_dot.js";
4
+ import { bvh8_assign_slots_greedy } from "./bvh8_assign_slots_greedy.js";
4
5
  import { byte } from "./byte.js";
5
6
  import { encode_bounds_e } from "./encode_bounds_e.js";
6
7
 
@@ -41,41 +42,9 @@ function bvh8_sort_children(node, children, child_count) {
41
42
  }
42
43
  }
43
44
 
44
- const INVALID = 0xFFFFFFFF;
45
-
46
45
  const assignment = new Uint32Array(8);
47
- assignment.fill(INVALID);
48
-
49
- let slot_filled = 0; // bitfield
50
-
51
-
52
- // Greedy child ordering, the paper mentions this as an alternative
53
- // that works about as well as the auction algorithm in practice
54
- while (true) {
55
- let min_cost = Infinity;
56
-
57
- let min_slot = INVALID;
58
- let min_index = INVALID;
59
-
60
- // Find the cheapest unfilled slot of any unassigned child
61
- for (let c = 0; c < child_count; c++) {
62
- if (assignment[c] === INVALID) {
63
- for (let s = 0; s < 8; s++) {
64
- if ((slot_filled & (1 << s)) === 0 && cost[c * 8 + s] < min_cost) {
65
- min_cost = cost[c * 8 + s];
66
46
 
67
- min_slot = s;
68
- min_index = c;
69
- }
70
- }
71
- }
72
- }
73
-
74
- if (min_slot === INVALID) break;
75
-
76
- slot_filled |= 1 << min_slot;
77
- assignment [min_index] = min_slot;
78
- }
47
+ bvh8_assign_slots_greedy(assignment, cost, child_count);
79
48
 
80
49
  // Permute children array according to assignment
81
50
  const children_copy = new Array(8);
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Put a node on the grid of its own box, and write each of its occupied slots' boxes in bytes on it:
3
+ * the origin at the box's low corner, a power-of-two step an axis that spans the box in 255, a
4
+ * slot's low corner rounded down to the grid and its high corner up.
5
+ *
6
+ * Writes the node's origin, its three exponents and the quantized boxes of the slots named, and
7
+ * zeroes the boxes of the others. The node's child mask, its bases and its metas are left as they
8
+ * are.
9
+ *
10
+ * Every step is a single-precision one, in a fixed order, and it is the arithmetic the GPU's passes
11
+ * that fit nodes do (`shader_blas8_refit_batch`, the TLAS encode): the same boxes in give the same
12
+ * words out, there and here. A slot's box comes out holding the box it was given whenever that box
13
+ * lies inside the node's.
14
+ *
15
+ * @param {BVH8} bvh
16
+ * @param {number} node
17
+ * @param {ArrayLike<number>} box the node's own box, `[min.xyz, max.xyz]`, float32 values
18
+ * @param {ArrayLike<number>} slot_boxes six floats a slot, 48 in all; read for the slots in `occupied`
19
+ * @param {number} occupied the slots to write, a bit each
20
+ */
21
+ export function bvh8_node_fit_slots(bvh: BVH8, node: number, box: ArrayLike<number>, slot_boxes: ArrayLike<number>, occupied: number): void;
22
+ //# sourceMappingURL=bvh8_node_fit_slots.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bvh8_node_fit_slots.d.ts","sourceRoot":"","sources":["../../../../../src/core/bvh8/build/bvh8_node_fit_slots.js"],"names":[],"mappings":"AAmDA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qDALW,MAAM,OACN,UAAU,MAAM,CAAC,cACjB,UAAU,MAAM,CAAC,YACjB,MAAM,QA6ChB"}
@@ -0,0 +1,115 @@
1
+ import { assert } from "../../assert.js";
2
+ import { reinterpret_float32_as_uint32 } from "../../binary/reinterpret_float32_as_uint32.js";
3
+ import { reinterpret_uint32_as_float32 } from "../../binary/reinterpret_uint32_as_float32.js";
4
+
5
+ const fround = Math.fround;
6
+
7
+ const ONE_OVER_255 = fround(1 / 255);
8
+
9
+ /**
10
+ * The next float up from a difference that cannot be negative. A difference of two floats is
11
+ * rounded, and a box must not shrink by the rounding. Nothing is added to an exact zero.
12
+ *
13
+ * @param {number} x a float32 value, zero or above
14
+ * @returns {number}
15
+ */
16
+ function round_up(x) {
17
+ return x > 0 ? reinterpret_uint32_as_float32(reinterpret_float32_as_uint32(x) + 1) : x;
18
+ }
19
+
20
+ /**
21
+ * The next float down, as {@link round_up} is the next up.
22
+ *
23
+ * @param {number} x a float32 value, zero or above
24
+ * @returns {number}
25
+ */
26
+ function round_down(x) {
27
+ return x > 0 ? reinterpret_uint32_as_float32(reinterpret_float32_as_uint32(x) - 1) : x;
28
+ }
29
+
30
+ /**
31
+ * The exponent byte of the smallest power of two that spans an extent in 255 steps; zero, a step of
32
+ * nothing, for no extent at all.
33
+ *
34
+ * @param {number} extent a float32 value
35
+ * @returns {number}
36
+ */
37
+ function step_exponent(extent) {
38
+ if (!(extent > 0)) {
39
+ return 0;
40
+ }
41
+
42
+ // the power of two at or below a 255th of the extent, and the next one up unless that one spans it
43
+ let exponent = (reinterpret_float32_as_uint32(fround(extent * ONE_OVER_255)) >>> 23) & 0xFF;
44
+
45
+ if (extent > fround(255 * reinterpret_uint32_as_float32(exponent << 23))) {
46
+ exponent += 1;
47
+ }
48
+
49
+ return exponent;
50
+ }
51
+
52
+ /**
53
+ * Put a node on the grid of its own box, and write each of its occupied slots' boxes in bytes on it:
54
+ * the origin at the box's low corner, a power-of-two step an axis that spans the box in 255, a
55
+ * slot's low corner rounded down to the grid and its high corner up.
56
+ *
57
+ * Writes the node's origin, its three exponents and the quantized boxes of the slots named, and
58
+ * zeroes the boxes of the others. The node's child mask, its bases and its metas are left as they
59
+ * are.
60
+ *
61
+ * Every step is a single-precision one, in a fixed order, and it is the arithmetic the GPU's passes
62
+ * that fit nodes do (`shader_blas8_refit_batch`, the TLAS encode): the same boxes in give the same
63
+ * words out, there and here. A slot's box comes out holding the box it was given whenever that box
64
+ * lies inside the node's.
65
+ *
66
+ * @param {BVH8} bvh
67
+ * @param {number} node
68
+ * @param {ArrayLike<number>} box the node's own box, `[min.xyz, max.xyz]`, float32 values
69
+ * @param {ArrayLike<number>} slot_boxes six floats a slot, 48 in all; read for the slots in `occupied`
70
+ * @param {number} occupied the slots to write, a bit each
71
+ */
72
+ export function bvh8_node_fit_slots(bvh, node, box, slot_boxes, occupied) {
73
+ assert.isNonNegativeInteger(node, 'node');
74
+ assert.isNonNegativeInteger(occupied, 'occupied');
75
+ assert.lessThan(occupied, 256, 'a node has eight slots');
76
+
77
+ const min_x = box[0], min_y = box[1], min_z = box[2];
78
+
79
+ const exponent_x = step_exponent(round_up(fround(box[3] - min_x)));
80
+ const exponent_y = step_exponent(round_up(fround(box[4] - min_y)));
81
+ const exponent_z = step_exponent(round_up(fround(box[5] - min_z)));
82
+
83
+ bvh.node_set_p(node, min_x, min_y, min_z);
84
+ bvh.node_set_e(node, exponent_x, exponent_y, exponent_z);
85
+
86
+ // a step of nothing takes every byte to zero
87
+ const per_cell_x = exponent_x > 0 ? fround(1 / reinterpret_uint32_as_float32(exponent_x << 23)) : 0;
88
+ const per_cell_y = exponent_y > 0 ? fround(1 / reinterpret_uint32_as_float32(exponent_y << 23)) : 0;
89
+ const per_cell_z = exponent_z > 0 ? fround(1 / reinterpret_uint32_as_float32(exponent_z << 23)) : 0;
90
+
91
+ for (let slot = 0; slot < 8; slot++) {
92
+ if ((occupied & (1 << slot)) === 0) {
93
+ bvh.node_set_quantized_min(node, slot, 0, 0, 0);
94
+ bvh.node_set_quantized_max(node, slot, 0, 0, 0);
95
+
96
+ continue;
97
+ }
98
+
99
+ const o = slot * 6;
100
+
101
+ bvh.node_set_quantized_min(
102
+ node, slot,
103
+ Math.floor(fround(round_down(fround(slot_boxes[o] - min_x)) * per_cell_x)),
104
+ Math.floor(fround(round_down(fround(slot_boxes[o + 1] - min_y)) * per_cell_y)),
105
+ Math.floor(fround(round_down(fround(slot_boxes[o + 2] - min_z)) * per_cell_z)),
106
+ );
107
+
108
+ bvh.node_set_quantized_max(
109
+ node, slot,
110
+ Math.min(255, Math.ceil(fround(round_up(fround(slot_boxes[o + 3] - min_x)) * per_cell_x))),
111
+ Math.min(255, Math.ceil(fround(round_up(fround(slot_boxes[o + 4] - min_y)) * per_cell_y))),
112
+ Math.min(255, Math.ceil(fround(round_up(fround(slot_boxes[o + 5] - min_z)) * per_cell_z))),
113
+ );
114
+ }
115
+ }
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Levels of nodes in a BVH8, the root's included: 1 for a tree of one node, 0 for an empty one.
3
+ *
4
+ * @param {BVH8} bvh
5
+ * @returns {number}
6
+ */
7
+ export function bvh8_depth(bvh: BVH8): number;
8
+ //# sourceMappingURL=bvh8_depth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bvh8_depth.d.ts","sourceRoot":"","sources":["../../../../src/core/bvh8/bvh8_depth.js"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,uCAFa,MAAM,CAkClB"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Levels of nodes in a BVH8, the root's included: 1 for a tree of one node, 0 for an empty one.
3
+ *
4
+ * @param {BVH8} bvh
5
+ * @returns {number}
6
+ */
7
+ export function bvh8_depth(bvh) {
8
+ if (bvh.nodes.size === 0) {
9
+ return 0;
10
+ }
11
+
12
+ let deepest = 0;
13
+
14
+ // (node, level) pairs
15
+ const stack = [0, 1];
16
+
17
+ while (stack.length > 0) {
18
+ const level = stack.pop();
19
+ const node = stack.pop();
20
+
21
+ if (level > deepest) {
22
+ deepest = level;
23
+ }
24
+
25
+ const imask = bvh.node_get_imask(node);
26
+ const base_index_child = bvh.node_get_base_index_child(node);
27
+
28
+ let child = 0;
29
+
30
+ for (let slot = 0; slot < 8; slot++) {
31
+ if ((imask & (1 << slot)) !== 0) {
32
+ stack.push(base_index_child + child, level + 1);
33
+ child++;
34
+ }
35
+ }
36
+ }
37
+
38
+ return deepest;
39
+ }
@@ -0,0 +1,19 @@
1
+ /**
2
+ * The discrete Fourier transform of `n` complex values, in place, radix 2:
3
+ *
4
+ * X_k = Σ_j x_j · e^(∓2πi·jk/n)
5
+ *
6
+ * the minus sign forward, the plus sign inverse. The inverse is not scaled: a forward transform
7
+ * then an inverse one multiplies every value by `n`.
8
+ *
9
+ * Iterative Cooley–Tukey, decimation in time: a bit-reversal permutation, then `log2(n)` stages of
10
+ * butterflies. Each stage's twiddles are taken from `Math.cos` and `Math.sin` directly, `n − 1` pairs
11
+ * over the transform, so the error does not grow along a recurrence. Allocates nothing.
12
+ *
13
+ * @param {Float64Array|Float32Array|number[]} re real parts, read and written at `0..n−1`
14
+ * @param {Float64Array|Float32Array|number[]} im imaginary parts, likewise
15
+ * @param {number} n a power of two
16
+ * @param {boolean} inverse
17
+ */
18
+ export function complex_fft_radix2(re: Float64Array | Float32Array | number[], im: Float64Array | Float32Array | number[], n: number, inverse: boolean): void;
19
+ //# sourceMappingURL=complex_fft_radix2.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"complex_fft_radix2.d.ts","sourceRoot":"","sources":["../../../../../src/core/math/complex/complex_fft_radix2.js"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;GAgBG;AACH,uCALW,YAAY,GAAC,YAAY,GAAC,MAAM,EAAE,MAClC,YAAY,GAAC,YAAY,GAAC,MAAM,EAAE,KAClC,MAAM,WACN,OAAO,QAoDjB"}
@@ -0,0 +1,71 @@
1
+ import { assert } from "../../assert.js";
2
+ import { isPowerOfTwo } from "../isPowerOfTwo.js";
3
+
4
+ /**
5
+ * The discrete Fourier transform of `n` complex values, in place, radix 2:
6
+ *
7
+ * X_k = Σ_j x_j · e^(∓2πi·jk/n)
8
+ *
9
+ * the minus sign forward, the plus sign inverse. The inverse is not scaled: a forward transform
10
+ * then an inverse one multiplies every value by `n`.
11
+ *
12
+ * Iterative Cooley–Tukey, decimation in time: a bit-reversal permutation, then `log2(n)` stages of
13
+ * butterflies. Each stage's twiddles are taken from `Math.cos` and `Math.sin` directly, `n − 1` pairs
14
+ * over the transform, so the error does not grow along a recurrence. Allocates nothing.
15
+ *
16
+ * @param {Float64Array|Float32Array|number[]} re real parts, read and written at `0..n−1`
17
+ * @param {Float64Array|Float32Array|number[]} im imaginary parts, likewise
18
+ * @param {number} n a power of two
19
+ * @param {boolean} inverse
20
+ */
21
+ export function complex_fft_radix2(re, im, n, inverse) {
22
+ assert.isPositiveInteger(n, 'n');
23
+ assert.ok(isPowerOfTwo(n), 'n is a power of two');
24
+
25
+ // bit-reversal permutation
26
+ for (let i = 1, j = 0; i < n; i++) {
27
+ let bit = n >> 1;
28
+
29
+ while ((j & bit) !== 0) {
30
+ j ^= bit;
31
+ bit >>= 1;
32
+ }
33
+
34
+ j ^= bit;
35
+
36
+ if (i < j) {
37
+ const r = re[i];
38
+ re[i] = re[j];
39
+ re[j] = r;
40
+
41
+ const m = im[i];
42
+ im[i] = im[j];
43
+ im[j] = m;
44
+ }
45
+ }
46
+
47
+ const sign = inverse ? 1 : -1;
48
+
49
+ for (let length = 2; length <= n; length <<= 1) {
50
+ const half = length >> 1;
51
+ const step = sign * 2 * Math.PI / length;
52
+
53
+ for (let k = 0; k < half; k++) {
54
+ const w_re = Math.cos(step * k);
55
+ const w_im = Math.sin(step * k);
56
+
57
+ for (let start = 0; start < n; start += length) {
58
+ const a = start + k;
59
+ const b = a + half;
60
+
61
+ const t_re = re[b] * w_re - im[b] * w_im;
62
+ const t_im = re[b] * w_im + im[b] * w_re;
63
+
64
+ re[b] = re[a] - t_re;
65
+ im[b] = im[a] - t_im;
66
+ re[a] += t_re;
67
+ im[a] += t_im;
68
+ }
69
+ }
70
+ }
71
+ }