@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
@@ -25,8 +25,12 @@ import { chunk_water_gi_brick4, chunk_water_gi_ibl } from "./chunk_water_gi.js";
25
25
  import { WATER_BODIES_TABLE, WATER_WAVES_TABLE } from "./medium/chunk_water_bodies.js";
26
26
  import { MESHLET_METADATA_STRUCT } from "../geometry/meshlet/encoding/MESHLET_METADATA_STRUCT.js";
27
27
  import { COLLECTION_U32_STRUCT_READ } from "../gpu_primitive/COLLECTION_U32_STRUCT_READ.js";
28
- import { chunk_lower_bound_branchless } from "../shader/chunk/math/chunk_lower_bound_branchless.js";
29
- import { chunk_water_tessellation, WATER_TILE_STRUCT, WATER_TESSELLATION_STRUCT, WATER_TILE_CELLS } from "./surface/chunk_water_tessellation.js";
28
+ import { chunk_water_surface_sample } from "./surface/chunk_water_surface_sample.js";
29
+ import { WATER_PARTICLE_ENTRY_STRUCT } from "./surface/particles/WATER_PARTICLE_STRUCT.js";
30
+ import { WATER_LOD_BODY_STRUCT, WATER_LOD_VIEW_STRUCT, WaterLodMode } from "./surface/lod/WATER_LOD.js";
31
+ import { chunk_water_lod_candidate, chunk_water_lod_layout, WATER_LOD_BOUNDARY_FIRST_VERTEX, WATER_LOD_CANDIDATE_STRUCT,
32
+ WATER_LOD_CELL_LOCAL_BITS, WATER_LOD_LIMITS_STRUCT, WATER_LOD_PATCH_FIRST_VERTEX, WATER_LOD_PATCH_SIDE, WATER_LOD_POLYGON_WORDS,
33
+ WATER_LOD_TRIANGLE_FIRST_VERTEX, WaterLodList } from "./surface/lod/shader_water_lod.js";
30
34
  import { chunk_read_meshlet_vertex_by_draw_index } from "../shader/chunk/geometry/meshlet/chunk_read_meshlet_vertex_by_draw_index.js";
31
35
  import { chunk_scene_database_access } from "../scene/chunk_scene_database_access.js";
32
36
  import { chunk_mat3_inverse } from "../shader/chunk/geometry/mat3/chunk_mat3_inverse.js";
@@ -37,8 +41,6 @@ import { chunk_water_optics } from "./optics/chunk_water_optics.js";
37
41
  import { chunk_water_receiver_radiance, chunk_water_receiver_texel, chunk_water_refraction_confidence,
38
42
  chunk_water_transport, WATER_LEVEL_TOLERANCE_DECLARATION } from './chunk_water_transport.js';
39
43
 
