@woosh/meep-engine 3.55.0 → 3.57.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (650) hide show
  1. package/build/bundle-worker-terrain.js +1 -1
  2. package/package.json +1 -1
  3. package/src/DUPLICATION_REVIEW_2026_10_24.md +1072 -0
  4. package/src/core/binary/BitSet.js +1 -1
  5. package/src/core/binary/FLOAT16_MAX.d.ts +2 -0
  6. package/src/core/binary/FLOAT16_MAX.d.ts.map +1 -0
  7. package/src/core/binary/FLOAT16_MAX.js +1 -0
  8. package/src/core/binary/base58/base58_encode.js +2 -2
  9. package/src/core/binary/type/TypeBuilder.js +1 -1
  10. package/src/core/bvh2/bvh3/BVH.js +1 -1
  11. package/src/core/bvh2/bvh3/ebvh_optimize_treelet.d.ts.map +1 -1
  12. package/src/core/bvh2/bvh3/ebvh_optimize_treelet.js +7 -3
  13. package/src/core/bvh2/bvh3/ebvh_update_hierarchy_bounds.d.ts.map +1 -1
  14. package/src/core/bvh2/bvh3/ebvh_update_hierarchy_bounds.js +5 -1
  15. package/src/core/bvh2/bvh3/query/compute_tight_near_far_clipping_planes.d.ts.map +1 -1
  16. package/src/core/bvh2/bvh3/query/compute_tight_near_far_clipping_planes.js +195 -246
  17. package/src/core/collection/CuckooFilter.js +1 -1
  18. package/src/core/collection/array/isArrayEqual.d.ts.map +1 -1
  19. package/src/core/collection/array/isArrayEqual.js +33 -58
  20. package/src/core/collection/array/typed/array_buffer_hash.d.ts.map +1 -1
  21. package/src/core/collection/array/typed/array_buffer_hash.js +41 -39
  22. package/src/core/collection/array/typed/float32_array_hash.js +38 -38
  23. package/src/core/collection/array/typed/uint16_array_hash.d.ts +2 -1
  24. package/src/core/collection/array/typed/uint16_array_hash.d.ts.map +1 -1
  25. package/src/core/collection/array/typed/uint16_array_hash.js +30 -29
  26. package/src/core/collection/array/typed/uint32_array_hash.d.ts +2 -1
  27. package/src/core/collection/array/typed/uint32_array_hash.d.ts.map +1 -1
  28. package/src/core/collection/array/typed/uint32_array_hash.js +21 -20
  29. package/src/core/collection/array/typed/uint8_array_hash.d.ts +2 -1
  30. package/src/core/collection/array/typed/uint8_array_hash.d.ts.map +1 -1
  31. package/src/core/collection/array/typed/uint8_array_hash.js +37 -36
  32. package/src/core/collection/array/typed/uint_array_for_count.js +2 -2
  33. package/src/core/collection/list/List.d.ts.map +1 -1
  34. package/src/core/collection/list/List.js +3 -19
  35. package/src/core/collection/table/RowFirstTable.d.ts.map +1 -1
  36. package/src/core/collection/table/RowFirstTable.js +4 -28
  37. package/src/core/debug/matchers/DescribeAs.d.ts.map +1 -1
  38. package/src/core/debug/matchers/DescribeAs.js +62 -64
  39. package/src/core/function/FunctionCompiler.js +4 -4
  40. package/src/core/function/objectsEqual.d.ts.map +1 -1
  41. package/src/core/function/objectsEqual.js +3 -2
  42. package/src/core/geom/2d/bvh/BVH2D.d.ts.map +1 -1
  43. package/src/core/geom/2d/bvh/BVH2D.js +4 -3
  44. package/src/core/geom/2d/convex-hull/convex_hull_fixed_count_2d_relaxation.d.ts +5 -2
  45. package/src/core/geom/2d/convex-hull/convex_hull_fixed_count_2d_relaxation.d.ts.map +1 -1
  46. package/src/core/geom/2d/convex-hull/convex_hull_fixed_count_2d_relaxation.js +49 -11
  47. package/src/core/geom/2d/hash-grid/shg_query_elements_circle.d.ts.map +1 -1
  48. package/src/core/geom/2d/hash-grid/shg_query_elements_circle.js +122 -159
  49. package/src/core/geom/2d/hash-grid/shg_query_elements_line.d.ts.map +1 -1
  50. package/src/core/geom/2d/hash-grid/shg_query_elements_line.js +8 -5
  51. package/src/core/geom/2d/polygon/polygon2_rasterize_coverage.d.ts +18 -0
  52. package/src/core/geom/2d/polygon/polygon2_rasterize_coverage.d.ts.map +1 -0
  53. package/src/core/geom/2d/polygon/polygon2_rasterize_coverage.js +97 -0
  54. package/src/core/geom/2d/r-tree/StaticR2Tree.js +2 -2
  55. package/src/core/geom/2d/triangle/tri2_rasterize_coverage.d.ts +21 -0
  56. package/src/core/geom/2d/triangle/tri2_rasterize_coverage.d.ts.map +1 -0
  57. package/src/core/geom/2d/triangle/tri2_rasterize_coverage.js +54 -0
  58. package/src/core/geom/3d/aabb/aabb3_build_frustum.d.ts.map +1 -1
  59. package/src/core/geom/3d/aabb/aabb3_build_frustum.js +20 -53
  60. package/src/core/geom/3d/aabb/aabb3_score_boxes_SAH.d.ts +1 -1
  61. package/src/core/geom/3d/aabb/aabb3_score_boxes_SAH.d.ts.map +1 -1
  62. package/src/core/geom/3d/aabb/aabb3_score_boxes_SAH.js +11 -42
  63. package/src/core/geom/3d/atlas/pack/atlas_pack_charts.d.ts.map +1 -1
  64. package/src/core/geom/3d/atlas/pack/atlas_pack_charts.js +30 -32
  65. package/src/core/geom/3d/atlas/param/atlas_chart_parameterize_bff.d.ts.map +1 -1
  66. package/src/core/geom/3d/atlas/param/atlas_chart_parameterize_bff.js +1 -5
  67. package/src/core/geom/3d/atlas/param/atlas_chart_parameterize_lscm.d.ts.map +1 -1
  68. package/src/core/geom/3d/atlas/param/atlas_chart_parameterize_lscm.js +1 -15
  69. package/src/core/geom/3d/atlas/segment/atlas_merge_charts.d.ts.map +1 -1
  70. package/src/core/geom/3d/atlas/segment/atlas_merge_charts.js +105 -116
  71. package/src/core/geom/3d/line/line3_compute_segment_point_distance_sqr.d.ts.map +1 -1
  72. package/src/core/geom/3d/line/line3_compute_segment_point_distance_sqr.js +36 -54
  73. package/src/core/geom/3d/plane/plane3_compute_intersection_objects.d.ts +5 -10
  74. package/src/core/geom/3d/plane/plane3_compute_intersection_objects.d.ts.map +1 -1
  75. package/src/core/geom/3d/plane/plane3_compute_intersection_objects.js +20 -82
  76. package/src/core/geom/3d/plane/plane3_slerp.d.ts.map +1 -1
  77. package/src/core/geom/3d/plane/plane3_slerp.js +87 -102
  78. package/src/core/geom/3d/polygon/polygon3_compute_normal.d.ts +12 -0
  79. package/src/core/geom/3d/polygon/polygon3_compute_normal.d.ts.map +1 -1
  80. package/src/core/geom/3d/polygon/polygon3_compute_normal.js +107 -60
  81. package/src/core/geom/3d/ray/ray3_compute_closest_point.d.ts.map +1 -1
  82. package/src/core/geom/3d/ray/ray3_compute_closest_point.js +37 -43
  83. package/src/core/geom/3d/shape/ConvexHullShape3D.d.ts.map +1 -1
  84. package/src/core/geom/3d/shape/ConvexHullShape3D.js +5 -16
  85. package/src/core/geom/3d/shape/MeshShape3D.js +2 -56
  86. package/src/core/geom/3d/shape/TransformedShape3D.d.ts.map +1 -1
  87. package/src/core/geom/3d/shape/TransformedShape3D.js +10 -7
  88. package/src/core/geom/3d/shape/UnionShape3D.d.ts.map +1 -1
  89. package/src/core/geom/3d/shape/UnionShape3D.js +9 -3
  90. package/src/core/geom/3d/shape/json/shape_to_type.js +2 -2
  91. package/src/core/geom/3d/sphere/harmonics/SH3_COEFFICIENTS.js +17 -17
  92. package/src/core/geom/3d/tetrahedra/TetrahedralMesh.d.ts.map +1 -1
  93. package/src/core/geom/3d/tetrahedra/TetrahedralMesh.js +6 -2
  94. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_carve_outside_surface.d.ts.map +1 -1
  95. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_carve_outside_surface.js +3 -2
  96. package/src/core/geom/3d/tetrahedra/tetrahedron_contains_point.d.ts +20 -2
  97. package/src/core/geom/3d/tetrahedra/tetrahedron_contains_point.d.ts.map +1 -1
  98. package/src/core/geom/3d/tetrahedra/tetrahedron_contains_point.js +52 -37
  99. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_face_normals.d.ts.map +1 -1
  100. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_face_normals.js +40 -56
  101. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_vertex_quadrics.d.ts.map +1 -1
  102. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_vertex_quadrics.js +251 -260
  103. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_wedge_attribute_quadrics.d.ts.map +1 -1
  104. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_wedge_attribute_quadrics.js +104 -113
  105. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_resolve_t_junctions.d.ts.map +1 -1
  106. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_resolve_t_junctions.js +227 -238
  107. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_simplify.d.ts.map +1 -1
  108. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_simplify.js +15 -24
  109. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_edge_create.d.ts.map +1 -1
  110. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_edge_create.js +31 -115
  111. package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_vertex_fuse_duplicate_edges.d.ts.map +1 -1
  112. package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_vertex_fuse_duplicate_edges.js +142 -150
  113. package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_vertex_replace.d.ts.map +1 -1
  114. package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_vertex_replace.js +151 -194
  115. package/src/core/geom/3d/topology/struct/binary/query/bt_face_get_incenter.d.ts.map +1 -1
  116. package/src/core/geom/3d/topology/struct/binary/query/bt_face_get_incenter.js +60 -85
  117. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_build_boundary_distance_field.d.ts.map +1 -1
  118. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_build_boundary_distance_field.js +156 -171
  119. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_face_find_path.d.ts.map +1 -1
  120. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_face_find_path.js +8 -44
  121. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_face_find_path_polyanya.d.ts.map +1 -1
  122. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_face_find_path_polyanya.js +2 -7
  123. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_sample_interior_grid_points.d.ts.map +1 -1
  124. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_sample_interior_grid_points.js +3 -2
  125. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_segment_penetrates_surface.d.ts.map +1 -1
  126. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_segment_penetrates_surface.js +128 -133
  127. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_surface_ray_parity.d.ts +8 -14
  128. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_surface_ray_parity.d.ts.map +1 -1
  129. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_surface_ray_parity.js +36 -82
  130. package/src/core/geom/3d/triangle/tri3_ray_intersection.d.ts.map +1 -1
  131. package/src/core/geom/3d/triangle/tri3_ray_intersection.js +7 -144
  132. package/src/core/geom/ConicRay.d.ts.map +1 -1
  133. package/src/core/geom/ConicRay.js +230 -237
  134. package/src/core/localization/LocaleDataset.d.ts +6 -0
  135. package/src/core/localization/LocaleDataset.d.ts.map +1 -1
  136. package/src/core/localization/LocaleDataset.js +48 -37
  137. package/src/core/localization/LocalizationEngine.d.ts.map +1 -1
  138. package/src/core/localization/LocalizationEngine.js +3 -2
  139. package/src/core/math/lookup/ParameterLookupTable.d.ts.map +1 -1
  140. package/src/core/math/lookup/ParameterLookupTable.js +3 -1
  141. package/src/core/math/spline/spline3_hermite_intersection_spline3_hermite_nd.d.ts.map +1 -1
  142. package/src/core/math/spline/spline3_hermite_intersection_spline3_hermite_nd.js +330 -400
  143. package/src/core/math/spline/spline3_hermite_nearest_point.d.ts +16 -0
  144. package/src/core/math/spline/spline3_hermite_nearest_point.d.ts.map +1 -1
  145. package/src/core/math/spline/spline3_hermite_nearest_point.js +134 -167
  146. package/src/core/model/DebouncedObservedBoolean.d.ts +1 -2
  147. package/src/core/model/DebouncedObservedBoolean.d.ts.map +1 -1
  148. package/src/core/model/DebouncedObservedBoolean.js +1 -1
  149. package/src/core/model/node-graph/node/NodeInstance.d.ts.map +1 -1
  150. package/src/core/model/node-graph/node/NodeInstance.js +2 -7
  151. package/src/core/model/node-graph/node/parameter/NodeParameterDescription.js +1 -1
  152. package/src/core/model/object/optional_equality.d.ts +3 -3
  153. package/src/core/model/object/optional_equality.d.ts.map +1 -1
  154. package/src/core/model/object/optional_equality.js +10 -27
  155. package/src/core/model/object/write_property.js +1 -1
  156. package/src/core/model/reactive/evaluation/MultiPredicateEvaluator.js +2 -2
  157. package/src/core/primitives/strings/string_compute_byte_size.d.ts +3 -3
  158. package/src/core/primitives/strings/string_compute_byte_size.d.ts.map +1 -1
  159. package/src/core/primitives/strings/string_compute_byte_size.js +8 -21
  160. package/src/core/process/executor/ConcurrentExecutor.d.ts.map +1 -1
  161. package/src/core/process/executor/ConcurrentExecutor.js +14 -2
  162. package/src/engine/achievements/gateway/StorageAchievementGateway.d.ts +6 -3
  163. package/src/engine/achievements/gateway/StorageAchievementGateway.d.ts.map +1 -1
  164. package/src/engine/achievements/gateway/StorageAchievementGateway.js +31 -75
  165. package/src/engine/asset/loaders/SVGAssetLoader.d.ts.map +1 -1
  166. package/src/engine/asset/loaders/SVGAssetLoader.js +33 -31
  167. package/src/engine/control/first-person/math/criticallyDampedSpring.d.ts.map +1 -1
  168. package/src/engine/control/first-person/math/criticallyDampedSpring.js +3 -14
  169. package/src/engine/ecs/EntityComponentDataset.d.ts.map +1 -1
  170. package/src/engine/ecs/EntityComponentDataset.js +4 -1
  171. package/src/engine/ecs/storage/binary/object/BinaryObjectSerializationAdapter.d.ts +0 -2
  172. package/src/engine/ecs/storage/binary/object/BinaryObjectSerializationAdapter.d.ts.map +1 -1
  173. package/src/engine/ecs/storage/binary/object/BinaryObjectSerializationAdapter.js +3 -3
  174. package/src/engine/ecs/terrain/ecs/layers/TerrainLayer.js +2 -2
  175. package/src/engine/ecs/transform/Transform64.d.ts +21 -0
  176. package/src/engine/ecs/transform/Transform64.d.ts.map +1 -1
  177. package/src/engine/ecs/transform/Transform64.js +26 -0
  178. package/src/engine/graphics/sh3/path_tracer/geometry/sort_triangles_by_distance_to_point.js +1 -1
  179. package/src/engine/graphics/texture/sampler/sampler2d_channel_compute_min_indices.js +1 -1
  180. package/src/engine/graphics3/WaterSystem.d.ts.map +1 -1
  181. package/src/engine/graphics3/WaterSystem.js +2 -1
  182. package/src/engine/graphics3/prefab/prefab_skin_frame.d.ts.map +1 -1
  183. package/src/engine/graphics3/prefab/prefab_skin_frame.js +1 -12
  184. package/src/engine/grid/grid2transform/GridPosition2TransformSystem.d.ts +1 -1
  185. package/src/engine/grid/grid2transform/GridPosition2TransformSystem.d.ts.map +1 -1
  186. package/src/engine/grid/grid2transform/GridPosition2TransformSystem.js +141 -137
  187. package/src/engine/input/ecs/systems/InputControllerSystem.d.ts.map +1 -1
  188. package/src/engine/input/ecs/systems/InputControllerSystem.js +13 -3
  189. package/src/engine/input/ecs/systems/InputSystem.d.ts.map +1 -1
  190. package/src/engine/input/ecs/systems/InputSystem.js +2 -1
  191. package/src/engine/intelligence/behavior/composite/ParallelBehavior.d.ts +1 -1
  192. package/src/engine/intelligence/behavior/composite/ParallelBehavior.d.ts.map +1 -1
  193. package/src/engine/intelligence/behavior/composite/ParallelBehavior.js +4 -1
  194. package/src/engine/intelligence/behavior/decorator/InvertStatusBehavior.d.ts.map +1 -1
  195. package/src/engine/intelligence/behavior/decorator/InvertStatusBehavior.js +3 -1
  196. package/src/engine/intelligence/behavior/decorator/RepeatBehavior.d.ts.map +1 -1
  197. package/src/engine/intelligence/behavior/decorator/RepeatBehavior.js +3 -1
  198. package/src/engine/intelligence/behavior/decorator/RepeatBehaviorSerializationAdapter.d.ts.map +1 -1
  199. package/src/engine/intelligence/behavior/decorator/RepeatBehaviorSerializationAdapter.js +39 -33
  200. package/src/engine/intelligence/behavior/util/ConditionalBehavior.d.ts +5 -0
  201. package/src/engine/intelligence/behavior/util/ConditionalBehavior.d.ts.map +1 -1
  202. package/src/engine/intelligence/behavior/util/ConditionalBehavior.js +93 -75
  203. package/src/engine/intelligence/behavior/util/RotationBehavior.d.ts.map +1 -1
  204. package/src/engine/intelligence/behavior/util/RotationBehavior.js +79 -76
  205. package/src/engine/intelligence/blackboard/BlackboardStack.d.ts +1 -0
  206. package/src/engine/intelligence/blackboard/BlackboardStack.d.ts.map +1 -1
  207. package/src/engine/intelligence/blackboard/BlackboardStack.js +159 -123
  208. package/src/engine/intelligence/mcts/StateNode.d.ts.map +1 -1
  209. package/src/engine/intelligence/mcts/StateNode.js +366 -364
  210. package/src/engine/intelligence/resource/ResourceAllocationSolver.js +1 -1
  211. package/src/engine/navigation/ecs/components/Path.d.ts.map +1 -1
  212. package/src/engine/navigation/ecs/components/Path.js +2 -1
  213. package/src/engine/navigation/ecs/path_following/PathFollowingSystem.d.ts.map +1 -1
  214. package/src/engine/navigation/ecs/path_following/PathFollowingSystem.js +5 -2
  215. package/src/engine/physics/body/SolverBodyState.d.ts.map +1 -1
  216. package/src/engine/physics/body/SolverBodyState.js +2 -6
  217. package/src/engine/physics/ccd/linear_sweep.d.ts.map +1 -1
  218. package/src/engine/physics/ccd/linear_sweep.js +3 -16
  219. package/src/engine/physics/cloth/build/cloth_proxy_from_joints.d.ts.map +1 -1
  220. package/src/engine/physics/cloth/build/cloth_proxy_from_joints.js +2 -16
  221. package/src/engine/physics/cloth/ecs/cloth_build_rows.d.ts +13 -1
  222. package/src/engine/physics/cloth/ecs/cloth_build_rows.d.ts.map +1 -1
  223. package/src/engine/physics/cloth/ecs/cloth_build_rows.js +15 -4
  224. package/src/engine/physics/ecs/PhysicsSystem.d.ts.map +1 -1
  225. package/src/engine/physics/ecs/PhysicsSystem.js +2 -5
  226. package/src/engine/physics/inertia/locked_inverse_inertia.d.ts +12 -0
  227. package/src/engine/physics/inertia/locked_inverse_inertia.d.ts.map +1 -0
  228. package/src/engine/physics/inertia/locked_inverse_inertia.js +22 -0
  229. package/src/engine/physics/integration/integrate_velocity.d.ts.map +1 -1
  230. package/src/engine/physics/integration/integrate_velocity.js +3 -18
  231. package/src/engine/physics/mls-mpm/MLS_MPM.d.ts +1 -0
  232. package/src/engine/physics/mls-mpm/MLS_MPM.d.ts.map +1 -1
  233. package/src/engine/physics/mls-mpm/MLS_MPM.js +5 -4
  234. package/src/engine/physics/narrowphase/convex_decomposition.d.ts.map +1 -1
  235. package/src/engine/physics/narrowphase/convex_decomposition.js +7 -16
  236. package/src/engine/physics/vehicle/RaycastVehicle.d.ts.map +1 -1
  237. package/src/engine/physics/vehicle/RaycastVehicle.js +15 -5
  238. package/src/engine/save/StorageBackedList.d.ts +5 -0
  239. package/src/engine/save/StorageBackedList.d.ts.map +1 -1
  240. package/src/engine/save/StorageBackedList.js +161 -144
  241. package/src/engine/simulation/Ticker.d.ts.map +1 -1
  242. package/src/engine/simulation/Ticker.js +394 -391
  243. package/src/engine/sound/simulation/probe/AcousticProbeField.d.ts.map +1 -1
  244. package/src/engine/sound/simulation/probe/AcousticProbeField.js +6 -19
  245. package/src/engine/sound/simulation/probe/probe_edge_visible.d.ts +15 -0
  246. package/src/engine/sound/simulation/probe/probe_edge_visible.d.ts.map +1 -1
  247. package/src/engine/sound/simulation/probe/probe_edge_visible.js +59 -41
  248. package/src/engine/sound/simulation/probe/probe_refine_connectivity.d.ts.map +1 -1
  249. package/src/engine/sound/simulation/probe/probe_refine_connectivity.js +164 -181
  250. package/src/engine/sound/simulation/render/FoaProbeReverbRenderer.d.ts.map +1 -1
  251. package/src/engine/sound/simulation/render/FoaProbeReverbRenderer.js +20 -5
  252. package/src/format/image/avif/av1/decode/Av1FrameContext.d.ts.map +1 -1
  253. package/src/format/image/avif/av1/decode/Av1FrameContext.js +3 -10
  254. package/src/format/image/avif/av1/decode/reconstruct.d.ts +20 -0
  255. package/src/format/image/avif/av1/decode/reconstruct.d.ts.map +1 -1
  256. package/src/format/image/avif/av1/decode/reconstruct.js +22 -9
  257. package/src/format/image/avif/av1/encode/choose_restoration.js +2 -18
  258. package/src/format/image/avif/av1/encode/quantise.d.ts.map +1 -1
  259. package/src/format/image/avif/av1/encode/quantise.js +1 -55
  260. package/src/format/image/avif/av1/filter/loop_restoration.d.ts +9 -0
  261. package/src/format/image/avif/av1/filter/loop_restoration.d.ts.map +1 -1
  262. package/src/format/image/avif/av1/filter/loop_restoration.js +1 -1
  263. package/src/format/texture/basis/transcode/etc1s_to_bc7.js +2 -33
  264. package/src/format/texture/basis/transcode/fit_endpoints.d.ts +11 -0
  265. package/src/format/texture/basis/transcode/fit_endpoints.d.ts.map +1 -1
  266. package/src/format/texture/basis/transcode/fit_endpoints.js +1 -1
  267. package/src/format/texture/basis/uastc/uastc_decode_block.d.ts.map +1 -1
  268. package/src/format/texture/basis/uastc/uastc_decode_block.js +2 -19
  269. package/src/generation/foliage/ANNUAL_SHOOTS_BRIEF_2026_10_25.md +220 -0
  270. package/src/generation/foliage/CROWN_FILLING_BRIEF_2026_10_26.md +172 -0
  271. package/src/generation/foliage/FOLIAGE_DESIGN.md +165 -15
  272. package/src/generation/foliage/LEAF_ARCHITECTURE_BRIEF_2026_10_26.md +158 -0
  273. package/src/generation/foliage/SHOOT_SYSTEMS_ALL_SPECIES_BRIEF_2026_10_26.md +248 -0
  274. package/src/generation/foliage/SPEEDTREE_COMPARISON_2026_10_24.md +694 -0
  275. package/src/generation/foliage/analysis/CrownOpacity.d.ts +118 -0
  276. package/src/generation/foliage/analysis/CrownOpacity.d.ts.map +1 -0
  277. package/src/generation/foliage/analysis/CrownOpacity.js +182 -0
  278. package/src/generation/foliage/analysis/crown_opacity_frames.d.ts +10 -0
  279. package/src/generation/foliage/analysis/crown_opacity_frames.d.ts.map +1 -0
  280. package/src/generation/foliage/analysis/crown_opacity_frames.js +132 -0
  281. package/src/generation/foliage/analysis/crown_opacity_measure.d.ts +51 -0
  282. package/src/generation/foliage/analysis/crown_opacity_measure.d.ts.map +1 -0
  283. package/src/generation/foliage/analysis/crown_opacity_measure.js +649 -0
  284. package/src/generation/foliage/analysis/foliage_measure_leaf_area.d.ts +66 -0
  285. package/src/generation/foliage/analysis/foliage_measure_leaf_area.d.ts.map +1 -0
  286. package/src/generation/foliage/analysis/foliage_measure_leaf_area.js +192 -0
  287. package/src/generation/foliage/analysis/tree_crown_opacity.d.ts +27 -0
  288. package/src/generation/foliage/analysis/tree_crown_opacity.d.ts.map +1 -0
  289. package/src/generation/foliage/analysis/tree_crown_opacity.js +58 -0
  290. package/src/generation/foliage/animation/build_tree_wind_rig.d.ts +3 -2
  291. package/src/generation/foliage/animation/build_tree_wind_rig.d.ts.map +1 -1
  292. package/src/generation/foliage/animation/build_tree_wind_rig.js +12 -30
  293. package/src/generation/foliage/animation/tree_wind_bend_limit.d.ts +12 -0
  294. package/src/generation/foliage/animation/tree_wind_bend_limit.d.ts.map +1 -0
  295. package/src/generation/foliage/animation/tree_wind_bend_limit.js +13 -0
  296. package/src/generation/foliage/asset/TreeAsset.d.ts +5 -0
  297. package/src/generation/foliage/asset/TreeAsset.d.ts.map +1 -1
  298. package/src/generation/foliage/asset/TreeAsset.js +6 -0
  299. package/src/generation/foliage/asset/generate_tree.d.ts.map +1 -1
  300. package/src/generation/foliage/asset/generate_tree.js +23 -6
  301. package/src/generation/foliage/config/{BranchLevelConfig.d.ts → BranchGeneratorConfig.d.ts} +61 -75
  302. package/src/generation/foliage/config/BranchGeneratorConfig.d.ts.map +1 -0
  303. package/src/generation/foliage/config/{BranchLevelConfig.js → BranchGeneratorConfig.js} +83 -126
  304. package/src/generation/foliage/config/BranchSpawnRule.d.ts +118 -0
  305. package/src/generation/foliage/config/BranchSpawnRule.d.ts.map +1 -0
  306. package/src/generation/foliage/config/BranchSpawnRule.js +217 -0
  307. package/src/generation/foliage/config/FoliageCardType.d.ts +1 -1
  308. package/src/generation/foliage/config/FoliageCardType.js +2 -2
  309. package/src/generation/foliage/config/FoliageConfig.d.ts +23 -45
  310. package/src/generation/foliage/config/FoliageConfig.d.ts.map +1 -1
  311. package/src/generation/foliage/config/FoliageConfig.js +47 -93
  312. package/src/generation/foliage/config/FoliageMaterialConfig.d.ts +12 -20
  313. package/src/generation/foliage/config/FoliageMaterialConfig.d.ts.map +1 -1
  314. package/src/generation/foliage/config/FoliageMaterialConfig.js +261 -279
  315. package/src/generation/foliage/config/FoliageSpawnRule.d.ts +77 -0
  316. package/src/generation/foliage/config/FoliageSpawnRule.d.ts.map +1 -0
  317. package/src/generation/foliage/config/FoliageSpawnRule.js +135 -0
  318. package/src/generation/foliage/config/FoliageTileContent.d.ts +9 -0
  319. package/src/generation/foliage/config/FoliageTileContent.d.ts.map +1 -0
  320. package/src/generation/foliage/config/FoliageTileContent.js +12 -0
  321. package/src/generation/foliage/config/LeafApexShape.d.ts +12 -0
  322. package/src/generation/foliage/config/LeafApexShape.d.ts.map +1 -0
  323. package/src/generation/foliage/config/LeafApexShape.js +17 -0
  324. package/src/generation/foliage/config/LeafArchitecture.d.ts +155 -0
  325. package/src/generation/foliage/config/LeafArchitecture.d.ts.map +1 -0
  326. package/src/generation/foliage/config/LeafArchitecture.js +288 -0
  327. package/src/generation/foliage/config/LeafBaseShape.d.ts +14 -0
  328. package/src/generation/foliage/config/LeafBaseShape.d.ts.map +1 -0
  329. package/src/generation/foliage/config/LeafBaseShape.js +21 -0
  330. package/src/generation/foliage/config/LeafLobation.d.ts +10 -0
  331. package/src/generation/foliage/config/LeafLobation.d.ts.map +1 -0
  332. package/src/generation/foliage/config/LeafLobation.js +14 -0
  333. package/src/generation/foliage/config/PhyllotaxisMode.d.ts +11 -0
  334. package/src/generation/foliage/config/PhyllotaxisMode.d.ts.map +1 -1
  335. package/src/generation/foliage/config/PhyllotaxisMode.js +36 -0
  336. package/src/generation/foliage/config/ShootBudZone.d.ts +105 -0
  337. package/src/generation/foliage/config/ShootBudZone.d.ts.map +1 -0
  338. package/src/generation/foliage/config/ShootBudZone.js +219 -0
  339. package/src/generation/foliage/config/ShootGrowthConfig.d.ts +84 -0
  340. package/src/generation/foliage/config/ShootGrowthConfig.d.ts.map +1 -0
  341. package/src/generation/foliage/config/ShootGrowthConfig.js +146 -0
  342. package/src/generation/foliage/config/ShootSystemRule.d.ts +144 -0
  343. package/src/generation/foliage/config/ShootSystemRule.d.ts.map +1 -0
  344. package/src/generation/foliage/config/ShootSystemRule.js +316 -0
  345. package/src/generation/foliage/config/TreeLODConfig.d.ts +1 -1
  346. package/src/generation/foliage/config/TreeLODConfig.js +1 -1
  347. package/src/generation/foliage/config/TreeSpeciesConfig.d.ts +40 -8
  348. package/src/generation/foliage/config/TreeSpeciesConfig.d.ts.map +1 -1
  349. package/src/generation/foliage/config/TreeSpeciesConfig.js +124 -68
  350. package/src/generation/foliage/config/TreeWindConfig.d.ts +23 -10
  351. package/src/generation/foliage/config/TreeWindConfig.d.ts.map +1 -1
  352. package/src/generation/foliage/config/TreeWindConfig.js +34 -25
  353. package/src/generation/foliage/index.d.ts +19 -2
  354. package/src/generation/foliage/index.js +63 -44
  355. package/src/generation/foliage/material/FoliageAtlasCutout.d.ts +59 -0
  356. package/src/generation/foliage/material/FoliageAtlasCutout.d.ts.map +1 -0
  357. package/src/generation/foliage/material/FoliageAtlasCutout.js +93 -0
  358. package/src/generation/foliage/material/compute_foliage_variant_atlas_layout.d.ts +26 -0
  359. package/src/generation/foliage/material/compute_foliage_variant_atlas_layout.d.ts.map +1 -0
  360. package/src/generation/foliage/material/compute_foliage_variant_atlas_layout.js +63 -0
  361. package/src/generation/foliage/material/foliage_atlas_cutout.d.ts +34 -0
  362. package/src/generation/foliage/material/foliage_atlas_cutout.d.ts.map +1 -0
  363. package/src/generation/foliage/material/foliage_atlas_cutout.js +174 -0
  364. package/src/generation/foliage/material/foliage_tile.d.ts +110 -0
  365. package/src/generation/foliage/material/foliage_tile.d.ts.map +1 -0
  366. package/src/generation/foliage/material/foliage_tile.js +286 -0
  367. package/src/generation/foliage/material/leaf_geometry.d.ts +103 -0
  368. package/src/generation/foliage/material/leaf_geometry.d.ts.map +1 -0
  369. package/src/generation/foliage/material/leaf_geometry.js +528 -0
  370. package/src/generation/foliage/material/make_foliage_material.d.ts +13 -33
  371. package/src/generation/foliage/material/make_foliage_material.d.ts.map +1 -1
  372. package/src/generation/foliage/material/make_foliage_material.js +356 -605
  373. package/src/generation/foliage/mesh/foliage_collect_attachments.d.ts +39 -4
  374. package/src/generation/foliage/mesh/foliage_collect_attachments.d.ts.map +1 -1
  375. package/src/generation/foliage/mesh/foliage_collect_attachments.js +637 -569
  376. package/src/generation/foliage/mesh/interpolate_ring_skin_weights4.d.ts +48 -0
  377. package/src/generation/foliage/mesh/interpolate_ring_skin_weights4.d.ts.map +1 -0
  378. package/src/generation/foliage/mesh/interpolate_ring_skin_weights4.js +232 -0
  379. package/src/generation/foliage/mesh/tree_mesh_build_bark.d.ts.map +1 -1
  380. package/src/generation/foliage/mesh/tree_mesh_build_bark.js +1023 -1049
  381. package/src/generation/foliage/mesh/tree_mesh_build_foliage.d.ts +9 -2
  382. package/src/generation/foliage/mesh/tree_mesh_build_foliage.d.ts.map +1 -1
  383. package/src/generation/foliage/mesh/tree_mesh_build_foliage.js +467 -454
  384. package/src/generation/foliage/presets/make_tree_species_preset.d.ts.map +1 -1
  385. package/src/generation/foliage/presets/make_tree_species_preset.js +1648 -870
  386. package/src/generation/foliage/skeleton/ShootFrameworkHash.d.ts +35 -0
  387. package/src/generation/foliage/skeleton/ShootFrameworkHash.d.ts.map +1 -0
  388. package/src/generation/foliage/skeleton/ShootFrameworkHash.js +129 -0
  389. package/src/generation/foliage/skeleton/ShootGirth.d.ts +51 -0
  390. package/src/generation/foliage/skeleton/ShootGirth.d.ts.map +1 -0
  391. package/src/generation/foliage/skeleton/ShootGirth.js +212 -0
  392. package/src/generation/foliage/skeleton/ShootLightField.d.ts +73 -0
  393. package/src/generation/foliage/skeleton/ShootLightField.d.ts.map +1 -0
  394. package/src/generation/foliage/skeleton/ShootLightField.js +197 -0
  395. package/src/generation/foliage/skeleton/TreeSkeleton.d.ts +106 -3
  396. package/src/generation/foliage/skeleton/TreeSkeleton.d.ts.map +1 -1
  397. package/src/generation/foliage/skeleton/TreeSkeleton.js +217 -39
  398. package/src/generation/foliage/skeleton/flare_lobe_phase_offset.d.ts +13 -0
  399. package/src/generation/foliage/skeleton/flare_lobe_phase_offset.d.ts.map +1 -0
  400. package/src/generation/foliage/skeleton/flare_lobe_phase_offset.js +16 -0
  401. package/src/generation/foliage/skeleton/foliage_card_density.d.ts +71 -0
  402. package/src/generation/foliage/skeleton/foliage_card_density.d.ts.map +1 -0
  403. package/src/generation/foliage/skeleton/foliage_card_density.js +101 -0
  404. package/src/generation/foliage/skeleton/foliage_senescence.d.ts +101 -0
  405. package/src/generation/foliage/skeleton/foliage_senescence.d.ts.map +1 -0
  406. package/src/generation/foliage/skeleton/foliage_senescence.js +149 -0
  407. package/src/generation/foliage/skeleton/foliage_unit_cards.d.ts +76 -0
  408. package/src/generation/foliage/skeleton/foliage_unit_cards.d.ts.map +1 -0
  409. package/src/generation/foliage/skeleton/foliage_unit_cards.js +95 -0
  410. package/src/generation/foliage/skeleton/shoot_demography.d.ts +22 -0
  411. package/src/generation/foliage/skeleton/shoot_demography.d.ts.map +1 -0
  412. package/src/generation/foliage/skeleton/shoot_demography.js +96 -0
  413. package/src/generation/foliage/skeleton/shoot_geometry.d.ts +66 -0
  414. package/src/generation/foliage/skeleton/shoot_geometry.d.ts.map +1 -0
  415. package/src/generation/foliage/skeleton/shoot_geometry.js +109 -0
  416. package/src/generation/foliage/skeleton/shoot_systems_simulate.d.ts +166 -0
  417. package/src/generation/foliage/skeleton/shoot_systems_simulate.d.ts.map +1 -0
  418. package/src/generation/foliage/skeleton/shoot_systems_simulate.js +588 -0
  419. package/src/generation/foliage/skeleton/tree_skeleton_assign_skin_joints.d.ts +28 -12
  420. package/src/generation/foliage/skeleton/tree_skeleton_assign_skin_joints.d.ts.map +1 -1
  421. package/src/generation/foliage/skeleton/tree_skeleton_assign_skin_joints.js +137 -102
  422. package/src/generation/foliage/skeleton/tree_skeleton_compute_joint_mechanics.d.ts +112 -0
  423. package/src/generation/foliage/skeleton/tree_skeleton_compute_joint_mechanics.d.ts.map +1 -0
  424. package/src/generation/foliage/skeleton/tree_skeleton_compute_joint_mechanics.js +408 -0
  425. package/src/generation/foliage/skeleton/tree_skeleton_compute_pipe_radii.d.ts.map +1 -1
  426. package/src/generation/foliage/skeleton/tree_skeleton_compute_pipe_radii.js +208 -206
  427. package/src/generation/foliage/skeleton/tree_skeleton_grow.d.ts +5 -2
  428. package/src/generation/foliage/skeleton/tree_skeleton_grow.d.ts.map +1 -1
  429. package/src/generation/foliage/skeleton/tree_skeleton_grow.js +2048 -1871
  430. package/src/generation/foliage/skeleton/tree_skeleton_grow_shoots.d.ts +17 -0
  431. package/src/generation/foliage/skeleton/tree_skeleton_grow_shoots.d.ts.map +1 -0
  432. package/src/generation/foliage/skeleton/tree_skeleton_grow_shoots.js +231 -0
  433. package/src/generation/foliage/skeleton/tree_skeleton_read_joint_motion.d.ts +14 -0
  434. package/src/generation/foliage/skeleton/tree_skeleton_read_joint_motion.d.ts.map +1 -0
  435. package/src/generation/foliage/skeleton/tree_skeleton_read_joint_motion.js +26 -0
  436. package/src/generation/foliage/skeleton/tree_skeleton_read_joint_parents.d.ts +10 -0
  437. package/src/generation/foliage/skeleton/tree_skeleton_read_joint_parents.d.ts.map +1 -0
  438. package/src/generation/foliage/skeleton/tree_skeleton_read_joint_parents.js +20 -0
  439. package/src/generation/grid/generation/road/GridTaskGenerateRoads.d.ts.map +1 -1
  440. package/src/generation/grid/generation/road/GridTaskGenerateRoads.js +4 -1
  441. package/src/generation/markers/GridCellActionPlaceMarkerGroup.d.ts +1 -0
  442. package/src/generation/markers/GridCellActionPlaceMarkerGroup.d.ts.map +1 -1
  443. package/src/generation/markers/GridCellActionPlaceMarkerGroup.js +98 -86
  444. package/src/shade/SHADER_F16_PROPOSAL_2026_10_24.md +263 -0
  445. package/src/shade/descriptor/WebGPUExtensionType.d.ts +17 -0
  446. package/src/shade/descriptor/WebGPUExtensionType.d.ts.map +1 -1
  447. package/src/shade/descriptor/WebGPUExtensionType.js +31 -1
  448. package/src/shade/playground/foliage_wind/FoliageRigOverlay.d.ts +37 -0
  449. package/src/shade/playground/foliage_wind/FoliageRigOverlay.d.ts.map +1 -0
  450. package/src/shade/playground/foliage_wind/FoliageRigOverlay.js +491 -0
  451. package/src/shade/playground/foliage_wind/foliage_world.d.ts.map +1 -1
  452. package/src/shade/playground/foliage_wind/foliage_world.js +600 -602
  453. package/src/shade/playground/foliage_wind/index.html +6 -0
  454. package/src/shade/playground/foliage_wind/main.js +14 -0
  455. package/src/shade/renderer/Renderer.d.ts +5 -0
  456. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  457. package/src/shade/renderer/Renderer.js +25 -2
  458. package/src/shade/renderer/animation/GPUAnimationManager.d.ts.map +1 -1
  459. package/src/shade/renderer/animation/GPUAnimationManager.js +2 -1
  460. package/src/shade/renderer/animation/foliage/FoliageWindJoint.d.ts +2 -1
  461. package/src/shade/renderer/animation/foliage/FoliageWindJoint.d.ts.map +1 -1
  462. package/src/shade/renderer/animation/foliage/FoliageWindJoint.js +2 -1
  463. package/src/shade/renderer/animation/foliage/chunk_foliage_wind_step.d.ts.map +1 -1
  464. package/src/shade/renderer/animation/foliage/chunk_foliage_wind_step.js +4 -2
  465. package/src/shade/renderer/buffer/table/GPUTypedTable.js +1 -1
  466. package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.d.ts.map +1 -1
  467. package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.js +403 -401
  468. package/src/shade/renderer/camera/OrbitalCameraController.d.ts +1 -62
  469. package/src/shade/renderer/camera/OrbitalCameraController.d.ts.map +1 -1
  470. package/src/shade/renderer/camera/OrbitalCameraController.js +1 -374
  471. package/src/shade/renderer/deferred/indirect/chunk_lpv_2d_cache_sample_irradiance.d.ts.map +1 -1
  472. package/src/shade/renderer/deferred/indirect/chunk_lpv_2d_cache_sample_irradiance.js +3 -0
  473. package/src/shade/renderer/deferred/indirect/chunk_lpv_sample_light.d.ts.map +1 -1
  474. package/src/shade/renderer/deferred/indirect/chunk_lpv_sample_light.js +6 -1
  475. package/src/shade/renderer/dynamic/shader_dynamic_mesh_avboit_splat.js +1 -1
  476. package/src/shade/renderer/fluid/GPUFluidCascade.d.ts +2 -2
  477. package/src/shade/renderer/fluid/GPUFluidCascade.d.ts.map +1 -1
  478. package/src/shade/renderer/fluid/GPUFluidCascade.js +6 -3
  479. package/src/shade/renderer/fluid/GPU_FLUID_OCCUPANCY_AND_SOTA_REVIEW_2026_10_26.md +361 -0
  480. package/src/shade/renderer/fluid/coupling/chunk_fluid_cascade_parent.d.ts.map +1 -1
  481. package/src/shade/renderer/fluid/coupling/chunk_fluid_cascade_parent.js +335 -241
  482. package/src/shade/renderer/fluid/coupling/shader_fluid_cascade_ghosts.d.ts.map +1 -1
  483. package/src/shade/renderer/fluid/coupling/shader_fluid_cascade_ghosts.js +108 -101
  484. package/src/shade/renderer/fluid/forcing/chunk_fluid_forcing_query_select.d.ts.map +1 -1
  485. package/src/shade/renderer/fluid/forcing/chunk_fluid_forcing_query_select.js +69 -67
  486. package/src/shade/renderer/fluid/forcing/shader_fluid_forcing_apply.d.ts +7 -6
  487. package/src/shade/renderer/fluid/forcing/shader_fluid_forcing_apply.d.ts.map +1 -1
  488. package/src/shade/renderer/fluid/forcing/shader_fluid_forcing_apply.js +341 -287
  489. package/src/shade/renderer/fluid/mac/FluidMacPasses.d.ts +6 -4
  490. package/src/shade/renderer/fluid/mac/FluidMacPasses.d.ts.map +1 -1
  491. package/src/shade/renderer/fluid/mac/FluidMacPasses.js +427 -400
  492. package/src/shade/renderer/fluid/mac/chunk_fluid_mac_seams.d.ts +10 -5
  493. package/src/shade/renderer/fluid/mac/chunk_fluid_mac_seams.d.ts.map +1 -1
  494. package/src/shade/renderer/fluid/mac/chunk_fluid_mac_seams.js +532 -190
  495. package/src/shade/renderer/fluid/mac/chunk_v3_mac_lattice_corners.d.ts.map +1 -1
  496. package/src/shade/renderer/fluid/mac/chunk_v3_mac_lattice_corners.js +231 -237
  497. package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_correct.d.ts +2 -2
  498. package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_correct.d.ts.map +1 -1
  499. package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_correct.js +282 -245
  500. package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_predict.d.ts +1 -3
  501. package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_predict.d.ts.map +1 -1
  502. package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_predict.js +139 -109
  503. package/src/shade/renderer/fluid/mac/shader_fluid_mac_curl.d.ts +6 -6
  504. package/src/shade/renderer/fluid/mac/shader_fluid_mac_curl.d.ts.map +1 -1
  505. package/src/shade/renderer/fluid/mac/shader_fluid_mac_curl.js +257 -222
  506. package/src/shade/renderer/fluid/mac/shader_fluid_mac_divergence.d.ts +8 -7
  507. package/src/shade/renderer/fluid/mac/shader_fluid_mac_divergence.d.ts.map +1 -1
  508. package/src/shade/renderer/fluid/mac/shader_fluid_mac_divergence.js +119 -92
  509. package/src/shade/renderer/fluid/mac/shader_fluid_mac_gradient.d.ts +6 -9
  510. package/src/shade/renderer/fluid/mac/shader_fluid_mac_gradient.d.ts.map +1 -1
  511. package/src/shade/renderer/fluid/mac/shader_fluid_mac_gradient.js +229 -181
  512. package/src/shade/renderer/fluid/pressure/GPUFluidPressureSolve.d.ts +17 -7
  513. package/src/shade/renderer/fluid/pressure/GPUFluidPressureSolve.d.ts.map +1 -1
  514. package/src/shade/renderer/fluid/pressure/GPUFluidPressureSolve.js +634 -621
  515. package/src/shade/renderer/fluid/pressure/shader_fluid_mg_residual_restrict.d.ts +8 -6
  516. package/src/shade/renderer/fluid/pressure/shader_fluid_mg_residual_restrict.d.ts.map +1 -1
  517. package/src/shade/renderer/fluid/pressure/shader_fluid_mg_residual_restrict.js +166 -149
  518. package/src/shade/renderer/fluid/pressure/shader_fluid_mg_smooth.d.ts +8 -6
  519. package/src/shade/renderer/fluid/pressure/shader_fluid_mg_smooth.d.ts.map +1 -1
  520. package/src/shade/renderer/fluid/pressure/shader_fluid_mg_smooth.js +219 -183
  521. package/src/shade/renderer/fluid/publish/shader_fluid_wind_publish.d.ts.map +1 -1
  522. package/src/shade/renderer/fluid/publish/shader_fluid_wind_publish.js +142 -122
  523. package/src/shade/renderer/geometry/meshlet/COMPACTION_PLAN_2026_09_16.md +674 -663
  524. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.d.ts +1 -1
  525. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.d.ts.map +1 -1
  526. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.js +63 -29
  527. package/src/shade/renderer/geometry/meshlet/build/meshoptimizer/geometry_to_meshlets_meshoptimizer.d.ts.map +1 -1
  528. package/src/shade/renderer/geometry/meshlet/build/meshoptimizer/geometry_to_meshlets_meshoptimizer.js +77 -87
  529. package/src/shade/renderer/geometry/meshlet/build/meshoptimizer/meshopt_clusterizer.d.ts.map +1 -1
  530. package/src/shade/renderer/geometry/meshlet/build/meshoptimizer/meshopt_clusterizer.js +4 -3
  531. package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.d.ts +11 -11
  532. package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.d.ts.map +1 -1
  533. package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.js +17 -19
  534. package/src/shade/renderer/global_illumination/lpv/graph_bake_irradiance_lookup_2d.js +4 -4
  535. package/src/shade/renderer/global_illumination/probe/octahedral/sample/chunk_lpv_mesh_interpolate_radiance_via_atlas.d.ts.map +1 -1
  536. package/src/shade/renderer/global_illumination/probe/octahedral/sample/chunk_lpv_mesh_interpolate_radiance_via_atlas.js +5 -1
  537. package/src/shade/renderer/loader/gltf/load_gltf.d.ts.map +1 -1
  538. package/src/shade/renderer/loader/gltf/load_gltf.js +11 -35
  539. package/src/shade/renderer/loader/usd/load_usd.d.ts.map +1 -1
  540. package/src/shade/renderer/loader/usd/load_usd.js +6 -19
  541. package/src/shade/renderer/particles/GPUParticleSystem.d.ts +2 -1
  542. package/src/shade/renderer/particles/GPUParticleSystem.d.ts.map +1 -1
  543. package/src/shade/renderer/particles/GPUParticleSystem.js +1 -1
  544. package/src/shade/renderer/particles/graph_particles_avboit.d.ts +2 -2
  545. package/src/shade/renderer/particles/graph_particles_avboit.d.ts.map +1 -1
  546. package/src/shade/renderer/particles/graph_particles_avboit.js +4 -9
  547. package/src/shade/renderer/particles/shaders/shader_particle_avboit_draw.d.ts.map +1 -1
  548. package/src/shade/renderer/particles/shaders/shader_particle_avboit_draw.js +199 -193
  549. package/src/shade/renderer/particles/shaders/shader_particle_avboit_splat.d.ts.map +1 -1
  550. package/src/shade/renderer/particles/shaders/shader_particle_avboit_splat.js +151 -143
  551. package/src/shade/renderer/postprocess/bloom/chunk_karis_blur4x4_sample.d.ts.map +1 -1
  552. package/src/shade/renderer/postprocess/bloom/chunk_karis_blur4x4_sample.js +11 -5
  553. package/src/shade/renderer/postprocess/denoise/graph_atorus_denoise_luma.d.ts.map +1 -1
  554. package/src/shade/renderer/postprocess/denoise/graph_atorus_denoise_luma.js +6 -18
  555. package/src/shade/renderer/postprocess/gtao/GTAO.js +1 -1
  556. package/src/shade/renderer/postprocess/gtao/ao_reproject_shader.d.ts.map +1 -1
  557. package/src/shade/renderer/postprocess/gtao/ao_reproject_shader.js +3 -5
  558. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao_with_irradiance.js +1 -1
  559. package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
  560. package/src/shade/renderer/postprocess/nss/chunk_nss_luma_derivative.d.ts.map +1 -1
  561. package/src/shade/renderer/postprocess/nss/chunk_nss_luma_derivative.js +7 -3
  562. package/src/shade/renderer/postprocess/nss/shader_nss_postprocess.d.ts.map +1 -1
  563. package/src/shade/renderer/postprocess/nss/shader_nss_postprocess.js +4 -2
  564. package/src/shade/renderer/postprocess/nss/shader_nss_preprocess.d.ts.map +1 -1
  565. package/src/shade/renderer/postprocess/nss/shader_nss_preprocess.js +4 -1
  566. package/src/shade/renderer/postprocess/ssr/downsample_karis.d.ts.map +1 -1
  567. package/src/shade/renderer/postprocess/ssr/downsample_karis.js +6 -3
  568. package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_temporal_accumulate.d.ts.map +1 -1
  569. package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_temporal_accumulate.js +4 -3
  570. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader.d.ts.map +1 -1
  571. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader.js +4 -1
  572. package/src/shade/renderer/postprocess/ssr/ssr_spatial_denoise_shader.d.ts.map +1 -1
  573. package/src/shade/renderer/postprocess/ssr/ssr_spatial_denoise_shader.js +4 -2
  574. package/src/shade/renderer/postprocess/taa/chunk_taa_tonemap.d.ts.map +1 -1
  575. package/src/shade/renderer/postprocess/taa/chunk_taa_tonemap.js +35 -39
  576. package/src/shade/renderer/postprocess/taa/chunk_taa_tonemap_inv.d.ts.map +1 -1
  577. package/src/shade/renderer/postprocess/taa/chunk_taa_tonemap_inv.js +20 -17
  578. package/src/shade/renderer/postprocess/taa/shader_taa.d.ts.map +1 -1
  579. package/src/shade/renderer/postprocess/taa/shader_taa.js +6 -3
  580. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.d.ts.map +1 -1
  581. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.js +3 -1
  582. package/src/shade/renderer/rasterize/native/avboit/avboit_draw_fragment_body.js +1 -1
  583. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_splat_slice.js +2 -2
  584. package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.js +1 -1
  585. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_integrate.d.ts.map +1 -1
  586. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_integrate.js +92 -83
  587. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_splat.js +1 -1
  588. package/src/shade/renderer/shader/ShaderDescriptor.d.ts.map +1 -1
  589. package/src/shade/renderer/shader/ShaderDescriptor.js +12 -4
  590. package/src/shade/renderer/shader/chunk/bvh/chunk_bvh_query_aabb_cooperative.d.ts.map +1 -1
  591. package/src/shade/renderer/shader/chunk/bvh/chunk_bvh_query_aabb_cooperative.js +294 -286
  592. package/src/shade/renderer/shader/chunk/light/lpv/chunk_lpv_interpolate_probe_irradiance8.js +5 -5
  593. package/src/shade/renderer/shader/chunk/light/lpv/chunk_lpv_mesh_interpolate_probe.d.ts.map +1 -1
  594. package/src/shade/renderer/shader/chunk/light/lpv/chunk_lpv_mesh_interpolate_probe.js +5 -3
  595. package/src/shade/renderer/shader/chunk/light/lpv/chunk_lpv_mesh_interpolate_probe_irradiance.d.ts.map +1 -1
  596. package/src/shade/renderer/shader/chunk/light/lpv/chunk_lpv_mesh_interpolate_probe_irradiance.js +9 -6
  597. package/src/shade/renderer/shader/chunk/light/lpv/chunk_lpv_sample_sh3_at.d.ts.map +1 -1
  598. package/src/shade/renderer/shader/chunk/light/lpv/chunk_lpv_sample_sh3_at.js +33 -38
  599. package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.d.ts.map +1 -1
  600. package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.js +690 -675
  601. package/src/shade/renderer/shader/type/WebGPUArray.d.ts +3 -0
  602. package/src/shade/renderer/shader/type/WebGPUArray.d.ts.map +1 -1
  603. package/src/shade/renderer/shader/type/WebGPUArray.js +185 -167
  604. package/src/shade/renderer/shader/type/WebGPUStruct.d.ts.map +1 -1
  605. package/src/shade/renderer/shader/type/WebGPUStruct.js +461 -455
  606. package/src/shade/renderer/shader/type/serde/read_gpu_typed_buffer.d.ts.map +1 -1
  607. package/src/shade/renderer/shader/type/serde/read_gpu_typed_buffer.js +335 -211
  608. package/src/shade/renderer/shader/type/serde/write_gpu_typed_buffer.d.ts.map +1 -1
  609. package/src/shade/renderer/shader/type/serde/write_gpu_typed_buffer.js +329 -221
  610. package/src/shade/renderer/shader/type/type_has_f16.d.ts +12 -0
  611. package/src/shade/renderer/shader/type/type_has_f16.d.ts.map +1 -0
  612. package/src/shade/renderer/shader/type/type_has_f16.js +66 -0
  613. package/src/shade/renderer/view/GPUViewContext.d.ts +0 -14
  614. package/src/shade/renderer/view/GPUViewContext.d.ts.map +1 -1
  615. package/src/shade/renderer/view/GPUViewContext.js +0 -29
  616. package/src/shade/renderer/view/ViewManager.d.ts +1 -1
  617. package/src/shade/renderer/view/ViewManager.js +1 -1
  618. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.d.ts +40 -3
  619. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.d.ts.map +1 -1
  620. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.js +660 -583
  621. package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.d.ts.map +1 -1
  622. package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.js +16 -2
  623. package/src/shade/renderer/volumetrics/taa/shader_volumetrics_taa.d.ts.map +1 -1
  624. package/src/shade/renderer/volumetrics/taa/shader_volumetrics_taa.js +5 -2
  625. package/src/shade/renderer/water/shader_water_avboit.js +1 -1
  626. package/src/shade/renderer/wind/GPUSceneWind.d.ts +1 -1
  627. package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.d.ts.map +1 -1
  628. package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js +260 -23
  629. package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts +6 -7
  630. package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts.map +1 -1
  631. package/src/shade/wgsl/emulator/WGSLLanguageCore.js +269 -69
  632. package/src/shade/wgsl/validate_wgsl_source.d.ts.map +1 -1
  633. package/src/shade/wgsl/validate_wgsl_source.js +27 -1
  634. package/src/view/controller/controls/ListController.d.ts.map +1 -1
  635. package/src/view/controller/controls/ListController.js +118 -113
  636. package/src/view/controller/controls/Vector1Control.js +97 -97
  637. package/src/view/elements/image/SvgImageView.d.ts +1 -0
  638. package/src/view/elements/image/SvgImageView.d.ts.map +1 -1
  639. package/src/view/elements/image/SvgImageView.js +92 -90
  640. package/src/view/minimap/dom/MinimapTerrainView.d.ts +1 -0
  641. package/src/view/minimap/dom/MinimapTerrainView.d.ts.map +1 -1
  642. package/src/view/minimap/dom/MinimapTerrainView.js +151 -147
  643. package/src/view/tooltip/gml/TooltipParser.js +2 -2
  644. package/src/engine/network/PriorityFetch.d.ts +0 -59
  645. package/src/engine/network/PriorityFetch.d.ts.map +0 -1
  646. package/src/engine/network/PriorityFetch.js +0 -193
  647. package/src/generation/foliage/config/BranchLevelConfig.d.ts.map +0 -1
  648. package/src/shade/renderer/volumetrics/VOLUMETRICS_RESOLUTION_Z.d.ts +0 -2
  649. package/src/shade/renderer/volumetrics/VOLUMETRICS_RESOLUTION_Z.d.ts.map +0 -1
  650. package/src/shade/renderer/volumetrics/VOLUMETRICS_RESOLUTION_Z.js +0 -1
