@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,66 @@
1
+ /**
2
+ * @typedef {Object} FoliageLeafArea
3
+ * @property {number} total one-sided leaf area of every card, m^2
4
+ * @property {Float64Array} by_card one-sided leaf area of each attachment, m^2
5
+ * @property {Float64Array} by_generator one-sided leaf area of the cards each `config.branches` generator's branches
6
+ * carry, m^2
7
+ * @property {number} crown_projected_area area of the crown seen from straight above, m^2: the convex hull of every
8
+ * vertex of a card triangle that shows any leaf, projected onto the horizontal (x, z) plane
9
+ * @property {number} crown_leaf_area_index `total / crown_projected_area`, the tree's own leaf area index
10
+ */
11
+ /**
12
+ * Measures the one-sided leaf area a tree's foliage cards draw.
13
+ *
14
+ * Builds the cards as `tree_mesh_build_foliage` draws them and integrates the atlas's alpha over each triangle. A
15
+ * triangle maps its atlas UVs onto itself affinely, so every texel's leaf lands on it at the triangle's own ratio of
16
+ * area to UV area: its leaf area is its area times the alpha-weighted fraction of its UV footprint. Everything the
17
+ * cards do to their tiles is therefore measured, not modelled: each card's own tile (`attachments.variant_indices`)
18
+ * and scale (`attachments.scales`), every plane a cross or tri-star stands up, the strip below the tile's anchor
19
+ * (`foliage_tile_layout`) that a folded card does not draw, folds, arches and droops, a frond's segments and tapering envelope, and a hull card's fan, which
20
+ * shows only the texels inside its tile's hull.
21
+ *
22
+ * Where it approximates:
23
+ * - each texel's alpha stands over its whole square (the reconstruction `FoliageAtlasCutout.coverage` sums), at the
24
+ * atlas's full resolution; a semi-transparent texel counts as that fraction of leaf, which is the expected area the
25
+ * path tracer's stochastic alpha test leaves opaque
26
+ * - the atlas's alpha is stored in 8 bits, so it differs from the unrounded alpha `FoliageAtlasCutout.coverage` sums
27
+ * by up to half a step per texel
28
+ * - every card counts: the full set, before any LOD decimates it or enlarges what it keeps to compensate
29
+ * - cards in their rest pose: wind bends cards without stretching them, but this measures none of it
30
+ * - leaf is whatever the atlas draws opaque, the petioles and rachis it draws included
31
+ *
32
+ * @param {import("../skeleton/TreeSkeleton.js").TreeSkeleton} skeleton
33
+ * @param {import("../mesh/foliage_collect_attachments.js").FoliageAttachmentSet} attachments
34
+ * @param {import("../config/TreeSpeciesConfig.js").TreeSpeciesConfig} config
35
+ * @param {import("../material/FoliageAtlasCutout.js").FoliageAtlasCutout|null} cutout the atlas's fitted shape, which
36
+ * hull cards outline; `null` draws them over whole tiles, as `tree_mesh_build_foliage` does
37
+ * @param {import("../../../engine/graphics/texture/sampler/Sampler2D.js").Sampler2D} albedo the atlas the cards show,
38
+ * 8-bit RGBA with straight alpha: `make_foliage_material(...).texture_albedo.image.source`
39
+ * @returns {FoliageLeafArea}
40
+ */
41
+ export function foliage_measure_leaf_area(skeleton: import("../skeleton/TreeSkeleton.js").TreeSkeleton, attachments: import("../mesh/foliage_collect_attachments.js").FoliageAttachmentSet, config: import("../config/TreeSpeciesConfig.js").TreeSpeciesConfig, cutout: import("../material/FoliageAtlasCutout.js").FoliageAtlasCutout | null, albedo: import("../../../engine/graphics/texture/sampler/Sampler2D.js").Sampler2D): FoliageLeafArea;
42
+ export type FoliageLeafArea = {
43
+ /**
44
+ * one-sided leaf area of every card, m^2
45
+ */
46
+ total: number;
47
+ /**
48
+ * one-sided leaf area of each attachment, m^2
49
+ */
50
+ by_card: Float64Array;
51
+ /**
52
+ * one-sided leaf area of the cards each `config.branches` generator's branches
53
+ * carry, m^2
54
+ */
55
+ by_generator: Float64Array;
56
+ /**
57
+ * area of the crown seen from straight above, m^2: the convex hull of every
58
+ * vertex of a card triangle that shows any leaf, projected onto the horizontal (x, z) plane
59
+ */
60
+ crown_projected_area: number;
61
+ /**
62
+ * `total / crown_projected_area`, the tree's own leaf area index
63
+ */
64
+ crown_leaf_area_index: number;
65
+ };
66
+ //# sourceMappingURL=foliage_measure_leaf_area.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"foliage_measure_leaf_area.d.ts","sourceRoot":"","sources":["../../../../../src/generation/foliage/analysis/foliage_measure_leaf_area.js"],"names":[],"mappings":"AAkBA;;;;;;;;;GASG;AAEH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,oDATW,OAAO,6BAA6B,EAAE,YAAY,eAClD,OAAO,wCAAwC,EAAE,oBAAoB,UACrE,OAAO,gCAAgC,EAAE,iBAAiB,UAC1D,OAAO,mCAAmC,EAAE,kBAAkB,GAAC,IAAI,UAEnE,OAAO,uDAAuD,EAAE,SAAS,GAEvE,eAAe,CAsI3B;;;;;WA3Ka,MAAM;;;;aACN,YAAY;;;;;kBACZ,YAAY;;;;;0BAEZ,MAAM;;;;2BAEN,MAAM"}
@@ -0,0 +1,192 @@
1
+ import { assert } from "../../../core/assert.js";
2
+ import { convex_hull_monotone_2d } from "../../../core/geom/2d/convex-hull/convex_hull_monotone_2d.js";
3
+ import { polygon2_signed_area } from "../../../core/geom/2d/polygon/polygon2_signed_area.js";
4
+ import { tri2_rasterize_coverage } from "../../../core/geom/2d/triangle/tri2_rasterize_coverage.js";
5
+ import { tri2_signed_area } from "../../../core/geom/2d/triangle/tri2_signed_area.js";
6
+ import { tri3_area } from "../../../core/geom/3d/triangle/tri3_area.js";
7
+ import { StandardAttributes } from "../../../shade/renderer/geometry/StandardAttributes.js";
8
+ import { TreeLODConfig } from "../config/TreeLODConfig.js";
9
+ import { tree_mesh_build_foliage } from "../mesh/tree_mesh_build_foliage.js";
10
+
11
+ /**
12
+ * Every card the tree has: the full set, before any LOD decimates it or scales it up to compensate.
13
+ * @type {TreeLODConfig}
14
+ */
15
+ const ALL_CARDS = new TreeLODConfig();
16
+
17
+ const SCRATCH_TRIANGLE = new Float64Array(6);
18
+
19
+ /**
20
+ * @typedef {Object} FoliageLeafArea
21
+ * @property {number} total one-sided leaf area of every card, m^2
22
+ * @property {Float64Array} by_card one-sided leaf area of each attachment, m^2
23
+ * @property {Float64Array} by_generator one-sided leaf area of the cards each `config.branches` generator's branches
24
+ * carry, m^2
25
+ * @property {number} crown_projected_area area of the crown seen from straight above, m^2: the convex hull of every
26
+ * vertex of a card triangle that shows any leaf, projected onto the horizontal (x, z) plane
27
+ * @property {number} crown_leaf_area_index `total / crown_projected_area`, the tree's own leaf area index
28
+ */
29
+
30
+ /**
31
+ * Measures the one-sided leaf area a tree's foliage cards draw.
32
+ *
33
+ * Builds the cards as `tree_mesh_build_foliage` draws them and integrates the atlas's alpha over each triangle. A
34
+ * triangle maps its atlas UVs onto itself affinely, so every texel's leaf lands on it at the triangle's own ratio of
35
+ * area to UV area: its leaf area is its area times the alpha-weighted fraction of its UV footprint. Everything the
36
+ * cards do to their tiles is therefore measured, not modelled: each card's own tile (`attachments.variant_indices`)
37
+ * and scale (`attachments.scales`), every plane a cross or tri-star stands up, the strip below the tile's anchor
38
+ * (`foliage_tile_layout`) that a folded card does not draw, folds, arches and droops, a frond's segments and tapering envelope, and a hull card's fan, which
39
+ * shows only the texels inside its tile's hull.
40
+ *
41
+ * Where it approximates:
42
+ * - each texel's alpha stands over its whole square (the reconstruction `FoliageAtlasCutout.coverage` sums), at the
43
+ * atlas's full resolution; a semi-transparent texel counts as that fraction of leaf, which is the expected area the
44
+ * path tracer's stochastic alpha test leaves opaque
45
+ * - the atlas's alpha is stored in 8 bits, so it differs from the unrounded alpha `FoliageAtlasCutout.coverage` sums
46
+ * by up to half a step per texel
47
+ * - every card counts: the full set, before any LOD decimates it or enlarges what it keeps to compensate
48
+ * - cards in their rest pose: wind bends cards without stretching them, but this measures none of it
49
+ * - leaf is whatever the atlas draws opaque, the petioles and rachis it draws included
50
+ *
51
+ * @param {import("../skeleton/TreeSkeleton.js").TreeSkeleton} skeleton
52
+ * @param {import("../mesh/foliage_collect_attachments.js").FoliageAttachmentSet} attachments
53
+ * @param {import("../config/TreeSpeciesConfig.js").TreeSpeciesConfig} config
54
+ * @param {import("../material/FoliageAtlasCutout.js").FoliageAtlasCutout|null} cutout the atlas's fitted shape, which
55
+ * hull cards outline; `null` draws them over whole tiles, as `tree_mesh_build_foliage` does
56
+ * @param {import("../../../engine/graphics/texture/sampler/Sampler2D.js").Sampler2D} albedo the atlas the cards show,
57
+ * 8-bit RGBA with straight alpha: `make_foliage_material(...).texture_albedo.image.source`
58
+ * @returns {FoliageLeafArea}
59
+ */
60
+ export function foliage_measure_leaf_area(skeleton, attachments, config, cutout, albedo) {
61
+ assert.equal(albedo.itemSize, 4, 'albedo.itemSize');
62
+ assert.ok(albedo.data instanceof Uint8Array || albedo.data instanceof Uint8ClampedArray, 'albedo must be 8-bit');
63
+
64
+ const card_count = attachments.count;
65
+ const by_card = new Float64Array(card_count);
66
+ const by_generator = new Float64Array(config.branches.length);
67
+ const result = {
68
+ total: 0.0,
69
+ by_card,
70
+ by_generator,
71
+ crown_projected_area: 0.0,
72
+ crown_leaf_area_index: 0.0
73
+ };
74
+
75
+ const geometry = tree_mesh_build_foliage(skeleton, attachments, config, ALL_CARDS, cutout);
76
+ if (geometry === null) {
77
+ return result;
78
+ }
79
+
80
+ const positions = geometry.getAttribute(StandardAttributes.Position).data;
81
+ const uvs = geometry.getAttribute(StandardAttributes.TextureCoordinates0).data;
82
+ const index = geometry.index.data;
83
+ const triangle_count = geometry.getIndexCount() / 3;
84
+ const triangles_per_card = triangle_count / card_count;
85
+ assert.ok(Number.isInteger(triangles_per_card), 'every card is built from as many triangles as the next');
86
+
87
+ const width = albedo.width;
88
+ const height = albedo.height;
89
+ const data = albedo.data;
90
+ // each texel's alpha stands over its whole square, as an atlas tile's `FoliageAtlasCutout.coverage` counts it
91
+ const alpha_over_triangle = {
92
+ width,
93
+ height,
94
+ sum: 0.0,
95
+ add(x, y, area) {
96
+ this.sum += data[(y * width + x) * 4 + 3] * area;
97
+ }
98
+ };
99
+
100
+ // A card triangle's UVs are fixed by its tile and its place in the card, so their leaf fraction is computed once
101
+ // per (tile, place): the triangle in texels, then its leaf fraction. Checked on every reuse.
102
+ const fractions = new Map();
103
+ const leafy_vertices = new Uint8Array(positions.length / 3);
104
+
105
+ for (let c = 0; c < card_count; c++) {
106
+ const tile = attachments.variant_indices[c];
107
+ let card_area = 0.0;
108
+
109
+ for (let k = 0; k < triangles_per_card; k++) {
110
+ const t = c * triangles_per_card + k;
111
+ const a = index[t * 3];
112
+ const b = index[t * 3 + 1];
113
+ const d = index[t * 3 + 2];
114
+
115
+ SCRATCH_TRIANGLE[0] = uvs[a * 2] * width;
116
+ SCRATCH_TRIANGLE[1] = uvs[a * 2 + 1] * height;
117
+ SCRATCH_TRIANGLE[2] = uvs[b * 2] * width;
118
+ SCRATCH_TRIANGLE[3] = uvs[b * 2 + 1] * height;
119
+ SCRATCH_TRIANGLE[4] = uvs[d * 2] * width;
120
+ SCRATCH_TRIANGLE[5] = uvs[d * 2 + 1] * height;
121
+
122
+ const key = tile * triangles_per_card + k;
123
+ let entry = fractions.get(key);
124
+ let same = entry !== undefined;
125
+ for (let i = 0; same && i < 6; i++) {
126
+ same = entry[i] === SCRATCH_TRIANGLE[i];
127
+ }
128
+ if (!same) {
129
+ const uv_area = Math.abs(tri2_signed_area(
130
+ SCRATCH_TRIANGLE[0], SCRATCH_TRIANGLE[1],
131
+ SCRATCH_TRIANGLE[2], SCRATCH_TRIANGLE[3],
132
+ SCRATCH_TRIANGLE[4], SCRATCH_TRIANGLE[5]
133
+ ));
134
+ entry = new Float64Array(7);
135
+ entry.set(SCRATCH_TRIANGLE);
136
+ if (uv_area > 1e-12) {
137
+ alpha_over_triangle.sum = 0.0;
138
+ tri2_rasterize_coverage(
139
+ alpha_over_triangle,
140
+ SCRATCH_TRIANGLE[0], SCRATCH_TRIANGLE[1],
141
+ SCRATCH_TRIANGLE[2], SCRATCH_TRIANGLE[3],
142
+ SCRATCH_TRIANGLE[4], SCRATCH_TRIANGLE[5]
143
+ );
144
+ entry[6] = alpha_over_triangle.sum / (255 * uv_area);
145
+ }
146
+ if (!fractions.has(key)) {
147
+ fractions.set(key, entry);
148
+ }
149
+ }
150
+ const leaf_fraction = entry[6];
151
+ if (leaf_fraction <= 0.0) continue;
152
+
153
+ card_area += leaf_fraction * tri3_area(
154
+ positions[a * 3], positions[a * 3 + 1], positions[a * 3 + 2],
155
+ positions[b * 3], positions[b * 3 + 1], positions[b * 3 + 2],
156
+ positions[d * 3], positions[d * 3 + 1], positions[d * 3 + 2]
157
+ );
158
+
159
+ leafy_vertices[a] = 1;
160
+ leafy_vertices[b] = 1;
161
+ leafy_vertices[d] = 1;
162
+ }
163
+
164
+ by_card[c] = card_area;
165
+ by_generator[skeleton.branch_generator[attachments.carriers[c]]] += card_area;
166
+ result.total += card_area;
167
+ }
168
+
169
+ let leafy_count = 0;
170
+ for (let v = 0; v < leafy_vertices.length; v++) {
171
+ leafy_count += leafy_vertices[v];
172
+ }
173
+ const ground = new Float64Array(leafy_count * 2);
174
+ for (let v = 0, n = 0; v < leafy_vertices.length; v++) {
175
+ if (leafy_vertices[v] === 0) continue;
176
+ ground[n * 2] = positions[v * 3];
177
+ ground[n * 2 + 1] = positions[v * 3 + 2];
178
+ n++;
179
+ }
180
+ if (leafy_count >= 3) {
181
+ const hull = convex_hull_monotone_2d(ground, leafy_count);
182
+ const outline = new Float64Array(hull.length * 2);
183
+ for (let i = 0; i < hull.length; i++) {
184
+ outline[i * 2] = ground[hull[i] * 2];
185
+ outline[i * 2 + 1] = ground[hull[i] * 2 + 1];
186
+ }
187
+ result.crown_projected_area = Math.abs(polygon2_signed_area(outline, hull.length));
188
+ }
189
+ result.crown_leaf_area_index = result.crown_projected_area > 0.0 ? result.total / result.crown_projected_area : 0.0;
190
+
191
+ return result;
192
+ }
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Crown density, foliage transparency and light intercepted from below of a generated tree, as drawn at its finest
3
+ * LOD: `crown_opacity_measure` over the LOD's bark and foliage geometry and the foliage material's albedo alpha.
4
+ *
5
+ * The micro/macro hole split defaults to the median card length: the closing fills every gap narrower than two
6
+ * leaves, a gap the leaves on either side of it would close by reaching into it. Wider gaps are where foliage does
7
+ * not occur, which FIA leaves out of the transparency rating.
8
+ *
9
+ * @param {import("../asset/TreeAsset.js").TreeAsset} asset from `generate_tree`, with the synthesized foliage material
10
+ * @param {Object} [options] as `crown_opacity_measure`'s, plus:
11
+ * @param {number} [options.lod=0] which LOD's geometry to measure
12
+ * @param {number} [options.microhole_radius] m, the median card length by default; required for a leafless tree
13
+ * @param {number} [options.pixel_size] m, what a rater resolves from one tree length by default
14
+ * @param {number} [options.frame_count] frames along each side of the hemi-octahedral view grid, odd; 9 by default
15
+ * @param {number} [options.leaf_transmittance]
16
+ * @param {CrownOpacity} [out]
17
+ * @returns {CrownOpacity}
18
+ */
19
+ export function tree_crown_opacity(asset: import("../asset/TreeAsset.js").TreeAsset, { lod, microhole_radius, pixel_size, frame_count, leaf_transmittance }?: {
20
+ lod?: number;
21
+ microhole_radius?: number;
22
+ pixel_size?: number;
23
+ frame_count?: number;
24
+ leaf_transmittance?: number;
25
+ }, out?: CrownOpacity): CrownOpacity;
26
+ import { CrownOpacity } from "./CrownOpacity.js";
27
+ //# sourceMappingURL=tree_crown_opacity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree_crown_opacity.d.ts","sourceRoot":"","sources":["../../../../../src/generation/foliage/analysis/tree_crown_opacity.js"],"names":[],"mappings":"AAoBA;;;;;;;;;;;;;;;;;GAiBG;AACH,0CAVW,OAAO,uBAAuB,EAAE,SAAS;IAExB,GAAG,GAApB,MAAM;IACW,gBAAgB,GAAjC,MAAM;IACW,UAAU,GAA3B,MAAM;IACW,WAAW,GAA5B,MAAM;IACW,kBAAkB,GAAnC,MAAM;SACN,YAAY,GACV,YAAY,CAqBxB;6BAxD4B,mBAAmB"}
@@ -0,0 +1,58 @@
1
+ import { assert } from "../../../core/assert.js";
2
+ import { CrownOpacity } from "./CrownOpacity.js";
3
+ import { crown_opacity_measure } from "./crown_opacity_measure.js";
4
+ import { foliage_tile_layout } from "../material/foliage_tile.js";
5
+ import { foliage_card_reach } from "../skeleton/foliage_card_density.js";
6
+
7
+ /**
8
+ * Length of the median foliage card from where it hangs, m: the size of one leaf (or, on a needle-shoot card, a
9
+ * needle's reach) as drawn.
10
+ *
11
+ * @param {import("../asset/TreeAsset.js").TreeAsset} asset
12
+ * @returns {number}
13
+ */
14
+ function median_card_length(asset) {
15
+ const attachments = asset.attachments;
16
+ assert.greaterThan(attachments.count, 0, 'a leafless tree has no card length: pass microhole_radius');
17
+ const scales = attachments.scales.slice(0, attachments.count).sort();
18
+ return foliage_card_reach(foliage_tile_layout(asset.config), scales[scales.length >> 1]);
19
+ }
20
+
21
+ /**
22
+ * Crown density, foliage transparency and light intercepted from below of a generated tree, as drawn at its finest
23
+ * LOD: `crown_opacity_measure` over the LOD's bark and foliage geometry and the foliage material's albedo alpha.
24
+ *
25
+ * The micro/macro hole split defaults to the median card length: the closing fills every gap narrower than two
26
+ * leaves, a gap the leaves on either side of it would close by reaching into it. Wider gaps are where foliage does
27
+ * not occur, which FIA leaves out of the transparency rating.
28
+ *
29
+ * @param {import("../asset/TreeAsset.js").TreeAsset} asset from `generate_tree`, with the synthesized foliage material
30
+ * @param {Object} [options] as `crown_opacity_measure`'s, plus:
31
+ * @param {number} [options.lod=0] which LOD's geometry to measure
32
+ * @param {number} [options.microhole_radius] m, the median card length by default; required for a leafless tree
33
+ * @param {number} [options.pixel_size] m, what a rater resolves from one tree length by default
34
+ * @param {number} [options.frame_count] frames along each side of the hemi-octahedral view grid, odd; 9 by default
35
+ * @param {number} [options.leaf_transmittance]
36
+ * @param {CrownOpacity} [out]
37
+ * @returns {CrownOpacity}
38
+ */
39
+ export function tree_crown_opacity(asset, {
40
+ lod = 0,
41
+ microhole_radius = median_card_length(asset),
42
+ pixel_size,
43
+ frame_count,
44
+ leaf_transmittance
45
+ } = {}, out = new CrownOpacity()) {
46
+ assert.equal(asset.isTreeAsset, true, 'asset.isTreeAsset !== true');
47
+
48
+ const level = asset.lods[lod];
49
+ const foliage = level.foliage_geometry;
50
+ const atlas = foliage !== null ? asset.foliage_material.texture_albedo.image.source : null;
51
+
52
+ return crown_opacity_measure(level.bark_geometry, foliage, atlas, {
53
+ microhole_radius,
54
+ pixel_size,
55
+ frame_count,
56
+ leaf_transmittance
57
+ }, out);
58
+ }
@@ -4,8 +4,9 @@
4
4
  *
