@woosh/meep-engine 3.56.0 → 3.57.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (625) hide show
  1. package/build/bundle-worker-terrain.js +1 -1
  2. package/package.json +1 -1
  3. package/src/DUPLICATION_REVIEW_2026_10_24.md +1072 -0
  4. package/src/core/binary/BitSet.js +1 -1
  5. package/src/core/binary/FLOAT16_MAX.d.ts +2 -0
  6. package/src/core/binary/FLOAT16_MAX.d.ts.map +1 -0
  7. package/src/core/binary/FLOAT16_MAX.js +1 -0
  8. package/src/core/binary/base58/base58_encode.js +2 -2
  9. package/src/core/binary/type/TypeBuilder.js +1 -1
  10. package/src/core/bvh2/bvh3/BVH.js +1 -1
  11. package/src/core/bvh2/bvh3/ebvh_optimize_treelet.d.ts.map +1 -1
  12. package/src/core/bvh2/bvh3/ebvh_optimize_treelet.js +7 -3
  13. package/src/core/bvh2/bvh3/ebvh_update_hierarchy_bounds.d.ts.map +1 -1
  14. package/src/core/bvh2/bvh3/ebvh_update_hierarchy_bounds.js +5 -1
  15. package/src/core/bvh2/bvh3/query/compute_tight_near_far_clipping_planes.d.ts.map +1 -1
  16. package/src/core/bvh2/bvh3/query/compute_tight_near_far_clipping_planes.js +195 -246
  17. package/src/core/collection/CuckooFilter.js +1 -1
  18. package/src/core/collection/array/isArrayEqual.d.ts.map +1 -1
  19. package/src/core/collection/array/isArrayEqual.js +33 -58
  20. package/src/core/collection/array/typed/array_buffer_hash.d.ts.map +1 -1
  21. package/src/core/collection/array/typed/array_buffer_hash.js +41 -39
  22. package/src/core/collection/array/typed/float32_array_hash.js +38 -38
  23. package/src/core/collection/array/typed/uint16_array_hash.d.ts +2 -1
  24. package/src/core/collection/array/typed/uint16_array_hash.d.ts.map +1 -1
  25. package/src/core/collection/array/typed/uint16_array_hash.js +30 -29
  26. package/src/core/collection/array/typed/uint32_array_hash.d.ts +2 -1
  27. package/src/core/collection/array/typed/uint32_array_hash.d.ts.map +1 -1
  28. package/src/core/collection/array/typed/uint32_array_hash.js +21 -20
  29. package/src/core/collection/array/typed/uint8_array_hash.d.ts +2 -1
  30. package/src/core/collection/array/typed/uint8_array_hash.d.ts.map +1 -1
  31. package/src/core/collection/array/typed/uint8_array_hash.js +37 -36
  32. package/src/core/collection/array/typed/uint_array_for_count.js +2 -2
  33. package/src/core/collection/list/List.d.ts.map +1 -1
  34. package/src/core/collection/list/List.js +3 -19
  35. package/src/core/collection/table/RowFirstTable.d.ts.map +1 -1
  36. package/src/core/collection/table/RowFirstTable.js +4 -28
  37. package/src/core/debug/matchers/DescribeAs.d.ts.map +1 -1
  38. package/src/core/debug/matchers/DescribeAs.js +62 -64
  39. package/src/core/function/FunctionCompiler.js +4 -4
  40. package/src/core/function/objectsEqual.d.ts.map +1 -1
  41. package/src/core/function/objectsEqual.js +3 -2
  42. package/src/core/geom/2d/bvh/BVH2D.d.ts.map +1 -1
  43. package/src/core/geom/2d/bvh/BVH2D.js +4 -3
  44. package/src/core/geom/2d/convex-hull/convex_hull_fixed_count_2d_relaxation.d.ts +5 -2
  45. package/src/core/geom/2d/convex-hull/convex_hull_fixed_count_2d_relaxation.d.ts.map +1 -1
  46. package/src/core/geom/2d/convex-hull/convex_hull_fixed_count_2d_relaxation.js +49 -11
  47. package/src/core/geom/2d/hash-grid/shg_query_elements_circle.d.ts.map +1 -1
  48. package/src/core/geom/2d/hash-grid/shg_query_elements_circle.js +122 -159
  49. package/src/core/geom/2d/hash-grid/shg_query_elements_line.d.ts.map +1 -1
  50. package/src/core/geom/2d/hash-grid/shg_query_elements_line.js +8 -5
  51. package/src/core/geom/2d/polygon/polygon2_rasterize_coverage.d.ts +18 -0
  52. package/src/core/geom/2d/polygon/polygon2_rasterize_coverage.d.ts.map +1 -0
  53. package/src/core/geom/2d/polygon/polygon2_rasterize_coverage.js +97 -0
  54. package/src/core/geom/2d/r-tree/StaticR2Tree.js +2 -2
  55. package/src/core/geom/2d/triangle/tri2_rasterize_coverage.d.ts +21 -0
  56. package/src/core/geom/2d/triangle/tri2_rasterize_coverage.d.ts.map +1 -0
  57. package/src/core/geom/2d/triangle/tri2_rasterize_coverage.js +54 -0
  58. package/src/core/geom/3d/aabb/aabb3_build_frustum.d.ts.map +1 -1
  59. package/src/core/geom/3d/aabb/aabb3_build_frustum.js +20 -53
  60. package/src/core/geom/3d/aabb/aabb3_score_boxes_SAH.d.ts +1 -1
  61. package/src/core/geom/3d/aabb/aabb3_score_boxes_SAH.d.ts.map +1 -1
  62. package/src/core/geom/3d/aabb/aabb3_score_boxes_SAH.js +11 -42
  63. package/src/core/geom/3d/atlas/pack/atlas_pack_charts.d.ts.map +1 -1
  64. package/src/core/geom/3d/atlas/pack/atlas_pack_charts.js +30 -32
  65. package/src/core/geom/3d/atlas/param/atlas_chart_parameterize_bff.d.ts.map +1 -1
  66. package/src/core/geom/3d/atlas/param/atlas_chart_parameterize_bff.js +1 -5
  67. package/src/core/geom/3d/atlas/param/atlas_chart_parameterize_lscm.d.ts.map +1 -1
  68. package/src/core/geom/3d/atlas/param/atlas_chart_parameterize_lscm.js +1 -15
  69. package/src/core/geom/3d/atlas/segment/atlas_merge_charts.d.ts.map +1 -1
  70. package/src/core/geom/3d/atlas/segment/atlas_merge_charts.js +105 -116
  71. package/src/core/geom/3d/line/line3_compute_segment_point_distance_sqr.d.ts.map +1 -1
  72. package/src/core/geom/3d/line/line3_compute_segment_point_distance_sqr.js +36 -54
  73. package/src/core/geom/3d/plane/plane3_compute_intersection_objects.d.ts +5 -10
  74. package/src/core/geom/3d/plane/plane3_compute_intersection_objects.d.ts.map +1 -1
  75. package/src/core/geom/3d/plane/plane3_compute_intersection_objects.js +20 -82
  76. package/src/core/geom/3d/plane/plane3_slerp.d.ts.map +1 -1
  77. package/src/core/geom/3d/plane/plane3_slerp.js +87 -102
  78. package/src/core/geom/3d/polygon/polygon3_compute_normal.d.ts +12 -0
  79. package/src/core/geom/3d/polygon/polygon3_compute_normal.d.ts.map +1 -1
  80. package/src/core/geom/3d/polygon/polygon3_compute_normal.js +107 -60
  81. package/src/core/geom/3d/ray/ray3_compute_closest_point.d.ts.map +1 -1
  82. package/src/core/geom/3d/ray/ray3_compute_closest_point.js +37 -43
  83. package/src/core/geom/3d/shape/ConvexHullShape3D.d.ts.map +1 -1
  84. package/src/core/geom/3d/shape/ConvexHullShape3D.js +5 -16
  85. package/src/core/geom/3d/shape/MeshShape3D.js +2 -56
  86. package/src/core/geom/3d/shape/TransformedShape3D.d.ts.map +1 -1
  87. package/src/core/geom/3d/shape/TransformedShape3D.js +10 -7
  88. package/src/core/geom/3d/shape/UnionShape3D.d.ts.map +1 -1
  89. package/src/core/geom/3d/shape/UnionShape3D.js +9 -3
  90. package/src/core/geom/3d/shape/json/shape_to_type.js +2 -2
  91. package/src/core/geom/3d/sphere/harmonics/SH3_COEFFICIENTS.js +17 -17
  92. package/src/core/geom/3d/tetrahedra/TetrahedralMesh.d.ts.map +1 -1
  93. package/src/core/geom/3d/tetrahedra/TetrahedralMesh.js +6 -2
  94. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_carve_outside_surface.d.ts.map +1 -1
  95. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_carve_outside_surface.js +3 -2
  96. package/src/core/geom/3d/tetrahedra/tetrahedron_contains_point.d.ts +20 -2
  97. package/src/core/geom/3d/tetrahedra/tetrahedron_contains_point.d.ts.map +1 -1
  98. package/src/core/geom/3d/tetrahedra/tetrahedron_contains_point.js +52 -37
  99. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_face_normals.d.ts.map +1 -1
  100. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_face_normals.js +40 -56
  101. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_vertex_quadrics.d.ts.map +1 -1
  102. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_vertex_quadrics.js +251 -260
  103. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_wedge_attribute_quadrics.d.ts.map +1 -1
  104. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_wedge_attribute_quadrics.js +104 -113
  105. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_resolve_t_junctions.d.ts.map +1 -1
  106. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_resolve_t_junctions.js +227 -238
  107. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_simplify.d.ts.map +1 -1
  108. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_simplify.js +15 -24
  109. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_edge_create.d.ts.map +1 -1
  110. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_edge_create.js +31 -115
  111. package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_vertex_fuse_duplicate_edges.d.ts.map +1 -1
  112. package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_vertex_fuse_duplicate_edges.js +142 -150
  113. package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_vertex_replace.d.ts.map +1 -1
  114. package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_vertex_replace.js +151 -194
  115. package/src/core/geom/3d/topology/struct/binary/query/bt_face_get_incenter.d.ts.map +1 -1
  116. package/src/core/geom/3d/topology/struct/binary/query/bt_face_get_incenter.js +60 -85
  117. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_build_boundary_distance_field.d.ts.map +1 -1
  118. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_build_boundary_distance_field.js +156 -171
  119. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_face_find_path.d.ts.map +1 -1
  120. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_face_find_path.js +8 -44
  121. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_face_find_path_polyanya.d.ts.map +1 -1
  122. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_face_find_path_polyanya.js +2 -7
  123. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_sample_interior_grid_points.d.ts.map +1 -1
  124. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_sample_interior_grid_points.js +3 -2
  125. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_segment_penetrates_surface.d.ts.map +1 -1
  126. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_segment_penetrates_surface.js +128 -133
  127. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_surface_ray_parity.d.ts +8 -14
  128. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_surface_ray_parity.d.ts.map +1 -1
  129. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_surface_ray_parity.js +36 -82
  130. package/src/core/geom/3d/triangle/tri3_ray_intersection.d.ts.map +1 -1
  131. package/src/core/geom/3d/triangle/tri3_ray_intersection.js +7 -144
  132. package/src/core/geom/ConicRay.d.ts.map +1 -1
  133. package/src/core/geom/ConicRay.js +230 -237
  134. package/src/core/localization/LocaleDataset.d.ts +6 -0
  135. package/src/core/localization/LocaleDataset.d.ts.map +1 -1
  136. package/src/core/localization/LocaleDataset.js +48 -37
  137. package/src/core/localization/LocalizationEngine.d.ts.map +1 -1
  138. package/src/core/localization/LocalizationEngine.js +3 -2
  139. package/src/core/math/lookup/ParameterLookupTable.d.ts.map +1 -1
  140. package/src/core/math/lookup/ParameterLookupTable.js +3 -1
  141. package/src/core/math/spline/spline3_hermite_intersection_spline3_hermite_nd.d.ts.map +1 -1
  142. package/src/core/math/spline/spline3_hermite_intersection_spline3_hermite_nd.js +330 -400
  143. package/src/core/math/spline/spline3_hermite_nearest_point.d.ts +16 -0
  144. package/src/core/math/spline/spline3_hermite_nearest_point.d.ts.map +1 -1
  145. package/src/core/math/spline/spline3_hermite_nearest_point.js +134 -167
  146. package/src/core/model/DebouncedObservedBoolean.d.ts +1 -2
  147. package/src/core/model/DebouncedObservedBoolean.d.ts.map +1 -1
  148. package/src/core/model/DebouncedObservedBoolean.js +1 -1
  149. package/src/core/model/node-graph/node/NodeInstance.d.ts.map +1 -1
  150. package/src/core/model/node-graph/node/NodeInstance.js +2 -7
  151. package/src/core/model/node-graph/node/parameter/NodeParameterDescription.js +1 -1
  152. package/src/core/model/object/optional_equality.d.ts +3 -3
  153. package/src/core/model/object/optional_equality.d.ts.map +1 -1
  154. package/src/core/model/object/optional_equality.js +10 -27
  155. package/src/core/model/object/write_property.js +1 -1
  156. package/src/core/model/reactive/evaluation/MultiPredicateEvaluator.js +2 -2
  157. package/src/core/primitives/strings/string_compute_byte_size.d.ts +3 -3
  158. package/src/core/primitives/strings/string_compute_byte_size.d.ts.map +1 -1
  159. package/src/core/primitives/strings/string_compute_byte_size.js +8 -21
  160. package/src/core/process/executor/ConcurrentExecutor.d.ts.map +1 -1
  161. package/src/core/process/executor/ConcurrentExecutor.js +14 -2
  162. package/src/engine/achievements/gateway/StorageAchievementGateway.d.ts +6 -3
  163. package/src/engine/achievements/gateway/StorageAchievementGateway.d.ts.map +1 -1
  164. package/src/engine/achievements/gateway/StorageAchievementGateway.js +31 -75
  165. package/src/engine/asset/loaders/SVGAssetLoader.d.ts.map +1 -1
  166. package/src/engine/asset/loaders/SVGAssetLoader.js +33 -31
  167. package/src/engine/control/first-person/math/criticallyDampedSpring.d.ts.map +1 -1
  168. package/src/engine/control/first-person/math/criticallyDampedSpring.js +3 -14
  169. package/src/engine/ecs/EntityComponentDataset.d.ts.map +1 -1
  170. package/src/engine/ecs/EntityComponentDataset.js +4 -1
  171. package/src/engine/ecs/storage/binary/object/BinaryObjectSerializationAdapter.d.ts +0 -2
  172. package/src/engine/ecs/storage/binary/object/BinaryObjectSerializationAdapter.d.ts.map +1 -1
  173. package/src/engine/ecs/storage/binary/object/BinaryObjectSerializationAdapter.js +3 -3
  174. package/src/engine/ecs/terrain/ecs/layers/TerrainLayer.js +2 -2
  175. package/src/engine/graphics/sh3/path_tracer/geometry/sort_triangles_by_distance_to_point.js +1 -1
  176. package/src/engine/graphics/texture/sampler/sampler2d_channel_compute_min_indices.js +1 -1
  177. package/src/engine/graphics3/WaterSystem.d.ts.map +1 -1
  178. package/src/engine/graphics3/WaterSystem.js +2 -1
  179. package/src/engine/graphics3/prefab/prefab_skin_frame.d.ts.map +1 -1
  180. package/src/engine/graphics3/prefab/prefab_skin_frame.js +1 -12
  181. package/src/engine/grid/grid2transform/GridPosition2TransformSystem.d.ts +1 -1
  182. package/src/engine/grid/grid2transform/GridPosition2TransformSystem.d.ts.map +1 -1
  183. package/src/engine/grid/grid2transform/GridPosition2TransformSystem.js +141 -137
  184. package/src/engine/input/ecs/systems/InputControllerSystem.d.ts.map +1 -1
  185. package/src/engine/input/ecs/systems/InputControllerSystem.js +13 -3
  186. package/src/engine/input/ecs/systems/InputSystem.d.ts.map +1 -1
  187. package/src/engine/input/ecs/systems/InputSystem.js +2 -1
  188. package/src/engine/intelligence/behavior/composite/ParallelBehavior.d.ts +1 -1
  189. package/src/engine/intelligence/behavior/composite/ParallelBehavior.d.ts.map +1 -1
  190. package/src/engine/intelligence/behavior/composite/ParallelBehavior.js +4 -1
  191. package/src/engine/intelligence/behavior/decorator/InvertStatusBehavior.d.ts.map +1 -1
  192. package/src/engine/intelligence/behavior/decorator/InvertStatusBehavior.js +3 -1
  193. package/src/engine/intelligence/behavior/decorator/RepeatBehavior.d.ts.map +1 -1
  194. package/src/engine/intelligence/behavior/decorator/RepeatBehavior.js +3 -1
  195. package/src/engine/intelligence/behavior/decorator/RepeatBehaviorSerializationAdapter.d.ts.map +1 -1
  196. package/src/engine/intelligence/behavior/decorator/RepeatBehaviorSerializationAdapter.js +39 -33
  197. package/src/engine/intelligence/behavior/util/ConditionalBehavior.d.ts +5 -0
  198. package/src/engine/intelligence/behavior/util/ConditionalBehavior.d.ts.map +1 -1
  199. package/src/engine/intelligence/behavior/util/ConditionalBehavior.js +93 -75
  200. package/src/engine/intelligence/behavior/util/RotationBehavior.d.ts.map +1 -1
  201. package/src/engine/intelligence/behavior/util/RotationBehavior.js +79 -76
  202. package/src/engine/intelligence/blackboard/BlackboardStack.d.ts +1 -0
  203. package/src/engine/intelligence/blackboard/BlackboardStack.d.ts.map +1 -1
  204. package/src/engine/intelligence/blackboard/BlackboardStack.js +159 -123
  205. package/src/engine/intelligence/mcts/StateNode.d.ts.map +1 -1
  206. package/src/engine/intelligence/mcts/StateNode.js +366 -364
  207. package/src/engine/intelligence/resource/ResourceAllocationSolver.js +1 -1
  208. package/src/engine/navigation/ecs/components/Path.d.ts.map +1 -1
  209. package/src/engine/navigation/ecs/components/Path.js +2 -1
  210. package/src/engine/navigation/ecs/path_following/PathFollowingSystem.d.ts.map +1 -1
  211. package/src/engine/navigation/ecs/path_following/PathFollowingSystem.js +5 -2
  212. package/src/engine/physics/body/SolverBodyState.d.ts.map +1 -1
  213. package/src/engine/physics/body/SolverBodyState.js +2 -6
  214. package/src/engine/physics/ccd/linear_sweep.d.ts.map +1 -1
  215. package/src/engine/physics/ccd/linear_sweep.js +3 -16
  216. package/src/engine/physics/cloth/build/cloth_proxy_from_joints.d.ts.map +1 -1
  217. package/src/engine/physics/cloth/build/cloth_proxy_from_joints.js +2 -16
  218. package/src/engine/physics/cloth/ecs/cloth_build_rows.d.ts +13 -1
  219. package/src/engine/physics/cloth/ecs/cloth_build_rows.d.ts.map +1 -1
  220. package/src/engine/physics/cloth/ecs/cloth_build_rows.js +15 -4
  221. package/src/engine/physics/ecs/PhysicsSystem.d.ts.map +1 -1
  222. package/src/engine/physics/ecs/PhysicsSystem.js +2 -5
  223. package/src/engine/physics/inertia/locked_inverse_inertia.d.ts +12 -0
  224. package/src/engine/physics/inertia/locked_inverse_inertia.d.ts.map +1 -0
  225. package/src/engine/physics/inertia/locked_inverse_inertia.js +22 -0
  226. package/src/engine/physics/integration/integrate_velocity.d.ts.map +1 -1
  227. package/src/engine/physics/integration/integrate_velocity.js +3 -18
  228. package/src/engine/physics/mls-mpm/MLS_MPM.d.ts +1 -0
  229. package/src/engine/physics/mls-mpm/MLS_MPM.d.ts.map +1 -1
  230. package/src/engine/physics/mls-mpm/MLS_MPM.js +5 -4
  231. package/src/engine/physics/narrowphase/convex_decomposition.d.ts.map +1 -1
  232. package/src/engine/physics/narrowphase/convex_decomposition.js +7 -16
  233. package/src/engine/physics/vehicle/RaycastVehicle.d.ts.map +1 -1
  234. package/src/engine/physics/vehicle/RaycastVehicle.js +15 -5
  235. package/src/engine/save/StorageBackedList.d.ts +5 -0
  236. package/src/engine/save/StorageBackedList.d.ts.map +1 -1
  237. package/src/engine/save/StorageBackedList.js +161 -144
  238. package/src/engine/simulation/Ticker.d.ts.map +1 -1
  239. package/src/engine/simulation/Ticker.js +394 -391
  240. package/src/engine/sound/simulation/probe/AcousticProbeField.d.ts.map +1 -1
  241. package/src/engine/sound/simulation/probe/AcousticProbeField.js +6 -19
  242. package/src/engine/sound/simulation/probe/probe_edge_visible.d.ts +15 -0
  243. package/src/engine/sound/simulation/probe/probe_edge_visible.d.ts.map +1 -1
  244. package/src/engine/sound/simulation/probe/probe_edge_visible.js +59 -41
  245. package/src/engine/sound/simulation/probe/probe_refine_connectivity.d.ts.map +1 -1
  246. package/src/engine/sound/simulation/probe/probe_refine_connectivity.js +164 -181
  247. package/src/engine/sound/simulation/render/FoaProbeReverbRenderer.d.ts.map +1 -1
  248. package/src/engine/sound/simulation/render/FoaProbeReverbRenderer.js +20 -5
  249. package/src/format/image/avif/av1/decode/Av1FrameContext.d.ts.map +1 -1
  250. package/src/format/image/avif/av1/decode/Av1FrameContext.js +3 -10
  251. package/src/format/image/avif/av1/decode/reconstruct.d.ts +20 -0
  252. package/src/format/image/avif/av1/decode/reconstruct.d.ts.map +1 -1
  253. package/src/format/image/avif/av1/decode/reconstruct.js +22 -9
  254. package/src/format/image/avif/av1/encode/choose_restoration.js +2 -18
  255. package/src/format/image/avif/av1/encode/quantise.d.ts.map +1 -1
  256. package/src/format/image/avif/av1/encode/quantise.js +1 -55
  257. package/src/format/image/avif/av1/filter/loop_restoration.d.ts +9 -0
  258. package/src/format/image/avif/av1/filter/loop_restoration.d.ts.map +1 -1
  259. package/src/format/image/avif/av1/filter/loop_restoration.js +1 -1
  260. package/src/format/texture/basis/transcode/etc1s_to_bc7.js +2 -33
  261. package/src/format/texture/basis/transcode/fit_endpoints.d.ts +11 -0
  262. package/src/format/texture/basis/transcode/fit_endpoints.d.ts.map +1 -1
  263. package/src/format/texture/basis/transcode/fit_endpoints.js +1 -1
  264. package/src/format/texture/basis/uastc/uastc_decode_block.d.ts.map +1 -1
  265. package/src/format/texture/basis/uastc/uastc_decode_block.js +2 -19
  266. package/src/generation/foliage/ANNUAL_SHOOTS_BRIEF_2026_10_25.md +220 -0
  267. package/src/generation/foliage/CROWN_FILLING_BRIEF_2026_10_26.md +172 -0
  268. package/src/generation/foliage/FOLIAGE_DESIGN.md +165 -15
  269. package/src/generation/foliage/LEAF_ARCHITECTURE_BRIEF_2026_10_26.md +158 -0
  270. package/src/generation/foliage/SHOOT_SYSTEMS_ALL_SPECIES_BRIEF_2026_10_26.md +248 -0
  271. package/src/generation/foliage/SPEEDTREE_COMPARISON_2026_10_24.md +694 -0
  272. package/src/generation/foliage/analysis/CrownOpacity.d.ts +118 -0
  273. package/src/generation/foliage/analysis/CrownOpacity.d.ts.map +1 -0
  274. package/src/generation/foliage/analysis/CrownOpacity.js +182 -0
  275. package/src/generation/foliage/analysis/crown_opacity_frames.d.ts +10 -0
  276. package/src/generation/foliage/analysis/crown_opacity_frames.d.ts.map +1 -0
  277. package/src/generation/foliage/analysis/crown_opacity_frames.js +132 -0
  278. package/src/generation/foliage/analysis/crown_opacity_measure.d.ts +51 -0
  279. package/src/generation/foliage/analysis/crown_opacity_measure.d.ts.map +1 -0
  280. package/src/generation/foliage/analysis/crown_opacity_measure.js +649 -0
  281. package/src/generation/foliage/analysis/foliage_measure_leaf_area.d.ts +66 -0
  282. package/src/generation/foliage/analysis/foliage_measure_leaf_area.d.ts.map +1 -0
  283. package/src/generation/foliage/analysis/foliage_measure_leaf_area.js +192 -0
  284. package/src/generation/foliage/analysis/tree_crown_opacity.d.ts +27 -0
  285. package/src/generation/foliage/analysis/tree_crown_opacity.d.ts.map +1 -0
  286. package/src/generation/foliage/analysis/tree_crown_opacity.js +58 -0
  287. package/src/generation/foliage/animation/build_tree_wind_rig.d.ts +3 -2
  288. package/src/generation/foliage/animation/build_tree_wind_rig.d.ts.map +1 -1
  289. package/src/generation/foliage/animation/build_tree_wind_rig.js +12 -30
  290. package/src/generation/foliage/animation/tree_wind_bend_limit.d.ts +12 -0
  291. package/src/generation/foliage/animation/tree_wind_bend_limit.d.ts.map +1 -0
  292. package/src/generation/foliage/animation/tree_wind_bend_limit.js +13 -0
  293. package/src/generation/foliage/asset/TreeAsset.d.ts +5 -0
  294. package/src/generation/foliage/asset/TreeAsset.d.ts.map +1 -1
  295. package/src/generation/foliage/asset/TreeAsset.js +6 -0
  296. package/src/generation/foliage/asset/generate_tree.d.ts.map +1 -1
  297. package/src/generation/foliage/asset/generate_tree.js +23 -6
  298. package/src/generation/foliage/config/{BranchLevelConfig.d.ts → BranchGeneratorConfig.d.ts} +61 -75
  299. package/src/generation/foliage/config/BranchGeneratorConfig.d.ts.map +1 -0
  300. package/src/generation/foliage/config/{BranchLevelConfig.js → BranchGeneratorConfig.js} +83 -126
  301. package/src/generation/foliage/config/BranchSpawnRule.d.ts +118 -0
  302. package/src/generation/foliage/config/BranchSpawnRule.d.ts.map +1 -0
  303. package/src/generation/foliage/config/BranchSpawnRule.js +217 -0
  304. package/src/generation/foliage/config/FoliageCardType.d.ts +1 -1
  305. package/src/generation/foliage/config/FoliageCardType.js +2 -2
  306. package/src/generation/foliage/config/FoliageConfig.d.ts +23 -45
  307. package/src/generation/foliage/config/FoliageConfig.d.ts.map +1 -1
  308. package/src/generation/foliage/config/FoliageConfig.js +47 -93
  309. package/src/generation/foliage/config/FoliageMaterialConfig.d.ts +12 -20
  310. package/src/generation/foliage/config/FoliageMaterialConfig.d.ts.map +1 -1
  311. package/src/generation/foliage/config/FoliageMaterialConfig.js +261 -279
  312. package/src/generation/foliage/config/FoliageSpawnRule.d.ts +77 -0
  313. package/src/generation/foliage/config/FoliageSpawnRule.d.ts.map +1 -0
  314. package/src/generation/foliage/config/FoliageSpawnRule.js +135 -0
  315. package/src/generation/foliage/config/FoliageTileContent.d.ts +9 -0
  316. package/src/generation/foliage/config/FoliageTileContent.d.ts.map +1 -0
  317. package/src/generation/foliage/config/FoliageTileContent.js +12 -0
  318. package/src/generation/foliage/config/LeafApexShape.d.ts +12 -0
  319. package/src/generation/foliage/config/LeafApexShape.d.ts.map +1 -0
  320. package/src/generation/foliage/config/LeafApexShape.js +17 -0
  321. package/src/generation/foliage/config/LeafArchitecture.d.ts +155 -0
  322. package/src/generation/foliage/config/LeafArchitecture.d.ts.map +1 -0
  323. package/src/generation/foliage/config/LeafArchitecture.js +288 -0
  324. package/src/generation/foliage/config/LeafBaseShape.d.ts +14 -0
  325. package/src/generation/foliage/config/LeafBaseShape.d.ts.map +1 -0
  326. package/src/generation/foliage/config/LeafBaseShape.js +21 -0
  327. package/src/generation/foliage/config/LeafLobation.d.ts +10 -0
  328. package/src/generation/foliage/config/LeafLobation.d.ts.map +1 -0
  329. package/src/generation/foliage/config/LeafLobation.js +14 -0
  330. package/src/generation/foliage/config/PhyllotaxisMode.d.ts +11 -0
  331. package/src/generation/foliage/config/PhyllotaxisMode.d.ts.map +1 -1
  332. package/src/generation/foliage/config/PhyllotaxisMode.js +36 -0
  333. package/src/generation/foliage/config/ShootBudZone.d.ts +105 -0
  334. package/src/generation/foliage/config/ShootBudZone.d.ts.map +1 -0
  335. package/src/generation/foliage/config/ShootBudZone.js +219 -0
  336. package/src/generation/foliage/config/ShootGrowthConfig.d.ts +84 -0
  337. package/src/generation/foliage/config/ShootGrowthConfig.d.ts.map +1 -0
  338. package/src/generation/foliage/config/ShootGrowthConfig.js +146 -0
  339. package/src/generation/foliage/config/ShootSystemRule.d.ts +144 -0
  340. package/src/generation/foliage/config/ShootSystemRule.d.ts.map +1 -0
  341. package/src/generation/foliage/config/ShootSystemRule.js +316 -0
  342. package/src/generation/foliage/config/TreeLODConfig.d.ts +1 -1
  343. package/src/generation/foliage/config/TreeLODConfig.js +1 -1
  344. package/src/generation/foliage/config/TreeSpeciesConfig.d.ts +40 -8
  345. package/src/generation/foliage/config/TreeSpeciesConfig.d.ts.map +1 -1
  346. package/src/generation/foliage/config/TreeSpeciesConfig.js +124 -68
  347. package/src/generation/foliage/config/TreeWindConfig.d.ts +23 -10
  348. package/src/generation/foliage/config/TreeWindConfig.d.ts.map +1 -1
  349. package/src/generation/foliage/config/TreeWindConfig.js +34 -25
  350. package/src/generation/foliage/index.d.ts +19 -2
  351. package/src/generation/foliage/index.js +63 -44
  352. package/src/generation/foliage/material/FoliageAtlasCutout.d.ts +59 -0
  353. package/src/generation/foliage/material/FoliageAtlasCutout.d.ts.map +1 -0
  354. package/src/generation/foliage/material/FoliageAtlasCutout.js +93 -0
  355. package/src/generation/foliage/material/compute_foliage_variant_atlas_layout.d.ts +26 -0
  356. package/src/generation/foliage/material/compute_foliage_variant_atlas_layout.d.ts.map +1 -0
  357. package/src/generation/foliage/material/compute_foliage_variant_atlas_layout.js +63 -0
  358. package/src/generation/foliage/material/foliage_atlas_cutout.d.ts +34 -0
  359. package/src/generation/foliage/material/foliage_atlas_cutout.d.ts.map +1 -0
  360. package/src/generation/foliage/material/foliage_atlas_cutout.js +174 -0
  361. package/src/generation/foliage/material/foliage_tile.d.ts +110 -0
  362. package/src/generation/foliage/material/foliage_tile.d.ts.map +1 -0
  363. package/src/generation/foliage/material/foliage_tile.js +286 -0
  364. package/src/generation/foliage/material/leaf_geometry.d.ts +103 -0
  365. package/src/generation/foliage/material/leaf_geometry.d.ts.map +1 -0
  366. package/src/generation/foliage/material/leaf_geometry.js +528 -0
  367. package/src/generation/foliage/material/make_foliage_material.d.ts +13 -33
  368. package/src/generation/foliage/material/make_foliage_material.d.ts.map +1 -1
  369. package/src/generation/foliage/material/make_foliage_material.js +356 -605
  370. package/src/generation/foliage/mesh/foliage_collect_attachments.d.ts +39 -4
  371. package/src/generation/foliage/mesh/foliage_collect_attachments.d.ts.map +1 -1
  372. package/src/generation/foliage/mesh/foliage_collect_attachments.js +637 -569
  373. package/src/generation/foliage/mesh/interpolate_ring_skin_weights4.d.ts +48 -0
  374. package/src/generation/foliage/mesh/interpolate_ring_skin_weights4.d.ts.map +1 -0
  375. package/src/generation/foliage/mesh/interpolate_ring_skin_weights4.js +232 -0
  376. package/src/generation/foliage/mesh/tree_mesh_build_bark.d.ts.map +1 -1
  377. package/src/generation/foliage/mesh/tree_mesh_build_bark.js +1023 -1049
  378. package/src/generation/foliage/mesh/tree_mesh_build_foliage.d.ts +9 -2
  379. package/src/generation/foliage/mesh/tree_mesh_build_foliage.d.ts.map +1 -1
  380. package/src/generation/foliage/mesh/tree_mesh_build_foliage.js +467 -454
  381. package/src/generation/foliage/presets/make_tree_species_preset.d.ts.map +1 -1
  382. package/src/generation/foliage/presets/make_tree_species_preset.js +1648 -870
  383. package/src/generation/foliage/skeleton/ShootFrameworkHash.d.ts +35 -0
  384. package/src/generation/foliage/skeleton/ShootFrameworkHash.d.ts.map +1 -0
  385. package/src/generation/foliage/skeleton/ShootFrameworkHash.js +129 -0
  386. package/src/generation/foliage/skeleton/ShootGirth.d.ts +51 -0
  387. package/src/generation/foliage/skeleton/ShootGirth.d.ts.map +1 -0
  388. package/src/generation/foliage/skeleton/ShootGirth.js +212 -0
  389. package/src/generation/foliage/skeleton/ShootLightField.d.ts +73 -0
  390. package/src/generation/foliage/skeleton/ShootLightField.d.ts.map +1 -0
  391. package/src/generation/foliage/skeleton/ShootLightField.js +197 -0
  392. package/src/generation/foliage/skeleton/TreeSkeleton.d.ts +106 -3
  393. package/src/generation/foliage/skeleton/TreeSkeleton.d.ts.map +1 -1
  394. package/src/generation/foliage/skeleton/TreeSkeleton.js +217 -39
  395. package/src/generation/foliage/skeleton/flare_lobe_phase_offset.d.ts +13 -0
  396. package/src/generation/foliage/skeleton/flare_lobe_phase_offset.d.ts.map +1 -0
  397. package/src/generation/foliage/skeleton/flare_lobe_phase_offset.js +16 -0
  398. package/src/generation/foliage/skeleton/foliage_card_density.d.ts +71 -0
  399. package/src/generation/foliage/skeleton/foliage_card_density.d.ts.map +1 -0
  400. package/src/generation/foliage/skeleton/foliage_card_density.js +101 -0
  401. package/src/generation/foliage/skeleton/foliage_senescence.d.ts +101 -0
  402. package/src/generation/foliage/skeleton/foliage_senescence.d.ts.map +1 -0
  403. package/src/generation/foliage/skeleton/foliage_senescence.js +149 -0
  404. package/src/generation/foliage/skeleton/foliage_unit_cards.d.ts +76 -0
  405. package/src/generation/foliage/skeleton/foliage_unit_cards.d.ts.map +1 -0
  406. package/src/generation/foliage/skeleton/foliage_unit_cards.js +95 -0
  407. package/src/generation/foliage/skeleton/shoot_demography.d.ts +22 -0
  408. package/src/generation/foliage/skeleton/shoot_demography.d.ts.map +1 -0
  409. package/src/generation/foliage/skeleton/shoot_demography.js +96 -0
  410. package/src/generation/foliage/skeleton/shoot_geometry.d.ts +66 -0
  411. package/src/generation/foliage/skeleton/shoot_geometry.d.ts.map +1 -0
  412. package/src/generation/foliage/skeleton/shoot_geometry.js +109 -0
  413. package/src/generation/foliage/skeleton/shoot_systems_simulate.d.ts +166 -0
  414. package/src/generation/foliage/skeleton/shoot_systems_simulate.d.ts.map +1 -0
  415. package/src/generation/foliage/skeleton/shoot_systems_simulate.js +588 -0
  416. package/src/generation/foliage/skeleton/tree_skeleton_assign_skin_joints.d.ts +28 -12
  417. package/src/generation/foliage/skeleton/tree_skeleton_assign_skin_joints.d.ts.map +1 -1
  418. package/src/generation/foliage/skeleton/tree_skeleton_assign_skin_joints.js +137 -102
  419. package/src/generation/foliage/skeleton/tree_skeleton_compute_joint_mechanics.d.ts +112 -0
  420. package/src/generation/foliage/skeleton/tree_skeleton_compute_joint_mechanics.d.ts.map +1 -0
  421. package/src/generation/foliage/skeleton/tree_skeleton_compute_joint_mechanics.js +408 -0
  422. package/src/generation/foliage/skeleton/tree_skeleton_compute_pipe_radii.d.ts.map +1 -1
  423. package/src/generation/foliage/skeleton/tree_skeleton_compute_pipe_radii.js +208 -206
  424. package/src/generation/foliage/skeleton/tree_skeleton_grow.d.ts +5 -2
  425. package/src/generation/foliage/skeleton/tree_skeleton_grow.d.ts.map +1 -1
  426. package/src/generation/foliage/skeleton/tree_skeleton_grow.js +2048 -1871
  427. package/src/generation/foliage/skeleton/tree_skeleton_grow_shoots.d.ts +17 -0
  428. package/src/generation/foliage/skeleton/tree_skeleton_grow_shoots.d.ts.map +1 -0
  429. package/src/generation/foliage/skeleton/tree_skeleton_grow_shoots.js +231 -0
  430. package/src/generation/foliage/skeleton/tree_skeleton_read_joint_motion.d.ts +14 -0
  431. package/src/generation/foliage/skeleton/tree_skeleton_read_joint_motion.d.ts.map +1 -0
  432. package/src/generation/foliage/skeleton/tree_skeleton_read_joint_motion.js +26 -0
  433. package/src/generation/foliage/skeleton/tree_skeleton_read_joint_parents.d.ts +10 -0
  434. package/src/generation/foliage/skeleton/tree_skeleton_read_joint_parents.d.ts.map +1 -0
  435. package/src/generation/foliage/skeleton/tree_skeleton_read_joint_parents.js +20 -0
  436. package/src/generation/grid/generation/road/GridTaskGenerateRoads.d.ts.map +1 -1
  437. package/src/generation/grid/generation/road/GridTaskGenerateRoads.js +4 -1
  438. package/src/generation/markers/GridCellActionPlaceMarkerGroup.d.ts +1 -0
  439. package/src/generation/markers/GridCellActionPlaceMarkerGroup.d.ts.map +1 -1
  440. package/src/generation/markers/GridCellActionPlaceMarkerGroup.js +98 -86
  441. package/src/shade/SHADER_F16_PROPOSAL_2026_10_24.md +263 -0
  442. package/src/shade/descriptor/WebGPUExtensionType.d.ts +17 -0
  443. package/src/shade/descriptor/WebGPUExtensionType.d.ts.map +1 -1
  444. package/src/shade/descriptor/WebGPUExtensionType.js +31 -1
  445. package/src/shade/playground/foliage_wind/FoliageRigOverlay.d.ts +37 -0
  446. package/src/shade/playground/foliage_wind/FoliageRigOverlay.d.ts.map +1 -0
  447. package/src/shade/playground/foliage_wind/FoliageRigOverlay.js +491 -0
  448. package/src/shade/playground/foliage_wind/foliage_world.d.ts.map +1 -1
  449. package/src/shade/playground/foliage_wind/foliage_world.js +600 -602
  450. package/src/shade/playground/foliage_wind/index.html +6 -0
  451. package/src/shade/playground/foliage_wind/main.js +14 -0
  452. package/src/shade/renderer/animation/GPUAnimationManager.d.ts.map +1 -1
  453. package/src/shade/renderer/animation/GPUAnimationManager.js +2 -1
  454. package/src/shade/renderer/animation/foliage/FoliageWindJoint.d.ts +2 -1
  455. package/src/shade/renderer/animation/foliage/FoliageWindJoint.d.ts.map +1 -1
  456. package/src/shade/renderer/animation/foliage/FoliageWindJoint.js +2 -1
  457. package/src/shade/renderer/animation/foliage/chunk_foliage_wind_step.d.ts.map +1 -1
  458. package/src/shade/renderer/animation/foliage/chunk_foliage_wind_step.js +4 -2
  459. package/src/shade/renderer/buffer/table/GPUTypedTable.js +1 -1
  460. package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.d.ts.map +1 -1
  461. package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.js +403 -401
  462. package/src/shade/renderer/camera/OrbitalCameraController.d.ts +1 -62
  463. package/src/shade/renderer/camera/OrbitalCameraController.d.ts.map +1 -1
  464. package/src/shade/renderer/camera/OrbitalCameraController.js +1 -374
  465. package/src/shade/renderer/deferred/indirect/chunk_lpv_2d_cache_sample_irradiance.d.ts.map +1 -1
  466. package/src/shade/renderer/deferred/indirect/chunk_lpv_2d_cache_sample_irradiance.js +3 -0
  467. package/src/shade/renderer/deferred/indirect/chunk_lpv_sample_light.d.ts.map +1 -1
  468. package/src/shade/renderer/deferred/indirect/chunk_lpv_sample_light.js +6 -1
  469. package/src/shade/renderer/dynamic/shader_dynamic_mesh_avboit_splat.js +1 -1
  470. package/src/shade/renderer/fluid/GPUFluidCascade.d.ts +2 -2
  471. package/src/shade/renderer/fluid/GPUFluidCascade.d.ts.map +1 -1
  472. package/src/shade/renderer/fluid/GPUFluidCascade.js +6 -3
  473. package/src/shade/renderer/fluid/GPU_FLUID_OCCUPANCY_AND_SOTA_REVIEW_2026_10_26.md +361 -0
  474. package/src/shade/renderer/fluid/coupling/chunk_fluid_cascade_parent.d.ts.map +1 -1
  475. package/src/shade/renderer/fluid/coupling/chunk_fluid_cascade_parent.js +335 -241
  476. package/src/shade/renderer/fluid/coupling/shader_fluid_cascade_ghosts.d.ts.map +1 -1
  477. package/src/shade/renderer/fluid/coupling/shader_fluid_cascade_ghosts.js +108 -101
  478. package/src/shade/renderer/fluid/forcing/chunk_fluid_forcing_query_select.d.ts.map +1 -1
  479. package/src/shade/renderer/fluid/forcing/chunk_fluid_forcing_query_select.js +69 -67
  480. package/src/shade/renderer/fluid/forcing/shader_fluid_forcing_apply.d.ts +7 -6
  481. package/src/shade/renderer/fluid/forcing/shader_fluid_forcing_apply.d.ts.map +1 -1
  482. package/src/shade/renderer/fluid/forcing/shader_fluid_forcing_apply.js +341 -287
  483. package/src/shade/renderer/fluid/mac/FluidMacPasses.d.ts +6 -4
  484. package/src/shade/renderer/fluid/mac/FluidMacPasses.d.ts.map +1 -1
  485. package/src/shade/renderer/fluid/mac/FluidMacPasses.js +427 -400
  486. package/src/shade/renderer/fluid/mac/chunk_fluid_mac_seams.d.ts +10 -5
  487. package/src/shade/renderer/fluid/mac/chunk_fluid_mac_seams.d.ts.map +1 -1
  488. package/src/shade/renderer/fluid/mac/chunk_fluid_mac_seams.js +532 -190
  489. package/src/shade/renderer/fluid/mac/chunk_v3_mac_lattice_corners.d.ts.map +1 -1
  490. package/src/shade/renderer/fluid/mac/chunk_v3_mac_lattice_corners.js +231 -237
  491. package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_correct.d.ts +2 -2
  492. package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_correct.d.ts.map +1 -1
  493. package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_correct.js +282 -245
  494. package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_predict.d.ts +1 -3
  495. package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_predict.d.ts.map +1 -1
  496. package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_predict.js +139 -109
  497. package/src/shade/renderer/fluid/mac/shader_fluid_mac_curl.d.ts +6 -6
  498. package/src/shade/renderer/fluid/mac/shader_fluid_mac_curl.d.ts.map +1 -1
  499. package/src/shade/renderer/fluid/mac/shader_fluid_mac_curl.js +257 -222
  500. package/src/shade/renderer/fluid/mac/shader_fluid_mac_divergence.d.ts +8 -7
  501. package/src/shade/renderer/fluid/mac/shader_fluid_mac_divergence.d.ts.map +1 -1
  502. package/src/shade/renderer/fluid/mac/shader_fluid_mac_divergence.js +119 -92
  503. package/src/shade/renderer/fluid/mac/shader_fluid_mac_gradient.d.ts +6 -9
  504. package/src/shade/renderer/fluid/mac/shader_fluid_mac_gradient.d.ts.map +1 -1
  505. package/src/shade/renderer/fluid/mac/shader_fluid_mac_gradient.js +229 -181
  506. package/src/shade/renderer/fluid/pressure/GPUFluidPressureSolve.d.ts +17 -7
  507. package/src/shade/renderer/fluid/pressure/GPUFluidPressureSolve.d.ts.map +1 -1
  508. package/src/shade/renderer/fluid/pressure/GPUFluidPressureSolve.js +634 -621
  509. package/src/shade/renderer/fluid/pressure/shader_fluid_mg_residual_restrict.d.ts +8 -6
  510. package/src/shade/renderer/fluid/pressure/shader_fluid_mg_residual_restrict.d.ts.map +1 -1
  511. package/src/shade/renderer/fluid/pressure/shader_fluid_mg_residual_restrict.js +166 -149
  512. package/src/shade/renderer/fluid/pressure/shader_fluid_mg_smooth.d.ts +8 -6
  513. package/src/shade/renderer/fluid/pressure/shader_fluid_mg_smooth.d.ts.map +1 -1
  514. package/src/shade/renderer/fluid/pressure/shader_fluid_mg_smooth.js +219 -183
  515. package/src/shade/renderer/fluid/publish/shader_fluid_wind_publish.d.ts.map +1 -1
  516. package/src/shade/renderer/fluid/publish/shader_fluid_wind_publish.js +142 -122
  517. package/src/shade/renderer/geometry/meshlet/COMPACTION_PLAN_2026_09_16.md +674 -663
  518. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.d.ts +1 -1
  519. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.d.ts.map +1 -1
  520. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.js +63 -29
  521. package/src/shade/renderer/geometry/meshlet/build/meshoptimizer/geometry_to_meshlets_meshoptimizer.d.ts.map +1 -1
  522. package/src/shade/renderer/geometry/meshlet/build/meshoptimizer/geometry_to_meshlets_meshoptimizer.js +77 -87
  523. package/src/shade/renderer/geometry/meshlet/build/meshoptimizer/meshopt_clusterizer.d.ts.map +1 -1
  524. package/src/shade/renderer/geometry/meshlet/build/meshoptimizer/meshopt_clusterizer.js +4 -3
  525. package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.d.ts +11 -11
  526. package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.d.ts.map +1 -1
  527. package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.js +17 -19
  528. package/src/shade/renderer/global_illumination/lpv/graph_bake_irradiance_lookup_2d.js +4 -4
  529. package/src/shade/renderer/global_illumination/probe/octahedral/sample/chunk_lpv_mesh_interpolate_radiance_via_atlas.d.ts.map +1 -1
  530. package/src/shade/renderer/global_illumination/probe/octahedral/sample/chunk_lpv_mesh_interpolate_radiance_via_atlas.js +5 -1
  531. package/src/shade/renderer/loader/gltf/load_gltf.d.ts.map +1 -1
  532. package/src/shade/renderer/loader/gltf/load_gltf.js +11 -35
  533. package/src/shade/renderer/loader/usd/load_usd.d.ts.map +1 -1
  534. package/src/shade/renderer/loader/usd/load_usd.js +6 -19
  535. package/src/shade/renderer/particles/shaders/shader_particle_avboit_draw.d.ts.map +1 -1
  536. package/src/shade/renderer/particles/shaders/shader_particle_avboit_draw.js +199 -193
  537. package/src/shade/renderer/particles/shaders/shader_particle_avboit_splat.d.ts.map +1 -1
  538. package/src/shade/renderer/particles/shaders/shader_particle_avboit_splat.js +151 -143
  539. package/src/shade/renderer/postprocess/bloom/chunk_karis_blur4x4_sample.d.ts.map +1 -1
  540. package/src/shade/renderer/postprocess/bloom/chunk_karis_blur4x4_sample.js +11 -5
  541. package/src/shade/renderer/postprocess/denoise/graph_atorus_denoise_luma.d.ts.map +1 -1
  542. package/src/shade/renderer/postprocess/denoise/graph_atorus_denoise_luma.js +6 -18
  543. package/src/shade/renderer/postprocess/gtao/GTAO.js +1 -1
  544. package/src/shade/renderer/postprocess/gtao/ao_reproject_shader.d.ts.map +1 -1
  545. package/src/shade/renderer/postprocess/gtao/ao_reproject_shader.js +3 -5
  546. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao_with_irradiance.js +1 -1
  547. package/src/shade/renderer/postprocess/nss/chunk_nss_luma_derivative.d.ts.map +1 -1
  548. package/src/shade/renderer/postprocess/nss/chunk_nss_luma_derivative.js +7 -3
  549. package/src/shade/renderer/postprocess/nss/shader_nss_postprocess.d.ts.map +1 -1
  550. package/src/shade/renderer/postprocess/nss/shader_nss_postprocess.js +4 -2
  551. package/src/shade/renderer/postprocess/nss/shader_nss_preprocess.d.ts.map +1 -1
  552. package/src/shade/renderer/postprocess/nss/shader_nss_preprocess.js +4 -1
  553. package/src/shade/renderer/postprocess/ssr/downsample_karis.d.ts.map +1 -1
  554. package/src/shade/renderer/postprocess/ssr/downsample_karis.js +6 -3
  555. package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_temporal_accumulate.d.ts.map +1 -1
  556. package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_temporal_accumulate.js +4 -3
  557. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader.d.ts.map +1 -1
  558. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader.js +4 -1
  559. package/src/shade/renderer/postprocess/ssr/ssr_spatial_denoise_shader.d.ts.map +1 -1
  560. package/src/shade/renderer/postprocess/ssr/ssr_spatial_denoise_shader.js +4 -2
  561. package/src/shade/renderer/postprocess/taa/chunk_taa_tonemap.d.ts.map +1 -1
  562. package/src/shade/renderer/postprocess/taa/chunk_taa_tonemap.js +35 -39
  563. package/src/shade/renderer/postprocess/taa/chunk_taa_tonemap_inv.d.ts.map +1 -1
  564. package/src/shade/renderer/postprocess/taa/chunk_taa_tonemap_inv.js +20 -17
  565. package/src/shade/renderer/postprocess/taa/shader_taa.d.ts.map +1 -1
  566. package/src/shade/renderer/postprocess/taa/shader_taa.js +6 -3
  567. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.d.ts.map +1 -1
  568. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.js +3 -1
  569. package/src/shade/renderer/rasterize/native/avboit/avboit_draw_fragment_body.js +1 -1
  570. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_splat_slice.js +2 -2
  571. package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.js +1 -1
  572. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_integrate.d.ts.map +1 -1
  573. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_integrate.js +92 -83
  574. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_splat.js +1 -1
  575. package/src/shade/renderer/shader/ShaderDescriptor.d.ts.map +1 -1
  576. package/src/shade/renderer/shader/ShaderDescriptor.js +12 -4
  577. package/src/shade/renderer/shader/chunk/bvh/chunk_bvh_query_aabb_cooperative.d.ts.map +1 -1
  578. package/src/shade/renderer/shader/chunk/bvh/chunk_bvh_query_aabb_cooperative.js +294 -286
  579. package/src/shade/renderer/shader/chunk/light/lpv/chunk_lpv_interpolate_probe_irradiance8.js +5 -5
  580. package/src/shade/renderer/shader/chunk/light/lpv/chunk_lpv_mesh_interpolate_probe.d.ts.map +1 -1
  581. package/src/shade/renderer/shader/chunk/light/lpv/chunk_lpv_mesh_interpolate_probe.js +5 -3
  582. package/src/shade/renderer/shader/chunk/light/lpv/chunk_lpv_mesh_interpolate_probe_irradiance.d.ts.map +1 -1
  583. package/src/shade/renderer/shader/chunk/light/lpv/chunk_lpv_mesh_interpolate_probe_irradiance.js +9 -6
  584. package/src/shade/renderer/shader/chunk/light/lpv/chunk_lpv_sample_sh3_at.d.ts.map +1 -1
  585. package/src/shade/renderer/shader/chunk/light/lpv/chunk_lpv_sample_sh3_at.js +33 -38
  586. package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.d.ts.map +1 -1
  587. package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.js +690 -675
  588. package/src/shade/renderer/shader/type/WebGPUArray.d.ts +3 -0
  589. package/src/shade/renderer/shader/type/WebGPUArray.d.ts.map +1 -1
  590. package/src/shade/renderer/shader/type/WebGPUArray.js +185 -167
  591. package/src/shade/renderer/shader/type/WebGPUStruct.d.ts.map +1 -1
  592. package/src/shade/renderer/shader/type/WebGPUStruct.js +461 -455
  593. package/src/shade/renderer/shader/type/serde/read_gpu_typed_buffer.d.ts.map +1 -1
  594. package/src/shade/renderer/shader/type/serde/read_gpu_typed_buffer.js +335 -211
  595. package/src/shade/renderer/shader/type/serde/write_gpu_typed_buffer.d.ts.map +1 -1
  596. package/src/shade/renderer/shader/type/serde/write_gpu_typed_buffer.js +329 -221
  597. package/src/shade/renderer/shader/type/type_has_f16.d.ts +12 -0
  598. package/src/shade/renderer/shader/type/type_has_f16.d.ts.map +1 -0
  599. package/src/shade/renderer/shader/type/type_has_f16.js +66 -0
  600. package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.d.ts.map +1 -1
  601. package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.js +16 -2
  602. package/src/shade/renderer/volumetrics/taa/shader_volumetrics_taa.d.ts.map +1 -1
  603. package/src/shade/renderer/volumetrics/taa/shader_volumetrics_taa.js +5 -2
  604. package/src/shade/renderer/water/shader_water_avboit.js +1 -1
  605. package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.d.ts.map +1 -1
  606. package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js +260 -23
  607. package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts +6 -7
  608. package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts.map +1 -1
  609. package/src/shade/wgsl/emulator/WGSLLanguageCore.js +269 -69
  610. package/src/shade/wgsl/validate_wgsl_source.d.ts.map +1 -1
  611. package/src/shade/wgsl/validate_wgsl_source.js +27 -1
  612. package/src/view/controller/controls/ListController.d.ts.map +1 -1
  613. package/src/view/controller/controls/ListController.js +118 -113
  614. package/src/view/controller/controls/Vector1Control.js +97 -97
  615. package/src/view/elements/image/SvgImageView.d.ts +1 -0
  616. package/src/view/elements/image/SvgImageView.d.ts.map +1 -1
  617. package/src/view/elements/image/SvgImageView.js +92 -90
  618. package/src/view/minimap/dom/MinimapTerrainView.d.ts +1 -0
  619. package/src/view/minimap/dom/MinimapTerrainView.d.ts.map +1 -1
  620. package/src/view/minimap/dom/MinimapTerrainView.js +151 -147
  621. package/src/view/tooltip/gml/TooltipParser.js +2 -2
  622. package/src/engine/network/PriorityFetch.d.ts +0 -59
  623. package/src/engine/network/PriorityFetch.d.ts.map +0 -1
  624. package/src/engine/network/PriorityFetch.js +0 -193
  625. package/src/generation/foliage/config/BranchLevelConfig.d.ts.map +0 -1
