@woosh/meep-engine 3.41.0 → 3.43.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 (384) hide show
  1. package/build/bundle-worker-image-decoder.js +1 -1
  2. package/build/bundle-worker-terrain.js +1 -1
  3. package/editor/selection/editor_pick.d.ts.map +1 -1
  4. package/editor/selection/editor_pick.js +2 -1
  5. package/editor/tools/TransformToolV2.d.ts.map +1 -1
  6. package/editor/tools/TransformToolV2.js +7 -1
  7. package/editor/tools/engine/ToolEngine.d.ts.map +1 -1
  8. package/editor/tools/engine/ToolEngine.js +10 -0
  9. package/editor/tools/v2/TransformControls.d.ts.map +1 -1
  10. package/editor/tools/v2/TransformControls.js +7 -20
  11. package/editor/tools/v2/handle/gizmo_drag_plane.d.ts.map +1 -1
  12. package/editor/tools/v2/handle/gizmo_drag_plane.js +4 -0
  13. package/editor/view/ecs/EntityEditor.d.ts.map +1 -1
  14. package/editor/view/ecs/EntityEditor.js +3 -1
  15. package/editor/view/node-graph/NodeGraphView.d.ts.map +1 -1
  16. package/editor/view/node-graph/NodeGraphView.js +28 -12
  17. package/package.json +91 -96
  18. package/samples/engine/first-scene/index.html +4 -1
  19. package/samples/engine/first-scene/main.js +14 -9
  20. package/src/core/binary/utf8/utf8_decode.js +3 -3
  21. package/src/core/bvh2/binary/2/bvh32_query_user_data_ray.d.ts.map +1 -1
  22. package/src/core/bvh2/binary/2/bvh32_query_user_data_ray.js +112 -113
  23. package/src/core/bvh2/bvh3/ebvh_nodes_sort_sah_local4.js +2 -2
  24. package/src/core/cache/wtinylfu/benchmark/CacheWTinylfu.bench.md +14 -14
  25. package/src/core/collection/RingBuffer.d.ts.map +1 -1
  26. package/src/core/collection/RingBuffer.js +4 -0
  27. package/src/core/collection/array/array_contains_duplicates.d.ts.map +1 -1
  28. package/src/core/collection/array/array_contains_duplicates.js +2 -1
  29. package/src/core/collection/array/array_copy.d.ts.map +1 -1
  30. package/src/core/collection/array/array_copy.js +23 -0
  31. package/src/core/collection/array/typed/sparse_typed_array_hash.d.ts +2 -2
  32. package/src/core/collection/array/typed/sparse_typed_array_hash.d.ts.map +1 -1
  33. package/src/core/collection/array/typed/sparse_typed_array_hash.js +9 -8
  34. package/src/core/collection/array/typed/uint16_array_hash.d.ts +2 -2
  35. package/src/core/collection/array/typed/uint16_array_hash.js +4 -4
  36. package/src/core/collection/array/typed/uint8_array_hash.d.ts +2 -2
  37. package/src/core/collection/array/typed/uint8_array_hash.js +4 -4
  38. package/src/core/collection/array/weightedRandomFromArray.d.ts +1 -0
  39. package/src/core/collection/array/weightedRandomFromArray.d.ts.map +1 -1
  40. package/src/core/collection/array/weightedRandomFromArray.js +9 -1
  41. package/src/core/collection/heap/BinaryHeap.d.ts.map +1 -1
  42. package/src/core/collection/heap/BinaryHeap.js +4 -0
  43. package/src/core/collection/list/List.d.ts.map +1 -1
  44. package/src/core/collection/list/List.js +4 -2
  45. package/src/core/collection/set/ArraySet.js +1 -1
  46. package/src/core/collection/set/HashSet.d.ts +1 -1
  47. package/src/core/collection/set/HashSet.d.ts.map +1 -1
  48. package/src/core/collection/set/HashSet.js +4 -2
  49. package/src/core/debug/matchers/IsEqual.js +1 -1
  50. package/src/core/debug/matchers/IsIterableContaining.d.ts.map +1 -1
  51. package/src/core/debug/matchers/IsIterableContaining.js +61 -74
  52. package/src/core/events/signal/SignalBinding.js +101 -101
  53. package/src/core/function/extractFunctionBody.js +13 -13
  54. package/src/core/function/objectsEqual.d.ts.map +1 -1
  55. package/src/core/function/objectsEqual.js +15 -14
  56. package/src/core/geom/3d/frustum/frustum3_compute_closest_point.d.ts.map +1 -1
  57. package/src/core/geom/3d/frustum/frustum3_compute_closest_point.js +207 -172
  58. package/src/core/geom/3d/gjk/gjk_epa_penetration.d.ts.map +1 -1
  59. package/src/core/geom/3d/gjk/gjk_epa_penetration.js +5 -4
  60. package/src/core/geom/3d/line/line3_compute_segment_point_distance_eikonal.d.ts.map +1 -1
  61. package/src/core/geom/3d/line/line3_compute_segment_point_distance_eikonal.js +8 -2
  62. package/src/core/geom/3d/triangle/tri3_ray_intersection.d.ts +20 -0
  63. package/src/core/geom/3d/triangle/tri3_ray_intersection.d.ts.map +1 -1
  64. package/src/core/geom/3d/triangle/tri3_ray_intersection.js +182 -0
  65. package/src/core/math/noise/curl_noise_3dt.d.ts.map +1 -1
  66. package/src/core/math/noise/curl_noise_3dt.js +20 -10
  67. package/src/core/math/noise/sdnoise.d.ts +16 -5
  68. package/src/core/math/noise/sdnoise.d.ts.map +1 -1
  69. package/src/core/math/noise/sdnoise.js +43 -9
  70. package/src/core/math/spline/spline3_hermite_nearest_point.d.ts +16 -1
  71. package/src/core/math/spline/spline3_hermite_nearest_point.d.ts.map +1 -1
  72. package/src/core/math/spline/spline3_hermite_nearest_point.js +44 -3
  73. package/src/engine/Engine.d.ts.map +1 -1
  74. package/src/engine/Engine.js +6 -2
  75. package/src/engine/control/first-person/FirstPersonPlayerController.d.ts +9 -0
  76. package/src/engine/control/first-person/FirstPersonPlayerController.d.ts.map +1 -1
  77. package/src/engine/control/first-person/FirstPersonPlayerControllerConfig.d.ts +26 -0
  78. package/src/engine/control/first-person/FirstPersonPlayerControllerConfig.d.ts.map +1 -1
  79. package/src/engine/control/first-person/FirstPersonPlayerControllerConfig.js +2 -0
  80. package/src/engine/control/first-person/abilities/AbilitySet.d.ts.map +1 -1
  81. package/src/engine/control/first-person/abilities/AbilitySet.js +9 -0
  82. package/src/engine/control/first-person/abilities/LedgeGrab.d.ts.map +1 -1
  83. package/src/engine/control/first-person/abilities/LedgeGrab.js +6 -0
  84. package/src/engine/control/first-person/abilities/Slide.d.ts.map +1 -1
  85. package/src/engine/control/first-person/abilities/Slide.js +1 -0
  86. package/src/engine/control/first-person/abilities/WallRun.d.ts +4 -1
  87. package/src/engine/control/first-person/abilities/WallRun.d.ts.map +1 -1
  88. package/src/engine/control/first-person/abilities/WallRun.js +13 -1
  89. package/src/engine/control/first-person/mastery/SlideInitiationTimingEvaluator.d.ts +1 -1
  90. package/src/engine/control/first-person/mastery/SlideInitiationTimingEvaluator.d.ts.map +1 -1
  91. package/src/engine/control/first-person/mastery/SlideInitiationTimingEvaluator.js +6 -5
  92. package/src/engine/control/first-person/mastery/StrideTimingJumpEvaluator.d.ts +3 -3
  93. package/src/engine/control/first-person/mastery/StrideTimingJumpEvaluator.d.ts.map +1 -1
  94. package/src/engine/control/first-person/mastery/StrideTimingJumpEvaluator.js +9 -8
  95. package/src/engine/control/first-person/sensors/FirstPersonSensorsSystem.d.ts.map +1 -1
  96. package/src/engine/control/first-person/sensors/FirstPersonSensorsSystem.js +13 -4
  97. package/src/engine/ecs/EntityManager.d.ts.map +1 -1
  98. package/src/engine/ecs/EntityManager.js +18 -15
  99. package/src/engine/ecs/dynamic_actions/rules/DynamicRuleDescription.d.ts.map +1 -1
  100. package/src/engine/ecs/dynamic_actions/rules/DynamicRuleDescription.js +2 -1
  101. package/src/engine/ecs/dynamic_actions/rules/DynamicRuleDescriptionTable.d.ts.map +1 -1
  102. package/src/engine/ecs/dynamic_actions/rules/DynamicRuleDescriptionTable.js +1 -0
  103. package/src/engine/ecs/fow/FogOfWarRevealerSystem.d.ts.map +1 -1
  104. package/src/engine/ecs/fow/FogOfWarRevealerSystem.js +3 -0
  105. package/src/engine/ecs/parent/EntityNode.js +3 -3
  106. package/src/engine/ecs/speaker/VoiceSystem.d.ts.map +1 -1
  107. package/src/engine/ecs/speaker/VoiceSystem.js +4 -0
  108. package/src/engine/ecs/storage/BinaryBufferDeSerializer.js +5 -5
  109. package/src/engine/ecs/storage/binary/BinarySerializationRegistry.d.ts.map +1 -1
  110. package/src/engine/ecs/storage/binary/BinarySerializationRegistry.js +3 -2
  111. package/src/engine/ecs/storage/binary/object/BinaryObjectSerializationAdapter2.js +1 -1
  112. package/src/engine/ecs/storage/binary/object-v2/BinaryObjectDeSerializer.d.ts.map +1 -1
  113. package/src/engine/ecs/storage/binary/object-v2/BinaryObjectDeSerializer.js +8 -1
  114. package/src/engine/ecs/storage/populateEngineSerializationRegistry.d.ts.map +1 -1
  115. package/src/engine/ecs/storage/populateEngineSerializationRegistry.js +8 -0
  116. package/src/engine/ecs/terrain/ecs/cling/ClingToTerrainSystem.d.ts.map +1 -1
  117. package/src/engine/ecs/terrain/ecs/cling/ClingToTerrainSystem.js +5 -2
  118. package/src/engine/ecs/terrain/ecs/layers/TerrainLayers.d.ts.map +1 -1
  119. package/src/engine/ecs/terrain/ecs/layers/TerrainLayers.js +3 -0
  120. package/src/engine/ecs/terrain/ecs/splat/SplatMapping.d.ts.map +1 -1
  121. package/src/engine/ecs/terrain/ecs/splat/SplatMapping.js +1 -0
  122. package/src/engine/ecs/terrain/overlay/TerrainOverlay.js +1 -1
  123. package/src/engine/ecs/terrain/tiles/TerrainTile.d.ts.map +1 -1
  124. package/src/engine/ecs/terrain/tiles/TerrainTile.js +13 -1
  125. package/src/engine/ecs/terrain/tiles/TerrainTileManager.d.ts.map +1 -1
  126. package/src/engine/ecs/terrain/tiles/TerrainTileManager.js +1 -0
  127. package/src/engine/graphics/ecs/light/LightSerializationAdapter.d.ts.map +1 -1
  128. package/src/engine/graphics/ecs/light/LightSerializationAdapter.js +13 -1
  129. package/src/engine/graphics/ecs/light/LightSerializationUpgrader_0_1.d.ts +5 -0
  130. package/src/engine/graphics/ecs/light/LightSerializationUpgrader_0_1.d.ts.map +1 -0
  131. package/src/engine/graphics/ecs/light/LightSerializationUpgrader_0_1.js +27 -0
  132. package/src/engine/graphics/ecs/water/Water.d.ts +11 -0
  133. package/src/engine/graphics/ecs/water/Water.d.ts.map +1 -1
  134. package/src/engine/graphics/ecs/water/Water.js +17 -0
  135. package/src/engine/graphics/ecs/water/WaterSerializationAdapter.d.ts.map +1 -1
  136. package/src/engine/graphics/ecs/water/WaterSerializationAdapter.js +3 -1
  137. package/src/engine/graphics/ecs/water/WaterSerializationUpgrader_4_5.d.ts +9 -0
  138. package/src/engine/graphics/ecs/water/WaterSerializationUpgrader_4_5.d.ts.map +1 -0
  139. package/src/engine/graphics/ecs/water/WaterSerializationUpgrader_4_5.js +24 -0
  140. package/src/engine/graphics/ecs/water/WaterWaves.d.ts +30 -9
  141. package/src/engine/graphics/ecs/water/WaterWaves.d.ts.map +1 -1
  142. package/src/engine/graphics/ecs/water/WaterWaves.js +41 -9
  143. package/src/engine/graphics/ecs/water/WaterWavesSerializationAdapter.d.ts.map +1 -1
  144. package/src/engine/graphics/ecs/water/WaterWavesSerializationAdapter.js +30 -26
  145. package/src/engine/graphics/ecs/water/WaterWavesSerializationUpgrader_0_1.d.ts +6 -0
  146. package/src/engine/graphics/ecs/water/WaterWavesSerializationUpgrader_0_1.d.ts.map +1 -0
  147. package/src/engine/graphics/ecs/water/WaterWavesSerializationUpgrader_0_1.js +22 -0
  148. package/src/engine/graphics/geometry/buffered/query/bvh32_geometry_raycast.d.ts.map +1 -1
  149. package/src/engine/graphics/geometry/buffered/query/bvh32_geometry_raycast.js +3 -5
  150. package/src/engine/graphics/texture/3d/scs3d_sample_linear3.d.ts +20 -0
  151. package/src/engine/graphics/texture/3d/scs3d_sample_linear3.d.ts.map +1 -1
  152. package/src/engine/graphics/texture/3d/scs3d_sample_linear3.js +36 -0
  153. package/src/engine/graphics3/WaterSystem.d.ts +12 -3
  154. package/src/engine/graphics3/WaterSystem.d.ts.map +1 -1
  155. package/src/engine/graphics3/WaterSystem.js +78 -46
  156. package/src/engine/input/devices/PointerDevice.d.ts.map +1 -1
  157. package/src/engine/input/devices/PointerDevice.js +29 -4
  158. package/src/engine/intelligence/behavior/selector/WeightedRandomBehavior.d.ts +1 -0
  159. package/src/engine/intelligence/behavior/selector/WeightedRandomBehavior.d.ts.map +1 -1
  160. package/src/engine/intelligence/behavior/selector/WeightedRandomBehavior.js +14 -3
  161. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  162. package/src/engine/physics/fluid/solver/v3_grid_advect_maccormack_velocity.d.ts.map +1 -1
  163. package/src/engine/physics/fluid/solver/v3_grid_advect_maccormack_velocity.js +12 -3
  164. package/src/engine/physics/fluid/solver/v3_grid_advect_sl_velocity.d.ts.map +1 -1
  165. package/src/engine/physics/fluid/solver/v3_grid_advect_sl_velocity.js +8 -2
  166. package/src/engine/physics/fluid/solver/v3_grid_sample_scalar_masked.d.ts +19 -0
  167. package/src/engine/physics/fluid/solver/v3_grid_sample_scalar_masked.d.ts.map +1 -1
  168. package/src/engine/physics/fluid/solver/v3_grid_sample_scalar_masked.js +41 -2
  169. package/src/engine/physics/fluid/solver/v3_mac_advect_scalar.d.ts.map +1 -1
  170. package/src/engine/physics/fluid/solver/v3_mac_advect_scalar.js +9 -3
  171. package/src/engine/physics/fluid/solver/v3_mac_advect_sl_velocity.d.ts.map +1 -1
  172. package/src/engine/physics/fluid/solver/v3_mac_advect_sl_velocity.js +26 -10
  173. package/src/engine/sound/sopra/definition/clip/RandomContainerAudioClip.d.ts +3 -6
  174. package/src/engine/sound/sopra/definition/clip/RandomContainerAudioClip.d.ts.map +1 -1
  175. package/src/engine/sound/sopra/definition/clip/RandomContainerAudioClip.js +22 -9
  176. package/src/engine/ui/DraggableAspect.d.ts +5 -1
  177. package/src/engine/ui/DraggableAspect.d.ts.map +1 -1
  178. package/src/engine/ui/DraggableAspect.js +61 -4
  179. package/src/format/image/avif/heif/ItemProperty.d.ts +1 -1
  180. package/src/format/image/avif/heif/ItemProperty.js +1 -1
  181. package/src/format/image/png/chunk/png_chunk_decode_iTXt.d.ts.map +1 -1
  182. package/src/format/image/png/chunk/png_chunk_decode_iTXt.js +17 -6
  183. package/src/shade/device/mock/SoftwareGPUDevice.d.ts +2 -4
  184. package/src/shade/device/mock/SoftwareGPUDevice.d.ts.map +1 -1
  185. package/src/shade/device/mock/SoftwareGPUDevice.js +20 -13
  186. package/src/shade/playground/skinned_blas_refit/sweep_views.d.ts.map +1 -1
  187. package/src/shade/playground/skinned_blas_refit/sweep_views.js +2 -1
  188. package/src/shade/playground/vgeo_runtime/README.md +5 -4
  189. package/src/shade/playground/water_refraction/README.md +10 -11
  190. package/src/shade/playground/water_refraction/main.js +9 -8
  191. package/src/shade/playground/water_refraction/world.js +1 -1
  192. package/src/shade/playground/water_surface/README.md +43 -0
  193. package/src/shade/playground/water_surface/index.html +30 -0
  194. package/src/shade/playground/water_surface/main.d.ts +2 -0
  195. package/src/shade/playground/water_surface/main.d.ts.map +1 -0
  196. package/src/shade/playground/water_surface/main.js +154 -0
  197. package/src/shade/playground/water_surface/world.d.ts +44 -0
  198. package/src/shade/playground/water_surface/world.d.ts.map +1 -0
  199. package/src/shade/playground/water_surface/world.js +160 -0
  200. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  201. package/src/shade/renderer/Renderer.js +6 -5
  202. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts.map +1 -1
  203. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.js +5 -0
  204. package/src/shade/renderer/atmosphere/GPUSky.d.ts +12 -0
  205. package/src/shade/renderer/atmosphere/GPUSky.d.ts.map +1 -1
  206. package/src/shade/renderer/atmosphere/GPUSky.js +162 -147
  207. package/src/shade/renderer/binding/BufferBinding.js +2 -2
  208. package/src/shade/renderer/buffer/table/GPUTypedTable.d.ts.map +1 -1
  209. package/src/shade/renderer/buffer/table/GPUTypedTable.js +5 -3
  210. package/src/shade/renderer/buffer/table/GPUTypedTableDescriptor.d.ts +10 -3
  211. package/src/shade/renderer/buffer/table/GPUTypedTableDescriptor.d.ts.map +1 -1
  212. package/src/shade/renderer/buffer/table/GPUTypedTableDescriptor.js +17 -9
  213. package/src/shade/renderer/camera/orbital/OrbitalCameraInput.d.ts +3 -0
  214. package/src/shade/renderer/camera/orbital/OrbitalCameraInput.d.ts.map +1 -1
  215. package/src/shade/renderer/camera/orbital/OrbitalCameraInput.js +16 -0
  216. package/src/shade/renderer/camera/orbital/OrbitalCameraRig.d.ts +2 -0
  217. package/src/shade/renderer/camera/orbital/OrbitalCameraRig.d.ts.map +1 -1
  218. package/src/shade/renderer/camera/orbital/OrbitalCameraRig.js +11 -0
  219. package/src/shade/renderer/geometry/meshlet/build/meshoptimizer/geometry_to_meshlets_meshoptimizer.d.ts +1 -1
  220. package/src/shade/renderer/geometry/meshlet/build/meshoptimizer/geometry_to_meshlets_meshoptimizer.d.ts.map +1 -1
  221. package/src/shade/renderer/geometry/meshlet/build/meshoptimizer/geometry_to_meshlets_meshoptimizer.js +9 -3
  222. package/src/shade/renderer/geometry/util/geometry_simplify_redundant_topology.d.ts.map +1 -1
  223. package/src/shade/renderer/geometry/util/geometry_simplify_redundant_topology.js +2 -2
  224. package/src/shade/renderer/geometry/virtual/format/vgeo_validate_container.d.ts.map +1 -1
  225. package/src/shade/renderer/geometry/virtual/format/vgeo_validate_container.js +85 -0
  226. package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.d.ts.map +1 -1
  227. package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.js +12 -6
  228. package/src/shade/renderer/geometry/virtual/runtime/VGeoPageFetcher.d.ts.map +1 -1
  229. package/src/shade/renderer/geometry/virtual/runtime/VGeoPageFetcher.js +7 -0
  230. package/src/shade/renderer/geometry/virtual/runtime/VGeoRuntimeTables.d.ts.map +1 -1
  231. package/src/shade/renderer/geometry/virtual/runtime/VGeoRuntimeTables.js +3 -1
  232. package/src/shade/renderer/lightmap/bake/shader_lightmap_denoise_sh.d.ts.map +1 -1
  233. package/src/shade/renderer/lightmap/bake/shader_lightmap_denoise_sh.js +10 -3
  234. package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
  235. package/src/shade/renderer/particles/DESIGN.md +13 -9
  236. package/src/shade/renderer/particles/shaders/chunk_particle_lighting.d.ts +1 -1
  237. package/src/shade/renderer/particles/shaders/chunk_particle_lighting.js +1 -1
  238. package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
  239. package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.d.ts +3 -2
  240. package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.d.ts.map +1 -1
  241. package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.js +3 -2
  242. package/src/shade/renderer/scene/GPUSceneContext.d.ts +9 -1
  243. package/src/shade/renderer/scene/GPUSceneContext.d.ts.map +1 -1
  244. package/src/shade/renderer/scene/GPUSceneContext.js +23 -1
  245. package/src/shade/renderer/scene/SCENE_DATABASE_SPEC.js +2 -1
  246. package/src/shade/renderer/shader/chunk/math/fft/chunk_fft128_inverse.d.ts +13 -0
  247. package/src/shade/renderer/shader/chunk/math/fft/chunk_fft128_inverse.d.ts.map +1 -0
  248. package/src/shade/renderer/shader/chunk/math/fft/chunk_fft128_inverse.js +42 -0
  249. package/src/shade/renderer/shader/chunk/math/fft/chunk_fft128x4_inverse_workgroup.d.ts +15 -0
  250. package/src/shade/renderer/shader/chunk/math/fft/chunk_fft128x4_inverse_workgroup.d.ts.map +1 -0
  251. package/src/shade/renderer/shader/chunk/math/fft/chunk_fft128x4_inverse_workgroup.js +39 -0
  252. package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.d.ts.map +1 -1
  253. package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.js +2 -0
  254. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.d.ts +4 -1
  255. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.d.ts.map +1 -1
  256. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.js +74 -3
  257. package/src/shade/renderer/volumetrics/NOTES.md +1023 -957
  258. package/src/shade/renderer/volumetrics/chunk_volumetrics_irradiance_sh.d.ts +5 -4
  259. package/src/shade/renderer/volumetrics/chunk_volumetrics_irradiance_sh.d.ts.map +1 -1
  260. package/src/shade/renderer/volumetrics/chunk_volumetrics_irradiance_sh.js +5 -4
  261. package/src/shade/renderer/volumetrics/gi/chunk_volumetrics_gi.d.ts +1 -1
  262. package/src/shade/renderer/volumetrics/gi/chunk_volumetrics_gi.js +1 -1
  263. package/src/shade/renderer/volumetrics/gi/graph_build_froxel_gi.d.ts +1 -1
  264. package/src/shade/renderer/volumetrics/gi/graph_build_froxel_gi.js +1 -1
  265. package/src/shade/renderer/volumetrics/graph_build_froxel_irradiance.d.ts +41 -0
  266. package/src/shade/renderer/volumetrics/graph_build_froxel_irradiance.d.ts.map +1 -0
  267. package/src/shade/renderer/volumetrics/graph_build_froxel_irradiance.js +112 -0
  268. package/src/shade/renderer/volumetrics/graph_build_volumetrics.d.ts +9 -23
  269. package/src/shade/renderer/volumetrics/graph_build_volumetrics.d.ts.map +1 -1
  270. package/src/shade/renderer/volumetrics/graph_build_volumetrics.js +18 -126
  271. package/src/shade/renderer/volumetrics/shader_volumetrics_build_irradiance.d.ts +22 -0
  272. package/src/shade/renderer/volumetrics/shader_volumetrics_build_irradiance.d.ts.map +1 -0
  273. package/src/shade/renderer/volumetrics/shader_volumetrics_build_irradiance.js +228 -0
  274. package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.d.ts.map +1 -1
  275. package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.js +0 -53
  276. package/src/shade/renderer/water/GPUWaterRenderer.d.ts +15 -0
  277. package/src/shade/renderer/water/GPUWaterRenderer.d.ts.map +1 -1
  278. package/src/shade/renderer/water/GPUWaterRenderer.js +110 -30
  279. package/src/shade/renderer/water/medium/GPUWaterBodies.d.ts +16 -8
  280. package/src/shade/renderer/water/medium/GPUWaterBodies.d.ts.map +1 -1
  281. package/src/shade/renderer/water/medium/GPUWaterBodies.js +31 -26
  282. package/src/shade/renderer/water/medium/shader_water_meshlets.d.ts +0 -1
  283. package/src/shade/renderer/water/medium/shader_water_meshlets.d.ts.map +1 -1
  284. package/src/shade/renderer/water/medium/shader_water_meshlets.js +1 -39
  285. package/src/shade/renderer/water/shader_water.d.ts +0 -1
  286. package/src/shade/renderer/water/shader_water.d.ts.map +1 -1
  287. package/src/shade/renderer/water/shader_water.js +201 -72
  288. package/src/shade/renderer/water/surface/GPUWaterSurface.d.ts +70 -0
  289. package/src/shade/renderer/water/surface/GPUWaterSurface.d.ts.map +1 -0
  290. package/src/shade/renderer/water/surface/GPUWaterSurface.js +199 -0
  291. package/src/shade/renderer/water/surface/WATER_WAVE_RECORD_STRUCT.d.ts +5 -2
  292. package/src/shade/renderer/water/surface/WATER_WAVE_RECORD_STRUCT.d.ts.map +1 -1
  293. package/src/shade/renderer/water/surface/WATER_WAVE_RECORD_STRUCT.js +32 -12
  294. package/src/shade/renderer/water/surface/chunk_water_surface_sample.d.ts +23 -0
  295. package/src/shade/renderer/water/surface/chunk_water_surface_sample.d.ts.map +1 -0
  296. package/src/shade/renderer/water/surface/chunk_water_surface_sample.js +227 -0
  297. package/src/shade/renderer/water/surface/graph_water_tessellation.d.ts +65 -11
  298. package/src/shade/renderer/water/surface/graph_water_tessellation.d.ts.map +1 -1
  299. package/src/shade/renderer/water/surface/graph_water_tessellation.js +163 -28
  300. package/src/shade/renderer/water/surface/lod/WATER_LOD.d.ts +51 -0
  301. package/src/shade/renderer/water/surface/lod/WATER_LOD.d.ts.map +1 -0
  302. package/src/shade/renderer/water/surface/lod/WATER_LOD.js +95 -0
  303. package/src/shade/renderer/water/surface/lod/chunk_water_lod.d.ts +10 -0
  304. package/src/shade/renderer/water/surface/lod/chunk_water_lod.d.ts.map +1 -0
  305. package/src/shade/renderer/water/surface/lod/chunk_water_lod.js +127 -0
  306. package/src/shade/renderer/water/surface/lod/chunk_water_lod_cell.d.ts +17 -0
  307. package/src/shade/renderer/water/surface/lod/chunk_water_lod_cell.d.ts.map +1 -0
  308. package/src/shade/renderer/water/surface/lod/chunk_water_lod_cell.js +246 -0
  309. package/src/shade/renderer/water/surface/lod/shader_water_lod.d.ts +118 -0
  310. package/src/shade/renderer/water/surface/lod/shader_water_lod.d.ts.map +1 -0
  311. package/src/shade/renderer/water/surface/lod/shader_water_lod.js +727 -0
  312. package/src/shade/renderer/water/surface/particles/GPUWaterParticles.d.ts +60 -0
  313. package/src/shade/renderer/water/surface/particles/GPUWaterParticles.d.ts.map +1 -0
  314. package/src/shade/renderer/water/surface/particles/GPUWaterParticles.js +274 -0
  315. package/src/shade/renderer/water/surface/particles/WATER_PARTICLE_STRUCT.d.ts +17 -0
  316. package/src/shade/renderer/water/surface/particles/WATER_PARTICLE_STRUCT.d.ts.map +1 -0
  317. package/src/shade/renderer/water/surface/particles/WATER_PARTICLE_STRUCT.js +57 -0
  318. package/src/shade/renderer/water/surface/particles/chunk_water_particle.d.ts +43 -0
  319. package/src/shade/renderer/water/surface/particles/chunk_water_particle.d.ts.map +1 -0
  320. package/src/shade/renderer/water/surface/particles/chunk_water_particle.js +268 -0
  321. package/src/shade/renderer/water/surface/particles/chunk_water_particle_step.d.ts +20 -0
  322. package/src/shade/renderer/water/surface/particles/chunk_water_particle_step.d.ts.map +1 -0
  323. package/src/shade/renderer/water/surface/particles/chunk_water_particle_step.js +239 -0
  324. package/src/shade/renderer/water/surface/particles/shader_water_particles.d.ts +153 -0
  325. package/src/shade/renderer/water/surface/particles/shader_water_particles.d.ts.map +1 -0
  326. package/src/shade/renderer/water/surface/particles/shader_water_particles.js +874 -0
  327. package/src/shade/renderer/water/surface/shader_water_cull.d.ts +42 -0
  328. package/src/shade/renderer/water/surface/shader_water_cull.d.ts.map +1 -0
  329. package/src/shade/renderer/water/surface/shader_water_cull.js +269 -0
  330. package/src/shade/renderer/water/surface/shader_water_waves_combine.d.ts +15 -0
  331. package/src/shade/renderer/water/surface/shader_water_waves_combine.d.ts.map +1 -0
  332. package/src/shade/renderer/water/surface/shader_water_waves_combine.js +73 -0
  333. package/src/shade/renderer/water/surface/shader_water_waves_derive.d.ts +11 -0
  334. package/src/shade/renderer/water/surface/shader_water_waves_derive.d.ts.map +1 -0
  335. package/src/shade/renderer/water/surface/shader_water_waves_derive.js +78 -0
  336. package/src/shade/renderer/water/surface/spectrum/GPUWaterSpectrum.d.ts +35 -0
  337. package/src/shade/renderer/water/surface/spectrum/GPUWaterSpectrum.d.ts.map +1 -0
  338. package/src/shade/renderer/water/surface/spectrum/GPUWaterSpectrum.js +103 -0
  339. package/src/shade/renderer/water/surface/spectrum/WATER_BAND_STATE.d.ts +22 -0
  340. package/src/shade/renderer/water/surface/spectrum/WATER_BAND_STATE.d.ts.map +1 -0
  341. package/src/shade/renderer/water/surface/spectrum/WATER_BAND_STATE.js +57 -0
  342. package/src/shade/renderer/water/surface/spectrum/WATER_SPECTRUM.d.ts +22 -0
  343. package/src/shade/renderer/water/surface/spectrum/WATER_SPECTRUM.d.ts.map +1 -0
  344. package/src/shade/renderer/water/surface/spectrum/WATER_SPECTRUM.js +25 -0
  345. package/src/shade/renderer/water/surface/spectrum/chunk_water_jonswap.d.ts +14 -0
  346. package/src/shade/renderer/water/surface/spectrum/chunk_water_jonswap.d.ts.map +1 -0
  347. package/src/shade/renderer/water/surface/spectrum/chunk_water_jonswap.js +48 -0
  348. package/src/shade/renderer/water/surface/spectrum/chunk_water_spectrum.d.ts +23 -0
  349. package/src/shade/renderer/water/surface/spectrum/chunk_water_spectrum.d.ts.map +1 -0
  350. package/src/shade/renderer/water/surface/spectrum/chunk_water_spectrum.js +169 -0
  351. package/src/shade/renderer/water/surface/spectrum/shader_water_spectrum.d.ts +26 -0
  352. package/src/shade/renderer/water/surface/spectrum/shader_water_spectrum.d.ts.map +1 -0
  353. package/src/shade/renderer/water/surface/spectrum/shader_water_spectrum.js +161 -0
  354. package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.d.ts.map +1 -1
  355. package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js +29 -9
  356. package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts.map +1 -1
  357. package/src/shade/wgsl/emulator/WGSLLanguageCore.js +14 -3
  358. package/src/core/geom/2d/polygon/polygon2_triangulate.corpus.d.ts +0 -28
  359. package/src/core/geom/2d/polygon/polygon2_triangulate.corpus.d.ts.map +0 -1
  360. package/src/core/geom/2d/polygon/polygon2_triangulate.corpus.js +0 -86
  361. package/src/engine/ecs/storage/binary/object-v2/serializerTestHarness.d.ts +0 -29
  362. package/src/engine/ecs/storage/binary/object-v2/serializerTestHarness.d.ts.map +0 -1
  363. package/src/engine/ecs/storage/binary/object-v2/serializerTestHarness.js +0 -44
  364. package/src/shade/renderer/water/medium/shader_water_bodies_derive.d.ts +0 -4
  365. package/src/shade/renderer/water/medium/shader_water_bodies_derive.d.ts.map +0 -1
  366. package/src/shade/renderer/water/medium/shader_water_bodies_derive.js +0 -32
  367. package/src/shade/renderer/water/surface/GPUWaterWaveSimulation.d.ts +0 -25
  368. package/src/shade/renderer/water/surface/GPUWaterWaveSimulation.d.ts.map +0 -1
  369. package/src/shade/renderer/water/surface/GPUWaterWaveSimulation.js +0 -128
  370. package/src/shade/renderer/water/surface/chunk_water_tessellation.d.ts +0 -9
  371. package/src/shade/renderer/water/surface/chunk_water_tessellation.d.ts.map +0 -1
  372. package/src/shade/renderer/water/surface/chunk_water_tessellation.js +0 -144
  373. package/src/shade/renderer/water/surface/chunk_water_wave.d.ts +0 -13
  374. package/src/shade/renderer/water/surface/chunk_water_wave.d.ts.map +0 -1
  375. package/src/shade/renderer/water/surface/chunk_water_wave.js +0 -40
  376. package/src/shade/renderer/water/surface/shader_water_tiles.d.ts +0 -4
  377. package/src/shade/renderer/water/surface/shader_water_tiles.d.ts.map +0 -1
  378. package/src/shade/renderer/water/surface/shader_water_tiles.js +0 -123
  379. package/src/shade/renderer/water/surface/shader_water_wave_batch.d.ts +0 -6
  380. package/src/shade/renderer/water/surface/shader_water_wave_batch.d.ts.map +0 -1
  381. package/src/shade/renderer/water/surface/shader_water_wave_batch.js +0 -85
  382. package/src/shade/renderer/water/surface/shader_water_wave_domain.d.ts +0 -6
  383. package/src/shade/renderer/water/surface/shader_water_wave_domain.d.ts.map +0 -1
  384. package/src/shade/renderer/water/surface/shader_water_wave_domain.js +0 -83
