@woosh/meep-engine 3.39.0 → 3.41.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 (561) hide show
  1. package/build/bundle-worker-terrain.js +1 -1
  2. package/package.json +1 -1
  3. package/src/core/geom/3d/quaternion/swing_twist_clamp.d.ts +24 -0
  4. package/src/core/geom/3d/quaternion/swing_twist_clamp.d.ts.map +1 -0
  5. package/src/core/geom/3d/quaternion/swing_twist_clamp.js +62 -0
  6. package/src/core/geom/3d/quaternion/swing_twist_compose.d.ts +15 -0
  7. package/src/core/geom/3d/quaternion/swing_twist_compose.d.ts.map +1 -0
  8. package/src/core/geom/3d/quaternion/swing_twist_compose.js +36 -0
  9. package/src/core/geom/3d/quaternion/swing_twist_error.d.ts +39 -0
  10. package/src/core/geom/3d/quaternion/swing_twist_error.d.ts.map +1 -0
  11. package/src/core/geom/3d/quaternion/swing_twist_error.js +85 -0
  12. package/src/core/geom/vec3/v3_rigid_align_paired_unit_vectors.d.ts +11 -6
  13. package/src/core/geom/vec3/v3_rigid_align_paired_unit_vectors.d.ts.map +1 -1
  14. package/src/core/geom/vec3/v3_rigid_align_paired_unit_vectors.js +27 -13
  15. package/src/core/math/linalg/eigen/matrix_symmetric_4x4_eigen.d.ts +25 -0
  16. package/src/core/math/linalg/eigen/matrix_symmetric_4x4_eigen.d.ts.map +1 -0
  17. package/src/core/math/linalg/eigen/matrix_symmetric_4x4_eigen.js +166 -0
  18. package/src/core/math/linalg/eigen/matrix_top_eigenvector_power_iteration.d.ts +5 -3
  19. package/src/core/math/linalg/eigen/matrix_top_eigenvector_power_iteration.d.ts.map +1 -1
  20. package/src/core/math/linalg/eigen/matrix_top_eigenvector_power_iteration.js +5 -3
  21. package/src/engine/EngineHarness.d.ts.map +1 -1
  22. package/src/engine/EngineHarness.js +17 -4
  23. package/src/engine/animation/curve/AnimationCurve.d.ts +3 -0
  24. package/src/engine/animation/curve/AnimationCurve.d.ts.map +1 -1
  25. package/src/engine/animation/curve/AnimationCurve.js +6 -1
  26. package/src/engine/asset/loaders/image/avif/threaded_image_encoder.js +1 -1
  27. package/src/engine/ecs/EntityManager.d.ts +9 -1
  28. package/src/engine/ecs/EntityManager.d.ts.map +1 -1
  29. package/src/engine/ecs/EntityManager.js +26 -27
  30. package/src/engine/ecs/gpu/GPUStateAuthority.d.ts +20 -0
  31. package/src/engine/ecs/gpu/GPUStateAuthority.d.ts.map +1 -1
  32. package/src/engine/ecs/gpu/GPUStateAuthority.js +21 -0
  33. package/src/engine/ecs/gpu/GPU_AUTHORITY_EVENT_HOLD_CHANGE.d.ts +13 -0
  34. package/src/engine/ecs/gpu/GPU_AUTHORITY_EVENT_HOLD_CHANGE.d.ts.map +1 -0
  35. package/src/engine/ecs/gpu/GPU_AUTHORITY_EVENT_HOLD_CHANGE.js +12 -0
  36. package/src/engine/ecs/gpu/gpu_authority_grant.d.ts +6 -0
  37. package/src/engine/ecs/gpu/gpu_authority_grant.d.ts.map +1 -1
  38. package/src/engine/ecs/gpu/gpu_authority_grant.js +7 -1
  39. package/src/engine/ecs/gpu/gpu_authority_held.d.ts +14 -0
  40. package/src/engine/ecs/gpu/gpu_authority_held.d.ts.map +1 -0
  41. package/src/engine/ecs/gpu/gpu_authority_held.js +23 -0
  42. package/src/engine/ecs/gpu/gpu_authority_hold.d.ts +23 -0
  43. package/src/engine/ecs/gpu/gpu_authority_hold.d.ts.map +1 -0
  44. package/src/engine/ecs/gpu/gpu_authority_hold.js +41 -0
  45. package/src/engine/ecs/gpu/gpu_authority_unhold.d.ts +14 -0
  46. package/src/engine/ecs/gpu/gpu_authority_unhold.d.ts.map +1 -0
  47. package/src/engine/ecs/gpu/gpu_authority_unhold.js +32 -0
  48. package/src/engine/ecs/ik/IKGoal.d.ts +59 -0
  49. package/src/engine/ecs/ik/IKGoal.d.ts.map +1 -0
  50. package/src/engine/ecs/ik/IKGoal.js +83 -0
  51. package/src/engine/ecs/ik/IKGoalSystem.d.ts +75 -0
  52. package/src/engine/ecs/ik/IKGoalSystem.d.ts.map +1 -0
  53. package/src/engine/ecs/ik/IKGoalSystem.js +1456 -0
  54. package/src/engine/ecs/ik/PLAN.md +179 -0
  55. package/src/engine/ecs/speaker/VoiceSystem.d.ts +2 -2
  56. package/src/engine/ecs/speaker/VoiceSystem.d.ts.map +1 -1
  57. package/src/engine/ecs/storage/BinaryBufferSerializer.d.ts.map +1 -1
  58. package/src/engine/ecs/storage/BinaryBufferSerializer.js +4 -5
  59. package/src/engine/ecs/storage/binary/SERIALIZATION_COVERAGE.md +7 -3
  60. package/src/engine/ecs/storage/populateEngineSerializationRegistry.d.ts.map +1 -1
  61. package/src/engine/ecs/storage/populateEngineSerializationRegistry.js +5 -2
  62. package/src/engine/ecs/system/orderSystemsByDeclaredAccess.d.ts +33 -0
  63. package/src/engine/ecs/system/orderSystemsByDeclaredAccess.d.ts.map +1 -0
  64. package/src/engine/ecs/system/orderSystemsByDeclaredAccess.js +282 -0
  65. package/src/engine/ecs/transform/T64WorldCache.js +139 -139
  66. package/src/engine/ecs/transform/t64_evaluate_local.d.ts +25 -0
  67. package/src/engine/ecs/transform/t64_evaluate_local.d.ts.map +1 -0
  68. package/src/engine/ecs/transform/t64_evaluate_local.js +35 -0
  69. package/src/engine/ecs/transform/t64_evaluate_world.d.ts +5 -3
  70. package/src/engine/ecs/transform/t64_evaluate_world.d.ts.map +1 -1
  71. package/src/engine/ecs/transform/t64_evaluate_world.js +128 -126
  72. package/src/engine/graphics/ecs/water/Water.d.ts +14 -17
  73. package/src/engine/graphics/ecs/water/Water.d.ts.map +1 -1
  74. package/src/engine/graphics/ecs/water/Water.js +100 -110
  75. package/src/engine/graphics/ecs/water/WaterSerializationAdapter.d.ts.map +1 -1
  76. package/src/engine/graphics/ecs/water/WaterSerializationAdapter.js +36 -38
  77. package/src/engine/graphics/ecs/water/WaterSerializationUpgrader_3_4.d.ts +6 -0
  78. package/src/engine/graphics/ecs/water/WaterSerializationUpgrader_3_4.d.ts.map +1 -0
  79. package/src/engine/graphics/ecs/water/WaterSerializationUpgrader_3_4.js +10 -0
  80. package/src/engine/graphics/ecs/water/WaterWaves.d.ts +3 -3
  81. package/src/engine/graphics/ecs/water/WaterWaves.js +46 -46
  82. package/src/engine/graphics/texture/sampler/sampler2d_to_avif.d.ts.map +1 -1
  83. package/src/engine/graphics/texture/sampler/sampler2d_to_avif.js +8 -5
  84. package/src/engine/graphics3/AnimationGraphSystem.d.ts +2 -0
  85. package/src/engine/graphics3/AnimationGraphSystem.d.ts.map +1 -1
  86. package/src/engine/graphics3/AnimationGraphSystem.js +337 -329
  87. package/src/engine/graphics3/AnimationSystem.d.ts +2 -0
  88. package/src/engine/graphics3/AnimationSystem.d.ts.map +1 -1
  89. package/src/engine/graphics3/AnimationSystem.js +360 -352
  90. package/src/engine/graphics3/WaterSystem.d.ts +21 -74
  91. package/src/engine/graphics3/WaterSystem.d.ts.map +1 -1
  92. package/src/engine/graphics3/WaterSystem.js +174 -367
  93. package/src/engine/physics/cloth/MEASUREMENTS.md +130 -0
  94. package/src/engine/physics/cloth/PLAN.md +16 -1
  95. package/src/engine/physics/cloth/ecs/ClothColliderSystem.d.ts +5 -6
  96. package/src/engine/physics/cloth/ecs/ClothColliderSystem.d.ts.map +1 -1
  97. package/src/engine/physics/cloth/ecs/ClothColliderSystem.js +5 -6
  98. package/src/engine/physics/cloth/ecs/ClothInstance.d.ts +4 -7
  99. package/src/engine/physics/cloth/ecs/ClothInstance.d.ts.map +1 -1
  100. package/src/engine/physics/cloth/ecs/ClothInstance.js +4 -7
  101. package/src/engine/physics/cloth/ecs/ClothSystem.d.ts +4 -3
  102. package/src/engine/physics/cloth/ecs/ClothSystem.d.ts.map +1 -1
  103. package/src/engine/physics/cloth/ecs/ClothSystem.js +4 -3
  104. package/src/engine/physics/cloth/ecs/ClothWorld.d.ts.map +1 -1
  105. package/src/engine/physics/cloth/ecs/ClothWorld.js +10 -0
  106. package/src/engine/physics/cloth/ecs/cloth_seed_rig.d.ts +24 -24
  107. package/src/engine/physics/cloth/ecs/cloth_seed_rig.d.ts.map +1 -1
  108. package/src/engine/physics/cloth/ecs/cloth_seed_rig.js +46 -43
  109. package/src/engine/physics/cloth/ecs/cloth_write_back.d.ts +1 -1
  110. package/src/engine/physics/cloth/ecs/cloth_write_back.js +1 -1
  111. package/src/engine/physics/constraint/solve_constraints.d.ts +0 -35
  112. package/src/engine/physics/constraint/solve_constraints.d.ts.map +1 -1
  113. package/src/engine/physics/constraint/solve_constraints.js +1 -83
  114. package/src/engine/physics/ecs/ContactProbe.d.ts +73 -0
  115. package/src/engine/physics/ecs/ContactProbe.d.ts.map +1 -0
  116. package/src/engine/physics/ecs/ContactProbe.js +103 -0
  117. package/src/engine/physics/ecs/ContactProbeSystem.d.ts +44 -0
  118. package/src/engine/physics/ecs/ContactProbeSystem.d.ts.map +1 -0
  119. package/src/engine/physics/ecs/ContactProbeSystem.js +397 -0
  120. package/src/engine/physics/fluid/ecs/FluidComponent.d.ts +1 -1
  121. package/src/engine/physics/fluid/ecs/FluidComponent.js +1 -1
  122. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  123. package/src/engine/physics/inverse_kinematics/frame_fabrik/FrameFabrikProblem.d.ts +205 -0
  124. package/src/engine/physics/inverse_kinematics/frame_fabrik/FrameFabrikProblem.d.ts.map +1 -0
  125. package/src/engine/physics/inverse_kinematics/frame_fabrik/FrameFabrikProblem.js +245 -0
  126. package/src/engine/physics/inverse_kinematics/frame_fabrik/frame_fabrik_limit_from_joint.d.ts +21 -0
  127. package/src/engine/physics/inverse_kinematics/frame_fabrik/frame_fabrik_limit_from_joint.d.ts.map +1 -0
  128. package/src/engine/physics/inverse_kinematics/frame_fabrik/frame_fabrik_limit_from_joint.js +63 -0
  129. package/src/engine/physics/inverse_kinematics/frame_fabrik/frame_fabrik_solve.d.ts +33 -0
  130. package/src/engine/physics/inverse_kinematics/frame_fabrik/frame_fabrik_solve.d.ts.map +1 -0
  131. package/src/engine/physics/inverse_kinematics/frame_fabrik/frame_fabrik_solve.js +874 -0
  132. package/src/engine/physics/inverse_kinematics/joint_hinge_mid_axis.d.ts +27 -0
  133. package/src/engine/physics/inverse_kinematics/joint_hinge_mid_axis.d.ts.map +1 -0
  134. package/src/engine/physics/inverse_kinematics/joint_hinge_mid_axis.js +77 -0
  135. package/src/engine/physics/inverse_kinematics/two_bone_path_solve.d.ts +36 -0
  136. package/src/engine/physics/inverse_kinematics/two_bone_path_solve.d.ts.map +1 -0
  137. package/src/engine/physics/inverse_kinematics/two_bone_path_solve.js +97 -0
  138. package/src/engine/physics/inverse_kinematics/two_joint_ik.d.ts +33 -11
  139. package/src/engine/physics/inverse_kinematics/two_joint_ik.d.ts.map +1 -1
  140. package/src/engine/physics/inverse_kinematics/two_joint_ik.js +158 -67
  141. package/src/format/image/avif/api/convert_to_rgba.d.ts +2 -2
  142. package/src/format/image/avif/api/convert_to_rgba.d.ts.map +1 -1
  143. package/src/format/image/avif/api/convert_to_rgba.js +10 -9
  144. package/src/format/image/avif/api/decode_avif.d.ts +2 -2
  145. package/src/format/image/avif/api/decode_avif.d.ts.map +1 -1
  146. package/src/format/image/avif/api/decode_avif.js +1 -1
  147. package/src/shade/playground/ssr_reprojection/README.md +111 -103
  148. package/src/shade/playground/ssr_reprojection/SpatialFilterProbe.js +68 -68
  149. package/src/shade/playground/ssr_reprojection/index.html +80 -79
  150. package/src/shade/playground/ssr_reprojection/main.js +256 -247
  151. package/src/shade/playground/ssr_variance/capture.js +96 -96
  152. package/src/shade/playground/ssr_variance/reference.js +78 -78
  153. package/src/shade/playground/vsm/README.md +96 -0
  154. package/src/shade/playground/vsm/VSMDebugOverlay.d.ts +49 -0
  155. package/src/shade/playground/vsm/VSMDebugOverlay.d.ts.map +1 -0
  156. package/src/shade/playground/vsm/VSMDebugOverlay.js +351 -0
  157. package/src/shade/playground/vsm/clipmap_panel.d.ts +8 -0
  158. package/src/shade/playground/vsm/clipmap_panel.d.ts.map +1 -0
  159. package/src/shade/playground/vsm/clipmap_panel.js +138 -0
  160. package/src/shade/playground/vsm/index.html +170 -0
  161. package/src/shade/playground/vsm/main.d.ts +2 -0
  162. package/src/shade/playground/vsm/main.d.ts.map +1 -0
  163. package/src/shade/playground/vsm/main.js +389 -0
  164. package/src/shade/playground/vsm/scenes.d.ts +52 -0
  165. package/src/shade/playground/vsm/scenes.d.ts.map +1 -0
  166. package/src/shade/playground/vsm/scenes.js +320 -0
  167. package/src/shade/playground/vsm/verify_vsm.d.ts +38 -0
  168. package/src/shade/playground/vsm/verify_vsm.d.ts.map +1 -0
  169. package/src/shade/playground/vsm/verify_vsm.js +305 -0
  170. package/src/shade/playground/water_refraction/README.md +57 -9
  171. package/src/shade/playground/water_refraction/main.js +12 -3
  172. package/src/shade/playground/water_refraction/world.d.ts +1 -0
  173. package/src/shade/playground/water_refraction/world.d.ts.map +1 -1
  174. package/src/shade/playground/water_refraction/world.js +15 -5
  175. package/src/shade/renderer/Renderer.d.ts +19 -0
  176. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  177. package/src/shade/renderer/Renderer.js +72 -1
  178. package/src/shade/renderer/animation/ANIMATION_TRACK_BINDING_STRUCT.d.ts.map +1 -1
  179. package/src/shade/renderer/animation/ANIMATION_TRACK_BINDING_STRUCT.js +10 -1
  180. package/src/shade/renderer/animation/GPUAnimationManager.d.ts +18 -4
  181. package/src/shade/renderer/animation/GPUAnimationManager.d.ts.map +1 -1
  182. package/src/shade/renderer/animation/GPUAnimationManager.js +269 -23
  183. package/src/shade/renderer/animation/POSE_ACCUMULATOR_LAYOUT.d.ts +12 -4
  184. package/src/shade/renderer/animation/POSE_ACCUMULATOR_LAYOUT.d.ts.map +1 -1
  185. package/src/shade/renderer/animation/POSE_ACCUMULATOR_LAYOUT.js +12 -4
  186. package/src/shade/renderer/animation/chunk_pose_accumulator.d.ts.map +1 -1
  187. package/src/shade/renderer/animation/chunk_pose_accumulator.js +14 -1
  188. package/src/shade/renderer/animation/pose/PoseChannelIndex.d.ts +78 -0
  189. package/src/shade/renderer/animation/pose/PoseChannelIndex.d.ts.map +1 -0
  190. package/src/shade/renderer/animation/pose/PoseChannelIndex.js +274 -0
  191. package/src/shade/renderer/animation/pose/PosePlayback.d.ts +40 -3
  192. package/src/shade/renderer/animation/pose/PosePlayback.d.ts.map +1 -1
  193. package/src/shade/renderer/animation/pose/PosePlayback.js +77 -3
  194. package/src/shade/renderer/animation/pose/pose_evaluate_local.d.ts +21 -3
  195. package/src/shade/renderer/animation/pose/pose_evaluate_local.d.ts.map +1 -1
  196. package/src/shade/renderer/animation/pose/pose_evaluate_local.js +79 -11
  197. package/src/shade/renderer/animation/shader_animation_apply.js +1 -1
  198. package/src/shade/renderer/animation/shader_animation_pose_resolve.d.ts +3 -2
  199. package/src/shade/renderer/animation/shader_animation_pose_resolve.d.ts.map +1 -1
  200. package/src/shade/renderer/animation/shader_animation_pose_resolve.js +187 -176
  201. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts +7 -0
  202. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts.map +1 -1
  203. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.js +11 -0
  204. package/src/shade/renderer/animation/skinning/SKINNING_BINDING_STRUCT.d.ts +3 -1
  205. package/src/shade/renderer/animation/skinning/SKINNING_BINDING_STRUCT.d.ts.map +1 -1
  206. package/src/shade/renderer/animation/skinning/SKINNING_BINDING_STRUCT.js +10 -1
  207. package/src/shade/renderer/buffer/table/serde/table_wgsl_gen_read_code.d.ts.map +1 -1
  208. package/src/shade/renderer/buffer/table/serde/table_wgsl_gen_read_code.js +28 -0
  209. package/src/shade/renderer/buffer/table/serde/table_wgsl_gen_write_code.d.ts.map +1 -1
  210. package/src/shade/renderer/buffer/table/serde/table_wgsl_gen_write_code.js +31 -1
  211. package/src/shade/renderer/geometry/MeshletGeometry.d.ts +3 -0
  212. package/src/shade/renderer/geometry/MeshletGeometry.d.ts.map +1 -1
  213. package/src/shade/renderer/geometry/MeshletGeometry.js +1 -0
  214. package/src/shade/renderer/light/LIGHT_DATABASE_SPEC.d.ts.map +1 -1
  215. package/src/shade/renderer/light/LIGHT_DATABASE_SPEC.js +62 -4
  216. package/src/shade/renderer/light/environment/rgbe/parse_rgbe.d.ts +1 -1
  217. package/src/shade/renderer/light/environment/rgbe/parse_rgbe.js +2 -2
  218. package/src/shade/renderer/light/environment/rgbe/rgbe_byte_to_rgb_half.d.ts +2 -2
  219. package/src/shade/renderer/light/environment/rgbe/rgbe_byte_to_rgb_half.d.ts.map +1 -1
  220. package/src/shade/renderer/light/environment/rgbe/rgbe_byte_to_rgb_half.js +6 -14
  221. package/src/shade/renderer/light/environment/sh_exponential/chunk_sh_exp_workgroup_sum.d.ts.map +1 -1
  222. package/src/shade/renderer/light/environment/sh_exponential/chunk_sh_exp_workgroup_sum.js +5 -1
  223. package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
  224. package/src/shade/renderer/medium/ParticipatingMedium.d.ts +3 -0
  225. package/src/shade/renderer/medium/ParticipatingMedium.d.ts.map +1 -1
  226. package/src/shade/renderer/medium/ParticipatingMedium.js +7 -0
  227. package/src/shade/renderer/object_property/chunk_write_object_property.d.ts +3 -1
  228. package/src/shade/renderer/object_property/chunk_write_object_property.d.ts.map +1 -1
  229. package/src/shade/renderer/object_property/chunk_write_object_property.js +5 -2
  230. package/src/shade/renderer/object_property/chunk_write_object_property_node3d.d.ts +4 -0
  231. package/src/shade/renderer/object_property/chunk_write_object_property_node3d.d.ts.map +1 -1
  232. package/src/shade/renderer/object_property/chunk_write_object_property_node3d.js +6 -1
  233. package/src/shade/renderer/postprocess/eye/shader_autoexposure_build_histogram.d.ts.map +1 -1
  234. package/src/shade/renderer/postprocess/eye/shader_autoexposure_build_histogram.js +5 -35
  235. package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
  236. package/src/shade/renderer/postprocess/ssr/SSR.d.ts +12 -4
  237. package/src/shade/renderer/postprocess/ssr/SSR.d.ts.map +1 -1
  238. package/src/shade/renderer/postprocess/ssr/SSR.js +36 -8
  239. package/src/shade/renderer/postprocess/ssr/SSR_DENOISE_TILE_SIZE.d.ts +3 -0
  240. package/src/shade/renderer/postprocess/ssr/SSR_DENOISE_TILE_SIZE.d.ts.map +1 -0
  241. package/src/shade/renderer/postprocess/ssr/SSR_DENOISE_TILE_SIZE.js +2 -0
  242. package/src/shade/renderer/postprocess/ssr/chunk_ssr_denoise_tile_active.d.ts +8 -0
  243. package/src/shade/renderer/postprocess/ssr/chunk_ssr_denoise_tile_active.d.ts.map +1 -0
  244. package/src/shade/renderer/postprocess/ssr/chunk_ssr_denoise_tile_active.js +40 -0
  245. package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_temporal_accumulate.d.ts.map +1 -1
  246. package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_temporal_accumulate.js +150 -137
  247. package/src/shade/renderer/postprocess/ssr/shader_ssr_denoise_tile_classify.d.ts +3 -0
  248. package/src/shade/renderer/postprocess/ssr/shader_ssr_denoise_tile_classify.d.ts.map +1 -0
  249. package/src/shade/renderer/postprocess/ssr/shader_ssr_denoise_tile_classify.js +44 -0
  250. package/src/shade/renderer/postprocess/ssr/shader_ssr_denoise_tile_dilate.d.ts +5 -0
  251. package/src/shade/renderer/postprocess/ssr/shader_ssr_denoise_tile_dilate.d.ts.map +1 -0
  252. package/src/shade/renderer/postprocess/ssr/shader_ssr_denoise_tile_dilate.js +35 -0
  253. package/src/shade/renderer/postprocess/ssr/ssr_graph_denoise_tiles.d.ts +26 -0
  254. package/src/shade/renderer/postprocess/ssr/ssr_graph_denoise_tiles.d.ts.map +1 -0
  255. package/src/shade/renderer/postprocess/ssr/ssr_graph_denoise_tiles.js +42 -0
  256. package/src/shade/renderer/postprocess/ssr/ssr_reproject_shader.d.ts +1 -0
  257. package/src/shade/renderer/postprocess/ssr/ssr_reproject_shader.d.ts.map +1 -1
  258. package/src/shade/renderer/postprocess/ssr/ssr_reproject_shader.js +113 -105
  259. package/src/shade/renderer/postprocess/ssr/ssr_spatial_denoise_shader.d.ts +2 -0
  260. package/src/shade/renderer/postprocess/ssr/ssr_spatial_denoise_shader.d.ts.map +1 -1
  261. package/src/shade/renderer/postprocess/ssr/ssr_spatial_denoise_shader.js +177 -167
  262. package/src/shade/renderer/rasterize/DEPTH_STENCIL_STATE_SHADOW.d.ts.map +1 -1
  263. package/src/shade/renderer/rasterize/DEPTH_STENCIL_STATE_SHADOW.js +10 -0
  264. package/src/shade/renderer/rasterize/RasterizationJob.d.ts +1 -2
  265. package/src/shade/renderer/rasterize/RasterizationJob.d.ts.map +1 -1
  266. package/src/shade/renderer/rasterize/RasterizationJob.js +1 -2
  267. package/src/shade/renderer/rasterize/bucket/construct_primitive_state.d.ts +5 -6
  268. package/src/shade/renderer/rasterize/bucket/construct_primitive_state.d.ts.map +1 -1
  269. package/src/shade/renderer/rasterize/bucket/construct_primitive_state.js +5 -6
  270. package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.d.ts +2 -2
  271. package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.d.ts.map +1 -1
  272. package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.js +1 -1
  273. package/src/shade/renderer/scene/SCENE_DATABASE_SPEC.d.ts.map +1 -1
  274. package/src/shade/renderer/scene/SCENE_DATABASE_SPEC.js +11 -0
  275. package/src/shade/renderer/scene/optimization/geometry/geometry_deduplicate.d.ts +1 -1
  276. package/src/shade/renderer/scene/optimization/geometry/geometry_deduplicate.d.ts.map +1 -1
  277. package/src/shade/renderer/scene/optimization/geometry/geometry_deduplicate.js +135 -73
  278. package/src/shade/renderer/scene/optimization/geometry/internal/cover_greedy.d.ts +7 -0
  279. package/src/shade/renderer/scene/optimization/geometry/internal/cover_greedy.d.ts.map +1 -1
  280. package/src/shade/renderer/scene/optimization/geometry/internal/cover_greedy.js +29 -1
  281. package/src/shade/renderer/scene/optimization/geometry/internal/face_neighbourhood_hash.d.ts +19 -0
  282. package/src/shade/renderer/scene/optimization/geometry/internal/face_neighbourhood_hash.d.ts.map +1 -0
  283. package/src/shade/renderer/scene/optimization/geometry/internal/face_neighbourhood_hash.js +167 -0
  284. package/src/shade/renderer/scene/optimization/geometry/internal/neighbourhood_anchor_index.d.ts +25 -0
  285. package/src/shade/renderer/scene/optimization/geometry/internal/neighbourhood_anchor_index.d.ts.map +1 -0
  286. package/src/shade/renderer/scene/optimization/geometry/internal/neighbourhood_anchor_index.js +124 -0
  287. package/src/shade/renderer/scene/optimization/geometry/internal/seed_correspondence_from_face_pair.d.ts +19 -0
  288. package/src/shade/renderer/scene/optimization/geometry/internal/seed_correspondence_from_face_pair.d.ts.map +1 -0
  289. package/src/shade/renderer/scene/optimization/geometry/internal/seed_correspondence_from_face_pair.js +48 -0
  290. package/src/shade/renderer/scene/rows/GPUSceneRows.d.ts +17 -1
  291. package/src/shade/renderer/scene/rows/GPUSceneRows.d.ts.map +1 -1
  292. package/src/shade/renderer/scene/rows/GPUSceneRows.js +29 -3
  293. package/src/shade/renderer/shader/chunk/atmosphere/phase/jd/build_lut_fog_parameters_jendersie_deon.d.ts.map +1 -1
  294. package/src/shade/renderer/shader/chunk/atmosphere/phase/jd/build_lut_fog_parameters_jendersie_deon.js +4 -5
  295. package/src/shade/renderer/shader/chunk/brdf/dfg/generate_dfg_texture.d.ts.map +1 -1
  296. package/src/shade/renderer/shader/chunk/brdf/dfg/generate_dfg_texture.js +1 -5
  297. package/src/shade/renderer/shader/chunk/screen_space/chunk_screen_importance.d.ts +30 -0
  298. package/src/shade/renderer/shader/chunk/screen_space/chunk_screen_importance.d.ts.map +1 -0
  299. package/src/shade/renderer/shader/chunk/screen_space/chunk_screen_importance.js +54 -0
  300. package/src/shade/renderer/shader/type/serde/read_gpu_typed_buffer.d.ts.map +1 -1
  301. package/src/shade/renderer/shader/type/serde/read_gpu_typed_buffer.js +3 -2
  302. package/src/shade/renderer/shadow/map/DIRECTIONAL_SHADOWMAP_STRUCT.d.ts +19 -0
  303. package/src/shade/renderer/shadow/map/DIRECTIONAL_SHADOWMAP_STRUCT.d.ts.map +1 -0
  304. package/src/shade/renderer/shadow/map/DIRECTIONAL_SHADOWMAP_STRUCT.js +27 -0
  305. package/src/shade/renderer/shadow/map/DirectionalLightShadowmap.d.ts +1 -0
  306. package/src/shade/renderer/shadow/map/DirectionalLightShadowmap.d.ts.map +1 -1
  307. package/src/shade/renderer/shadow/map/DirectionalLightShadowmap.js +4 -0
  308. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts +54 -0
  309. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts.map +1 -1
  310. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.js +502 -10
  311. package/src/shade/renderer/shadow/map/Shadowmap.d.ts +3 -2
  312. package/src/shade/renderer/shadow/map/Shadowmap.d.ts.map +1 -1
  313. package/src/shade/renderer/shadow/map/Shadowmap.js +3 -2
  314. package/src/shade/renderer/shadow/map/shader/chunk_sample_shadowmap_atlas_for_light.d.ts +8 -0
  315. package/src/shade/renderer/shadow/map/shader/chunk_sample_shadowmap_atlas_for_light.d.ts.map +1 -1
  316. package/src/shade/renderer/shadow/map/shader/chunk_sample_shadowmap_atlas_for_light.js +34 -3
  317. package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_directional.d.ts +3 -2
  318. package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_directional.d.ts.map +1 -1
  319. package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_directional.js +17 -2
  320. package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_point2.d.ts.map +1 -1
  321. package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_point2.js +137 -133
  322. package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_FIRST_TEXEL_SIZE.d.ts +15 -0
  323. package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_FIRST_TEXEL_SIZE.d.ts.map +1 -0
  324. package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_FIRST_TEXEL_SIZE.js +14 -0
  325. package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_PAGE_BUDGET.d.ts +16 -0
  326. package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_PAGE_BUDGET.d.ts.map +1 -0
  327. package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_PAGE_BUDGET.js +15 -0
  328. package/src/shade/renderer/shadow/vsm/PLAN.md +440 -0
  329. package/src/shade/renderer/shadow/vsm/REVIEW_LEDGER.md +43 -0
  330. package/src/shade/renderer/shadow/vsm/VSMMoverTracker.d.ts +42 -0
  331. package/src/shade/renderer/shadow/vsm/VSMMoverTracker.d.ts.map +1 -0
  332. package/src/shade/renderer/shadow/vsm/VSMMoverTracker.js +153 -0
  333. package/src/shade/renderer/shadow/vsm/VSMPageManager.d.ts +327 -0
  334. package/src/shade/renderer/shadow/vsm/VSMPageManager.d.ts.map +1 -0
  335. package/src/shade/renderer/shadow/vsm/VSMPageManager.js +1408 -0
  336. package/src/shade/renderer/shadow/vsm/VSM_COVER_LEVEL_STEP.d.ts +14 -0
  337. package/src/shade/renderer/shadow/vsm/VSM_COVER_LEVEL_STEP.d.ts.map +1 -0
  338. package/src/shade/renderer/shadow/vsm/VSM_COVER_LEVEL_STEP.js +13 -0
  339. package/src/shade/renderer/shadow/vsm/VSM_FEEDBACK_LAYOUT.d.ts +63 -0
  340. package/src/shade/renderer/shadow/vsm/VSM_FEEDBACK_LAYOUT.d.ts.map +1 -0
  341. package/src/shade/renderer/shadow/vsm/VSM_FEEDBACK_LAYOUT.js +70 -0
  342. package/src/shade/renderer/shadow/vsm/VSM_LEVEL_LIMIT.d.ts +11 -0
  343. package/src/shade/renderer/shadow/vsm/VSM_LEVEL_LIMIT.d.ts.map +1 -0
  344. package/src/shade/renderer/shadow/vsm/VSM_LEVEL_LIMIT.js +10 -0
  345. package/src/shade/renderer/shadow/vsm/VSM_MOVER_LAYOUT.d.ts +54 -0
  346. package/src/shade/renderer/shadow/vsm/VSM_MOVER_LAYOUT.d.ts.map +1 -0
  347. package/src/shade/renderer/shadow/vsm/VSM_MOVER_LAYOUT.js +75 -0
  348. package/src/shade/renderer/shadow/vsm/VSM_RECORD_STRUCT.d.ts +23 -0
  349. package/src/shade/renderer/shadow/vsm/VSM_RECORD_STRUCT.d.ts.map +1 -0
  350. package/src/shade/renderer/shadow/vsm/VSM_RECORD_STRUCT.js +85 -0
  351. package/src/shade/renderer/shadow/vsm/VSM_SLOT_STRUCT.d.ts +16 -0
  352. package/src/shade/renderer/shadow/vsm/VSM_SLOT_STRUCT.d.ts.map +1 -0
  353. package/src/shade/renderer/shadow/vsm/VSM_SLOT_STRUCT.js +29 -0
  354. package/src/shade/renderer/shadow/vsm/VirtualShadowMap.d.ts +136 -25
  355. package/src/shade/renderer/shadow/vsm/VirtualShadowMap.d.ts.map +1 -1
  356. package/src/shade/renderer/shadow/vsm/VirtualShadowMap.js +282 -116
  357. package/src/shade/renderer/shadow/vsm/graph_vsm_feedback.d.ts +39 -0
  358. package/src/shade/renderer/shadow/vsm/graph_vsm_feedback.d.ts.map +1 -0
  359. package/src/shade/renderer/shadow/vsm/graph_vsm_feedback.js +289 -0
  360. package/src/shade/renderer/shadow/vsm/shader/chunk_shadowmap_sample_virtual.d.ts +18 -0
  361. package/src/shade/renderer/shadow/vsm/shader/chunk_shadowmap_sample_virtual.d.ts.map +1 -0
  362. package/src/shade/renderer/shadow/vsm/shader/chunk_shadowmap_sample_virtual.js +65 -0
  363. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_addressing.d.ts +17 -0
  364. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_addressing.d.ts.map +1 -0
  365. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_addressing.js +75 -0
  366. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_append_mover.d.ts +14 -0
  367. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_append_mover.d.ts.map +1 -0
  368. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_append_mover.js +45 -0
  369. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_find_page.d.ts +17 -0
  370. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_find_page.d.ts.map +1 -0
  371. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_find_page.js +100 -0
  372. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_page_view_projection.d.ts +15 -0
  373. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_page_view_projection.d.ts.map +1 -0
  374. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_page_view_projection.js +47 -0
  375. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_demand.d.ts +26 -0
  376. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_demand.d.ts.map +1 -0
  377. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_demand.js +156 -0
  378. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_gather_counts.d.ts +13 -0
  379. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_gather_counts.d.ts.map +1 -0
  380. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_gather_counts.js +65 -0
  381. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_movers.d.ts +30 -0
  382. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_movers.d.ts.map +1 -0
  383. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_movers.js +184 -0
  384. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_skinned_movers.d.ts +23 -0
  385. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_skinned_movers.d.ts.map +1 -0
  386. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_skinned_movers.js +109 -0
  387. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_stale.d.ts +56 -0
  388. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_stale.d.ts.map +1 -0
  389. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_stale.js +211 -0
  390. package/src/shade/renderer/texture/format/decode_typed_gpu_data.d.ts +1 -1
  391. package/src/shade/renderer/texture/format/decode_typed_gpu_data.d.ts.map +1 -1
  392. package/src/shade/renderer/texture/format/decode_typed_gpu_data.js +3 -13
  393. package/src/shade/renderer/texture/format/infer_format_from_parameters.d.ts.map +1 -1
  394. package/src/shade/renderer/texture/format/infer_format_from_parameters.js +2 -3
  395. package/src/shade/renderer/texture/texture_write_to_gpu.d.ts.map +1 -1
  396. package/src/shade/renderer/texture/texture_write_to_gpu.js +16 -16
  397. package/src/shade/renderer/texture/virtual/VTPhysicalCache.d.ts +4 -90
  398. package/src/shade/renderer/texture/virtual/VTPhysicalCache.d.ts.map +1 -1
  399. package/src/shade/renderer/texture/virtual/VTPhysicalCache.js +6 -210
  400. package/src/shade/renderer/texture/virtual/VTPhysicalSlots.d.ts +119 -0
  401. package/src/shade/renderer/texture/virtual/VTPhysicalSlots.d.ts.map +1 -0
  402. package/src/shade/renderer/texture/virtual/VTPhysicalSlots.js +245 -0
  403. package/src/shade/renderer/texture/virtual/build_chunk_vt_lookup.d.ts +1 -1
  404. package/src/shade/renderer/texture/virtual/build_chunk_vt_lookup.d.ts.map +1 -1
  405. package/src/shade/renderer/texture/virtual/build_chunk_vt_lookup.js +3 -19
  406. package/src/shade/renderer/texture/virtual/chunk_vt_page_table_entry.d.ts +13 -0
  407. package/src/shade/renderer/texture/virtual/chunk_vt_page_table_entry.d.ts.map +1 -0
  408. package/src/shade/renderer/texture/virtual/chunk_vt_page_table_entry.js +34 -0
  409. package/src/shade/renderer/water/GPUWaterRenderer.d.ts +7 -2
  410. package/src/shade/renderer/water/GPUWaterRenderer.d.ts.map +1 -1
  411. package/src/shade/renderer/water/GPUWaterRenderer.js +49 -49
  412. package/src/shade/renderer/water/chunk_water_transport.js +3 -3
  413. package/src/shade/renderer/water/medium/GPUWaterBodies.d.ts +11 -25
  414. package/src/shade/renderer/water/medium/GPUWaterBodies.d.ts.map +1 -1
  415. package/src/shade/renderer/water/medium/GPUWaterBodies.js +64 -116
  416. package/src/shade/renderer/water/medium/WATER_BODIES_STRUCT.d.ts +1 -20
  417. package/src/shade/renderer/water/medium/WATER_BODIES_STRUCT.d.ts.map +1 -1
  418. package/src/shade/renderer/water/medium/WATER_BODIES_STRUCT.js +10 -42
  419. package/src/shade/renderer/water/medium/chunk_water_bodies.d.ts +3 -0
  420. package/src/shade/renderer/water/medium/chunk_water_bodies.d.ts.map +1 -0
  421. package/src/shade/renderer/water/medium/chunk_water_bodies.js +3 -0
  422. package/src/shade/renderer/water/medium/shader_water_bodies_derive.d.ts +1 -5
  423. package/src/shade/renderer/water/medium/shader_water_bodies_derive.d.ts.map +1 -1
  424. package/src/shade/renderer/water/medium/shader_water_bodies_derive.js +32 -30
  425. package/src/shade/renderer/water/medium/shader_water_meshlets.d.ts +4 -0
  426. package/src/shade/renderer/water/medium/shader_water_meshlets.d.ts.map +1 -0
  427. package/src/shade/renderer/water/medium/shader_water_meshlets.js +69 -0
  428. package/src/shade/renderer/water/optics/chunk_water_inscatter.d.ts.map +1 -1
  429. package/src/shade/renderer/water/optics/chunk_water_inscatter.js +124 -123
  430. package/src/shade/renderer/water/optics/chunk_water_receiver_downwelling.d.ts.map +1 -1
  431. package/src/shade/renderer/water/optics/chunk_water_receiver_downwelling.js +75 -74
  432. package/src/shade/renderer/water/shader_water.d.ts +1 -1
  433. package/src/shade/renderer/water/shader_water.d.ts.map +1 -1
  434. package/src/shade/renderer/water/shader_water.js +490 -406
  435. package/src/shade/renderer/water/surface/GPUWaterWaveSimulation.d.ts +12 -85
  436. package/src/shade/renderer/water/surface/GPUWaterWaveSimulation.d.ts.map +1 -1
  437. package/src/shade/renderer/water/surface/GPUWaterWaveSimulation.js +128 -408
  438. package/src/shade/renderer/water/surface/WATER_WAVE_RECORD_STRUCT.d.ts +6 -0
  439. package/src/shade/renderer/water/surface/WATER_WAVE_RECORD_STRUCT.d.ts.map +1 -0
  440. package/src/shade/renderer/water/surface/WATER_WAVE_RECORD_STRUCT.js +23 -0
  441. package/src/shade/renderer/water/surface/chunk_water_tessellation.d.ts +9 -0
  442. package/src/shade/renderer/water/surface/chunk_water_tessellation.d.ts.map +1 -0
  443. package/src/shade/renderer/water/surface/chunk_water_tessellation.js +144 -0
  444. package/src/shade/renderer/water/surface/chunk_water_wave.d.ts +3 -5
  445. package/src/shade/renderer/water/surface/chunk_water_wave.d.ts.map +1 -1
  446. package/src/shade/renderer/water/surface/chunk_water_wave.js +40 -48
  447. package/src/shade/renderer/water/surface/graph_water_tessellation.d.ts +14 -0
  448. package/src/shade/renderer/water/surface/graph_water_tessellation.d.ts.map +1 -0
  449. package/src/shade/renderer/water/surface/graph_water_tessellation.js +34 -0
  450. package/src/shade/renderer/water/surface/shader_water_tiles.d.ts +4 -0
  451. package/src/shade/renderer/water/surface/shader_water_tiles.d.ts.map +1 -0
  452. package/src/shade/renderer/water/surface/shader_water_tiles.js +123 -0
  453. package/src/shade/renderer/water/surface/shader_water_wave_batch.d.ts +6 -0
  454. package/src/shade/renderer/water/surface/shader_water_wave_batch.d.ts.map +1 -0
  455. package/src/shade/renderer/water/surface/shader_water_wave_batch.js +85 -0
  456. package/src/shade/renderer/water/surface/shader_water_wave_domain.d.ts +6 -0
  457. package/src/shade/renderer/water/surface/shader_water_wave_domain.d.ts.map +1 -0
  458. package/src/shade/renderer/water/surface/shader_water_wave_domain.js +83 -0
  459. package/src/shade/renderer/water/water_height_texture_from_sampler.d.ts.map +1 -1
  460. package/src/shade/renderer/water/water_height_texture_from_sampler.js +4 -3
  461. package/src/engine/ecs/ik/IKConstraint.d.ts +0 -52
  462. package/src/engine/ecs/ik/IKConstraint.d.ts.map +0 -1
  463. package/src/engine/ecs/ik/IKConstraint.js +0 -95
  464. package/src/engine/ecs/ik/IKProblem.d.ts +0 -45
  465. package/src/engine/ecs/ik/IKProblem.d.ts.map +0 -1
  466. package/src/engine/ecs/ik/IKProblem.js +0 -58
  467. package/src/engine/ecs/ik/IKSolver.d.ts +0 -8
  468. package/src/engine/ecs/ik/IKSolver.d.ts.map +0 -1
  469. package/src/engine/ecs/ik/IKSolver.js +0 -9
  470. package/src/engine/ecs/ik/InverseKinematics.d.ts +0 -48
  471. package/src/engine/ecs/ik/InverseKinematics.d.ts.map +0 -1
  472. package/src/engine/ecs/ik/InverseKinematics.js +0 -119
  473. package/src/engine/ecs/ik/InverseKinematicsSerializationAdapter.d.ts +0 -19
  474. package/src/engine/ecs/ik/InverseKinematicsSerializationAdapter.d.ts.map +0 -1
  475. package/src/engine/ecs/ik/InverseKinematicsSerializationAdapter.js +0 -72
  476. package/src/engine/ecs/ik/InverseKinematicsSystem.d.ts +0 -54
  477. package/src/engine/ecs/ik/InverseKinematicsSystem.d.ts.map +0 -1
  478. package/src/engine/ecs/ik/InverseKinematicsSystem.js +0 -212
  479. package/src/engine/ecs/ik/OneBoneSurfaceAlignmentSolver.d.ts +0 -8
  480. package/src/engine/ecs/ik/OneBoneSurfaceAlignmentSolver.d.ts.map +0 -1
  481. package/src/engine/ecs/ik/OneBoneSurfaceAlignmentSolver.js +0 -153
  482. package/src/engine/ecs/ik/TwoBoneInverseKinematicsSolver.d.ts +0 -5
  483. package/src/engine/ecs/ik/TwoBoneInverseKinematicsSolver.d.ts.map +0 -1
  484. package/src/engine/ecs/ik/TwoBoneInverseKinematicsSolver.js +0 -120
  485. package/src/engine/ecs/ik/ik_bone_chain.d.ts +0 -64
  486. package/src/engine/ecs/ik/ik_bone_chain.d.ts.map +0 -1
  487. package/src/engine/ecs/ik/ik_bone_chain.js +0 -142
  488. package/src/engine/ecs/ik/ik_probe_terrain_contact.d.ts +0 -42
  489. package/src/engine/ecs/ik/ik_probe_terrain_contact.d.ts.map +0 -1
  490. package/src/engine/ecs/ik/ik_probe_terrain_contact.js +0 -123
  491. package/src/engine/ecs/ik/ik_write_local_rotation.d.ts +0 -18
  492. package/src/engine/ecs/ik/ik_write_local_rotation.d.ts.map +0 -1
  493. package/src/engine/ecs/ik/ik_write_local_rotation.js +0 -32
  494. package/src/engine/graphics/ecs/water/WATER_SIZE.d.ts +0 -2
  495. package/src/engine/graphics/ecs/water/WATER_SIZE.d.ts.map +0 -1
  496. package/src/engine/graphics/ecs/water/WATER_SIZE.js +0 -1
  497. package/src/shade/renderer/light/GPUViewLightContext.d.ts +0 -22
  498. package/src/shade/renderer/light/GPUViewLightContext.d.ts.map +0 -1
  499. package/src/shade/renderer/light/GPUViewLightContext.js +0 -62
  500. package/src/shade/renderer/shadow/map/csm/CSM_SHADOWMAP_STRUCT.d.ts +0 -14
  501. package/src/shade/renderer/shadow/map/csm/CSM_SHADOWMAP_STRUCT.d.ts.map +0 -1
  502. package/src/shade/renderer/shadow/map/csm/CSM_SHADOWMAP_STRUCT.js +0 -20
  503. package/src/shade/renderer/shadow/vsm/GPUViewShadowMaps.d.ts +0 -27
  504. package/src/shade/renderer/shadow/vsm/GPUViewShadowMaps.d.ts.map +0 -1
  505. package/src/shade/renderer/shadow/vsm/GPUViewShadowMaps.js +0 -147
  506. package/src/shade/renderer/shadow/vsm/GPUVirtualShadowTextureResidence.d.ts +0 -7
  507. package/src/shade/renderer/shadow/vsm/GPUVirtualShadowTextureResidence.d.ts.map +0 -1
  508. package/src/shade/renderer/shadow/vsm/GPUVirtualShadowTextureResidence.js +0 -10
  509. package/src/shade/renderer/shadow/vsm/VSM_RESIDENCE_WORKGROUP_TILE_RESOLUTION.d.ts +0 -2
  510. package/src/shade/renderer/shadow/vsm/VSM_RESIDENCE_WORKGROUP_TILE_RESOLUTION.d.ts.map +0 -1
  511. package/src/shade/renderer/shadow/vsm/VSM_RESIDENCE_WORKGROUP_TILE_RESOLUTION.js +0 -1
  512. package/src/shade/renderer/shadow/vsm/VSM_UNIFORMS_STRUCT.d.ts +0 -3
  513. package/src/shade/renderer/shadow/vsm/VSM_UNIFORMS_STRUCT.d.ts.map +0 -1
  514. package/src/shade/renderer/shadow/vsm/VSM_UNIFORMS_STRUCT.js +0 -8
  515. package/src/shade/renderer/shadow/vsm/VirtualShadowmapRenderer.d.ts +0 -27
  516. package/src/shade/renderer/shadow/vsm/VirtualShadowmapRenderer.d.ts.map +0 -1
  517. package/src/shade/renderer/shadow/vsm/VirtualShadowmapRenderer.js +0 -102
  518. package/src/shade/renderer/shadow/vsm/debug_inspect_coarse_bounds_buffer.d.ts +0 -8
  519. package/src/shade/renderer/shadow/vsm/debug_inspect_coarse_bounds_buffer.d.ts.map +0 -1
  520. package/src/shade/renderer/shadow/vsm/debug_inspect_coarse_bounds_buffer.js +0 -34
  521. package/src/shade/renderer/shadow/vsm/debug_inspect_residence_buffer.d.ts +0 -10
  522. package/src/shade/renderer/shadow/vsm/debug_inspect_residence_buffer.d.ts.map +0 -1
  523. package/src/shade/renderer/shadow/vsm/debug_inspect_residence_buffer.js +0 -64
  524. package/src/shade/renderer/shadow/vsm/decode_tile_address.d.ts +0 -11
  525. package/src/shade/renderer/shadow/vsm/decode_tile_address.d.ts.map +0 -1
  526. package/src/shade/renderer/shadow/vsm/decode_tile_address.js +0 -26
  527. package/src/shade/renderer/shadow/vsm/render/vms_render_tiles.d.ts +0 -2
  528. package/src/shade/renderer/shadow/vsm/render/vms_render_tiles.d.ts.map +0 -1
  529. package/src/shade/renderer/shadow/vsm/render/vms_render_tiles.js +0 -11
  530. package/src/shade/renderer/shadow/vsm/vms_pipeline_compute_coarse_bounds.d.ts +0 -20
  531. package/src/shade/renderer/shadow/vsm/vms_pipeline_compute_coarse_bounds.d.ts.map +0 -1
  532. package/src/shade/renderer/shadow/vsm/vms_pipeline_compute_coarse_bounds.js +0 -184
  533. package/src/shade/renderer/shadow/vsm/vsm_residence_pipeline.d.ts +0 -25
  534. package/src/shade/renderer/shadow/vsm/vsm_residence_pipeline.d.ts.map +0 -1
  535. package/src/shade/renderer/shadow/vsm/vsm_residence_pipeline.js +0 -230
  536. package/src/shade/renderer/shadow/vsm/vsm_tile_allocation_pipeline.d.ts +0 -19
  537. package/src/shade/renderer/shadow/vsm/vsm_tile_allocation_pipeline.d.ts.map +0 -1
  538. package/src/shade/renderer/shadow/vsm/vsm_tile_allocation_pipeline.js +0 -127
  539. package/src/shade/renderer/texture/encode/ENCODE_NOTES_2026_09_02.md +0 -462
  540. package/src/shade/renderer/water/optics/chunk_water_light_transmittance.d.ts +0 -23
  541. package/src/shade/renderer/water/optics/chunk_water_light_transmittance.d.ts.map +0 -1
  542. package/src/shade/renderer/water/optics/chunk_water_light_transmittance_dry.d.ts +0 -18
  543. package/src/shade/renderer/water/optics/chunk_water_light_transmittance_dry.d.ts.map +0 -1
  544. package/src/shade/renderer/water/surface/WATER_SURFACE_VERTEX_STRUCT.d.ts +0 -12
  545. package/src/shade/renderer/water/surface/WATER_SURFACE_VERTEX_STRUCT.d.ts.map +0 -1
  546. package/src/shade/renderer/water/surface/WATER_SURFACE_VERTEX_STRUCT.js +0 -27
  547. package/src/shade/renderer/water/surface/WATER_WAVE_PARAMETERS_STRUCT.d.ts +0 -14
  548. package/src/shade/renderer/water/surface/WATER_WAVE_PARAMETERS_STRUCT.d.ts.map +0 -1
  549. package/src/shade/renderer/water/surface/WATER_WAVE_PARAMETERS_STRUCT.js +0 -49
  550. package/src/shade/renderer/water/surface/chunk_water_wave_grid.d.ts +0 -9
  551. package/src/shade/renderer/water/surface/chunk_water_wave_grid.d.ts.map +0 -1
  552. package/src/shade/renderer/water/surface/chunk_water_wave_grid.js +0 -47
  553. package/src/shade/renderer/water/surface/shader_water_surface_write.d.ts +0 -10
  554. package/src/shade/renderer/water/surface/shader_water_surface_write.d.ts.map +0 -1
  555. package/src/shade/renderer/water/surface/shader_water_surface_write.js +0 -51
  556. package/src/shade/renderer/water/surface/shader_water_wave_step.d.ts +0 -12
  557. package/src/shade/renderer/water/surface/shader_water_wave_step.d.ts.map +0 -1
  558. package/src/shade/renderer/water/surface/shader_water_wave_step.js +0 -54
  559. package/src/shade/renderer/water/surface/water_surface_grid_indices.d.ts +0 -13
  560. package/src/shade/renderer/water/surface/water_surface_grid_indices.d.ts.map +0 -1
  561. package/src/shade/renderer/water/surface/water_surface_grid_indices.js +0 -39
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WATER_WAVE_RECORD_STRUCT.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/water/surface/WATER_WAVE_RECORD_STRUCT.js"],"names":[],"mappings":"AAIA,kDAAkD;AAClD,0CAA2C;AAE3C,gFAAgF;AAChF,oDAcsB;6BApBO,mCAAmC"}
@@ -0,0 +1,23 @@
1
+ import { f32, u32, vec2f, vec4f } from "../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
2
+ import { WebGPUArray } from "../../shader/type/WebGPUArray.js";
3
+ import { WebGPUStruct } from "../../shader/type/WebGPUStruct.js";
4
+
5
+ /** Most impulses one body applies in one step. */
6
+ export const WATER_WAVE_IMPULSE_LIMIT = 16;
7
+
8
+ /** Persistent inputs; the shared dispatch owns timestep and grid resolution. */
9
+ export const WATER_WAVE_RECORD_STRUCT = WebGPUStruct.from({
10
+ /** Local xz bounds; these describe the displacement field, not the water outline. */
11
+ extent: vec4f,
12
+ /** Local wind direction, world acceleration and drift speed. */
13
+ forcing: vec4f,
14
+ /** Local xz centre, world radius and velocity kick. */
15
+ impulses: WebGPUArray.from(vec4f, WATER_WAVE_IMPULSE_LIMIT),
16
+ node: u32,
17
+ unresolved_variance: f32,
18
+ impulse_count: u32,
19
+ first_write: u32,
20
+ geometry: u32,
21
+ /** GPU-owned signed local-y displacement bounds, reduced after simulation. */
22
+ displacement_bounds: vec2f,
23
+ }, "WaterWaveRecord");
@@ -0,0 +1,9 @@
1
+ export const WATER_TILE_CELLS: 16;
2
+ export const WATER_TILE_VERTEX_COUNT: number;
3
+ export const WATER_TILE_STRUCT: WebGPUStruct;
4
+ export const WATER_TESSELLATION_STRUCT: WebGPUStruct;
5
+ /** Clip in barycentric space: every generated point remains on the authored triangle. */
6
+ export const chunk_water_tessellation: CodeChunk;
7
+ import { WebGPUStruct } from "../../shader/type/WebGPUStruct.js";
8
+ import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
9
+ //# sourceMappingURL=chunk_water_tessellation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk_water_tessellation.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/water/surface/chunk_water_tessellation.js"],"names":[],"mappings":"AAKA,kCAAmC;AAEnC,6CAAkE;AAClE,6CAEuB;AACvB,qDAE+B;AAE/B,yFAAyF;AACzF,iDA+H8B;6BA9ID,mCAAmC;0BADtC,oCAAoC"}
@@ -0,0 +1,144 @@
1
+ import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
2
+ import { WebGPUStruct } from "../../shader/type/WebGPUStruct.js";
3
+ import { f32, u32, vec2i, vec2u, vec2f, mat4x4f } from "../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
4
+ import { chunk_barycentric_solve } from "../../shader/chunk/geometry/triangle/chunk_barycentric_solve.js";
5
+
6
+ export const WATER_TILE_CELLS = 16;
7
+ // A triangle clipped by five planes has at most eight corners, hence six fan triangles.
8
+ export const WATER_TILE_VERTEX_COUNT = WATER_TILE_CELLS ** 2 * 18;
9
+ export const WATER_TILE_STRUCT = WebGPUStruct.from({
10
+ meshlet: u32, triangle: u32, body: u32, anchor: f32, origin: vec2i, size: vec2u, pixels: f32,
11
+ }, 'WaterTile').pack();
12
+ export const WATER_TESSELLATION_STRUCT = WebGPUStruct.from({
13
+ resolution: vec2f, pixels: f32, view_projection_matrix: mat4x4f,
14
+ }, 'WaterTessellation').pack();
15
+
16
+ /** Clip in barycentric space: every generated point remains on the authored triangle. */
17
+ export const chunk_water_tessellation = CodeChunk.from(/* language=WGSL */ `
18
+ fn water_reference_position(position: vec3f, height: f32, simulated: bool) -> vec3f {
19
+ return vec3f(position.x, select(position.y, height, simulated), position.z);
20
+ }
21
+ // Bits identify the boundaries meeting at each corner: the three authored edges,
22
+ // followed by the near plane and four cell edges. Retaining them lets reconstruction
23
+ // evaluate an intersection directly, independent of the polygon clipping history.
24
+ struct WaterPolygon { points: array<vec3f, 8>, boundaries: array<u32, 8>, count: u32 }
25
+ fn water_triangle_polygon() -> WaterPolygon {
26
+ var p: WaterPolygon;
27
+ p.points[0] = vec3f(1,0,0); p.points[1] = vec3f(0,1,0); p.points[2] = vec3f(0,0,1); p.count = 3u;
28
+ p.boundaries[0] = 6u; p.boundaries[1] = 5u; p.boundaries[2] = 3u;
29
+ return p;
30
+ }
31
+ fn water_clip_polygon(p: WaterPolygon, distances: vec3f, boundary: u32) -> WaterPolygon {
32
+ var out: WaterPolygon;
33
+ if (p.count == 0u) { return out; }
34
+ var previous = p.points[p.count - 1u];
35
+ var d_previous = dot(previous, distances);
36
+ for (var i = 0u; i < p.count; i++) {
37
+ let current = p.points[i]; let d = dot(current, distances);
38
+ if ((d >= 0.0) != (d_previous >= 0.0)) {
39
+ let previous_index = select(i - 1u, p.count - 1u, i == 0u);
40
+ out.boundaries[out.count] = (p.boundaries[previous_index] & p.boundaries[i]) | boundary;
41
+ out.points[out.count] = mix(previous, current, d_previous / (d_previous - d)); out.count++;
42
+ }
43
+ if (d >= 0.0) { out.boundaries[out.count] = p.boundaries[i]; out.points[out.count] = current; out.count++; }
44
+ previous = current; d_previous = d;
45
+ }
46
+ return out;
47
+ }
48
+ fn water_plane_distances(a: vec4f, b: vec4f, c: vec4f, plane: vec4f) -> vec3f {
49
+ return vec3f(dot(a, plane), dot(b, plane), dot(c, plane));
50
+ }
51
+ fn water_point_weights(a: vec4f, b: vec4f, c: vec4f, point: vec2f) -> vec3f {
52
+ let w = vec3f(a.w,b.w,c.w);
53
+ return barycentric_solve(vec3f(a.x,b.x,c.x) - point.x * w, vec3f(a.y,b.y,c.y) - point.y * w);
54
+ }
55
+ fn water_authored_edges(weights: vec3f) -> u32 {
56
+ return select(0u,1u,weights.x == 0.0) | select(0u,2u,weights.y == 0.0) | select(0u,4u,weights.z == 0.0);
57
+ }
58
+ fn water_boundary_plane(boundary: u32, lo: vec2f, hi: vec2f) -> vec4f {
59
+ if ((boundary & 8u) != 0u) { return vec4f(0,0,-1,1); }
60
+ if ((boundary & 16u) != 0u) { return vec4f(1,0,0,-lo.x); }
61
+ if ((boundary & 32u) != 0u) { return vec4f(-1,0,0,hi.x); }
62
+ if ((boundary & 64u) != 0u) { return vec4f(0,1,0,-lo.y); }
63
+ return vec4f(0,-1,0,hi.y);
64
+ }
65
+ fn water_corner_weights(a: vec4f, b: vec4f, c: vec4f, boundaries: u32, lo: vec2f, hi: vec2f) -> vec3f {
66
+ if ((boundaries & 15u) == 0u) {
67
+ return water_point_weights(a,b,c,vec2f(select(lo.x,hi.x,(boundaries & 32u) != 0u),
68
+ select(lo.y,hi.y,(boundaries & 128u) != 0u)));
69
+ }
70
+ var distances: array<vec3f, 2>;
71
+ var count = 0u;
72
+ for (var bit = 0u; bit < 8u; bit++) {
73
+ if ((boundaries & (1u << bit)) == 0u) { continue; }
74
+ if (bit < 3u) { distances[count][bit] = 1.0; }
75
+ else { distances[count] = water_plane_distances(a,b,c,water_boundary_plane(1u << bit,lo,hi)); }
76
+ count++;
77
+ if (count == 2u) { break; }
78
+ }
79
+ return barycentric_solve(distances[0], distances[1]);
80
+ }
81
+ fn water_corner_position(a: vec3f, b: vec3f, c: vec3f, ca: vec4f, cb: vec4f, cc: vec4f,
82
+ weights: vec3f, boundaries: u32, lo: vec2f, hi: vec2f) -> vec3f {
83
+ let edges = boundaries & 7u;
84
+ if (edges == 6u) { return a; }
85
+ if (edges == 5u) { return b; }
86
+ if (edges == 3u) { return c; }
87
+ if (edges != 0u) {
88
+ var p = a; var q = b; var cp = ca; var cq = cb;
89
+ if (edges == 1u) { p = b; q = c; cp = cb; cq = cc; }
90
+ if (edges == 2u) { q = c; cq = cc; }
91
+ // Adjacent authored triangles traverse their common edge in opposite orders.
92
+ // Canonical endpoints and the original clipping plane give identical f32 positions.
93
+ if (p.x > q.x || (p.x == q.x && (p.y > q.y || (p.y == q.y && p.z > q.z)))) {
94
+ let tmp = p; p = q; q = tmp; let tc = cp; cp = cq; cq = tc;
95
+ }
96
+ // A cell corner may also lie on an authored edge coincident with a cell plane.
97
+ // Use the intersecting plane, rather than dividing by that coincident plane's zero span.
98
+ var dp = 0.0; var dq = 0.0;
99
+ for (var bit = 3u; bit < 8u; bit++) {
100
+ if ((boundaries & (1u << bit)) == 0u) { continue; }
101
+ let plane = water_boundary_plane(1u << bit,lo,hi);
102
+ let p_distance = dot(cp,plane); let q_distance = dot(cq,plane);
103
+ if (abs(p_distance - q_distance) > abs(dp - dq)) { dp = p_distance; dq = q_distance; }
104
+ }
105
+ return mix(p,q,dp / (dp - dq));
106
+ }
107
+ return a * weights.x + b * weights.y + c * weights.z;
108
+ }
109
+ fn water_cell_polygon(a: vec4f, b: vec4f, c: vec4f, lo: vec2f, hi: vec2f) -> WaterPolygon {
110
+ // Interior cells are ordinary quads. Reuse the rasterizer's homogeneous barycentric solve
111
+ // and reserve polygon clipping for the authored boundary and near-plane intersections.
112
+ if (a.w > 0.0 && b.w > 0.0 && c.w > 0.0 && a.w >= a.z && b.w >= b.z && c.w >= c.z) {
113
+ let p0 = water_point_weights(a,b,c,lo);
114
+ let p1 = water_point_weights(a,b,c,vec2f(hi.x,lo.y));
115
+ let p2 = water_point_weights(a,b,c,hi);
116
+ let p3 = water_point_weights(a,b,c,vec2f(lo.x,hi.y));
117
+ let minimum = min(min(p0,p1),min(p2,p3));
118
+ if (all(minimum >= vec3f(0))) {
119
+ var quad: WaterPolygon;
120
+ quad.points[0] = p0; quad.points[1] = p1; quad.points[2] = p2; quad.points[3] = p3;
121
+ quad.boundaries[0] = 80u | water_authored_edges(p0); quad.boundaries[1] = 96u | water_authored_edges(p1);
122
+ quad.boundaries[2] = 160u | water_authored_edges(p2); quad.boundaries[3] = 144u | water_authored_edges(p3);
123
+ // Preserve the source triangle's winding, just as the clipped path does.
124
+ // The rasterizer must identify the same side on interior and boundary cells.
125
+ if (dot(cross(a.xyw,b.xyw),c.xyw) < 0.0) {
126
+ quad.points[1] = p3; quad.points[3] = p1;
127
+ let boundary = quad.boundaries[1]; quad.boundaries[1] = quad.boundaries[3]; quad.boundaries[3] = boundary;
128
+ }
129
+ quad.count = 4u; return quad;
130
+ }
131
+ }
132
+ var p = water_triangle_polygon();
133
+ p = water_clip_polygon(p, water_plane_distances(a,b,c,vec4f(0,0,-1,1)), 8u);
134
+ p = water_clip_polygon(p, water_plane_distances(a,b,c,vec4f(1,0,0,-lo.x)), 16u);
135
+ p = water_clip_polygon(p, water_plane_distances(a,b,c,vec4f(-1,0,0,hi.x)), 32u);
136
+ p = water_clip_polygon(p, water_plane_distances(a,b,c,vec4f(0,1,0,-lo.y)), 64u);
137
+ p = water_clip_polygon(p, water_plane_distances(a,b,c,vec4f(0,-1,0,hi.y)), 128u);
138
+ for (var i = 0u; i < p.count; i++) {
139
+ p.points[i] = water_corner_weights(a,b,c,p.boundaries[i],lo,hi);
140
+ p.boundaries[i] |= water_authored_edges(p.points[i]);
141
+ }
142
+ return p;
143
+ }
144
+ `, [chunk_barycentric_solve]);
@@ -2,11 +2,9 @@
2
2
  * The primitive surface producer's physics, as pure functions so each is testable alone.