@@ -0,0 +1,528 @@
1
+ import { clamp } from "../../../core/math/clamp.js";
2
+ import { lerp } from "../../../core/math/lerp.js";
3
+ import { LeafApexShape } from "../config/LeafApexShape.js";
4
+ import { LeafBaseShape } from "../config/LeafBaseShape.js";
5
+ import { LeafLobation } from "../config/LeafLobation.js";
6
+
7
+ /**
8
+ * Samples along one side of a blade's outline, base to apex.
9
+ * @type {number}
10
+ */
11
+ const SIDE_SAMPLES = 160;
12
+
13
+ /**
14
+ * How much of the room between two neighbouring secondary veins a pinnate lobe fills at its widest; the rest is the
15
+ * sinus between them.
16
+ * @type {number}
17
+ */
18
+ const LOBE_FILL = 1.0;
19
+
20
+ /**
21
+ * Width of the midvein at the base, and of a secondary vein, as shares of the blade's length.
22
+ * @type {number}
23
+ */
24
+ const MIDVEIN_WIDTH = 0.014;
25
+ const SECONDARY_WIDTH = 0.006;
26
+
27
+ /**
28
+ * Width of a leaf's stem as a share of what it carries: a petiole of its blade's length, a rachis of the compound
29
+ * leaf's.
30
+ * @type {number}
31
+ */
32
+ const PETIOLE_WIDTH = 0.02;
33
+
34
+ /**
35
+ * @typedef {Object} LeafGeometry
36
+ * @property {number[]} points flat `(x, y)` (m) in the leaf's frame: `y` along the midvein or rachis, the top of the
37
+ * petiole at the origin, `x` across
38
+ * @property {number[]} contours `(first point, count)` pairs, each counter-clockwise; together they fill the leaf by
39
+ * the nonzero rule, so lobes and leaflets overlap freely
40
+ * @property {number[]} veins `(x0, y0, x1, y1, half_width)` segments (m): midveins and primaries first, then
41
+ * secondaries
42
+ * @property {number} midvein_count how many of `veins` are midveins, primaries or the rachis, from which the blade
43
+ * cambers
44
+ * @property {number[]} stems `(x0, y0, x1, y1, half_width)` segments (m) drawn as woody stem: the petiole, a rachis,
45
+ * a needle shoot
46
+ * @property {number} attach_y where the organ attaches to its shoot along `y` (m): the foot of the petiole, or the
47
+ * start of a needle shoot's stretch
48
+ * @property {number} tip_y where the organ ends along `y` (m), for the shading that runs base to tip
49
+ * @property {number} finest smallest feature of the outline (m): a tooth, a sinus, the blade's width
50
+ */
51
+
52
+ /**
53
+ * Size, width and lobe depth of a leaf at ontogenetic maturity `maturity` (0 juvenile, 1 mature) against the mature
54
+ * leaf the architecture describes: juvenile blades are smaller, narrower and less deeply cut, by `shape_var`.
55
+ *
56
+ * @param {number} maturity
57
+ * @param {number} shape_var
58
+ * @returns {{length: number, width: number, depth: number}}
59
+ */
60
+ export function leaf_ontogeny(maturity, shape_var) {
61
+ return {
62
+ length: lerp(1.0 - 0.14 * shape_var, 1.0, maturity),
63
+ width: lerp(1.0 - 0.26 * shape_var, 1.0, maturity),
64
+ depth: lerp(1.0 - 0.45 * shape_var, 1.0, maturity)
65
+ };
66
+ }
67
+
68
+ /**
69
+ * Half-width envelope of an unlobed blade of length `L` and greatest width `W`: a monotone cubic Hermite spline
70
+ * through the base, the base angle's point a quarter of the way up, the widest point, the apex angle's point a
71
+ * quarter of the way down, and the apex (Ellis et al. 2009 measure the angles there). The shapes set the slopes at
72
+ * the ends: straight runs at the secant, convex steeper, rounded steepest, acuminate shallow so the tip draws out.
73
+ *
74
+ * @param {import("../config/LeafArchitecture.js").LeafArchitecture} arch
75
+ * @param {number} L
76
+ * @param {number} W
77
+ * @returns {function(number): number} half-width at `y` in `[0, L]`
78
+ */
79
+ function blade_envelope(arch, L, W) {
80
+ const half = 0.5 * W;
81
+ const half_angle_width = (angle) => angle >= Math.PI ? half : Math.min(half, 0.25 * L * Math.tan(0.5 * angle));
82
+ const yw = arch.widest_at * L;
83
+ const truncated = arch.base_shape === LeafBaseShape.Truncate || arch.base_shape === LeafBaseShape.Cordate;
84
+ const wb = half_angle_width(arch.base_angle);
85
+ const wa = half_angle_width(arch.apex_angle);
86
+
87
+ const ys = [0];
88
+ const ws = [truncated ? Math.max(wb, 0.6 * half) : 0];
89
+ if (yw - 0.25 * L > 0.06 * L) {
90
+ ys.push(0.25 * L);
91
+ ws.push(Math.min(wb, half));
92
+ }
93
+ ys.push(yw);
94
+ ws.push(half);
95
+ if (0.75 * L - yw > 0.06 * L) {
96
+ ys.push(0.75 * L);
97
+ ws.push(Math.min(wa, half));
98
+ }
99
+ ys.push(L);
100
+ ws.push(0);
101
+
102
+ const n = ys.length;
103
+ const secant = new Array(n - 1);
104
+ for (let i = 0; i < n - 1; i++) secant[i] = (ws[i + 1] - ws[i]) / (ys[i + 1] - ys[i]);
105
+ // slopes: Fritsch-Carlson inside, flat at the widest point, the shapes at the ends
106
+ const m = new Array(n);
107
+ for (let i = 1; i < n - 1; i++) {
108
+ const a = secant[i - 1], b = secant[i];
109
+ m[i] = ys[i] === yw || a * b <= 0 ? 0 : 2 * a * b / (a + b);
110
+ }
111
+ const base_factor = truncated ? 1.0
112
+ : arch.base_shape === LeafBaseShape.Rounded ? 3.0
113
+ : arch.base_shape === LeafBaseShape.Straight ? 1.0 : 2.0;
114
+ m[0] = secant[0] * base_factor;
115
+ const apex_factor = arch.apex_shape === LeafApexShape.Rounded ? 3.0
116
+ : arch.apex_shape === LeafApexShape.Convex ? 2.0
117
+ : arch.apex_shape === LeafApexShape.Acuminate ? 0.25 : 1.0;
118
+ m[n - 1] = secant[n - 2] * apex_factor;
119
+
120
+ const rounded_apex = arch.apex_shape === LeafApexShape.Rounded;
121
+ const rounded_base = !truncated && arch.base_shape === LeafBaseShape.Rounded;
122
+ return (y) => {
123
+ const yy = clamp(y, 0, L);
124
+ // a rounded end is an arc: a quarter ellipse from the nearest knot
125
+ if (rounded_apex && yy > ys[n - 2]) {
126
+ const t = (yy - ys[n - 2]) / (L - ys[n - 2]);
127
+ return ws[n - 2] * Math.sqrt(Math.max(0, 1 - t * t));
128
+ }
129
+ if (rounded_base && yy < ys[1]) {
130
+ const t = 1 - yy / ys[1];
131
+ return ws[1] * Math.sqrt(Math.max(0, 1 - t * t));
132
+ }
133
+ let i = 0;
134
+ while (i < n - 2 && yy > ys[i + 1]) i++;
135
+ const h = ys[i + 1] - ys[i];
136
+ const t = (yy - ys[i]) / h;
137
+ const t2 = t * t, t3 = t2 * t;
138
+ return Math.max(0, (2 * t3 - 3 * t2 + 1) * ws[i] + (t3 - 2 * t2 + t) * h * m[i]
139
+ + (-2 * t3 + 3 * t2) * ws[i + 1] + (t3 - t2) * h * m[i + 1]);
140
+ };
141
+ }
142
+
143
+ /**
144
+ * Offsets a polyline outward along its normals by a serration: teeth pointing towards the end of the polyline,
145
+ * `tooth_orders` 2 adding teeth a third the size on each.
146
+ *
147
+ * @param {number[]} xs
148
+ * @param {number[]} ys
149
+ * @param {number} period m along the outline
150
+ * @param {number} depth m
151
+ * @param {number} orders
152
+ * @param {number} sign +1 for an outline that runs with its outside on its right, -1 on its left
153
+ * @param {number} s_from arc length where teeth start, so the petiole end stays clean
154
+ */
155
+ function serrate(xs, ys, period, depth, orders, sign, s_from) {
156
+ const n = xs.length;
157
+ let s = 0;
158
+ const ox = new Array(n), oy = new Array(n);
159
+ for (let i = 0; i < n; i++) {
160
+ if (i > 0) s += Math.hypot(xs[i] - xs[i - 1], ys[i] - ys[i - 1]);
161
+ const a = Math.max(0, i - 1), b = Math.min(n - 1, i + 1);
162
+ const tx = xs[b] - xs[a], ty = ys[b] - ys[a];
163
+ const tl = Math.hypot(tx, ty) || 1;
164
+ // outward normal
165
+ const nx = sign * ty / tl, ny = -sign * tx / tl;
166
+ let h = 0;
167
+ if (s > s_from) {
168
+ const phase = ((s - s_from) / period) % 1;
169
+ // a tooth rises slowly and falls sharply: its tip points towards the apex
170
+ h = depth * (phase < 0.8 ? phase / 0.8 : (1 - phase) / 0.2);
171
+ if (orders > 1) {
172
+ const p2 = ((s - s_from) / (period / 3)) % 1;
173
+ h += depth / 3 * (p2 < 0.8 ? p2 / 0.8 : (1 - p2) / 0.2);
174
+ }
175
+ // teeth fade out where the blade closes at the apex
176
+ h *= clamp(Math.abs(xs[i]) / (2 * depth + 1e-9), 0, 1);
177
+ }
178
+ ox[i] = xs[i] + nx * h;
179
+ oy[i] = ys[i] + ny * h;
180
+ }
181
+ for (let i = 0; i < n; i++) {
182
+ xs[i] = ox[i];
183
+ ys[i] = oy[i];
184
+ }
185
+ }
186
+
187
+ /**
188
+ * The right half (`x >= 0`) of a simple blade's outline, from where the base meets the midvein (or the petiole) up
189
+ * to the apex, with its teeth; for a pinnately lobed blade, the blade between the lobes, and the lobes to add.
190
+ *
191
+ * @param {import("../config/LeafArchitecture.js").LeafArchitecture} arch
192
+ * @param {number} L blade length (m)
193
+ * @param {number} W blade width (m)
194
+ * @param {number} depth_scale ontogeny of the lobes' and teeth's depth
195
+ * @returns {{xs: number[], ys: number[], lobes: number[], finest: number}} `lobes`: `(vein origin y, length, half
196
+ * width)` of each lateral lobe on a side
197
+ */
198
+ function blade_half(arch, L, W, depth_scale) {
199
+ const envelope = blade_envelope(arch, L, W);
200
+ const xs = [], ys = [];
201
+ let finest = W;
202
+
203
+ // the base: cordate and lobate bases reach below the top of the petiole
204
+ const lobe_drop = (arch.base_shape === LeafBaseShape.Cordate || arch.base_shape === LeafBaseShape.Lobate)
205
+ ? arch.base_lobe_depth * L : 0;
206
+ if (lobe_drop > 0) {
207
+ // the margin leaves the sinus at the top of the petiole, curves down round the basal lobe and rises to meet
208
+ // the outline along its own direction: a cubic Bezier from (0, 0) to the outline's point where the base angle
209
+ // is measured (a cordate base) or a little above the base (the small auricles of a lobate one)
210
+ const y_join = arch.base_shape === LeafBaseShape.Cordate ? Math.min(0.25 * L, 0.8 * arch.widest_at * L) : 0.12 * L;
211
+ const x_join = envelope(y_join);
212
+ const dy = 1e-3 * L;
213
+ const slope = (envelope(y_join + dy) - envelope(y_join - dy)) / (2 * dy);
214
+ const reach = y_join + lobe_drop;
215
+ // the lobe bulges below the petiole and swings out to the outline's width; its first control point sits as
216
+ // low as makes the curve's lowest point `lobe_drop` below the petiole
217
+ const p1x = 0.35 * x_join;
218
+ const p2x = Math.max(0, x_join - slope * 0.6 * reach), p2y = y_join - 0.6 * reach;
219
+ const steps = 32;
220
+ const lowest = (p1y) => {
221
+ let y = 0;
222
+ for (let k = 0; k <= steps; k++) {
223
+ const t = k / steps, u = 1 - t;
224
+ y = Math.min(y, 3 * u * u * t * p1y + 3 * u * t * t * p2y + t * t * t * y_join);
225
+ }
226
+ return y;
227
+ };
228
+ let lo = -20 * lobe_drop, hi = 0;
229
+ for (let it = 0; it < 40; it++) {
230
+ const mid = 0.5 * (lo + hi);
231
+ if (lowest(mid) < -lobe_drop) lo = mid;
232
+ else hi = mid;
233
+ }
234
+ const p1y = 0.5 * (lo + hi);
235
+ for (let k = 0; k <= steps; k++) {
236
+ const t = k / steps, u = 1 - t;
237
+ const b1 = 3 * u * u * t, b2 = 3 * u * t * t, b3 = t * t * t;
238
+ xs.push(b1 * p1x + b2 * p2x + b3 * x_join);
239
+ ys.push(b1 * p1y + b2 * p2y + b3 * y_join);
240
+ }
241
+ // and on up the outline
242
+ const k0 = Math.floor(SIDE_SAMPLES * y_join / L) + 1;
243
+ for (let k = k0; k <= SIDE_SAMPLES; k++) {
244
+ const y = L * k / SIDE_SAMPLES;
245
+ xs.push(envelope(y));
246
+ ys.push(y);
247
+ }
248
+ finest = Math.min(finest, lobe_drop);
249
+ } else {
250
+ for (let k = 0; k <= SIDE_SAMPLES; k++) {
251
+ const y = L * k / SIDE_SAMPLES;
252
+ xs.push(envelope(y));
253
+ ys.push(y);
254
+ }
255
+ }
256
+
257
+ // pinnate lobes: the blade between them reaches only to the sinus floor, `1 - sinus_depth` of the outline's
258
+ // width, swelling back to the outline over the apex's own lobe; each lateral lobe is a rounded blade of its own
259
+ // along the secondary vein that feeds it, out to the outline. The secondary veins leave the midvein evenly spaced.
260
+ const lobes = [];
261
+ if (arch.lobation === LeafLobation.Pinnate && arch.lobes > 0) {
262
+ const pairs = arch.lobes;
263
+ const spacing = L / (pairs + 1);
264
+ const floor = 1 - arch.sinus_depth * depth_scale;
265
+ const lean = 1 / Math.tan(arch.secondary_angle);
266
+ const y_top = (pairs - 0.5) * spacing;
267
+ for (let i = 0; i < xs.length; i++) {
268
+ if (ys[i] <= 0) continue;
269
+ const t = clamp((ys[i] - y_top) / (L - y_top), 0, 1);
270
+ xs[i] *= floor + (1 - floor) * t * t * (3 - 2 * t);
271
+ }
272
+ // a lobe fills the room between its neighbours' veins, measured across them
273
+ const half_width = 0.5 * LOBE_FILL * spacing * Math.sin(arch.secondary_angle);
274
+ for (let k = 0; k < pairs; k++) {
275
+ const y0 = (k + 0.3) * spacing;
276
+ // where the vein meets the outline
277
+ let y = y0;
278
+ for (let it = 0; it < 12; it++) y = y0 + envelope(y) * lean;
279
+ const x = envelope(y);
280
+ const length = Math.hypot(x, y - y0);
281
+ lobes.push(y0, length, Math.min(half_width, 0.5 * length));
282
+ }
283
+ finest = Math.min(finest, 2 * (1 - LOBE_FILL) * spacing * Math.sin(arch.secondary_angle) + half_width);
284
+ }
285
+
286
+ if (arch.teeth_per_cm > 0 && arch.tooth_depth > 0) {
287
+ const period = 0.01 / arch.teeth_per_cm;
288
+ // the right side runs base to apex with the outside on its right
289
+ serrate(xs, ys, period, arch.tooth_depth * depth_scale, arch.tooth_orders, 1, 0.08 * L);
290
+ finest = Math.min(finest, period / (arch.tooth_orders > 1 ? 3 : 1));
291
+ }
292
+ return { xs, ys, lobes, finest };
293
+ }
294
+
295
+ /**
296
+ * Outline of a pinnate lobe: a blade with the leaf's apex, rounded at its base where it rises out of the blade, and
297
+ * entire or toothed as the leaf is.
298
+ *
299
+ * @param {import("../config/LeafArchitecture.js").LeafArchitecture} arch
300
+ * @returns {Object} an architecture for `blade_half`
301
+ */
302
+ function lobe_architecture(arch) {
303
+ return Object.assign({}, arch, {
304
+ lobation: LeafLobation.Unlobed,
305
+ widest_at: 0.6,
306
+ base_shape: LeafBaseShape.Rounded,
307
+ base_angle: Math.PI,
308
+ base_lobe_depth: 0
309
+ });
310
+ }
311
+
312
+ /**
313
+ * Appends a contour made of the right half and its mirror, rotated by `angle` from `+y` towards `+x` and moved to
314
+ * `(ox, oy)`.
315
+ */
316
+ function push_symmetric(out, half, angle, ox, oy) {
317
+ const c = Math.cos(angle), s = Math.sin(angle);
318
+ const first = out.points.length / 2;
319
+ const n = half.xs.length;
320
+ let count = 0;
321
+ const put = (x, y) => {
322
+ out.points.push(ox + x * c + y * s, oy - x * s + y * c);
323
+ count++;
324
+ };
325
+ // up the right side and back down the left: counter-clockwise with y up; the rotation keeps the winding
326
+ for (let i = 0; i < n; i++) put(half.xs[i], half.ys[i]);
327
+ for (let i = n - 2; i >= 0; i--) put(-half.xs[i], half.ys[i]);
328
+ out.contours.push(first, count);
329
+ }
330
+
331
+ /**
332
+ * Appends a vein from `(x0, y0)` to `(x1, y1)` in a frame rotated by `angle` and moved to `(ox, oy)`.
333
+ */
334
+ function push_segment(list, x0, y0, x1, y1, half_width, angle, ox, oy) {
335
+ const c = Math.cos(angle), s = Math.sin(angle);
336
+ list.push(ox + x0 * c + y0 * s, oy - x0 * s + y0 * c, ox + x1 * c + y1 * s, oy - x1 * s + y1 * c, half_width);
337
+ }
338
+
339
+ /**
340
+ * Appends one simple blade, rotated by `angle` and set at `(ox, oy)`, with its veins.
341
+ *
342
+ * @returns {number} its finest feature (m)
343
+ */
344
+ function push_blade(out, arch, L, W, depth_scale, angle, ox, oy) {
345
+ const half = blade_half(arch, L, W, depth_scale);
346
+ push_symmetric(out, half, angle, ox, oy);
347
+ const mid_w = 0.5 * MIDVEIN_WIDTH * L;
348
+ push_segment(out.midveins, 0, 0, 0, L * 0.97, mid_w, angle, ox, oy);
349
+ const sec_w = 0.5 * SECONDARY_WIDTH * L;
350
+ let finest = half.finest;
351
+ if (half.lobes.length > 0) {
352
+ // each lobe, both sides, along its secondary vein, which runs most of its length
353
+ const lobe_arch = lobe_architecture(arch);
354
+ const c = Math.cos(angle), sn = Math.sin(angle);
355
+ for (let k = 0; k < half.lobes.length; k += 3) {
356
+ const y0 = half.lobes[k], length = half.lobes[k + 1], hw = half.lobes[k + 2];
357
+ const lobe = blade_half(lobe_arch, length, 2 * hw, depth_scale);
358
+ finest = Math.min(finest, lobe.finest);
359
+ // the vein's origin in the blade's frame, turned and moved as the blade is
360
+ const vx = ox + y0 * sn, vy = oy + y0 * c;
361
+ for (const side of [1, -1]) {
362
+ const a = angle + side * arch.secondary_angle;
363
+ push_symmetric(out, lobe, a, vx, vy);
364
+ push_segment(out.secondaries, 0, 0, 0, 0.9 * length, sec_w, a, vx, vy);
365
+ }
366
+ }
367
+ } else if (arch.secondary_veins > 0) {
368
+ const envelope = blade_envelope(arch, L, W);
369
+ const pairs = arch.secondary_veins;
370
+ for (let k = 1; k <= pairs; k++) {
371
+ const y0 = L * k / (pairs + 1) * 0.92;
372
+ // where a vein at the secondary angle meets the margin
373
+ const lean = 1 / Math.tan(arch.secondary_angle);
374
+ let y1 = y0;
375
+ for (let it = 0; it < 8; it++) y1 = Math.min(0.97 * L, y0 + envelope(y1) * 0.9 * lean);
376
+ const x1 = envelope(y1) * 0.9;
377
+ push_segment(out.secondaries, 0, y0, x1, y1, sec_w, angle, ox, oy);
378
+ push_segment(out.secondaries, 0, y0, -x1, y1, sec_w, angle, ox, oy);
379
+ }
380
+ }
381
+ return finest;
382
+ }
383
+
384
+ /**
385
+ * Geometry of a leaf at ontogenetic `maturity`: its outline as contours, its veins, its petiole (and rachis).
386
+ *
387
+ * - **Simple:** one blade, its petiole below the origin.
388
+ * - **Palmately lobed:** a primary lobe per `lobes`, each a blade of the architecture's outline radiating from the
389
+ * top of the petiole across `lobe_spread`, the outer ones `lateral_lobe_length` as long, over a body that fills the
390
+ * sinuses to `1 - sinus_depth` of the way out.
391
+ * - **Compound:** `leaflets` blades in pairs along a rachis of `rachis_length`, a terminal one at its end when odd;
392
+ * leaflets shorten towards the tip.
393
+ *
394
+ * @param {import("../config/LeafArchitecture.js").LeafArchitecture} arch
395
+ * @param {number} maturity `[0, 1]`
396
+ * @param {number} shape_var how far juvenile leaves differ, `[0, 1]`
397
+ * @returns {LeafGeometry}
398
+ */
399
+ export function leaf_geometry(arch, maturity, shape_var) {
400
+ const og = leaf_ontogeny(maturity, shape_var);
401
+ const L = arch.blade_length * og.length;
402
+ const W = L / arch.length_width_ratio * og.width;
403
+ const out = { points: [], contours: [], midveins: [], secondaries: [], stems: [] };
404
+ let finest = W;
405
+ let tip_y = L;
406
+ const petiole = arch.petiole_length * og.length;
407
+ let petiole_w = 0.5 * PETIOLE_WIDTH * L;
408
+
409
+ if (arch.leaflets > 1) {
410
+ const rachis = arch.rachis_length * og.length;
411
+ // the rachis carries the whole leaf
412
+ petiole_w = 0.5 * PETIOLE_WIDTH * (rachis + L);
413
+ const pairs = Math.floor(arch.leaflets / 2);
414
+ for (let p = 0; p < pairs; p++) {
415
+ const u = (p + 0.5) / pairs;
416
+ const y = rachis * u;
417
+ const length = L * lerp(1.0, 0.75, u);
418
+ const angle = lerp(0.95, 0.55, u);
419
+ finest = Math.min(finest, push_blade(out, arch, length, length / arch.length_width_ratio * og.width, og.depth, angle, 0, y));
420
+ push_blade(out, arch, length, length / arch.length_width_ratio * og.width, og.depth, -angle, 0, y);
421
+ }
422
+ tip_y = rachis;
423
+ if (arch.leaflets % 2 === 1) {
424
+ const length = L * 0.75;
425
+ push_blade(out, arch, length, length / arch.length_width_ratio * og.width, og.depth, 0, 0, rachis);
426
+ tip_y = rachis + length;
427
+ }
428
+ out.stems.push(0, -petiole, 0, rachis, petiole_w);
429
+ } else if (arch.lobation === LeafLobation.Palmate && arch.lobes > 1) {
430
+ const n = arch.lobes;
431
+ const spread = arch.lobe_spread;
432
+ const lengths = new Array(n), angles = new Array(n);
433
+ for (let i = 0; i < n; i++) {
434
+ const a = -0.5 * spread + spread * i / (n - 1);
435
+ angles[i] = a;
436
+ lengths[i] = L * lerp(1.0, arch.lateral_lobe_length, Math.abs(a) / (0.5 * spread));
437
+ finest = Math.min(finest, push_blade(out, arch, lengths[i], lengths[i] / arch.length_width_ratio * og.width, og.depth, a, 0, 0));
438
+ }
439
+ // the body: out to the sinus floors between lobes, back to the petiole round the base
440
+ const floor = 1 - arch.sinus_depth * og.depth;
441
+ const first = out.points.length / 2;
442
+ let count = 0;
443
+ const put = (r, a) => {
444
+ out.points.push(r * Math.sin(a), r * Math.cos(a));
445
+ count++;
446
+ };
447
+ // counter-clockwise in a y-up frame runs from +x through +y to -x: from the rightmost lobe to the leftmost
448
+ put(0, 0);
449
+ for (let i = n - 1; i >= 0; i--) {
450
+ put(lengths[i] * 0.5, angles[i]);
451
+ if (i > 0) put(floor * Math.min(lengths[i], lengths[i - 1]), 0.5 * (angles[i] + angles[i - 1]));
452
+ }
453
+ out.contours.push(first, count);
454
+ finest = Math.min(finest, (1 - floor) * L);
455
+ tip_y = L;
456
+ out.stems.push(0, -petiole, 0, 0, petiole_w);
457
+ } else {
458
+ finest = Math.min(finest, push_blade(out, arch, L, W, og.depth, 0, 0, 0));
459
+ out.stems.push(0, -petiole, 0, 0, petiole_w);
460
+ }
461
+
462
+ // the petiole is leaf too: a thin strip under the blade
463
+ if (petiole > 0) {
464
+ const first = out.points.length / 2;
465
+ out.points.push(-petiole_w, -petiole, petiole_w, -petiole, petiole_w, 0.02 * L, -petiole_w, 0.02 * L);
466
+ out.contours.push(first, 4);
467
+ }
468
+
469
+ return {
470
+ points: out.points,
471
+ contours: out.contours,
472
+ veins: out.midveins.concat(out.secondaries),
473
+ midvein_count: out.midveins.length / 5,
474
+ stems: out.stems,
475
+ attach_y: -petiole,
476
+ tip_y,
477
+ finest
478
+ };
479
+ }
480
+
481
+ /**
482
+ * Geometry of a stretch of needle shoot `shoot_length` long as one of `planes` card planes through it shows it: the
483
+ * shoot up `y` from the origin and the `needles` needles whose azimuth round the shoot lies within the plane's sector,
484
+ * `pi / planes` wide either side of the shoot, evenly along it. Each leaves the shoot at `needle_angle`; turned
485
+ * out of the plane by its azimuth, it shows at a shallower angle and foreshortened.
486
+ *
487
+ * @param {import("../config/LeafArchitecture.js").LeafArchitecture} arch the needle
488
+ * @param {number} needles drawn on this plane
489
+ * @param {number} shoot_length m
490
+ * @param {number} needle_angle radians from the shoot
491
+ * @param {number} planes card planes the shoot's needles are shared among
492
+ * @param {number} maturity
493
+ * @param {number} shape_var
494
+ * @returns {LeafGeometry}
495
+ */
496
+ export function needle_shoot_geometry(arch, needles, shoot_length, needle_angle, planes, maturity, shape_var) {
497
+ const og = leaf_ontogeny(maturity, shape_var);
498
+ const L = arch.blade_length * og.length;
499
+ const W = L / arch.length_width_ratio * og.width;
500
+ const out = { points: [], contours: [], midveins: [], secondaries: [], stems: [] };
501
+ let finest = W;
502
+ const sector = Math.PI / (2 * Math.max(1, planes));
503
+ const sin_a = Math.sin(needle_angle), cos_a = Math.cos(needle_angle);
504
+ for (let i = 0; i < needles; i++) {
505
+ const y = shoot_length * (i + 0.5) / needles;
506
+ const side = i % 2 === 0 ? 1 : -1;
507
+ // azimuth from the plane, low-discrepancy over the sector
508
+ const azimuth = sector * (2 * ((i * 0.6180339887498949) % 1) - 1);
509
+ const across = sin_a * Math.cos(azimuth);
510
+ const shown = Math.hypot(across, cos_a);
511
+ finest = Math.min(finest, push_blade(out, arch, L * shown, W, og.depth, side * Math.atan2(across, cos_a), 0, y));
512
+ }
513
+ out.stems.push(0, 0, 0, shoot_length, 0.5 * PETIOLE_WIDTH * L);
514
+ const first = out.points.length / 2;
515
+ const w = 0.5 * PETIOLE_WIDTH * L;
516
+ out.points.push(-w, 0, w, 0, w, shoot_length, -w, shoot_length);
517
+ out.contours.push(first, 4);
518
+ return {
519
+ points: out.points,
520
+ contours: out.contours,
521
+ veins: out.midveins.concat(out.secondaries),
522
+ midvein_count: out.midveins.length / 5,
523
+ stems: out.stems,
524
+ attach_y: 0,
525
+ tip_y: shoot_length + L * Math.cos(needle_angle),
526
+ finest
527
+ };
528
+ }
@@ -1,40 +1,20 @@
1
- /**
2
- * Packs `variant_count` square foliage card tiles of size `resolution x resolution` into a 2D atlas
3
- * using the engine's `MaxRectanglesPacker` (`pack_max_rectangles`), returning the atlas dimensions,
4
- * pixel-space `AABB2` boxes, and normalized `[u0, v0, u1, v1]` UV rectangles.
5
- *
6
- * @param {number} [resolution=128]
7
- * @param {number} [variant_count=4]
8
- * @returns {{
9
- * resolution: number,
10
- * variant_count: number,
11
- * atlas_w: number,
12
- * atlas_h: number,
13
- * boxes: AABB2[],
14
- * uv_rects: Float32Array
15
- * }}
16
- */
17
- export function compute_foliage_variant_atlas_layout(resolution?: number, variant_count?: number): {
18
- resolution: number;
19
- variant_count: number;
20
- atlas_w: number;
21
- atlas_h: number;
22
- boxes: AABB2[];
23
- uv_rects: Float32Array;
24
- };
25
1
  /**
26
2
  * Synthesizes a turn-key procedural PBR cutout `StandardShadeMaterial` (`TransparencyMode.AlphaTested`,
27
- * `ShadeDrawSide.Double`) for botanical foliage cards, packing `config.variant_count` ontogenetic and
28
- * biochemically senescent leaf cluster variants into the texture atlas via `MaxRectanglesPacker`
29
- * (`pack_max_rectangles`), with dilated straight-alpha Albedo (`AlphaMode.Straight`, `ColorSpace.SRGB`),
30
- * 2-channel Normal map (`ColorSpace.LinearSRGB`), and ORM (`ColorSpace.LinearSRGB`).
3
+ * `ShadeDrawSide.Double`) for a species' foliage cards, packing its `foliage_material.variant_count` ontogenetic and
4
+ * biochemically senescent variants into the texture atlas via `MaxRectanglesPacker` (`pack_max_rectangles`), with
5
+ * dilated straight-alpha Albedo (`AlphaMode.Straight`, `ColorSpace.SRGB`), 2-channel Normal map
6
+ * (`ColorSpace.LinearSRGB`), and ORM (`ColorSpace.LinearSRGB`).
7
+ *
8
+ * Every tile draws the species' leaf (or a stretch of its needle shoot) at its true size, from its architecture
9
+ * (`foliage_tile_layout`, `foliage_tile_raster`): the outline's exact coverage, its veins, its petiole.
10
+ *
11
+ * The atlas's shape comes out alongside it in `out_cutout`: per tile, the hull of everything drawn and the leaf
12
+ * coverage, which the card geometry and the card density are built on.
31
13
  *
32
- * @param {FoliageMaterialConfig|Object} [config]
33
- * @param {number} [seed=1]
14
+ * @param {import("../config/TreeSpeciesConfig.js").TreeSpeciesConfig} species
15
+ * @param {import("./FoliageAtlasCutout.js").FoliageAtlasCutout|null} [out_cutout]
34
16
  * @returns {StandardShadeMaterial}
35
17
  */
