@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,75 +0,0 @@
1
- import { u32 } from "../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
2
- import { WebGPUArray } from "../../shader/type/WebGPUArray.js";
3
- import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
4
- import { ComputeShader } from "../../shader/ComputeShader.js";
5
- import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
6
- import { BVH_NODE_LAYOUT_DEFINITION } from "../../gpu_primitive/bvh/BVH_NODE_LAYOUT_DEFINITION.js";
7
- import { BVH_REFIT_DEFERRED_DEFINITION } from "../../gpu_primitive/bvh/BVH_REFIT_DEFERRED_DEFINITION.js";
8
- import { BLAS_REFIT_TARGET_STRUCT } from "./BLAS_REFIT_TARGET_STRUCT.js";
9
- import { BLAS_REFIT_BATCH_WORKGROUP_SIZE } from "./shader_blas_refit_batch.js";
10
-
11
- const resources = new ShaderResourceSetDescriptor();
12
-
13
- // see shader_blas_refit_batch: workgroups covered by earlier pages of the same batch
14
- resources.setImmediate("dispatch_offset", u32);
15
-
16
- resources.createGroup()
17
- .addStorageBuffer("targets", WebGPUArray.from(BLAS_REFIT_TARGET_STRUCT), false)
18
- // `(target_index, slot_base)` per workgroup, flat: runs of node slots rather than of leaves
19
- .addStorageBuffer("lookup", WebGPUArray.from(u32), false)
20
- .addStorageBuffer("nodes", WebGPUArray.from(u32), true);
21
-
22
- const body = CodeChunk.from(
23
- //language=WGSL
24
- `
25
- @compute @workgroup_size(${BLAS_REFIT_BATCH_WORKGROUP_SIZE}, 1, 1)
26
- fn main(
27
- @builtin(workgroup_id) wg: vec3<u32>,
28
- @builtin(local_invocation_id) lid: vec3<u32>,
29
- ) {
30
- let pair = (wg.x + dispatch_offset) * 2u;
31
-
32
- // ("target" is a reserved word in WGSL)
33
- let tree = targets[lookup[pair]];
34
-
35
- let slot = lookup[pair + 1u] + lid.x;
36
-
37
- if (slot >= tree.node_count) {
38
- // the tail of a tree's last run; the next workgroup is another tree's
39
- return;
40
- }
41
-
42
- let bounds_word = tree.node_word_offset + slot * BVH_NODE_STRIDE + BVH_NODE_BOUNDS;
43
-
44
- for (var w = 0u; w < 6u; w += 1u) {
45
- nodes[bounds_word + w] = BVH_UNFITTED;
46
- }
47
- }
48
- `, [
49
- BVH_NODE_LAYOUT_DEFINITION,
50
- BVH_REFIT_DEFERRED_DEFINITION,
51
- ]);
52
-
53
- /**
54
- * Seed every bound word of every tree in a batch with {@link BVH_UNFITTED}, a dispatch ahead of
55
- * {@link shader_blas_refit_batch}.
56
- *
57
- * The batch refit hands boxes between invocations through relaxed atomics — leaf boxes included,
58
- * since it writes them in the same dispatch — and a store need not reach the reader before the
59
- * dispatch ends. What this leaves behind is what such a read returns, so the climb can see a box
60
- * that has not arrived instead of taking last frame's for it. For a skinned mesh last frame's box
61
- * is close to this frame's, so taking it would go unnoticed.
62
- *
63
- * One lane per node slot, holes included: the arena's trees keep the slots their builder allocated,
64
- * and seeding a hole costs six stores where telling it apart would cost a walk. The bounds words are
65
- * all it touches; children and payloads are the tree's topology and stay as they are.
66
- *
67
- * Recorded by {@link GPUBLASRefitBatch}, paginated as the refit is.
68
- *
69
- * @type {ComputeShader}
70
- */
71
- export const shader_blas_refit_batch_seed = ComputeShader.from({
72
- label: "BLAS/RefitBatchSeed",
73
- resources,
74
- body,
75
- });
@@ -1,17 +0,0 @@
1
- /**
2
- *
3
- * @param {Object} options
4
- * @param {BVH} options.bvh
5
- * @param {MeshletBatch} options.meshlets
6
- * @param {Float32Array} options.bounding_box
7
- * @param {number} options.primitive_count
8
- * @param {number} [options.optimization]
9
- */
10
- export function meshlet_batch_to_bvh({ bvh, meshlets, bounding_box, primitive_count, optimization }: {
11
- bvh: BVH;
12
- meshlets: MeshletBatch;
13
- bounding_box: Float32Array;
14
- primitive_count: number;
15
- optimization?: number;
16
- }): void;
17
- //# sourceMappingURL=meshlet_batch_to_bvh.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"meshlet_batch_to_bvh.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/geometry/meshlet_batch_to_bvh.js"],"names":[],"mappings":"AAUA;;;;;;;;GAQG;AACH;IANwB,GAAG;IACM,QAAQ;IACR,YAAY,EAAlC,YAAY;IACI,eAAe,EAA/B,MAAM;IACW,YAAY,GAA7B,MAAM;SAqOhB"}
@@ -1,247 +0,0 @@
1
- import { assert } from "../../../core/assert.js";
2
- import { NULL_NODE } from "../../../core/bvh2/bvh3/BVH.js";
3
- import { ebvh_optimize_treelet } from "../../../core/bvh2/bvh3/ebvh_optimize_treelet.js";
4
- import { v3_morton_encode_bounded } from "../../../core/geom/3d/morton/v3_morton_encode_bounded.js";
5
- import {
6
- aabb3_compute_from_triangle
7
- } from "../../../core/geom/3d/triangle/aabb3_compute_from_triangle.js";
8
- import { max2 } from "../../../core/math/max2.js";
9
- import { GEOMETRY_MESHLET_TRIANGLE_LIMIT } from "./meshlet/GEOMETRY_MESHLET_TRIANGLE_LIMIT.js";
10
-
11
- /**
12
- *
13
- * @param {Object} options
14
- * @param {BVH} options.bvh
15
- * @param {MeshletBatch} options.meshlets
16
- * @param {Float32Array} options.bounding_box
17
- * @param {number} options.primitive_count
18
- * @param {number} [options.optimization]
19
- */
20
- export function meshlet_batch_to_bvh({
21
- bvh,
22
- meshlets,
23
- bounding_box,
24
- primitive_count,
25
- optimization = 1
26
- }) {
27
-
28
- assert.defined(bvh, 'bvh');
29
- assert.defined(meshlets, 'meshlets');
30
- assert.defined(bounding_box, 'bounding_box');
31
- assert.isNonNegativeInteger(primitive_count, 'primitive_count');
32
-
33
- const meshlet_count = meshlets.count;
34
-
35
- bvh.release_all();
36
-
37
- if (meshlet_count === 0) {
38
- bvh.root = NULL_NODE;
39
- bvh.trim();
40
- return;
41
- }
42
-
43
- // order meshlet indices by morton codes and count actual triangles in the batch
44
- const meshlet_morton_codes = new Uint32Array(meshlet_count);
45
- let node_leaf_count = 0;
46
-
47
- for (let i = 0; i < meshlet_count; i++) {
48
-
49
- const header = meshlets.read_header(i);
50
-
51
- node_leaf_count += header.primitive_count;
52
-
53
- const bb = header.bounds_box;
54
-
55
- const center_x = (bb[0] + bb[3]) * 0.5;
56
- const center_y = (bb[1] + bb[4]) * 0.5;
57
- const center_z = (bb[2] + bb[5]) * 0.5;
58
-
59
- meshlet_morton_codes[i] = v3_morton_encode_bounded(
60
- center_x, center_y, center_z,
61
- bounding_box,
62
- );
63
- }
64
-
65
- if (node_leaf_count === 0) {
66
- bvh.root = NULL_NODE;
67
- bvh.trim();
68
- return;
69
- }
70
-
71
- const node_bin_count = max2(0, node_leaf_count - 1);
72
-
73
- const node_total_count = node_leaf_count + node_bin_count;
74
-
75
- bvh.allocate_linear(node_total_count);
76
-
77
- const partial_tree_nodes = new Uint32Array(meshlet_count);
78
-
79
- // how many nodes do we need for meshlet subtree assembly?
80
- const meshlet_node_leaf_count = meshlet_count;
81
- const meshlet_node_bin_count = max2(0, meshlet_node_leaf_count - 1);
82
-
83
- {
84
- // we want to use the beginning of the memory space for the meshlet tree
85
- // the root of the tree must be node 0 (convention)
86
-
87
- // note that we include bottom tree roots here
88
- const bottom_tree_node_count = node_total_count - meshlet_node_bin_count;
89
- const bottom_tree_node_pool = new Uint32Array(bottom_tree_node_count);
90
- let bottom_tree_node_cursor = 0;
91
- const bottom_tree_node_scratch = new Uint32Array(GEOMETRY_MESHLET_TRIANGLE_LIMIT);
92
-
93
- // fill nodes
94
- for (let i = 0; i < bottom_tree_node_count; i++) {
95
- const node = (node_total_count - 1) - i;
96
- bottom_tree_node_pool[i] = node;
97
- }
98
-
99
- const sorted_indices = new Uint32Array(meshlet_count);
100
- for (let i = 0; i < meshlet_count; i++) {
101
- sorted_indices[i] = i;
102
- }
103
-
104
- sorted_indices.sort((a, b) => meshlet_morton_codes[a] - meshlet_morton_codes[b]);
105
-
106
- const triangle_aabb = new Float32Array(6);
107
-
108
- for (let i = 0; i < meshlet_count; i++) {
109
- const meshlet_index = sorted_indices[i];
110
-
111
- const meshlet = meshlets.read_meshlet(meshlet_index);
112
-
113
- const meshlet_header = meshlet.header;
114
-
115
- // NOTE: indices and vertices are per-meshlet, there are no global attributes
116
- const meshlet_indices = meshlet.attribute_index;
117
- const meshlet_positions = meshlet.attribute_position;
118
-
119
- const meshlet_triangle_count = meshlet_header.primitive_count;
120
-
121
- assert.greaterThan(meshlet_triangle_count, 0, 'meshlet_triangle_count');
122
-
123
- for (let triangle_index = 0; triangle_index < meshlet_triangle_count; triangle_index++) {
124
-
125
- const index3 = triangle_index * 3;
126
-
127
- const i0 = meshlet_indices[index3 + 0];
128
- const i1 = meshlet_indices[index3 + 1];
129
- const i2 = meshlet_indices[index3 + 2];
130
-
131
- aabb3_compute_from_triangle(
132
- triangle_aabb, 0,
133
- meshlet_positions,
134
- i0, i1, i2
135
- );
136
-
137
- // NOTE: we already limit the number of triangles per meshlet to 256, so this is safe.
138
- const encoded_triangle_id = ((meshlet_index & 0x00FFFFFF) << 8)
139
- | (triangle_index & 0xFF);
140
-
141
- const node = bottom_tree_node_pool[bottom_tree_node_cursor++];
142
-
143
- bvh.node_set_aabb(node, triangle_aabb);
144
- bvh.node_set_user_data(node, encoded_triangle_id)
145
- bvh.node_set_child1(node, NULL_NODE); // mark as leaf node
146
-
147
- bottom_tree_node_scratch[triangle_index] = node;
148
- }
149
-
150
- // assemble meshlet tree
151
- let unprocessed_node_count = meshlet_triangle_count;
152
-
153
- while (unprocessed_node_count > 1) {
154
-
155
- let added_nodes = 0;
156
- let cursor = 0;
157
-
158
- while (cursor + 1 < unprocessed_node_count) {
159
- const child_2 = bottom_tree_node_scratch[cursor++];
160
- const child_1 = bottom_tree_node_scratch[cursor++];
161
-
162
- const parent = bottom_tree_node_pool[bottom_tree_node_cursor++];
163
-
164
- bvh.node_assign_children(parent, child_1, child_2);
165
-
166
- bottom_tree_node_scratch[added_nodes++] = parent;
167
- }
168
-
169
- while (cursor < unprocessed_node_count) {
170
- // dangling nodes, push them onto the next level
171
- bottom_tree_node_scratch[added_nodes++] = bottom_tree_node_scratch[cursor++];
172
- }
173
-
174
- unprocessed_node_count = added_nodes;
175
-
176
- }
177
-
178
- // the first node is now the root
179
- partial_tree_nodes[i] = bottom_tree_node_scratch[0];
180
- }
181
-
182
- assert.equal(bottom_tree_node_cursor, bottom_tree_node_count, 'bottom_tree_node_cursor !== bottom_tree_node_count');
183
- }
184
-
185
- // ===========
186
- // Second phase - assemble meshlet trees into the final structure
187
- // ===========
188
- {
189
- // assemble meshlet tree
190
- let unprocessed_node_count = meshlet_count;
191
- let top_tree_node_cursor = 0;
192
- const top_tree_node_count = meshlet_node_bin_count;
193
- const top_tree_node_pool = new Uint32Array(top_tree_node_count);
194
-
195
- // fill nodes
196
- for (let i = 0; i < top_tree_node_count; i++) {
197
- const node = (top_tree_node_count - 1) - i;
198
- top_tree_node_pool[i] = node;
199
- }
200
-
201
- while (unprocessed_node_count > 1) {
202
-
203
- let added_nodes = 0;
204
- let cursor = 0;
205
-
206
- while (cursor + 1 < unprocessed_node_count) {
207
- const child_2 = partial_tree_nodes[cursor++];
208
- const child_1 = partial_tree_nodes[cursor++];
209
-
210
- const parent = top_tree_node_pool[top_tree_node_cursor++];
211
-
212
- bvh.node_assign_children(parent, child_1, child_2);
213
-
214
- partial_tree_nodes[added_nodes++] = parent;
215
- }
216
-
217
- while (cursor < unprocessed_node_count) {
218
- // dangling nodes, push them onto the next level
219
- partial_tree_nodes[added_nodes++] = partial_tree_nodes[cursor++];
220
- }
221
-
222
- unprocessed_node_count = added_nodes;
223
-
224
- }
225
-
226
- assert.equal(top_tree_node_cursor, top_tree_node_count, 'top_tree_node_cursor !== top_tree_node_count');
227
-
228
- const root = partial_tree_nodes[0];
229
-
230
- assert.equal(root, 0, 'root must be node 0');
231
-
232
- bvh.node_set_parent(root, NULL_NODE);
233
- bvh.root = root;
234
- }
235
-
236
-
237
- // The BVH we built so far is good, but not optimal
238
- // Optimize BVH for better traversal performance
239
-
240
- for (let i = 0; i < optimization; i++) {
241
- ebvh_optimize_treelet(bvh);
242
- }
243
-
244
- assert.equal(bvh.root, 0, 'root must be node 0');
245
-
246
- bvh.trim();
247
- }
@@ -1,7 +0,0 @@
1
- /**
2
- * @see https://github.com/jan-van-bergen/GPU-Raytracer/blob/6559ae2241c8fdea0ddaec959fe1a47ec9b3ab0d/Src/CUDA/Raytracing/BVH8.h#L277
3
- * @type {CodeChunk}
4
- */
5
- export const chunk_bvh8_ray_query_blas_occlusion: CodeChunk;
6
- import { CodeChunk } from "../../../../compiler/CodeChunk.js";
7
- //# sourceMappingURL=chunk_bvh8_ray_query_blas_occlusion.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"chunk_bvh8_ray_query_blas_occlusion.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_ray_query_blas_occlusion.js"],"names":[],"mappings":"AAoGA;;;GAGG;AACH,kDAFU,SAAS,CA2HjB;0BAjOwB,mCAAmC"}
@@ -1,226 +0,0 @@
1
- import { CodeChunk } from "../../../../compiler/CodeChunk.js";
2
- import { chunk_extract_byte } from "../../../binary/chunk_extract_byte.js";
3
- import { chunk_first_bit_high } from "../../../binary/chunk_first_bit_high.js";
4
- import {
5
- chunk_geometry_read_triangle_vertices
6
- } from "../../../geometry/format/chunk_geometry_read_triangle_vertices.js";
7
- import { chunk_ray_intersects_sphere } from "../../../geometry/ray/chunk_ray_intersects_sphere.js";
8
- import { chunk_ray_triangle_intersect } from "../../../geometry/ray/chunk_ray_triangle_intersect.js";
9
- import { RAY_STRUCT } from "../../../geometry/ray/RAY_STRUCT.js";
10
- import { BVH8_INODE_STRUCT } from "./BVH8_INODE_STRUCT.js";
11
- import { chunk_bvh8_node_intersect } from "./chunk_bvh8_node_intersect.js";
12
- import { chunk_ray_get_octant_inv4 } from "./chunk_ray_get_octant_inv4.js";
13
-
14
- const BVH_STACK_SIZE = 32;
15
- /**
16
- * Portion of the Stack that resides in Shared Memory
17
- * Original paper "Efficient Incoherent Ray Traversal on GPUs Through Compressed Wide BVHs" recommends 12 to be the sweet spot, with 8 being close second
18
- * The effect of shared stack becomes more pronounced for larger bounce counts
19
- * @type {number}
20
- */
21
- const SHARED_STACK_SIZE = 8;
22
-
23
- const LOCAL_STACK_SIZE = (BVH_STACK_SIZE - SHARED_STACK_SIZE);
24
-
25
- /**
26
- * On shared memory:
27
- * - it seems to be allocated separately, so it's a "use it or lose it" case. Although recent NVIDIA articles suggest otherwise
28
- * - According to original paper, using shared stack improved memory access patterns, see "Efficient Incoherent Ray Traversal on GPUs Through Compressed Wide BVHs" Appendix A.3 table 9
29
- * @type {CodeChunk}
30
- */
31
- const chunk_bvh8_query_context = CodeChunk.from(
32
- //language=WGSL
33
- `
34
- var<private> thread_idx : i32;
35
- `
36
- );
37
-
38
- const chunk_bvh8_initialize_context = CodeChunk.from(
39
- //language=WGSL
40
- `
41
- fn bvh8_initialize_context(invocation: vec3<u32>){
42
- thread_idx = invocation.x;
43
- }
44
- `, [
45
- chunk_bvh8_query_context
46
- ]
47
- );
48
-
49
- /**
50
- * TODO consider transposing the layout, might result in better performance
51
- * @see https://github.com/fynv/webpbf/blob/430c5832bd2199b8fe7e3c1a2d430392b1b991f5/client/raycast_depth.js#L177
52
- * @type {CodeChunk}
53
- */
54
- const chunk_bvh8_compute_shared_stack_index = CodeChunk.from(
55
- //language=WGSL
56
- `
57
- fn bvh8_compute_shared_stack_index(offset: i32) -> i32 {
58
- return thread_idx * ${SHARED_STACK_SIZE} + offset;
59
- }
60
- `
61
- );
62
-
63
- /**
64
- * @see https://github.com/jan-van-bergen/GPU-Raytracer/blob/6559ae2241c8fdea0ddaec959fe1a47ec9b3ab0d/Src/CUDA/Raytracing/BVH.h#L25
65
- * @type {CodeChunk}
66
- */
67
- const chunk_bvh8_stack_push = CodeChunk.from(
68
- //language=WGSL
69
- `
70
- fn bvh8_stack_push(local_stack:ptr<function,array<vec2u,${LOCAL_STACK_SIZE}>>, stack_size: ptr<function,i32>, item: vec2u) {
71
-
72
- local_stack[*stack_size] = item;
73
-
74
- *stack_size++;
75
- }
76
- `, [
77
- chunk_bvh8_query_context,
78
- chunk_bvh8_compute_shared_stack_index,
79
- ]
80
- );
81
- /**
82
- * https://github.com/jan-van-bergen/GPU-Raytracer/blob/6559ae2241c8fdea0ddaec959fe1a47ec9b3ab0d/Src/CUDA/Raytracing/BVH.h#L38
83
- * @type {CodeChunk}
84
- */
85
- const chunk_bvh8_stack_pop = CodeChunk.from(
86
- //language=WGSL
87
- `
88
- fn bvh8_stack_pop(local_stack:ptr<function,array<vec2u,${LOCAL_STACK_SIZE}>>, stack_size: ptr<function,i32> ) -> vec2u{
89
-
90
- *stack_size--;
91
-
92
- return local_stack[*stack_size];
93
-
94
- }
95
- `, [
96
- chunk_bvh8_query_context,
97
- chunk_bvh8_compute_shared_stack_index,
98
- ]
99
- );
100
-
101
- /**
102
- * @see https://github.com/jan-van-bergen/GPU-Raytracer/blob/6559ae2241c8fdea0ddaec959fe1a47ec9b3ab0d/Src/CUDA/Raytracing/BVH8.h#L277
103
- * @type {CodeChunk}
104
- */
105
- export const chunk_bvh8_ray_query_blas_occlusion = CodeChunk.from(
106
- //language=WGSL
107
- `
108
- fn bvh8_ray_query_blas_occlusion(
109
- ray: ${RAY_STRUCT.wgsl_ref},
110
- geometry_index: u32,
111
- ) -> bool {
112
-
113
- let geometry = geometries[geometry_index];
114
-
115
- let bounding_sphere = geometry.bounding_sphere;
116
-
117
- if(!ray_intersects_sphere(ray, bounding_sphere.xyz, bounding_sphere.w)){
118
- // typically this lets us get misses much quicker
119
- return false;
120
- }
121
-
122
- let blas_address = blas_lookup[geometry_index];
123
-
124
- var stack: array<vec2u, ${LOCAL_STACK_SIZE}>;
125
- var stack_size = 0;
126
-
127
- let oct_inv4 = ray_get_octant_inv4(ray.direction);
128
-
129
- // initialize 'current group' with the BLAS root
130
- // Root is always traversed, first hits bit set to 1 all the rest 0s
131
- // Current group |child node base index | hits | pad | imask |
132
- // | 32 bits | 8 bits | 16 bits | 8 bits |
133
- var current_group = vec2(0u, 0x80000000u);
134
-
135
- loop {
136
- // Triangle group |triangle base index | pad | triangle hits |
137
- // | 32 bits | 8 bits | 24 bits |
138
- var triangle_group : vec2u;
139
-
140
- let hits_imask = current_group.y;
141
-
142
- // Get first node hit
143
- let child_index_offset = first_bit_high(hits_imask);
144
- let child_index_base = current_group.x;
145
-
146
- // Remove node from current_group
147
- current_group.y &= ~(1u << child_index_offset);
148
-
149
- // If the node group is not yet empty, push it on the stack
150
- if ( (current_group.y & 0xff000000u) != 0 ) {
151
- stack[stack_size] = current_group;
152
- stack_size++;
153
- }
154
-
155
- // reversing the traversal priority computation
156
- let slot_index = (child_index_offset - 24u) ^ (oct_inv4 & 0xffu);
157
-
158
- // Relative index of the node is obtained by computing the number of neighboring nodes
159
- // stored in the lower child slots:
160
- let relative_index = countOneBits(hits_imask & ~(0xffffffffu << slot_index));
161
- let child_node_index = blas_address + child_index_base + relative_index;
162
-
163
- let node: ${BVH8_INODE_STRUCT.wgsl_ref} = blas_data[child_node_index];
164
-
165
- let hitmask = bvh8_node_intersect(ray, oct_inv4, node);
166
-
167
- let imask = extract_byte( bitcast<u32>(node.data[0].w), 3);
168
-
169
- current_group.x = bitcast<u32>(node.data[1].x); // Child base offset
170
- triangle_group.x = bitcast<u32>(node.data[1].y); // Triangle base offset
171
-
172
- current_group.y = (hitmask & 0xff000000u) | imask;
173
- triangle_group.y = (hitmask & 0x00ffffffu);
174
-
175
-
176
- // While the triangle group is not empty
177
- // Intersect all triangles in the current node
178
- while (triangle_group.y != 0u) {
179
-
180
- // Get next triangle index and remove it from the list
181
- let triangle_index = first_bit_high(triangle_group.y);
182
- triangle_group.y &= ~(1u << triangle_index);
183
-
184
- let tri_idx = triangle_group.x + triangle_index;
185
-
186
- let triangle = geometry_read_triangle_vertices(geometry, tri_idx);
187
-
188
- let intersection = ray_triangle_intersect(ray,triangle);
189
-
190
- if (intersection) {
191
- return true;
192
- }
193
-
194
- }
195
-
196
- if ((current_group.y & 0xff000000u) == 0) {
197
- if (stack_size == 0) {
198
- // we didn't hit anything, stack is empty, bail
199
- break;
200
- }
201
-
202
- // get next element on the stack
203
- stack_size--;
204
- current_group = stack[stack_size];
205
-
206
- }
207
- }
208
-
209
- // no hit
210
- return false;
211
- }
212
- `, [
213
- BVH8_INODE_STRUCT.declaration_chunk,
214
- RAY_STRUCT.declaration_chunk,
215
- chunk_bvh8_stack_push,
216
- chunk_bvh8_stack_pop,
217
- chunk_bvh8_compute_shared_stack_index,
218
- chunk_extract_byte,
219
- chunk_ray_get_octant_inv4,
220
- chunk_bvh8_node_intersect,
221
- chunk_ray_triangle_intersect,
222
- chunk_ray_intersects_sphere,
223
- chunk_geometry_read_triangle_vertices,
224
- chunk_first_bit_high,
225
- ]
226
- );
@@ -1,8 +0,0 @@
1
- /**
2
- * Perform visibility checks for probes using Raytracing
3
- * see {@link chunk_lpv_sample_irradiance}
4
- * @type {CodeChunk}
5
- */
6
- export const chunk_lpv_mask_visibility_via_rays: CodeChunk;
7
- import { CodeChunk } from "../../../compiler/CodeChunk.js";
8
- //# sourceMappingURL=chunk_lpv_mask_visibility_via_rays.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"chunk_lpv_mask_visibility_via_rays.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/shader/chunk/light/lpv/chunk_lpv_mask_visibility_via_rays.js"],"names":[],"mappings":"AAMA;;;;GAIG;AACH,iDAFU,SAAS,CAmCb;0BA5CoB,gCAAgC"}
@@ -1,45 +0,0 @@
1
- import { CodeChunk } from "../../../compiler/CodeChunk.js";
2
- import { chunk_offset_ray } from "../../geometry/ray/chunk_offset_ray.js";
3
- import { chunk_ray_query_occluded } from "../../geometry/ray/chunk_ray_query_occluded.js";
4
- import { RAY_STRUCT } from "../../geometry/ray/RAY_STRUCT.js";
5
- import { chunk_f32_array_as_vec3 } from "../../geometry/vec3/chunk_f32_array_as_vec3.js";
6
-
7
- /**
8
- * Perform visibility checks for probes using Raytracing
9
- * see {@link chunk_lpv_sample_irradiance}
10
- * @type {CodeChunk}
11
- */
12
- export const chunk_lpv_mask_visibility_via_rays = CodeChunk.from(
13
- //language=WGSL
14
- `
15
- fn lpv_mask_visibility_via_rays(vertices:array<u32, 4>, position_ws: vec3<f32>, shading_normal: vec3<f32>) -> vec4<f32> {
16
- var weights: vec4<f32> = vec4(1.0);
17
-
18
- // do shadow rays towards tet corners
19
- for(var i=0u; i < 4; i++){
20
- let i_probe_index = vertices[i];
21
-
22
- let i_probe = lpv_probes[i_probe_index];
23
- let i_probe_position = f32_array_as_vec3(i_probe.position);
24
-
25
- let to_probe = (i_probe_position - position_ws);
26
-
27
- var shadow_ray:${RAY_STRUCT.wgsl_ref};
28
-
29
- shadow_ray.direction = normalize(to_probe);
30
- shadow_ray.origin = offset_ray(position_ws, shading_normal) + shadow_ray.direction * 1e-6;
31
- shadow_ray.tmax = length(to_probe);
32
-
33
- if(ray_query_occluded(shadow_ray)){
34
- weights[i] = 0;
35
- }
36
- }
37
-
38
- return weights;
39
- }
40
- `, [
41
- RAY_STRUCT.declaration_chunk,
42
- chunk_f32_array_as_vec3,
43
- chunk_offset_ray,
44
- chunk_ray_query_occluded,
45
- ])
@@ -1,3 +0,0 @@
1
- export const chunk_ray_sample_light: CodeChunk;
2
- import { CodeChunk } from "../../../compiler/CodeChunk.js";
3
- //# sourceMappingURL=chunk_ray_sample_light.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"chunk_ray_sample_light.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/shader/chunk/light/sample/chunk_ray_sample_light.js"],"names":[],"mappings":"AAgBA,+CAwFO;0BAxGmB,gCAAgC"}