@woosh/meep-engine 3.41.0 → 3.42.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 (344) 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 +1 -1
  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/water_refraction/README.md +10 -11
  189. package/src/shade/playground/water_refraction/main.js +9 -8
  190. package/src/shade/playground/water_refraction/world.js +1 -1
  191. package/src/shade/playground/water_surface/README.md +43 -0
  192. package/src/shade/playground/water_surface/index.html +30 -0
  193. package/src/shade/playground/water_surface/main.d.ts +2 -0
  194. package/src/shade/playground/water_surface/main.d.ts.map +1 -0
  195. package/src/shade/playground/water_surface/main.js +154 -0
  196. package/src/shade/playground/water_surface/world.d.ts +44 -0
  197. package/src/shade/playground/water_surface/world.d.ts.map +1 -0
  198. package/src/shade/playground/water_surface/world.js +160 -0
  199. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts.map +1 -1
  200. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.js +5 -0
  201. package/src/shade/renderer/binding/BufferBinding.js +2 -2
  202. package/src/shade/renderer/buffer/table/GPUTypedTable.d.ts.map +1 -1
  203. package/src/shade/renderer/buffer/table/GPUTypedTable.js +5 -3
  204. package/src/shade/renderer/buffer/table/GPUTypedTableDescriptor.d.ts +10 -3
  205. package/src/shade/renderer/buffer/table/GPUTypedTableDescriptor.d.ts.map +1 -1
  206. package/src/shade/renderer/buffer/table/GPUTypedTableDescriptor.js +17 -9
  207. package/src/shade/renderer/camera/orbital/OrbitalCameraInput.d.ts +3 -0
  208. package/src/shade/renderer/camera/orbital/OrbitalCameraInput.d.ts.map +1 -1
  209. package/src/shade/renderer/camera/orbital/OrbitalCameraInput.js +16 -0
  210. package/src/shade/renderer/camera/orbital/OrbitalCameraRig.d.ts +2 -0
  211. package/src/shade/renderer/camera/orbital/OrbitalCameraRig.d.ts.map +1 -1
  212. package/src/shade/renderer/camera/orbital/OrbitalCameraRig.js +11 -0
  213. package/src/shade/renderer/geometry/meshlet/build/meshoptimizer/geometry_to_meshlets_meshoptimizer.d.ts +1 -1
  214. package/src/shade/renderer/geometry/meshlet/build/meshoptimizer/geometry_to_meshlets_meshoptimizer.d.ts.map +1 -1
  215. package/src/shade/renderer/geometry/meshlet/build/meshoptimizer/geometry_to_meshlets_meshoptimizer.js +9 -3
  216. package/src/shade/renderer/geometry/util/geometry_simplify_redundant_topology.d.ts.map +1 -1
  217. package/src/shade/renderer/geometry/util/geometry_simplify_redundant_topology.js +2 -2
  218. package/src/shade/renderer/geometry/virtual/format/vgeo_validate_container.d.ts.map +1 -1
  219. package/src/shade/renderer/geometry/virtual/format/vgeo_validate_container.js +85 -0
  220. package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.d.ts.map +1 -1
  221. package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.js +12 -6
  222. package/src/shade/renderer/geometry/virtual/runtime/VGeoPageFetcher.d.ts.map +1 -1
  223. package/src/shade/renderer/geometry/virtual/runtime/VGeoPageFetcher.js +7 -0
  224. package/src/shade/renderer/geometry/virtual/runtime/VGeoRuntimeTables.d.ts.map +1 -1
  225. package/src/shade/renderer/geometry/virtual/runtime/VGeoRuntimeTables.js +3 -1
  226. package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
  227. package/src/shade/renderer/scene/SCENE_DATABASE_SPEC.js +2 -1
  228. package/src/shade/renderer/shader/chunk/math/fft/chunk_fft128_inverse.d.ts +13 -0
  229. package/src/shade/renderer/shader/chunk/math/fft/chunk_fft128_inverse.d.ts.map +1 -0
  230. package/src/shade/renderer/shader/chunk/math/fft/chunk_fft128_inverse.js +42 -0
  231. package/src/shade/renderer/shader/chunk/math/fft/chunk_fft128x4_inverse_workgroup.d.ts +15 -0
  232. package/src/shade/renderer/shader/chunk/math/fft/chunk_fft128x4_inverse_workgroup.d.ts.map +1 -0
  233. package/src/shade/renderer/shader/chunk/math/fft/chunk_fft128x4_inverse_workgroup.js +39 -0
  234. package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.d.ts.map +1 -1
  235. package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.js +2 -0
  236. package/src/shade/renderer/water/GPUWaterRenderer.d.ts +15 -0
  237. package/src/shade/renderer/water/GPUWaterRenderer.d.ts.map +1 -1
  238. package/src/shade/renderer/water/GPUWaterRenderer.js +110 -30
  239. package/src/shade/renderer/water/medium/GPUWaterBodies.d.ts +16 -8
  240. package/src/shade/renderer/water/medium/GPUWaterBodies.d.ts.map +1 -1
  241. package/src/shade/renderer/water/medium/GPUWaterBodies.js +31 -26
  242. package/src/shade/renderer/water/medium/shader_water_meshlets.d.ts +0 -1
  243. package/src/shade/renderer/water/medium/shader_water_meshlets.d.ts.map +1 -1
  244. package/src/shade/renderer/water/medium/shader_water_meshlets.js +1 -39
  245. package/src/shade/renderer/water/shader_water.d.ts +0 -1
  246. package/src/shade/renderer/water/shader_water.d.ts.map +1 -1
  247. package/src/shade/renderer/water/shader_water.js +201 -72
  248. package/src/shade/renderer/water/surface/GPUWaterSurface.d.ts +70 -0
  249. package/src/shade/renderer/water/surface/GPUWaterSurface.d.ts.map +1 -0
  250. package/src/shade/renderer/water/surface/GPUWaterSurface.js +199 -0
  251. package/src/shade/renderer/water/surface/WATER_WAVE_RECORD_STRUCT.d.ts +5 -2
  252. package/src/shade/renderer/water/surface/WATER_WAVE_RECORD_STRUCT.d.ts.map +1 -1
  253. package/src/shade/renderer/water/surface/WATER_WAVE_RECORD_STRUCT.js +32 -12
  254. package/src/shade/renderer/water/surface/chunk_water_surface_sample.d.ts +22 -0
  255. package/src/shade/renderer/water/surface/chunk_water_surface_sample.d.ts.map +1 -0
  256. package/src/shade/renderer/water/surface/chunk_water_surface_sample.js +217 -0
  257. package/src/shade/renderer/water/surface/graph_water_tessellation.d.ts +65 -11
  258. package/src/shade/renderer/water/surface/graph_water_tessellation.d.ts.map +1 -1
  259. package/src/shade/renderer/water/surface/graph_water_tessellation.js +163 -28
  260. package/src/shade/renderer/water/surface/lod/WATER_LOD.d.ts +51 -0
  261. package/src/shade/renderer/water/surface/lod/WATER_LOD.d.ts.map +1 -0
  262. package/src/shade/renderer/water/surface/lod/WATER_LOD.js +95 -0
  263. package/src/shade/renderer/water/surface/lod/chunk_water_lod.d.ts +10 -0
  264. package/src/shade/renderer/water/surface/lod/chunk_water_lod.d.ts.map +1 -0
  265. package/src/shade/renderer/water/surface/lod/chunk_water_lod.js +127 -0
  266. package/src/shade/renderer/water/surface/lod/chunk_water_lod_cell.d.ts +17 -0
  267. package/src/shade/renderer/water/surface/lod/chunk_water_lod_cell.d.ts.map +1 -0
  268. package/src/shade/renderer/water/surface/lod/chunk_water_lod_cell.js +246 -0
  269. package/src/shade/renderer/water/surface/lod/shader_water_lod.d.ts +118 -0
  270. package/src/shade/renderer/water/surface/lod/shader_water_lod.d.ts.map +1 -0
  271. package/src/shade/renderer/water/surface/lod/shader_water_lod.js +727 -0
  272. package/src/shade/renderer/water/surface/particles/GPUWaterParticles.d.ts +60 -0
  273. package/src/shade/renderer/water/surface/particles/GPUWaterParticles.d.ts.map +1 -0
  274. package/src/shade/renderer/water/surface/particles/GPUWaterParticles.js +228 -0
  275. package/src/shade/renderer/water/surface/particles/WATER_PARTICLE_STRUCT.d.ts +17 -0
  276. package/src/shade/renderer/water/surface/particles/WATER_PARTICLE_STRUCT.d.ts.map +1 -0
  277. package/src/shade/renderer/water/surface/particles/WATER_PARTICLE_STRUCT.js +49 -0
  278. package/src/shade/renderer/water/surface/particles/chunk_water_particle.d.ts +22 -0
  279. package/src/shade/renderer/water/surface/particles/chunk_water_particle.d.ts.map +1 -0
  280. package/src/shade/renderer/water/surface/particles/chunk_water_particle.js +143 -0
  281. package/src/shade/renderer/water/surface/particles/chunk_water_particle_step.d.ts +15 -0
  282. package/src/shade/renderer/water/surface/particles/chunk_water_particle_step.d.ts.map +1 -0
  283. package/src/shade/renderer/water/surface/particles/chunk_water_particle_step.js +121 -0
  284. package/src/shade/renderer/water/surface/particles/shader_water_particles.d.ts +83 -0
  285. package/src/shade/renderer/water/surface/particles/shader_water_particles.d.ts.map +1 -0
  286. package/src/shade/renderer/water/surface/particles/shader_water_particles.js +502 -0
  287. package/src/shade/renderer/water/surface/shader_water_cull.d.ts +42 -0
  288. package/src/shade/renderer/water/surface/shader_water_cull.d.ts.map +1 -0
  289. package/src/shade/renderer/water/surface/shader_water_cull.js +269 -0
  290. package/src/shade/renderer/water/surface/shader_water_waves_combine.d.ts +15 -0
  291. package/src/shade/renderer/water/surface/shader_water_waves_combine.d.ts.map +1 -0
  292. package/src/shade/renderer/water/surface/shader_water_waves_combine.js +73 -0
  293. package/src/shade/renderer/water/surface/shader_water_waves_derive.d.ts +11 -0
  294. package/src/shade/renderer/water/surface/shader_water_waves_derive.d.ts.map +1 -0
  295. package/src/shade/renderer/water/surface/shader_water_waves_derive.js +78 -0
  296. package/src/shade/renderer/water/surface/spectrum/GPUWaterSpectrum.d.ts +35 -0
  297. package/src/shade/renderer/water/surface/spectrum/GPUWaterSpectrum.d.ts.map +1 -0
  298. package/src/shade/renderer/water/surface/spectrum/GPUWaterSpectrum.js +103 -0
  299. package/src/shade/renderer/water/surface/spectrum/WATER_BAND_STATE.d.ts +22 -0
  300. package/src/shade/renderer/water/surface/spectrum/WATER_BAND_STATE.d.ts.map +1 -0
  301. package/src/shade/renderer/water/surface/spectrum/WATER_BAND_STATE.js +57 -0
  302. package/src/shade/renderer/water/surface/spectrum/WATER_SPECTRUM.d.ts +22 -0
  303. package/src/shade/renderer/water/surface/spectrum/WATER_SPECTRUM.d.ts.map +1 -0
  304. package/src/shade/renderer/water/surface/spectrum/WATER_SPECTRUM.js +25 -0
  305. package/src/shade/renderer/water/surface/spectrum/chunk_water_jonswap.d.ts +14 -0
  306. package/src/shade/renderer/water/surface/spectrum/chunk_water_jonswap.d.ts.map +1 -0
  307. package/src/shade/renderer/water/surface/spectrum/chunk_water_jonswap.js +48 -0
  308. package/src/shade/renderer/water/surface/spectrum/chunk_water_spectrum.d.ts +23 -0
  309. package/src/shade/renderer/water/surface/spectrum/chunk_water_spectrum.d.ts.map +1 -0
  310. package/src/shade/renderer/water/surface/spectrum/chunk_water_spectrum.js +169 -0
  311. package/src/shade/renderer/water/surface/spectrum/shader_water_spectrum.d.ts +26 -0
  312. package/src/shade/renderer/water/surface/spectrum/shader_water_spectrum.d.ts.map +1 -0
  313. package/src/shade/renderer/water/surface/spectrum/shader_water_spectrum.js +161 -0
  314. package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.d.ts.map +1 -1
  315. package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js +18 -6
  316. package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts.map +1 -1
  317. package/src/shade/wgsl/emulator/WGSLLanguageCore.js +11 -3
  318. package/src/core/geom/2d/polygon/polygon2_triangulate.corpus.d.ts +0 -28
  319. package/src/core/geom/2d/polygon/polygon2_triangulate.corpus.d.ts.map +0 -1
  320. package/src/core/geom/2d/polygon/polygon2_triangulate.corpus.js +0 -86
  321. package/src/engine/ecs/storage/binary/object-v2/serializerTestHarness.d.ts +0 -29
  322. package/src/engine/ecs/storage/binary/object-v2/serializerTestHarness.d.ts.map +0 -1
  323. package/src/engine/ecs/storage/binary/object-v2/serializerTestHarness.js +0 -44
  324. package/src/shade/renderer/water/medium/shader_water_bodies_derive.d.ts +0 -4
  325. package/src/shade/renderer/water/medium/shader_water_bodies_derive.d.ts.map +0 -1
  326. package/src/shade/renderer/water/medium/shader_water_bodies_derive.js +0 -32
  327. package/src/shade/renderer/water/surface/GPUWaterWaveSimulation.d.ts +0 -25
  328. package/src/shade/renderer/water/surface/GPUWaterWaveSimulation.d.ts.map +0 -1
  329. package/src/shade/renderer/water/surface/GPUWaterWaveSimulation.js +0 -128
  330. package/src/shade/renderer/water/surface/chunk_water_tessellation.d.ts +0 -9
  331. package/src/shade/renderer/water/surface/chunk_water_tessellation.d.ts.map +0 -1
  332. package/src/shade/renderer/water/surface/chunk_water_tessellation.js +0 -144
  333. package/src/shade/renderer/water/surface/chunk_water_wave.d.ts +0 -13
  334. package/src/shade/renderer/water/surface/chunk_water_wave.d.ts.map +0 -1
  335. package/src/shade/renderer/water/surface/chunk_water_wave.js +0 -40
  336. package/src/shade/renderer/water/surface/shader_water_tiles.d.ts +0 -4
  337. package/src/shade/renderer/water/surface/shader_water_tiles.d.ts.map +0 -1
  338. package/src/shade/renderer/water/surface/shader_water_tiles.js +0 -123
  339. package/src/shade/renderer/water/surface/shader_water_wave_batch.d.ts +0 -6
  340. package/src/shade/renderer/water/surface/shader_water_wave_batch.d.ts.map +0 -1
  341. package/src/shade/renderer/water/surface/shader_water_wave_batch.js +0 -85
  342. package/src/shade/renderer/water/surface/shader_water_wave_domain.d.ts +0 -6
  343. package/src/shade/renderer/water/surface/shader_water_wave_domain.d.ts.map +0 -1
  344. package/src/shade/renderer/water/surface/shader_water_wave_domain.js +0 -83