36
- export function make_foliage_material(config?: FoliageMaterialConfig | any, seed?: number): StandardShadeMaterial;
37
- import AABB2 from "../../../core/geom/2d/aabb/AABB2.js";
38
- import { FoliageMaterialConfig } from "../config/FoliageMaterialConfig.js";
18
+ export function make_foliage_material(species: import("../config/TreeSpeciesConfig.js").TreeSpeciesConfig, out_cutout?: import("./FoliageAtlasCutout.js").FoliageAtlasCutout | null): StandardShadeMaterial;
39
19
  import { StandardShadeMaterial } from "../../../shade/renderer/material/StandardShadeMaterial.js";
40
20
  //# sourceMappingURL=make_foliage_material.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"make_foliage_material.d.ts","sourceRoot":"","sources":["../../../../../src/generation/foliage/material/make_foliage_material.js"],"names":[],"mappings":"AAqBA;;;;;;;;;;;;;;;GAeG;AACH,kEAXW,MAAM,kBACN,MAAM,GACJ;IACZ,UAAc,EAAE,MAAM,CAAC;IACvB,aAAiB,EAAE,MAAM,CAAC;IAC1B,OAAW,EAAE,MAAM,CAAC;IACpB,OAAW,EAAE,MAAM,CAAC;IACpB,KAAS,EAAE,KAAK,EAAE,CAAC;IACnB,QAAY,EAAE,YAAY,CAAA;CACvB,CA4CH;AAuGD;;;;;;;;;;GAUG;AACH,+CAJW,qBAAqB,MAAO,SAC5B,MAAM,GACJ,qBAAqB,CA6ZjC;kBA5lBiB,qCAAqC;sCAiBjB,oCAAoC;sCARpC,2DAA2D"}
1
+ {"version":3,"file":"make_foliage_material.d.ts","sourceRoot":"","sources":["../../../../../src/generation/foliage/material/make_foliage_material.js"],"names":[],"mappings":"AAyBA;;;;;;;;;;;;;;;;GAgBG;AACH,+CAJW,OAAO,gCAAgC,EAAE,iBAAiB,eAC1D,OAAO,yBAAyB,EAAE,kBAAkB,GAAC,IAAI,GACvD,qBAAqB,CA2TjC;sCA5VqC,2DAA2D"}