@woosh/meep-engine 3.55.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 (650) 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/ecs/transform/Transform64.d.ts +21 -0
  176. package/src/engine/ecs/transform/Transform64.d.ts.map +1 -1
  177. package/src/engine/ecs/transform/Transform64.js +26 -0
  178. package/src/engine/graphics/sh3/path_tracer/geometry/sort_triangles_by_distance_to_point.js +1 -1
  179. package/src/engine/graphics/texture/sampler/sampler2d_channel_compute_min_indices.js +1 -1
  180. package/src/engine/graphics3/WaterSystem.d.ts.map +1 -1
  181. package/src/engine/graphics3/WaterSystem.js +2 -1
  182. package/src/engine/graphics3/prefab/prefab_skin_frame.d.ts.map +1 -1
  183. package/src/engine/graphics3/prefab/prefab_skin_frame.js +1 -12
  184. package/src/engine/grid/grid2transform/GridPosition2TransformSystem.d.ts +1 -1
  185. package/src/engine/grid/grid2transform/GridPosition2TransformSystem.d.ts.map +1 -1
  186. package/src/engine/grid/grid2transform/GridPosition2TransformSystem.js +141 -137
  187. package/src/engine/input/ecs/systems/InputControllerSystem.d.ts.map +1 -1
  188. package/src/engine/input/ecs/systems/InputControllerSystem.js +13 -3
  189. package/src/engine/input/ecs/systems/InputSystem.d.ts.map +1 -1
  190. package/src/engine/input/ecs/systems/InputSystem.js +2 -1
  191. package/src/engine/intelligence/behavior/composite/ParallelBehavior.d.ts +1 -1
  192. package/src/engine/intelligence/behavior/composite/ParallelBehavior.d.ts.map +1 -1
  193. package/src/engine/intelligence/behavior/composite/ParallelBehavior.js +4 -1
  194. package/src/engine/intelligence/behavior/decorator/InvertStatusBehavior.d.ts.map +1 -1
  195. package/src/engine/intelligence/behavior/decorator/InvertStatusBehavior.js +3 -1
  196. package/src/engine/intelligence/behavior/decorator/RepeatBehavior.d.ts.map +1 -1
  197. package/src/engine/intelligence/behavior/decorator/RepeatBehavior.js +3 -1
  198. package/src/engine/intelligence/behavior/decorator/RepeatBehaviorSerializationAdapter.d.ts.map +1 -1
  199. package/src/engine/intelligence/behavior/decorator/RepeatBehaviorSerializationAdapter.js +39 -33
  200. package/src/engine/intelligence/behavior/util/ConditionalBehavior.d.ts +5 -0
  201. package/src/engine/intelligence/behavior/util/ConditionalBehavior.d.ts.map +1 -1
  202. package/src/engine/intelligence/behavior/util/ConditionalBehavior.js +93 -75
  203. package/src/engine/intelligence/behavior/util/RotationBehavior.d.ts.map +1 -1
  204. package/src/engine/intelligence/behavior/util/RotationBehavior.js +79 -76
  205. package/src/engine/intelligence/blackboard/BlackboardStack.d.ts +1 -0
  206. package/src/engine/intelligence/blackboard/BlackboardStack.d.ts.map +1 -1
  207. package/src/engine/intelligence/blackboard/BlackboardStack.js +159 -123
  208. package/src/engine/intelligence/mcts/StateNode.d.ts.map +1 -1
  209. package/src/engine/intelligence/mcts/StateNode.js +366 -364
  210. package/src/engine/intelligence/resource/ResourceAllocationSolver.js +1 -1
  211. package/src/engine/navigation/ecs/components/Path.d.ts.map +1 -1
  212. package/src/engine/navigation/ecs/components/Path.js +2 -1
  213. package/src/engine/navigation/ecs/path_following/PathFollowingSystem.d.ts.map +1 -1
  214. package/src/engine/navigation/ecs/path_following/PathFollowingSystem.js +5 -2
  215. package/src/engine/physics/body/SolverBodyState.d.ts.map +1 -1
  216. package/src/engine/physics/body/SolverBodyState.js +2 -6
  217. package/src/engine/physics/ccd/linear_sweep.d.ts.map +1 -1
  218. package/src/engine/physics/ccd/linear_sweep.js +3 -16
  219. package/src/engine/physics/cloth/build/cloth_proxy_from_joints.d.ts.map +1 -1
  220. package/src/engine/physics/cloth/build/cloth_proxy_from_joints.js +2 -16
  221. package/src/engine/physics/cloth/ecs/cloth_build_rows.d.ts +13 -1
  222. package/src/engine/physics/cloth/ecs/cloth_build_rows.d.ts.map +1 -1
  223. package/src/engine/physics/cloth/ecs/cloth_build_rows.js +15 -4
  224. package/src/engine/physics/ecs/PhysicsSystem.d.ts.map +1 -1
  225. package/src/engine/physics/ecs/PhysicsSystem.js +2 -5
  226. package/src/engine/physics/inertia/locked_inverse_inertia.d.ts +12 -0
  227. package/src/engine/physics/inertia/locked_inverse_inertia.d.ts.map +1 -0
  228. package/src/engine/physics/inertia/locked_inverse_inertia.js +22 -0
  229. package/src/engine/physics/integration/integrate_velocity.d.ts.map +1 -1
  230. package/src/engine/physics/integration/integrate_velocity.js +3 -18
  231. package/src/engine/physics/mls-mpm/MLS_MPM.d.ts +1 -0
  232. package/src/engine/physics/mls-mpm/MLS_MPM.d.ts.map +1 -1
  233. package/src/engine/physics/mls-mpm/MLS_MPM.js +5 -4
  234. package/src/engine/physics/narrowphase/convex_decomposition.d.ts.map +1 -1
  235. package/src/engine/physics/narrowphase/convex_decomposition.js +7 -16
  236. package/src/engine/physics/vehicle/RaycastVehicle.d.ts.map +1 -1
  237. package/src/engine/physics/vehicle/RaycastVehicle.js +15 -5
  238. package/src/engine/save/StorageBackedList.d.ts +5 -0
  239. package/src/engine/save/StorageBackedList.d.ts.map +1 -1
  240. package/src/engine/save/StorageBackedList.js +161 -144
  241. package/src/engine/simulation/Ticker.d.ts.map +1 -1
  242. package/src/engine/simulation/Ticker.js +394 -391
  243. package/src/engine/sound/simulation/probe/AcousticProbeField.d.ts.map +1 -1
  244. package/src/engine/sound/simulation/probe/AcousticProbeField.js +6 -19
  245. package/src/engine/sound/simulation/probe/probe_edge_visible.d.ts +15 -0
  246. package/src/engine/sound/simulation/probe/probe_edge_visible.d.ts.map +1 -1
  247. package/src/engine/sound/simulation/probe/probe_edge_visible.js +59 -41
  248. package/src/engine/sound/simulation/probe/probe_refine_connectivity.d.ts.map +1 -1
  249. package/src/engine/sound/simulation/probe/probe_refine_connectivity.js +164 -181
  250. package/src/engine/sound/simulation/render/FoaProbeReverbRenderer.d.ts.map +1 -1
  251. package/src/engine/sound/simulation/render/FoaProbeReverbRenderer.js +20 -5
  252. package/src/format/image/avif/av1/decode/Av1FrameContext.d.ts.map +1 -1
  253. package/src/format/image/avif/av1/decode/Av1FrameContext.js +3 -10
  254. package/src/format/image/avif/av1/decode/reconstruct.d.ts +20 -0
  255. package/src/format/image/avif/av1/decode/reconstruct.d.ts.map +1 -1
  256. package/src/format/image/avif/av1/decode/reconstruct.js +22 -9
  257. package/src/format/image/avif/av1/encode/choose_restoration.js +2 -18
  258. package/src/format/image/avif/av1/encode/quantise.d.ts.map +1 -1
  259. package/src/format/image/avif/av1/encode/quantise.js +1 -55
  260. package/src/format/image/avif/av1/filter/loop_restoration.d.ts +9 -0
  261. package/src/format/image/avif/av1/filter/loop_restoration.d.ts.map +1 -1
  262. package/src/format/image/avif/av1/filter/loop_restoration.js +1 -1
  263. package/src/format/texture/basis/transcode/etc1s_to_bc7.js +2 -33
  264. package/src/format/texture/basis/transcode/fit_endpoints.d.ts +11 -0
  265. package/src/format/texture/basis/transcode/fit_endpoints.d.ts.map +1 -1
  266. package/src/format/texture/basis/transcode/fit_endpoints.js +1 -1
  267. package/src/format/texture/basis/uastc/uastc_decode_block.d.ts.map +1 -1
  268. package/src/format/texture/basis/uastc/uastc_decode_block.js +2 -19
  269. package/src/generation/foliage/ANNUAL_SHOOTS_BRIEF_2026_10_25.md +220 -0
  270. package/src/generation/foliage/CROWN_FILLING_BRIEF_2026_10_26.md +172 -0
  271. package/src/generation/foliage/FOLIAGE_DESIGN.md +165 -15
  272. package/src/generation/foliage/LEAF_ARCHITECTURE_BRIEF_2026_10_26.md +158 -0
  273. package/src/generation/foliage/SHOOT_SYSTEMS_ALL_SPECIES_BRIEF_2026_10_26.md +248 -0
  274. package/src/generation/foliage/SPEEDTREE_COMPARISON_2026_10_24.md +694 -0
  275. package/src/generation/foliage/analysis/CrownOpacity.d.ts +118 -0
  276. package/src/generation/foliage/analysis/CrownOpacity.d.ts.map +1 -0
  277. package/src/generation/foliage/analysis/CrownOpacity.js +182 -0
  278. package/src/generation/foliage/analysis/crown_opacity_frames.d.ts +10 -0
  279. package/src/generation/foliage/analysis/crown_opacity_frames.d.ts.map +1 -0
  280. package/src/generation/foliage/analysis/crown_opacity_frames.js +132 -0
  281. package/src/generation/foliage/analysis/crown_opacity_measure.d.ts +51 -0
  282. package/src/generation/foliage/analysis/crown_opacity_measure.d.ts.map +1 -0
  283. package/src/generation/foliage/analysis/crown_opacity_measure.js +649 -0
  284. package/src/generation/foliage/analysis/foliage_measure_leaf_area.d.ts +66 -0
  285. package/src/generation/foliage/analysis/foliage_measure_leaf_area.d.ts.map +1 -0
  286. package/src/generation/foliage/analysis/foliage_measure_leaf_area.js +192 -0
  287. package/src/generation/foliage/analysis/tree_crown_opacity.d.ts +27 -0
  288. package/src/generation/foliage/analysis/tree_crown_opacity.d.ts.map +1 -0
  289. package/src/generation/foliage/analysis/tree_crown_opacity.js +58 -0
  290. package/src/generation/foliage/animation/build_tree_wind_rig.d.ts +3 -2
  291. package/src/generation/foliage/animation/build_tree_wind_rig.d.ts.map +1 -1
  292. package/src/generation/foliage/animation/build_tree_wind_rig.js +12 -30
  293. package/src/generation/foliage/animation/tree_wind_bend_limit.d.ts +12 -0
  294. package/src/generation/foliage/animation/tree_wind_bend_limit.d.ts.map +1 -0
  295. package/src/generation/foliage/animation/tree_wind_bend_limit.js +13 -0
  296. package/src/generation/foliage/asset/TreeAsset.d.ts +5 -0
  297. package/src/generation/foliage/asset/TreeAsset.d.ts.map +1 -1
  298. package/src/generation/foliage/asset/TreeAsset.js +6 -0
  299. package/src/generation/foliage/asset/generate_tree.d.ts.map +1 -1
  300. package/src/generation/foliage/asset/generate_tree.js +23 -6
  301. package/src/generation/foliage/config/{BranchLevelConfig.d.ts → BranchGeneratorConfig.d.ts} +61 -75
  302. package/src/generation/foliage/config/BranchGeneratorConfig.d.ts.map +1 -0
  303. package/src/generation/foliage/config/{BranchLevelConfig.js → BranchGeneratorConfig.js} +83 -126
  304. package/src/generation/foliage/config/BranchSpawnRule.d.ts +118 -0
  305. package/src/generation/foliage/config/BranchSpawnRule.d.ts.map +1 -0
  306. package/src/generation/foliage/config/BranchSpawnRule.js +217 -0
  307. package/src/generation/foliage/config/FoliageCardType.d.ts +1 -1
  308. package/src/generation/foliage/config/FoliageCardType.js +2 -2
  309. package/src/generation/foliage/config/FoliageConfig.d.ts +23 -45
  310. package/src/generation/foliage/config/FoliageConfig.d.ts.map +1 -1
  311. package/src/generation/foliage/config/FoliageConfig.js +47 -93
  312. package/src/generation/foliage/config/FoliageMaterialConfig.d.ts +12 -20
  313. package/src/generation/foliage/config/FoliageMaterialConfig.d.ts.map +1 -1
  314. package/src/generation/foliage/config/FoliageMaterialConfig.js +261 -279
  315. package/src/generation/foliage/config/FoliageSpawnRule.d.ts +77 -0
  316. package/src/generation/foliage/config/FoliageSpawnRule.d.ts.map +1 -0
  317. package/src/generation/foliage/config/FoliageSpawnRule.js +135 -0
  318. package/src/generation/foliage/config/FoliageTileContent.d.ts +9 -0
  319. package/src/generation/foliage/config/FoliageTileContent.d.ts.map +1 -0
  320. package/src/generation/foliage/config/FoliageTileContent.js +12 -0
  321. package/src/generation/foliage/config/LeafApexShape.d.ts +12 -0
  322. package/src/generation/foliage/config/LeafApexShape.d.ts.map +1 -0
  323. package/src/generation/foliage/config/LeafApexShape.js +17 -0
  324. package/src/generation/foliage/config/LeafArchitecture.d.ts +155 -0
  325. package/src/generation/foliage/config/LeafArchitecture.d.ts.map +1 -0
  326. package/src/generation/foliage/config/LeafArchitecture.js +288 -0
  327. package/src/generation/foliage/config/LeafBaseShape.d.ts +14 -0
  328. package/src/generation/foliage/config/LeafBaseShape.d.ts.map +1 -0
  329. package/src/generation/foliage/config/LeafBaseShape.js +21 -0
  330. package/src/generation/foliage/config/LeafLobation.d.ts +10 -0
  331. package/src/generation/foliage/config/LeafLobation.d.ts.map +1 -0
  332. package/src/generation/foliage/config/LeafLobation.js +14 -0
  333. package/src/generation/foliage/config/PhyllotaxisMode.d.ts +11 -0
  334. package/src/generation/foliage/config/PhyllotaxisMode.d.ts.map +1 -1
  335. package/src/generation/foliage/config/PhyllotaxisMode.js +36 -0
  336. package/src/generation/foliage/config/ShootBudZone.d.ts +105 -0
  337. package/src/generation/foliage/config/ShootBudZone.d.ts.map +1 -0
  338. package/src/generation/foliage/config/ShootBudZone.js +219 -0
  339. package/src/generation/foliage/config/ShootGrowthConfig.d.ts +84 -0
  340. package/src/generation/foliage/config/ShootGrowthConfig.d.ts.map +1 -0
  341. package/src/generation/foliage/config/ShootGrowthConfig.js +146 -0
  342. package/src/generation/foliage/config/ShootSystemRule.d.ts +144 -0
  343. package/src/generation/foliage/config/ShootSystemRule.d.ts.map +1 -0
  344. package/src/generation/foliage/config/ShootSystemRule.js +316 -0
  345. package/src/generation/foliage/config/TreeLODConfig.d.ts +1 -1
  346. package/src/generation/foliage/config/TreeLODConfig.js +1 -1
  347. package/src/generation/foliage/config/TreeSpeciesConfig.d.ts +40 -8
  348. package/src/generation/foliage/config/TreeSpeciesConfig.d.ts.map +1 -1
  349. package/src/generation/foliage/config/TreeSpeciesConfig.js +124 -68
  350. package/src/generation/foliage/config/TreeWindConfig.d.ts +23 -10
  351. package/src/generation/foliage/config/TreeWindConfig.d.ts.map +1 -1
  352. package/src/generation/foliage/config/TreeWindConfig.js +34 -25
  353. package/src/generation/foliage/index.d.ts +19 -2
  354. package/src/generation/foliage/index.js +63 -44
  355. package/src/generation/foliage/material/FoliageAtlasCutout.d.ts +59 -0
  356. package/src/generation/foliage/material/FoliageAtlasCutout.d.ts.map +1 -0
  357. package/src/generation/foliage/material/FoliageAtlasCutout.js +93 -0
  358. package/src/generation/foliage/material/compute_foliage_variant_atlas_layout.d.ts +26 -0
  359. package/src/generation/foliage/material/compute_foliage_variant_atlas_layout.d.ts.map +1 -0
  360. package/src/generation/foliage/material/compute_foliage_variant_atlas_layout.js +63 -0
  361. package/src/generation/foliage/material/foliage_atlas_cutout.d.ts +34 -0
  362. package/src/generation/foliage/material/foliage_atlas_cutout.d.ts.map +1 -0
  363. package/src/generation/foliage/material/foliage_atlas_cutout.js +174 -0
  364. package/src/generation/foliage/material/foliage_tile.d.ts +110 -0
  365. package/src/generation/foliage/material/foliage_tile.d.ts.map +1 -0
  366. package/src/generation/foliage/material/foliage_tile.js +286 -0
  367. package/src/generation/foliage/material/leaf_geometry.d.ts +103 -0
  368. package/src/generation/foliage/material/leaf_geometry.d.ts.map +1 -0
  369. package/src/generation/foliage/material/leaf_geometry.js +528 -0
  370. package/src/generation/foliage/material/make_foliage_material.d.ts +13 -33
  371. package/src/generation/foliage/material/make_foliage_material.d.ts.map +1 -1
  372. package/src/generation/foliage/material/make_foliage_material.js +356 -605
  373. package/src/generation/foliage/mesh/foliage_collect_attachments.d.ts +39 -4
  374. package/src/generation/foliage/mesh/foliage_collect_attachments.d.ts.map +1 -1
  375. package/src/generation/foliage/mesh/foliage_collect_attachments.js +637 -569
  376. package/src/generation/foliage/mesh/interpolate_ring_skin_weights4.d.ts +48 -0
  377. package/src/generation/foliage/mesh/interpolate_ring_skin_weights4.d.ts.map +1 -0
  378. package/src/generation/foliage/mesh/interpolate_ring_skin_weights4.js +232 -0
  379. package/src/generation/foliage/mesh/tree_mesh_build_bark.d.ts.map +1 -1
  380. package/src/generation/foliage/mesh/tree_mesh_build_bark.js +1023 -1049
  381. package/src/generation/foliage/mesh/tree_mesh_build_foliage.d.ts +9 -2
  382. package/src/generation/foliage/mesh/tree_mesh_build_foliage.d.ts.map +1 -1
  383. package/src/generation/foliage/mesh/tree_mesh_build_foliage.js +467 -454
  384. package/src/generation/foliage/presets/make_tree_species_preset.d.ts.map +1 -1
  385. package/src/generation/foliage/presets/make_tree_species_preset.js +1648 -870
  386. package/src/generation/foliage/skeleton/ShootFrameworkHash.d.ts +35 -0
  387. package/src/generation/foliage/skeleton/ShootFrameworkHash.d.ts.map +1 -0
  388. package/src/generation/foliage/skeleton/ShootFrameworkHash.js +129 -0
  389. package/src/generation/foliage/skeleton/ShootGirth.d.ts +51 -0
  390. package/src/generation/foliage/skeleton/ShootGirth.d.ts.map +1 -0
  391. package/src/generation/foliage/skeleton/ShootGirth.js +212 -0
  392. package/src/generation/foliage/skeleton/ShootLightField.d.ts +73 -0
  393. package/src/generation/foliage/skeleton/ShootLightField.d.ts.map +1 -0
  394. package/src/generation/foliage/skeleton/ShootLightField.js +197 -0
  395. package/src/generation/foliage/skeleton/TreeSkeleton.d.ts +106 -3
  396. package/src/generation/foliage/skeleton/TreeSkeleton.d.ts.map +1 -1
  397. package/src/generation/foliage/skeleton/TreeSkeleton.js +217 -39
  398. package/src/generation/foliage/skeleton/flare_lobe_phase_offset.d.ts +13 -0
  399. package/src/generation/foliage/skeleton/flare_lobe_phase_offset.d.ts.map +1 -0
  400. package/src/generation/foliage/skeleton/flare_lobe_phase_offset.js +16 -0
  401. package/src/generation/foliage/skeleton/foliage_card_density.d.ts +71 -0
  402. package/src/generation/foliage/skeleton/foliage_card_density.d.ts.map +1 -0
  403. package/src/generation/foliage/skeleton/foliage_card_density.js +101 -0
  404. package/src/generation/foliage/skeleton/foliage_senescence.d.ts +101 -0
  405. package/src/generation/foliage/skeleton/foliage_senescence.d.ts.map +1 -0
  406. package/src/generation/foliage/skeleton/foliage_senescence.js +149 -0
  407. package/src/generation/foliage/skeleton/foliage_unit_cards.d.ts +76 -0
  408. package/src/generation/foliage/skeleton/foliage_unit_cards.d.ts.map +1 -0
  409. package/src/generation/foliage/skeleton/foliage_unit_cards.js +95 -0
  410. package/src/generation/foliage/skeleton/shoot_demography.d.ts +22 -0
  411. package/src/generation/foliage/skeleton/shoot_demography.d.ts.map +1 -0
  412. package/src/generation/foliage/skeleton/shoot_demography.js +96 -0
  413. package/src/generation/foliage/skeleton/shoot_geometry.d.ts +66 -0
  414. package/src/generation/foliage/skeleton/shoot_geometry.d.ts.map +1 -0
  415. package/src/generation/foliage/skeleton/shoot_geometry.js +109 -0
  416. package/src/generation/foliage/skeleton/shoot_systems_simulate.d.ts +166 -0
  417. package/src/generation/foliage/skeleton/shoot_systems_simulate.d.ts.map +1 -0
  418. package/src/generation/foliage/skeleton/shoot_systems_simulate.js +588 -0
  419. package/src/generation/foliage/skeleton/tree_skeleton_assign_skin_joints.d.ts +28 -12
  420. package/src/generation/foliage/skeleton/tree_skeleton_assign_skin_joints.d.ts.map +1 -1
  421. package/src/generation/foliage/skeleton/tree_skeleton_assign_skin_joints.js +137 -102
  422. package/src/generation/foliage/skeleton/tree_skeleton_compute_joint_mechanics.d.ts +112 -0
  423. package/src/generation/foliage/skeleton/tree_skeleton_compute_joint_mechanics.d.ts.map +1 -0
  424. package/src/generation/foliage/skeleton/tree_skeleton_compute_joint_mechanics.js +408 -0
  425. package/src/generation/foliage/skeleton/tree_skeleton_compute_pipe_radii.d.ts.map +1 -1
  426. package/src/generation/foliage/skeleton/tree_skeleton_compute_pipe_radii.js +208 -206
  427. package/src/generation/foliage/skeleton/tree_skeleton_grow.d.ts +5 -2
  428. package/src/generation/foliage/skeleton/tree_skeleton_grow.d.ts.map +1 -1
  429. package/src/generation/foliage/skeleton/tree_skeleton_grow.js +2048 -1871
  430. package/src/generation/foliage/skeleton/tree_skeleton_grow_shoots.d.ts +17 -0
  431. package/src/generation/foliage/skeleton/tree_skeleton_grow_shoots.d.ts.map +1 -0
  432. package/src/generation/foliage/skeleton/tree_skeleton_grow_shoots.js +231 -0
  433. package/src/generation/foliage/skeleton/tree_skeleton_read_joint_motion.d.ts +14 -0
  434. package/src/generation/foliage/skeleton/tree_skeleton_read_joint_motion.d.ts.map +1 -0
  435. package/src/generation/foliage/skeleton/tree_skeleton_read_joint_motion.js +26 -0
  436. package/src/generation/foliage/skeleton/tree_skeleton_read_joint_parents.d.ts +10 -0
  437. package/src/generation/foliage/skeleton/tree_skeleton_read_joint_parents.d.ts.map +1 -0
  438. package/src/generation/foliage/skeleton/tree_skeleton_read_joint_parents.js +20 -0
  439. package/src/generation/grid/generation/road/GridTaskGenerateRoads.d.ts.map +1 -1
  440. package/src/generation/grid/generation/road/GridTaskGenerateRoads.js +4 -1
  441. package/src/generation/markers/GridCellActionPlaceMarkerGroup.d.ts +1 -0
  442. package/src/generation/markers/GridCellActionPlaceMarkerGroup.d.ts.map +1 -1
  443. package/src/generation/markers/GridCellActionPlaceMarkerGroup.js +98 -86
  444. package/src/shade/SHADER_F16_PROPOSAL_2026_10_24.md +263 -0
  445. package/src/shade/descriptor/WebGPUExtensionType.d.ts +17 -0
  446. package/src/shade/descriptor/WebGPUExtensionType.d.ts.map +1 -1
  447. package/src/shade/descriptor/WebGPUExtensionType.js +31 -1
  448. package/src/shade/playground/foliage_wind/FoliageRigOverlay.d.ts +37 -0
  449. package/src/shade/playground/foliage_wind/FoliageRigOverlay.d.ts.map +1 -0
  450. package/src/shade/playground/foliage_wind/FoliageRigOverlay.js +491 -0
  451. package/src/shade/playground/foliage_wind/foliage_world.d.ts.map +1 -1
  452. package/src/shade/playground/foliage_wind/foliage_world.js +600 -602
  453. package/src/shade/playground/foliage_wind/index.html +6 -0
  454. package/src/shade/playground/foliage_wind/main.js +14 -0
  455. package/src/shade/renderer/Renderer.d.ts +5 -0
  456. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  457. package/src/shade/renderer/Renderer.js +25 -2
  458. package/src/shade/renderer/animation/GPUAnimationManager.d.ts.map +1 -1
  459. package/src/shade/renderer/animation/GPUAnimationManager.js +2 -1
  460. package/src/shade/renderer/animation/foliage/FoliageWindJoint.d.ts +2 -1
  461. package/src/shade/renderer/animation/foliage/FoliageWindJoint.d.ts.map +1 -1
  462. package/src/shade/renderer/animation/foliage/FoliageWindJoint.js +2 -1
  463. package/src/shade/renderer/animation/foliage/chunk_foliage_wind_step.d.ts.map +1 -1
  464. package/src/shade/renderer/animation/foliage/chunk_foliage_wind_step.js +4 -2
  465. package/src/shade/renderer/buffer/table/GPUTypedTable.js +1 -1
  466. package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.d.ts.map +1 -1
  467. package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.js +403 -401
  468. package/src/shade/renderer/camera/OrbitalCameraController.d.ts +1 -62
  469. package/src/shade/renderer/camera/OrbitalCameraController.d.ts.map +1 -1
  470. package/src/shade/renderer/camera/OrbitalCameraController.js +1 -374
  471. package/src/shade/renderer/deferred/indirect/chunk_lpv_2d_cache_sample_irradiance.d.ts.map +1 -1
  472. package/src/shade/renderer/deferred/indirect/chunk_lpv_2d_cache_sample_irradiance.js +3 -0
  473. package/src/shade/renderer/deferred/indirect/chunk_lpv_sample_light.d.ts.map +1 -1
  474. package/src/shade/renderer/deferred/indirect/chunk_lpv_sample_light.js +6 -1
  475. package/src/shade/renderer/dynamic/shader_dynamic_mesh_avboit_splat.js +1 -1
  476. package/src/shade/renderer/fluid/GPUFluidCascade.d.ts +2 -2
  477. package/src/shade/renderer/fluid/GPUFluidCascade.d.ts.map +1 -1
  478. package/src/shade/renderer/fluid/GPUFluidCascade.js +6 -3
  479. package/src/shade/renderer/fluid/GPU_FLUID_OCCUPANCY_AND_SOTA_REVIEW_2026_10_26.md +361 -0
  480. package/src/shade/renderer/fluid/coupling/chunk_fluid_cascade_parent.d.ts.map +1 -1
  481. package/src/shade/renderer/fluid/coupling/chunk_fluid_cascade_parent.js +335 -241
  482. package/src/shade/renderer/fluid/coupling/shader_fluid_cascade_ghosts.d.ts.map +1 -1
  483. package/src/shade/renderer/fluid/coupling/shader_fluid_cascade_ghosts.js +108 -101
  484. package/src/shade/renderer/fluid/forcing/chunk_fluid_forcing_query_select.d.ts.map +1 -1
  485. package/src/shade/renderer/fluid/forcing/chunk_fluid_forcing_query_select.js +69 -67
  486. package/src/shade/renderer/fluid/forcing/shader_fluid_forcing_apply.d.ts +7 -6
  487. package/src/shade/renderer/fluid/forcing/shader_fluid_forcing_apply.d.ts.map +1 -1
  488. package/src/shade/renderer/fluid/forcing/shader_fluid_forcing_apply.js +341 -287
  489. package/src/shade/renderer/fluid/mac/FluidMacPasses.d.ts +6 -4
  490. package/src/shade/renderer/fluid/mac/FluidMacPasses.d.ts.map +1 -1
  491. package/src/shade/renderer/fluid/mac/FluidMacPasses.js +427 -400
  492. package/src/shade/renderer/fluid/mac/chunk_fluid_mac_seams.d.ts +10 -5
  493. package/src/shade/renderer/fluid/mac/chunk_fluid_mac_seams.d.ts.map +1 -1
  494. package/src/shade/renderer/fluid/mac/chunk_fluid_mac_seams.js +532 -190
  495. package/src/shade/renderer/fluid/mac/chunk_v3_mac_lattice_corners.d.ts.map +1 -1
  496. package/src/shade/renderer/fluid/mac/chunk_v3_mac_lattice_corners.js +231 -237
  497. package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_correct.d.ts +2 -2
  498. package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_correct.d.ts.map +1 -1
  499. package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_correct.js +282 -245
  500. package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_predict.d.ts +1 -3
  501. package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_predict.d.ts.map +1 -1
  502. package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_predict.js +139 -109
  503. package/src/shade/renderer/fluid/mac/shader_fluid_mac_curl.d.ts +6 -6
  504. package/src/shade/renderer/fluid/mac/shader_fluid_mac_curl.d.ts.map +1 -1
  505. package/src/shade/renderer/fluid/mac/shader_fluid_mac_curl.js +257 -222
  506. package/src/shade/renderer/fluid/mac/shader_fluid_mac_divergence.d.ts +8 -7
  507. package/src/shade/renderer/fluid/mac/shader_fluid_mac_divergence.d.ts.map +1 -1
  508. package/src/shade/renderer/fluid/mac/shader_fluid_mac_divergence.js +119 -92
  509. package/src/shade/renderer/fluid/mac/shader_fluid_mac_gradient.d.ts +6 -9
  510. package/src/shade/renderer/fluid/mac/shader_fluid_mac_gradient.d.ts.map +1 -1
  511. package/src/shade/renderer/fluid/mac/shader_fluid_mac_gradient.js +229 -181
  512. package/src/shade/renderer/fluid/pressure/GPUFluidPressureSolve.d.ts +17 -7
  513. package/src/shade/renderer/fluid/pressure/GPUFluidPressureSolve.d.ts.map +1 -1
  514. package/src/shade/renderer/fluid/pressure/GPUFluidPressureSolve.js +634 -621
  515. package/src/shade/renderer/fluid/pressure/shader_fluid_mg_residual_restrict.d.ts +8 -6
  516. package/src/shade/renderer/fluid/pressure/shader_fluid_mg_residual_restrict.d.ts.map +1 -1
  517. package/src/shade/renderer/fluid/pressure/shader_fluid_mg_residual_restrict.js +166 -149
  518. package/src/shade/renderer/fluid/pressure/shader_fluid_mg_smooth.d.ts +8 -6
  519. package/src/shade/renderer/fluid/pressure/shader_fluid_mg_smooth.d.ts.map +1 -1
  520. package/src/shade/renderer/fluid/pressure/shader_fluid_mg_smooth.js +219 -183
  521. package/src/shade/renderer/fluid/publish/shader_fluid_wind_publish.d.ts.map +1 -1
  522. package/src/shade/renderer/fluid/publish/shader_fluid_wind_publish.js +142 -122
  523. package/src/shade/renderer/geometry/meshlet/COMPACTION_PLAN_2026_09_16.md +674 -663
  524. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.d.ts +1 -1
  525. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.d.ts.map +1 -1
  526. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.js +63 -29
  527. package/src/shade/renderer/geometry/meshlet/build/meshoptimizer/geometry_to_meshlets_meshoptimizer.d.ts.map +1 -1
  528. package/src/shade/renderer/geometry/meshlet/build/meshoptimizer/geometry_to_meshlets_meshoptimizer.js +77 -87
  529. package/src/shade/renderer/geometry/meshlet/build/meshoptimizer/meshopt_clusterizer.d.ts.map +1 -1
  530. package/src/shade/renderer/geometry/meshlet/build/meshoptimizer/meshopt_clusterizer.js +4 -3
  531. package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.d.ts +11 -11
  532. package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.d.ts.map +1 -1
  533. package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.js +17 -19
  534. package/src/shade/renderer/global_illumination/lpv/graph_bake_irradiance_lookup_2d.js +4 -4
  535. package/src/shade/renderer/global_illumination/probe/octahedral/sample/chunk_lpv_mesh_interpolate_radiance_via_atlas.d.ts.map +1 -1
  536. package/src/shade/renderer/global_illumination/probe/octahedral/sample/chunk_lpv_mesh_interpolate_radiance_via_atlas.js +5 -1
  537. package/src/shade/renderer/loader/gltf/load_gltf.d.ts.map +1 -1
  538. package/src/shade/renderer/loader/gltf/load_gltf.js +11 -35
  539. package/src/shade/renderer/loader/usd/load_usd.d.ts.map +1 -1
  540. package/src/shade/renderer/loader/usd/load_usd.js +6 -19
  541. package/src/shade/renderer/particles/GPUParticleSystem.d.ts +2 -1
  542. package/src/shade/renderer/particles/GPUParticleSystem.d.ts.map +1 -1
  543. package/src/shade/renderer/particles/GPUParticleSystem.js +1 -1
  544. package/src/shade/renderer/particles/graph_particles_avboit.d.ts +2 -2
  545. package/src/shade/renderer/particles/graph_particles_avboit.d.ts.map +1 -1
  546. package/src/shade/renderer/particles/graph_particles_avboit.js +4 -9
  547. package/src/shade/renderer/particles/shaders/shader_particle_avboit_draw.d.ts.map +1 -1
  548. package/src/shade/renderer/particles/shaders/shader_particle_avboit_draw.js +199 -193
  549. package/src/shade/renderer/particles/shaders/shader_particle_avboit_splat.d.ts.map +1 -1
  550. package/src/shade/renderer/particles/shaders/shader_particle_avboit_splat.js +151 -143
  551. package/src/shade/renderer/postprocess/bloom/chunk_karis_blur4x4_sample.d.ts.map +1 -1
  552. package/src/shade/renderer/postprocess/bloom/chunk_karis_blur4x4_sample.js +11 -5
  553. package/src/shade/renderer/postprocess/denoise/graph_atorus_denoise_luma.d.ts.map +1 -1
  554. package/src/shade/renderer/postprocess/denoise/graph_atorus_denoise_luma.js +6 -18
  555. package/src/shade/renderer/postprocess/gtao/GTAO.js +1 -1
  556. package/src/shade/renderer/postprocess/gtao/ao_reproject_shader.d.ts.map +1 -1
  557. package/src/shade/renderer/postprocess/gtao/ao_reproject_shader.js +3 -5
  558. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao_with_irradiance.js +1 -1
  559. package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
  560. package/src/shade/renderer/postprocess/nss/chunk_nss_luma_derivative.d.ts.map +1 -1
  561. package/src/shade/renderer/postprocess/nss/chunk_nss_luma_derivative.js +7 -3
  562. package/src/shade/renderer/postprocess/nss/shader_nss_postprocess.d.ts.map +1 -1
  563. package/src/shade/renderer/postprocess/nss/shader_nss_postprocess.js +4 -2
  564. package/src/shade/renderer/postprocess/nss/shader_nss_preprocess.d.ts.map +1 -1
  565. package/src/shade/renderer/postprocess/nss/shader_nss_preprocess.js +4 -1
  566. package/src/shade/renderer/postprocess/ssr/downsample_karis.d.ts.map +1 -1
  567. package/src/shade/renderer/postprocess/ssr/downsample_karis.js +6 -3
  568. package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_temporal_accumulate.d.ts.map +1 -1
  569. package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_temporal_accumulate.js +4 -3
  570. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader.d.ts.map +1 -1
  571. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader.js +4 -1
  572. package/src/shade/renderer/postprocess/ssr/ssr_spatial_denoise_shader.d.ts.map +1 -1
  573. package/src/shade/renderer/postprocess/ssr/ssr_spatial_denoise_shader.js +4 -2
  574. package/src/shade/renderer/postprocess/taa/chunk_taa_tonemap.d.ts.map +1 -1
  575. package/src/shade/renderer/postprocess/taa/chunk_taa_tonemap.js +35 -39
  576. package/src/shade/renderer/postprocess/taa/chunk_taa_tonemap_inv.d.ts.map +1 -1
  577. package/src/shade/renderer/postprocess/taa/chunk_taa_tonemap_inv.js +20 -17
  578. package/src/shade/renderer/postprocess/taa/shader_taa.d.ts.map +1 -1
  579. package/src/shade/renderer/postprocess/taa/shader_taa.js +6 -3
  580. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.d.ts.map +1 -1
  581. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.js +3 -1
  582. package/src/shade/renderer/rasterize/native/avboit/avboit_draw_fragment_body.js +1 -1
  583. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_splat_slice.js +2 -2
  584. package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.js +1 -1
  585. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_integrate.d.ts.map +1 -1
  586. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_integrate.js +92 -83
  587. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_splat.js +1 -1
  588. package/src/shade/renderer/shader/ShaderDescriptor.d.ts.map +1 -1
  589. package/src/shade/renderer/shader/ShaderDescriptor.js +12 -4
  590. package/src/shade/renderer/shader/chunk/bvh/chunk_bvh_query_aabb_cooperative.d.ts.map +1 -1
  591. package/src/shade/renderer/shader/chunk/bvh/chunk_bvh_query_aabb_cooperative.js +294 -286
  592. package/src/shade/renderer/shader/chunk/light/lpv/chunk_lpv_interpolate_probe_irradiance8.js +5 -5
  593. package/src/shade/renderer/shader/chunk/light/lpv/chunk_lpv_mesh_interpolate_probe.d.ts.map +1 -1
  594. package/src/shade/renderer/shader/chunk/light/lpv/chunk_lpv_mesh_interpolate_probe.js +5 -3
  595. package/src/shade/renderer/shader/chunk/light/lpv/chunk_lpv_mesh_interpolate_probe_irradiance.d.ts.map +1 -1
  596. package/src/shade/renderer/shader/chunk/light/lpv/chunk_lpv_mesh_interpolate_probe_irradiance.js +9 -6
  597. package/src/shade/renderer/shader/chunk/light/lpv/chunk_lpv_sample_sh3_at.d.ts.map +1 -1
  598. package/src/shade/renderer/shader/chunk/light/lpv/chunk_lpv_sample_sh3_at.js +33 -38
  599. package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.d.ts.map +1 -1
  600. package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.js +690 -675
  601. package/src/shade/renderer/shader/type/WebGPUArray.d.ts +3 -0
  602. package/src/shade/renderer/shader/type/WebGPUArray.d.ts.map +1 -1
  603. package/src/shade/renderer/shader/type/WebGPUArray.js +185 -167
  604. package/src/shade/renderer/shader/type/WebGPUStruct.d.ts.map +1 -1
  605. package/src/shade/renderer/shader/type/WebGPUStruct.js +461 -455
  606. package/src/shade/renderer/shader/type/serde/read_gpu_typed_buffer.d.ts.map +1 -1
  607. package/src/shade/renderer/shader/type/serde/read_gpu_typed_buffer.js +335 -211
  608. package/src/shade/renderer/shader/type/serde/write_gpu_typed_buffer.d.ts.map +1 -1
  609. package/src/shade/renderer/shader/type/serde/write_gpu_typed_buffer.js +329 -221
  610. package/src/shade/renderer/shader/type/type_has_f16.d.ts +12 -0
  611. package/src/shade/renderer/shader/type/type_has_f16.d.ts.map +1 -0
  612. package/src/shade/renderer/shader/type/type_has_f16.js +66 -0
  613. package/src/shade/renderer/view/GPUViewContext.d.ts +0 -14
  614. package/src/shade/renderer/view/GPUViewContext.d.ts.map +1 -1
  615. package/src/shade/renderer/view/GPUViewContext.js +0 -29
  616. package/src/shade/renderer/view/ViewManager.d.ts +1 -1
  617. package/src/shade/renderer/view/ViewManager.js +1 -1
  618. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.d.ts +40 -3
  619. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.d.ts.map +1 -1
  620. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.js +660 -583
  621. package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.d.ts.map +1 -1
  622. package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.js +16 -2
  623. package/src/shade/renderer/volumetrics/taa/shader_volumetrics_taa.d.ts.map +1 -1
  624. package/src/shade/renderer/volumetrics/taa/shader_volumetrics_taa.js +5 -2
  625. package/src/shade/renderer/water/shader_water_avboit.js +1 -1
  626. package/src/shade/renderer/wind/GPUSceneWind.d.ts +1 -1
  627. package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.d.ts.map +1 -1
  628. package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js +260 -23
  629. package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts +6 -7
  630. package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts.map +1 -1
  631. package/src/shade/wgsl/emulator/WGSLLanguageCore.js +269 -69
  632. package/src/shade/wgsl/validate_wgsl_source.d.ts.map +1 -1
  633. package/src/shade/wgsl/validate_wgsl_source.js +27 -1
  634. package/src/view/controller/controls/ListController.d.ts.map +1 -1
  635. package/src/view/controller/controls/ListController.js +118 -113
  636. package/src/view/controller/controls/Vector1Control.js +97 -97
  637. package/src/view/elements/image/SvgImageView.d.ts +1 -0
  638. package/src/view/elements/image/SvgImageView.d.ts.map +1 -1
  639. package/src/view/elements/image/SvgImageView.js +92 -90
  640. package/src/view/minimap/dom/MinimapTerrainView.d.ts +1 -0
  641. package/src/view/minimap/dom/MinimapTerrainView.d.ts.map +1 -1
  642. package/src/view/minimap/dom/MinimapTerrainView.js +151 -147
  643. package/src/view/tooltip/gml/TooltipParser.js +2 -2
  644. package/src/engine/network/PriorityFetch.d.ts +0 -59
  645. package/src/engine/network/PriorityFetch.d.ts.map +0 -1
  646. package/src/engine/network/PriorityFetch.js +0 -193
  647. package/src/generation/foliage/config/BranchLevelConfig.d.ts.map +0 -1
  648. package/src/shade/renderer/volumetrics/VOLUMETRICS_RESOLUTION_Z.d.ts +0 -2
  649. package/src/shade/renderer/volumetrics/VOLUMETRICS_RESOLUTION_Z.d.ts.map +0 -1
  650. package/src/shade/renderer/volumetrics/VOLUMETRICS_RESOLUTION_Z.js +0 -1
