@woosh/meep-engine 3.40.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 (539) 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/quaternion/swing_twist_clamp.d.ts +24 -0
  63. package/src/core/geom/3d/quaternion/swing_twist_clamp.d.ts.map +1 -0
  64. package/src/core/geom/3d/quaternion/swing_twist_clamp.js +62 -0
  65. package/src/core/geom/3d/quaternion/swing_twist_compose.d.ts +15 -0
  66. package/src/core/geom/3d/quaternion/swing_twist_compose.d.ts.map +1 -0
  67. package/src/core/geom/3d/quaternion/swing_twist_compose.js +36 -0
  68. package/src/core/geom/3d/quaternion/swing_twist_error.d.ts +39 -0
  69. package/src/core/geom/3d/quaternion/swing_twist_error.d.ts.map +1 -0
  70. package/src/core/geom/3d/quaternion/swing_twist_error.js +85 -0
  71. package/src/core/geom/3d/triangle/tri3_ray_intersection.d.ts +20 -0
  72. package/src/core/geom/3d/triangle/tri3_ray_intersection.d.ts.map +1 -1
  73. package/src/core/geom/3d/triangle/tri3_ray_intersection.js +182 -0
  74. package/src/core/geom/vec3/v3_rigid_align_paired_unit_vectors.d.ts +11 -6
  75. package/src/core/geom/vec3/v3_rigid_align_paired_unit_vectors.d.ts.map +1 -1
  76. package/src/core/geom/vec3/v3_rigid_align_paired_unit_vectors.js +27 -13
  77. package/src/core/math/linalg/eigen/matrix_symmetric_4x4_eigen.d.ts +25 -0
  78. package/src/core/math/linalg/eigen/matrix_symmetric_4x4_eigen.d.ts.map +1 -0
  79. package/src/core/math/linalg/eigen/matrix_symmetric_4x4_eigen.js +166 -0
  80. package/src/core/math/linalg/eigen/matrix_top_eigenvector_power_iteration.d.ts +5 -3
  81. package/src/core/math/linalg/eigen/matrix_top_eigenvector_power_iteration.d.ts.map +1 -1
  82. package/src/core/math/linalg/eigen/matrix_top_eigenvector_power_iteration.js +5 -3
  83. package/src/core/math/noise/curl_noise_3dt.d.ts.map +1 -1
  84. package/src/core/math/noise/curl_noise_3dt.js +20 -10
  85. package/src/core/math/noise/sdnoise.d.ts +16 -5
  86. package/src/core/math/noise/sdnoise.d.ts.map +1 -1
  87. package/src/core/math/noise/sdnoise.js +43 -9
  88. package/src/core/math/spline/spline3_hermite_nearest_point.d.ts +16 -1
  89. package/src/core/math/spline/spline3_hermite_nearest_point.d.ts.map +1 -1
  90. package/src/core/math/spline/spline3_hermite_nearest_point.js +44 -3
  91. package/src/engine/Engine.d.ts.map +1 -1
  92. package/src/engine/Engine.js +6 -2
  93. package/src/engine/animation/curve/AnimationCurve.d.ts +3 -0
  94. package/src/engine/animation/curve/AnimationCurve.d.ts.map +1 -1
  95. package/src/engine/animation/curve/AnimationCurve.js +6 -1
  96. package/src/engine/control/first-person/FirstPersonPlayerController.d.ts +9 -0
  97. package/src/engine/control/first-person/FirstPersonPlayerController.d.ts.map +1 -1
  98. package/src/engine/control/first-person/FirstPersonPlayerControllerConfig.d.ts +26 -0
  99. package/src/engine/control/first-person/FirstPersonPlayerControllerConfig.d.ts.map +1 -1
  100. package/src/engine/control/first-person/FirstPersonPlayerControllerConfig.js +2 -0
  101. package/src/engine/control/first-person/abilities/AbilitySet.d.ts.map +1 -1
  102. package/src/engine/control/first-person/abilities/AbilitySet.js +9 -0
  103. package/src/engine/control/first-person/abilities/LedgeGrab.d.ts.map +1 -1
  104. package/src/engine/control/first-person/abilities/LedgeGrab.js +6 -0
  105. package/src/engine/control/first-person/abilities/Slide.d.ts.map +1 -1
  106. package/src/engine/control/first-person/abilities/Slide.js +1 -0
  107. package/src/engine/control/first-person/abilities/WallRun.d.ts +4 -1
  108. package/src/engine/control/first-person/abilities/WallRun.d.ts.map +1 -1
  109. package/src/engine/control/first-person/abilities/WallRun.js +13 -1
  110. package/src/engine/control/first-person/mastery/SlideInitiationTimingEvaluator.d.ts +1 -1
  111. package/src/engine/control/first-person/mastery/SlideInitiationTimingEvaluator.d.ts.map +1 -1
  112. package/src/engine/control/first-person/mastery/SlideInitiationTimingEvaluator.js +6 -5
  113. package/src/engine/control/first-person/mastery/StrideTimingJumpEvaluator.d.ts +3 -3
  114. package/src/engine/control/first-person/mastery/StrideTimingJumpEvaluator.d.ts.map +1 -1
  115. package/src/engine/control/first-person/mastery/StrideTimingJumpEvaluator.js +9 -8
  116. package/src/engine/control/first-person/sensors/FirstPersonSensorsSystem.d.ts.map +1 -1
  117. package/src/engine/control/first-person/sensors/FirstPersonSensorsSystem.js +13 -4
  118. package/src/engine/ecs/EntityManager.d.ts +9 -1
  119. package/src/engine/ecs/EntityManager.d.ts.map +1 -1
  120. package/src/engine/ecs/EntityManager.js +44 -42
  121. package/src/engine/ecs/dynamic_actions/rules/DynamicRuleDescription.d.ts.map +1 -1
  122. package/src/engine/ecs/dynamic_actions/rules/DynamicRuleDescription.js +2 -1
  123. package/src/engine/ecs/dynamic_actions/rules/DynamicRuleDescriptionTable.d.ts.map +1 -1
  124. package/src/engine/ecs/dynamic_actions/rules/DynamicRuleDescriptionTable.js +1 -0
  125. package/src/engine/ecs/fow/FogOfWarRevealerSystem.d.ts.map +1 -1
  126. package/src/engine/ecs/fow/FogOfWarRevealerSystem.js +3 -0
  127. package/src/engine/ecs/gpu/GPUStateAuthority.d.ts +20 -0
  128. package/src/engine/ecs/gpu/GPUStateAuthority.d.ts.map +1 -1
  129. package/src/engine/ecs/gpu/GPUStateAuthority.js +21 -0
  130. package/src/engine/ecs/gpu/GPU_AUTHORITY_EVENT_HOLD_CHANGE.d.ts +13 -0
  131. package/src/engine/ecs/gpu/GPU_AUTHORITY_EVENT_HOLD_CHANGE.d.ts.map +1 -0
  132. package/src/engine/ecs/gpu/GPU_AUTHORITY_EVENT_HOLD_CHANGE.js +12 -0
  133. package/src/engine/ecs/gpu/gpu_authority_grant.d.ts +6 -0
  134. package/src/engine/ecs/gpu/gpu_authority_grant.d.ts.map +1 -1
  135. package/src/engine/ecs/gpu/gpu_authority_grant.js +7 -1
  136. package/src/engine/ecs/gpu/gpu_authority_held.d.ts +14 -0
  137. package/src/engine/ecs/gpu/gpu_authority_held.d.ts.map +1 -0
  138. package/src/engine/ecs/gpu/gpu_authority_held.js +23 -0
  139. package/src/engine/ecs/gpu/gpu_authority_hold.d.ts +23 -0
  140. package/src/engine/ecs/gpu/gpu_authority_hold.d.ts.map +1 -0
  141. package/src/engine/ecs/gpu/gpu_authority_hold.js +41 -0
  142. package/src/engine/ecs/gpu/gpu_authority_unhold.d.ts +14 -0
  143. package/src/engine/ecs/gpu/gpu_authority_unhold.d.ts.map +1 -0
  144. package/src/engine/ecs/gpu/gpu_authority_unhold.js +32 -0
  145. package/src/engine/ecs/ik/IKGoal.d.ts +59 -0
  146. package/src/engine/ecs/ik/IKGoal.d.ts.map +1 -0
  147. package/src/engine/ecs/ik/IKGoal.js +83 -0
  148. package/src/engine/ecs/ik/IKGoalSystem.d.ts +75 -0
  149. package/src/engine/ecs/ik/IKGoalSystem.d.ts.map +1 -0
  150. package/src/engine/ecs/ik/IKGoalSystem.js +1456 -0
  151. package/src/engine/ecs/ik/PLAN.md +179 -0
  152. package/src/engine/ecs/parent/EntityNode.js +3 -3
  153. package/src/engine/ecs/speaker/VoiceSystem.d.ts +2 -2
  154. package/src/engine/ecs/speaker/VoiceSystem.d.ts.map +1 -1
  155. package/src/engine/ecs/speaker/VoiceSystem.js +4 -0
  156. package/src/engine/ecs/storage/BinaryBufferDeSerializer.js +5 -5
  157. package/src/engine/ecs/storage/BinaryBufferSerializer.d.ts.map +1 -1
  158. package/src/engine/ecs/storage/BinaryBufferSerializer.js +4 -5
  159. package/src/engine/ecs/storage/binary/BinarySerializationRegistry.d.ts.map +1 -1
  160. package/src/engine/ecs/storage/binary/BinarySerializationRegistry.js +3 -2
  161. package/src/engine/ecs/storage/binary/SERIALIZATION_COVERAGE.md +7 -3
  162. package/src/engine/ecs/storage/binary/object/BinaryObjectSerializationAdapter2.js +1 -1
  163. package/src/engine/ecs/storage/binary/object-v2/BinaryObjectDeSerializer.d.ts.map +1 -1
  164. package/src/engine/ecs/storage/binary/object-v2/BinaryObjectDeSerializer.js +8 -1
  165. package/src/engine/ecs/storage/populateEngineSerializationRegistry.d.ts.map +1 -1
  166. package/src/engine/ecs/storage/populateEngineSerializationRegistry.js +9 -2
  167. package/src/engine/ecs/system/orderSystemsByDeclaredAccess.d.ts +33 -0
  168. package/src/engine/ecs/system/orderSystemsByDeclaredAccess.d.ts.map +1 -0
  169. package/src/engine/ecs/system/orderSystemsByDeclaredAccess.js +282 -0
  170. package/src/engine/ecs/terrain/ecs/cling/ClingToTerrainSystem.d.ts.map +1 -1
  171. package/src/engine/ecs/terrain/ecs/cling/ClingToTerrainSystem.js +5 -2
  172. package/src/engine/ecs/terrain/ecs/layers/TerrainLayers.d.ts.map +1 -1
  173. package/src/engine/ecs/terrain/ecs/layers/TerrainLayers.js +3 -0
  174. package/src/engine/ecs/terrain/ecs/splat/SplatMapping.d.ts.map +1 -1
  175. package/src/engine/ecs/terrain/ecs/splat/SplatMapping.js +1 -0
  176. package/src/engine/ecs/terrain/overlay/TerrainOverlay.js +1 -1
  177. package/src/engine/ecs/terrain/tiles/TerrainTile.d.ts.map +1 -1
  178. package/src/engine/ecs/terrain/tiles/TerrainTile.js +13 -1
  179. package/src/engine/ecs/terrain/tiles/TerrainTileManager.d.ts.map +1 -1
  180. package/src/engine/ecs/terrain/tiles/TerrainTileManager.js +1 -0
  181. package/src/engine/ecs/transform/T64WorldCache.js +139 -139
  182. package/src/engine/ecs/transform/t64_evaluate_local.d.ts +25 -0
  183. package/src/engine/ecs/transform/t64_evaluate_local.d.ts.map +1 -0
  184. package/src/engine/ecs/transform/t64_evaluate_local.js +35 -0
  185. package/src/engine/ecs/transform/t64_evaluate_world.d.ts +5 -3
  186. package/src/engine/ecs/transform/t64_evaluate_world.d.ts.map +1 -1
  187. package/src/engine/ecs/transform/t64_evaluate_world.js +128 -126
  188. package/src/engine/graphics/ecs/light/LightSerializationAdapter.d.ts.map +1 -1
  189. package/src/engine/graphics/ecs/light/LightSerializationAdapter.js +13 -1
  190. package/src/engine/graphics/ecs/light/LightSerializationUpgrader_0_1.d.ts +5 -0
  191. package/src/engine/graphics/ecs/light/LightSerializationUpgrader_0_1.d.ts.map +1 -0
  192. package/src/engine/graphics/ecs/light/LightSerializationUpgrader_0_1.js +27 -0
  193. package/src/engine/graphics/ecs/water/Water.d.ts +11 -0
  194. package/src/engine/graphics/ecs/water/Water.d.ts.map +1 -1
  195. package/src/engine/graphics/ecs/water/Water.js +17 -0
  196. package/src/engine/graphics/ecs/water/WaterSerializationAdapter.d.ts.map +1 -1
  197. package/src/engine/graphics/ecs/water/WaterSerializationAdapter.js +3 -1
  198. package/src/engine/graphics/ecs/water/WaterSerializationUpgrader_4_5.d.ts +9 -0
  199. package/src/engine/graphics/ecs/water/WaterSerializationUpgrader_4_5.d.ts.map +1 -0
  200. package/src/engine/graphics/ecs/water/WaterSerializationUpgrader_4_5.js +24 -0
  201. package/src/engine/graphics/ecs/water/WaterWaves.d.ts +30 -9
  202. package/src/engine/graphics/ecs/water/WaterWaves.d.ts.map +1 -1
  203. package/src/engine/graphics/ecs/water/WaterWaves.js +41 -9
  204. package/src/engine/graphics/ecs/water/WaterWavesSerializationAdapter.d.ts.map +1 -1
  205. package/src/engine/graphics/ecs/water/WaterWavesSerializationAdapter.js +30 -26
  206. package/src/engine/graphics/ecs/water/WaterWavesSerializationUpgrader_0_1.d.ts +6 -0
  207. package/src/engine/graphics/ecs/water/WaterWavesSerializationUpgrader_0_1.d.ts.map +1 -0
  208. package/src/engine/graphics/ecs/water/WaterWavesSerializationUpgrader_0_1.js +22 -0
  209. package/src/engine/graphics/geometry/buffered/query/bvh32_geometry_raycast.d.ts.map +1 -1
  210. package/src/engine/graphics/geometry/buffered/query/bvh32_geometry_raycast.js +3 -5
  211. package/src/engine/graphics/texture/3d/scs3d_sample_linear3.d.ts +20 -0
  212. package/src/engine/graphics/texture/3d/scs3d_sample_linear3.d.ts.map +1 -1
  213. package/src/engine/graphics/texture/3d/scs3d_sample_linear3.js +36 -0
  214. package/src/engine/graphics3/AnimationGraphSystem.d.ts +2 -0
  215. package/src/engine/graphics3/AnimationGraphSystem.d.ts.map +1 -1
  216. package/src/engine/graphics3/AnimationGraphSystem.js +337 -329
  217. package/src/engine/graphics3/AnimationSystem.d.ts +2 -0
  218. package/src/engine/graphics3/AnimationSystem.d.ts.map +1 -1
  219. package/src/engine/graphics3/AnimationSystem.js +360 -352
  220. package/src/engine/graphics3/WaterSystem.d.ts +12 -3
  221. package/src/engine/graphics3/WaterSystem.d.ts.map +1 -1
  222. package/src/engine/graphics3/WaterSystem.js +78 -46
  223. package/src/engine/input/devices/PointerDevice.d.ts.map +1 -1
  224. package/src/engine/input/devices/PointerDevice.js +29 -4
  225. package/src/engine/intelligence/behavior/selector/WeightedRandomBehavior.d.ts +1 -0
  226. package/src/engine/intelligence/behavior/selector/WeightedRandomBehavior.d.ts.map +1 -1
  227. package/src/engine/intelligence/behavior/selector/WeightedRandomBehavior.js +14 -3
  228. package/src/engine/physics/cloth/MEASUREMENTS.md +130 -0
  229. package/src/engine/physics/cloth/PLAN.md +16 -1
  230. package/src/engine/physics/cloth/ecs/ClothColliderSystem.d.ts +5 -6
  231. package/src/engine/physics/cloth/ecs/ClothColliderSystem.d.ts.map +1 -1
  232. package/src/engine/physics/cloth/ecs/ClothColliderSystem.js +5 -6
  233. package/src/engine/physics/cloth/ecs/ClothInstance.d.ts +4 -7
  234. package/src/engine/physics/cloth/ecs/ClothInstance.d.ts.map +1 -1
  235. package/src/engine/physics/cloth/ecs/ClothInstance.js +4 -7
  236. package/src/engine/physics/cloth/ecs/ClothSystem.d.ts +4 -3
  237. package/src/engine/physics/cloth/ecs/ClothSystem.d.ts.map +1 -1
  238. package/src/engine/physics/cloth/ecs/ClothSystem.js +4 -3
  239. package/src/engine/physics/cloth/ecs/ClothWorld.d.ts.map +1 -1
  240. package/src/engine/physics/cloth/ecs/ClothWorld.js +10 -0
  241. package/src/engine/physics/cloth/ecs/cloth_seed_rig.d.ts +24 -24
  242. package/src/engine/physics/cloth/ecs/cloth_seed_rig.d.ts.map +1 -1
  243. package/src/engine/physics/cloth/ecs/cloth_seed_rig.js +46 -43
  244. package/src/engine/physics/cloth/ecs/cloth_write_back.d.ts +1 -1
  245. package/src/engine/physics/cloth/ecs/cloth_write_back.js +1 -1
  246. package/src/engine/physics/constraint/solve_constraints.d.ts +0 -35
  247. package/src/engine/physics/constraint/solve_constraints.d.ts.map +1 -1
  248. package/src/engine/physics/constraint/solve_constraints.js +1 -83
  249. package/src/engine/physics/ecs/ContactProbe.d.ts +73 -0
  250. package/src/engine/physics/ecs/ContactProbe.d.ts.map +1 -0
  251. package/src/engine/physics/ecs/ContactProbe.js +103 -0
  252. package/src/engine/physics/ecs/ContactProbeSystem.d.ts +44 -0
  253. package/src/engine/physics/ecs/ContactProbeSystem.d.ts.map +1 -0
  254. package/src/engine/physics/ecs/ContactProbeSystem.js +397 -0
  255. package/src/engine/physics/fluid/ecs/FluidComponent.d.ts +1 -1
  256. package/src/engine/physics/fluid/ecs/FluidComponent.js +1 -1
  257. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  258. package/src/engine/physics/fluid/solver/v3_grid_advect_maccormack_velocity.d.ts.map +1 -1
  259. package/src/engine/physics/fluid/solver/v3_grid_advect_maccormack_velocity.js +12 -3
  260. package/src/engine/physics/fluid/solver/v3_grid_advect_sl_velocity.d.ts.map +1 -1
  261. package/src/engine/physics/fluid/solver/v3_grid_advect_sl_velocity.js +8 -2
  262. package/src/engine/physics/fluid/solver/v3_grid_sample_scalar_masked.d.ts +19 -0
  263. package/src/engine/physics/fluid/solver/v3_grid_sample_scalar_masked.d.ts.map +1 -1
  264. package/src/engine/physics/fluid/solver/v3_grid_sample_scalar_masked.js +41 -2
  265. package/src/engine/physics/fluid/solver/v3_mac_advect_scalar.d.ts.map +1 -1
  266. package/src/engine/physics/fluid/solver/v3_mac_advect_scalar.js +9 -3
  267. package/src/engine/physics/fluid/solver/v3_mac_advect_sl_velocity.d.ts.map +1 -1
  268. package/src/engine/physics/fluid/solver/v3_mac_advect_sl_velocity.js +26 -10
  269. package/src/engine/physics/inverse_kinematics/frame_fabrik/FrameFabrikProblem.d.ts +205 -0
  270. package/src/engine/physics/inverse_kinematics/frame_fabrik/FrameFabrikProblem.d.ts.map +1 -0
  271. package/src/engine/physics/inverse_kinematics/frame_fabrik/FrameFabrikProblem.js +245 -0
  272. package/src/engine/physics/inverse_kinematics/frame_fabrik/frame_fabrik_limit_from_joint.d.ts +21 -0
  273. package/src/engine/physics/inverse_kinematics/frame_fabrik/frame_fabrik_limit_from_joint.d.ts.map +1 -0
  274. package/src/engine/physics/inverse_kinematics/frame_fabrik/frame_fabrik_limit_from_joint.js +63 -0
  275. package/src/engine/physics/inverse_kinematics/frame_fabrik/frame_fabrik_solve.d.ts +33 -0
  276. package/src/engine/physics/inverse_kinematics/frame_fabrik/frame_fabrik_solve.d.ts.map +1 -0
  277. package/src/engine/physics/inverse_kinematics/frame_fabrik/frame_fabrik_solve.js +874 -0
  278. package/src/engine/physics/inverse_kinematics/joint_hinge_mid_axis.d.ts +27 -0
  279. package/src/engine/physics/inverse_kinematics/joint_hinge_mid_axis.d.ts.map +1 -0
  280. package/src/engine/physics/inverse_kinematics/joint_hinge_mid_axis.js +77 -0
  281. package/src/engine/physics/inverse_kinematics/two_bone_path_solve.d.ts +36 -0
  282. package/src/engine/physics/inverse_kinematics/two_bone_path_solve.d.ts.map +1 -0
  283. package/src/engine/physics/inverse_kinematics/two_bone_path_solve.js +97 -0
  284. package/src/engine/physics/inverse_kinematics/two_joint_ik.d.ts +33 -11
  285. package/src/engine/physics/inverse_kinematics/two_joint_ik.d.ts.map +1 -1
  286. package/src/engine/physics/inverse_kinematics/two_joint_ik.js +158 -67
  287. package/src/engine/sound/sopra/definition/clip/RandomContainerAudioClip.d.ts +3 -6
  288. package/src/engine/sound/sopra/definition/clip/RandomContainerAudioClip.d.ts.map +1 -1
  289. package/src/engine/sound/sopra/definition/clip/RandomContainerAudioClip.js +22 -9
  290. package/src/engine/ui/DraggableAspect.d.ts +5 -1
  291. package/src/engine/ui/DraggableAspect.d.ts.map +1 -1
  292. package/src/engine/ui/DraggableAspect.js +61 -4
  293. package/src/format/image/avif/heif/ItemProperty.d.ts +1 -1
  294. package/src/format/image/avif/heif/ItemProperty.js +1 -1
  295. package/src/format/image/png/chunk/png_chunk_decode_iTXt.d.ts.map +1 -1
  296. package/src/format/image/png/chunk/png_chunk_decode_iTXt.js +17 -6
  297. package/src/shade/device/mock/SoftwareGPUDevice.d.ts +2 -4
  298. package/src/shade/device/mock/SoftwareGPUDevice.d.ts.map +1 -1
  299. package/src/shade/device/mock/SoftwareGPUDevice.js +20 -13
  300. package/src/shade/playground/skinned_blas_refit/sweep_views.d.ts.map +1 -1
  301. package/src/shade/playground/skinned_blas_refit/sweep_views.js +2 -1
  302. package/src/shade/playground/water_refraction/README.md +10 -11
  303. package/src/shade/playground/water_refraction/main.js +9 -8
  304. package/src/shade/playground/water_refraction/world.js +1 -1
  305. package/src/shade/playground/water_surface/README.md +43 -0
  306. package/src/shade/playground/water_surface/index.html +30 -0
  307. package/src/shade/playground/water_surface/main.d.ts +2 -0
  308. package/src/shade/playground/water_surface/main.d.ts.map +1 -0
  309. package/src/shade/playground/water_surface/main.js +154 -0
  310. package/src/shade/playground/water_surface/world.d.ts +44 -0
  311. package/src/shade/playground/water_surface/world.d.ts.map +1 -0
  312. package/src/shade/playground/water_surface/world.js +160 -0
  313. package/src/shade/renderer/animation/ANIMATION_TRACK_BINDING_STRUCT.d.ts.map +1 -1
  314. package/src/shade/renderer/animation/ANIMATION_TRACK_BINDING_STRUCT.js +10 -1
  315. package/src/shade/renderer/animation/GPUAnimationManager.d.ts +10 -4
  316. package/src/shade/renderer/animation/GPUAnimationManager.d.ts.map +1 -1
  317. package/src/shade/renderer/animation/GPUAnimationManager.js +251 -23
  318. package/src/shade/renderer/animation/POSE_ACCUMULATOR_LAYOUT.d.ts +12 -4
  319. package/src/shade/renderer/animation/POSE_ACCUMULATOR_LAYOUT.d.ts.map +1 -1
  320. package/src/shade/renderer/animation/POSE_ACCUMULATOR_LAYOUT.js +12 -4
  321. package/src/shade/renderer/animation/chunk_pose_accumulator.d.ts.map +1 -1
  322. package/src/shade/renderer/animation/chunk_pose_accumulator.js +14 -1
  323. package/src/shade/renderer/animation/pose/PoseChannelIndex.d.ts +78 -0
  324. package/src/shade/renderer/animation/pose/PoseChannelIndex.d.ts.map +1 -0
  325. package/src/shade/renderer/animation/pose/PoseChannelIndex.js +274 -0
  326. package/src/shade/renderer/animation/pose/PosePlayback.d.ts +40 -3
  327. package/src/shade/renderer/animation/pose/PosePlayback.d.ts.map +1 -1
  328. package/src/shade/renderer/animation/pose/PosePlayback.js +77 -3
  329. package/src/shade/renderer/animation/pose/pose_evaluate_local.d.ts +21 -3
  330. package/src/shade/renderer/animation/pose/pose_evaluate_local.d.ts.map +1 -1
  331. package/src/shade/renderer/animation/pose/pose_evaluate_local.js +79 -11
  332. package/src/shade/renderer/animation/shader_animation_apply.js +1 -1
  333. package/src/shade/renderer/animation/shader_animation_pose_resolve.d.ts +3 -2
  334. package/src/shade/renderer/animation/shader_animation_pose_resolve.d.ts.map +1 -1
  335. package/src/shade/renderer/animation/shader_animation_pose_resolve.js +187 -176
  336. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts.map +1 -1
  337. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.js +5 -0
  338. package/src/shade/renderer/binding/BufferBinding.js +2 -2
  339. package/src/shade/renderer/buffer/table/GPUTypedTable.d.ts.map +1 -1
  340. package/src/shade/renderer/buffer/table/GPUTypedTable.js +5 -3
  341. package/src/shade/renderer/buffer/table/GPUTypedTableDescriptor.d.ts +10 -3
  342. package/src/shade/renderer/buffer/table/GPUTypedTableDescriptor.d.ts.map +1 -1
  343. package/src/shade/renderer/buffer/table/GPUTypedTableDescriptor.js +17 -9
  344. package/src/shade/renderer/camera/orbital/OrbitalCameraInput.d.ts +3 -0
  345. package/src/shade/renderer/camera/orbital/OrbitalCameraInput.d.ts.map +1 -1
  346. package/src/shade/renderer/camera/orbital/OrbitalCameraInput.js +16 -0
  347. package/src/shade/renderer/camera/orbital/OrbitalCameraRig.d.ts +2 -0
  348. package/src/shade/renderer/camera/orbital/OrbitalCameraRig.d.ts.map +1 -1
  349. package/src/shade/renderer/camera/orbital/OrbitalCameraRig.js +11 -0
  350. package/src/shade/renderer/geometry/meshlet/build/meshoptimizer/geometry_to_meshlets_meshoptimizer.d.ts +1 -1
  351. package/src/shade/renderer/geometry/meshlet/build/meshoptimizer/geometry_to_meshlets_meshoptimizer.d.ts.map +1 -1
  352. package/src/shade/renderer/geometry/meshlet/build/meshoptimizer/geometry_to_meshlets_meshoptimizer.js +9 -3
  353. package/src/shade/renderer/geometry/util/geometry_simplify_redundant_topology.d.ts.map +1 -1
  354. package/src/shade/renderer/geometry/util/geometry_simplify_redundant_topology.js +2 -2
  355. package/src/shade/renderer/geometry/virtual/format/vgeo_validate_container.d.ts.map +1 -1
  356. package/src/shade/renderer/geometry/virtual/format/vgeo_validate_container.js +85 -0
  357. package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.d.ts.map +1 -1
  358. package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.js +12 -6
  359. package/src/shade/renderer/geometry/virtual/runtime/VGeoPageFetcher.d.ts.map +1 -1
  360. package/src/shade/renderer/geometry/virtual/runtime/VGeoPageFetcher.js +7 -0
  361. package/src/shade/renderer/geometry/virtual/runtime/VGeoRuntimeTables.d.ts.map +1 -1
  362. package/src/shade/renderer/geometry/virtual/runtime/VGeoRuntimeTables.js +3 -1
  363. package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
  364. package/src/shade/renderer/object_property/chunk_write_object_property.d.ts +3 -1
  365. package/src/shade/renderer/object_property/chunk_write_object_property.d.ts.map +1 -1
  366. package/src/shade/renderer/object_property/chunk_write_object_property.js +5 -2
  367. package/src/shade/renderer/object_property/chunk_write_object_property_node3d.d.ts +4 -0
  368. package/src/shade/renderer/object_property/chunk_write_object_property_node3d.d.ts.map +1 -1
  369. package/src/shade/renderer/object_property/chunk_write_object_property_node3d.js +6 -1
  370. package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
  371. package/src/shade/renderer/scene/SCENE_DATABASE_SPEC.js +2 -1
  372. package/src/shade/renderer/scene/optimization/geometry/geometry_deduplicate.d.ts +1 -1
  373. package/src/shade/renderer/scene/optimization/geometry/geometry_deduplicate.d.ts.map +1 -1
  374. package/src/shade/renderer/scene/optimization/geometry/geometry_deduplicate.js +135 -73
  375. package/src/shade/renderer/scene/optimization/geometry/internal/cover_greedy.d.ts +7 -0
  376. package/src/shade/renderer/scene/optimization/geometry/internal/cover_greedy.d.ts.map +1 -1
  377. package/src/shade/renderer/scene/optimization/geometry/internal/cover_greedy.js +29 -1
  378. package/src/shade/renderer/scene/optimization/geometry/internal/face_neighbourhood_hash.d.ts +19 -0
  379. package/src/shade/renderer/scene/optimization/geometry/internal/face_neighbourhood_hash.d.ts.map +1 -0
  380. package/src/shade/renderer/scene/optimization/geometry/internal/face_neighbourhood_hash.js +167 -0
  381. package/src/shade/renderer/scene/optimization/geometry/internal/neighbourhood_anchor_index.d.ts +25 -0
  382. package/src/shade/renderer/scene/optimization/geometry/internal/neighbourhood_anchor_index.d.ts.map +1 -0
  383. package/src/shade/renderer/scene/optimization/geometry/internal/neighbourhood_anchor_index.js +124 -0
  384. package/src/shade/renderer/scene/optimization/geometry/internal/seed_correspondence_from_face_pair.d.ts +19 -0
  385. package/src/shade/renderer/scene/optimization/geometry/internal/seed_correspondence_from_face_pair.d.ts.map +1 -0
  386. package/src/shade/renderer/scene/optimization/geometry/internal/seed_correspondence_from_face_pair.js +48 -0
  387. package/src/shade/renderer/scene/rows/GPUSceneRows.d.ts +17 -1
  388. package/src/shade/renderer/scene/rows/GPUSceneRows.d.ts.map +1 -1
  389. package/src/shade/renderer/scene/rows/GPUSceneRows.js +29 -3
  390. package/src/shade/renderer/shader/chunk/math/fft/chunk_fft128_inverse.d.ts +13 -0
  391. package/src/shade/renderer/shader/chunk/math/fft/chunk_fft128_inverse.d.ts.map +1 -0
  392. package/src/shade/renderer/shader/chunk/math/fft/chunk_fft128_inverse.js +42 -0
  393. package/src/shade/renderer/shader/chunk/math/fft/chunk_fft128x4_inverse_workgroup.d.ts +15 -0
  394. package/src/shade/renderer/shader/chunk/math/fft/chunk_fft128x4_inverse_workgroup.d.ts.map +1 -0
  395. package/src/shade/renderer/shader/chunk/math/fft/chunk_fft128x4_inverse_workgroup.js +39 -0
  396. package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.d.ts.map +1 -1
  397. package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.js +2 -0
  398. package/src/shade/renderer/water/GPUWaterRenderer.d.ts +15 -0
  399. package/src/shade/renderer/water/GPUWaterRenderer.d.ts.map +1 -1
  400. package/src/shade/renderer/water/GPUWaterRenderer.js +110 -30
  401. package/src/shade/renderer/water/medium/GPUWaterBodies.d.ts +16 -8
  402. package/src/shade/renderer/water/medium/GPUWaterBodies.d.ts.map +1 -1
  403. package/src/shade/renderer/water/medium/GPUWaterBodies.js +31 -26
  404. package/src/shade/renderer/water/medium/shader_water_meshlets.d.ts +0 -1
  405. package/src/shade/renderer/water/medium/shader_water_meshlets.d.ts.map +1 -1
  406. package/src/shade/renderer/water/medium/shader_water_meshlets.js +1 -39
  407. package/src/shade/renderer/water/shader_water.d.ts +0 -1
  408. package/src/shade/renderer/water/shader_water.d.ts.map +1 -1
  409. package/src/shade/renderer/water/shader_water.js +201 -72
  410. package/src/shade/renderer/water/surface/GPUWaterSurface.d.ts +70 -0
  411. package/src/shade/renderer/water/surface/GPUWaterSurface.d.ts.map +1 -0
  412. package/src/shade/renderer/water/surface/GPUWaterSurface.js +199 -0
  413. package/src/shade/renderer/water/surface/WATER_WAVE_RECORD_STRUCT.d.ts +5 -2
  414. package/src/shade/renderer/water/surface/WATER_WAVE_RECORD_STRUCT.d.ts.map +1 -1
  415. package/src/shade/renderer/water/surface/WATER_WAVE_RECORD_STRUCT.js +32 -12
  416. package/src/shade/renderer/water/surface/chunk_water_surface_sample.d.ts +22 -0
  417. package/src/shade/renderer/water/surface/chunk_water_surface_sample.d.ts.map +1 -0
  418. package/src/shade/renderer/water/surface/chunk_water_surface_sample.js +217 -0
  419. package/src/shade/renderer/water/surface/graph_water_tessellation.d.ts +65 -11
  420. package/src/shade/renderer/water/surface/graph_water_tessellation.d.ts.map +1 -1
  421. package/src/shade/renderer/water/surface/graph_water_tessellation.js +163 -28
  422. package/src/shade/renderer/water/surface/lod/WATER_LOD.d.ts +51 -0
  423. package/src/shade/renderer/water/surface/lod/WATER_LOD.d.ts.map +1 -0
  424. package/src/shade/renderer/water/surface/lod/WATER_LOD.js +95 -0
  425. package/src/shade/renderer/water/surface/lod/chunk_water_lod.d.ts +10 -0
  426. package/src/shade/renderer/water/surface/lod/chunk_water_lod.d.ts.map +1 -0
  427. package/src/shade/renderer/water/surface/lod/chunk_water_lod.js +127 -0
  428. package/src/shade/renderer/water/surface/lod/chunk_water_lod_cell.d.ts +17 -0
  429. package/src/shade/renderer/water/surface/lod/chunk_water_lod_cell.d.ts.map +1 -0
  430. package/src/shade/renderer/water/surface/lod/chunk_water_lod_cell.js +246 -0
  431. package/src/shade/renderer/water/surface/lod/shader_water_lod.d.ts +118 -0
  432. package/src/shade/renderer/water/surface/lod/shader_water_lod.d.ts.map +1 -0
  433. package/src/shade/renderer/water/surface/lod/shader_water_lod.js +727 -0
  434. package/src/shade/renderer/water/surface/particles/GPUWaterParticles.d.ts +60 -0
  435. package/src/shade/renderer/water/surface/particles/GPUWaterParticles.d.ts.map +1 -0
  436. package/src/shade/renderer/water/surface/particles/GPUWaterParticles.js +228 -0
  437. package/src/shade/renderer/water/surface/particles/WATER_PARTICLE_STRUCT.d.ts +17 -0
  438. package/src/shade/renderer/water/surface/particles/WATER_PARTICLE_STRUCT.d.ts.map +1 -0
  439. package/src/shade/renderer/water/surface/particles/WATER_PARTICLE_STRUCT.js +49 -0
  440. package/src/shade/renderer/water/surface/particles/chunk_water_particle.d.ts +22 -0
  441. package/src/shade/renderer/water/surface/particles/chunk_water_particle.d.ts.map +1 -0
  442. package/src/shade/renderer/water/surface/particles/chunk_water_particle.js +143 -0
  443. package/src/shade/renderer/water/surface/particles/chunk_water_particle_step.d.ts +15 -0
  444. package/src/shade/renderer/water/surface/particles/chunk_water_particle_step.d.ts.map +1 -0
  445. package/src/shade/renderer/water/surface/particles/chunk_water_particle_step.js +121 -0
  446. package/src/shade/renderer/water/surface/particles/shader_water_particles.d.ts +83 -0
  447. package/src/shade/renderer/water/surface/particles/shader_water_particles.d.ts.map +1 -0
  448. package/src/shade/renderer/water/surface/particles/shader_water_particles.js +502 -0
  449. package/src/shade/renderer/water/surface/shader_water_cull.d.ts +42 -0
  450. package/src/shade/renderer/water/surface/shader_water_cull.d.ts.map +1 -0
  451. package/src/shade/renderer/water/surface/shader_water_cull.js +269 -0
  452. package/src/shade/renderer/water/surface/shader_water_waves_combine.d.ts +15 -0
  453. package/src/shade/renderer/water/surface/shader_water_waves_combine.d.ts.map +1 -0
  454. package/src/shade/renderer/water/surface/shader_water_waves_combine.js +73 -0
  455. package/src/shade/renderer/water/surface/shader_water_waves_derive.d.ts +11 -0
  456. package/src/shade/renderer/water/surface/shader_water_waves_derive.d.ts.map +1 -0
  457. package/src/shade/renderer/water/surface/shader_water_waves_derive.js +78 -0
  458. package/src/shade/renderer/water/surface/spectrum/GPUWaterSpectrum.d.ts +35 -0
  459. package/src/shade/renderer/water/surface/spectrum/GPUWaterSpectrum.d.ts.map +1 -0
  460. package/src/shade/renderer/water/surface/spectrum/GPUWaterSpectrum.js +103 -0
  461. package/src/shade/renderer/water/surface/spectrum/WATER_BAND_STATE.d.ts +22 -0
  462. package/src/shade/renderer/water/surface/spectrum/WATER_BAND_STATE.d.ts.map +1 -0
  463. package/src/shade/renderer/water/surface/spectrum/WATER_BAND_STATE.js +57 -0
  464. package/src/shade/renderer/water/surface/spectrum/WATER_SPECTRUM.d.ts +22 -0
  465. package/src/shade/renderer/water/surface/spectrum/WATER_SPECTRUM.d.ts.map +1 -0
  466. package/src/shade/renderer/water/surface/spectrum/WATER_SPECTRUM.js +25 -0
  467. package/src/shade/renderer/water/surface/spectrum/chunk_water_jonswap.d.ts +14 -0
  468. package/src/shade/renderer/water/surface/spectrum/chunk_water_jonswap.d.ts.map +1 -0
  469. package/src/shade/renderer/water/surface/spectrum/chunk_water_jonswap.js +48 -0
  470. package/src/shade/renderer/water/surface/spectrum/chunk_water_spectrum.d.ts +23 -0
  471. package/src/shade/renderer/water/surface/spectrum/chunk_water_spectrum.d.ts.map +1 -0
  472. package/src/shade/renderer/water/surface/spectrum/chunk_water_spectrum.js +169 -0
  473. package/src/shade/renderer/water/surface/spectrum/shader_water_spectrum.d.ts +26 -0
  474. package/src/shade/renderer/water/surface/spectrum/shader_water_spectrum.d.ts.map +1 -0
  475. package/src/shade/renderer/water/surface/spectrum/shader_water_spectrum.js +161 -0
  476. package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.d.ts.map +1 -1
  477. package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js +18 -6
  478. package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts.map +1 -1
  479. package/src/shade/wgsl/emulator/WGSLLanguageCore.js +11 -3
  480. package/src/core/geom/2d/polygon/polygon2_triangulate.corpus.d.ts +0 -28
  481. package/src/core/geom/2d/polygon/polygon2_triangulate.corpus.d.ts.map +0 -1
  482. package/src/core/geom/2d/polygon/polygon2_triangulate.corpus.js +0 -86
  483. package/src/engine/ecs/ik/IKConstraint.d.ts +0 -52
  484. package/src/engine/ecs/ik/IKConstraint.d.ts.map +0 -1
  485. package/src/engine/ecs/ik/IKConstraint.js +0 -95
  486. package/src/engine/ecs/ik/IKProblem.d.ts +0 -45
  487. package/src/engine/ecs/ik/IKProblem.d.ts.map +0 -1
  488. package/src/engine/ecs/ik/IKProblem.js +0 -58
  489. package/src/engine/ecs/ik/IKSolver.d.ts +0 -8
  490. package/src/engine/ecs/ik/IKSolver.d.ts.map +0 -1
  491. package/src/engine/ecs/ik/IKSolver.js +0 -9
  492. package/src/engine/ecs/ik/InverseKinematics.d.ts +0 -48
  493. package/src/engine/ecs/ik/InverseKinematics.d.ts.map +0 -1
  494. package/src/engine/ecs/ik/InverseKinematics.js +0 -119
  495. package/src/engine/ecs/ik/InverseKinematicsSerializationAdapter.d.ts +0 -19
  496. package/src/engine/ecs/ik/InverseKinematicsSerializationAdapter.d.ts.map +0 -1
  497. package/src/engine/ecs/ik/InverseKinematicsSerializationAdapter.js +0 -72
  498. package/src/engine/ecs/ik/InverseKinematicsSystem.d.ts +0 -54
  499. package/src/engine/ecs/ik/InverseKinematicsSystem.d.ts.map +0 -1
  500. package/src/engine/ecs/ik/InverseKinematicsSystem.js +0 -212
  501. package/src/engine/ecs/ik/OneBoneSurfaceAlignmentSolver.d.ts +0 -8
  502. package/src/engine/ecs/ik/OneBoneSurfaceAlignmentSolver.d.ts.map +0 -1
  503. package/src/engine/ecs/ik/OneBoneSurfaceAlignmentSolver.js +0 -153
  504. package/src/engine/ecs/ik/TwoBoneInverseKinematicsSolver.d.ts +0 -5
  505. package/src/engine/ecs/ik/TwoBoneInverseKinematicsSolver.d.ts.map +0 -1
  506. package/src/engine/ecs/ik/TwoBoneInverseKinematicsSolver.js +0 -120
  507. package/src/engine/ecs/ik/ik_bone_chain.d.ts +0 -64
  508. package/src/engine/ecs/ik/ik_bone_chain.d.ts.map +0 -1
  509. package/src/engine/ecs/ik/ik_bone_chain.js +0 -142
  510. package/src/engine/ecs/ik/ik_probe_terrain_contact.d.ts +0 -42
  511. package/src/engine/ecs/ik/ik_probe_terrain_contact.d.ts.map +0 -1
  512. package/src/engine/ecs/ik/ik_probe_terrain_contact.js +0 -123
  513. package/src/engine/ecs/ik/ik_write_local_rotation.d.ts +0 -18
  514. package/src/engine/ecs/ik/ik_write_local_rotation.d.ts.map +0 -1
  515. package/src/engine/ecs/ik/ik_write_local_rotation.js +0 -32
  516. package/src/engine/ecs/storage/binary/object-v2/serializerTestHarness.d.ts +0 -29
  517. package/src/engine/ecs/storage/binary/object-v2/serializerTestHarness.d.ts.map +0 -1
  518. package/src/engine/ecs/storage/binary/object-v2/serializerTestHarness.js +0 -44
  519. package/src/shade/renderer/water/medium/shader_water_bodies_derive.d.ts +0 -4
  520. package/src/shade/renderer/water/medium/shader_water_bodies_derive.d.ts.map +0 -1
  521. package/src/shade/renderer/water/medium/shader_water_bodies_derive.js +0 -32
  522. package/src/shade/renderer/water/surface/GPUWaterWaveSimulation.d.ts +0 -25
  523. package/src/shade/renderer/water/surface/GPUWaterWaveSimulation.d.ts.map +0 -1
  524. package/src/shade/renderer/water/surface/GPUWaterWaveSimulation.js +0 -128
  525. package/src/shade/renderer/water/surface/chunk_water_tessellation.d.ts +0 -9
  526. package/src/shade/renderer/water/surface/chunk_water_tessellation.d.ts.map +0 -1
  527. package/src/shade/renderer/water/surface/chunk_water_tessellation.js +0 -144
  528. package/src/shade/renderer/water/surface/chunk_water_wave.d.ts +0 -13
  529. package/src/shade/renderer/water/surface/chunk_water_wave.d.ts.map +0 -1
  530. package/src/shade/renderer/water/surface/chunk_water_wave.js +0 -40
  531. package/src/shade/renderer/water/surface/shader_water_tiles.d.ts +0 -4
  532. package/src/shade/renderer/water/surface/shader_water_tiles.d.ts.map +0 -1
  533. package/src/shade/renderer/water/surface/shader_water_tiles.js +0 -123
  534. package/src/shade/renderer/water/surface/shader_water_wave_batch.d.ts +0 -6
  535. package/src/shade/renderer/water/surface/shader_water_wave_batch.d.ts.map +0 -1
  536. package/src/shade/renderer/water/surface/shader_water_wave_batch.js +0 -85
  537. package/src/shade/renderer/water/surface/shader_water_wave_domain.d.ts +0 -6
  538. package/src/shade/renderer/water/surface/shader_water_wave_domain.d.ts.map +0 -1
  539. package/src/shade/renderer/water/surface/shader_water_wave_domain.js +0 -83
