@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
@@ -1,400 +1,330 @@
1
- import { cubic_residual_times_derivative_accumulate } from "../linalg/cubic_residual_times_derivative_accumulate.js";
2
- import { polynomial_cubic_horner_eval } from "../linalg/polynomial_cubic_horner_eval.js";
3
- import { polynomial_real_roots_in_interval } from "../linalg/polynomial_real_roots_in_interval.js";
4
- import { spline3_hermite_to_monomial } from "./spline3_hermite_to_monomial.js";
5
-
6
- /*
7
- Dimension-agnostic curve-pair closest-approach / intersection enumerator
8
- (dim ≥ 2). This is the path the dispatcher uses for all dim ≥ 2: the former
9
- bespoke 2D Bezout specialization was removed because it enumerated interior
10
- *intersections* plus boundary minima only and so missed interior
11
- non-intersection closest approaches. Closest approach is the global minimum of
12
-
13
- Φ(s, t) = Σ_d (A_d(s) − B_d(t))²
14
-
15
- over the closed unit square [0, 1]². It can occur at:
16
- 1. an interior critical point where ∇Φ = 0
17
- 2. a boundary edge minimum (one parameter pinned at 0 or 1)
18
- 3. a corner
19
-
20
- Interior critical points are roots of the bivariate gradient system
21
-
22
- F(s, t) = ½ ∂Φ/∂s = Σ_d (A_d(s) − B_d(t)) A_d′(s) (bidegree (5, 3))
23
- G(s, t) = ½ ∂Φ/∂t = −Σ_d (A_d(s) − B_d(t)) B_d′(t) (bidegree (3, 5))
24
-
25
- This module finds those interior critical points by 2D Newton started from a
26
- GRID_SIDE × GRID_SIDE grid in [0, 1]² — quadratically convergent once close,
27
- but reliant on the grid being dense enough to cover the basins of attraction
28
- of all real critical points (9×9 = 81 starts is dense enough for the
29
- geometric configurations seen in practice). A fully analytical alternative
30
- eliminates t through the 8×8 Sylvester resultant of F and G, yielding a
31
- univariate of degree ≤ 34 in s; it is exact and basin-independent but
32
- genuinely large code with delicate degree-34 root-finding numerics, so it is
33
- left as a possible future drop-in behind this same public API rather than
34
- implemented here.
35
-
36
- Boundary edges and corners are handled exactly: each edge reduces to a
37
- quintic-derivative root-finding (degree 5), and corners fall out as the
38
- endpoints tested inside each edge solve.
39
- */
40
-
41
- const MAX_DIM = 16;
42
-
43
- // Per-dim monomial coefficient buffers, one each for A and B. Length 4*MAX_DIM.
44
- const _a_mono = new Float64Array(4 * MAX_DIM);
45
- const _b_mono = new Float64Array(4 * MAX_DIM);
46
-
47
- const _candidate_st = new Float64Array(2);
48
- const _edge_fixed_point = new Float64Array(MAX_DIM);
49
-
50
- const NEWTON_MAX_ITER = 32;
51
- const NEWTON_GRADIENT_TOLERANCE = 1e-13;
52
- const NEWTON_STEP_TOLERANCE = 1e-15;
53
-
54
- const GRID_SIDE = 9; // 9x9 = 81 starting points
55
-
56
- const EDGE_QUINTIC_LEN = 6;
57
- const _edge_quintic = new Float64Array(EDGE_QUINTIC_LEN);
58
- const _edge_roots = new Float64Array(5);
59
-
60
- const CRITICAL_POINT_DEDUPE_TOLERANCE = 1e-7;
61
- const _seen_s = new Float64Array(GRID_SIDE * GRID_SIDE + 8);
62
- const _seen_t = new Float64Array(GRID_SIDE * GRID_SIDE + 8);
63
-
64
- // The gradient system (F, G) = (½ ∂Φ/∂s, ½ ∂Φ/∂t) and the 2×2 Jacobian
65
- // of that gradient are inlined directly into `newton_2d`'s hot loop — see
66
- // the module preamble for the algebraic definitions of F, G, and J.
67
-
68
- /**
69
- * 2D Newton on (F, G) from a starting (s, t). Writes the converged (s, t) into
70
- * `out` and returns true iff it converged inside [0, 1]² with small gradient.
71
- */
72
- // Tolerance for declaring the 2x2 Jacobian singular during the inlined
73
- // Newton solve. Matches `256 * FLT_EPSILON_64` used by
74
- // solve_linear_system_GEPP_2x2 to keep behaviour identical on edge cases.
75
- const NEWTON_SINGULAR_TOLERANCE = 256 * 1.1102230246251565e-16;
76
-
77
- function newton_2d(dim, s_init, t_init, out) {
78
- let s = s_init;
79
- let t = t_init;
80
-
81
- // F, G at the current (s, t) — promoted out of the heap-resident
82
- // `_newton_FG` scratch into iteration-local doubles.
83
- let F = 0, G = 0;
84
- let fg_valid_at_current_st = false;
85
-
86
- for (let iter = 0; iter < NEWTON_MAX_ITER; iter++) {
87
- // ── fused F/G + Jacobian over all dimensions ──
88
- // A single per-iteration sweep over dims computes the gradient
89
- // (F, G) and the symmetric Hessian (Jss, J_cross, Jtt) from one
90
- // load of each cubic's 4 coefficients. Eagerly computing the
91
- // Hessian costs us one extra second-derivative + 3 accumulations
92
- // per dim on the iteration that ends up converging — cheap insurance
93
- // for skipping a duplicate cubic-eval sweep on every non-converging
94
- // iteration. J_st = J_ts so the symmetric cross term is computed
95
- // once into J_cross.
96
- F = 0;
97
- G = 0;
98
- let Jss = 0, J_cross = 0, Jtt = 0;
99
-
100
- for (let d = 0; d < dim; d++) {
101
- const base = 4 * d;
102
- const a0 = _a_mono[base];
103
- const a1 = _a_mono[base + 1];
104
- const a2 = _a_mono[base + 2];
105
- const a3 = _a_mono[base + 3];
106
- const b0 = _b_mono[base];
107
- const b1 = _b_mono[base + 1];
108
- const b2 = _b_mono[base + 2];
109
- const b3 = _b_mono[base + 3];
110
-
111
- const A_v = a0 + s * (a1 + s * (a2 + s * a3));
112
- const A_p = a1 + s * (2 * a2 + s * 3 * a3);
113
- const A_pp = 2 * a2 + 6 * a3 * s;
114
- const B_v = b0 + t * (b1 + t * (b2 + t * b3));
115
- const B_p = b1 + t * (2 * b2 + t * 3 * b3);
116
- const B_pp = 2 * b2 + 6 * b3 * t;
117
-
118
- const diff = A_v - B_v;
119
- F += diff * A_p;
120
- G -= diff * B_p;
121
- Jss += A_p * A_p + diff * A_pp;
122
- J_cross += -A_p * B_p;
123
- Jtt += B_p * B_p - diff * B_pp;
124
- }
125
- fg_valid_at_current_st = true;
126
-
127
- if (Math.abs(F) < NEWTON_GRADIENT_TOLERANCE && Math.abs(G) < NEWTON_GRADIENT_TOLERANCE) {
128
- break;
129
- }
130
-
131
- // ── inline solve_linear_system_GEPP_2x2 on column-major J ──
132
- // J = [a00, a10; a01, a11] = [Jss, J_cross; J_cross, Jtt]; rhs = [F, G]
133
- // Partial pivoting on column 0, then forward eliminate, then back-sub.
134
- // The "exact zero" special cases handled by the full solver are skipped:
135
- // for a smooth residual Newton, exact zeros essentially never arise
136
- // (random + analytic inputs), and a singular Jacobian gets rejected
137
- // below the same way the full solver would.
138
- let a00 = Jss, a10 = J_cross, a01 = J_cross, a11 = Jtt;
139
- let b0 = F, b1 = G;
140
- if (Math.abs(a10) > Math.abs(a00)) {
141
- // Row swap
142
- let tmp = a00; a00 = a10; a10 = tmp;
143
- tmp = a01; a01 = a11; a11 = tmp;
144
- tmp = b0; b0 = b1; b1 = tmp;
145
- }
146
- if (a00 === 0) {
147
- return false; // singular column 0
148
- }
149
- const f = -a10 / a00;
150
- a11 += a01 * f;
151
- b1 += b0 * f;
152
- if (Math.abs(a11) < NEWTON_SINGULAR_TOLERANCE) {
153
- return false;
154
- }
155
- const dt = b1 / a11;
156
- const ds = (b0 - a01 * dt) / a00;
157
- if (!Number.isFinite(ds) || !Number.isFinite(dt)) {
158
- return false;
159
- }
160
-
161
- s -= ds;
162
- t -= dt;
163
-
164
- // (s, t) has just changed → cached F, G no longer match.
165
- fg_valid_at_current_st = false;
166
-
167
- // Early bail: if (s, t) has wandered well outside [0, 1] the start is
168
- // diverging or homed in on a critical point of the gradient system
169
- // that lies far from the parameter square. Newton won't reel it back.
170
- if (s < -0.5 || s > 1.5 || t < -0.5 || t > 1.5) {
171
- return false;
172
- }
173
-
174
- if (Math.abs(ds) < NEWTON_STEP_TOLERANCE && Math.abs(dt) < NEWTON_STEP_TOLERANCE) {
175
- break;
176
- }
177
- }
178
-
179
- if (s < -1e-9 || s > 1 + 1e-9) return false;
180
- if (t < -1e-9 || t > 1 + 1e-9) return false;
181
-
182
- // Validate gradient at the final (s, t). When `fg_valid_at_current_st`
183
- // is true we exited the loop via the gradient-tolerance break and the
184
- // validation already passed (tolerance 1e-13 < 1e-6); otherwise we
185
- // exited via the step-tolerance break or maxed out — re-evaluate to
186
- // confirm.
187
- if (!fg_valid_at_current_st) {
188
- F = 0;
189
- G = 0;
190
- for (let d = 0; d < dim; d++) {
191
- const base = 4 * d;
192
- const a0 = _a_mono[base];
193
- const a1 = _a_mono[base + 1];
194
- const a2 = _a_mono[base + 2];
195
- const a3 = _a_mono[base + 3];
196
- const b0 = _b_mono[base];
197
- const b1 = _b_mono[base + 1];
198
- const b2 = _b_mono[base + 2];
199
- const b3 = _b_mono[base + 3];
200
-
201
- const A_v = a0 + s * (a1 + s * (a2 + s * a3));
202
- const A_p = a1 + s * (2 * a2 + s * 3 * a3);
203
- const B_v = b0 + t * (b1 + t * (b2 + t * b3));
204
- const B_p = b1 + t * (2 * b2 + t * 3 * b3);
205
-
206
- const diff = A_v - B_v;
207
- F += diff * A_p;
208
- G -= diff * B_p;
209
- }
210
- if (Math.abs(F) > 1e-6 || Math.abs(G) > 1e-6) return false;
211
- }
212
-
213
- out[0] = s < 0 ? 0 : (s > 1 ? 1 : s);
214
- out[1] = t < 0 ? 0 : (t > 1 ? 1 : t);
215
- return true;
216
- }
217
-
218
- // ── boundary edge: nearest point on (varying-axis) curve to a fixed N-D point ──
219
-
220
- /**
221
- * Minimise ‖(curve_mono...)(t) − point[]‖² over t ∈ [0, 1], where the curve
222
- * is `dim`-dimensional with monomial coefficients packed as
223
- * `[α0_0, α1_0, α2_0, α3_0, α0_1, α1_1, ..., α3_{dim-1}]`.
224
- *
225
- * The squared distance is a degree-6 polynomial in t; its derivative is a
226
- * quintic. We hand the quintic to the polynomial root finder, then test the
227
- * roots plus the endpoints t = 0 and t = 1.
228
- *
229
- * Writes `[t_min, dist²]` into `out` (length ≥ 2).
230
- */
231
- function nearest_t_to_fixed_point(curve_mono, dim, point, point_offset, out) {
232
- for (let i = 0; i < EDGE_QUINTIC_LEN; i++){
233
- _edge_quintic[i] = 0;
234
- }
235
-
236
- for (let d = 0; d < dim; d++) {
237
- cubic_residual_times_derivative_accumulate(
238
- _edge_quintic, curve_mono, 4 * d, point[point_offset + d]
239
- );
240
- }
241
-
242
- // Aberth iteration cap of 32 is plenty for the degree-5 quintic that
243
- // comes out of `(p(t) - offset)·p'(t)` on a smooth Hermite cubic — the
244
- // routine's own convergence check still fires early in the common case.
245
- // Default cap (80) is way more than needed and is the worst-case work
246
- // budget; lowering it is a flat ~10-20% saving on degenerate inputs.
247
- const root_count = polynomial_real_roots_in_interval(
248
- _edge_quintic, 5, 0, 1, _edge_roots, 0,
249
- 32
250
- );
251
-
252
- let best_t = 0;
253
- let best_d2 = Number.POSITIVE_INFINITY;
254
-
255
- for (let i = -2; i < root_count; i++) {
256
-
257
- const t = i === -2 ? 0 : (i === -1 ? 1 : _edge_roots[i]);
258
- let d2 = 0;
259
-
260
- for (let d = 0; d < dim; d++) {
261
- const base = 4 * d;
262
- const v = polynomial_cubic_horner_eval(curve_mono, base, t);
263
- const dv = v - point[point_offset + d];
264
- d2 += dv * dv;
265
- }
266
-
267
- if (d2 < best_d2) {
268
- best_d2 = d2;
269
- best_t = t;
270
- }
271
-
272
- }
273
-
274
- out[0] = best_t;
275
- out[1] = best_d2;
276
- }
277
-
278
- // ── public ────────────────────────────────────────────────────────────────
279
-
280
- /**
281
- * Upper bound on the number of (s, t) pairs the ND variant can return:
282
- * one per starting point of the GRID_SIDE × GRID_SIDE grid Newton, plus the
283
- * four boundary edges, plus a small slack. The corresponding result-buffer
284
- * size in floats is `2 * ND_MAX_ROOTS`.
285
- *
286
- * @type {number}
287
- */
288
- export const ND_MAX_ROOTS = GRID_SIDE * GRID_SIDE + 8;
289
-
290
- /**
291
- * Critical-point enumerator for the dimension-agnostic Hermite curve-pair
292
- * intersection / closest-approach problem (dim ≥ 2; the dispatcher routes all
293
- * dim ≥ 2 here). Writes (s, t) pairs sequentially into `result` starting at
294
- * `result_offset` and returns the count.
295
- *
296
- * What is reported (deduplicated within
297
- * CRITICAL_POINT_DEDUPE_TOLERANCE = 1e-7 in each parameter):
298
- * - Interior critical points of squared distance found by 2D Newton
299
- * started from a GRID_SIDE × GRID_SIDE grid in [0,1]² and accepted
300
- * when they converge inside [0,1]² with small gradient.
301
- * - Four boundary closest-approach pairs, one per edge of [0,1]², each
302
- * coming from a quintic root-find of (curve − fixed point)·curve′.
303
- *
304
- * Caller is responsible for evaluating both curves at each (s, t) and
305
- * picking whichever pair(s) they care about (closest, within threshold,
306
- * etc.).
307
- *
308
- * Required buffer size:
309
- * `result.length >= result_offset + 2 * ND_MAX_ROOTS` floats (currently 178).
310
- *
311
- * @param {Float64Array|number[]} a length 4*dim
312
- * @param {Float64Array|number[]} b length 4*dim
313
- * @param {number} dim ≥ 2
314
- * @param {Float64Array|number[]} result length >= result_offset + 2 * ND_MAX_ROOTS
315
- * @param {number} result_offset
316
- * @returns {number} number of (s, t) pairs written
317
- */
318
- export function spline3_hermite_intersection_spline3_hermite_nd(
319
- a, b, dim,
320
- result, result_offset
321
- ) {
322
- if (dim > MAX_DIM) {
323
- throw new Error(`dim=${dim} exceeds MAX_DIM=${MAX_DIM}`);
324
- }
325
-
326
- // Pack monomial coefficients per-axis into the module buffers.
327
- for (let d = 0; d < dim; d++) {
328
- const off = 4 * d;
329
- spline3_hermite_to_monomial(_a_mono, off, 1, a[off], a[off + 1], a[off + 2], a[off + 3]);
330
- spline3_hermite_to_monomial(_b_mono, off, 1, b[off], b[off + 1], b[off + 2], b[off + 3]);
331
- }
332
-
333
- // We dedupe near-identical critical points discovered from different grid
334
- // starts. _seen_s / _seen_t double as the "candidates written so far" and
335
- // are mirrored into the caller's `result` buffer as we go.
336
- let count = 0;
337
- let write = result_offset;
338
-
339
- const try_candidate = (s, t) => {
340
- for (let i = 0; i < count; i++) {
341
- if (Math.abs(_seen_s[i] - s) < CRITICAL_POINT_DEDUPE_TOLERANCE
342
- && Math.abs(_seen_t[i] - t) < CRITICAL_POINT_DEDUPE_TOLERANCE) {
343
- return;
344
- }
345
- }
346
- _seen_s[count] = s;
347
- _seen_t[count] = t;
348
- result[write++] = s;
349
- result[write++] = t;
350
- count++;
351
- };
352
-
353
- // Interior critical points via Newton from a grid.
354
- const step = 1 / (GRID_SIDE - 1);
355
- for (let i = 0; i < GRID_SIDE; i++) {
356
- const s_init = i * step;
357
- for (let j = 0; j < GRID_SIDE; j++) {
358
- const t_init = j * step;
359
- if (newton_2d(dim, s_init, t_init, _candidate_st)) {
360
- try_candidate(_candidate_st[0], _candidate_st[1]);
361
- }
362
- }
363
- }
364
-
365
- // Boundary edges. Each edge problem reduces to "nearest point on the
366
- // *other* curve to a fixed point on the boundary curve".
367
- const tmp_pt = _edge_fixed_point;
368
-
369
- // Edge s = 0: fixed point is A(0); minimise over t on B.
370
- for (let d = 0; d < dim; d++){
371
- tmp_pt[d] = _a_mono[4 * d]; // α0
372
- }
373
- nearest_t_to_fixed_point(_b_mono, dim, tmp_pt, 0, _candidate_st);
374
- try_candidate(0, _candidate_st[0]);
375
-
376
- // Edge s = 1: A(1) = α0 + α1 + α2 + α3.
377
- for (let d = 0; d < dim; d++) {
378
- const base = 4 * d;
379
- tmp_pt[d] = _a_mono[base] + _a_mono[base + 1] + _a_mono[base + 2] + _a_mono[base + 3];
380
- }
381
- nearest_t_to_fixed_point(_b_mono, dim, tmp_pt, 0, _candidate_st);
382
- try_candidate(1, _candidate_st[0]);
383
-
384
- // Edge t = 0: fixed point is B(0); minimise over s on A.
385
- for (let d = 0; d < dim; d++){
386
- tmp_pt[d] = _b_mono[4 * d];
387
- }
388
- nearest_t_to_fixed_point(_a_mono, dim, tmp_pt, 0, _candidate_st);
389
- try_candidate(_candidate_st[0], 0);
390
-
391
- // Edge t = 1.
392
- for (let d = 0; d < dim; d++) {
393
- const base = 4 * d;
394
- tmp_pt[d] = _b_mono[base] + _b_mono[base + 1] + _b_mono[base + 2] + _b_mono[base + 3];
395
- }
396
- nearest_t_to_fixed_point(_a_mono, dim, tmp_pt, 0, _candidate_st);
397
- try_candidate(_candidate_st[0], 1);
398
-
399
- return count;
400
- }
1
+ import { nearest_t_to_fixed_point } from "./spline3_hermite_nearest_point.js";
2
+ import { spline3_hermite_to_monomial } from "./spline3_hermite_to_monomial.js";
3
+
4
+ /*
5
+ Dimension-agnostic curve-pair closest-approach / intersection enumerator
6
+ (dim ≥ 2). This is the path the dispatcher uses for all dim ≥ 2: the former
7
+ bespoke 2D Bezout specialization was removed because it enumerated interior
8
+ *intersections* plus boundary minima only and so missed interior
9
+ non-intersection closest approaches. Closest approach is the global minimum of
10
+
11
+ Φ(s, t) = Σ_d (A_d(s) − B_d(t))²
12
+
13
+ over the closed unit square [0, 1]². It can occur at:
14
+ 1. an interior critical point where ∇Φ = 0
15
+ 2. a boundary edge minimum (one parameter pinned at 0 or 1)
16
+ 3. a corner
17
+
18
+ Interior critical points are roots of the bivariate gradient system
19
+
20
+ F(s, t) = ½ ∂Φ/∂s = Σ_d (A_d(s) − B_d(t)) A_d′(s) (bidegree (5, 3))
21
+ G(s, t) = ½ ∂Φ/∂t = −Σ_d (A_d(s) − B_d(t)) B_d′(t) (bidegree (3, 5))
22
+
23
+ This module finds those interior critical points by 2D Newton started from a
24
+ GRID_SIDE × GRID_SIDE grid in [0, 1]² — quadratically convergent once close,
25
+ but reliant on the grid being dense enough to cover the basins of attraction
26
+ of all real critical points (9×9 = 81 starts is dense enough for the
27
+ geometric configurations seen in practice). A fully analytical alternative
28
+ eliminates t through the 8×8 Sylvester resultant of F and G, yielding a
29
+ univariate of degree ≤ 34 in s; it is exact and basin-independent but
30
+ genuinely large code with delicate degree-34 root-finding numerics, so it is
31
+ left as a possible future drop-in behind this same public API rather than
32
+ implemented here.
33
+
34
+ Boundary edges and corners are handled exactly: each edge reduces to a
35
+ quintic-derivative root-finding (degree 5), and corners fall out as the
36
+ endpoints tested inside each edge solve.
37
+ */
38
+
39
+ const MAX_DIM = 16;
40
+
41
+ // Per-dim monomial coefficient buffers, one each for A and B. Length 4*MAX_DIM.
42
+ const _a_mono = new Float64Array(4 * MAX_DIM);
43
+ const _b_mono = new Float64Array(4 * MAX_DIM);
44
+
45
+ const _candidate_st = new Float64Array(2);
46
+ const _edge_fixed_point = new Float64Array(MAX_DIM);
47
+
48
+ const NEWTON_MAX_ITER = 32;
49
+ const NEWTON_GRADIENT_TOLERANCE = 1e-13;
50
+ const NEWTON_STEP_TOLERANCE = 1e-15;
51
+
52
+ const GRID_SIDE = 9; // 9x9 = 81 starting points
53
+
54
+ const CRITICAL_POINT_DEDUPE_TOLERANCE = 1e-7;
55
+ const _seen_s = new Float64Array(GRID_SIDE * GRID_SIDE + 8);
56
+ const _seen_t = new Float64Array(GRID_SIDE * GRID_SIDE + 8);
57
+
58
+ // The gradient system (F, G) = (½ ∂Φ/∂s, ½ ∂Φ/∂t) and the 2×2 Jacobian
59
+ // of that gradient are inlined directly into `newton_2d`'s hot loop — see
60
+ // the module preamble for the algebraic definitions of F, G, and J.
61
+
62
+ /**
63
+ * 2D Newton on (F, G) from a starting (s, t). Writes the converged (s, t) into
64
+ * `out` and returns true iff it converged inside [0, 1]² with small gradient.
65
+ */
66
+ // Tolerance for declaring the 2x2 Jacobian singular during the inlined
67
+ // Newton solve. Matches `256 * FLT_EPSILON_64` used by
68
+ // solve_linear_system_GEPP_2x2 to keep behaviour identical on edge cases.
69
+ const NEWTON_SINGULAR_TOLERANCE = 256 * 1.1102230246251565e-16;
70
+
71
+ function newton_2d(dim, s_init, t_init, out) {
72
+ let s = s_init;
73
+ let t = t_init;
74
+
75
+ // F, G at the current (s, t) — promoted out of the heap-resident
76
+ // `_newton_FG` scratch into iteration-local doubles.
77
+ let F = 0, G = 0;
78
+ let fg_valid_at_current_st = false;
79
+
80
+ for (let iter = 0; iter < NEWTON_MAX_ITER; iter++) {
81
+ // ── fused F/G + Jacobian over all dimensions ──
82
+ // A single per-iteration sweep over dims computes the gradient
83
+ // (F, G) and the symmetric Hessian (Jss, J_cross, Jtt) from one
84
+ // load of each cubic's 4 coefficients. Eagerly computing the
85
+ // Hessian costs us one extra second-derivative + 3 accumulations
86
+ // per dim on the iteration that ends up converging — cheap insurance
87
+ // for skipping a duplicate cubic-eval sweep on every non-converging
88
+ // iteration. J_st = J_ts so the symmetric cross term is computed
89
+ // once into J_cross.
90
+ F = 0;
91
+ G = 0;
92
+ let Jss = 0, J_cross = 0, Jtt = 0;
93
+
94
+ for (let d = 0; d < dim; d++) {
95
+ const base = 4 * d;
96
+ const a0 = _a_mono[base];
97
+ const a1 = _a_mono[base + 1];
98
+ const a2 = _a_mono[base + 2];
99
+ const a3 = _a_mono[base + 3];
100
+ const b0 = _b_mono[base];
101
+ const b1 = _b_mono[base + 1];
102
+ const b2 = _b_mono[base + 2];
103
+ const b3 = _b_mono[base + 3];
104
+
105
+ const A_v = a0 + s * (a1 + s * (a2 + s * a3));
106
+ const A_p = a1 + s * (2 * a2 + s * 3 * a3);
107
+ const A_pp = 2 * a2 + 6 * a3 * s;
108
+ const B_v = b0 + t * (b1 + t * (b2 + t * b3));
109
+ const B_p = b1 + t * (2 * b2 + t * 3 * b3);
110
+ const B_pp = 2 * b2 + 6 * b3 * t;
111
+
112
+ const diff = A_v - B_v;
113
+ F += diff * A_p;
114
+ G -= diff * B_p;
115
+ Jss += A_p * A_p + diff * A_pp;
116
+ J_cross += -A_p * B_p;
117
+ Jtt += B_p * B_p - diff * B_pp;
118
+ }
119
+ fg_valid_at_current_st = true;
120
+
121
+ if (Math.abs(F) < NEWTON_GRADIENT_TOLERANCE && Math.abs(G) < NEWTON_GRADIENT_TOLERANCE) {
122
+ break;
123
+ }
124
+
125
+ // ── inline solve_linear_system_GEPP_2x2 on column-major J ──
126
+ // J = [a00, a10; a01, a11] = [Jss, J_cross; J_cross, Jtt]; rhs = [F, G]
127
+ // Partial pivoting on column 0, then forward eliminate, then back-sub.
128
+ // The "exact zero" special cases handled by the full solver are skipped:
129
+ // for a smooth residual Newton, exact zeros essentially never arise
130
+ // (random + analytic inputs), and a singular Jacobian gets rejected
131
+ // below the same way the full solver would.
132
+ let a00 = Jss, a10 = J_cross, a01 = J_cross, a11 = Jtt;
133
+ let b0 = F, b1 = G;
134
+ if (Math.abs(a10) > Math.abs(a00)) {
135
+ // Row swap
136
+ let tmp = a00; a00 = a10; a10 = tmp;
137
+ tmp = a01; a01 = a11; a11 = tmp;
138
+ tmp = b0; b0 = b1; b1 = tmp;
139
+ }
140
+ if (a00 === 0) {
141
+ return false; // singular column 0
142
+ }
143
+ const f = -a10 / a00;
144
+ a11 += a01 * f;
145
+ b1 += b0 * f;
146
+ if (Math.abs(a11) < NEWTON_SINGULAR_TOLERANCE) {
147
+ return false;
148
+ }
149
+ const dt = b1 / a11;
150
+ const ds = (b0 - a01 * dt) / a00;
151
+ if (!Number.isFinite(ds) || !Number.isFinite(dt)) {
152
+ return false;
153
+ }
154
+
155
+ s -= ds;
156
+ t -= dt;
157
+
158
+ // (s, t) has just changed → cached F, G no longer match.
159
+ fg_valid_at_current_st = false;
160
+
161
+ // Early bail: if (s, t) has wandered well outside [0, 1] the start is
162
+ // diverging or homed in on a critical point of the gradient system
163
+ // that lies far from the parameter square. Newton won't reel it back.
164
+ if (s < -0.5 || s > 1.5 || t < -0.5 || t > 1.5) {
165
+ return false;
166
+ }
167
+
168
+ if (Math.abs(ds) < NEWTON_STEP_TOLERANCE && Math.abs(dt) < NEWTON_STEP_TOLERANCE) {
169
+ break;
170
+ }
171
+ }
172
+
173
+ if (s < -1e-9 || s > 1 + 1e-9) return false;
174
+ if (t < -1e-9 || t > 1 + 1e-9) return false;
175
+
176
+ // Validate gradient at the final (s, t). When `fg_valid_at_current_st`
177
+ // is true we exited the loop via the gradient-tolerance break and the
178
+ // validation already passed (tolerance 1e-13 < 1e-6); otherwise we
179
+ // exited via the step-tolerance break or maxed out — re-evaluate to
180
+ // confirm.
181
+ if (!fg_valid_at_current_st) {
182
+ F = 0;
183
+ G = 0;
184
+ for (let d = 0; d < dim; d++) {
185
+ const base = 4 * d;
186
+ const a0 = _a_mono[base];
187
+ const a1 = _a_mono[base + 1];
188
+ const a2 = _a_mono[base + 2];
189
+ const a3 = _a_mono[base + 3];
190
+ const b0 = _b_mono[base];
191
+ const b1 = _b_mono[base + 1];
192
+ const b2 = _b_mono[base + 2];
193
+ const b3 = _b_mono[base + 3];
194
+
195
+ const A_v = a0 + s * (a1 + s * (a2 + s * a3));
196
+ const A_p = a1 + s * (2 * a2 + s * 3 * a3);
197
+ const B_v = b0 + t * (b1 + t * (b2 + t * b3));
198
+ const B_p = b1 + t * (2 * b2 + t * 3 * b3);
199
+
200
+ const diff = A_v - B_v;
201
+ F += diff * A_p;
202
+ G -= diff * B_p;
203
+ }
204
+ if (Math.abs(F) > 1e-6 || Math.abs(G) > 1e-6) return false;
205
+ }
206
+
207
+ out[0] = s < 0 ? 0 : (s > 1 ? 1 : s);
208
+ out[1] = t < 0 ? 0 : (t > 1 ? 1 : t);
209
+ return true;
210
+ }
211
+
212
+ // ── public ────────────────────────────────────────────────────────────────
213
+
214
+ /**
215
+ * Upper bound on the number of (s, t) pairs the ND variant can return:
216
+ * one per starting point of the GRID_SIDE × GRID_SIDE grid Newton, plus the
217
+ * four boundary edges, plus a small slack. The corresponding result-buffer
218
+ * size in floats is `2 * ND_MAX_ROOTS`.
219
+ *
220
+ * @type {number}
221
+ */
222
+ export const ND_MAX_ROOTS = GRID_SIDE * GRID_SIDE + 8;
223
+
224
+ /**
225
+ * Critical-point enumerator for the dimension-agnostic Hermite curve-pair
226
+ * intersection / closest-approach problem (dim ≥ 2; the dispatcher routes all
227
+ * dim ≥ 2 here). Writes (s, t) pairs sequentially into `result` starting at
228
+ * `result_offset` and returns the count.
229
+ *
230
+ * What is reported (deduplicated within
231
+ * CRITICAL_POINT_DEDUPE_TOLERANCE = 1e-7 in each parameter):
232
+ * - Interior critical points of squared distance found by 2D Newton
233
+ * started from a GRID_SIDE × GRID_SIDE grid in [0,1]² and accepted
234
+ * when they converge inside [0,1]² with small gradient.
235
+ * - Four boundary closest-approach pairs, one per edge of [0,1]², each
236
+ * coming from a quintic root-find of (curve − fixed point)·curve′.
237
+ *
238
+ * Caller is responsible for evaluating both curves at each (s, t) and
239
+ * picking whichever pair(s) they care about (closest, within threshold,
240
+ * etc.).
241
+ *
242
+ * Required buffer size:
243
+ * `result.length >= result_offset + 2 * ND_MAX_ROOTS` floats (currently 178).
244
+ *
245
+ * @param {Float64Array|number[]} a length 4*dim
246
+ * @param {Float64Array|number[]} b length 4*dim
247
+ * @param {number} dim ≥ 2
248
+ * @param {Float64Array|number[]} result length >= result_offset + 2 * ND_MAX_ROOTS
249
+ * @param {number} result_offset
250
+ * @returns {number} number of (s, t) pairs written
251
+ */
252
+ export function spline3_hermite_intersection_spline3_hermite_nd(
253
+ a, b, dim,
254
+ result, result_offset
255
+ ) {
256
+ if (dim > MAX_DIM) {
257
+ throw new Error(`dim=${dim} exceeds MAX_DIM=${MAX_DIM}`);
258
+ }
259
+
260
+ // Pack monomial coefficients per-axis into the module buffers.
261
+ for (let d = 0; d < dim; d++) {
262
+ const off = 4 * d;
263
+ spline3_hermite_to_monomial(_a_mono, off, 1, a[off], a[off + 1], a[off + 2], a[off + 3]);
264
+ spline3_hermite_to_monomial(_b_mono, off, 1, b[off], b[off + 1], b[off + 2], b[off + 3]);
265
+ }
266
+
267
+ // We dedupe near-identical critical points discovered from different grid
268
+ // starts. _seen_s / _seen_t double as the "candidates written so far" and
269
+ // are mirrored into the caller's `result` buffer as we go.
270
+ let count = 0;
271
+ let write = result_offset;
272
+
273
+ const try_candidate = (s, t) => {
274
+ for (let i = 0; i < count; i++) {
275
+ if (Math.abs(_seen_s[i] - s) < CRITICAL_POINT_DEDUPE_TOLERANCE
276
+ && Math.abs(_seen_t[i] - t) < CRITICAL_POINT_DEDUPE_TOLERANCE) {
277
+ return;
278
+ }
279
+ }
280
+ _seen_s[count] = s;
281
+ _seen_t[count] = t;
282
+ result[write++] = s;
283
+ result[write++] = t;
284
+ count++;
285
+ };
286
+
287
+ // Interior critical points via Newton from a grid.
288
+ const step = 1 / (GRID_SIDE - 1);
289
+ for (let i = 0; i < GRID_SIDE; i++) {
290
+ const s_init = i * step;
291
+ for (let j = 0; j < GRID_SIDE; j++) {
292
+ const t_init = j * step;
293
+ if (newton_2d(dim, s_init, t_init, _candidate_st)) {
294
+ try_candidate(_candidate_st[0], _candidate_st[1]);
295
+ }
296
+ }
297
+ }
298
+
299
+ // Boundary edges. Each edge problem reduces to "nearest point on the
300
+ // *other* curve to a fixed point on the boundary curve".
301
+ const tmp_pt = _edge_fixed_point;
302
+
303
+ // Edge s = 0: fixed point is A(0); minimise over t on B.
304
+ for (let d = 0; d < dim; d++){
305
+ tmp_pt[d] = _a_mono[4 * d]; // α0
306
+ }
307
+ try_candidate(0, nearest_t_to_fixed_point(_b_mono, dim, tmp_pt, 0));
308
+
309
+ // Edge s = 1: A(1) = α0 + α1 + α2 + α3.
310
+ for (let d = 0; d < dim; d++) {
311
+ const base = 4 * d;
312
+ tmp_pt[d] = _a_mono[base] + _a_mono[base + 1] + _a_mono[base + 2] + _a_mono[base + 3];
313
+ }
314
+ try_candidate(1, nearest_t_to_fixed_point(_b_mono, dim, tmp_pt, 0));
315
+
316
+ // Edge t = 0: fixed point is B(0); minimise over s on A.
317
+ for (let d = 0; d < dim; d++){
318
+ tmp_pt[d] = _b_mono[4 * d];
319
+ }
320
+ try_candidate(nearest_t_to_fixed_point(_a_mono, dim, tmp_pt, 0), 0);
321
+
322
+ // Edge t = 1.
323
+ for (let d = 0; d < dim; d++) {
324
+ const base = 4 * d;
325
+ tmp_pt[d] = _b_mono[base] + _b_mono[base + 1] + _b_mono[base + 2] + _b_mono[base + 3];
326
+ }
327
+ try_candidate(nearest_t_to_fixed_point(_a_mono, dim, tmp_pt, 0), 1);
328
+
329
+ return count;
330
+ }