@woosh/meep-engine 3.56.0 → 3.57.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 (625) hide show
  1. package/build/bundle-worker-terrain.js +1 -1
  2. package/package.json +1 -1
  3. package/src/DUPLICATION_REVIEW_2026_10_24.md +1072 -0
  4. package/src/core/binary/BitSet.js +1 -1
  5. package/src/core/binary/FLOAT16_MAX.d.ts +2 -0
  6. package/src/core/binary/FLOAT16_MAX.d.ts.map +1 -0
  7. package/src/core/binary/FLOAT16_MAX.js +1 -0
  8. package/src/core/binary/base58/base58_encode.js +2 -2
  9. package/src/core/binary/type/TypeBuilder.js +1 -1
  10. package/src/core/bvh2/bvh3/BVH.js +1 -1
  11. package/src/core/bvh2/bvh3/ebvh_optimize_treelet.d.ts.map +1 -1
  12. package/src/core/bvh2/bvh3/ebvh_optimize_treelet.js +7 -3
  13. package/src/core/bvh2/bvh3/ebvh_update_hierarchy_bounds.d.ts.map +1 -1
  14. package/src/core/bvh2/bvh3/ebvh_update_hierarchy_bounds.js +5 -1
  15. package/src/core/bvh2/bvh3/query/compute_tight_near_far_clipping_planes.d.ts.map +1 -1
  16. package/src/core/bvh2/bvh3/query/compute_tight_near_far_clipping_planes.js +195 -246
  17. package/src/core/collection/CuckooFilter.js +1 -1
  18. package/src/core/collection/array/isArrayEqual.d.ts.map +1 -1
  19. package/src/core/collection/array/isArrayEqual.js +33 -58
  20. package/src/core/collection/array/typed/array_buffer_hash.d.ts.map +1 -1
  21. package/src/core/collection/array/typed/array_buffer_hash.js +41 -39
  22. package/src/core/collection/array/typed/float32_array_hash.js +38 -38
  23. package/src/core/collection/array/typed/uint16_array_hash.d.ts +2 -1
  24. package/src/core/collection/array/typed/uint16_array_hash.d.ts.map +1 -1
  25. package/src/core/collection/array/typed/uint16_array_hash.js +30 -29
  26. package/src/core/collection/array/typed/uint32_array_hash.d.ts +2 -1
  27. package/src/core/collection/array/typed/uint32_array_hash.d.ts.map +1 -1
  28. package/src/core/collection/array/typed/uint32_array_hash.js +21 -20
  29. package/src/core/collection/array/typed/uint8_array_hash.d.ts +2 -1
  30. package/src/core/collection/array/typed/uint8_array_hash.d.ts.map +1 -1
  31. package/src/core/collection/array/typed/uint8_array_hash.js +37 -36
  32. package/src/core/collection/array/typed/uint_array_for_count.js +2 -2
  33. package/src/core/collection/list/List.d.ts.map +1 -1
  34. package/src/core/collection/list/List.js +3 -19
  35. package/src/core/collection/table/RowFirstTable.d.ts.map +1 -1
  36. package/src/core/collection/table/RowFirstTable.js +4 -28
  37. package/src/core/debug/matchers/DescribeAs.d.ts.map +1 -1
  38. package/src/core/debug/matchers/DescribeAs.js +62 -64
  39. package/src/core/function/FunctionCompiler.js +4 -4
  40. package/src/core/function/objectsEqual.d.ts.map +1 -1
  41. package/src/core/function/objectsEqual.js +3 -2
  42. package/src/core/geom/2d/bvh/BVH2D.d.ts.map +1 -1
  43. package/src/core/geom/2d/bvh/BVH2D.js +4 -3
  44. package/src/core/geom/2d/convex-hull/convex_hull_fixed_count_2d_relaxation.d.ts +5 -2
  45. package/src/core/geom/2d/convex-hull/convex_hull_fixed_count_2d_relaxation.d.ts.map +1 -1
  46. package/src/core/geom/2d/convex-hull/convex_hull_fixed_count_2d_relaxation.js +49 -11
  47. package/src/core/geom/2d/hash-grid/shg_query_elements_circle.d.ts.map +1 -1
  48. package/src/core/geom/2d/hash-grid/shg_query_elements_circle.js +122 -159
  49. package/src/core/geom/2d/hash-grid/shg_query_elements_line.d.ts.map +1 -1
  50. package/src/core/geom/2d/hash-grid/shg_query_elements_line.js +8 -5
  51. package/src/core/geom/2d/polygon/polygon2_rasterize_coverage.d.ts +18 -0
  52. package/src/core/geom/2d/polygon/polygon2_rasterize_coverage.d.ts.map +1 -0
  53. package/src/core/geom/2d/polygon/polygon2_rasterize_coverage.js +97 -0
  54. package/src/core/geom/2d/r-tree/StaticR2Tree.js +2 -2
  55. package/src/core/geom/2d/triangle/tri2_rasterize_coverage.d.ts +21 -0
  56. package/src/core/geom/2d/triangle/tri2_rasterize_coverage.d.ts.map +1 -0
  57. package/src/core/geom/2d/triangle/tri2_rasterize_coverage.js +54 -0
  58. package/src/core/geom/3d/aabb/aabb3_build_frustum.d.ts.map +1 -1
  59. package/src/core/geom/3d/aabb/aabb3_build_frustum.js +20 -53
  60. package/src/core/geom/3d/aabb/aabb3_score_boxes_SAH.d.ts +1 -1
  61. package/src/core/geom/3d/aabb/aabb3_score_boxes_SAH.d.ts.map +1 -1
  62. package/src/core/geom/3d/aabb/aabb3_score_boxes_SAH.js +11 -42
  63. package/src/core/geom/3d/atlas/pack/atlas_pack_charts.d.ts.map +1 -1
  64. package/src/core/geom/3d/atlas/pack/atlas_pack_charts.js +30 -32
  65. package/src/core/geom/3d/atlas/param/atlas_chart_parameterize_bff.d.ts.map +1 -1
  66. package/src/core/geom/3d/atlas/param/atlas_chart_parameterize_bff.js +1 -5
  67. package/src/core/geom/3d/atlas/param/atlas_chart_parameterize_lscm.d.ts.map +1 -1
  68. package/src/core/geom/3d/atlas/param/atlas_chart_parameterize_lscm.js +1 -15
  69. package/src/core/geom/3d/atlas/segment/atlas_merge_charts.d.ts.map +1 -1
  70. package/src/core/geom/3d/atlas/segment/atlas_merge_charts.js +105 -116
  71. package/src/core/geom/3d/line/line3_compute_segment_point_distance_sqr.d.ts.map +1 -1
  72. package/src/core/geom/3d/line/line3_compute_segment_point_distance_sqr.js +36 -54
  73. package/src/core/geom/3d/plane/plane3_compute_intersection_objects.d.ts +5 -10
  74. package/src/core/geom/3d/plane/plane3_compute_intersection_objects.d.ts.map +1 -1
  75. package/src/core/geom/3d/plane/plane3_compute_intersection_objects.js +20 -82
  76. package/src/core/geom/3d/plane/plane3_slerp.d.ts.map +1 -1
  77. package/src/core/geom/3d/plane/plane3_slerp.js +87 -102
  78. package/src/core/geom/3d/polygon/polygon3_compute_normal.d.ts +12 -0
  79. package/src/core/geom/3d/polygon/polygon3_compute_normal.d.ts.map +1 -1
  80. package/src/core/geom/3d/polygon/polygon3_compute_normal.js +107 -60
  81. package/src/core/geom/3d/ray/ray3_compute_closest_point.d.ts.map +1 -1
  82. package/src/core/geom/3d/ray/ray3_compute_closest_point.js +37 -43
  83. package/src/core/geom/3d/shape/ConvexHullShape3D.d.ts.map +1 -1
  84. package/src/core/geom/3d/shape/ConvexHullShape3D.js +5 -16
  85. package/src/core/geom/3d/shape/MeshShape3D.js +2 -56
  86. package/src/core/geom/3d/shape/TransformedShape3D.d.ts.map +1 -1
  87. package/src/core/geom/3d/shape/TransformedShape3D.js +10 -7
  88. package/src/core/geom/3d/shape/UnionShape3D.d.ts.map +1 -1
  89. package/src/core/geom/3d/shape/UnionShape3D.js +9 -3
  90. package/src/core/geom/3d/shape/json/shape_to_type.js +2 -2
  91. package/src/core/geom/3d/sphere/harmonics/SH3_COEFFICIENTS.js +17 -17
  92. package/src/core/geom/3d/tetrahedra/TetrahedralMesh.d.ts.map +1 -1
  93. package/src/core/geom/3d/tetrahedra/TetrahedralMesh.js +6 -2
  94. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_carve_outside_surface.d.ts.map +1 -1
  95. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_carve_outside_surface.js +3 -2
  96. package/src/core/geom/3d/tetrahedra/tetrahedron_contains_point.d.ts +20 -2
  97. package/src/core/geom/3d/tetrahedra/tetrahedron_contains_point.d.ts.map +1 -1
  98. package/src/core/geom/3d/tetrahedra/tetrahedron_contains_point.js +52 -37
  99. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_face_normals.d.ts.map +1 -1
  100. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_face_normals.js +40 -56
  101. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_vertex_quadrics.d.ts.map +1 -1
  102. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_vertex_quadrics.js +251 -260
  103. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_wedge_attribute_quadrics.d.ts.map +1 -1
  104. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_wedge_attribute_quadrics.js +104 -113
  105. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_resolve_t_junctions.d.ts.map +1 -1
  106. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_resolve_t_junctions.js +227 -238
  107. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_simplify.d.ts.map +1 -1
  108. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_simplify.js +15 -24
  109. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_edge_create.d.ts.map +1 -1
  110. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_edge_create.js +31 -115
  111. package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_vertex_fuse_duplicate_edges.d.ts.map +1 -1
  112. package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_vertex_fuse_duplicate_edges.js +142 -150
  113. package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_vertex_replace.d.ts.map +1 -1
  114. package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_vertex_replace.js +151 -194
  115. package/src/core/geom/3d/topology/struct/binary/query/bt_face_get_incenter.d.ts.map +1 -1
  116. package/src/core/geom/3d/topology/struct/binary/query/bt_face_get_incenter.js +60 -85
  117. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_build_boundary_distance_field.d.ts.map +1 -1
  118. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_build_boundary_distance_field.js +156 -171
  119. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_face_find_path.d.ts.map +1 -1
  120. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_face_find_path.js +8 -44
  121. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_face_find_path_polyanya.d.ts.map +1 -1
  122. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_face_find_path_polyanya.js +2 -7
  123. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_sample_interior_grid_points.d.ts.map +1 -1
  124. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_sample_interior_grid_points.js +3 -2
  125. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_segment_penetrates_surface.d.ts.map +1 -1
  126. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_segment_penetrates_surface.js +128 -133
  127. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_surface_ray_parity.d.ts +8 -14
  128. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_surface_ray_parity.d.ts.map +1 -1
  129. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_surface_ray_parity.js +36 -82
  130. package/src/core/geom/3d/triangle/tri3_ray_intersection.d.ts.map +1 -1
  131. package/src/core/geom/3d/triangle/tri3_ray_intersection.js +7 -144
  132. package/src/core/geom/ConicRay.d.ts.map +1 -1
  133. package/src/core/geom/ConicRay.js +230 -237
  134. package/src/core/localization/LocaleDataset.d.ts +6 -0
  135. package/src/core/localization/LocaleDataset.d.ts.map +1 -1
  136. package/src/core/localization/LocaleDataset.js +48 -37
  137. package/src/core/localization/LocalizationEngine.d.ts.map +1 -1
  138. package/src/core/localization/LocalizationEngine.js +3 -2
  139. package/src/core/math/lookup/ParameterLookupTable.d.ts.map +1 -1
  140. package/src/core/math/lookup/ParameterLookupTable.js +3 -1
  141. package/src/core/math/spline/spline3_hermite_intersection_spline3_hermite_nd.d.ts.map +1 -1
  142. package/src/core/math/spline/spline3_hermite_intersection_spline3_hermite_nd.js +330 -400
  143. package/src/core/math/spline/spline3_hermite_nearest_point.d.ts +16 -0
  144. package/src/core/math/spline/spline3_hermite_nearest_point.d.ts.map +1 -1
  145. package/src/core/math/spline/spline3_hermite_nearest_point.js +134 -167
  146. package/src/core/model/DebouncedObservedBoolean.d.ts +1 -2
  147. package/src/core/model/DebouncedObservedBoolean.d.ts.map +1 -1
  148. package/src/core/model/DebouncedObservedBoolean.js +1 -1
  149. package/src/core/model/node-graph/node/NodeInstance.d.ts.map +1 -1
  150. package/src/core/model/node-graph/node/NodeInstance.js +2 -7
  151. package/src/core/model/node-graph/node/parameter/NodeParameterDescription.js +1 -1
  152. package/src/core/model/object/optional_equality.d.ts +3 -3
  153. package/src/core/model/object/optional_equality.d.ts.map +1 -1
  154. package/src/core/model/object/optional_equality.js +10 -27
  155. package/src/core/model/object/write_property.js +1 -1
  156. package/src/core/model/reactive/evaluation/MultiPredicateEvaluator.js +2 -2
  157. package/src/core/primitives/strings/string_compute_byte_size.d.ts +3 -3
  158. package/src/core/primitives/strings/string_compute_byte_size.d.ts.map +1 -1
  159. package/src/core/primitives/strings/string_compute_byte_size.js +8 -21
  160. package/src/core/process/executor/ConcurrentExecutor.d.ts.map +1 -1
  161. package/src/core/process/executor/ConcurrentExecutor.js +14 -2
  162. package/src/engine/achievements/gateway/StorageAchievementGateway.d.ts +6 -3
  163. package/src/engine/achievements/gateway/StorageAchievementGateway.d.ts.map +1 -1
  164. package/src/engine/achievements/gateway/StorageAchievementGateway.js +31 -75
  165. package/src/engine/asset/loaders/SVGAssetLoader.d.ts.map +1 -1
  166. package/src/engine/asset/loaders/SVGAssetLoader.js +33 -31
  167. package/src/engine/control/first-person/math/criticallyDampedSpring.d.ts.map +1 -1
  168. package/src/engine/control/first-person/math/criticallyDampedSpring.js +3 -14
  169. package/src/engine/ecs/EntityComponentDataset.d.ts.map +1 -1
  170. package/src/engine/ecs/EntityComponentDataset.js +4 -1
  171. package/src/engine/ecs/storage/binary/object/BinaryObjectSerializationAdapter.d.ts +0 -2
  172. package/src/engine/ecs/storage/binary/object/BinaryObjectSerializationAdapter.d.ts.map +1 -1
  173. package/src/engine/ecs/storage/binary/object/BinaryObjectSerializationAdapter.js +3 -3
  174. package/src/engine/ecs/terrain/ecs/layers/TerrainLayer.js +2 -2
  175. package/src/engine/graphics/sh3/path_tracer/geometry/sort_triangles_by_distance_to_point.js +1 -1
  176. package/src/engine/graphics/texture/sampler/sampler2d_channel_compute_min_indices.js +1 -1
  177. package/src/engine/graphics3/WaterSystem.d.ts.map +1 -1
  178. package/src/engine/graphics3/WaterSystem.js +2 -1
  179. package/src/engine/graphics3/prefab/prefab_skin_frame.d.ts.map +1 -1
  180. package/src/engine/graphics3/prefab/prefab_skin_frame.js +1 -12
  181. package/src/engine/grid/grid2transform/GridPosition2TransformSystem.d.ts +1 -1
  182. package/src/engine/grid/grid2transform/GridPosition2TransformSystem.d.ts.map +1 -1
  183. package/src/engine/grid/grid2transform/GridPosition2TransformSystem.js +141 -137
  184. package/src/engine/input/ecs/systems/InputControllerSystem.d.ts.map +1 -1
  185. package/src/engine/input/ecs/systems/InputControllerSystem.js +13 -3
  186. package/src/engine/input/ecs/systems/InputSystem.d.ts.map +1 -1
  187. package/src/engine/input/ecs/systems/InputSystem.js +2 -1
  188. package/src/engine/intelligence/behavior/composite/ParallelBehavior.d.ts +1 -1
  189. package/src/engine/intelligence/behavior/composite/ParallelBehavior.d.ts.map +1 -1
  190. package/src/engine/intelligence/behavior/composite/ParallelBehavior.js +4 -1
  191. package/src/engine/intelligence/behavior/decorator/InvertStatusBehavior.d.ts.map +1 -1
  192. package/src/engine/intelligence/behavior/decorator/InvertStatusBehavior.js +3 -1
  193. package/src/engine/intelligence/behavior/decorator/RepeatBehavior.d.ts.map +1 -1
  194. package/src/engine/intelligence/behavior/decorator/RepeatBehavior.js +3 -1
  195. package/src/engine/intelligence/behavior/decorator/RepeatBehaviorSerializationAdapter.d.ts.map +1 -1
  196. package/src/engine/intelligence/behavior/decorator/RepeatBehaviorSerializationAdapter.js +39 -33
  197. package/src/engine/intelligence/behavior/util/ConditionalBehavior.d.ts +5 -0
  198. package/src/engine/intelligence/behavior/util/ConditionalBehavior.d.ts.map +1 -1
  199. package/src/engine/intelligence/behavior/util/ConditionalBehavior.js +93 -75
  200. package/src/engine/intelligence/behavior/util/RotationBehavior.d.ts.map +1 -1
  201. package/src/engine/intelligence/behavior/util/RotationBehavior.js +79 -76
  202. package/src/engine/intelligence/blackboard/BlackboardStack.d.ts +1 -0
  203. package/src/engine/intelligence/blackboard/BlackboardStack.d.ts.map +1 -1
  204. package/src/engine/intelligence/blackboard/BlackboardStack.js +159 -123
  205. package/src/engine/intelligence/mcts/StateNode.d.ts.map +1 -1
  206. package/src/engine/intelligence/mcts/StateNode.js +366 -364
  207. package/src/engine/intelligence/resource/ResourceAllocationSolver.js +1 -1
  208. package/src/engine/navigation/ecs/components/Path.d.ts.map +1 -1
  209. package/src/engine/navigation/ecs/components/Path.js +2 -1
  210. package/src/engine/navigation/ecs/path_following/PathFollowingSystem.d.ts.map +1 -1
  211. package/src/engine/navigation/ecs/path_following/PathFollowingSystem.js +5 -2
  212. package/src/engine/physics/body/SolverBodyState.d.ts.map +1 -1
  213. package/src/engine/physics/body/SolverBodyState.js +2 -6
  214. package/src/engine/physics/ccd/linear_sweep.d.ts.map +1 -1
  215. package/src/engine/physics/ccd/linear_sweep.js +3 -16
  216. package/src/engine/physics/cloth/build/cloth_proxy_from_joints.d.ts.map +1 -1
  217. package/src/engine/physics/cloth/build/cloth_proxy_from_joints.js +2 -16
  218. package/src/engine/physics/cloth/ecs/cloth_build_rows.d.ts +13 -1
  219. package/src/engine/physics/cloth/ecs/cloth_build_rows.d.ts.map +1 -1
  220. package/src/engine/physics/cloth/ecs/cloth_build_rows.js +15 -4
  221. package/src/engine/physics/ecs/PhysicsSystem.d.ts.map +1 -1
  222. package/src/engine/physics/ecs/PhysicsSystem.js +2 -5
  223. package/src/engine/physics/inertia/locked_inverse_inertia.d.ts +12 -0
  224. package/src/engine/physics/inertia/locked_inverse_inertia.d.ts.map +1 -0
  225. package/src/engine/physics/inertia/locked_inverse_inertia.js +22 -0
  226. package/src/engine/physics/integration/integrate_velocity.d.ts.map +1 -1
  227. package/src/engine/physics/integration/integrate_velocity.js +3 -18
  228. package/src/engine/physics/mls-mpm/MLS_MPM.d.ts +1 -0
  229. package/src/engine/physics/mls-mpm/MLS_MPM.d.ts.map +1 -1
  230. package/src/engine/physics/mls-mpm/MLS_MPM.js +5 -4
  231. package/src/engine/physics/narrowphase/convex_decomposition.d.ts.map +1 -1
  232. package/src/engine/physics/narrowphase/convex_decomposition.js +7 -16
  233. package/src/engine/physics/vehicle/RaycastVehicle.d.ts.map +1 -1
  234. package/src/engine/physics/vehicle/RaycastVehicle.js +15 -5
  235. package/src/engine/save/StorageBackedList.d.ts +5 -0
  236. package/src/engine/save/StorageBackedList.d.ts.map +1 -1
  237. package/src/engine/save/StorageBackedList.js +161 -144
  238. package/src/engine/simulation/Ticker.d.ts.map +1 -1
  239. package/src/engine/simulation/Ticker.js +394 -391
  240. package/src/engine/sound/simulation/probe/AcousticProbeField.d.ts.map +1 -1
  241. package/src/engine/sound/simulation/probe/AcousticProbeField.js +6 -19
  242. package/src/engine/sound/simulation/probe/probe_edge_visible.d.ts +15 -0
  243. package/src/engine/sound/simulation/probe/probe_edge_visible.d.ts.map +1 -1
  244. package/src/engine/sound/simulation/probe/probe_edge_visible.js +59 -41
  245. package/src/engine/sound/simulation/probe/probe_refine_connectivity.d.ts.map +1 -1
  246. package/src/engine/sound/simulation/probe/probe_refine_connectivity.js +164 -181
  247. package/src/engine/sound/simulation/render/FoaProbeReverbRenderer.d.ts.map +1 -1
  248. package/src/engine/sound/simulation/render/FoaProbeReverbRenderer.js +20 -5
  249. package/src/format/image/avif/av1/decode/Av1FrameContext.d.ts.map +1 -1
  250. package/src/format/image/avif/av1/decode/Av1FrameContext.js +3 -10
  251. package/src/format/image/avif/av1/decode/reconstruct.d.ts +20 -0
  252. package/src/format/image/avif/av1/decode/reconstruct.d.ts.map +1 -1
  253. package/src/format/image/avif/av1/decode/reconstruct.js +22 -9
  254. package/src/format/image/avif/av1/encode/choose_restoration.js +2 -18
  255. package/src/format/image/avif/av1/encode/quantise.d.ts.map +1 -1
  256. package/src/format/image/avif/av1/encode/quantise.js +1 -55
  257. package/src/format/image/avif/av1/filter/loop_restoration.d.ts +9 -0
  258. package/src/format/image/avif/av1/filter/loop_restoration.d.ts.map +1 -1
  259. package/src/format/image/avif/av1/filter/loop_restoration.js +1 -1
  260. package/src/format/texture/basis/transcode/etc1s_to_bc7.js +2 -33
  261. package/src/format/texture/basis/transcode/fit_endpoints.d.ts +11 -0
  262. package/src/format/texture/basis/transcode/fit_endpoints.d.ts.map +1 -1
  263. package/src/format/texture/basis/transcode/fit_endpoints.js +1 -1
  264. package/src/format/texture/basis/uastc/uastc_decode_block.d.ts.map +1 -1
  265. package/src/format/texture/basis/uastc/uastc_decode_block.js +2 -19
  266. package/src/generation/foliage/ANNUAL_SHOOTS_BRIEF_2026_10_25.md +220 -0
  267. package/src/generation/foliage/CROWN_FILLING_BRIEF_2026_10_26.md +172 -0
  268. package/src/generation/foliage/FOLIAGE_DESIGN.md +165 -15
  269. package/src/generation/foliage/LEAF_ARCHITECTURE_BRIEF_2026_10_26.md +158 -0
  270. package/src/generation/foliage/SHOOT_SYSTEMS_ALL_SPECIES_BRIEF_2026_10_26.md +248 -0
  271. package/src/generation/foliage/SPEEDTREE_COMPARISON_2026_10_24.md +694 -0
  272. package/src/generation/foliage/analysis/CrownOpacity.d.ts +118 -0
  273. package/src/generation/foliage/analysis/CrownOpacity.d.ts.map +1 -0
  274. package/src/generation/foliage/analysis/CrownOpacity.js +182 -0
  275. package/src/generation/foliage/analysis/crown_opacity_frames.d.ts +10 -0
  276. package/src/generation/foliage/analysis/crown_opacity_frames.d.ts.map +1 -0
  277. package/src/generation/foliage/analysis/crown_opacity_frames.js +132 -0
  278. package/src/generation/foliage/analysis/crown_opacity_measure.d.ts +51 -0
  279. package/src/generation/foliage/analysis/crown_opacity_measure.d.ts.map +1 -0
  280. package/src/generation/foliage/analysis/crown_opacity_measure.js +649 -0
  281. package/src/generation/foliage/analysis/foliage_measure_leaf_area.d.ts +66 -0
  282. package/src/generation/foliage/analysis/foliage_measure_leaf_area.d.ts.map +1 -0
  283. package/src/generation/foliage/analysis/foliage_measure_leaf_area.js +192 -0
  284. package/src/generation/foliage/analysis/tree_crown_opacity.d.ts +27 -0
  285. package/src/generation/foliage/analysis/tree_crown_opacity.d.ts.map +1 -0
  286. package/src/generation/foliage/analysis/tree_crown_opacity.js +58 -0
  287. package/src/generation/foliage/animation/build_tree_wind_rig.d.ts +3 -2
  288. package/src/generation/foliage/animation/build_tree_wind_rig.d.ts.map +1 -1
  289. package/src/generation/foliage/animation/build_tree_wind_rig.js +12 -30
  290. package/src/generation/foliage/animation/tree_wind_bend_limit.d.ts +12 -0
  291. package/src/generation/foliage/animation/tree_wind_bend_limit.d.ts.map +1 -0
  292. package/src/generation/foliage/animation/tree_wind_bend_limit.js +13 -0
  293. package/src/generation/foliage/asset/TreeAsset.d.ts +5 -0
  294. package/src/generation/foliage/asset/TreeAsset.d.ts.map +1 -1
  295. package/src/generation/foliage/asset/TreeAsset.js +6 -0
  296. package/src/generation/foliage/asset/generate_tree.d.ts.map +1 -1
  297. package/src/generation/foliage/asset/generate_tree.js +23 -6
  298. package/src/generation/foliage/config/{BranchLevelConfig.d.ts → BranchGeneratorConfig.d.ts} +61 -75
  299. package/src/generation/foliage/config/BranchGeneratorConfig.d.ts.map +1 -0
  300. package/src/generation/foliage/config/{BranchLevelConfig.js → BranchGeneratorConfig.js} +83 -126
  301. package/src/generation/foliage/config/BranchSpawnRule.d.ts +118 -0
  302. package/src/generation/foliage/config/BranchSpawnRule.d.ts.map +1 -0
  303. package/src/generation/foliage/config/BranchSpawnRule.js +217 -0
  304. package/src/generation/foliage/config/FoliageCardType.d.ts +1 -1
  305. package/src/generation/foliage/config/FoliageCardType.js +2 -2
  306. package/src/generation/foliage/config/FoliageConfig.d.ts +23 -45
  307. package/src/generation/foliage/config/FoliageConfig.d.ts.map +1 -1
  308. package/src/generation/foliage/config/FoliageConfig.js +47 -93
  309. package/src/generation/foliage/config/FoliageMaterialConfig.d.ts +12 -20
  310. package/src/generation/foliage/config/FoliageMaterialConfig.d.ts.map +1 -1
  311. package/src/generation/foliage/config/FoliageMaterialConfig.js +261 -279
  312. package/src/generation/foliage/config/FoliageSpawnRule.d.ts +77 -0
  313. package/src/generation/foliage/config/FoliageSpawnRule.d.ts.map +1 -0
  314. package/src/generation/foliage/config/FoliageSpawnRule.js +135 -0
  315. package/src/generation/foliage/config/FoliageTileContent.d.ts +9 -0
  316. package/src/generation/foliage/config/FoliageTileContent.d.ts.map +1 -0
  317. package/src/generation/foliage/config/FoliageTileContent.js +12 -0
  318. package/src/generation/foliage/config/LeafApexShape.d.ts +12 -0
  319. package/src/generation/foliage/config/LeafApexShape.d.ts.map +1 -0
  320. package/src/generation/foliage/config/LeafApexShape.js +17 -0
  321. package/src/generation/foliage/config/LeafArchitecture.d.ts +155 -0
  322. package/src/generation/foliage/config/LeafArchitecture.d.ts.map +1 -0
  323. package/src/generation/foliage/config/LeafArchitecture.js +288 -0
  324. package/src/generation/foliage/config/LeafBaseShape.d.ts +14 -0
  325. package/src/generation/foliage/config/LeafBaseShape.d.ts.map +1 -0
  326. package/src/generation/foliage/config/LeafBaseShape.js +21 -0
  327. package/src/generation/foliage/config/LeafLobation.d.ts +10 -0
  328. package/src/generation/foliage/config/LeafLobation.d.ts.map +1 -0
  329. package/src/generation/foliage/config/LeafLobation.js +14 -0
  330. package/src/generation/foliage/config/PhyllotaxisMode.d.ts +11 -0
  331. package/src/generation/foliage/config/PhyllotaxisMode.d.ts.map +1 -1
  332. package/src/generation/foliage/config/PhyllotaxisMode.js +36 -0
  333. package/src/generation/foliage/config/ShootBudZone.d.ts +105 -0
  334. package/src/generation/foliage/config/ShootBudZone.d.ts.map +1 -0
  335. package/src/generation/foliage/config/ShootBudZone.js +219 -0
  336. package/src/generation/foliage/config/ShootGrowthConfig.d.ts +84 -0
  337. package/src/generation/foliage/config/ShootGrowthConfig.d.ts.map +1 -0
  338. package/src/generation/foliage/config/ShootGrowthConfig.js +146 -0
  339. package/src/generation/foliage/config/ShootSystemRule.d.ts +144 -0
  340. package/src/generation/foliage/config/ShootSystemRule.d.ts.map +1 -0
  341. package/src/generation/foliage/config/ShootSystemRule.js +316 -0
  342. package/src/generation/foliage/config/TreeLODConfig.d.ts +1 -1
  343. package/src/generation/foliage/config/TreeLODConfig.js +1 -1
  344. package/src/generation/foliage/config/TreeSpeciesConfig.d.ts +40 -8
  345. package/src/generation/foliage/config/TreeSpeciesConfig.d.ts.map +1 -1
  346. package/src/generation/foliage/config/TreeSpeciesConfig.js +124 -68
  347. package/src/generation/foliage/config/TreeWindConfig.d.ts +23 -10
  348. package/src/generation/foliage/config/TreeWindConfig.d.ts.map +1 -1
  349. package/src/generation/foliage/config/TreeWindConfig.js +34 -25
  350. package/src/generation/foliage/index.d.ts +19 -2
  351. package/src/generation/foliage/index.js +63 -44
  352. package/src/generation/foliage/material/FoliageAtlasCutout.d.ts +59 -0
  353. package/src/generation/foliage/material/FoliageAtlasCutout.d.ts.map +1 -0
  354. package/src/generation/foliage/material/FoliageAtlasCutout.js +93 -0
  355. package/src/generation/foliage/material/compute_foliage_variant_atlas_layout.d.ts +26 -0
  356. package/src/generation/foliage/material/compute_foliage_variant_atlas_layout.d.ts.map +1 -0
  357. package/src/generation/foliage/material/compute_foliage_variant_atlas_layout.js +63 -0
  358. package/src/generation/foliage/material/foliage_atlas_cutout.d.ts +34 -0
  359. package/src/generation/foliage/material/foliage_atlas_cutout.d.ts.map +1 -0
  360. package/src/generation/foliage/material/foliage_atlas_cutout.js +174 -0
  361. package/src/generation/foliage/material/foliage_tile.d.ts +110 -0
  362. package/src/generation/foliage/material/foliage_tile.d.ts.map +1 -0
  363. package/src/generation/foliage/material/foliage_tile.js +286 -0
  364. package/src/generation/foliage/material/leaf_geometry.d.ts +103 -0
  365. package/src/generation/foliage/material/leaf_geometry.d.ts.map +1 -0
  366. package/src/generation/foliage/material/leaf_geometry.js +528 -0
  367. package/src/generation/foliage/material/make_foliage_material.d.ts +13 -33
  368. package/src/generation/foliage/material/make_foliage_material.d.ts.map +1 -1
  369. package/src/generation/foliage/material/make_foliage_material.js +356 -605
  370. package/src/generation/foliage/mesh/foliage_collect_attachments.d.ts +39 -4
  371. package/src/generation/foliage/mesh/foliage_collect_attachments.d.ts.map +1 -1
  372. package/src/generation/foliage/mesh/foliage_collect_attachments.js +637 -569
  373. package/src/generation/foliage/mesh/interpolate_ring_skin_weights4.d.ts +48 -0
  374. package/src/generation/foliage/mesh/interpolate_ring_skin_weights4.d.ts.map +1 -0
  375. package/src/generation/foliage/mesh/interpolate_ring_skin_weights4.js +232 -0
  376. package/src/generation/foliage/mesh/tree_mesh_build_bark.d.ts.map +1 -1
  377. package/src/generation/foliage/mesh/tree_mesh_build_bark.js +1023 -1049
  378. package/src/generation/foliage/mesh/tree_mesh_build_foliage.d.ts +9 -2
  379. package/src/generation/foliage/mesh/tree_mesh_build_foliage.d.ts.map +1 -1
  380. package/src/generation/foliage/mesh/tree_mesh_build_foliage.js +467 -454
  381. package/src/generation/foliage/presets/make_tree_species_preset.d.ts.map +1 -1
  382. package/src/generation/foliage/presets/make_tree_species_preset.js +1648 -870
  383. package/src/generation/foliage/skeleton/ShootFrameworkHash.d.ts +35 -0
  384. package/src/generation/foliage/skeleton/ShootFrameworkHash.d.ts.map +1 -0
  385. package/src/generation/foliage/skeleton/ShootFrameworkHash.js +129 -0
  386. package/src/generation/foliage/skeleton/ShootGirth.d.ts +51 -0
  387. package/src/generation/foliage/skeleton/ShootGirth.d.ts.map +1 -0
  388. package/src/generation/foliage/skeleton/ShootGirth.js +212 -0
  389. package/src/generation/foliage/skeleton/ShootLightField.d.ts +73 -0
  390. package/src/generation/foliage/skeleton/ShootLightField.d.ts.map +1 -0
  391. package/src/generation/foliage/skeleton/ShootLightField.js +197 -0
  392. package/src/generation/foliage/skeleton/TreeSkeleton.d.ts +106 -3
  393. package/src/generation/foliage/skeleton/TreeSkeleton.d.ts.map +1 -1
  394. package/src/generation/foliage/skeleton/TreeSkeleton.js +217 -39
  395. package/src/generation/foliage/skeleton/flare_lobe_phase_offset.d.ts +13 -0
  396. package/src/generation/foliage/skeleton/flare_lobe_phase_offset.d.ts.map +1 -0
  397. package/src/generation/foliage/skeleton/flare_lobe_phase_offset.js +16 -0
  398. package/src/generation/foliage/skeleton/foliage_card_density.d.ts +71 -0
  399. package/src/generation/foliage/skeleton/foliage_card_density.d.ts.map +1 -0
  400. package/src/generation/foliage/skeleton/foliage_card_density.js +101 -0
  401. package/src/generation/foliage/skeleton/foliage_senescence.d.ts +101 -0
  402. package/src/generation/foliage/skeleton/foliage_senescence.d.ts.map +1 -0
  403. package/src/generation/foliage/skeleton/foliage_senescence.js +149 -0
  404. package/src/generation/foliage/skeleton/foliage_unit_cards.d.ts +76 -0
  405. package/src/generation/foliage/skeleton/foliage_unit_cards.d.ts.map +1 -0
  406. package/src/generation/foliage/skeleton/foliage_unit_cards.js +95 -0
  407. package/src/generation/foliage/skeleton/shoot_demography.d.ts +22 -0
  408. package/src/generation/foliage/skeleton/shoot_demography.d.ts.map +1 -0
  409. package/src/generation/foliage/skeleton/shoot_demography.js +96 -0
  410. package/src/generation/foliage/skeleton/shoot_geometry.d.ts +66 -0
  411. package/src/generation/foliage/skeleton/shoot_geometry.d.ts.map +1 -0
  412. package/src/generation/foliage/skeleton/shoot_geometry.js +109 -0
  413. package/src/generation/foliage/skeleton/shoot_systems_simulate.d.ts +166 -0
  414. package/src/generation/foliage/skeleton/shoot_systems_simulate.d.ts.map +1 -0
  415. package/src/generation/foliage/skeleton/shoot_systems_simulate.js +588 -0
  416. package/src/generation/foliage/skeleton/tree_skeleton_assign_skin_joints.d.ts +28 -12
  417. package/src/generation/foliage/skeleton/tree_skeleton_assign_skin_joints.d.ts.map +1 -1
  418. package/src/generation/foliage/skeleton/tree_skeleton_assign_skin_joints.js +137 -102
  419. package/src/generation/foliage/skeleton/tree_skeleton_compute_joint_mechanics.d.ts +112 -0
  420. package/src/generation/foliage/skeleton/tree_skeleton_compute_joint_mechanics.d.ts.map +1 -0
  421. package/src/generation/foliage/skeleton/tree_skeleton_compute_joint_mechanics.js +408 -0
  422. package/src/generation/foliage/skeleton/tree_skeleton_compute_pipe_radii.d.ts.map +1 -1
  423. package/src/generation/foliage/skeleton/tree_skeleton_compute_pipe_radii.js +208 -206
  424. package/src/generation/foliage/skeleton/tree_skeleton_grow.d.ts +5 -2
  425. package/src/generation/foliage/skeleton/tree_skeleton_grow.d.ts.map +1 -1
  426. package/src/generation/foliage/skeleton/tree_skeleton_grow.js +2048 -1871
  427. package/src/generation/foliage/skeleton/tree_skeleton_grow_shoots.d.ts +17 -0
  428. package/src/generation/foliage/skeleton/tree_skeleton_grow_shoots.d.ts.map +1 -0
  429. package/src/generation/foliage/skeleton/tree_skeleton_grow_shoots.js +231 -0
  430. package/src/generation/foliage/skeleton/tree_skeleton_read_joint_motion.d.ts +14 -0
  431. package/src/generation/foliage/skeleton/tree_skeleton_read_joint_motion.d.ts.map +1 -0
  432. package/src/generation/foliage/skeleton/tree_skeleton_read_joint_motion.js +26 -0
  433. package/src/generation/foliage/skeleton/tree_skeleton_read_joint_parents.d.ts +10 -0
  434. package/src/generation/foliage/skeleton/tree_skeleton_read_joint_parents.d.ts.map +1 -0
  435. package/src/generation/foliage/skeleton/tree_skeleton_read_joint_parents.js +20 -0
  436. package/src/generation/grid/generation/road/GridTaskGenerateRoads.d.ts.map +1 -1
  437. package/src/generation/grid/generation/road/GridTaskGenerateRoads.js +4 -1
  438. package/src/generation/markers/GridCellActionPlaceMarkerGroup.d.ts +1 -0
  439. package/src/generation/markers/GridCellActionPlaceMarkerGroup.d.ts.map +1 -1
  440. package/src/generation/markers/GridCellActionPlaceMarkerGroup.js +98 -86
  441. package/src/shade/SHADER_F16_PROPOSAL_2026_10_24.md +263 -0
  442. package/src/shade/descriptor/WebGPUExtensionType.d.ts +17 -0
  443. package/src/shade/descriptor/WebGPUExtensionType.d.ts.map +1 -1
  444. package/src/shade/descriptor/WebGPUExtensionType.js +31 -1
  445. package/src/shade/playground/foliage_wind/FoliageRigOverlay.d.ts +37 -0
  446. package/src/shade/playground/foliage_wind/FoliageRigOverlay.d.ts.map +1 -0
  447. package/src/shade/playground/foliage_wind/FoliageRigOverlay.js +491 -0
  448. package/src/shade/playground/foliage_wind/foliage_world.d.ts.map +1 -1
  449. package/src/shade/playground/foliage_wind/foliage_world.js +600 -602
  450. package/src/shade/playground/foliage_wind/index.html +6 -0
  451. package/src/shade/playground/foliage_wind/main.js +14 -0
  452. package/src/shade/renderer/animation/GPUAnimationManager.d.ts.map +1 -1
  453. package/src/shade/renderer/animation/GPUAnimationManager.js +2 -1
  454. package/src/shade/renderer/animation/foliage/FoliageWindJoint.d.ts +2 -1
  455. package/src/shade/renderer/animation/foliage/FoliageWindJoint.d.ts.map +1 -1
  456. package/src/shade/renderer/animation/foliage/FoliageWindJoint.js +2 -1
  457. package/src/shade/renderer/animation/foliage/chunk_foliage_wind_step.d.ts.map +1 -1
  458. package/src/shade/renderer/animation/foliage/chunk_foliage_wind_step.js +4 -2
  459. package/src/shade/renderer/buffer/table/GPUTypedTable.js +1 -1
  460. package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.d.ts.map +1 -1
  461. package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.js +403 -401
  462. package/src/shade/renderer/camera/OrbitalCameraController.d.ts +1 -62
  463. package/src/shade/renderer/camera/OrbitalCameraController.d.ts.map +1 -1
  464. package/src/shade/renderer/camera/OrbitalCameraController.js +1 -374
  465. package/src/shade/renderer/deferred/indirect/chunk_lpv_2d_cache_sample_irradiance.d.ts.map +1 -1
  466. package/src/shade/renderer/deferred/indirect/chunk_lpv_2d_cache_sample_irradiance.js +3 -0
  467. package/src/shade/renderer/deferred/indirect/chunk_lpv_sample_light.d.ts.map +1 -1
  468. package/src/shade/renderer/deferred/indirect/chunk_lpv_sample_light.js +6 -1
  469. package/src/shade/renderer/dynamic/shader_dynamic_mesh_avboit_splat.js +1 -1
  470. package/src/shade/renderer/fluid/GPUFluidCascade.d.ts +2 -2
  471. package/src/shade/renderer/fluid/GPUFluidCascade.d.ts.map +1 -1
  472. package/src/shade/renderer/fluid/GPUFluidCascade.js +6 -3
  473. package/src/shade/renderer/fluid/GPU_FLUID_OCCUPANCY_AND_SOTA_REVIEW_2026_10_26.md +361 -0
  474. package/src/shade/renderer/fluid/coupling/chunk_fluid_cascade_parent.d.ts.map +1 -1
  475. package/src/shade/renderer/fluid/coupling/chunk_fluid_cascade_parent.js +335 -241
  476. package/src/shade/renderer/fluid/coupling/shader_fluid_cascade_ghosts.d.ts.map +1 -1
  477. package/src/shade/renderer/fluid/coupling/shader_fluid_cascade_ghosts.js +108 -101
  478. package/src/shade/renderer/fluid/forcing/chunk_fluid_forcing_query_select.d.ts.map +1 -1
  479. package/src/shade/renderer/fluid/forcing/chunk_fluid_forcing_query_select.js +69 -67
  480. package/src/shade/renderer/fluid/forcing/shader_fluid_forcing_apply.d.ts +7 -6
  481. package/src/shade/renderer/fluid/forcing/shader_fluid_forcing_apply.d.ts.map +1 -1
  482. package/src/shade/renderer/fluid/forcing/shader_fluid_forcing_apply.js +341 -287
  483. package/src/shade/renderer/fluid/mac/FluidMacPasses.d.ts +6 -4
  484. package/src/shade/renderer/fluid/mac/FluidMacPasses.d.ts.map +1 -1
  485. package/src/shade/renderer/fluid/mac/FluidMacPasses.js +427 -400
  486. package/src/shade/renderer/fluid/mac/chunk_fluid_mac_seams.d.ts +10 -5
  487. package/src/shade/renderer/fluid/mac/chunk_fluid_mac_seams.d.ts.map +1 -1
  488. package/src/shade/renderer/fluid/mac/chunk_fluid_mac_seams.js +532 -190
  489. package/src/shade/renderer/fluid/mac/chunk_v3_mac_lattice_corners.d.ts.map +1 -1
  490. package/src/shade/renderer/fluid/mac/chunk_v3_mac_lattice_corners.js +231 -237
  491. package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_correct.d.ts +2 -2
  492. package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_correct.d.ts.map +1 -1
  493. package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_correct.js +282 -245
  494. package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_predict.d.ts +1 -3
  495. package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_predict.d.ts.map +1 -1
  496. package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_predict.js +139 -109
  497. package/src/shade/renderer/fluid/mac/shader_fluid_mac_curl.d.ts +6 -6
  498. package/src/shade/renderer/fluid/mac/shader_fluid_mac_curl.d.ts.map +1 -1
  499. package/src/shade/renderer/fluid/mac/shader_fluid_mac_curl.js +257 -222
  500. package/src/shade/renderer/fluid/mac/shader_fluid_mac_divergence.d.ts +8 -7
  501. package/src/shade/renderer/fluid/mac/shader_fluid_mac_divergence.d.ts.map +1 -1
  502. package/src/shade/renderer/fluid/mac/shader_fluid_mac_divergence.js +119 -92
  503. package/src/shade/renderer/fluid/mac/shader_fluid_mac_gradient.d.ts +6 -9
  504. package/src/shade/renderer/fluid/mac/shader_fluid_mac_gradient.d.ts.map +1 -1
  505. package/src/shade/renderer/fluid/mac/shader_fluid_mac_gradient.js +229 -181
  506. package/src/shade/renderer/fluid/pressure/GPUFluidPressureSolve.d.ts +17 -7
  507. package/src/shade/renderer/fluid/pressure/GPUFluidPressureSolve.d.ts.map +1 -1
  508. package/src/shade/renderer/fluid/pressure/GPUFluidPressureSolve.js +634 -621
  509. package/src/shade/renderer/fluid/pressure/shader_fluid_mg_residual_restrict.d.ts +8 -6
  510. package/src/shade/renderer/fluid/pressure/shader_fluid_mg_residual_restrict.d.ts.map +1 -1
  511. package/src/shade/renderer/fluid/pressure/shader_fluid_mg_residual_restrict.js +166 -149
  512. package/src/shade/renderer/fluid/pressure/shader_fluid_mg_smooth.d.ts +8 -6
  513. package/src/shade/renderer/fluid/pressure/shader_fluid_mg_smooth.d.ts.map +1 -1
  514. package/src/shade/renderer/fluid/pressure/shader_fluid_mg_smooth.js +219 -183
  515. package/src/shade/renderer/fluid/publish/shader_fluid_wind_publish.d.ts.map +1 -1
  516. package/src/shade/renderer/fluid/publish/shader_fluid_wind_publish.js +142 -122
  517. package/src/shade/renderer/geometry/meshlet/COMPACTION_PLAN_2026_09_16.md +674 -663
  518. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.d.ts +1 -1
  519. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.d.ts.map +1 -1
  520. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.js +63 -29
  521. package/src/shade/renderer/geometry/meshlet/build/meshoptimizer/geometry_to_meshlets_meshoptimizer.d.ts.map +1 -1
  522. package/src/shade/renderer/geometry/meshlet/build/meshoptimizer/geometry_to_meshlets_meshoptimizer.js +77 -87
  523. package/src/shade/renderer/geometry/meshlet/build/meshoptimizer/meshopt_clusterizer.d.ts.map +1 -1
  524. package/src/shade/renderer/geometry/meshlet/build/meshoptimizer/meshopt_clusterizer.js +4 -3
  525. package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.d.ts +11 -11
  526. package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.d.ts.map +1 -1
  527. package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.js +17 -19
  528. package/src/shade/renderer/global_illumination/lpv/graph_bake_irradiance_lookup_2d.js +4 -4
  529. package/src/shade/renderer/global_illumination/probe/octahedral/sample/chunk_lpv_mesh_interpolate_radiance_via_atlas.d.ts.map +1 -1
  530. package/src/shade/renderer/global_illumination/probe/octahedral/sample/chunk_lpv_mesh_interpolate_radiance_via_atlas.js +5 -1
  531. package/src/shade/renderer/loader/gltf/load_gltf.d.ts.map +1 -1
  532. package/src/shade/renderer/loader/gltf/load_gltf.js +11 -35
  533. package/src/shade/renderer/loader/usd/load_usd.d.ts.map +1 -1
  534. package/src/shade/renderer/loader/usd/load_usd.js +6 -19
  535. package/src/shade/renderer/particles/shaders/shader_particle_avboit_draw.d.ts.map +1 -1
  536. package/src/shade/renderer/particles/shaders/shader_particle_avboit_draw.js +199 -193
  537. package/src/shade/renderer/particles/shaders/shader_particle_avboit_splat.d.ts.map +1 -1
  538. package/src/shade/renderer/particles/shaders/shader_particle_avboit_splat.js +151 -143
  539. package/src/shade/renderer/postprocess/bloom/chunk_karis_blur4x4_sample.d.ts.map +1 -1
  540. package/src/shade/renderer/postprocess/bloom/chunk_karis_blur4x4_sample.js +11 -5
  541. package/src/shade/renderer/postprocess/denoise/graph_atorus_denoise_luma.d.ts.map +1 -1
  542. package/src/shade/renderer/postprocess/denoise/graph_atorus_denoise_luma.js +6 -18
  543. package/src/shade/renderer/postprocess/gtao/GTAO.js +1 -1
  544. package/src/shade/renderer/postprocess/gtao/ao_reproject_shader.d.ts.map +1 -1
  545. package/src/shade/renderer/postprocess/gtao/ao_reproject_shader.js +3 -5
  546. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao_with_irradiance.js +1 -1
  547. package/src/shade/renderer/postprocess/nss/chunk_nss_luma_derivative.d.ts.map +1 -1
  548. package/src/shade/renderer/postprocess/nss/chunk_nss_luma_derivative.js +7 -3
  549. package/src/shade/renderer/postprocess/nss/shader_nss_postprocess.d.ts.map +1 -1
  550. package/src/shade/renderer/postprocess/nss/shader_nss_postprocess.js +4 -2
  551. package/src/shade/renderer/postprocess/nss/shader_nss_preprocess.d.ts.map +1 -1
  552. package/src/shade/renderer/postprocess/nss/shader_nss_preprocess.js +4 -1
  553. package/src/shade/renderer/postprocess/ssr/downsample_karis.d.ts.map +1 -1
  554. package/src/shade/renderer/postprocess/ssr/downsample_karis.js +6 -3
  555. package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_temporal_accumulate.d.ts.map +1 -1
  556. package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_temporal_accumulate.js +4 -3
  557. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader.d.ts.map +1 -1
  558. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader.js +4 -1
  559. package/src/shade/renderer/postprocess/ssr/ssr_spatial_denoise_shader.d.ts.map +1 -1
  560. package/src/shade/renderer/postprocess/ssr/ssr_spatial_denoise_shader.js +4 -2
  561. package/src/shade/renderer/postprocess/taa/chunk_taa_tonemap.d.ts.map +1 -1
  562. package/src/shade/renderer/postprocess/taa/chunk_taa_tonemap.js +35 -39
  563. package/src/shade/renderer/postprocess/taa/chunk_taa_tonemap_inv.d.ts.map +1 -1
  564. package/src/shade/renderer/postprocess/taa/chunk_taa_tonemap_inv.js +20 -17
  565. package/src/shade/renderer/postprocess/taa/shader_taa.d.ts.map +1 -1
  566. package/src/shade/renderer/postprocess/taa/shader_taa.js +6 -3
  567. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.d.ts.map +1 -1
  568. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.js +3 -1
  569. package/src/shade/renderer/rasterize/native/avboit/avboit_draw_fragment_body.js +1 -1
  570. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_splat_slice.js +2 -2
  571. package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.js +1 -1
  572. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_integrate.d.ts.map +1 -1
  573. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_integrate.js +92 -83
  574. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_splat.js +1 -1
  575. package/src/shade/renderer/shader/ShaderDescriptor.d.ts.map +1 -1
  576. package/src/shade/renderer/shader/ShaderDescriptor.js +12 -4
  577. package/src/shade/renderer/shader/chunk/bvh/chunk_bvh_query_aabb_cooperative.d.ts.map +1 -1
  578. package/src/shade/renderer/shader/chunk/bvh/chunk_bvh_query_aabb_cooperative.js +294 -286
  579. package/src/shade/renderer/shader/chunk/light/lpv/chunk_lpv_interpolate_probe_irradiance8.js +5 -5
  580. package/src/shade/renderer/shader/chunk/light/lpv/chunk_lpv_mesh_interpolate_probe.d.ts.map +1 -1
  581. package/src/shade/renderer/shader/chunk/light/lpv/chunk_lpv_mesh_interpolate_probe.js +5 -3
  582. package/src/shade/renderer/shader/chunk/light/lpv/chunk_lpv_mesh_interpolate_probe_irradiance.d.ts.map +1 -1
  583. package/src/shade/renderer/shader/chunk/light/lpv/chunk_lpv_mesh_interpolate_probe_irradiance.js +9 -6
  584. package/src/shade/renderer/shader/chunk/light/lpv/chunk_lpv_sample_sh3_at.d.ts.map +1 -1
  585. package/src/shade/renderer/shader/chunk/light/lpv/chunk_lpv_sample_sh3_at.js +33 -38
  586. package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.d.ts.map +1 -1
  587. package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.js +690 -675
  588. package/src/shade/renderer/shader/type/WebGPUArray.d.ts +3 -0
  589. package/src/shade/renderer/shader/type/WebGPUArray.d.ts.map +1 -1
  590. package/src/shade/renderer/shader/type/WebGPUArray.js +185 -167
  591. package/src/shade/renderer/shader/type/WebGPUStruct.d.ts.map +1 -1
  592. package/src/shade/renderer/shader/type/WebGPUStruct.js +461 -455
  593. package/src/shade/renderer/shader/type/serde/read_gpu_typed_buffer.d.ts.map +1 -1
  594. package/src/shade/renderer/shader/type/serde/read_gpu_typed_buffer.js +335 -211
  595. package/src/shade/renderer/shader/type/serde/write_gpu_typed_buffer.d.ts.map +1 -1
  596. package/src/shade/renderer/shader/type/serde/write_gpu_typed_buffer.js +329 -221
  597. package/src/shade/renderer/shader/type/type_has_f16.d.ts +12 -0
  598. package/src/shade/renderer/shader/type/type_has_f16.d.ts.map +1 -0
  599. package/src/shade/renderer/shader/type/type_has_f16.js +66 -0
  600. package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.d.ts.map +1 -1
  601. package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.js +16 -2
  602. package/src/shade/renderer/volumetrics/taa/shader_volumetrics_taa.d.ts.map +1 -1
  603. package/src/shade/renderer/volumetrics/taa/shader_volumetrics_taa.js +5 -2
  604. package/src/shade/renderer/water/shader_water_avboit.js +1 -1
  605. package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.d.ts.map +1 -1
  606. package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js +260 -23
  607. package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts +6 -7
  608. package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts.map +1 -1
  609. package/src/shade/wgsl/emulator/WGSLLanguageCore.js +269 -69
  610. package/src/shade/wgsl/validate_wgsl_source.d.ts.map +1 -1
  611. package/src/shade/wgsl/validate_wgsl_source.js +27 -1
  612. package/src/view/controller/controls/ListController.d.ts.map +1 -1
  613. package/src/view/controller/controls/ListController.js +118 -113
  614. package/src/view/controller/controls/Vector1Control.js +97 -97
  615. package/src/view/elements/image/SvgImageView.d.ts +1 -0
  616. package/src/view/elements/image/SvgImageView.d.ts.map +1 -1
  617. package/src/view/elements/image/SvgImageView.js +92 -90
  618. package/src/view/minimap/dom/MinimapTerrainView.d.ts +1 -0
  619. package/src/view/minimap/dom/MinimapTerrainView.d.ts.map +1 -1
  620. package/src/view/minimap/dom/MinimapTerrainView.js +151 -147
  621. package/src/view/tooltip/gml/TooltipParser.js +2 -2
  622. package/src/engine/network/PriorityFetch.d.ts +0 -59
  623. package/src/engine/network/PriorityFetch.d.ts.map +0 -1
  624. package/src/engine/network/PriorityFetch.js +0 -193
  625. package/src/generation/foliage/config/BranchLevelConfig.d.ts.map +0 -1
