@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
@@ -0,0 +1,588 @@
1
+ import { GOLDEN_RATIO } from "../../../core/math/GOLDEN_RATIO.js";
2
+ import { PI2 } from "../../../core/math/PI2.js";
3
+ import { clamp } from "../../../core/math/clamp.js";
4
+ import { phyllotaxis_sample_angle } from "../config/PhyllotaxisMode.js";
5
+ import { shoot_order_value } from "../config/ShootBudZone.js";
6
+ import { foliage_atlas_cutout } from "../material/foliage_atlas_cutout.js";
7
+ import { foliage_tile_layout } from "../material/foliage_tile.js";
8
+ import { foliage_card_leaf_area } from "./foliage_card_density.js";
9
+ import { foliage_unit_leaf_count } from "./foliage_unit_cards.js";
10
+ import { ShootFrameworkHash } from "./ShootFrameworkHash.js";
11
+ import { ShootGirth } from "./ShootGirth.js";
12
+ import { ShootLightField } from "./ShootLightField.js";
13
+ import { shoot_expected_yield, shoot_sample_unit_length } from "./shoot_demography.js";
14
+ import { shoot_locate_on_chain, shoot_normalize3, shoot_outward3, shoot_perpendicular3, shoot_radius } from "./shoot_geometry.js";
15
+
16
+ const GOLDEN_ANGLE = PI2 / (GOLDEN_RATIO * GOLDEN_RATIO);
17
+
18
+ /**
19
+ * Room (m) the light field leaves around the framework for the twig systems to grow into; leaf past it shades nothing
20
+ * and sees open sky. Chosen.
21
+ * @type {number}
22
+ */
23
+ const LIGHT_FIELD_MARGIN = 2.0;
24
+
25
+ const SCRATCH_P = new Float32Array(3);
26
+ const SCRATCH_T = new Float32Array(3);
27
+ const SCRATCH_R = new Float64Array(3);
28
+ const SCRATCH_O = new Float64Array(3);
29
+ const SCRATCH_H = new Float64Array(3);
30
+ const SCRATCH_A = new Float64Array(3);
31
+ const SCRATCH_B = new Float64Array(3);
32
+
33
+ /**
34
+ * @typedef {Object} ShootCarrier
35
+ * @property {import("../config/ShootSystemRule.js").ShootSystemRule} rule
36
+ * @property {number} carrier framework branch
37
+ * @property {number} length metres
38
+ * @property {number[]} nodes the carrier's chain
39
+ * @property {number[]} edges
40
+ * @property {number[]} units lengths (m) of its last annual units, oldest first, ending at its tip
41
+ * @property {Float64Array} starts arc length (m) from its base where each unit starts
42
+ * @property {Float64Array} points world position of each unit boundary, `(units + 1) * 3`, the last its tip
43
+ * @property {number} first_season season its oldest unit grew in
44
+ * @property {Float64Array} [carrier_area] pipe area of what grows on each unit, after the simulation
45
+ * @property {Float64Array} [carrier_demand] radius each unit needs where its laterals join, after the simulation
46
+ */
47
+
48
+ /**
49
+ * @typedef {Object} ShootAxis
50
+ * @property {number} system index of its carrier
51
+ * @property {number} parent mother axis, `-1` for the carrier
52
+ * @property {number} parent_unit unit of the mother it grew from, oldest first
53
+ * @property {number} u where along that unit, 0 base to 1 tip
54
+ * @property {number} node bud index on that unit, for the leaf spiral
55
+ * @property {number} order branching order, the carrier being `rule.carrier_order`
56
+ * @property {boolean} short a short shoot
57
+ * @property {number} generator its branch generator
58
+ * @property {number} phase random phase in [0, 1)
59
+ * @property {number[]} units lengths (m), oldest first
60
+ * @property {number[]} unit_seasons season each unit grew in
61
+ * @property {number[]} points world position of each unit boundary, `(units + 1) * 3`
62
+ * @property {number[]} radii radius (m) of the wood at each unit boundary, `units + 1`
63
+ * @property {number} anchor_edge carrier segment a first-order axis grows from, else -1
64
+ */
65
+
66
+ /**
67
+ * Grows the twig systems of every carrier together, season by season, in the light their leaves make for each other,
68
+ * for `seasons` seasons: the tree's age, so every unit of every carrier has had the time since it grew to grow its
69
+ * twigs.
70
+ *
71
+ * Each season:
72
+ * 1. **Light.** The leaves alive last season are put in a {@link ShootLightField}, and each shoot reads the relative
73
+ * irradiance where it grows.
74
+ * 2. **Extension.** Every living long axis grows a terminal unit, bent from its last by the generator's phototropism,
75
+ * gravitropism and zigzag, `terminal_length + terminal_length_slope *` its last unit long on average.
76
+ * 3. **Short shoots** live on at `short_shoot_survival`, less in light too dim for a shoot to replace itself.
77
+ * 4. **Buds.** Last season's units burst their buds: by zone and mother order, a `long` share grow long shoots and a
78
+ * `short` share short shoots. A `sylleptic` share of this season's units' buds grow at once.
79
+ * 5. **Shedding.** A new shoot in relative light `Q` survives at `p = net_yield(Q) / yield`. That is the species'
80
+ * net shoots per shoot at that light, over the gross new shoots its mother makes. Of a season's new shoots the
81
+ * sum of their `p` survive, with a carried-over remainder so the count is exact on average. They are ranked by
82
+ * `log p` plus the rank of oak's shedding: the highest orders, the youngest axes and the shortest shoots go first
83
+ * (Buck-Sorlin & Bell 1998, Bot. J. Linn. Soc. 127: 371-391, p. 388). So the shaded go before the lit, and among
84
+ * equally lit shoots an established axis outlasts a new lateral. A shed terminal sheds its whole axis with
85
+ * everything on it, as oak sheds only at an axis's base (p. 388). So a branch in deep shade, whose terminals are
86
+ * shed, dies.
87
+ *
88
+ * The wood thickens season by season with what it carries (`ShootGirth`): twigs, carriers, and the framework above
89
+ * them. A shoot whose path would run into framework wood as thick as it is that season is a blocked bud and does not
90
+ * grow; its mother's junction is the one exception. A blocked terminal leaves its axis without a unit that season. A
91
+ * shoot whose wood the framework, or its own girth, has grown into by the end of a season is engulfed and dies with
92
+ * everything on it.
93
+ *
94
+ * @param {import("./TreeSkeleton.js").TreeSkeleton} skeleton
95
+ * @param {import("../config/TreeSpeciesConfig.js").TreeSpeciesConfig} species
96
+ * @param {ShootCarrier[]} carriers
97
+ * @param {number} seasons
98
+ * @param {function():number} rng
99
+ * @returns {ShootAxis[]} the living axes, a mother before its laterals
100
+ */
101
+ export function shoot_systems_simulate(skeleton, species, carriers, seasons, rng) {
102
+ const growth = species.shoot_growth;
103
+ // everything in the skeleton now is framework
104
+ const framework_segments = skeleton.segment_count;
105
+ const girth = new ShootGirth(skeleton, carriers, skeleton.branch_count, species.crown.pipe_model_exponent);
106
+ let framework = new ShootFrameworkHash(skeleton, framework_segments);
107
+ const leaf_survival = species.foliage.leaf_survival;
108
+ const yields = carriers.map(c => shoot_expected_yield(c.rule));
109
+
110
+ // Leaf area of one leaf, as the cards draw it
111
+ const leafy = new Map();
112
+ for (const rule of species.foliage_rules) {
113
+ leafy.set(rule.source, rule.short_shoot);
114
+ }
115
+ let leaf_area_each = 0;
116
+ if (leafy.size > 0) {
117
+ const layout = foliage_tile_layout(species);
118
+ const coverage = foliage_atlas_cutout(species).mean_coverage();
119
+ leaf_area_each = foliage_card_leaf_area(layout, species.foliage.card_type, coverage, 1.0) / layout.leaves_per_card;
120
+ }
121
+
122
+ const field = make_light_field(skeleton, growth.light_cell);
123
+
124
+ /** @type {Array<ShootAxis & {alive: boolean, birth: number, heading: number[], taken: Array<number[]|null>, exempt_branch: number, key: number}>} */
125
+ const axes = [];
126
+ /** buds spent on sylleptic shoots per carrier unit, by zone */
127
+ const carrier_taken = carriers.map(c => new Array(c.units.length).fill(null));
128
+ let remainder = 0.5;
129
+
130
+ const survival_at = (light, system) => clamp(growth.net_yield(light) / yields[system], 0, 1);
131
+
132
+ /**
133
+ * Where a bud on unit `k` of a mother sits, and the mother's tangent there, into SCRATCH_P / SCRATCH_T.
134
+ * @returns {{edge: number, u: number}|null} the carrier segment, for a carrier's bud
135
+ */
136
+ const bud_site = (system, mother, k, u) => {
137
+ if (mother < 0) {
138
+ const c = carriers[system];
139
+ const located = shoot_locate_on_chain(skeleton, c.nodes, c.edges, (c.starts[k] + u * c.units[k]) / c.length);
140
+ skeleton.evaluate_segment_position(SCRATCH_P, 0, located.edge, located.u);
141
+ skeleton.evaluate_segment_tangent(SCRATCH_T, 0, located.edge, located.u);
142
+ shoot_normalize3(SCRATCH_T, SCRATCH_T[0], SCRATCH_T[1], SCRATCH_T[2]);
143
+ return located;
144
+ }
145
+ const p = axes[mother].points;
146
+ const a = k * 3, b = (k + 1) * 3;
147
+ SCRATCH_P[0] = p[a] + (p[b] - p[a]) * u;
148
+ SCRATCH_P[1] = p[a + 1] + (p[b + 1] - p[a + 1]) * u;
149
+ SCRATCH_P[2] = p[a + 2] + (p[b + 2] - p[a + 2]) * u;
150
+ shoot_normalize3(SCRATCH_T, p[b] - p[a], p[b + 1] - p[a + 1], p[b + 2] - p[a + 2]);
151
+ return null;
152
+ };
153
+
154
+ /**
155
+ * A lateral from bud `node` at `u` on unit `k` of `mother` (`-1` for the carrier), or -1 when the bud cannot grow:
156
+ * knocked out on a plagiotropic mother, or blocked by framework wood.
157
+ */
158
+ const spawn = (system, mother, k, u, node, order, mean_length, short, season, candidates) => {
159
+ const c = carriers[system];
160
+ const rule = c.rule;
161
+ const located = bud_site(system, mother, k, u);
162
+ const px = SCRATCH_P[0], py = SCRATCH_P[1], pz = SCRATCH_P[2];
163
+ const mtx = SCRATCH_T[0], mty = SCRATCH_T[1], mtz = SCRATCH_T[2];
164
+ const mother_phase = mother < 0 ? skeleton.branch_phase_hash[c.carrier] : axes[mother].phase;
165
+ const mother_generator = mother < 0 ? rule.source : axes[mother].generator;
166
+
167
+ // radial direction at the bud: a frame around the mother's tangent turned by the leaf spiral
168
+ shoot_perpendicular3(SCRATCH_R, mtx, mty, mtz);
169
+ const rx0 = SCRATCH_R[0], ry0 = SCRATCH_R[1], rz0 = SCRATCH_R[2];
170
+ const sx0 = mty * rz0 - mtz * ry0;
171
+ const sy0 = mtz * rx0 - mtx * rz0;
172
+ const sz0 = mtx * ry0 - mty * rx0;
173
+ const ins = shoot_order_value(rule.insertion_angle, order - 1) * (0.85 + 0.3 * rng());
174
+ const cos_i = Math.cos(ins), sin_i = Math.sin(ins);
175
+ // a plagiotropic mother breaks no bud into the downward cone (its ventral knockout): the bud turns by the golden
176
+ // angle until it clears it, or does not break
177
+ const plagio = species.branches[mother_generator].plagiotropism;
178
+ const ventral_cos = plagio > 0 ? Math.cos(plagio * Math.PI * 0.5) : Infinity;
179
+ let phi = phyllotaxis_sample_angle(rule.phyllotaxis_mode, node, 1, mother_phase * PI2) + (rng() - 0.5) * 0.4;
180
+ let tx = 0, ty = 0, tz = 0;
181
+ let cleared = false;
182
+ for (let attempt = 0; attempt < 5 && !cleared; attempt++, phi += GOLDEN_ANGLE) {
183
+ const drx = Math.cos(phi) * rx0 + Math.sin(phi) * sx0;
184
+ const dry = Math.cos(phi) * ry0 + Math.sin(phi) * sy0;
185
+ const drz = Math.cos(phi) * rz0 + Math.sin(phi) * sz0;
186
+ tx = cos_i * mtx + sin_i * drx;
187
+ ty = cos_i * mty + sin_i * dry;
188
+ tz = cos_i * mtz + sin_i * drz;
189
+ cleared = -ty / Math.max(1e-9, Math.hypot(tx, ty, tz)) <= ventral_cos;
190
+ }
191
+ if (!cleared) return -1;
192
+ shoot_normalize3(SCRATCH_H, tx, ty, tz);
193
+
194
+ const len = short ? rule.short_shoot_growth : shoot_sample_unit_length(rng, mean_length, order, rule);
195
+ SCRATCH_A[0] = px;
196
+ SCRATCH_A[1] = py;
197
+ SCRATCH_A[2] = pz;
198
+ SCRATCH_B[0] = px + SCRATCH_H[0] * len;
199
+ SCRATCH_B[1] = py + SCRATCH_H[1] * len;
200
+ SCRATCH_B[2] = pz + SCRATCH_H[2] * len;
201
+ const exempt_branch = mother < 0 ? c.carrier : -1;
202
+ const exempt_edge = located !== null ? located.edge : -1;
203
+ // a shoot does not grow through wood that was there first, its own junction aside
204
+ if (framework.hits(SCRATCH_A, SCRATCH_B, shoot_radius(len, 0), exempt_branch, exempt_edge)) return -1;
205
+
206
+ const light = field.irradiance_at(px, py, pz);
207
+ axes.push({
208
+ system, parent: mother, parent_unit: k, u, node, order, short,
209
+ generator: short ? rule.short_target : rule.target,
210
+ phase: rng(),
211
+ units: [len],
212
+ unit_seasons: [season],
213
+ points: [px, py, pz, SCRATCH_B[0], SCRATCH_B[1], SCRATCH_B[2]],
214
+ radii: [],
215
+ anchor_edge: located !== null ? located.edge : -1,
216
+ exempt_branch,
217
+ heading: [SCRATCH_H[0], SCRATCH_H[1], SCRATCH_H[2]],
218
+ taken: [null],
219
+ birth: season,
220
+ alive: true,
221
+ key: 0
222
+ });
223
+ const m = axes.length - 1;
224
+ if (!short) {
225
+ const p = survival_at(light, system);
226
+ candidates.push({ axis: m, p, key: shed_rank(p, order, len, 0, rule, rng) });
227
+ axes[m].taken[0] = sylleptic(system, m, 0, len, order, season, candidates);
228
+ }
229
+ return m;
230
+ };
231
+
232
+ /** Buds of a unit grown this season that grow out at once; the buds they spent, by zone */
233
+ const sylleptic = (system, mother, k, unit_length, order, season, candidates) => {
234
+ const rule = carriers[system].rule;
235
+ if (order + 1 > rule.max_order) return null;
236
+ let taken = null;
237
+ let node = 0;
238
+ for (let z = 0; z < rule.zones.length; z++) {
239
+ const zone = rule.zones[z];
240
+ const n = zone.bud_count(unit_length, order);
241
+ const p = shoot_order_value(zone.sylleptic, order);
242
+ if (p > 0) {
243
+ const count = binomial(rng, n, p);
244
+ if (taken === null) taken = new Array(rule.zones.length).fill(0);
245
+ taken[z] = count;
246
+ const mean = lateral_mean(zone, order, unit_length);
247
+ for (let j = 0; j < count; j++) {
248
+ const u = lerp_u(zone.u_max, zone.u_min, (j + rng()) / Math.max(1, count));
249
+ spawn(system, mother, k, u, node + j, order + 1, mean, false, season, candidates);
250
+ }
251
+ }
252
+ node += n;
253
+ }
254
+ return taken;
255
+ };
256
+
257
+ /** Unit `k` of a mother, grown last season, bursts its buds */
258
+ const burst = (system, mother, k, unit_length, order, taken, season, candidates) => {
259
+ const rule = carriers[system].rule;
260
+ if (order + 1 > rule.max_order) return;
261
+ let node = 0;
262
+ for (let z = 0; z < rule.zones.length; z++) {
263
+ const zone = rule.zones[z];
264
+ const all = zone.bud_count(unit_length, order);
265
+ const n = all - (taken !== null ? taken[z] : 0);
266
+ const p_long = shoot_order_value(zone.long, order);
267
+ const p_short = shoot_order_value(zone.short, order);
268
+ let n_long = 0;
269
+ let n_short = 0;
270
+ if (p_short > 0) {
271
+ for (let i = 0; i < n; i++) {
272
+ const r = rng();
273
+ if (r < p_long) n_long++;
274
+ else if (r < p_long + p_short) n_short++;
275
+ }
276
+ } else {
277
+ n_long = binomial(rng, n, p_long);
278
+ }
279
+ const mean = lateral_mean(zone, order, unit_length);
280
+ for (let j = 0; j < n_long; j++) {
281
+ spawn(system, mother, k, lerp_u(zone.u_max, zone.u_min, (j + rng()) / Math.max(1, n_long)), node + j, order + 1, mean, false, season, candidates);
282
+ }
283
+ for (let j = 0; j < n_short; j++) {
284
+ spawn(system, mother, k, lerp_u(zone.u_max, zone.u_min, (j + rng()) / Math.max(1, n_short)), node + n_long + j, order + 1, 0, true, season, candidates);
285
+ }
286
+ node += all;
287
+ }
288
+ };
289
+
290
+ for (let season = 0; season < seasons; season++) {
291
+ // 1. Light from last season's leaves
292
+ if (season > 0) {
293
+ field.clear();
294
+ deposit_leaves(field, species, carriers, axes, season - 1, leafy, leaf_area_each, leaf_survival);
295
+ field.solve(growth.leaf_clumping);
296
+ }
297
+
298
+ /** @type {Array<{axis: number, p: number, key: number}>} key: the shedding rank, the highest kept */
299
+ const candidates = [];
300
+
301
+ // 2. Every living long axis extends by a terminal unit, a candidate for shedding with its whole axis
302
+ const extended = [];
303
+ const count_before = axes.length;
304
+ for (let m = 0; m < count_before; m++) {
305
+ const axis = axes[m];
306
+ if (!axis.alive || axis.short || axis.birth >= season) continue;
307
+ const rule = carriers[axis.system].rule;
308
+ const cfg = species.branches[axis.generator];
309
+ const n = axis.units.length;
310
+ const pts = axis.points;
311
+ const tip = n * 3;
312
+ const light = field.irradiance_at(pts[tip], pts[tip + 1], pts[tip + 2]);
313
+ shoot_outward3(SCRATCH_O, skeleton, pts[tip], pts[tip + 1], pts[tip + 2]);
314
+ const zig = cfg.internode_zigzag;
315
+ const h = axis.heading;
316
+ shoot_normalize3(
317
+ SCRATCH_H,
318
+ h[0] + cfg.phototropism * 0.5 * SCRATCH_O[0] + (rng() * 2 - 1) * zig,
319
+ h[1] + cfg.phototropism * 0.5 * SCRATCH_O[1] - cfg.gravitropism * 0.5 + (rng() * 2 - 1) * zig,
320
+ h[2] + cfg.phototropism * 0.5 * SCRATCH_O[2] + (rng() * 2 - 1) * zig
321
+ );
322
+ const prev = axis.units[n - 1];
323
+ const mean = shoot_order_value(rule.terminal_length, axis.order) + shoot_order_value(rule.terminal_length_slope, axis.order) * prev;
324
+ const len = shoot_sample_unit_length(rng, mean, axis.order, rule);
325
+ SCRATCH_A[0] = pts[tip];
326
+ SCRATCH_A[1] = pts[tip + 1];
327
+ SCRATCH_A[2] = pts[tip + 2];
328
+ SCRATCH_B[0] = pts[tip] + SCRATCH_H[0] * len;
329
+ SCRATCH_B[1] = pts[tip + 1] + SCRATCH_H[1] * len;
330
+ SCRATCH_B[2] = pts[tip + 2] + SCRATCH_H[2] * len;
331
+ if (framework.hits(SCRATCH_A, SCRATCH_B, shoot_radius(len, 0), axis.exempt_branch, axis.anchor_edge)) continue;
332
+ axis.units.push(len);
333
+ axis.unit_seasons.push(season);
334
+ axis.taken.push(null);
335
+ pts.push(SCRATCH_B[0], SCRATCH_B[1], SCRATCH_B[2]);
336
+ h[0] = SCRATCH_H[0];
337
+ h[1] = SCRATCH_H[1];
338
+ h[2] = SCRATCH_H[2];
339
+ const p_ext = survival_at(light, axis.system);
340
+ candidates.push({ axis: m, p: p_ext, key: shed_rank(p_ext, axis.order, len, season - axis.birth, rule, rng) });
341
+ extended.push(m);
342
+ }
343
+
344
+ // 3. Short shoots live on, a year's growth each, or die
345
+ for (let m = 0; m < count_before; m++) {
346
+ const axis = axes[m];
347
+ if (!axis.alive || !axis.short || axis.birth >= season) continue;
348
+ const rule = carriers[axis.system].rule;
349
+ const pts = axis.points;
350
+ const tip = axis.units.length * 3;
351
+ const light = field.irradiance_at(pts[tip], pts[tip + 1], pts[tip + 2]);
352
+ if (rng() < rule.short_shoot_survival * Math.min(1, growth.net_yield(light))) {
353
+ const g = rule.short_shoot_growth;
354
+ axis.units.push(g);
355
+ axis.unit_seasons.push(season);
356
+ pts.push(pts[tip] + axis.heading[0] * g, pts[tip + 1] + axis.heading[1] * g, pts[tip + 2] + axis.heading[2] * g);
357
+ } else {
358
+ axis.alive = false;
359
+ }
360
+ }
361
+
362
+ // 4. Units grown last season burst their buds: on the carriers and on every living long axis
363
+ for (let s = 0; s < carriers.length; s++) {
364
+ const c = carriers[s];
365
+ const k = season - 1 - c.first_season;
366
+ if (k >= 0 && k < c.units.length) {
367
+ burst(s, -1, k, c.units[k], c.rule.carrier_order, carrier_taken[s][k], season, candidates);
368
+ }
369
+ }
370
+ for (let m = 0; m < count_before; m++) {
371
+ const axis = axes[m];
372
+ if (!axis.alive || axis.short || axis.birth >= season) continue;
373
+ const k = axis.unit_seasons.lastIndexOf(season - 1);
374
+ if (k >= 0) {
375
+ burst(axis.system, m, k, axis.units[k], axis.order, axis.taken[k], season, candidates);
376
+ }
377
+ }
378
+
379
+ // 5. This season's units branch at once where their buds are sylleptic: the carriers' and the extensions'
380
+ for (let s = 0; s < carriers.length; s++) {
381
+ const c = carriers[s];
382
+ const k = season - c.first_season;
383
+ if (k >= 0 && k < c.units.length) {
384
+ carrier_taken[s][k] = sylleptic(s, -1, k, c.units[k], c.rule.carrier_order, season, candidates);
385
+ }
386
+ }
387
+ for (let i = 0; i < extended.length; i++) {
388
+ const m = extended[i];
389
+ const axis = axes[m];
390
+ const k = axis.units.length - 1;
391
+ axis.taken[k] = sylleptic(axis.system, m, k, axis.units[k], axis.order, season, candidates);
392
+ }
393
+
394
+ // 6. Shedding: the best-lit share of this season's new shoots survives
395
+ let expected = remainder;
396
+ for (let i = 0; i < candidates.length; i++) expected += candidates[i].p;
397
+ const keep = Math.floor(expected);
398
+ remainder = expected - keep;
399
+ candidates.sort((a, b) => b.key - a.key);
400
+ for (let i = keep; i < candidates.length; i++) {
401
+ axes[candidates[i].axis].alive = false;
402
+ }
403
+ // a dead mother takes everything on it; mothers come first
404
+ cascade(axes);
405
+
406
+ // 7. The wood thickens with what it now carries, and what it has grown into dies
407
+ girth.update(axes, season);
408
+ framework = new ShootFrameworkHash(skeleton, framework_segments);
409
+ for (let m = 0; m < axes.length; m++) {
410
+ const axis = axes[m];
411
+ if (!axis.alive) continue;
412
+ if (axis.parent >= 0 && !axes[axis.parent].alive) {
413
+ axis.alive = false;
414
+ continue;
415
+ }
416
+ const pts = axis.points;
417
+ const r = axis.radii;
418
+ for (let k = 0; k < axis.units.length; k++) {
419
+ SCRATCH_A[0] = pts[k * 3];
420
+ SCRATCH_A[1] = pts[k * 3 + 1];
421
+ SCRATCH_A[2] = pts[k * 3 + 2];
422
+ SCRATCH_B[0] = pts[k * 3 + 3];
423
+ SCRATCH_B[1] = pts[k * 3 + 4];
424
+ SCRATCH_B[2] = pts[k * 3 + 5];
425
+ if (framework.hits(SCRATCH_A, SCRATCH_B, Math.max(r[k], r[k + 1]), axis.exempt_branch, axis.anchor_edge)) {
426
+ axis.alive = false;
427
+ break;
428
+ }
429
+ }
430
+ }
431
+ }
432
+
433
+ // The living axes, a mother before its laterals
434
+ const index = new Int32Array(axes.length).fill(-1);
435
+ /** @type {ShootAxis[]} */
436
+ const living = [];
437
+ for (let m = 0; m < axes.length; m++) {
438
+ const axis = axes[m];
439
+ if (!axis.alive) continue;
440
+ index[m] = living.length;
441
+ living.push({
442
+ system: axis.system,
443
+ parent: axis.parent < 0 ? -1 : index[axis.parent],
444
+ parent_unit: axis.parent_unit,
445
+ u: axis.u,
446
+ node: axis.node,
447
+ order: axis.order,
448
+ short: axis.short,
449
+ generator: axis.generator,
450
+ phase: axis.phase,
451
+ units: axis.units,
452
+ unit_seasons: axis.unit_seasons,
453
+ points: axis.points,
454
+ radii: axis.radii,
455
+ anchor_edge: axis.anchor_edge
456
+ });
457
+ }
458
+ return living;
459
+ }
460
+
461
+ /**
462
+ * Kills every axis whose mother has died; mothers come before their laterals.
463
+ * @param {Array<{parent: number, alive: boolean}>} axes
464
+ */
465
+ function cascade(axes) {
466
+ for (let m = 0; m < axes.length; m++) {
467
+ const parent = axes[m].parent;
468
+ if (axes[m].alive && parent >= 0 && !axes[parent].alive) axes[m].alive = false;
469
+ }
470
+ }
471
+
472
+ /**
473
+ * A light field over the framework and {@link LIGHT_FIELD_MARGIN} around it.
474
+ * @param {import("./TreeSkeleton.js").TreeSkeleton} skeleton
475
+ * @param {number} cell
476
+ * @returns {ShootLightField}
477
+ */
478
+ function make_light_field(skeleton, cell) {
479
+ const min = [Infinity, Infinity, Infinity];
480
+ const max = [-Infinity, -Infinity, -Infinity];
481
+ const p = new Float32Array(3);
482
+ for (let v = 0; v < skeleton.node_count; v++) {
483
+ skeleton.node_read_position(p, 0, v);
484
+ for (let i = 0; i < 3; i++) {
485
+ min[i] = Math.min(min[i], p[i]);
486
+ max[i] = Math.max(max[i], p[i]);
487
+ }
488
+ }
489
+ for (let i = 0; i < 3; i++) {
490
+ min[i] -= LIGHT_FIELD_MARGIN;
491
+ max[i] += LIGHT_FIELD_MARGIN;
492
+ }
493
+ return new ShootLightField(min, max, cell);
494
+ }
495
+
496
+ /**
497
+ * Puts the leaves alive in `season` into `field`: on each leaf-bearing unit young enough to keep them, the unit's leaves
498
+ * times the share of that age still alive, spread along it; a short shoot's at its tip. `leaf_area_each` is one leaf's
499
+ * area (m^2).
500
+ */
501
+ function deposit_leaves(field, species, carriers, axes, season, leafy, leaf_area_each, leaf_survival) {
502
+ const L = leaf_survival.length;
503
+ for (let s = 0; s < carriers.length; s++) {
504
+ const c = carriers[s];
505
+ if (!leafy.has(c.rule.source)) continue;
506
+ for (let k = 0; k < c.units.length; k++) {
507
+ const age = season - (c.first_season + k);
508
+ if (age < 0 || age >= L) continue;
509
+ const area = foliage_unit_leaf_count(species, false, c.units[k]) * leaf_area_each * leaf_survival[age];
510
+ field.deposit_segment(c.points.subarray(k * 3, k * 3 + 3), c.points.subarray(k * 3 + 3, k * 3 + 6), area);
511
+ }
512
+ }
513
+ for (let m = 0; m < axes.length; m++) {
514
+ const axis = axes[m];
515
+ if (!axis.alive || !leafy.has(axis.generator)) continue;
516
+ const pts = axis.points;
517
+ if (axis.short) {
518
+ const tip = axis.units.length * 3;
519
+ field.deposit(pts[tip], pts[tip + 1], pts[tip + 2], foliage_unit_leaf_count(species, true, 0) * leaf_area_each);
520
+ continue;
521
+ }
522
+ for (let k = 0; k < axis.units.length; k++) {
523
+ const age = season - axis.unit_seasons[k];
524
+ if (age < 0 || age >= L) continue;
525
+ const area = foliage_unit_leaf_count(species, false, axis.units[k]) * leaf_area_each * leaf_survival[age];
526
+ SCRATCH_A[0] = pts[k * 3];
527
+ SCRATCH_A[1] = pts[k * 3 + 1];
528
+ SCRATCH_A[2] = pts[k * 3 + 2];
529
+ SCRATCH_B[0] = pts[k * 3 + 3];
530
+ SCRATCH_B[1] = pts[k * 3 + 4];
531
+ SCRATCH_B[2] = pts[k * 3 + 5];
532
+ field.deposit_segment(SCRATCH_A, SCRATCH_B, area);
533
+ }
534
+ }
535
+ }
536
+
537
+ /**
538
+ * Rank of a new shoot for surviving, the highest kept: the log of its chance in the light it has, plus oak's shedding
539
+ * rank, by which older axes, lower orders and longer units hold on, and the highest orders and short shoots are shed
540
+ * first [Buck-Sorlin & Bell 1998 p. 388]. The rank's weights are chosen.
541
+ *
542
+ * @param {number} p chance of surviving in its light
543
+ * @param {number} order
544
+ * @param {number} length metres
545
+ * @param {number} age seasons its axis has lived
546
+ * @param {import("../config/ShootSystemRule.js").ShootSystemRule} rule
547
+ * @param {function():number} rng
548
+ * @returns {number}
549
+ */
550
+ function shed_rank(p, order, length, age, rule, rng) {
551
+ return Math.log(Math.max(1e-6, p)) + 1.5 * age - 0.5 * order + Math.log(length / rule.mean_unit_length) + 0.5 * rng();
552
+ }
553
+
554
+ /**
555
+ * Mean length (m) of the first unit of a long lateral from `zone`, grown on a mother of `order` from a unit
556
+ * `unit_length` long.
557
+ * @param {import("../config/ShootBudZone.js").ShootBudZone} zone
558
+ * @param {number} order
559
+ * @param {number} unit_length
560
+ * @returns {number}
561
+ */
562
+ function lateral_mean(zone, order, unit_length) {
563
+ return shoot_order_value(zone.length, order) + shoot_order_value(zone.length_slope, order) * unit_length;
564
+ }
565
+
566
+ /**
567
+ * @param {function():number} rng
568
+ * @param {number} n
569
+ * @param {number} p
570
+ * @returns {number}
571
+ */
572
+ function binomial(rng, n, p) {
573
+ let k = 0;
574
+ for (let i = 0; i < n; i++) {
575
+ if (rng() < p) k++;
576
+ }
577
+ return k;
578
+ }
579
+
580
+ /**
581
+ * @param {number} a
582
+ * @param {number} b
583
+ * @param {number} t
584
+ * @returns {number}
585
+ */
586
+ function lerp_u(a, b, t) {
587
+ return a + (b - a) * clamp(t, 0, 1);
588
+ }
@@ -1,10 +1,26 @@
1
1
  /**
2
- * Selects up to `max_joints` structural skeleton nodes in strict topological pre-order
3
- * (`joint_parents[j] < j`) from `skeleton.graph` for GPU skeletal wind animation (`Skin`),
4
- * and writes `[primary_joint_index, parent_joint_index]` into `skeleton.attr_node_joint` for every node.
2
+ * Derives the wind joints of a tree for GPU skeletal wind animation (`Skin`) from how its wood bends, in strict
3
+ * topological pre-order (`joint_parents[j] < j`), and writes `[primary_joint_index, parent_joint_index]` into
4
+ * `skeleton.attr_node_joint` for every node, and each joint's pivot and turn in the reference wind into the skeleton
5
+ * (`TreeSkeleton.set_joints`).
6
+ *
7
+ * Joints go where the rig would otherwise hide visible sway. Every segment bends by its share of its branch's bend in a
8
+ * `TREE_WIND_REFERENCE_SPEED` wind (beam elements, `tree_skeleton_compute_segment_mechanics`), saturated as the rig
9
+ * shows it (`tree_wind_bend_limit`). Walking each branch from its base:
10
+ *
11
+ * - while the branch has no joint, its bending is lost: a bend `theta` moves what the segment carries by up to
12
+ * `theta * reach`, so the branch gets a joint at the first node past which that sum is still over the tolerance;
13
+ * - a joint rotates its whole span about its own pivot, so a bend `theta` at a distance `x` along the span lands
14
+ * `theta * x` off, and a new joint starts where that error would pass the tolerance.
15
+ *
16
+ * The tolerance is `species.wind.deflection_tolerance`, a distance in metres. So stiff or bare wood takes few joints,
17
+ * slender leafy wood many, and a tall tree, whose bends move more, more than a small one. Node 0, the trunk
18
+ * base, is always joint 0 and stays anchored. Branches of a `root` generator never get a joint, so surface roots stay
19
+ * bound to their parent's stationary base joint and do not lift out of the soil in wind. `species.wind.max_joints` is
20
+ * only a safety net: past it, the joints that would hide the least sway are dropped.
5
21
  *
6
22
  * @param {import("./TreeSkeleton.js").TreeSkeleton} skeleton
7
- * @param {number} [max_joints=32]
23
+ * @param {TreeSpeciesConfig} species
8
24
  * @returns {{
9
25
  * joint_count: number,
10
26
  * joint_vertex_ids: Int32Array,
@@ -13,12 +29,12 @@
13
29
  * joint_tangents: Float32Array,
14
30
  * joint_levels: Uint8Array,
15
31
  * joint_phases: Float32Array,
16
- * joint_t_norms: Float32Array,
17
- * joint_radii: Float32Array,
18
- * joint_lengths: Float32Array
19
- * }}
32
+ * joint_compliance: Float32Array,
33
+ * joint_natural_frequency: Float32Array
34
+ * }} `joint_compliance` (rad / (m/s)^2) and `joint_natural_frequency` (rad/s) are each joint's cantilever
35
+ * wind mechanics, see `tree_skeleton_compute_joint_mechanics`
20
36
  */