@@ -1265,17 +1265,25 @@ export const WGSLLanguageCore = {
1265
1265
  * silently dropped (WGSL semantics). `coords` length matches the
1266
1266
  * texture dimensionality.
1267
1267
  *
1268
+ * Four arguments is the `texture_storage_2d_array` form — `(t, coords, array_index, value)` —
1269
+ * where the third argument selects the slice, stored along z as the sampling side reads it.
1270
+ *
1268
1271
  * @param {import("./CPUBitmapData.js").CPUBitmapData} t
1269
1272
  * @param {Int32Array | Uint32Array | number[] | number} coords
1270
- * @param {Float32Array | Int32Array | Uint32Array | number[]} value
1273
+ * @param {Float32Array | Int32Array | Uint32Array | number[] | number} value_or_index
1274
+ * @param {Float32Array | Int32Array | Uint32Array | number[]} [array_value]
1271
1275
  */
1272
- textureStore(t, coords, value) {
1276
+ textureStore(t, coords, value_or_index, array_value = undefined) {
1273
1277
  assert.defined(t, 'texture');
1278
+ if (array_value !== undefined) {
1279
+ t.write(coords[0] | 0, coords[1] | 0, value_or_index | 0, array_value);
1280
+ return;
1281
+ }
1274
1282
  const dim = t.dimensionality;
1275
1283
  const x = (dim >= 1 ? (typeof coords === 'number' ? coords : coords[0]) : 0) | 0;
1276
1284
  const y = (dim >= 2 ? coords[1] : 0) | 0;
1277
1285
  const z = (dim >= 3 ? coords[2] : 0) | 0;
1278
- t.write(x, y, z, value);
1286
+ t.write(x, y, z, value_or_index);
1279
1287
  },
1280
1288
 
1281
1289
  // CPUBitmapData models one stored mip level.
@@ -1,28 +0,0 @@
1
- /**
2
- * Inputs that have actually broken {@link polygon2_triangulate}, kept so they can
3
- * never break it again.
4
- *
5
- * This file only ever grows, and only from real failures -- a case someone
6
- * *imagines* might be hard belongs in the ordinary spec, not here. Every entry
7
- * records what went wrong when it was added, because that is the part that stops
8
- * a future change from quietly reintroducing the same class of bug. The practice
9
- * is borrowed from manifold, whose triangulator carries ~3 MB of recorded failing
10
- * polygons replayed as tests.
11
- *
12
- * `expect_full` says whether the polygon is well-formed enough that the whole of
13
- * its area must be covered. `false` means the input is genuinely invalid
14
- * (self-intersecting) and the only requirements are the universal ones: no throw,
15
- * no hang, no out-of-range index.
16
- *
17
- * @author Alex Goldring
18
- * @copyright Company Named Limited (c) 2026
19
- */
20
- export const POLYGON2_TRIANGULATE_CORPUS: {
21
- name: string;
22
- why: string;
23
- points: number[];
24
- contour_ends: number[];
25
- contour_count: number;
26
- expect_full: boolean;
27
- }[];
28
- //# sourceMappingURL=polygon2_triangulate.corpus.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"polygon2_triangulate.corpus.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/2d/polygon/polygon2_triangulate.corpus.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH;;;;;;;IAkEE"}
@@ -1,86 +0,0 @@
1
- /**
2
- * Inputs that have actually broken {@link polygon2_triangulate}, kept so they can
3
- * never break it again.
4
- *
5
- * This file only ever grows, and only from real failures -- a case someone
6
- * *imagines* might be hard belongs in the ordinary spec, not here. Every entry
7
- * records what went wrong when it was added, because that is the part that stops
8
- * a future change from quietly reintroducing the same class of bug. The practice
9
- * is borrowed from manifold, whose triangulator carries ~3 MB of recorded failing
10
- * polygons replayed as tests.
11
- *
12
- * `expect_full` says whether the polygon is well-formed enough that the whole of
13
- * its area must be covered. `false` means the input is genuinely invalid
14
- * (self-intersecting) and the only requirements are the universal ones: no throw,
15
- * no hang, no out-of-range index.
16
- *
17
- * @author Alex Goldring
18
- * @copyright Company Named Limited (c) 2026
19
- */
20
- export const POLYGON2_TRIANGULATE_CORPUS = [
21
- {
22
- name: "unit-offset micro square",
23
- why: "Winding was decided by the shoelace sum, whose sign here is pure "
24
- + "rounding noise: the true area is 1e-18 against ~1e-16 per-term error. "
25
- + "The ring came out backwards, every corner looked reflex, and the "
26
- + "result was zero triangles. Fixed by deciding winding with one exact "
27
- + "orientation predicate at a hull vertex (polygon2_is_counter_clockwise).",
28
- points: [
29
- 1, 1,
30
- 1 + 1e-9, 1,
31
- 1 + 1e-9, 1 + 1e-9,
32
- 1, 1 + 1e-9,
33
- ],
34
- contour_ends: [4],
35
- contour_count: 1,
36
- expect_full: true,
37
- },
38
- {
39
- name: "coarse-grid point soup (fuzz seed 24)",
40
- why: "Twenty points on a 7x7 integer grid, with duplicates and collinear "
41
- + "runs. The ear search exhausted itself, fell through to the "
42
- + "cure-local-intersections pass, and that pass walked the "
43
- + "collapsed-ring sentinel as if it were a node -- an infinite loop. "
44
- + "Fixed by making the recovery pass accept and propagate the sentinel, "
45
- + "and by stopping it once the ring holds fewer than three nodes.",
46
- points: [
47
- 2, 3, 3, 6, 1, 5, 0, 4, 5, 0,
48
- 4, 2, 3, 3, 3, 6, 2, 3, 6, 1,
49
- 4, 4, 2, 6, 3, 2, 6, 4, 1, 1,
50
- 3, 0, 5, 0, 3, 2, 6, 4, 3, 3,
51
- ],
52
- contour_ends: [20],
53
- contour_count: 1,
54
- expect_full: false,
55
- },
56
- {
57
- name: "two rectangular holes bridged through a shared edge",
58
- why: "Produced 12 triangles where the Euler bound allows 14, which looked "
59
- + "like dropped geometry. It was not: the bridges left collinear corners "
60
- + "that were correctly absorbed rather than emitted as zero-area "
61
- + "triangles. Kept as the standing reminder that V + 2H - 2 is an upper "
62
- + "bound, not an equality -- area conservation is the real invariant.",
63
- points: [
64
- 0, 0, 20, 0, 20, 10, 0, 10,
65
- 2, 8, 6, 8, 6, 2, 2, 2,
66
- 12, 8, 18, 8, 18, 2, 12, 2,
67
- ],
68
- contour_ends: [4, 8, 12],
69
- contour_count: 3,
70
- expect_full: true,
71
- },
72
- {
73
- name: "hole touching the outer boundary at a vertex",
74
- why: "Same class as above -- 6 triangles against a bound of 7. The hole's "
75
- + "corner lands exactly on the outer edge, so the bridge is degenerate "
76
- + "and one corner becomes collinear. Area is still exact and every input "
77
- + "vertex is still used.",
78
- points: [
79
- 0, 0, 10, 0, 10, 10, 0, 10,
80
- 4, 7, 4, 3, 0, 5,
81
- ],
82
- contour_ends: [4, 7],
83
- contour_count: 2,
84
- expect_full: true,
85
- },
86
- ];
@@ -1,29 +0,0 @@
1
- /**
2
- * Serialize `value` with a serializer built on `registry`, then deserialize it with a deserializer built on
3
- * `registry` + `modules`. Shared by the object-graph specs.
4
- *
5
- * @template T
6
- * @param {T} value
7
- * @param {{registry?: BinarySerializationRegistry, modules?: ModuleRegistry}} [options]
8
- * @returns {T}
9
- */
10
- export function roundTrip<T>(value: T, { registry, modules }?: {
11
- registry?: BinarySerializationRegistry;
12
- modules?: ModuleRegistry<any>;
13
- }): T;
14
- /**
15
- * @param {*} value
16
- * @param {BinarySerializationRegistry} [registry]
17
- * @returns {BinaryBuffer} rewound to position 0
18
- */
19
- export function serialize(value: any, registry?: BinarySerializationRegistry): BinaryBuffer;
20
- /**
21
- * @param {*} value
22
- * @param {BinarySerializationRegistry} [registry]
23
- * @returns {number} byte length of the serialized form
24
- */
25
- export function serializedSize(value: any, registry?: BinarySerializationRegistry): number;
26
- import { BinarySerializationRegistry } from "../BinarySerializationRegistry.js";
27
- import { ModuleRegistry } from "../../../../../core/model/ModuleRegistry.js";
28
- import { BinaryBuffer } from "../../../../../core/binary/BinaryBuffer.js";
29
- //# sourceMappingURL=serializerTestHarness.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"serializerTestHarness.d.ts","sourceRoot":"","sources":["../../../../../../../src/engine/ecs/storage/binary/object-v2/serializerTestHarness.js"],"names":[],"mappings":"AAMA;;;;;;;;GAQG;AACH,+DAHW;IAAC,QAAQ,CAAC,EAAE,2BAA2B,CAAC;IAAC,OAAO,CAAC,sBAAgB;CAAC,KAS5E;AAED;;;;GAIG;AACH,iDAHW,2BAA2B,GACzB,YAAY,CAQxB;AAED;;;;GAIG;AACH,sDAHW,2BAA2B,GACzB,MAAM,CAIlB;4CAzC2C,mCAAmC;+BADhD,6CAA6C;6BAD/C,4CAA4C"}
@@ -1,44 +0,0 @@
1
- import { BinaryBuffer } from "../../../../../core/binary/BinaryBuffer.js";
2
- import { ModuleRegistry } from "../../../../../core/model/ModuleRegistry.js";
3
- import { BinarySerializationRegistry } from "../BinarySerializationRegistry.js";
4
- import { BinaryObjectDeSerializer } from "./BinaryObjectDeSerializer.js";
5
- import { BinaryObjectSerializer } from "./BinaryObjectSerializer.js";
6
-
7
- /**
8
- * Serialize `value` with a serializer built on `registry`, then deserialize it with a deserializer built on
9
- * `registry` + `modules`. Shared by the object-graph specs.
10
- *
11
- * @template T
12
- * @param {T} value
13
- * @param {{registry?: BinarySerializationRegistry, modules?: ModuleRegistry}} [options]
14
- * @returns {T}
15
- */
16
- export function roundTrip(value, { registry = new BinarySerializationRegistry(), modules = new ModuleRegistry() } = {}) {
17
- const buffer = serialize(value, registry);
18
-
19
- buffer.position = 0;
20
-
21
- return new BinaryObjectDeSerializer(registry, modules).deserialize(buffer);
22
- }
23
-
24
- /**
25
- * @param {*} value
26
- * @param {BinarySerializationRegistry} [registry]
27
- * @returns {BinaryBuffer} rewound to position 0
28
- */
29
- export function serialize(value, registry = new BinarySerializationRegistry()) {
30
- const buffer = new BinaryBuffer();
31
-
32
- new BinaryObjectSerializer(registry).serialize(buffer, value);
33
-
34
- return buffer;
35
- }
36
-
37
- /**
38
- * @param {*} value
39
- * @param {BinarySerializationRegistry} [registry]
40
- * @returns {number} byte length of the serialized form
41
- */
42
- export function serializedSize(value, registry = new BinarySerializationRegistry()) {
43
- return serialize(value, registry).position;
44
- }
@@ -1,4 +0,0 @@
1
- export const WORKGROUP_SIZE: 64;
2
- export const shader_water_bodies_derive: ComputeShader;
3
- import { ComputeShader } from "../../shader/ComputeShader.js";
4
- //# sourceMappingURL=shader_water_bodies_derive.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"shader_water_bodies_derive.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/water/medium/shader_water_bodies_derive.js"],"names":[],"mappings":"AASA,gCAAiC;AAIjC,uDAkBG;8BA/B2B,+BAA+B"}
@@ -1,32 +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 { chunk_water_medium_derived } from "./chunk_water_medium_derived.js";
6
- import { chunk_water_medium_scattering } from "./chunk_water_medium_scattering.js";
7
- import { WATER_BODIES_TABLE as table } from "./chunk_water_bodies.js";
8
- import { chunk_folded_workgroup_index } from "../../shader/chunk/grid/chunk_folded_workgroup_index.js";
9
-
10
- export const WORKGROUP_SIZE = 64;
11
- const pg = table.page_iterator_symbol_prefix(WORKGROUP_SIZE, true);
12
- const resources = new ShaderResourceSetDescriptor();
13
- resources.createGroup().addStorageBuffer('scene_database', WebGPUArray.u32, true);
14
- export const shader_water_bodies_derive = ComputeShader.from({
15
- label: "Water / bodies derive", resources,
16
- body: CodeChunk.from(/* language=WGSL */ `
17
- @compute @workgroup_size(${WORKGROUP_SIZE})
18
- fn main(@builtin(workgroup_id) group: vec3u, @builtin(local_invocation_index) lane: u32) {
19
- if (!${pg}_setup(&scene_database, folded_workgroup_index(group), lane)) { return; }
20
- let slot = ${pg}_slot_in_page(lane);
21
- if (slot >= ${pg}_ELEMENTS_PER_PAGE || !${pg}_is_occupied(slot)) { return; }
22
- var body = ${pg}_read(&scene_database, slot);
23
- if (body.dirty == 0u) { return; }
24
- body.backscattering = vec4f(water_medium_backscattering(body.medium), 0.0);
25
- body.extinction = vec4f(body.medium.absorption + water_medium_scattering(body.medium), 0.0);
26
- body.diffuse_transmittance = water_diffuse_fresnel_transmittance(body.ior);
27
- body.dirty = 0u;
28
- ${table.marshalling_method_write}(&scene_database, ${pg}_slot_to_index(slot), body);
29
- }
30
- `, [table.chunk_iterate(WORKGROUP_SIZE, true), table.chunk_write, chunk_water_medium_derived,
31
- chunk_water_medium_scattering, chunk_folded_workgroup_index]),
32
- });
@@ -1,25 +0,0 @@
1
- /**
2
- * A shared wave atlas, indexed by occupied water_waves rows. Calm bodies allocate no grid.
3
- * Each fixed step dispatches the whole atlas once; tessellated vertices sample it in local xz.
4
- * The regular grid is a displacement field, never the rendered water footprint.
5
- */
6
- export class GPUWaterWaveSimulation {
7
- onInputsConsumed: Signal;
8
- resolution: number;
9
- step: number;
10
- max_steps_per_frame: number;
11
- damping: number;
12
- get time(): number;
13
- get buffer(): any;
14
- get grid_resolution(): number;
15
- advance(dt: any): void;
16
- dispose(): void;
17
- record({ graph, device, scene }: {
18
- graph: any;
19
- device: any;
20
- scene: any;
21
- }): void;
22
- #private;
23
- }
24
- import Signal from "../../../../core/events/signal/Signal.js";
25
- //# sourceMappingURL=GPUWaterWaveSimulation.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"GPUWaterWaveSimulation.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/water/surface/GPUWaterWaveSimulation.js"],"names":[],"mappings":"AAKA;;;;GAIG;AACH;IACI,yBAAgC;IAChC,mBAAiB;IACjB,aAAe;IACf,4BAAwB;IACxB,gBAAe;IAYf,mBAAiC;IACjC,kBAAkD;IAClD,8BAAqE;IAErE,uBAIC;IAED,gBAMC;IAED;;;;aAiFC;;CACJ;mBA/HkB,0CAA0C"}
@@ -1,128 +0,0 @@
1
- import Signal from "../../../../core/events/signal/Signal.js";
2
- import { assert } from "../../../../core/assert.js";
3
- import { WATER_WAVE_BATCH_STRUCT, shader_water_wave_batch, shader_water_wave_batch_finish } from "./shader_water_wave_batch.js";
4
- import { shader_water_wave_bounds, shader_water_wave_domain } from "./shader_water_wave_domain.js";
5
-
6
- /**
7
- * A shared wave atlas, indexed by occupied water_waves rows. Calm bodies allocate no grid.
8
- * Each fixed step dispatches the whole atlas once; tessellated vertices sample it in local xz.
9
- * The regular grid is a displacement field, never the rendered water footprint.
10
- */
11
- export class GPUWaterWaveSimulation {
12
- onInputsConsumed = new Signal();
13
- resolution = 128;
14
- step = 1 / 120;
15
- max_steps_per_frame = 8;
16
- damping = 0.08;
17
- #device = null;
18
- #scene = null;
19
- #state = [];
20
- #domain = null;
21
- #capacity = 0;
22
- #resolution = 0;
23
- #parity = 0;
24
- #pending = 0;
25
- #time = 0;
26
- #recorded = new WeakSet();
27
- #write_pending = true;
28
- get time() { return this.#time; }
29
- get buffer() { return this.#state[this.#parity]; }
30
- get grid_resolution() { return this.#resolution || this.resolution; }
31
-
32
- advance(dt) {
33
- assert.isFinite(dt, 'dt'); assert.greaterThanOrEqual(dt, 0, 'dt');
34
- this.#pending += dt;
35
- this.#write_pending = true;
36
- }
37
-
38
- dispose() {
39
- for (const buffer of this.#state) { buffer.destroy(); }
40
- this.#domain?.destroy(); this.#domain = null;
41
- this.#state = []; this.#capacity = 0; this.#device = null; this.#scene = null;
42
- this.#recorded = new WeakSet();
43
- this.#write_pending = true;
44
- }
45
-
46
- record({ graph, device, scene }) {
47
- if (this.#recorded.has(graph)) { return; }
48
- if (device !== this.#device || scene !== this.#scene) {
49
- this.dispose(); this.#device = device; this.#scene = scene;
50
- }
51
- this.#recorded.add(graph);
52
- if (!this.#write_pending) { return; }
53
- this.#write_pending = false;
54
- const table = scene.scene_database.get('water_waves');
55
- const capacity = table.count === 0 ? 0 : table.element_capacity;
56
- assert.isInteger(this.resolution, 'resolution'); assert.greaterThanOrEqual(this.resolution, 2, 'resolution');
57
- assert.greaterThan(this.step, 0, 'step');
58
- const resize = capacity > this.#capacity || (capacity === 0 && this.#capacity !== 0) || this.resolution !== this.#resolution;
59
- const old = this.#state;
60
- const old_domain = this.#domain;
61
- if (resize || old.length === 0) {
62
- const size = Math.max(4, capacity * this.resolution ** 2 * 4);
63
- assert.lessThanOrEqual(size, device.limits.maxStorageBufferBindingSize, 'Water wave atlas exceeds device storage limit; lower waves.resolution');
64
- this.#state = [0, 1].map(i => device.createBuffer({ label: `Water / wave state ${i}`, size,
65
- usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST }));
66
- this.#domain = device.createBuffer({ label: 'Water / authored footprint', size,
67
- usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST });
68
- this.#capacity = capacity;
69
- }
70
- const same_resolution = this.#resolution === this.resolution;
71
- this.#resolution = this.resolution;
72
- const steps = Math.min(Math.floor(this.#pending / this.step + 1e-6), this.max_steps_per_frame);
73
- this.#pending = Math.max(0, Math.min(this.#pending - steps * this.step, this.step));
74
- const start = this.#parity, time = this.#time, state = this.#state, domain = this.#domain;
75
- this.#parity = (start + steps) % 2;
76
- this.#time += steps * this.step;
77
- const n = this.#resolution, dt = this.step, damping = this.damping;
78
- const pass = graph.add('Water / batched surface update', {}, (_d, _r, { encoder }) => {
79
- if (state !== old) {
80
- if (same_resolution && old.length !== 0) {
81
- for (let i = 0; i < 2; i++) { encoder.copyBufferToBuffer(old[i], 0, state[i], 0, Math.min(old[i].size, state[i].size)); }
82
- encoder.copyBufferToBuffer(old_domain, 0, domain, 0, Math.min(old_domain.size, domain.size));
83
- }
84
- encoder.done.then(() => { for (const buffer of old) { buffer.destroy(); } old_domain?.destroy(); });
85
- }
86
- if (capacity === 0) { return; }
87
- const groups = Math.ceil(capacity * n * n / 128);
88
- shader_water_wave_domain.dispatch({ encoder, bindings: {
89
- batch: encoder.allocateTransientValueBuffer(WATER_WAVE_BATCH_STRUCT,
90
- { resolution: n, capacity, apply_impulses: same_resolution ? 0 : 1 }),
91
- scene_database: scene.scene_database_buffer, domain,
92
- geometries: scene.geometries.buffer_metadata,
93
- blas_lookup: scene.geometries.blas.buffer_metadata, blas_data: scene.geometries.blas.buffer_data,
94
- meshlet_metadata: scene.geometries.meshlets.buffer_metadata, meshlet_data: scene.geometries.meshlets.buffer_data,
95
- }, group_count_x: Math.min(groups, 65535), group_count_y: Math.ceil(groups / 65535) });
96
- const dispatch = (parity, step_dt, step_time, apply_impulses) => {
97
- shader_water_wave_batch.dispatch({ encoder, bindings: {
98
- batch: encoder.allocateTransientValueBuffer(WATER_WAVE_BATCH_STRUCT,
99
- { resolution: n, capacity, dt: step_dt, time: step_time, damping, apply_impulses }),
100
- scene_database: scene.scene_database_buffer, domain, state_current: state[parity], state_previous: state[1 - parity],
101
- }, group_count_x: Math.min(groups, 65535), group_count_y: Math.ceil(groups / 65535) });
102
- };
103
- // Clear both histories of new/reused slots before advancing, then release the reset flag.
104
- dispatch(0, 0, time, 0); dispatch(1, 0, time, 0);
105
- const finish = apply_impulses => {
106
- const groups = table.dispatch_group_count(64);
107
- shader_water_wave_batch_finish.dispatch({ encoder, bindings: { scene_database: scene.scene_database_buffer,
108
- batch: encoder.allocateTransientValueBuffer(WATER_WAVE_BATCH_STRUCT,
109
- { resolution: n, capacity, dt, time, damping, apply_impulses }) },
110
- group_count_x: Math.min(groups, 65535), group_count_y: Math.ceil(groups / 65535) });
111
- };
112
- finish(0);
113
- for (let i = 0; i < steps; i++) { dispatch((start + i) % 2, dt, time + i * dt, i === 0 ? 1 : 0); }
114
- if (steps > 0) {
115
- finish(1);
116
- // Submit is the ownership boundary for staged CPU inputs. Use the encoder's
117
- // existing synchronous signal so a later scene/update cannot be cleared by
118
- // an old promise callback.
119
- encoder.onFinished.addOne(() => this.onInputsConsumed.dispatch(scene));
120
- }
121
- shader_water_wave_bounds.dispatch({ encoder, bindings: {
122
- batch: encoder.allocateTransientValueBuffer(WATER_WAVE_BATCH_STRUCT, { resolution: n, capacity }),
123
- scene_database: scene.scene_database_buffer, state: state[(start + steps) % 2],
124
- }, group_count_x: Math.min(capacity, 65535), group_count_y: Math.ceil(capacity / 65535) });
125
- });
126
- pass.make_side_effect();
127
- }
128
- }
@@ -1,9 +0,0 @@
1
- export const WATER_TILE_CELLS: 16;
2
- export const WATER_TILE_VERTEX_COUNT: number;
3
- export const WATER_TILE_STRUCT: WebGPUStruct;
4
- export const WATER_TESSELLATION_STRUCT: WebGPUStruct;
5
- /** Clip in barycentric space: every generated point remains on the authored triangle. */
6
- export const chunk_water_tessellation: CodeChunk;
7
- import { WebGPUStruct } from "../../shader/type/WebGPUStruct.js";
8
- import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
9
- //# sourceMappingURL=chunk_water_tessellation.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"chunk_water_tessellation.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/water/surface/chunk_water_tessellation.js"],"names":[],"mappings":"AAKA,kCAAmC;AAEnC,6CAAkE;AAClE,6CAEuB;AACvB,qDAE+B;AAE/B,yFAAyF;AACzF,iDA+H8B;6BA9ID,mCAAmC;0BADtC,oCAAoC"}
@@ -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
- `);