@@ -0,0 +1,60 @@
1
+ /** The longest step a particle takes in one frame, seconds: a stalled tab does not fling fronts across a lake. */
2
+ export const WATER_PARTICLE_STEP_LIMIT: number;
3
+ /**
4
+ * The wave particles of every water body of a scene, on the device (WATER_SURFACE_SIMULATION_PLAN_2026_10_06.md
5
+ * §5.4): ping-pong particle arrays, and each frame's hash of them for the surface sampler. Counts never leave
6
+ * the GPU; every pass over particles is dispatched indirectly from the count the previous pass wrote.
7
+ */
8
+ export class GPUWaterParticles {
9
+ /** @returns {GPUBuffer} the frame's hash: table size, then inclusive bucket offsets */
10
+ get offsets(): GPUBuffer;
11
+ /** @returns {GPUBuffer} the frame's entries, bucket by bucket, each bucket ordered by particle */
12
+ get entries(): GPUBuffer;
13
+ /** @returns {GPUBuffer} per wave row: occupied-level mask, then a height bound per level (f32 bits) */
14
+ get body_bounds(): GPUBuffer;
15
+ /** @returns {GPUBuffer} the live particles: count, then records */
16
+ get particles(): GPUBuffer;
17
+ get capacity(): number;
18
+ /**
19
+ * Allocate for a device, a capacity and a number of wave rows.
20
+ *
21
+ * When the rows grow, the bounds the last stepping frame wrote are carried into the larger buffer: a paused
22
+ * frame does not rebuild them, and every body's surface is culled and tessellated by them.
23
+ *
24
+ * @param {GPUDevice} device
25
+ * @param {number} capacity
26
+ * @param {number} rows
27
+ * @returns {function(import("../../../../device/ShadeGPUCommandContext.js").ShadeGPUCommandContext):void|null} when the
28
+ * rows grew, encodes the carry and releases the old buffer once it ran; encode it before this frame's passes
29
+ */
30
+ prepare(device: GPUDevice, capacity: number, rows: number): (arg0: import("../../../../device/ShadeGPUCommandContext.js").ShadeGPUCommandContext) => void | null;
31
+ dispose(): void;
32
+ /**
33
+ * The frame's particles (§5.4): when the frame steps, one step of every particle of a body simulated this frame (a
34
+ * paused body's stand still) and the splashes of the culling pass's emit list; then, every frame, the hash of the
35
+ * particles of the bodies simulated this frame, which the surface sampler gathers from, and their bounds. The hash
36
+ * is rebuilt on a frame that does not step too, since the bodies in view change with the camera.
37
+ *
38
+ * @param {object} options
39
+ * @param {import("../../../../../engine/graphics/render/frame_graph/FrameGraph.js").FrameGraph} options.graph
40
+ * @param {object} options.scene GPU scene context: database, geometries
41
+ * @param {GPUBuffer} options.steep per wave row: non-zero for a body that must stay calm
42
+ * @param {GPUBuffer} options.activity per wave row: the culling pass's {@link WaterActivity} bits
43
+ * @param {GPUBuffer} options.emit_rows the culling pass's emit list
44
+ * @param {GPUBuffer} options.commands the culling pass's commands
45
+ * @param {number} options.emit_command byte offset of the emit list's command in `commands`
46
+ * @param {number} options.dt seconds; zero for a frame that does not step
47
+ */
48
+ record({ graph, scene, steep, activity, emit_rows, commands, emit_command, dt }: {
49
+ graph: import("../../../../../engine/graphics/render/frame_graph/FrameGraph.js").FrameGraph;
50
+ scene: object;
51
+ steep: GPUBuffer;
52
+ activity: GPUBuffer;
53
+ emit_rows: GPUBuffer;
54
+ commands: GPUBuffer;
55
+ emit_command: number;
56
+ dt: number;
57
+ }): void;
58
+ #private;
59
+ }
60
+ //# sourceMappingURL=GPUWaterParticles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GPUWaterParticles.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/water/surface/particles/GPUWaterParticles.js"],"names":[],"mappings":"AAuBA,kHAAkH;AAClH,+CAAgD;AAUhD;;;;GAIG;AACH;IAkBI,uFAAuF;IACvF,yBAAuC;IACvC,kGAAkG;IAClG,yBAAuC;IACvC,uGAAuG;IACvG,6BAA+C;IAC/C,mEAAmE;IACnE,2BAAyD;IACzD,uBAAyC;IAEzC;;;;;;;;;;;OAWG;IACH,qCALW,MAAM,QACN,MAAM,UACK,OAAO,8CAA8C,EAAE,sBAAsB,KAAE,IAAI,GAAC,IAAI,CA4C7G;IAED,gBAWC;IAED;;;;;;;;;;;;;;;OAeG;IACH;QATyG,KAAK,EAAnG,OAAO,iEAAiE,EAAE,UAAU;QACpE,KAAK,EAArB,MAAM;QACa,KAAK;QACL,QAAQ;QACR,SAAS;QACT,QAAQ;QACX,YAAY,EAA5B,MAAM;QACU,EAAE,EAAlB,MAAM;aA6EhB;;CACJ"}
@@ -0,0 +1,228 @@
1
+ import { assert } from "../../../../../core/assert.js";
2
+ import { graph_prefix_scan_csdldf } from "../../../gpu_primitive/prefix_sum/v1/graph_prefix_scan_csdldf.js";
3
+ import {
4
+ build_indirect_compute_dispatch_command,
5
+ INDIRECT_COMPUTE_COMMAND_DESCRIPTOR
6
+ } from "../../../gpu_primitive/indirect/IndirectComputeCommandBuildPass.js";
7
+ import { graph_import_buffer } from "../../../shader/graph/graph_import_buffer.js";
8
+ import { WATER_PARTICLE_BODY_BOUNDS_STRIDE } from "../shader_water_waves_combine.js";
9
+ import { WATER_PARTICLE_ENTRY_STRUCT, WATER_PARTICLE_STRUCT } from "./WATER_PARTICLE_STRUCT.js";
10
+ import {
11
+ shader_water_particles_bin,
12
+ shader_water_particles_bounds,
13
+ shader_water_particles_emit,
14
+ shader_water_particles_finalize,
15
+ shader_water_particles_rank,
16
+ shader_water_particles_scatter,
17
+ shader_water_particles_split,
18
+ shader_water_particles_total,
19
+ shader_water_particles_update,
20
+ shader_water_particles_weigh,
21
+ WATER_PARTICLE_CORNERS
22
+ } from "./shader_water_particles.js";
23
+
24
+ /** The longest step a particle takes in one frame, seconds: a stalled tab does not fling fronts across a lake. */
25
+ export const WATER_PARTICLE_STEP_LIMIT = 1 / 15;
26
+
27
+ /**
28
+ * @param {number} value
29
+ * @returns {number} the smallest power of two at least value
30
+ */
31
+ function power_of_two_at_least(value) {
32
+ return 2 ** Math.ceil(Math.log2(Math.max(value, 1)));
33
+ }
34
+
35
+ /**
36
+ * The wave particles of every water body of a scene, on the device (WATER_SURFACE_SIMULATION_PLAN_2026_10_06.md
37
+ * §5.4): ping-pong particle arrays, and each frame's hash of them for the surface sampler. Counts never leave
38
+ * the GPU; every pass over particles is dispatched indirectly from the count the previous pass wrote.
39
+ */
40
+ export class GPUWaterParticles {
41
+ #device = null;
42
+ #capacity = 0;
43
+ #table_limit = 0;
44
+ #rows = 0;
45
+ #parity = 0;
46
+ #particles = [];
47
+ #children = null;
48
+ #buckets = null;
49
+ #slots = null;
50
+ #bucket_amplitude = null;
51
+ #bucket_weight = null;
52
+ #visible = null;
53
+ #staging = null;
54
+ #entries = null;
55
+ #body_bounds = null;
56
+ #commands = null;
57
+
58
+ /** @returns {GPUBuffer} the frame's hash: table size, then inclusive bucket offsets */
59
+ get offsets() { return this.#buckets; }
60
+ /** @returns {GPUBuffer} the frame's entries, bucket by bucket, each bucket ordered by particle */
61
+ get entries() { return this.#entries; }
62
+ /** @returns {GPUBuffer} per wave row: occupied-level mask, then a height bound per level (f32 bits) */
63
+ get body_bounds() { return this.#body_bounds; }
64
+ /** @returns {GPUBuffer} the live particles: count, then records */
65
+ get particles() { return this.#particles[this.#parity]; }
66
+ get capacity() { return this.#capacity; }
67
+
68
+ /**
69
+ * Allocate for a device, a capacity and a number of wave rows.
70
+ *
71
+ * When the rows grow, the bounds the last stepping frame wrote are carried into the larger buffer: a paused
72
+ * frame does not rebuild them, and every body's surface is culled and tessellated by them.
73
+ *
74
+ * @param {GPUDevice} device
75
+ * @param {number} capacity
76
+ * @param {number} rows
77
+ * @returns {function(import("../../../../device/ShadeGPUCommandContext.js").ShadeGPUCommandContext):void|null} when the
78
+ * rows grew, encodes the carry and releases the old buffer once it ran; encode it before this frame's passes
79
+ */
80
+ prepare(device, capacity, rows) {
81
+ assert.isNonNegativeInteger(capacity, 'capacity');
82
+ assert.greaterThan(capacity, 0, 'capacity');
83
+ if (device !== this.#device || capacity !== this.#capacity) {
84
+ this.dispose();
85
+ this.#device = device;
86
+ this.#capacity = capacity;
87
+ this.#table_limit = power_of_two_at_least(2 * WATER_PARTICLE_CORNERS * capacity);
88
+ const buffer = (label, size, usage = 0) => device.createBuffer({ label: `Water / particles ${label}`,
89
+ size: Math.max(16, size), usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC | usage });
90
+ const array_size = 16 + capacity * WATER_PARTICLE_STRUCT.size;
91
+ this.#particles = [buffer('a', array_size), buffer('b', array_size)];
92
+ this.#children = buffer('children', 16 + capacity * 4);
93
+ this.#buckets = buffer('buckets', 16 + this.#table_limit * 4);
94
+ this.#slots = buffer('slots', capacity * WATER_PARTICLE_CORNERS * 4);
95
+ this.#bucket_amplitude = buffer('bucket amplitude', this.#table_limit * 4);
96
+ this.#bucket_weight = buffer('bucket weight', this.#table_limit * 4);
97
+ this.#visible = buffer('visible', capacity * 4);
98
+ const entries = capacity * WATER_PARTICLE_CORNERS * WATER_PARTICLE_ENTRY_STRUCT.size;
99
+ this.#staging = buffer('staging', entries);
100
+ this.#entries = buffer('entries', entries);
101
+ this.#commands = [0, 1].map(i => device.createBuffer({ label: `Water / particles command ${i}`,
102
+ size: INDIRECT_COMPUTE_COMMAND_DESCRIPTOR.size, usage: INDIRECT_COMPUTE_COMMAND_DESCRIPTOR.usage }));
103
+ this.#rows = 0;
104
+ this.#parity = 0;
105
+ }
106
+ let carry = null;
107
+ if (rows > this.#rows || this.#body_bounds === null) {
108
+ const old = this.#body_bounds, old_rows = this.#rows;
109
+ this.#rows = Math.max(rows, 1);
110
+ const bounds = this.#body_bounds = device.createBuffer({ label: 'Water / particle body bounds',
111
+ size: this.#rows * WATER_PARTICLE_BODY_BOUNDS_STRIDE * 4,
112
+ usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC });
113
+ if (old !== null) {
114
+ carry = encoder => {
115
+ encoder.copyBufferToBuffer(old, 0, bounds, 0, old_rows * WATER_PARTICLE_BODY_BOUNDS_STRIDE * 4);
116
+ encoder.done.then(() => old.destroy());
117
+ };
118
+ }
119
+ }
120
+ return carry;
121
+ }
122
+
123
+ dispose() {
124
+ for (const buffer of [...this.#particles, this.#children, this.#buckets, this.#slots, this.#bucket_amplitude,
125
+ this.#bucket_weight, this.#visible, this.#staging, this.#entries, this.#body_bounds, ...(this.#commands ?? [])]) { buffer?.destroy(); }
126
+ this.#particles = [];
127
+ this.#children = this.#buckets = this.#slots = this.#bucket_amplitude = this.#staging = this.#entries = null;
128
+ this.#bucket_weight = this.#visible = null;
129
+ this.#body_bounds = null;
130
+ this.#commands = null;
131
+ this.#device = null;
132
+ this.#capacity = 0;
133
+ this.#rows = 0;
134
+ }
135
+
136
+ /**
137
+ * The frame's particles (§5.4): when the frame steps, one step of every particle of a body simulated this frame (a
138
+ * paused body's stand still) and the splashes of the culling pass's emit list; then, every frame, the hash of the
139
+ * particles of the bodies simulated this frame, which the surface sampler gathers from, and their bounds. The hash
140
+ * is rebuilt on a frame that does not step too, since the bodies in view change with the camera.
141
+ *
142
+ * @param {object} options
143
+ * @param {import("../../../../../engine/graphics/render/frame_graph/FrameGraph.js").FrameGraph} options.graph
144
+ * @param {object} options.scene GPU scene context: database, geometries
145
+ * @param {GPUBuffer} options.steep per wave row: non-zero for a body that must stay calm
146
+ * @param {GPUBuffer} options.activity per wave row: the culling pass's {@link WaterActivity} bits
147
+ * @param {GPUBuffer} options.emit_rows the culling pass's emit list
148
+ * @param {GPUBuffer} options.commands the culling pass's commands
149
+ * @param {number} options.emit_command byte offset of the emit list's command in `commands`
150
+ * @param {number} options.dt seconds; zero for a frame that does not step
151
+ */
152
+ record({ graph, scene, steep, activity, emit_rows, commands, emit_command, dt }) {
153
+ assert.notNull(this.#device, 'prepare() first');
154
+ const stepping = dt > 0;
155
+ const step = Math.min(Math.max(dt, 0), WATER_PARTICLE_STEP_LIMIT);
156
+ const capacity = this.#capacity, table_limit = this.#table_limit;
157
+ const current = this.#particles[this.#parity];
158
+ // a frame that does not step bins the particles where they are
159
+ const next = stepping ? this.#particles[1 - this.#parity] : current;
160
+ if (stepping) { this.#parity = 1 - this.#parity; }
161
+ const [command_current, command_next] = this.#commands;
162
+ const geometries = scene.geometries;
163
+ let children = graph_import_buffer(graph, this.#children, 'Water / particle children');
164
+ let buckets = graph_import_buffer(graph, this.#buckets, 'Water / particle buckets');
165
+ const node = (name, execute, reads, writes) => {
166
+ const data = {};
167
+ const pass = graph.add(name, data, (d, resources, context) => execute(resources, context, d));
168
+ for (const [key, handle] of Object.entries(reads)) { data[key] = pass.read(handle); }
169
+ for (const [key, handle] of Object.entries(writes)) { data[key] = pass.write(handle); }
170
+ pass.make_side_effect();
171
+ return data;
172
+ };
173
+
174
+ if (stepping) {
175
+ // Each particle in place, and what it leaves.
176
+ children = node('Water / particles update', (resources, { encoder }) => {
177
+ encoder.copyBufferToBuffer(current, 0, this.#children, 0, 4);
178
+ build_indirect_compute_dispatch_command(64, encoder, current, 0, command_current, 0, true);
179
+ shader_water_particles_update.dispatchIndirect({ encoder, command: command_current, bindings: {
180
+ frame: { dt: step, capacity }, particles: current, children: this.#children, activity,
181
+ scene_database: scene.scene_database_buffer, geometries: geometries.buffer_metadata,
182
+ blas_lookup: geometries.blas.buffer_metadata, blas_data: geometries.blas.buffer_data,
183
+ meshlet_metadata: geometries.meshlets.buffer_metadata, meshlet_data: geometries.meshlets.buffer_data,
184
+ } });
185
+ }, {}, { children }).children;
186
+ children = graph_prefix_scan_csdldf({ graph, data: children, element_max_count: capacity });
187
+
188
+ // What they leave into the next array, then the frame's splashes after them.
189
+ node('Water / particles split and emit', (resources, { encoder }) => {
190
+ shader_water_particles_split.dispatchIndirect({ encoder, command: command_current, bindings: {
191
+ capacity, particles: current, children: this.#children, next } });
192
+ shader_water_particles_total.dispatch({ encoder, bindings: { capacity, children: this.#children, next } });
193
+ shader_water_particles_emit.dispatchIndirect({ encoder, command: commands, command_offset: emit_command,
194
+ bindings: { capacity, scene_database: scene.scene_database_buffer, emit_rows, steep, activity,
195
+ particle_bounds: this.#body_bounds, next } });
196
+ shader_water_particles_finalize.dispatch({ encoder, bindings: { limits: { capacity, table_limit }, next, offsets: this.#buckets } });
197
+ }, { children }, {});
198
+ }
199
+
200
+ // The frame's hash: how crowded each cell is, then each particle into the cells its support overlaps as far as
201
+ // its crowd leaves it drawn, offsets, entries in order.
202
+ buckets = node('Water / particles bin', (resources, { encoder }) => {
203
+ if (!stepping) {
204
+ // the table size the last stepping frame chose for these particles
205
+ shader_water_particles_finalize.dispatch({ encoder, bindings: { limits: { capacity, table_limit }, next, offsets: this.#buckets } });
206
+ }
207
+ build_indirect_compute_dispatch_command(64, encoder, next, 0, command_next, 0, true);
208
+ encoder.clearBuffer(this.#buckets, 16, table_limit * 4);
209
+ encoder.clearBuffer(this.#bucket_amplitude);
210
+ encoder.clearBuffer(this.#bucket_weight);
211
+ shader_water_particles_weigh.dispatchIndirect({ encoder, command: command_next, bindings: {
212
+ next, activity, offsets: this.#buckets, bucket_weight: this.#bucket_weight } });
213
+ shader_water_particles_bin.dispatchIndirect({ encoder, command: command_next, bindings: {
214
+ next, activity, buckets: this.#buckets, slots: this.#slots, bucket_amplitude: this.#bucket_amplitude,
215
+ body_bounds: this.#body_bounds, bucket_weight: this.#bucket_weight, visible: this.#visible } });
216
+ }, {}, { buckets }).buckets;
217
+ buckets = graph_prefix_scan_csdldf({ graph, data: buckets, element_max_count: table_limit });
218
+ node('Water / particles order and bound', (resources, { encoder }) => {
219
+ const bindings = { next, offsets: this.#buckets, slots: this.#slots };
220
+ shader_water_particles_scatter.dispatchIndirect({ encoder, command: command_next, bindings: { ...bindings,
221
+ visible: this.#visible, staging: this.#staging } });
222
+ shader_water_particles_rank.dispatchIndirect({ encoder, command: command_next, bindings: { ...bindings,
223
+ staging: this.#staging, entries: this.#entries } });
224
+ shader_water_particles_bounds.dispatchIndirect({ encoder, command: command_next, bindings: { next, activity,
225
+ offsets: this.#buckets, bucket_amplitude: this.#bucket_amplitude, body_bounds: this.#body_bounds } });
226
+ }, { buckets }, {});
227
+ }
228
+ }
@@ -0,0 +1,17 @@
1
+ /**
2
+ * One wave particle (Yuksel, House & Keyser 2007): a point of an expanding wave front carrying a small wave
3
+ * packet, in the metric local frame of the water body it lives on
4
+ * (WATER_SURFACE_SIMULATION_PLAN_2026_10_06.md §5).
5
+ *
6
+ * Its position is not stored; it is `origin + direction(angle) · group_speed(radius) · age`, so it moves
7
+ * without integration error and every particle of one front shares the origin and the age.
8
+ */
9
+ export const WATER_PARTICLE_STRUCT: WebGPUStruct;
10
+ /**
11
+ * A particle as one hash cell holds it for the surface sampler: everything its kernel needs at the frame's
12
+ * time, and the cell it was entered for, since one particle is entered in every cell its support overlaps and
13
+ * two cells may share a bucket.
14
+ */
15
+ export const WATER_PARTICLE_ENTRY_STRUCT: WebGPUStruct;
16
+ import { WebGPUStruct } from "../../../shader/type/WebGPUStruct.js";
17
+ //# sourceMappingURL=WATER_PARTICLE_STRUCT.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WATER_PARTICLE_STRUCT.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/water/surface/particles/WATER_PARTICLE_STRUCT.js"],"names":[],"mappings":"AAGA;;;;;;;GAOG;AACH,iDAeoB;AAEpB;;;;GAIG;AACH,uDAeyB;6BA/CI,sCAAsC"}
@@ -0,0 +1,49 @@
1
+ import { f32, u32, vec2f, vec2i } from "../../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
2
+ import { WebGPUStruct } from "../../../shader/type/WebGPUStruct.js";
3
+
4
+ /**
5
+ * One wave particle (Yuksel, House & Keyser 2007): a point of an expanding wave front carrying a small wave
6
+ * packet, in the metric local frame of the water body it lives on
7
+ * (WATER_SURFACE_SIMULATION_PLAN_2026_10_06.md §5).
8
+ *
9
+ * Its position is not stored; it is `origin + direction(angle) · group_speed(radius) · age`, so it moves
10
+ * without integration error and every particle of one front shares the origin and the age.
11
+ */
12
+ export const WATER_PARTICLE_STRUCT = WebGPUStruct.from({
13
+ /** Centre of the front, or its mirror image after a reflection; metric local xz. */
14
+ origin: vec2f,
15
+ /** Propagation direction, radians from local +x towards +z. */
16
+ angle: f32,
17
+ /** Seconds the front has travelled from its origin. */
18
+ age: f32,
19
+ /** Signed ridge height at the packet's centre, metres. */
20
+ amplitude: f32,
21
+ /** Half the packet's wavelength, metres. */
22
+ radius: f32,
23
+ /** Angle to the neighbouring particle of the same front. */
24
+ dispersion: f32,
25
+ /** The water_waves row of the body it lives on. */
26
+ body: u32,
27
+ }, 'WaterParticle');
28
+
29
+ /**
30
+ * A particle as one hash cell holds it for the surface sampler: everything its kernel needs at the frame's
31
+ * time, and the cell it was entered for, since one particle is entered in every cell its support overlaps and
32
+ * two cells may share a bucket.
33
+ */
34
+ export const WATER_PARTICLE_ENTRY_STRUCT = WebGPUStruct.from({
35
+ position: vec2f,
36
+ cell: vec2i,
37
+ angle: f32,
38
+ amplitude: f32,
39
+ radius: f32,
40
+ /** Tangential window: the distance to the front's neighbouring particle. */
41
+ width: f32,
42
+ /** Carrier phase lag of the crests behind the envelope, radians. */
43
+ phase: f32,
44
+ /** water_waves row << 4 | level */
45
+ key: u32,
46
+ /** Index of the particle, which orders a bucket. */
47
+ source: u32,
48
+ reserved: u32,
49
+ }, 'WaterParticleEntry');
@@ -0,0 +1,22 @@
1
+ /** Levels of the particle hash: cell sizes 4 mm · 2^level, so supports up to 64 m. */
2
+ export const WATER_PARTICLE_LEVELS: 16;
3
+ /** Cell size of level 0, metres. A particle sits at the smallest level whose cell is at least its support's diameter. */
4
+ export const WATER_PARTICLE_LEVEL0_CELL: number;
5
+ /**
6
+ * The physics of one wave particle as pure functions (WATER_SURFACE_SIMULATION_PLAN_2026_10_06.md §5).
7
+ *
8
+ * A particle of radius r carries a packet of wavelength 2r, k = π/r. Under the gravity–capillary
9
+ * dispersion relation the packet's envelope travels at the group speed and its crests at the phase speed
10
+ * (Jeschke & Wojtan 2017; Xue et al. 2025 give wave particles their own wavelength's dispersion). It loses
11
+ * amplitude at the clean-surface viscous rate 2νk² plus the surface-film rate k√(νω)/(2√2) of natural
12
+ * water — so a raindrop's ripple is gone in a fraction of a second while a big splash crosses a bay.
13
+ *
14
+ * The particles of a front are W apart, W the front's arc between them; a cosine window of half-width W
15
+ * along the front is a partition of unity over them, so the front's height is the packet's amplitude
16
+ * whatever the spacing, and one front adds at most two particles at any point.
17
+ *
18
+ * @type {CodeChunk}
19
+ */
20
+ export const chunk_water_particle: CodeChunk;
21
+ import { CodeChunk } from "../../../shader/compiler/CodeChunk.js";
22
+ //# sourceMappingURL=chunk_water_particle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk_water_particle.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/water/surface/particles/chunk_water_particle.js"],"names":[],"mappings":"AAKA,sFAAsF;AACtF,uCAAwC;AAExC,yHAAyH;AACzH,gDAAkD;AAElD;;;;;;;;;;;;;;GAcG;AACH,mCAFU,SAAS,CAsH6G;0BA9ItG,uCAAuC"}
@@ -0,0 +1,143 @@
1
+ import { CodeChunk } from "../../../shader/compiler/CodeChunk.js";
2
+ import { chunk_pcg3d } from "../../../shader/chunk/random/pcg/chunk_pcg3d.js";
3
+ import { WATER_PARTICLE_ENTRY_STRUCT, WATER_PARTICLE_STRUCT } from "./WATER_PARTICLE_STRUCT.js";
4
+ import { chunk_water_spectrum } from "../spectrum/chunk_water_spectrum.js";
5
+
6
+ /** Levels of the particle hash: cell sizes 4 mm · 2^level, so supports up to 64 m. */
7
+ export const WATER_PARTICLE_LEVELS = 16;
8
+
9
+ /** Cell size of level 0, metres. A particle sits at the smallest level whose cell is at least its support's diameter. */
10
+ export const WATER_PARTICLE_LEVEL0_CELL = 1 / 256;
11
+
12
+ /**
13
+ * The physics of one wave particle as pure functions (WATER_SURFACE_SIMULATION_PLAN_2026_10_06.md §5).
14
+ *
15
+ * A particle of radius r carries a packet of wavelength 2r, k = π/r. Under the gravity–capillary
16
+ * dispersion relation the packet's envelope travels at the group speed and its crests at the phase speed
17
+ * (Jeschke & Wojtan 2017; Xue et al. 2025 give wave particles their own wavelength's dispersion). It loses
18
+ * amplitude at the clean-surface viscous rate 2νk² plus the surface-film rate k√(νω)/(2√2) of natural
19
+ * water — so a raindrop's ripple is gone in a fraction of a second while a big splash crosses a bay.
20
+ *
21
+ * The particles of a front are W apart, W the front's arc between them; a cosine window of half-width W
22
+ * along the front is a partition of unity over them, so the front's height is the packet's amplitude
23
+ * whatever the spacing, and one front adds at most two particles at any point.
24
+ *
25
+ * @type {CodeChunk}
26
+ */
27
+ export const chunk_water_particle = CodeChunk.from(/* language=WGSL */ `
28
+ const WATER_PARTICLE_LEVELS: u32 = ${WATER_PARTICLE_LEVELS}u;
29
+ const WATER_PARTICLE_LEVEL0_CELL: f32 = ${WATER_PARTICLE_LEVEL0_CELL};
30
+ // kinematic viscosity of water, m²/s
31
+ const WATER_VISCOSITY: f32 = 1e-6;
32
+ const WATER_PI: f32 = 3.14159265358979;
33
+
34
+ fn water_particle_wavenumber(radius: f32) -> f32 {
35
+ return WATER_PI / radius;
36
+ }
37
+
38
+ // Phase speed of the particle's wavelength, m/s: how fast its crests move.
39
+ fn water_particle_phase_speed(radius: f32) -> f32 {
40
+ let k = water_particle_wavenumber(radius);
41
+ return water_dispersion(k) / k;
42
+ }
43
+
44
+ // Group speed dω/dk of the particle's wavelength, m/s: how fast its packet moves.
45
+ fn water_particle_group_speed(radius: f32) -> f32 {
46
+ let k = water_particle_wavenumber(radius);
47
+ return (WATER_GRAVITY + 3.0 * WATER_SURFACE_TENSION * k * k) / (2.0 * water_dispersion(k));
48
+ }
49
+
50
+ // Amplitude decay rate, 1/s: viscous plus surface film.
51
+ fn water_particle_damping(radius: f32) -> f32 {
52
+ let k = water_particle_wavenumber(radius);
53
+ return 2.0 * WATER_VISCOSITY * k * k + k * sqrt(WATER_VISCOSITY * water_dispersion(k)) / (2.0 * sqrt(2.0));
54
+ }
55
+
56
+ fn water_particle_direction(angle: f32) -> vec2<f32> {
57
+ return vec2<f32>(cos(angle), sin(angle));
58
+ }
59
+
60
+ // Distance the front has travelled from its origin.
61
+ fn water_particle_distance(particle: ${WATER_PARTICLE_STRUCT.wgsl_ref}) -> f32 {
62
+ return water_particle_group_speed(particle.radius) * particle.age;
63
+ }
64
+
65
+ fn water_particle_position(particle: ${WATER_PARTICLE_STRUCT.wgsl_ref}) -> vec2<f32> {
66
+ return particle.origin + water_particle_direction(particle.angle) * water_particle_distance(particle);
67
+ }
68
+
69
+ // The front's arc between neighbouring particles: the half-width of the tangential window.
70
+ fn water_particle_width(particle: ${WATER_PARTICLE_STRUCT.wgsl_ref}) -> f32 {
71
+ return max(particle.dispersion * water_particle_distance(particle), 1e-3 * particle.radius);
72
+ }
73
+
74
+ // How far the crests have slid through the envelope: k (c − c_g) age.
75
+ fn water_particle_phase(particle: ${WATER_PARTICLE_STRUCT.wgsl_ref}) -> f32 {
76
+ let lag = (water_particle_phase_speed(particle.radius) - water_particle_group_speed(particle.radius)) * particle.age;
77
+ return water_particle_wavenumber(particle.radius) * lag;
78
+ }
79
+
80
+ // Radius of a circle around the particle holding its whole kernel: two radii across the front, the window along it.
81
+ fn water_particle_support(radius: f32, width: f32) -> f32 {
82
+ return length(vec2<f32>(2.0 * radius, width));
83
+ }
84
+
85
+ // The smallest hash level whose cell is at least the support's diameter, so the support overlaps at most
86
+ // the 2×2 cells around it.
87
+ fn water_particle_level(support: f32) -> u32 {
88
+ let level = ceil(log2(max(2.0 * support / WATER_PARTICLE_LEVEL0_CELL, 1.0)));
89
+ return min(u32(level), WATER_PARTICLE_LEVELS - 1u);
90
+ }
91
+
92
+ fn water_particle_cell_size(level: u32) -> f32 {
93
+ return WATER_PARTICLE_LEVEL0_CELL * exp2(f32(level));
94
+ }
95
+
96
+ fn water_particle_bucket(body: u32, level: u32, cell: vec2<i32>, table_size: u32) -> u32 {
97
+ let bits = pcg3d(vec3<u32>((body << 4u) | level, bitcast<u32>(cell.x), bitcast<u32>(cell.y)));
98
+ return bits.x & (table_size - 1u);
99
+ }
100
+
101
+ struct WaterParticleField {
102
+ height: f32,
103
+ // ∂h/∂x, ∂h/∂z
104
+ slope: vec2<f32>,
105
+ displacement: vec2<f32>,
106
+ // columns ∂D/∂x and ∂D/∂z: (∂Dx/∂x, ∂Dz/∂x), (∂Dx/∂z, ∂Dz/∂z)
107
+ jacobian: mat2x2<f32>,
108
+ }
109
+
110
+ // The packet at offset d from its particle. u across the front, v along it: envelope E(u) over two radii,
111
+ // window T(v) over the width, carrier phase φ = πu/r − phase. Height a·E·T·cos φ; horizontal displacement
112
+ // −a·E·T·sin φ along the direction (Gerstner-like orbits, Yuksel's longitudinal sign); with derivatives.
113
+ fn water_particle_field(d: vec2<f32>, angle: f32, amplitude: f32, radius: f32, width: f32, phase: f32) -> WaterParticleField {
114
+ var field: WaterParticleField;
115
+ let direction = water_particle_direction(angle);
116
+ let tangent = vec2<f32>(-direction.y, direction.x);
117
+ let u = dot(d, direction);
118
+ let v = dot(d, tangent);
119
+ if (abs(u) >= 2.0 * radius || abs(v) >= width) { return field; }
120
+ let eu = 0.5 * WATER_PI * u / radius;
121
+ let envelope = 0.5 * (1.0 + cos(eu));
122
+ let envelope_du = -0.25 * WATER_PI / radius * sin(eu);
123
+ let tv = WATER_PI * v / width;
124
+ let window = 0.5 * (1.0 + cos(tv));
125
+ let window_dv = -0.5 * WATER_PI / width * sin(tv);
126
+ let carrier = WATER_PI * u / radius - phase;
127
+ let c = cos(carrier);
128
+ let s = sin(carrier);
129
+ let k = WATER_PI / radius;
130
+ let z = amplitude * envelope * window * c;
131
+ let z_u = amplitude * window * (envelope_du * c - envelope * s * k);
132
+ let z_v = amplitude * envelope * window_dv * c;
133
+ let h = -amplitude * envelope * window * s;
134
+ let h_u = -amplitude * window * (envelope_du * s + envelope * c * k);
135
+ let h_v = -amplitude * envelope * window_dv * s;
136
+ let gradient_h = h_u * direction + h_v * tangent;
137
+ field.height = z;
138
+ field.slope = z_u * direction + z_v * tangent;
139
+ field.displacement = h * direction;
140
+ field.jacobian = mat2x2<f32>(direction * gradient_h.x, direction * gradient_h.y);
141
+ return field;
142
+ }
143
+ `, [chunk_water_spectrum, chunk_pcg3d, WATER_PARTICLE_STRUCT.declaration_chunk, WATER_PARTICLE_ENTRY_STRUCT.declaration_chunk]);
@@ -0,0 +1,15 @@
1
+ /** Seconds over which a packet that has fallen below the drawing threshold fades to a tenth of it, where it dies. */
2
+ export const WATER_PARTICLE_FADE_SECONDS: 0.15;
3
+ /**
4
+ * One frame of one wave particle (WATER_SURFACE_SIMULATION_PLAN_2026_10_06.md §5.1): it ages, spreads over its
5
+ * widening front, damps, reflects off its body's authored outline, and dies or splits.
6
+ *
7
+ * Whether a point is over the body is a down-ray into the body's own BLAS, so the outline is exactly the
8
+ * authored mesh's, holes for islands included. Bindings: `geometries`, `blas_lookup`, `blas_data`,
9
+ * `meshlet_metadata`, `meshlet_data`.
10
+ *
11
+ * @type {CodeChunk}
12
+ */
13
+ export const chunk_water_particle_step: CodeChunk;
14
+ import { CodeChunk } from "../../../shader/compiler/CodeChunk.js";
15
+ //# sourceMappingURL=chunk_water_particle_step.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk_water_particle_step.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/water/surface/particles/chunk_water_particle_step.js"],"names":[],"mappings":"AAOA,qHAAqH;AACrH,+CAAgD;AAEhD;;;;;;;;;GASG;AACH,wCAFU,SAAS,CAsGsC;0BAxH/B,uCAAuC"}