@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,249 +1,255 @@
1
- import { ShadeGPUCommandContext } from "../../device/ShadeGPUCommandContext.js";
2
- import {
3
- BLAS_VISIBILITY_SETTINGS_STRUCT,
4
- shader_blas_audit_visibility
5
- } from "./shader_blas_audit_visibility.js";
6
-
7
- /**
8
- * Can the traversal reach every triangle in the tree?
9
- *
10
- * The last unexercised link. Everything about the tree itself checks out — leaf boxes contain the
11
- * triangles the intersector fetches, internal nodes are their children's union, the root matches an
12
- * independently computed box, the instance's world AABB contains the geometry, and the stack does
13
- * not overflow. None of that runs `ray_query_blas_nearest`, and that function is what the picture
14
- * is made of.
15
- *
16
- * So: one ray per triangle, from the camera to that triangle's own centroid. The centroid is inside
17
- * the triangle, so the ray intersects it, so a hit is guaranteed — this triangle, or whatever
18
- * occludes it. A miss cannot happen geometrically. Every miss is the traversal declining to enter a
19
- * box the ray is inside.
20
- *
21
- * Run it from a view that the picture disagrees at and from one it agrees at; the difference
22
- * between the two counts is the fault, expressed as triangles rather than pixels.
23
- */
24
-
25
- /**
26
- * @param {GPUDevice} device
27
- * @param {GPUBuffer} buffer
28
- * @param {number} size
29
- * @returns {Promise<ArrayBuffer>}
30
- */
31
- async function read_back(device, buffer, size) {
32
- const staging = device.createBuffer({
33
- label: 'reachability/readback',
34
- size,
35
- usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ,
36
- });
37
-
38
- const encoder = device.createCommandEncoder({ label: 'reachability/readback' });
39
-
40
- encoder.copyBufferToBuffer(buffer, 0, staging, 0, size);
41
-
42
- device.queue.submit([encoder.finish()]);
43
-
44
- await staging.mapAsync(GPUMapMode.READ);
45
-
46
- const copy = staging.getMappedRange().slice(0);
47
-
48
- staging.unmap();
49
- staging.destroy();
50
-
51
- return copy;
52
- }
53
-
54
- /**
55
- * Apply the inverse of a mesh's transform to a world point — the same trip `chunk_ray_query_nearest`
56
- * makes to put a ray into geometry space.
57
- *
58
- * Done on the host with a full inverse rather than by transposing a rotation, because the transform
59
- * carries the asset's centimetre scale and a shortcut that assumes orthonormality would silently be
60
- * a hundred times wrong here.
61
- *
62
- * @param {ArrayLike<number>} m column-major 4x4
63
- * @param {number[]} point
64
- * @returns {number[]}
65
- */
66
- function inverse_transform_point(m, point) {
67
- const a = [
68
- [m[0], m[4], m[8], m[12]],
69
- [m[1], m[5], m[9], m[13]],
70
- [m[2], m[6], m[10], m[14]],
71
- [m[3], m[7], m[11], m[15]],
72
- ];
73
-
74
- const b = [point[0], point[1], point[2], 1];
75
-
76
- // Gaussian elimination on the 4x4 — small, and clearer than an inlined cofactor expansion
77
- for (let column = 0; column < 4; column++) {
78
- let pivot = column;
79
-
80
- for (let row = column + 1; row < 4; row++) {
81
- if (Math.abs(a[row][column]) > Math.abs(a[pivot][column])) {
82
- pivot = row;
83
- }
84
- }
85
-
86
- [a[column], a[pivot]] = [a[pivot], a[column]];
87
- [b[column], b[pivot]] = [b[pivot], b[column]];
88
-
89
- const divisor = a[column][column];
90
-
91
- for (let k = column; k < 4; k++) {
92
- a[column][k] /= divisor;
93
- }
94
-
95
- b[column] /= divisor;
96
-
97
- for (let row = 0; row < 4; row++) {
98
- if (row === column) {
99
- continue;
100
- }
101
-
102
- const factor = a[row][column];
103
-
104
- for (let k = column; k < 4; k++) {
105
- a[row][k] -= factor * a[column][k];
106
- }
107
-
108
- b[row] -= factor * b[column];
109
- }
110
- }
111
-
112
- const w = b[3] === 0 ? 1 : b[3];
113
-
114
- return [b[0] / w, b[1] / w, b[2] / w];
115
- }
116
-
117
- /**
118
- * @param {object} options
119
- * @param {Renderer} options.renderer
120
- * @param {PerspectiveCamera} options.camera whose position the rays start from
121
- * @param {Transform64} options.world the instance's world transform, which puts the camera into geometry space
122
- * @param {object} options.target refit target of the tree to audit
123
- * @param {number} options.geometry_index
124
- * @returns {Promise<object>}
125
- */
126
- export async function verify_traversal_reachability({
127
- renderer,
128
- camera,
129
- world,
130
- target,
131
- geometry_index,
132
- }) {
133
- const graphics = renderer.graphics;
134
- const device = graphics.device;
135
-
136
- const geometries = graphics.geometries;
137
- const blas = geometries.blas;
138
- const meshlets = geometries.meshlets;
139
-
140
- const { leaf_count, node_word_offset, leaf_nodes_offset } = target;
141
-
142
- const origin = inverse_transform_point(
143
- world,
144
- [...camera.transform.translation]
145
- );
146
-
147
- const t_bytes = leaf_count * Float32Array.BYTES_PER_ELEMENT;
148
-
149
- const out_t = device.createBuffer({
150
- label: 'reachability/t',
151
- size: t_bytes,
152
- usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC,
153
- });
154
-
155
- const out_triangle = device.createBuffer({
156
- label: 'reachability/triangle',
157
- size: t_bytes,
158
- usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC,
159
- });
160
-
161
- const out_expected_t = device.createBuffer({
162
- label: 'reachability/expected t',
163
- size: t_bytes,
164
- usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC,
165
- });
166
-
167
- const cmd = ShadeGPUCommandContext.create(graphics, 'audit/reachability');
168
-
169
- shader_blas_audit_visibility.dispatchThreads({
170
- encoder: cmd,
171
- thread_count_x: leaf_count,
172
- bindings: {
173
- settings: {
174
- origin,
175
- leaf_count,
176
- node_word_offset,
177
- leaf_nodes_offset,
178
- geometry_index,
179
- tmax: 1e12,
180
- },
181
- leaf_nodes: blas.buffer_leaf_nodes,
182
- blas_lookup: blas.buffer_metadata,
183
- blas_data: blas.buffer_data,
184
- geometries: geometries.buffer_metadata,
185
- meshlet_metadata: meshlets.buffer_metadata,
186
- meshlet_data: meshlets.buffer_data,
187
- nodes: blas.buffer_data,
188
- out_t,
189
- out_triangle,
190
- out_expected_t,
191
- },
192
- });
193
-
194
- cmd.finish();
195
-
196
- await device.queue.onSubmittedWorkDone();
197
-
198
- const t = new Float32Array(await read_back(device, out_t, t_bytes));
199
- const expected = new Float32Array(await read_back(device, out_expected_t, t_bytes));
200
-
201
- out_t.destroy();
202
- out_triangle.destroy();
203
- out_expected_t.destroy();
204
-
205
- let missed = 0;
206
- let overshot = 0;
207
- let worst_overshoot = 0;
208
-
209
- for (let i = 0; i < leaf_count; i++) {
210
- if (!(t[i] >= 0)) {
211
- missed += 1;
212
-
213
- continue;
214
- }
215
-
216
- // 1e-3 of the aimed distance, which is far above float error on these magnitudes and far
217
- // below the gap between one surface and the next
218
- const overshoot = (t[i] - expected[i]) / Math.max(1e-9, expected[i]);
219
-
220
- if (overshoot > 1e-3) {
221
- overshot += 1;
222
-
223
- worst_overshoot = Math.max(worst_overshoot, overshoot);
224
- }
225
- }
226
-
227
- const lost = missed + overshot;
228
-
229
- const result = {
230
- leaf_count,
231
- missed,
232
- overshot,
233
- worst_overshoot: +worst_overshoot.toFixed(4),
234
- lost,
235
- lost_pct: +(lost / leaf_count * 100).toFixed(3),
236
- origin: origin.map(v => +v.toFixed(3)),
237
- verdict: lost === 0
238
- ? `pass — the traversal returns a surface at or before every one of ${leaf_count} `
239
- + `triangles it was aimed at`
240
- : `FAIL — ${lost} of ${leaf_count} (${(lost / leaf_count * 100).toFixed(2)}%) rays aimed `
241
- + `at a triangle came back with nothing (${missed}) or with something behind it `
242
- + `(${overshot}). Neither is geometrically possible, so the traversal is walking past `
243
- + `surfaces it was pointed at — which is the hole in the traced image.`,
244
- };
245
-
246
- console.log(result.verdict, result);
247
-
248
- return result;
249
- }
1
+ import { ShadeGPUCommandContext } from "../../device/ShadeGPUCommandContext.js";
2
+ import {
3
+ BLAS_VISIBILITY_MESHLET_STRIDE,
4
+ BLAS_VISIBILITY_SETTINGS_STRUCT,
5
+ shader_blas_audit_visibility
6
+ } from "./shader_blas_audit_visibility.js";
7
+
8
+ /**
9
+ * Can the traversal reach every triangle in the tree?
10
+ *
11
+ * The last unexercised link. Everything about the tree itself checks out — leaf boxes contain the
12
+ * triangles the intersector fetches, internal nodes are their children's union, the root matches an
13
+ * independently computed box, the instance's world AABB contains the geometry, and the stack does
14
+ * not overflow. None of that runs `ray_query_blas_nearest`, and that function is what the picture
15
+ * is made of.
16
+ *
17
+ * So: one ray per triangle, from the camera to that triangle's own centroid. The centroid is inside
18
+ * the triangle, so the ray intersects it, so a hit is guaranteed — this triangle, or whatever
19
+ * occludes it. A miss cannot happen geometrically. Every miss is the traversal declining to enter a
20
+ * box the ray is inside.
21
+ *
22
+ * Run it from a view that the picture disagrees at and from one it agrees at; the difference
23
+ * between the two counts is the fault, expressed as triangles rather than pixels.
24
+ */
25
+
26
+ /**
27
+ * @param {GPUDevice} device
28
+ * @param {GPUBuffer} buffer
29
+ * @param {number} size
30
+ * @returns {Promise<ArrayBuffer>}
31
+ */
32
+ async function read_back(device, buffer, size) {
33
+ const staging = device.createBuffer({
34
+ label: 'reachability/readback',
35
+ size,
36
+ usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ,
37
+ });
38
+
39
+ const encoder = device.createCommandEncoder({ label: 'reachability/readback' });
40
+
41
+ encoder.copyBufferToBuffer(buffer, 0, staging, 0, size);
42
+
43
+ device.queue.submit([encoder.finish()]);
44
+
45
+ await staging.mapAsync(GPUMapMode.READ);
46
+
47
+ const copy = staging.getMappedRange().slice(0);
48
+
49
+ staging.unmap();
50
+ staging.destroy();
51
+
52
+ return copy;
53
+ }
54
+
55
+ /**
56
+ * Apply the inverse of a mesh's transform to a world point — the same trip `chunk_ray_query_nearest`
57
+ * makes to put a ray into geometry space.
58
+ *
59
+ * Done on the host with a full inverse rather than by transposing a rotation, because the transform
60
+ * carries the asset's centimetre scale and a shortcut that assumes orthonormality would silently be
61
+ * a hundred times wrong here.
62
+ *
63
+ * @param {ArrayLike<number>} m column-major 4x4
64
+ * @param {number[]} point
65
+ * @returns {number[]}
66
+ */
67
+ function inverse_transform_point(m, point) {
68
+ const a = [
69
+ [m[0], m[4], m[8], m[12]],
70
+ [m[1], m[5], m[9], m[13]],
71
+ [m[2], m[6], m[10], m[14]],
72
+ [m[3], m[7], m[11], m[15]],
73
+ ];
74
+
75
+ const b = [point[0], point[1], point[2], 1];
76
+
77
+ // Gaussian elimination on the 4x4 — small, and clearer than an inlined cofactor expansion
78
+ for (let column = 0; column < 4; column++) {
79
+ let pivot = column;
80
+
81
+ for (let row = column + 1; row < 4; row++) {
82
+ if (Math.abs(a[row][column]) > Math.abs(a[pivot][column])) {
83
+ pivot = row;
84
+ }
85
+ }
86
+
87
+ [a[column], a[pivot]] = [a[pivot], a[column]];
88
+ [b[column], b[pivot]] = [b[pivot], b[column]];
89
+
90
+ const divisor = a[column][column];
91
+
92
+ for (let k = column; k < 4; k++) {
93
+ a[column][k] /= divisor;
94
+ }
95
+
96
+ b[column] /= divisor;
97
+
98
+ for (let row = 0; row < 4; row++) {
99
+ if (row === column) {
100
+ continue;
101
+ }
102
+
103
+ const factor = a[row][column];
104
+
105
+ for (let k = column; k < 4; k++) {
106
+ a[row][k] -= factor * a[column][k];
107
+ }
108
+
109
+ b[row] -= factor * b[column];
110
+ }
111
+ }
112
+
113
+ const w = b[3] === 0 ? 1 : b[3];
114
+
115
+ return [b[0] / w, b[1] / w, b[2] / w];
116
+ }
117
+
118
+ /**
119
+ * @param {object} options
120
+ * @param {Renderer} options.renderer
121
+ * @param {PerspectiveCamera} options.camera whose position the rays start from
122
+ * @param {Transform64} options.world the instance's world transform, which puts the camera into geometry space
123
+ * @param {number} options.geometry_index the row whose tree is walked and whose triangles are aimed at
124
+ * @param {number} options.meshlet_count meshlets of that geometry
125
+ * @returns {Promise<object>}
126
+ */
127
+ export async function verify_traversal_reachability({
128
+ renderer,
129
+ camera,
130
+ world,
131
+ geometry_index,
132
+ meshlet_count,
133
+ }) {
134
+ const graphics = renderer.graphics;
135
+ const device = graphics.device;
136
+
137
+ const geometries = graphics.geometries;
138
+ const blas = geometries.blas;
139
+ const meshlets = geometries.meshlets;
140
+
141
+ // every triangle id the geometry's meshlets could hold; the shader says which of them are triangles
142
+ const id_count = meshlet_count * BLAS_VISIBILITY_MESHLET_STRIDE;
143
+
144
+ const origin = inverse_transform_point(
145
+ world,
146
+ [...camera.transform.translation]
147
+ );
148
+
149
+ const t_bytes = id_count * Float32Array.BYTES_PER_ELEMENT;
150
+
151
+ const out_t = device.createBuffer({
152
+ label: 'reachability/t',
153
+ size: t_bytes,
154
+ usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC,
155
+ });
156
+
157
+ const out_triangle = device.createBuffer({
158
+ label: 'reachability/triangle',
159
+ size: t_bytes,
160
+ usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC,
161
+ });
162
+
163
+ const out_expected_t = device.createBuffer({
164
+ label: 'reachability/expected t',
165
+ size: t_bytes,
166
+ usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC,
167
+ });
168
+
169
+ const cmd = ShadeGPUCommandContext.create(graphics, 'audit/reachability');
170
+
171
+ shader_blas_audit_visibility.dispatchThreads({
172
+ encoder: cmd,
173
+ thread_count_x: id_count,
174
+ bindings: {
175
+ settings: {
176
+ origin,
177
+ meshlet_count,
178
+ geometry_index,
179
+ tmax: 1e12,
180
+ },
181
+ blas_lookup: blas.buffer_metadata,
182
+ blas_data: blas.buffer_data,
183
+ geometries: geometries.buffer_metadata,
184
+ meshlet_metadata: meshlets.buffer_metadata,
185
+ meshlet_data: meshlets.buffer_data,
186
+ out_t,
187
+ out_triangle,
188
+ out_expected_t,
189
+ },
190
+ });
191
+
192
+ cmd.finish();
193
+
194
+ await device.queue.onSubmittedWorkDone();
195
+
196
+ const t = new Float32Array(await read_back(device, out_t, t_bytes));
197
+ const expected = new Float32Array(await read_back(device, out_expected_t, t_bytes));
198
+
199
+ out_t.destroy();
200
+ out_triangle.destroy();
201
+ out_expected_t.destroy();
202
+
203
+ let triangle_count = 0;
204
+ let missed = 0;
205
+ let overshot = 0;
206
+ let worst_overshoot = 0;
207
+
208
+ for (let i = 0; i < id_count; i++) {
209
+ if (expected[i] < 0) {
210
+ // not a triangle
211
+ continue;
212
+ }
213
+
214
+ triangle_count += 1;
215
+
216
+ if (!(t[i] >= 0)) {
217
+ missed += 1;
218
+
219
+ continue;
220
+ }
221
+
222
+ // 1e-3 of the aimed distance, which is far above float error on these magnitudes and far
223
+ // below the gap between one surface and the next
224
+ const overshoot = (t[i] - expected[i]) / Math.max(1e-9, expected[i]);
225
+
226
+ if (overshoot > 1e-3) {
227
+ overshot += 1;
228
+
229
+ worst_overshoot = Math.max(worst_overshoot, overshoot);
230
+ }
231
+ }
232
+
233
+ const lost = missed + overshot;
234
+
235
+ const result = {
236
+ triangle_count,
237
+ missed,
238
+ overshot,
239
+ worst_overshoot: +worst_overshoot.toFixed(4),
240
+ lost,
241
+ lost_pct: +(lost / Math.max(1, triangle_count) * 100).toFixed(3),
242
+ origin: origin.map(v => +v.toFixed(3)),
243
+ verdict: lost === 0
244
+ ? `pass — the traversal returns a surface at or before every one of ${triangle_count} `
245
+ + `triangles it was aimed at`
246
+ : `FAIL — ${lost} of ${triangle_count} (${(lost / Math.max(1, triangle_count) * 100).toFixed(2)}%) rays aimed `
247
+ + `at a triangle came back with nothing (${missed}) or with something behind it `
248
+ + `(${overshot}). Neither is geometrically possible, so the traversal is walking past `
249
+ + `surfaces it was pointed at — which is the hole in the traced image.`,
250
+ };
251
+
252
+ console.log(result.verdict, result);
253
+
254
+ return result;
255
+ }
@@ -62,9 +62,9 @@ async function main() {
62
62
  sun_pose.setRotation(rotation.x, rotation.y, rotation.z, rotation.w); sun_pose.updateMatrix();
63
63
  new Entity().add(sun).add(sun_pose).build(dataset);
64
64
 
65
- // the weather: a steady wind the air relaxes to over two seconds, and a gust on top of it
65
+ // the weather: a steady wind the air relaxes to over two seconds, and turbulence on top of it
66
66
  const weather = new GlobalFluidEffector();
67
- weather.drag = 0.5; weather.gust_period = 4;
67
+ weather.drag = 0.5;
68
68
  const effectors = new FluidEffectorsComponent(); effectors.addEffector(weather);
69
69
  new Entity().add(effectors).build(dataset);
70
70
  // the fluid's domain sits on the stop's body, so the wind 10 m above it is the fluid's, not the far field's alone
@@ -86,7 +86,10 @@ async function main() {
86
86
  function configure() {
87
87
  const heading = number("direction") * Math.PI / 180;
88
88
  weather.wind = [number("wind") * Math.cos(heading), 0, number("wind") * Math.sin(heading)];
89
- weather.gust = number("gust");
89
+ // the gust slider is the turbulence's rms; its strongest eddies go by every 4 s
90
+ const speed = number("wind");
91
+ weather.turbulence_intensity = speed > 0 ? number("gust") / speed : 0;
92
+ weather.turbulence_length = speed > 0 ? speed * 4 / 4.05 : weather.turbulence_length;
90
93
  describe_wind();
91
94
  }
92
95
  const far = new Float64Array(3);
@@ -1660,7 +1660,7 @@ export class GPUAnimationManager {
1660
1660
 
1661
1661
  driving.set(target, clips);
1662
1662
 
1663
- if (!this.#foliage_rigs_driving.has(target)) {
1663
+ if (!this.#foliage_rigs_driving.has(target)) {
1664
1664
  gpu_authority_declare(dataset, target);
1665
1665
  /*
1666
1666
  The first clip to drive a joint takes its offset, and with it the joint's world
@@ -2893,7 +2893,7 @@ export class GPUAnimationManager {
2893
2893
  this.#scene_context.wind.bind(bindings);
2894
2894
  const switches = ShaderSwitchSet.EMPTY.with(
2895
2895
  WIND_FIELD_UNIFORM,
2896
- this.#scene_context.wind.cascade_count === 0
2896
+ this.#scene_context.wind.is_uniform
2897
2897
  );
2898
2898
  shader_foliage_wind_apply.variant(switches).dispatch({
2899
2899
  encoder: ctx.encoder,
@@ -1 +1 @@
1
- {"version":3,"file":"GPUMeshSkinningContext.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/animation/skinning/GPUMeshSkinningContext.js"],"names":[],"mappings":"AAmFA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH;IAgNI;;;;;;;OAOG;IACH,sEAPW;QACV,UAAgB,EAAE,kBAAkB,CAAC;QACrC,iBAAuB,EAAE,mBAAmB,CAAC;QAC7C,aAAmB,EAAE,eAAe,CAAC;QACrC,MAAY,YAAY;KACrB,EAcH;IAED;;;;;;OAMG;IACH,iCAEC;IAED;;;;;;;OAOG;IACH,yCAEC;IAED;;;;;;OAMG;IACH,2BAEC;IAED;;;;;OAKG;IACH,4BAEC;IAED;;;;;;;OAOG;IACH,wCAEC;IAED;;;;;;;;;;;;OAYG;IACH,qBAJW,MAAM,YACN,eAAe,GACb,mBAAmB,CAqB/B;IAED;;;;;OAKG;IACH,iBAHW,MAAM,GACJ,mBAAmB,GAAC,SAAS,CAMzC;IAED;;;;;;;;;;OAUG;IACH,aAHW,MAAM,WACN,MAAM,QAwBhB;IAED;;;;;;;OAOG;IACH,oBAHW,MAAM,GACJ,MAAM,GAAC,SAAS,CAI5B;IAED;;;;;;;;;;OAUG;IACH,eAFW,MAAM,QAYhB;IAED;;;;;;;;;;;;;OAaG;IACH,4BAFW,MAAM,QAehB;IA4FD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA6BG;IACH,sBAFW,MAAM,QAqBhB;IAuBD;;;;;;;;;;;;;;;;;OAiBG;IACH,gBAJW,sBAAsB,GACpB,OAAO,CA+NnB;IAmXD;;;;;;;OAOG;IACH,gBA+BC;;CACJ;qCAzyCY,OAAO,2CAA2C,EAAE,sBAAsB;iCAC1E,OAAO,sCAAsC,EAAE,kBAAkB;8BACjE,OAAO,gCAAgC,EAAE,eAAe;8BACxD,OAAO,mCAAmC,EAAE,eAAe;kCAC3D,OAAO,uCAAuC,EAAE,mBAAmB;kCACnE,OAAO,2BAA2B,EAAE,mBAAmB"}
1
+ {"version":3,"file":"GPUMeshSkinningContext.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/animation/skinning/GPUMeshSkinningContext.js"],"names":[],"mappings":"AAmFA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH;IAgNI;;;;;;;OAOG;IACH,sEAPW;QACV,UAAgB,EAAE,kBAAkB,CAAC;QACrC,iBAAuB,EAAE,mBAAmB,CAAC;QAC7C,aAAmB,EAAE,eAAe,CAAC;QACrC,MAAY,YAAY;KACrB,EAcH;IAED;;;;;;OAMG;IACH,iCAEC;IAED;;;;;;;OAOG;IACH,yCAEC;IAED;;;;;;OAMG;IACH,2BAEC;IAED;;;;;OAKG;IACH,4BAEC;IAED;;;;;;;OAOG;IACH,wCAEC;IAED;;;;;;;;;;;;OAYG;IACH,qBAJW,MAAM,YACN,eAAe,GACb,mBAAmB,CAqB/B;IAED;;;;;OAKG;IACH,iBAHW,MAAM,GACJ,mBAAmB,GAAC,SAAS,CAMzC;IAED;;;;;;;;;;OAUG;IACH,aAHW,MAAM,WACN,MAAM,QAwBhB;IAED;;;;;;;OAOG;IACH,oBAHW,MAAM,GACJ,MAAM,GAAC,SAAS,CAI5B;IAED;;;;;;;;;;OAUG;IACH,eAFW,MAAM,QAYhB;IAED;;;;;;;;;;;;;OAaG;IACH,4BAFW,MAAM,QAehB;IA4FD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA6BG;IACH,sBAFW,MAAM,QAqBhB;IAuBD;;;;;;;;;;;;;;;;;OAiBG;IACH,gBAJW,sBAAsB,GACpB,OAAO,CA8NnB;IAmXD;;;;;;;OAOG;IACH,gBA+BC;;CACJ;qCAxyCY,OAAO,2CAA2C,EAAE,sBAAsB;iCAC1E,OAAO,sCAAsC,EAAE,kBAAkB;8BACjE,OAAO,gCAAgC,EAAE,eAAe;8BACxD,OAAO,mCAAmC,EAAE,eAAe;kCAC3D,OAAO,uCAAuC,EAAE,mBAAmB;kCACnE,OAAO,2BAA2B,EAAE,mBAAmB"}
@@ -108,8 +108,8 @@ const MESHLET_STRIDE_BYTES = MESHLET_METADATA_STRUCT.aligned_size;
108
108
  * manager. Resolution happens at upload time via
109
109
  * `animation_manager.get_skin_matrix_offset(skin_id)`.
110
110
  */
111
- export class GPUMeshSkinningContext {
112
-
111
+ export class GPUMeshSkinningContext {
112
+
113
113
  /** @type {GPUDevice} */
114
114
  #device;
115
115
 
@@ -931,10 +931,9 @@ export class GPUMeshSkinningContext {
931
931
  // longer in: rays miss where the mesh now is and hit where it no longer is.
932
932
  //
933
933
  // Topology is untouched. Refitting a tree whose triangles moved but whose shape did not is
934
- // a fraction of the full build's sort-and-emit — which is why a clone gets a copy of the
935
- // source's nodes rather than a build of its own. And it is one batch for every clone at
936
- // once, not a dispatch per clone: the command count is the same for one skinned mesh as
937
- // for three hundred, and each tree's climb overlaps the next's instead of waiting on it.
934
+ // a fraction of a build — which is why a clone gets a copy of the source's nodes rather
935
+ // than a build of its own. And it is one batch for every clone at once, not a dispatch per
936
+ // clone: the command count is the same for one skinned mesh as for three hundred.
938
937
  this.#record_blas_refits(cmd_ctx);
939
938
 
940
939
  // every bound mesh's clone was deformed this frame, so every bound row's bounds moved
@@ -948,8 +947,8 @@ export class GPUMeshSkinningContext {
948
947
  * are resident, and where, the batch asks the BLAS manager — and only when the manager says the
949
948
  * answer may have moved.
950
949
  *
951
- * Recorded here and nowhere else, on purpose: the batch binds the manager's arena buffers as
952
- * they are at this moment, and those are replaced when an arena grows in the geometry update,
950
+ * Recorded here and nowhere else, on purpose: the batch binds the manager's arena buffer as
951
+ * it is at this moment, and that is replaced when the arena grows in the geometry update,
953
952
  * which runs before this frame's command context exists. See {@link GPUBLASRefitBatch}.
954
953
  *
955
954
  * @param {ShadeGPUCommandContext} cmd_ctx