5
5
  * Joint `0` (`SceneNode` index `1`, at the trunk base `(0, 0, 0)`) remains anchored at its bind
6
6
  * pose so the base of the trunk never pivots off the ground, while upper trunk and branch joints
7
- * carry physically derived Euler-Bernoulli cantilever compliance, natural frequency, damping ratio,
8
- * branch axis, and vortex-shedding turbulence parameters. At runtime, `GPUAnimationManager`
7
+ * carry Euler-Bernoulli cantilever compliance and natural frequency (`skin_info.joint_compliance`, from the drag
8
+ * each joint carries and the bending stiffness of its span, and `joint_natural_frequency`, its branch's first mode),
9
+ * plus damping ratio, branch axis, and vortex-shedding turbulence parameters. At runtime, `GPUAnimationManager`
9
10
  * dispatches `shader_foliage_wind_apply` to sample Meep's 3D fluid simulation wind field
10
11
  * (`GPUSceneWind`: `GlobalFluidEffector` far-field + 3D MAC `GPUFluidCascadeStack` wakes/vortices)
11
12
  * at each bone's world position and step a 2nd-order damped oscillator directly into `pose_accumulator`.
@@ -1 +1 @@
1
- {"version":3,"file":"build_tree_wind_rig.d.ts","sourceRoot":"","sources":["../../../../../src/generation/foliage/animation/build_tree_wind_rig.js"],"names":[],"mappings":"AAMA;;;;;;;;;;;;;;;GAeG;AACH,+CAJW,6GAAsG,gBACtG,cAAc,MAAO,GACnB,cAAc,GAAC,IAAI,CAuF/B;+BAvG8B,6BAA6B;+BAD7B,6DAA6D"}
1
+ {"version":3,"file":"build_tree_wind_rig.d.ts","sourceRoot":"","sources":["../../../../../src/generation/foliage/animation/build_tree_wind_rig.js"],"names":[],"mappings":"AAOA;;;;;;;;;;;;;;;;GAgBG;AACH,+CAJW,6GAAsG,gBACtG,cAAc,MAAO,GACnB,cAAc,GAAC,IAAI,CAmE/B;+BArF8B,6BAA6B;+BAD7B,6DAA6D"}
@@ -3,6 +3,7 @@ import { clamp } from "../../../core/math/clamp.js";
3
3
  import { FoliageWindJoint } from "../../../shade/renderer/animation/foliage/FoliageWindJoint.js";
4
4
  import { FoliageWindRig } from "../../../shade/renderer/animation/foliage/FoliageWindRig.js";
5
5
  import { TreeWindConfig } from "../config/TreeWindConfig.js";
6
+ import { tree_wind_bend_limit } from "./tree_wind_bend_limit.js";
6
7
 
7
8
  /**
8
9
  * Constructs a GPU fluid-driven `FoliageWindRig` (`name = "foliage_wind"`) for the structural
@@ -10,8 +11,9 @@ import { TreeWindConfig } from "../config/TreeWindConfig.js";
10
11
  *
11
12
  * Joint `0` (`SceneNode` index `1`, at the trunk base `(0, 0, 0)`) remains anchored at its bind
12
13
  * pose so the base of the trunk never pivots off the ground, while upper trunk and branch joints
13
- * carry physically derived Euler-Bernoulli cantilever compliance, natural frequency, damping ratio,
14
- * branch axis, and vortex-shedding turbulence parameters. At runtime, `GPUAnimationManager`
14
+ * carry Euler-Bernoulli cantilever compliance and natural frequency (`skin_info.joint_compliance`, from the drag
15
+ * each joint carries and the bending stiffness of its span, and `joint_natural_frequency`, its branch's first mode),
16
+ * plus damping ratio, branch axis, and vortex-shedding turbulence parameters. At runtime, `GPUAnimationManager`
15
17
  * dispatches `shader_foliage_wind_apply` to sample Meep's 3D fluid simulation wind field
16
18
  * (`GPUSceneWind`: `GlobalFluidEffector` far-field + 3D MAC `GPUFluidCascadeStack` wakes/vortices)
17
19
  * at each bone's world position and step a 2nd-order damped oscillator directly into `pose_accumulator`.
@@ -22,7 +24,8 @@ import { TreeWindConfig } from "../config/TreeWindConfig.js";
22
24
  */
23
25
  export function build_tree_wind_rig(skin_info, wind_config = new TreeWindConfig()) {
24
26
  const cfg = wind_config && wind_config.isTreeWindConfig ? wind_config : TreeWindConfig.from(wind_config);
25
- if (!cfg.enabled || !skin_info || skin_info.joint_count <= 0) {
27
+ // Joint 0 is the anchored trunk base: with no other joint there is nothing to drive
28
+ if (!cfg.enabled || !skin_info || skin_info.joint_count <= 1) {
26
29
  return null;
27
30
  }
28
31
 
@@ -30,15 +33,9 @@ export function build_tree_wind_rig(skin_info, wind_config = new TreeWindConfig(
30
33
  rig.name = "foliage_wind";
31
34
  rig.root = 0; // SceneNode 0 is the tree root in SceneBundle
32
35
 
33
- const r0 = (skin_info.joint_radii && skin_info.joint_radii.length > 0)
34
- ? Math.max(0.02, skin_info.joint_radii[0])
35
- : 0.25;
36
-
37
- const start_joint = skin_info.joint_count === 1 ? 0 : 1;
38
-
39
36
  // Count how many driven joints share the same structural level along each joint's ancestor chain
40
- // so serial chains of joints on the same trunk/bough divide the total branch deflection cleanly.
41
- const same_level_chain_count = new Uint8Array(skin_info.joint_count);
37
+ // so serial chains of joints on the same trunk/bough divide the total bend saturation cleanly.
38
+ const same_level_chain_count = new Uint16Array(skin_info.joint_count);
42
39
  for (let j = 0; j < skin_info.joint_count; j++) {
43
40
  const lvl = skin_info.joint_levels[j];
44
41
  let count = 0;
@@ -52,13 +49,9 @@ export function build_tree_wind_rig(skin_info, wind_config = new TreeWindConfig(
52
49
  same_level_chain_count[j] = Math.max(1, count);
53
50
  }
54
51
 
55
- for (let j = start_joint; j < skin_info.joint_count; j++) {
52
+ for (let j = 1; j < skin_info.joint_count; j++) {
56
53
  const level = skin_info.joint_levels[j];
57
- const t_norm = j === 0 ? 0.5 : skin_info.joint_t_norms[j];
58
54
  const phase = skin_info.joint_phases[j] * PI2;
59
- const r_j = (skin_info.joint_radii && j < skin_info.joint_radii.length)
60
- ? Math.max(0.005, skin_info.joint_radii[j])
61
- : r0 * Math.pow(0.5, level);
62
55
 
63
56
  let tx = skin_info.joint_tangents[j * 3];
64
57
  let ty = skin_info.joint_tangents[j * 3 + 1];
@@ -75,21 +68,10 @@ export function build_tree_wind_rig(skin_info, wind_config = new TreeWindConfig(
75
68
  }
76
69
 
77
70
  const chain_div = Math.max(1, same_level_chain_count[j]);
78
- const base_comp = level === 0
79
- ? cfg.trunk_compliance * 0.18
80
- : cfg.branch_compliance * 0.24 * (1.0 + 0.35 * (level - 1));
81
- const radius_factor = level === 0
82
- ? clamp(Math.pow(r0 / Math.max(r_j, 0.25 * r0), 0.35), 0.6, 1.6)
83
- : clamp(Math.pow(r0 / Math.max(r_j, 0.08 * r0), 0.45), 0.8, 3.2);
84
- const compliance = (base_comp * radius_factor * clamp(0.35 + 0.65 * t_norm, 0.3, 1.15)) / chain_div;
85
-
86
- const natural_frequency = cfg.natural_frequency * (1.0 + 0.65 * level + 0.35 * t_norm);
71
+ const compliance = skin_info.joint_compliance[j];
72
+ const natural_frequency = skin_info.joint_natural_frequency[j];
87
73
  const damping_ratio = clamp(cfg.damping_ratio * (1.0 + 0.12 * level), 0.05, 1.5);
88
- const max_angle = clamp(
89
- (cfg.max_bend_angle * (level === 0 ? 0.18 : (0.42 + 0.18 * Math.min(level, 2)))) / chain_div,
90
- 0.02,
91
- 0.85
92
- );
74
+ const max_angle = clamp(tree_wind_bend_limit(cfg.max_bend_angle, level) / chain_div, 0.02, 0.85);
93
75
  const turbulence = clamp(cfg.turbulence * (level === 0 ? 0.35 : (0.65 + 0.35 * Math.min(level, 2))), 0.0, 1.0);
94
76
 
95
77
  rig.joints.push(FoliageWindJoint.from({
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Bend (radians) that the wind joints on one branch can show between them: `chunk_foliage_wind_step` soft-saturates
3
+ * each joint's deflection `theta` to `theta * m / (m + theta)`, and `build_tree_wind_rig` gives every joint of a
4
+ * serial chain of `n` joints `m = limit / n`, so a branch bent by `theta` in total shows `theta * limit / (limit + theta)`
5
+ * however many joints share it equally.
6
+ *
7
+ * @param {number} max_bend_angle `TreeWindConfig.max_bend_angle`
8
+ * @param {number} level branching level of the branch, 0 for the trunk
9
+ * @returns {number}
10
+ */
11
+ export function tree_wind_bend_limit(max_bend_angle: number, level: number): number;
12
+ //# sourceMappingURL=tree_wind_bend_limit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree_wind_bend_limit.d.ts","sourceRoot":"","sources":["../../../../../src/generation/foliage/animation/tree_wind_bend_limit.js"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,qDAJW,MAAM,SACN,MAAM,GACJ,MAAM,CAIlB"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Bend (radians) that the wind joints on one branch can show between them: `chunk_foliage_wind_step` soft-saturates
3
+ * each joint's deflection `theta` to `theta * m / (m + theta)`, and `build_tree_wind_rig` gives every joint of a
4
+ * serial chain of `n` joints `m = limit / n`, so a branch bent by `theta` in total shows `theta * limit / (limit + theta)`
5
+ * however many joints share it equally.
6
+ *
7
+ * @param {number} max_bend_angle `TreeWindConfig.max_bend_angle`
8
+ * @param {number} level branching level of the branch, 0 for the trunk
9
+ * @returns {number}
10
+ */
11
+ export function tree_wind_bend_limit(max_bend_angle, level) {
12
+ return max_bend_angle * (level === 0 ? 0.18 : (0.42 + 0.18 * Math.min(level, 2)));
13
+ }
@@ -42,6 +42,11 @@ export class TreeAsset {
42
42
  * @type {import("../../../shade/renderer/material/StandardShadeMaterial.js").StandardShadeMaterial}
43
43
  */
44
44
  foliage_material: import("../../../shade/renderer/material/StandardShadeMaterial.js").StandardShadeMaterial;
45
+ /**
46
+ * Shape of the synthesized foliage atlas (hull per tile, leaf coverage), or `null` with a caller's own foliage material.
47
+ * @type {import("../material/FoliageAtlasCutout.js").FoliageAtlasCutout|null}
48
+ */
49
+ foliage_cutout: import("../material/FoliageAtlasCutout.js").FoliageAtlasCutout | null;
45
50
  /**
46
51
  * Progressive LOD asset chain (`lods[0]` = highest detail).
47
52
  * @type {import("./TreeLODAsset.js").TreeLODAsset[]}
@@ -1 +1 @@
1
- {"version":3,"file":"TreeAsset.d.ts","sourceRoot":"","sources":["../../../../../src/generation/foliage/asset/TreeAsset.js"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH;IACI;;;OAGG;IACH,QAFU,OAAO,gCAAgC,EAAE,iBAAiB,CAEtD;IAEd;;;OAGG;IACH,UAFU,OAAO,6BAA6B,EAAE,YAAY,CAE5C;IAEhB;;;OAGG;IACH,aAFU,OAAO,wCAAwC,EAAE,oBAAoB,CAE5D;IAEnB;;;OAGG;IACH,WAFU,6GAAsG,CAE/F;IAEjB;;;OAGG;IACH,UAFU,OAAO,6DAA6D,EAAE,cAAc,GAAC,IAAI,CAEnF;IAEhB;;;OAGG;IACH,eAFU,OAAO,2DAA2D,EAAE,qBAAqB,CAE9E;IAErB;;;OAGG;IACH,kBAFU,OAAO,2DAA2D,EAAE,qBAAqB,CAE3E;IAExB;;;OAGG;IACH,MAFU,OAAO,mBAAmB,EAAE,YAAY,EAAE,CAE1C;IAEV;;;OAGG;IACH,qFAEC;IAED;;;OAGG;IACH,wFAEC;IAED;;;OAGG;IACH,2GAEC;IAED;;;OAGG;IACH,8GAEC;IAED;;;OAGG;IACH,wFAEC;IAED;;;OAGG;IACH,0EAEC;IAGL;;;OAGG;IACH,sBAFU,OAAO,CAEc;CAN9B"}
1
+ {"version":3,"file":"TreeAsset.d.ts","sourceRoot":"","sources":["../../../../../src/generation/foliage/asset/TreeAsset.js"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH;IACI;;;OAGG;IACH,QAFU,OAAO,gCAAgC,EAAE,iBAAiB,CAEtD;IAEd;;;OAGG;IACH,UAFU,OAAO,6BAA6B,EAAE,YAAY,CAE5C;IAEhB;;;OAGG;IACH,aAFU,OAAO,wCAAwC,EAAE,oBAAoB,CAE5D;IAEnB;;;OAGG;IACH,WAFU,6GAAsG,CAE/F;IAEjB;;;OAGG;IACH,UAFU,OAAO,6DAA6D,EAAE,cAAc,GAAC,IAAI,CAEnF;IAEhB;;;OAGG;IACH,eAFU,OAAO,2DAA2D,EAAE,qBAAqB,CAE9E;IAErB;;;OAGG;IACH,kBAFU,OAAO,2DAA2D,EAAE,qBAAqB,CAE3E;IAExB;;;OAGG;IACH,gBAFU,OAAO,mCAAmC,EAAE,kBAAkB,GAAC,IAAI,CAEvD;IAEtB;;;OAGG;IACH,MAFU,OAAO,mBAAmB,EAAE,YAAY,EAAE,CAE1C;IAEV;;;OAGG;IACH,qFAEC;IAED;;;OAGG;IACH,wFAEC;IAED;;;OAGG;IACH,2GAEC;IAED;;;OAGG;IACH,8GAEC;IAED;;;OAGG;IACH,wFAEC;IAED;;;OAGG;IACH,0EAEC;IAGL;;;OAGG;IACH,sBAFU,OAAO,CAEc;CAN9B"}
@@ -49,6 +49,12 @@ export class TreeAsset {
49
49
  */
50
50
  foliage_material = null;
51
51
 
52
+ /**
53
+ * Shape of the synthesized foliage atlas (hull per tile, leaf coverage), or `null` with a caller's own foliage material.
54
+ * @type {import("../material/FoliageAtlasCutout.js").FoliageAtlasCutout|null}
55
+ */
56
+ foliage_cutout = null;
57
+
52
58
  /**
53
59
  * Progressive LOD asset chain (`lods[0]` = highest detail).
54
60
  * @type {import("./TreeLODAsset.js").TreeLODAsset[]}
@@ -1 +1 @@
1
- {"version":3,"file":"generate_tree.d.ts","sourceRoot":"","sources":["../../../../../src/generation/foliage/asset/generate_tree.js"],"names":[],"mappings":"AAaA;;;;;;;;;;;GAWG;AACH,wCAHW,MAAM,GAAC,OAAO,gCAAgC,EAAE,iBAAiB,MAAO,GACtE,SAAS,CAqErB;0BAlFyB,gBAAgB"}
1
+ {"version":3,"file":"generate_tree.d.ts","sourceRoot":"","sources":["../../../../../src/generation/foliage/asset/generate_tree.js"],"names":[],"mappings":"AAcA;;;;;;;;;;;GAWG;AACH,wCAHW,MAAM,GAAC,OAAO,gCAAgC,EAAE,iBAAiB,MAAO,GACtE,SAAS,CAqFrB;0BAlGyB,gBAAgB"}
@@ -1,5 +1,6 @@
1
1
  import { build_tree_wind_rig } from "../animation/build_tree_wind_rig.js";
2
2
  import { TreePreset } from "../config/TreePreset.js";
3
+ import { FoliageAtlasCutout } from "../material/FoliageAtlasCutout.js";
3
4
  import { make_bark_material } from "../material/make_bark_material.js";
4
5
  import { make_foliage_material } from "../material/make_foliage_material.js";
5
6
  import { foliage_collect_attachments } from "../mesh/foliage_collect_attachments.js";
@@ -47,17 +48,32 @@ export function generate_tree(options = {}) {
47
48
  }
48
49
 
49
50
  const skeleton = tree_skeleton_grow(config);
50
- const skin_info = tree_skeleton_assign_skin_joints(skeleton, config.wind.max_joints);
51
+ const skin_info = tree_skeleton_assign_skin_joints(skeleton, config);
51
52
  const wind_rig = config.wind.enabled ? build_tree_wind_rig(skin_info, config.wind) : null;
52
- const attachments = foliage_collect_attachments(skeleton, config);
53
53
 
54
54
  const bark_material = custom_bark_material !== null
55
55
  ? custom_bark_material
56
56
  : make_bark_material(config.bark_material, config.seed);
57
57
 
58
- const foliage_material = custom_foliage_material !== null
59
- ? custom_foliage_material
60
- : (config.foliage.enabled ? make_foliage_material(config.foliage_material, config.seed) : null);
58
+ // The atlas's shape sets how many cards a shoot carries and, for hull cards, their outline. A caller's own
59
+ // material has no fitted outline, so its cards cover whole tiles, at the density our atlas would need.
60
+ let foliage_material = null;
61
+ let foliage_cutout = null;
62
+ if (custom_foliage_material !== null) {
63
+ foliage_material = custom_foliage_material;
64
+ } else if (config.foliage_rules.length > 0) {
65
+ foliage_cutout = new FoliageAtlasCutout();
66
+ foliage_material = make_foliage_material(config, foliage_cutout);
67
+ }
68
+ const attachments = foliage_collect_attachments(skeleton, config, foliage_cutout ?? undefined);
69
+ if (foliage_cutout !== null) {
70
+ // Card tints can brighten as well as darken; the unorm8 vertex colours carry tint / tint_scale and our
71
+ // material multiplies tint_scale back in
72
+ foliage_material.diffuse_color.setRGB(attachments.tint_scale, attachments.tint_scale, attachments.tint_scale);
73
+ } else {
74
+ // a caller's own material knows nothing of the scale: tints stay clamped to 1, darkening only
75
+ attachments.tint_scale = 1.0;
76
+ }
61
77
 
62
78
  const asset = new TreeAsset();
63
79
  asset.config = config;
@@ -67,6 +83,7 @@ export function generate_tree(options = {}) {
67
83
  asset.wind_rig = wind_rig;
68
84
  asset.bark_material = bark_material;
69
85
  asset.foliage_material = foliage_material;
86
+ asset.foliage_cutout = foliage_cutout;
70
87
 
71
88
  for (let i = 0; i < config.lods.length; i++) {
72
89
  const lod_cfg = config.lods[i];
@@ -75,7 +92,7 @@ export function generate_tree(options = {}) {
75
92
  lod_asset.name = config.name || "tree";
76
93
  lod_asset.configure_lazy_geometries(
77
94
  () => tree_mesh_build_bark(skeleton, config, lod_cfg),
78
- () => tree_mesh_build_foliage(skeleton, attachments, config, lod_cfg)
95
+ () => tree_mesh_build_foliage(skeleton, attachments, config, lod_cfg, foliage_cutout)
79
96
  );
80
97
  lod_asset.bark_material = bark_material;
81
98
  lod_asset.foliage_material = foliage_material;