@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.
- package/build/bundle-worker-terrain.js +1 -1
- package/package.json +1 -1
- package/src/DUPLICATION_REVIEW_2026_10_24.md +1072 -0
- package/src/core/binary/BitSet.js +1 -1
- package/src/core/binary/FLOAT16_MAX.d.ts +2 -0
- package/src/core/binary/FLOAT16_MAX.d.ts.map +1 -0
- package/src/core/binary/FLOAT16_MAX.js +1 -0
- package/src/core/binary/base58/base58_encode.js +2 -2
- package/src/core/binary/type/TypeBuilder.js +1 -1
- package/src/core/bvh2/bvh3/BVH.js +1 -1
- package/src/core/bvh2/bvh3/ebvh_optimize_treelet.d.ts.map +1 -1
- package/src/core/bvh2/bvh3/ebvh_optimize_treelet.js +7 -3
- package/src/core/bvh2/bvh3/ebvh_update_hierarchy_bounds.d.ts.map +1 -1
- package/src/core/bvh2/bvh3/ebvh_update_hierarchy_bounds.js +5 -1
- package/src/core/bvh2/bvh3/query/compute_tight_near_far_clipping_planes.d.ts.map +1 -1
- package/src/core/bvh2/bvh3/query/compute_tight_near_far_clipping_planes.js +195 -246
- package/src/core/collection/CuckooFilter.js +1 -1
- package/src/core/collection/array/isArrayEqual.d.ts.map +1 -1
- package/src/core/collection/array/isArrayEqual.js +33 -58
- package/src/core/collection/array/typed/array_buffer_hash.d.ts.map +1 -1
- package/src/core/collection/array/typed/array_buffer_hash.js +41 -39
- package/src/core/collection/array/typed/float32_array_hash.js +38 -38
- package/src/core/collection/array/typed/uint16_array_hash.d.ts +2 -1
- package/src/core/collection/array/typed/uint16_array_hash.d.ts.map +1 -1
- package/src/core/collection/array/typed/uint16_array_hash.js +30 -29
- package/src/core/collection/array/typed/uint32_array_hash.d.ts +2 -1
- package/src/core/collection/array/typed/uint32_array_hash.d.ts.map +1 -1
- package/src/core/collection/array/typed/uint32_array_hash.js +21 -20
- package/src/core/collection/array/typed/uint8_array_hash.d.ts +2 -1
- package/src/core/collection/array/typed/uint8_array_hash.d.ts.map +1 -1
- package/src/core/collection/array/typed/uint8_array_hash.js +37 -36
- package/src/core/collection/array/typed/uint_array_for_count.js +2 -2
- package/src/core/collection/list/List.d.ts.map +1 -1
- package/src/core/collection/list/List.js +3 -19
- package/src/core/collection/table/RowFirstTable.d.ts.map +1 -1
- package/src/core/collection/table/RowFirstTable.js +4 -28
- package/src/core/debug/matchers/DescribeAs.d.ts.map +1 -1
- package/src/core/debug/matchers/DescribeAs.js +62 -64
- package/src/core/function/FunctionCompiler.js +4 -4
- package/src/core/function/objectsEqual.d.ts.map +1 -1
- package/src/core/function/objectsEqual.js +3 -2
- package/src/core/geom/2d/bvh/BVH2D.d.ts.map +1 -1
- package/src/core/geom/2d/bvh/BVH2D.js +4 -3
- package/src/core/geom/2d/convex-hull/convex_hull_fixed_count_2d_relaxation.d.ts +5 -2
- package/src/core/geom/2d/convex-hull/convex_hull_fixed_count_2d_relaxation.d.ts.map +1 -1
- package/src/core/geom/2d/convex-hull/convex_hull_fixed_count_2d_relaxation.js +49 -11
- package/src/core/geom/2d/hash-grid/shg_query_elements_circle.d.ts.map +1 -1
- package/src/core/geom/2d/hash-grid/shg_query_elements_circle.js +122 -159
- package/src/core/geom/2d/hash-grid/shg_query_elements_line.d.ts.map +1 -1
- package/src/core/geom/2d/hash-grid/shg_query_elements_line.js +8 -5
- package/src/core/geom/2d/polygon/polygon2_rasterize_coverage.d.ts +18 -0
- package/src/core/geom/2d/polygon/polygon2_rasterize_coverage.d.ts.map +1 -0
- package/src/core/geom/2d/polygon/polygon2_rasterize_coverage.js +97 -0
- package/src/core/geom/2d/r-tree/StaticR2Tree.js +2 -2
- package/src/core/geom/2d/triangle/tri2_rasterize_coverage.d.ts +21 -0
- package/src/core/geom/2d/triangle/tri2_rasterize_coverage.d.ts.map +1 -0
- package/src/core/geom/2d/triangle/tri2_rasterize_coverage.js +54 -0
- package/src/core/geom/3d/aabb/aabb3_build_frustum.d.ts.map +1 -1
- package/src/core/geom/3d/aabb/aabb3_build_frustum.js +20 -53
- package/src/core/geom/3d/aabb/aabb3_score_boxes_SAH.d.ts +1 -1
- package/src/core/geom/3d/aabb/aabb3_score_boxes_SAH.d.ts.map +1 -1
- package/src/core/geom/3d/aabb/aabb3_score_boxes_SAH.js +11 -42
- package/src/core/geom/3d/atlas/pack/atlas_pack_charts.d.ts.map +1 -1
- package/src/core/geom/3d/atlas/pack/atlas_pack_charts.js +30 -32
- package/src/core/geom/3d/atlas/param/atlas_chart_parameterize_bff.d.ts.map +1 -1
- package/src/core/geom/3d/atlas/param/atlas_chart_parameterize_bff.js +1 -5
- package/src/core/geom/3d/atlas/param/atlas_chart_parameterize_lscm.d.ts.map +1 -1
- package/src/core/geom/3d/atlas/param/atlas_chart_parameterize_lscm.js +1 -15
- package/src/core/geom/3d/atlas/segment/atlas_merge_charts.d.ts.map +1 -1
- package/src/core/geom/3d/atlas/segment/atlas_merge_charts.js +105 -116
- package/src/core/geom/3d/line/line3_compute_segment_point_distance_sqr.d.ts.map +1 -1
- package/src/core/geom/3d/line/line3_compute_segment_point_distance_sqr.js +36 -54
- package/src/core/geom/3d/plane/plane3_compute_intersection_objects.d.ts +5 -10
- package/src/core/geom/3d/plane/plane3_compute_intersection_objects.d.ts.map +1 -1
- package/src/core/geom/3d/plane/plane3_compute_intersection_objects.js +20 -82
- package/src/core/geom/3d/plane/plane3_slerp.d.ts.map +1 -1
- package/src/core/geom/3d/plane/plane3_slerp.js +87 -102
- package/src/core/geom/3d/polygon/polygon3_compute_normal.d.ts +12 -0
- package/src/core/geom/3d/polygon/polygon3_compute_normal.d.ts.map +1 -1
- package/src/core/geom/3d/polygon/polygon3_compute_normal.js +107 -60
- package/src/core/geom/3d/ray/ray3_compute_closest_point.d.ts.map +1 -1
- package/src/core/geom/3d/ray/ray3_compute_closest_point.js +37 -43
- package/src/core/geom/3d/shape/ConvexHullShape3D.d.ts.map +1 -1
- package/src/core/geom/3d/shape/ConvexHullShape3D.js +5 -16
- package/src/core/geom/3d/shape/MeshShape3D.js +2 -56
- package/src/core/geom/3d/shape/TransformedShape3D.d.ts.map +1 -1
- package/src/core/geom/3d/shape/TransformedShape3D.js +10 -7
- package/src/core/geom/3d/shape/UnionShape3D.d.ts.map +1 -1
- package/src/core/geom/3d/shape/UnionShape3D.js +9 -3
- package/src/core/geom/3d/shape/json/shape_to_type.js +2 -2
- package/src/core/geom/3d/sphere/harmonics/SH3_COEFFICIENTS.js +17 -17
- package/src/core/geom/3d/tetrahedra/TetrahedralMesh.d.ts.map +1 -1
- package/src/core/geom/3d/tetrahedra/TetrahedralMesh.js +6 -2
- package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_carve_outside_surface.d.ts.map +1 -1
- package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_carve_outside_surface.js +3 -2
- package/src/core/geom/3d/tetrahedra/tetrahedron_contains_point.d.ts +20 -2
- package/src/core/geom/3d/tetrahedra/tetrahedron_contains_point.d.ts.map +1 -1
- package/src/core/geom/3d/tetrahedra/tetrahedron_contains_point.js +52 -37
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_face_normals.d.ts.map +1 -1
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_face_normals.js +40 -56
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_vertex_quadrics.d.ts.map +1 -1
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_vertex_quadrics.js +251 -260
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_wedge_attribute_quadrics.d.ts.map +1 -1
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_wedge_attribute_quadrics.js +104 -113
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_resolve_t_junctions.d.ts.map +1 -1
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_resolve_t_junctions.js +227 -238
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_simplify.d.ts.map +1 -1
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_simplify.js +15 -24
- package/src/core/geom/3d/topology/struct/binary/io/edge/bt_edge_create.d.ts.map +1 -1
- package/src/core/geom/3d/topology/struct/binary/io/edge/bt_edge_create.js +31 -115
- package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_vertex_fuse_duplicate_edges.d.ts.map +1 -1
- package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_vertex_fuse_duplicate_edges.js +142 -150
- package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_vertex_replace.d.ts.map +1 -1
- package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_vertex_replace.js +151 -194
- package/src/core/geom/3d/topology/struct/binary/query/bt_face_get_incenter.d.ts.map +1 -1
- package/src/core/geom/3d/topology/struct/binary/query/bt_face_get_incenter.js +60 -85
- package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_build_boundary_distance_field.d.ts.map +1 -1
- package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_build_boundary_distance_field.js +156 -171
- package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_face_find_path.d.ts.map +1 -1
- package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_face_find_path.js +8 -44
- package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_face_find_path_polyanya.d.ts.map +1 -1
- package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_face_find_path_polyanya.js +2 -7
- package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_sample_interior_grid_points.d.ts.map +1 -1
- package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_sample_interior_grid_points.js +3 -2
- package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_segment_penetrates_surface.d.ts.map +1 -1
- package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_segment_penetrates_surface.js +128 -133
- package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_surface_ray_parity.d.ts +8 -14
- package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_surface_ray_parity.d.ts.map +1 -1
- package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_surface_ray_parity.js +36 -82
- package/src/core/geom/3d/triangle/tri3_ray_intersection.d.ts.map +1 -1
- package/src/core/geom/3d/triangle/tri3_ray_intersection.js +7 -144
- package/src/core/geom/ConicRay.d.ts.map +1 -1
- package/src/core/geom/ConicRay.js +230 -237
- package/src/core/localization/LocaleDataset.d.ts +6 -0
- package/src/core/localization/LocaleDataset.d.ts.map +1 -1
- package/src/core/localization/LocaleDataset.js +48 -37
- package/src/core/localization/LocalizationEngine.d.ts.map +1 -1
- package/src/core/localization/LocalizationEngine.js +3 -2
- package/src/core/math/lookup/ParameterLookupTable.d.ts.map +1 -1
- package/src/core/math/lookup/ParameterLookupTable.js +3 -1
- package/src/core/math/spline/spline3_hermite_intersection_spline3_hermite_nd.d.ts.map +1 -1
- package/src/core/math/spline/spline3_hermite_intersection_spline3_hermite_nd.js +330 -400
- package/src/core/math/spline/spline3_hermite_nearest_point.d.ts +16 -0
- package/src/core/math/spline/spline3_hermite_nearest_point.d.ts.map +1 -1
- package/src/core/math/spline/spline3_hermite_nearest_point.js +134 -167
- package/src/core/model/DebouncedObservedBoolean.d.ts +1 -2
- package/src/core/model/DebouncedObservedBoolean.d.ts.map +1 -1
- package/src/core/model/DebouncedObservedBoolean.js +1 -1
- package/src/core/model/node-graph/node/NodeInstance.d.ts.map +1 -1
- package/src/core/model/node-graph/node/NodeInstance.js +2 -7
- package/src/core/model/node-graph/node/parameter/NodeParameterDescription.js +1 -1
- package/src/core/model/object/optional_equality.d.ts +3 -3
- package/src/core/model/object/optional_equality.d.ts.map +1 -1
- package/src/core/model/object/optional_equality.js +10 -27
- package/src/core/model/object/write_property.js +1 -1
- package/src/core/model/reactive/evaluation/MultiPredicateEvaluator.js +2 -2
- package/src/core/primitives/strings/string_compute_byte_size.d.ts +3 -3
- package/src/core/primitives/strings/string_compute_byte_size.d.ts.map +1 -1
- package/src/core/primitives/strings/string_compute_byte_size.js +8 -21
- package/src/core/process/executor/ConcurrentExecutor.d.ts.map +1 -1
- package/src/core/process/executor/ConcurrentExecutor.js +14 -2
- package/src/engine/achievements/gateway/StorageAchievementGateway.d.ts +6 -3
- package/src/engine/achievements/gateway/StorageAchievementGateway.d.ts.map +1 -1
- package/src/engine/achievements/gateway/StorageAchievementGateway.js +31 -75
- package/src/engine/asset/loaders/SVGAssetLoader.d.ts.map +1 -1
- package/src/engine/asset/loaders/SVGAssetLoader.js +33 -31
- package/src/engine/control/first-person/math/criticallyDampedSpring.d.ts.map +1 -1
- package/src/engine/control/first-person/math/criticallyDampedSpring.js +3 -14
- package/src/engine/ecs/EntityComponentDataset.d.ts.map +1 -1
- package/src/engine/ecs/EntityComponentDataset.js +4 -1
- package/src/engine/ecs/storage/binary/object/BinaryObjectSerializationAdapter.d.ts +0 -2
- package/src/engine/ecs/storage/binary/object/BinaryObjectSerializationAdapter.d.ts.map +1 -1
- package/src/engine/ecs/storage/binary/object/BinaryObjectSerializationAdapter.js +3 -3
- package/src/engine/ecs/terrain/ecs/layers/TerrainLayer.js +2 -2
- package/src/engine/ecs/transform/Transform64.d.ts +21 -0
- package/src/engine/ecs/transform/Transform64.d.ts.map +1 -1
- package/src/engine/ecs/transform/Transform64.js +26 -0
- package/src/engine/graphics/sh3/path_tracer/geometry/sort_triangles_by_distance_to_point.js +1 -1
- package/src/engine/graphics/texture/sampler/sampler2d_channel_compute_min_indices.js +1 -1
- package/src/engine/graphics3/WaterSystem.d.ts.map +1 -1
- package/src/engine/graphics3/WaterSystem.js +2 -1
- package/src/engine/graphics3/prefab/prefab_skin_frame.d.ts.map +1 -1
- package/src/engine/graphics3/prefab/prefab_skin_frame.js +1 -12
- package/src/engine/grid/grid2transform/GridPosition2TransformSystem.d.ts +1 -1
- package/src/engine/grid/grid2transform/GridPosition2TransformSystem.d.ts.map +1 -1
- package/src/engine/grid/grid2transform/GridPosition2TransformSystem.js +141 -137
- package/src/engine/input/ecs/systems/InputControllerSystem.d.ts.map +1 -1
- package/src/engine/input/ecs/systems/InputControllerSystem.js +13 -3
- package/src/engine/input/ecs/systems/InputSystem.d.ts.map +1 -1
- package/src/engine/input/ecs/systems/InputSystem.js +2 -1
- package/src/engine/intelligence/behavior/composite/ParallelBehavior.d.ts +1 -1
- package/src/engine/intelligence/behavior/composite/ParallelBehavior.d.ts.map +1 -1
- package/src/engine/intelligence/behavior/composite/ParallelBehavior.js +4 -1
- package/src/engine/intelligence/behavior/decorator/InvertStatusBehavior.d.ts.map +1 -1
- package/src/engine/intelligence/behavior/decorator/InvertStatusBehavior.js +3 -1
- package/src/engine/intelligence/behavior/decorator/RepeatBehavior.d.ts.map +1 -1
- package/src/engine/intelligence/behavior/decorator/RepeatBehavior.js +3 -1
- package/src/engine/intelligence/behavior/decorator/RepeatBehaviorSerializationAdapter.d.ts.map +1 -1
- package/src/engine/intelligence/behavior/decorator/RepeatBehaviorSerializationAdapter.js +39 -33
- package/src/engine/intelligence/behavior/util/ConditionalBehavior.d.ts +5 -0
- package/src/engine/intelligence/behavior/util/ConditionalBehavior.d.ts.map +1 -1
- package/src/engine/intelligence/behavior/util/ConditionalBehavior.js +93 -75
- package/src/engine/intelligence/behavior/util/RotationBehavior.d.ts.map +1 -1
- package/src/engine/intelligence/behavior/util/RotationBehavior.js +79 -76
- package/src/engine/intelligence/blackboard/BlackboardStack.d.ts +1 -0
- package/src/engine/intelligence/blackboard/BlackboardStack.d.ts.map +1 -1
- package/src/engine/intelligence/blackboard/BlackboardStack.js +159 -123
- package/src/engine/intelligence/mcts/StateNode.d.ts.map +1 -1
- package/src/engine/intelligence/mcts/StateNode.js +366 -364
- package/src/engine/intelligence/resource/ResourceAllocationSolver.js +1 -1
- package/src/engine/navigation/ecs/components/Path.d.ts.map +1 -1
- package/src/engine/navigation/ecs/components/Path.js +2 -1
- package/src/engine/navigation/ecs/path_following/PathFollowingSystem.d.ts.map +1 -1
- package/src/engine/navigation/ecs/path_following/PathFollowingSystem.js +5 -2
- package/src/engine/physics/body/SolverBodyState.d.ts.map +1 -1
- package/src/engine/physics/body/SolverBodyState.js +2 -6
- package/src/engine/physics/ccd/linear_sweep.d.ts.map +1 -1
- package/src/engine/physics/ccd/linear_sweep.js +3 -16
- package/src/engine/physics/cloth/build/cloth_proxy_from_joints.d.ts.map +1 -1
- package/src/engine/physics/cloth/build/cloth_proxy_from_joints.js +2 -16
- package/src/engine/physics/cloth/ecs/cloth_build_rows.d.ts +13 -1
- package/src/engine/physics/cloth/ecs/cloth_build_rows.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/cloth_build_rows.js +15 -4
- package/src/engine/physics/ecs/PhysicsSystem.d.ts.map +1 -1
- package/src/engine/physics/ecs/PhysicsSystem.js +2 -5
- package/src/engine/physics/inertia/locked_inverse_inertia.d.ts +12 -0
- package/src/engine/physics/inertia/locked_inverse_inertia.d.ts.map +1 -0
- package/src/engine/physics/inertia/locked_inverse_inertia.js +22 -0
- package/src/engine/physics/integration/integrate_velocity.d.ts.map +1 -1
- package/src/engine/physics/integration/integrate_velocity.js +3 -18
- package/src/engine/physics/mls-mpm/MLS_MPM.d.ts +1 -0
- package/src/engine/physics/mls-mpm/MLS_MPM.d.ts.map +1 -1
- package/src/engine/physics/mls-mpm/MLS_MPM.js +5 -4
- package/src/engine/physics/narrowphase/convex_decomposition.d.ts.map +1 -1
- package/src/engine/physics/narrowphase/convex_decomposition.js +7 -16
- package/src/engine/physics/vehicle/RaycastVehicle.d.ts.map +1 -1
- package/src/engine/physics/vehicle/RaycastVehicle.js +15 -5
- package/src/engine/save/StorageBackedList.d.ts +5 -0
- package/src/engine/save/StorageBackedList.d.ts.map +1 -1
- package/src/engine/save/StorageBackedList.js +161 -144
- package/src/engine/simulation/Ticker.d.ts.map +1 -1
- package/src/engine/simulation/Ticker.js +394 -391
- package/src/engine/sound/simulation/probe/AcousticProbeField.d.ts.map +1 -1
- package/src/engine/sound/simulation/probe/AcousticProbeField.js +6 -19
- package/src/engine/sound/simulation/probe/probe_edge_visible.d.ts +15 -0
- package/src/engine/sound/simulation/probe/probe_edge_visible.d.ts.map +1 -1
- package/src/engine/sound/simulation/probe/probe_edge_visible.js +59 -41
- package/src/engine/sound/simulation/probe/probe_refine_connectivity.d.ts.map +1 -1
- package/src/engine/sound/simulation/probe/probe_refine_connectivity.js +164 -181
- package/src/engine/sound/simulation/render/FoaProbeReverbRenderer.d.ts.map +1 -1
- package/src/engine/sound/simulation/render/FoaProbeReverbRenderer.js +20 -5
- package/src/format/image/avif/av1/decode/Av1FrameContext.d.ts.map +1 -1
- package/src/format/image/avif/av1/decode/Av1FrameContext.js +3 -10
- package/src/format/image/avif/av1/decode/reconstruct.d.ts +20 -0
- package/src/format/image/avif/av1/decode/reconstruct.d.ts.map +1 -1
- package/src/format/image/avif/av1/decode/reconstruct.js +22 -9
- package/src/format/image/avif/av1/encode/choose_restoration.js +2 -18
- package/src/format/image/avif/av1/encode/quantise.d.ts.map +1 -1
- package/src/format/image/avif/av1/encode/quantise.js +1 -55
- package/src/format/image/avif/av1/filter/loop_restoration.d.ts +9 -0
- package/src/format/image/avif/av1/filter/loop_restoration.d.ts.map +1 -1
- package/src/format/image/avif/av1/filter/loop_restoration.js +1 -1
- package/src/format/texture/basis/transcode/etc1s_to_bc7.js +2 -33
- package/src/format/texture/basis/transcode/fit_endpoints.d.ts +11 -0
- package/src/format/texture/basis/transcode/fit_endpoints.d.ts.map +1 -1
- package/src/format/texture/basis/transcode/fit_endpoints.js +1 -1
- package/src/format/texture/basis/uastc/uastc_decode_block.d.ts.map +1 -1
- package/src/format/texture/basis/uastc/uastc_decode_block.js +2 -19
- package/src/generation/foliage/ANNUAL_SHOOTS_BRIEF_2026_10_25.md +220 -0
- package/src/generation/foliage/CROWN_FILLING_BRIEF_2026_10_26.md +172 -0
- package/src/generation/foliage/FOLIAGE_DESIGN.md +165 -15
- package/src/generation/foliage/LEAF_ARCHITECTURE_BRIEF_2026_10_26.md +158 -0
- package/src/generation/foliage/SHOOT_SYSTEMS_ALL_SPECIES_BRIEF_2026_10_26.md +248 -0
- package/src/generation/foliage/SPEEDTREE_COMPARISON_2026_10_24.md +694 -0
- package/src/generation/foliage/analysis/CrownOpacity.d.ts +118 -0
- package/src/generation/foliage/analysis/CrownOpacity.d.ts.map +1 -0
- package/src/generation/foliage/analysis/CrownOpacity.js +182 -0
- package/src/generation/foliage/analysis/crown_opacity_frames.d.ts +10 -0
- package/src/generation/foliage/analysis/crown_opacity_frames.d.ts.map +1 -0
- package/src/generation/foliage/analysis/crown_opacity_frames.js +132 -0
- package/src/generation/foliage/analysis/crown_opacity_measure.d.ts +51 -0
- package/src/generation/foliage/analysis/crown_opacity_measure.d.ts.map +1 -0
- package/src/generation/foliage/analysis/crown_opacity_measure.js +649 -0
- package/src/generation/foliage/analysis/foliage_measure_leaf_area.d.ts +66 -0
- package/src/generation/foliage/analysis/foliage_measure_leaf_area.d.ts.map +1 -0
- package/src/generation/foliage/analysis/foliage_measure_leaf_area.js +192 -0
- package/src/generation/foliage/analysis/tree_crown_opacity.d.ts +27 -0
- package/src/generation/foliage/analysis/tree_crown_opacity.d.ts.map +1 -0
- package/src/generation/foliage/analysis/tree_crown_opacity.js +58 -0
- package/src/generation/foliage/animation/build_tree_wind_rig.d.ts +3 -2
- package/src/generation/foliage/animation/build_tree_wind_rig.d.ts.map +1 -1
- package/src/generation/foliage/animation/build_tree_wind_rig.js +12 -30
- package/src/generation/foliage/animation/tree_wind_bend_limit.d.ts +12 -0
- package/src/generation/foliage/animation/tree_wind_bend_limit.d.ts.map +1 -0
- package/src/generation/foliage/animation/tree_wind_bend_limit.js +13 -0
- package/src/generation/foliage/asset/TreeAsset.d.ts +5 -0
- package/src/generation/foliage/asset/TreeAsset.d.ts.map +1 -1
- package/src/generation/foliage/asset/TreeAsset.js +6 -0
- package/src/generation/foliage/asset/generate_tree.d.ts.map +1 -1
- package/src/generation/foliage/asset/generate_tree.js +23 -6
- package/src/generation/foliage/config/{BranchLevelConfig.d.ts → BranchGeneratorConfig.d.ts} +61 -75
- package/src/generation/foliage/config/BranchGeneratorConfig.d.ts.map +1 -0
- package/src/generation/foliage/config/{BranchLevelConfig.js → BranchGeneratorConfig.js} +83 -126
- package/src/generation/foliage/config/BranchSpawnRule.d.ts +118 -0
- package/src/generation/foliage/config/BranchSpawnRule.d.ts.map +1 -0
- package/src/generation/foliage/config/BranchSpawnRule.js +217 -0
- package/src/generation/foliage/config/FoliageCardType.d.ts +1 -1
- package/src/generation/foliage/config/FoliageCardType.js +2 -2
- package/src/generation/foliage/config/FoliageConfig.d.ts +23 -45
- package/src/generation/foliage/config/FoliageConfig.d.ts.map +1 -1
- package/src/generation/foliage/config/FoliageConfig.js +47 -93
- package/src/generation/foliage/config/FoliageMaterialConfig.d.ts +12 -20
- package/src/generation/foliage/config/FoliageMaterialConfig.d.ts.map +1 -1
- package/src/generation/foliage/config/FoliageMaterialConfig.js +261 -279
- package/src/generation/foliage/config/FoliageSpawnRule.d.ts +77 -0
- package/src/generation/foliage/config/FoliageSpawnRule.d.ts.map +1 -0
- package/src/generation/foliage/config/FoliageSpawnRule.js +135 -0
- package/src/generation/foliage/config/FoliageTileContent.d.ts +9 -0
- package/src/generation/foliage/config/FoliageTileContent.d.ts.map +1 -0
- package/src/generation/foliage/config/FoliageTileContent.js +12 -0
- package/src/generation/foliage/config/LeafApexShape.d.ts +12 -0
- package/src/generation/foliage/config/LeafApexShape.d.ts.map +1 -0
- package/src/generation/foliage/config/LeafApexShape.js +17 -0
- package/src/generation/foliage/config/LeafArchitecture.d.ts +155 -0
- package/src/generation/foliage/config/LeafArchitecture.d.ts.map +1 -0
- package/src/generation/foliage/config/LeafArchitecture.js +288 -0
- package/src/generation/foliage/config/LeafBaseShape.d.ts +14 -0
- package/src/generation/foliage/config/LeafBaseShape.d.ts.map +1 -0
- package/src/generation/foliage/config/LeafBaseShape.js +21 -0
- package/src/generation/foliage/config/LeafLobation.d.ts +10 -0
- package/src/generation/foliage/config/LeafLobation.d.ts.map +1 -0
- package/src/generation/foliage/config/LeafLobation.js +14 -0
- package/src/generation/foliage/config/PhyllotaxisMode.d.ts +11 -0
- package/src/generation/foliage/config/PhyllotaxisMode.d.ts.map +1 -1
- package/src/generation/foliage/config/PhyllotaxisMode.js +36 -0
- package/src/generation/foliage/config/ShootBudZone.d.ts +105 -0
- package/src/generation/foliage/config/ShootBudZone.d.ts.map +1 -0
- package/src/generation/foliage/config/ShootBudZone.js +219 -0
- package/src/generation/foliage/config/ShootGrowthConfig.d.ts +84 -0
- package/src/generation/foliage/config/ShootGrowthConfig.d.ts.map +1 -0
- package/src/generation/foliage/config/ShootGrowthConfig.js +146 -0
- package/src/generation/foliage/config/ShootSystemRule.d.ts +144 -0
- package/src/generation/foliage/config/ShootSystemRule.d.ts.map +1 -0
- package/src/generation/foliage/config/ShootSystemRule.js +316 -0
- package/src/generation/foliage/config/TreeLODConfig.d.ts +1 -1
- package/src/generation/foliage/config/TreeLODConfig.js +1 -1
- package/src/generation/foliage/config/TreeSpeciesConfig.d.ts +40 -8
- package/src/generation/foliage/config/TreeSpeciesConfig.d.ts.map +1 -1
- package/src/generation/foliage/config/TreeSpeciesConfig.js +124 -68
- package/src/generation/foliage/config/TreeWindConfig.d.ts +23 -10
- package/src/generation/foliage/config/TreeWindConfig.d.ts.map +1 -1
- package/src/generation/foliage/config/TreeWindConfig.js +34 -25
- package/src/generation/foliage/index.d.ts +19 -2
- package/src/generation/foliage/index.js +63 -44
- package/src/generation/foliage/material/FoliageAtlasCutout.d.ts +59 -0
- package/src/generation/foliage/material/FoliageAtlasCutout.d.ts.map +1 -0
- package/src/generation/foliage/material/FoliageAtlasCutout.js +93 -0
- package/src/generation/foliage/material/compute_foliage_variant_atlas_layout.d.ts +26 -0
- package/src/generation/foliage/material/compute_foliage_variant_atlas_layout.d.ts.map +1 -0
- package/src/generation/foliage/material/compute_foliage_variant_atlas_layout.js +63 -0
- package/src/generation/foliage/material/foliage_atlas_cutout.d.ts +34 -0
- package/src/generation/foliage/material/foliage_atlas_cutout.d.ts.map +1 -0
- package/src/generation/foliage/material/foliage_atlas_cutout.js +174 -0
- package/src/generation/foliage/material/foliage_tile.d.ts +110 -0
- package/src/generation/foliage/material/foliage_tile.d.ts.map +1 -0
- package/src/generation/foliage/material/foliage_tile.js +286 -0
- package/src/generation/foliage/material/leaf_geometry.d.ts +103 -0
- package/src/generation/foliage/material/leaf_geometry.d.ts.map +1 -0
- package/src/generation/foliage/material/leaf_geometry.js +528 -0
- package/src/generation/foliage/material/make_foliage_material.d.ts +13 -33
- package/src/generation/foliage/material/make_foliage_material.d.ts.map +1 -1
- package/src/generation/foliage/material/make_foliage_material.js +356 -605
- package/src/generation/foliage/mesh/foliage_collect_attachments.d.ts +39 -4
- package/src/generation/foliage/mesh/foliage_collect_attachments.d.ts.map +1 -1
- package/src/generation/foliage/mesh/foliage_collect_attachments.js +637 -569
- package/src/generation/foliage/mesh/interpolate_ring_skin_weights4.d.ts +48 -0
- package/src/generation/foliage/mesh/interpolate_ring_skin_weights4.d.ts.map +1 -0
- package/src/generation/foliage/mesh/interpolate_ring_skin_weights4.js +232 -0
- package/src/generation/foliage/mesh/tree_mesh_build_bark.d.ts.map +1 -1
- package/src/generation/foliage/mesh/tree_mesh_build_bark.js +1023 -1049
- package/src/generation/foliage/mesh/tree_mesh_build_foliage.d.ts +9 -2
- package/src/generation/foliage/mesh/tree_mesh_build_foliage.d.ts.map +1 -1
- package/src/generation/foliage/mesh/tree_mesh_build_foliage.js +467 -454
- package/src/generation/foliage/presets/make_tree_species_preset.d.ts.map +1 -1
- package/src/generation/foliage/presets/make_tree_species_preset.js +1648 -870
- package/src/generation/foliage/skeleton/ShootFrameworkHash.d.ts +35 -0
- package/src/generation/foliage/skeleton/ShootFrameworkHash.d.ts.map +1 -0
- package/src/generation/foliage/skeleton/ShootFrameworkHash.js +129 -0
- package/src/generation/foliage/skeleton/ShootGirth.d.ts +51 -0
- package/src/generation/foliage/skeleton/ShootGirth.d.ts.map +1 -0
- package/src/generation/foliage/skeleton/ShootGirth.js +212 -0
- package/src/generation/foliage/skeleton/ShootLightField.d.ts +73 -0
- package/src/generation/foliage/skeleton/ShootLightField.d.ts.map +1 -0
- package/src/generation/foliage/skeleton/ShootLightField.js +197 -0
- package/src/generation/foliage/skeleton/TreeSkeleton.d.ts +106 -3
- package/src/generation/foliage/skeleton/TreeSkeleton.d.ts.map +1 -1
- package/src/generation/foliage/skeleton/TreeSkeleton.js +217 -39
- package/src/generation/foliage/skeleton/flare_lobe_phase_offset.d.ts +13 -0
- package/src/generation/foliage/skeleton/flare_lobe_phase_offset.d.ts.map +1 -0
- package/src/generation/foliage/skeleton/flare_lobe_phase_offset.js +16 -0
- package/src/generation/foliage/skeleton/foliage_card_density.d.ts +71 -0
- package/src/generation/foliage/skeleton/foliage_card_density.d.ts.map +1 -0
- package/src/generation/foliage/skeleton/foliage_card_density.js +101 -0
- package/src/generation/foliage/skeleton/foliage_senescence.d.ts +101 -0
- package/src/generation/foliage/skeleton/foliage_senescence.d.ts.map +1 -0
- package/src/generation/foliage/skeleton/foliage_senescence.js +149 -0
- package/src/generation/foliage/skeleton/foliage_unit_cards.d.ts +76 -0
- package/src/generation/foliage/skeleton/foliage_unit_cards.d.ts.map +1 -0
- package/src/generation/foliage/skeleton/foliage_unit_cards.js +95 -0
- package/src/generation/foliage/skeleton/shoot_demography.d.ts +22 -0
- package/src/generation/foliage/skeleton/shoot_demography.d.ts.map +1 -0
- package/src/generation/foliage/skeleton/shoot_demography.js +96 -0
- package/src/generation/foliage/skeleton/shoot_geometry.d.ts +66 -0
- package/src/generation/foliage/skeleton/shoot_geometry.d.ts.map +1 -0
- package/src/generation/foliage/skeleton/shoot_geometry.js +109 -0
- package/src/generation/foliage/skeleton/shoot_systems_simulate.d.ts +166 -0
- package/src/generation/foliage/skeleton/shoot_systems_simulate.d.ts.map +1 -0
- package/src/generation/foliage/skeleton/shoot_systems_simulate.js +588 -0
- package/src/generation/foliage/skeleton/tree_skeleton_assign_skin_joints.d.ts +28 -12
- package/src/generation/foliage/skeleton/tree_skeleton_assign_skin_joints.d.ts.map +1 -1
- package/src/generation/foliage/skeleton/tree_skeleton_assign_skin_joints.js +137 -102
- package/src/generation/foliage/skeleton/tree_skeleton_compute_joint_mechanics.d.ts +112 -0
- package/src/generation/foliage/skeleton/tree_skeleton_compute_joint_mechanics.d.ts.map +1 -0
- package/src/generation/foliage/skeleton/tree_skeleton_compute_joint_mechanics.js +408 -0
- package/src/generation/foliage/skeleton/tree_skeleton_compute_pipe_radii.d.ts.map +1 -1
- package/src/generation/foliage/skeleton/tree_skeleton_compute_pipe_radii.js +208 -206
- package/src/generation/foliage/skeleton/tree_skeleton_grow.d.ts +5 -2
- package/src/generation/foliage/skeleton/tree_skeleton_grow.d.ts.map +1 -1
- package/src/generation/foliage/skeleton/tree_skeleton_grow.js +2048 -1871
- package/src/generation/foliage/skeleton/tree_skeleton_grow_shoots.d.ts +17 -0
- package/src/generation/foliage/skeleton/tree_skeleton_grow_shoots.d.ts.map +1 -0
- package/src/generation/foliage/skeleton/tree_skeleton_grow_shoots.js +231 -0
- package/src/generation/foliage/skeleton/tree_skeleton_read_joint_motion.d.ts +14 -0
- package/src/generation/foliage/skeleton/tree_skeleton_read_joint_motion.d.ts.map +1 -0
- package/src/generation/foliage/skeleton/tree_skeleton_read_joint_motion.js +26 -0
- package/src/generation/foliage/skeleton/tree_skeleton_read_joint_parents.d.ts +10 -0
- package/src/generation/foliage/skeleton/tree_skeleton_read_joint_parents.d.ts.map +1 -0
- package/src/generation/foliage/skeleton/tree_skeleton_read_joint_parents.js +20 -0
- package/src/generation/grid/generation/road/GridTaskGenerateRoads.d.ts.map +1 -1
- package/src/generation/grid/generation/road/GridTaskGenerateRoads.js +4 -1
- package/src/generation/markers/GridCellActionPlaceMarkerGroup.d.ts +1 -0
- package/src/generation/markers/GridCellActionPlaceMarkerGroup.d.ts.map +1 -1
- package/src/generation/markers/GridCellActionPlaceMarkerGroup.js +98 -86
- package/src/shade/SHADER_F16_PROPOSAL_2026_10_24.md +263 -0
- package/src/shade/descriptor/WebGPUExtensionType.d.ts +17 -0
- package/src/shade/descriptor/WebGPUExtensionType.d.ts.map +1 -1
- package/src/shade/descriptor/WebGPUExtensionType.js +31 -1
- package/src/shade/playground/foliage_wind/FoliageRigOverlay.d.ts +37 -0
- package/src/shade/playground/foliage_wind/FoliageRigOverlay.d.ts.map +1 -0
- package/src/shade/playground/foliage_wind/FoliageRigOverlay.js +491 -0
- package/src/shade/playground/foliage_wind/foliage_world.d.ts.map +1 -1
- package/src/shade/playground/foliage_wind/foliage_world.js +600 -602
- package/src/shade/playground/foliage_wind/index.html +6 -0
- package/src/shade/playground/foliage_wind/main.js +14 -0
- package/src/shade/renderer/Renderer.d.ts +5 -0
- package/src/shade/renderer/Renderer.d.ts.map +1 -1
- package/src/shade/renderer/Renderer.js +25 -2
- package/src/shade/renderer/animation/GPUAnimationManager.d.ts.map +1 -1
- package/src/shade/renderer/animation/GPUAnimationManager.js +2 -1
- package/src/shade/renderer/animation/foliage/FoliageWindJoint.d.ts +2 -1
- package/src/shade/renderer/animation/foliage/FoliageWindJoint.d.ts.map +1 -1
- package/src/shade/renderer/animation/foliage/FoliageWindJoint.js +2 -1
- package/src/shade/renderer/animation/foliage/chunk_foliage_wind_step.d.ts.map +1 -1
- package/src/shade/renderer/animation/foliage/chunk_foliage_wind_step.js +4 -2
- package/src/shade/renderer/buffer/table/GPUTypedTable.js +1 -1
- package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.d.ts.map +1 -1
- package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.js +403 -401
- package/src/shade/renderer/camera/OrbitalCameraController.d.ts +1 -62
- package/src/shade/renderer/camera/OrbitalCameraController.d.ts.map +1 -1
- package/src/shade/renderer/camera/OrbitalCameraController.js +1 -374
- package/src/shade/renderer/deferred/indirect/chunk_lpv_2d_cache_sample_irradiance.d.ts.map +1 -1
- package/src/shade/renderer/deferred/indirect/chunk_lpv_2d_cache_sample_irradiance.js +3 -0
- package/src/shade/renderer/deferred/indirect/chunk_lpv_sample_light.d.ts.map +1 -1
- package/src/shade/renderer/deferred/indirect/chunk_lpv_sample_light.js +6 -1
- package/src/shade/renderer/dynamic/shader_dynamic_mesh_avboit_splat.js +1 -1
- package/src/shade/renderer/fluid/GPUFluidCascade.d.ts +2 -2
- package/src/shade/renderer/fluid/GPUFluidCascade.d.ts.map +1 -1
- package/src/shade/renderer/fluid/GPUFluidCascade.js +6 -3
- package/src/shade/renderer/fluid/GPU_FLUID_OCCUPANCY_AND_SOTA_REVIEW_2026_10_26.md +361 -0
- package/src/shade/renderer/fluid/coupling/chunk_fluid_cascade_parent.d.ts.map +1 -1
- package/src/shade/renderer/fluid/coupling/chunk_fluid_cascade_parent.js +335 -241
- package/src/shade/renderer/fluid/coupling/shader_fluid_cascade_ghosts.d.ts.map +1 -1
- package/src/shade/renderer/fluid/coupling/shader_fluid_cascade_ghosts.js +108 -101
- package/src/shade/renderer/fluid/forcing/chunk_fluid_forcing_query_select.d.ts.map +1 -1
- package/src/shade/renderer/fluid/forcing/chunk_fluid_forcing_query_select.js +69 -67
- package/src/shade/renderer/fluid/forcing/shader_fluid_forcing_apply.d.ts +7 -6
- package/src/shade/renderer/fluid/forcing/shader_fluid_forcing_apply.d.ts.map +1 -1
- package/src/shade/renderer/fluid/forcing/shader_fluid_forcing_apply.js +341 -287
- package/src/shade/renderer/fluid/mac/FluidMacPasses.d.ts +6 -4
- package/src/shade/renderer/fluid/mac/FluidMacPasses.d.ts.map +1 -1
- package/src/shade/renderer/fluid/mac/FluidMacPasses.js +427 -400
- package/src/shade/renderer/fluid/mac/chunk_fluid_mac_seams.d.ts +10 -5
- package/src/shade/renderer/fluid/mac/chunk_fluid_mac_seams.d.ts.map +1 -1
- package/src/shade/renderer/fluid/mac/chunk_fluid_mac_seams.js +532 -190
- package/src/shade/renderer/fluid/mac/chunk_v3_mac_lattice_corners.d.ts.map +1 -1
- package/src/shade/renderer/fluid/mac/chunk_v3_mac_lattice_corners.js +231 -237
- package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_correct.d.ts +2 -2
- package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_correct.d.ts.map +1 -1
- package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_correct.js +282 -245
- package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_predict.d.ts +1 -3
- package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_predict.d.ts.map +1 -1
- package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_predict.js +139 -109
- package/src/shade/renderer/fluid/mac/shader_fluid_mac_curl.d.ts +6 -6
- package/src/shade/renderer/fluid/mac/shader_fluid_mac_curl.d.ts.map +1 -1
- package/src/shade/renderer/fluid/mac/shader_fluid_mac_curl.js +257 -222
- package/src/shade/renderer/fluid/mac/shader_fluid_mac_divergence.d.ts +8 -7
- package/src/shade/renderer/fluid/mac/shader_fluid_mac_divergence.d.ts.map +1 -1
- package/src/shade/renderer/fluid/mac/shader_fluid_mac_divergence.js +119 -92
- package/src/shade/renderer/fluid/mac/shader_fluid_mac_gradient.d.ts +6 -9
- package/src/shade/renderer/fluid/mac/shader_fluid_mac_gradient.d.ts.map +1 -1
- package/src/shade/renderer/fluid/mac/shader_fluid_mac_gradient.js +229 -181
- package/src/shade/renderer/fluid/pressure/GPUFluidPressureSolve.d.ts +17 -7
- package/src/shade/renderer/fluid/pressure/GPUFluidPressureSolve.d.ts.map +1 -1
- package/src/shade/renderer/fluid/pressure/GPUFluidPressureSolve.js +634 -621
- package/src/shade/renderer/fluid/pressure/shader_fluid_mg_residual_restrict.d.ts +8 -6
- package/src/shade/renderer/fluid/pressure/shader_fluid_mg_residual_restrict.d.ts.map +1 -1
- package/src/shade/renderer/fluid/pressure/shader_fluid_mg_residual_restrict.js +166 -149
- package/src/shade/renderer/fluid/pressure/shader_fluid_mg_smooth.d.ts +8 -6
- package/src/shade/renderer/fluid/pressure/shader_fluid_mg_smooth.d.ts.map +1 -1
- package/src/shade/renderer/fluid/pressure/shader_fluid_mg_smooth.js +219 -183
- package/src/shade/renderer/fluid/publish/shader_fluid_wind_publish.d.ts.map +1 -1
- package/src/shade/renderer/fluid/publish/shader_fluid_wind_publish.js +142 -122
- package/src/shade/renderer/geometry/meshlet/COMPACTION_PLAN_2026_09_16.md +674 -663
- package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.d.ts +1 -1
- package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.d.ts.map +1 -1
- package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.js +63 -29
- package/src/shade/renderer/geometry/meshlet/build/meshoptimizer/geometry_to_meshlets_meshoptimizer.d.ts.map +1 -1
- package/src/shade/renderer/geometry/meshlet/build/meshoptimizer/geometry_to_meshlets_meshoptimizer.js +77 -87
- package/src/shade/renderer/geometry/meshlet/build/meshoptimizer/meshopt_clusterizer.d.ts.map +1 -1
- package/src/shade/renderer/geometry/meshlet/build/meshoptimizer/meshopt_clusterizer.js +4 -3
- package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.d.ts +11 -11
- package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.d.ts.map +1 -1
- package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.js +17 -19
- package/src/shade/renderer/global_illumination/lpv/graph_bake_irradiance_lookup_2d.js +4 -4
- package/src/shade/renderer/global_illumination/probe/octahedral/sample/chunk_lpv_mesh_interpolate_radiance_via_atlas.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe/octahedral/sample/chunk_lpv_mesh_interpolate_radiance_via_atlas.js +5 -1
- package/src/shade/renderer/loader/gltf/load_gltf.d.ts.map +1 -1
- package/src/shade/renderer/loader/gltf/load_gltf.js +11 -35
- package/src/shade/renderer/loader/usd/load_usd.d.ts.map +1 -1
- package/src/shade/renderer/loader/usd/load_usd.js +6 -19
- package/src/shade/renderer/particles/GPUParticleSystem.d.ts +2 -1
- package/src/shade/renderer/particles/GPUParticleSystem.d.ts.map +1 -1
- package/src/shade/renderer/particles/GPUParticleSystem.js +1 -1
- package/src/shade/renderer/particles/graph_particles_avboit.d.ts +2 -2
- package/src/shade/renderer/particles/graph_particles_avboit.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph_particles_avboit.js +4 -9
- package/src/shade/renderer/particles/shaders/shader_particle_avboit_draw.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/shader_particle_avboit_draw.js +199 -193
- package/src/shade/renderer/particles/shaders/shader_particle_avboit_splat.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/shader_particle_avboit_splat.js +151 -143
- package/src/shade/renderer/postprocess/bloom/chunk_karis_blur4x4_sample.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/bloom/chunk_karis_blur4x4_sample.js +11 -5
- package/src/shade/renderer/postprocess/denoise/graph_atorus_denoise_luma.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/denoise/graph_atorus_denoise_luma.js +6 -18
- package/src/shade/renderer/postprocess/gtao/GTAO.js +1 -1
- package/src/shade/renderer/postprocess/gtao/ao_reproject_shader.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/gtao/ao_reproject_shader.js +3 -5
- package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao_with_irradiance.js +1 -1
- package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
- package/src/shade/renderer/postprocess/nss/chunk_nss_luma_derivative.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/nss/chunk_nss_luma_derivative.js +7 -3
- package/src/shade/renderer/postprocess/nss/shader_nss_postprocess.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/nss/shader_nss_postprocess.js +4 -2
- package/src/shade/renderer/postprocess/nss/shader_nss_preprocess.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/nss/shader_nss_preprocess.js +4 -1
- package/src/shade/renderer/postprocess/ssr/downsample_karis.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/ssr/downsample_karis.js +6 -3
- package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_temporal_accumulate.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_temporal_accumulate.js +4 -3
- package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader.js +4 -1
- package/src/shade/renderer/postprocess/ssr/ssr_spatial_denoise_shader.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/ssr/ssr_spatial_denoise_shader.js +4 -2
- package/src/shade/renderer/postprocess/taa/chunk_taa_tonemap.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/taa/chunk_taa_tonemap.js +35 -39
- package/src/shade/renderer/postprocess/taa/chunk_taa_tonemap_inv.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/taa/chunk_taa_tonemap_inv.js +20 -17
- package/src/shade/renderer/postprocess/taa/shader_taa.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/taa/shader_taa.js +6 -3
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.js +3 -1
- package/src/shade/renderer/rasterize/native/avboit/avboit_draw_fragment_body.js +1 -1
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_splat_slice.js +2 -2
- package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.js +1 -1
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_integrate.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_integrate.js +92 -83
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_splat.js +1 -1
- package/src/shade/renderer/shader/ShaderDescriptor.d.ts.map +1 -1
- package/src/shade/renderer/shader/ShaderDescriptor.js +12 -4
- package/src/shade/renderer/shader/chunk/bvh/chunk_bvh_query_aabb_cooperative.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/bvh/chunk_bvh_query_aabb_cooperative.js +294 -286
- package/src/shade/renderer/shader/chunk/light/lpv/chunk_lpv_interpolate_probe_irradiance8.js +5 -5
- package/src/shade/renderer/shader/chunk/light/lpv/chunk_lpv_mesh_interpolate_probe.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/light/lpv/chunk_lpv_mesh_interpolate_probe.js +5 -3
- package/src/shade/renderer/shader/chunk/light/lpv/chunk_lpv_mesh_interpolate_probe_irradiance.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/light/lpv/chunk_lpv_mesh_interpolate_probe_irradiance.js +9 -6
- package/src/shade/renderer/shader/chunk/light/lpv/chunk_lpv_sample_sh3_at.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/light/lpv/chunk_lpv_sample_sh3_at.js +33 -38
- package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.d.ts.map +1 -1
- package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.js +690 -675
- package/src/shade/renderer/shader/type/WebGPUArray.d.ts +3 -0
- package/src/shade/renderer/shader/type/WebGPUArray.d.ts.map +1 -1
- package/src/shade/renderer/shader/type/WebGPUArray.js +185 -167
- package/src/shade/renderer/shader/type/WebGPUStruct.d.ts.map +1 -1
- package/src/shade/renderer/shader/type/WebGPUStruct.js +461 -455
- package/src/shade/renderer/shader/type/serde/read_gpu_typed_buffer.d.ts.map +1 -1
- package/src/shade/renderer/shader/type/serde/read_gpu_typed_buffer.js +335 -211
- package/src/shade/renderer/shader/type/serde/write_gpu_typed_buffer.d.ts.map +1 -1
- package/src/shade/renderer/shader/type/serde/write_gpu_typed_buffer.js +329 -221
- package/src/shade/renderer/shader/type/type_has_f16.d.ts +12 -0
- package/src/shade/renderer/shader/type/type_has_f16.d.ts.map +1 -0
- package/src/shade/renderer/shader/type/type_has_f16.js +66 -0
- package/src/shade/renderer/view/GPUViewContext.d.ts +0 -14
- package/src/shade/renderer/view/GPUViewContext.d.ts.map +1 -1
- package/src/shade/renderer/view/GPUViewContext.js +0 -29
- package/src/shade/renderer/view/ViewManager.d.ts +1 -1
- package/src/shade/renderer/view/ViewManager.js +1 -1
- package/src/shade/renderer/volumetrics/GPUViewVolumetrics.d.ts +40 -3
- package/src/shade/renderer/volumetrics/GPUViewVolumetrics.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/GPUViewVolumetrics.js +660 -583
- package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.js +16 -2
- package/src/shade/renderer/volumetrics/taa/shader_volumetrics_taa.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/taa/shader_volumetrics_taa.js +5 -2
- package/src/shade/renderer/water/shader_water_avboit.js +1 -1
- package/src/shade/renderer/wind/GPUSceneWind.d.ts +1 -1
- package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.d.ts.map +1 -1
- package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js +260 -23
- package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts +6 -7
- package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts.map +1 -1
- package/src/shade/wgsl/emulator/WGSLLanguageCore.js +269 -69
- package/src/shade/wgsl/validate_wgsl_source.d.ts.map +1 -1
- package/src/shade/wgsl/validate_wgsl_source.js +27 -1
- package/src/view/controller/controls/ListController.d.ts.map +1 -1
- package/src/view/controller/controls/ListController.js +118 -113
- package/src/view/controller/controls/Vector1Control.js +97 -97
- package/src/view/elements/image/SvgImageView.d.ts +1 -0
- package/src/view/elements/image/SvgImageView.d.ts.map +1 -1
- package/src/view/elements/image/SvgImageView.js +92 -90
- package/src/view/minimap/dom/MinimapTerrainView.d.ts +1 -0
- package/src/view/minimap/dom/MinimapTerrainView.d.ts.map +1 -1
- package/src/view/minimap/dom/MinimapTerrainView.js +151 -147
- package/src/view/tooltip/gml/TooltipParser.js +2 -2
- package/src/engine/network/PriorityFetch.d.ts +0 -59
- package/src/engine/network/PriorityFetch.d.ts.map +0 -1
- package/src/engine/network/PriorityFetch.js +0 -193
- package/src/generation/foliage/config/BranchLevelConfig.d.ts.map +0 -1
- package/src/shade/renderer/volumetrics/VOLUMETRICS_RESOLUTION_Z.d.ts +0 -2
- package/src/shade/renderer/volumetrics/VOLUMETRICS_RESOLUTION_Z.d.ts.map +0 -1
- package/src/shade/renderer/volumetrics/VOLUMETRICS_RESOLUTION_Z.js +0 -1
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ontogenetic maturity of atlas variant `variant`: 0 for the juvenile apical flush, 1 for mature basal foliage.
|
|
3
|
+
*
|
|
4
|
+
* @param {number} variant
|
|
5
|
+
* @param {number} variant_count
|
|
6
|
+
* @returns {number}
|
|
7
|
+
*/
|
|
8
|
+
export function foliage_variant_maturity(variant: number, variant_count: number): number;
|
|
9
|
+
/**
|
|
10
|
+
* How far a tile of maturity `mu` has senesced at the tree's `senescence`. Tiles are staggered, so an autumn crown
|
|
11
|
+
* shows leaf-to-leaf diversity: juvenile and mature tiles run ahead of the ones in between.
|
|
12
|
+
*
|
|
13
|
+
* @param {number} senescence `[0, 1]`
|
|
14
|
+
* @param {number} mu tile maturity, see {@link foliage_variant_maturity}
|
|
15
|
+
* @returns {number} the tile's senescence stage `sigma_k`, `[0, 1]`
|
|
16
|
+
*/
|
|
17
|
+
export function foliage_variant_senescence(senescence: number, mu: number): number;
|
|
18
|
+
/**
|
|
19
|
+
* The tree senescence at which a tile of maturity `mu` has lost the chlorophyll of its exposed lamina: its nutrients
|
|
20
|
+
* are resorbed and the abscission layer can close, so the first of its leaves may fall. Solves
|
|
21
|
+
* {@link foliage_variant_senescence} `= 1 / FOLIAGE_CHLOROPHYLL_LOSS_RATE` for the tree's senescence.
|
|
22
|
+
*
|
|
23
|
+
* @param {number} mu
|
|
24
|
+
* @returns {number} `(0, 1]`
|
|
25
|
+
*/
|
|
26
|
+
export function foliage_variant_abscission_onset(mu: number): number;
|
|
27
|
+
/**
|
|
28
|
+
* Ontogenetic maturity of a leaf, `[0, 1]`: acropetal along its shoot (the distal tip is juvenile, basal nodes
|
|
29
|
+
* mature), and younger on the crown's shell than in its shaded core. It picks the atlas variant the leaf shows.
|
|
30
|
+
*
|
|
31
|
+
* @param {number} u_shoot position along the carrying shoot's leafy span, 0 at its base, 1 at its tip
|
|
32
|
+
* @param {number} rho_shell see {@link foliage_crown_rho}
|
|
33
|
+
* @param {number} jitter per-leaf jitter in `[-1, 1]`; 0 for the expected leaf
|
|
34
|
+
* @returns {number}
|
|
35
|
+
*/
|
|
36
|
+
export function foliage_leaf_maturity(u_shoot: number, rho_shell: number, jitter: number): number;
|
|
37
|
+
/**
|
|
38
|
+
* Atlas variant shown by a leaf of maturity `maturity`.
|
|
39
|
+
*
|
|
40
|
+
* @param {number} maturity
|
|
41
|
+
* @param {number} variant_count
|
|
42
|
+
* @returns {number}
|
|
43
|
+
*/
|
|
44
|
+
export function foliage_leaf_variant(maturity: number, variant_count: number): number;
|
|
45
|
+
/**
|
|
46
|
+
* Ellipsoidal radius of a point in the grown crown: 0 at its centre, 1 on its shell and beyond.
|
|
47
|
+
*
|
|
48
|
+
* @param {import("./TreeSkeleton.js").TreeSkeleton} skeleton
|
|
49
|
+
* @param {number} x
|
|
50
|
+
* @param {number} y
|
|
51
|
+
* @param {number} z
|
|
52
|
+
* @returns {number}
|
|
53
|
+
*/
|
|
54
|
+
export function foliage_crown_rho(skeleton: import("./TreeSkeleton.js").TreeSkeleton, x: number, y: number, z: number): number;
|
|
55
|
+
/**
|
|
56
|
+
* Height of `y` across the configured crown: 0 at its base, 1 at its top.
|
|
57
|
+
*
|
|
58
|
+
* @param {import("../config/CrownConfig.js").CrownConfig} crown
|
|
59
|
+
* @param {number} y
|
|
60
|
+
* @returns {number}
|
|
61
|
+
*/
|
|
62
|
+
export function foliage_crown_height_norm(crown: import("../config/CrownConfig.js").CrownConfig, y: number): number;
|
|
63
|
+
/**
|
|
64
|
+
* How exposed a leaf is to sun, cold and wind, from 0 (shaded interior) to 1 (crown surface, high up). The crown
|
|
65
|
+
* shell term is the leaf's ellipsoidal radius in the crown, `rho`, the height term its height across the crown.
|
|
66
|
+
*
|
|
67
|
+
* @param {number} rho_shell normalized distance from the crown centre, `[0, 1]`
|
|
68
|
+
* @param {number} h_norm normalized height in the crown, `[0, 1]`
|
|
69
|
+
* @returns {number}
|
|
70
|
+
*/
|
|
71
|
+
export function foliage_sun_exposure(rho_shell: number, h_norm: number): number;
|
|
72
|
+
/**
|
|
73
|
+
* The senescence at which a leaf is shed. No leaf falls before its tile has lost the chlorophyll of its exposed
|
|
74
|
+
* lamina (`onset`, {@link foliage_variant_abscission_onset}); after that, outer and apical leaves go first: a leaf at
|
|
75
|
+
* the crown's surface and at its shoot's tip (`sun_exposure = u_shoot = 1`) falls at `onset`, a shaded basal one last,
|
|
76
|
+
* at 1.
|
|
77
|
+
*
|
|
78
|
+
* @param {number} onset its tile's abscission onset
|
|
79
|
+
* @param {number} sun_exposure see {@link foliage_sun_exposure}
|
|
80
|
+
* @param {number} u_shoot position along the carrying shoot's leafy span, 0 at its base, 1 at its tip
|
|
81
|
+
* @returns {number} in `[onset, 1]`
|
|
82
|
+
*/
|
|
83
|
+
export function foliage_abscission_threshold(onset: number, sun_exposure: number, u_shoot: number): number;
|
|
84
|
+
/**
|
|
85
|
+
* How far a still-attached leaf has dried, `[0, 1)`: 0 while its tile still has chlorophyll (it is turgid), rising
|
|
86
|
+
* from its tile's onset to 1 at its own abscission threshold.
|
|
87
|
+
*
|
|
88
|
+
* @param {number} senescence
|
|
89
|
+
* @param {number} onset its tile's abscission onset
|
|
90
|
+
* @param {number} threshold see {@link foliage_abscission_threshold}
|
|
91
|
+
* @returns {number}
|
|
92
|
+
*/
|
|
93
|
+
export function foliage_leaf_dryness(senescence: number, onset: number, threshold: number): number;
|
|
94
|
+
/**
|
|
95
|
+
* Rate at which senescence strips chlorophyll from the exposed lamina in the leaf pigment model
|
|
96
|
+
* (`make_foliage_material`): a tile at senescence stage `sigma_k` retains `1 - sigma_k * (rate - shielding)` of its
|
|
97
|
+
* chlorophyll, so its most exposed lamina is bare of it once `sigma_k` reaches `1 / rate`.
|
|
98
|
+
* @type {number}
|
|
99
|
+
*/
|
|
100
|
+
export const FOLIAGE_CHLOROPHYLL_LOSS_RATE: number;
|
|
101
|
+
//# sourceMappingURL=foliage_senescence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"foliage_senescence.d.ts","sourceRoot":"","sources":["../../../../../src/generation/foliage/skeleton/foliage_senescence.js"],"names":[],"mappings":"AAUA;;;;;;GAMG;AACH,kDAJW,MAAM,iBACN,MAAM,GACJ,MAAM,CAIlB;AAED;;;;;;;GAOG;AACH,uDAJW,MAAM,MACN,MAAM,GACJ,MAAM,CAOlB;AAED;;;;;;;GAOG;AACH,qDAHW,MAAM,GACJ,MAAM,CAOlB;AAED;;;;;;;;GAQG;AACH,+CALW,MAAM,aACN,MAAM,UACN,MAAM,GACJ,MAAM,CAIlB;AAED;;;;;;GAMG;AACH,+CAJW,MAAM,iBACN,MAAM,GACJ,MAAM,CAIlB;AAED;;;;;;;;GAQG;AACH,4CANW,OAAO,mBAAmB,EAAE,YAAY,KACxC,MAAM,KACN,MAAM,KACN,MAAM,GACJ,MAAM,CASlB;AAED;;;;;;GAMG;AACH,iDAJW,OAAO,0BAA0B,EAAE,WAAW,KAC9C,MAAM,GACJ,MAAM,CAIlB;AAED;;;;;;;GAOG;AACH,gDAJW,MAAM,UACN,MAAM,GACJ,MAAM,CAIlB;AAED;;;;;;;;;;GAUG;AACH,oDALW,MAAM,gBACN,MAAM,WACN,MAAM,GACJ,MAAM,CAKlB;AAED;;;;;;;;GAQG;AACH,iDALW,MAAM,SACN,MAAM,aACN,MAAM,GACJ,MAAM,CASlB;AAlJD;;;;;GAKG;AACH,4CAFU,MAAM,CAEkC"}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { clamp } from "../../../core/math/clamp.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Rate at which senescence strips chlorophyll from the exposed lamina in the leaf pigment model
|
|
5
|
+
* (`make_foliage_material`): a tile at senescence stage `sigma_k` retains `1 - sigma_k * (rate - shielding)` of its
|
|
6
|
+
* chlorophyll, so its most exposed lamina is bare of it once `sigma_k` reaches `1 / rate`.
|
|
7
|
+
* @type {number}
|
|
8
|
+
*/
|
|
9
|
+
export const FOLIAGE_CHLOROPHYLL_LOSS_RATE = 1.36;
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Ontogenetic maturity of atlas variant `variant`: 0 for the juvenile apical flush, 1 for mature basal foliage.
|
|
13
|
+
*
|
|
14
|
+
* @param {number} variant
|
|
15
|
+
* @param {number} variant_count
|
|
16
|
+
* @returns {number}
|
|
17
|
+
*/
|
|
18
|
+
export function foliage_variant_maturity(variant, variant_count) {
|
|
19
|
+
return variant_count > 1 ? variant / (variant_count - 1) : 0.65;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* How far a tile of maturity `mu` has senesced at the tree's `senescence`. Tiles are staggered, so an autumn crown
|
|
24
|
+
* shows leaf-to-leaf diversity: juvenile and mature tiles run ahead of the ones in between.
|
|
25
|
+
*
|
|
26
|
+
* @param {number} senescence `[0, 1]`
|
|
27
|
+
* @param {number} mu tile maturity, see {@link foliage_variant_maturity}
|
|
28
|
+
* @returns {number} the tile's senescence stage `sigma_k`, `[0, 1]`
|
|
29
|
+
*/
|
|
30
|
+
export function foliage_variant_senescence(senescence, mu) {
|
|
31
|
+
if (senescence <= 0.0) {
|
|
32
|
+
return 0.0;
|
|
33
|
+
}
|
|
34
|
+
return clamp(senescence * (0.80 + 0.36 * Math.abs(mu - 0.35)) + senescence * senescence * 0.12, 0.0, 1.0);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* The tree senescence at which a tile of maturity `mu` has lost the chlorophyll of its exposed lamina: its nutrients
|
|
39
|
+
* are resorbed and the abscission layer can close, so the first of its leaves may fall. Solves
|
|
40
|
+
* {@link foliage_variant_senescence} `= 1 / FOLIAGE_CHLOROPHYLL_LOSS_RATE` for the tree's senescence.
|
|
41
|
+
*
|
|
42
|
+
* @param {number} mu
|
|
43
|
+
* @returns {number} `(0, 1]`
|
|
44
|
+
*/
|
|
45
|
+
export function foliage_variant_abscission_onset(mu) {
|
|
46
|
+
const a = 0.80 + 0.36 * Math.abs(mu - 0.35);
|
|
47
|
+
const c = 1.0 / FOLIAGE_CHLOROPHYLL_LOSS_RATE;
|
|
48
|
+
// 0.12 s^2 + a s - c = 0
|
|
49
|
+
return Math.min(1.0, (-a + Math.sqrt(a * a + 4.0 * 0.12 * c)) / (2.0 * 0.12));
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Ontogenetic maturity of a leaf, `[0, 1]`: acropetal along its shoot (the distal tip is juvenile, basal nodes
|
|
54
|
+
* mature), and younger on the crown's shell than in its shaded core. It picks the atlas variant the leaf shows.
|
|
55
|
+
*
|
|
56
|
+
* @param {number} u_shoot position along the carrying shoot's leafy span, 0 at its base, 1 at its tip
|
|
57
|
+
* @param {number} rho_shell see {@link foliage_crown_rho}
|
|
58
|
+
* @param {number} jitter per-leaf jitter in `[-1, 1]`; 0 for the expected leaf
|
|
59
|
+
* @returns {number}
|
|
60
|
+
*/
|
|
61
|
+
export function foliage_leaf_maturity(u_shoot, rho_shell, jitter) {
|
|
62
|
+
return clamp(0.66 * (1.0 - u_shoot) + 0.24 * (1.0 - rho_shell) + 0.05 + 0.07 * jitter, 0.0, 1.0);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Atlas variant shown by a leaf of maturity `maturity`.
|
|
67
|
+
*
|
|
68
|
+
* @param {number} maturity
|
|
69
|
+
* @param {number} variant_count
|
|
70
|
+
* @returns {number}
|
|
71
|
+
*/
|
|
72
|
+
export function foliage_leaf_variant(maturity, variant_count) {
|
|
73
|
+
return clamp(Math.floor(maturity * variant_count), 0, variant_count - 1);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Ellipsoidal radius of a point in the grown crown: 0 at its centre, 1 on its shell and beyond.
|
|
78
|
+
*
|
|
79
|
+
* @param {import("./TreeSkeleton.js").TreeSkeleton} skeleton
|
|
80
|
+
* @param {number} x
|
|
81
|
+
* @param {number} y
|
|
82
|
+
* @param {number} z
|
|
83
|
+
* @returns {number}
|
|
84
|
+
*/
|
|
85
|
+
export function foliage_crown_rho(skeleton, x, y, z) {
|
|
86
|
+
const c = skeleton.crown_center;
|
|
87
|
+
const r = skeleton.crown_radii;
|
|
88
|
+
const dx = (x - c[0]) / Math.max(0.5, r[0]);
|
|
89
|
+
const dy = (y - c[1]) / Math.max(0.5, r[1]);
|
|
90
|
+
const dz = (z - c[2]) / Math.max(0.5, r[2]);
|
|
91
|
+
return clamp(Math.sqrt(dx * dx + dy * dy + dz * dz), 0.0, 1.0);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Height of `y` across the configured crown: 0 at its base, 1 at its top.
|
|
96
|
+
*
|
|
97
|
+
* @param {import("../config/CrownConfig.js").CrownConfig} crown
|
|
98
|
+
* @param {number} y
|
|
99
|
+
* @returns {number}
|
|
100
|
+
*/
|
|
101
|
+
export function foliage_crown_height_norm(crown, y) {
|
|
102
|
+
return clamp((y - crown.base_height) / Math.max(0.1, crown.height), 0.0, 1.0);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* How exposed a leaf is to sun, cold and wind, from 0 (shaded interior) to 1 (crown surface, high up). The crown
|
|
107
|
+
* shell term is the leaf's ellipsoidal radius in the crown, `rho`, the height term its height across the crown.
|
|
108
|
+
*
|
|
109
|
+
* @param {number} rho_shell normalized distance from the crown centre, `[0, 1]`
|
|
110
|
+
* @param {number} h_norm normalized height in the crown, `[0, 1]`
|
|
111
|
+
* @returns {number}
|
|
112
|
+
*/
|
|
113
|
+
export function foliage_sun_exposure(rho_shell, h_norm) {
|
|
114
|
+
return clamp(0.62 * rho_shell + 0.38 * h_norm, 0.0, 1.0);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* The senescence at which a leaf is shed. No leaf falls before its tile has lost the chlorophyll of its exposed
|
|
119
|
+
* lamina (`onset`, {@link foliage_variant_abscission_onset}); after that, outer and apical leaves go first: a leaf at
|
|
120
|
+
* the crown's surface and at its shoot's tip (`sun_exposure = u_shoot = 1`) falls at `onset`, a shaded basal one last,
|
|
121
|
+
* at 1.
|
|
122
|
+
*
|
|
123
|
+
* @param {number} onset its tile's abscission onset
|
|
124
|
+
* @param {number} sun_exposure see {@link foliage_sun_exposure}
|
|
125
|
+
* @param {number} u_shoot position along the carrying shoot's leafy span, 0 at its base, 1 at its tip
|
|
126
|
+
* @returns {number} in `[onset, 1]`
|
|
127
|
+
*/
|
|
128
|
+
export function foliage_abscission_threshold(onset, sun_exposure, u_shoot) {
|
|
129
|
+
const exposure_order = 0.5 * (clamp(sun_exposure, 0.0, 1.0) + clamp(u_shoot, 0.0, 1.0));
|
|
130
|
+
return onset + (1.0 - onset) * (1.0 - exposure_order);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* How far a still-attached leaf has dried, `[0, 1)`: 0 while its tile still has chlorophyll (it is turgid), rising
|
|
135
|
+
* from its tile's onset to 1 at its own abscission threshold.
|
|
136
|
+
*
|
|
137
|
+
* @param {number} senescence
|
|
138
|
+
* @param {number} onset its tile's abscission onset
|
|
139
|
+
* @param {number} threshold see {@link foliage_abscission_threshold}
|
|
140
|
+
* @returns {number}
|
|
141
|
+
*/
|
|
142
|
+
export function foliage_leaf_dryness(senescence, onset, threshold) {
|
|
143
|
+
const span = threshold - onset;
|
|
144
|
+
if (span <= 1e-9) {
|
|
145
|
+
// it falls the moment its tile's chlorophyll goes: attached, it has not begun to dry
|
|
146
|
+
return 0.0;
|
|
147
|
+
}
|
|
148
|
+
return clamp((senescence - onset) / span, 0.0, 1.0);
|
|
149
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Leaves an annual unit `length` metres long bears, before any have fallen: `leaves_per_unit + leaves_per_metre *
|
|
3
|
+
* length`, or a short shoot's `leaves_per_short_shoot`, every year.
|
|
4
|
+
*
|
|
5
|
+
* @param {import("../config/TreeSpeciesConfig.js").TreeSpeciesConfig} species
|
|
6
|
+
* @param {boolean} short_shoot
|
|
7
|
+
* @param {number} length
|
|
8
|
+
* @returns {number}
|
|
9
|
+
*/
|
|
10
|
+
export function foliage_unit_leaf_count(species: import("../config/TreeSpeciesConfig.js").TreeSpeciesConfig, short_shoot: boolean, length: number): number;
|
|
11
|
+
/**
|
|
12
|
+
* @typedef {Object} FoliageUnitCardSpan
|
|
13
|
+
* @property {number} age years since the unit grew, 0 for this year's
|
|
14
|
+
* @property {number} t_min where the cards hang, as `t_norm` along the branch: card `k` of `count` hangs at
|
|
15
|
+
* `lerp(t_min, t_max, (k + slot) / count)`, the slot by what a card draws; a short shoot's all at its tip
|
|
16
|
+
* @property {number} t_max
|
|
17
|
+
* @property {number} count cards
|
|
18
|
+
* @property {number} scale card size relative to the species' card
|
|
19
|
+
* @property {number} u_min where along the branch's leafy growth the first card's leaves sit, 0 at its oldest end, 1 at
|
|
20
|
+
* its tip; card `k` is at `lerp(u_min, u_max, (k + 0.5) / count)`. Equal ends draw one place for every card.
|
|
21
|
+
* @property {number} u_max
|
|
22
|
+
* @property {number} unit_t_min the unit the cards grow on, whose wood carries them
|
|
23
|
+
* @property {number} unit_t_max
|
|
24
|
+
*/
|
|
25
|
+
/**
|
|
26
|
+
* Leaf cards of foliage `rule` on branch `b`, grown by annual units (`TreeSkeleton.branch_unit_count[b] > 0`): one
|
|
27
|
+
* span per unit young enough to carry leaves (`FoliageConfig.leaf_survival`), oldest first.
|
|
28
|
+
*
|
|
29
|
+
* A unit carries its leaves, `leaves_per_unit + leaves_per_metre *` its length (a short shoot:
|
|
30
|
+
* `leaves_per_short_shoot` a year), kept by `leaf_survival[age]`, over the leaves a card draws
|
|
31
|
+
* (`foliage_tile_layout`): one card a leaf, or a needle shoot's needles a card. The count is rounded with a dither per
|
|
32
|
+
* branch and age so it is exact on average. Every card is the species' card, so leaves keep their size whatever the
|
|
33
|
+
* shoot. A short shoot's leaves are crowded at its tip, and each short shoot draws its own leaf maturity; elsewhere
|
|
34
|
+
* maturity follows the card's place along the branch's leafy growth.
|
|
35
|
+
*
|
|
36
|
+
* @param {import("./TreeSkeleton.js").TreeSkeleton} skeleton
|
|
37
|
+
* @param {import("../config/TreeSpeciesConfig.js").TreeSpeciesConfig} species
|
|
38
|
+
* @param {number} b
|
|
39
|
+
* @param {import("../config/FoliageSpawnRule.js").FoliageSpawnRule} rule
|
|
40
|
+
* @param {number} leaves_per_card `FoliageTileLayout.leaves_per_card`
|
|
41
|
+
* @param {FoliageUnitCardSpan[]} out cleared and filled
|
|
42
|
+
* @returns {FoliageUnitCardSpan[]} `out`
|
|
43
|
+
*/
|
|
44
|
+
export function foliage_unit_card_spans(skeleton: import("./TreeSkeleton.js").TreeSkeleton, species: import("../config/TreeSpeciesConfig.js").TreeSpeciesConfig, b: number, rule: import("../config/FoliageSpawnRule.js").FoliageSpawnRule, leaves_per_card: number, out: FoliageUnitCardSpan[]): FoliageUnitCardSpan[];
|
|
45
|
+
export type FoliageUnitCardSpan = {
|
|
46
|
+
/**
|
|
47
|
+
* years since the unit grew, 0 for this year's
|
|
48
|
+
*/
|
|
49
|
+
age: number;
|
|
50
|
+
/**
|
|
51
|
+
* where the cards hang, as `t_norm` along the branch: card `k` of `count` hangs at
|
|
52
|
+
* `lerp(t_min, t_max, (k + slot) / count)`, the slot by what a card draws; a short shoot's all at its tip
|
|
53
|
+
*/
|
|
54
|
+
t_min: number;
|
|
55
|
+
t_max: number;
|
|
56
|
+
/**
|
|
57
|
+
* cards
|
|
58
|
+
*/
|
|
59
|
+
count: number;
|
|
60
|
+
/**
|
|
61
|
+
* card size relative to the species' card
|
|
62
|
+
*/
|
|
63
|
+
scale: number;
|
|
64
|
+
/**
|
|
65
|
+
* where along the branch's leafy growth the first card's leaves sit, 0 at its oldest end, 1 at
|
|
66
|
+
* its tip; card `k` is at `lerp(u_min, u_max, (k + 0.5) / count)`. Equal ends draw one place for every card.
|
|
67
|
+
*/
|
|
68
|
+
u_min: number;
|
|
69
|
+
u_max: number;
|
|
70
|
+
/**
|
|
71
|
+
* the unit the cards grow on, whose wood carries them
|
|
72
|
+
*/
|
|
73
|
+
unit_t_min: number;
|
|
74
|
+
unit_t_max: number;
|
|
75
|
+
};
|
|
76
|
+
//# sourceMappingURL=foliage_unit_cards.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"foliage_unit_cards.d.ts","sourceRoot":"","sources":["../../../../../src/generation/foliage/skeleton/foliage_unit_cards.js"],"names":[],"mappings":"AAMA;;;;;;;;GAQG;AACH,iDALW,OAAO,gCAAgC,EAAE,iBAAiB,eAC1D,OAAO,UACP,MAAM,GACJ,MAAM,CAMlB;AAED;;;;;;;;;;;;;GAaG;AAEH;;;;;;;;;;;;;;;;;;GAkBG;AACH,kDARW,OAAO,mBAAmB,EAAE,YAAY,WACxC,OAAO,gCAAgC,EAAE,iBAAiB,KAC1D,MAAM,QACN,OAAO,+BAA+B,EAAE,gBAAgB,mBACxD,MAAM,OACN,mBAAmB,EAAE,GACnB,mBAAmB,EAAE,CAyCjC;;;;;SAvEa,MAAM;;;;;WACN,MAAM;WAEN,MAAM;;;;WACN,MAAM;;;;WACN,MAAM;;;;;WACN,MAAM;WAEN,MAAM;;;;gBACN,MAAM;gBACN,MAAM"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `1 / golden ratio`: the per-age step of the dither that rounds a thinned cohort's card count.
|
|
3
|
+
* @type {number}
|
|
4
|
+
*/
|
|
5
|
+
const GOLDEN_CONJUGATE = 0.6180339887498949;
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Leaves an annual unit `length` metres long bears, before any have fallen: `leaves_per_unit + leaves_per_metre *
|
|
9
|
+
* length`, or a short shoot's `leaves_per_short_shoot`, every year.
|
|
10
|
+
*
|
|
11
|
+
* @param {import("../config/TreeSpeciesConfig.js").TreeSpeciesConfig} species
|
|
12
|
+
* @param {boolean} short_shoot
|
|
13
|
+
* @param {number} length
|
|
14
|
+
* @returns {number}
|
|
15
|
+
*/
|
|
16
|
+
export function foliage_unit_leaf_count(species, short_shoot, length) {
|
|
17
|
+
return short_shoot
|
|
18
|
+
? species.foliage.leaves_per_short_shoot
|
|
19
|
+
: species.foliage.leaves_per_unit + species.foliage.leaves_per_metre * length;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* @typedef {Object} FoliageUnitCardSpan
|
|
24
|
+
* @property {number} age years since the unit grew, 0 for this year's
|
|
25
|
+
* @property {number} t_min where the cards hang, as `t_norm` along the branch: card `k` of `count` hangs at
|
|
26
|
+
* `lerp(t_min, t_max, (k + slot) / count)`, the slot by what a card draws; a short shoot's all at its tip
|
|
27
|
+
* @property {number} t_max
|
|
28
|
+
* @property {number} count cards
|
|
29
|
+
* @property {number} scale card size relative to the species' card
|
|
30
|
+
* @property {number} u_min where along the branch's leafy growth the first card's leaves sit, 0 at its oldest end, 1 at
|
|
31
|
+
* its tip; card `k` is at `lerp(u_min, u_max, (k + 0.5) / count)`. Equal ends draw one place for every card.
|
|
32
|
+
* @property {number} u_max
|
|
33
|
+
* @property {number} unit_t_min the unit the cards grow on, whose wood carries them
|
|
34
|
+
* @property {number} unit_t_max
|
|
35
|
+
*/
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Leaf cards of foliage `rule` on branch `b`, grown by annual units (`TreeSkeleton.branch_unit_count[b] > 0`): one
|
|
39
|
+
* span per unit young enough to carry leaves (`FoliageConfig.leaf_survival`), oldest first.
|
|
40
|
+
*
|
|
41
|
+
* A unit carries its leaves, `leaves_per_unit + leaves_per_metre *` its length (a short shoot:
|
|
42
|
+
* `leaves_per_short_shoot` a year), kept by `leaf_survival[age]`, over the leaves a card draws
|
|
43
|
+
* (`foliage_tile_layout`): one card a leaf, or a needle shoot's needles a card. The count is rounded with a dither per
|
|
44
|
+
* branch and age so it is exact on average. Every card is the species' card, so leaves keep their size whatever the
|
|
45
|
+
* shoot. A short shoot's leaves are crowded at its tip, and each short shoot draws its own leaf maturity; elsewhere
|
|
46
|
+
* maturity follows the card's place along the branch's leafy growth.
|
|
47
|
+
*
|
|
48
|
+
* @param {import("./TreeSkeleton.js").TreeSkeleton} skeleton
|
|
49
|
+
* @param {import("../config/TreeSpeciesConfig.js").TreeSpeciesConfig} species
|
|
50
|
+
* @param {number} b
|
|
51
|
+
* @param {import("../config/FoliageSpawnRule.js").FoliageSpawnRule} rule
|
|
52
|
+
* @param {number} leaves_per_card `FoliageTileLayout.leaves_per_card`
|
|
53
|
+
* @param {FoliageUnitCardSpan[]} out cleared and filled
|
|
54
|
+
* @returns {FoliageUnitCardSpan[]} `out`
|
|
55
|
+
*/
|
|
56
|
+
export function foliage_unit_card_spans(skeleton, species, b, rule, leaves_per_card, out) {
|
|
57
|
+
out.length = 0;
|
|
58
|
+
const units = skeleton.branch_unit_count[b];
|
|
59
|
+
if (units === 0) {
|
|
60
|
+
return out;
|
|
61
|
+
}
|
|
62
|
+
const survival = species.foliage.leaf_survival;
|
|
63
|
+
const at_tip = rule.short_shoot;
|
|
64
|
+
const branch_length = skeleton.branch_length[b];
|
|
65
|
+
const phase = skeleton.branch_phase_hash[b];
|
|
66
|
+
|
|
67
|
+
const cohorts = Math.min(units, survival.length);
|
|
68
|
+
for (let age = cohorts - 1; age >= 0; age--) {
|
|
69
|
+
const t0 = skeleton.branch_unit_start_t(b, age);
|
|
70
|
+
const t1 = age > 0 ? skeleton.branch_unit_start_t(b, age - 1) : 1.0;
|
|
71
|
+
const length = Math.max(0.0, t1 - t0) * branch_length;
|
|
72
|
+
|
|
73
|
+
const leaves = foliage_unit_leaf_count(species, rule.short_shoot, length);
|
|
74
|
+
const dither = (phase + age * GOLDEN_CONJUGATE) % 1.0;
|
|
75
|
+
const count = Math.floor(leaves * survival[age] / Math.max(1, leaves_per_card) + dither);
|
|
76
|
+
if (count === 0) continue;
|
|
77
|
+
|
|
78
|
+
// the oldest leaf-bearing unit is the base of the branch's leafy growth, this year's its tip
|
|
79
|
+
const u0 = (cohorts - 1 - age) / cohorts;
|
|
80
|
+
const u1 = (cohorts - age) / cohorts;
|
|
81
|
+
out.push({
|
|
82
|
+
age,
|
|
83
|
+
t_min: at_tip ? t1 : t0,
|
|
84
|
+
t_max: t1,
|
|
85
|
+
count,
|
|
86
|
+
scale: 1.0,
|
|
87
|
+
// a short shoot's leaves share its own place
|
|
88
|
+
u_min: at_tip ? phase : u0,
|
|
89
|
+
u_max: at_tip ? phase : u1,
|
|
90
|
+
unit_t_min: t0,
|
|
91
|
+
unit_t_max: t1
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
return out;
|
|
95
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Length (m) of one extension unit of mean `mean` grown at branching `order`: 1 cm plus a negative binomial (orders
|
|
3
|
+
* listed in `rule.length_negative_binomial_p`) or Poisson (the rest) count of further centimetres, the models
|
|
4
|
+
* [BB2000 p. 10-11] fitted to oak, capped at `rule.max_unit_length` of the order.
|
|
5
|
+
*
|
|
6
|
+
* @param {function():number} rng
|
|
7
|
+
* @param {number} mean metres
|
|
8
|
+
* @param {number} order 1-based
|
|
9
|
+
* @param {import("../config/ShootSystemRule.js").ShootSystemRule} rule
|
|
10
|
+
* @returns {number}
|
|
11
|
+
*/
|
|
12
|
+
export function shoot_sample_unit_length(rng: () => number, mean: number, order: number, rule: import("../config/ShootSystemRule.js").ShootSystemRule): number;
|
|
13
|
+
/**
|
|
14
|
+
* Expected new long shoots a living shoot of the carrier's order yields in a year: its terminal, plus the laterals its
|
|
15
|
+
* bud zones grow out on a unit of `rule.mean_unit_length`. About 2.65 for oak [BB2000 p. 11]. Short shoots are not
|
|
16
|
+
* counted: they bear no laterals.
|
|
17
|
+
*
|
|
18
|
+
* @param {import("../config/ShootSystemRule.js").ShootSystemRule} rule
|
|
19
|
+
* @returns {number}
|
|
20
|
+
*/
|
|
21
|
+
export function shoot_expected_yield(rule: import("../config/ShootSystemRule.js").ShootSystemRule): number;
|
|
22
|
+
//# sourceMappingURL=shoot_demography.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shoot_demography.d.ts","sourceRoot":"","sources":["../../../../../src/generation/foliage/skeleton/shoot_demography.js"],"names":[],"mappings":"AAoDA;;;;;;;;;;GAUG;AACH,oDANsB,MAAM,QACjB,MAAM,SACN,MAAM,QACN,OAAO,8BAA8B,EAAE,eAAe,GACpD,MAAM,CAgBlB;AAED;;;;;;;GAOG;AACH,2CAHW,OAAO,8BAA8B,EAAE,eAAe,GACpD,MAAM,CAUlB"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { clamp } from "../../../core/math/clamp.js";
|
|
2
|
+
import { shoot_order_value } from "../config/ShootBudZone.js";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Lowest length (m) of an extension unit: the 1 cm length class [BB2000 p. 9]. [BB2000]: Buck-Sorlin & Bell (2000),
|
|
6
|
+
* Forestry 73(1): 1-19.
|
|
7
|
+
* @type {number}
|
|
8
|
+
*/
|
|
9
|
+
const MIN_UNIT_LENGTH = 0.01;
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* @param {function():number} rng
|
|
13
|
+
* @param {number} lambda
|
|
14
|
+
* @returns {number}
|
|
15
|
+
*/
|
|
16
|
+
function sample_poisson(rng, lambda) {
|
|
17
|
+
if (lambda <= 0) return 0;
|
|
18
|
+
const limit = Math.exp(-lambda);
|
|
19
|
+
let k = 0;
|
|
20
|
+
let p = rng();
|
|
21
|
+
while (p > limit) {
|
|
22
|
+
k++;
|
|
23
|
+
p *= rng();
|
|
24
|
+
}
|
|
25
|
+
return k;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Marsaglia & Tsang gamma variate with scale 1.
|
|
30
|
+
* @param {function():number} rng
|
|
31
|
+
* @param {number} shape
|
|
32
|
+
* @returns {number}
|
|
33
|
+
*/
|
|
34
|
+
function sample_gamma(rng, shape) {
|
|
35
|
+
if (shape < 1) {
|
|
36
|
+
return sample_gamma(rng, shape + 1) * Math.pow(Math.max(1e-12, rng()), 1 / shape);
|
|
37
|
+
}
|
|
38
|
+
const d = shape - 1 / 3;
|
|
39
|
+
const c = 1 / Math.sqrt(9 * d);
|
|
40
|
+
for (; ;) {
|
|
41
|
+
// standard normal by Box-Muller
|
|
42
|
+
const n = Math.sqrt(-2 * Math.log(Math.max(1e-12, rng()))) * Math.cos(2 * Math.PI * rng());
|
|
43
|
+
const v0 = 1 + c * n;
|
|
44
|
+
if (v0 <= 0) continue;
|
|
45
|
+
const v = v0 * v0 * v0;
|
|
46
|
+
const u = rng();
|
|
47
|
+
if (Math.log(Math.max(1e-12, u)) < 0.5 * n * n + d - d * v + d * Math.log(v)) {
|
|
48
|
+
return d * v;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Length (m) of one extension unit of mean `mean` grown at branching `order`: 1 cm plus a negative binomial (orders
|
|
55
|
+
* listed in `rule.length_negative_binomial_p`) or Poisson (the rest) count of further centimetres, the models
|
|
56
|
+
* [BB2000 p. 10-11] fitted to oak, capped at `rule.max_unit_length` of the order.
|
|
57
|
+
*
|
|
58
|
+
* @param {function():number} rng
|
|
59
|
+
* @param {number} mean metres
|
|
60
|
+
* @param {number} order 1-based
|
|
61
|
+
* @param {import("../config/ShootSystemRule.js").ShootSystemRule} rule
|
|
62
|
+
* @returns {number}
|
|
63
|
+
*/
|
|
64
|
+
export function shoot_sample_unit_length(rng, mean, order, rule) {
|
|
65
|
+
const extra_cm = Math.max(0, mean * 100 - 1);
|
|
66
|
+
const nb_p = rule.length_negative_binomial_p;
|
|
67
|
+
let count;
|
|
68
|
+
if (order <= nb_p.length && extra_cm > 0) {
|
|
69
|
+
// a negative binomial as a gamma-Poisson mixture, with as many failures r as give the fitted p this mean
|
|
70
|
+
const p = nb_p[order - 1];
|
|
71
|
+
const r = extra_cm * p / (1 - p);
|
|
72
|
+
count = sample_poisson(rng, sample_gamma(rng, r) * (1 - p) / p);
|
|
73
|
+
} else {
|
|
74
|
+
count = sample_poisson(rng, extra_cm);
|
|
75
|
+
}
|
|
76
|
+
const cap = shoot_order_value(rule.max_unit_length, order);
|
|
77
|
+
return clamp((1 + count + rng()) / 100, MIN_UNIT_LENGTH, Math.max(MIN_UNIT_LENGTH, cap));
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Expected new long shoots a living shoot of the carrier's order yields in a year: its terminal, plus the laterals its
|
|
82
|
+
* bud zones grow out on a unit of `rule.mean_unit_length`. About 2.65 for oak [BB2000 p. 11]. Short shoots are not
|
|
83
|
+
* counted: they bear no laterals.
|
|
84
|
+
*
|
|
85
|
+
* @param {import("../config/ShootSystemRule.js").ShootSystemRule} rule
|
|
86
|
+
* @returns {number}
|
|
87
|
+
*/
|
|
88
|
+
export function shoot_expected_yield(rule) {
|
|
89
|
+
const order = rule.carrier_order;
|
|
90
|
+
let y = 1;
|
|
91
|
+
for (let z = 0; z < rule.zones.length; z++) {
|
|
92
|
+
const zone = rule.zones[z];
|
|
93
|
+
y += zone.bud_count(rule.mean_unit_length, order) * (shoot_order_value(zone.long, order) + shoot_order_value(zone.sylleptic, order));
|
|
94
|
+
}
|
|
95
|
+
return y;
|
|
96
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Radius (m) at the base of an annual unit `length` (m) long that grew `age` years ago: diameter `d = 0.27 + 0.02 l`
|
|
3
|
+
* (cm) for a current shoot and `0.40 + 0.02 l` a year on [BB2000 Table 7, all oaks], so a ring of 0.13 cm a year,
|
|
4
|
+
* carried on to older wood. Kept above the 1.9 mm the bark mesher draws without thin-strand artifacts. [BB2000]:
|
|
5
|
+
* Buck-Sorlin & Bell (2000), Forestry 73(1): 1-19.
|
|
6
|
+
* @param {number} length
|
|
7
|
+
* @param {number} age
|
|
8
|
+
* @returns {number}
|
|
9
|
+
*/
|
|
10
|
+
export function shoot_radius(length: number, age: number): number;
|
|
11
|
+
/**
|
|
12
|
+
* The radius of {@link shoot_radius} as the wood has it, before the floor the bark mesher draws at: what a shoot adds to
|
|
13
|
+
* the pipe model of the wood that carries it.
|
|
14
|
+
* @param {number} length
|
|
15
|
+
* @param {number} age
|
|
16
|
+
* @returns {number}
|
|
17
|
+
*/
|
|
18
|
+
export function shoot_wood_radius(length: number, age: number): number;
|
|
19
|
+
/**
|
|
20
|
+
* Normalises `(x, y, z)` into `out`; a zero vector becomes up.
|
|
21
|
+
* @param {Float32Array|Float64Array|number[]} out
|
|
22
|
+
* @param {number} x
|
|
23
|
+
* @param {number} y
|
|
24
|
+
* @param {number} z
|
|
25
|
+
*/
|
|
26
|
+
export function shoot_normalize3(out: Float32Array | Float64Array | number[], x: number, y: number, z: number): void;
|
|
27
|
+
/**
|
|
28
|
+
* A unit vector perpendicular to unit `(x, y, z)`.
|
|
29
|
+
* @param {Float32Array|Float64Array|number[]} out
|
|
30
|
+
* @param {number} x
|
|
31
|
+
* @param {number} y
|
|
32
|
+
* @param {number} z
|
|
33
|
+
*/
|
|
34
|
+
export function shoot_perpendicular3(out: Float32Array | Float64Array | number[], x: number, y: number, z: number): void;
|
|
35
|
+
/**
|
|
36
|
+
* Direction out of the crown and up at a point, as the foliage's phototropism reads it.
|
|
37
|
+
* @param {Float32Array|Float64Array|number[]} out
|
|
38
|
+
* @param {import("./TreeSkeleton.js").TreeSkeleton} skeleton
|
|
39
|
+
* @param {number} x
|
|
40
|
+
* @param {number} y
|
|
41
|
+
* @param {number} z
|
|
42
|
+
*/
|
|
43
|
+
export function shoot_outward3(out: Float32Array | Float64Array | number[], skeleton: import("./TreeSkeleton.js").TreeSkeleton, x: number, y: number, z: number): void;
|
|
44
|
+
/**
|
|
45
|
+
* The segment of a branch chain containing `t`, and where on it.
|
|
46
|
+
* @param {import("./TreeSkeleton.js").TreeSkeleton} skeleton
|
|
47
|
+
* @param {number[]} nodes
|
|
48
|
+
* @param {number[]} edges
|
|
49
|
+
* @param {number} t
|
|
50
|
+
* @returns {{edge: number, u: number}}
|
|
51
|
+
*/
|
|
52
|
+
export function shoot_locate_on_chain(skeleton: import("./TreeSkeleton.js").TreeSkeleton, nodes: number[], edges: number[], t: number): {
|
|
53
|
+
edge: number;
|
|
54
|
+
u: number;
|
|
55
|
+
};
|
|
56
|
+
/**
|
|
57
|
+
* Thinnest radius (m) a shoot is drawn at.
|
|
58
|
+
* @type {number}
|
|
59
|
+
*/
|
|
60
|
+
export const SHOOT_MIN_RADIUS: number;
|
|
61
|
+
/**
|
|
62
|
+
* Largest radius of a lateral relative to its mother where it grows out, as `tree_skeleton_compute_pipe_radii` holds it.
|
|
63
|
+
* @type {number}
|
|
64
|
+
*/
|
|
65
|
+
export const SHOOT_LATERAL_RADIUS_RATIO: number;
|
|
66
|
+
//# sourceMappingURL=shoot_geometry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shoot_geometry.d.ts","sourceRoot":"","sources":["../../../../../src/generation/foliage/skeleton/shoot_geometry.js"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AACH,qCAJW,MAAM,OACN,MAAM,GACJ,MAAM,CAIlB;AAED;;;;;;GAMG;AACH,0CAJW,MAAM,OACN,MAAM,GACJ,MAAM,CAIlB;AAcD;;;;;;GAMG;AACH,sCALW,YAAY,GAAC,YAAY,GAAC,MAAM,EAAE,KAClC,MAAM,KACN,MAAM,KACN,MAAM,QAahB;AAED;;;;;;GAMG;AACH,0CALW,YAAY,GAAC,YAAY,GAAC,MAAM,EAAE,KAClC,MAAM,KACN,MAAM,KACN,MAAM,QAShB;AAED;;;;;;;GAOG;AACH,oCANW,YAAY,GAAC,YAAY,GAAC,MAAM,EAAE,YAClC,OAAO,mBAAmB,EAAE,YAAY,KACxC,MAAM,KACN,MAAM,KACN,MAAM,QAShB;AAED;;;;;;;GAOG;AACH,gDANW,OAAO,mBAAmB,EAAE,YAAY,SACxC,MAAM,EAAE,SACR,MAAM,EAAE,KACR,MAAM,GACJ;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAC,CAWrC;AAlFD;;;GAGG;AACH,+BAFU,MAAM,CAEuB;AAEvC;;;GAGG;AACH,yCAFU,MAAM,CAE+B"}
|