3
3
  *
4
4
  * A damped linear wave equation on a height field, `h_tt = c² ∇²h − γ h_t + f`, stepped by
5
- * leapfrog. The celerity is the shallow-water one, `c = √(g·d)`, so waves slow down and turn in
6
- * shallows and reflect from the shore. That is right for long waves and wrong for deep-water wind
7
- * waves, whose speed depends on their wavelength rather than on depth: a stated limit of a
8
- * primitive simulation, which the production simulation replaces behind the surface interface
9
- * (WATER_OPTICS_PLAN_2026_10_02.md §7.2).
5
+ * leapfrog. The celerity is the shallow-water one, `c = √(g·d)`. The batched producer uses a
6
+ * one-metre reference depth because an authored surface supplies no bathymetry. This primitive
7
+ * model describes long waves; deep-water wind waves have wavelength-dependent speed.
10
8
  *
11
9
  * @type {CodeChunk}
12
10
  */
@@ -1 +1 @@
1
- {"version":3,"file":"chunk_water_wave.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/water/surface/chunk_water_wave.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;GAWG;AACH,+BAFU,SAAS,CAmChB;0BA/CuB,oCAAoC"}
1
+ {"version":3,"file":"chunk_water_wave.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/water/surface/chunk_water_wave.js"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AACH,+BAFU,SAAS,CA6BhB;0BAvCuB,oCAAoC"}
@@ -1,48 +1,40 @@
1
- import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
2
-
3
- /**
4
- * The primitive surface producer's physics, as pure functions so each is testable alone.
5
- *
6
- * A damped linear wave equation on a height field, `h_tt = c² ∇²h − γ h_t + f`, stepped by
7
- * leapfrog. The celerity is the shallow-water one, `c = √(g·d)`, so waves slow down and turn in
8
- * shallows and reflect from the shore. That is right for long waves and wrong for deep-water wind
9
- * waves, whose speed depends on their wavelength rather than on depth: a stated limit of a
10
- * primitive simulation, which the production simulation replaces behind the surface interface
11
- * (WATER_OPTICS_PLAN_2026_10_02.md §7.2).
12
- *
13
- * @type {CodeChunk}
14
- */
15
- export const chunk_water_wave = CodeChunk.from(/* language=WGSL */ `
16
- const WATER_WAVE_GRAVITY: f32 = 9.81;
17
-
18
- // Squared celerity of a long wave over water depth metres deep, capped so an explicit step of the
19
- // size the producer takes stays stable (2-D CFL: c·dt/dx ≤ 1/√2).
20
- fn water_wave_celerity2(depth: f32, celerity_limit: f32) -> f32 {
21
- return min(WATER_WAVE_GRAVITY * max(depth, 0.0), celerity_limit * celerity_limit);
22
- }
23
-
24
- // One leapfrog step of h_tt = c² ∇²h − γ h_t + f: the next height from the current one, the
25
- // previous one, the current height's Laplacian, c², the damping rate γ (1/s), the forcing f (m/s²)
26
- // and the step dt (s).
27
- fn water_wave_step(h: f32, h_previous: f32, laplacian: f32, celerity2: f32, damping: f32,
28
- force: f32, dt: f32) -> f32 {
29
- return h + (h - h_previous) * max(1.0 - damping * dt, 0.0) + dt * dt * (celerity2 * laplacian + force);
30
- }
31
-
32
- // Extra damping in a band along the grid's border, rising quadratically to strength at the edge,
33
- // so waves leave the domain instead of reflecting off the end of the grid.
34
- fn water_wave_sponge(cell: vec2<u32>, resolution: u32, width: f32, strength: f32) -> f32 {
35
- let last = f32(resolution - 1u);
36
- let p = vec2<f32>(cell);
37
- let edge = min(min(p.x, p.y), min(last - p.x, last - p.y));
38
- let s = clamp(1.0 - edge / max(width, 1.0), 0.0, 1.0);
39
- return strength * s * s;
40
- }
41
-
42
- // Unit normal of a height field from central differences of its heights at the four neighbours,
43
- // spacing metres apart.
44
- fn water_wave_normal(left: f32, right: f32, down: f32, up: f32, spacing: f32) -> vec3<f32> {
45
- let slope = vec2<f32>(right - left, up - down) / (2.0 * spacing);
46
- return normalize(vec3<f32>(-slope.x, 1.0, -slope.y));
47
- }
48
- `);
1
+ import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
2
+
3
+ /**
4
+ * The primitive surface producer's physics, as pure functions so each is testable alone.
5
+ *
6
+ * A damped linear wave equation on a height field, `h_tt = c² ∇²h − γ h_t + f`, stepped by
7
+ * leapfrog. The celerity is the shallow-water one, `c = √(g·d)`. The batched producer uses a
8
+ * one-metre reference depth because an authored surface supplies no bathymetry. This primitive
9
+ * model describes long waves; deep-water wind waves have wavelength-dependent speed.
10
+ *
11
+ * @type {CodeChunk}
12
+ */
13
+ export const chunk_water_wave = CodeChunk.from(/* language=WGSL */ `
14
+ const WATER_WAVE_GRAVITY: f32 = 9.81;
15
+
16
+ // Squared celerity of a long wave over water depth metres deep, capped so an explicit step of the
17
+ // size the producer takes stays stable (2-D CFL: c·dt/dx ≤ 1/√2).
18
+ fn water_wave_celerity2(depth: f32, celerity_limit: f32) -> f32 {
19
+ return min(WATER_WAVE_GRAVITY * max(depth, 0.0), celerity_limit * celerity_limit);
20
+ }
21
+
22
+ // One leapfrog step of h_tt = c² ∇²h − γ h_t + f: the next height from the current one, the
23
+ // previous one, the current height's Laplacian, c², the damping rate γ (1/s), the forcing f (m/s²)
24
+ // and the step dt (s).
25
+ fn water_wave_step(h: f32, h_previous: f32, laplacian: f32, celerity2: f32, damping: f32,
26
+ force: f32, dt: f32) -> f32 {
27
+ return h + (h - h_previous) * max(1.0 - damping * dt, 0.0) + dt * dt * (celerity2 * laplacian + force);
28
+ }
29
+
30
+ // Extra damping in a band along the grid's border, rising quadratically to strength at the edge,
31
+ // so waves leave the domain instead of reflecting off the end of the grid.
32
+ fn water_wave_sponge(cell: vec2<u32>, resolution: u32, width: f32, strength: f32) -> f32 {
33
+ let last = f32(resolution - 1u);
34
+ let p = vec2<f32>(cell);
35
+ let edge = min(min(p.x, p.y), min(last - p.x, last - p.y));
36
+ let s = clamp(1.0 - edge / max(width, 1.0), 0.0, 1.0);
37
+ return strength * s * s;
38
+ }
39
+
40
+ `);
@@ -0,0 +1,14 @@
1
+ /** Storage grows with source primitives; patch instances are expanded by the vertex shader. */
2
+ export function graph_water_tessellation({ graph, scene, camera, meshlets, meshlet_capacity, tessellation }: {
3
+ graph: any;
4
+ scene: any;
5
+ camera: any;
6
+ meshlets: any;
7
+ meshlet_capacity: any;
8
+ tessellation: any;
9
+ }): {
10
+ tiles: any;
11
+ sums: number;
12
+ count: any;
13
+ };
14
+ //# sourceMappingURL=graph_water_tessellation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph_water_tessellation.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/water/surface/graph_water_tessellation.js"],"names":[],"mappings":"AAQA,+FAA+F;AAC/F;;;;;;;;;;;EAwBC"}
@@ -0,0 +1,34 @@
1
+ import { BufferResourceDescriptor } from "../../../device/graph/BufferResourceDescriptor.js";
2
+ import { GEOMETRY_MESHLET_TRIANGLE_LIMIT } from "../../geometry/meshlet/GEOMETRY_MESHLET_TRIANGLE_LIMIT.js";
3
+ 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";
8
+
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) });
23
+ });
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 };
34
+ }
@@ -0,0 +1,4 @@
1
+ /** Keep triangle identity, including hidden bodies. Only displaced raster depth selects ownership. */
2
+ export const shader_water_tiles: ComputeShader;
3
+ import { ComputeShader } from "../../shader/ComputeShader.js";
4
+ //# sourceMappingURL=shader_water_tiles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shader_water_tiles.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/water/surface/shader_water_tiles.js"],"names":[],"mappings":"AA4BA,sGAAsG;AACtG,+CA6FmG;8BApHrE,+BAA+B"}
@@ -0,0 +1,123 @@
1
+ import { CAMERA_UNIFORM_STRUCT } from "../../camera/CAMERA_UNIFORM_STRUCT.js";
2
+ import { GEOMETRY_METADATA_STRUCT } from "../../geometry/GEOMETRY_METADATA_STRUCT.js";
3
+ import { MESHLET_METADATA_STRUCT } from "../../geometry/meshlet/encoding/MESHLET_METADATA_STRUCT.js";
4
+ import { GEOMETRY_MESHLET_TRIANGLE_LIMIT } from "../../geometry/meshlet/GEOMETRY_MESHLET_TRIANGLE_LIMIT.js";
5
+ import { MESHLET_COLLECTION_STRUCT } from "../../rasterize/MESHLET_COLLECTION_STRUCT.js";
6
+ import { COLLECTION_U32_STRUCT_READ } from "../../gpu_primitive/COLLECTION_U32_STRUCT_READ.js";
7
+ import { ComputeShader } from "../../shader/ComputeShader.js";
8
+ import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
9
+ import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
10
+ import { WebGPUArray } from "../../shader/type/WebGPUArray.js";
11
+ import { f32, u32 } from "../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
12
+ import { chunk_scene_database_access } from "../../scene/chunk_scene_database_access.js";
13
+ import { chunk_folded_workgroup_index } from "../../shader/chunk/grid/chunk_folded_workgroup_index.js";
14
+ import { chunk_read_meshlet_vertex_by_draw_index } from "../../shader/chunk/geometry/meshlet/chunk_read_meshlet_vertex_by_draw_index.js";
15
+ import { WATER_BODIES_TABLE, WATER_WAVES_TABLE } from "../medium/chunk_water_bodies.js";
16
+ import { chunk_water_tessellation, WATER_TILE_CELLS, WATER_TILE_STRUCT, WATER_TESSELLATION_STRUCT } from "./chunk_water_tessellation.js";
17
+
18
+ const resources = new ShaderResourceSetDescriptor();
19
+ resources.setImmediate('capacity', u32);
20
+ resources.createGroup().addUniform('camera', CAMERA_UNIFORM_STRUCT).addUniform('tessellation', WATER_TESSELLATION_STRUCT)
21
+ .addStorageBuffer('scene_database', WebGPUArray.u32)
22
+ .addStorageBuffer('geometries', WebGPUArray.from(GEOMETRY_METADATA_STRUCT))
23
+ .addStorageBuffer('water_meshlets', MESHLET_COLLECTION_STRUCT)
24
+ .addStorageBuffer('meshlet_metadata', WebGPUArray.from(MESHLET_METADATA_STRUCT))
25
+ .addStorageBuffer('meshlet_data', WebGPUArray.from(f32))
26
+ .addStorageBuffer('tiles', WebGPUArray.from(WATER_TILE_STRUCT), true)
27
+ .addStorageBuffer('counts', COLLECTION_U32_STRUCT_READ, true);
28
+
29
+ /** Keep triangle identity, including hidden bodies. Only displaced raster depth selects ownership. */
30
+ export const shader_water_tiles = ComputeShader.from({ label: 'Water / classify view tiles', resources,
31
+ body: CodeChunk.from(/* language=WGSL */ `
32
+ @compute @workgroup_size(128)
33
+ fn main(@builtin(workgroup_id) group: vec3u, @builtin(local_invocation_index) lane: u32) {
34
+ let i = folded_workgroup_index(group) * 128u + lane;
35
+ if (i == 0u) { counts.count = capacity; }
36
+ if (i >= capacity) { return; }
37
+ counts.elements[i] = 0u;
38
+ let meshlet_slot = i / ${GEOMETRY_MESHLET_TRIANGLE_LIMIT}u;
39
+ if (meshlet_slot >= water_meshlets.count) { return; }
40
+ let definition = water_meshlets.elements[meshlet_slot];
41
+ let triangle = i % ${GEOMETRY_MESHLET_TRIANGLE_LIMIT}u;
42
+ let header = meshlet_metadata[definition.index];
43
+ if (triangle >= header.primitive_count) { return; }
44
+ let body = ${WATER_BODIES_TABLE.marshalling_method_read}(&scene_database, definition.mesh);
45
+ let node = scene_read_node(&scene_database, body.node);
46
+ let simulated = body.wave != ~0u;
47
+ var bounds = vec2f(0);
48
+ if (simulated) { bounds = ${WATER_WAVES_TABLE.marshalling_method_read}(&scene_database, body.wave).displacement_bounds; }
49
+ // Increasing near-plane distance is farther from the camera. Use the far endpoint;
50
+ // clipping it at the near plane cannot discard a point displaced into the visible frustum.
51
+ let direction = tessellation.view_projection_matrix * node.global[1];
52
+ let farther = direction.w - direction.z >= 0.0;
53
+ var anchor = 0.0;
54
+ var pixels = tessellation.pixels;
55
+ if (simulated) {
56
+ let box = geometries[body.geometry].bounding_box;
57
+ // A shared local-xz reference keeps adjacent triangles' generated edge vertices
58
+ // identical, including sloped rest geometry. Only reconstruction flattens height;
59
+ // rendered vertices still interpolate all three authored position coordinates.
60
+ anchor = select(box[1] + bounds.x, box[4] + bounds.y, farther);
61
+ let x = tessellation.view_projection_matrix * node.global[0];
62
+ let z = tessellation.view_projection_matrix * node.global[2];
63
+ let origin = tessellation.view_projection_matrix * node.global[3];
64
+ let plane = cross(x.xyw, z.xyw);
65
+ let reference = origin + direction * anchor;
66
+ let span = box[4] - box[1] + bounds.y - bounds.x;
67
+ if (span > 0.0 && abs(dot(plane, reference.xyw)) <= 1e-5 * length(plane) * max(length(reference.xyw), 1.0)
68
+ && abs(dot(plane, direction.xyw)) > 1e-20) {
69
+ anchor += select(-span, span, farther);
70
+ }
71
+ var minimum_w = 1e30;
72
+ for (var corner = 0u; corner < 4u; corner++) {
73
+ let p = vec3f(select(box[0], box[3], (corner & 1u) != 0u), anchor, select(box[2], box[5], (corner & 2u) != 0u));
74
+ minimum_w = min(minimum_w, (tessellation.view_projection_matrix * (node.global * vec4f(p, 1))).w);
75
+ }
76
+ let low = box[1] + bounds.x - anchor;
77
+ let high = box[4] + bounds.y - anchor;
78
+ let slopes = vec4f(direction.w + direction.x, direction.w - direction.x, direction.w + direction.y, direction.w - direction.y);
79
+ let allowance = max(vec4f(0), max(slopes * low, slopes * high));
80
+ // After swept side-plane clipping, the reference's NDC span is at most
81
+ // 2 + (left + right allowance)/minimum_w. Use this body-wide bound so a
82
+ // near-plane envelope cannot amplify patches or split shared edge grids.
83
+ let amplification = 1.0 + max(allowance.x + allowance.y, allowance.z + allowance.w)
84
+ / (2.0 * max(camera.clip_near_far.x, minimum_w));
85
+ pixels *= amplification;
86
+ }
87
+ let pa = read_meshlet_vertex_by_draw_index(header, triangle * 3u).position;
88
+ let pb = read_meshlet_vertex_by_draw_index(header, triangle * 3u + 1u).position;
89
+ let pc = read_meshlet_vertex_by_draw_index(header, triangle * 3u + 2u).position;
90
+ let a = tessellation.view_projection_matrix * (node.global * vec4f(water_reference_position(pa, anchor, simulated), 1));
91
+ let b = tessellation.view_projection_matrix * (node.global * vec4f(water_reference_position(pb, anchor, simulated), 1));
92
+ let c = tessellation.view_projection_matrix * (node.global * vec4f(water_reference_position(pc, anchor, simulated), 1));
93
+ let heights = select(vec3f(0), vec3f(pa.y, pb.y, pc.y) - vec3f(anchor), simulated);
94
+ var p = water_clip_polygon(water_triangle_polygon(), water_plane_distances(a,b,c,vec4f(0,0,-1,1)), 0u);
95
+ // The reference is unjittered, but raster samples may move into the viewport by
96
+ // a pixel. Retain that fixed border without letting jitter change the tile grid.
97
+ let border = vec2f(1.0) + vec2f(2.0) / tessellation.resolution;
98
+ let planes = array<vec4f,4>(vec4f(1,0,0,border.x),vec4f(-1,0,0,border.x),vec4f(0,1,0,border.y),vec4f(0,-1,0,border.y));
99
+ for (var plane = 0u; plane < 4u; plane++) {
100
+ let sweep = dot(direction, planes[plane]);
101
+ let allowance = max((heights + vec3f(bounds.x)) * sweep, (heights + vec3f(bounds.y)) * sweep);
102
+ p = water_clip_polygon(p, water_plane_distances(a,b,c,planes[plane]) + allowance, 0u);
103
+ }
104
+ if (p.count < 3u) { return; }
105
+ var lo = vec2f(1e30); var hi = vec2f(-1e30);
106
+ for (var corner = 0u; corner < p.count; corner++) {
107
+ let q = a * p.points[corner].x + b * p.points[corner].y + c * p.points[corner].z;
108
+ let pixel = (q.xy / q.w * vec2f(0.5,-0.5) + vec2f(0.5)) * tessellation.resolution;
109
+ lo = min(lo, pixel); hi = max(hi, pixel);
110
+ }
111
+ let tile_pixels = pixels * ${WATER_TILE_CELLS}.0;
112
+ let origin = vec2i(floor(lo / tile_pixels));
113
+ let end = vec2i(ceil(hi / tile_pixels));
114
+ let size = vec2u(max(end - origin, vec2i(0)));
115
+ if (any(size == vec2u(0))) { return; }
116
+ var tile: WaterTile;
117
+ tile.meshlet = definition.index; tile.triangle = triangle; tile.body = definition.mesh;
118
+ tile.anchor = anchor; tile.origin = origin; tile.size = size; tile.pixels = pixels;
119
+ tiles[i] = tile;
120
+ counts.elements[i] = size.x * size.y;
121
+ }
122
+ `, [chunk_water_tessellation, chunk_read_meshlet_vertex_by_draw_index, chunk_scene_database_access,
123
+ WATER_BODIES_TABLE.chunk_read, WATER_WAVES_TABLE.chunk_read, chunk_folded_workgroup_index]) });
@@ -0,0 +1,6 @@
1
+ export const WATER_WAVE_BATCH_STRUCT: WebGPUStruct;
2
+ export const shader_water_wave_batch: ComputeShader;
3
+ export const shader_water_wave_batch_finish: ComputeShader;
4
+ import { WebGPUStruct } from "../../shader/type/WebGPUStruct.js";
5
+ import { ComputeShader } from "../../shader/ComputeShader.js";
6
+ //# sourceMappingURL=shader_water_wave_batch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shader_water_wave_batch.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/water/surface/shader_water_wave_batch.js"],"names":[],"mappings":"AAYA,mDAC+E;AAO/E,oDA8CwH;AAMxH,2DAY4F;6BA/E/D,mCAAmC;8BALlC,+BAA+B"}
@@ -0,0 +1,85 @@
1
+ import { ComputeShader } from "../../shader/ComputeShader.js";
2
+ import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
3
+ import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
4
+ import { f32, u32 } from "../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
5
+ import { WebGPUArray } from "../../shader/type/WebGPUArray.js";
6
+ import { WebGPUStruct } from "../../shader/type/WebGPUStruct.js";
7
+ import { WATER_WAVES_TABLE as table } from "../medium/chunk_water_bodies.js";
8
+ import { chunk_folded_workgroup_index } from "../../shader/chunk/grid/chunk_folded_workgroup_index.js";
9
+ import { chunk_srdnoise2 } from "../../shader/chunk/noise/psrdnoise/chunk_srdnoise2.js";
10
+ import { chunk_water_wave } from "./chunk_water_wave.js";
11
+ import { chunk_scene_database_access } from "../../scene/chunk_scene_database_access.js";
12
+
13
+ export const WATER_WAVE_BATCH_STRUCT = WebGPUStruct.from({ resolution: u32, capacity: u32,
14
+ dt: f32, time: f32, damping: f32, apply_impulses: u32 }, 'WaterWaveBatch');
15
+ const resources = new ShaderResourceSetDescriptor();
16
+ resources.createGroup().addUniform('batch', WATER_WAVE_BATCH_STRUCT)
17
+ .addStorageBuffer('scene_database', WebGPUArray.u32)
18
+ .addStorageBuffer('domain', WebGPUArray.u32)
19
+ .addStorageBuffer('state_current', WebGPUArray.from(f32))
20
+ .addStorageBuffer('state_previous', WebGPUArray.from(f32), true);
21
+ export const shader_water_wave_batch = ComputeShader.from({ label: 'Water / batched wave step', resources,
22
+ body: CodeChunk.from(/* language=WGSL */ `
23
+ @compute @workgroup_size(128)
24
+ fn main(@builtin(workgroup_id) group: vec3u, @builtin(local_invocation_index) lane: u32) {
25
+ let i = folded_workgroup_index(group) * 128u + lane;
26
+ let n = batch.resolution;
27
+ let row = i / (n * n);
28
+ if (row >= batch.capacity) { return; }
29
+ let params = ${table.marshalling_method_read}(&scene_database, row);
30
+ if (params.first_write != 0u || params.node == 0u || params.node == ~0u || domain[i] == 0u) { state_previous[i] = 0.0; return; }
31
+ if (batch.dt == 0.0) { return; }
32
+ let cell = vec2u(i % n, (i / n) % n);
33
+ let start = row * n * n;
34
+ let spacing = max((params.extent.zw - params.extent.xy) / f32(n - 1u), vec2f(1e-20));
35
+ let world = scene_read_node(&scene_database, params.node).global;
36
+ let scale = vec3f(length(world[0].xyz), length(world[1].xyz), length(world[2].xyz));
37
+ // A temporarily collapsed transform must not poison persistent histories with NaNs.
38
+ if (any(scale <= vec3f(1e-10))) { state_previous[i] = state_current[i]; return; }
39
+ let world_spacing = max(spacing * scale.xz, vec2f(1e-10));
40
+ let h = state_current[i];
41
+ let left = start + cell.y * n + select(cell.x - 1u, 0u, cell.x == 0u);
42
+ let right = start + cell.y * n + min(cell.x + 1u, n - 1u);
43
+ let down = start + select(cell.y - 1u, 0u, cell.y == 0u) * n + cell.x;
44
+ let up = start + min(cell.y + 1u, n - 1u) * n + cell.x;
45
+ let laplacian = (state_current[left] + state_current[right] - 2.0 * h) / (world_spacing.x * world_spacing.x)
46
+ + (state_current[down] + state_current[up] - 2.0 * h) / (world_spacing.y * world_spacing.y);
47
+ let position = mix(params.extent.xy, params.extent.zw, vec2f(cell) / f32(n - 1u));
48
+ let wind = params.forcing.xy * scale.xz;
49
+ let wind_direction = wind / max(length(wind), 1e-20);
50
+ let drift = wind_direction * params.forcing.w * batch.time;
51
+ var force = params.forcing.z / scale.y * srdnoise2((position * scale.xz - drift) / 6.0, 0.0).x;
52
+ if (batch.apply_impulses != 0u) {
53
+ for (var j = 0u; j < params.impulse_count; j++) {
54
+ let impulse = params.impulses[j];
55
+ let d = position - impulse.xy;
56
+ let world_delta = (world * vec4f(d.x, 0.0, d.y, 0.0)).xyz;
57
+ force += impulse.w / (batch.dt * scale.y) * exp(-dot(world_delta, world_delta) / max(impulse.z * impulse.z, 1e-6));
58
+ }
59
+ }
60
+ let damping = batch.damping + water_wave_sponge(cell, n, max(4.0, f32(n) * 0.04), 4.0);
61
+ // The authored surface has no bathymetry. The primitive producer uses a one-metre reference
62
+ // depth; the CFL cap follows both axes of its local grid. It does not define the mesh outline.
63
+ let celerity = 0.6 * min(world_spacing.x, world_spacing.y) / batch.dt;
64
+ state_previous[i] = water_wave_step(h, state_previous[i], laplacian,
65
+ water_wave_celerity2(1.0, celerity), damping, force, batch.dt);
66
+ }
67
+ `, [table.chunk_read, chunk_folded_workgroup_index, chunk_srdnoise2, chunk_water_wave, chunk_scene_database_access]) });
68
+
69
+ const finish_resources = new ShaderResourceSetDescriptor();
70
+ finish_resources.createGroup().addUniform('batch', WATER_WAVE_BATCH_STRUCT)
71
+ .addStorageBuffer('scene_database', WebGPUArray.u32, true);
72
+ const pg = table.page_iterator_symbol_prefix(64, true);
73
+ export const shader_water_wave_batch_finish = ComputeShader.from({ label: 'Water / consume wave inputs', resources: finish_resources,
74
+ body: CodeChunk.from(/* language=WGSL */ `
75
+ @compute @workgroup_size(64)
76
+ fn main(@builtin(workgroup_id) group: vec3u, @builtin(local_invocation_index) lane: u32) {
77
+ if (!${pg}_setup(&scene_database, folded_workgroup_index(group), lane)) { return; }
78
+ let slot = ${pg}_slot_in_page(lane);
79
+ if (slot >= ${pg}_ELEMENTS_PER_PAGE || !${pg}_is_occupied(slot)) { return; }
80
+ let row = ${pg}_slot_to_index(slot);
81
+ ${table.marshalling_method_write_field('first_write')}(&scene_database, row, 0u);
82
+ if (batch.apply_impulses != 0u) { ${table.marshalling_method_write_field('impulse_count')}(&scene_database, row, 0u); }
83
+ }
84
+ `, [table.chunk_iterate(64, true), table.wgsl_gen_write_field_code('first_write'),
85
+ table.wgsl_gen_write_field_code('impulse_count'), chunk_folded_workgroup_index]) });
@@ -0,0 +1,6 @@
1
+ /** Bake the authored footprint once per new wave row, using the existing geometry BLAS. */
2
+ export const shader_water_wave_domain: ComputeShader;
3
+ /** Bilinear reconstruction cannot leave the extrema of its samples. Include the rest surface. */
4
+ export const shader_water_wave_bounds: ComputeShader;
5
+ import { ComputeShader } from "../../shader/ComputeShader.js";
6
+ //# sourceMappingURL=shader_water_wave_domain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shader_water_wave_domain.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/water/surface/shader_water_wave_domain.js"],"names":[],"mappings":"AAwBA,2FAA2F;AAC3F,qDAqBsF;AAOtF,iGAAiG;AACjG,qDA4BmH;8BAlFrF,+BAA+B"}