40
- export const WATER_GRID_STRUCT = WebGPUStruct.from({ resolution: u32 }, 'WaterGrid');
41
-
42
44
  export const WATER_TRACE_STRUCT = WebGPUStruct.from({
43
45
  max_distance: f32, distance_tolerance: f32, max_updates: u32, fallback_steps: u32,
44
46
  mode: u32, reflections: u32,
@@ -56,13 +58,20 @@ function water_resources(finalize = false) {
56
58
  .addTexture("tHZB")
57
59
  .addTexture("tScene")
58
60
  .addStorageBuffer('scene_database', WebGPUArray.u32)
59
- .addStorageBuffer('water_tiles', WebGPUArray.from(WATER_TILE_STRUCT))
60
- .addStorageBuffer('water_tile_sums', COLLECTION_U32_STRUCT_READ)
61
- .addUniform('tessellation', WATER_TESSELLATION_STRUCT)
61
+ // the view's lattice (WATER_SURFACE_DISTANCE_LOD_PROPOSAL_2026_10_06.md §4.3)
62
+ .addUniform('lod', WATER_LOD_VIEW_STRUCT)
63
+ .addUniform('lod_limits', WATER_LOD_LIMITS_STRUCT)
64
+ .addStorageBuffer('water_lod_bodies', WebGPUArray.from(WATER_LOD_BODY_STRUCT))
65
+ .addStorageBuffer('water_lod_candidates', WebGPUArray.from(WATER_LOD_CANDIDATE_STRUCT))
66
+ .addStorageBuffer('water_lod_cells', WebGPUArray.u32)
62
67
  .addStorageBuffer('meshlet_metadata', WebGPUArray.from(MESHLET_METADATA_STRUCT))
63
68
  .addStorageBuffer('meshlet_data', WebGPUArray.from(f32))
64
- .addStorageBuffer('wave_state', WebGPUArray.from(f32))
65
- .addUniform('wave_grid', WATER_GRID_STRUCT);
69
+ // the surface interface: the spectral bands and the frame's binned wave particles
70
+ .addTexture('water_band_displacement', 'float', '2d-array')
71
+ .addTexture('water_band_derivatives', 'float', '2d-array')
72
+ .addSampler('water_band_sampler')
73
+ .addStorageBuffer('water_particle_offsets', COLLECTION_U32_STRUCT_READ)
74
+ .addStorageBuffer('water_particle_entries', WebGPUArray.from(WATER_PARTICLE_ENTRY_STRUCT));
66
75
  if (finalize) {
67
76
  group.addTexture('receiver').addTexture('trace_metadata').addTexture('visibility_distance');
68
77
  }
@@ -88,79 +97,194 @@ struct WaterVertexOut {
88
97
  // makes the position bit-identical across programs.
89
98
  @invariant @builtin(position) clip: vec4<f32>,
90
99
  @location(0) world: vec3<f32>,
100
+ // the normal of the waves the mesh carries
91
101
  @location(1) normal: vec3<f32>,
92
- // slope variance of the waves the surface's mesh does not resolve
102
+ // slope variance of the wave packets the mesh does not resolve; the bands' is the pixel's to work out
93
103
  @location(2) unresolved_variance: f32,
94
104
  @location(3) @interpolate(flat) body_index: u32,
95
105
  @location(4) rest_normal: vec3<f32>,
106
+ // where on the body's rest surface this is, metric local xz, and the footprint its waves were filtered to there:
107
+ // what the pixel samples the bands the mesh could not carry at; 0 where no waves move the surface
108
+ @location(5) metric: vec2<f32>,
109
+ @location(6) footprint: f32,
110
+ @location(7) @interpolate(flat) wave: u32,
111
+ // the body's metric x and z axes in the world, to tilt the normal along
112
+ @location(8) @interpolate(flat) axis_x: vec3<f32>,
113
+ @location(9) @interpolate(flat) axis_z: vec3<f32>,
114
+ // the metres a pixel spans on the rest surface: its distance times its angle, stretched where the surface is seen
115
+ // at a slant (the mean of its two axes)
116
+ @location(10) pixel_footprint: f32,
117
+ }
118
+
119
+ fn water_vertex_out_none(body_index: u32) -> WaterVertexOut {
120
+ return WaterVertexOut(vec4f(0, 0, 0, 1), vec3f(0), vec3f(0, 1, 0), 0.0, body_index, vec3f(0, 1, 0), vec2f(0), 0.0, 0u,
121
+ vec3f(1, 0, 0), vec3f(0, 0, 1), 0.0);
122
+ }
123
+
124
+ struct WaterPixelSurface {
125
+ normal: vec3<f32>,
126
+ variance: f32,
127
+ }
128
+
129
+ // The surface a pixel shades: the mesh's normal tilted by the bands the pixel resolves and the mesh could not carry;
130
+ // the slope variance of the bands neither resolves, and of the packets the mesh did not draw.
131
+ fn water_pixel_surface(in: WaterVertexOut, pixel_footprint: f32) -> WaterPixelSurface {
132
+ if (!(in.footprint > 0.0)) { return WaterPixelSurface(in.normal, in.unresolved_variance); }
133
+ let detail = water_surface_detail(in.wave, in.metric, in.footprint, pixel_footprint);
134
+ let normal = normalize(in.normal - detail.slope.x * in.axis_x - detail.slope.y * in.axis_z);
135
+ return WaterPixelSurface(normal, in.unresolved_variance + detail.variance);
136
+ }
137
+
138
+ // The rest point a vertex of the view's lattice stands for, and how it is drawn.
139
+ struct WaterLodVertex {
140
+ // local units
141
+ rest: WaterLodRest,
142
+ // metric local xz, where the waves are sampled
143
+ metric: vec2<f32>,
144
+ // metres between samples the waves are filtered to; 0 for a vertex the waves do not move
145
+ footprint: f32,
146
+ present: bool,
96
147
  }
97
148
 
98
- fn water_wave_height(row: u32, cell: vec2i) -> f32 {
99
- let n = i32(wave_grid.resolution);
100
- let c = clamp(cell, vec2i(0), vec2i(n - 1));
101
- return wave_state[row * u32(n * n) + u32(c.y * n + c.x)];
149
+ const WATER_LOD_QUAD: array<u32, 6> = array<u32, 6>(0u, 1u, 2u, 0u, 2u, 3u);
150
+ const WATER_LOD_QUAD_REVERSED: array<u32, 6> = array<u32, 6>(0u, 2u, 1u, 0u, 3u, 2u);
151
+
152
+ // A lattice point of a cell drawn whole: on the triangle's surface, along an authored edge where it lies on one.
153
+ fn water_lod_whole_point(level: u32, point: vec2<i32>, frame: ${WATER_LOD_BODY_STRUCT.wgsl_ref}, tri: WaterLodTriangle) -> WaterLodVertex {
154
+ var out: WaterLodVertex;
155
+ let p = water_lod_lattice_point(lod, frame, level, point);
156
+ out.rest = water_lod_rest(tri, water_lod_edge_bits(tri, p), p, frame.scale);
157
+ out.metric = p;
158
+ out.footprint = water_lod_footprint(lod, frame, level, p);
159
+ out.present = true;
160
+ return out;
161
+ }
162
+
163
+ fn water_lod_vertex(list: u32, corner: u32, candidate: ${WATER_LOD_CANDIDATE_STRUCT.wgsl_ref}, place: u32,
164
+ frame: ${WATER_LOD_BODY_STRUCT.wgsl_ref}, tri: WaterLodTriangle, mirrored: bool, polygon: vec2<u32>) -> WaterLodVertex {
165
+ var out: WaterLodVertex;
166
+ let packed = candidate.packed;
167
+ if (list == ${WaterLodList.Triangle}u) {
168
+ // the authored triangle itself, wound as authored
169
+ let k = select(corner, 2u - corner, mirrored);
170
+ out.rest = WaterLodRest(tri.local[k], tri.normal[k]);
171
+ out.metric = tri.p[k];
172
+ out.present = true;
173
+ return out;
174
+ }
175
+ let level = water_lod_candidate_level(packed);
176
+ if (place >= 256u) { return out; }
177
+ // the cell's place in its node: quadrant · 64 + row · 8 + column
178
+ let cell = water_lod_quadrant_origin(candidate.node, place >> 6u) + vec2<i32>(i32(place & 7u), i32((place >> 3u) & 7u));
179
+ // a cell's corners run counter-clockwise from x towards z; the authored triangle may run the other way, and a
180
+ // mirroring placement turns both
181
+ let reversed = tri.ccw == mirrored;
182
+ if (list == ${WaterLodList.Patch}u) {
183
+ // the patch's indices run its points row by row; read across instead, they turn every cell the other way
184
+ var grid = vec2<i32>(i32(corner % ${WATER_LOD_PATCH_SIDE}u), i32(corner / ${WATER_LOD_PATCH_SIDE}u));
185
+ if (reversed) { grid = grid.yx; }
186
+ return water_lod_whole_point(level, cell + grid, frame, tri);
187
+ }
188
+ if (list == ${WaterLodList.Interior}u) {
189
+ let k = select(WATER_LOD_QUAD[corner], WATER_LOD_QUAD_REVERSED[corner], reversed);
190
+ return water_lod_whole_point(level, cell + vec2<i32>(i32(k == 1u || k == 2u), i32(k >= 2u)), frame, tri);
191
+ }
192
+ // a boundary cell's point, rebuilt from what the cells pass found it to lie on
193
+ let corners = array<vec2<f32>, 4>(
194
+ water_lod_lattice_point(lod, frame, level, cell),
195
+ water_lod_lattice_point(lod, frame, level, cell + vec2<i32>(1, 0)),
196
+ water_lod_lattice_point(lod, frame, level, cell + vec2<i32>(1, 1)),
197
+ water_lod_lattice_point(lod, frame, level, cell + vec2<i32>(0, 1)));
198
+ let fan = corner / 3u;
199
+ let at = corner % 3u;
200
+ var index = 0u;
201
+ if (at != 0u) { index = select(fan + at, fan + 3u - at, reversed); }
202
+ let bits = water_lod_polygon_bits(polygon, index);
203
+ out.metric = water_lod_point(tri, corners, bits);
204
+ out.rest = water_lod_rest(tri, bits, out.metric, frame.scale);
205
+ out.footprint = water_lod_footprint(lod, frame, level, out.metric);
206
+ out.present = true;
207
+ return out;
102
208
  }
103
209
 
104
- // One instance per occupied view tile and source triangle. All overlap candidates survive
105
- // classification; receiver depth selects the nearest displaced interface.
210
+ // One instance a record of one of the view's lists; the list is told by the draw's first vertex.
106
211
  @vertex
107
212
  fn vs_main(@builtin(vertex_index) vi: u32, @builtin(instance_index) ii: u32) -> WaterVertexOut {
108
- let row = lower_bound_branchless(&water_tile_sums.elements, ii + 1u, water_tile_sums.count);
109
- let definition = water_tiles[row];
110
- let body = ${WATER_BODIES_TABLE.marshalling_method_read}(&scene_database, definition.body);
111
- let header = meshlet_metadata[definition.meshlet];
213
+ var list = ${WaterLodList.Interior}u;
214
+ var corner = vi;
215
+ var candidate: ${WATER_LOD_CANDIDATE_STRUCT.wgsl_ref};
216
+ var place = 0u;
217
+ var polygon = vec2<u32>(0u);
218
+ if (vi >= ${WATER_LOD_PATCH_FIRST_VERTEX}u) {
219
+ // a patch: its candidate and its quadrant's first cell; the index names the point
220
+ list = ${WaterLodList.Patch}u; corner = vi - ${WATER_LOD_PATCH_FIRST_VERTEX}u;
221
+ let record = water_lod_cells[water_lod_patches_base(lod_limits) + ii];
222
+ candidate = water_lod_candidates[record >> ${WATER_LOD_CELL_LOCAL_BITS}u];
223
+ place = record & ${(1 << WATER_LOD_CELL_LOCAL_BITS) - 1}u;
224
+ } else if (vi >= ${WATER_LOD_TRIANGLE_FIRST_VERTEX}u) {
225
+ // a triangle drawn as itself: its meshlet, then its body row and its triangle
226
+ list = ${WaterLodList.Triangle}u; corner = vi - ${WATER_LOD_TRIANGLE_FIRST_VERTEX}u;
227
+ let at = water_lod_triangles_base(lod_limits) + 2u * ii;
228
+ candidate.meshlet = water_lod_cells[at];
229
+ candidate.body = water_lod_cells[at + 1u] >> 7u;
230
+ candidate.packed = water_lod_cells[at + 1u] & 127u;
231
+ } else {
232
+ var base = 0u;
233
+ if (vi >= ${WATER_LOD_BOUNDARY_FIRST_VERTEX}u) {
234
+ list = ${WaterLodList.Boundary}u; corner = vi - ${WATER_LOD_BOUNDARY_FIRST_VERTEX}u; base = lod_limits.interior;
235
+ // a fan triangle past the cell's polygon draws nothing, decided before anything else is read
236
+ let at = water_lod_polygons_base(lod_limits) + ${WATER_LOD_POLYGON_WORDS}u * ii;
237
+ polygon = vec2<u32>(water_lod_cells[at], water_lod_cells[at + 1u]);
238
+ if (water_lod_polygon_count(polygon) < corner / 3u + 3u) { return water_vertex_out_none(0u); }
239
+ }
240
+ let record = water_lod_cells[base + ii];
241
+ candidate = water_lod_candidates[record >> ${WATER_LOD_CELL_LOCAL_BITS}u];
242
+ place = record & ${(1 << WATER_LOD_CELL_LOCAL_BITS) - 1}u;
243
+ }
244
+ let body = ${WATER_BODIES_TABLE.marshalling_method_read}(&scene_database, candidate.body);
245
+ let frame = water_lod_bodies[candidate.body];
112
246
  let node = scene_read_node(&scene_database, body.node);
113
- var previous = 0u;
114
- if (row > 0u) { previous = water_tile_sums.elements[row - 1u]; }
115
- let patch_index = ii - previous;
116
- let tile = definition.origin + vec2i(i32(patch_index % definition.size.x), i32(patch_index / definition.size.x));
117
- let cell = vi / 18u;
118
- let lattice = tile * ${WATER_TILE_CELLS} + vec2i(i32(cell % ${WATER_TILE_CELLS}u), i32(cell / ${WATER_TILE_CELLS}u));
119
- let pixel = vec2f(lattice) * definition.pixels;
120
- let ndc0 = pixel / tessellation.resolution * vec2f(2,-2) + vec2f(-1,1);
121
- // Form both endpoints from their integer lattice coordinate. Adding the pitch to
122
- // an already rounded pixel coordinate gives neighbouring cells different edges.
123
- let ndc1 = (vec2f(lattice + vec2i(1)) * definition.pixels) / tessellation.resolution * vec2f(2,-2) + vec2f(-1,1);
124
- let a = read_meshlet_vertex_by_draw_index(header, definition.triangle * 3u);
125
- let b = read_meshlet_vertex_by_draw_index(header, definition.triangle * 3u + 1u);
126
- let c = read_meshlet_vertex_by_draw_index(header, definition.triangle * 3u + 2u);
127
- let simulated = body.wave != ~0u;
128
- let ca = tessellation.view_projection_matrix * (node.global * vec4f(water_reference_position(a.position, definition.anchor, simulated), 1));
129
- let cb = tessellation.view_projection_matrix * (node.global * vec4f(water_reference_position(b.position, definition.anchor, simulated), 1));
130
- let cc = tessellation.view_projection_matrix * (node.global * vec4f(water_reference_position(c.position, definition.anchor, simulated), 1));
131
- let polygon = water_cell_polygon(ca, cb, cc, min(ndc0,ndc1), max(ndc0,ndc1));
132
- let fan = (vi % 18u) / 3u;
133
- if (polygon.count < fan + 3u) { return WaterVertexOut(vec4f(0,0,0,1),vec3f(0),vec3f(0,1,0),0,definition.body,vec3f(0,1,0)); }
134
- let corner = select(vi % 3u, 2u - vi % 3u, (node.global_flags & ${NODE3D_GLOBAL_FLAG_MIRRORED}u) != 0u);
135
- var index = 0u;
136
- if (corner != 0u) { index = fan + corner; }
137
- let barycentric = polygon.points[index];
138
- var position = water_corner_position(a.position,b.position,c.position,ca,cb,cc,barycentric,
139
- polygon.boundaries[index],min(ndc0,ndc1),max(ndc0,ndc1));
140
- var normal = normalize(a.normal * barycentric.x + b.normal * barycentric.y + c.normal * barycentric.z);
247
+ let header = meshlet_metadata[candidate.meshlet];
248
+ let triangle = water_lod_candidate_triangle(candidate.packed);
249
+ let a = read_meshlet_vertex_by_draw_index(header, triangle * 3u);
250
+ let b = read_meshlet_vertex_by_draw_index(header, triangle * 3u + 1u);
251
+ let c = read_meshlet_vertex_by_draw_index(header, triangle * 3u + 2u);
252
+ let tri = water_lod_triangle(a.position, b.position, c.position, a.normal, b.normal, c.normal, frame.scale);
253
+ let mirrored = (node.global_flags & ${NODE3D_GLOBAL_FLAG_MIRRORED}u) != 0u;
254
+ let vertex = water_lod_vertex(list, corner, candidate, place, frame, tri, mirrored, polygon);
255
+ if (!vertex.present) { return water_vertex_out_none(candidate.body); }
256
+ var position = vertex.rest.position;
257
+ var normal = normalize(vertex.rest.normal);
141
258
  let rest_normal = normal;
142
259
  var variance = 0.0;
143
- if (body.wave != ~0u) {
144
- let params = ${WATER_WAVES_TABLE.marshalling_method_read}(&scene_database, body.wave);
145
- let spacing = max((params.extent.zw - params.extent.xy) / f32(wave_grid.resolution - 1u), vec2f(1e-20));
146
- let grid = clamp((position.xz - params.extent.xy) / spacing, vec2f(0.0), vec2f(f32(wave_grid.resolution - 1u)));
147
- let cell = vec2i(grid);
148
- let blend = fract(grid);
149
- let h00 = water_wave_height(body.wave, cell);
150
- let h10 = water_wave_height(body.wave, cell + vec2i(1, 0));
151
- let h01 = water_wave_height(body.wave, cell + vec2i(0, 1));
152
- let h11 = water_wave_height(body.wave, cell + vec2i(1, 1));
153
- position.y += mix(mix(h00, h10, blend.x), mix(h01, h11, blend.x), blend.y);
154
- let slope = vec2f(mix(h10 - h00, h11 - h01, blend.y), mix(h01 - h00, h11 - h10, blend.x)) / spacing;
260
+ var footprint = 0.0;
261
+ if (frame.mode != ${WaterLodMode.Hidden}u && any(frame.bounds != vec2<f32>(0.0))) {
262
+ // a vertex the waves do not move carries none of them: its pixels shade what they resolve
263
+ footprint = select(1e30, vertex.footprint, vertex.footprint > 0.0);
264
+ let sum = water_surface_sum(body.wave, vertex.metric, footprint);
265
+ let surface = water_surface_finish(sum, 1.0);
266
+ // the metric frame's normal in the local frame is S·n
267
+ let tilted = surface.normal * frame.scale;
268
+ let slope = -tilted.xz / tilted.y;
269
+ if (vertex.footprint > 0.0) { position += surface.offset / frame.scale; }
155
270
  normal = normalize(vec3f(normal.x - normal.y * slope.x, normal.y, normal.z - normal.y * slope.y));
156
- variance = params.unresolved_variance;
271
+ if (vertex.footprint <= 0.0) { normal = rest_normal; }
272
+ variance = sum.particle_variance;
157
273
  }
158
274
  let world = (node.global * vec4f(position, 1.0)).xyz;
159
275
  let linear = mat3x3f(node.global[0].xyz, node.global[1].xyz, node.global[2].xyz);
160
276
  let inverse_transpose = transpose(mat3_inverse(linear));
161
277
  let normal_ws = normalize(inverse_transpose * normal);
162
278
  let rest_normal_ws = normalize(inverse_transpose * rest_normal);
163
- return WaterVertexOut(camera.view_projection_matrix * vec4f(world, 1.0), world, normal_ws, variance, definition.body,rest_normal_ws);
279
+ // a pixel's footprint on the rest surface: distance times angle (an orthographic pixel's own size) across the view,
280
+ // that over the cosine at which the surface is seen along it; their geometric mean, as anisotropic filtering takes
281
+ let to_eye = camera.view_matrix_inverse[3].xyz - world;
282
+ let orthographic = lod.orthographic != 0u;
283
+ let across = select(length(to_eye) * lod.pixel, lod.pixel, orthographic);
284
+ let view = select(normalize(to_eye), normalize(camera.view_matrix_inverse[2].xyz), orthographic);
285
+ let pixel_footprint = across / sqrt(max(abs(dot(view, rest_normal_ws)), 0.05));
286
+ return WaterVertexOut(camera.view_projection_matrix * vec4f(world, 1.0), world, normal_ws, variance, candidate.body, rest_normal_ws,
287
+ vertex.metric, footprint, body.wave, normalize(node.global[0].xyz), normalize(node.global[2].xyz), pixel_footprint);
164
288
  }
165
289
 
166
290
  // The interface at one water fragment, in view space. Receivers trace through it and optics
@@ -185,9 +309,9 @@ fn water_interface(world: vec3<f32>, surface_normal: vec3<f32>, ior: f32, above:
185
309
  return WaterInterface(origin, normalize(origin), normalize(direction_world_to_view(normal_ws, camera)),
186
310
  max(ior, 1.0), min(max(trace.max_distance, 0.1), camera.clip_near_far.y));
187
311
  }
188
- `, [chunk_direction_world_to_view, WATER_BODIES_TABLE.chunk_read, WATER_WAVES_TABLE.chunk_read,
189
- chunk_read_meshlet_vertex_by_draw_index, chunk_scene_database_access, chunk_mat3_inverse,
190
- chunk_lower_bound_branchless, chunk_water_tessellation]);
312
+ `, [chunk_direction_world_to_view, WATER_BODIES_TABLE.chunk_read, chunk_read_meshlet_vertex_by_draw_index,
313
+ chunk_scene_database_access, chunk_mat3_inverse, chunk_water_lod_candidate, chunk_water_lod_layout,
314
+ WATER_LOD_CANDIDATE_STRUCT.declaration_chunk, chunk_water_surface_sample]);
191
315
 
192
316
  export const chunk_water_screen_ray = CodeChunk.from(/* language=WGSL */ `
193
317
  fn water_hzb_mip_size(depth_size: vec2f, hzb_size: vec2f, mip: i32) -> vec2f {
@@ -287,6 +411,7 @@ fn water_receiver_submerged(uv: vec2f, surface: vec3f, normal: vec3f) -> bool {
287
411
 
288
412
  @fragment
289
413
  fn fs_main(in: WaterVertexOut, @builtin(front_facing) above: bool) -> WaterReceiver {
414
+ let pixel = water_pixel_surface(in, in.pixel_footprint);
290
415
  let water = ${WATER_BODIES_TABLE.marshalling_method_read}(&scene_database, in.body_index);
291
416
  let coord = vec2<i32>(in.clip.xy);
292
417
  let dimensions = vec2f(textureDimensions(tDepth, 0));
@@ -305,7 +430,7 @@ fn fs_main(in: WaterVertexOut, @builtin(front_facing) above: bool) -> WaterRecei
305
430
  water_depth = abs(dot(in.world - (camera.view_matrix_inverse * vec4f(behind_vs, 1.0)).xyz, normalize(in.rest_normal)));
306
431
  }
307
432
  let coverage = smoothstep(0.0, 0.1, water_depth);
308
- let surface = water_interface(in.world, in.normal, water.ior, above);
433
+ let surface = water_interface(in.world, pixel.normal, water.ior, above);
309
434
  let interface_normal = direction_view_to_world(surface.normal, camera);
310
435
  let limit = surface.limit;
311
436
  let direction = refract(surface.incident, surface.normal, 1.0 / surface.ior);
@@ -364,6 +489,7 @@ struct WaterOptics {
364
489
  }
365
490
  @fragment
366
491
  fn fs_main(in: WaterVertexOut, @builtin(front_facing) above: bool) -> WaterOptics {
492
+ let pixel = water_pixel_surface(in, in.pixel_footprint);
367
493
  let water = ${WATER_BODIES_TABLE.marshalling_method_read}(&scene_database, in.body_index);
368
494
  let coord = vec2i(in.clip.xy);
369
495
  let metadata = textureLoad(trace_metadata, coord, 0);
@@ -372,7 +498,7 @@ fn fs_main(in: WaterVertexOut, @builtin(front_facing) above: bool) -> WaterOptic
372
498
  let dimensions = vec2f(textureDimensions(tDepth, 0));
373
499
  let uv = in.clip.xy / dimensions;
374
500
  let receiver_data = textureLoad(receiver, coord, 0);
375
- let surface = water_interface(in.world, in.normal, water.ior, above);
501
+ let surface = water_interface(in.world, pixel.normal, water.ior, above);
376
502
  let interface_normal = direction_view_to_world(surface.normal, camera);
377
503
  let body = water;
378
504
  let origin = surface.origin;
@@ -384,7 +510,7 @@ fn fs_main(in: WaterVertexOut, @builtin(front_facing) above: bool) -> WaterOptic
384
510
  let reflection_direction = reflect(surface.incident, surface.normal);
385
511
  // a reflection that misses on screen falls back to the GI mode, as SSR's resolve does
386
512
  var reflection = water_gi_specular(in.world, direction_view_to_world(surface.normal, camera),
387
- direction_view_to_world(-surface.incident, camera), clamp(sqrt(water.roughness * water.roughness + in.unresolved_variance), 0.0, 1.0));
513
+ direction_view_to_world(-surface.incident, camera), clamp(sqrt(water.roughness * water.roughness + pixel.variance), 0.0, 1.0));
388
514
  if (trace.reflections != 0u && above) {
389
515
  let reflected = water_hzb_hit(Ray(ray_at(origin, reflection_direction, 0.02), reflection_direction, limit),
390
516
  trace.fallback_steps);
@@ -468,12 +594,15 @@ export const WATER_RESOURCES = resources;
468
594
  function water_pipeline(shader, targets, finalize) {
469
595
  const code = shader.source;
470
596
  const layout = shader.resources.generatePipelineLayout(GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT);
471
- // Tile reconstruction spends six storage slots. Lighting spends four in the fragment stage.
472
- // Keep their visibility precise so the Brick4 variant fits the guaranteed stage budget.
473
- const vertex_only = new Set(['water_tiles', 'water_tile_sums', 'tessellation', 'meshlet_metadata', 'meshlet_data', 'wave_state', 'wave_grid']);
597
+ // The lattice spends eight storage slots in the vertex stage, the guaranteed budget. Lighting spends four in the
598
+ // fragment stage. Keep their visibility precise so the Brick4 variant fits it there.
599
+ const vertex_only = new Set(['lod', 'lod_limits', 'water_lod_bodies', 'water_lod_candidates', 'water_lod_cells',
600
+ 'meshlet_metadata', 'meshlet_data', 'water_band_displacement', 'water_particle_offsets', 'water_particle_entries']);
601
+ // the fragment stage shades the bands the mesh could not carry
602
+ const both = new Set(['camera', 'scene_database', 'water_band_derivatives', 'water_band_sampler']);
474
603
  shader.resources.groups.forEach((group, gi) => group.resources.forEach((resource, ri) => {
475
604
  layout.bindGroupLayouts[gi].entries[ri].visibility = vertex_only.has(resource.name) ? GPUShaderStage.VERTEX
476
- : resource.name === 'camera' || resource.name === 'scene_database' ? GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT
605
+ : both.has(resource.name) ? GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT
477
606
  : GPUShaderStage.FRAGMENT;
478
607
  }));
479
608
  return RenderPipelineDescriptor.from({
@@ -0,0 +1,70 @@
1
+ /** Times of its loop the bands are evaluated at once, on a device's first frame with wind, to seed their envelopes. */
2
+ export const WATER_ENVELOPE_SEED_TIMES: 32;
3
+ /** How the surface sampler reads the band tiles: filtered, and periodic. */
4
+ export const WATER_BAND_SAMPLER: Readonly<SamplerDescriptor>;
5
+ /**
6
+ * The water surface producer (WATER_SURFACE_SIMULATION_PLAN_2026_10_06.md §3), scheduled by what the frame's view
7
+ * sees (WATER_SURFACE_DISTANCE_LOD_PROPOSAL_2026_10_06.md §3): a culling pass over every body, then the shared
8
+ * spectral bands the visible bodies can draw, the wave particles of the bodies simulated this frame, and their
9
+ * bounds. Recorded once a frame at the head of the frame. What the surface passes bind of it is the surface
10
+ * interface: the band textures, the particle hash, and the rows.
11
+ */
12
+ export class GPUWaterSurface {
13
+ /** Dispatched with the scene when a frame that emitted the queued splashes is submitted. */
14
+ onInputsConsumed: Signal;
15
+ /** Most wave particles alive at once over every body of a scene. */
16
+ particle_capacity: number;
17
+ /** Whether any body has wind; without it the band tiles are not animated. */
18
+ windy: boolean;
19
+ /**
20
+ * Whether any splash was ever queued. Until one is, the pool is empty and no particle pass is recorded; set by
21
+ * whoever queues splashes.
22
+ */
23
+ splashed: boolean;
24
+ get displacement(): GPUTextureView;
25
+ get derivatives(): GPUTextureView;
26
+ get particle_offsets(): GPUBuffer;
27
+ get particle_entries(): GPUBuffer;
28
+ /** @returns {GPUBuffer} per wave row, set by the tessellation when a body has a triangle too steep to displace */
29
+ get steep(): GPUBuffer;
30
+ /** @returns {GPUBuffer} per wave row, the culling pass's {@link WaterActivity} bits for the frame */
31
+ get activity(): GPUBuffer;
32
+ /** @returns {GPUBuffer} the water_bodies rows the frame's culling pass found visible: a count, then the rows */
33
+ get visible_rows(): GPUBuffer;
34
+ get particles(): GPUWaterParticles;
35
+ /**
36
+ * Seconds of water time to step at the next recorded frame.
37
+ * @param {number} dt
38
+ */
39
+ advance(dt: number): void;
40
+ dispose(): void;
41
+ /**
42
+ * @param {object} options
43
+ * @param {import("../../../../engine/graphics/render/frame_graph/FrameGraph.js").FrameGraph} options.graph
44
+ * @param {GPUDevice} options.device
45
+ * @param {object} options.scene GPU scene context
46
+ * @param {number} options.time water time, seconds
47
+ * @param {object} options.view the view the frame is recorded for
48
+ * @param {GPUBuffer} options.view.camera its camera uniforms
49
+ * @param {ArrayLike<number>} options.view.projection its projection, column-major
50
+ * @param {number} options.view.height its render target's height, pixels
51
+ * @param {number} options.pixels the smallest a lattice cell is drawn on screen
52
+ */
53
+ record({ graph, device, scene, time, view, pixels }: {
54
+ graph: import("../../../../engine/graphics/render/frame_graph/FrameGraph.js").FrameGraph;
55
+ device: GPUDevice;
56
+ scene: object;
57
+ time: number;
58
+ view: {
59
+ camera: GPUBuffer;
60
+ projection: ArrayLike<number>;
61
+ height: number;
62
+ };
63
+ pixels: number;
64
+ }): void;
65
+ #private;
66
+ }
67
+ import { SamplerDescriptor } from "../../../descriptor/texture/SamplerDescriptor.js";
68
+ import Signal from "../../../../core/events/signal/Signal.js";
69
+ import { GPUWaterParticles } from "./particles/GPUWaterParticles.js";
70
+ //# sourceMappingURL=GPUWaterSurface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GPUWaterSurface.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/water/surface/GPUWaterSurface.js"],"names":[],"mappings":"AAmBA,uHAAuH;AACvH,2CAA4C;AAE5C,4EAA4E;AAC5E,6DAKI;AAEJ;;;;;;GAMG;AACH;IACI,4FAA4F;IAC5F,yBAAgC;IAChC,oEAAoE;IACpE,0BAA0B;IAC1B,6EAA6E;IAC7E,eAAc;IACd;;;OAGG;IACH,kBAAiB;IAejB,mCAA0D;IAC1D,kCAAwD;IACxD,kCAA0D;IAC1D,kCAA0D;IAC1D,kHAAkH;IAClH,uBAAmC;IACnC,qGAAqG;IACrG,0BAAyC;IACzC,gHAAgH;IAChH,8BAA2D;IAC3D,mCAA2C;IAE3C;;;OAGG;IACH,YAFW,MAAM,QAKhB;IAED,gBAWC;IAsBD;;;;;;;;;;;OAWG;IACH;QAVsG,KAAK,EAAhG,OAAO,8DAA8D,EAAE,UAAU;QAC9D,MAAM;QACT,KAAK,EAArB,MAAM;QACU,IAAI,EAApB,MAAM;QACU,IAAI;YACI,MAAM;YACE,UAAU,EAA1C,UAAU,MAAM,CAAC;YACI,MAAM,EAA3B,MAAM;;QACU,MAAM,EAAtB,MAAM;aAsEhB;;CACJ;kCApMiC,kDAAkD;mBAFjE,0CAA0C;kCAI3B,kCAAkC"}