@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
@@ -1,34 +1,169 @@
1
+ import { assert } from "../../../../core/assert.js";
1
2
  import { BufferResourceDescriptor } from "../../../device/graph/BufferResourceDescriptor.js";
2
3
  import { GEOMETRY_MESHLET_TRIANGLE_LIMIT } from "../../geometry/meshlet/GEOMETRY_MESHLET_TRIANGLE_LIMIT.js";
3
4
  import { graph_prefix_scan_csdldf } from "../../gpu_primitive/prefix_sum/v1/graph_prefix_scan_csdldf.js";
4
- import { graph_compute_pass } from "../../shader/graph/compute/graph_compute_pass.js";
5
- import { shader_increment_count_by_prefix_sum } from "../../rasterize/expand/mesh/shader_increment_count_by_prefix_sum.js";
6
- import { WATER_TILE_STRUCT, WATER_TESSELLATION_STRUCT } from "./chunk_water_tessellation.js";
7
- import { shader_water_tiles } from "./shader_water_tiles.js";
5
+ import {
6
+ build_indirect_compute_dispatch_command,
7
+ INDIRECT_COMPUTE_COMMAND_DESCRIPTOR
8
+ } from "../../gpu_primitive/indirect/IndirectComputeCommandBuildPass.js";
9
+ import { WATER_LOD_VIEW_STRUCT } from "./lod/WATER_LOD.js";
10
+ import {
11
+ shader_water_lod_candidate_command,
12
+ shader_water_lod_candidates,
13
+ shader_water_lod_cells,
14
+ shader_water_lod_draw_commands,
15
+ shader_water_lod_flats,
16
+ shader_water_lod_triangles,
17
+ WATER_LOD_CANDIDATE_LIMIT,
18
+ WATER_LOD_CANDIDATE_ROW_WORDS,
19
+ WATER_LOD_CANDIDATE_STRUCT,
20
+ WATER_LOD_COMMAND_BYTES,
21
+ WATER_LOD_LIMITS_STRUCT,
22
+ WATER_LOD_POLYGON_WORDS,
23
+ WATER_LOD_STATISTICS_WORDS,
24
+ WaterLodCommand,
25
+ WaterLodList
26
+ } from "./lod/shader_water_lod.js";
8
27
 