21
- export function tree_skeleton_assign_skin_joints(skeleton: import("./TreeSkeleton.js").TreeSkeleton, max_joints?: number): {
37
+ export function tree_skeleton_assign_skin_joints(skeleton: import("./TreeSkeleton.js").TreeSkeleton, species: TreeSpeciesConfig): {
22
38
  joint_count: number;
23
39
  joint_vertex_ids: Int32Array;
24
40
  joint_parents: Int32Array;
@@ -26,8 +42,8 @@ export function tree_skeleton_assign_skin_joints(skeleton: import("./TreeSkeleto
26
42
  joint_tangents: Float32Array;
27
43
  joint_levels: Uint8Array;
28
44
  joint_phases: Float32Array;
29
- joint_t_norms: Float32Array;
30
- joint_radii: Float32Array;
31
- joint_lengths: Float32Array;
45
+ joint_compliance: Float32Array;
46
+ joint_natural_frequency: Float32Array;
32
47
  };
48
+ import { TreeSpeciesConfig } from "../config/TreeSpeciesConfig.js";
33
49
  //# sourceMappingURL=tree_skeleton_assign_skin_joints.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tree_skeleton_assign_skin_joints.d.ts","sourceRoot":"","sources":["../../../../../src/generation/foliage/skeleton/tree_skeleton_assign_skin_joints.js"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,2DAfW,OAAO,mBAAmB,EAAE,YAAY,eACxC,MAAM,GACJ;IACZ,WAAe,EAAE,MAAM,CAAC;IACxB,gBAAoB,EAAE,UAAU,CAAC;IACjC,aAAiB,EAAE,UAAU,CAAC;IAC9B,eAAmB,EAAE,YAAY,CAAC;IAClC,cAAkB,EAAE,YAAY,CAAC;IACjC,YAAgB,EAAE,UAAU,CAAC;IAC7B,YAAgB,EAAE,YAAY,CAAC;IAC/B,aAAiB,EAAE,YAAY,CAAC;IAChC,WAAe,EAAE,YAAY,CAAC;IAC9B,aAAiB,EAAE,YAAY,CAAA;CAC5B,CAsLH"}
1
+ {"version":3,"file":"tree_skeleton_assign_skin_joints.d.ts","sourceRoot":"","sources":["../../../../../src/generation/foliage/skeleton/tree_skeleton_assign_skin_joints.js"],"names":[],"mappings":"AAaA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,2DAfW,OAAO,mBAAmB,EAAE,YAAY,WACxC,iBAAiB,GACf;IACZ,WAAe,EAAE,MAAM,CAAC;IACxB,gBAAoB,EAAE,UAAU,CAAC;IACjC,aAAiB,EAAE,UAAU,CAAC;IAC9B,eAAmB,EAAE,YAAY,CAAC;IAClC,cAAkB,EAAE,YAAY,CAAC;IACjC,YAAgB,EAAE,UAAU,CAAC;IAC7B,YAAgB,EAAE,YAAY,CAAC;IAC/B,gBAAoB,EAAE,YAAY,CAAC;IACnC,uBAA2B,EAAE,YAAY,CAAA;CACtC,CAiMH;kCA9OiC,gCAAgC"}