@@ -1,144 +0,0 @@
1
- import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
2
- import { WebGPUStruct } from "../../shader/type/WebGPUStruct.js";
3
- import { f32, u32, vec2i, vec2u, vec2f, mat4x4f } from "../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
4
- import { chunk_barycentric_solve } from "../../shader/chunk/geometry/triangle/chunk_barycentric_solve.js";
5
-
6
- export const WATER_TILE_CELLS = 16;
7
- // A triangle clipped by five planes has at most eight corners, hence six fan triangles.
8
- export const WATER_TILE_VERTEX_COUNT = WATER_TILE_CELLS ** 2 * 18;
9
- export const WATER_TILE_STRUCT = WebGPUStruct.from({
10
- meshlet: u32, triangle: u32, body: u32, anchor: f32, origin: vec2i, size: vec2u, pixels: f32,
11
- }, 'WaterTile').pack();
12
- export const WATER_TESSELLATION_STRUCT = WebGPUStruct.from({
13
- resolution: vec2f, pixels: f32, view_projection_matrix: mat4x4f,
14
- }, 'WaterTessellation').pack();
15
-
16
- /** Clip in barycentric space: every generated point remains on the authored triangle. */
17
- export const chunk_water_tessellation = CodeChunk.from(/* language=WGSL */ `
18
- fn water_reference_position(position: vec3f, height: f32, simulated: bool) -> vec3f {
19
- return vec3f(position.x, select(position.y, height, simulated), position.z);
20
- }
21
- // Bits identify the boundaries meeting at each corner: the three authored edges,
22
- // followed by the near plane and four cell edges. Retaining them lets reconstruction
23
- // evaluate an intersection directly, independent of the polygon clipping history.
24
- struct WaterPolygon { points: array<vec3f, 8>, boundaries: array<u32, 8>, count: u32 }
25
- fn water_triangle_polygon() -> WaterPolygon {
26
- var p: WaterPolygon;
27
- p.points[0] = vec3f(1,0,0); p.points[1] = vec3f(0,1,0); p.points[2] = vec3f(0,0,1); p.count = 3u;
28
- p.boundaries[0] = 6u; p.boundaries[1] = 5u; p.boundaries[2] = 3u;
29
- return p;
30
- }
31
- fn water_clip_polygon(p: WaterPolygon, distances: vec3f, boundary: u32) -> WaterPolygon {
32
- var out: WaterPolygon;
33
- if (p.count == 0u) { return out; }
34
- var previous = p.points[p.count - 1u];
35
- var d_previous = dot(previous, distances);
36
- for (var i = 0u; i < p.count; i++) {
37
- let current = p.points[i]; let d = dot(current, distances);
38
- if ((d >= 0.0) != (d_previous >= 0.0)) {
39
- let previous_index = select(i - 1u, p.count - 1u, i == 0u);
40
- out.boundaries[out.count] = (p.boundaries[previous_index] & p.boundaries[i]) | boundary;
41
- out.points[out.count] = mix(previous, current, d_previous / (d_previous - d)); out.count++;
42
- }
43
- if (d >= 0.0) { out.boundaries[out.count] = p.boundaries[i]; out.points[out.count] = current; out.count++; }
44
- previous = current; d_previous = d;
45
- }
46
- return out;
47
- }
48
- fn water_plane_distances(a: vec4f, b: vec4f, c: vec4f, plane: vec4f) -> vec3f {
49
- return vec3f(dot(a, plane), dot(b, plane), dot(c, plane));
50
- }
51
- fn water_point_weights(a: vec4f, b: vec4f, c: vec4f, point: vec2f) -> vec3f {
52
- let w = vec3f(a.w,b.w,c.w);
53
- return barycentric_solve(vec3f(a.x,b.x,c.x) - point.x * w, vec3f(a.y,b.y,c.y) - point.y * w);
54
- }
55
- fn water_authored_edges(weights: vec3f) -> u32 {
56
- return select(0u,1u,weights.x == 0.0) | select(0u,2u,weights.y == 0.0) | select(0u,4u,weights.z == 0.0);
57
- }
58
- fn water_boundary_plane(boundary: u32, lo: vec2f, hi: vec2f) -> vec4f {
59
- if ((boundary & 8u) != 0u) { return vec4f(0,0,-1,1); }
60
- if ((boundary & 16u) != 0u) { return vec4f(1,0,0,-lo.x); }
61
- if ((boundary & 32u) != 0u) { return vec4f(-1,0,0,hi.x); }
62
- if ((boundary & 64u) != 0u) { return vec4f(0,1,0,-lo.y); }
63
- return vec4f(0,-1,0,hi.y);
64
- }
65
- fn water_corner_weights(a: vec4f, b: vec4f, c: vec4f, boundaries: u32, lo: vec2f, hi: vec2f) -> vec3f {
66
- if ((boundaries & 15u) == 0u) {
67
- return water_point_weights(a,b,c,vec2f(select(lo.x,hi.x,(boundaries & 32u) != 0u),
68
- select(lo.y,hi.y,(boundaries & 128u) != 0u)));
69
- }
70
- var distances: array<vec3f, 2>;
71
- var count = 0u;
72
- for (var bit = 0u; bit < 8u; bit++) {
73
- if ((boundaries & (1u << bit)) == 0u) { continue; }
74
- if (bit < 3u) { distances[count][bit] = 1.0; }
75
- else { distances[count] = water_plane_distances(a,b,c,water_boundary_plane(1u << bit,lo,hi)); }
76
- count++;
77
- if (count == 2u) { break; }
78
- }
79
- return barycentric_solve(distances[0], distances[1]);
80
- }
81
- fn water_corner_position(a: vec3f, b: vec3f, c: vec3f, ca: vec4f, cb: vec4f, cc: vec4f,
82
- weights: vec3f, boundaries: u32, lo: vec2f, hi: vec2f) -> vec3f {
83
- let edges = boundaries & 7u;
84
- if (edges == 6u) { return a; }
85
- if (edges == 5u) { return b; }
86
- if (edges == 3u) { return c; }
87
- if (edges != 0u) {
88
- var p = a; var q = b; var cp = ca; var cq = cb;
89
- if (edges == 1u) { p = b; q = c; cp = cb; cq = cc; }
90
- if (edges == 2u) { q = c; cq = cc; }
91
- // Adjacent authored triangles traverse their common edge in opposite orders.
92
- // Canonical endpoints and the original clipping plane give identical f32 positions.
93
- if (p.x > q.x || (p.x == q.x && (p.y > q.y || (p.y == q.y && p.z > q.z)))) {
94
- let tmp = p; p = q; q = tmp; let tc = cp; cp = cq; cq = tc;
95
- }
96
- // A cell corner may also lie on an authored edge coincident with a cell plane.
97
- // Use the intersecting plane, rather than dividing by that coincident plane's zero span.
98
- var dp = 0.0; var dq = 0.0;
99
- for (var bit = 3u; bit < 8u; bit++) {
100
- if ((boundaries & (1u << bit)) == 0u) { continue; }
101
- let plane = water_boundary_plane(1u << bit,lo,hi);
102
- let p_distance = dot(cp,plane); let q_distance = dot(cq,plane);
103
- if (abs(p_distance - q_distance) > abs(dp - dq)) { dp = p_distance; dq = q_distance; }
104
- }
105
- return mix(p,q,dp / (dp - dq));
106
- }
107
- return a * weights.x + b * weights.y + c * weights.z;
108
- }
109
- fn water_cell_polygon(a: vec4f, b: vec4f, c: vec4f, lo: vec2f, hi: vec2f) -> WaterPolygon {
110
- // Interior cells are ordinary quads. Reuse the rasterizer's homogeneous barycentric solve
111
- // and reserve polygon clipping for the authored boundary and near-plane intersections.
112
- if (a.w > 0.0 && b.w > 0.0 && c.w > 0.0 && a.w >= a.z && b.w >= b.z && c.w >= c.z) {
113
- let p0 = water_point_weights(a,b,c,lo);
114
- let p1 = water_point_weights(a,b,c,vec2f(hi.x,lo.y));
115
- let p2 = water_point_weights(a,b,c,hi);
116
- let p3 = water_point_weights(a,b,c,vec2f(lo.x,hi.y));
117
- let minimum = min(min(p0,p1),min(p2,p3));
118
- if (all(minimum >= vec3f(0))) {
119
- var quad: WaterPolygon;
120
- quad.points[0] = p0; quad.points[1] = p1; quad.points[2] = p2; quad.points[3] = p3;
121
- quad.boundaries[0] = 80u | water_authored_edges(p0); quad.boundaries[1] = 96u | water_authored_edges(p1);
122
- quad.boundaries[2] = 160u | water_authored_edges(p2); quad.boundaries[3] = 144u | water_authored_edges(p3);
123
- // Preserve the source triangle's winding, just as the clipped path does.
124
- // The rasterizer must identify the same side on interior and boundary cells.
125
- if (dot(cross(a.xyw,b.xyw),c.xyw) < 0.0) {
126
- quad.points[1] = p3; quad.points[3] = p1;
127
- let boundary = quad.boundaries[1]; quad.boundaries[1] = quad.boundaries[3]; quad.boundaries[3] = boundary;
128
- }
129
- quad.count = 4u; return quad;
130
- }
131
- }
132
- var p = water_triangle_polygon();
133
- p = water_clip_polygon(p, water_plane_distances(a,b,c,vec4f(0,0,-1,1)), 8u);
134
- p = water_clip_polygon(p, water_plane_distances(a,b,c,vec4f(1,0,0,-lo.x)), 16u);
135
- p = water_clip_polygon(p, water_plane_distances(a,b,c,vec4f(-1,0,0,hi.x)), 32u);
136
- p = water_clip_polygon(p, water_plane_distances(a,b,c,vec4f(0,1,0,-lo.y)), 64u);
137
- p = water_clip_polygon(p, water_plane_distances(a,b,c,vec4f(0,-1,0,hi.y)), 128u);
138
- for (var i = 0u; i < p.count; i++) {
139
- p.points[i] = water_corner_weights(a,b,c,p.boundaries[i],lo,hi);
140
- p.boundaries[i] |= water_authored_edges(p.points[i]);
141
- }
142
- return p;
143
- }
144
- `, [chunk_barycentric_solve]);
@@ -1,13 +0,0 @@
1
- /**
2
- * The primitive surface producer's physics, as pure functions so each is testable alone.
3
- *
4
- * A damped linear wave equation on a height field, `h_tt = c² ∇²h − γ h_t + f`, stepped by
5
- * leapfrog. The celerity is the shallow-water one, `c = √(g·d)`. The batched producer uses a
6
- * one-metre reference depth because an authored surface supplies no bathymetry. This primitive
7
- * model describes long waves; deep-water wind waves have wavelength-dependent speed.
8
- *
9
- * @type {CodeChunk}
10
- */
11
- export const chunk_water_wave: CodeChunk;
12
- import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
13
- //# sourceMappingURL=chunk_water_wave.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"chunk_water_wave.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/water/surface/chunk_water_wave.js"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AACH,+BAFU,SAAS,CA6BhB;0BAvCuB,oCAAoC"}
@@ -1,40 +0,0 @@
1
- import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
2
-
3
- /**
4
- * The primitive surface producer's physics, as pure functions so each is testable alone.
5
- *
6
- * A damped linear wave equation on a height field, `h_tt = c² ∇²h − γ h_t + f`, stepped by
7
- * leapfrog. The celerity is the shallow-water one, `c = √(g·d)`. The batched producer uses a
8
- * one-metre reference depth because an authored surface supplies no bathymetry. This primitive
9
- * model describes long waves; deep-water wind waves have wavelength-dependent speed.
10
- *
11
- * @type {CodeChunk}
12
- */
13
- export const chunk_water_wave = CodeChunk.from(/* language=WGSL */ `
14
- const WATER_WAVE_GRAVITY: f32 = 9.81;
15
-
16
- // Squared celerity of a long wave over water depth metres deep, capped so an explicit step of the
17
- // size the producer takes stays stable (2-D CFL: c·dt/dx ≤ 1/√2).
18
- fn water_wave_celerity2(depth: f32, celerity_limit: f32) -> f32 {
19
- return min(WATER_WAVE_GRAVITY * max(depth, 0.0), celerity_limit * celerity_limit);
20
- }
21
-
22
- // One leapfrog step of h_tt = c² ∇²h − γ h_t + f: the next height from the current one, the
23
- // previous one, the current height's Laplacian, c², the damping rate γ (1/s), the forcing f (m/s²)
24
- // and the step dt (s).
25
- fn water_wave_step(h: f32, h_previous: f32, laplacian: f32, celerity2: f32, damping: f32,
26
- force: f32, dt: f32) -> f32 {
27
- return h + (h - h_previous) * max(1.0 - damping * dt, 0.0) + dt * dt * (celerity2 * laplacian + force);
28
- }
29
-
30
- // Extra damping in a band along the grid's border, rising quadratically to strength at the edge,
31
- // so waves leave the domain instead of reflecting off the end of the grid.
32
- fn water_wave_sponge(cell: vec2<u32>, resolution: u32, width: f32, strength: f32) -> f32 {
33
- let last = f32(resolution - 1u);
34
- let p = vec2<f32>(cell);
35
- let edge = min(min(p.x, p.y), min(last - p.x, last - p.y));
36
- let s = clamp(1.0 - edge / max(width, 1.0), 0.0, 1.0);
37
- return strength * s * s;
38
- }
39
-
40
- `);
@@ -1,4 +0,0 @@
1
- /** Keep triangle identity, including hidden bodies. Only displaced raster depth selects ownership. */
2
- export const shader_water_tiles: ComputeShader;
3
- import { ComputeShader } from "../../shader/ComputeShader.js";
4
- //# sourceMappingURL=shader_water_tiles.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"shader_water_tiles.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/water/surface/shader_water_tiles.js"],"names":[],"mappings":"AA4BA,sGAAsG;AACtG,+CA6FmG;8BApHrE,+BAA+B"}
@@ -1,123 +0,0 @@
1
- import { CAMERA_UNIFORM_STRUCT } from "../../camera/CAMERA_UNIFORM_STRUCT.js";
2
- import { GEOMETRY_METADATA_STRUCT } from "../../geometry/GEOMETRY_METADATA_STRUCT.js";
3
- import { MESHLET_METADATA_STRUCT } from "../../geometry/meshlet/encoding/MESHLET_METADATA_STRUCT.js";
4
- import { GEOMETRY_MESHLET_TRIANGLE_LIMIT } from "../../geometry/meshlet/GEOMETRY_MESHLET_TRIANGLE_LIMIT.js";
5
- import { MESHLET_COLLECTION_STRUCT } from "../../rasterize/MESHLET_COLLECTION_STRUCT.js";
6
- import { COLLECTION_U32_STRUCT_READ } from "../../gpu_primitive/COLLECTION_U32_STRUCT_READ.js";
7
- import { ComputeShader } from "../../shader/ComputeShader.js";
8
- import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
9
- import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
10
- import { WebGPUArray } from "../../shader/type/WebGPUArray.js";
11
- import { f32, u32 } from "../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
12
- import { chunk_scene_database_access } from "../../scene/chunk_scene_database_access.js";
13
- import { chunk_folded_workgroup_index } from "../../shader/chunk/grid/chunk_folded_workgroup_index.js";
14
- import { chunk_read_meshlet_vertex_by_draw_index } from "../../shader/chunk/geometry/meshlet/chunk_read_meshlet_vertex_by_draw_index.js";
15
- import { WATER_BODIES_TABLE, WATER_WAVES_TABLE } from "../medium/chunk_water_bodies.js";
16
- import { chunk_water_tessellation, WATER_TILE_CELLS, WATER_TILE_STRUCT, WATER_TESSELLATION_STRUCT } from "./chunk_water_tessellation.js";
17
-
18
- const resources = new ShaderResourceSetDescriptor();
19
- resources.setImmediate('capacity', u32);
20
- resources.createGroup().addUniform('camera', CAMERA_UNIFORM_STRUCT).addUniform('tessellation', WATER_TESSELLATION_STRUCT)
21
- .addStorageBuffer('scene_database', WebGPUArray.u32)
22
- .addStorageBuffer('geometries', WebGPUArray.from(GEOMETRY_METADATA_STRUCT))
23
- .addStorageBuffer('water_meshlets', MESHLET_COLLECTION_STRUCT)
24
- .addStorageBuffer('meshlet_metadata', WebGPUArray.from(MESHLET_METADATA_STRUCT))
25
- .addStorageBuffer('meshlet_data', WebGPUArray.from(f32))
26
- .addStorageBuffer('tiles', WebGPUArray.from(WATER_TILE_STRUCT), true)
27
- .addStorageBuffer('counts', COLLECTION_U32_STRUCT_READ, true);
28
-
29
- /** Keep triangle identity, including hidden bodies. Only displaced raster depth selects ownership. */
30
- export const shader_water_tiles = ComputeShader.from({ label: 'Water / classify view tiles', resources,
31
- body: CodeChunk.from(/* language=WGSL */ `
32
- @compute @workgroup_size(128)
33
- fn main(@builtin(workgroup_id) group: vec3u, @builtin(local_invocation_index) lane: u32) {
34
- let i = folded_workgroup_index(group) * 128u + lane;
35
- if (i == 0u) { counts.count = capacity; }
36
- if (i >= capacity) { return; }
37
- counts.elements[i] = 0u;
38
- let meshlet_slot = i / ${GEOMETRY_MESHLET_TRIANGLE_LIMIT}u;
39
- if (meshlet_slot >= water_meshlets.count) { return; }
40
- let definition = water_meshlets.elements[meshlet_slot];
41
- let triangle = i % ${GEOMETRY_MESHLET_TRIANGLE_LIMIT}u;
42
- let header = meshlet_metadata[definition.index];
43
- if (triangle >= header.primitive_count) { return; }
44
- let body = ${WATER_BODIES_TABLE.marshalling_method_read}(&scene_database, definition.mesh);
45
- let node = scene_read_node(&scene_database, body.node);
46
- let simulated = body.wave != ~0u;
47
- var bounds = vec2f(0);
48
- if (simulated) { bounds = ${WATER_WAVES_TABLE.marshalling_method_read}(&scene_database, body.wave).displacement_bounds; }
49
- // Increasing near-plane distance is farther from the camera. Use the far endpoint;
50
- // clipping it at the near plane cannot discard a point displaced into the visible frustum.
51
- let direction = tessellation.view_projection_matrix * node.global[1];
52
- let farther = direction.w - direction.z >= 0.0;
53
- var anchor = 0.0;
54
- var pixels = tessellation.pixels;
55
- if (simulated) {
56
- let box = geometries[body.geometry].bounding_box;
57
- // A shared local-xz reference keeps adjacent triangles' generated edge vertices
58
- // identical, including sloped rest geometry. Only reconstruction flattens height;
59
- // rendered vertices still interpolate all three authored position coordinates.
60
- anchor = select(box[1] + bounds.x, box[4] + bounds.y, farther);
61
- let x = tessellation.view_projection_matrix * node.global[0];
62
- let z = tessellation.view_projection_matrix * node.global[2];
63
- let origin = tessellation.view_projection_matrix * node.global[3];
64
- let plane = cross(x.xyw, z.xyw);
65
- let reference = origin + direction * anchor;
66
- let span = box[4] - box[1] + bounds.y - bounds.x;
67
- if (span > 0.0 && abs(dot(plane, reference.xyw)) <= 1e-5 * length(plane) * max(length(reference.xyw), 1.0)
68
- && abs(dot(plane, direction.xyw)) > 1e-20) {
69
- anchor += select(-span, span, farther);
70
- }
71
- var minimum_w = 1e30;
72
- for (var corner = 0u; corner < 4u; corner++) {
73
- let p = vec3f(select(box[0], box[3], (corner & 1u) != 0u), anchor, select(box[2], box[5], (corner & 2u) != 0u));
74
- minimum_w = min(minimum_w, (tessellation.view_projection_matrix * (node.global * vec4f(p, 1))).w);
75
- }
76
- let low = box[1] + bounds.x - anchor;
77
- let high = box[4] + bounds.y - anchor;
78
- let slopes = vec4f(direction.w + direction.x, direction.w - direction.x, direction.w + direction.y, direction.w - direction.y);
79
- let allowance = max(vec4f(0), max(slopes * low, slopes * high));
80
- // After swept side-plane clipping, the reference's NDC span is at most
81
- // 2 + (left + right allowance)/minimum_w. Use this body-wide bound so a
82
- // near-plane envelope cannot amplify patches or split shared edge grids.
83
- let amplification = 1.0 + max(allowance.x + allowance.y, allowance.z + allowance.w)
84
- / (2.0 * max(camera.clip_near_far.x, minimum_w));
85
- pixels *= amplification;
86
- }
87
- let pa = read_meshlet_vertex_by_draw_index(header, triangle * 3u).position;
88
- let pb = read_meshlet_vertex_by_draw_index(header, triangle * 3u + 1u).position;
89
- let pc = read_meshlet_vertex_by_draw_index(header, triangle * 3u + 2u).position;
90
- let a = tessellation.view_projection_matrix * (node.global * vec4f(water_reference_position(pa, anchor, simulated), 1));
91
- let b = tessellation.view_projection_matrix * (node.global * vec4f(water_reference_position(pb, anchor, simulated), 1));
92
- let c = tessellation.view_projection_matrix * (node.global * vec4f(water_reference_position(pc, anchor, simulated), 1));
93
- let heights = select(vec3f(0), vec3f(pa.y, pb.y, pc.y) - vec3f(anchor), simulated);
94
- var p = water_clip_polygon(water_triangle_polygon(), water_plane_distances(a,b,c,vec4f(0,0,-1,1)), 0u);
95
- // The reference is unjittered, but raster samples may move into the viewport by
96
- // a pixel. Retain that fixed border without letting jitter change the tile grid.
97
- let border = vec2f(1.0) + vec2f(2.0) / tessellation.resolution;
98
- let planes = array<vec4f,4>(vec4f(1,0,0,border.x),vec4f(-1,0,0,border.x),vec4f(0,1,0,border.y),vec4f(0,-1,0,border.y));
99
- for (var plane = 0u; plane < 4u; plane++) {
100
- let sweep = dot(direction, planes[plane]);
101
- let allowance = max((heights + vec3f(bounds.x)) * sweep, (heights + vec3f(bounds.y)) * sweep);
102
- p = water_clip_polygon(p, water_plane_distances(a,b,c,planes[plane]) + allowance, 0u);
103
- }
104
- if (p.count < 3u) { return; }
105
- var lo = vec2f(1e30); var hi = vec2f(-1e30);
106
- for (var corner = 0u; corner < p.count; corner++) {
107
- let q = a * p.points[corner].x + b * p.points[corner].y + c * p.points[corner].z;
108
- let pixel = (q.xy / q.w * vec2f(0.5,-0.5) + vec2f(0.5)) * tessellation.resolution;
109
- lo = min(lo, pixel); hi = max(hi, pixel);
110
- }
111
- let tile_pixels = pixels * ${WATER_TILE_CELLS}.0;
112
- let origin = vec2i(floor(lo / tile_pixels));
113
- let end = vec2i(ceil(hi / tile_pixels));
114
- let size = vec2u(max(end - origin, vec2i(0)));
115
- if (any(size == vec2u(0))) { return; }
116
- var tile: WaterTile;
117
- tile.meshlet = definition.index; tile.triangle = triangle; tile.body = definition.mesh;
118
- tile.anchor = anchor; tile.origin = origin; tile.size = size; tile.pixels = pixels;
119
- tiles[i] = tile;
120
- counts.elements[i] = size.x * size.y;
121
- }
122
- `, [chunk_water_tessellation, chunk_read_meshlet_vertex_by_draw_index, chunk_scene_database_access,
123
- WATER_BODIES_TABLE.chunk_read, WATER_WAVES_TABLE.chunk_read, chunk_folded_workgroup_index]) });
@@ -1,6 +0,0 @@
1
- export const WATER_WAVE_BATCH_STRUCT: WebGPUStruct;
2
- export const shader_water_wave_batch: ComputeShader;
3
- export const shader_water_wave_batch_finish: ComputeShader;
4
- import { WebGPUStruct } from "../../shader/type/WebGPUStruct.js";
5
- import { ComputeShader } from "../../shader/ComputeShader.js";
6
- //# sourceMappingURL=shader_water_wave_batch.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"shader_water_wave_batch.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/water/surface/shader_water_wave_batch.js"],"names":[],"mappings":"AAYA,mDAC+E;AAO/E,oDA8CwH;AAMxH,2DAY4F;6BA/E/D,mCAAmC;8BALlC,+BAA+B"}
@@ -1,85 +0,0 @@
1
- import { ComputeShader } from "../../shader/ComputeShader.js";
2
- import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
3
- import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
4
- import { f32, u32 } from "../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
5
- import { WebGPUArray } from "../../shader/type/WebGPUArray.js";
6
- import { WebGPUStruct } from "../../shader/type/WebGPUStruct.js";
7
- import { WATER_WAVES_TABLE as table } from "../medium/chunk_water_bodies.js";
8
- import { chunk_folded_workgroup_index } from "../../shader/chunk/grid/chunk_folded_workgroup_index.js";
9
- import { chunk_srdnoise2 } from "../../shader/chunk/noise/psrdnoise/chunk_srdnoise2.js";
10
- import { chunk_water_wave } from "./chunk_water_wave.js";
11
- import { chunk_scene_database_access } from "../../scene/chunk_scene_database_access.js";
12
-
13
- export const WATER_WAVE_BATCH_STRUCT = WebGPUStruct.from({ resolution: u32, capacity: u32,
14
- dt: f32, time: f32, damping: f32, apply_impulses: u32 }, 'WaterWaveBatch');
15
- const resources = new ShaderResourceSetDescriptor();
16
- resources.createGroup().addUniform('batch', WATER_WAVE_BATCH_STRUCT)
17
- .addStorageBuffer('scene_database', WebGPUArray.u32)
18
- .addStorageBuffer('domain', WebGPUArray.u32)
19
- .addStorageBuffer('state_current', WebGPUArray.from(f32))
20
- .addStorageBuffer('state_previous', WebGPUArray.from(f32), true);
21
- export const shader_water_wave_batch = ComputeShader.from({ label: 'Water / batched wave step', resources,
22
- body: CodeChunk.from(/* language=WGSL */ `
23
- @compute @workgroup_size(128)
24
- fn main(@builtin(workgroup_id) group: vec3u, @builtin(local_invocation_index) lane: u32) {
25
- let i = folded_workgroup_index(group) * 128u + lane;
26
- let n = batch.resolution;
27
- let row = i / (n * n);
28
- if (row >= batch.capacity) { return; }
29
- let params = ${table.marshalling_method_read}(&scene_database, row);
30
- if (params.first_write != 0u || params.node == 0u || params.node == ~0u || domain[i] == 0u) { state_previous[i] = 0.0; return; }
31
- if (batch.dt == 0.0) { return; }
32
- let cell = vec2u(i % n, (i / n) % n);
33
- let start = row * n * n;
34
- let spacing = max((params.extent.zw - params.extent.xy) / f32(n - 1u), vec2f(1e-20));
35
- let world = scene_read_node(&scene_database, params.node).global;
36
- let scale = vec3f(length(world[0].xyz), length(world[1].xyz), length(world[2].xyz));
37
- // A temporarily collapsed transform must not poison persistent histories with NaNs.
38
- if (any(scale <= vec3f(1e-10))) { state_previous[i] = state_current[i]; return; }
39
- let world_spacing = max(spacing * scale.xz, vec2f(1e-10));
40
- let h = state_current[i];
41
- let left = start + cell.y * n + select(cell.x - 1u, 0u, cell.x == 0u);
42
- let right = start + cell.y * n + min(cell.x + 1u, n - 1u);
43
- let down = start + select(cell.y - 1u, 0u, cell.y == 0u) * n + cell.x;
44
- let up = start + min(cell.y + 1u, n - 1u) * n + cell.x;
45
- let laplacian = (state_current[left] + state_current[right] - 2.0 * h) / (world_spacing.x * world_spacing.x)
46
- + (state_current[down] + state_current[up] - 2.0 * h) / (world_spacing.y * world_spacing.y);
47
- let position = mix(params.extent.xy, params.extent.zw, vec2f(cell) / f32(n - 1u));
48
- let wind = params.forcing.xy * scale.xz;
49
- let wind_direction = wind / max(length(wind), 1e-20);
50
- let drift = wind_direction * params.forcing.w * batch.time;
51
- var force = params.forcing.z / scale.y * srdnoise2((position * scale.xz - drift) / 6.0, 0.0).x;
52
- if (batch.apply_impulses != 0u) {
53
- for (var j = 0u; j < params.impulse_count; j++) {
54
- let impulse = params.impulses[j];
55
- let d = position - impulse.xy;
56
- let world_delta = (world * vec4f(d.x, 0.0, d.y, 0.0)).xyz;
57
- force += impulse.w / (batch.dt * scale.y) * exp(-dot(world_delta, world_delta) / max(impulse.z * impulse.z, 1e-6));
58
- }
59
- }
60
- let damping = batch.damping + water_wave_sponge(cell, n, max(4.0, f32(n) * 0.04), 4.0);
61
- // The authored surface has no bathymetry. The primitive producer uses a one-metre reference
62
- // depth; the CFL cap follows both axes of its local grid. It does not define the mesh outline.
63
- let celerity = 0.6 * min(world_spacing.x, world_spacing.y) / batch.dt;
64
- state_previous[i] = water_wave_step(h, state_previous[i], laplacian,
65
- water_wave_celerity2(1.0, celerity), damping, force, batch.dt);
66
- }
67
- `, [table.chunk_read, chunk_folded_workgroup_index, chunk_srdnoise2, chunk_water_wave, chunk_scene_database_access]) });
68
-
69
- const finish_resources = new ShaderResourceSetDescriptor();
70
- finish_resources.createGroup().addUniform('batch', WATER_WAVE_BATCH_STRUCT)
71
- .addStorageBuffer('scene_database', WebGPUArray.u32, true);
72
- const pg = table.page_iterator_symbol_prefix(64, true);
73
- export const shader_water_wave_batch_finish = ComputeShader.from({ label: 'Water / consume wave inputs', resources: finish_resources,
74
- body: CodeChunk.from(/* language=WGSL */ `
75
- @compute @workgroup_size(64)
76
- fn main(@builtin(workgroup_id) group: vec3u, @builtin(local_invocation_index) lane: u32) {
77
- if (!${pg}_setup(&scene_database, folded_workgroup_index(group), lane)) { return; }
78
- let slot = ${pg}_slot_in_page(lane);
79
- if (slot >= ${pg}_ELEMENTS_PER_PAGE || !${pg}_is_occupied(slot)) { return; }
80
- let row = ${pg}_slot_to_index(slot);
81
- ${table.marshalling_method_write_field('first_write')}(&scene_database, row, 0u);
82
- if (batch.apply_impulses != 0u) { ${table.marshalling_method_write_field('impulse_count')}(&scene_database, row, 0u); }
83
- }
84
- `, [table.chunk_iterate(64, true), table.wgsl_gen_write_field_code('first_write'),
85
- table.wgsl_gen_write_field_code('impulse_count'), chunk_folded_workgroup_index]) });
@@ -1,6 +0,0 @@
1
- /** Bake the authored footprint once per new wave row, using the existing geometry BLAS. */
2
- export const shader_water_wave_domain: ComputeShader;
3
- /** Bilinear reconstruction cannot leave the extrema of its samples. Include the rest surface. */
4
- export const shader_water_wave_bounds: ComputeShader;
5
- import { ComputeShader } from "../../shader/ComputeShader.js";
6
- //# sourceMappingURL=shader_water_wave_domain.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"shader_water_wave_domain.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/water/surface/shader_water_wave_domain.js"],"names":[],"mappings":"AAwBA,2FAA2F;AAC3F,qDAqBsF;AAOtF,iGAAiG;AACjG,qDA4BmH;8BAlFrF,+BAA+B"}
@@ -1,83 +0,0 @@
1
- import { ComputeShader } from "../../shader/ComputeShader.js";
2
- import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
3
- import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
4
- import { WebGPUArray } from "../../shader/type/WebGPUArray.js";
5
- import { GEOMETRY_METADATA_STRUCT } from "../../geometry/GEOMETRY_METADATA_STRUCT.js";
6
- import { MESHLET_METADATA_STRUCT } from "../../geometry/meshlet/encoding/MESHLET_METADATA_STRUCT.js";
7
- import { BVH2_NODE_STRUCT } from "../../shader/chunk/bvh/BVH2_NODE_STRUCT.js";
8
- import { BVH_TRAVERSAL_STACK_SIZE } from "../../shader/chunk/bvh/BVH_TRAVERSAL_STACK_SIZE.js";
9
- import { chunk_ray_query_blas_nearest } from "../../shader/chunk/geometry/ray/chunk_ray_query_blas_nearest.js";
10
- import { chunk_folded_workgroup_index } from "../../shader/chunk/grid/chunk_folded_workgroup_index.js";
11
- import { f32 } from "../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
12
- import { WATER_WAVES_TABLE as table } from "../medium/chunk_water_bodies.js";
13
- import { WATER_WAVE_BATCH_STRUCT } from "./shader_water_wave_batch.js";
14
-
15
- const resources = new ShaderResourceSetDescriptor();
16
- resources.createGroup().addUniform('batch', WATER_WAVE_BATCH_STRUCT)
17
- .addStorageBuffer('scene_database', WebGPUArray.u32)
18
- .addStorageBuffer('geometries', WebGPUArray.from(GEOMETRY_METADATA_STRUCT))
19
- .addStorageBuffer('blas_lookup', WebGPUArray.u32)
20
- .addStorageBuffer('blas_data', WebGPUArray.from(BVH2_NODE_STRUCT))
21
- .addStorageBuffer('meshlet_metadata', WebGPUArray.from(MESHLET_METADATA_STRUCT))
22
- .addStorageBuffer('meshlet_data', WebGPUArray.from(f32))
23
- .addStorageBuffer('domain', WebGPUArray.u32, true);
24
-
25
- /** Bake the authored footprint once per new wave row, using the existing geometry BLAS. */
26
- export const shader_water_wave_domain = ComputeShader.from({ label: 'Water / authored simulation domain', resources,
27
- body: CodeChunk.from(/* language=WGSL */ `
28
- @compute @workgroup_size(128)
29
- fn main(@builtin(workgroup_id) group: vec3u, @builtin(local_invocation_index) lane: u32) {
30
- let i = folded_workgroup_index(group) * 128u + lane;
31
- let n = batch.resolution;
32
- let row = i / (n * n);
33
- if (row >= batch.capacity) { return; }
34
- let params = ${table.marshalling_method_read}(&scene_database, row);
35
- if (params.node == 0u || params.node == ~0u) { domain[i] = 0u; return; }
36
- if (params.first_write == 0u && batch.apply_impulses == 0u) { return; }
37
- let geometry = geometries[params.geometry];
38
- let cell = vec2u(i % n, (i / n) % n);
39
- let xz = mix(params.extent.xy, params.extent.zw, vec2f(cell) / f32(n - 1u));
40
- let margin = max(1e-3, (geometry.bounding_box[4] - geometry.bounding_box[1]) * 1e-4);
41
- let top = geometry.bounding_box[4] + margin;
42
- var stack: array<u32, ${BVH_TRAVERSAL_STACK_SIZE}>;
43
- let hit = ray_query_blas_nearest(Ray(vec3f(xz.x, top, xz.y), vec3f(0.0, -1.0, 0.0),
44
- top - geometry.bounding_box[1] + margin), params.geometry, &stack, 0u);
45
- domain[i] = select(0u, 1u, hit.t >= 0.0);
46
- }
47
- `, [table.chunk_read, chunk_folded_workgroup_index, chunk_ray_query_blas_nearest]) });
48
-
49
- const bounds_resources = new ShaderResourceSetDescriptor();
50
- bounds_resources.createGroup().addUniform('batch', WATER_WAVE_BATCH_STRUCT)
51
- .addStorageBuffer('scene_database', WebGPUArray.u32, true)
52
- .addStorageBuffer('state', WebGPUArray.from(f32));
53
-
54
- /** Bilinear reconstruction cannot leave the extrema of its samples. Include the rest surface. */
55
- export const shader_water_wave_bounds = ComputeShader.from({ label: 'Water / displacement bounds', resources: bounds_resources,
56
- body: CodeChunk.from(/* language=WGSL */ `
57
- var<workgroup> lower: array<f32, 128>;
58
- var<workgroup> upper: array<f32, 128>;
59
- @compute @workgroup_size(128)
60
- fn main(@builtin(workgroup_id) group: vec3u, @builtin(local_invocation_index) lane: u32) {
61
- let row = folded_workgroup_index(group);
62
- if (row >= batch.capacity) { return; }
63
- let params = ${table.marshalling_method_read_rw}(&scene_database, row);
64
- let occupied = params.node != 0u && params.node != ~0u;
65
- let size = select(0u, batch.resolution * batch.resolution, occupied);
66
- var lo = 0.0;
67
- var hi = 0.0;
68
- for (var cell = lane; cell < size; cell += 128u) {
69
- let h = state[row * size + cell];
70
- lo = min(lo, h); hi = max(hi, h);
71
- }
72
- lower[lane] = lo; upper[lane] = hi;
73
- workgroupBarrier();
74
- for (var stride = 64u; stride != 0u; stride /= 2u) {
75
- if (lane < stride) {
76
- lower[lane] = min(lower[lane], lower[lane + stride]);
77
- upper[lane] = max(upper[lane], upper[lane + stride]);
78
- }
79
- workgroupBarrier();
80
- }
81
- if (lane == 0u && occupied) { ${table.marshalling_method_write_field('displacement_bounds')}(&scene_database, row, vec2f(lower[0], upper[0])); }
82
- }
83
- `, [table.chunk_read_rw, table.wgsl_gen_write_field_code('displacement_bounds'), chunk_folded_workgroup_index]) });