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