@woosh/meep-engine 3.56.0 → 3.57.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (625) hide show
  1. package/build/bundle-worker-terrain.js +1 -1
  2. package/package.json +1 -1
  3. package/src/DUPLICATION_REVIEW_2026_10_24.md +1072 -0
  4. package/src/core/binary/BitSet.js +1 -1
  5. package/src/core/binary/FLOAT16_MAX.d.ts +2 -0
  6. package/src/core/binary/FLOAT16_MAX.d.ts.map +1 -0
  7. package/src/core/binary/FLOAT16_MAX.js +1 -0
  8. package/src/core/binary/base58/base58_encode.js +2 -2
  9. package/src/core/binary/type/TypeBuilder.js +1 -1
  10. package/src/core/bvh2/bvh3/BVH.js +1 -1
  11. package/src/core/bvh2/bvh3/ebvh_optimize_treelet.d.ts.map +1 -1
  12. package/src/core/bvh2/bvh3/ebvh_optimize_treelet.js +7 -3
  13. package/src/core/bvh2/bvh3/ebvh_update_hierarchy_bounds.d.ts.map +1 -1
  14. package/src/core/bvh2/bvh3/ebvh_update_hierarchy_bounds.js +5 -1
  15. package/src/core/bvh2/bvh3/query/compute_tight_near_far_clipping_planes.d.ts.map +1 -1
  16. package/src/core/bvh2/bvh3/query/compute_tight_near_far_clipping_planes.js +195 -246
  17. package/src/core/collection/CuckooFilter.js +1 -1
  18. package/src/core/collection/array/isArrayEqual.d.ts.map +1 -1
  19. package/src/core/collection/array/isArrayEqual.js +33 -58
  20. package/src/core/collection/array/typed/array_buffer_hash.d.ts.map +1 -1
  21. package/src/core/collection/array/typed/array_buffer_hash.js +41 -39
  22. package/src/core/collection/array/typed/float32_array_hash.js +38 -38
  23. package/src/core/collection/array/typed/uint16_array_hash.d.ts +2 -1
  24. package/src/core/collection/array/typed/uint16_array_hash.d.ts.map +1 -1
  25. package/src/core/collection/array/typed/uint16_array_hash.js +30 -29
  26. package/src/core/collection/array/typed/uint32_array_hash.d.ts +2 -1
  27. package/src/core/collection/array/typed/uint32_array_hash.d.ts.map +1 -1
  28. package/src/core/collection/array/typed/uint32_array_hash.js +21 -20
  29. package/src/core/collection/array/typed/uint8_array_hash.d.ts +2 -1
  30. package/src/core/collection/array/typed/uint8_array_hash.d.ts.map +1 -1
  31. package/src/core/collection/array/typed/uint8_array_hash.js +37 -36
  32. package/src/core/collection/array/typed/uint_array_for_count.js +2 -2
  33. package/src/core/collection/list/List.d.ts.map +1 -1
  34. package/src/core/collection/list/List.js +3 -19
  35. package/src/core/collection/table/RowFirstTable.d.ts.map +1 -1
  36. package/src/core/collection/table/RowFirstTable.js +4 -28
  37. package/src/core/debug/matchers/DescribeAs.d.ts.map +1 -1
  38. package/src/core/debug/matchers/DescribeAs.js +62 -64
  39. package/src/core/function/FunctionCompiler.js +4 -4
  40. package/src/core/function/objectsEqual.d.ts.map +1 -1
  41. package/src/core/function/objectsEqual.js +3 -2
  42. package/src/core/geom/2d/bvh/BVH2D.d.ts.map +1 -1
  43. package/src/core/geom/2d/bvh/BVH2D.js +4 -3
  44. package/src/core/geom/2d/convex-hull/convex_hull_fixed_count_2d_relaxation.d.ts +5 -2
  45. package/src/core/geom/2d/convex-hull/convex_hull_fixed_count_2d_relaxation.d.ts.map +1 -1
  46. package/src/core/geom/2d/convex-hull/convex_hull_fixed_count_2d_relaxation.js +49 -11
  47. package/src/core/geom/2d/hash-grid/shg_query_elements_circle.d.ts.map +1 -1
  48. package/src/core/geom/2d/hash-grid/shg_query_elements_circle.js +122 -159
  49. package/src/core/geom/2d/hash-grid/shg_query_elements_line.d.ts.map +1 -1
  50. package/src/core/geom/2d/hash-grid/shg_query_elements_line.js +8 -5
  51. package/src/core/geom/2d/polygon/polygon2_rasterize_coverage.d.ts +18 -0
  52. package/src/core/geom/2d/polygon/polygon2_rasterize_coverage.d.ts.map +1 -0
  53. package/src/core/geom/2d/polygon/polygon2_rasterize_coverage.js +97 -0
  54. package/src/core/geom/2d/r-tree/StaticR2Tree.js +2 -2
  55. package/src/core/geom/2d/triangle/tri2_rasterize_coverage.d.ts +21 -0
  56. package/src/core/geom/2d/triangle/tri2_rasterize_coverage.d.ts.map +1 -0
  57. package/src/core/geom/2d/triangle/tri2_rasterize_coverage.js +54 -0
  58. package/src/core/geom/3d/aabb/aabb3_build_frustum.d.ts.map +1 -1
  59. package/src/core/geom/3d/aabb/aabb3_build_frustum.js +20 -53
  60. package/src/core/geom/3d/aabb/aabb3_score_boxes_SAH.d.ts +1 -1
  61. package/src/core/geom/3d/aabb/aabb3_score_boxes_SAH.d.ts.map +1 -1
  62. package/src/core/geom/3d/aabb/aabb3_score_boxes_SAH.js +11 -42
  63. package/src/core/geom/3d/atlas/pack/atlas_pack_charts.d.ts.map +1 -1
  64. package/src/core/geom/3d/atlas/pack/atlas_pack_charts.js +30 -32
  65. package/src/core/geom/3d/atlas/param/atlas_chart_parameterize_bff.d.ts.map +1 -1
  66. package/src/core/geom/3d/atlas/param/atlas_chart_parameterize_bff.js +1 -5
  67. package/src/core/geom/3d/atlas/param/atlas_chart_parameterize_lscm.d.ts.map +1 -1
  68. package/src/core/geom/3d/atlas/param/atlas_chart_parameterize_lscm.js +1 -15
  69. package/src/core/geom/3d/atlas/segment/atlas_merge_charts.d.ts.map +1 -1
  70. package/src/core/geom/3d/atlas/segment/atlas_merge_charts.js +105 -116
  71. package/src/core/geom/3d/line/line3_compute_segment_point_distance_sqr.d.ts.map +1 -1
  72. package/src/core/geom/3d/line/line3_compute_segment_point_distance_sqr.js +36 -54
  73. package/src/core/geom/3d/plane/plane3_compute_intersection_objects.d.ts +5 -10
  74. package/src/core/geom/3d/plane/plane3_compute_intersection_objects.d.ts.map +1 -1
  75. package/src/core/geom/3d/plane/plane3_compute_intersection_objects.js +20 -82
  76. package/src/core/geom/3d/plane/plane3_slerp.d.ts.map +1 -1
  77. package/src/core/geom/3d/plane/plane3_slerp.js +87 -102
  78. package/src/core/geom/3d/polygon/polygon3_compute_normal.d.ts +12 -0
  79. package/src/core/geom/3d/polygon/polygon3_compute_normal.d.ts.map +1 -1
  80. package/src/core/geom/3d/polygon/polygon3_compute_normal.js +107 -60
  81. package/src/core/geom/3d/ray/ray3_compute_closest_point.d.ts.map +1 -1
  82. package/src/core/geom/3d/ray/ray3_compute_closest_point.js +37 -43
  83. package/src/core/geom/3d/shape/ConvexHullShape3D.d.ts.map +1 -1
  84. package/src/core/geom/3d/shape/ConvexHullShape3D.js +5 -16
  85. package/src/core/geom/3d/shape/MeshShape3D.js +2 -56
  86. package/src/core/geom/3d/shape/TransformedShape3D.d.ts.map +1 -1
  87. package/src/core/geom/3d/shape/TransformedShape3D.js +10 -7
  88. package/src/core/geom/3d/shape/UnionShape3D.d.ts.map +1 -1
  89. package/src/core/geom/3d/shape/UnionShape3D.js +9 -3
  90. package/src/core/geom/3d/shape/json/shape_to_type.js +2 -2
  91. package/src/core/geom/3d/sphere/harmonics/SH3_COEFFICIENTS.js +17 -17
  92. package/src/core/geom/3d/tetrahedra/TetrahedralMesh.d.ts.map +1 -1
  93. package/src/core/geom/3d/tetrahedra/TetrahedralMesh.js +6 -2
  94. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_carve_outside_surface.d.ts.map +1 -1
  95. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_carve_outside_surface.js +3 -2
  96. package/src/core/geom/3d/tetrahedra/tetrahedron_contains_point.d.ts +20 -2
  97. package/src/core/geom/3d/tetrahedra/tetrahedron_contains_point.d.ts.map +1 -1
  98. package/src/core/geom/3d/tetrahedra/tetrahedron_contains_point.js +52 -37
  99. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_face_normals.d.ts.map +1 -1
  100. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_face_normals.js +40 -56
  101. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_vertex_quadrics.d.ts.map +1 -1
  102. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_vertex_quadrics.js +251 -260
  103. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_wedge_attribute_quadrics.d.ts.map +1 -1
  104. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_wedge_attribute_quadrics.js +104 -113
  105. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_resolve_t_junctions.d.ts.map +1 -1
  106. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_resolve_t_junctions.js +227 -238
  107. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_simplify.d.ts.map +1 -1
  108. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_simplify.js +15 -24
  109. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_edge_create.d.ts.map +1 -1
  110. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_edge_create.js +31 -115
  111. package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_vertex_fuse_duplicate_edges.d.ts.map +1 -1
  112. package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_vertex_fuse_duplicate_edges.js +142 -150
  113. package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_vertex_replace.d.ts.map +1 -1
  114. package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_vertex_replace.js +151 -194
  115. package/src/core/geom/3d/topology/struct/binary/query/bt_face_get_incenter.d.ts.map +1 -1
  116. package/src/core/geom/3d/topology/struct/binary/query/bt_face_get_incenter.js +60 -85
  117. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_build_boundary_distance_field.d.ts.map +1 -1
  118. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_build_boundary_distance_field.js +156 -171
  119. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_face_find_path.d.ts.map +1 -1
  120. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_face_find_path.js +8 -44
  121. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_face_find_path_polyanya.d.ts.map +1 -1
  122. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_face_find_path_polyanya.js +2 -7
  123. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_sample_interior_grid_points.d.ts.map +1 -1
  124. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_sample_interior_grid_points.js +3 -2
  125. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_segment_penetrates_surface.d.ts.map +1 -1
  126. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_segment_penetrates_surface.js +128 -133
  127. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_surface_ray_parity.d.ts +8 -14
  128. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_surface_ray_parity.d.ts.map +1 -1
  129. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_surface_ray_parity.js +36 -82
  130. package/src/core/geom/3d/triangle/tri3_ray_intersection.d.ts.map +1 -1
  131. package/src/core/geom/3d/triangle/tri3_ray_intersection.js +7 -144
  132. package/src/core/geom/ConicRay.d.ts.map +1 -1
  133. package/src/core/geom/ConicRay.js +230 -237
  134. package/src/core/localization/LocaleDataset.d.ts +6 -0
  135. package/src/core/localization/LocaleDataset.d.ts.map +1 -1
  136. package/src/core/localization/LocaleDataset.js +48 -37
  137. package/src/core/localization/LocalizationEngine.d.ts.map +1 -1
  138. package/src/core/localization/LocalizationEngine.js +3 -2
  139. package/src/core/math/lookup/ParameterLookupTable.d.ts.map +1 -1
  140. package/src/core/math/lookup/ParameterLookupTable.js +3 -1
  141. package/src/core/math/spline/spline3_hermite_intersection_spline3_hermite_nd.d.ts.map +1 -1
  142. package/src/core/math/spline/spline3_hermite_intersection_spline3_hermite_nd.js +330 -400
  143. package/src/core/math/spline/spline3_hermite_nearest_point.d.ts +16 -0
  144. package/src/core/math/spline/spline3_hermite_nearest_point.d.ts.map +1 -1
  145. package/src/core/math/spline/spline3_hermite_nearest_point.js +134 -167
  146. package/src/core/model/DebouncedObservedBoolean.d.ts +1 -2
  147. package/src/core/model/DebouncedObservedBoolean.d.ts.map +1 -1
  148. package/src/core/model/DebouncedObservedBoolean.js +1 -1
  149. package/src/core/model/node-graph/node/NodeInstance.d.ts.map +1 -1
  150. package/src/core/model/node-graph/node/NodeInstance.js +2 -7
  151. package/src/core/model/node-graph/node/parameter/NodeParameterDescription.js +1 -1
  152. package/src/core/model/object/optional_equality.d.ts +3 -3
  153. package/src/core/model/object/optional_equality.d.ts.map +1 -1
  154. package/src/core/model/object/optional_equality.js +10 -27
  155. package/src/core/model/object/write_property.js +1 -1
  156. package/src/core/model/reactive/evaluation/MultiPredicateEvaluator.js +2 -2
  157. package/src/core/primitives/strings/string_compute_byte_size.d.ts +3 -3
  158. package/src/core/primitives/strings/string_compute_byte_size.d.ts.map +1 -1
  159. package/src/core/primitives/strings/string_compute_byte_size.js +8 -21
  160. package/src/core/process/executor/ConcurrentExecutor.d.ts.map +1 -1
  161. package/src/core/process/executor/ConcurrentExecutor.js +14 -2
  162. package/src/engine/achievements/gateway/StorageAchievementGateway.d.ts +6 -3
  163. package/src/engine/achievements/gateway/StorageAchievementGateway.d.ts.map +1 -1
  164. package/src/engine/achievements/gateway/StorageAchievementGateway.js +31 -75
  165. package/src/engine/asset/loaders/SVGAssetLoader.d.ts.map +1 -1
  166. package/src/engine/asset/loaders/SVGAssetLoader.js +33 -31
  167. package/src/engine/control/first-person/math/criticallyDampedSpring.d.ts.map +1 -1
  168. package/src/engine/control/first-person/math/criticallyDampedSpring.js +3 -14
  169. package/src/engine/ecs/EntityComponentDataset.d.ts.map +1 -1
  170. package/src/engine/ecs/EntityComponentDataset.js +4 -1
  171. package/src/engine/ecs/storage/binary/object/BinaryObjectSerializationAdapter.d.ts +0 -2
  172. package/src/engine/ecs/storage/binary/object/BinaryObjectSerializationAdapter.d.ts.map +1 -1
  173. package/src/engine/ecs/storage/binary/object/BinaryObjectSerializationAdapter.js +3 -3
  174. package/src/engine/ecs/terrain/ecs/layers/TerrainLayer.js +2 -2
  175. package/src/engine/graphics/sh3/path_tracer/geometry/sort_triangles_by_distance_to_point.js +1 -1
  176. package/src/engine/graphics/texture/sampler/sampler2d_channel_compute_min_indices.js +1 -1
  177. package/src/engine/graphics3/WaterSystem.d.ts.map +1 -1
  178. package/src/engine/graphics3/WaterSystem.js +2 -1
  179. package/src/engine/graphics3/prefab/prefab_skin_frame.d.ts.map +1 -1
  180. package/src/engine/graphics3/prefab/prefab_skin_frame.js +1 -12
  181. package/src/engine/grid/grid2transform/GridPosition2TransformSystem.d.ts +1 -1
  182. package/src/engine/grid/grid2transform/GridPosition2TransformSystem.d.ts.map +1 -1
  183. package/src/engine/grid/grid2transform/GridPosition2TransformSystem.js +141 -137
  184. package/src/engine/input/ecs/systems/InputControllerSystem.d.ts.map +1 -1
  185. package/src/engine/input/ecs/systems/InputControllerSystem.js +13 -3
  186. package/src/engine/input/ecs/systems/InputSystem.d.ts.map +1 -1
  187. package/src/engine/input/ecs/systems/InputSystem.js +2 -1
  188. package/src/engine/intelligence/behavior/composite/ParallelBehavior.d.ts +1 -1
  189. package/src/engine/intelligence/behavior/composite/ParallelBehavior.d.ts.map +1 -1
  190. package/src/engine/intelligence/behavior/composite/ParallelBehavior.js +4 -1
  191. package/src/engine/intelligence/behavior/decorator/InvertStatusBehavior.d.ts.map +1 -1
  192. package/src/engine/intelligence/behavior/decorator/InvertStatusBehavior.js +3 -1
  193. package/src/engine/intelligence/behavior/decorator/RepeatBehavior.d.ts.map +1 -1
  194. package/src/engine/intelligence/behavior/decorator/RepeatBehavior.js +3 -1
  195. package/src/engine/intelligence/behavior/decorator/RepeatBehaviorSerializationAdapter.d.ts.map +1 -1
  196. package/src/engine/intelligence/behavior/decorator/RepeatBehaviorSerializationAdapter.js +39 -33
  197. package/src/engine/intelligence/behavior/util/ConditionalBehavior.d.ts +5 -0
  198. package/src/engine/intelligence/behavior/util/ConditionalBehavior.d.ts.map +1 -1
  199. package/src/engine/intelligence/behavior/util/ConditionalBehavior.js +93 -75
  200. package/src/engine/intelligence/behavior/util/RotationBehavior.d.ts.map +1 -1
  201. package/src/engine/intelligence/behavior/util/RotationBehavior.js +79 -76
  202. package/src/engine/intelligence/blackboard/BlackboardStack.d.ts +1 -0
  203. package/src/engine/intelligence/blackboard/BlackboardStack.d.ts.map +1 -1
  204. package/src/engine/intelligence/blackboard/BlackboardStack.js +159 -123
  205. package/src/engine/intelligence/mcts/StateNode.d.ts.map +1 -1
  206. package/src/engine/intelligence/mcts/StateNode.js +366 -364
  207. package/src/engine/intelligence/resource/ResourceAllocationSolver.js +1 -1
  208. package/src/engine/navigation/ecs/components/Path.d.ts.map +1 -1
  209. package/src/engine/navigation/ecs/components/Path.js +2 -1
  210. package/src/engine/navigation/ecs/path_following/PathFollowingSystem.d.ts.map +1 -1
  211. package/src/engine/navigation/ecs/path_following/PathFollowingSystem.js +5 -2
  212. package/src/engine/physics/body/SolverBodyState.d.ts.map +1 -1
  213. package/src/engine/physics/body/SolverBodyState.js +2 -6
  214. package/src/engine/physics/ccd/linear_sweep.d.ts.map +1 -1
  215. package/src/engine/physics/ccd/linear_sweep.js +3 -16
  216. package/src/engine/physics/cloth/build/cloth_proxy_from_joints.d.ts.map +1 -1
  217. package/src/engine/physics/cloth/build/cloth_proxy_from_joints.js +2 -16
  218. package/src/engine/physics/cloth/ecs/cloth_build_rows.d.ts +13 -1
  219. package/src/engine/physics/cloth/ecs/cloth_build_rows.d.ts.map +1 -1
  220. package/src/engine/physics/cloth/ecs/cloth_build_rows.js +15 -4
  221. package/src/engine/physics/ecs/PhysicsSystem.d.ts.map +1 -1
  222. package/src/engine/physics/ecs/PhysicsSystem.js +2 -5
  223. package/src/engine/physics/inertia/locked_inverse_inertia.d.ts +12 -0
  224. package/src/engine/physics/inertia/locked_inverse_inertia.d.ts.map +1 -0
  225. package/src/engine/physics/inertia/locked_inverse_inertia.js +22 -0
  226. package/src/engine/physics/integration/integrate_velocity.d.ts.map +1 -1
  227. package/src/engine/physics/integration/integrate_velocity.js +3 -18
  228. package/src/engine/physics/mls-mpm/MLS_MPM.d.ts +1 -0
  229. package/src/engine/physics/mls-mpm/MLS_MPM.d.ts.map +1 -1
  230. package/src/engine/physics/mls-mpm/MLS_MPM.js +5 -4
  231. package/src/engine/physics/narrowphase/convex_decomposition.d.ts.map +1 -1
  232. package/src/engine/physics/narrowphase/convex_decomposition.js +7 -16
  233. package/src/engine/physics/vehicle/RaycastVehicle.d.ts.map +1 -1
  234. package/src/engine/physics/vehicle/RaycastVehicle.js +15 -5
  235. package/src/engine/save/StorageBackedList.d.ts +5 -0
  236. package/src/engine/save/StorageBackedList.d.ts.map +1 -1
  237. package/src/engine/save/StorageBackedList.js +161 -144
  238. package/src/engine/simulation/Ticker.d.ts.map +1 -1
  239. package/src/engine/simulation/Ticker.js +394 -391
  240. package/src/engine/sound/simulation/probe/AcousticProbeField.d.ts.map +1 -1
  241. package/src/engine/sound/simulation/probe/AcousticProbeField.js +6 -19
  242. package/src/engine/sound/simulation/probe/probe_edge_visible.d.ts +15 -0
  243. package/src/engine/sound/simulation/probe/probe_edge_visible.d.ts.map +1 -1
  244. package/src/engine/sound/simulation/probe/probe_edge_visible.js +59 -41
  245. package/src/engine/sound/simulation/probe/probe_refine_connectivity.d.ts.map +1 -1
  246. package/src/engine/sound/simulation/probe/probe_refine_connectivity.js +164 -181
  247. package/src/engine/sound/simulation/render/FoaProbeReverbRenderer.d.ts.map +1 -1
  248. package/src/engine/sound/simulation/render/FoaProbeReverbRenderer.js +20 -5
  249. package/src/format/image/avif/av1/decode/Av1FrameContext.d.ts.map +1 -1
  250. package/src/format/image/avif/av1/decode/Av1FrameContext.js +3 -10
  251. package/src/format/image/avif/av1/decode/reconstruct.d.ts +20 -0
  252. package/src/format/image/avif/av1/decode/reconstruct.d.ts.map +1 -1
  253. package/src/format/image/avif/av1/decode/reconstruct.js +22 -9
  254. package/src/format/image/avif/av1/encode/choose_restoration.js +2 -18
  255. package/src/format/image/avif/av1/encode/quantise.d.ts.map +1 -1
  256. package/src/format/image/avif/av1/encode/quantise.js +1 -55
  257. package/src/format/image/avif/av1/filter/loop_restoration.d.ts +9 -0
  258. package/src/format/image/avif/av1/filter/loop_restoration.d.ts.map +1 -1
  259. package/src/format/image/avif/av1/filter/loop_restoration.js +1 -1
  260. package/src/format/texture/basis/transcode/etc1s_to_bc7.js +2 -33
  261. package/src/format/texture/basis/transcode/fit_endpoints.d.ts +11 -0
  262. package/src/format/texture/basis/transcode/fit_endpoints.d.ts.map +1 -1
  263. package/src/format/texture/basis/transcode/fit_endpoints.js +1 -1
  264. package/src/format/texture/basis/uastc/uastc_decode_block.d.ts.map +1 -1
  265. package/src/format/texture/basis/uastc/uastc_decode_block.js +2 -19
  266. package/src/generation/foliage/ANNUAL_SHOOTS_BRIEF_2026_10_25.md +220 -0
  267. package/src/generation/foliage/CROWN_FILLING_BRIEF_2026_10_26.md +172 -0
  268. package/src/generation/foliage/FOLIAGE_DESIGN.md +165 -15
  269. package/src/generation/foliage/LEAF_ARCHITECTURE_BRIEF_2026_10_26.md +158 -0
  270. package/src/generation/foliage/SHOOT_SYSTEMS_ALL_SPECIES_BRIEF_2026_10_26.md +248 -0
  271. package/src/generation/foliage/SPEEDTREE_COMPARISON_2026_10_24.md +694 -0
  272. package/src/generation/foliage/analysis/CrownOpacity.d.ts +118 -0
  273. package/src/generation/foliage/analysis/CrownOpacity.d.ts.map +1 -0
  274. package/src/generation/foliage/analysis/CrownOpacity.js +182 -0
  275. package/src/generation/foliage/analysis/crown_opacity_frames.d.ts +10 -0
  276. package/src/generation/foliage/analysis/crown_opacity_frames.d.ts.map +1 -0
  277. package/src/generation/foliage/analysis/crown_opacity_frames.js +132 -0
  278. package/src/generation/foliage/analysis/crown_opacity_measure.d.ts +51 -0
  279. package/src/generation/foliage/analysis/crown_opacity_measure.d.ts.map +1 -0
  280. package/src/generation/foliage/analysis/crown_opacity_measure.js +649 -0
  281. package/src/generation/foliage/analysis/foliage_measure_leaf_area.d.ts +66 -0
  282. package/src/generation/foliage/analysis/foliage_measure_leaf_area.d.ts.map +1 -0
  283. package/src/generation/foliage/analysis/foliage_measure_leaf_area.js +192 -0
  284. package/src/generation/foliage/analysis/tree_crown_opacity.d.ts +27 -0
  285. package/src/generation/foliage/analysis/tree_crown_opacity.d.ts.map +1 -0
  286. package/src/generation/foliage/analysis/tree_crown_opacity.js +58 -0
  287. package/src/generation/foliage/animation/build_tree_wind_rig.d.ts +3 -2
  288. package/src/generation/foliage/animation/build_tree_wind_rig.d.ts.map +1 -1
  289. package/src/generation/foliage/animation/build_tree_wind_rig.js +12 -30
  290. package/src/generation/foliage/animation/tree_wind_bend_limit.d.ts +12 -0
  291. package/src/generation/foliage/animation/tree_wind_bend_limit.d.ts.map +1 -0
  292. package/src/generation/foliage/animation/tree_wind_bend_limit.js +13 -0
  293. package/src/generation/foliage/asset/TreeAsset.d.ts +5 -0
  294. package/src/generation/foliage/asset/TreeAsset.d.ts.map +1 -1
  295. package/src/generation/foliage/asset/TreeAsset.js +6 -0
  296. package/src/generation/foliage/asset/generate_tree.d.ts.map +1 -1
  297. package/src/generation/foliage/asset/generate_tree.js +23 -6
  298. package/src/generation/foliage/config/{BranchLevelConfig.d.ts → BranchGeneratorConfig.d.ts} +61 -75
  299. package/src/generation/foliage/config/BranchGeneratorConfig.d.ts.map +1 -0
  300. package/src/generation/foliage/config/{BranchLevelConfig.js → BranchGeneratorConfig.js} +83 -126
  301. package/src/generation/foliage/config/BranchSpawnRule.d.ts +118 -0
  302. package/src/generation/foliage/config/BranchSpawnRule.d.ts.map +1 -0
  303. package/src/generation/foliage/config/BranchSpawnRule.js +217 -0
  304. package/src/generation/foliage/config/FoliageCardType.d.ts +1 -1
  305. package/src/generation/foliage/config/FoliageCardType.js +2 -2
  306. package/src/generation/foliage/config/FoliageConfig.d.ts +23 -45
  307. package/src/generation/foliage/config/FoliageConfig.d.ts.map +1 -1
  308. package/src/generation/foliage/config/FoliageConfig.js +47 -93
  309. package/src/generation/foliage/config/FoliageMaterialConfig.d.ts +12 -20
  310. package/src/generation/foliage/config/FoliageMaterialConfig.d.ts.map +1 -1
  311. package/src/generation/foliage/config/FoliageMaterialConfig.js +261 -279
  312. package/src/generation/foliage/config/FoliageSpawnRule.d.ts +77 -0
  313. package/src/generation/foliage/config/FoliageSpawnRule.d.ts.map +1 -0
  314. package/src/generation/foliage/config/FoliageSpawnRule.js +135 -0
  315. package/src/generation/foliage/config/FoliageTileContent.d.ts +9 -0
  316. package/src/generation/foliage/config/FoliageTileContent.d.ts.map +1 -0
  317. package/src/generation/foliage/config/FoliageTileContent.js +12 -0
  318. package/src/generation/foliage/config/LeafApexShape.d.ts +12 -0
  319. package/src/generation/foliage/config/LeafApexShape.d.ts.map +1 -0
  320. package/src/generation/foliage/config/LeafApexShape.js +17 -0
  321. package/src/generation/foliage/config/LeafArchitecture.d.ts +155 -0
  322. package/src/generation/foliage/config/LeafArchitecture.d.ts.map +1 -0
  323. package/src/generation/foliage/config/LeafArchitecture.js +288 -0
  324. package/src/generation/foliage/config/LeafBaseShape.d.ts +14 -0
  325. package/src/generation/foliage/config/LeafBaseShape.d.ts.map +1 -0
  326. package/src/generation/foliage/config/LeafBaseShape.js +21 -0
  327. package/src/generation/foliage/config/LeafLobation.d.ts +10 -0
  328. package/src/generation/foliage/config/LeafLobation.d.ts.map +1 -0
  329. package/src/generation/foliage/config/LeafLobation.js +14 -0
  330. package/src/generation/foliage/config/PhyllotaxisMode.d.ts +11 -0
  331. package/src/generation/foliage/config/PhyllotaxisMode.d.ts.map +1 -1
  332. package/src/generation/foliage/config/PhyllotaxisMode.js +36 -0
  333. package/src/generation/foliage/config/ShootBudZone.d.ts +105 -0
  334. package/src/generation/foliage/config/ShootBudZone.d.ts.map +1 -0
  335. package/src/generation/foliage/config/ShootBudZone.js +219 -0
  336. package/src/generation/foliage/config/ShootGrowthConfig.d.ts +84 -0
  337. package/src/generation/foliage/config/ShootGrowthConfig.d.ts.map +1 -0
  338. package/src/generation/foliage/config/ShootGrowthConfig.js +146 -0
  339. package/src/generation/foliage/config/ShootSystemRule.d.ts +144 -0
  340. package/src/generation/foliage/config/ShootSystemRule.d.ts.map +1 -0
  341. package/src/generation/foliage/config/ShootSystemRule.js +316 -0
  342. package/src/generation/foliage/config/TreeLODConfig.d.ts +1 -1
  343. package/src/generation/foliage/config/TreeLODConfig.js +1 -1
  344. package/src/generation/foliage/config/TreeSpeciesConfig.d.ts +40 -8
  345. package/src/generation/foliage/config/TreeSpeciesConfig.d.ts.map +1 -1
  346. package/src/generation/foliage/config/TreeSpeciesConfig.js +124 -68
  347. package/src/generation/foliage/config/TreeWindConfig.d.ts +23 -10
  348. package/src/generation/foliage/config/TreeWindConfig.d.ts.map +1 -1
  349. package/src/generation/foliage/config/TreeWindConfig.js +34 -25
  350. package/src/generation/foliage/index.d.ts +19 -2
  351. package/src/generation/foliage/index.js +63 -44
  352. package/src/generation/foliage/material/FoliageAtlasCutout.d.ts +59 -0
  353. package/src/generation/foliage/material/FoliageAtlasCutout.d.ts.map +1 -0
  354. package/src/generation/foliage/material/FoliageAtlasCutout.js +93 -0
  355. package/src/generation/foliage/material/compute_foliage_variant_atlas_layout.d.ts +26 -0
  356. package/src/generation/foliage/material/compute_foliage_variant_atlas_layout.d.ts.map +1 -0
  357. package/src/generation/foliage/material/compute_foliage_variant_atlas_layout.js +63 -0
  358. package/src/generation/foliage/material/foliage_atlas_cutout.d.ts +34 -0
  359. package/src/generation/foliage/material/foliage_atlas_cutout.d.ts.map +1 -0
  360. package/src/generation/foliage/material/foliage_atlas_cutout.js +174 -0
  361. package/src/generation/foliage/material/foliage_tile.d.ts +110 -0
  362. package/src/generation/foliage/material/foliage_tile.d.ts.map +1 -0
  363. package/src/generation/foliage/material/foliage_tile.js +286 -0
  364. package/src/generation/foliage/material/leaf_geometry.d.ts +103 -0
  365. package/src/generation/foliage/material/leaf_geometry.d.ts.map +1 -0
  366. package/src/generation/foliage/material/leaf_geometry.js +528 -0
  367. package/src/generation/foliage/material/make_foliage_material.d.ts +13 -33
  368. package/src/generation/foliage/material/make_foliage_material.d.ts.map +1 -1
  369. package/src/generation/foliage/material/make_foliage_material.js +356 -605
  370. package/src/generation/foliage/mesh/foliage_collect_attachments.d.ts +39 -4
  371. package/src/generation/foliage/mesh/foliage_collect_attachments.d.ts.map +1 -1
  372. package/src/generation/foliage/mesh/foliage_collect_attachments.js +637 -569
  373. package/src/generation/foliage/mesh/interpolate_ring_skin_weights4.d.ts +48 -0
  374. package/src/generation/foliage/mesh/interpolate_ring_skin_weights4.d.ts.map +1 -0
  375. package/src/generation/foliage/mesh/interpolate_ring_skin_weights4.js +232 -0
  376. package/src/generation/foliage/mesh/tree_mesh_build_bark.d.ts.map +1 -1
  377. package/src/generation/foliage/mesh/tree_mesh_build_bark.js +1023 -1049
  378. package/src/generation/foliage/mesh/tree_mesh_build_foliage.d.ts +9 -2
  379. package/src/generation/foliage/mesh/tree_mesh_build_foliage.d.ts.map +1 -1
  380. package/src/generation/foliage/mesh/tree_mesh_build_foliage.js +467 -454
  381. package/src/generation/foliage/presets/make_tree_species_preset.d.ts.map +1 -1
  382. package/src/generation/foliage/presets/make_tree_species_preset.js +1648 -870
  383. package/src/generation/foliage/skeleton/ShootFrameworkHash.d.ts +35 -0
  384. package/src/generation/foliage/skeleton/ShootFrameworkHash.d.ts.map +1 -0
  385. package/src/generation/foliage/skeleton/ShootFrameworkHash.js +129 -0
  386. package/src/generation/foliage/skeleton/ShootGirth.d.ts +51 -0
  387. package/src/generation/foliage/skeleton/ShootGirth.d.ts.map +1 -0
  388. package/src/generation/foliage/skeleton/ShootGirth.js +212 -0
  389. package/src/generation/foliage/skeleton/ShootLightField.d.ts +73 -0
  390. package/src/generation/foliage/skeleton/ShootLightField.d.ts.map +1 -0
  391. package/src/generation/foliage/skeleton/ShootLightField.js +197 -0
  392. package/src/generation/foliage/skeleton/TreeSkeleton.d.ts +106 -3
  393. package/src/generation/foliage/skeleton/TreeSkeleton.d.ts.map +1 -1
  394. package/src/generation/foliage/skeleton/TreeSkeleton.js +217 -39
  395. package/src/generation/foliage/skeleton/flare_lobe_phase_offset.d.ts +13 -0
  396. package/src/generation/foliage/skeleton/flare_lobe_phase_offset.d.ts.map +1 -0
  397. package/src/generation/foliage/skeleton/flare_lobe_phase_offset.js +16 -0
  398. package/src/generation/foliage/skeleton/foliage_card_density.d.ts +71 -0
  399. package/src/generation/foliage/skeleton/foliage_card_density.d.ts.map +1 -0
  400. package/src/generation/foliage/skeleton/foliage_card_density.js +101 -0
  401. package/src/generation/foliage/skeleton/foliage_senescence.d.ts +101 -0
  402. package/src/generation/foliage/skeleton/foliage_senescence.d.ts.map +1 -0
  403. package/src/generation/foliage/skeleton/foliage_senescence.js +149 -0
  404. package/src/generation/foliage/skeleton/foliage_unit_cards.d.ts +76 -0
  405. package/src/generation/foliage/skeleton/foliage_unit_cards.d.ts.map +1 -0
  406. package/src/generation/foliage/skeleton/foliage_unit_cards.js +95 -0
  407. package/src/generation/foliage/skeleton/shoot_demography.d.ts +22 -0
  408. package/src/generation/foliage/skeleton/shoot_demography.d.ts.map +1 -0
  409. package/src/generation/foliage/skeleton/shoot_demography.js +96 -0
  410. package/src/generation/foliage/skeleton/shoot_geometry.d.ts +66 -0
  411. package/src/generation/foliage/skeleton/shoot_geometry.d.ts.map +1 -0
  412. package/src/generation/foliage/skeleton/shoot_geometry.js +109 -0
  413. package/src/generation/foliage/skeleton/shoot_systems_simulate.d.ts +166 -0
  414. package/src/generation/foliage/skeleton/shoot_systems_simulate.d.ts.map +1 -0
  415. package/src/generation/foliage/skeleton/shoot_systems_simulate.js +588 -0
  416. package/src/generation/foliage/skeleton/tree_skeleton_assign_skin_joints.d.ts +28 -12
  417. package/src/generation/foliage/skeleton/tree_skeleton_assign_skin_joints.d.ts.map +1 -1
  418. package/src/generation/foliage/skeleton/tree_skeleton_assign_skin_joints.js +137 -102
  419. package/src/generation/foliage/skeleton/tree_skeleton_compute_joint_mechanics.d.ts +112 -0
  420. package/src/generation/foliage/skeleton/tree_skeleton_compute_joint_mechanics.d.ts.map +1 -0
  421. package/src/generation/foliage/skeleton/tree_skeleton_compute_joint_mechanics.js +408 -0
  422. package/src/generation/foliage/skeleton/tree_skeleton_compute_pipe_radii.d.ts.map +1 -1
  423. package/src/generation/foliage/skeleton/tree_skeleton_compute_pipe_radii.js +208 -206
  424. package/src/generation/foliage/skeleton/tree_skeleton_grow.d.ts +5 -2
  425. package/src/generation/foliage/skeleton/tree_skeleton_grow.d.ts.map +1 -1
  426. package/src/generation/foliage/skeleton/tree_skeleton_grow.js +2048 -1871
  427. package/src/generation/foliage/skeleton/tree_skeleton_grow_shoots.d.ts +17 -0
  428. package/src/generation/foliage/skeleton/tree_skeleton_grow_shoots.d.ts.map +1 -0
  429. package/src/generation/foliage/skeleton/tree_skeleton_grow_shoots.js +231 -0
  430. package/src/generation/foliage/skeleton/tree_skeleton_read_joint_motion.d.ts +14 -0
  431. package/src/generation/foliage/skeleton/tree_skeleton_read_joint_motion.d.ts.map +1 -0
  432. package/src/generation/foliage/skeleton/tree_skeleton_read_joint_motion.js +26 -0
  433. package/src/generation/foliage/skeleton/tree_skeleton_read_joint_parents.d.ts +10 -0
  434. package/src/generation/foliage/skeleton/tree_skeleton_read_joint_parents.d.ts.map +1 -0
  435. package/src/generation/foliage/skeleton/tree_skeleton_read_joint_parents.js +20 -0
  436. package/src/generation/grid/generation/road/GridTaskGenerateRoads.d.ts.map +1 -1
  437. package/src/generation/grid/generation/road/GridTaskGenerateRoads.js +4 -1
  438. package/src/generation/markers/GridCellActionPlaceMarkerGroup.d.ts +1 -0
  439. package/src/generation/markers/GridCellActionPlaceMarkerGroup.d.ts.map +1 -1
  440. package/src/generation/markers/GridCellActionPlaceMarkerGroup.js +98 -86
  441. package/src/shade/SHADER_F16_PROPOSAL_2026_10_24.md +263 -0
  442. package/src/shade/descriptor/WebGPUExtensionType.d.ts +17 -0
  443. package/src/shade/descriptor/WebGPUExtensionType.d.ts.map +1 -1
  444. package/src/shade/descriptor/WebGPUExtensionType.js +31 -1
  445. package/src/shade/playground/foliage_wind/FoliageRigOverlay.d.ts +37 -0
  446. package/src/shade/playground/foliage_wind/FoliageRigOverlay.d.ts.map +1 -0
  447. package/src/shade/playground/foliage_wind/FoliageRigOverlay.js +491 -0
  448. package/src/shade/playground/foliage_wind/foliage_world.d.ts.map +1 -1
  449. package/src/shade/playground/foliage_wind/foliage_world.js +600 -602
  450. package/src/shade/playground/foliage_wind/index.html +6 -0
  451. package/src/shade/playground/foliage_wind/main.js +14 -0
  452. package/src/shade/renderer/animation/GPUAnimationManager.d.ts.map +1 -1
  453. package/src/shade/renderer/animation/GPUAnimationManager.js +2 -1
  454. package/src/shade/renderer/animation/foliage/FoliageWindJoint.d.ts +2 -1
  455. package/src/shade/renderer/animation/foliage/FoliageWindJoint.d.ts.map +1 -1
  456. package/src/shade/renderer/animation/foliage/FoliageWindJoint.js +2 -1
  457. package/src/shade/renderer/animation/foliage/chunk_foliage_wind_step.d.ts.map +1 -1
  458. package/src/shade/renderer/animation/foliage/chunk_foliage_wind_step.js +4 -2
  459. package/src/shade/renderer/buffer/table/GPUTypedTable.js +1 -1
  460. package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.d.ts.map +1 -1
  461. package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.js +403 -401
  462. package/src/shade/renderer/camera/OrbitalCameraController.d.ts +1 -62
  463. package/src/shade/renderer/camera/OrbitalCameraController.d.ts.map +1 -1
  464. package/src/shade/renderer/camera/OrbitalCameraController.js +1 -374
  465. package/src/shade/renderer/deferred/indirect/chunk_lpv_2d_cache_sample_irradiance.d.ts.map +1 -1
  466. package/src/shade/renderer/deferred/indirect/chunk_lpv_2d_cache_sample_irradiance.js +3 -0
  467. package/src/shade/renderer/deferred/indirect/chunk_lpv_sample_light.d.ts.map +1 -1
  468. package/src/shade/renderer/deferred/indirect/chunk_lpv_sample_light.js +6 -1
  469. package/src/shade/renderer/dynamic/shader_dynamic_mesh_avboit_splat.js +1 -1
  470. package/src/shade/renderer/fluid/GPUFluidCascade.d.ts +2 -2
  471. package/src/shade/renderer/fluid/GPUFluidCascade.d.ts.map +1 -1
  472. package/src/shade/renderer/fluid/GPUFluidCascade.js +6 -3
  473. package/src/shade/renderer/fluid/GPU_FLUID_OCCUPANCY_AND_SOTA_REVIEW_2026_10_26.md +361 -0
  474. package/src/shade/renderer/fluid/coupling/chunk_fluid_cascade_parent.d.ts.map +1 -1
  475. package/src/shade/renderer/fluid/coupling/chunk_fluid_cascade_parent.js +335 -241
  476. package/src/shade/renderer/fluid/coupling/shader_fluid_cascade_ghosts.d.ts.map +1 -1
  477. package/src/shade/renderer/fluid/coupling/shader_fluid_cascade_ghosts.js +108 -101
  478. package/src/shade/renderer/fluid/forcing/chunk_fluid_forcing_query_select.d.ts.map +1 -1
  479. package/src/shade/renderer/fluid/forcing/chunk_fluid_forcing_query_select.js +69 -67
  480. package/src/shade/renderer/fluid/forcing/shader_fluid_forcing_apply.d.ts +7 -6
  481. package/src/shade/renderer/fluid/forcing/shader_fluid_forcing_apply.d.ts.map +1 -1
  482. package/src/shade/renderer/fluid/forcing/shader_fluid_forcing_apply.js +341 -287
  483. package/src/shade/renderer/fluid/mac/FluidMacPasses.d.ts +6 -4
  484. package/src/shade/renderer/fluid/mac/FluidMacPasses.d.ts.map +1 -1
  485. package/src/shade/renderer/fluid/mac/FluidMacPasses.js +427 -400
  486. package/src/shade/renderer/fluid/mac/chunk_fluid_mac_seams.d.ts +10 -5
  487. package/src/shade/renderer/fluid/mac/chunk_fluid_mac_seams.d.ts.map +1 -1
  488. package/src/shade/renderer/fluid/mac/chunk_fluid_mac_seams.js +532 -190
  489. package/src/shade/renderer/fluid/mac/chunk_v3_mac_lattice_corners.d.ts.map +1 -1
  490. package/src/shade/renderer/fluid/mac/chunk_v3_mac_lattice_corners.js +231 -237
  491. package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_correct.d.ts +2 -2
  492. package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_correct.d.ts.map +1 -1
  493. package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_correct.js +282 -245
  494. package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_predict.d.ts +1 -3
  495. package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_predict.d.ts.map +1 -1
  496. package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_predict.js +139 -109
  497. package/src/shade/renderer/fluid/mac/shader_fluid_mac_curl.d.ts +6 -6
  498. package/src/shade/renderer/fluid/mac/shader_fluid_mac_curl.d.ts.map +1 -1
  499. package/src/shade/renderer/fluid/mac/shader_fluid_mac_curl.js +257 -222
  500. package/src/shade/renderer/fluid/mac/shader_fluid_mac_divergence.d.ts +8 -7
  501. package/src/shade/renderer/fluid/mac/shader_fluid_mac_divergence.d.ts.map +1 -1
  502. package/src/shade/renderer/fluid/mac/shader_fluid_mac_divergence.js +119 -92
  503. package/src/shade/renderer/fluid/mac/shader_fluid_mac_gradient.d.ts +6 -9
  504. package/src/shade/renderer/fluid/mac/shader_fluid_mac_gradient.d.ts.map +1 -1
  505. package/src/shade/renderer/fluid/mac/shader_fluid_mac_gradient.js +229 -181
  506. package/src/shade/renderer/fluid/pressure/GPUFluidPressureSolve.d.ts +17 -7
  507. package/src/shade/renderer/fluid/pressure/GPUFluidPressureSolve.d.ts.map +1 -1
  508. package/src/shade/renderer/fluid/pressure/GPUFluidPressureSolve.js +634 -621
  509. package/src/shade/renderer/fluid/pressure/shader_fluid_mg_residual_restrict.d.ts +8 -6
  510. package/src/shade/renderer/fluid/pressure/shader_fluid_mg_residual_restrict.d.ts.map +1 -1
  511. package/src/shade/renderer/fluid/pressure/shader_fluid_mg_residual_restrict.js +166 -149
  512. package/src/shade/renderer/fluid/pressure/shader_fluid_mg_smooth.d.ts +8 -6
  513. package/src/shade/renderer/fluid/pressure/shader_fluid_mg_smooth.d.ts.map +1 -1
  514. package/src/shade/renderer/fluid/pressure/shader_fluid_mg_smooth.js +219 -183
  515. package/src/shade/renderer/fluid/publish/shader_fluid_wind_publish.d.ts.map +1 -1
  516. package/src/shade/renderer/fluid/publish/shader_fluid_wind_publish.js +142 -122
  517. package/src/shade/renderer/geometry/meshlet/COMPACTION_PLAN_2026_09_16.md +674 -663
  518. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.d.ts +1 -1
  519. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.d.ts.map +1 -1
  520. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.js +63 -29
  521. package/src/shade/renderer/geometry/meshlet/build/meshoptimizer/geometry_to_meshlets_meshoptimizer.d.ts.map +1 -1
  522. package/src/shade/renderer/geometry/meshlet/build/meshoptimizer/geometry_to_meshlets_meshoptimizer.js +77 -87
  523. package/src/shade/renderer/geometry/meshlet/build/meshoptimizer/meshopt_clusterizer.d.ts.map +1 -1
  524. package/src/shade/renderer/geometry/meshlet/build/meshoptimizer/meshopt_clusterizer.js +4 -3
  525. package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.d.ts +11 -11
  526. package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.d.ts.map +1 -1
  527. package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.js +17 -19
  528. package/src/shade/renderer/global_illumination/lpv/graph_bake_irradiance_lookup_2d.js +4 -4
  529. package/src/shade/renderer/global_illumination/probe/octahedral/sample/chunk_lpv_mesh_interpolate_radiance_via_atlas.d.ts.map +1 -1
  530. package/src/shade/renderer/global_illumination/probe/octahedral/sample/chunk_lpv_mesh_interpolate_radiance_via_atlas.js +5 -1
  531. package/src/shade/renderer/loader/gltf/load_gltf.d.ts.map +1 -1
  532. package/src/shade/renderer/loader/gltf/load_gltf.js +11 -35
  533. package/src/shade/renderer/loader/usd/load_usd.d.ts.map +1 -1
  534. package/src/shade/renderer/loader/usd/load_usd.js +6 -19
  535. package/src/shade/renderer/particles/shaders/shader_particle_avboit_draw.d.ts.map +1 -1
  536. package/src/shade/renderer/particles/shaders/shader_particle_avboit_draw.js +199 -193
  537. package/src/shade/renderer/particles/shaders/shader_particle_avboit_splat.d.ts.map +1 -1
  538. package/src/shade/renderer/particles/shaders/shader_particle_avboit_splat.js +151 -143
  539. package/src/shade/renderer/postprocess/bloom/chunk_karis_blur4x4_sample.d.ts.map +1 -1
  540. package/src/shade/renderer/postprocess/bloom/chunk_karis_blur4x4_sample.js +11 -5
  541. package/src/shade/renderer/postprocess/denoise/graph_atorus_denoise_luma.d.ts.map +1 -1
  542. package/src/shade/renderer/postprocess/denoise/graph_atorus_denoise_luma.js +6 -18
  543. package/src/shade/renderer/postprocess/gtao/GTAO.js +1 -1
  544. package/src/shade/renderer/postprocess/gtao/ao_reproject_shader.d.ts.map +1 -1
  545. package/src/shade/renderer/postprocess/gtao/ao_reproject_shader.js +3 -5
  546. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao_with_irradiance.js +1 -1
  547. package/src/shade/renderer/postprocess/nss/chunk_nss_luma_derivative.d.ts.map +1 -1
  548. package/src/shade/renderer/postprocess/nss/chunk_nss_luma_derivative.js +7 -3
  549. package/src/shade/renderer/postprocess/nss/shader_nss_postprocess.d.ts.map +1 -1
  550. package/src/shade/renderer/postprocess/nss/shader_nss_postprocess.js +4 -2
  551. package/src/shade/renderer/postprocess/nss/shader_nss_preprocess.d.ts.map +1 -1
  552. package/src/shade/renderer/postprocess/nss/shader_nss_preprocess.js +4 -1
  553. package/src/shade/renderer/postprocess/ssr/downsample_karis.d.ts.map +1 -1
  554. package/src/shade/renderer/postprocess/ssr/downsample_karis.js +6 -3
  555. package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_temporal_accumulate.d.ts.map +1 -1
  556. package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_temporal_accumulate.js +4 -3
  557. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader.d.ts.map +1 -1
  558. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader.js +4 -1
  559. package/src/shade/renderer/postprocess/ssr/ssr_spatial_denoise_shader.d.ts.map +1 -1
  560. package/src/shade/renderer/postprocess/ssr/ssr_spatial_denoise_shader.js +4 -2
  561. package/src/shade/renderer/postprocess/taa/chunk_taa_tonemap.d.ts.map +1 -1
  562. package/src/shade/renderer/postprocess/taa/chunk_taa_tonemap.js +35 -39
  563. package/src/shade/renderer/postprocess/taa/chunk_taa_tonemap_inv.d.ts.map +1 -1
  564. package/src/shade/renderer/postprocess/taa/chunk_taa_tonemap_inv.js +20 -17
  565. package/src/shade/renderer/postprocess/taa/shader_taa.d.ts.map +1 -1
  566. package/src/shade/renderer/postprocess/taa/shader_taa.js +6 -3
  567. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.d.ts.map +1 -1
  568. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.js +3 -1
  569. package/src/shade/renderer/rasterize/native/avboit/avboit_draw_fragment_body.js +1 -1
  570. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_splat_slice.js +2 -2
  571. package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.js +1 -1
  572. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_integrate.d.ts.map +1 -1
  573. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_integrate.js +92 -83
  574. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_splat.js +1 -1
  575. package/src/shade/renderer/shader/ShaderDescriptor.d.ts.map +1 -1
  576. package/src/shade/renderer/shader/ShaderDescriptor.js +12 -4
  577. package/src/shade/renderer/shader/chunk/bvh/chunk_bvh_query_aabb_cooperative.d.ts.map +1 -1
  578. package/src/shade/renderer/shader/chunk/bvh/chunk_bvh_query_aabb_cooperative.js +294 -286
  579. package/src/shade/renderer/shader/chunk/light/lpv/chunk_lpv_interpolate_probe_irradiance8.js +5 -5
  580. package/src/shade/renderer/shader/chunk/light/lpv/chunk_lpv_mesh_interpolate_probe.d.ts.map +1 -1
  581. package/src/shade/renderer/shader/chunk/light/lpv/chunk_lpv_mesh_interpolate_probe.js +5 -3
  582. package/src/shade/renderer/shader/chunk/light/lpv/chunk_lpv_mesh_interpolate_probe_irradiance.d.ts.map +1 -1
  583. package/src/shade/renderer/shader/chunk/light/lpv/chunk_lpv_mesh_interpolate_probe_irradiance.js +9 -6
  584. package/src/shade/renderer/shader/chunk/light/lpv/chunk_lpv_sample_sh3_at.d.ts.map +1 -1
  585. package/src/shade/renderer/shader/chunk/light/lpv/chunk_lpv_sample_sh3_at.js +33 -38
  586. package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.d.ts.map +1 -1
  587. package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.js +690 -675
  588. package/src/shade/renderer/shader/type/WebGPUArray.d.ts +3 -0
  589. package/src/shade/renderer/shader/type/WebGPUArray.d.ts.map +1 -1
  590. package/src/shade/renderer/shader/type/WebGPUArray.js +185 -167
  591. package/src/shade/renderer/shader/type/WebGPUStruct.d.ts.map +1 -1
  592. package/src/shade/renderer/shader/type/WebGPUStruct.js +461 -455
  593. package/src/shade/renderer/shader/type/serde/read_gpu_typed_buffer.d.ts.map +1 -1
  594. package/src/shade/renderer/shader/type/serde/read_gpu_typed_buffer.js +335 -211
  595. package/src/shade/renderer/shader/type/serde/write_gpu_typed_buffer.d.ts.map +1 -1
  596. package/src/shade/renderer/shader/type/serde/write_gpu_typed_buffer.js +329 -221
  597. package/src/shade/renderer/shader/type/type_has_f16.d.ts +12 -0
  598. package/src/shade/renderer/shader/type/type_has_f16.d.ts.map +1 -0
  599. package/src/shade/renderer/shader/type/type_has_f16.js +66 -0
  600. package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.d.ts.map +1 -1
  601. package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.js +16 -2
  602. package/src/shade/renderer/volumetrics/taa/shader_volumetrics_taa.d.ts.map +1 -1
  603. package/src/shade/renderer/volumetrics/taa/shader_volumetrics_taa.js +5 -2
  604. package/src/shade/renderer/water/shader_water_avboit.js +1 -1
  605. package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.d.ts.map +1 -1
  606. package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js +260 -23
  607. package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts +6 -7
  608. package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts.map +1 -1
  609. package/src/shade/wgsl/emulator/WGSLLanguageCore.js +269 -69
  610. package/src/shade/wgsl/validate_wgsl_source.d.ts.map +1 -1
  611. package/src/shade/wgsl/validate_wgsl_source.js +27 -1
  612. package/src/view/controller/controls/ListController.d.ts.map +1 -1
  613. package/src/view/controller/controls/ListController.js +118 -113
  614. package/src/view/controller/controls/Vector1Control.js +97 -97
  615. package/src/view/elements/image/SvgImageView.d.ts +1 -0
  616. package/src/view/elements/image/SvgImageView.d.ts.map +1 -1
  617. package/src/view/elements/image/SvgImageView.js +92 -90
  618. package/src/view/minimap/dom/MinimapTerrainView.d.ts +1 -0
  619. package/src/view/minimap/dom/MinimapTerrainView.d.ts.map +1 -1
  620. package/src/view/minimap/dom/MinimapTerrainView.js +151 -147
  621. package/src/view/tooltip/gml/TooltipParser.js +2 -2
  622. package/src/engine/network/PriorityFetch.d.ts +0 -59
  623. package/src/engine/network/PriorityFetch.d.ts.map +0 -1
  624. package/src/engine/network/PriorityFetch.js +0 -193
  625. package/src/generation/foliage/config/BranchLevelConfig.d.ts.map +0 -1
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Perimeter vertices of a fitted cutout hull. With the midrib vertex in its middle a `FoliageCardType.CutoutHull`
3
+ * card is `CUTOUT_HULL_VERTEX_COUNT + 1` vertices fanned into `CUTOUT_HULL_VERTEX_COUNT` triangles.
4
+ * @type {number}
5
+ */
6
+ export const CUTOUT_HULL_VERTEX_COUNT: number;
7
+ /**
8
+ * What the synthesized foliage atlas looks like to the geometry built on it: per variant tile, a convex hull that
9
+ * holds every texel with any coverage, and how much of the tile is leaf.
10
+ *
11
+ * Produced by `make_foliage_material` (or `foliage_atlas_cutout`, which synthesizes only the alpha), consumed by
12
+ * `tree_mesh_build_foliage` (hull cards) and `foliage_collect_attachments` (card density).
13
+ */
14
+ export class FoliageAtlasCutout {
15
+ /**
16
+ * @type {number}
17
+ */
18
+ variant_count: number;
19
+ /**
20
+ * Counter-clockwise hull of each tile in tile-local `[0, 1]^2` UVs (`v` from the stem anchor end towards the tip),
21
+ * `CUTOUT_HULL_VERTEX_COUNT` (u, v) pairs per variant. Never leaves the tile: each vertex stays half a texel inside.
22
+ * @type {Float32Array}
23
+ */
24
+ hulls: Float32Array;
25
+ /**
26
+ * Alpha-weighted leaf area of each tile, as a fraction of the tile.
27
+ * @type {Float32Array}
28
+ */
29
+ coverage: Float32Array;
30
+ /**
31
+ * @param {number} variant_count
32
+ * @returns {this}
33
+ */
34
+ resize(variant_count: number): this;
35
+ /**
36
+ * Mean leaf fraction over all tiles.
37
+ * @returns {number}
38
+ */
39
+ mean_coverage(): number;
40
+ /**
41
+ * Mean leaf fraction over `count` tiles from `first`: one tile kind of the atlas.
42
+ * @param {number} first
43
+ * @param {number} count
44
+ * @returns {number}
45
+ */
46
+ mean_coverage_of(first: number, count: number): number;
47
+ /**
48
+ * Area of a tile's hull, as a fraction of the tile.
49
+ * @param {number} variant
50
+ * @returns {number}
51
+ */
52
+ hull_area(variant: number): number;
53
+ /**
54
+ * @readonly
55
+ * @type {boolean}
56
+ */
57
+ readonly isFoliageAtlasCutout: boolean;
58
+ }
59
+ //# sourceMappingURL=FoliageAtlasCutout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FoliageAtlasCutout.d.ts","sourceRoot":"","sources":["../../../../../src/generation/foliage/material/FoliageAtlasCutout.js"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,uCAFU,MAAM,CAE0B;AAE1C;;;;;;GAMG;AACH;IACC;;OAEG;IACH,eAFU,MAAM,CAEE;IAElB;;;;OAIG;IACH,OAFU,YAAY,CAEM;IAE5B;;;OAGG;IACH,UAFU,YAAY,CAES;IAE/B;;;OAGG;IACH,sBAHW,MAAM,GACJ,IAAI,CAShB;IAED;;;OAGG;IACH,iBAFa,MAAM,CAQlB;IAED;;;;;OAKG;IACH,wBAJW,MAAM,SACN,MAAM,GACJ,MAAM,CASlB;IAED;;;;OAIG;IACH,mBAHW,MAAM,GACJ,MAAM,CAOlB;IAGF;;;OAGG;IACH,+BAFU,OAAO,CAEgC;CANhD"}
@@ -0,0 +1,93 @@
1
+ import { polygon2_signed_area } from "../../../core/geom/2d/polygon/polygon2_signed_area.js";
2
+
3
+ /**
4
+ * Perimeter vertices of a fitted cutout hull. With the midrib vertex in its middle a `FoliageCardType.CutoutHull`
5
+ * card is `CUTOUT_HULL_VERTEX_COUNT + 1` vertices fanned into `CUTOUT_HULL_VERTEX_COUNT` triangles.
6
+ * @type {number}
7
+ */
8
+ export const CUTOUT_HULL_VERTEX_COUNT = 6;
9
+
10
+ /**
11
+ * What the synthesized foliage atlas looks like to the geometry built on it: per variant tile, a convex hull that
12
+ * holds every texel with any coverage, and how much of the tile is leaf.
13
+ *
14
+ * Produced by `make_foliage_material` (or `foliage_atlas_cutout`, which synthesizes only the alpha), consumed by
15
+ * `tree_mesh_build_foliage` (hull cards) and `foliage_collect_attachments` (card density).
16
+ */
17
+ export class FoliageAtlasCutout {
18
+ /**
19
+ * @type {number}
20
+ */
21
+ variant_count = 0;
22
+
23
+ /**
24
+ * Counter-clockwise hull of each tile in tile-local `[0, 1]^2` UVs (`v` from the stem anchor end towards the tip),
25
+ * `CUTOUT_HULL_VERTEX_COUNT` (u, v) pairs per variant. Never leaves the tile: each vertex stays half a texel inside.
26
+ * @type {Float32Array}
27
+ */
28
+ hulls = new Float32Array(0);
29
+
30
+ /**
31
+ * Alpha-weighted leaf area of each tile, as a fraction of the tile.
32
+ * @type {Float32Array}
33
+ */
34
+ coverage = new Float32Array(0);
35
+
36
+ /**
37
+ * @param {number} variant_count
38
+ * @returns {this}
39
+ */
40
+ resize(variant_count) {
41
+ if (this.variant_count !== variant_count) {
42
+ this.variant_count = variant_count;
43
+ this.hulls = new Float32Array(variant_count * CUTOUT_HULL_VERTEX_COUNT * 2);
44
+ this.coverage = new Float32Array(variant_count);
45
+ }
46
+ return this;
47
+ }
48
+
49
+ /**
50
+ * Mean leaf fraction over all tiles.
51
+ * @returns {number}
52
+ */
53
+ mean_coverage() {
54
+ let sum = 0.0;
55
+ for (let i = 0; i < this.variant_count; i++) {
56
+ sum += this.coverage[i];
57
+ }
58
+ return this.variant_count > 0 ? sum / this.variant_count : 0.0;
59
+ }
60
+
61
+ /**
62
+ * Mean leaf fraction over `count` tiles from `first`: one tile kind of the atlas.
63
+ * @param {number} first
64
+ * @param {number} count
65
+ * @returns {number}
66
+ */
67
+ mean_coverage_of(first, count) {
68
+ const end = Math.min(this.variant_count, first + count);
69
+ let sum = 0.0;
70
+ for (let i = first; i < end; i++) {
71
+ sum += this.coverage[i];
72
+ }
73
+ return end > first ? sum / (end - first) : 0.0;
74
+ }
75
+
76
+ /**
77
+ * Area of a tile's hull, as a fraction of the tile.
78
+ * @param {number} variant
79
+ * @returns {number}
80
+ */
81
+ hull_area(variant) {
82
+ return polygon2_signed_area(
83
+ this.hulls.subarray(variant * CUTOUT_HULL_VERTEX_COUNT * 2, (variant + 1) * CUTOUT_HULL_VERTEX_COUNT * 2),
84
+ CUTOUT_HULL_VERTEX_COUNT
85
+ );
86
+ }
87
+ }
88
+
89
+ /**
90
+ * @readonly
91
+ * @type {boolean}
92
+ */
93
+ FoliageAtlasCutout.prototype.isFoliageAtlasCutout = true;
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Packs `variant_count` square foliage card tiles of size `resolution x resolution` into a 2D atlas
3
+ * using the engine's `MaxRectanglesPacker` (`pack_max_rectangles`), returning the atlas dimensions,
4
+ * pixel-space `AABB2` boxes, and normalized `[u0, v0, u1, v1]` UV rectangles.
5
+ *
6
+ * @param {number} [resolution=128]
7
+ * @param {number} [variant_count=4]
8
+ * @returns {{
9
+ * resolution: number,
10
+ * variant_count: number,
11
+ * atlas_w: number,
12
+ * atlas_h: number,
13
+ * boxes: AABB2[],
14
+ * uv_rects: Float32Array
15
+ * }}
16
+ */
17
+ export function compute_foliage_variant_atlas_layout(resolution?: number, variant_count?: number): {
18
+ resolution: number;
19
+ variant_count: number;
20
+ atlas_w: number;
21
+ atlas_h: number;
22
+ boxes: AABB2[];
23
+ uv_rects: Float32Array;
24
+ };
25
+ import AABB2 from "../../../core/geom/2d/aabb/AABB2.js";
26
+ //# sourceMappingURL=compute_foliage_variant_atlas_layout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compute_foliage_variant_atlas_layout.d.ts","sourceRoot":"","sources":["../../../../../src/generation/foliage/material/compute_foliage_variant_atlas_layout.js"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;GAeG;AACH,kEAXW,MAAM,kBACN,MAAM,GACJ;IACZ,UAAc,EAAE,MAAM,CAAC;IACvB,aAAiB,EAAE,MAAM,CAAC;IAC1B,OAAW,EAAE,MAAM,CAAC;IACpB,OAAW,EAAE,MAAM,CAAC;IACpB,KAAS,EAAE,KAAK,EAAE,CAAC;IACnB,QAAY,EAAE,YAAY,CAAA;CACvB,CA4CH;kBA9DiB,qCAAqC"}
@@ -0,0 +1,63 @@
1
+ import AABB2 from "../../../core/geom/2d/aabb/AABB2.js";
2
+ import { pack_max_rectangles } from "../../../core/geom/packing/max-rect/pack_max_rectangles.js";
3
+ import { clamp } from "../../../core/math/clamp.js";
4
+
5
+ /**
6
+ * Packs `variant_count` square foliage card tiles of size `resolution x resolution` into a 2D atlas
7
+ * using the engine's `MaxRectanglesPacker` (`pack_max_rectangles`), returning the atlas dimensions,
8
+ * pixel-space `AABB2` boxes, and normalized `[u0, v0, u1, v1]` UV rectangles.
9
+ *
10
+ * @param {number} [resolution=128]
11
+ * @param {number} [variant_count=4]
12
+ * @returns {{
13
+ * resolution: number,
14
+ * variant_count: number,
15
+ * atlas_w: number,
16
+ * atlas_h: number,
17
+ * boxes: AABB2[],
18
+ * uv_rects: Float32Array
19
+ * }}
20
+ */
21
+ export function compute_foliage_variant_atlas_layout(resolution = 128, variant_count = 4) {
22
+ const res = Math.max(16, resolution | 0);
23
+ const count = clamp(variant_count | 0, 1, 16);
24
+ const cols = Math.max(1, Math.ceil(Math.sqrt(count)));
25
+ const rows = Math.max(1, Math.ceil(count / cols));
26
+ const atlas_w = cols * res;
27
+ const atlas_h = rows * res;
28
+
29
+ /** @type {AABB2[]} */
30
+ const boxes = new Array(count);
31
+ for (let k = 0; k < count; k++) {
32
+ boxes[k] = new AABB2(0, 0, res, res);
33
+ }
34
+
35
+ const packed = pack_max_rectangles(atlas_w, atlas_h, boxes);
36
+ if (!packed) {
37
+ // Deterministic grid fallback if custom non-uniform boxes are ever used
38
+ for (let k = 0; k < count; k++) {
39
+ const c = k % cols;
40
+ const r = Math.floor(k / cols);
41
+ boxes[k].set(c * res, r * res, (c + 1) * res, (r + 1) * res);
42
+ }
43
+ }
44
+
45
+ const uv_rects = new Float32Array(count * 4);
46
+ for (let k = 0; k < count; k++) {
47
+ const b = boxes[k];
48
+ const k4 = k * 4;
49
+ uv_rects[k4] = b.x0 / atlas_w;
50
+ uv_rects[k4 + 1] = b.y0 / atlas_h;
51
+ uv_rects[k4 + 2] = b.x1 / atlas_w;
52
+ uv_rects[k4 + 3] = b.y1 / atlas_h;
53
+ }
54
+
55
+ return {
56
+ resolution: res,
57
+ variant_count: count,
58
+ atlas_w,
59
+ atlas_h,
60
+ boxes,
61
+ uv_rects
62
+ };
63
+ }
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Fits one tile's hull from the texel rows its silhouette covers. Each covered row contributes the outer corners of
3
+ * its first and last covered texel, so the hull holds every texel with any coverage at all: no alpha threshold, and
4
+ * nothing a coarser mip spreads into an edge texel is cut off.
5
+ *
6
+ * @param {FoliageAtlasCutout} out already sized
7
+ * @param {number} variant
8
+ * @param {Int32Array} row_min first covered texel of each row, `-1` for an empty row
9
+ * @param {Int32Array} row_max last covered texel of each row
10
+ * @param {number} coverage_sum sum of alpha over the tile
11
+ * @param {number} res tile resolution in texels
12
+ */
13
+ export function foliage_atlas_cutout_fit_tile(out: FoliageAtlasCutout, variant: number, row_min: Int32Array, row_max: Int32Array, coverage_sum: number, res: number): void;
14
+ /**
15
+ * Fits tile `variant`'s hull from its alpha as the atlas stores it: an alpha that rounds to 0 is not drawn.
16
+ *
17
+ * @param {FoliageAtlasCutout} out already sized
18
+ * @param {number} variant
19
+ * @param {Float32Array} alpha the tile's coverage, row-major from `v` 0
20
+ * @param {number} res
21
+ */
22
+ export function foliage_atlas_cutout_fit_alpha(out: FoliageAtlasCutout, variant: number, alpha: Float32Array, res: number): void;
23
+ /**
24
+ * Synthesizes only the alpha of the foliage atlas `make_foliage_material` would build for `species`, and fits its
25
+ * cutout. For callers that need the atlas's shape without its textures; `make_foliage_material` produces the same
26
+ * cutout as a by-product.
27
+ *
28
+ * @param {import("../config/TreeSpeciesConfig.js").TreeSpeciesConfig} species
29
+ * @param {FoliageAtlasCutout} [out]
30
+ * @returns {FoliageAtlasCutout}
31
+ */
32
+ export function foliage_atlas_cutout(species: import("../config/TreeSpeciesConfig.js").TreeSpeciesConfig, out?: FoliageAtlasCutout): FoliageAtlasCutout;
33
+ import { FoliageAtlasCutout } from "./FoliageAtlasCutout.js";
34
+ //# sourceMappingURL=foliage_atlas_cutout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"foliage_atlas_cutout.d.ts","sourceRoot":"","sources":["../../../../../src/generation/foliage/material/foliage_atlas_cutout.js"],"names":[],"mappings":"AAQA;;;;;;;;;;;GAWG;AACH,mDAPW,kBAAkB,WAClB,MAAM,WACN,UAAU,WACV,UAAU,gBACV,MAAM,OACN,MAAM,QA8GhB;AAED;;;;;;;GAOG;AACH,oDALW,kBAAkB,WAClB,MAAM,SACN,YAAY,OACZ,MAAM,QAkBhB;AAED;;;;;;;;GAQG;AACH,8CAJW,OAAO,gCAAgC,EAAE,iBAAiB,QAC1D,kBAAkB,GAChB,kBAAkB,CAU9B;mCAxK4D,yBAAyB"}
@@ -0,0 +1,174 @@
1
+ import { convex_hull_fixed_count_2d_relaxation } from "../../../core/geom/2d/convex-hull/convex_hull_fixed_count_2d_relaxation.js";
2
+ import { convex_hull_monotone_2d } from "../../../core/geom/2d/convex-hull/convex_hull_monotone_2d.js";
3
+ import { polygon2_clip_axis_halfplane } from "../../../core/geom/2d/polygon/polygon2_clip_axis_halfplane.js";
4
+ import { polygon2_is_counter_clockwise } from "../../../core/geom/2d/polygon/polygon2_is_counter_clockwise.js";
5
+ import { clamp } from "../../../core/math/clamp.js";
6
+ import { CUTOUT_HULL_VERTEX_COUNT, FoliageAtlasCutout } from "./FoliageAtlasCutout.js";
7
+ import { foliage_tile_layout, foliage_tile_raster } from "./foliage_tile.js";
8
+
9
+ /**
10
+ * Fits one tile's hull from the texel rows its silhouette covers. Each covered row contributes the outer corners of
11
+ * its first and last covered texel, so the hull holds every texel with any coverage at all: no alpha threshold, and
12
+ * nothing a coarser mip spreads into an edge texel is cut off.
13
+ *
14
+ * @param {FoliageAtlasCutout} out already sized
15
+ * @param {number} variant
16
+ * @param {Int32Array} row_min first covered texel of each row, `-1` for an empty row
17
+ * @param {Int32Array} row_max last covered texel of each row
18
+ * @param {number} coverage_sum sum of alpha over the tile
19
+ * @param {number} res tile resolution in texels
20
+ */
21
+ export function foliage_atlas_cutout_fit_tile(out, variant, row_min, row_max, coverage_sum, res) {
22
+ const inv_res = 1.0 / res;
23
+
24
+ // The hull keeps half a texel inside the tile, where bilinear filtering starts to read the atlas neighbour.
25
+ // Only a texel on the tile's own border loses its outer half to that.
26
+ const lo = 0.5 * inv_res;
27
+ const hi = 1.0 - lo;
28
+ const bounds = [lo, lo, hi, hi];
29
+
30
+ const points = new Float64Array(res * 8);
31
+ let n = 0;
32
+ for (let y = 0; y < res; y++) {
33
+ if (row_min[y] < 0) continue;
34
+ const x0 = clamp(row_min[y] * inv_res, lo, hi);
35
+ const x1 = clamp((row_max[y] + 1) * inv_res, lo, hi);
36
+ const y0 = clamp(y * inv_res, lo, hi);
37
+ const y1 = clamp((y + 1) * inv_res, lo, hi);
38
+ points[n * 2] = x0;
39
+ points[n * 2 + 1] = y0;
40
+ points[n * 2 + 2] = x0;
41
+ points[n * 2 + 3] = y1;
42
+ points[n * 2 + 4] = x1;
43
+ points[n * 2 + 5] = y0;
44
+ points[n * 2 + 6] = x1;
45
+ points[n * 2 + 7] = y1;
46
+ n += 4;
47
+ }
48
+
49
+ const K = CUTOUT_HULL_VERTEX_COUNT;
50
+ const hull = new Float64Array(Math.max(K, n) * 2);
51
+ let k = 0;
52
+
53
+ if (n >= 3) {
54
+ const indices = convex_hull_monotone_2d(points, n);
55
+ const loop = new Float64Array(indices.length * 2);
56
+ for (let i = 0; i < indices.length; i++) {
57
+ loop[i * 2] = points[indices[i] * 2];
58
+ loop[i * 2 + 1] = points[indices[i] * 2 + 1];
59
+ }
60
+ // relaxation extends neighbouring edges over each one it removes; bounded, it never extends one out of the tile
61
+ k = convex_hull_fixed_count_2d_relaxation(hull, 0, K, loop, indices.length, bounds);
62
+ if (k > K) {
63
+ // No edge of the silhouette's hull can go without pushing a corner out of the tile: the tile's own sides
64
+ // have to become edges. Fit unbounded, clip that to the tile, and relax the clipped polygon inside it.
65
+ const free = new Float64Array(K * 2);
66
+ const k_free = convex_hull_fixed_count_2d_relaxation(free, 0, K, loop, indices.length);
67
+ let clip_a = new Float64Array((K + 4) * 2);
68
+ let clip_b = new Float64Array((K + 4) * 2);
69
+ clip_a.set(free);
70
+ let kc = polygon2_clip_axis_halfplane(clip_a, k_free, clip_b, 0, lo, false);
71
+ kc = polygon2_clip_axis_halfplane(clip_b, kc, clip_a, 0, hi, true);
72
+ kc = polygon2_clip_axis_halfplane(clip_a, kc, clip_b, 1, lo, false);
73
+ kc = polygon2_clip_axis_halfplane(clip_b, kc, clip_a, 1, hi, true);
74
+ k = convex_hull_fixed_count_2d_relaxation(hull, 0, K, clip_a, kc, bounds);
75
+ if (k > K) {
76
+ // Still stuck. Pulling the unbounded fit's corners into the tile would cut the leaf, so take the
77
+ // silhouette's bounding box instead: looser, but it holds every drawn texel and stays in the tile.
78
+ let x0 = Infinity, y0 = Infinity, x1 = -Infinity, y1 = -Infinity;
79
+ for (let i = 0; i < n; i++) {
80
+ x0 = Math.min(x0, points[i * 2]);
81
+ x1 = Math.max(x1, points[i * 2]);
82
+ y0 = Math.min(y0, points[i * 2 + 1]);
83
+ y1 = Math.max(y1, points[i * 2 + 1]);
84
+ }
85
+ const ym = 0.5 * (y0 + y1);
86
+ hull.set([x0, y0, x1, y0, x1, ym, x1, y1, x0, y1, x0, ym]);
87
+ k = K;
88
+ }
89
+ }
90
+ }
91
+
92
+ if (k < 3) {
93
+ // nothing drawn on this tile: the whole tile
94
+ hull.set([0, 0, 1, 0, 1, 0.5, 1, 1, 0, 1, 0, 0.5]);
95
+ k = K;
96
+ }
97
+
98
+ // fewer hull corners than the card has: split the longest edge until it has them all
99
+ while (k < K) {
100
+ let longest = 0;
101
+ let longest_len = -1;
102
+ for (let i = 0; i < k; i++) {
103
+ const j = (i + 1) % k;
104
+ const len = Math.hypot(hull[j * 2] - hull[i * 2], hull[j * 2 + 1] - hull[i * 2 + 1]);
105
+ if (len > longest_len) {
106
+ longest_len = len;
107
+ longest = i;
108
+ }
109
+ }
110
+ const j = (longest + 1) % k;
111
+ const mx = 0.5 * (hull[longest * 2] + hull[j * 2]);
112
+ const my = 0.5 * (hull[longest * 2 + 1] + hull[j * 2 + 1]);
113
+ hull.copyWithin((longest + 2) * 2, (longest + 1) * 2, k * 2);
114
+ hull[(longest + 1) * 2] = mx;
115
+ hull[(longest + 1) * 2 + 1] = my;
116
+ k++;
117
+ }
118
+
119
+ const ccw = polygon2_is_counter_clockwise(hull, 0, K);
120
+
121
+ const base = variant * K * 2;
122
+ for (let i = 0; i < K; i++) {
123
+ const src = ccw ? i : K - 1 - i;
124
+ out.hulls[base + i * 2] = clamp(hull[src * 2], lo, hi);
125
+ out.hulls[base + i * 2 + 1] = clamp(hull[src * 2 + 1], lo, hi);
126
+ }
127
+
128
+ out.coverage[variant] = coverage_sum * inv_res * inv_res;
129
+ }
130
+
131
+ /**
132
+ * Fits tile `variant`'s hull from its alpha as the atlas stores it: an alpha that rounds to 0 is not drawn.
133
+ *
134
+ * @param {FoliageAtlasCutout} out already sized
135
+ * @param {number} variant
136
+ * @param {Float32Array} alpha the tile's coverage, row-major from `v` 0
137
+ * @param {number} res
138
+ */
139
+ export function foliage_atlas_cutout_fit_alpha(out, variant, alpha, res) {
140
+ const row_min = new Int32Array(res);
141
+ const row_max = new Int32Array(res);
142
+ let coverage_sum = 0.0;
143
+ for (let y = 0; y < res; y++) {
144
+ row_min[y] = -1;
145
+ for (let x = 0; x < res; x++) {
146
+ const a = alpha[y * res + x];
147
+ if (Math.round(a * 255) > 0) {
148
+ if (row_min[y] < 0) row_min[y] = x;
149
+ row_max[y] = x;
150
+ }
151
+ coverage_sum += a;
152
+ }
153
+ }
154
+ foliage_atlas_cutout_fit_tile(out, variant, row_min, row_max, coverage_sum, res);
155
+ }
156
+
157
+ /**
158
+ * Synthesizes only the alpha of the foliage atlas `make_foliage_material` would build for `species`, and fits its
159
+ * cutout. For callers that need the atlas's shape without its textures; `make_foliage_material` produces the same
160
+ * cutout as a by-product.
161
+ *
162
+ * @param {import("../config/TreeSpeciesConfig.js").TreeSpeciesConfig} species
163
+ * @param {FoliageAtlasCutout} [out]
164
+ * @returns {FoliageAtlasCutout}
165
+ */
166
+ export function foliage_atlas_cutout(species, out = new FoliageAtlasCutout()) {
167
+ const layout = foliage_tile_layout(species);
168
+ out.resize(layout.variant_count);
169
+ for (let v = 0; v < layout.variant_count; v++) {
170
+ const raster = foliage_tile_raster(species, layout, v, true);
171
+ foliage_atlas_cutout_fit_alpha(out, v, raster.alpha, layout.resolution);
172
+ }
173
+ return out;
174
+ }
@@ -0,0 +1,110 @@
1
+ /**
2
+ * @typedef {Object} FoliageTileLayout
3
+ * @property {number} variant_count maturity variants, one tile each
4
+ * @property {number} resolution texels across a tile
5
+ * @property {number} scale tile units per metre: every tile draws its organ at its true size at this scale
6
+ * @property {number} card_size the side of the square card a tile covers (m)
7
+ * @property {number} anchor_u where the organ attaches to its shoot, in tile units
8
+ * @property {number} anchor_v
9
+ * @property {number} leaves_per_card leaves one card draws: one leaf, or a needle shoot's needles
10
+ * @property {number} needles needles a needle-shoot tile draws, its plane's share of the card's; 0 for a leaf
11
+ * @property {number} shoot_length length of shoot a needle-shoot tile draws (m), 0 for a leaf
12
+ */
13
+ /**
14
+ * Maturity variants of a species' foliage atlas.
15
+ * @param {import("../config/FoliageMaterialConfig.js").FoliageMaterialConfig} material
16
+ * @returns {number}
17
+ */
18
+ export function foliage_atlas_variant_count(material: import("../config/FoliageMaterialConfig.js").FoliageMaterialConfig): number;
19
+ /**
20
+ * How a species' foliage atlas lays out its tiles: every tile draws its organ (a leaf, or a stretch of needle shoot)
21
+ * at the same scale, its true size, so a card's size in metres is the tile's at that scale. The mature organ fills the
22
+ * tile within its margin, attached at the bottom middle; younger, smaller ones fit inside.
23
+ *
24
+ * A needle-shoot card draws a stretch of shoot as long as a needle, with as many needles as the shoot bears there
25
+ * (`FoliageConfig.leaves_per_metre`), shared among the planes it stands up: each plane's tile draws the needles in
26
+ * its sector round the shoot.
27
+ *
28
+ * The resolution draws the organ's finest feature `FEATURE_TEXELS` texels across, and its narrowest stem `STEM_TEXELS`.
29
+ *
30
+ * @param {import("../config/TreeSpeciesConfig.js").TreeSpeciesConfig} species
31
+ * @returns {FoliageTileLayout}
32
+ */
33
+ export function foliage_tile_layout(species: import("../config/TreeSpeciesConfig.js").TreeSpeciesConfig): FoliageTileLayout;
34
+ /**
35
+ * Rasterizes tile `variant` of a species' atlas: the organ's exact coverage of each texel, and the fields the
36
+ * material shades it with.
37
+ *
38
+ * @param {import("../config/TreeSpeciesConfig.js").TreeSpeciesConfig} species
39
+ * @param {FoliageTileLayout} layout
40
+ * @param {number} variant
41
+ * @param {boolean} [coverage_only] skip everything but `alpha`
42
+ * @returns {FoliageTileRaster}
43
+ */
44
+ export function foliage_tile_raster(species: import("../config/TreeSpeciesConfig.js").TreeSpeciesConfig, layout: FoliageTileLayout, variant: number, coverage_only?: boolean): FoliageTileRaster;
45
+ export type FoliageTileLayout = {
46
+ /**
47
+ * maturity variants, one tile each
48
+ */
49
+ variant_count: number;
50
+ /**
51
+ * texels across a tile
52
+ */
53
+ resolution: number;
54
+ /**
55
+ * tile units per metre: every tile draws its organ at its true size at this scale
56
+ */
57
+ scale: number;
58
+ /**
59
+ * the side of the square card a tile covers (m)
60
+ */
61
+ card_size: number;
62
+ /**
63
+ * where the organ attaches to its shoot, in tile units
64
+ */
65
+ anchor_u: number;
66
+ anchor_v: number;
67
+ /**
68
+ * leaves one card draws: one leaf, or a needle shoot's needles
69
+ */
70
+ leaves_per_card: number;
71
+ /**
72
+ * needles a needle-shoot tile draws, its plane's share of the card's; 0 for a leaf
73
+ */
74
+ needles: number;
75
+ /**
76
+ * length of shoot a needle-shoot tile draws (m), 0 for a leaf
77
+ */
78
+ shoot_length: number;
79
+ };
80
+ export type FoliageTileRaster = {
81
+ /**
82
+ * of the tile's organ
83
+ */
84
+ maturity: number;
85
+ /**
86
+ * leaf coverage of each texel, row-major from the tile's bottom (`v` 0) up
87
+ */
88
+ alpha: Float32Array;
89
+ /**
90
+ * how strongly a vein shows, `[0, 1]`
91
+ */
92
+ vein: Float32Array;
93
+ /**
94
+ * `0` at the margin, `1` on the midvein (or a primary vein, a rachis)
95
+ */
96
+ edge_norm: Float32Array;
97
+ /**
98
+ * where along the organ, `0` at its foot, `1` at its tip
99
+ */
100
+ tip: Float32Array;
101
+ /**
102
+ * lamina relief: camber, bullation, raised veins
103
+ */
104
+ height: Float32Array;
105
+ /**
106
+ * coverage of the woody stem: petiole, rachis, shoot
107
+ */
108
+ stem: Float32Array;
109
+ };
110
+ //# sourceMappingURL=foliage_tile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"foliage_tile.d.ts","sourceRoot":"","sources":["../../../../../src/generation/foliage/material/foliage_tile.js"],"names":[],"mappings":"AAiDA;;;;;;;;;;;GAWG;AAEH;;;;GAIG;AACH,sDAHW,OAAO,oCAAoC,EAAE,qBAAqB,GAChE,MAAM,CAIlB;AAmBD;;;;;;;;;;;;;GAaG;AACH,6CAHW,OAAO,gCAAgC,EAAE,iBAAiB,GACxD,iBAAiB,CAkC7B;AAuBD;;;;;;;;;GASG;AACH,6CANW,OAAO,gCAAgC,EAAE,iBAAiB,UAC1D,iBAAiB,WACjB,MAAM,kBACN,OAAO,GACL,iBAAiB,CAwH7B;;;;;mBA1Oa,MAAM;;;;gBACN,MAAM;;;;WACN,MAAM;;;;eACN,MAAM;;;;cACN,MAAM;cACN,MAAM;;;;qBACN,MAAM;;;;aACN,MAAM;;;;kBACN,MAAM;;;;;;cA+EN,MAAM;;;;WACN,YAAY;;;;UACZ,YAAY;;;;eACZ,YAAY;;;;SACZ,YAAY;;;;YACZ,YAAY;;;;UACZ,YAAY"}