@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,7 +1,9 @@
1
1
  import { vec3f } from "../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
2
2
  import { WebGPUArray } from "../shader/type/WebGPUArray.js";
3
3
  import { CAMERA_UNIFORM_STRUCT } from "../camera/CAMERA_UNIFORM_STRUCT.js";
4
- import { chunk_rgb_to_luminance } from "../shader/chunk/color/chunk_rgb_to_luminance.js";
4
+ import { chunk_rgb_to_luminance } from "../shader/chunk/color/chunk_rgb_to_luminance.js";
5
+ import { F16_MAX_DEFINITION } from "../shader/chunk/math/F16_MAX_DEFINITION.js";
6
+ import { F32_MAX_DEFINITION } from "../shader/chunk/math/F32_MAX_DEFINITION.js";
5
7
  import { chunk_stbn_sample_vec3 } from "../shader/chunk/noise/chunk_stbn_sample_vec3.js";
6
8
  import { chunk_camera_ray_from_uv } from "../shader/chunk/geometry/ray/chunk_camera_ray_from_uv.js";
7
9
  import { RAY_STRUCT } from "../shader/chunk/geometry/ray/RAY_STRUCT.js";
@@ -406,9 +408,21 @@ fn main(
406
408
  // depth-attenuation of the in-scatter.
407
409
  let extinction = extinctionSum / f32(SAMPLE_COUNT);
408
410
 
409
- textureStore(tLighting, voxel_coord, vec4<f32>(inScattering, extinction));
411
+ // tLighting is rgba16float: any finite f32 value above F16_MAX saturates to +Inf on hardware
412
+ // store, which then turns into NaN inside the 3D TAA's 27-tap YCoCg neighbourhood variance.
413
+ let lighting_raw = vec4<f32>(inScattering, extinction);
414
+ let lighting_finite = (lighting_raw == lighting_raw) & (abs(lighting_raw) < vec4<f32>(F32_MAX));
415
+ let lighting_storable = select(
416
+ vec4<f32>(0.0),
417
+ clamp(lighting_raw, vec4<f32>(0.0), vec4<f32>(F16_MAX)),
418
+ lighting_finite
419
+ );
420
+
421
+ textureStore(tLighting, voxel_coord, lighting_storable);
410
422
  }
411
423
  `, [
424
+ F16_MAX_DEFINITION,
425
+ F32_MAX_DEFINITION,
412
426
  chunk_cluster_depth_from_z_slice,
413
427
  chunk_cluster_depth_to_z_slice,
414
428
  chunk_texel_coordinate_to_uv,
@@ -1 +1 @@
1
- {"version":3,"file":"shader_volumetrics_taa.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/volumetrics/taa/shader_volumetrics_taa.js"],"names":[],"mappings":"AA4JA,mDAIG;8BA3J2B,+BAA+B"}
1
+ {"version":3,"file":"shader_volumetrics_taa.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/volumetrics/taa/shader_volumetrics_taa.js"],"names":[],"mappings":"AA+JA,mDAIG;8BA7J2B,+BAA+B"}
@@ -1,4 +1,5 @@
1
1
  import { CAMERA_UNIFORM_STRUCT } from "../../camera/CAMERA_UNIFORM_STRUCT.js";
2
+ import { F16_MAX_DEFINITION } from "../../shader/chunk/math/F16_MAX_DEFINITION.js";
2
3
  import { F32_MAX_DEFINITION } from "../../shader/chunk/math/F32_MAX_DEFINITION.js";
3
4
  import { chunk_rgb_to_YCoCg } from "../../shader/chunk/color/YCoCg/chunk_rgb_to_YCoCg.js";
4
5
  import { chunk_YCoCg_to_rgb } from "../../shader/chunk/color/YCoCg/chunk_YCoCg_to_rgb.js";
@@ -137,14 +138,16 @@ fn main(@builtin(global_invocation_id) voxel_id: vec3<u32>) {
137
138
  is not a clamp.
138
139
  */
139
140
  let current_finite = all(color_curr == color_curr) && all(abs(color_curr) < vec4f(F32_MAX));
140
- let current_safe = select(vec4f(0.0), color_curr, current_finite);
141
+ let current_safe = select(vec4f(0.0), clamp(color_curr, vec4f(0.0), vec4f(F16_MAX)), current_finite);
141
142
 
142
143
  let final_finite = all(final_color == final_color) && all(abs(final_color) < vec4f(F32_MAX));
143
144
 
144
- textureStore(t_output, voxel_id, select(current_safe, final_color, final_finite));
145
+ let final_safe = select(current_safe, clamp(final_color, vec4f(0.0), vec4f(F16_MAX)), final_finite);
146
+ textureStore(t_output, voxel_id, final_safe);
145
147
  }
146
148
  `,