@@ -49,13 +49,26 @@ function gather_texel_coord(coords, texture) {
49
49
  const F16_SCRATCH = new Float16Array(1);
50
50
 
51
51
  /**
52
- * Shared scratch buffer for `bitcast` — three views over the same 4 bytes so we can
53
- * reinterpret one type as another in O(1) without per-call allocation.
52
+ * Round a number to IEEE 754 binary16 precision via Float16Array.
53
+ * @param {number} x
54
+ * @returns {number}
54
55
  */
55
- const BITCAST_BUFFER = new ArrayBuffer(4);
56
+ function round_f16(x) {
57
+ F16_SCRATCH[0] = x;
58
+ return F16_SCRATCH[0];
59
+ }
60
+
61
+ /**
62
+ * Shared scratch buffer for `bitcast` and `pack2x16float` / `unpack2x16float` — four views over
63
+ * the same 16 bytes so we can reinterpret any 16- to 128-bit scalar or vector bit pattern (including
64
+ * width-changing `vec2<f16>` ↔ `u32`/`i32`/`f32` and `vec4<f16>` ↔ `vec2<u32>`/`vec2<i32>`/`vec2<f32>`)
65
+ * in O(1) without per-call allocation.
66
+ */
67
+ const BITCAST_BUFFER = new ArrayBuffer(16);
56
68
  const BITCAST_U32 = new Uint32Array(BITCAST_BUFFER);
57
69
  const BITCAST_I32 = new Int32Array(BITCAST_BUFFER);
58
70
  const BITCAST_F32 = new Float32Array(BITCAST_BUFFER);
71
+ const BITCAST_F16 = new Float16Array(BITCAST_BUFFER);
59
72
 
60
73
  /**
61
74
  * Construct a WGSL vector. Mirrors WGSL `vecN<T>(...)` semantics:
@@ -508,29 +521,41 @@ export const WGSLLanguageCore = {
508
521
  * @param {Float32Array|Float16Array} m
509
522
  */
510
523
  determinant(m) {
524
+ const is_f16 = m instanceof Float16Array;
525
+ const round = is_f16 ? round_f16 : Math.fround;
511
526
  if (m.length === 4) {
512
- return m[0] * m[3] - m[1] * m[2];
527
+ return round(round(m[0] * m[3]) - round(m[1] * m[2]));
513
528
  }
514
529
  if (m.length === 9) {
515
- return m[0] * (m[4] * m[8] - m[5] * m[7])
516
- - m[3] * (m[1] * m[8] - m[2] * m[7])
517
- + m[6] * (m[1] * m[5] - m[2] * m[4]);
530
+ const t0 = round(m[0] * round(round(m[4] * m[8]) - round(m[5] * m[7])));
531
+ const t1 = round(m[3] * round(round(m[1] * m[8]) - round(m[2] * m[7])));
532
+ const t2 = round(m[6] * round(round(m[1] * m[5]) - round(m[2] * m[4])));
533
+ return round(round(t0 - t1) + t2);
518
534
  }
519
535
  if (m.length === 16) {
520
536
  // 4x4 expansion via 2x2 minors of the bottom rows.
521
- const s0 = m[0] * m[5] - m[1] * m[4];
522
- const s1 = m[0] * m[6] - m[2] * m[4];
523
- const s2 = m[0] * m[7] - m[3] * m[4];
524
- const s3 = m[1] * m[6] - m[2] * m[5];
525
- const s4 = m[1] * m[7] - m[3] * m[5];
526
- const s5 = m[2] * m[7] - m[3] * m[6];
527
- const c5 = m[10] * m[15] - m[11] * m[14];
528
- const c4 = m[ 9] * m[15] - m[11] * m[13];
529
- const c3 = m[ 9] * m[14] - m[10] * m[13];
530
- const c2 = m[ 8] * m[15] - m[11] * m[12];
531
- const c1 = m[ 8] * m[14] - m[10] * m[12];
532
- const c0 = m[ 8] * m[13] - m[ 9] * m[12];
533
- return s0 * c5 - s1 * c4 + s2 * c3 + s3 * c2 - s4 * c1 + s5 * c0;
537
+ const s0 = round(round(m[0] * m[5]) - round(m[1] * m[4]));
538
+ const s1 = round(round(m[0] * m[6]) - round(m[2] * m[4]));
539
+ const s2 = round(round(m[0] * m[7]) - round(m[3] * m[4]));
540
+ const s3 = round(round(m[1] * m[6]) - round(m[2] * m[5]));
541
+ const s4 = round(round(m[1] * m[7]) - round(m[3] * m[5]));
542
+ const s5 = round(round(m[2] * m[7]) - round(m[3] * m[6]));
543
+ const c5 = round(round(m[10] * m[15]) - round(m[11] * m[14]));
544
+ const c4 = round(round(m[ 9] * m[15]) - round(m[11] * m[13]));
545
+ const c3 = round(round(m[ 9] * m[14]) - round(m[10] * m[13]));
546
+ const c2 = round(round(m[ 8] * m[15]) - round(m[11] * m[12]));
547
+ const c1 = round(round(m[ 8] * m[14]) - round(m[10] * m[12]));
548
+ const c0 = round(round(m[ 8] * m[13]) - round(m[ 9] * m[12]));
549
+ return round(
550
+ round(
551
+ round(
552
+ round(round(round(s0 * c5) - round(s1 * c4)) + round(s2 * c3))
553
+ + round(s3 * c2)
554
+ )
555
+ - round(s4 * c1)
556
+ )
557
+ + round(s5 * c0)
558
+ );
534
559
  }
535
560
  throw new Error(`determinant: unsupported matrix length ${m.length}`);
536
561
  },
@@ -597,6 +622,14 @@ export const WGSLLanguageCore = {
597
622
  sub_f32: (a, b) => binop(a, b, (x, y) => Math.fround(x - y)),
598
623
  mul_f32: (a, b) => binop(a, b, (x, y) => Math.fround(x * y)),
599
624
  div_f32: (a, b) => binop(a, b, (x, y) => Math.fround(x / y)),
625
+
626
+ // The same four at f16, for a SCALAR whose type the compiler knows is f16. Without these,
627
+ // scalar f16 arithmetic ran in f64 (`16000.0h * 8.0h` evaluated to 128000 instead of +Infinity,
628
+ // and `1e-3h * 1e-3h` evaluated to 1e-6 instead of underflowing in binary16).
629
+ add_f16: (a, b) => binop(a, b, (x, y) => round_f16(x + y)),
630
+ sub_f16: (a, b) => binop(a, b, (x, y) => round_f16(x - y)),
631
+ mul_f16: (a, b) => binop(a, b, (x, y) => round_f16(x * y)),
632
+ div_f16: (a, b) => binop(a, b, (x, y) => round_f16(x / y)),
600
633
  rem: (a, b) => binop(a, b, (x, y) => x % y),
601
634
 
602
635
  // Integer division — truncates toward zero, matching WGSL `/` semantics on integer types.
@@ -784,6 +817,7 @@ export const WGSLLanguageCore = {
784
817
  clamp: (x, lo, hi) => ternop(x, lo, hi, (v, l, h) => Math.max(l, Math.min(h, v))),
785
818
  // Saturate is `clamp(x, 0, 1)`. WGSL builtin.
786
819
  saturate: (a) => unop(a, x => Math.max(0, Math.min(1, x))),
820
+ quantizeToF16: (a) => unop(a, round_f16),
787
821
  mix: (a, b, t) => ternop(a, b, t, (x, y, k) => x * (1 - k) + y * k),
788
822
  // Fused multiply-add: `a * b + c`. JS lacks a true FMA; this is mathematically equivalent
789
823
  // but loses the single-rounding precision benefit of hardware FMA — fine for testing.
@@ -810,6 +844,21 @@ export const WGSLLanguageCore = {
810
844
  */
811
845
  dot(a, b) {
812
846
  assert.equal(a.length, b.length, 'dot vector length mismatch');
847
+ if (a instanceof Float16Array || b instanceof Float16Array) {
848
+ let s = 0;
849
+ for (let i = 0; i < a.length; i++) s = round_f16(s + round_f16(a[i] * b[i]));
850
+ return s;
851
+ }
852
+ if (a instanceof Int32Array || b instanceof Int32Array) {
853
+ let s = 0;
854
+ for (let i = 0; i < a.length; i++) s = (s + Math.imul(a[i], b[i])) | 0;
855
+ return s;
856
+ }
857
+ if (a instanceof Uint32Array || b instanceof Uint32Array) {
858
+ let s = 0;
859
+ for (let i = 0; i < a.length; i++) s = (s + Math.imul(a[i], b[i])) >>> 0;
860
+ return s;
861
+ }
813
862
  let s = 0;
814
863
  for (let i = 0; i < a.length; i++) s = Math.fround(s + Math.fround(a[i] * b[i]));
815
864
  return s;
@@ -817,6 +866,11 @@ export const WGSLLanguageCore = {
817
866
 
818
867
  length(v) {
819
868
  if (!is_vec(v)) return Math.abs(v);
869
+ if (v instanceof Float16Array) {
870
+ let s = 0;
871
+ for (let i = 0; i < v.length; i++) s = round_f16(s + round_f16(v[i] * v[i]));
872
+ return round_f16(Math.sqrt(s));
873
+ }
820
874
  let s = 0;
821
875
  for (let i = 0; i < v.length; i++) s = Math.fround(s + Math.fround(v[i] * v[i]));
822
876
  return Math.fround(Math.sqrt(s));
@@ -843,6 +897,13 @@ export const WGSLLanguageCore = {
843
897
  cross(a, b) {
844
898
  assert.equal(a.length, 3, 'cross requires vec3');
845
899
  assert.equal(b.length, 3, 'cross requires vec3');
900
+ if (a instanceof Float16Array) {
901
+ return new Float16Array([
902
+ round_f16(a[1] * b[2]) - round_f16(a[2] * b[1]),
903
+ round_f16(a[2] * b[0]) - round_f16(a[0] * b[2]),
904
+ round_f16(a[0] * b[1]) - round_f16(a[1] * b[0]),
905
+ ]);
906
+ }
846
907
  return new a.constructor([
847
908
  a[1] * b[2] - a[2] * b[1],
848
909
  a[2] * b[0] - a[0] * b[2],
@@ -850,20 +911,26 @@ export const WGSLLanguageCore = {
850
911
  ]);
851
912
  },
852
913
 
914
+ faceForward(e1, e2, e3) {
915
+ return WGSLLanguageCore.dot(e3, e2) < 0 ? copy_value(e1) : WGSLLanguageCore.neg(e1);
916
+ },
917
+
853
918
  reflect(i, n) {
854
- const d = WGSLLanguageCore.dot(i, n);
919
+ const round = i instanceof Float16Array ? round_f16 : Math.fround;
920
+ const two_d = round(2 * WGSLLanguageCore.dot(i, n));
855
921
  const out = new i.constructor(i.length);
856
- for (let k = 0; k < i.length; k++) out[k] = i[k] - 2 * d * n[k];
922
+ for (let k = 0; k < i.length; k++) out[k] = round(i[k] - round(two_d * n[k]));
857
923
  return out;
858
924
  },
859
925
 
860
926
  refract(i, n, eta) {
927
+ const round = i instanceof Float16Array ? round_f16 : Math.fround;
861
928
  const d = WGSLLanguageCore.dot(n, i);
862
- const k = 1 - eta * eta * (1 - d * d);
929
+ const k = round(1 - round(round(eta * eta) * round(1 - round(d * d))));
863
930
  const out = new i.constructor(i.length);
864
931
  if (k < 0) { out.fill(0); return out; }
865
- const normal_scale = eta * d + Math.sqrt(k);
866
- for (let j = 0; j < i.length; j++) out[j] = eta * i[j] - normal_scale * n[j];
932
+ const normal_scale = round(round(eta * d) + round(Math.sqrt(k)));
933
+ for (let j = 0; j < i.length; j++) out[j] = round(round(eta * i[j]) - round(normal_scale * n[j]));
867
934
  return out;
868
935
  },
869
936
 
@@ -966,6 +1033,89 @@ export const WGSLLanguageCore = {
966
1033
  return out;
967
1034
  },
968
1035
 
1036
+ // f16 (half-precision) mat × column-vector, mat × mat, and row-vector × mat
1037
+
1038
+ m2x2h_multiply_v2h(m, v) {
1039
+ const out = new Float16Array(2);
1040
+ out[0] = round_f16(round_f16(m[0] * v[0]) + round_f16(m[2] * v[1]));
1041
+ out[1] = round_f16(round_f16(m[1] * v[0]) + round_f16(m[3] * v[1]));
1042
+ return out;
1043
+ },
1044
+
1045
+ m3x3h_multiply_v3h(m, v) {
1046
+ const out = new Float16Array(3);
1047
+ out[0] = round_f16(round_f16(round_f16(m[0] * v[0]) + round_f16(m[3] * v[1])) + round_f16(m[6] * v[2]));
1048
+ out[1] = round_f16(round_f16(round_f16(m[1] * v[0]) + round_f16(m[4] * v[1])) + round_f16(m[7] * v[2]));
1049
+ out[2] = round_f16(round_f16(round_f16(m[2] * v[0]) + round_f16(m[5] * v[1])) + round_f16(m[8] * v[2]));
1050
+ return out;
1051
+ },
1052
+
1053
+ m4x4h_multiply_v4h(m, v) {
1054
+ const out = new Float16Array(4);
1055
+ out[0] = round_f16(round_f16(round_f16(round_f16(m[0] * v[0]) + round_f16(m[4] * v[1])) + round_f16(m[8] * v[2])) + round_f16(m[12] * v[3]));
1056
+ out[1] = round_f16(round_f16(round_f16(round_f16(m[1] * v[0]) + round_f16(m[5] * v[1])) + round_f16(m[9] * v[2])) + round_f16(m[13] * v[3]));
1057
+ out[2] = round_f16(round_f16(round_f16(round_f16(m[2] * v[0]) + round_f16(m[6] * v[1])) + round_f16(m[10] * v[2])) + round_f16(m[14] * v[3]));
1058
+ out[3] = round_f16(round_f16(round_f16(round_f16(m[3] * v[0]) + round_f16(m[7] * v[1])) + round_f16(m[11] * v[2])) + round_f16(m[15] * v[3]));
1059
+ return out;
1060
+ },
1061
+
1062
+ m2x2h_multiply_m2x2h(a, b) {
1063
+ const out = new Float16Array(4);
1064
+ for (let j = 0; j < 2; j++) {
1065
+ const b0 = b[j * 2], b1 = b[j * 2 + 1];
1066
+ out[j * 2] = round_f16(round_f16(a[0] * b0) + round_f16(a[2] * b1));
1067
+ out[j * 2 + 1] = round_f16(round_f16(a[1] * b0) + round_f16(a[3] * b1));
1068
+ }
1069
+ return out;
1070
+ },
1071
+
1072
+ m3x3h_multiply_m3x3h(a, b) {
1073
+ const out = new Float16Array(9);
1074
+ for (let j = 0; j < 3; j++) {
1075
+ const b0 = b[j * 3], b1 = b[j * 3 + 1], b2 = b[j * 3 + 2];
1076
+ out[j * 3] = round_f16(round_f16(round_f16(a[0] * b0) + round_f16(a[3] * b1)) + round_f16(a[6] * b2));
1077
+ out[j * 3 + 1] = round_f16(round_f16(round_f16(a[1] * b0) + round_f16(a[4] * b1)) + round_f16(a[7] * b2));
1078
+ out[j * 3 + 2] = round_f16(round_f16(round_f16(a[2] * b0) + round_f16(a[5] * b1)) + round_f16(a[8] * b2));
1079
+ }
1080
+ return out;
1081
+ },
1082
+
1083
+ m4x4h_multiply_m4x4h(a, b) {
1084
+ const out = new Float16Array(16);
1085
+ for (let j = 0; j < 4; j++) {
1086
+ const b0 = b[j * 4], b1 = b[j * 4 + 1], b2 = b[j * 4 + 2], b3 = b[j * 4 + 3];
1087
+ out[j * 4] = round_f16(round_f16(round_f16(round_f16(a[0] * b0) + round_f16(a[4] * b1)) + round_f16(a[8] * b2)) + round_f16(a[12] * b3));
1088
+ out[j * 4 + 1] = round_f16(round_f16(round_f16(round_f16(a[1] * b0) + round_f16(a[5] * b1)) + round_f16(a[9] * b2)) + round_f16(a[13] * b3));
1089
+ out[j * 4 + 2] = round_f16(round_f16(round_f16(round_f16(a[2] * b0) + round_f16(a[6] * b1)) + round_f16(a[10] * b2)) + round_f16(a[14] * b3));
1090
+ out[j * 4 + 3] = round_f16(round_f16(round_f16(round_f16(a[3] * b0) + round_f16(a[7] * b1)) + round_f16(a[11] * b2)) + round_f16(a[15] * b3));
1091
+ }
1092
+ return out;
1093
+ },
1094
+
1095
+ v2h_multiply_m2x2h(v, m) {
1096
+ const out = new Float16Array(2);
1097
+ out[0] = round_f16(round_f16(v[0] * m[0]) + round_f16(v[1] * m[1]));
1098
+ out[1] = round_f16(round_f16(v[0] * m[2]) + round_f16(v[1] * m[3]));
1099
+ return out;
1100
+ },
1101
+
1102
+ v3h_multiply_m3x3h(v, m) {
1103
+ const out = new Float16Array(3);
1104
+ out[0] = round_f16(round_f16(round_f16(v[0] * m[0]) + round_f16(v[1] * m[1])) + round_f16(v[2] * m[2]));
1105
+ out[1] = round_f16(round_f16(round_f16(v[0] * m[3]) + round_f16(v[1] * m[4])) + round_f16(v[2] * m[5]));
1106
+ out[2] = round_f16(round_f16(round_f16(v[0] * m[6]) + round_f16(v[1] * m[7])) + round_f16(v[2] * m[8]));
1107
+ return out;
1108
+ },
1109
+
1110
+ v4h_multiply_m4x4h(v, m) {
1111
+ const out = new Float16Array(4);
1112
+ out[0] = round_f16(round_f16(round_f16(round_f16(v[0] * m[0]) + round_f16(v[1] * m[1])) + round_f16(v[2] * m[2])) + round_f16(v[3] * m[3]));
1113
+ out[1] = round_f16(round_f16(round_f16(round_f16(v[0] * m[4]) + round_f16(v[1] * m[5])) + round_f16(v[2] * m[6])) + round_f16(v[3] * m[7]));
1114
+ out[2] = round_f16(round_f16(round_f16(round_f16(v[0] * m[8]) + round_f16(v[1] * m[9])) + round_f16(v[2] * m[10])) + round_f16(v[3] * m[11]));
1115
+ out[3] = round_f16(round_f16(round_f16(round_f16(v[0] * m[12]) + round_f16(v[1] * m[13])) + round_f16(v[2] * m[14])) + round_f16(v[3] * m[15]));
1116
+ return out;
1117
+ },
1118
+
969
1119
  // ---------------------------------------------------------------------
970
1120
  // Logical / bit helpers
971
1121
  // ---------------------------------------------------------------------
@@ -1603,6 +1753,19 @@ export const WGSLLanguageCore = {
1603
1753
  // Pack / unpack — fixed-point and float bit-level packers from the WGSL spec.
1604
1754
  // ---------------------------------------------------------------------
1605
1755
 
1756
+ /** vec2<f32>(low_f16, high_f16) — unpacks two IEEE 754 binary16 values from a u32. */
1757
+ unpack2x16float(e) {
1758
+ BITCAST_U32[0] = e >>> 0;
1759
+ return new Float32Array([BITCAST_F16[0], BITCAST_F16[1]]);
1760
+ },
1761
+
1762
+ /** Inverse of unpack2x16float — rounds two f32/f16 components to binary16 and packs into a u32. */
1763
+ pack2x16float(v) {
1764
+ BITCAST_F16[0] = v[0];
1765
+ BITCAST_F16[1] = v[1];
1766
+ return BITCAST_U32[0];
1767
+ },
1768
+
1606
1769
  /** vec2<f32>(low_u16, high_u16) / 65535.0 — components in [0, 1]. */
1607
1770
  unpack2x16unorm(e) {
1608
1771
  const u = e >>> 0;
@@ -1677,67 +1840,104 @@ export const WGSLLanguageCore = {
1677
1840
  /**
1678
1841
  * Bit-cast (WGSL `bitcast`). Reinterprets a value's bit pattern as a different type.
1679
1842
  *
1680
- * JS has no separate u32/i32/f32 scalar types — they're all `number` — so the source type
1681
- * cannot be detected from the value at runtime. The compiler passes it explicitly when known;
1682
- * otherwise we fall back to a heuristic: integer-targeted casts assume f32 source, float-targeted
1683
- * casts assume u32 source (the common "interpret bit pattern as float" idiom).
1684
- *
1685
- * For typed-array (vector) inputs the source type is auto-detected from the array constructor.
1843
+ * Supports all WGSL §17.3.1 bitcast combinations, including:
1844
+ * - Same-width scalar casts: `u32` ↔ `i32` ↔ `f32`, and `f16` ↔ `f16`
1845
+ * - Same-length vector casts: `vecN<u32>` ↔ `vecN<i32>` ↔ `vecN<f32>`, `vecN<f16>` ↔ `vecN<f16>`
1846
+ * - Width-changing 32-bit packed casts: `vec2<f16>` (`vec2h`) ↔ `u32` / `i32` / `f32`
1847
+ * - Width-changing 64-bit packed casts: `vec4<f16>` (`vec4h`) ↔ `vec2<u32>` / `vec2<i32>` / `vec2<f32>`
1686
1848
  *
1687
1849
  * @param {*} v
1688
- * @param {string} target — destination type name, e.g. `'f32'` / `'u32'` / `'i32'`
1850
+ * @param {string} target — destination type name, e.g. `'f32'`, `'u32'`, `'vec2<f16>'`, `'vec2h'`, `'vec2u'`
1689
1851
  * @param {string} [source] — source type name; required for unambiguous scalar casts
1690
1852
  * @returns {number | TypedArray}
1691
1853
  */
1692
1854
  WGSLLanguageCore.bitcast = function (v, target, source) {
1693
- // Vector targets (`vec3<u32>` etc.) reduce to their scalar type — the runtime stores vectors
1694
- // as flat typed arrays, so the per-element bitcast is the same as for a scalar of that type.
1695
- const vec_match = typeof target === 'string' ? target.match(/^vec\d<([^>]+)>$/) : null;
1696
- if (vec_match !== null) {
1697
- target = vec_match[1];
1698
- }
1855
+ const ALIAS_VEC = {
1856
+ vec2i: [2, 'i32'], vec3i: [3, 'i32'], vec4i: [4, 'i32'],
1857
+ vec2u: [2, 'u32'], vec3u: [3, 'u32'], vec4u: [4, 'u32'],
1858
+ vec2f: [2, 'f32'], vec3f: [3, 'f32'], vec4f: [4, 'f32'],
1859
+ vec2h: [2, 'f16'], vec3h: [3, 'f16'], vec4h: [4, 'f16'],
1860
+ };
1699
1861
 
1700
- function convert_scalar(x, t_from, t_to) {
1701
- if (t_to === 'f32') {
1702
- if (t_from === 'u32') { BITCAST_U32[0] = x >>> 0; return BITCAST_F32[0]; }
1703
- if (t_from === 'i32') { BITCAST_I32[0] = x | 0; return BITCAST_F32[0]; }
1704
- } else if (t_to === 'u32') {
1705
- if (t_from === 'f32') { BITCAST_F32[0] = x; return BITCAST_U32[0]; }
1706
- if (t_from === 'i32') { return (x | 0) >>> 0; }
1707
- } else if (t_to === 'i32') {
1708
- if (t_from === 'f32') { BITCAST_F32[0] = x; return BITCAST_I32[0]; }
1709
- if (t_from === 'u32') { return (x >>> 0) | 0; }
1862
+ let target_is_vec = false;
1863
+ let target_len = 1;
1864
+ let target_scalar = typeof target === 'string' ? target.trim() : 'f32';
1865
+
1866
+ if (ALIAS_VEC.hasOwnProperty(target_scalar)) {
1867
+ target_is_vec = true;
1868
+ [target_len, target_scalar] = ALIAS_VEC[target_scalar];
1869
+ } else {
1870
+ const vec_match = target_scalar.match(/^vec(\d)<\s*([^>\s]+)\s*>$/);
1871
+ if (vec_match !== null) {
1872
+ target_is_vec = true;
1873
+ target_len = parseInt(vec_match[1]);
1874
+ target_scalar = vec_match[2];
1710
1875
  }
1711
- return x;
1712
1876
  }
1713
1877
 
1878
+ const viewFor = (s) => (
1879
+ s === 'u32' ? BITCAST_U32
1880
+ : s === 'i32' ? BITCAST_I32
1881
+ : s === 'f16' ? BITCAST_F16
1882
+ : BITCAST_F32
1883
+ );
1884
+ const ctorFor = (s) => (
1885
+ s === 'u32' ? Uint32Array
1886
+ : s === 'i32' ? Int32Array
1887
+ : s === 'f16' ? Float16Array
1888
+ : Float32Array
1889
+ );
1890
+
1714
1891
  if (is_vec(v)) {
1715
- let from = source;
1716
- if (from === undefined) {
1717
- if (v instanceof Float32Array) from = 'f32';
1718
- else if (v instanceof Float16Array) from = 'f16';
1719
- else if (v instanceof Uint32Array) from = 'u32';
1720
- else if (v instanceof Int32Array) from = 'i32';
1721
- else from = 'f32';
1892
+ let from_scalar = source;
1893
+ if (v instanceof Float16Array) from_scalar = 'f16';
1894
+ else if (v instanceof Float32Array) from_scalar = 'f32';
1895
+ else if (v instanceof Uint32Array) from_scalar = 'u32';
1896
+ else if (v instanceof Int32Array) from_scalar = 'i32';
1897
+ else if (from_scalar === undefined) from_scalar = 'f32';
1898
+
1899
+ const src_view = viewFor(from_scalar);
1900
+ for (let i = 0; i < v.length; i++) {
1901
+ src_view[i] = v[i];
1722
1902
  }
1723
1903
 
1724
- let outCtor;
1725
- if (target === 'f32') outCtor = Float32Array;
1726
- else if (target === 'f16') outCtor = Float16Array;
1727
- else if (target === 'u32') outCtor = Uint32Array;
1728
- else if (target === 'i32') outCtor = Int32Array;
1729
- else outCtor = v.constructor;
1904
+ const dst_view = viewFor(target_scalar);
1730
1905
 
1731
- const out = new outCtor(v.length);
1732
- for (let i = 0; i < v.length; i++) {
1733
- out[i] = convert_scalar(v[i], from, target);
1906
+ // Width-changing 32-bit pack: `bitcast<u32|i32|f32>(vec2<f16>)` returns a 32-bit scalar.
1907
+ if (!target_is_vec && from_scalar === 'f16' && v.length === 2 && target_scalar !== 'f16') {
1908
+ return dst_view[0];
1909
+ }
1910
+
1911
+ // Otherwise return a vector (either target_len if target was explicitly a vec, or v.length
1912
+ // if the caller passed a bare scalar name for an element-wise vector bitcast).
1913
+ const out_len = target_is_vec ? target_len : v.length;
1914
+ const out_ctor = ctorFor(target_scalar);
1915
+ const out = new out_ctor(out_len);
1916
+ for (let i = 0; i < out_len; i++) {
1917
+ out[i] = dst_view[i];
1734
1918
  }
1735
1919
  return out;
1736
1920
  }
1737
1921
 
1738
- let from = source;
1739
- if (from === undefined) {
1740
- from = (target === 'f32' || target === 'f16') ? 'u32' : 'f32';
1922
+ // Scalar input `v`
1923
+ let from_scalar = source;
1924
+ if (from_scalar === undefined) {
1925
+ from_scalar = (target_scalar === 'f32' || target_scalar === 'f16') ? 'u32' : 'f32';
1926
+ }
1927
+
1928
+ const src_view = viewFor(from_scalar);
1929
+ src_view[0] = v;
1930
+
1931
+ const dst_view = viewFor(target_scalar);
1932
+ if (target_is_vec) {
1933
+ // Width-changing 32-bit unpack: `bitcast<vec2<f16>>(u32|i32|f32)` returns Float16Array(2).
1934
+ const out_ctor = ctorFor(target_scalar);
1935
+ const out = new out_ctor(target_len);
1936
+ for (let i = 0; i < target_len; i++) {
1937
+ out[i] = dst_view[i];
1938
+ }
1939
+ return out;
1741
1940
  }
1742
- return convert_scalar(v, from, target);
1941
+
1942
+ return dst_view[0];
1743
1943
  };
@@ -1 +1 @@
1
- {"version":3,"file":"validate_wgsl_source.d.ts","sourceRoot":"","sources":["../../../../src/shade/wgsl/validate_wgsl_source.js"],"names":[],"mappings":"AAqMA;;;;;;GAMG;AACH,6CAJW,MAAM,UACN,OAAO,iBAAiB,EAAE,UAAU,GAClC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,CAsP7D"}
1
+ {"version":3,"file":"validate_wgsl_source.d.ts","sourceRoot":"","sources":["../../../../src/shade/wgsl/validate_wgsl_source.js"],"names":[],"mappings":"AAmNA;;;;;;GAMG;AACH,6CAJW,MAAM,UACN,OAAO,iBAAiB,EAAE,UAAU,GAClC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,CAkQ7D"}
@@ -25,6 +25,11 @@ import { WGSLLanguageCore } from "./emulator/WGSLLanguageCore.js";
25
25
  * parameter, a `var` or a `let`. WGSL requires a const-declaration's initializer to be a
26
26
  * const-expression, so these are rejected at `createShaderModule`; the emulator does not
27
27
  * enforce const-ness, so a chunk written against it passes every spec and then cannot compile.
28
+ * - unenabled-f16: using `f16`, a half-precision vector/matrix alias (`vec2h`..`vec4h`,
29
+ * `mat2x2h`..`mat4x4h`), or a half-precision float literal (`1.0h`, `1e-4h`, `0x1p0h`) without
30
+ * an `enable f16;` directive. The emulator parses and runs these without requiring `enable f16;`,
31
+ * so a chunk that forgets `chunk.addExtension(WebGPUExtensionType.ShaderF16)` would otherwise
32
+ * pass every emulator test and fail `createShaderModule` on a device.
28
33
  *
29
34
  * NOT yet enforced (would need full type inference; tracked under REVIEW_002 9.1): scalar
30
35
  * type mixing (u32/i32/f32), AbstractInt conversion failures, const-evaluability of
@@ -135,6 +140,15 @@ const WGSL_RESERVED_WORDS = [
135
140
 
136
141
  const RESERVED_WORD_RE = new RegExp(`\\b(?:${WGSL_RESERVED_WORDS.join('|')})\\b`, 'g');
137
142
 
143
+ // Half-precision (`f16`) enable directive and tokens (WGSL §14.1.1, §3.4.3, §6.2.4–6.2.6).
144
+ // Matches `enable f16;`, `enable subgroups, f16;`, etc.
145
+ const F16_ENABLE_DIRECTIVE_RE = /\benable\s+[^;]*\bf16\b/;
146
+
147
+ // Matches `f16`, `vec2h`..`vec4h`, `mat2x2h`..`mat4x4h`, hex float literals ending in `h`
148
+ // (`0x1.8p-2h`), and decimal float literals ending in `h` (`1.0h`, `.5h`, `1e-4h`, `0h`) when not
149
+ // preceded by an identifier/number character (`(?<![A-Za-z0-9_])` prevents matching `w1h` or `0x1h`).
150
+ const F16_TOKEN_RE = /\b(?:f16|(?:vec[234]|mat[234]x[234])h|0[xX](?:[0-9a-fA-F]+\.[0-9a-fA-F]*|\.[0-9a-fA-F]+|[0-9a-fA-F]+)[pP][+-]?\d+h)\b|(?<![A-Za-z0-9_])(?:\d+\.\d*|\.\d+|\d+)(?:[eE][+-]?\d+)?h\b/;
151
+
138
152
  /**
139
153
  * @param {Node} node
140
154
  * @returns {Node[]}
@@ -421,8 +435,9 @@ export function validate_wgsl_source(source, parser) {
421
435
  });
422
436
  }
423
437
 
424
- // ── foreign-token (lexical) ──
438
+ // ── foreign-token, reserved-keyword, & unenabled-f16 (lexical) ──
425
439
  const stripped = strip_comments(source);
440
+ const f16_enabled = F16_ENABLE_DIRECTIVE_RE.test(stripped);
426
441
  const lines = stripped.split('\n');
427
442
  for (let i = 0; i < lines.length; i++) {
428
443
  for (const [pattern, label] of FOREIGN_TOKENS) {
@@ -443,6 +458,17 @@ export function validate_wgsl_source(source, parser) {
443
458
  line: i + 1,
444
459
  });
445
460
  }
461
+
462
+ if (!f16_enabled) {
463
+ const f16_match = lines[i].match(F16_TOKEN_RE);
464
+ if (f16_match !== null) {
465
+ diagnostics.push({
466
+ rule: 'unenabled-f16',
467
+ message: `'${f16_match[0]}' requires 'enable f16;' (call chunk.addExtension(WebGPUExtensionType.ShaderF16))`,
468
+ line: i + 1,
469
+ });
470
+ }
471
+ }
446
472
  }
447
473
 
448
474
  return diagnostics;
@@ -1 +1 @@
1
- {"version":3,"file":"ListController.d.ts","sourceRoot":"","sources":["../../../../../src/view/controller/controls/ListController.js"],"names":[],"mappings":";AAIA;IACI;;;;;OAKG;IACH,gEAHuB,UAAU,EAoGhC;CACJ;uBA7GsB,iBAAiB"}
1
+ {"version":3,"file":"ListController.d.ts","sourceRoot":"","sources":["../../../../../src/view/controller/controls/ListController.js"],"names":[],"mappings":";AAIA;IACI;;;;;OAKG;IACH,gEAHuB,UAAU,EAyGhC;CACJ;uBAlHsB,iBAAiB"}