9
- /** Storage grows with source primitives; patch instances are expanded by the vertex shader. */
10
- export function graph_water_tessellation({ graph, scene, camera, meshlets, meshlet_capacity, tessellation }) {
11
- const capacity = meshlet_capacity * GEOMETRY_MESHLET_TRIANGLE_LIMIT;
12
- const data = {};
13
- const pass = graph.add('Water / classify view tiles', data, (d, resources, { encoder }) => {
14
- const groups = Math.ceil(capacity / 128);
15
- shader_water_tiles.dispatch({ encoder, bindings: {
16
- capacity, camera: resources.get(d.camera), water_meshlets: resources.get(d.meshlets),
17
- tessellation: encoder.allocateTransientValueBuffer(WATER_TESSELLATION_STRUCT, tessellation),
18
- scene_database: scene.scene_database_buffer,
19
- geometries: scene.geometries.buffer_metadata,
20
- meshlet_metadata: scene.geometries.meshlets.buffer_metadata, meshlet_data: scene.geometries.meshlets.buffer_data,
21
- counts: resources.get(d.counts), tiles: resources.get(d.tiles),
22
- }, group_count_x: Math.min(groups, 65535), group_count_y: Math.ceil(groups / 65535) });
28
+ /** A counts collection of this many elements: its count, padded, then the elements in whole vec4 blocks. */
29
+ function counts_descriptor(elements) {
30
+ const bytes = 16 + Math.ceil(Math.max(elements, 1) / 4) * 16;
31
+ return BufferResourceDescriptor.from(bytes, GPUBufferUsage.STORAGE, 0, 16);
32
+ }
33
+
34
+ /**
35
+ * Where each list's records start in the cell buffer, and the buffer's words: interior and boundary cells a word each,
36
+ * triangles drawn as themselves two words each, patches a word each, then each boundary cell's clipped polygon. The
37
+ * vertex stage finds them by the same arithmetic over the limits (chunk_water_lod_layout).
38
+ *
39
+ * @param {{interior: number, boundary: number, triangles: number, patches: number}} limits
40
+ * @returns {{interior: number, boundary: number, triangles: number, patches: number, polygons: number, words: number}}
41
+ */
42
+ export function water_lod_cell_layout(limits) {
43
+ const triangles = limits.interior + limits.boundary;
44
+ const patches = triangles + 2 * limits.triangles;
45
+ const polygons = patches + limits.patches;
46
+ return { interior: 0, boundary: limits.interior, triangles, patches, polygons,
47
+ words: Math.max(polygons + WATER_LOD_POLYGON_WORDS * limits.boundary, 1) };
48
+ }
49
+
50
+ /**
51
+ * The view's lattice cut by the drawn bodies' authored triangles (WATER_SURFACE_DISTANCE_LOD_PROPOSAL_2026_10_06.md
52
+ * §4.3): per triangle, either itself on the triangle list or its candidates; per candidate, its quadrants and rows;
53
+ * and the patch, interior cell and boundary cell lists, each compacted by an ordered scan so equal-depth ownership
54
+ * between bodies stays deterministic. Candidates and cells are cut to `limits`; the totals before the cut land in `statistics`, for
55
+ * the caller to grow its budgets by.
56
+ *
57
+ * @param {object} options
58
+ * @param {import("../../../../engine/graphics/render/frame_graph/FrameGraph.js").FrameGraph} options.graph
59
+ * @param {object} options.scene GPU scene context
60
+ * @param {number} options.camera the view's camera uniform resource
61
+ * @param {number} options.meshlets the drawn bodies' meshlets resource, from {@link GPUWaterBodies#meshlets}
62
+ * @param {number} options.lod_bodies the view's per-body lattice frames resource, from the same
63
+ * @param {number} options.meshlet_capacity every water meshlet the scene holds: the triangle slots there can be
64
+ * @param {{ranges: number, orthographic: number, level: number, distance: number}} options.lod the view's lattice choice
65
+ * @param {{candidates: number, interior: number, boundary: number, triangles: number, patches: number}} options.limits budgets
66
+ * @param {GPUBuffer} options.steep per wave row: set for a body with a triangle too steep for the lattice
67
+ * @returns {{candidates: number, cells: number, commands: number, statistics: number}} resources
68
+ */
69
+ export function graph_water_tessellation({ graph, scene, camera, meshlets, lod_bodies, meshlet_capacity, lod, limits, steep }) {
70
+ assert.lessThanOrEqual(limits.candidates, WATER_LOD_CANDIDATE_LIMIT, 'candidate budget');
71
+ const slots = Math.max(meshlet_capacity, 1) * GEOMETRY_MESHLET_TRIANGLE_LIMIT;
72
+ const layout = water_lod_cell_layout(limits);
73
+ const geometry_bindings = { scene_database: scene.scene_database_buffer,
74
+ meshlet_metadata: scene.geometries.meshlets.buffer_metadata, meshlet_data: scene.geometries.meshlets.buffer_data };
75
+ const limits_value = { ...limits };
76
+
77
+ // per triangle slot of the drawn meshlets: drawn as itself, or its candidates
78
+ const triangles_data = {};
79
+ const triangles = graph.add('Water / lod triangles', triangles_data, (d, resources, { encoder }) => {
80
+ const command = resources.get(d.command), list = resources.get(d.meshlets);
81
+ build_indirect_compute_dispatch_command(1, encoder, list, 0, command, 0, true);
82
+ shader_water_lod_triangles.dispatchIndirect({ encoder, command, bindings: { ...geometry_bindings,
83
+ lod: encoder.allocateTransientValueBuffer(WATER_LOD_VIEW_STRUCT, lod), water_meshlets: list,
84
+ lod_bodies: resources.get(d.lod_bodies), steep, counts: resources.get(d.counts), flats: resources.get(d.flats) } });
85
+ });
86
+ triangles_data.meshlets = triangles.read(meshlets);
87
+ triangles_data.lod_bodies = triangles.read(lod_bodies);
88
+ triangles_data.command = triangles.create('Water lod triangles command', INDIRECT_COMPUTE_COMMAND_DESCRIPTOR);
89
+ triangles_data.counts = triangles.create('Water lod triangle counts', counts_descriptor(slots));
90
+ triangles_data.flats = triangles.create('Water lod flat counts', counts_descriptor(slots));
91
+ const triangle_sums = graph_prefix_scan_csdldf({ graph, data: triangles_data.counts, element_max_count: slots });
92
+ const flat_sums = graph_prefix_scan_csdldf({ graph, data: triangles_data.flats, element_max_count: slots });
93
+
94
+ // the candidates' dispatch; the flat triangles' records and draw
95
+ const command_data = {};
96
+ const candidate_command = graph.add('Water / lod candidate command', command_data, (d, resources, { encoder }) => {
97
+ const commands = resources.get(d.commands);
98
+ shader_water_lod_candidate_command.dispatch({ encoder, bindings: {
99
+ limits: encoder.allocateTransientValueBuffer(WATER_LOD_LIMITS_STRUCT, limits_value),
100
+ triangle_sums: resources.get(d.sums), flat_sums: resources.get(d.flat_sums), commands, statistics: resources.get(d.statistics) } });
101
+ shader_water_lod_flats.dispatchIndirect({ encoder, command: commands, command_offset: WaterLodCommand.Flats, bindings: {
102
+ limits: { base: layout.triangles, budget: limits.triangles }, water_meshlets: resources.get(d.meshlets),
103
+ flat_sums: resources.get(d.flat_sums), cells: resources.get(d.cells) } });
104
+ });
105
+ command_data.sums = candidate_command.read(triangle_sums);
106
+ command_data.flat_sums = candidate_command.read(flat_sums);
107
+ command_data.meshlets = candidate_command.read(meshlets);
108
+ command_data.commands = candidate_command.create('Water lod commands', BufferResourceDescriptor.from(WATER_LOD_COMMAND_BYTES,
109
+ GPUBufferUsage.STORAGE | GPUBufferUsage.INDIRECT));
110
+ command_data.statistics = candidate_command.create('Water lod statistics', BufferResourceDescriptor.from(
111
+ WATER_LOD_STATISTICS_WORDS * 4, GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC));
112
+ command_data.cells = candidate_command.create('Water lod cells', BufferResourceDescriptor.from(layout.words * 4, GPUBufferUsage.STORAGE));
113
+
114
+ // candidates: quadrants, rows, and how many cells of each list
115
+ const candidates_data = {};
116
+ const candidates = graph.add('Water / lod candidates', candidates_data, (d, resources, { encoder }) => {
117
+ shader_water_lod_candidates.dispatchIndirect({ encoder, command: resources.get(d.commands), command_offset: WaterLodCommand.Candidates,
118
+ bindings: { ...geometry_bindings, lod: encoder.allocateTransientValueBuffer(WATER_LOD_VIEW_STRUCT, lod),
119
+ limits: encoder.allocateTransientValueBuffer(WATER_LOD_LIMITS_STRUCT, limits_value), camera: resources.get(d.camera),
120
+ water_meshlets: resources.get(d.meshlets), lod_bodies: resources.get(d.lod_bodies), triangle_sums: resources.get(d.sums),
121
+ candidates: resources.get(d.candidates), candidate_rows: resources.get(d.rows),
122
+ cell_counts: resources.get(d.counts) } });
123
+ });
124
+ candidates_data.commands = candidates.read(command_data.commands);
125
+ candidates_data.camera = candidates.read(camera);
126
+ candidates_data.meshlets = candidates.read(meshlets);
127
+ candidates_data.lod_bodies = candidates.read(lod_bodies);
128
+ candidates_data.sums = candidates.read(triangle_sums);
129
+ const budget = Math.max(limits.candidates, 1);
130
+ candidates_data.candidates = candidates.create('Water lod candidates', BufferResourceDescriptor.from(
131
+ budget * WATER_LOD_CANDIDATE_STRUCT.size, GPUBufferUsage.STORAGE));
132
+ candidates_data.rows = candidates.create('Water lod candidate rows', BufferResourceDescriptor.from(
133
+ budget * WATER_LOD_CANDIDATE_ROW_WORDS * 4, GPUBufferUsage.STORAGE));
134
+ // the interior, boundary and patch counts of every candidate, one region after another, scanned once
135
+ candidates_data.counts = candidates.create('Water lod cell counts', counts_descriptor(3 * budget));
136
+ const list_sums = graph_prefix_scan_csdldf({ graph, data: candidates_data.counts, element_max_count: 3 * budget });
137
+
138
+ // each list's records; the boundary cells' polygons
139
+ const lists = [
140
+ { list: WaterLodList.Interior, base: layout.interior, budget: limits.interior, command: WaterLodCommand.Cells },
141
+ { list: WaterLodList.Boundary, base: layout.boundary, budget: limits.boundary, command: WaterLodCommand.Cells + 16 },
142
+ { list: WaterLodList.Patch, base: layout.patches, budget: limits.patches, command: WaterLodCommand.PatchCells },
143
+ ];
144
+ const cells_data = {};
145
+ const cells = graph.add('Water / lod cells', cells_data, (d, resources, { encoder }) => {
146
+ const commands = resources.get(d.commands);
147
+ const sums = resources.get(d.sums);
148
+ const limits_buffer = encoder.allocateTransientValueBuffer(WATER_LOD_LIMITS_STRUCT, limits_value);
149
+ shader_water_lod_draw_commands.dispatch({ encoder, bindings: { limits: limits_buffer, sums, commands,
150
+ statistics: resources.get(d.statistics) } });
151
+ const lod_buffer = encoder.allocateTransientValueBuffer(WATER_LOD_VIEW_STRUCT, lod);
152
+ lists.forEach(({ list, base, budget, command }) => {
153
+ shader_water_lod_cells.dispatchIndirect({ encoder, command: commands, command_offset: command,
154
+ bindings: { meshlet_metadata: geometry_bindings.meshlet_metadata, meshlet_data: geometry_bindings.meshlet_data,
155
+ limits: { base, budget, list }, lod: lod_buffer, lod_limits: limits_buffer,
156
+ lod_bodies: resources.get(d.lod_bodies), sums, cells: resources.get(d.cells),
157
+ candidates: resources.get(d.candidates), candidate_rows: resources.get(d.rows) } });
158
+ });
23
159
  });
24
- data.camera = pass.read(camera); data.meshlets = pass.read(meshlets);
25
- data.tiles = pass.create('Water triangle tiles', BufferResourceDescriptor.from(capacity * WATER_TILE_STRUCT.size, GPUBufferUsage.STORAGE));
26
- const bytes = 16 + capacity * 4;
27
- data.counts = pass.create('Water tile counts', BufferResourceDescriptor.from(bytes, GPUBufferUsage.STORAGE, 0, bytes));
28
- const sums = graph_prefix_scan_csdldf({ graph, data: data.counts, element_max_count: capacity });
29
- const clear = graph.add('Water / patch count', {}, () => {});
30
- const count = clear.create('Water patches', BufferResourceDescriptor.from(16, GPUBufferUsage.STORAGE, 0, 16));
31
- const { output } = graph_compute_pass({ graph, shader: shader_increment_count_by_prefix_sum,
32
- bindings: { prefix_sums: sums, output: count } });
33
- return { tiles: data.tiles, sums, count: output };
160
+ cells_data.commands = cells.write(cells.read(command_data.commands));
161
+ cells_data.statistics = cells.write(cells.read(command_data.statistics));
162
+ cells_data.cells = cells.write(cells.read(command_data.cells));
163
+ cells_data.sums = cells.read(list_sums);
164
+ cells_data.candidates = cells.read(candidates_data.candidates);
165
+ cells_data.rows = cells.read(candidates_data.rows);
166
+ cells_data.lod_bodies = cells.read(lod_bodies);
167
+ return { candidates: candidates_data.candidates, cells: cells_data.cells, commands: cells_data.commands,
168
+ statistics: cells_data.statistics };
34
169
  }
@@ -0,0 +1,51 @@
1
+ /**
2
+ * A view's lattice choice from its projection, its target's height in pixels and the setting.
3
+ *
4
+ * θ, the angle a pixel subtends at unit distance, is 2 / (height · P[1][1]); an orthographic projection gives the world
5
+ * size of a pixel by the same formula. A cell spans `pixels` on screen where it is smallest, at 0.7 of its level's
6
+ * range, so R = 1 / (0.7 · pixels · θ), and never below {@link WATER_LOD_RANGE_RATIO_MIN}.
7
+ *
8
+ * @param {ArrayLike<number>} projection column-major 4×4
9
+ * @param {number} height render target height, pixels
10
+ * @param {number} pixels the smallest a cell is drawn on screen
11
+ * @returns {{ranges: number, orthographic: number, level: number, distance: number, pixel: number}}
12
+ */
13
+ export function water_lod_view(projection: ArrayLike<number>, height: number, pixels: number): {
14
+ ranges: number;
15
+ orthographic: number;
16
+ level: number;
17
+ distance: number;
18
+ pixel: number;
19
+ };
20
+ /** Levels of the lattice: cells of 2^(L − 10) m, 1 mm at level 0 to 16 km at level 24. */
21
+ export const WATER_LOD_LEVELS: 25;
22
+ /** Exponent of level 0's cell: 2^−10 m. */
23
+ export const WATER_LOD_FINEST_EXPONENT: -10;
24
+ /** Cells a side of a node; a quadrant is half a node. */
25
+ export const WATER_LOD_NODE_CELLS: 16;
26
+ /** Fraction of a level's range at which its odd vertices start to slide onto the coarser grid. */
27
+ export const WATER_LOD_MORPH_START: 0.7;
28
+ /**
29
+ * Smallest ratio of a level's range to its cell for which adjacent levels meet without cracks: a level's points lie
30
+ * within r_L + 16√2 s_L of the camera, which must stay inside the next level's unmorphed range, 0.7 · r_{L+1}.
31
+ */
32
+ export const WATER_LOD_RANGE_RATIO_MIN: 64;
33
+ /**
34
+ * How one view chooses the lattice (WATER_SURFACE_DISTANCE_LOD_PROPOSAL_2026_10_06.md §4.1): the same for every body.
35
+ */
36
+ export const WATER_LOD_VIEW_STRUCT: WebGPUStruct;
37
+ /** Lattice modes a drawn body takes. */
38
+ export const WaterLodMode: Readonly<{
39
+ /** Not drawn by this view. */
40
+ Hidden: 0;
41
+ /** No displacement it can show: its authored triangles. */
42
+ Flat: 1;
43
+ /** Cut from the lattice. */
44
+ Lattice: 2;
45
+ }>;
46
+ /**
47
+ * One drawn body as one view sees it, in its metric local frame (local units times its transform's axis lengths).
48
+ */
49
+ export const WATER_LOD_BODY_STRUCT: WebGPUStruct;
50
+ import { WebGPUStruct } from "../../../shader/type/WebGPUStruct.js";
51
+ //# sourceMappingURL=WATER_LOD.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WATER_LOD.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/water/surface/lod/WATER_LOD.js"],"names":[],"mappings":"AAkEA;;;;;;;;;;;GAWG;AACH,2CALW,UAAU,MAAM,CAAC,UACjB,MAAM,UACN,MAAM,GACJ;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAC,CAkBlG;AA1FD,0FAA0F;AAC1F,kCAAmC;AAEnC,2CAA2C;AAC3C,4CAA6C;AAE7C,yDAAyD;AACzD,sCAAuC;AAEvC,kGAAkG;AAClG,wCAAyC;AAEzC;;;GAGG;AACH,2CAA4C;AAE5C;;GAEG;AACH,iDAW0B;AAE1B,wCAAwC;AACxC;IACI,8BAA8B;;IAE9B,2DAA2D;;IAE3D,4BAA4B;;GAE7B;AAEH;;GAEG;AACH,iDAa0B;6BA9DG,sCAAsC"}
@@ -0,0 +1,95 @@
1
+ import { assert } from "../../../../../core/assert.js";
2
+ import { f32, u32, vec2f, vec3f } from "../../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
3
+ import { WebGPUStruct } from "../../../shader/type/WebGPUStruct.js";
4
+
5
+ /** Levels of the lattice: cells of 2^(L − 10) m, 1 mm at level 0 to 16 km at level 24. */
6
+ export const WATER_LOD_LEVELS = 25;
7
+
8
+ /** Exponent of level 0's cell: 2^−10 m. */
9
+ export const WATER_LOD_FINEST_EXPONENT = -10;
10
+
11
+ /** Cells a side of a node; a quadrant is half a node. */
12
+ export const WATER_LOD_NODE_CELLS = 16;
13
+
14
+ /** Fraction of a level's range at which its odd vertices start to slide onto the coarser grid. */
15
+ export const WATER_LOD_MORPH_START = 0.7;
16
+
17
+ /**
18
+ * Smallest ratio of a level's range to its cell for which adjacent levels meet without cracks: a level's points lie
19
+ * within r_L + 16√2 s_L of the camera, which must stay inside the next level's unmorphed range, 0.7 · r_{L+1}.
20
+ */
21
+ export const WATER_LOD_RANGE_RATIO_MIN = 64;
22
+
23
+ /**
24
+ * How one view chooses the lattice (WATER_SURFACE_DISTANCE_LOD_PROPOSAL_2026_10_06.md §4.1): the same for every body.
25
+ */
26
+ export const WATER_LOD_VIEW_STRUCT = WebGPUStruct.from({
27
+ /** R: a level's range over its cell. */
28
+ ranges: f32,
29
+ /** Non-zero for an orthographic view, which draws one level everywhere. */
30
+ orthographic: u32,
31
+ /** The orthographic view's level. */
32
+ level: u32,
33
+ /** The distance an orthographic view selects with: 0.6 of its level's range. */
34
+ distance: f32,
35
+ /** The angle a pixel subtends at unit distance; for an orthographic view, the size of a pixel. */
36
+ pixel: f32,
37
+ }, 'WaterLodView').pack();
38
+
39
+ /** Lattice modes a drawn body takes. */
40
+ export const WaterLodMode = Object.freeze({
41
+ /** Not drawn by this view. */
42
+ Hidden: 0,
43
+ /** No displacement it can show: its authored triangles. */
44
+ Flat: 1,
45
+ /** Cut from the lattice. */
46
+ Lattice: 2,
47
+ });
48
+
49
+ /**
50
+ * One drawn body as one view sees it, in its metric local frame (local units times its transform's axis lengths).
51
+ */
52
+ export const WATER_LOD_BODY_STRUCT = WebGPUStruct.from({
53
+ /** The camera in the body's metric local frame. */
54
+ camera: vec3f,
55
+ /** Distance from the camera to the body's rest height range, metric; zero inside it. */
56
+ vertical: f32,
57
+ /** Metres per local unit along each local axis. */
58
+ scale: vec3f,
59
+ /** A {@link WaterLodMode}. */
60
+ mode: u32,
61
+ /** The body's displacement bounds, metric: vertical, horizontal. */
62
+ bounds: vec2f,
63
+ /** The body's rest height range, local units. */
64
+ rest: vec2f,
65
+ }, 'WaterLodBody').pack();
66
+
67
+ /**
68
+ * A view's lattice choice from its projection, its target's height in pixels and the setting.
69
+ *
70
+ * θ, the angle a pixel subtends at unit distance, is 2 / (height · P[1][1]); an orthographic projection gives the world
71
+ * size of a pixel by the same formula. A cell spans `pixels` on screen where it is smallest, at 0.7 of its level's
72
+ * range, so R = 1 / (0.7 · pixels · θ), and never below {@link WATER_LOD_RANGE_RATIO_MIN}.
73
+ *
74
+ * @param {ArrayLike<number>} projection column-major 4×4
75
+ * @param {number} height render target height, pixels
76
+ * @param {number} pixels the smallest a cell is drawn on screen
77
+ * @returns {{ranges: number, orthographic: number, level: number, distance: number, pixel: number}}
78
+ */
79
+ export function water_lod_view(projection, height, pixels) {
80
+ assert.greaterThan(height, 0, 'height');
81
+ assert.greaterThan(pixels, 0, 'pixels');
82
+ const theta = 2 / (height * Math.abs(projection[5]));
83
+ assert.isFinite(theta, 'pixel angle');
84
+ const ranges = Math.max(WATER_LOD_RANGE_RATIO_MIN, 1 / (WATER_LOD_MORPH_START * pixels * theta));
85
+ // a perspective projection writes −1 (or 1) into w from z; an orthographic one leaves w at 1
86
+ const orthographic = projection[11] === 0 ? 1 : 0;
87
+ let level = 0, distance = 0;
88
+ if (orthographic !== 0) {
89
+ // the coarsest cell no larger than the target
90
+ level = Math.min(WATER_LOD_LEVELS - 1, Math.max(0,
91
+ Math.floor(Math.log2(pixels * theta)) - WATER_LOD_FINEST_EXPONENT));
92
+ distance = 0.6 * ranges * 2 ** (level + WATER_LOD_FINEST_EXPONENT);
93
+ }
94
+ return { ranges, orthographic, level, distance, pixel: theta };
95
+ }
@@ -0,0 +1,10 @@
1
+ /**
2
+ * The distance LOD lattice (WATER_SURFACE_DISTANCE_LOD_PROPOSAL_2026_10_06.md §4.1) as pure functions of a view, a
3
+ * body and a point of the body's metric local xz. Selection, morph and footprint all derive from one distance, so the
4
+ * passes that choose cells and the vertex stage that draws them agree to the bit.
5
+ *
6
+ * @type {CodeChunk}
7
+ */
8
+ export const chunk_water_lod: CodeChunk;
9
+ import { CodeChunk } from "../../../shader/compiler/CodeChunk.js";
10
+ //# sourceMappingURL=chunk_water_lod.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk_water_lod.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/water/surface/lod/chunk_water_lod.js"],"names":[],"mappings":"AAUA;;;;;;GAMG;AACH,8BAFU,SAAS,CA+GoE;0BA9H7D,uCAAuC"}
@@ -0,0 +1,127 @@
1
+ import { CodeChunk } from "../../../shader/compiler/CodeChunk.js";
2
+ import {
3
+ WATER_LOD_BODY_STRUCT,
4
+ WATER_LOD_FINEST_EXPONENT,
5
+ WATER_LOD_LEVELS,
6
+ WATER_LOD_MORPH_START,
7
+ WATER_LOD_NODE_CELLS,
8
+ WATER_LOD_VIEW_STRUCT
9
+ } from "./WATER_LOD.js";
10
+
11
+ /**
12
+ * The distance LOD lattice (WATER_SURFACE_DISTANCE_LOD_PROPOSAL_2026_10_06.md §4.1) as pure functions of a view, a
13
+ * body and a point of the body's metric local xz. Selection, morph and footprint all derive from one distance, so the
14
+ * passes that choose cells and the vertex stage that draws them agree to the bit.
15
+ *
16
+ * @type {CodeChunk}
17
+ */
18
+ export const chunk_water_lod = CodeChunk.from(/* language=WGSL */ `
19
+ const WATER_LOD_LEVELS: u32 = ${WATER_LOD_LEVELS}u;
20
+ const WATER_LOD_FINEST_EXPONENT: f32 = ${WATER_LOD_FINEST_EXPONENT}.0;
21
+ const WATER_LOD_NODE_CELLS: i32 = ${WATER_LOD_NODE_CELLS};
22
+ const WATER_LOD_QUADRANT_CELLS: i32 = ${WATER_LOD_NODE_CELLS / 2};
23
+ const WATER_LOD_MORPH_START: f32 = ${WATER_LOD_MORPH_START};
24
+ const WATER_LOD_COARSEST: u32 = ${WATER_LOD_LEVELS - 1}u;
25
+
26
+ // Edge of a level's cells, metres: a power of two, so a lattice coordinate times it is exact in f32.
27
+ fn water_lod_cell(level: u32) -> f32 {
28
+ return exp2(f32(level) + WATER_LOD_FINEST_EXPONENT);
29
+ }
30
+
31
+ fn water_lod_range(view: ${WATER_LOD_VIEW_STRUCT.wgsl_ref}, level: u32) -> f32 {
32
+ return view.ranges * water_lod_cell(level);
33
+ }
34
+
35
+ // The distance the lattice is chosen by: from the camera to the point horizontally, and to the body's rest height
36
+ // range vertically. An orthographic view has one distance everywhere.
37
+ fn water_lod_distance(view: ${WATER_LOD_VIEW_STRUCT.wgsl_ref}, body: ${WATER_LOD_BODY_STRUCT.wgsl_ref}, p: vec2<f32>) -> f32 {
38
+ if (view.orthographic != 0u) { return view.distance; }
39
+ let d = p - body.camera.xz;
40
+ return sqrt(dot(d, d) + body.vertical * body.vertical);
41
+ }
42
+
43
+ // The least distance over the square lo … hi of metric local xz.
44
+ fn water_lod_nearest(view: ${WATER_LOD_VIEW_STRUCT.wgsl_ref}, body: ${WATER_LOD_BODY_STRUCT.wgsl_ref}, lo: vec2<f32>, hi: vec2<f32>) -> f32 {
45
+ if (view.orthographic != 0u) { return view.distance; }
46
+ let d = max(max(lo - body.camera.xz, body.camera.xz - hi), vec2<f32>(0.0));
47
+ return sqrt(dot(d, d) + body.vertical * body.vertical);
48
+ }
49
+
50
+ // The greatest distance over the square lo … hi.
51
+ fn water_lod_farthest(view: ${WATER_LOD_VIEW_STRUCT.wgsl_ref}, body: ${WATER_LOD_BODY_STRUCT.wgsl_ref}, lo: vec2<f32>, hi: vec2<f32>) -> f32 {
52
+ if (view.orthographic != 0u) { return view.distance; }
53
+ let d = max(abs(lo - body.camera.xz), abs(hi - body.camera.xz));
54
+ return sqrt(dot(d, d) + body.vertical * body.vertical);
55
+ }
56
+
57
+ // Node n of a level: its corners in metric local xz.
58
+ fn water_lod_node_lo(level: u32, node: vec2<i32>) -> vec2<f32> {
59
+ return vec2<f32>(node * WATER_LOD_NODE_CELLS) * water_lod_cell(level);
60
+ }
61
+ fn water_lod_node_hi(level: u32, node: vec2<i32>) -> vec2<f32> {
62
+ return vec2<f32>((node + vec2<i32>(1)) * WATER_LOD_NODE_CELLS) * water_lod_cell(level);
63
+ }
64
+
65
+ // Quadrant q (0 … 3, x then z) of a node: its first cell.
66
+ fn water_lod_quadrant_origin(node: vec2<i32>, quadrant: u32) -> vec2<i32> {
67
+ return node * WATER_LOD_NODE_CELLS + vec2<i32>(i32(quadrant & 1u), i32(quadrant >> 1u)) * WATER_LOD_QUADRANT_CELLS;
68
+ }
69
+
70
+ // CDLOD's rule in closed form: a node exists at its level when it reaches into the level's range; the coarsest level
71
+ // takes whatever is beyond every range.
72
+ fn water_lod_node_exists(view: ${WATER_LOD_VIEW_STRUCT.wgsl_ref}, body: ${WATER_LOD_BODY_STRUCT.wgsl_ref}, level: u32, node: vec2<i32>) -> bool {
73
+ if (view.orthographic != 0u) { return level == view.level; }
74
+ if (level >= WATER_LOD_COARSEST) { return true; }
75
+ return water_lod_nearest(view, body, water_lod_node_lo(level, node), water_lod_node_hi(level, node)) <= water_lod_range(view, level);
76
+ }
77
+
78
+ // ... and an existing node's quadrant is drawn at its level unless all of it lies beyond the finer level's range.
79
+ fn water_lod_quadrant_drawn(view: ${WATER_LOD_VIEW_STRUCT.wgsl_ref}, body: ${WATER_LOD_BODY_STRUCT.wgsl_ref}, level: u32, node: vec2<i32>, quadrant: u32) -> bool {
80
+ if (view.orthographic != 0u || level == 0u) { return true; }
81
+ let cell = water_lod_cell(level);
82
+ let lo = vec2<f32>(water_lod_quadrant_origin(node, quadrant)) * cell;
83
+ let hi = vec2<f32>(water_lod_quadrant_origin(node, quadrant) + vec2<i32>(WATER_LOD_QUADRANT_CELLS)) * cell;
84
+ return water_lod_nearest(view, body, lo, hi) > water_lod_range(view, level - 1u);
85
+ }
86
+
87
+ // How far a lattice point at this distance has slid towards the next level's grid, 0 … 1.
88
+ fn water_lod_morph(view: ${WATER_LOD_VIEW_STRUCT.wgsl_ref}, level: u32, distance: f32) -> f32 {
89
+ if (view.orthographic != 0u || level >= WATER_LOD_COARSEST) { return 0.0; }
90
+ let range = water_lod_range(view, level);
91
+ return clamp((distance - WATER_LOD_MORPH_START * range) / ((1.0 - WATER_LOD_MORPH_START) * range), 0.0, 1.0);
92
+ }
93
+
94
+ // A lattice point of a level after its morph, metric local xz: an odd coordinate slides k cells down onto the even
95
+ // one, k taken where the point would be unmorphed. Exact for k = 0 and k = 1, so where two levels meet the finer
96
+ // one's points land on the coarser one's.
97
+ fn water_lod_lattice_point(view: ${WATER_LOD_VIEW_STRUCT.wgsl_ref}, body: ${WATER_LOD_BODY_STRUCT.wgsl_ref}, level: u32, point: vec2<i32>) -> vec2<f32> {
98
+ let cell = water_lod_cell(level);
99
+ let k = water_lod_morph(view, level, water_lod_distance(view, body, vec2<f32>(point) * cell));
100
+ let odd = vec2<f32>(vec2<i32>(point.x & 1, point.y & 1));
101
+ return (vec2<f32>(point) - odd * k) * cell;
102
+ }
103
+
104
+ // The spacing the waves are filtered by at a vertex of a cell of this level, from the vertex's own position, so two
105
+ // cells — of one level, or of two meeting levels where the finer is fully morphed and the coarser not at all — that
106
+ // generate the same vertex filter it alike.
107
+ fn water_lod_footprint(view: ${WATER_LOD_VIEW_STRUCT.wgsl_ref}, body: ${WATER_LOD_BODY_STRUCT.wgsl_ref}, level: u32, p: vec2<f32>) -> f32 {
108
+ return water_lod_cell(level) * (1.0 + water_lod_morph(view, level, water_lod_distance(view, body, p)));
109
+ }
110
+
111
+ // The levels that can draw points between these distances: a point drawn at level L lies beyond r_{L−1} and within
112
+ // r_L + 16√2 s_L. (x: finest, y: coarsest, inclusive.)
113
+ fn water_lod_level_span(view: ${WATER_LOD_VIEW_STRUCT.wgsl_ref}, nearest: f32, farthest: f32) -> vec2<u32> {
114
+ if (view.orthographic != 0u) { return vec2<u32>(view.level); }
115
+ let reach = view.ranges + f32(WATER_LOD_NODE_CELLS) * 1.41421356;
116
+ let finest = clamp(floor(log2(max(nearest, 1e-30) / reach)) - WATER_LOD_FINEST_EXPONENT, 0.0, f32(WATER_LOD_COARSEST));
117
+ let coarsest = clamp(ceil(log2(max(2.0 * farthest, 1e-30) / view.ranges)) - WATER_LOD_FINEST_EXPONENT, 0.0, f32(WATER_LOD_COARSEST));
118
+ return vec2<u32>(u32(finest), u32(max(finest, coarsest)));
119
+ }
120
+
121
+ // The finest footprint any vertex at least this far away can be drawn with.
122
+ fn water_lod_footprint_min(view: ${WATER_LOD_VIEW_STRUCT.wgsl_ref}, nearest: f32) -> f32 {
123
+ if (view.orthographic != 0u) { return water_lod_cell(view.level); }
124
+ let reach = view.ranges + f32(WATER_LOD_NODE_CELLS) * 1.41421356;
125
+ return max(water_lod_cell(0u), nearest / reach);
126
+ }
127
+ `, [WATER_LOD_VIEW_STRUCT.declaration_chunk, WATER_LOD_BODY_STRUCT.declaration_chunk]);
@@ -0,0 +1,17 @@
1
+ /**
2
+ * A lattice cell cut by an authored triangle in the body's metric local xz
3
+ * (WATER_SURFACE_DISTANCE_LOD_PROPOSAL_2026_10_06.md §4.2).
4
+ *
5
+ * Every point is identified by what it lies on — a cell corner, an authored corner, or a cell edge crossing an
6
+ * authored edge — and its position, rest height and normal are computed from that identity alone, with each edge
7
+ * taken in a fixed endpoint order (the lesser in x, then z, first). So two triangles sharing an edge, and two cells or
8
+ * two levels sharing a seam, produce the same f32 vertices whichever way round they walk them.
9
+ *
10
+ * Point bits: the authored edges 1 (b–c), 2 (c–a), 4 (a–b); the cell edges 16 (corner 0 → 1), 32 (1 → 2), 64 (2 → 3),
11
+ * 128 (3 → 0), corners 0 … 3 at (x0, z0), (x1, z0), (x1, z1), (x0, z1).
12
+ *
13
+ * @type {CodeChunk}
14
+ */
15
+ export const chunk_water_lod_cell: CodeChunk;
16
+ import { CodeChunk } from "../../../shader/compiler/CodeChunk.js";
17
+ //# sourceMappingURL=chunk_water_lod_cell.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk_water_lod_cell.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/water/surface/lod/chunk_water_lod_cell.js"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;GAaG;AACH,mCAFU,SAAS,CAsOG;0BArPI,uCAAuC"}