@@ -1,18 +1,14 @@
1
1
  /**
2
- * Configuration for one recursion level of branch generation (0 = Trunk, 1 = Primary Boughs,
3
- * 2 = Secondary Branches, 3 = Twigs).
2
+ * One branch generator of a tree: how a branch it grows is shaped (spine, taper, tropisms, bark relief,
3
+ * collar, splitting). Where and how many of its branches attach to a parent is described by the
4
+ * `BranchSpawnRule`s that target it, see `TreeSpeciesConfig.branch_rules`.
4
5
  */
5
- export class BranchLevelConfig {
6
+ export class BranchGeneratorConfig {
6
7
  /**
7
- * @param {Partial<BranchLevelConfig>} [options]
8
- * @returns {BranchLevelConfig}
8
+ * @param {Partial<BranchGeneratorConfig>} [options]
9
+ * @returns {BranchGeneratorConfig}
9
10
  */
10
- static from(options?: Partial<BranchLevelConfig>): BranchLevelConfig;
11
- /**
12
- * Recursion level index (0 = trunk).
13
- * @type {number}
14
- */
15
- level: number;
11
+ static from(options?: Partial<BranchGeneratorConfig>): BranchGeneratorConfig;
16
12
  /**
17
13
  * Number of longitudinal Cubic Hermite segments along the spine.
18
14
  * @type {number}
@@ -29,7 +25,7 @@ export class BranchLevelConfig {
29
25
  */
30
26
  radial_segments_min: number;
31
27
  /**
32
- * Nominal length (for level 0 in meters; for level > 0 as ratio of parent length or meters).
28
+ * Nominal length in meters (scaled per child by the spawning rule's `length_profile`).
33
29
  * @type {number}
34
30
  */
35
31
  length: number;
@@ -38,11 +34,6 @@ export class BranchLevelConfig {
38
34
  * @type {number}
39
35
  */
40
36
  length_variance: number;
41
- /**
42
- * 1D Hermite curve scaling child length along parent normalized position t in [0, 1].
43
- * @type {AnimationCurve}
44
- */
45
- length_profile: AnimationCurve;
46
37
  /**
47
38
  * Base radius as a fraction of branch length.
48
39
  * @type {number}
@@ -58,47 +49,6 @@ export class BranchLevelConfig {
58
49
  * @type {AnimationCurve}
59
50
  */
60
51
  radius_profile: AnimationCurve;
61
- /**
62
- * Fraction [0, 0.95] at the base of this branch where no child branches spawn.
63
- * @type {number}
64
- */
65
- bare_length_ratio: number;
66
- /**
67
- * Number of lateral child branch nodes spawned by a branch at this level into (level + 1).
68
- * @type {number}
69
- */
70
- child_count: number;
71
- /**
72
- * Phyllotactic arrangement for children spawned along this branch.
73
- * @type {PhyllotaxisMode|number}
74
- */
75
- phyllotaxis_mode: PhyllotaxisMode | number;
76
- /**
77
- * Number of branches per whorl when `phyllotaxis_mode === PhyllotaxisMode.Whorled`.
78
- * @type {number}
79
- */
80
- whorl_count: number;
81
- /**
82
- * Random azimuthal jitter in radians.
83
- * @type {number}
84
- */
85
- azimuth_jitter: number;
86
- /**
87
- * Axillary insertion (polar divergence) angle in radians from parent tangent.
88
- * @type {number}
89
- */
90
- insertion_angle: number;
91
- /**
92
- * Random variation in insertion angle (radians).
93
- * @type {number}
94
- */
95
- insertion_angle_variation: number;
96
- /**
97
- * 1D Hermite curve scaling insertion angle along parent normalized position t in [0, 1].
98
- * Typically wider at bottom of crown (1.0) and steeper near apex (0.6).
99
- * @type {AnimationCurve}
100
- */
101
- insertion_angle_profile: AnimationCurve;
102
52
  /**
103
53
  * Cumulative intrinsic pitch curvature (radians) along the spine.
104
54
  * @type {number}
@@ -229,6 +179,29 @@ export class BranchLevelConfig {
229
179
  * @type {number}
230
180
  */
231
181
  tip_upcurl: number;
182
+ /**
183
+ * Plagiotropism [0, 1]: how dorsiventral this generator's shoots are. A plagiotropic shoot grows in the horizontal
184
+ * plane and bears its buds in it: its spine is pulled towards horizontal, its children's buds are fanned into the
185
+ * plane spanned by its tangent and the horizontal across it, and no bud is emitted into the downward cone of
186
+ * half-angle `plagiotropism * pi / 2`: a bud on its underside does not break, nor one that fanning or a turn for
187
+ * clearance would carry into the cone (contact with a neighbour can still deflect a child afterwards).
188
+ * Set it by the species' architectural model: the branches of Massart's model (fir, spruce) and Troll's (beech, lime,
189
+ * elm) are plagiotropic; those of Rauh's model (pine, maple, oak, birch) are orthotropic, built like the trunk, and
190
+ * take 0. Only lateral (non-trunk) shoots are plagiotropic; a vertical parent has no horizontal plane to fan its buds
191
+ * into.
192
+ *
193
+ * Models: Hallé, Oldeman & Tomlinson (1978), *Tropical Trees and Forests*. Species per model: Pfisterer (2000),
194
+ * *Mitt. Biol. Bundesanst. Land- Forstwirtsch.* 370; Millet, Bouchard & Édelin (1999), *Écoscience* 6: 187–203.
195
+ * @type {number}
196
+ */
197
+ plagiotropism: number;
198
+ /**
199
+ * Straightness [0, 1]: pull of the growing tip back towards the heading its bud left the parent with (for the fork
200
+ * that continues a split, the heading the split gave it), so a strongly gnarled branch still arrives near where it
201
+ * was aimed. It resists every deviation from that heading, droop and curl included.
202
+ * @type {number}
203
+ */
204
+ straightness: number;
232
205
  /**
233
206
  * Biomechanical reaction-wood cross-sectional ovalization on inclined boughs [0, 0.5].
234
207
  * @type {number}
@@ -240,39 +213,53 @@ export class BranchLevelConfig {
240
213
  */
241
214
  bark_displacement: number;
242
215
  /**
243
- * Swelling collar boss amplitude on this parent stem around attached child branches.
216
+ * Swelling collar boss amplitude on this parent stem around attached child branches. The collar outlives a shed
217
+ * branch: it is the healed callus rim around the scar left where the branch grew (see `self_pruning`).
244
218
  * @type {number}
245
219
  */
246
220
  parent_collar_bulge: number;
247
221
  /**
248
- * Number of healed pruned-branch callus knots, burls, or eye scars along this stem.
249
- * @type {number}
222
+ * Excurrent (monopodial) stem habit: a single dominant plumb leader with tight lateral drift and no apical
223
+ * relaxation, as in conifers. Only meaningful on the trunk generator.
224
+ * @type {boolean}
225
+ */
226
+ excurrent: boolean;
227
+ /**
228
+ * Structural surface root: the branch creeps along the ground plane `y = 0`, sinking from fully exposed at
229
+ * the stem until it is buried about halfway out,
230
+ * adds no pipe-model area to its parent and is never given a wind joint. Its spawning rule should
231
+ * set `crown_envelope: false`.
232
+ * @type {boolean}
250
233
  */
251
- knot_count: number;
234
+ root: boolean;
252
235
  /**
253
- * Radial amplitude of callus knots and burls (fraction of local branch radius).
236
+ * Self-pruning [0, 1]: how readily this generator's branches are shed once the crown rises above them and they
237
+ * die in its shade. `1` = dead branches drop at the collar and are grown over, leaving no stub. Below that, a
238
+ * dead branch keeps `(1 - self_pruning) - age` of its length, `age` running from 0 just below the living
239
+ * branches to 1 at the stem's base; what no longer clears the bark has been grown over. Good self-pruners
240
+ * (birch, beech) sit near 1, poor ones that keep a skirt of dead branches (spruce) near 0.
254
241
  * @type {number}
255
242
  */
256
- knot_strength: number;
243
+ self_pruning: number;
257
244
  /**
258
- * @param {Partial<BranchLevelConfig>} [overrides]
245
+ * @param {Partial<BranchGeneratorConfig>} [overrides]
259
246
  * @returns {this}
260
247
  */
261
- applyOverrides(overrides?: Partial<BranchLevelConfig>): this;
248
+ applyOverrides(overrides?: Partial<BranchGeneratorConfig>): this;
262
249
  /**
263
- * @param {BranchLevelConfig} other
250
+ * @param {BranchGeneratorConfig} other
264
251
  * @returns {this}
265
252
  */
266
- copy(other: BranchLevelConfig): this;
253
+ copy(other: BranchGeneratorConfig): this;
267
254
  /**
268
- * @returns {BranchLevelConfig}
255
+ * @returns {BranchGeneratorConfig}
269
256
  */
270
- clone(): BranchLevelConfig;
257
+ clone(): BranchGeneratorConfig;
271
258
  /**
272
- * @param {BranchLevelConfig} other
259
+ * @param {BranchGeneratorConfig} other
273
260
  * @returns {boolean}
274
261
  */
275
- equals(other: BranchLevelConfig): boolean;
262
+ equals(other: BranchGeneratorConfig): boolean;
276
263
  /**
277
264
  * @returns {number}
278
265
  */
@@ -281,8 +268,7 @@ export class BranchLevelConfig {
281
268
  * @readonly
282
269
  * @type {boolean}
283
270
  */
284
- readonly isBranchLevelConfig: boolean;
271
+ readonly isBranchGeneratorConfig: boolean;
285
272
  }
286
273
  import { AnimationCurve } from "../../../engine/animation/curve/AnimationCurve.js";
287
- import { PhyllotaxisMode } from "./PhyllotaxisMode.js";
288
- //# sourceMappingURL=BranchLevelConfig.d.ts.map
274
+ //# sourceMappingURL=BranchGeneratorConfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BranchGeneratorConfig.d.ts","sourceRoot":"","sources":["../../../../../src/generation/foliage/config/BranchGeneratorConfig.js"],"names":[],"mappings":"AAMA;;;;GAIG;AACH;IAmRI;;;OAGG;IACH,sBAHW,QAAQ,qBAAqB,CAAC,GAC5B,qBAAqB,CAMjC;IA1RD;;;OAGG;IACH,UAFU,MAAM,CAEH;IAEb;;;OAGG;IACH,qBAFU,MAAM,CAES;IAEzB;;;OAGG;IACH,qBAFU,MAAM,CAEQ;IAExB;;;OAGG;IACH,QAFU,MAAM,CAEH;IAEb;;;OAGG;IACH,iBAFU,MAAM,CAEM;IAEtB;;;OAGG;IACH,cAFU,MAAM,CAEI;IAEpB;;;OAGG;IACH,OAFU,MAAM,CAEH;IAEb;;;OAGG;IACH,gBAFU,cAAc,CAE8B;IAEtD;;;OAGG;IACH,WAFU,MAAM,CAEC;IAEjB;;;OAGG;IACH,YAFU,MAAM,CAEC;IAEjB;;;OAGG;IACH,cAFU,MAAM,CAEG;IAEnB;;;OAGG;IACH,cAFU,MAAM,CAEI;IAEpB;;;OAGG;IACH,cAFU,MAAM,CAEI;IAEpB;;;OAGG;IACH,gBAFU,MAAM,CAEM;IAEtB;;;OAGG;IACH,iBAFU,MAAM,CAEO;IAEvB;;;OAGG;IACH,mBAFU,MAAM,CAEQ;IAExB;;;OAGG;IACH,aAFU,MAAM,CAEA;IAEhB;;;OAGG;IACH,aAFU,MAAM,CAEG;IAEnB;;;OAGG;IACH,iBAFU,MAAM,CAEM;IAEtB;;;OAGG;IACH,oBAFU,MAAM,CAEU;IAE1B;;;OAGG;IACH,aAFU,MAAM,CAEA;IAEhB;;;OAGG;IACH,iBAFU,MAAM,CAEM;IAEtB;;;OAGG;IACH,iBAFU,MAAM,CAEM;IAEtB;;;OAGG;IACH,iBAFU,MAAM,CAEI;IAEpB;;;OAGG;IACH,mBAFU,MAAM,CAEM;IAEtB;;;OAGG;IACH,qBAFU,MAAM,CAEW;IAE3B;;;OAGG;IACH,qBAFU,MAAM,CAEW;IAE3B;;;OAGG;IACH,qBAFU,MAAM,CAEW;IAE3B;;;OAGG;IACH,qBAFU,MAAM,CAEW;IAE3B;;;OAGG;IACH,YAFU,MAAM,CAEE;IAElB;;;OAGG;IACH,qBAFU,MAAM,CAEW;IAE3B;;;OAGG;IACH,kBAFU,MAAM,CAEQ;IAExB;;;OAGG;IACH,gBAFU,MAAM,CAEM;IAEtB;;;OAGG;IACH,YAFU,MAAM,CAEE;IAElB;;;;;;;;;;;;;;OAcG;IACH,eAFU,MAAM,CAEI;IAEpB;;;;;OAKG;IACH,cAFU,MAAM,CAEG;IAEnB;;;OAGG;IACH,mBAFU,MAAM,CAES;IAEzB;;;OAGG;IACH,mBAFU,MAAM,CAES;IAEzB;;;;OAIG;IACH,qBAFU,MAAM,CAEW;IAE3B;;;;OAIG;IACH,WAFU,OAAO,CAEC;IAElB;;;;;;OAMG;IACH,MAFU,OAAO,CAEJ;IAEb;;;;;;;OAOG;IACH,cAFU,MAAM,CAEG;IAYnB;;;OAGG;IACH,2BAHW,QAAQ,qBAAqB,CAAC,GAC5B,IAAI,CAoDhB;IAED;;;OAGG;IACH,YAHW,qBAAqB,GACnB,IAAI,CA+ChB;IAED;;OAEG;IACH,SAFa,qBAAqB,CAMjC;IAED;;;OAGG;IACH,cAHW,qBAAqB,GACnB,OAAO,CA+CnB;IAED;;OAEG;IACH,QAFa,MAAM,CAqBlB;IAGL;;;OAGG;IACH,kCAFU,OAAO,CAEsC;CANtD;+BAle8B,mDAAmD"}
@@ -1,20 +1,15 @@
1
1
  import { assert } from "../../../core/assert.js";
2
+ import { clamp } from "../../../core/math/clamp.js";
2
3
  import { hash_mix2 } from "../../../core/math/hash/hash_mix2.js";
3
4
  import { computeHashFloat } from "../../../core/primitives/numbers/computeHashFloat.js";
4
5
  import { AnimationCurve } from "../../../engine/animation/curve/AnimationCurve.js";
5
- import { PhyllotaxisMode } from "./PhyllotaxisMode.js";
6
6
 
7
7
  /**
8
- * Configuration for one recursion level of branch generation (0 = Trunk, 1 = Primary Boughs,
9
- * 2 = Secondary Branches, 3 = Twigs).
8
+ * One branch generator of a tree: how a branch it grows is shaped (spine, taper, tropisms, bark relief,
9
+ * collar, splitting). Where and how many of its branches attach to a parent is described by the
10
+ * `BranchSpawnRule`s that target it, see `TreeSpeciesConfig.branch_rules`.
10
11
  */
11
- export class BranchLevelConfig {
12
- /**
13
- * Recursion level index (0 = trunk).
14
- * @type {number}
15
- */
16
- level = 0;
17
-
12
+ export class BranchGeneratorConfig {
18
13
  /**
19
14
  * Number of longitudinal Cubic Hermite segments along the spine.
20
15
  * @type {number}
@@ -34,7 +29,7 @@ export class BranchLevelConfig {
34
29
  radial_segments_min = 4;
35
30
 
36
31
  /**
37
- * Nominal length (for level 0 in meters; for level > 0 as ratio of parent length or meters).
32
+ * Nominal length in meters (scaled per child by the spawning rule's `length_profile`).
38
33
  * @type {number}
39
34
  */
40
35
  length = 8.0;
@@ -45,12 +40,6 @@ export class BranchLevelConfig {
45
40
  */
46
41
  length_variance = 0.1;
47
42
 
48
- /**
49
- * 1D Hermite curve scaling child length along parent normalized position t in [0, 1].
50
- * @type {AnimationCurve}
51
- */
52
- length_profile = AnimationCurve.constant(0, 1, 1);
53
-
54
43
  /**
55
44
  * Base radius as a fraction of branch length.
56
45
  * @type {number}
@@ -69,55 +58,6 @@ export class BranchLevelConfig {
69
58
  */
70
59
  radius_profile = AnimationCurve.linear(0, 1, 1, 0.15);
71
60
 
72
- /**
73
- * Fraction [0, 0.95] at the base of this branch where no child branches spawn.
74
- * @type {number}
75
- */
76
- bare_length_ratio = 0.25;
77
-
78
- /**
79
- * Number of lateral child branch nodes spawned by a branch at this level into (level + 1).
80
- * @type {number}
81
- */
82
- child_count = 10;
83
-
84
- /**
85
- * Phyllotactic arrangement for children spawned along this branch.
86
- * @type {PhyllotaxisMode|number}
87
- */
88
- phyllotaxis_mode = PhyllotaxisMode.SpiralGolden;
89
-
90
- /**
91
- * Number of branches per whorl when `phyllotaxis_mode === PhyllotaxisMode.Whorled`.
92
- * @type {number}
93
- */
94
- whorl_count = 3;
95
-
96
- /**
97
- * Random azimuthal jitter in radians.
98
- * @type {number}
99
- */
100
- azimuth_jitter = 0.15;
101
-
102
- /**
103
- * Axillary insertion (polar divergence) angle in radians from parent tangent.
104
- * @type {number}
105
- */
106
- insertion_angle = 0.72;
107
-
108
- /**
109
- * Random variation in insertion angle (radians).
110
- * @type {number}
111
- */
112
- insertion_angle_variation = 0.12;
113
-
114
- /**
115
- * 1D Hermite curve scaling insertion angle along parent normalized position t in [0, 1].
116
- * Typically wider at bottom of crown (1.0) and steeper near apex (0.6).
117
- * @type {AnimationCurve}
118
- */
119
- insertion_angle_profile = AnimationCurve.linear(0, 1.0, 1, 0.65);
120
-
121
61
  /**
122
62
  * Cumulative intrinsic pitch curvature (radians) along the spine.
123
63
  * @type {number}
@@ -274,6 +214,31 @@ export class BranchLevelConfig {
274
214
  */
275
215
  tip_upcurl = 0.18;
276
216
 
217
+ /**
218
+ * Plagiotropism [0, 1]: how dorsiventral this generator's shoots are. A plagiotropic shoot grows in the horizontal
219
+ * plane and bears its buds in it: its spine is pulled towards horizontal, its children's buds are fanned into the
220
+ * plane spanned by its tangent and the horizontal across it, and no bud is emitted into the downward cone of
221
+ * half-angle `plagiotropism * pi / 2`: a bud on its underside does not break, nor one that fanning or a turn for
222
+ * clearance would carry into the cone (contact with a neighbour can still deflect a child afterwards).
223
+ * Set it by the species' architectural model: the branches of Massart's model (fir, spruce) and Troll's (beech, lime,
224
+ * elm) are plagiotropic; those of Rauh's model (pine, maple, oak, birch) are orthotropic, built like the trunk, and
225
+ * take 0. Only lateral (non-trunk) shoots are plagiotropic; a vertical parent has no horizontal plane to fan its buds
226
+ * into.
227
+ *
228
+ * Models: Hallé, Oldeman & Tomlinson (1978), *Tropical Trees and Forests*. Species per model: Pfisterer (2000),
229
+ * *Mitt. Biol. Bundesanst. Land- Forstwirtsch.* 370; Millet, Bouchard & Édelin (1999), *Écoscience* 6: 187–203.
230
+ * @type {number}
231
+ */
232
+ plagiotropism = 0.0;
233
+
234
+ /**
235
+ * Straightness [0, 1]: pull of the growing tip back towards the heading its bud left the parent with (for the fork
236
+ * that continues a split, the heading the split gave it), so a strongly gnarled branch still arrives near where it
237
+ * was aimed. It resists every deviation from that heading, droop and curl included.
238
+ * @type {number}
239
+ */
240
+ straightness = 0.0;
241
+
277
242
  /**
278
243
  * Biomechanical reaction-wood cross-sectional ovalization on inclined boughs [0, 0.5].
279
244
  * @type {number}
@@ -287,42 +252,56 @@ export class BranchLevelConfig {
287
252
  bark_displacement = 0.08;
288
253
 
289
254
  /**
290
- * Swelling collar boss amplitude on this parent stem around attached child branches.
255
+ * Swelling collar boss amplitude on this parent stem around attached child branches. The collar outlives a shed
256
+ * branch: it is the healed callus rim around the scar left where the branch grew (see `self_pruning`).
291
257
  * @type {number}
292
258
  */
293
259
  parent_collar_bulge = 0.28;
294
260
 
295
261
  /**
296
- * Number of healed pruned-branch callus knots, burls, or eye scars along this stem.
297
- * @type {number}
262
+ * Excurrent (monopodial) stem habit: a single dominant plumb leader with tight lateral drift and no apical
263
+ * relaxation, as in conifers. Only meaningful on the trunk generator.
264
+ * @type {boolean}
265
+ */
266
+ excurrent = false;
267
+
268
+ /**
269
+ * Structural surface root: the branch creeps along the ground plane `y = 0`, sinking from fully exposed at
270
+ * the stem until it is buried about halfway out,
271
+ * adds no pipe-model area to its parent and is never given a wind joint. Its spawning rule should
272
+ * set `crown_envelope: false`.
273
+ * @type {boolean}
298
274
  */
299
- knot_count = 4;
275
+ root = false;
300
276
 
301
277
  /**
302
- * Radial amplitude of callus knots and burls (fraction of local branch radius).
278
+ * Self-pruning [0, 1]: how readily this generator's branches are shed once the crown rises above them and they
279
+ * die in its shade. `1` = dead branches drop at the collar and are grown over, leaving no stub. Below that, a
280
+ * dead branch keeps `(1 - self_pruning) - age` of its length, `age` running from 0 just below the living
281
+ * branches to 1 at the stem's base; what no longer clears the bark has been grown over. Good self-pruners
282
+ * (birch, beech) sit near 1, poor ones that keep a skirt of dead branches (spruce) near 0.
303
283
  * @type {number}
304
284
  */
305
- knot_strength = 0.16;
285
+ self_pruning = 1.0;
306
286
 
307
287
  /**
308
- * @param {Partial<BranchLevelConfig>} [options]
309
- * @returns {BranchLevelConfig}
288
+ * @param {Partial<BranchGeneratorConfig>} [options]
289
+ * @returns {BranchGeneratorConfig}
310
290
  */
311
291
  static from(options = {}) {
312
- const r = new BranchLevelConfig();
292
+ const r = new BranchGeneratorConfig();
313
293
  r.applyOverrides(options);
314
294
  return r;
315
295
  }
316
296
 
317
297
  /**
318
- * @param {Partial<BranchLevelConfig>} [overrides]
298
+ * @param {Partial<BranchGeneratorConfig>} [overrides]
319
299
  * @returns {this}
320
300
  */
321
301
  applyOverrides(overrides = {}) {
322
302
  if (overrides === null || overrides === undefined) {
323
303
  return this;
324
304
  }
325
- if (overrides.level !== undefined) this.level = overrides.level;
326
305
  if (overrides.segments !== undefined) this.segments = Math.max(1, overrides.segments | 0);
327
306
  if (overrides.radial_segments_max !== undefined) this.radial_segments_max = Math.max(3, overrides.radial_segments_max | 0);
328
307
  if (overrides.radial_segments_min !== undefined) this.radial_segments_min = Math.max(3, overrides.radial_segments_min | 0);
@@ -331,18 +310,9 @@ export class BranchLevelConfig {
331
310
  }
332
311
  if (overrides.length !== undefined) this.length = overrides.length;
333
312
  if (overrides.length_variance !== undefined) this.length_variance = overrides.length_variance;
334
- if (overrides.length_profile !== undefined) this.length_profile.copy(overrides.length_profile);
335
313
  if (overrides.radius_ratio !== undefined) this.radius_ratio = overrides.radius_ratio;
336
314
  if (overrides.taper !== undefined) this.taper = overrides.taper;
337
315
  if (overrides.radius_profile !== undefined) this.radius_profile.copy(overrides.radius_profile);
338
- if (overrides.bare_length_ratio !== undefined) this.bare_length_ratio = overrides.bare_length_ratio;
339
- if (overrides.child_count !== undefined) this.child_count = Math.max(0, overrides.child_count | 0);
340
- if (overrides.phyllotaxis_mode !== undefined) this.phyllotaxis_mode = overrides.phyllotaxis_mode;
341
- if (overrides.whorl_count !== undefined) this.whorl_count = Math.max(1, overrides.whorl_count | 0);
342
- if (overrides.azimuth_jitter !== undefined) this.azimuth_jitter = overrides.azimuth_jitter;
343
- if (overrides.insertion_angle !== undefined) this.insertion_angle = overrides.insertion_angle;
344
- if (overrides.insertion_angle_variation !== undefined) this.insertion_angle_variation = overrides.insertion_angle_variation;
345
- if (overrides.insertion_angle_profile !== undefined) this.insertion_angle_profile.copy(overrides.insertion_angle_profile);
346
316
  if (overrides.curvature !== undefined) this.curvature = overrides.curvature;
347
317
  if (overrides.curve_back !== undefined) this.curve_back = overrides.curve_back;
348
318
  if (overrides.spiral_twist !== undefined) this.spiral_twist = overrides.spiral_twist;
@@ -369,38 +339,31 @@ export class BranchLevelConfig {
369
339
  if (overrides.internode_zigzag !== undefined) this.internode_zigzag = overrides.internode_zigzag;
370
340
  if (overrides.kink_sharpness !== undefined) this.kink_sharpness = overrides.kink_sharpness;
371
341
  if (overrides.tip_upcurl !== undefined) this.tip_upcurl = overrides.tip_upcurl;
342
+ if (overrides.plagiotropism !== undefined) this.plagiotropism = clamp(overrides.plagiotropism, 0.0, 1.0);
343
+ if (overrides.straightness !== undefined) this.straightness = clamp(overrides.straightness, 0.0, 1.0);
372
344
  if (overrides.oval_eccentricity !== undefined) this.oval_eccentricity = overrides.oval_eccentricity;
373
345
  if (overrides.bark_displacement !== undefined) this.bark_displacement = overrides.bark_displacement;
374
346
  if (overrides.parent_collar_bulge !== undefined) this.parent_collar_bulge = overrides.parent_collar_bulge;
375
- if (overrides.knot_count !== undefined) this.knot_count = Math.max(0, overrides.knot_count | 0);
376
- if (overrides.knot_strength !== undefined) this.knot_strength = overrides.knot_strength;
347
+ if (overrides.excurrent !== undefined) this.excurrent = Boolean(overrides.excurrent);
348
+ if (overrides.root !== undefined) this.root = Boolean(overrides.root);
349
+ if (overrides.self_pruning !== undefined) this.self_pruning = clamp(overrides.self_pruning, 0.0, 1.0);
377
350
  return this;
378
351
  }
379
352
 
380
353
  /**
381
- * @param {BranchLevelConfig} other
354
+ * @param {BranchGeneratorConfig} other
382
355
  * @returns {this}
383
356
  */
384
357
  copy(other) {
385
358
  assert.defined(other, 'other');
386
- this.level = other.level;
387
359
  this.segments = other.segments;
388
360
  this.radial_segments_max = other.radial_segments_max;
389
361
  this.radial_segments_min = other.radial_segments_min;
390
362
  this.length = other.length;
391
363
  this.length_variance = other.length_variance;
392
- this.length_profile.copy(other.length_profile);
393
364
  this.radius_ratio = other.radius_ratio;
394
365
  this.taper = other.taper;
395
366
  this.radius_profile.copy(other.radius_profile);
396
- this.bare_length_ratio = other.bare_length_ratio;
397
- this.child_count = other.child_count;
398
- this.phyllotaxis_mode = other.phyllotaxis_mode;
399
- this.whorl_count = other.whorl_count;
400
- this.azimuth_jitter = other.azimuth_jitter;
401
- this.insertion_angle = other.insertion_angle;
402
- this.insertion_angle_variation = other.insertion_angle_variation;
403
- this.insertion_angle_profile.copy(other.insertion_angle_profile);
404
367
  this.curvature = other.curvature;
405
368
  this.curve_back = other.curve_back;
406
369
  this.spiral_twist = other.spiral_twist;
@@ -427,48 +390,41 @@ export class BranchLevelConfig {
427
390
  this.internode_zigzag = other.internode_zigzag;
428
391
  this.kink_sharpness = other.kink_sharpness;
429
392
  this.tip_upcurl = other.tip_upcurl;
393
+ this.plagiotropism = other.plagiotropism;
394
+ this.straightness = other.straightness;
430
395
  this.oval_eccentricity = other.oval_eccentricity;
431
396
  this.bark_displacement = other.bark_displacement;
432
397
  this.parent_collar_bulge = other.parent_collar_bulge;
433
- this.knot_count = other.knot_count;
434
- this.knot_strength = other.knot_strength;
398
+ this.excurrent = other.excurrent;
399
+ this.root = other.root;
400
+ this.self_pruning = other.self_pruning;
435
401
  return this;
436
402
  }
437
403
 
438
404
  /**
439
- * @returns {BranchLevelConfig}
405
+ * @returns {BranchGeneratorConfig}
440
406
  */
441
407
  clone() {
442
- const r = new BranchLevelConfig();
408
+ const r = new BranchGeneratorConfig();
443
409
  r.copy(this);
444
410
  return r;
445
411
  }
446
412
 
447
413
  /**
448
- * @param {BranchLevelConfig} other
414
+ * @param {BranchGeneratorConfig} other
449
415
  * @returns {boolean}
450
416
  */
451
417
  equals(other) {
452
418
  if (this === other) return true;
453
- if (!other || !other.isBranchLevelConfig) return false;
454
- return this.level === other.level
455
- && this.segments === other.segments
419
+ if (!other || !other.isBranchGeneratorConfig) return false;
420
+ return this.segments === other.segments
456
421
  && this.radial_segments_max === other.radial_segments_max
457
422
  && this.radial_segments_min === other.radial_segments_min
458
423
  && this.length === other.length
459
424
  && this.length_variance === other.length_variance
460
- && this.length_profile.equals(other.length_profile)
461
425
  && this.radius_ratio === other.radius_ratio
462
426
  && this.taper === other.taper
463
427
  && this.radius_profile.equals(other.radius_profile)
464
- && this.bare_length_ratio === other.bare_length_ratio
465
- && this.child_count === other.child_count
466
- && this.phyllotaxis_mode === other.phyllotaxis_mode
467
- && this.whorl_count === other.whorl_count
468
- && this.azimuth_jitter === other.azimuth_jitter
469
- && this.insertion_angle === other.insertion_angle
470
- && this.insertion_angle_variation === other.insertion_angle_variation
471
- && this.insertion_angle_profile.equals(other.insertion_angle_profile)
472
428
  && this.curvature === other.curvature
473
429
  && this.curve_back === other.curve_back
474
430
  && this.spiral_twist === other.spiral_twist
@@ -495,26 +451,25 @@ export class BranchLevelConfig {
495
451
  && this.internode_zigzag === other.internode_zigzag
496
452
  && this.kink_sharpness === other.kink_sharpness
497
453
  && this.tip_upcurl === other.tip_upcurl
454
+ && this.plagiotropism === other.plagiotropism
455
+ && this.straightness === other.straightness
498
456
  && this.oval_eccentricity === other.oval_eccentricity
499
457
  && this.bark_displacement === other.bark_displacement
500
458
  && this.parent_collar_bulge === other.parent_collar_bulge
501
- && this.knot_count === other.knot_count
502
- && this.knot_strength === other.knot_strength;
459
+ && this.excurrent === other.excurrent
460
+ && this.root === other.root
461
+ && this.self_pruning === other.self_pruning;
503
462
  }
504
463
 
505
464
  /**
506
465
  * @returns {number}
507
466
  */
508
467
  hash() {
509
- let h = hash_mix2(this.level, this.segments);
510
- h = hash_mix2(h, this.radial_segments_max);
468
+ let h = hash_mix2(this.segments, this.radial_segments_max);
511
469
  h = hash_mix2(h, this.radial_segments_min);
512
470
  h = hash_mix2(h, computeHashFloat(this.length));
513
471
  h = hash_mix2(h, computeHashFloat(this.radius_ratio));
514
472
  h = hash_mix2(h, computeHashFloat(this.taper));
515
- h = hash_mix2(h, this.child_count);
516
- h = hash_mix2(h, this.phyllotaxis_mode);
517
- h = hash_mix2(h, computeHashFloat(this.insertion_angle));
518
473
  h = hash_mix2(h, computeHashFloat(this.curvature));
519
474
  h = hash_mix2(h, computeHashFloat(this.gravitropism));
520
475
  h = hash_mix2(h, computeHashFloat(this.phototropism));
@@ -522,9 +477,11 @@ export class BranchLevelConfig {
522
477
  h = hash_mix2(h, computeHashFloat(this.nodal_kink_strength));
523
478
  h = hash_mix2(h, computeHashFloat(this.internode_zigzag));
524
479
  h = hash_mix2(h, computeHashFloat(this.bark_displacement));
525
- h = hash_mix2(h, computeHashFloat(this.knot_strength));
526
- h = hash_mix2(h, this.length_profile.hash());
527
480
  h = hash_mix2(h, this.radius_profile.hash());
481
+ h = hash_mix2(h, (this.excurrent ? 1 : 0) | (this.root ? 2 : 0));
482
+ h = hash_mix2(h, computeHashFloat(this.self_pruning));
483
+ h = hash_mix2(h, computeHashFloat(this.plagiotropism));
484
+ h = hash_mix2(h, computeHashFloat(this.straightness));
528
485
  return h;
529
486
  }
530
487
  }
@@ -533,4 +490,4 @@ export class BranchLevelConfig {
533
490
  * @readonly
534
491
  * @type {boolean}
535
492
  */
536
- BranchLevelConfig.prototype.isBranchLevelConfig = true;
493
+ BranchGeneratorConfig.prototype.isBranchGeneratorConfig = true;