147
149
  [
150
+ F16_MAX_DEFINITION,
148
151
  F32_MAX_DEFINITION,
149
152
  chunk_rgb_to_YCoCg,
150
153
  chunk_YCoCg_to_rgb,
@@ -95,7 +95,7 @@ fn main(@builtin(global_invocation_id) id: vec3u) {
95
95
  let p = avboit_view_depth_to_physical(&warp, nearest) - 0.5;
96
96
  let slice = i32(floor(p));
97
97
  let upper = avboit_split_counts(counts, fract(p));
98
- let column = (id.y * warp.voxel_width + id.x) * warp.physical_count;
98
+ let column = id.y * warp.voxel_width + id.x;
99
99
  avboit_splat_counts(column, slice, counts - upper, id.xy);
100
100
  avboit_splat_counts(column, slice + 1, upper, id.xy);
101
101
  }
@@ -1 +1 @@
1
- {"version":3,"file":"WGSLJavaScriptCompiler.d.ts","sourceRoot":"","sources":["../../../../../src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js"],"names":[],"mappings":"AAkpBA;IAEI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA6BG;IACH,oBAFa,MAAM,CAMlB;CACJ;;UA7qBa,WAAW,GAAG,UAAU,GAAG,KAAK,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS;WAC5G,MAAM;WACN,MAAM;WACN,MAAM;WACN,MAAM;aACN,MAAM;cACN,QAAQ;YACR,MAAM;;;;gBACN,CAAC,GAAG,CAAC,GAAG,CAAC"}
1
+ {"version":3,"file":"WGSLJavaScriptCompiler.d.ts","sourceRoot":"","sources":["../../../../../src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js"],"names":[],"mappings":"AAmtBA;IAEI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA6BG;IACH,oBAFa,MAAM,CAMlB;CACJ;;UA7uBa,WAAW,GAAG,UAAU,GAAG,KAAK,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS;WAC5G,MAAM;WACN,MAAM;WACN,MAAM;WACN,MAAM;aACN,MAAM;cACN,QAAQ;YACR,MAAM;;;;gBACN,CAAC,GAAG,CAAC,GAAG,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import { assert } from "../../../core/assert.js";
2
+ import { FLOAT16_MAX } from "../../../core/binary/FLOAT16_MAX.js";
2
3
  import { FLOAT32_MAX } from "../../../core/binary/FLOAT32_MAX.js";
3
4
  import LineBuilder from "../../../core/codegen/LineBuilder.js";
4
5
 
@@ -22,6 +23,19 @@ import LineBuilder from "../../../core/codegen/LineBuilder.js";
22
23
  const T_UNKNOWN = Object.freeze({ kind: 'unknown' });
23
24
  const T_I32 = Object.freeze({ kind: 'primitive', name: 'i32' });
24
25
  const T_F32 = Object.freeze({ kind: 'primitive', name: 'f32' });
26
+ const T_F16 = Object.freeze({ kind: 'primitive', name: 'f16' });
27
+
28
+ const COMPILER_F16_SCRATCH = new Float16Array(1);
29
+
30
+ /**
31
+ * Round a number to IEEE 754 binary16 precision at compile time.
32
+ * @param {number} x
33
+ * @returns {number}
34
+ */
35
+ function roundF16(x) {
36
+ COMPILER_F16_SCRATCH[0] = x;
37
+ return COMPILER_F16_SCRATCH[0];
38
+ }
25
39
 
26
40
  /**
27
41
  * WGSL's two abstract numeric types. A bare literal has one (`2` is an AbstractInt, `0.5` an
@@ -418,10 +432,43 @@ function classifyType(ident, args, template_list_node) {
418
432
  * literals only carry `f`/`h`. Crucially, a hex int like `0x0300f00f` ends in a hex digit `f`
419
433
  * that must NOT be treated as a suffix — only an `f` after a decimal-format float counts.
420
434
  */
435
+ const HEX_FLOAT_RE = /^0[xX](?:([0-9a-fA-F]+)\.?([0-9a-fA-F]*)|\.([0-9a-fA-F]+))(?:[pP]([+-]?\d+)([fh])?)?$/;
436
+
437
+ /**
438
+ * Parse a WGSL §3.4.3 hexadecimal floating-point literal (e.g. `0x1.8p-2h`, `0x1.ffcp15h`,
439
+ * `0x1p0f`, `0x1.5`). Returns `null` for hexadecimal integer literals (`0x10`, `0x1fu`).
440
+ *
441
+ * @param {string} t
442
+ * @returns {{ value: number, suffix: string } | null}
443
+ */
444
+ function parseWgslHexFloat(t) {
445
+ if (!/^0[xX]/.test(t) || !/[.pP]/.test(t)) return null;
446
+ const m = t.match(HEX_FLOAT_RE);
447
+ if (m === null) return null;
448
+ const int_hex = m[1] || '';
449
+ const frac_hex = m[2] !== undefined ? m[2] : (m[3] || '');
450
+ const exp = m[4] !== undefined ? parseInt(m[4], 10) : 0;
451
+ const suffix = m[5] || '';
452
+ const int_val = int_hex.length > 0 ? parseInt(int_hex, 16) : 0;
453
+ let frac_val = 0;
454
+ for (let i = frac_hex.length - 1; i >= 0; i--) {
455
+ frac_val = (frac_val + parseInt(frac_hex[i], 16)) / 16;
456
+ }
457
+ return {
458
+ value: (int_val + frac_val) * Math.pow(2, exp),
459
+ suffix,
460
+ };
461
+ }
462
+
421
463
  function literalToJs(text) {
422
464
  const t = text.trim();
423
465
  if (t === 'true' || t === 'false') return t;
424
466
 
467
+ const hex_float = parseWgslHexFloat(t);
468
+ if (hex_float !== null) {
469
+ return String(hex_float.value);
470
+ }
471
+
425
472
  // Hex int literals: `0xNN[ui]?`. Only `u`/`i` are real suffixes here; trailing `f`/`h` are
426
473
  // hex digits.
427
474
  if (/^0[xX]/.test(t)) {
@@ -462,6 +509,13 @@ function literalType(text) {
462
509
  return { kind: 'primitive', name: 'bool' };
463
510
  }
464
511
 
512
+ const hex_float = parseWgslHexFloat(t);
513
+ if (hex_float !== null) {
514
+ if (hex_float.suffix === 'f') return T_F32;
515
+ if (hex_float.suffix === 'h') return T_F16;
516
+ return T_ABSTRACT_FLOAT;
517
+ }
518
+
465
519
  if (/[ui]$/.test(t)) {
466
520
  return { kind: 'primitive', name: t.endsWith('u') ? 'u32' : 'i32' };
467
521
  }
@@ -578,6 +632,17 @@ const F32_SCALAR_OP = {
578
632
  '/': 'div_f32',
579
633
  };
580
634
 
635
+ /**
636
+ * Scalar arithmetic that has to round to f16, by operator.
637
+ * @type {Object<string, string>}
638
+ */
639
+ const F16_SCALAR_OP = {
640
+ '+': 'add_f16',
641
+ '-': 'sub_f16',
642
+ '*': 'mul_f16',
643
+ '/': 'div_f16',
644
+ };
645
+
581
646
  // =========================================================================
582
647
  // Compiler context — central state during compilation
583
648
  // =========================================================================
@@ -889,7 +954,7 @@ function defaultValueForType(type) {
889
954
  case 'vec':
890
955
  return `wgsl.${vecAliasName(type.size, type.scalar)}()`;
891
956
  case 'mat':
892
- return `new Float32Array(${type.cols * type.rows})`;
957
+ return `new ${arrayCtorForScalar(type.scalar)}(${type.cols * type.rows})`;
893
958
  case 'array': {
894
959
  const length = type.count > 0 ? String(type.count)
895
960
  : type.count_name !== undefined ? `Number(${identToJs(type.count_name)})` : null;
@@ -1132,7 +1197,7 @@ function collectGlobalVariable(c, node) {
1132
1197
  // to the type's default value.
1133
1198
  const initializer_node = namedChildByType(node, 'expression');
1134
1199
  const init_code = initializer_node !== null
1135
- ? compileExpression(c, initializer_node).code
1200
+ ? compileExpressionForType(c, initializer_node, type).code
1136
1201
  : defaultValueForType(type);
1137
1202
  c.privateGlobals.push({
1138
1203
  name,
@@ -1170,7 +1235,7 @@ function collectGlobalValue(c, node) {
1170
1235
 
1171
1236
  const expr = keeps_abstract
1172
1237
  ? compileExpressionAbstract(c, value_node)
1173
- : compileExpression(c, value_node);
1238
+ : compileExpressionForType(c, value_node, type);
1174
1239
 
1175
1240
  // Infer the type from the RHS when there's no explicit annotation (mirrors the local
1176
1241
  // `let`/`var` path). Without this a `const M = mat3x3<f32>(...)` is left T_UNKNOWN, so a
@@ -1435,7 +1500,7 @@ function emitVariableOrValueStatement(c, node) {
1435
1500
  const keeps_abstract = is_wgsl_const && type_spec === null;
1436
1501
  const expr = keeps_abstract
1437
1502
  ? compileExpressionAbstract(c, expr_node)
1438
- : compileExpression(c, expr_node);
1503
+ : compileExpressionForType(c, expr_node, type);
1439
1504
  if (type === T_UNKNOWN || type.kind === 'unknown') {
1440
1505
  type = keeps_abstract ? expr.type : concreteDefault(expr.type);
1441
1506
  }
@@ -1492,6 +1557,12 @@ function compoundArithmeticHelper(helper, op_text, lhs_compiled, rhs_compiled) {
1492
1557
  return f32_scalar;
1493
1558
  }
1494
1559
 
1560
+ const f16_scalar = F16_SCALAR_OP[binary_op];
1561
+
1562
+ if (f16_scalar !== undefined && isScalarF16(arith_type)) {
1563
+ return f16_scalar;
1564
+ }
1565
+
1495
1566
  return helper;
1496
1567
  }
1497
1568
 
@@ -1508,7 +1579,7 @@ function emitVariableUpdatingStatement(c, node) {
1508
1579
  const op_text = textBetween(inner, lhs, expr).trim();
1509
1580
 
1510
1581
  const lhs_compiled = compileLhs(c, lhs);
1511
- const rhs_compiled = compileExpression(c, expr);
1582
+ const rhs_compiled = compileExpressionForType(c, expr, lhs_compiled.type);
1512
1583
 
1513
1584
  if (op_text === '=' || op_text === '') {
1514
1585
  c.out.add(emitWriteStatement(lhs_compiled, ownedValueCode(rhs_compiled)));
@@ -1671,7 +1742,8 @@ function emitReturnStatement(c, node) {
1671
1742
  if (expr === null) {
1672
1743
  c.out.add('return;');
1673
1744
  } else {
1674
- const e = compileExpression(c, expr);
1745
+ const fn_info = c.function_name !== null ? c.functions.get(c.function_name) : undefined;
1746
+ const e = compileExpressionForType(c, expr, fn_info !== undefined ? fn_info.returnType : T_UNKNOWN);
1675
1747
  // a parameter or a global handed straight back would otherwise reach the caller as itself
1676
1748
  c.out.add(`return ${isReferenceExpression(c, expr) ? ownedValueCode(e) : e.code};`);
1677
1749
  }
@@ -1782,8 +1854,8 @@ function emitForInitInline(c, node) {
1782
1854
  const ident = namedChildByType(opt_ident, 'ident');
1783
1855
  const type_spec = namedChildByType(opt_ident, 'type_specifier');
1784
1856
  const name = ident.text;
1785
- const init = expr_node !== null ? compileExpression(c, expr_node) : null;
1786
1857
  let type = type_spec !== null ? parseTypeSpecifier(type_spec) : T_UNKNOWN;
1858
+ const init = expr_node !== null ? compileExpressionForType(c, expr_node, type) : null;
1787
1859
  if (type.kind === 'unknown' && init !== null) {
1788
1860
  // `for (var i = 0; ...)`: a bare integer literal concretises to i32, as in a `let`
1789
1861
  type = concreteDefault(init.type);
@@ -1819,7 +1891,7 @@ function emitForUpdateInline(c, node) {
1819
1891
  const expr = namedChildByType(inner, 'expression');
1820
1892
  const op_text = textBetween(inner, lhs, expr).trim();
1821
1893
  const lhs_compiled = compileLhs(c, lhs);
1822
- const rhs_compiled = compileExpression(c, expr);
1894
+ const rhs_compiled = compileExpressionForType(c, expr, lhs_compiled.type);
1823
1895
  if (op_text === '=' || op_text === '') {
1824
1896
  if (lhs_compiled.through_pointer === true) {
1825
1897
  return `${lhs_compiled.code} = wgsl.store_ptr(${lhs_compiled.code}, ${ownedValueCode(rhs_compiled)})`;
@@ -2025,6 +2097,25 @@ function compileExpression(c, node) {
2025
2097
  return isAbstractFloat(e.type) ? convertAbstract(e, 'f32') : e;
2026
2098
  }
2027
2099
 
2100
+ /**
2101
+ * Compile an expression meeting a known target type (e.g. a typed `let`/`var`/`const` declaration
2102
+ * or an assignment). When the target is `f16` and the expression is abstract (`const LIMIT: f16 = 70000.0;`
2103
+ * or `let x: f16 = 0.1;`), the abstract value converts directly to `f16` via {@link convertAbstract}
2104
+ * (checking the `65504` range and rounding to binary16) rather than defaulting to `f32`.
2105
+ *
2106
+ * @param {Compiler} c
2107
+ * @param {Node} node
2108
+ * @param {WgslType} target_type
2109
+ * @returns {{ code: string, type: WgslType, value?: number }}
2110
+ */
2111
+ function compileExpressionForType(c, node, target_type) {
2112
+ if (isScalarF16(target_type)) {
2113
+ const e = compileExpressionAbstract(c, node);
2114
+ return isAbstractType(e.type) ? convertAbstract(e, 'f16') : e;
2115
+ }
2116
+ return compileExpression(c, node);
2117
+ }
2118
+
2028
2119
  /**
2029
2120
  * Compile an expression node (any wrapper or specific kind), leaving an abstract result abstract.
2030
2121
  *
@@ -2084,7 +2175,26 @@ function compileExpressionAbstract(c, node) {
2084
2175
  // A bare literal is abstract (see literalType), and takes its concrete type where it is used
2085
2176
  const code = literalToJs(u.text);
2086
2177
  const type = literalType(u.text);
2087
- return isAbstractType(type) ? { code, type, value: Number(code) } : { code, type };
2178
+ if (isAbstractType(type)) {
2179
+ return { code, type, value: Number(code) };
2180
+ }
2181
+ if (isScalarF16(type)) {
2182
+ const val = Number(code);
2183
+ if (!(Math.abs(val) <= FLOAT16_MAX)) {
2184
+ throw new Error(`WGSL compiler: value ${val} cannot be represented as 'f16' (at ${JSON.stringify(u.text)})`);
2185
+ }
2186
+ const rounded = roundF16(val);
2187
+ return { code: rounded === val ? code : `(${rounded})`, type, value: rounded };
2188
+ }
2189
+ if (isScalarF32(type)) {
2190
+ const val = Number(code);
2191
+ if (!(Math.abs(val) <= FLOAT32_MAX)) {
2192
+ throw new Error(`WGSL compiler: value ${val} cannot be represented as 'f32' (at ${JSON.stringify(u.text)})`);
2193
+ }
2194
+ const rounded = Math.fround(val);
2195
+ return { code: rounded === val ? code : `(${rounded})`, type, value: rounded };
2196
+ }
2197
+ return { code, type };
2088
2198
  }
2089
2199
  if (u.type === 'paren_expression') {
2090
2200
  const inner = namedChildByType(u, 'expression');
@@ -2182,10 +2292,28 @@ function compileBinaryExpression(c, node, op_type, mode) {
2182
2292
  if (f32_scalar !== undefined && isScalarF32(arith_type)) {
2183
2293
  actual_helper = f32_scalar;
2184
2294
  }
2295
+ const f16_scalar = F16_SCALAR_OP[op_text];
2296
+ if (f16_scalar !== undefined && isScalarF16(arith_type)) {
2297
+ actual_helper = f16_scalar;
2298
+ }
2299
+ let folded_value = undefined;
2300
+ if (isAbstractType(arith_type) && left.value !== undefined && right.value !== undefined) {
2301
+ if (op_text === '+') folded_value = left.value + right.value;
2302
+ else if (op_text === '-') folded_value = left.value - right.value;
2303
+ else if (op_text === '*') folded_value = left.value * right.value;
2304
+ else if (op_text === '/' && right.value !== 0) {
2305
+ folded_value = isAbstractInt(arith_type)
2306
+ ? Math.trunc(left.value / right.value)
2307
+ : left.value / right.value;
2308
+ } else if (op_text === '%' && right.value !== 0) {
2309
+ folded_value = left.value % right.value;
2310
+ }
2311
+ }
2185
2312
  // arithmetic on two AbstractInts is still AbstractInt, so `(1 + 2) / 2` is 1
2186
2313
  return {
2187
2314
  code: `wgsl.${actual_helper}(${left.code}, ${right.code})`,
2188
2315
  type: arith_type,
2316
+ value: folded_value,
2189
2317
  };
2190
2318
  }
2191
2319
  }
@@ -2281,6 +2409,19 @@ function isScalarF32(t) {
2281
2409
  return t !== undefined && t !== null && t.kind === 'primitive' && t.name === 'f32';
2282
2410
  }
2283
2411
 
2412
+ /** True if `t` is an `f16` SCALAR — a vec's lanes round through their Float16Array already. */
2413
+ function isScalarF16(t) {
2414
+ return t !== undefined && t !== null && t.kind === 'primitive' && t.name === 'f16';
2415
+ }
2416
+
2417
+ /** True if `t` is `f16` or a `vec`/`mat` whose scalar type is `f16`. */
2418
+ function isF16Type(t) {
2419
+ if (!t) return false;
2420
+ if (t.kind === 'primitive') return t.name === 'f16';
2421
+ if (t.kind === 'vec' || t.kind === 'mat') return t.scalar === 'f16';
2422
+ return false;
2423
+ }
2424
+
2284
2425
  /** True if `t` is an integer type (scalar or vec/mat of i32/u32). */
2285
2426
  function isIntegerType(t) {
2286
2427
  if (!t) return false;
@@ -2353,7 +2494,14 @@ function convertAbstract(operand, scalar) {
2353
2494
  }
2354
2495
 
2355
2496
  if (scalar === 'f16') {
2356
- return { code: `wgsl.f16(${operand.code})`, type };
2497
+ if (operand.value === undefined) {
2498
+ return { code: `wgsl.f16(${operand.code})`, type: T_F16 };
2499
+ }
2500
+ if (!(Math.abs(operand.value) <= FLOAT16_MAX)) {
2501
+ throw new Error(`WGSL compiler: value ${operand.value} cannot be represented as 'f16' (at ${JSON.stringify(operand.code)})`);
2502
+ }
2503
+ const rounded = roundF16(operand.value);
2504
+ return { code: rounded === operand.value ? operand.code : `(${rounded})`, type: T_F16 };
2357
2505
  }
2358
2506
 
2359
2507
  return { code: operand.code, type };
@@ -2694,7 +2842,57 @@ function compileCallPhraseTyped(c, node) {
2694
2842
  && arg_results.every(a => isAbstractType(a.type));
2695
2843
 
2696
2844
  if (!const_evaluated) {
2697
- arg_results = arg_results.map(a => isAbstractFloat(a.type) ? convertAbstract(a, 'f32') : a);
2845
+ let default_float_scalar = 'f32';
2846
+ let explicit_f16_target = false;
2847
+ if (callee_name === 'f16' || (VECTOR_ALIASES.hasOwnProperty(callee_name) && VECTOR_ALIASES[callee_name].scalar === 'f16')) {
2848
+ default_float_scalar = 'f16';
2849
+ explicit_f16_target = true;
2850
+ } else if ((callee_name === 'vec2' || callee_name === 'vec3' || callee_name === 'vec4') && template !== null) {
2851
+ const targs = extractTemplateArgs(template);
2852
+ if (targs[0] === 'f16') {
2853
+ default_float_scalar = 'f16';
2854
+ explicit_f16_target = true;
2855
+ }
2856
+ } else if (/^mat\dx\d/.test(callee_name)) {
2857
+ if (callee_name.endsWith('h') || (template !== null && extractTemplateArgs(template)[0] === 'f16')) {
2858
+ default_float_scalar = 'f16';
2859
+ explicit_f16_target = true;
2860
+ }
2861
+ } else if (callee_name === 'array' && template !== null) {
2862
+ const arr_type = parseTypeSpecifier(ident_node);
2863
+ if (arr_type.kind === 'array' && isF16Type(arr_type.element)) {
2864
+ default_float_scalar = 'f16';
2865
+ explicit_f16_target = true;
2866
+ }
2867
+ } else if (!c.functions.has(callee_name) && !c.structs.has(callee_name)) {
2868
+ for (const a of arg_results) {
2869
+ if (isF16Type(a.type)) {
2870
+ default_float_scalar = 'f16';
2871
+ break;
2872
+ }
2873
+ }
2874
+ }
2875
+
2876
+ const fn_info = c.functions.get(callee_name);
2877
+ const struct_info = c.structs.get(callee_name);
2878
+ arg_results = arg_results.map((a, idx) => {
2879
+ if (!isAbstractType(a.type)) return a;
2880
+ let target_scalar = default_float_scalar;
2881
+ let param_is_f16 = explicit_f16_target;
2882
+ if (fn_info !== undefined && idx < fn_info.params.length) {
2883
+ if (isF16Type(fn_info.params[idx].type)) {
2884
+ target_scalar = 'f16';
2885
+ param_is_f16 = true;
2886
+ }
2887
+ } else if (struct_info !== undefined && idx < struct_info.fields.length) {
2888
+ if (isF16Type(struct_info.fields[idx].type)) {
2889
+ target_scalar = 'f16';
2890
+ param_is_f16 = true;
2891
+ }
2892
+ }
2893
+ if (!isAbstractFloat(a.type) && !param_is_f16) return a;
2894
+ return convertAbstract(a, target_scalar);
2895
+ });
2698
2896
  }
2699
2897
 
2700
2898
  const args = arg_results.map(a => a.code);
@@ -2780,14 +2978,19 @@ function compileCallPhraseTyped(c, node) {
2780
2978
  else if (arg_type.kind === 'vec') source = arg_type.scalar;
2781
2979
  }
2782
2980
  const source_arg = source !== null ? `, ${JSON.stringify(source)}` : '';
2783
- // Parse the target string: `vec3<u32>` etc. become a vec type so that downstream
2784
- // swizzle/component access compiles correctly. Bare `f32` / `u32` / `i32` stay primitive.
2981
+ // Parse the target string: `vec3<u32>`, `vec2h`, etc. become a vec type so that downstream
2982
+ // swizzle/component access compiles correctly. Bare `f32` / `u32` / `i32` / `f16` stay primitive.
2785
2983
  let resultType;
2786
- const vec_match = target.match(/^vec(\d)<([^>]+)>$/);
2787
- if (vec_match !== null) {
2788
- resultType = { kind: 'vec', size: parseInt(vec_match[1]), scalar: vec_match[2] };
2984
+ if (VECTOR_ALIASES.hasOwnProperty(target)) {
2985
+ const a = VECTOR_ALIASES[target];
2986
+ resultType = { kind: 'vec', size: a.size, scalar: a.scalar };
2789
2987
  } else {
2790
- resultType = { kind: 'primitive', name: target };
2988
+ const vec_match = target.match(/^vec(\d)<\s*([^>\s]+)\s*>$/);
2989
+ if (vec_match !== null) {
2990
+ resultType = { kind: 'vec', size: parseInt(vec_match[1]), scalar: vec_match[2] };
2991
+ } else {
2992
+ resultType = { kind: 'primitive', name: target };
2993
+ }
2791
2994
  }
2792
2995
  return {
2793
2996
  code: `wgsl.bitcast(${args[0]}, ${JSON.stringify(target)}${source_arg})`,
@@ -2895,9 +3098,19 @@ function compileCallPhraseTyped(c, node) {
2895
3098
  }
2896
3099
  }
2897
3100
 
3101
+ const builtin_return_type = inferBuiltinReturnType(callee_name, arg_results);
3102
+ const builtin_call = `wgsl.${callee_name}(${args.join(', ')})`;
3103
+
3104
+ if (isScalarF16(builtin_return_type)) {
3105
+ return {
3106
+ code: `wgsl.f16(${builtin_call})`,
3107
+ type: builtin_return_type,
3108
+ };
3109
+ }
3110
+
2898
3111
  return {
2899
- code: `wgsl.${callee_name}(${args.join(', ')})`,
2900
- type: inferBuiltinReturnType(callee_name, arg_results),
3112
+ code: builtin_call,
3113
+ type: builtin_return_type,
2901
3114
  };
2902
3115
  }
2903
3116
 
@@ -2924,8 +3137,11 @@ const ELEMENT_WISE_BUILTIN = new Set([
2924
3137
  'abs', 'sign', 'floor', 'ceil', 'round', 'trunc', 'fract', 'sqrt', 'inverseSqrt',
2925
3138
  'exp', 'exp2', 'log', 'log2', 'sin', 'cos', 'tan', 'asin', 'acos', 'atan',
2926
3139
  'pow', 'atan2', 'min', 'max', 'step', 'clamp', 'saturate', 'mix', 'smoothstep',
2927
- 'normalize', 'reflect', 'fma',
2928
- 'subgroupBroadcastFirst',
3140
+ 'normalize', 'reflect', 'fma', 'quantizeToF16',
3141
+ 'subgroupBroadcastFirst', 'subgroupAdd', 'subgroupMul', 'subgroupMin', 'subgroupMax',
3142
+ 'subgroupAnd', 'subgroupOr', 'subgroupXor',
3143
+ 'subgroupExclusiveAdd', 'subgroupExclusiveMul', 'subgroupInclusiveAdd', 'subgroupInclusiveMul',
3144
+ 'quadSwapX', 'quadSwapY', 'quadSwapDiagonal',
2929
3145
  'dpdx', 'dpdy', 'fwidth', 'dpdxFine', 'dpdyFine', 'fwidthFine', 'dpdxCoarse', 'dpdyCoarse', 'fwidthCoarse',
2930
3146
  ]);
2931
3147
 
@@ -2959,15 +3175,36 @@ function inferBuiltinReturnType(name, args) {
2959
3175
  return commonArgumentType(args);
2960
3176
  }
2961
3177
  if (name === 'length' || name === 'distance' || name === 'dot' || name === 'determinant') {
3178
+ const t = commonArgumentType(args);
3179
+ if (t && (t.kind === 'vec' || t.kind === 'mat')) {
3180
+ return { kind: 'primitive', name: t.scalar };
3181
+ }
3182
+ if (t && t.kind === 'primitive') {
3183
+ return t;
3184
+ }
2962
3185
  return { kind: 'primitive', name: 'f32' };
2963
3186
  }
3187
+ if (name === 'transpose') {
3188
+ const t = args[0] && args[0].type;
3189
+ if (t && t.kind === 'mat') {
3190
+ return { kind: 'mat', cols: t.rows, rows: t.cols, scalar: t.scalar };
3191
+ }
3192
+ return T_UNKNOWN;
3193
+ }
3194
+ if (name === 'subgroupBroadcast' || name === 'subgroupShuffle' || name === 'subgroupShuffleDown'
3195
+ || name === 'subgroupShuffleUp' || name === 'subgroupShuffleXor' || name === 'quadBroadcast') {
3196
+ return args[0] && args[0].type ? args[0].type : T_UNKNOWN;
3197
+ }
3198
+ if (name === 'subgroupAll' || name === 'subgroupAny' || name === 'subgroupElect') {
3199
+ return { kind: 'primitive', name: 'bool' };
3200
+ }
2964
3201
  if (name === 'cross') {
2965
3202
  return args[0] && args[0].type && args[0].type.kind === 'vec'
2966
3203
  ? args[0].type
2967
3204
  : { kind: 'vec', size: 3, scalar: 'f32' };
2968
3205
  }
2969
- if (name === 'refract') {
2970
- // the incident vector's type; the third argument is the scalar ratio of indices
3206
+ if (name === 'refract' || name === 'faceForward') {
3207
+ // the incident vector's type; refract's third argument is the scalar ratio of indices
2971
3208
  return commonArgumentType(args.slice(0, 2));
2972
3209
  }
2973
3210
  if (name === 'all' || name === 'any') return { kind: 'primitive', name: 'bool' };
@@ -2,15 +2,14 @@ export namespace WGSLLanguageCore {
2
2
  /**
3
3
  * Bit-cast (WGSL `bitcast`). Reinterprets a value's bit pattern as a different type.
4
4
  *
5
- * JS has no separate u32/i32/f32 scalar types — they're all `number` — so the source type
6
- * cannot be detected from the value at runtime. The compiler passes it explicitly when known;
7
- * otherwise we fall back to a heuristic: integer-targeted casts assume f32 source, float-targeted
8
- * casts assume u32 source (the common "interpret bit pattern as float" idiom).
9
- *
10
- * For typed-array (vector) inputs the source type is auto-detected from the array constructor.
5
+ * Supports all WGSL §17.3.1 bitcast combinations, including:
6
+ * - Same-width scalar casts: `u32` ↔ `i32` ↔ `f32`, and `f16` ↔ `f16`
7
+ * - Same-length vector casts: `vecN<u32>` ↔ `vecN<i32>` ↔ `vecN<f32>`, `vecN<f16>` ↔ `vecN<f16>`
8
+ * - Width-changing 32-bit packed casts: `vec2<f16>` (`vec2h`) ↔ `u32` / `i32` / `f32`
9
+ * - Width-changing 64-bit packed casts: `vec4<f16>` (`vec4h`) ↔ `vec2<u32>` / `vec2<i32>` / `vec2<f32>`
11
10
  *
12
11
  * @param {*} v
13
- * @param {string} target — destination type name, e.g. `'f32'` / `'u32'` / `'i32'`
12
+ * @param {string} target — destination type name, e.g. `'f32'`, `'u32'`, `'vec2<f16>'`, `'vec2h'`, `'vec2u'`
14
13
  * @param {string} [source] — source type name; required for unambiguous scalar casts
15
14
  * @returns {number | TypedArray}
16
15
  */
@@ -1 +1 @@
1
- {"version":3,"file":"WGSLLanguageCore.d.ts","sourceRoot":"","sources":["../../../../../src/shade/wgsl/emulator/WGSLLanguageCore.js"],"names":[],"mappings":";IA4oDA;;;;;;;;;;;;;;OAcG;IACH,+DAmDC"}
1
+ {"version":3,"file":"WGSLLanguageCore.d.ts","sourceRoot":"","sources":["../../../../../src/shade/wgsl/emulator/WGSLLanguageCore.js"],"names":[],"mappings":";IA+yDA;;;;;;;;;;;;;OAaG;IACH,+DAyFC"}