@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
@@ -155,11 +155,24 @@ export class TreeSkeleton {
155
155
  branch_tip_vertex = new Int32Array(INITIAL_BRANCH_CAPACITY);
156
156
 
157
157
  /**
158
- * Recursion level of each branch (0 = trunk).
158
+ * Branching depth of each branch (0 = trunk, parent depth + 1 for a lateral, parent depth for a split fork).
159
159
  * @type {Uint8Array}
160
160
  */
161
161
  branch_level = new Uint8Array(INITIAL_BRANCH_CAPACITY);
162
162
 
163
+ /**
164
+ * Index into `TreeSpeciesConfig.branches` of the generator that grew each branch.
165
+ * @type {Uint16Array}
166
+ */
167
+ branch_generator = new Uint16Array(INITIAL_BRANCH_CAPACITY);
168
+
169
+ /**
170
+ * `1` for a dead branch: a self-pruned stub, shaded out below the crown, that grows nothing, carries no leaves
171
+ * and conducts no sap.
172
+ * @type {Uint8Array}
173
+ */
174
+ branch_dead = new Uint8Array(INITIAL_BRANCH_CAPACITY);
175
+
163
176
  /**
164
177
  * Parent branch ID (-1 for trunk).
165
178
  * @type {Int32Array}
@@ -196,6 +209,52 @@ export class TreeSkeleton {
196
209
  */
197
210
  branch_phase_hash = new Float32Array(INITIAL_BRANCH_CAPACITY);
198
211
 
212
+ /**
213
+ * Annual extension units recorded for each branch grown by them (`tree_skeleton_grow_shoots`): branch `b`'s
214
+ * units start at `unit_start_t[branch_unit_offset[b] + k]` for `k < branch_unit_count[b]`, as `t_norm` along
215
+ * it, oldest first, the last being this year's. A branch with no record has a count of 0. See
216
+ * {@link branch_unit_start_t}.
217
+ * @type {Uint32Array}
218
+ */
219
+ branch_unit_offset = new Uint32Array(INITIAL_BRANCH_CAPACITY);
220
+
221
+ /**
222
+ * Annual extension units recorded for each branch, see {@link branch_unit_offset}.
223
+ * @type {Uint16Array}
224
+ */
225
+ branch_unit_count = new Uint16Array(INITIAL_BRANCH_CAPACITY);
226
+
227
+ /**
228
+ * Where each recorded annual extension unit starts, as `t_norm` along its branch, see {@link branch_unit_offset}.
229
+ * @type {Float32Array}
230
+ */
231
+ unit_start_t = new Float32Array(256);
232
+
233
+ /**
234
+ * Entries of {@link unit_start_t} in use.
235
+ * @type {number}
236
+ */
237
+ unit_count = 0;
238
+
239
+ /**
240
+ * Wind joints bound to the nodes (`attr_node_joint`), written by `tree_skeleton_assign_skin_joints`; 0 until then.
241
+ * @type {number}
242
+ */
243
+ joint_count = 0;
244
+
245
+ /**
246
+ * Node each wind joint pivots at, see {@link joint_count}.
247
+ * @type {Int32Array}
248
+ */
249
+ joint_vertex = new Int32Array(16);
250
+
251
+ /**
252
+ * How far (rad) each wind joint turns the wood it carries in the reference wind, as the joints were placed for it,
253
+ * see {@link joint_count}.
254
+ * @type {Float32Array}
255
+ */
256
+ joint_rotation = new Float32Array(16);
257
+
199
258
  /**
200
259
  * Crown center `[cx, cy, cz]` in tree local space (Y-up).
201
260
  * @type {Float32Array}
@@ -208,6 +267,25 @@ export class TreeSkeleton {
208
267
  */
209
268
  crown_radii = new Float32Array([4.5, 5.0, 4.5]);
210
269
 
270
+ /**
271
+ * Number of branch scars: healed-over sites where a shed branch once grew.
272
+ * @type {number}
273
+ */
274
+ scar_count = 0;
275
+
276
+ /**
277
+ * Branch carrying each scar.
278
+ * @type {Int32Array}
279
+ */
280
+ scar_branch = new Int32Array(16);
281
+
282
+ /**
283
+ * Float32x5 per scar: `[t, dir_x, dir_y, dir_z, radius]`, the normalized position along its branch, the unit
284
+ * direction the shed branch grew in, and that branch's radius when it died.
285
+ * @type {Float32Array}
286
+ */
287
+ scar_data = new Float32Array(16 * 5);
288
+
211
289
  constructor() {
212
290
  this.attr_node_branch_info.count = 0;
213
291
  this.attr_node_spine_param.count = 0;
@@ -233,6 +311,97 @@ export class TreeSkeleton {
233
311
  this.attr_segment_hermite_m0.count = 0;
234
312
  this.attr_segment_hermite_m1.count = 0;
235
313
  this.attr_segment_metrics.count = 0;
314
+ this.scar_count = 0;
315
+ this.unit_count = 0;
316
+ this.joint_count = 0;
317
+ }
318
+
319
+ /**
320
+ * Records the wind joints bound to the nodes: where each pivots and how far it turns in the reference wind.
321
+ *
322
+ * @param {ArrayLike<number>} vertices node of each joint
323
+ * @param {ArrayLike<number>} rotations rad, per joint
324
+ */
325
+ set_joints(vertices, rotations) {
326
+ const n = vertices.length;
327
+ assert.equal(rotations.length, n, 'rotations.length');
328
+ if (n > this.joint_vertex.length) {
329
+ this.joint_vertex = new Int32Array(n);
330
+ this.joint_rotation = new Float32Array(n);
331
+ }
332
+ this.joint_vertex.set(vertices);
333
+ this.joint_rotation.set(rotations);
334
+ this.joint_count = n;
335
+ }
336
+
337
+ /**
338
+ * Records where each annual extension unit of `branch` starts, as `t_norm` along it, oldest first, the last being
339
+ * this year's. Replaces any record `branch` had (the old one stays allocated).
340
+ *
341
+ * @param {number} branch
342
+ * @param {ArrayLike<number>} starts
343
+ */
344
+ set_branch_units(branch, starts) {
345
+ const n = starts.length;
346
+ assert.lessThanOrEqual(n, 0xFFFF, 'starts.length');
347
+ const offset = this.unit_count;
348
+ if (offset + n > this.unit_start_t.length) {
349
+ const grown = new Float32Array(Math.max(this.unit_start_t.length * 2, offset + n));
350
+ grown.set(this.unit_start_t);
351
+ this.unit_start_t = grown;
352
+ }
353
+ for (let k = 0; k < n; k++) {
354
+ this.unit_start_t[offset + k] = starts[k];
355
+ }
356
+ this.unit_count = offset + n;
357
+ this.branch_unit_offset[branch] = offset;
358
+ this.branch_unit_count[branch] = n;
359
+ }
360
+
361
+ /**
362
+ * Where the recorded annual unit of `branch` that grew `age` years ago starts, as `t_norm` along it: `age` 0 is
363
+ * this year's. The unit ends where the one a year younger starts, or at the tip.
364
+ *
365
+ * @param {number} branch
366
+ * @param {number} age `[0, branch_unit_count[branch])`
367
+ * @returns {number}
368
+ */
369
+ branch_unit_start_t(branch, age) {
370
+ const n = this.branch_unit_count[branch];
371
+ assert.lessThan(age, n, 'age');
372
+ return this.unit_start_t[this.branch_unit_offset[branch] + n - 1 - age];
373
+ }
374
+
375
+ /**
376
+ * Records the healed-over site of a shed branch on `branch`.
377
+ *
378
+ * @param {number} branch
379
+ * @param {number} t normalized position along `branch`
380
+ * @param {number} dir_x unit direction the shed branch grew in
381
+ * @param {number} dir_y
382
+ * @param {number} dir_z
383
+ * @param {number} radius the shed branch's radius when it died
384
+ * @returns {number} scar index
385
+ */
386
+ add_scar(branch, t, dir_x, dir_y, dir_z, radius) {
387
+ const id = this.scar_count;
388
+ if (id >= this.scar_branch.length) {
389
+ const branches = new Int32Array(this.scar_branch.length * 2);
390
+ branches.set(this.scar_branch);
391
+ this.scar_branch = branches;
392
+ const data = new Float32Array(this.scar_data.length * 2);
393
+ data.set(this.scar_data);
394
+ this.scar_data = data;
395
+ }
396
+ this.scar_branch[id] = branch;
397
+ const d = id * 5;
398
+ this.scar_data[d] = t;
399
+ this.scar_data[d + 1] = dir_x;
400
+ this.scar_data[d + 2] = dir_y;
401
+ this.scar_data[d + 3] = dir_z;
402
+ this.scar_data[d + 4] = radius;
403
+ this.scar_count = id + 1;
404
+ return id;
236
405
  }
237
406
 
238
407
  /**
@@ -292,6 +461,11 @@ export class TreeSkeleton {
292
461
  arr.set(old);
293
462
  return arr;
294
463
  };
464
+ const grow_u16 = (old) => {
465
+ const arr = new Uint16Array(next_cap);
466
+ arr.set(old);
467
+ return arr;
468
+ };
295
469
  const grow_f32 = (old) => {
296
470
  const arr = new Float32Array(next_cap);
297
471
  arr.set(old);
@@ -301,12 +475,18 @@ export class TreeSkeleton {
301
475
  this.branch_root_vertex = grow_i32(this.branch_root_vertex);
302
476
  this.branch_tip_vertex = grow_i32(this.branch_tip_vertex);
303
477
  this.branch_level = grow_u8(this.branch_level);
478
+ this.branch_generator = grow_u16(this.branch_generator);
479
+ this.branch_dead = grow_u8(this.branch_dead);
304
480
  this.branch_parent = grow_i32(this.branch_parent);
305
481
  this.branch_parent_edge = grow_i32(this.branch_parent_edge);
306
482
  this.branch_parent_attach_t = grow_f32(this.branch_parent_attach_t);
307
483
  this.branch_length = grow_f32(this.branch_length);
308
484
  this.branch_base_radius = grow_f32(this.branch_base_radius);
309
485
  this.branch_phase_hash = grow_f32(this.branch_phase_hash);
486
+ const grown_offset = new Uint32Array(next_cap);
487
+ grown_offset.set(this.branch_unit_offset);
488
+ this.branch_unit_offset = grown_offset;
489
+ this.branch_unit_count = grow_u16(this.branch_unit_count);
310
490
  this.#branch_capacity = next_cap;
311
491
  }
312
492
 
@@ -314,7 +494,8 @@ export class TreeSkeleton {
314
494
  * Registers a new branch in the branch table and returns its `branch_id`.
315
495
  *
316
496
  * @param {number} root_vertex
317
- * @param {number} level
497
+ * @param {number} level branching depth
498
+ * @param {number} generator index into `TreeSpeciesConfig.branches`
318
499
  * @param {number} parent_branch_id
319
500
  * @param {number} parent_edge_id
320
501
  * @param {number} parent_attach_t
@@ -326,6 +507,7 @@ export class TreeSkeleton {
326
507
  add_branch(
327
508
  root_vertex,
328
509
  level,
510
+ generator,
329
511
  parent_branch_id,
330
512
  parent_edge_id,
331
513
  parent_attach_t,
@@ -340,12 +522,15 @@ export class TreeSkeleton {
340
522
  this.branch_root_vertex[id] = root_vertex;
341
523
  this.branch_tip_vertex[id] = root_vertex;
342
524
  this.branch_level[id] = level;
525
+ this.branch_generator[id] = generator;
526
+ this.branch_dead[id] = 0;
343
527
  this.branch_parent[id] = parent_branch_id;
344
528
  this.branch_parent_edge[id] = parent_edge_id;
345
529
  this.branch_parent_attach_t[id] = parent_attach_t;
346
530
  this.branch_length[id] = length;
347
531
  this.branch_base_radius[id] = base_radius;
348
532
  this.branch_phase_hash[id] = phase_hash;
533
+ this.branch_unit_count[id] = 0;
349
534
 
350
535
  return id;
351
536
  }
@@ -859,14 +1044,13 @@ export class TreeSkeleton {
859
1044
  }
860
1045
 
861
1046
  /**
862
- * Evaluates the 3D position along Cubic Hermite segment `edge_id` at parameter `u` in `[0, 1]`.
863
- *
864
1047
  * @param {number[]|Float32Array} out
865
1048
  * @param {number} out_offset
866
1049
  * @param {number} edge_id
867
1050
  * @param {number} u
1051
+ * @param {(t: number, p0: number, p1: number, m0: number, m1: number) => number} eval_fn
868
1052
  */
869
- evaluate_segment_position(out, out_offset, edge_id, u) {
1053
+ #evaluate_segment_hermite(out, out_offset, edge_id, u, eval_fn) {
870
1054
  const endpoints = /** @type {Int32Array} */ (this.attr_segment_endpoints.data);
871
1055
  const v0 = endpoints[edge_id * 2];
872
1056
  const v1 = endpoints[edge_id * 2 + 1];
@@ -877,21 +1061,21 @@ export class TreeSkeleton {
877
1061
  const m1 = /** @type {Float32Array} */ (this.attr_segment_hermite_m1.data);
878
1062
  const e3 = edge_id * 3;
879
1063
 
880
- out[out_offset] = spline3_hermite(
1064
+ out[out_offset] = eval_fn(
881
1065
  u,
882
1066
  t0[TRANSFORM64_TRANSLATION_OFFSET],
883
1067
  t1[TRANSFORM64_TRANSLATION_OFFSET],
884
1068
  m0[e3],
885
1069
  m1[e3]
886
1070
  );
887
- out[out_offset + 1] = spline3_hermite(
1071
+ out[out_offset + 1] = eval_fn(
888
1072
  u,
889
1073
  t0[TRANSFORM64_TRANSLATION_OFFSET + 1],
890
1074
  t1[TRANSFORM64_TRANSLATION_OFFSET + 1],
891
1075
  m0[e3 + 1],
892
1076
  m1[e3 + 1]
893
1077
  );
894
- out[out_offset + 2] = spline3_hermite(
1078
+ out[out_offset + 2] = eval_fn(
895
1079
  u,
896
1080
  t0[TRANSFORM64_TRANSLATION_OFFSET + 2],
897
1081
  t1[TRANSFORM64_TRANSLATION_OFFSET + 2],
@@ -900,6 +1084,18 @@ export class TreeSkeleton {
900
1084
  );
901
1085
  }
902
1086
 
1087
+ /**
1088
+ * Evaluates the 3D position along Cubic Hermite segment `edge_id` at parameter `u` in `[0, 1]`.
1089
+ *
1090
+ * @param {number[]|Float32Array} out
1091
+ * @param {number} out_offset
1092
+ * @param {number} edge_id
1093
+ * @param {number} u
1094
+ */
1095
+ evaluate_segment_position(out, out_offset, edge_id, u) {
1096
+ this.#evaluate_segment_hermite(out, out_offset, edge_id, u, spline3_hermite);
1097
+ }
1098
+
903
1099
  /**
904
1100
  * Evaluates the unnormalized 3D derivative along Cubic Hermite segment `edge_id` at parameter `u` in `[0, 1]`.
905
1101
  *
@@ -909,37 +1105,7 @@ export class TreeSkeleton {
909
1105
  * @param {number} u
910
1106
  */
911
1107
  evaluate_segment_derivative(out, out_offset, edge_id, u) {
912
- const endpoints = /** @type {Int32Array} */ (this.attr_segment_endpoints.data);
913
- const v0 = endpoints[edge_id * 2];
914
- const v1 = endpoints[edge_id * 2 + 1];
915
-
916
- const t0 = this.node_transforms[v0];
917
- const t1 = this.node_transforms[v1];
918
- const m0 = /** @type {Float32Array} */ (this.attr_segment_hermite_m0.data);
919
- const m1 = /** @type {Float32Array} */ (this.attr_segment_hermite_m1.data);
920
- const e3 = edge_id * 3;
921
-
922
- out[out_offset] = spline3_hermite_derivative(
923
- u,
924
- t0[TRANSFORM64_TRANSLATION_OFFSET],
925
- t1[TRANSFORM64_TRANSLATION_OFFSET],
926
- m0[e3],
927
- m1[e3]
928
- );
929
- out[out_offset + 1] = spline3_hermite_derivative(
930
- u,
931
- t0[TRANSFORM64_TRANSLATION_OFFSET + 1],
932
- t1[TRANSFORM64_TRANSLATION_OFFSET + 1],
933
- m0[e3 + 1],
934
- m1[e3 + 1]
935
- );
936
- out[out_offset + 2] = spline3_hermite_derivative(
937
- u,
938
- t0[TRANSFORM64_TRANSLATION_OFFSET + 2],
939
- t1[TRANSFORM64_TRANSLATION_OFFSET + 2],
940
- m0[e3 + 2],
941
- m1[e3 + 2]
942
- );
1108
+ this.#evaluate_segment_hermite(out, out_offset, edge_id, u, spline3_hermite_derivative);
943
1109
  }
944
1110
 
945
1111
  /**
@@ -1069,15 +1235,27 @@ export class TreeSkeleton {
1069
1235
  this.branch_root_vertex[i] = other.branch_root_vertex[i];
1070
1236
  this.branch_tip_vertex[i] = other.branch_tip_vertex[i];
1071
1237
  this.branch_level[i] = other.branch_level[i];
1238
+ this.branch_generator[i] = other.branch_generator[i];
1239
+ this.branch_dead[i] = other.branch_dead[i];
1072
1240
  this.branch_parent[i] = other.branch_parent[i];
1073
1241
  this.branch_parent_edge[i] = other.branch_parent_edge[i];
1074
1242
  this.branch_parent_attach_t[i] = other.branch_parent_attach_t[i];
1075
1243
  this.branch_length[i] = other.branch_length[i];
1076
1244
  this.branch_base_radius[i] = other.branch_base_radius[i];
1077
1245
  this.branch_phase_hash[i] = other.branch_phase_hash[i];
1246
+ this.branch_unit_offset[i] = other.branch_unit_offset[i];
1247
+ this.branch_unit_count[i] = other.branch_unit_count[i];
1078
1248
  }
1079
1249
 
1080
1250
  this.crown_center.set(other.crown_center);
1251
+ this.scar_count = other.scar_count;
1252
+ this.unit_count = other.unit_count;
1253
+ this.unit_start_t = other.unit_start_t.slice();
1254
+ this.joint_count = other.joint_count;
1255
+ this.joint_vertex = other.joint_vertex.slice();
1256
+ this.joint_rotation = other.joint_rotation.slice();
1257
+ this.scar_branch = other.scar_branch.slice();
1258
+ this.scar_data = other.scar_data.slice();
1081
1259
  this.crown_radii.set(other.crown_radii);
1082
1260
 
1083
1261
  return this;
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Angular offset of a branch's basal flare lobes and flutes at arc length `arc_s`: the lobe pattern around
3
+ * the cross-section is a function of `theta + flare_lobe_phase_offset(arc_s, phase_hash)`, so its crests sit at
4
+ * `theta = 2 * pi * k / flare_lobes - flare_lobe_phase_offset(arc_s, phase_hash)`.
5
+ *
6
+ * Shared by the bark mesher (which shapes the lobes) and the skeleton grower (which plants roots on their crests).
7
+ *
8
+ * @param {number} arc_s arc length along the branch (meters)
9
+ * @param {number} phase_hash per-branch random phase in [0, 1)
10
+ * @returns {number} radians
11
+ */
12
+ export function flare_lobe_phase_offset(arc_s: number, phase_hash: number): number;
13
+ //# sourceMappingURL=flare_lobe_phase_offset.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flare_lobe_phase_offset.d.ts","sourceRoot":"","sources":["../../../../../src/generation/foliage/skeleton/flare_lobe_phase_offset.js"],"names":[],"mappings":"AAEA;;;;;;;;;;GAUG;AACH,+CAJW,MAAM,cACN,MAAM,GACJ,MAAM,CAIlB"}
@@ -0,0 +1,16 @@
1
+ import { PI2 } from "../../../core/math/PI2.js";
2
+
3
+ /**
4
+ * Angular offset of a branch's basal flare lobes and flutes at arc length `arc_s`: the lobe pattern around
5
+ * the cross-section is a function of `theta + flare_lobe_phase_offset(arc_s, phase_hash)`, so its crests sit at
6
+ * `theta = 2 * pi * k / flare_lobes - flare_lobe_phase_offset(arc_s, phase_hash)`.
7
+ *
8
+ * Shared by the bark mesher (which shapes the lobes) and the skeleton grower (which plants roots on their crests).
9
+ *
10
+ * @param {number} arc_s arc length along the branch (meters)
11
+ * @param {number} phase_hash per-branch random phase in [0, 1)
12
+ * @returns {number} radians
13
+ */
14
+ export function flare_lobe_phase_offset(arc_s, phase_hash) {
15
+ return 0.32 * arc_s + phase_hash * PI2;
16
+ }
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Planes one card of `card_type` stands up: a cross card is two tiles, a tri-star three.
3
+ *
4
+ * @param {FoliageCardType|number} card_type
5
+ * @returns {number}
6
+ */
7
+ export function foliage_card_plane_count(card_type: FoliageCardType | number): number;
8
+ /**
9
+ * Where a carrier's leafy span starts, normalized along it: the rule's `attach_min`, honoured up to 0.92 so every
10
+ * carrier keeps a stretch to hang its cards on. The cards and the wind sail both start here.
11
+ *
12
+ * @param {number} attach_min
13
+ * @returns {number}
14
+ */
15
+ export function foliage_leafy_span_start(attach_min: number): number;
16
+ /**
17
+ * Size of the cards a shoot of `shoot_length` carries, relative to the species' card: a shoot shorter than a card
18
+ * carries cards about as long as itself (`shoot_length / 0.95`), never smaller than 0.22 of the species' card.
19
+ *
20
+ * @param {number} card_size the species' card (m), `foliage_tile_layout`
21
+ * @param {number} shoot_length
22
+ * @returns {number}
23
+ */
24
+ export function foliage_shoot_card_scale(card_size: number, shoot_length: number): number;
25
+ /**
26
+ * How far a card reaches from the shoot it hangs on (m): its tile from the anchor up.
27
+ *
28
+ * @param {import("../material/foliage_tile.js").FoliageTileLayout} layout
29
+ * @param {number} card_scale
30
+ * @returns {number}
31
+ */
32
+ export function foliage_card_reach(layout: import("../material/foliage_tile.js").FoliageTileLayout, card_scale: number): number;
33
+ /**
34
+ * One-sided leaf area one card holds: its tile, at the species' scale, times the atlas's leaf coverage, for every
35
+ * plane it stands up.
36
+ *
37
+ * @param {import("../material/foliage_tile.js").FoliageTileLayout} layout
38
+ * @param {FoliageCardType|number} card_type
39
+ * @param {number} coverage leaf fraction of an atlas tile, `FoliageAtlasCutout.mean_coverage()`
40
+ * @param {number} card_scale
41
+ * @returns {number} m^2
42
+ */
43
+ export function foliage_card_leaf_area(layout: import("../material/foliage_tile.js").FoliageTileLayout, card_type: FoliageCardType | number, coverage: number, card_scale: number): number;
44
+ /**
45
+ * One-sided leaf area per metre of a carrier's leafy span.
46
+ *
47
+ * Cards leave the shoot at `insertion_angle` and reach `reach` from it, so the shoot wears a sleeve of foliage of
48
+ * radius `R = reach sin(insertion_angle)`. The carrier holds just enough leaf that every line of sight through that
49
+ * sleeve meets one leaf on average: by Cauchy's formula the sleeve's mean projected area is a quarter of its surface
50
+ * `2 pi R` per metre, a flat leaf's is half its area, so the leaf area is `pi R` per metre. Leaf beyond that is
51
+ * overdraw; less leaves the shoot see-through.
52
+ *
53
+ * @param {number} reach m, `foliage_card_reach`
54
+ * @param {number} insertion_angle radians from the shoot's tangent
55
+ * @returns {number} m^2 per m
56
+ */
57
+ export function foliage_leaf_area_per_metre(reach: number, insertion_angle: number): number;
58
+ /**
59
+ * Cards per metre of a carrier's leafy span that carry {@link foliage_leaf_area_per_metre} of leaf: each card
60
+ * holds the atlas's leaf coverage of every plane it stands up.
61
+ *
62
+ * @param {import("../material/foliage_tile.js").FoliageTileLayout} layout
63
+ * @param {FoliageCardType|number} card_type
64
+ * @param {number} coverage leaf fraction of an atlas tile, `FoliageAtlasCutout.mean_coverage()`
65
+ * @param {number} insertion_angle
66
+ * @param {number} card_scale
67
+ * @returns {number}
68
+ */
69
+ export function foliage_cards_per_metre(layout: import("../material/foliage_tile.js").FoliageTileLayout, card_type: FoliageCardType | number, coverage: number, insertion_angle: number, card_scale: number): number;
70
+ import { FoliageCardType } from "../config/FoliageCardType.js";
71
+ //# sourceMappingURL=foliage_card_density.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"foliage_card_density.d.ts","sourceRoot":"","sources":["../../../../../src/generation/foliage/skeleton/foliage_card_density.js"],"names":[],"mappings":"AAGA;;;;;GAKG;AACH,oDAHW,eAAe,GAAC,MAAM,GACpB,MAAM,CAWlB;AAED;;;;;;GAMG;AACH,qDAHW,MAAM,GACJ,MAAM,CAIlB;AAED;;;;;;;GAOG;AACH,oDAJW,MAAM,gBACN,MAAM,GACJ,MAAM,CAIlB;AAED;;;;;;GAMG;AACH,2CAJW,OAAO,6BAA6B,EAAE,iBAAiB,cACvD,MAAM,GACJ,MAAM,CAIlB;AAED;;;;;;;;;GASG;AACH,+CANW,OAAO,6BAA6B,EAAE,iBAAiB,aACvD,eAAe,GAAC,MAAM,YACtB,MAAM,cACN,MAAM,GACJ,MAAM,CAKlB;AAED;;;;;;;;;;;;GAYG;AACH,mDAJW,MAAM,mBACN,MAAM,GACJ,MAAM,CAIlB;AAED;;;;;;;;;;GAUG;AACH,gDAPW,OAAO,6BAA6B,EAAE,iBAAiB,aACvD,eAAe,GAAC,MAAM,YACtB,MAAM,mBACN,MAAM,cACN,MAAM,GACJ,MAAM,CAKlB;gCAnG+B,8BAA8B"}
@@ -0,0 +1,101 @@
1
+ import { clamp } from "../../../core/math/clamp.js";
2
+ import { FoliageCardType } from "../config/FoliageCardType.js";
3
+
4
+ /**
5
+ * Planes one card of `card_type` stands up: a cross card is two tiles, a tri-star three.
6
+ *
7
+ * @param {FoliageCardType|number} card_type
8
+ * @returns {number}
9
+ */
10
+ export function foliage_card_plane_count(card_type) {
11
+ switch (card_type) {
12
+ case FoliageCardType.CrossCard:
13
+ return 2;
14
+ case FoliageCardType.TriStarCluster:
15
+ return 3;
16
+ default:
17
+ return 1;
18
+ }
19
+ }
20
+
21
+ /**
22
+ * Where a carrier's leafy span starts, normalized along it: the rule's `attach_min`, honoured up to 0.92 so every
23
+ * carrier keeps a stretch to hang its cards on. The cards and the wind sail both start here.
24
+ *
25
+ * @param {number} attach_min
26
+ * @returns {number}
27
+ */
28
+ export function foliage_leafy_span_start(attach_min) {
29
+ return clamp(attach_min, 0.0, 0.92);
30
+ }
31
+
32
+ /**
33
+ * Size of the cards a shoot of `shoot_length` carries, relative to the species' card: a shoot shorter than a card
34
+ * carries cards about as long as itself (`shoot_length / 0.95`), never smaller than 0.22 of the species' card.
35
+ *
36
+ * @param {number} card_size the species' card (m), `foliage_tile_layout`
37
+ * @param {number} shoot_length
38
+ * @returns {number}
39
+ */
40
+ export function foliage_shoot_card_scale(card_size, shoot_length) {
41
+ return clamp(shoot_length / (Math.max(0.25, card_size) * 0.95), 0.22, 1.0);
42
+ }
43
+
44
+ /**
45
+ * How far a card reaches from the shoot it hangs on (m): its tile from the anchor up.
46
+ *
47
+ * @param {import("../material/foliage_tile.js").FoliageTileLayout} layout
48
+ * @param {number} card_scale
49
+ * @returns {number}
50
+ */
51
+ export function foliage_card_reach(layout, card_scale) {
52
+ return layout.card_size * (1.0 - layout.anchor_v) * card_scale;
53
+ }
54
+
55
+ /**
56
+ * One-sided leaf area one card holds: its tile, at the species' scale, times the atlas's leaf coverage, for every
57
+ * plane it stands up.
58
+ *
59
+ * @param {import("../material/foliage_tile.js").FoliageTileLayout} layout
60
+ * @param {FoliageCardType|number} card_type
61
+ * @param {number} coverage leaf fraction of an atlas tile, `FoliageAtlasCutout.mean_coverage()`
62
+ * @param {number} card_scale
63
+ * @returns {number} m^2
64
+ */
65
+ export function foliage_card_leaf_area(layout, card_type, coverage, card_scale) {
66
+ const tile_area = layout.card_size * layout.card_size * card_scale * card_scale;
67
+ return tile_area * Math.max(1e-3, coverage) * foliage_card_plane_count(card_type);
68
+ }
69
+
70
+ /**
71
+ * One-sided leaf area per metre of a carrier's leafy span.
72
+ *
73
+ * Cards leave the shoot at `insertion_angle` and reach `reach` from it, so the shoot wears a sleeve of foliage of
74
+ * radius `R = reach sin(insertion_angle)`. The carrier holds just enough leaf that every line of sight through that
75
+ * sleeve meets one leaf on average: by Cauchy's formula the sleeve's mean projected area is a quarter of its surface
76
+ * `2 pi R` per metre, a flat leaf's is half its area, so the leaf area is `pi R` per metre. Leaf beyond that is
77
+ * overdraw; less leaves the shoot see-through.
78
+ *
79
+ * @param {number} reach m, `foliage_card_reach`
80
+ * @param {number} insertion_angle radians from the shoot's tangent
81
+ * @returns {number} m^2 per m
82
+ */
83
+ export function foliage_leaf_area_per_metre(reach, insertion_angle) {
84
+ return Math.PI * reach * Math.abs(Math.sin(insertion_angle));
85
+ }
86
+
87
+ /**
88
+ * Cards per metre of a carrier's leafy span that carry {@link foliage_leaf_area_per_metre} of leaf: each card
89
+ * holds the atlas's leaf coverage of every plane it stands up.
90
+ *
91
+ * @param {import("../material/foliage_tile.js").FoliageTileLayout} layout
92
+ * @param {FoliageCardType|number} card_type
93
+ * @param {number} coverage leaf fraction of an atlas tile, `FoliageAtlasCutout.mean_coverage()`
94
+ * @param {number} insertion_angle
95
+ * @param {number} card_scale
96
+ * @returns {number}
97
+ */
98
+ export function foliage_cards_per_metre(layout, card_type, coverage, insertion_angle, card_scale) {
99
+ return foliage_leaf_area_per_metre(foliage_card_reach(layout, card_scale), insertion_angle)
100
+ / foliage_card_leaf_area(layout, card_type, coverage, card_scale);
101
+ }