@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,254 +1,259 @@
1
- import { verify_gpu_bvh_build } from "../../renderer/gpu_primitive/bvh/verify_gpu_bvh_build.js";
2
- import { verify_radix_sort } from "../../renderer/gpu_primitive/sort/verify_radix_sort.js";
3
- import { verify_gpu_tlas_build } from "../../renderer/scene/verify_gpu_tlas_build.js";
4
- import { bvh_repro_device, describe_device } from "./bvh_repro_device.js";
5
-
6
- /**
7
- * Driver for the standalone GPU BVH repro page.
8
- *
9
- * The harnesses it runs report through `console`, which is where they report from the main
10
- * playground too — so rather than giving them a second output channel, this mirrors the console
11
- * into the page while a run is in flight. That keeps one implementation of each check and makes the
12
- * page useful to someone who has devtools closed.
13
- */
14
-
15
- const log_element = document.getElementById('log');
16
- const status_element = document.getElementById('status');
17
- const device_element = document.getElementById('device');
18
- const buttons = [...document.querySelectorAll('button[data-run]')];
19
-
20
- /** @type {{graphics: GraphicsContext, device: GPUDevice, adapter: GPUAdapter}|undefined} */
21
- let context;
22
-
23
- /**
24
- * @param {string} text
25
- * @param {string} [kind] one of 'pass', 'fail', 'warn', 'note'
26
- */
27
- function append(text, kind = '') {
28
- const line = document.createElement('div');
29
-
30
- line.className = `line ${kind}`;
31
- line.textContent = text;
32
-
33
- log_element.appendChild(line);
34
- log_element.scrollTop = log_element.scrollHeight;
35
- }
36
-
37
- /**
38
- * The harnesses format their PASS lines with `%c` and a CSS string, which is console syntax and
39
- * nothing else. Strip the directives and drop the style arguments that went with them.
40
- *
41
- * @param {any[]} args
42
- * @returns {string}
43
- */
44
- function flatten_console_args(args) {
45
- if (args.length === 0) {
46
- return '';
47
- }
48
-
49
- const [first, ...rest] = args;
50
-
51
- if (typeof first !== 'string' || !first.includes('%c')) {
52
- return args.map(value => (typeof value === 'string' ? value : String(value))).join(' ');
53
- }
54
-
55
- const directives = (first.match(/%c/g) ?? []).length;
56
-
57
- return [first.replaceAll('%c', ''), ...rest.slice(directives)]
58
- .map(value => (typeof value === 'string' ? value : String(value)))
59
- .join(' ');
60
- }
61
-
62
- /**
63
- * Run `body` with the console mirrored into the page.
64
- *
65
- * @param {function(): (void|Promise<void>)} body
66
- * @returns {Promise<void>}
67
- */
68
- async function with_mirrored_console(body) {
69
- const original = {
70
- log: console.log,
71
- warn: console.warn,
72
- error: console.error,
73
- table: console.table,
74
- };
75
-
76
- console.log = (...args) => {
77
- original.log(...args);
78
-
79
- const text = flatten_console_args(args);
80
-
81
- append(text, /\bPASS\b/.test(text) ? 'pass' : '');
82
- };
83
-
84
- console.warn = (...args) => {
85
- original.warn(...args);
86
- append(flatten_console_args(args), 'warn');
87
- };
88
-
89
- console.error = (...args) => {
90
- original.error(...args);
91
- append(flatten_console_args(args), 'fail');
92
- };
93
-
94
- console.table = rows => {
95
- original.table(rows);
96
-
97
- if (!Array.isArray(rows)) {
98
- return;
99
- }
100
-
101
- for (const row of rows) {
102
- append(` ${String(row.label).padEnd(34)} ${Number(row.duration_ms).toFixed(4)} ms`, 'note');
103
- }
104
- };
105
-
106
- try {
107
- await body();
108
- } finally {
109
- Object.assign(console, original);
110
- }
111
- }
112
-
113
- /**
114
- * Wait until the device has finished the work that was submitted, and until the readback promises
115
- * chained off it have had a chance to resolve and report.
116
- *
117
- * The harnesses are fire-and-forget by design (`graph_inspect_gpu_buffer` calls back from a
118
- * `mapAsync` promise), so there is nothing to await directly. `onSubmittedWorkDone` covers the
119
- * device side; the turns after it are what let the mapping promises and their `.then` chains run.
120
- *
121
- * @param {GPUDevice} device
122
- * @returns {Promise<void>}
123
- */
124
- async function drain(device) {
125
- await device.queue.onSubmittedWorkDone();
126
-
127
- for (let i = 0; i < 8; i++) {
128
- await new Promise(resolve => setTimeout(resolve, 0));
129
- }
130
- }
131
-
132
- /**
133
- * @param {boolean} enabled
134
- */
135
- function set_enabled(enabled) {
136
- for (const button of buttons) {
137
- button.disabled = !enabled;
138
- }
139
- }
140
-
141
- /**
142
- * @param {string} text
143
- * @param {string} [kind]
144
- */
145
- function set_status(text, kind = '') {
146
- status_element.textContent = text;
147
- status_element.className = kind;
148
- }
149
-
150
- /**
151
- * @returns {Promise<{graphics: GraphicsContext, device: GPUDevice, adapter: GPUAdapter}>}
152
- */
153
- async function obtain_context() {
154
- if (context !== undefined) {
155
- return context;
156
- }
157
-
158
- set_status('acquiring a device…');
159
-
160
- context = await bvh_repro_device();
161
-
162
- device_element.innerHTML = '';
163
-
164
- for (const { label, value } of describe_device(context.adapter, context.device)) {
165
- const row = document.createElement('div');
166
-
167
- const name = document.createElement('span');
168
- name.className = 'key';
169
- name.textContent = label;
170
-
171
- const text = document.createElement('span');
172
- text.textContent = value;
173
-
174
- row.append(name, text);
175
- device_element.appendChild(row);
176
- }
177
-
178
- // An uncaptured validation error is the single most useful thing this page can surface: the
179
- // harnesses check bytes, and a shader that failed to create says nothing about bytes at all.
180
- context.device.addEventListener('uncapturederror', event => {
181
- append(`[device] ${event.error.constructor.name}: ${event.error.message}`, 'fail');
182
- });
183
-
184
- context.device.lost.then(info => {
185
- append(`[device] LOST (${info.reason}): ${info.message}`, 'fail');
186
- set_status('device lost', 'fail');
187
- });
188
-
189
- return context;
190
- }
191
-
192
- const RUNS = {
193
- sort: {
194
- title: 'radix sort',
195
- run: graphics => verify_radix_sort(graphics),
196
- },
197
- bvh: {
198
- title: 'GPU BVH build',
199
- run: graphics => verify_gpu_bvh_build(graphics),
200
- },
201
- tlas: {
202
- title: 'TLAS end to end',
203
- run: graphics => verify_gpu_tlas_build(graphics),
204
- },
205
- };
206
-
207
- /**
208
- * @param {string} name
209
- */
210
- async function run(name) {
211
- set_enabled(false);
212
-
213
- try {
214
- const { graphics, device } = await obtain_context();
215
-
216
- const names = name === 'all' ? Object.keys(RUNS) : [name];
217
-
218
- for (const key of names) {
219
- const { title, run: body } = RUNS[key];
220
-
221
- append('', '');
222
- append(`── ${title} ──`, 'note');
223
-
224
- set_status(`running ${title}…`);
225
-
226
- const started = performance.now();
227
-
228
- await with_mirrored_console(async () => {
229
- await body(graphics);
230
- await drain(device);
231
- });
232
-
233
- append(` ${title} finished in ${(performance.now() - started).toFixed(0)} ms (wall clock)`, 'note');
234
- }
235
-
236
- set_status('done — read the log for PASS/FAIL', 'pass');
237
- } catch (error) {
238
- append(String(error?.stack ?? error), 'fail');
239
- set_status('failed to run — see the log', 'fail');
240
- } finally {
241
- set_enabled(true);
242
- }
243
- }
244
-
245
- for (const button of buttons) {
246
- button.addEventListener('click', () => run(button.dataset.run));
247
- }
248
-
249
- document.getElementById('clear').addEventListener('click', () => {
250
- log_element.innerHTML = '';
251
- set_status('');
252
- });
253
-
254
- set_status('ready — pick a check');
1
+ import { verify_gpu_bvh_build } from "../../renderer/gpu_primitive/bvh/verify_gpu_bvh_build.js";
2
+ import { verify_gpu_bvh8_encode } from "../../renderer/gpu_primitive/bvh8/verify_gpu_bvh8_encode.js";
3
+ import { verify_radix_sort } from "../../renderer/gpu_primitive/sort/verify_radix_sort.js";
4
+ import { verify_gpu_tlas_build } from "../../renderer/scene/verify_gpu_tlas_build.js";
5
+ import { bvh_repro_device, describe_device } from "./bvh_repro_device.js";
6
+
7
+ /**
8
+ * Driver for the standalone GPU BVH repro page.
9
+ *
10
+ * The harnesses it runs report through `console`, which is where they report from the main
11
+ * playground too — so rather than giving them a second output channel, this mirrors the console
12
+ * into the page while a run is in flight. That keeps one implementation of each check and makes the
13
+ * page useful to someone who has devtools closed.
14
+ */
15
+
16
+ const log_element = document.getElementById('log');
17
+ const status_element = document.getElementById('status');
18
+ const device_element = document.getElementById('device');
19
+ const buttons = [...document.querySelectorAll('button[data-run]')];
20
+
21
+ /** @type {{graphics: GraphicsContext, device: GPUDevice, adapter: GPUAdapter}|undefined} */
22
+ let context;
23
+
24
+ /**
25
+ * @param {string} text
26
+ * @param {string} [kind] one of 'pass', 'fail', 'warn', 'note'
27
+ */
28
+ function append(text, kind = '') {
29
+ const line = document.createElement('div');
30
+
31
+ line.className = `line ${kind}`;
32
+ line.textContent = text;
33
+
34
+ log_element.appendChild(line);
35
+ log_element.scrollTop = log_element.scrollHeight;
36
+ }
37
+
38
+ /**
39
+ * The harnesses format their PASS lines with `%c` and a CSS string, which is console syntax and
40
+ * nothing else. Strip the directives and drop the style arguments that went with them.
41
+ *
42
+ * @param {any[]} args
43
+ * @returns {string}
44
+ */
45
+ function flatten_console_args(args) {
46
+ if (args.length === 0) {
47
+ return '';
48
+ }
49
+
50
+ const [first, ...rest] = args;
51
+
52
+ if (typeof first !== 'string' || !first.includes('%c')) {
53
+ return args.map(value => (typeof value === 'string' ? value : String(value))).join(' ');
54
+ }
55
+
56
+ const directives = (first.match(/%c/g) ?? []).length;
57
+
58
+ return [first.replaceAll('%c', ''), ...rest.slice(directives)]
59
+ .map(value => (typeof value === 'string' ? value : String(value)))
60
+ .join(' ');
61
+ }
62
+
63
+ /**
64
+ * Run `body` with the console mirrored into the page.
65
+ *
66
+ * @param {function(): (void|Promise<void>)} body
67
+ * @returns {Promise<void>}
68
+ */
69
+ async function with_mirrored_console(body) {
70
+ const original = {
71
+ log: console.log,
72
+ warn: console.warn,
73
+ error: console.error,
74
+ table: console.table,
75
+ };
76
+
77
+ console.log = (...args) => {
78
+ original.log(...args);
79
+
80
+ const text = flatten_console_args(args);
81
+
82
+ append(text, /\bPASS\b/.test(text) ? 'pass' : '');
83
+ };
84
+
85
+ console.warn = (...args) => {
86
+ original.warn(...args);
87
+ append(flatten_console_args(args), 'warn');
88
+ };
89
+
90
+ console.error = (...args) => {
91
+ original.error(...args);
92
+ append(flatten_console_args(args), 'fail');
93
+ };
94
+
95
+ console.table = rows => {
96
+ original.table(rows);
97
+
98
+ if (!Array.isArray(rows)) {
99
+ return;
100
+ }
101
+
102
+ for (const row of rows) {
103
+ append(` ${String(row.label).padEnd(34)} ${Number(row.duration_ms).toFixed(4)} ms`, 'note');
104
+ }
105
+ };
106
+
107
+ try {
108
+ await body();
109
+ } finally {
110
+ Object.assign(console, original);
111
+ }
112
+ }
113
+
114
+ /**
115
+ * Wait until the device has finished the work that was submitted, and until the readback promises
116
+ * chained off it have had a chance to resolve and report.
117
+ *
118
+ * The harnesses are fire-and-forget by design (`graph_inspect_gpu_buffer` calls back from a
119
+ * `mapAsync` promise), so there is nothing to await directly. `onSubmittedWorkDone` covers the
120
+ * device side; the turns after it are what let the mapping promises and their `.then` chains run.
121
+ *
122
+ * @param {GPUDevice} device
123
+ * @returns {Promise<void>}
124
+ */
125
+ async function drain(device) {
126
+ await device.queue.onSubmittedWorkDone();
127
+
128
+ for (let i = 0; i < 8; i++) {
129
+ await new Promise(resolve => setTimeout(resolve, 0));
130
+ }
131
+ }
132
+
133
+ /**
134
+ * @param {boolean} enabled
135
+ */
136
+ function set_enabled(enabled) {
137
+ for (const button of buttons) {
138
+ button.disabled = !enabled;
139
+ }
140
+ }
141
+
142
+ /**
143
+ * @param {string} text
144
+ * @param {string} [kind]
145
+ */
146
+ function set_status(text, kind = '') {
147
+ status_element.textContent = text;
148
+ status_element.className = kind;
149
+ }
150
+
151
+ /**
152
+ * @returns {Promise<{graphics: GraphicsContext, device: GPUDevice, adapter: GPUAdapter}>}
153
+ */
154
+ async function obtain_context() {
155
+ if (context !== undefined) {
156
+ return context;
157
+ }
158
+
159
+ set_status('acquiring a device…');
160
+
161
+ context = await bvh_repro_device();
162
+
163
+ device_element.innerHTML = '';
164
+
165
+ for (const { label, value } of describe_device(context.adapter, context.device)) {
166
+ const row = document.createElement('div');
167
+
168
+ const name = document.createElement('span');
169
+ name.className = 'key';
170
+ name.textContent = label;
171
+
172
+ const text = document.createElement('span');
173
+ text.textContent = value;
174
+
175
+ row.append(name, text);
176
+ device_element.appendChild(row);
177
+ }
178
+
179
+ // An uncaptured validation error is the single most useful thing this page can surface: the
180
+ // harnesses check bytes, and a shader that failed to create says nothing about bytes at all.
181
+ context.device.addEventListener('uncapturederror', event => {
182
+ append(`[device] ${event.error.constructor.name}: ${event.error.message}`, 'fail');
183
+ });
184
+
185
+ context.device.lost.then(info => {
186
+ append(`[device] LOST (${info.reason}): ${info.message}`, 'fail');
187
+ set_status('device lost', 'fail');
188
+ });
189
+
190
+ return context;
191
+ }
192
+
193
+ const RUNS = {
194
+ sort: {
195
+ title: 'radix sort',
196
+ run: graphics => verify_radix_sort(graphics),
197
+ },
198
+ bvh: {
199
+ title: 'GPU BVH build',
200
+ run: graphics => verify_gpu_bvh_build(graphics),
201
+ },
202
+ bvh8: {
203
+ title: 'BVH8 encode',
204
+ run: graphics => verify_gpu_bvh8_encode(graphics),
205
+ },
206
+ tlas: {
207
+ title: 'TLAS end to end',
208
+ run: graphics => verify_gpu_tlas_build(graphics),
209
+ },
210
+ };
211
+
212
+ /**
213
+ * @param {string} name
214
+ */
215
+ async function run(name) {
216
+ set_enabled(false);
217
+
218
+ try {
219
+ const { graphics, device } = await obtain_context();
220
+
221
+ const names = name === 'all' ? Object.keys(RUNS) : [name];
222
+
223
+ for (const key of names) {
224
+ const { title, run: body } = RUNS[key];
225
+
226
+ append('', '');
227
+ append(`── ${title} ──`, 'note');
228
+
229
+ set_status(`running ${title}…`);
230
+
231
+ const started = performance.now();
232
+
233
+ await with_mirrored_console(async () => {
234
+ await body(graphics);
235
+ await drain(device);
236
+ });
237
+
238
+ append(` ${title} finished in ${(performance.now() - started).toFixed(0)} ms (wall clock)`, 'note');
239
+ }
240
+
241
+ set_status('done — read the log for PASS/FAIL', 'pass');
242
+ } catch (error) {
243
+ append(String(error?.stack ?? error), 'fail');
244
+ set_status('failed to run — see the log', 'fail');
245
+ } finally {
246
+ set_enabled(true);
247
+ }
248
+ }
249
+
250
+ for (const button of buttons) {
251
+ button.addEventListener('click', () => run(button.dataset.run));
252
+ }
253
+
254
+ document.getElementById('clear').addEventListener('click', () => {
255
+ log_element.innerHTML = '';
256
+ set_status('');
257
+ });
258
+
259
+ set_status('ready — pick a check');
@@ -1 +1 @@
1
- {"version":3,"file":"foliage_world.d.ts","sourceRoot":"","sources":["../../../../../src/shade/playground/foliage_wind/foliage_world.js"],"names":[],"mappings":"AAoDA;;;;;;GAMG;AACH,2DAJW,MAAM,iBACN,MAAM,GACJ,OAAO,4CAA4C,EAAE,eAAe,CA4DhF;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,iDAfW,OAAO,6CAA6C,EAAE,cAAc,SACpE,OAAO,+BAA+B,EAAE,KAAK;IAER,IAAI,GAAzC,UAAU,GAAC,OAAO;IACO,MAAM,GAA/B,MAAM;IACmB,IAAI,GAA7B,MAAM;IACmB,GAAG,GAA5B,MAAM;IACoB,UAAU,GAApC,OAAO;IACkB,SAAS,GAAlC,MAAM;IACmB,UAAU,GAAnC,MAAM;IACmB,YAAY,GAArC,MAAM;IACmB,UAAU,GAAnC,MAAM;IACmB,UAAU,GAAnC,MAAM;IACoB,cAAc,GAAxC,OAAO;;;;;;;;;;;;;;;;;cAoJS,MAAM;kBAAY,OAAO,oDAAoD,EAAE,cAAc;mBAAa,OAAO,mDAAmD,EAAE,YAAY;gBAAU,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAkK7L,QAAQ,GAAzB,MAAM;QACW,cAAc,GAA/B,MAAM;QACW,MAAM,GAAvB,MAAM;QACW,QAAQ,GAAzB,MAAM;;eAsCN,MAAM;;;;;;;;;;;;;;;;;;GAwGpB;AAnjBD;;;GAGG;AACH,yCAFU,MAAM,EAAE,CAYhB;8BA3C4B,sCAAsC;uCAD7B,+CAA+C;oCAmBlD,+DAA+D;qCAC9D,gEAAgE;oCACjE,+DAA+D"}
1
+ {"version":3,"file":"foliage_world.d.ts","sourceRoot":"","sources":["../../../../../src/shade/playground/foliage_wind/foliage_world.js"],"names":[],"mappings":"AAoDA;;;;;;GAMG;AACH,2DAJW,MAAM,iBACN,MAAM,GACJ,OAAO,4CAA4C,EAAE,eAAe,CA4DhF;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,iDAfW,OAAO,6CAA6C,EAAE,cAAc,SACpE,OAAO,+BAA+B,EAAE,KAAK;IAER,IAAI,GAAzC,UAAU,GAAC,OAAO;IACO,MAAM,GAA/B,MAAM;IACmB,IAAI,GAA7B,MAAM;IACmB,GAAG,GAA5B,MAAM;IACoB,UAAU,GAApC,OAAO;IACkB,SAAS,GAAlC,MAAM;IACmB,UAAU,GAAnC,MAAM;IACmB,YAAY,GAArC,MAAM;IACmB,UAAU,GAAnC,MAAM;IACmB,UAAU,GAAnC,MAAM;IACoB,cAAc,GAAxC,OAAO;;;;;;;;;;;;;;;;;cAqJS,MAAM;kBAAY,OAAO,oDAAoD,EAAE,cAAc;mBAAa,OAAO,mDAAmD,EAAE,YAAY;gBAAU,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAoK7L,QAAQ,GAAzB,MAAM;QACW,cAAc,GAA/B,MAAM;QACW,MAAM,GAAvB,MAAM;QACW,QAAQ,GAAzB,MAAM;;eAsCN,MAAM;;;;;;;;;;;;;;;;;;GAwGpB;AAtjBD;;;GAGG;AACH,yCAFU,MAAM,EAAE,CAYhB;8BA3C4B,sCAAsC;uCAD7B,+CAA+C;oCAmBlD,+DAA+D;qCAC9D,gEAAgE;oCACjE,+DAA+D"}
@@ -237,8 +237,9 @@ export async function createFoliageWindWorld(graphics, scene, initial_options =
237
237
  const global_wind = new GlobalFluidEffector();
238
238
  global_wind.wind = [6.5, 0, 2.5];
239
239
  global_wind.drag = 1.5;
240
- global_wind.gust = 0.5;
241
- global_wind.gust_period = 5.5;
240
+ // a gust of about 3.5 m/s rms on 7 m/s, its strongest eddies going by every 5.5 s
241
+ global_wind.turbulence_intensity = 0.5;
242
+ global_wind.turbulence_length = 7 * 5.5 / 4.05;
242
243
 
243
244
  const fluid_effectors = new FluidEffectorsComponent();
244
245
  fluid_effectors.addEffector(global_wind);
@@ -436,8 +437,10 @@ export async function createFoliageWindWorld(graphics, scene, initial_options =
436
437
  global_wind.wind[1] = 0.0;
437
438
  global_wind.wind[2] = dir_z * eff_speed;
438
439
  global_wind.drag = 1.5;
439
- global_wind.gust = eff_speed > 0 ? state.gustStrength / eff_speed : 0;
440
- global_wind.gust_period = Math.max(0.5, state.gustPeriod);
440
+ // the gust strength is the turbulence's rms; its period how long the strongest eddy, 4.05·L,
441
+ // takes to go by
442
+ global_wind.turbulence_intensity = eff_speed > 0 ? state.gustStrength / eff_speed : 0;
443
+ global_wind.turbulence_length = eff_speed > 0 ? eff_speed * Math.max(0.5, state.gustPeriod) / 4.05 : global_wind.turbulence_length;
441
444
 
442
445
  for (let i = 0; i < active_trees.length; i++) {
443
446
  const rigs_comp = dataset.getComponent(active_trees[i].root, FoliageWindRigs);
@@ -387,8 +387,9 @@ function build_world(dataset) {
387
387
 
388
388
  weather.wind = [4, 0, 1.5];
389
389
  weather.drag = 0.5;
390
- weather.gust = 1.5;
391
- weather.gust_period = 4;
390
+ // turbulence of 1.5 m/s rms, its strongest eddies going by every 4 s
391
+ weather.turbulence_intensity = 1.5 / Math.hypot(4, 1.5);
392
+ weather.turbulence_length = Math.hypot(4, 1.5) * 4 / 4.05;
392
393
 
393
394
  const effectors = new FluidEffectorsComponent();
394
395
 
@@ -1,13 +1,12 @@
1
1
  /**
2
- * The weather over the fire: a steady wind and a gust on top, written straight onto the scene's
3
- * published wind field as its far field, `v_far(t)`.
2
+ * The weather over the fire: a steady wind and its turbulence, written straight onto the scene's
3
+ * published wind field as its far field.
4
4
  *
5
5
  * There is no fluid here. The field is the one every `GPUSceneContext` has, with no cascades, so every
6
- * particle that reads `SAMPLE_WIND` reads `v_far` exactly — the page plays the part a producer plays,
7
- * through the same `set_far_velocity` it would call. The gust is `GlobalFluidEffector`'s, used on its
8
- * own as the model it is (three sinusoids per axis, bounded by `gust`, turning as it goes): the page
9
- * advances it and adds it to the wind, which is what the far field's fold does with one global and
10
- * no drag.
6
+ * particle that reads `SAMPLE_WIND` reads the far field exactly — the page plays the part a producer
7
+ * plays, through the same `set_far_velocity` and `set_turbulence` it would call, and does what the far
8
+ * field's fold does with one global and no drag: the mean is the wind, the turbulence's rms is the
9
+ * intensity times its speed, and the mean carries the eddies, `offset += wind · dt`.
11
10
  *
12
11
  * What reads it is the four effects' own graphs: the flame, the embers and the soot are carried by
13
12
  * the air — their positions integrate the wind at the particle on top of their own velocity, the
@@ -26,23 +25,34 @@ export class BonfireWind {
26
25
  */
27
26
  heading_degrees: number;
28
27
  /**
29
- * Peak gust on top of the wind, m/s per axis — `GlobalFluidEffector#gust`'s meaning.
28
+ * Turbulence intensity, `GlobalFluidEffector#turbulence_intensity`'s meaning: the eddies' rms as a
29
+ * share of the wind's speed. A gusty night.
30
30
  * @type {number}
31
31
  */
32
- gust: number;
32
+ turbulence_intensity: number;
33
33
  /**
34
- * `v_far(t)` as last written.
34
+ * The turbulence's length scale, m, `GlobalFluidEffector#turbulence_length`'s meaning: at the
35
+ * default speed its most energetic wavelength, `4.05·L`, goes by in about three seconds.
36
+ * @type {number}
37
+ */
38
+ turbulence_length: number;
39
+ /**
40
+ * The mean as last written, m/s.
35
41
  * @type {Float64Array}
36
42
  */
37
43
  far_velocity: Float64Array;
38
44
  /**
39
- * Advance the gust by `dt` and write the wind onto the scene's field. Once a frame, before the
40
- * frame renders: the scene context uploads the field's table in its own update.
45
+ * How far the mean has carried the eddies, m.
46
+ * @type {Float64Array}
47
+ */
48
+ turbulence_offset: Float64Array;
49
+ /**
50
+ * Advance the weather by `dt` and write it onto the scene's field. Once a frame, before the frame
51
+ * renders: the scene context uploads the field's table in its own update.
41
52
  *
42
53
  * @param {number} dt seconds
43
54
  * @param {import("../../renderer/wind/GPUSceneWind.js").GPUSceneWind} wind_field
44
55
  */
45
56
  blow(dt: number, wind_field: import("../../renderer/wind/GPUSceneWind.js").GPUSceneWind): void;
46
- #private;
47
57
  }
48
58
  //# sourceMappingURL=bonfire_wind.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"bonfire_wind.d.ts","sourceRoot":"","sources":["../../../../../src/shade/playground/particle_ecs/bonfire_wind.js"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;GAcG;AACH;IACI;;;OAGG;IACH,OAFU,MAAM,CAEN;IAEV;;;;OAIG;IACH,iBAFU,MAAM,CAEM;IAEtB;;;OAGG;IACH,MAFU,MAAM,CAEL;IAWX;;;OAGG;IACH,cAFU,YAAY,CAEa;IAOnC;;;;;;OAMG;IACH,SAHW,MAAM,cACN,OAAO,qCAAqC,EAAE,YAAY,QAkBpE;;CACJ"}
1
+ {"version":3,"file":"bonfire_wind.d.ts","sourceRoot":"","sources":["../../../../../src/shade/playground/particle_ecs/bonfire_wind.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;GAaG;AACH;IACI;;;OAGG;IACH,OAFU,MAAM,CAEN;IAEV;;;;OAIG;IACH,iBAFU,MAAM,CAEM;IAEtB;;;;OAIG;IACH,sBAFU,MAAM,CAEW;IAE3B;;;;OAIG;IACH,mBAFU,MAAM,CAEQ;IAExB;;;OAGG;IACH,cAFU,YAAY,CAEa;IAEnC;;;OAGG;IACH,mBAFU,YAAY,CAEkB;IAExC;;;;;;OAMG;IACH,SAHW,MAAM,cACN,OAAO,qCAAqC,EAAE,YAAY,QAiBpE;CACJ"}