@@ -1,222 +1,257 @@
1
- import { chunk_grid3d_to_index } from "../../shader/chunk/grid/chunk_grid3d_to_index.js";
2
- import { chunk_grid_tile_window, GRID_TILE_SIZE } from "../../shader/chunk/grid/chunk_grid_tile_window.js";
3
- import { chunk_index_to_grid3d } from "../../shader/chunk/grid/chunk_index_to_grid3d.js";
4
- import { ComputeShader } from "../../shader/ComputeShader.js";
5
- import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
6
- import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
7
- import { f32, u32 } from "../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
8
- import { WebGPUArray } from "../../shader/type/WebGPUArray.js";
9
- import { chunk_fluid_forcing_flags } from "../forcing/FLUID_FORCING.js";
10
- import { chunk_v3_mac_vorticity_confinement } from "./chunk_v3_mac_vorticity_confinement.js";
11
- import { FLUID_MAC_STEP_STRUCT } from "./FLUID_MAC_STEP_STRUCT.js";
12
-
13
- /**
14
- * The block of cells a curl workgroup holds the centre velocity of: its tile and two cells around it,
15
- * since a tile cell's force reads `|ω|` one cell out, and `ω` there reads the velocity one further.
16
- * @type {number[]}
17
- */
18
- const BLOCK = GRID_TILE_SIZE.map(n => n + 4);
19
-
20
- const BLOCK_CELLS = BLOCK[0] * BLOCK[1] * BLOCK[2];
21
-
22
- const resources = new ShaderResourceSetDescriptor();
23
-
24
- resources.createGroup()
25
- .addUniform("step", FLUID_MAC_STEP_STRUCT)
26
- .addTexture("source_u", "unfilterable-float", "3d")
27
- .addTexture("source_v", "unfilterable-float", "3d")
28
- .addTexture("source_w", "unfilterable-float", "3d")
29
- .addStorageBuffer("solid", WebGPUArray.from(u32), false)
30
- // the force, x of every cell, then y, then z, each window-local x fastest
31
- .addStorageBuffer("confinement", WebGPUArray.from(f32), true);
32
-
33
- const body = CodeChunk.from(
34
- //language=WGSL
35
- `
36
- const FLUID_CURL_BLOCK_CELLS = ${BLOCK_CELLS}u;
37
- const FLUID_CURL_BLOCK_ROUNDS = ${Math.ceil(BLOCK_CELLS / (GRID_TILE_SIZE[0] * GRID_TILE_SIZE[1] * GRID_TILE_SIZE[2]))}u;
38
-
39
- // the centre velocity over the block, a component an array: 3 × ${BLOCK_CELLS} × 4 bytes
40
- var<workgroup> fluid_curl_u: array<f32, FLUID_CURL_BLOCK_CELLS>;
41
- var<workgroup> fluid_curl_v: array<f32, FLUID_CURL_BLOCK_CELLS>;
42
- var<workgroup> fluid_curl_w: array<f32, FLUID_CURL_BLOCK_CELLS>;
43
- // |ω| over the tile and one cell around it
44
- var<workgroup> fluid_curl_magnitude: array<f32, GRID_TILE_HALO_CELLS>;
45
-
46
- // where a tile-local cell, -2 to the tile's size + 1 on each axis, is in the block
47
- fn fluid_curl_block_index(local: vec3<i32>) -> u32 {
48
- return grid3d_to_index(vec3<u32>(local + vec3<i32>(2)), vec2<u32>(${BLOCK[0]}u, ${BLOCK[1]}u));
49
- }
50
-
51
- fn fluid_curl_velocity(local: vec3<i32>) -> vec3<f32> {
52
- let index = fluid_curl_block_index(local);
53
-
54
- return vec3<f32>(fluid_curl_u[index], fluid_curl_v[index], fluid_curl_w[index]);
55
- }
56
-
57
- fn fluid_curl_magnitude_at(local: vec3<i32>) -> f32 {
58
- return fluid_curl_magnitude[grid_tile_halo_index(local)];
59
- }
60
-
61
- // a window-local cell inside the window
62
- fn fluid_curl_cell_solid(cell: vec3<i32>) -> bool {
63
- return (solid[grid3d_to_index(vec3<u32>(cell), step.cells.size.xy)] & FLUID_SOLID_FLAG) != 0u;
64
- }
65
-
66
- // a cell the curl is taken at, as the CPU takes it: inside the window, off its edge ring, fluid
67
- fn fluid_curl_interior(cell: vec3<i32>) -> bool {
68
- let last = vec3<i32>(step.cells.size) - vec3<i32>(1);
69
-
70
- if (any(cell < vec3<i32>(1)) || any(cell >= last)) {
71
- return false;
72
- }
73
-
74
- return !fluid_curl_cell_solid(cell);
75
- }
76
-
77
- // the persistent velocity, toroidal through its windows; a window-local face inside the window
78
- fn fluid_curl_face_u(face: vec3<i32>) -> f32 {
79
- return textureLoad(source_u, grid_tile_window_storage(face, step.faces_u.corner_storage, step.faces_u.period), 0).r;
80
- }
81
-
82
- fn fluid_curl_face_v(face: vec3<i32>) -> f32 {
83
- return textureLoad(source_v, grid_tile_window_storage(face, step.faces_v.corner_storage, step.faces_v.period), 0).r;
84
- }
85
-
86
- fn fluid_curl_face_w(face: vec3<i32>) -> f32 {
87
- return textureLoad(source_w, grid_tile_window_storage(face, step.faces_w.corner_storage, step.faces_w.period), 0).r;
88
- }
89
-
90
- fn fluid_curl_omega(local: vec3<i32>) -> vec3<f32> {
91
- return v3_mac_curl(
92
- fluid_curl_velocity(local - vec3<i32>(1, 0, 0)), fluid_curl_velocity(local + vec3<i32>(1, 0, 0)),
93
- fluid_curl_velocity(local - vec3<i32>(0, 1, 0)), fluid_curl_velocity(local + vec3<i32>(0, 1, 0)),
94
- fluid_curl_velocity(local - vec3<i32>(0, 0, 1)), fluid_curl_velocity(local + vec3<i32>(0, 0, 1))
95
- );
96
- }
97
-
98
- @compute @workgroup_size(${GRID_TILE_SIZE.join(', ')})
99
- fn main(
100
- @builtin(workgroup_id) group: vec3<u32>,
101
- @builtin(local_invocation_id) local_id: vec3<u32>,
102
- @builtin(local_invocation_index) lane: u32,
103
- ) {
104
- let origin = vec3<i32>(group) * GRID_TILE_SIZE;
105
- let size = step.cells.size;
106
-
107
- // the centre velocity over the block: 0 beyond the window and in a solid, as the CPU's pass 1
108
- for (var round = 0u; round < FLUID_CURL_BLOCK_ROUNDS; round++) {
109
- let index = round * GRID_TILE_THREADS + lane;
110
-
111
- if (index < FLUID_CURL_BLOCK_CELLS) {
112
- let cell = origin + vec3<i32>(index_to_grid3d(index, vec2<u32>(${BLOCK[0]}u, ${BLOCK[1]}u))) - vec3<i32>(2);
113
-
114
- var velocity = vec3<f32>(0.0);
115
-
116
- if (grid_tile_window_contains(cell, size) && !fluid_curl_cell_solid(cell)) {
117
- velocity = v3_mac_cell_velocity(
118
- fluid_curl_face_u(cell), fluid_curl_face_u(cell + vec3<i32>(1, 0, 0)),
119
- fluid_curl_face_v(cell), fluid_curl_face_v(cell + vec3<i32>(0, 1, 0)),
120
- fluid_curl_face_w(cell), fluid_curl_face_w(cell + vec3<i32>(0, 0, 1))
121
- );
122
- }
123
-
124
- fluid_curl_u[index] = velocity.x;
125
- fluid_curl_v[index] = velocity.y;
126
- fluid_curl_w[index] = velocity.z;
127
- }
128
- }
129
-
130
- workgroupBarrier();
131
-
132
- // |ω| over the tile and one cell around it: 0 where the CPU takes no curl
133
- for (var round = 0u; round < GRID_TILE_LOAD_ROUNDS; round++) {
134
- let index = round * GRID_TILE_THREADS + lane;
135
-
136
- if (index < GRID_TILE_HALO_CELLS) {
137
- let local = grid_tile_halo_local(index);
138
-
139
- var magnitude = 0.0;
140
-
141
- if (fluid_curl_interior(origin + local)) {
142
- magnitude = length(fluid_curl_omega(local));
143
- }
144
-
145
- fluid_curl_magnitude[index] = magnitude;
146
- }
147
- }
148
-
149
- workgroupBarrier();
150
-
151
- // the cell's force: N × ω, N the normalised gradient of |ω|, half of it a face
152
- let local = vec3<i32>(local_id);
153
- let cell = origin + local;
154
-
155
- var force = vec3<f32>(0.0);
156
-
157
- if (fluid_curl_interior(cell)) {
158
- let gradient = 0.5 * vec3<f32>(
159
- fluid_curl_magnitude_at(local + vec3<i32>(1, 0, 0)) - fluid_curl_magnitude_at(local - vec3<i32>(1, 0, 0)),
160
- fluid_curl_magnitude_at(local + vec3<i32>(0, 1, 0)) - fluid_curl_magnitude_at(local - vec3<i32>(0, 1, 0)),
161
- fluid_curl_magnitude_at(local + vec3<i32>(0, 0, 1)) - fluid_curl_magnitude_at(local - vec3<i32>(0, 0, 1))
162
- );
163
-
164
- force = v3_mac_confinement_force(fluid_curl_omega(local), gradient, step.confinement_dt);
165
- }
166
-
167
- let count = size.x * size.y * size.z;
168
- let index = grid3d_to_index(vec3<u32>(cell), size.xy);
169
-
170
- confinement[index] = force.x;
171
- confinement[count + index] = force.y;
172
- confinement[2u * count + index] = force.z;
173
- }
174
- `, [
175
- chunk_grid_tile_window,
176
- chunk_grid3d_to_index,
177
- chunk_index_to_grid3d,
178
- chunk_v3_mac_vorticity_confinement,
179
- chunk_fluid_forcing_flags,
180
- ]
181
- );
182
-
183
- /**
184
- * Pass 1 of a cascade step (GPU_FLUID_CASCADES_PROPOSAL_2026_10_16.md §8), recorded only when the step
185
- * has vorticity confinement: the curl of the step's start velocity, and from it the confinement force
186
- * of every cell, which the correct pass adds to its faces after the atmosphere identity. The WGSL twin
187
- * of `v3_mac_apply_vorticity_confinement`'s three passes, the scatter to faces left to the correct pass
188
- * as a gather (`fluid_mac_confinement_*`), so a face takes half of each of its two cells' force.
189
- *
190
- * A tile pass: 8 × 8 × 4 cells a workgroup, dispatched `(nx / 8, ny / 8, nz / 4)`, two barriers. The
191
- * workgroup holds the centre velocity of its tile and two cells around it, 12 × 12 × 8 (3 × 4,608
192
- * bytes), and `|ω|` of its tile and one cell around it (2,400 bytes): 16,224 of the 16,384 bytes a
193
- * workgroup may have.
194
- *
195
- * 1. Every cell of the block takes its centre velocity, the mean of its two faces on each axis, from
196
- * the persistent velocity through its toroidal windows; 0 beyond the window and in a solid.
197
- * 2. Every cell of the tile and its one-cell ring takes `|ω|`, `ω = ∇×v` by central differences, per
198
- * cell; 0 on the window's edge ring, beyond it and in a solid, where the CPU takes no curl.
199
- * 3. Each invocation's cell, inside that ring and fluid, takes `½·ε·dt·(N × ω)` with
200
- * `N = ∇|ω| / |∇|ω||` (`chunk_v3_mac_vorticity_confinement`), 0 below the CPU's floor; every other
201
- * cell 0.
202
- *
203
- * `ε·dt` is `step.confinement_dt`, with the cascade's own `dt`; the differences are per cell, so the
204
- * force carries the cascade's `h` as the CPU's does (Fedkiw's `ε·h·(N × ω)`).
205
- *
206
- * Bindings:
207
- * - `step`: {@link FLUID_MAC_STEP_STRUCT};
208
- * - `source_u`, `source_v`, `source_w`: the persistent velocity, toroidal through `step.faces_*`;
209
- * - `solid`: the window-local solid flags, `array<u32>`, `FLUID_SOLID_FLAG`;
210
- * - `confinement`: written, `array<f32>` of 3·N, the force's x of every cell, then y, then z, each
211
- * window-local x fastest.
212
- *
213
- * Reads a cell: 2.25 block cells of six face texels and a flag, 2.3 ring cells of six workgroup
214
- * velocities, one flag, then its own twelve velocities and six magnitudes.
215
- *
216
- * @type {ComputeShader}
217
- */
218
- export const shader_fluid_mac_curl = ComputeShader.from({
219
- label: "Fluid / MAC curl",
220
- body,
221
- resources,
222
- });
1
+ import { chunk_grid3d_to_index } from "../../shader/chunk/grid/chunk_grid3d_to_index.js";
2
+ import { chunk_grid_tile_window, GRID_TILE_SIZE } from "../../shader/chunk/grid/chunk_grid_tile_window.js";
3
+ import { chunk_index_to_grid3d } from "../../shader/chunk/grid/chunk_index_to_grid3d.js";
4
+ import { ComputeShader } from "../../shader/ComputeShader.js";
5
+ import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
6
+ import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
7
+ import { f32, u32 } from "../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
8
+ import { WebGPUArray } from "../../shader/type/WebGPUArray.js";
9
+ import { chunk_fluid_forcing_flags } from "../forcing/FLUID_FORCING.js";
10
+ import { chunk_v3_mac_vorticity_confinement } from "./chunk_v3_mac_vorticity_confinement.js";
11
+ import { FLUID_MAC_STEP_STRUCT } from "./FLUID_MAC_STEP_STRUCT.js";
12
+
13
+ /**
14
+ * The block of cells a curl workgroup holds the centre velocity of: its tile and two cells around it,
15
+ * since a tile cell's force reads `|ω|` one cell out, and `ω` there reads the velocity one further.
16
+ * @type {number[]}
17
+ */
18
+ const BLOCK = GRID_TILE_SIZE.map(n => n + 4);
19
+
20
+ const BLOCK_CELLS = BLOCK[0] * BLOCK[1] * BLOCK[2];
21
+
22
+ const resources = new ShaderResourceSetDescriptor();
23
+
24
+ resources.createGroup()
25
+ .addUniform("step", FLUID_MAC_STEP_STRUCT)
26
+ .addTexture("source_u", "unfilterable-float", "3d")
27
+ .addTexture("source_v", "unfilterable-float", "3d")
28
+ .addTexture("source_w", "unfilterable-float", "3d")
29
+ .addStorageBuffer("solid", WebGPUArray.from(u32), false)
30
+ // the force, x of every cell, then y, then z, each window-local x fastest
31
+ .addStorageBuffer("confinement", WebGPUArray.from(f32), true);
32
+
33
+ const body = CodeChunk.from(
34
+ //language=WGSL
35
+ `
36
+ const FLUID_CURL_BLOCK_CELLS = ${BLOCK_CELLS}u;
37
+ const FLUID_CURL_BLOCK_ROUNDS = ${Math.ceil(BLOCK_CELLS / (GRID_TILE_SIZE[0] * GRID_TILE_SIZE[1] * GRID_TILE_SIZE[2]))}u;
38
+ const FLUID_CURL_BLOCK_STRIDE_Y = ${BLOCK[0]}u;
39
+ const FLUID_CURL_BLOCK_STRIDE_Z = ${BLOCK[0] * BLOCK[1]}u;
40
+ const FLUID_CURL_HALO_STRIDE_Y = 10u;
41
+ const FLUID_CURL_HALO_STRIDE_Z = 100u;
42
+ const FLUID_CURL_EXCLUDED_BITS = 0x80000000u;
43
+
44
+ // the centre velocity over the block, a component an array: 3 × ${BLOCK_CELLS} × 4 bytes
45
+ var<workgroup> fluid_curl_u: array<f32, FLUID_CURL_BLOCK_CELLS>;
46
+ var<workgroup> fluid_curl_v: array<f32, FLUID_CURL_BLOCK_CELLS>;
47
+ var<workgroup> fluid_curl_w: array<f32, FLUID_CURL_BLOCK_CELLS>;
48
+ // |ω| over the tile and one cell around it
49
+ var<workgroup> fluid_curl_magnitude: array<f32, GRID_TILE_HALO_CELLS>;
50
+
51
+ // where a tile-local cell, -2 to the tile's size + 1 on each axis, is in the block
52
+ fn fluid_curl_block_index(local: vec3<i32>) -> u32 {
53
+ return grid3d_to_index(vec3<u32>(local + vec3<i32>(2)), vec2<u32>(${BLOCK[0]}u, ${BLOCK[1]}u));
54
+ }
55
+
56
+ // a window-local cell inside the window
57
+ fn fluid_curl_cell_solid(cell: vec3<i32>) -> bool {
58
+ return (solid[grid3d_to_index(vec3<u32>(cell), step.cells.size.xy)] & FLUID_SOLID_FLAG) != 0u;
59
+ }
60
+
61
+ // whether a block-staged cell is interior to the window (off its edge ring) and fluid; solid cells
62
+ // staged FLUID_CURL_EXCLUDED_BITS (-0.0) into fluid_curl_u during phase 1 so phase 2 never re-reads
63
+ // the global solid buffer
64
+ fn fluid_curl_interior_staged(block_idx: u32, cell: vec3<i32>, last: vec3<i32>) -> bool {
65
+ if (any(cell < vec3<i32>(1)) || any(cell >= last)) {
66
+ return false;
67
+ }
68
+
69
+ return bitcast<u32>(fluid_curl_u[block_idx]) != FLUID_CURL_EXCLUDED_BITS;
70
+ }
71
+
72
+ fn fluid_curl_omega_indexed(idx: u32) -> vec3<f32> {
73
+ let x_low = vec3<f32>(0.0, fluid_curl_v[idx - 1u], fluid_curl_w[idx - 1u]);
74
+ let x_high = vec3<f32>(0.0, fluid_curl_v[idx + 1u], fluid_curl_w[idx + 1u]);
75
+ let y_low = vec3<f32>(fluid_curl_u[idx - FLUID_CURL_BLOCK_STRIDE_Y], 0.0, fluid_curl_w[idx - FLUID_CURL_BLOCK_STRIDE_Y]);
76
+ let y_high = vec3<f32>(fluid_curl_u[idx + FLUID_CURL_BLOCK_STRIDE_Y], 0.0, fluid_curl_w[idx + FLUID_CURL_BLOCK_STRIDE_Y]);
77
+ let z_low = vec3<f32>(fluid_curl_u[idx - FLUID_CURL_BLOCK_STRIDE_Z], fluid_curl_v[idx - FLUID_CURL_BLOCK_STRIDE_Z], 0.0);
78
+ let z_high = vec3<f32>(fluid_curl_u[idx + FLUID_CURL_BLOCK_STRIDE_Z], fluid_curl_v[idx + FLUID_CURL_BLOCK_STRIDE_Z], 0.0);
79
+
80
+ return v3_mac_curl(x_low, x_high, y_low, y_high, z_low, z_high);
81
+ }
82
+
83
+ // maps lane in 0..255 to the 256 6-face exterior halo cells around the 8x8x4 interior tile:
84
+ // 2*(8*4) x-faces + 2*(8*4) y-faces + 2*(8*8) z-faces = 64 + 64 + 128 = 256 cells
85
+ fn fluid_curl_face_halo_local(lane: u32) -> vec3<i32> {
86
+ if (lane < 64u) {
87
+ return vec3<i32>(
88
+ select(-1, 8, (lane & 32u) != 0u),
89
+ i32(lane & 7u),
90
+ i32((lane >> 3u) & 3u)
91
+ );
92
+ }
93
+
94
+ if (lane < 128u) {
95
+ return vec3<i32>(
96
+ i32(lane & 7u),
97
+ select(-1, 8, (lane & 32u) != 0u),
98
+ i32((lane >> 3u) & 3u)
99
+ );
100
+ }
101
+
102
+ return vec3<i32>(
103
+ i32(lane & 7u),
104
+ i32((lane >> 3u) & 7u),
105
+ select(-1, 4, (lane & 64u) != 0u)
106
+ );
107
+ }
108
+
109
+ @compute @workgroup_size(${GRID_TILE_SIZE.join(', ')})
110
+ fn main(
111
+ @builtin(workgroup_id) group: vec3<u32>,
112
+ @builtin(local_invocation_id) local_id: vec3<u32>,
113
+ @builtin(local_invocation_index) lane: u32,
114
+ ) {
115
+ let origin = vec3<i32>(group) * GRID_TILE_SIZE;
116
+ let size = step.cells.size;
117
+ let last = vec3<i32>(size) - vec3<i32>(1);
118
+
119
+ // the centre velocity over the block: 0 beyond the window and in a solid, as the CPU's pass 1.
120
+ // Cells with L1 distance > 2 from the 8x8x4 interior tile are never read by the 6-point curl stencil
121
+ // on the interior + 6-face halo cells, so they skip global solid/texture reads.
122
+ for (var round = 0u; round < FLUID_CURL_BLOCK_ROUNDS; round++) {
123
+ let index = round * GRID_TILE_THREADS + lane;
124
+
125
+ if (index < FLUID_CURL_BLOCK_CELLS) {
126
+ let block_local = vec3<i32>(index_to_grid3d(index, vec2<u32>(${BLOCK[0]}u, ${BLOCK[1]}u))) - vec3<i32>(2);
127
+ let dist_out = max(vec3<i32>(0), max(-block_local, block_local - vec3<i32>(7, 7, 3)));
128
+ let cell = origin + block_local;
129
+
130
+ var ux = bitcast<f32>(FLUID_CURL_EXCLUDED_BITS);
131
+ var uy = 0.0;
132
+ var uz = 0.0;
133
+
134
+ if ((dist_out.x + dist_out.y + dist_out.z) <= 2 && grid_tile_window_contains(cell, size) && !fluid_curl_cell_solid(cell)) {
135
+ let u0 = grid_tile_window_storage(cell, step.faces_u.corner_storage, step.faces_u.period);
136
+ let u1 = vec3<u32>(select(u0.x + 1u, 0u, u0.x + 1u == step.faces_u.period.x), u0.y, u0.z);
137
+ let v0 = grid_tile_window_storage(cell, step.faces_v.corner_storage, step.faces_v.period);
138
+ let v1 = vec3<u32>(v0.x, select(v0.y + 1u, 0u, v0.y + 1u == step.faces_v.period.y), v0.z);
139
+ let w0 = grid_tile_window_storage(cell, step.faces_w.corner_storage, step.faces_w.period);
140
+ let w1 = vec3<u32>(w0.x, w0.y, select(w0.z + 1u, 0u, w0.z + 1u == step.faces_w.period.z));
141
+
142
+ let velocity = v3_mac_cell_velocity(
143
+ textureLoad(source_u, u0, 0).r, textureLoad(source_u, u1, 0).r,
144
+ textureLoad(source_v, v0, 0).r, textureLoad(source_v, v1, 0).r,
145
+ textureLoad(source_w, w0, 0).r, textureLoad(source_w, w1, 0).r
146
+ );
147
+ ux = select(velocity.x, 0.0, velocity.x == 0.0);
148
+ uy = velocity.y;
149
+ uz = velocity.z;
150
+ }
151
+
152
+ fluid_curl_u[index] = ux;
153
+ fluid_curl_v[index] = uy;
154
+ fluid_curl_w[index] = uz;
155
+ }
156
+ }
157
+
158
+ workgroupBarrier();
159
+
160
+ let local = vec3<i32>(local_id);
161
+ let cell = origin + local;
162
+ let own_block_idx = fluid_curl_block_index(local);
163
+ let own_halo_idx = grid_tile_halo_index(local);
164
+ let interior = fluid_curl_interior_staged(own_block_idx, cell, last);
165
+
166
+ var omega = vec3<f32>(0.0);
167
+ var own_magnitude = 0.0;
168
+
169
+ if (interior) {
170
+ omega = fluid_curl_omega_indexed(own_block_idx);
171
+ own_magnitude = length(omega);
172
+ }
173
+
174
+ fluid_curl_magnitude[own_halo_idx] = own_magnitude;
175
+
176
+ // |ω| over the 256 6-face exterior halo cells around the 8x8x4 tile (1 cell per lane, 0 loops)
177
+ let halo_local = fluid_curl_face_halo_local(lane);
178
+ let halo_block_idx = fluid_curl_block_index(halo_local);
179
+ var halo_magnitude = 0.0;
180
+
181
+ if (fluid_curl_interior_staged(halo_block_idx, origin + halo_local, last)) {
182
+ halo_magnitude = length(fluid_curl_omega_indexed(halo_block_idx));
183
+ }
184
+
185
+ fluid_curl_magnitude[grid_tile_halo_index(halo_local)] = halo_magnitude;
186
+
187
+ workgroupBarrier();
188
+
189
+ // the cell's force: N × ω, N the normalised gradient of |ω|, half of it a face
190
+ var force = vec3<f32>(0.0);
191
+
192
+ if (interior) {
193
+ let gradient = 0.5 * vec3<f32>(
194
+ fluid_curl_magnitude[own_halo_idx + 1u] - fluid_curl_magnitude[own_halo_idx - 1u],
195
+ fluid_curl_magnitude[own_halo_idx + FLUID_CURL_HALO_STRIDE_Y] - fluid_curl_magnitude[own_halo_idx - FLUID_CURL_HALO_STRIDE_Y],
196
+ fluid_curl_magnitude[own_halo_idx + FLUID_CURL_HALO_STRIDE_Z] - fluid_curl_magnitude[own_halo_idx - FLUID_CURL_HALO_STRIDE_Z]
197
+ );
198
+
199
+ force = v3_mac_confinement_force(omega, gradient, step.confinement_dt);
200
+ }
201
+
202
+ let count = size.x * size.y * size.z;
203
+ let index = grid3d_to_index(vec3<u32>(cell), size.xy);
204
+
205
+ confinement[index] = force.x;
206
+ confinement[count + index] = force.y;
207
+ confinement[2u * count + index] = force.z;
208
+ }
209
+ `, [
210
+ chunk_grid_tile_window,
211
+ chunk_grid3d_to_index,
212
+ chunk_index_to_grid3d,
213
+ chunk_v3_mac_vorticity_confinement,
214
+ chunk_fluid_forcing_flags,
215
+ ]
216
+ );
217
+
218
+ /**
219
+ * Pass 1 of a cascade step (GPU_FLUID_CASCADES_PROPOSAL_2026_10_16.md §8), recorded only when the step
220
+ * has vorticity confinement: the curl of the step's start velocity, and from it the confinement force
221
+ * of every cell, which the correct pass adds to its faces after the atmosphere identity. The WGSL twin
222
+ * of `v3_mac_apply_vorticity_confinement`'s three passes, the scatter to faces left to the correct pass
223
+ * as a gather (`fluid_mac_confinement_*`), so a face takes half of each of its two cells' force.
224
+ *
225
+ * A tile pass: 8 × 8 × 4 cells a workgroup, dispatched `(nx / 8, ny / 8, nz / 4)`, two barriers. The
226
+ * workgroup holds the centre velocity of its tile and two cells around it, 12 × 12 × 8 (3 × 4,608
227
+ * bytes), and `|ω|` of its tile and one cell around it (2,400 bytes): 16,224 of the 16,384 bytes a
228
+ * workgroup may have.
229
+ *
230
+ * 1. Every cell of the block takes its centre velocity, the mean of its two faces on each axis, from
231
+ * the persistent velocity through its toroidal windows; 0 beyond the window and in a solid (encoded
232
+ * as `-0.0` in `fluid_curl_u` so subsequent phases check solidness from workgroup memory without
233
+ * re-reading `solid`).
234
+ * 2. Every interior cell evaluates its `ω = ∇×v` once (holding `ω` in registers across the second
235
+ * barrier) and writes `|ω|` to the tile, while the 344 exterior halo cells evaluate `|ω|` in two
236
+ * rounds; 0 on the window's edge ring, beyond it and in a solid, where the CPU takes no curl.
237
+ * 3. Each invocation's cell, inside that ring and fluid, takes `½·ε·dt·(N × ω)` with
238
+ * `N = ∇|ω| / |∇|ω||` (`chunk_v3_mac_vorticity_confinement`), 0 below the CPU's floor; every other
239
+ * cell 0.
240
+ *
241
+ * `ε·dt` is `step.confinement_dt`, with the cascade's own `dt`; the differences are per cell, so the
242
+ * force carries the cascade's `h` as the CPU's does (Fedkiw's `ε·h·(N × ω)`).
243
+ *
244
+ * Bindings:
245
+ * - `step`: {@link FLUID_MAC_STEP_STRUCT};
246
+ * - `source_u`, `source_v`, `source_w`: the persistent velocity, toroidal through `step.faces_*`;
247
+ * - `solid`: the window-local solid flags, `array<u32>`, `FLUID_SOLID_FLAG`;
248
+ * - `confinement`: written, `array<f32>` of 3·N, the force's x of every cell, then y, then z, each
249
+ * window-local x fastest.
250
+ *
251
+ * @type {ComputeShader}
252
+ */
253
+ export const shader_fluid_mac_curl = ComputeShader.from({
254
+ label: "Fluid / MAC curl",
255
+ body,
256
+ resources,
257
+ });
@@ -1,12 +1,12 @@
1
1
  /**
2
- * The right-hand side of the pressure solve over one cascade window
3
- * (GPU_FLUID_CASCADES_PROPOSAL_2026_10_16.md §8, pass 4): `f = div/dt` at every cell, `div` the MAC
4
- * divergence over h, and 0 in a solid cell. Pinned faces are read at their value, the wall's
5
- * velocity.
2
+ * The right-hand side and finest-level multigrid weights of the pressure solve over one cascade window
3
+ * (GPU_FLUID_CASCADES_PROPOSAL_2026_10_16.md §8, pass 4): `f = div/dt` and `fluid_mg_level0_word` at
4
+ * every cell, `div` the MAC divergence over h, and 0 in a solid cell. Pinned faces are read at their
5
+ * value, the wall's velocity.
6
6
  *
7
7
  * One invocation a cell, in 8 × 8 × 4 workgroups over the window, dispatched `(nx / 8, ny / 8, nz / 4)`.
8
- * Each reads its cell's six faces straight from the textures and its solid flag: 6 texels and 1 flag a
9
- * cell. Every face a window cell reads lies inside the window.
8
+ * Each reads its cell's six faces straight from the textures and its solid flags: 6 texels and up to 7
9
+ * flags a cell. Every face a window cell reads lies inside the window.
10
10
  *
11
11
  * Direct reads, not a tile in workgroup memory: an LDS tile with a one-cell halo (3 × 600 texels a
12
12
  * workgroup, 7.0 a cell) measured 2× slower on an RTX 4090 (D3D12, paired, 200 dispatches an arm, the
@@ -17,7 +17,8 @@
17
17
  * - `velocity_u`, `velocity_v`, `velocity_w`: the advected velocity, `r32float` 3-D textures,
18
18
  * window-local; beyond the window the far field;
19
19
  * - `solid`: the window-local solid flags, `array<u32>`, bit 0;
20
- * - `rhs`: written, `array<f32>`, window-local, x fastest.
20
+ * - `rhs`: written, `array<f32>`, window-local, x fastest;
21
+ * - `words`: written, `array<u32>`, the finest level's weight words, window-local, x fastest.
21
22
  *
22
23
  * @type {ComputeShader}
23
24
  */
@@ -1 +1 @@
1
- {"version":3,"file":"shader_fluid_mac_divergence.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/fluid/mac/shader_fluid_mac_divergence.js"],"names":[],"mappings":"AAgEA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,0CAFU,aAAa,CAMpB;8BAxF2B,+BAA+B"}
1
+ {"version":3,"file":"shader_fluid_mac_divergence.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/fluid/mac/shader_fluid_mac_divergence.js"],"names":[],"mappings":"AA0FA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,0CAFU,aAAa,CAMpB;8BAnH2B,+BAA+B"}