@woosh/meep-engine 3.57.0 → 3.59.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/editor/ecs/component/editors/ColorEditor.js +2 -2
- package/editor/particles/effect/ParticleEffectDocument.d.ts +162 -43
- package/editor/particles/effect/ParticleEffectDocument.d.ts.map +1 -1
- package/editor/particles/effect/ParticleEffectDocument.js +452 -48
- package/editor/particles/effect/ParticleReferenceSimulation.d.ts +12 -3
- package/editor/particles/effect/ParticleReferenceSimulation.d.ts.map +1 -1
- package/editor/particles/effect/ParticleReferenceSimulation.js +78 -23
- package/editor/particles/effect/make_starter_particle_effect.js +17 -17
- package/editor/tools/GridPaintTool.js +2 -2
- package/editor/view/node-graph/NodeGraphEditorView.d.ts +1 -1
- package/editor/view/node-graph/NodeGraphEditorView.d.ts.map +1 -1
- package/editor/view/node-graph/NodeGraphEditorView.js +2 -2
- package/editor/view/node-graph/NodeGraphView.d.ts +0 -1
- package/editor/view/node-graph/NodeGraphView.d.ts.map +1 -1
- package/editor/view/node-graph/NodeGraphView.js +0 -2
- package/editor/view/particles/effect/ParticleEmitterInspectorView.d.ts +3 -3
- package/editor/view/particles/effect/ParticleEmitterInspectorView.d.ts.map +1 -1
- package/editor/view/particles/effect/ParticleEmitterInspectorView.js +224 -67
- package/editor/view/particles/effect/ParticleGraphEditorView.d.ts.map +1 -1
- package/editor/view/particles/effect/ParticleGraphEditorView.js +44 -11
- package/editor/view/particles/effect/ParticleNodeParametersView.d.ts +2 -1
- package/editor/view/particles/effect/ParticleNodeParametersView.d.ts.map +1 -1
- package/editor/view/particles/effect/ParticleNodeParametersView.js +46 -16
- package/editor/view/particles/effect/ParticlePreviewView.js +2 -2
- package/editor/view/particles/effect/particle-editor.css +77 -68
- package/package.json +1 -1
- package/src/core/bvh8/build/NodeProxy.js +2 -2
- package/src/core/bvh8/build/aabb3_compute_merge_cost.js +4 -4
- package/src/core/bvh8/build/bvh8_build_for_geometry.js +2 -2
- package/src/core/geom/2d/line/line2_segment_intersection_fraction_2d.d.ts +1 -1
- package/src/core/geom/2d/line/line2_segment_intersection_fraction_2d.js +1 -1
- package/src/core/geom/2d/triangle/tri2_intersects_aabb2.d.ts +17 -0
- package/src/core/geom/2d/triangle/tri2_intersects_aabb2.d.ts.map +1 -0
- package/src/core/geom/2d/triangle/tri2_intersects_aabb2.js +64 -0
- package/src/core/geom/2d/triangle/tri2_rasterize_barycentric.d.ts +23 -0
- package/src/core/geom/2d/triangle/tri2_rasterize_barycentric.d.ts.map +1 -0
- package/src/core/geom/2d/triangle/tri2_rasterize_barycentric.js +81 -0
- package/src/core/geom/2d/triangle/tri2_rasterize_conservative.d.ts.map +1 -1
- package/src/core/geom/2d/triangle/tri2_rasterize_conservative.js +36 -99
- package/src/core/geom/3d/aabb/aabb3_build_frustum.d.ts +0 -11
- package/src/core/geom/3d/aabb/aabb3_build_frustum.d.ts.map +1 -1
- package/src/core/geom/3d/aabb/aabb3_build_frustum.js +15 -20
- package/src/core/geom/3d/box/box3_raycast.d.ts +1 -1
- package/src/core/geom/3d/box/box3_raycast.js +1 -1
- package/src/core/geom/3d/line/line3_compute_segment_closest_point_to_aabb3_t.d.ts +1 -1
- package/src/core/geom/3d/line/line3_compute_segment_closest_point_to_aabb3_t.js +1 -1
- package/src/core/geom/3d/quaternion/quat3_to_matrix3.d.ts +3 -3
- package/src/core/geom/3d/quaternion/quat3_to_matrix3.js +3 -3
- package/src/core/geom/3d/shape/HeightMapShape3D.js +2 -2
- package/src/core/geom/3d/shape/MeshShape3D.d.ts +2 -2
- package/src/core/geom/3d/shape/MeshShape3D.js +2 -2
- package/src/core/geom/3d/shape/PosedShape3D.js +2 -2
- package/src/core/geom/3d/sphere/sphere_matrix4_transform.d.ts +0 -7
- package/src/core/geom/3d/sphere/sphere_matrix4_transform.d.ts.map +1 -1
- package/src/core/geom/3d/sphere/sphere_matrix4_transform.js +0 -4
- package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_compute_tet_quality.d.ts +1 -1
- package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_compute_tet_quality.js +1 -1
- package/src/core/geom/3d/tetrahedra/tetrahedron_compute_quality.d.ts +1 -1
- package/src/core/geom/3d/tetrahedra/tetrahedron_compute_quality.js +1 -1
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_face_decouple.d.ts +1 -1
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_face_decouple.js +1 -1
- package/src/core/geom/3d/topology/struct/binary/io/edge/bt_mesh_fuse_duplicate_edges.d.ts +1 -1
- package/src/core/geom/3d/topology/struct/binary/io/edge/bt_mesh_fuse_duplicate_edges.js +1 -1
- package/src/core/geom/3d/topology/struct/binary/io/edge/bt_mesh_kill_short_edges.d.ts +2 -2
- package/src/core/geom/3d/topology/struct/binary/io/edge/bt_mesh_kill_short_edges.js +2 -2
- package/src/core/geom/3d/topology/struct/binary/io/face/bt_face_poke.d.ts +0 -14
- package/src/core/geom/3d/topology/struct/binary/io/face/bt_face_poke.d.ts.map +1 -1
- package/src/core/geom/3d/topology/struct/binary/io/face/bt_face_poke.js +0 -5
- package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_vertex_replace.js +151 -151
- package/src/core/geom/3d/topology/struct/binary/query/bt_edge_collapse_fold_limit.js +1 -1
- package/src/core/geom/3d/topology/struct/binary/query/bt_face_get_vertex_adjacent_faces.d.ts +1 -1
- package/src/core/geom/3d/topology/struct/binary/query/bt_face_get_vertex_adjacent_faces.js +1 -1
- package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_build_face_bvh.d.ts.map +1 -1
- package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_build_face_bvh.js +1 -2
- package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_surface_ray_parity.d.ts +0 -8
- 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 +25 -36
- package/src/core/geom/clipmap/ClipmapCascadePlacement.d.ts +137 -0
- package/src/core/geom/clipmap/ClipmapCascadePlacement.d.ts.map +1 -0
- package/src/core/geom/clipmap/ClipmapCascadePlacement.js +350 -0
- package/src/core/geom/polyline/polyline_simplify_by_error.d.ts +16 -0
- package/src/core/geom/polyline/polyline_simplify_by_error.d.ts.map +1 -0
- package/src/core/geom/polyline/polyline_simplify_by_error.js +52 -0
- package/src/core/geom/vec3/v3_quaternion_apply.d.ts +1 -1
- package/src/core/geom/vec3/v3_quaternion_apply.js +1 -1
- package/src/core/geom/vec3/v3_quaternion_apply_inverse.d.ts +2 -2
- package/src/core/geom/vec3/v3_quaternion_apply_inverse.js +2 -2
- package/src/core/geom/vec3/v3_triple_cross.d.ts +1 -1
- package/src/core/geom/vec3/v3_triple_cross.js +1 -1
- package/src/engine/Engine.d.ts.map +1 -1
- package/src/engine/Engine.js +2 -2
- package/src/engine/asset/preloader/AssetPreloader.d.ts +0 -5
- package/src/engine/asset/preloader/AssetPreloader.d.ts.map +1 -1
- package/src/engine/asset/preloader/AssetPreloader.js +0 -6
- package/src/engine/ecs/EntityManager.d.ts +29 -5
- package/src/engine/ecs/EntityManager.d.ts.map +1 -1
- package/src/engine/ecs/EntityManager.js +37 -1
- package/src/engine/ecs/storage/populateEngineSerializationRegistry.d.ts.map +1 -1
- package/src/engine/ecs/storage/populateEngineSerializationRegistry.js +4 -0
- package/src/engine/ecs/terrain/tiles/TerrainTile.d.ts.map +1 -1
- package/src/engine/ecs/terrain/tiles/TerrainTile.js +25 -12
- package/src/engine/graphics/ecs/decal/v2/Decal.d.ts +2 -2
- package/src/engine/graphics/ecs/decal/v2/Decal.js +2 -2
- package/src/engine/graphics/ecs/mesh-v2/ShadedGeometry.d.ts.map +1 -1
- package/src/engine/graphics/ecs/mesh-v2/ShadedGeometry.js +420 -418
- package/src/engine/graphics/ecs/mesh-v2/ShadedGeometryFlags.d.ts +1 -0
- package/src/engine/graphics/ecs/mesh-v2/ShadedGeometryFlags.js +10 -0
- package/src/engine/graphics/ecs/particles/ParticleEffect.d.ts +74 -17
- package/src/engine/graphics/ecs/particles/ParticleEffect.d.ts.map +1 -1
- package/src/engine/graphics/ecs/particles/ParticleEffect.js +159 -28
- package/src/engine/graphics/ecs/particles/ParticleEffectSerializationAdapter.d.ts +13 -3
- package/src/engine/graphics/ecs/particles/ParticleEffectSerializationAdapter.d.ts.map +1 -1
- package/src/engine/graphics/ecs/particles/ParticleEffectSerializationAdapter.js +59 -13
- package/src/engine/graphics/ecs/particles/ParticleEffectSerializationUpgrader_1_2.d.ts +3 -3
- package/src/engine/graphics/ecs/particles/ParticleEffectSerializationUpgrader_1_2.js +9 -9
- package/src/engine/graphics/ecs/particles/ParticleEffectSerializationUpgrader_2_3.d.ts +15 -0
- package/src/engine/graphics/ecs/particles/ParticleEffectSerializationUpgrader_2_3.d.ts.map +1 -0
- package/src/engine/graphics/ecs/particles/ParticleEffectSerializationUpgrader_2_3.js +78 -0
- package/src/engine/graphics/ecs/path/tube/build/makeTubeStream.js +2 -2
- package/src/engine/graphics/ecs/trail3d/Trail3D.d.ts +2 -0
- package/src/engine/graphics/ecs/trail3d/Trail3D.d.ts.map +1 -1
- package/src/engine/graphics/ecs/trail3d/Trail3D.js +2 -0
- package/src/engine/graphics/ecs/trail3d/seed_trail_stroke.js +1 -1
- package/src/engine/graphics/ecs/trail3d/seed_trail_tube.js +1 -1
- package/src/engine/graphics/geometry/buffered/build_height_field_geometry.d.ts +12 -0
- package/src/engine/graphics/geometry/buffered/build_height_field_geometry.d.ts.map +1 -1
- package/src/engine/graphics/geometry/buffered/build_height_field_geometry.js +29 -2
- package/src/engine/graphics/texture/sprite/prototypeSpriteCutoutGeometry.js +1 -1
- package/src/engine/graphics/trail/tube/TubeX.d.ts +5 -3
- package/src/engine/graphics/trail/tube/TubeX.d.ts.map +1 -1
- package/src/engine/graphics/trail/tube/TubeX.js +5 -3
- package/src/engine/graphics/trail/tube/tube_attributes_spec.d.ts +3 -2
- package/src/engine/graphics/trail/tube/tube_attributes_spec.d.ts.map +1 -1
- package/src/engine/graphics/trail/tube/tube_attributes_spec.js +9 -8
- package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts +65 -4
- package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts.map +1 -1
- package/src/engine/graphics3/GPUParticleEmitterSystem.js +1351 -904
- package/src/engine/graphics3/ShadedGeometrySystem.d.ts +2 -1
- package/src/engine/graphics3/ShadedGeometrySystem.d.ts.map +1 -1
- package/src/engine/graphics3/ShadedGeometrySystem.js +7 -5
- package/src/engine/graphics3/Trail3DSystem.d.ts +1 -1
- package/src/engine/graphics3/Trail3DSystem.js +1 -1
- package/src/engine/graphics3/WaterSystem.d.ts +60 -0
- package/src/engine/graphics3/WaterSystem.d.ts.map +1 -1
- package/src/engine/graphics3/WaterSystem.js +733 -300
- package/src/engine/graphics3/make_default_environment.d.ts.map +1 -1
- package/src/engine/graphics3/make_default_environment.js +2 -4
- package/src/engine/graphics3/prefab/prefab_place.js +1 -1
- package/src/engine/graphics3/trail/trail_tube_write_geometry.d.ts +1 -1
- package/src/engine/graphics3/trail/trail_tube_write_geometry.js +13 -13
- package/src/engine/navigation/mesh/build/clip_soup_against_overhangs.js +628 -628
- package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
- package/src/engine/physics/inertia/world_inverse_inertia.js +1 -1
- package/src/engine/physics/narrowphase/narrowphase_step.js +1 -1
- package/src/engine/sound/simulation/render/reverbImpulseResponse.d.ts +0 -1
- package/src/engine/sound/simulation/render/reverbImpulseResponse.d.ts.map +1 -1
- package/src/engine/sound/simulation/render/reverbImpulseResponse.js +0 -6
- package/src/engine/sound/simulation/render/reverb_band_tails.d.ts +1 -1
- package/src/engine/sound/simulation/render/reverb_band_tails.js +1 -1
- package/src/engine/sound/sopra/runtime/EventInstance.js +1 -1
- package/src/generation/foliage/CROWN_FULLNESS_BRIEF_2026_10_26.md +86 -0
- package/src/generation/foliage/FOLIAGE_DESIGN.md +110 -32
- package/src/generation/foliage/LOD_REWORK_BRIEF_2026_10_27.md +521 -0
- package/src/generation/foliage/REAL_TIME_TREES_BRIEF_2026_10_27.md +86 -0
- package/src/generation/foliage/SELF_ORGANIZING_FRAMEWORK_BRIEF_2026_10_26.md +347 -0
- package/src/generation/foliage/TWO_FRONT_ENDS_BRIEF_2026_10_28.md +552 -0
- package/src/generation/foliage/analysis/crown_opacity_measure.d.ts.map +1 -1
- package/src/generation/foliage/analysis/crown_opacity_measure.js +80 -102
- package/src/generation/foliage/analysis/foliage_measure_leaf_area.d.ts.map +1 -1
- package/src/generation/foliage/analysis/foliage_measure_leaf_area.js +1 -7
- package/src/generation/foliage/analysis/tree_crown_opacity.d.ts.map +1 -1
- package/src/generation/foliage/analysis/tree_crown_opacity.js +3 -2
- package/src/generation/foliage/analysis/tree_leaf_area_targets.d.ts +66 -0
- package/src/generation/foliage/analysis/tree_leaf_area_targets.d.ts.map +1 -0
- package/src/generation/foliage/analysis/tree_leaf_area_targets.js +95 -0
- package/src/generation/foliage/analysis/tree_render_cost.d.ts +90 -0
- package/src/generation/foliage/analysis/tree_render_cost.d.ts.map +1 -0
- package/src/generation/foliage/analysis/tree_render_cost.js +158 -0
- package/src/generation/foliage/asset/TreeAsset.d.ts +24 -6
- package/src/generation/foliage/asset/TreeAsset.d.ts.map +1 -1
- package/src/generation/foliage/asset/TreeAsset.js +29 -6
- package/src/generation/foliage/asset/TreeLODAsset.d.ts +24 -11
- package/src/generation/foliage/asset/TreeLODAsset.d.ts.map +1 -1
- package/src/generation/foliage/asset/TreeLODAsset.js +49 -20
- package/src/generation/foliage/asset/TreeSpeciesCache.d.ts +69 -0
- package/src/generation/foliage/asset/TreeSpeciesCache.d.ts.map +1 -0
- package/src/generation/foliage/asset/TreeSpeciesCache.js +147 -0
- package/src/generation/foliage/asset/generate_tree.d.ts +21 -0
- package/src/generation/foliage/asset/generate_tree.d.ts.map +1 -1
- package/src/generation/foliage/asset/generate_tree.js +123 -21
- package/src/generation/foliage/asset/place_tree.d.ts +2 -1
- package/src/generation/foliage/asset/place_tree.d.ts.map +1 -1
- package/src/generation/foliage/asset/place_tree.js +2 -1
- package/src/generation/foliage/asset/tree_lod_plan.d.ts +73 -0
- package/src/generation/foliage/asset/tree_lod_plan.d.ts.map +1 -0
- package/src/generation/foliage/asset/tree_lod_plan.js +117 -0
- package/src/generation/foliage/asset/tree_shoot_instances.d.ts +119 -0
- package/src/generation/foliage/asset/tree_shoot_instances.d.ts.map +1 -0
- package/src/generation/foliage/asset/tree_shoot_instances.js +410 -0
- package/src/generation/foliage/asset/tree_shoot_prototypes.d.ts +155 -0
- package/src/generation/foliage/asset/tree_shoot_prototypes.d.ts.map +1 -0
- package/src/generation/foliage/asset/tree_shoot_prototypes.js +251 -0
- package/src/generation/foliage/config/BranchGeneratorConfig.d.ts +0 -10
- package/src/generation/foliage/config/BranchGeneratorConfig.d.ts.map +1 -1
- package/src/generation/foliage/config/BranchGeneratorConfig.js +1 -23
- package/src/generation/foliage/config/ShootGrowthConfig.d.ts +45 -10
- package/src/generation/foliage/config/ShootGrowthConfig.d.ts.map +1 -1
- package/src/generation/foliage/config/ShootGrowthConfig.js +70 -16
- package/src/generation/foliage/config/ShootSystemRule.d.ts +12 -12
- package/src/generation/foliage/config/ShootSystemRule.d.ts.map +1 -1
- package/src/generation/foliage/config/ShootSystemRule.js +24 -20
- package/src/generation/foliage/config/TreeGrowth.d.ts +10 -0
- package/src/generation/foliage/config/TreeGrowth.d.ts.map +1 -0
- package/src/generation/foliage/config/TreeGrowth.js +18 -0
- package/src/generation/foliage/config/TreeLODConfig.d.ts +20 -37
- package/src/generation/foliage/config/TreeLODConfig.d.ts.map +1 -1
- package/src/generation/foliage/config/TreeLODConfig.js +30 -116
- package/src/generation/foliage/config/TreeSpeciesConfig.d.ts +2 -1
- package/src/generation/foliage/config/TreeSpeciesConfig.d.ts.map +1 -1
- package/src/generation/foliage/config/TreeSpeciesConfig.js +2 -7
- package/src/generation/foliage/index.d.ts +3 -0
- package/src/generation/foliage/index.js +3 -0
- package/src/generation/foliage/material/foliage_atlas_cutout.d.ts +6 -4
- package/src/generation/foliage/material/foliage_atlas_cutout.d.ts.map +1 -1
- package/src/generation/foliage/material/foliage_atlas_cutout.js +32 -27
- package/src/generation/foliage/material/foliage_material_from_samplers.d.ts +13 -0
- package/src/generation/foliage/material/foliage_material_from_samplers.d.ts.map +1 -0
- package/src/generation/foliage/material/foliage_material_from_samplers.js +69 -0
- package/src/generation/foliage/material/foliage_tile.d.ts +19 -0
- package/src/generation/foliage/material/foliage_tile.d.ts.map +1 -1
- package/src/generation/foliage/material/foliage_tile.js +9 -1
- package/src/generation/foliage/material/leaf_geometry.d.ts +7 -0
- package/src/generation/foliage/material/leaf_geometry.d.ts.map +1 -1
- package/src/generation/foliage/material/leaf_geometry.js +21 -9
- package/src/generation/foliage/material/make_foliage_material.d.ts +2 -3
- package/src/generation/foliage/material/make_foliage_material.d.ts.map +1 -1
- package/src/generation/foliage/material/make_foliage_material.js +3 -57
- package/src/generation/foliage/material/tree_cluster_atlas.d.ts +44 -0
- package/src/generation/foliage/material/tree_cluster_atlas.d.ts.map +1 -0
- package/src/generation/foliage/material/tree_cluster_atlas.js +37 -0
- package/src/generation/foliage/material/tree_cluster_atlas_pack.d.ts +14 -0
- package/src/generation/foliage/material/tree_cluster_atlas_pack.d.ts.map +1 -0
- package/src/generation/foliage/material/tree_cluster_atlas_pack.js +28 -0
- package/src/generation/foliage/material/tree_cluster_bake.d.ts +74 -0
- package/src/generation/foliage/material/tree_cluster_bake.d.ts.map +1 -0
- package/src/generation/foliage/material/tree_cluster_bake.js +415 -0
- package/src/generation/foliage/material/tree_cluster_press.d.ts +18 -0
- package/src/generation/foliage/material/tree_cluster_press.d.ts.map +1 -0
- package/src/generation/foliage/material/tree_cluster_press.js +83 -0
- package/src/generation/foliage/material/tree_cluster_tiles.d.ts +46 -0
- package/src/generation/foliage/material/tree_cluster_tiles.d.ts.map +1 -0
- package/src/generation/foliage/material/tree_cluster_tiles.js +75 -0
- package/src/generation/foliage/mesh/foliage_collect_attachments.d.ts +22 -4
- package/src/generation/foliage/mesh/foliage_collect_attachments.d.ts.map +1 -1
- package/src/generation/foliage/mesh/foliage_collect_attachments.js +28 -16
- package/src/generation/foliage/mesh/foliage_scale_spread.d.ts +14 -0
- package/src/generation/foliage/mesh/foliage_scale_spread.d.ts.map +1 -0
- package/src/generation/foliage/mesh/foliage_scale_spread.js +15 -0
- package/src/generation/foliage/mesh/tree_cluster_cards.d.ts +61 -0
- package/src/generation/foliage/mesh/tree_cluster_cards.d.ts.map +1 -0
- package/src/generation/foliage/mesh/tree_cluster_cards.js +114 -0
- package/src/generation/foliage/mesh/tree_cluster_representatives.d.ts +122 -0
- package/src/generation/foliage/mesh/tree_cluster_representatives.d.ts.map +1 -0
- package/src/generation/foliage/mesh/tree_cluster_representatives.js +354 -0
- package/src/generation/foliage/mesh/tree_clusters.d.ts +92 -0
- package/src/generation/foliage/mesh/tree_clusters.d.ts.map +1 -0
- package/src/generation/foliage/mesh/tree_clusters.js +187 -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 +609 -226
- package/src/generation/foliage/mesh/tree_mesh_build_clusters.d.ts +25 -0
- package/src/generation/foliage/mesh/tree_mesh_build_clusters.d.ts.map +1 -0
- package/src/generation/foliage/mesh/tree_mesh_build_clusters.js +144 -0
- package/src/generation/foliage/mesh/tree_mesh_build_foliage.d.ts +7 -10
- package/src/generation/foliage/mesh/tree_mesh_build_foliage.d.ts.map +1 -1
- package/src/generation/foliage/mesh/tree_mesh_build_foliage.js +13 -39
- package/src/generation/foliage/presets/make_tree_species_preset.d.ts +6 -1
- package/src/generation/foliage/presets/make_tree_species_preset.d.ts.map +1 -1
- package/src/generation/foliage/presets/make_tree_species_preset.js +235 -209
- package/src/generation/foliage/skeleton/ShootFrameworkHash.d.ts +5 -2
- package/src/generation/foliage/skeleton/ShootFrameworkHash.d.ts.map +1 -1
- package/src/generation/foliage/skeleton/ShootFrameworkHash.js +13 -8
- package/src/generation/foliage/skeleton/ShootGirth.d.ts.map +1 -1
- package/src/generation/foliage/skeleton/ShootGirth.js +6 -5
- package/src/generation/foliage/skeleton/ShootLightField.d.ts +9 -0
- package/src/generation/foliage/skeleton/ShootLightField.d.ts.map +1 -1
- package/src/generation/foliage/skeleton/ShootLightField.js +25 -0
- package/src/generation/foliage/skeleton/ShootWoodHash.d.ts +89 -0
- package/src/generation/foliage/skeleton/ShootWoodHash.d.ts.map +1 -0
- package/src/generation/foliage/skeleton/ShootWoodHash.js +195 -0
- package/src/generation/foliage/skeleton/TreeSkeleton.d.ts +25 -0
- package/src/generation/foliage/skeleton/TreeSkeleton.d.ts.map +1 -1
- package/src/generation/foliage/skeleton/TreeSkeleton.js +50 -0
- package/src/generation/foliage/skeleton/shoot_demography.d.ts +17 -4
- package/src/generation/foliage/skeleton/shoot_demography.d.ts.map +1 -1
- package/src/generation/foliage/skeleton/shoot_demography.js +22 -6
- package/src/generation/foliage/skeleton/shoot_geometry.d.ts +5 -6
- package/src/generation/foliage/skeleton/shoot_geometry.d.ts.map +1 -1
- package/src/generation/foliage/skeleton/shoot_geometry.js +29 -12
- package/src/generation/foliage/skeleton/shoot_systems_simulate.d.ts +43 -4
- package/src/generation/foliage/skeleton/shoot_systems_simulate.d.ts.map +1 -1
- package/src/generation/foliage/skeleton/shoot_systems_simulate.js +537 -70
- package/src/generation/foliage/skeleton/tree_skeleton_assign_skin_joints.d.ts +30 -5
- 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 +46 -10
- package/src/generation/foliage/skeleton/tree_skeleton_bind_skin_joints.d.ts +10 -0
- package/src/generation/foliage/skeleton/tree_skeleton_bind_skin_joints.d.ts.map +1 -0
- package/src/generation/foliage/skeleton/tree_skeleton_bind_skin_joints.js +12 -0
- package/src/generation/foliage/skeleton/tree_skeleton_compute_joint_mechanics.d.ts +5 -0
- package/src/generation/foliage/skeleton/tree_skeleton_compute_joint_mechanics.d.ts.map +1 -1
- package/src/generation/foliage/skeleton/tree_skeleton_compute_joint_mechanics.js +8 -1
- package/src/generation/foliage/skeleton/tree_skeleton_copy_branches.d.ts +70 -0
- package/src/generation/foliage/skeleton/tree_skeleton_copy_branches.d.ts.map +1 -0
- package/src/generation/foliage/skeleton/tree_skeleton_copy_branches.js +171 -0
- package/src/generation/foliage/skeleton/tree_skeleton_extend_branch.d.ts +17 -0
- package/src/generation/foliage/skeleton/tree_skeleton_extend_branch.d.ts.map +1 -0
- package/src/generation/foliage/skeleton/tree_skeleton_extend_branch.js +79 -0
- package/src/generation/foliage/skeleton/tree_skeleton_fit_crown_frame.d.ts +12 -0
- package/src/generation/foliage/skeleton/tree_skeleton_fit_crown_frame.d.ts.map +1 -0
- package/src/generation/foliage/skeleton/tree_skeleton_fit_crown_frame.js +56 -0
- package/src/generation/foliage/skeleton/tree_skeleton_floor_girth.d.ts +11 -0
- package/src/generation/foliage/skeleton/tree_skeleton_floor_girth.d.ts.map +1 -0
- package/src/generation/foliage/skeleton/tree_skeleton_floor_girth.js +38 -0
- package/src/generation/foliage/skeleton/tree_skeleton_grow.d.ts +4 -11
- package/src/generation/foliage/skeleton/tree_skeleton_grow.d.ts.map +1 -1
- package/src/generation/foliage/skeleton/tree_skeleton_grow.js +8 -2033
- package/src/generation/foliage/skeleton/tree_skeleton_grow_framework.d.ts +22 -0
- package/src/generation/foliage/skeleton/tree_skeleton_grow_framework.d.ts.map +1 -0
- package/src/generation/foliage/skeleton/tree_skeleton_grow_framework.js +2050 -0
- package/src/generation/foliage/skeleton/tree_skeleton_grow_shoots.d.ts +14 -0
- package/src/generation/foliage/skeleton/tree_skeleton_grow_shoots.d.ts.map +1 -1
- package/src/generation/foliage/skeleton/tree_skeleton_grow_shoots.js +74 -7
- package/src/shade/descriptor/binding/BindGroupLayoutEntry.js +6 -6
- package/src/shade/descriptor/pipeline/render/ColorTargetState.js +2 -2
- package/src/shade/descriptor/pipeline/render/DepthStencilState.d.ts +4 -0
- package/src/shade/descriptor/pipeline/render/DepthStencilState.d.ts.map +1 -1
- package/src/shade/descriptor/pipeline/render/DepthStencilState.js +170 -144
- package/src/shade/descriptor/pipeline/render/MultisampleState.d.ts +4 -0
- package/src/shade/descriptor/pipeline/render/MultisampleState.d.ts.map +1 -1
- package/src/shade/descriptor/pipeline/render/MultisampleState.js +78 -65
- package/src/shade/descriptor/pipeline/render/RenderPipelineDescriptor.d.ts.map +1 -1
- package/src/shade/descriptor/pipeline/render/RenderPipelineDescriptor.js +176 -172
- package/src/shade/descriptor/pipeline/render/StencilFaceState.d.ts +4 -0
- package/src/shade/descriptor/pipeline/render/StencilFaceState.d.ts.map +1 -1
- package/src/shade/descriptor/pipeline/render/StencilFaceState.js +107 -88
- package/src/shade/playground/additive_blending/main.js +529 -529
- package/src/shade/playground/avboit/main.js +1 -1
- package/src/shade/playground/basis_textures/main.js +365 -365
- package/src/shade/playground/caldera/main.js +1 -1
- package/src/shade/playground/contact_shadows/main.js +1 -1
- package/src/shade/playground/foliage_wind/main.js +289 -289
- package/src/shade/playground/mesh_row_ceiling/main.js +1 -1
- package/src/shade/playground/particle_ecs/README.md +9 -8
- package/src/shade/playground/particle_ecs/bonfire_editor.js +3 -3
- package/src/shade/playground/particle_ecs/bonfire_effects.d.ts +6 -6
- package/src/shade/playground/particle_ecs/bonfire_effects.js +6 -6
- package/src/shade/playground/particle_ecs/main.js +1 -1
- package/src/shade/playground/particle_editor/README.md +14 -11
- package/src/shade/playground/particle_system/main.js +1 -1
- package/src/shade/playground/particle_system/particle_prototype.js +18 -18
- package/src/shade/playground/particle_system/particle_scene.js +13 -13
- package/src/shade/playground/probe_clipmap/README.md +42 -0
- package/src/shade/playground/probe_clipmap/index.html +178 -0
- package/src/shade/playground/probe_clipmap/main.d.ts +8 -0
- package/src/shade/playground/probe_clipmap/main.d.ts.map +1 -0
- package/src/shade/playground/probe_clipmap/main.js +360 -0
- package/src/shade/playground/sh_exponential/main.js +1 -1
- package/src/shade/playground/skinned_blas_refit/main.js +1 -1
- package/src/shade/playground/skinned_mesh_soup/main.js +1 -1
- package/src/shade/playground/sponza_path_trace/main.js +1 -1
- package/src/shade/playground/ssr_motion/main.js +1 -1
- package/src/shade/playground/ssr_reprojection/main.js +1 -1
- package/src/shade/playground/tonemap_sdr/main.js +1 -1
- package/src/shade/playground/vgeo_runtime/main.js +1 -1
- package/src/shade/playground/vgeo_scene/main.js +1 -1
- package/src/shade/playground/volumetrics_froxel/main.js +1 -1
- package/src/shade/playground/vsm/index.html +4 -1
- package/src/shade/playground/vsm/main.d.ts.map +1 -1
- package/src/shade/playground/vsm/main.js +8 -5
- package/src/shade/playground/water_refraction/main.js +1 -1
- package/src/shade/playground/water_surface/main.js +1 -1
- package/src/shade/renderer/Renderer.d.ts +16 -1
- package/src/shade/renderer/Renderer.d.ts.map +1 -1
- package/src/shade/renderer/Renderer.js +225 -40
- package/src/shade/renderer/ShadeIndirectLightingMode.d.ts +1 -0
- package/src/shade/renderer/ShadeIndirectLightingMode.js +6 -0
- package/src/shade/renderer/camera/orbital/README.md +3 -6
- package/src/shade/renderer/deferred/chunk_shade_standard_material_direct_restir.d.ts +1 -1
- package/src/shade/renderer/deferred/chunk_shade_standard_material_direct_restir.js +1 -1
- package/src/shade/renderer/extension/ViewTextures.d.ts +2 -1
- package/src/shade/renderer/extension/ViewTextures.d.ts.map +1 -1
- package/src/shade/renderer/extension/ViewTextures.js +2 -1
- package/src/shade/renderer/fluid/FluidCascadePlacement.d.ts +8 -105
- package/src/shade/renderer/fluid/FluidCascadePlacement.d.ts.map +1 -1
- package/src/shade/renderer/fluid/FluidCascadePlacement.js +13 -306
- package/src/shade/renderer/fluid/GPUFluidCascade.d.ts +3 -3
- package/src/shade/renderer/fluid/GPUFluidCascadeStack.d.ts +1 -1
- package/src/shade/renderer/fluid/forcing/GPUFluidForcing.d.ts +6 -6
- package/src/shade/renderer/fluid/forcing/shader_fluid_forcing_command.d.ts.map +1 -1
- package/src/shade/renderer/fluid/forcing/shader_fluid_forcing_command.js +8 -14
- package/src/shade/renderer/fluid/pressure/GPUFluidPressureSolve.d.ts +1 -1
- package/src/shade/renderer/fluid/query/GPUFluidQueries.d.ts +1 -1
- package/src/shade/renderer/geometry/BoxGeometry.d.ts +0 -1
- package/src/shade/renderer/geometry/BoxGeometry.d.ts.map +1 -1
- package/src/shade/renderer/geometry/BoxGeometry.js +0 -9
- package/src/shade/renderer/geometry/GPUGeometryManager.d.ts +4 -2
- package/src/shade/renderer/geometry/GPUGeometryManager.d.ts.map +1 -1
- package/src/shade/renderer/geometry/GPUGeometryManager.js +13 -2
- package/src/shade/renderer/geometry/Geometry.js +2 -2
- package/src/shade/renderer/geometry/blas_from_meshlets.d.ts.map +1 -1
- package/src/shade/renderer/geometry/blas_from_meshlets.js +12 -2
- package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.d.ts.map +1 -1
- package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.js +18 -0
- package/src/shade/renderer/geometry/bvh/bvh2_derive_topology.d.ts.map +1 -1
- package/src/shade/renderer/geometry/bvh/bvh2_derive_topology.js +5 -0
- package/src/shade/renderer/geometry/mesh_compute_surface_area.js +4 -4
- package/src/shade/renderer/geometry/meshlet/MeshletBatch.d.ts +5 -0
- package/src/shade/renderer/geometry/meshlet/MeshletBatch.d.ts.map +1 -1
- package/src/shade/renderer/geometry/meshlet/MeshletBatch.js +15 -0
- package/src/shade/renderer/geometry/meshlet_batch_to_bvh.d.ts.map +1 -1
- package/src/shade/renderer/geometry/meshlet_batch_to_bvh.js +35 -26
- package/src/shade/renderer/geometry/meshlet_geometry_build_from_geometry.d.ts.map +1 -1
- package/src/shade/renderer/geometry/meshlet_geometry_build_from_geometry.js +2 -1
- package/src/shade/renderer/geometry/normals/decode_octahedral_u32_to_normal.d.ts +13 -0
- package/src/shade/renderer/geometry/normals/decode_octahedral_u32_to_normal.d.ts.map +1 -0
- package/src/shade/renderer/geometry/normals/decode_octahedral_u32_to_normal.js +33 -0
- package/src/shade/renderer/geometry/normals/geometry_build_tangents.js +7 -7
- package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.d.ts +189 -45
- package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.d.ts.map +1 -1
- package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.js +1853 -144
- package/src/shade/renderer/geometry/sdf/MESH_SDF.d.ts +60 -0
- package/src/shade/renderer/geometry/sdf/MESH_SDF.d.ts.map +1 -0
- package/src/shade/renderer/geometry/sdf/MESH_SDF.js +62 -0
- package/src/shade/renderer/geometry/sdf/MESH_SDF_RESOURCES.d.ts +29 -0
- package/src/shade/renderer/geometry/sdf/MESH_SDF_RESOURCES.d.ts.map +1 -0
- package/src/shade/renderer/geometry/sdf/MESH_SDF_RESOURCES.js +41 -0
- package/src/shade/renderer/geometry/sdf/MESH_SDF_STRUCT.d.ts +12 -0
- package/src/shade/renderer/geometry/sdf/MESH_SDF_STRUCT.d.ts.map +1 -0
- package/src/shade/renderer/geometry/sdf/MESH_SDF_STRUCT.js +53 -0
- package/src/shade/renderer/geometry/sdf/MeshSDFLayout.d.ts +79 -0
- package/src/shade/renderer/geometry/sdf/MeshSDFLayout.d.ts.map +1 -0
- package/src/shade/renderer/geometry/sdf/MeshSDFLayout.js +168 -0
- package/src/shade/renderer/geometry/sdf/bake/MESH_SDF_BAKE.d.ts +75 -0
- package/src/shade/renderer/geometry/sdf/bake/MESH_SDF_BAKE.d.ts.map +1 -0
- package/src/shade/renderer/geometry/sdf/bake/MESH_SDF_BAKE.js +110 -0
- package/src/shade/renderer/geometry/sdf/bake/chunk_mesh_sdf_bake.d.ts +48 -0
- package/src/shade/renderer/geometry/sdf/bake/chunk_mesh_sdf_bake.d.ts.map +1 -0
- package/src/shade/renderer/geometry/sdf/bake/chunk_mesh_sdf_bake.js +146 -0
- package/src/shade/renderer/geometry/sdf/bake/shader_mesh_sdf_classify.d.ts +31 -0
- package/src/shade/renderer/geometry/sdf/bake/shader_mesh_sdf_classify.d.ts.map +1 -0
- package/src/shade/renderer/geometry/sdf/bake/shader_mesh_sdf_classify.js +136 -0
- package/src/shade/renderer/geometry/sdf/bake/shader_mesh_sdf_evaluate.d.ts +29 -0
- package/src/shade/renderer/geometry/sdf/bake/shader_mesh_sdf_evaluate.d.ts.map +1 -0
- package/src/shade/renderer/geometry/sdf/bake/shader_mesh_sdf_evaluate.js +146 -0
- package/src/shade/renderer/geometry/sdf/bake/shader_mesh_sdf_free.d.ts +19 -0
- package/src/shade/renderer/geometry/sdf/bake/shader_mesh_sdf_free.d.ts.map +1 -0
- package/src/shade/renderer/geometry/sdf/bake/shader_mesh_sdf_free.js +77 -0
- package/src/shade/renderer/geometry/sdf/bake/shader_mesh_sdf_store.d.ts +18 -0
- package/src/shade/renderer/geometry/sdf/bake/shader_mesh_sdf_store.d.ts.map +1 -0
- package/src/shade/renderer/geometry/sdf/bake/shader_mesh_sdf_store.js +84 -0
- package/src/shade/renderer/geometry/sdf/bake/shader_mesh_sdf_take.d.ts +19 -0
- package/src/shade/renderer/geometry/sdf/bake/shader_mesh_sdf_take.d.ts.map +1 -0
- package/src/shade/renderer/geometry/sdf/bake/shader_mesh_sdf_take.js +72 -0
- package/src/shade/renderer/geometry/sdf/cards/GPUMeshCardSets.d.ts +171 -0
- package/src/shade/renderer/geometry/sdf/cards/GPUMeshCardSets.d.ts.map +1 -0
- package/src/shade/renderer/geometry/sdf/cards/GPUMeshCardSets.js +884 -0
- package/src/shade/renderer/geometry/sdf/cards/MESH_CARDS.d.ts +82 -0
- package/src/shade/renderer/geometry/sdf/cards/MESH_CARDS.d.ts.map +1 -0
- package/src/shade/renderer/geometry/sdf/cards/MESH_CARDS.js +127 -0
- package/src/shade/renderer/geometry/sdf/cards/MESH_CARD_RESOURCES.d.ts +24 -0
- package/src/shade/renderer/geometry/sdf/cards/MESH_CARD_RESOURCES.d.ts.map +1 -0
- package/src/shade/renderer/geometry/sdf/cards/MESH_CARD_RESOURCES.js +29 -0
- package/src/shade/renderer/geometry/sdf/cards/MESH_CARD_SET_STRUCT.d.ts +12 -0
- package/src/shade/renderer/geometry/sdf/cards/MESH_CARD_SET_STRUCT.d.ts.map +1 -0
- package/src/shade/renderer/geometry/sdf/cards/MESH_CARD_SET_STRUCT.js +31 -0
- package/src/shade/renderer/geometry/sdf/cards/chunk_mesh_card_surface.d.ts +29 -0
- package/src/shade/renderer/geometry/sdf/cards/chunk_mesh_card_surface.d.ts.map +1 -0
- package/src/shade/renderer/geometry/sdf/cards/chunk_mesh_card_surface.js +179 -0
- package/src/shade/renderer/geometry/sdf/cards/chunk_mesh_cards.d.ts +17 -0
- package/src/shade/renderer/geometry/sdf/cards/chunk_mesh_cards.d.ts.map +1 -0
- package/src/shade/renderer/geometry/sdf/cards/chunk_mesh_cards.js +107 -0
- package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_capture.d.ts +36 -0
- package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_capture.d.ts.map +1 -0
- package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_capture.js +237 -0
- package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_compact.d.ts +19 -0
- package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_compact.d.ts.map +1 -0
- package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_compact.js +61 -0
- package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_histogram.d.ts +18 -0
- package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_histogram.d.ts.map +1 -0
- package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_histogram.js +102 -0
- package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_log.d.ts +15 -0
- package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_log.d.ts.map +1 -0
- package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_log.js +65 -0
- package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_merge.d.ts +22 -0
- package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_merge.d.ts.map +1 -0
- package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_merge.js +136 -0
- package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_pages.d.ts +20 -0
- package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_pages.d.ts.map +1 -0
- package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_pages.js +104 -0
- package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_split.d.ts +30 -0
- package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_split.d.ts.map +1 -0
- package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_split.js +146 -0
- package/src/shade/renderer/geometry/sdf/chunk_blas_query_band_sdf.d.ts +35 -0
- package/src/shade/renderer/geometry/sdf/chunk_blas_query_band_sdf.d.ts.map +1 -0
- package/src/shade/renderer/geometry/sdf/chunk_blas_query_band_sdf.js +161 -0
- package/src/shade/renderer/geometry/sdf/chunk_mesh_sdf.d.ts +21 -0
- package/src/shade/renderer/geometry/sdf/chunk_mesh_sdf.d.ts.map +1 -0
- package/src/shade/renderer/geometry/sdf/chunk_mesh_sdf.js +112 -0
- package/src/shade/renderer/geometry/sdf/chunk_mesh_sdf_normal.d.ts +15 -0
- package/src/shade/renderer/geometry/sdf/chunk_mesh_sdf_normal.d.ts.map +1 -0
- package/src/shade/renderer/geometry/sdf/chunk_mesh_sdf_normal.js +34 -0
- package/src/shade/renderer/geometry/sdf/chunk_mesh_sdf_raymarch.d.ts +17 -0
- package/src/shade/renderer/geometry/sdf/chunk_mesh_sdf_raymarch.d.ts.map +1 -0
- package/src/shade/renderer/geometry/sdf/chunk_mesh_sdf_raymarch.js +64 -0
- package/src/shade/renderer/geometry/sdf/chunk_mesh_sdf_sample.d.ts +32 -0
- package/src/shade/renderer/geometry/sdf/chunk_mesh_sdf_sample.d.ts.map +1 -0
- package/src/shade/renderer/geometry/sdf/chunk_mesh_sdf_sample.js +104 -0
- package/src/shade/renderer/geometry/sdf/shader_sdf_visualize.d.ts +2 -0
- package/src/shade/renderer/geometry/sdf/shader_sdf_visualize.d.ts.map +1 -1
- package/src/shade/renderer/geometry/sdf/shader_sdf_visualize.js +13 -23
- package/src/shade/renderer/geometry/util/geometry_compute_surface_area.js +2 -2
- package/src/shade/renderer/geometry/util/geometry_estimate_uv_aspect.js +2 -2
- package/src/shade/renderer/geometry/util/geometry_simplify_redundant_topology.js +2 -2
- package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.d.ts +34 -12
- package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.js +56 -15
- package/src/shade/renderer/geometry/virtual/runtime/VGeoFeedbackLoop.d.ts +2 -2
- package/src/shade/renderer/geometry/virtual/runtime/VGeoFeedbackLoop.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/VGeoFeedbackLoop.js +13 -26
- package/src/shade/renderer/geometry/virtual/runtime/VGeoViewCut.d.ts +25 -2
- package/src/shade/renderer/geometry/virtual/runtime/VGeoViewCut.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/VGeoViewCut.js +54 -32
- package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_VERDICT.d.ts +14 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_VERDICT.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_VERDICT.js +37 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_arena.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_arena.js +16 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_claim.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_claim.js +2 -6
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_descent.d.ts +131 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_descent.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_descent.js +467 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_instance.d.ts +24 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_instance.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_instance.js +111 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_rule.d.ts +42 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_rule.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_rule.js +404 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_stat.d.ts +16 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_stat.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_stat.js +23 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_want.d.ts +17 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_want.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_want.js +65 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_collect.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_collect.js +14 -70
- package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_traverse.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_traverse.js +13 -773
- package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_cut_descent.d.ts +55 -0
- package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_cut_descent.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_cut_descent.js +248 -0
- package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_expand_instances_to_meshlets.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_expand_instances_to_meshlets.js +15 -174
- package/src/shade/renderer/global_illumination/brick4/cpu/brick4_bake_ao.js +2 -2
- package/src/shade/renderer/global_illumination/brick4/gpu/draw/chunk_brick4_probe_meta_pick2.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/brick4/gpu/draw/chunk_brick4_probe_meta_pick2.js +8 -24
- package/src/shade/renderer/global_illumination/brick4/gpu/draw/chunk_brick4_sample_forward_indirect.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/brick4/gpu/draw/chunk_brick4_sample_forward_indirect.js +1 -25
- package/src/shade/renderer/global_illumination/lpv/bake/GPULightProbeVolumeRenderer.js +2 -2
- package/src/shade/renderer/global_illumination/lpv/deprecated/chunk_lpv_get_visibility_mask.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/lpv/deprecated/chunk_lpv_get_visibility_mask.js +5 -23
- package/src/shade/renderer/global_illumination/lpv/lpv_visualise_probes.d.ts +0 -2
- package/src/shade/renderer/global_illumination/lpv/lpv_visualise_probes.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/lpv/lpv_visualise_probes.js +3 -13
- package/src/shade/renderer/global_illumination/probe/octahedral/GPUProbeAtlas.d.ts +10 -16
- package/src/shade/renderer/global_illumination/probe/octahedral/GPUProbeAtlas.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe/octahedral/GPUProbeAtlas.js +39 -82
- package/src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.d.ts +136 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.js +487 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/PROBE_CLIPMAP_PROPOSAL_2026_10_27.md +3505 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSceneHolds.d.ts +83 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSceneHolds.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSceneHolds.js +626 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSettings.d.ts +265 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSettings.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSettings.js +475 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/BRICK_CLIPMAP.d.ts +138 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/BRICK_CLIPMAP.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/BRICK_CLIPMAP.js +189 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/BRICK_MOVERS.d.ts +37 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/BRICK_MOVERS.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/BRICK_MOVERS.js +48 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/GPUBrickClipmap.d.ts +239 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/GPUBrickClipmap.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/GPUBrickClipmap.js +993 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_clipmap.d.ts +69 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_clipmap.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_clipmap.js +169 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_clipmap_trace.d.ts +191 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_clipmap_trace.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_clipmap_trace.js +590 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_object.d.ts +21 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_object.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_object.js +42 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_provider.d.ts +45 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_provider.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_provider.js +93 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MESH_BRICK_INSTANCE_STRUCT.d.ts +23 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MESH_BRICK_INSTANCE_STRUCT.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MESH_BRICK_INSTANCE_STRUCT.js +35 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MeshSDFBrickProvider.d.ts +35 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MeshSDFBrickProvider.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MeshSDFBrickProvider.js +124 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_instance.d.ts +27 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_instance.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_instance.js +94 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_texel.d.ts +26 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_texel.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_texel.js +73 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_provider.d.ts +35 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_provider.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_provider.js +238 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_clear.d.ts +10 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_clear.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_clear.js +44 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_coarse.d.ts +24 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_coarse.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_coarse.js +92 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_free.d.ts +26 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_free.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_free.js +133 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_movers.d.ts +21 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_movers.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_movers.js +146 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_movers_command.d.ts +18 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_movers_command.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_movers_command.js +84 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_requeue.d.ts +16 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_requeue.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_requeue.js +67 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_scroll.d.ts +20 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_scroll.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_scroll.js +128 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_store.d.ts +20 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_store.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_store.js +127 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_take.d.ts +20 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_take.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_take.js +79 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/VGEO_BRICK.d.ts +99 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/VGEO_BRICK.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/VGEO_BRICK.js +139 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/VGeoBrickProvider.d.ts +65 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/VGeoBrickProvider.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/VGeoBrickProvider.js +393 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_box.d.ts +17 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_box.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_box.js +36 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_pair.d.ts +29 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_pair.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_pair.js +108 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_texel.d.ts +31 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_texel.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_texel.js +113 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_triangle.d.ts +36 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_triangle.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_triangle.js +85 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_distance.d.ts +23 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_distance.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_distance.js +273 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_gather.d.ts +13 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_gather.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_gather.js +151 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_traverse.d.ts +13 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_traverse.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_traverse.js +133 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_wait.d.ts +22 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_wait.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_wait.js +135 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/debug/ProbeClipmapDebugView.d.ts +11 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/debug/ProbeClipmapDebugView.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/debug/ProbeClipmapDebugView.js +16 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/debug/graph_probe_clipmap_debug_brick_clipmap.d.ts +29 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/debug/graph_probe_clipmap_debug_brick_clipmap.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/debug/graph_probe_clipmap_debug_brick_clipmap.js +160 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/debug/graph_probe_clipmap_debug_mesh_cards.d.ts +34 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/debug/graph_probe_clipmap_debug_mesh_cards.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/debug/graph_probe_clipmap_debug_mesh_cards.js +189 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/debug/graph_probe_clipmap_debug_mesh_sdf.d.ts +25 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/debug/graph_probe_clipmap_debug_mesh_sdf.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/debug/graph_probe_clipmap_debug_mesh_sdf.js +138 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/GPUProbeClipmap.d.ts +184 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/GPUProbeClipmap.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/GPUProbeClipmap.js +1124 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/PROBE_CLIPMAP.d.ts +223 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/PROBE_CLIPMAP.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/PROBE_CLIPMAP.js +297 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap.d.ts +244 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap.js +493 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_cage.d.ts +19 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_cage.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_cage.js +40 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_hit_surface.d.ts +41 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_hit_surface.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_hit_surface.js +110 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_pick.d.ts +72 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_pick.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_pick.js +343 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_sample_radiance.d.ts +29 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_sample_radiance.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_sample_radiance.js +188 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_want.d.ts +26 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_want.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_want.js +132 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_accumulate.d.ts +34 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_accumulate.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_accumulate.js +284 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_admit.d.ts +37 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_admit.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_admit.js +176 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_diffuse.d.ts +12 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_diffuse.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_diffuse.js +101 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_due.d.ts +22 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_due.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_due.js +110 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_fill.d.ts +10 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_fill.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_fill.js +39 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_indirect_lighting.d.ts +15 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_indirect_lighting.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_indirect_lighting.js +175 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_light.d.ts +26 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_light.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_light.js +210 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_project.d.ts +26 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_project.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_project.js +177 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_publish.d.ts +18 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_publish.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_publish.js +105 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_relocate.d.ts +25 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_relocate.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_relocate.js +124 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_retire.d.ts +21 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_retire.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_retire.js +118 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_schedule.d.ts +19 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_schedule.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_schedule.js +72 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_shade.d.ts +25 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_shade.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_shade.js +145 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace.d.ts +33 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace.js +196 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace_command.d.ts +19 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace_command.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace_command.js +88 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want.d.ts +23 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want.js +98 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want_hits.d.ts +27 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want_hits.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want_hits.js +110 -0
- package/src/shade/renderer/gpu_primitive/indirect/chunk_folded_dispatch.d.ts +19 -0
- package/src/shade/renderer/gpu_primitive/indirect/chunk_folded_dispatch.d.ts.map +1 -0
- package/src/shade/renderer/gpu_primitive/indirect/chunk_folded_dispatch.js +31 -0
- package/src/shade/renderer/gpu_primitive/slot_stack/chunk_slot_stack.d.ts +33 -0
- package/src/shade/renderer/gpu_primitive/slot_stack/chunk_slot_stack.d.ts.map +1 -0
- package/src/shade/renderer/gpu_primitive/slot_stack/chunk_slot_stack.js +58 -0
- package/src/shade/renderer/gpu_primitive/slot_stack/shader_slot_stack_fill.d.ts +31 -0
- package/src/shade/renderer/gpu_primitive/slot_stack/shader_slot_stack_fill.d.ts.map +1 -0
- package/src/shade/renderer/gpu_primitive/slot_stack/shader_slot_stack_fill.js +62 -0
- package/src/shade/renderer/gpu_primitive/slot_stack/shader_slot_stack_push_range.d.ts +21 -0
- package/src/shade/renderer/gpu_primitive/slot_stack/shader_slot_stack_push_range.d.ts.map +1 -0
- package/src/shade/renderer/gpu_primitive/slot_stack/shader_slot_stack_push_range.js +61 -0
- package/src/shade/renderer/light/GPULightCollection.d.ts.map +1 -1
- package/src/shade/renderer/light/GPULightCollection.js +12 -11
- package/src/shade/renderer/light/cluster/cull/shader_cull_lights_frustum.d.ts +0 -1
- package/src/shade/renderer/light/cluster/cull/shader_cull_lights_frustum.d.ts.map +1 -1
- package/src/shade/renderer/light/cluster/cull/shader_cull_lights_frustum.js +117 -120
- package/src/shade/renderer/light/environment/octahedral_z_pole_uv_to_direction.d.ts +1 -2
- package/src/shade/renderer/light/environment/octahedral_z_pole_uv_to_direction.d.ts.map +1 -1
- package/src/shade/renderer/light/environment/octahedral_z_pole_uv_to_direction.js +44 -45
- package/src/shade/renderer/light/world_cluster/chunk_world_light_cluster_lookup.d.ts +13 -0
- package/src/shade/renderer/light/world_cluster/chunk_world_light_cluster_lookup.d.ts.map +1 -1
- package/src/shade/renderer/light/world_cluster/chunk_world_light_cluster_lookup.js +40 -0
- package/src/shade/renderer/light/world_cluster/graph_build_world_light_clusters.d.ts +11 -6
- package/src/shade/renderer/light/world_cluster/graph_build_world_light_clusters.d.ts.map +1 -1
- package/src/shade/renderer/light/world_cluster/graph_build_world_light_clusters.js +15 -8
- package/src/shade/renderer/light/world_cluster/shader_world_cluster_assign_lights.d.ts +9 -2
- package/src/shade/renderer/light/world_cluster/shader_world_cluster_assign_lights.d.ts.map +1 -1
- package/src/shade/renderer/light/world_cluster/shader_world_cluster_assign_lights.js +25 -11
- package/src/shade/renderer/lightmap/atlas/rescale_uvs.js +2 -2
- package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
- package/src/shade/renderer/material/StandardShadeMaterial.js +5 -5
- package/src/shade/renderer/material/resident/GPUResidentMaterialContext.d.ts +10 -4
- package/src/shade/renderer/material/resident/GPUResidentMaterialContext.d.ts.map +1 -1
- package/src/shade/renderer/material/resident/GPUResidentMaterialContext.js +112 -8
- package/src/shade/renderer/material/resident/RESIDENT_MATERIAL_TEXTURE_LAYOUT.d.ts +21 -0
- package/src/shade/renderer/material/resident/RESIDENT_MATERIAL_TEXTURE_LAYOUT.d.ts.map +1 -0
- package/src/shade/renderer/material/resident/RESIDENT_MATERIAL_TEXTURE_LAYOUT.js +30 -0
- package/src/shade/renderer/material/resident/shader_resident_texture_means.d.ts +24 -0
- package/src/shade/renderer/material/resident/shader_resident_texture_means.d.ts.map +1 -0
- package/src/shade/renderer/material/resident/shader_resident_texture_means.js +120 -0
- package/src/shade/renderer/particles/DESIGN.md +151 -42
- package/src/shade/renderer/particles/EMITTER_GLOBAL_STATE_PLAN_2026_10_29.md +283 -0
- package/src/shade/renderer/particles/GPUParticleSystem.d.ts +10 -2
- package/src/shade/renderer/particles/GPUParticleSystem.d.ts.map +1 -1
- package/src/shade/renderer/particles/GPUParticleSystem.js +53 -15
- package/src/shade/renderer/particles/ParticleConstants.d.ts +23 -6
- package/src/shade/renderer/particles/ParticleConstants.d.ts.map +1 -1
- package/src/shade/renderer/particles/ParticleConstants.js +25 -6
- package/src/shade/renderer/particles/bounds/chunk_particle_bounds.js +5 -5
- package/src/shade/renderer/particles/bounds/shader_particle_bounds.js +187 -187
- package/src/shade/renderer/particles/data/PARTICLE_DATABASE_SPEC.d.ts +20 -9
- package/src/shade/renderer/particles/data/PARTICLE_DATABASE_SPEC.d.ts.map +1 -1
- package/src/shade/renderer/particles/data/PARTICLE_DATABASE_SPEC.js +36 -10
- package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STRUCT.d.ts +8 -7
- package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STRUCT.d.ts.map +1 -1
- package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STRUCT.js +25 -16
- package/src/shade/renderer/particles/data/PARTICLE_FIELD_BINDING.d.ts +51 -0
- package/src/shade/renderer/particles/data/PARTICLE_FIELD_BINDING.d.ts.map +1 -0
- package/src/shade/renderer/particles/data/PARTICLE_FIELD_BINDING.js +56 -0
- package/src/shade/renderer/particles/data/particle_emitter_record.d.ts.map +1 -1
- package/src/shade/renderer/particles/data/particle_emitter_record.js +2 -0
- package/src/shade/renderer/particles/graph/ParticleGroupBuilder.d.ts +1 -1
- package/src/shade/renderer/particles/graph/ParticleGroupBuilder.js +1 -1
- package/src/shade/renderer/particles/graph/ParticleNodeDescription.d.ts +22 -11
- package/src/shade/renderer/particles/graph/ParticleNodeDescription.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/ParticleNodeDescription.js +14 -11
- package/src/shade/renderer/particles/graph/ParticleNodeRegistry.d.ts +4 -4
- package/src/shade/renderer/particles/graph/ParticleNodeRegistry.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/ParticleNodeRegistry.js +59 -24
- package/src/shade/renderer/particles/graph/ParticleValueType.d.ts +3 -3
- package/src/shade/renderer/particles/graph/ParticleValueType.js +287 -287
- package/src/shade/renderer/particles/graph/compile_particle_graph.d.ts +13 -6
- package/src/shade/renderer/particles/graph/compile_particle_graph.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/compile_particle_graph.js +46 -27
- package/src/shade/renderer/particles/graph/infer_particle_graph_types.d.ts +8 -2
- package/src/shade/renderer/particles/graph/infer_particle_graph_types.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/infer_particle_graph_types.js +240 -234
- package/src/shade/renderer/particles/graph/make_particle_group.d.ts +1 -1
- package/src/shade/renderer/particles/graph/make_particle_group.js +1 -1
- package/src/shade/renderer/particles/graph/particle_graph_authoring.d.ts +3 -2
- package/src/shade/renderer/particles/graph/particle_graph_authoring.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/particle_graph_authoring.js +3 -2
- package/src/shade/renderer/particles/graph/particle_graph_distributions.js +170 -170
- package/src/shade/renderer/particles/graph/particle_graph_json.d.ts +25 -16
- package/src/shade/renderer/particles/graph/particle_graph_json.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/particle_graph_json.js +16 -2
- package/src/shade/renderer/particles/graph/particle_node_parameters.d.ts +29 -15
- package/src/shade/renderer/particles/graph/particle_node_parameters.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/particle_node_parameters.js +54 -22
- package/src/shade/renderer/particles/graph/particle_node_presentation.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/particle_node_presentation.js +18 -8
- package/src/shade/renderer/particles/graph/validate_particle_graph.d.ts +9 -3
- package/src/shade/renderer/particles/graph/validate_particle_graph.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/validate_particle_graph.js +70 -38
- package/src/shade/renderer/particles/graph_particles.d.ts +9 -4
- package/src/shade/renderer/particles/graph_particles.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph_particles.js +27 -4
- package/src/shade/renderer/particles/isa/InstructionStream.d.ts +7 -6
- package/src/shade/renderer/particles/isa/InstructionStream.d.ts.map +1 -1
- package/src/shade/renderer/particles/isa/InstructionStream.js +17 -16
- package/src/shade/renderer/particles/isa/ParticleAssembler.d.ts +17 -0
- package/src/shade/renderer/particles/isa/ParticleAssembler.d.ts.map +1 -1
- package/src/shade/renderer/particles/isa/ParticleAssembler.js +35 -0
- package/src/shade/renderer/particles/isa/ParticleProgram.d.ts +26 -6
- package/src/shade/renderer/particles/isa/ParticleProgram.d.ts.map +1 -1
- package/src/shade/renderer/particles/isa/ParticleProgram.js +61 -9
- package/src/shade/renderer/particles/isa/ParticleVMISA.d.ts +55 -4
- package/src/shade/renderer/particles/isa/ParticleVMISA.d.ts.map +1 -1
- package/src/shade/renderer/particles/isa/ParticleVMISA.js +79 -10
- package/src/shade/renderer/particles/isa/particle_assembly.d.ts +20 -6
- package/src/shade/renderer/particles/isa/particle_assembly.d.ts.map +1 -1
- package/src/shade/renderer/particles/isa/particle_assembly.js +136 -25
- package/src/shade/renderer/particles/isa/particle_link_global_fields.d.ts +20 -0
- package/src/shade/renderer/particles/isa/particle_link_global_fields.d.ts.map +1 -0
- package/src/shade/renderer/particles/isa/particle_link_global_fields.js +46 -0
- package/src/shade/renderer/particles/isa/validate_particle_program.js +8 -8
- package/src/shade/renderer/particles/layout/ParticleLayout.d.ts +62 -28
- package/src/shade/renderer/particles/layout/ParticleLayout.d.ts.map +1 -1
- package/src/shade/renderer/particles/layout/ParticleLayout.js +102 -62
- package/src/shade/renderer/particles/optimizer/dag/optimize_particle_program_vector.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/dag/optimize_particle_program_vector.js +2 -0
- package/src/shade/renderer/particles/optimizer/dag/particle_vector_groups.js +1 -1
- package/src/shade/renderer/particles/optimizer/dag/particle_vector_lift.js +4 -3
- package/src/shade/renderer/particles/optimizer/dag/particle_vector_lower.js +2 -2
- package/src/shade/renderer/particles/optimizer/dag/particle_vector_pack.d.ts +3 -3
- package/src/shade/renderer/particles/optimizer/dag/particle_vector_pack.js +11 -11
- package/src/shade/renderer/particles/optimizer/optimize_particle_program.d.ts +4 -4
- package/src/shade/renderer/particles/optimizer/optimize_particle_program.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/optimize_particle_program.js +5 -4
- package/src/shade/renderer/particles/optimizer/particle_integer_bounds.d.ts +1 -1
- package/src/shade/renderer/particles/optimizer/particle_integer_bounds.js +1 -1
- package/src/shade/renderer/particles/optimizer/particle_program_equivalence.d.ts +4 -4
- package/src/shade/renderer/particles/optimizer/particle_program_equivalence.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/particle_program_equivalence.js +13 -11
- package/src/shade/renderer/particles/optimizer/particle_program_fuzz.js +7 -7
- package/src/shade/renderer/particles/optimizer/particle_vm_semantics.d.ts +3 -2
- package/src/shade/renderer/particles/optimizer/particle_vm_semantics.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/particle_vm_semantics.js +5 -4
- package/src/shade/renderer/particles/optimizer/pass_allocate_registers.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/pass_dedup_constants.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/pass_eliminate_dead_code.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/pass_eliminate_dead_code.js +51 -51
- package/src/shade/renderer/particles/optimizer/pass_fold_constants.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/pass_fold_constants.js +5 -5
- package/src/shade/renderer/particles/optimizer/pass_inline_constants.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/pass_narrow_widths.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/pass_pack_registers.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/pass_peephole.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/pass_propagate_copies.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/pass_schedule.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/pass_schedule.js +2 -2
- package/src/shade/renderer/particles/optimizer/pass_share_subexpressions.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/pass_share_subexpressions.js +5 -4
- package/src/shade/renderer/particles/runtime/EmitterRegistry.d.ts +93 -22
- package/src/shade/renderer/particles/runtime/EmitterRegistry.d.ts.map +1 -1
- package/src/shade/renderer/particles/runtime/EmitterRegistry.js +336 -29
- package/src/shade/renderer/particles/runtime/GPUParticleEmitterContext.d.ts +43 -3
- package/src/shade/renderer/particles/runtime/GPUParticleEmitterContext.d.ts.map +1 -1
- package/src/shade/renderer/particles/runtime/GPUParticleEmitterContext.js +43 -3
- package/src/shade/renderer/particles/runtime/ParticleEmitter.d.ts +56 -26
- package/src/shade/renderer/particles/runtime/ParticleEmitter.d.ts.map +1 -1
- package/src/shade/renderer/particles/runtime/ParticleEmitter.js +89 -33
- package/src/shade/renderer/particles/runtime/ParticleGlobalFields.d.ts +85 -0
- package/src/shade/renderer/particles/runtime/ParticleGlobalFields.d.ts.map +1 -0
- package/src/shade/renderer/particles/runtime/ParticleGlobalFields.js +221 -0
- package/src/shade/renderer/particles/runtime/ProgramHeap.d.ts +143 -18
- package/src/shade/renderer/particles/runtime/ProgramHeap.d.ts.map +1 -1
- package/src/shade/renderer/particles/runtime/ProgramHeap.js +378 -28
- package/src/shade/renderer/particles/runtime/create_particle_effect.d.ts +19 -7
- package/src/shade/renderer/particles/runtime/create_particle_effect.d.ts.map +1 -1
- package/src/shade/renderer/particles/runtime/create_particle_effect.js +22 -9
- package/src/shade/renderer/particles/shaders/chunk_particle_billboard_vertex.js +8 -8
- package/src/shade/renderer/particles/shaders/chunk_particle_render_math.js +1 -1
- package/src/shade/renderer/particles/shaders/chunk_particle_setup_context.d.ts +3 -0
- package/src/shade/renderer/particles/shaders/chunk_particle_setup_context.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/chunk_particle_setup_context.js +4 -0
- package/src/shade/renderer/particles/shaders/shader_particle_emit.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/shader_particle_emit.js +5 -6
- package/src/shade/renderer/particles/shaders/shader_particle_emit_wide.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/shader_particle_emit_wide.js +5 -7
- package/src/shade/renderer/particles/shaders/shader_particle_field_bind.d.ts +30 -0
- package/src/shade/renderer/particles/shaders/shader_particle_field_bind.d.ts.map +1 -0
- package/src/shade/renderer/particles/shaders/shader_particle_field_bind.js +121 -0
- package/src/shade/renderer/particles/shaders/shader_particle_simulate.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/shader_particle_simulate.js +3 -2
- package/src/shade/renderer/particles/shaders/shader_particle_simulate_wide.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/shader_particle_simulate_wide.js +3 -2
- package/src/shade/renderer/particles/vm/PARTICLE_VM_CONTEXT_STRUCT.d.ts.map +1 -1
- package/src/shade/renderer/particles/vm/PARTICLE_VM_CONTEXT_STRUCT.js +3 -1
- package/src/shade/renderer/particles/vm/ParticleVMReference.d.ts +12 -4
- package/src/shade/renderer/particles/vm/ParticleVMReference.d.ts.map +1 -1
- package/src/shade/renderer/particles/vm/ParticleVMReference.js +48 -11
- package/src/shade/renderer/particles/vm/chunk_particle_vm.d.ts.map +1 -1
- package/src/shade/renderer/particles/vm/chunk_particle_vm.js +36 -14
- package/src/shade/renderer/particles/warmup/shader_particle_warmup.d.ts.map +1 -1
- package/src/shade/renderer/particles/warmup/shader_particle_warmup.js +316 -318
- package/src/shade/renderer/particles/warmup/shader_particle_warmup_advance.d.ts.map +1 -1
- package/src/shade/renderer/particles/warmup/shader_particle_warmup_advance.js +3 -2
- package/src/shade/renderer/particles/warmup/shader_particle_warmup_advance_wide.d.ts.map +1 -1
- package/src/shade/renderer/particles/warmup/shader_particle_warmup_advance_wide.js +2 -0
- package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_texture.js +1 -1
- package/src/shade/renderer/postprocess/PostProcess.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/PostProcess.js +2 -1
- package/src/shade/renderer/postprocess/gtao/GTAO.d.ts +31 -19
- package/src/shade/renderer/postprocess/gtao/GTAO.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/gtao/GTAO.js +44 -30
- package/src/shade/renderer/postprocess/gtao/GTAO_CONSTANTS.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/gtao/GTAO_CONSTANTS.js +75 -78
- package/src/shade/renderer/postprocess/gtao/ao_reproject_shader.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/gtao/ao_reproject_shader.js +16 -2
- package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao.d.ts +0 -5
- package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao.js +377 -382
- package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
- package/src/shade/renderer/postprocess/nss/NSS.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/nss/NSS.js +4 -3
- package/src/shade/renderer/postprocess/ssr/SSR.d.ts +7 -1
- package/src/shade/renderer/postprocess/ssr/SSR.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/ssr/SSR.js +16 -0
- package/src/shade/renderer/postprocess/ssr/resolve/chunk_ssr_add_hit_irradiance.d.ts +20 -2
- package/src/shade/renderer/postprocess/ssr/resolve/chunk_ssr_add_hit_irradiance.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/ssr/resolve/chunk_ssr_add_hit_irradiance.js +53 -2
- package/src/shade/renderer/postprocess/ssr/resolve/chunk_ssr_sample_radiance.d.ts +10 -1
- package/src/shade/renderer/postprocess/ssr/resolve/chunk_ssr_sample_radiance.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/ssr/resolve/chunk_ssr_sample_radiance.js +31 -1
- 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 +17 -11
- package/src/shade/renderer/postprocess/taa/TAA.d.ts +4 -2
- package/src/shade/renderer/postprocess/taa/TAA.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/taa/TAA.js +6 -1
- package/src/shade/renderer/postprocess/taa/chunk_fsr2_compute_depth_clip.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/taa/chunk_fsr2_compute_depth_clip.js +10 -5
- package/src/shade/renderer/postprocess/taa/shader_taa.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/taa/shader_taa.js +15 -12
- package/src/shade/renderer/postprocess/velocity/graph_add_per_object_velocity.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/velocity/graph_add_per_object_velocity.js +26 -17
- package/src/shade/renderer/rasterize/forward/chunk_forward_sample_indirect.d.ts +4 -2
- package/src/shade/renderer/rasterize/forward/chunk_forward_sample_indirect.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/forward/chunk_forward_sample_indirect.js +6 -2
- package/src/shade/renderer/rasterize/forward/chunk_forward_sample_indirect_probe_clipmap.d.ts +12 -0
- package/src/shade/renderer/rasterize/forward/chunk_forward_sample_indirect_probe_clipmap.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/forward/chunk_forward_sample_indirect_probe_clipmap.js +57 -0
- package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.d.ts +4 -2
- package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.js +4 -2
- package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.d.ts +8 -2
- package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.js +28 -15
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_draw.d.ts +2 -1
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_draw.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_draw.js +19 -3
- package/src/shade/renderer/rasterize/native/graph_rasterize_meshes_alpha_tested.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/graph_rasterize_meshes_alpha_tested.js +4 -2
- package/src/shade/renderer/rasterize/native/oit/graph_rasterize_meshes_transparent_oit.d.ts +3 -1
- package/src/shade/renderer/rasterize/native/oit/graph_rasterize_meshes_transparent_oit.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/oit/graph_rasterize_meshes_transparent_oit.js +27 -14
- package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments.d.ts +2 -1
- package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments.js +19 -3
- package/src/shade/renderer/scene/GPUSceneContext.d.ts +17 -2
- package/src/shade/renderer/scene/GPUSceneContext.d.ts.map +1 -1
- package/src/shade/renderer/scene/GPUSceneContext.js +38 -2
- package/src/shade/renderer/scene/MESH_INSTANCE_METADATA_STRUCT.d.ts +17 -0
- package/src/shade/renderer/scene/MESH_INSTANCE_METADATA_STRUCT.d.ts.map +1 -1
- package/src/shade/renderer/scene/MESH_INSTANCE_METADATA_STRUCT.js +27 -0
- package/src/shade/renderer/scene/bvh/StaticSceneBVH.d.ts.map +1 -1
- package/src/shade/renderer/scene/bvh/StaticSceneBVH.js +4 -6
- package/src/shade/renderer/scene/chunk_mesh_flags.d.ts +9 -0
- package/src/shade/renderer/scene/chunk_mesh_flags.d.ts.map +1 -0
- package/src/shade/renderer/scene/chunk_mesh_flags.js +22 -0
- package/src/shade/renderer/scene/movers/SCENE_MOVER_LAYOUT.d.ts +65 -0
- package/src/shade/renderer/scene/movers/SCENE_MOVER_LAYOUT.d.ts.map +1 -0
- package/src/shade/renderer/scene/movers/SCENE_MOVER_LAYOUT.js +87 -0
- package/src/shade/renderer/scene/movers/SceneMoverTracker.d.ts +42 -0
- package/src/shade/renderer/scene/movers/SceneMoverTracker.d.ts.map +1 -0
- package/src/shade/renderer/scene/movers/SceneMoverTracker.js +153 -0
- package/src/shade/renderer/scene/movers/chunk_scene_append_mover.d.ts +14 -0
- package/src/shade/renderer/scene/movers/chunk_scene_append_mover.d.ts.map +1 -0
- package/src/shade/renderer/scene/movers/chunk_scene_append_mover.js +33 -0
- package/src/shade/renderer/scene/movers/graph_scene_movers.d.ts +33 -0
- package/src/shade/renderer/scene/movers/graph_scene_movers.d.ts.map +1 -0
- package/src/shade/renderer/scene/movers/graph_scene_movers.js +114 -0
- package/src/shade/renderer/scene/movers/shader_scene_movers.d.ts +33 -0
- package/src/shade/renderer/scene/movers/shader_scene_movers.d.ts.map +1 -0
- package/src/shade/renderer/scene/movers/shader_scene_movers.js +197 -0
- package/src/shade/renderer/scene/movers/shader_scene_skinned_movers.d.ts +24 -0
- package/src/shade/renderer/scene/movers/shader_scene_skinned_movers.d.ts.map +1 -0
- package/src/shade/renderer/scene/movers/shader_scene_skinned_movers.js +112 -0
- package/src/shade/renderer/scene/rows/GPUSceneRows.d.ts +26 -4
- package/src/shade/renderer/scene/rows/GPUSceneRows.d.ts.map +1 -1
- package/src/shade/renderer/scene/rows/GPUSceneRows.js +64 -6
- package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_nearest_point_on_surface.js +1 -1
- package/src/shade/renderer/shader/chunk/geometry/mat4/chunk_mat4_decompose_transform.d.ts +1 -1
- package/src/shade/renderer/shader/chunk/geometry/mat4/chunk_mat4_decompose_transform.js +2 -2
- package/src/shade/renderer/shader/chunk/geometry/meshlet/chunk_read_meshlet_triangle_bounds.d.ts +2 -8
- package/src/shade/renderer/shader/chunk/geometry/meshlet/chunk_read_meshlet_triangle_bounds.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/geometry/meshlet/chunk_read_meshlet_triangle_bounds.js +25 -52
- package/src/shade/renderer/shader/chunk/geometry/meshlet/chunk_read_meshlet_triangle_positions.d.ts +15 -0
- package/src/shade/renderer/shader/chunk/geometry/meshlet/chunk_read_meshlet_triangle_positions.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/geometry/meshlet/chunk_read_meshlet_triangle_positions.js +52 -0
- package/src/shade/renderer/shader/chunk/geometry/quaternion/chunk_quat_decode_u32.d.ts +1 -1
- package/src/shade/renderer/shader/chunk/geometry/quaternion/chunk_quat_decode_u32.js +1 -1
- package/src/shade/renderer/shader/chunk/geometry/quaternion/chunk_quat_encode_u32.d.ts +1 -1
- package/src/shade/renderer/shader/chunk/geometry/quaternion/chunk_quat_encode_u32.js +1 -1
- package/src/shade/renderer/shader/chunk/geometry/triangle/TRIANGLE_POSITIONS_STRUCT.d.ts +7 -0
- package/src/shade/renderer/shader/chunk/geometry/triangle/TRIANGLE_POSITIONS_STRUCT.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/geometry/triangle/TRIANGLE_POSITIONS_STRUCT.js +12 -0
- package/src/shade/renderer/shader/chunk/grid/chunk_index_to_grid2d_reciprocal.d.ts +22 -0
- package/src/shade/renderer/shader/chunk/grid/chunk_index_to_grid2d_reciprocal.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/grid/chunk_index_to_grid2d_reciprocal.js +37 -0
- package/src/shade/renderer/shader/chunk/light/lpv/depth/chunk_lpv_mask_weights_by_visibility.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/light/lpv/depth/chunk_lpv_mask_weights_by_visibility.js +26 -60
- package/src/shade/renderer/shader/chunk/light/probe/chunk_probe_visibility_weight.d.ts +23 -0
- package/src/shade/renderer/shader/chunk/light/probe/chunk_probe_visibility_weight.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/light/probe/chunk_probe_visibility_weight.js +54 -0
- package/src/shade/renderer/shader/chunk/math/chunk_f16_round_stochastic.d.ts +25 -0
- package/src/shade/renderer/shader/chunk/math/chunk_f16_round_stochastic.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/math/chunk_f16_round_stochastic.js +43 -0
- package/src/shade/renderer/shader/chunk/random/chunk_jitter_from_vectors.d.ts +14 -0
- package/src/shade/renderer/shader/chunk/random/chunk_jitter_from_vectors.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/random/chunk_jitter_from_vectors.js +37 -0
- package/src/shade/renderer/shader/chunk/random/reservoir/chunk_pick2_wrs_mat2x4.d.ts +27 -0
- package/src/shade/renderer/shader/chunk/random/reservoir/chunk_pick2_wrs_mat2x4.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/random/reservoir/chunk_pick2_wrs_mat2x4.js +61 -0
- package/src/shade/renderer/shader/chunk/random/reservoir/chunk_sample_discrete_wrs_mat2x4.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/random/reservoir/chunk_sample_discrete_wrs_mat2x4.js +10 -7
- package/src/shade/renderer/shader/chunk/random/reservoir/chunk_sample_discrete_wrs_vec4.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/random/reservoir/chunk_sample_discrete_wrs_vec4.js +6 -3
- package/src/shade/renderer/shader/chunk/sdf/chunk_scene_sdf_raymarch.d.ts +22 -0
- package/src/shade/renderer/shader/chunk/sdf/chunk_scene_sdf_raymarch.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/sdf/chunk_scene_sdf_raymarch.js +62 -34
- package/src/shade/renderer/shader/chunk/spherical_harmonics/l1i/chunk_resolve_irradiance_sh_to_specular.d.ts +21 -0
- package/src/shade/renderer/shader/chunk/spherical_harmonics/l1i/chunk_resolve_irradiance_sh_to_specular.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/spherical_harmonics/l1i/chunk_resolve_irradiance_sh_to_specular.js +41 -0
- package/src/shade/renderer/shader/compiler/CodeChunk.d.ts +1 -1
- package/src/shade/renderer/shader/compiler/ShaderSwitch.d.ts +1 -1
- package/src/shade/renderer/shader/compiler/ShaderSwitchSet.d.ts +1 -1
- package/src/shade/renderer/shader/resource/ShaderResourceDescriptor.d.ts +1 -1
- package/src/shade/renderer/shadow/map/DirectionalLightShadowmap.js +4 -4
- package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts +50 -11
- package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts.map +1 -1
- package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.js +188 -51
- package/src/shade/renderer/shadow/map/SHADOWMAP_PATCH_MIN_SIDE.d.ts +8 -0
- package/src/shade/renderer/shadow/map/SHADOWMAP_PATCH_MIN_SIDE.d.ts.map +1 -0
- package/src/shade/renderer/shadow/map/SHADOWMAP_PATCH_MIN_SIDE.js +7 -0
- package/src/shade/renderer/shadow/map/Shadowmap.d.ts +7 -7
- package/src/shade/renderer/shadow/map/Shadowmap.js +7 -7
- package/src/shade/renderer/shadow/map/ShadowmapResolutionPolicy.d.ts +17 -0
- package/src/shade/renderer/shadow/map/ShadowmapResolutionPolicy.d.ts.map +1 -1
- package/src/shade/renderer/shadow/map/ShadowmapResolutionPolicy.js +29 -8
- package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_get_light_visibility.d.ts +0 -1
- package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_get_light_visibility.d.ts.map +1 -1
- package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_get_light_visibility.js +0 -3
- package/src/shade/renderer/shadow/sdf/SDF_DRAW_SETTINGS_STRUCT.d.ts.map +1 -1
- package/src/shade/renderer/shadow/sdf/SDF_DRAW_SETTINGS_STRUCT.js +2 -5
- package/src/shade/renderer/shadow/sdf/chunk_geometry_sdf_query_distance.d.ts +8 -0
- package/src/shade/renderer/shadow/sdf/chunk_geometry_sdf_query_distance.d.ts.map +1 -1
- package/src/shade/renderer/shadow/sdf/chunk_geometry_sdf_query_distance.js +13 -41
- package/src/shade/renderer/shadow/sdf/chunk_ray_query_sdf_raycast_traversal_count.js +6 -5
- package/src/shade/renderer/shadow/sdf/chunk_sdf_geometry_raymarch.d.ts +8 -0
- package/src/shade/renderer/shadow/sdf/chunk_sdf_geometry_raymarch.d.ts.map +1 -1
- package/src/shade/renderer/shadow/sdf/chunk_sdf_geometry_raymarch.js +20 -73
- package/src/shade/renderer/shadow/sdf/chunk_sdf_mesh_raymarch.d.ts.map +1 -1
- package/src/shade/renderer/shadow/sdf/chunk_sdf_mesh_raymarch.js +4 -0
- package/src/shade/renderer/shadow/sdf/graph_draw_sdf_shadows.d.ts +2 -0
- package/src/shade/renderer/shadow/sdf/graph_draw_sdf_shadows.d.ts.map +1 -1
- package/src/shade/renderer/shadow/sdf/graph_draw_sdf_shadows.js +14 -8
- package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_LOW_LOAD_FACTOR.d.ts +12 -0
- package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_LOW_LOAD_FACTOR.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_LOW_LOAD_FACTOR.js +11 -0
- package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_MAX_DYNAMIC_LOD_BIAS.d.ts +9 -0
- package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_MAX_DYNAMIC_LOD_BIAS.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_MAX_DYNAMIC_LOD_BIAS.js +8 -0
- package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_MAX_LOAD_FACTOR.d.ts +13 -0
- package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_MAX_LOAD_FACTOR.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_MAX_LOAD_FACTOR.js +12 -0
- package/src/shade/renderer/shadow/vsm/PLAN.md +3 -1
- package/src/shade/renderer/shadow/vsm/VSMPageManager.d.ts +80 -1
- package/src/shade/renderer/shadow/vsm/VSMPageManager.d.ts.map +1 -1
- package/src/shade/renderer/shadow/vsm/VSMPageManager.js +303 -3
- package/src/shade/renderer/shadow/vsm/VirtualShadowMap.d.ts +54 -3
- package/src/shade/renderer/shadow/vsm/VirtualShadowMap.d.ts.map +1 -1
- package/src/shade/renderer/shadow/vsm/VirtualShadowMap.js +418 -338
- package/src/shade/renderer/shadow/vsm/graph_vsm_feedback.d.ts +8 -9
- package/src/shade/renderer/shadow/vsm/graph_vsm_feedback.d.ts.map +1 -1
- package/src/shade/renderer/shadow/vsm/graph_vsm_feedback.js +9 -92
- package/src/shade/renderer/shadow/vsm/shader/shader_vsm_stale.js +6 -6
- package/src/shade/renderer/texture/atlas/GPUTileAtlas2D.d.ts +90 -0
- package/src/shade/renderer/texture/atlas/GPUTileAtlas2D.d.ts.map +1 -0
- package/src/shade/renderer/texture/atlas/GPUTileAtlas2D.js +208 -0
- package/src/shade/renderer/texture/atlas/GPUTileAtlas3D.d.ts +23 -4
- package/src/shade/renderer/texture/atlas/GPUTileAtlas3D.d.ts.map +1 -1
- package/src/shade/renderer/texture/atlas/GPUTileAtlas3D.js +56 -5
- package/src/shade/renderer/texture/util/texture_fill_rectangle.d.ts.map +1 -1
- package/src/shade/renderer/texture/util/texture_fill_rectangle.js +282 -267
- package/src/shade/renderer/view/GPUViewContext.js +2 -2
- package/src/shade/renderer/volumetrics/GPUViewVolumetrics.d.ts +8 -4
- package/src/shade/renderer/volumetrics/GPUViewVolumetrics.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/GPUViewVolumetrics.js +36 -36
- package/src/shade/renderer/volumetrics/chunk_volumetrics_sun_shadow_group_list.d.ts +59 -0
- package/src/shade/renderer/volumetrics/chunk_volumetrics_sun_shadow_group_list.d.ts.map +1 -0
- package/src/shade/renderer/volumetrics/chunk_volumetrics_sun_shadow_group_list.js +152 -0
- package/src/shade/renderer/volumetrics/graph_build_volumetrics.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/graph_build_volumetrics.js +145 -46
- package/src/shade/renderer/volumetrics/irradiance_clipmap/GPUIrradianceClipmap.d.ts +6 -1
- package/src/shade/renderer/volumetrics/irradiance_clipmap/GPUIrradianceClipmap.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/irradiance_clipmap/GPUIrradianceClipmap.js +498 -484
- package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_gi_sample.d.ts +14 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_gi_sample.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_gi_sample.js +56 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/shader_irradiance_clipmap_build.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/irradiance_clipmap/shader_irradiance_clipmap_build.js +197 -191
- package/src/shade/renderer/volumetrics/shader_volumetrics_bin_sun_shadow_media.d.ts +21 -0
- package/src/shade/renderer/volumetrics/shader_volumetrics_bin_sun_shadow_media.d.ts.map +1 -0
- package/src/shade/renderer/volumetrics/shader_volumetrics_bin_sun_shadow_media.js +125 -0
- package/src/shade/renderer/volumetrics/shader_volumetrics_build_sun_shadow_volume.d.ts +4 -44
- package/src/shade/renderer/volumetrics/shader_volumetrics_build_sun_shadow_volume.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/shader_volumetrics_build_sun_shadow_volume.js +558 -311
- package/src/shade/renderer/volumetrics/shader_volumetrics_cull_sun_shadow_media.d.ts +18 -0
- package/src/shade/renderer/volumetrics/shader_volumetrics_cull_sun_shadow_media.d.ts.map +1 -0
- package/src/shade/renderer/volumetrics/shader_volumetrics_cull_sun_shadow_media.js +84 -0
- package/src/shade/renderer/volumetrics/shader_volumetrics_split_participating_media.d.ts +4 -0
- package/src/shade/renderer/volumetrics/shader_volumetrics_split_participating_media.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/shader_volumetrics_split_participating_media.js +1 -1
- package/src/shade/renderer/volumetrics/taa/shader_volumetrics_taa.js +4 -4
- package/src/shade/renderer/water/GPUWaterRenderer.d.ts +2 -1
- package/src/shade/renderer/water/GPUWaterRenderer.d.ts.map +1 -1
- package/src/shade/renderer/water/GPUWaterRenderer.js +5 -1
- package/src/shade/renderer/water/chunk_water_gi.d.ts +12 -2
- package/src/shade/renderer/water/chunk_water_gi.d.ts.map +1 -1
- package/src/shade/renderer/water/chunk_water_gi.js +46 -2
- package/src/shade/renderer/water/query/GPUWaterQueries.d.ts +127 -0
- package/src/shade/renderer/water/query/GPUWaterQueries.d.ts.map +1 -0
- package/src/shade/renderer/water/query/GPUWaterQueries.js +741 -0
- package/src/shade/renderer/water/query/WATER_QUERY_DATABASE_SPEC.d.ts +58 -0
- package/src/shade/renderer/water/query/WATER_QUERY_DATABASE_SPEC.d.ts.map +1 -0
- package/src/shade/renderer/water/query/WATER_QUERY_DATABASE_SPEC.js +79 -0
- package/src/shade/renderer/water/query/shader_water_surface_query.d.ts +32 -0
- package/src/shade/renderer/water/query/shader_water_surface_query.d.ts.map +1 -0
- package/src/shade/renderer/water/query/shader_water_surface_query.js +227 -0
- package/src/shade/renderer/water/shader_water.d.ts +3 -2
- package/src/shade/renderer/water/shader_water.d.ts.map +1 -1
- package/src/shade/renderer/water/shader_water.js +9 -3
- package/src/shade/renderer/wind/GPUSceneWind.d.ts +1 -1
- package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js +12 -6
- package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts.map +1 -1
- package/src/shade/wgsl/emulator/WGSLLanguageCore.js +20 -1
- package/src/shade/wgsl/validate_wgsl_source.d.ts.map +1 -1
- package/src/shade/wgsl/validate_wgsl_source.js +26 -0
- package/src/view/common/LabelView.js +1 -1
- package/src/view/common/VirtualListView.js +1 -1
- package/src/view/elements/progress/SmoothProgressBar.js +1 -1
- package/src/view/tooltip/TooltipManager.js +1 -1
- package/editor/view/ecs/components/DatGuiController.d.ts +0 -2
- package/editor/view/ecs/components/DatGuiController.d.ts.map +0 -1
- package/editor/view/ecs/components/DatGuiController.js +0 -2
- package/editor/view/v2/SplitView.d.ts +0 -2
- package/editor/view/v2/SplitView.d.ts.map +0 -1
- package/editor/view/v2/SplitView.js +0 -2
- package/src/core/binary/hash/XXH128Hash.d.ts +0 -2
- package/src/core/binary/hash/XXH128Hash.d.ts.map +0 -1
- package/src/core/binary/hash/XXH128Hash.js +0 -4
- package/src/core/binary/hash/XXH3_SECRET.d.ts +0 -2
- package/src/core/binary/hash/XXH3_SECRET.d.ts.map +0 -1
- package/src/core/binary/hash/XXH3_SECRET.js +0 -4
- package/src/core/binary/hash/crc32.d.ts +0 -2
- package/src/core/binary/hash/crc32.d.ts.map +0 -1
- package/src/core/binary/hash/crc32.js +0 -4
- package/src/core/binary/hash/xxh3_128.d.ts +0 -2
- package/src/core/binary/hash/xxh3_128.d.ts.map +0 -1
- package/src/core/binary/hash/xxh3_128.js +0 -4
- package/src/core/binary/hash/xxh3_64.d.ts +0 -2
- package/src/core/binary/hash/xxh3_64.d.ts.map +0 -1
- package/src/core/binary/hash/xxh3_64.js +0 -4
- package/src/core/binary/hash/xxh3_common.d.ts +0 -2
- package/src/core/binary/hash/xxh3_common.d.ts.map +0 -1
- package/src/core/binary/hash/xxh3_common.js +0 -90
- package/src/core/binary/lsb_32.d.ts +0 -17
- package/src/core/binary/lsb_32.d.ts.map +0 -1
- package/src/core/binary/lsb_32.js +0 -17
- package/src/core/color/hex/hex2rgb.d.ts +0 -2
- package/src/core/color/hex/hex2rgb.d.ts.map +0 -1
- package/src/core/color/hex/hex2rgb.js +0 -7
- package/src/core/color/hex/rgb2hex.d.ts +0 -2
- package/src/core/color/hex/rgb2hex.d.ts.map +0 -1
- package/src/core/color/hex/rgb2hex.js +0 -7
- package/src/core/color/hsv/hsv2rgb.d.ts +0 -2
- package/src/core/color/hsv/hsv2rgb.d.ts.map +0 -1
- package/src/core/color/hsv/hsv2rgb.js +0 -8
- package/src/core/color/hsv/rgb2hsv.d.ts +0 -2
- package/src/core/color/hsv/rgb2hsv.d.ts.map +0 -1
- package/src/core/color/hsv/rgb2hsv.js +0 -7
- package/src/core/color/hunt/hpe_to_xyz.d.ts +0 -2
- package/src/core/color/hunt/hpe_to_xyz.d.ts.map +0 -1
- package/src/core/color/hunt/hpe_to_xyz.js +0 -4
- package/src/core/color/hunt/xyz_to_hpe.d.ts +0 -2
- package/src/core/color/hunt/xyz_to_hpe.d.ts.map +0 -1
- package/src/core/color/hunt/xyz_to_hpe.js +0 -12
- package/src/core/color/int2rgb.d.ts +0 -2
- package/src/core/color/int2rgb.d.ts.map +0 -1
- package/src/core/color/int2rgb.js +0 -7
- package/src/core/color/rgb2uint24.d.ts +0 -2
- package/src/core/color/rgb2uint24.d.ts.map +0 -1
- package/src/core/color/rgb2uint24.js +0 -7
- package/src/core/color/rgb2uint32.d.ts +0 -2
- package/src/core/color/rgb2uint32.d.ts.map +0 -1
- package/src/core/color/rgb2uint32.js +0 -7
- package/src/core/geom/2d/aabb/aabb2_array_combine.d.ts +0 -7
- package/src/core/geom/2d/aabb/aabb2_array_combine.d.ts.map +0 -1
- package/src/core/geom/2d/aabb/aabb2_array_combine.js +0 -7
- package/src/core/geom/2d/aabb/aabb2_compute_area.d.ts +0 -7
- package/src/core/geom/2d/aabb/aabb2_compute_area.d.ts.map +0 -1
- package/src/core/geom/2d/aabb/aabb2_compute_area.js +0 -7
- package/src/core/geom/2d/aabb/aabb2_compute_center_from_multiple.d.ts +0 -7
- package/src/core/geom/2d/aabb/aabb2_compute_center_from_multiple.d.ts.map +0 -1
- package/src/core/geom/2d/aabb/aabb2_compute_center_from_multiple.js +0 -7
- package/src/core/geom/2d/aabb/aabb2_compute_overlap.d.ts +0 -7
- package/src/core/geom/2d/aabb/aabb2_compute_overlap.d.ts.map +0 -1
- package/src/core/geom/2d/aabb/aabb2_compute_overlap.js +0 -7
- package/src/core/geom/2d/aabb/aabb2_from_v2_array.d.ts +0 -7
- package/src/core/geom/2d/aabb/aabb2_from_v2_array.d.ts.map +0 -1
- package/src/core/geom/2d/aabb/aabb2_from_v2_array.js +0 -7
- package/src/core/geom/2d/aabb/aabb2_intersects_point.d.ts +0 -7
- package/src/core/geom/2d/aabb/aabb2_intersects_point.d.ts.map +0 -1
- package/src/core/geom/2d/aabb/aabb2_intersects_point.js +0 -7
- package/src/core/geom/2d/aabb/aabb2_overlap_exists.d.ts +0 -7
- package/src/core/geom/2d/aabb/aabb2_overlap_exists.d.ts.map +0 -1
- package/src/core/geom/2d/aabb/aabb2_overlap_exists.js +0 -7
- package/src/core/geom/2d/circle/circle_compute_circle_intersection.d.ts +0 -7
- package/src/core/geom/2d/circle/circle_compute_circle_intersection.d.ts.map +0 -1
- package/src/core/geom/2d/circle/circle_compute_circle_intersection.js +0 -7
- package/src/core/geom/2d/circle/circle_compute_circle_penetration.d.ts +0 -7
- package/src/core/geom/2d/circle/circle_compute_circle_penetration.d.ts.map +0 -1
- package/src/core/geom/2d/circle/circle_compute_circle_penetration.js +0 -7
- package/src/core/geom/2d/circle/circle_intersects_point.d.ts +0 -7
- package/src/core/geom/2d/circle/circle_intersects_point.d.ts.map +0 -1
- package/src/core/geom/2d/circle/circle_intersects_point.js +0 -7
- package/src/core/geom/2d/compute_polygon_area_2d.d.ts +0 -7
- package/src/core/geom/2d/compute_polygon_area_2d.d.ts.map +0 -1
- package/src/core/geom/2d/compute_polygon_area_2d.js +0 -7
- package/src/core/geom/2d/convex-hull/fixed_convex_hull_humus.d.ts +0 -7
- package/src/core/geom/2d/convex-hull/fixed_convex_hull_humus.d.ts.map +0 -1
- package/src/core/geom/2d/convex-hull/fixed_convex_hull_humus.js +0 -7
- package/src/core/geom/2d/convex-hull/fixed_convex_hull_relaxation.d.ts +0 -7
- package/src/core/geom/2d/convex-hull/fixed_convex_hull_relaxation.d.ts.map +0 -1
- package/src/core/geom/2d/convex-hull/fixed_convex_hull_relaxation.js +0 -7
- package/src/core/geom/2d/convex-hull/orientation3_array.d.ts +0 -7
- package/src/core/geom/2d/convex-hull/orientation3_array.d.ts.map +0 -1
- package/src/core/geom/2d/convex-hull/orientation3_array.js +0 -7
- package/src/core/geom/2d/intersect_ray_2d.d.ts +0 -7
- package/src/core/geom/2d/intersect_ray_2d.d.ts.map +0 -1
- package/src/core/geom/2d/intersect_ray_2d.js +0 -7
- package/src/core/geom/2d/line/line2_distance_to_point_sqr.d.ts +0 -7
- package/src/core/geom/2d/line/line2_distance_to_point_sqr.d.ts.map +0 -1
- package/src/core/geom/2d/line/line2_distance_to_point_sqr.js +0 -7
- package/src/core/geom/2d/line/line_segment_compute_line_segment_intersection_2d.d.ts +0 -7
- package/src/core/geom/2d/line/line_segment_compute_line_segment_intersection_2d.d.ts.map +0 -1
- package/src/core/geom/2d/line/line_segment_compute_line_segment_intersection_2d.js +0 -7
- package/src/core/geom/2d/line/line_segment_compute_line_segment_intersection_array_2d.d.ts +0 -7
- package/src/core/geom/2d/line/line_segment_compute_line_segment_intersection_array_2d.d.ts.map +0 -1
- package/src/core/geom/2d/line/line_segment_compute_line_segment_intersection_array_2d.js +0 -7
- package/src/core/geom/2d/line/line_segment_compute_line_segment_intersection_vectors_2d.d.ts +0 -7
- package/src/core/geom/2d/line/line_segment_compute_line_segment_intersection_vectors_2d.d.ts.map +0 -1
- package/src/core/geom/2d/line/line_segment_compute_line_segment_intersection_vectors_2d.js +0 -7
- package/src/core/geom/2d/line/line_segment_compute_line_segment_intersection_vectors_array_2d.d.ts +0 -7
- package/src/core/geom/2d/line/line_segment_compute_line_segment_intersection_vectors_array_2d.d.ts.map +0 -1
- package/src/core/geom/2d/line/line_segment_compute_line_segment_intersection_vectors_array_2d.js +0 -7
- package/src/core/geom/2d/line/line_segment_intersection_fraction_2d.d.ts +0 -7
- package/src/core/geom/2d/line/line_segment_intersection_fraction_2d.d.ts.map +0 -1
- package/src/core/geom/2d/line/line_segment_intersection_fraction_2d.js +0 -7
- package/src/core/geom/2d/line/line_segment_line_segment_intersection_exists_2d.d.ts +0 -7
- package/src/core/geom/2d/line/line_segment_line_segment_intersection_exists_2d.d.ts.map +0 -1
- package/src/core/geom/2d/line/line_segment_line_segment_intersection_exists_2d.js +0 -7
- package/src/core/geom/2d/quad-tree/qt_query_data_nearest_to_point.d.ts +0 -7
- package/src/core/geom/2d/quad-tree/qt_query_data_nearest_to_point.d.ts.map +0 -1
- package/src/core/geom/2d/quad-tree/qt_query_data_nearest_to_point.js +0 -7
- package/src/core/geom/2d/rectangle_to_aabb.d.ts +0 -7
- package/src/core/geom/2d/rectangle_to_aabb.d.ts.map +0 -1
- package/src/core/geom/2d/rectangle_to_aabb.js +0 -7
- package/src/core/geom/2d/spline_bezier2_2d.d.ts +0 -7
- package/src/core/geom/2d/spline_bezier2_2d.d.ts.map +0 -1
- package/src/core/geom/2d/spline_bezier2_2d.js +0 -7
- package/src/core/geom/2d/triangle2d_compute_area.d.ts +0 -7
- package/src/core/geom/2d/triangle2d_compute_area.d.ts.map +0 -1
- package/src/core/geom/2d/triangle2d_compute_area.js +0 -7
- package/src/core/geom/2d/triangle2d_contains_point.d.ts +0 -7
- package/src/core/geom/2d/triangle2d_contains_point.d.ts.map +0 -1
- package/src/core/geom/2d/triangle2d_contains_point.js +0 -7
- package/src/core/geom/2d/triangle2d_get_barycentric.d.ts +0 -7
- package/src/core/geom/2d/triangle2d_get_barycentric.d.ts.map +0 -1
- package/src/core/geom/2d/triangle2d_get_barycentric.js +0 -7
- package/src/core/geom/3d/aabb/aabb3_array_intersects_frustum_degree.d.ts +0 -7
- package/src/core/geom/3d/aabb/aabb3_array_intersects_frustum_degree.d.ts.map +0 -1
- package/src/core/geom/3d/aabb/aabb3_array_intersects_frustum_degree.js +0 -7
- package/src/core/geom/3d/aabb/aabb3_box_surface_area_2.d.ts +0 -7
- package/src/core/geom/3d/aabb/aabb3_box_surface_area_2.d.ts.map +0 -1
- package/src/core/geom/3d/aabb/aabb3_box_surface_area_2.js +0 -7
- package/src/core/geom/3d/aabb/aabb3_combined_surface_area.d.ts +0 -7
- package/src/core/geom/3d/aabb/aabb3_combined_surface_area.d.ts.map +0 -1
- package/src/core/geom/3d/aabb/aabb3_combined_surface_area.js +0 -7
- package/src/core/geom/3d/aabb/aabb3_compute_half_surface_area.d.ts +0 -7
- package/src/core/geom/3d/aabb/aabb3_compute_half_surface_area.d.ts.map +0 -1
- package/src/core/geom/3d/aabb/aabb3_compute_half_surface_area.js +0 -7
- package/src/core/geom/3d/aabb/aabb3_compute_projected_area.d.ts +0 -7
- package/src/core/geom/3d/aabb/aabb3_compute_projected_area.d.ts.map +0 -1
- package/src/core/geom/3d/aabb/aabb3_compute_projected_area.js +0 -7
- package/src/core/geom/3d/aabb/aabb3_compute_surface_area.d.ts +0 -7
- package/src/core/geom/3d/aabb/aabb3_compute_surface_area.d.ts.map +0 -1
- package/src/core/geom/3d/aabb/aabb3_compute_surface_area.js +0 -7
- package/src/core/geom/3d/aabb/aabb3_detailed_volume_intersection.d.ts +0 -7
- package/src/core/geom/3d/aabb/aabb3_detailed_volume_intersection.d.ts.map +0 -1
- package/src/core/geom/3d/aabb/aabb3_detailed_volume_intersection.js +0 -7
- package/src/core/geom/3d/aabb/aabb3_estimate_projected_area2.d.ts +0 -7
- package/src/core/geom/3d/aabb/aabb3_estimate_projected_area2.d.ts.map +0 -1
- package/src/core/geom/3d/aabb/aabb3_estimate_projected_area2.js +0 -7
- package/src/core/geom/3d/aabb/aabb3_intersects_frustum_degree.d.ts +0 -7
- package/src/core/geom/3d/aabb/aabb3_intersects_frustum_degree.d.ts.map +0 -1
- package/src/core/geom/3d/aabb/aabb3_intersects_frustum_degree.js +0 -7
- package/src/core/geom/3d/aabb/aabb3_intersects_line_segment.d.ts +0 -7
- package/src/core/geom/3d/aabb/aabb3_intersects_line_segment.d.ts.map +0 -1
- package/src/core/geom/3d/aabb/aabb3_intersects_line_segment.js +0 -7
- package/src/core/geom/3d/aabb/aabb3_near_distance_to_intersection_ray_segment.d.ts +0 -7
- package/src/core/geom/3d/aabb/aabb3_near_distance_to_intersection_ray_segment.d.ts.map +0 -1
- package/src/core/geom/3d/aabb/aabb3_near_distance_to_intersection_ray_segment.js +0 -7
- package/src/core/geom/3d/aabb/aabb3_nearest_point_on_surface.d.ts +0 -7
- package/src/core/geom/3d/aabb/aabb3_nearest_point_on_surface.d.ts.map +0 -1
- package/src/core/geom/3d/aabb/aabb3_nearest_point_on_surface.js +0 -7
- package/src/core/geom/3d/aabb/aabb3_raycast.d.ts +0 -7
- package/src/core/geom/3d/aabb/aabb3_raycast.d.ts.map +0 -1
- package/src/core/geom/3d/aabb/aabb3_raycast.js +0 -7
- package/src/core/geom/3d/aabb/compute_aabb_from_points.d.ts +0 -7
- package/src/core/geom/3d/aabb/compute_aabb_from_points.d.ts.map +0 -1
- package/src/core/geom/3d/aabb/compute_aabb_from_points.js +0 -7
- package/src/core/geom/3d/aabb/compute_triangle_group_aabb3.d.ts +0 -7
- package/src/core/geom/3d/aabb/compute_triangle_group_aabb3.d.ts.map +0 -1
- package/src/core/geom/3d/aabb/compute_triangle_group_aabb3.js +0 -7
- package/src/core/geom/3d/compute_circle_bounding_box.d.ts +0 -7
- package/src/core/geom/3d/compute_circle_bounding_box.d.ts.map +0 -1
- package/src/core/geom/3d/compute_circle_bounding_box.js +0 -7
- package/src/core/geom/3d/cone/computeConeBoundingBox.d.ts +0 -7
- package/src/core/geom/3d/cone/computeConeBoundingBox.d.ts.map +0 -1
- package/src/core/geom/3d/cone/computeConeBoundingBox.js +0 -7
- package/src/core/geom/3d/cone/computeConePlaneSide.d.ts +0 -7
- package/src/core/geom/3d/cone/computeConePlaneSide.d.ts.map +0 -1
- package/src/core/geom/3d/cone/computeConePlaneSide.js +0 -7
- package/src/core/geom/3d/cone/compute_bounding_cone_of_2_cones.d.ts +0 -7
- package/src/core/geom/3d/cone/compute_bounding_cone_of_2_cones.d.ts.map +0 -1
- package/src/core/geom/3d/cone/compute_bounding_cone_of_2_cones.js +0 -7
- package/src/core/geom/3d/frustum/clipping_volume_matrix4_project.d.ts +0 -7
- package/src/core/geom/3d/frustum/clipping_volume_matrix4_project.d.ts.map +0 -1
- package/src/core/geom/3d/frustum/clipping_volume_matrix4_project.js +0 -7
- package/src/core/geom/3d/frustum/frustum3_computeNearestPointToPoint.d.ts +0 -7
- package/src/core/geom/3d/frustum/frustum3_computeNearestPointToPoint.d.ts.map +0 -1
- package/src/core/geom/3d/frustum/frustum3_computeNearestPointToPoint.js +0 -7
- package/src/core/geom/3d/frustum/frustum_matrix4_project.d.ts +0 -7
- package/src/core/geom/3d/frustum/frustum_matrix4_project.d.ts.map +0 -1
- package/src/core/geom/3d/frustum/frustum_matrix4_project.js +0 -7
- package/src/core/geom/3d/frustum/hexahedron_from_aabb.d.ts +0 -7
- package/src/core/geom/3d/frustum/hexahedron_from_aabb.d.ts.map +0 -1
- package/src/core/geom/3d/frustum/hexahedron_from_aabb.js +0 -7
- package/src/core/geom/3d/frustum/read_three_planes_to_array.d.ts +0 -7
- package/src/core/geom/3d/frustum/read_three_planes_to_array.d.ts.map +0 -1
- package/src/core/geom/3d/frustum/read_three_planes_to_array.js +0 -7
- package/src/core/geom/3d/frustum/slice_frustum_linear_to_points.d.ts +0 -7
- package/src/core/geom/3d/frustum/slice_frustum_linear_to_points.d.ts.map +0 -1
- package/src/core/geom/3d/frustum/slice_frustum_linear_to_points.js +0 -7
- package/src/core/geom/3d/line/line3_closest_points_segment_segment.d.ts +0 -7
- package/src/core/geom/3d/line/line3_closest_points_segment_segment.d.ts.map +0 -1
- package/src/core/geom/3d/line/line3_closest_points_segment_segment.js +0 -7
- package/src/core/geom/3d/line/line3_compute_nearest_point_to_point.d.ts +0 -7
- package/src/core/geom/3d/line/line3_compute_nearest_point_to_point.d.ts.map +0 -1
- package/src/core/geom/3d/line/line3_compute_nearest_point_to_point.js +0 -7
- package/src/core/geom/3d/line/line3_compute_segment_nearest_point_to_aabb3_t.d.ts +0 -7
- package/src/core/geom/3d/line/line3_compute_segment_nearest_point_to_aabb3_t.d.ts.map +0 -1
- package/src/core/geom/3d/line/line3_compute_segment_nearest_point_to_aabb3_t.js +0 -7
- package/src/core/geom/3d/line/line3_compute_segment_nearest_point_to_point_t.d.ts +0 -7
- package/src/core/geom/3d/line/line3_compute_segment_nearest_point_to_point_t.d.ts.map +0 -1
- package/src/core/geom/3d/line/line3_compute_segment_nearest_point_to_point_t.js +0 -7
- package/src/core/geom/3d/mat4/allocate_m4.d.ts +0 -7
- package/src/core/geom/3d/mat4/allocate_m4.d.ts.map +0 -1
- package/src/core/geom/3d/mat4/allocate_m4.js +0 -7
- package/src/core/geom/3d/mat4/apply_mat4_transform_to_direction_v3_array.d.ts +0 -7
- package/src/core/geom/3d/mat4/apply_mat4_transform_to_direction_v3_array.d.ts.map +0 -1
- package/src/core/geom/3d/mat4/apply_mat4_transform_to_direction_v3_array.js +0 -7
- package/src/core/geom/3d/mat4/apply_mat4_transform_to_v3_array.d.ts +0 -7
- package/src/core/geom/3d/mat4/apply_mat4_transform_to_v3_array.d.ts.map +0 -1
- package/src/core/geom/3d/mat4/apply_mat4_transform_to_v3_array.js +0 -7
- package/src/core/geom/3d/mat4/compose_matrix4_array.d.ts +0 -7
- package/src/core/geom/3d/mat4/compose_matrix4_array.d.ts.map +0 -1
- package/src/core/geom/3d/mat4/compose_matrix4_array.js +0 -7
- package/src/core/geom/3d/mat4/decompose_matrix_4_array.d.ts +0 -7
- package/src/core/geom/3d/mat4/decompose_matrix_4_array.d.ts.map +0 -1
- package/src/core/geom/3d/mat4/decompose_matrix_4_array.js +0 -7
- package/src/core/geom/3d/mat4/eulerAnglesFromMatrix.d.ts +0 -7
- package/src/core/geom/3d/mat4/eulerAnglesFromMatrix.d.ts.map +0 -1
- package/src/core/geom/3d/mat4/eulerAnglesFromMatrix.js +0 -7
- package/src/core/geom/3d/mat4/m4_compute_normal_matrix3.d.ts +0 -7
- package/src/core/geom/3d/mat4/m4_compute_normal_matrix3.d.ts.map +0 -1
- package/src/core/geom/3d/mat4/m4_compute_normal_matrix3.js +0 -7
- package/src/core/geom/3d/morton/mortonEncode_LUT.d.ts +0 -7
- package/src/core/geom/3d/morton/mortonEncode_LUT.d.ts.map +0 -1
- package/src/core/geom/3d/morton/mortonEncode_LUT.js +0 -7
- package/src/core/geom/3d/morton/mortonEncode_magicbits.d.ts +0 -7
- package/src/core/geom/3d/morton/mortonEncode_magicbits.d.ts.map +0 -1
- package/src/core/geom/3d/morton/mortonEncode_magicbits.js +0 -7
- package/src/core/geom/3d/normal/hemioct/encode_unit3_hemioct.d.ts +0 -2
- package/src/core/geom/3d/normal/hemioct/encode_unit3_hemioct.d.ts.map +0 -1
- package/src/core/geom/3d/normal/hemioct/encode_unit3_hemioct.js +0 -5
- package/src/core/geom/3d/plane/is_point_within_planes.d.ts +0 -7
- package/src/core/geom/3d/plane/is_point_within_planes.d.ts.map +0 -1
- package/src/core/geom/3d/plane/is_point_within_planes.js +0 -7
- package/src/core/geom/3d/plane/plane3_compute_convex_3_plane_intersection.d.ts +0 -7
- package/src/core/geom/3d/plane/plane3_compute_convex_3_plane_intersection.d.ts.map +0 -1
- package/src/core/geom/3d/plane/plane3_compute_convex_3_plane_intersection.js +0 -7
- package/src/core/geom/3d/plane/plane3_compute_plane_intersection.d.ts +0 -7
- package/src/core/geom/3d/plane/plane3_compute_plane_intersection.d.ts.map +0 -1
- package/src/core/geom/3d/plane/plane3_compute_plane_intersection.js +0 -7
- package/src/core/geom/3d/plane/plane3_intersect_plane.d.ts +0 -7
- package/src/core/geom/3d/plane/plane3_intersect_plane.d.ts.map +0 -1
- package/src/core/geom/3d/plane/plane3_intersect_plane.js +0 -7
- package/src/core/geom/3d/plane/plane3_three_compute_convex_3_plane_intersection.d.ts +0 -7
- package/src/core/geom/3d/plane/plane3_three_compute_convex_3_plane_intersection.d.ts.map +0 -1
- package/src/core/geom/3d/plane/plane3_three_compute_convex_3_plane_intersection.js +0 -7
- package/src/core/geom/3d/quaternion/quat3_createFromAxisAngle.d.ts +0 -7
- package/src/core/geom/3d/quaternion/quat3_createFromAxisAngle.d.ts.map +0 -1
- package/src/core/geom/3d/quaternion/quat3_createFromAxisAngle.js +0 -7
- package/src/core/geom/3d/quaternion/quat_decode_from_uint32.d.ts +0 -7
- package/src/core/geom/3d/quaternion/quat_decode_from_uint32.d.ts.map +0 -1
- package/src/core/geom/3d/quaternion/quat_decode_from_uint32.js +0 -7
- package/src/core/geom/3d/quaternion/quat_encode_to_uint32.d.ts +0 -7
- package/src/core/geom/3d/quaternion/quat_encode_to_uint32.d.ts.map +0 -1
- package/src/core/geom/3d/quaternion/quat_encode_to_uint32.js +0 -7
- package/src/core/geom/3d/ray/ray3_array_compose.d.ts +0 -7
- package/src/core/geom/3d/ray/ray3_array_compose.d.ts.map +0 -1
- package/src/core/geom/3d/ray/ray3_array_compose.js +0 -7
- package/src/core/geom/3d/ray/ray3_compute_nearest_point_to_point.d.ts +0 -7
- package/src/core/geom/3d/ray/ray3_compute_nearest_point_to_point.d.ts.map +0 -1
- package/src/core/geom/3d/ray/ray3_compute_nearest_point_to_point.js +0 -7
- package/src/core/geom/3d/ray/ray3_distance_to_point.d.ts +0 -7
- package/src/core/geom/3d/ray/ray3_distance_to_point.d.ts.map +0 -1
- package/src/core/geom/3d/ray/ray3_distance_to_point.js +0 -7
- package/src/core/geom/3d/ray/ray3_shift_origin_along_direction.d.ts +0 -7
- package/src/core/geom/3d/ray/ray3_shift_origin_along_direction.d.ts.map +0 -1
- package/src/core/geom/3d/ray/ray3_shift_origin_along_direction.js +0 -7
- package/src/core/geom/3d/shape/shape_mesh_from_geometry.d.ts +0 -7
- package/src/core/geom/3d/shape/shape_mesh_from_geometry.d.ts.map +0 -1
- package/src/core/geom/3d/shape/shape_mesh_from_geometry.js +0 -7
- package/src/core/geom/3d/shape/util/shape3d_voxelize_to_grid.d.ts +0 -7
- package/src/core/geom/3d/shape/util/shape3d_voxelize_to_grid.d.ts.map +0 -1
- package/src/core/geom/3d/shape/util/shape3d_voxelize_to_grid.js +0 -7
- package/src/core/geom/3d/sphere/compute_bounding_sphere_of_2_spheres.d.ts +0 -7
- package/src/core/geom/3d/sphere/compute_bounding_sphere_of_2_spheres.d.ts.map +0 -1
- package/src/core/geom/3d/sphere/compute_bounding_sphere_of_2_spheres.js +0 -7
- package/src/core/geom/3d/sphere/harmonics/sh3_rotate_bl.d.ts +0 -7
- package/src/core/geom/3d/sphere/harmonics/sh3_rotate_bl.d.ts.map +0 -1
- package/src/core/geom/3d/sphere/harmonics/sh3_rotate_bl.js +0 -7
- package/src/core/geom/3d/sphere/harmonics/sh_compute_K.d.ts +0 -7
- package/src/core/geom/3d/sphere/harmonics/sh_compute_K.d.ts.map +0 -1
- package/src/core/geom/3d/sphere/harmonics/sh_compute_K.js +0 -7
- package/src/core/geom/3d/sphere/sphere_array_intersects_point.d.ts +0 -7
- package/src/core/geom/3d/sphere/sphere_array_intersects_point.d.ts.map +0 -1
- package/src/core/geom/3d/sphere/sphere_array_intersects_point.js +0 -7
- package/src/core/geom/3d/sphere/sphere_array_intersects_ray.d.ts +0 -7
- package/src/core/geom/3d/sphere/sphere_array_intersects_ray.d.ts.map +0 -1
- package/src/core/geom/3d/sphere/sphere_array_intersects_ray.js +0 -7
- package/src/core/geom/3d/sphere/sphere_intersects_point.d.ts +0 -7
- package/src/core/geom/3d/sphere/sphere_intersects_point.d.ts.map +0 -1
- package/src/core/geom/3d/sphere/sphere_intersects_point.js +0 -7
- package/src/core/geom/3d/sphere/sphere_projected_sphere_radius_sqr.d.ts +0 -7
- package/src/core/geom/3d/sphere/sphere_projected_sphere_radius_sqr.d.ts.map +0 -1
- package/src/core/geom/3d/sphere/sphere_projected_sphere_radius_sqr.js +0 -7
- package/src/core/geom/3d/sphere/sphere_radius_sqr_from_v3_array_transformed.d.ts +0 -7
- package/src/core/geom/3d/sphere/sphere_radius_sqr_from_v3_array_transformed.d.ts.map +0 -1
- package/src/core/geom/3d/sphere/sphere_radius_sqr_from_v3_array_transformed.js +0 -7
- package/src/core/geom/3d/sphere/spherical_from_cartesian.d.ts +0 -7
- package/src/core/geom/3d/sphere/spherical_from_cartesian.d.ts.map +0 -1
- package/src/core/geom/3d/sphere/spherical_from_cartesian.js +0 -7
- package/src/core/geom/3d/tetrahedra/compute_tetrahedron_quality.d.ts +0 -7
- package/src/core/geom/3d/tetrahedra/compute_tetrahedron_quality.d.ts.map +0 -1
- package/src/core/geom/3d/tetrahedra/compute_tetrahedron_quality.js +0 -7
- package/src/core/geom/3d/tetrahedra/compute_tetrahedron_volume.d.ts +0 -7
- package/src/core/geom/3d/tetrahedra/compute_tetrahedron_volume.d.ts.map +0 -1
- package/src/core/geom/3d/tetrahedra/compute_tetrahedron_volume.js +0 -7
- package/src/core/geom/3d/tetrahedra/delaunay/fill_in_a_cavity.d.ts +0 -7
- package/src/core/geom/3d/tetrahedra/delaunay/fill_in_a_cavity.d.ts.map +0 -1
- package/src/core/geom/3d/tetrahedra/delaunay/fill_in_a_cavity.js +0 -7
- package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_tet_get_neighbours.d.ts +0 -7
- package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_tet_get_neighbours.d.ts.map +0 -1
- package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_tet_get_neighbours.js +0 -7
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_vertex_quadratics.d.ts +0 -7
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_vertex_quadratics.d.ts.map +0 -1
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_vertex_quadratics.js +0 -7
- package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_kill_only_vert.d.ts +0 -7
- package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_kill_only_vert.d.ts.map +0 -1
- package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_kill_only_vert.js +0 -7
- package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_merge_verts_by_distance.d.ts +0 -7
- package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_merge_verts_by_distance.d.ts.map +0 -1
- package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_merge_verts_by_distance.js +0 -7
- package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_vert_fuse_duplicate_edges.d.ts +0 -7
- package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_vert_fuse_duplicate_edges.d.ts.map +0 -1
- package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_vert_fuse_duplicate_edges.js +0 -7
- package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_vert_kill.d.ts +0 -7
- package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_vert_kill.d.ts.map +0 -1
- package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_vert_kill.js +0 -7
- package/src/core/geom/3d/topology/struct/binary/query/bt_face_get_attached_faces.d.ts +0 -7
- package/src/core/geom/3d/topology/struct/binary/query/bt_face_get_attached_faces.d.ts.map +0 -1
- package/src/core/geom/3d/topology/struct/binary/query/bt_face_get_attached_faces.js +0 -7
- package/src/core/geom/3d/topology/struct/binary/query/bt_face_get_neighbour_faces.d.ts +0 -7
- package/src/core/geom/3d/topology/struct/binary/query/bt_face_get_neighbour_faces.d.ts.map +0 -1
- package/src/core/geom/3d/topology/struct/binary/query/bt_face_get_neighbour_faces.js +0 -7
- package/src/core/geom/3d/topology/struct/binary/query/bt_faces_shared_loop.d.ts +0 -7
- package/src/core/geom/3d/topology/struct/binary/query/bt_faces_shared_loop.d.ts.map +0 -1
- package/src/core/geom/3d/topology/struct/binary/query/bt_faces_shared_loop.js +0 -7
- package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_count_edge_faces.d.ts +0 -8
- package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_count_edge_faces.d.ts.map +0 -1
- package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_count_edge_faces.js +0 -8
- package/src/core/geom/3d/topology/struct/binary/query/bt_query_edge_is_boundary.d.ts +0 -7
- package/src/core/geom/3d/topology/struct/binary/query/bt_query_edge_is_boundary.d.ts.map +0 -1
- package/src/core/geom/3d/topology/struct/binary/query/bt_query_edge_is_boundary.js +0 -7
- package/src/core/geom/3d/triangle/computeTriangleClosestPointToPointBarycentric.d.ts +0 -7
- package/src/core/geom/3d/triangle/computeTriangleClosestPointToPointBarycentric.d.ts.map +0 -1
- package/src/core/geom/3d/triangle/computeTriangleClosestPointToPointBarycentric.js +0 -7
- package/src/core/geom/3d/triangle/computeTriangleRayIntersection.d.ts +0 -7
- package/src/core/geom/3d/triangle/computeTriangleRayIntersection.d.ts.map +0 -1
- package/src/core/geom/3d/triangle/computeTriangleRayIntersection.js +0 -7
- package/src/core/geom/3d/triangle/computeTriangleRayIntersectionBarycentric.d.ts +0 -7
- package/src/core/geom/3d/triangle/computeTriangleRayIntersectionBarycentric.d.ts.map +0 -1
- package/src/core/geom/3d/triangle/computeTriangleRayIntersectionBarycentric.js +0 -7
- package/src/core/geom/3d/triangle/computeTriangleRayIntersectionBarycentricEdge.d.ts +0 -7
- package/src/core/geom/3d/triangle/computeTriangleRayIntersectionBarycentricEdge.d.ts.map +0 -1
- package/src/core/geom/3d/triangle/computeTriangleRayIntersectionBarycentricEdge.js +0 -7
- package/src/core/geom/3d/triangle/computeTriangleRayIntersectionBarycentricGeometry.d.ts +0 -7
- package/src/core/geom/3d/triangle/computeTriangleRayIntersectionBarycentricGeometry.d.ts.map +0 -1
- package/src/core/geom/3d/triangle/computeTriangleRayIntersectionBarycentricGeometry.js +0 -7
- package/src/core/geom/3d/triangle/compute_triangle_area_3d.d.ts +0 -7
- package/src/core/geom/3d/triangle/compute_triangle_area_3d.d.ts.map +0 -1
- package/src/core/geom/3d/triangle/compute_triangle_area_3d.js +0 -7
- package/src/core/geom/3d/triangle/compute_triangle_normal.d.ts +0 -7
- package/src/core/geom/3d/triangle/compute_triangle_normal.d.ts.map +0 -1
- package/src/core/geom/3d/triangle/compute_triangle_normal.js +0 -7
- package/src/core/geom/3d/triangle/rayTriangleIntersection.d.ts +0 -7
- package/src/core/geom/3d/triangle/rayTriangleIntersection.d.ts.map +0 -1
- package/src/core/geom/3d/triangle/rayTriangleIntersection.js +0 -7
- package/src/core/geom/3d/triangle/triangle3_incenter.d.ts +0 -7
- package/src/core/geom/3d/triangle/triangle3_incenter.d.ts.map +0 -1
- package/src/core/geom/3d/triangle/triangle3_incenter.js +0 -7
- package/src/core/geom/3d/triangle/triangle_compute_plane_side.d.ts +0 -7
- package/src/core/geom/3d/triangle/triangle_compute_plane_side.d.ts.map +0 -1
- package/src/core/geom/3d/triangle/triangle_compute_plane_side.js +0 -7
- package/src/core/geom/3d/triangle/triangle_compute_signed_volume.d.ts +0 -7
- package/src/core/geom/3d/triangle/triangle_compute_signed_volume.d.ts.map +0 -1
- package/src/core/geom/3d/triangle/triangle_compute_signed_volume.js +0 -7
- package/src/core/geom/3d/triangle/triangle_intersects_clipping_volume.d.ts +0 -7
- package/src/core/geom/3d/triangle/triangle_intersects_clipping_volume.d.ts.map +0 -1
- package/src/core/geom/3d/triangle/triangle_intersects_clipping_volume.js +0 -7
- package/src/core/geom/3d/triangle/triangle_mesh_compute_signed_volume.d.ts +0 -7
- package/src/core/geom/3d/triangle/triangle_mesh_compute_signed_volume.d.ts.map +0 -1
- package/src/core/geom/3d/triangle/triangle_mesh_compute_signed_volume.js +0 -7
- package/src/core/geom/3d/triangle/v3_compute_triangle_normal.d.ts +0 -7
- package/src/core/geom/3d/triangle/v3_compute_triangle_normal.d.ts.map +0 -1
- package/src/core/geom/3d/triangle/v3_compute_triangle_normal.js +0 -7
- package/src/core/geom/3d/util/make_justified_point_grid.d.ts +0 -7
- package/src/core/geom/3d/util/make_justified_point_grid.d.ts.map +0 -1
- package/src/core/geom/3d/util/make_justified_point_grid.js +0 -7
- package/src/core/geom/mat3/m3_cm_from_translation.d.ts +0 -7
- package/src/core/geom/mat3/m3_cm_from_translation.d.ts.map +0 -1
- package/src/core/geom/mat3/m3_cm_from_translation.js +0 -7
- package/src/core/geom/mat3/m3_cm_invert.d.ts +0 -7
- package/src/core/geom/mat3/m3_cm_invert.d.ts.map +0 -1
- package/src/core/geom/mat3/m3_cm_invert.js +0 -7
- package/src/core/geom/mat3/m3_make_rotation.d.ts +0 -2
- package/src/core/geom/mat3/m3_make_rotation.d.ts.map +0 -1
- package/src/core/geom/mat3/m3_make_rotation.js +0 -5
- package/src/core/geom/mat3/m3_multiply_vec3.d.ts +0 -7
- package/src/core/geom/mat3/m3_multiply_vec3.d.ts.map +0 -1
- package/src/core/geom/mat3/m3_multiply_vec3.js +0 -7
- package/src/core/geom/packing/computeBoundingSphereOfSpheres.d.ts +0 -7
- package/src/core/geom/packing/computeBoundingSphereOfSpheres.d.ts.map +0 -1
- package/src/core/geom/packing/computeBoundingSphereOfSpheres.js +0 -7
- package/src/core/geom/packing/max-rect/cost/costByBestShortSide.d.ts +0 -7
- package/src/core/geom/packing/max-rect/cost/costByBestShortSide.d.ts.map +0 -1
- package/src/core/geom/packing/max-rect/cost/costByBestShortSide.js +0 -7
- package/src/core/geom/packing/max-rect/cost/costByRemainingArea.d.ts +0 -7
- package/src/core/geom/packing/max-rect/cost/costByRemainingArea.d.ts.map +0 -1
- package/src/core/geom/packing/max-rect/cost/costByRemainingArea.js +0 -7
- package/src/core/geom/packing/max-rect/cutArea.d.ts +0 -7
- package/src/core/geom/packing/max-rect/cutArea.d.ts.map +0 -1
- package/src/core/geom/packing/max-rect/cutArea.js +0 -7
- package/src/core/geom/packing/max-rect/findBestContainer.d.ts +0 -7
- package/src/core/geom/packing/max-rect/findBestContainer.d.ts.map +0 -1
- package/src/core/geom/packing/max-rect/findBestContainer.js +0 -7
- package/src/core/geom/packing/max-rect/packMaxRectangles.d.ts +0 -7
- package/src/core/geom/packing/max-rect/packMaxRectangles.d.ts.map +0 -1
- package/src/core/geom/packing/max-rect/packMaxRectangles.js +0 -7
- package/src/core/geom/packing/max-rect/packOneBox.d.ts +0 -7
- package/src/core/geom/packing/max-rect/packOneBox.d.ts.map +0 -1
- package/src/core/geom/packing/max-rect/packOneBox.js +0 -7
- package/src/core/geom/packing/max-rect/removeRedundantBoxes.d.ts +0 -7
- package/src/core/geom/packing/max-rect/removeRedundantBoxes.d.ts.map +0 -1
- package/src/core/geom/packing/max-rect/removeRedundantBoxes.js +0 -7
- package/src/core/geom/packing/max-rect/removeRedundantBoxesArray.d.ts +0 -7
- package/src/core/geom/packing/max-rect/removeRedundantBoxesArray.d.ts.map +0 -1
- package/src/core/geom/packing/max-rect/removeRedundantBoxesArray.js +0 -7
- package/src/core/geom/random/randomPointInBox.d.ts +0 -7
- package/src/core/geom/random/randomPointInBox.d.ts.map +0 -1
- package/src/core/geom/random/randomPointInBox.js +0 -7
- package/src/core/geom/random/randomPointInCircle.d.ts +0 -7
- package/src/core/geom/random/randomPointInCircle.d.ts.map +0 -1
- package/src/core/geom/random/randomPointInCircle.js +0 -7
- package/src/core/geom/random/randomPointInPoint.d.ts +0 -7
- package/src/core/geom/random/randomPointInPoint.d.ts.map +0 -1
- package/src/core/geom/random/randomPointInPoint.js +0 -7
- package/src/core/geom/random/randomPointInSphere.d.ts +0 -7
- package/src/core/geom/random/randomPointInSphere.d.ts.map +0 -1
- package/src/core/geom/random/randomPointInSphere.js +0 -7
- package/src/core/geom/random/randomPointOnBox.d.ts +0 -7
- package/src/core/geom/random/randomPointOnBox.d.ts.map +0 -1
- package/src/core/geom/random/randomPointOnBox.js +0 -7
- package/src/core/geom/random/randomPointOnSphere.d.ts +0 -7
- package/src/core/geom/random/randomPointOnSphere.d.ts.map +0 -1
- package/src/core/geom/random/randomPointOnSphere.js +0 -7
- package/src/core/geom/vec/vector_copy.d.ts +0 -7
- package/src/core/geom/vec/vector_copy.d.ts.map +0 -1
- package/src/core/geom/vec/vector_copy.js +0 -7
- package/src/core/geom/vec/vector_scale_array.d.ts +0 -7
- package/src/core/geom/vec/vector_scale_array.d.ts.map +0 -1
- package/src/core/geom/vec/vector_scale_array.js +0 -7
- package/src/core/geom/vec3/v3_angle_atan2_between.d.ts +0 -7
- package/src/core/geom/vec3/v3_angle_atan2_between.d.ts.map +0 -1
- package/src/core/geom/vec3/v3_angle_atan2_between.js +0 -7
- package/src/core/geom/vec3/v3_angle_between.d.ts +0 -7
- package/src/core/geom/vec3/v3_angle_between.d.ts.map +0 -1
- package/src/core/geom/vec3/v3_angle_between.js +0 -7
- package/src/core/geom/vec3/v3_angle_cos_between.d.ts +0 -7
- package/src/core/geom/vec3/v3_angle_cos_between.d.ts.map +0 -1
- package/src/core/geom/vec3/v3_angle_cos_between.js +0 -7
- package/src/core/geom/vec3/v3_array_add_in_place.d.ts +0 -7
- package/src/core/geom/vec3/v3_array_add_in_place.d.ts.map +0 -1
- package/src/core/geom/vec3/v3_array_add_in_place.js +0 -7
- package/src/core/geom/vec3/v3_array_centroid.d.ts +0 -7
- package/src/core/geom/vec3/v3_array_centroid.d.ts.map +0 -1
- package/src/core/geom/vec3/v3_array_centroid.js +0 -7
- package/src/core/geom/vec3/v3_array_copy.d.ts +0 -7
- package/src/core/geom/vec3/v3_array_copy.d.ts.map +0 -1
- package/src/core/geom/vec3/v3_array_copy.js +0 -7
- package/src/core/geom/vec3/v3_array_displace_in_direction.d.ts +0 -7
- package/src/core/geom/vec3/v3_array_displace_in_direction.d.ts.map +0 -1
- package/src/core/geom/vec3/v3_array_displace_in_direction.js +0 -7
- package/src/core/geom/vec3/v3_array_equals.d.ts +0 -7
- package/src/core/geom/vec3/v3_array_equals.d.ts.map +0 -1
- package/src/core/geom/vec3/v3_array_equals.js +0 -7
- package/src/core/geom/vec3/v3_array_immediate_add.d.ts +0 -7
- package/src/core/geom/vec3/v3_array_immediate_add.d.ts.map +0 -1
- package/src/core/geom/vec3/v3_array_immediate_add.js +0 -7
- package/src/core/geom/vec3/v3_array_matrix4_rotate.d.ts +0 -7
- package/src/core/geom/vec3/v3_array_matrix4_rotate.d.ts.map +0 -1
- package/src/core/geom/vec3/v3_array_matrix4_rotate.js +0 -7
- package/src/core/geom/vec3/v3_array_normalize.d.ts +0 -7
- package/src/core/geom/vec3/v3_array_normalize.d.ts.map +0 -1
- package/src/core/geom/vec3/v3_array_normalize.js +0 -7
- package/src/core/geom/vec3/v3_array_scale.d.ts +0 -7
- package/src/core/geom/vec3/v3_array_scale.d.ts.map +0 -1
- package/src/core/geom/vec3/v3_array_scale.js +0 -7
- package/src/core/geom/vec3/v3_compute_interior_angle.d.ts +0 -7
- package/src/core/geom/vec3/v3_compute_interior_angle.d.ts.map +0 -1
- package/src/core/geom/vec3/v3_compute_interior_angle.js +0 -7
- package/src/core/geom/vec3/v3_dot_array_array.d.ts +0 -7
- package/src/core/geom/vec3/v3_dot_array_array.d.ts.map +0 -1
- package/src/core/geom/vec3/v3_dot_array_array.js +0 -7
- package/src/core/geom/vec3/v3_matrix4_rotate.d.ts +0 -7
- package/src/core/geom/vec3/v3_matrix4_rotate.d.ts.map +0 -1
- package/src/core/geom/vec3/v3_matrix4_rotate.js +0 -7
- package/src/core/geom/vec3/v3_multiply_scalar.d.ts +0 -7
- package/src/core/geom/vec3/v3_multiply_scalar.d.ts.map +0 -1
- package/src/core/geom/vec3/v3_multiply_scalar.js +0 -7
- package/src/core/geom/vec3/v3_quat3_apply.d.ts +0 -7
- package/src/core/geom/vec3/v3_quat3_apply.d.ts.map +0 -1
- package/src/core/geom/vec3/v3_quat3_apply.js +0 -7
- package/src/core/geom/vec3/v3_quat3_apply_inverse.d.ts +0 -7
- package/src/core/geom/vec3/v3_quat3_apply_inverse.d.ts.map +0 -1
- package/src/core/geom/vec3/v3_quat3_apply_inverse.js +0 -7
- package/src/core/geom/vec3/v3_triple_cross_product.d.ts +0 -7
- package/src/core/geom/vec3/v3_triple_cross_product.d.ts.map +0 -1
- package/src/core/geom/vec3/v3_triple_cross_product.js +0 -7
- package/src/core/geom/vec4/v4_multiply_mat4.d.ts +0 -7
- package/src/core/geom/vec4/v4_multiply_mat4.d.ts.map +0 -1
- package/src/core/geom/vec4/v4_multiply_mat4.js +0 -7
- package/src/core/math/fabsf.d.ts +0 -6
- package/src/core/math/fabsf.d.ts.map +0 -1
- package/src/core/math/fabsf.js +0 -6
- package/src/core/model/object/optional_equality.d.ts +0 -10
- package/src/core/model/object/optional_equality.d.ts.map +0 -1
- package/src/core/model/object/optional_equality.js +0 -10
- package/src/core/primitives/strings/string_compute_byte_size.d.ts +0 -7
- package/src/core/primitives/strings/string_compute_byte_size.d.ts.map +0 -1
- package/src/core/primitives/strings/string_compute_byte_size.js +0 -8
- package/src/engine/graphics/FrameThrottle.d.ts +0 -2
- package/src/engine/graphics/FrameThrottle.d.ts.map +0 -1
- package/src/engine/graphics/FrameThrottle.js +0 -2
- package/src/engine/graphics/sh3/path_tracer/geometry/compute_triangle_group_aabb3.d.ts +0 -2
- package/src/engine/graphics/sh3/path_tracer/geometry/compute_triangle_group_aabb3.d.ts.map +0 -1
- package/src/engine/graphics/sh3/path_tracer/geometry/compute_triangle_group_aabb3.js +0 -2
- package/src/engine/graphics/texture/isImageBitmap.d.ts +0 -2
- package/src/engine/graphics/texture/isImageBitmap.d.ts.map +0 -1
- package/src/engine/graphics/texture/isImageBitmap.js +0 -2
- package/src/engine/graphics3/AnimationGraphSystem3.d.ts +0 -10
- package/src/engine/graphics3/AnimationGraphSystem3.d.ts.map +0 -1
- package/src/engine/graphics3/AnimationGraphSystem3.js +0 -10
- package/src/engine/graphics3/AnimationSystem3.d.ts +0 -10
- package/src/engine/graphics3/AnimationSystem3.d.ts.map +0 -1
- package/src/engine/graphics3/AnimationSystem3.js +0 -10
- package/src/engine/graphics3/CameraSystem3.d.ts +0 -10
- package/src/engine/graphics3/CameraSystem3.d.ts.map +0 -1
- package/src/engine/graphics3/CameraSystem3.js +0 -10
- package/src/engine/graphics3/DebugDrawSystem3.d.ts +0 -10
- package/src/engine/graphics3/DebugDrawSystem3.d.ts.map +0 -1
- package/src/engine/graphics3/DebugDrawSystem3.js +0 -10
- package/src/engine/graphics3/DecalSystem3.d.ts +0 -10
- package/src/engine/graphics3/DecalSystem3.d.ts.map +0 -1
- package/src/engine/graphics3/DecalSystem3.js +0 -10
- package/src/engine/graphics3/FogOfWarSystem3.d.ts +0 -10
- package/src/engine/graphics3/FogOfWarSystem3.d.ts.map +0 -1
- package/src/engine/graphics3/FogOfWarSystem3.js +0 -10
- package/src/engine/graphics3/GraphicsEngine3.d.ts +0 -10
- package/src/engine/graphics3/GraphicsEngine3.d.ts.map +0 -1
- package/src/engine/graphics3/GraphicsEngine3.js +0 -10
- package/src/engine/graphics3/HighlightSystem.d.ts +0 -19
- package/src/engine/graphics3/HighlightSystem.d.ts.map +0 -1
- package/src/engine/graphics3/HighlightSystem.js +0 -27
- package/src/engine/graphics3/HighlightSystem3.d.ts +0 -13
- package/src/engine/graphics3/HighlightSystem3.d.ts.map +0 -1
- package/src/engine/graphics3/HighlightSystem3.js +0 -15
- package/src/engine/graphics3/LightSystem3.d.ts +0 -10
- package/src/engine/graphics3/LightSystem3.d.ts.map +0 -1
- package/src/engine/graphics3/LightSystem3.js +0 -10
- package/src/engine/graphics3/MeshSystem3.d.ts +0 -10
- package/src/engine/graphics3/MeshSystem3.d.ts.map +0 -1
- package/src/engine/graphics3/MeshSystem3.js +0 -10
- package/src/engine/graphics3/ParticipatingMediaSystem3.d.ts +0 -10
- package/src/engine/graphics3/ParticipatingMediaSystem3.d.ts.map +0 -1
- package/src/engine/graphics3/ParticipatingMediaSystem3.js +0 -10
- package/src/engine/graphics3/PathDisplaySystem3.d.ts +0 -10
- package/src/engine/graphics3/PathDisplaySystem3.d.ts.map +0 -1
- package/src/engine/graphics3/PathDisplaySystem3.js +0 -10
- package/src/engine/graphics3/PickingSystem3.d.ts +0 -10
- package/src/engine/graphics3/PickingSystem3.d.ts.map +0 -1
- package/src/engine/graphics3/PickingSystem3.js +0 -10
- package/src/engine/graphics3/ShadedGeometrySystem3.d.ts +0 -10
- package/src/engine/graphics3/ShadedGeometrySystem3.d.ts.map +0 -1
- package/src/engine/graphics3/ShadedGeometrySystem3.js +0 -10
- package/src/engine/graphics3/TerrainSystem3.d.ts +0 -10
- package/src/engine/graphics3/TerrainSystem3.d.ts.map +0 -1
- package/src/engine/graphics3/TerrainSystem3.js +0 -10
- package/src/engine/graphics3/TooltipComponentSystem3.d.ts +0 -10
- package/src/engine/graphics3/TooltipComponentSystem3.d.ts.map +0 -1
- package/src/engine/graphics3/TooltipComponentSystem3.js +0 -10
- package/src/engine/graphics3/Trail3DSystem3.d.ts +0 -10
- package/src/engine/graphics3/Trail3DSystem3.d.ts.map +0 -1
- package/src/engine/graphics3/Trail3DSystem3.js +0 -10
- package/src/engine/graphics3/VolumetricLightMapSystem3.d.ts +0 -10
- package/src/engine/graphics3/VolumetricLightMapSystem3.d.ts.map +0 -1
- package/src/engine/graphics3/VolumetricLightMapSystem3.js +0 -10
- package/src/engine/graphics3/WaterSystem3.d.ts +0 -10
- package/src/engine/graphics3/WaterSystem3.d.ts.map +0 -1
- package/src/engine/graphics3/WaterSystem3.js +0 -10
- package/src/engine/network/convertPathToURL.d.ts +0 -2
- package/src/engine/network/convertPathToURL.d.ts.map +0 -1
- package/src/engine/network/convertPathToURL.js +0 -2
- package/src/format/image/png/crc32.d.ts +0 -2
- package/src/format/image/png/crc32.d.ts.map +0 -1
- package/src/format/image/png/crc32.js +0 -7
- package/src/shade/renderer/camera/OrbitalCameraController.d.ts +0 -2
- package/src/shade/renderer/camera/OrbitalCameraController.d.ts.map +0 -1
- package/src/shade/renderer/camera/OrbitalCameraController.js +0 -1
- package/src/shade/renderer/deferred/chunk_shade_standard_material_direct_heavy.d.ts +0 -16
- package/src/shade/renderer/deferred/chunk_shade_standard_material_direct_heavy.d.ts.map +0 -1
- package/src/shade/renderer/deferred/chunk_shade_standard_material_direct_heavy.js +0 -17
- package/src/shade/renderer/geometry/sdf/SDF_BUILD_SETTINGS_STRUCT.d.ts +0 -3
- package/src/shade/renderer/geometry/sdf/SDF_BUILD_SETTINGS_STRUCT.d.ts.map +0 -1
- package/src/shade/renderer/geometry/sdf/SDF_BUILD_SETTINGS_STRUCT.js +0 -8
- package/src/shade/renderer/geometry/sdf/SFD_BUILD_WORKGROUP_SIZE.d.ts +0 -2
- package/src/shade/renderer/geometry/sdf/SFD_BUILD_WORKGROUP_SIZE.d.ts.map +0 -1
- package/src/shade/renderer/geometry/sdf/SFD_BUILD_WORKGROUP_SIZE.js +0 -1
- package/src/shade/renderer/geometry/sdf/chunk_blas_query_sdf.d.ts +0 -8
- package/src/shade/renderer/geometry/sdf/chunk_blas_query_sdf.d.ts.map +0 -1
- package/src/shade/renderer/geometry/sdf/chunk_blas_query_sdf.js +0 -49
- package/src/shade/renderer/geometry/sdf/chunk_blas_query_volume_sign.d.ts +0 -3
- package/src/shade/renderer/geometry/sdf/chunk_blas_query_volume_sign.d.ts.map +0 -1
- package/src/shade/renderer/geometry/sdf/chunk_blas_query_volume_sign.js +0 -90
- package/src/shade/renderer/geometry/sdf/shader_build_sdf.d.ts +0 -3
- package/src/shade/renderer/geometry/sdf/shader_build_sdf.d.ts.map +0 -1
- package/src/shade/renderer/geometry/sdf/shader_build_sdf.js +0 -126
- package/src/shade/renderer/light/environment/octahedral_uv_to_direction.d.ts +0 -8
- package/src/shade/renderer/light/environment/octahedral_uv_to_direction.d.ts.map +0 -1
- package/src/shade/renderer/light/environment/octahedral_uv_to_direction.js +0 -10
- package/src/shade/renderer/particles/shaders/shader_particle_init_free_list.d.ts +0 -31
- package/src/shade/renderer/particles/shaders/shader_particle_init_free_list.d.ts.map +0 -1
- package/src/shade/renderer/particles/shaders/shader_particle_init_free_list.js +0 -62
- package/src/shade/renderer/shadow/vsm/VSMMoverTracker.d.ts +0 -42
- package/src/shade/renderer/shadow/vsm/VSMMoverTracker.d.ts.map +0 -1
- package/src/shade/renderer/shadow/vsm/VSMMoverTracker.js +0 -153
- package/src/shade/renderer/shadow/vsm/VSM_MOVER_LAYOUT.d.ts +0 -54
- package/src/shade/renderer/shadow/vsm/VSM_MOVER_LAYOUT.d.ts.map +0 -1
- package/src/shade/renderer/shadow/vsm/VSM_MOVER_LAYOUT.js +0 -75
- package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_append_mover.d.ts +0 -14
- package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_append_mover.d.ts.map +0 -1
- package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_append_mover.js +0 -32
- package/src/shade/renderer/shadow/vsm/shader/shader_vsm_movers.d.ts +0 -30
- package/src/shade/renderer/shadow/vsm/shader/shader_vsm_movers.d.ts.map +0 -1
- package/src/shade/renderer/shadow/vsm/shader/shader_vsm_movers.js +0 -184
- package/src/shade/renderer/shadow/vsm/shader/shader_vsm_skinned_movers.d.ts +0 -23
- package/src/shade/renderer/shadow/vsm/shader/shader_vsm_skinned_movers.d.ts.map +0 -1
- package/src/shade/renderer/shadow/vsm/shader/shader_vsm_skinned_movers.js +0 -109
|
@@ -0,0 +1,2050 @@
|
|
|
1
|
+
import { BVH } from "../../../core/bvh2/bvh3/BVH.js";
|
|
2
|
+
import { bvh_query_user_data_intersects_capsule } from "../../../core/bvh2/bvh3/query/bvh_query_user_data_intersects_capsule.js";
|
|
3
|
+
import { PointHashGrid3 } from "../../../core/geom/3d/hash-grid/PointHashGrid3.js";
|
|
4
|
+
import { line3_compute_segment_segment_closest_points } from "../../../core/geom/3d/line/line3_compute_segment_segment_closest_points.js";
|
|
5
|
+
import { GOLDEN_RATIO } from "../../../core/math/GOLDEN_RATIO.js";
|
|
6
|
+
import { PI2 } from "../../../core/math/PI2.js";
|
|
7
|
+
import { clamp } from "../../../core/math/clamp.js";
|
|
8
|
+
import { lerp } from "../../../core/math/lerp.js";
|
|
9
|
+
import { curl_noise_3d } from "../../../core/math/noise/curl_noise_3d.js";
|
|
10
|
+
import { seededRandom } from "../../../core/math/random/seededRandom.js";
|
|
11
|
+
import { PhyllotaxisMode, phyllotaxis_sample_angle } from "../config/PhyllotaxisMode.js";
|
|
12
|
+
import { TreeSpeciesConfig } from "../config/TreeSpeciesConfig.js";
|
|
13
|
+
import { TreeSkeleton } from "./TreeSkeleton.js";
|
|
14
|
+
import { tree_skeleton_fit_crown_frame } from "./tree_skeleton_fit_crown_frame.js";
|
|
15
|
+
import { assert } from "../../../core/assert.js";
|
|
16
|
+
import { flare_lobe_phase_offset } from "./flare_lobe_phase_offset.js";
|
|
17
|
+
import { crown_envelope_evaluate, crown_envelope_sdf } from "./crown_envelope_evaluate.js";
|
|
18
|
+
import { spine_frame_double_reflection } from "./spine_frame_double_reflection.js";
|
|
19
|
+
import { tree_skeleton_compute_pipe_radii } from "./tree_skeleton_compute_pipe_radii.js";
|
|
20
|
+
|
|
21
|
+
const GOLDEN_ANGLE = PI2 / (GOLDEN_RATIO * GOLDEN_RATIO); // ~2.399963229728653 rad (137.50776 deg)
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Canonical order of a generator's outgoing rules: by target, then by content, so the order rules are listed in
|
|
25
|
+
* never changes the tree.
|
|
26
|
+
* @param {import("../config/BranchSpawnRule.js").BranchSpawnRule} a
|
|
27
|
+
* @param {import("../config/BranchSpawnRule.js").BranchSpawnRule} b
|
|
28
|
+
* @returns {number}
|
|
29
|
+
*/
|
|
30
|
+
function compare_rule_target(a, b) {
|
|
31
|
+
return (a.target - b.target) || (a.hash() - b.hash());
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Node position `u` of child `c` of a rule laying out `planned` children over its attachment interval, `u` in
|
|
36
|
+
* [0, 1) for `c` in [0, planned). The same layout continued to `c < 0` gives `u < 0`: where the rule's earlier
|
|
37
|
+
* children grew, below its interval.
|
|
38
|
+
*
|
|
39
|
+
* @param {import("../config/BranchSpawnRule.js").BranchSpawnRule} rule
|
|
40
|
+
* @param {number} c
|
|
41
|
+
* @param {number} planned
|
|
42
|
+
* @param {boolean} on_trunk whorls compress toward the apex of a trunk (self-similar conical internodes)
|
|
43
|
+
* @returns {number}
|
|
44
|
+
*/
|
|
45
|
+
function rule_node_u(rule, c, planned, on_trunk) {
|
|
46
|
+
switch (rule.phyllotaxis_mode) {
|
|
47
|
+
case PhyllotaxisMode.Opposite:
|
|
48
|
+
case PhyllotaxisMode.OppositeDecussate: {
|
|
49
|
+
const pair_count = Math.max(1, Math.ceil(planned / 2));
|
|
50
|
+
return pair_count > 1 ? ((c >> 1) + 0.35) / (pair_count - 0.55) : 0.5;
|
|
51
|
+
}
|
|
52
|
+
case PhyllotaxisMode.Whorled: {
|
|
53
|
+
const w_size = Math.max(1, rule.whorl_count | 0);
|
|
54
|
+
const whorl_total = Math.max(1, Math.ceil(planned / w_size));
|
|
55
|
+
const u_lin = whorl_total > 1 ? (Math.floor(c / w_size) + 0.35) / (whorl_total - 0.55) : 0.5;
|
|
56
|
+
// p > 1 => du/dt decreases as u -> 1; u_lin < 1 for every c < planned
|
|
57
|
+
return on_trunk ? 1.0 - Math.pow(1.0 - u_lin, 1.42) : u_lin;
|
|
58
|
+
}
|
|
59
|
+
default:
|
|
60
|
+
return planned > 1 ? (c + 0.35) / (planned - 0.55) : 0.5;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Azimuth of child `c` of a rule relative to its family's base azimuth, for any integer `c` (also `c < 0`).
|
|
66
|
+
* `FlareLobes` is placed by the caller.
|
|
67
|
+
*
|
|
68
|
+
* @param {import("../config/BranchSpawnRule.js").BranchSpawnRule} rule
|
|
69
|
+
* @param {number} c
|
|
70
|
+
* @returns {number}
|
|
71
|
+
*/
|
|
72
|
+
function rule_node_phi(rule, c) {
|
|
73
|
+
return phyllotaxis_sample_angle(rule.phyllotaxis_mode, c, rule.whorl_count);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
const SCRATCH_CURL = [0, 0, 0];
|
|
77
|
+
const SCRATCH_RMF = new Float64Array(6);
|
|
78
|
+
const SCRATCH_POS = new Float32Array(3);
|
|
79
|
+
const SCRATCH_TAN = new Float32Array(3);
|
|
80
|
+
const SCRATCH_P0 = new Float32Array(3);
|
|
81
|
+
const SCRATCH_T0 = new Float32Array(3);
|
|
82
|
+
const SCRATCH_R0 = new Float32Array(3);
|
|
83
|
+
const SCRATCH_M_PREV = new Float32Array(3);
|
|
84
|
+
const SCRATCH_M_NEXT = new Float32Array(3);
|
|
85
|
+
const SCRATCH_GUIDE_P0 = new Float32Array(3);
|
|
86
|
+
const SCRATCH_GUIDE_P1 = new Float32Array(3);
|
|
87
|
+
const SCRATCH_GUIDE_T = new Float32Array(3);
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Evaluates the trunk guide curve position `out_pos` and unit tangent `out_tan` at normalized
|
|
91
|
+
* parameter `t_norm` in [0, 1]. Defaults to the vertical upward plumb line `(0, t_norm * trunk_len, 0)`
|
|
92
|
+
* when `trunk_guide` is null or omitted.
|
|
93
|
+
*
|
|
94
|
+
* @param {Float32Array|number[]} out_pos
|
|
95
|
+
* @param {Float32Array|number[]} out_tan
|
|
96
|
+
* @param {Array<ArrayLike<number>>|Function|null|undefined} trunk_guide
|
|
97
|
+
* @param {number} t_norm
|
|
98
|
+
* @param {number} trunk_len
|
|
99
|
+
*/
|
|
100
|
+
function evaluate_trunk_guide(out_pos, out_tan, trunk_guide, t_norm, trunk_len) {
|
|
101
|
+
const t = clamp(t_norm, 0.0, 1.0);
|
|
102
|
+
if (!trunk_guide) {
|
|
103
|
+
out_pos[0] = 0.0;
|
|
104
|
+
out_pos[1] = t * trunk_len;
|
|
105
|
+
out_pos[2] = 0.0;
|
|
106
|
+
out_tan[0] = 0.0;
|
|
107
|
+
out_tan[1] = 1.0;
|
|
108
|
+
out_tan[2] = 0.0;
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
const sample_pt = (u, dst) => {
|
|
113
|
+
if (typeof trunk_guide === "function") {
|
|
114
|
+
trunk_guide(u, dst);
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
if (Array.isArray(trunk_guide) && trunk_guide.length >= 2) {
|
|
118
|
+
const n = trunk_guide.length - 1;
|
|
119
|
+
const su = clamp(u, 0.0, 1.0) * n;
|
|
120
|
+
const idx = Math.min(n - 1, Math.floor(su));
|
|
121
|
+
const frac = su - idx;
|
|
122
|
+
const a = trunk_guide[idx];
|
|
123
|
+
const b = trunk_guide[idx + 1];
|
|
124
|
+
dst[0] = lerp(a[0] ?? 0.0, b[0] ?? 0.0, frac);
|
|
125
|
+
dst[1] = lerp(a[1] ?? 0.0, b[1] ?? 0.0, frac);
|
|
126
|
+
dst[2] = lerp(a[2] ?? 0.0, b[2] ?? 0.0, frac);
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
dst[0] = 0.0;
|
|
130
|
+
dst[1] = u * trunk_len;
|
|
131
|
+
dst[2] = 0.0;
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
sample_pt(t, out_pos);
|
|
135
|
+
const eps = 0.01;
|
|
136
|
+
const t_a = Math.max(0.0, t - eps);
|
|
137
|
+
const t_b = Math.min(1.0, t + eps);
|
|
138
|
+
const pa = [0, 0, 0];
|
|
139
|
+
const pb = [0, 0, 0];
|
|
140
|
+
sample_pt(t_a, pa);
|
|
141
|
+
sample_pt(t_b, pb);
|
|
142
|
+
let tx = pb[0] - pa[0];
|
|
143
|
+
let ty = pb[1] - pa[1];
|
|
144
|
+
let tz = pb[2] - pa[2];
|
|
145
|
+
const tl = Math.hypot(tx, ty, tz);
|
|
146
|
+
if (tl > 1e-8) {
|
|
147
|
+
out_tan[0] = tx / tl;
|
|
148
|
+
out_tan[1] = ty / tl;
|
|
149
|
+
out_tan[2] = tz / tl;
|
|
150
|
+
} else {
|
|
151
|
+
out_tan[0] = 0.0;
|
|
152
|
+
out_tan[1] = 1.0;
|
|
153
|
+
out_tan[2] = 0.0;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Rotates unit vector `(vx, vy, vz)` around unit axis `(ax, ay, az)` by `angle` radians (Rodrigues' formula).
|
|
159
|
+
* @param {number[]|Float64Array} out
|
|
160
|
+
* @param {number} vx
|
|
161
|
+
* @param {number} vy
|
|
162
|
+
* @param {number} vz
|
|
163
|
+
* @param {number} ax
|
|
164
|
+
* @param {number} ay
|
|
165
|
+
* @param {number} az
|
|
166
|
+
* @param {number} angle
|
|
167
|
+
*/
|
|
168
|
+
function rotate_around_axis(out, vx, vy, vz, ax, ay, az, angle) {
|
|
169
|
+
const c = Math.cos(angle);
|
|
170
|
+
const s = Math.sin(angle);
|
|
171
|
+
const dot = vx * ax + vy * ay + vz * az;
|
|
172
|
+
const omc = 1.0 - c;
|
|
173
|
+
|
|
174
|
+
const cx = ay * vz - az * vy;
|
|
175
|
+
const cy = az * vx - ax * vz;
|
|
176
|
+
const cz = ax * vy - ay * vx;
|
|
177
|
+
|
|
178
|
+
let rx = vx * c + cx * s + ax * dot * omc;
|
|
179
|
+
let ry = vy * c + cy * s + ay * dot * omc;
|
|
180
|
+
let rz = vz * c + cz * s + az * dot * omc;
|
|
181
|
+
|
|
182
|
+
const len = Math.sqrt(rx * rx + ry * ry + rz * rz);
|
|
183
|
+
if (len > 1e-12) {
|
|
184
|
+
const inv = 1.0 / len;
|
|
185
|
+
rx *= inv;
|
|
186
|
+
ry *= inv;
|
|
187
|
+
rz *= inv;
|
|
188
|
+
}
|
|
189
|
+
out[0] = rx;
|
|
190
|
+
out[1] = ry;
|
|
191
|
+
out[2] = rz;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* Determines the non-exempt sub-segment parameter intervals `[s_min, 1]` on candidate segment A
|
|
196
|
+
* and `[t_min, 1]` on existing segment B for branch-branch capsule collision testing.
|
|
197
|
+
* Returns `false` if the segment pair is topologically exempt (e.g. direct parent-child base collar).
|
|
198
|
+
*
|
|
199
|
+
* @param {number} bA
|
|
200
|
+
* @param {number} parent_bA
|
|
201
|
+
* @param {number} attach_seg_A
|
|
202
|
+
* @param {boolean} is_split_A
|
|
203
|
+
* @param {number} local_idx_A
|
|
204
|
+
* @param {number} bB
|
|
205
|
+
* @param {number} parent_bB
|
|
206
|
+
* @param {number} attach_seg_B
|
|
207
|
+
* @param {boolean} is_split_B
|
|
208
|
+
* @param {number} local_idx_B
|
|
209
|
+
* @param {Float64Array|number[]} out_bounds `[s_min, t_min]`
|
|
210
|
+
* @returns {boolean}
|
|
211
|
+
*/
|
|
212
|
+
function resolve_subsegment_bounds(
|
|
213
|
+
bA, parent_bA, attach_seg_A, is_split_A, local_idx_A,
|
|
214
|
+
bB, parent_bB, attach_seg_B, is_split_B, local_idx_B,
|
|
215
|
+
out_bounds
|
|
216
|
+
) {
|
|
217
|
+
if (bA === bB) return false;
|
|
218
|
+
|
|
219
|
+
// 1. A is a direct child of B
|
|
220
|
+
if (parent_bA === bB) {
|
|
221
|
+
if (is_split_A) {
|
|
222
|
+
if (local_idx_A === 0 && local_idx_B === attach_seg_A) return false;
|
|
223
|
+
if (local_idx_A === 0 && local_idx_B === attach_seg_A + 1) {
|
|
224
|
+
out_bounds[0] = 0.55;
|
|
225
|
+
out_bounds[1] = 0.55;
|
|
226
|
+
return true;
|
|
227
|
+
}
|
|
228
|
+
if (local_idx_A === 1 && (local_idx_B === attach_seg_A || local_idx_B === attach_seg_A + 1)) {
|
|
229
|
+
out_bounds[0] = 0.45;
|
|
230
|
+
out_bounds[1] = 0.45;
|
|
231
|
+
return true;
|
|
232
|
+
}
|
|
233
|
+
} else {
|
|
234
|
+
if (local_idx_A === 0 && Math.abs(local_idx_B - attach_seg_A) <= 1) return false;
|
|
235
|
+
if (local_idx_A === 1 && Math.abs(local_idx_B - attach_seg_A) <= 1) {
|
|
236
|
+
if (bA < 0 || local_idx_B === attach_seg_A) return false;
|
|
237
|
+
out_bounds[0] = 0.35;
|
|
238
|
+
out_bounds[1] = 0.0;
|
|
239
|
+
return true;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
// 2. B is a direct child of A
|
|
245
|
+
if (parent_bB === bA) {
|
|
246
|
+
if (is_split_B) {
|
|
247
|
+
if (local_idx_B === 0 && local_idx_A === attach_seg_B) return false;
|
|
248
|
+
if (local_idx_B === 0 && local_idx_A === attach_seg_B + 1) {
|
|
249
|
+
out_bounds[0] = 0.55;
|
|
250
|
+
out_bounds[1] = 0.55;
|
|
251
|
+
return true;
|
|
252
|
+
}
|
|
253
|
+
if (local_idx_B === 1 && (local_idx_A === attach_seg_B || local_idx_A === attach_seg_B + 1)) {
|
|
254
|
+
out_bounds[0] = 0.45;
|
|
255
|
+
out_bounds[1] = 0.45;
|
|
256
|
+
return true;
|
|
257
|
+
}
|
|
258
|
+
} else {
|
|
259
|
+
if (local_idx_B <= 1 && Math.abs(local_idx_A - attach_seg_B) <= 1) return false;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
// 3. A and B are siblings sharing the same parent branch
|
|
264
|
+
if (parent_bA >= 0 && parent_bA === parent_bB) {
|
|
265
|
+
if (local_idx_A === 0 && local_idx_B === 0) {
|
|
266
|
+
out_bounds[0] = 0.50;
|
|
267
|
+
out_bounds[1] = 0.50;
|
|
268
|
+
return true;
|
|
269
|
+
}
|
|
270
|
+
if (local_idx_A === 0 && local_idx_B === 1 && Math.abs(attach_seg_A - attach_seg_B) <= 1) {
|
|
271
|
+
out_bounds[0] = 0.25;
|
|
272
|
+
out_bounds[1] = 0.0;
|
|
273
|
+
return true;
|
|
274
|
+
}
|
|
275
|
+
if (local_idx_A === 1 && local_idx_B === 0 && Math.abs(attach_seg_A - attach_seg_B) <= 1) {
|
|
276
|
+
out_bounds[0] = 0.0;
|
|
277
|
+
out_bounds[1] = 0.25;
|
|
278
|
+
return true;
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
out_bounds[0] = 0.0;
|
|
283
|
+
out_bounds[1] = 0.0;
|
|
284
|
+
return true;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
/**
|
|
288
|
+
* Grows a tree's framework from its generator graph (`TreeGrowth.Graph`): a directed `TreeSkeleton` from a
|
|
289
|
+
* `TreeSpeciesConfig`, without the shoot systems of its `shoot_rules` (`tree_skeleton_grow` grows those on it), combining:
|
|
290
|
+
* - A branch generator graph: `species.branches[0]` grows the trunk, and every `species.branch_rules` edge
|
|
291
|
+
* spawns branches of its `target` generator along each branch of its `source` generator
|
|
292
|
+
* - Parametric Cubic Hermite spine generation (`BranchGeneratorConfig`, `AnimationCurve` profiles)
|
|
293
|
+
* - Botanical phyllotaxis (`SpiralGolden`, `AlternateDistichous`, `Tristichous`, `Opposite`, `OppositeDecussate`, `Whorled`, `FlareLobes`)
|
|
294
|
+
* - Structural surface roots (`BranchGeneratorConfig.root`) that creep along the ground plane `y = 0`
|
|
295
|
+
* - Gravitropism (toward `-Y`), phototropism (toward `+Y` and outward crown exterior), and 3D `curl_noise_3d` gnarl
|
|
296
|
+
* - Dichotomous / sympodial trunk & bough splitting
|
|
297
|
+
* - Space colonization crown competition via `PointHashGrid3`
|
|
298
|
+
* - Rotation-Minimizing Frames (`spine_frame_double_reflection`)
|
|
299
|
+
* - Pipe Model cross-section radius accumulation (`tree_skeleton_compute_pipe_radii`)
|
|
300
|
+
*
|
|
301
|
+
* @param {TreeSpeciesConfig|Object} [config]
|
|
302
|
+
* @param {TreeSkeleton} [out]
|
|
303
|
+
* @returns {TreeSkeleton}
|
|
304
|
+
*/
|
|
305
|
+
export function tree_skeleton_grow_framework(config = new TreeSpeciesConfig(), out = new TreeSkeleton()) {
|
|
306
|
+
const species = config && config.isTreeSpeciesConfig ? config : TreeSpeciesConfig.from(config);
|
|
307
|
+
out.clear();
|
|
308
|
+
|
|
309
|
+
const rng = seededRandom(species.seed | 0);
|
|
310
|
+
// Seed-derived 3D noise offset so unseeded Simplex/Curl fields are unique and deterministic per seed
|
|
311
|
+
const noise_ox = (rng() - 0.5) * 1000.0;
|
|
312
|
+
const noise_oy = (rng() - 0.5) * 1000.0;
|
|
313
|
+
const noise_oz = (rng() - 0.5) * 1000.0;
|
|
314
|
+
|
|
315
|
+
const crown = species.crown;
|
|
316
|
+
const crown_cy = crown.base_height + crown.height * 0.5;
|
|
317
|
+
out.crown_center[0] = 0.0;
|
|
318
|
+
out.crown_center[1] = crown_cy;
|
|
319
|
+
out.crown_center[2] = 0.0;
|
|
320
|
+
|
|
321
|
+
out.crown_radii[0] = Math.max(0.25, crown.radius);
|
|
322
|
+
out.crown_radii[1] = Math.max(0.25, crown.height * 0.5);
|
|
323
|
+
out.crown_radii[2] = Math.max(0.25, crown.radius);
|
|
324
|
+
|
|
325
|
+
// Build Space Colonization attraction point cloud + PointHashGrid3 once
|
|
326
|
+
const use_space_col = crown.space_colonization_weight > 0.0 && crown.attraction_point_count > 0;
|
|
327
|
+
const attr_count = use_space_col ? (crown.attraction_point_count | 0) : 0;
|
|
328
|
+
const attr_positions = new Float32Array(attr_count * 3);
|
|
329
|
+
const attr_alive = new Uint8Array(attr_count);
|
|
330
|
+
let attr_grid = null;
|
|
331
|
+
|
|
332
|
+
if (use_space_col) {
|
|
333
|
+
let placed = 0;
|
|
334
|
+
let attempts = 0;
|
|
335
|
+
const max_attempts = attr_count * 12;
|
|
336
|
+
while (placed < attr_count && attempts < max_attempts) {
|
|
337
|
+
attempts++;
|
|
338
|
+
const u_h = rng();
|
|
339
|
+
const env_r = crown.radius * crown_envelope_evaluate(crown.envelope_type, u_h);
|
|
340
|
+
const rx = (rng() * 2.0 - 1.0) * env_r;
|
|
341
|
+
const rz = (rng() * 2.0 - 1.0) * env_r;
|
|
342
|
+
if (rx * rx + rz * rz <= env_r * env_r) {
|
|
343
|
+
const ry = crown.base_height + u_h * crown.height;
|
|
344
|
+
attr_positions[placed * 3] = rx;
|
|
345
|
+
attr_positions[placed * 3 + 1] = ry;
|
|
346
|
+
attr_positions[placed * 3 + 2] = rz;
|
|
347
|
+
attr_alive[placed] = 1;
|
|
348
|
+
placed++;
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
while (placed < attr_count) {
|
|
352
|
+
const theta = rng() * PI2;
|
|
353
|
+
const u_h = rng();
|
|
354
|
+
const r = Math.sqrt(rng()) * crown.radius * crown_envelope_evaluate(crown.envelope_type, u_h);
|
|
355
|
+
attr_positions[placed * 3] = Math.cos(theta) * r;
|
|
356
|
+
attr_positions[placed * 3 + 1] = crown.base_height + u_h * crown.height;
|
|
357
|
+
attr_positions[placed * 3 + 2] = Math.sin(theta) * r;
|
|
358
|
+
attr_alive[placed] = 1;
|
|
359
|
+
placed++;
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
attr_grid = new PointHashGrid3();
|
|
363
|
+
attr_grid.build(attr_positions, attr_count, Math.max(0.25, crown.attraction_radius));
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
const r_influence_sq = crown.attraction_radius * crown.attraction_radius;
|
|
367
|
+
const r_kill_sq = crown.kill_radius * crown.kill_radius;
|
|
368
|
+
|
|
369
|
+
// Queue of branches to grow in level-order (guarantees parent branches & vertices precede children)
|
|
370
|
+
const queue = [];
|
|
371
|
+
|
|
372
|
+
const lvl0 = species.branches[0];
|
|
373
|
+
if (!lvl0) {
|
|
374
|
+
return out;
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
// Outgoing rules of every generator in canonical order, so the order rules are listed in does not change the tree
|
|
378
|
+
const outgoing_rules = species.branches.map(() => []);
|
|
379
|
+
for (let r = 0; r < species.branch_rules.length; r++) {
|
|
380
|
+
const rule = species.branch_rules[r];
|
|
381
|
+
assert.ok(rule.source >= 0 && rule.source < rule.target && rule.target < species.branches.length,
|
|
382
|
+
'branch rule must satisfy 0 <= source < target < branches.length');
|
|
383
|
+
outgoing_rules[rule.source].push(rule);
|
|
384
|
+
}
|
|
385
|
+
for (let g = 0; g < outgoing_rules.length; g++) {
|
|
386
|
+
outgoing_rules[g].sort(compare_rule_target);
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
// a seed leader is a shoot a few centimetres long
|
|
390
|
+
const trunk_len = Math.max(1e-3, lvl0.length * (1.0 + (rng() * 2.0 - 1.0) * lvl0.length_variance));
|
|
391
|
+
const trunk_base_r = Math.max(0.01, trunk_len * lvl0.radius_ratio);
|
|
392
|
+
|
|
393
|
+
evaluate_trunk_guide(SCRATCH_GUIDE_P0, SCRATCH_GUIDE_T, species.trunk_guide, 0.0, trunk_len);
|
|
394
|
+
|
|
395
|
+
// Apply subtle initial basal trunk lean around the guide tangent
|
|
396
|
+
const max_lean = lvl0.excurrent ? 0.025 : 0.06;
|
|
397
|
+
const lean_ang = clamp((lvl0.basal_lean ?? 0.02) * (0.75 + 0.5 * rng()), 0.0, max_lean);
|
|
398
|
+
const lean_az = rng() * PI2;
|
|
399
|
+
const init_tx = clamp(SCRATCH_GUIDE_T[0] + Math.sin(lean_ang) * Math.cos(lean_az), -0.95, 0.95);
|
|
400
|
+
const init_ty = Math.max(0.2, SCRATCH_GUIDE_T[1] * Math.cos(lean_ang));
|
|
401
|
+
const init_tz = clamp(SCRATCH_GUIDE_T[2] + Math.sin(lean_ang) * Math.sin(lean_az), -0.95, 0.95);
|
|
402
|
+
const init_t_len = Math.hypot(init_tx, init_ty, init_tz) || 1.0;
|
|
403
|
+
const norm_tx = init_tx / init_t_len;
|
|
404
|
+
const norm_ty = init_ty / init_t_len;
|
|
405
|
+
const norm_tz = init_tz / init_t_len;
|
|
406
|
+
|
|
407
|
+
// Orthonormal initial R perpendicular to norm_T
|
|
408
|
+
let init_rx = 1.0 - norm_tx * norm_tx;
|
|
409
|
+
let init_ry = -norm_ty * norm_tx;
|
|
410
|
+
let init_rz = -norm_tz * norm_tx;
|
|
411
|
+
const init_r_len = Math.hypot(init_rx, init_ry, init_rz) || 1.0;
|
|
412
|
+
init_rx /= init_r_len;
|
|
413
|
+
init_ry /= init_r_len;
|
|
414
|
+
init_rz /= init_r_len;
|
|
415
|
+
|
|
416
|
+
queue.push({
|
|
417
|
+
level: 0,
|
|
418
|
+
generator: 0,
|
|
419
|
+
in_crown: true,
|
|
420
|
+
parent_branch_id: -1,
|
|
421
|
+
parent_edge_id: -1,
|
|
422
|
+
parent_attach_seg_idx: -1,
|
|
423
|
+
parent_attach_t: 0.0,
|
|
424
|
+
start_vertex: -1,
|
|
425
|
+
px: SCRATCH_GUIDE_P0[0],
|
|
426
|
+
py: SCRATCH_GUIDE_P0[1],
|
|
427
|
+
pz: SCRATCH_GUIDE_P0[2],
|
|
428
|
+
tx: norm_tx,
|
|
429
|
+
ty: norm_ty,
|
|
430
|
+
tz: norm_tz,
|
|
431
|
+
rx: init_rx,
|
|
432
|
+
ry: init_ry,
|
|
433
|
+
rz: init_rz,
|
|
434
|
+
emerge_drx: init_rx,
|
|
435
|
+
emerge_dry: init_ry,
|
|
436
|
+
emerge_drz: init_rz,
|
|
437
|
+
length: trunk_len,
|
|
438
|
+
full_branch_length: trunk_len,
|
|
439
|
+
base_radius: trunk_base_r,
|
|
440
|
+
start_seg: 0,
|
|
441
|
+
total_segs: Math.max(1, lvl0.segments),
|
|
442
|
+
shape_segs: Math.max(1, lvl0.segments),
|
|
443
|
+
initial_arc_s: 0.0,
|
|
444
|
+
has_split: false,
|
|
445
|
+
is_split_fork: false,
|
|
446
|
+
cum_t0: 0.0,
|
|
447
|
+
cum_t1: 1.0
|
|
448
|
+
});
|
|
449
|
+
|
|
450
|
+
const rot_scratch = [0, 0, 0];
|
|
451
|
+
|
|
452
|
+
// Scope-local BVH and per-segment metadata for branch-branch spatial avoidance & collision prevention
|
|
453
|
+
const bvh = new BVH();
|
|
454
|
+
const bvh_hits = new Uint32Array(256);
|
|
455
|
+
const query_capsule = new Float32Array(7);
|
|
456
|
+
const sub_bounds = new Float64Array(2);
|
|
457
|
+
const closest_st = new Float64Array(2);
|
|
458
|
+
|
|
459
|
+
const seg_branch_id = [];
|
|
460
|
+
const seg_local_idx = [];
|
|
461
|
+
const seg_p0x = [], seg_p0y = [], seg_p0z = [], seg_r0 = [];
|
|
462
|
+
const seg_p1x = [], seg_p1y = [], seg_p1z = [], seg_r1 = [];
|
|
463
|
+
const seg_bvh_leaf = [];
|
|
464
|
+
|
|
465
|
+
const branch_parent_seg_idx = [];
|
|
466
|
+
const branch_is_split_fork = [];
|
|
467
|
+
|
|
468
|
+
/**
|
|
469
|
+
* Evaluates the minimum signed surface-to-surface clearance between a candidate segment A
|
|
470
|
+
* and all non-exempt existing segments in `bvh`.
|
|
471
|
+
*/
|
|
472
|
+
const evaluate_candidate_clearance = (
|
|
473
|
+
bA, parent_bA, attach_seg_A, is_split_A, local_idx_A,
|
|
474
|
+
a0x, a0y, a0z, rA0,
|
|
475
|
+
a1x, a1y, a1z, rA1,
|
|
476
|
+
extra_margin
|
|
477
|
+
) => {
|
|
478
|
+
if (bvh.size === 0) return 10.0;
|
|
479
|
+
const max_rA = Math.max(rA0, rA1);
|
|
480
|
+
query_capsule[0] = a0x;
|
|
481
|
+
query_capsule[1] = a0y;
|
|
482
|
+
query_capsule[2] = a0z;
|
|
483
|
+
query_capsule[3] = a1x;
|
|
484
|
+
query_capsule[4] = a1y;
|
|
485
|
+
query_capsule[5] = a1z;
|
|
486
|
+
query_capsule[6] = max_rA * 1.15 + extra_margin + 0.04;
|
|
487
|
+
|
|
488
|
+
const hit_count = bvh_query_user_data_intersects_capsule(bvh_hits, 0, bvh, query_capsule);
|
|
489
|
+
let min_clear = 10.0;
|
|
490
|
+
|
|
491
|
+
for (let h = 0; h < hit_count; h++) {
|
|
492
|
+
const eB = bvh_hits[h];
|
|
493
|
+
const bB = seg_branch_id[eB];
|
|
494
|
+
const local_idx_B = seg_local_idx[eB];
|
|
495
|
+
const parent_bB = out.branch_parent[bB];
|
|
496
|
+
const attach_seg_B = branch_parent_seg_idx[bB];
|
|
497
|
+
const is_split_B = branch_is_split_fork[bB];
|
|
498
|
+
|
|
499
|
+
if (!resolve_subsegment_bounds(
|
|
500
|
+
bA, parent_bA, attach_seg_A, is_split_A, local_idx_A,
|
|
501
|
+
bB, parent_bB, attach_seg_B, is_split_B, local_idx_B,
|
|
502
|
+
sub_bounds
|
|
503
|
+
)) {
|
|
504
|
+
continue;
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
const s_min = sub_bounds[0];
|
|
508
|
+
const t_min = sub_bounds[1];
|
|
509
|
+
const sa0x = a0x + (a1x - a0x) * s_min;
|
|
510
|
+
const sa0y = a0y + (a1y - a0y) * s_min;
|
|
511
|
+
const sa0z = a0z + (a1z - a0z) * s_min;
|
|
512
|
+
|
|
513
|
+
const b0x = seg_p0x[eB], b0y = seg_p0y[eB], b0z = seg_p0z[eB];
|
|
514
|
+
const b1x = seg_p1x[eB], b1y = seg_p1y[eB], b1z = seg_p1z[eB];
|
|
515
|
+
const sb0x = b0x + (b1x - b0x) * t_min;
|
|
516
|
+
const sb0y = b0y + (b1y - b0y) * t_min;
|
|
517
|
+
const sb0z = b0z + (b1z - b0z) * t_min;
|
|
518
|
+
|
|
519
|
+
line3_compute_segment_segment_closest_points(
|
|
520
|
+
closest_st,
|
|
521
|
+
sa0x, sa0y, sa0z, a1x, a1y, a1z,
|
|
522
|
+
sb0x, sb0y, sb0z, b1x, b1y, b1z
|
|
523
|
+
);
|
|
524
|
+
|
|
525
|
+
const s_f = s_min + (1.0 - s_min) * closest_st[0];
|
|
526
|
+
const t_f = t_min + (1.0 - t_min) * closest_st[1];
|
|
527
|
+
|
|
528
|
+
const qAx = a0x + (a1x - a0x) * s_f;
|
|
529
|
+
const qAy = a0y + (a1y - a0y) * s_f;
|
|
530
|
+
const qAz = a0z + (a1z - a0z) * s_f;
|
|
531
|
+
const qBx = b0x + (b1x - b0x) * t_f;
|
|
532
|
+
const qBy = b0y + (b1y - b0y) * t_f;
|
|
533
|
+
const qBz = b0z + (b1z - b0z) * t_f;
|
|
534
|
+
|
|
535
|
+
const dist = Math.hypot(qAx - qBx, qAy - qBy, qAz - qBz);
|
|
536
|
+
const rA = rA0 + (rA1 - rA0) * s_f;
|
|
537
|
+
const rB = seg_r0[eB] + (seg_r1[eB] - seg_r0[eB]) * t_f;
|
|
538
|
+
const r_req = (rA + rB) * 1.08 + extra_margin;
|
|
539
|
+
const clear = dist - r_req;
|
|
540
|
+
if (clear < min_clear) {
|
|
541
|
+
min_clear = clear;
|
|
542
|
+
}
|
|
543
|
+
}
|
|
544
|
+
return min_clear;
|
|
545
|
+
};
|
|
546
|
+
|
|
547
|
+
for (let q_idx = 0; q_idx < queue.length; q_idx++) {
|
|
548
|
+
const job = queue[q_idx];
|
|
549
|
+
const level = job.level;
|
|
550
|
+
const generator = job.generator;
|
|
551
|
+
const lvl_cfg = species.branches[generator];
|
|
552
|
+
|
|
553
|
+
const phase_hash = rng();
|
|
554
|
+
const N_seg = job.total_segs;
|
|
555
|
+
// Shape is a function of position along the whole branch: envelopes take the genealogical t (cum_t0..cum_t1)
|
|
556
|
+
// and per-step amounts the whole branch's segmentation, so a dead stub bends as the base of its branch did
|
|
557
|
+
const N_shape = job.shape_segs;
|
|
558
|
+
const remaining_segs = N_seg - job.start_seg;
|
|
559
|
+
if (remaining_segs <= 0) continue;
|
|
560
|
+
|
|
561
|
+
const step_len = job.length / N_seg;
|
|
562
|
+
const prof_p0 = lvl_cfg.radius_profile.evaluate(0.0);
|
|
563
|
+
const prof_p1 = lvl_cfg.radius_profile.evaluate(1.0);
|
|
564
|
+
const prof_span = prof_p0 - prof_p1;
|
|
565
|
+
|
|
566
|
+
let cur_px = job.px;
|
|
567
|
+
let cur_py = job.py;
|
|
568
|
+
let cur_pz = job.pz;
|
|
569
|
+
let cur_tx = job.tx;
|
|
570
|
+
let cur_ty = job.ty;
|
|
571
|
+
let cur_tz = job.tz;
|
|
572
|
+
let cur_rx = job.rx;
|
|
573
|
+
let cur_ry = job.ry;
|
|
574
|
+
let cur_rz = job.rz;
|
|
575
|
+
let cur_arc_s = job.initial_arc_s;
|
|
576
|
+
|
|
577
|
+
// Compute binormal S = T x R
|
|
578
|
+
let cur_sx = cur_ty * cur_rz - cur_tz * cur_ry;
|
|
579
|
+
let cur_sy = cur_tz * cur_rx - cur_tx * cur_rz;
|
|
580
|
+
let cur_sz = cur_tx * cur_ry - cur_ty * cur_rx;
|
|
581
|
+
|
|
582
|
+
let prev_v = job.start_vertex;
|
|
583
|
+
let branch_id = -1;
|
|
584
|
+
|
|
585
|
+
if (prev_v < 0) {
|
|
586
|
+
const t0 = job.start_seg / N_seg;
|
|
587
|
+
const u_prof0 = prof_span > 1e-4
|
|
588
|
+
? clamp((prof_p0 - lvl_cfg.radius_profile.evaluate(t0)) / prof_span, 0.0, 1.0)
|
|
589
|
+
: t0;
|
|
590
|
+
const min_r0_frac = level === 0 ? 0.08 : 0.15;
|
|
591
|
+
const r0 = Math.max(0.002, job.base_radius * Math.max(1.0 - lvl_cfg.taper * u_prof0, min_r0_frac));
|
|
592
|
+
|
|
593
|
+
branch_id = out.add_branch(
|
|
594
|
+
0,
|
|
595
|
+
level,
|
|
596
|
+
generator,
|
|
597
|
+
job.parent_branch_id,
|
|
598
|
+
job.parent_edge_id,
|
|
599
|
+
job.parent_attach_t,
|
|
600
|
+
job.length,
|
|
601
|
+
r0,
|
|
602
|
+
phase_hash
|
|
603
|
+
);
|
|
604
|
+
prev_v = out.add_node(
|
|
605
|
+
cur_px, cur_py, cur_pz,
|
|
606
|
+
cur_tx, cur_ty, cur_tz,
|
|
607
|
+
cur_rx, cur_ry, cur_rz,
|
|
608
|
+
r0,
|
|
609
|
+
branch_id,
|
|
610
|
+
level,
|
|
611
|
+
job.parent_branch_id,
|
|
612
|
+
t0,
|
|
613
|
+
cur_arc_s,
|
|
614
|
+
phase_hash
|
|
615
|
+
);
|
|
616
|
+
if (job.attach_parent_vertex !== undefined && job.attach_parent_vertex >= 0) {
|
|
617
|
+
out.connect_nodes(job.attach_parent_vertex, prev_v);
|
|
618
|
+
}
|
|
619
|
+
out.branch_root_vertex[branch_id] = prev_v;
|
|
620
|
+
out.branch_tip_vertex[branch_id] = prev_v;
|
|
621
|
+
} else {
|
|
622
|
+
const prev_r = out.node_read_radius(prev_v);
|
|
623
|
+
branch_id = out.add_branch(
|
|
624
|
+
prev_v,
|
|
625
|
+
level,
|
|
626
|
+
generator,
|
|
627
|
+
job.parent_branch_id,
|
|
628
|
+
job.parent_edge_id,
|
|
629
|
+
job.parent_attach_t,
|
|
630
|
+
job.length,
|
|
631
|
+
prev_r,
|
|
632
|
+
phase_hash
|
|
633
|
+
);
|
|
634
|
+
}
|
|
635
|
+
|
|
636
|
+
branch_parent_seg_idx[branch_id] = job.parent_attach_seg_idx ?? -1;
|
|
637
|
+
branch_is_split_fork[branch_id] = Boolean(job.is_split_fork);
|
|
638
|
+
out.branch_dead[branch_id] = job.dead ? 1 : 0;
|
|
639
|
+
|
|
640
|
+
const branch_edges = [];
|
|
641
|
+
const branch_edge_t0 = [];
|
|
642
|
+
const branch_edge_t1 = [];
|
|
643
|
+
const branch_vertices = [prev_v];
|
|
644
|
+
|
|
645
|
+
// Pre-schedule the phyllotactic child attachments of every outgoing rule so the parent spine kinks
|
|
646
|
+
// sympodially at lateral emissions
|
|
647
|
+
const len_fraction_est = level >= 1
|
|
648
|
+
? clamp(Math.pow(job.length / Math.max(0.2, lvl_cfg.length), 0.85), 0.0, 1.0)
|
|
649
|
+
: 1.0;
|
|
650
|
+
const can_bear_children = !job.dead && job.base_radius >= 0.006 && (level === 0 || job.length >= 0.55);
|
|
651
|
+
const span_fraction_est = job.child_span_fraction ?? Math.max(0.25, (N_seg - job.start_seg) / Math.max(1, N_seg));
|
|
652
|
+
const effective_span = span_fraction_est * len_fraction_est;
|
|
653
|
+
const t_start_est = job.start_seg / N_seg;
|
|
654
|
+
const raw_base_phi = rng() * PI2;
|
|
655
|
+
const scheduled_children = [];
|
|
656
|
+
let has_children = false;
|
|
657
|
+
|
|
658
|
+
const rules = outgoing_rules[generator];
|
|
659
|
+
for (let r = 0; r < rules.length; r++) {
|
|
660
|
+
const rule = rules[r];
|
|
661
|
+
if (rule.count <= 0 || !can_bear_children) continue;
|
|
662
|
+
has_children = true;
|
|
663
|
+
|
|
664
|
+
const planned_child_count = effective_span < 0.99
|
|
665
|
+
? Math.max(1, Math.round(rule.count * effective_span))
|
|
666
|
+
: rule.count;
|
|
667
|
+
const t_lo = Math.max(clamp(rule.attach_min, 0.0, 0.92), t_start_est);
|
|
668
|
+
const t_hi = Math.min(0.968, rule.attach_max);
|
|
669
|
+
const t_cap = Math.min(0.98, rule.attach_max);
|
|
670
|
+
if (t_hi <= t_lo + 1e-3) continue;
|
|
671
|
+
|
|
672
|
+
// Each rule turns its family by the golden angle, so families sharing a stretch of the parent interleave
|
|
673
|
+
let base_phi = raw_base_phi + r * GOLDEN_ANGLE;
|
|
674
|
+
if (
|
|
675
|
+
level >= 1
|
|
676
|
+
&& (rule.phyllotaxis_mode === PhyllotaxisMode.AlternateDistichous
|
|
677
|
+
|| rule.phyllotaxis_mode === PhyllotaxisMode.Opposite)
|
|
678
|
+
) {
|
|
679
|
+
// Align distichous / opposite lateral branching plane with the horizontal plane perpendicular to T
|
|
680
|
+
const horiz_phi = Math.atan2(-cur_ry, cur_sy);
|
|
681
|
+
base_phi = horiz_phi + (raw_base_phi < Math.PI ? 0.0 : Math.PI) + ((raw_base_phi % Math.PI) / Math.PI - 0.5) * 0.28;
|
|
682
|
+
}
|
|
683
|
+
|
|
684
|
+
for (let c = 0; c < planned_child_count; c++) {
|
|
685
|
+
const u_c = rule_node_u(rule, c, planned_child_count, level === 0);
|
|
686
|
+
const t_att = clamp(
|
|
687
|
+
lerp(t_lo, t_hi, clamp(u_c, 0.0, 1.0)) + (rng() - 0.5) * ((t_hi - t_lo) * 0.25 / planned_child_count),
|
|
688
|
+
t_lo,
|
|
689
|
+
t_cap
|
|
690
|
+
);
|
|
691
|
+
|
|
692
|
+
let phi_c = base_phi + rule_node_phi(rule, c);
|
|
693
|
+
if (rule.phyllotaxis_mode === PhyllotaxisMode.FlareLobes) {
|
|
694
|
+
// On a crest of this branch's basal flare lobes, in the same frame the bark mesher shapes them in
|
|
695
|
+
const lobes = Math.max(1, lvl_cfg.flare_lobes | 0);
|
|
696
|
+
const arc_est = job.initial_arc_s + t_att * job.length;
|
|
697
|
+
phi_c = ((c % lobes) * PI2) / lobes - flare_lobe_phase_offset(arc_est, phase_hash);
|
|
698
|
+
}
|
|
699
|
+
phi_c += (rng() * 2.0 - 1.0) * rule.azimuth_jitter;
|
|
700
|
+
scheduled_children.push({ t_attach: t_att, phi: phi_c, rule, age: 0.0, retained: 1.0 });
|
|
701
|
+
}
|
|
702
|
+
|
|
703
|
+
// Self-pruning: below t_lo this crown rule once bore children too, at the same nodes, which died as the
|
|
704
|
+
// crown rose above them and were shed. Age runs from 0 just below the living children to 1 at the stem's
|
|
705
|
+
// base; a branch that died earlier died smaller, (1 - age) of its size today. It keeps
|
|
706
|
+
// (1 - self_pruning) - age of its length as a dead stub, and once that no longer clears the bark it has
|
|
707
|
+
// been grown over, leaving a scar.
|
|
708
|
+
if (rule.crown_envelope && !job.is_split_fork && planned_child_count > 1) {
|
|
709
|
+
const persistence = 1.0 - species.branches[rule.target].self_pruning;
|
|
710
|
+
let t_node = t_lo;
|
|
711
|
+
for (let c = -1; ; c--) {
|
|
712
|
+
const t_dead = lerp(t_lo, t_hi, rule_node_u(rule, c, planned_child_count, level === 0));
|
|
713
|
+
// past the stem's base, or a layout of a single node (one pair, one whorl) that has no 'below'
|
|
714
|
+
if (t_dead <= 0.0 || t_dead > t_node) break;
|
|
715
|
+
t_node = t_dead;
|
|
716
|
+
const age = (t_lo - t_dead) / t_lo;
|
|
717
|
+
const phi_c = base_phi + rule_node_phi(rule, c) + (rng() * 2.0 - 1.0) * rule.azimuth_jitter;
|
|
718
|
+
scheduled_children.push({ t_attach: t_dead, phi: phi_c, rule, age, retained: persistence - age });
|
|
719
|
+
}
|
|
720
|
+
}
|
|
721
|
+
}
|
|
722
|
+
|
|
723
|
+
const k_symp = lvl_cfg.nodal_kink_strength ?? 0.45;
|
|
724
|
+
const zig_base = lvl_cfg.internode_zigzag ?? 0.06;
|
|
725
|
+
const tip_up = lvl_cfg.tip_upcurl ?? 0.18;
|
|
726
|
+
|
|
727
|
+
// Horizontal emergence direction of this branch for outward radial consistency near the trunk centerline
|
|
728
|
+
const emerge_horiz_len = Math.hypot(job.tx, job.tz);
|
|
729
|
+
const emerge_hx = emerge_horiz_len > 1e-4 ? job.tx / emerge_horiz_len : cur_rx;
|
|
730
|
+
const emerge_hz = emerge_horiz_len > 1e-4 ? job.tz / emerge_horiz_len : cur_rz;
|
|
731
|
+
|
|
732
|
+
// heading that straightness pulls back towards: the bud's, re-aimed by a split for the fork that continues
|
|
733
|
+
let aim_x = job.tx;
|
|
734
|
+
let aim_y = job.ty;
|
|
735
|
+
let aim_z = job.tz;
|
|
736
|
+
|
|
737
|
+
for (let s = job.start_seg + 1; s <= N_seg; s++) {
|
|
738
|
+
const t_prev = (s - 1) / N_seg;
|
|
739
|
+
const t_curr = s / N_seg;
|
|
740
|
+
const t_shape = lerp(job.cum_t0, job.cum_t1, t_curr);
|
|
741
|
+
|
|
742
|
+
// 1. Intrinsic S-curve pitch curvature (zero-mean higher harmonic on trunk so trunk weaves rather than leaning)
|
|
743
|
+
let s_wave = level === 0
|
|
744
|
+
? (lvl_cfg.curvature * Math.sin(PI2 * 1.5 * t_shape + phase_hash * PI2))
|
|
745
|
+
: (lvl_cfg.curve_back !== 0.0
|
|
746
|
+
? (lvl_cfg.curvature * Math.cos(Math.PI * t_shape) + lvl_cfg.curve_back * Math.sin(PI2 * t_shape))
|
|
747
|
+
: lvl_cfg.curvature);
|
|
748
|
+
// Attenuate negative (inward-toward-parent) pitch curvature on steep upper-crown insertions
|
|
749
|
+
// so upper lateral branches never curve backward across the parent stem axis.
|
|
750
|
+
if (level >= 1 && s_wave < 0.0 && job.parent_attach_t > 0.60) {
|
|
751
|
+
s_wave *= clamp(1.0 - (job.parent_attach_t - 0.60) * 2.2, 0.15, 1.0);
|
|
752
|
+
}
|
|
753
|
+
const d_pitch = s_wave / Math.max(2, N_shape * 0.65);
|
|
754
|
+
|
|
755
|
+
if (Math.abs(d_pitch) > 1e-6) {
|
|
756
|
+
rotate_around_axis(rot_scratch, cur_tx, cur_ty, cur_tz, cur_sx, cur_sy, cur_sz, d_pitch);
|
|
757
|
+
cur_tx = rot_scratch[0];
|
|
758
|
+
cur_ty = rot_scratch[1];
|
|
759
|
+
cur_tz = rot_scratch[2];
|
|
760
|
+
rotate_around_axis(rot_scratch, cur_rx, cur_ry, cur_rz, cur_sx, cur_sy, cur_sz, d_pitch);
|
|
761
|
+
cur_rx = rot_scratch[0];
|
|
762
|
+
cur_ry = rot_scratch[1];
|
|
763
|
+
cur_rz = rot_scratch[2];
|
|
764
|
+
}
|
|
765
|
+
|
|
766
|
+
// 2. Helical spiral twist around T
|
|
767
|
+
if (Math.abs(lvl_cfg.spiral_twist) > 1e-6) {
|
|
768
|
+
const d_twist = lvl_cfg.spiral_twist / N_shape;
|
|
769
|
+
rotate_around_axis(rot_scratch, cur_rx, cur_ry, cur_rz, cur_tx, cur_ty, cur_tz, d_twist);
|
|
770
|
+
cur_rx = rot_scratch[0];
|
|
771
|
+
cur_ry = rot_scratch[1];
|
|
772
|
+
cur_rz = rot_scratch[2];
|
|
773
|
+
cur_sx = cur_ty * cur_rz - cur_tz * cur_ry;
|
|
774
|
+
cur_sy = cur_tz * cur_rx - cur_tx * cur_rz;
|
|
775
|
+
cur_sz = cur_tx * cur_ry - cur_ty * cur_rx;
|
|
776
|
+
}
|
|
777
|
+
|
|
778
|
+
// 2b. Sympodial Nodal Kinking at scheduled lateral child emissions + Internodal Zig-Zag
|
|
779
|
+
let kink_rx = 0.0;
|
|
780
|
+
let kink_ry = 0.0;
|
|
781
|
+
let kink_rz = 0.0;
|
|
782
|
+
|
|
783
|
+
if (k_symp > 0.0) {
|
|
784
|
+
for (let c = 0; c < scheduled_children.length; c++) {
|
|
785
|
+
const sc = scheduled_children[c];
|
|
786
|
+
if (sc.rule.parent_kink > 0.0 && sc.t_attach >= t_prev && sc.t_attach <= t_curr) {
|
|
787
|
+
// Recoil away from child branch emission azimuth phi
|
|
788
|
+
const c_phi = Math.cos(sc.phi);
|
|
789
|
+
const s_phi = Math.sin(sc.phi);
|
|
790
|
+
const em_x = c_phi * cur_rx + s_phi * cur_sx;
|
|
791
|
+
const em_y = c_phi * cur_ry + s_phi * cur_sy;
|
|
792
|
+
const em_z = c_phi * cur_rz + s_phi * cur_sz;
|
|
793
|
+
const apical_boost = sc.t_attach > 0.85 ? 1.35 : 1.0;
|
|
794
|
+
const recoil = k_symp * sc.rule.parent_kink * (level === 0 ? 0.34 : 0.48) * apical_boost * (0.75 + 0.5 * rng());
|
|
795
|
+
kink_rx -= em_x * recoil;
|
|
796
|
+
kink_ry -= em_y * recoil;
|
|
797
|
+
kink_rz -= em_z * recoil;
|
|
798
|
+
}
|
|
799
|
+
}
|
|
800
|
+
}
|
|
801
|
+
|
|
802
|
+
if (zig_base > 0.0) {
|
|
803
|
+
const z_sign = (s & 1) === 0 ? 1.0 : -1.0;
|
|
804
|
+
const z_phi = phase_hash * PI2 + s * 0.85;
|
|
805
|
+
const zx = Math.cos(z_phi) * cur_rx + Math.sin(z_phi) * cur_sx;
|
|
806
|
+
const zy = Math.cos(z_phi) * cur_ry + Math.sin(z_phi) * cur_sy;
|
|
807
|
+
const zz = Math.cos(z_phi) * cur_rz + Math.sin(z_phi) * cur_sz;
|
|
808
|
+
const z_amp = zig_base * z_sign * (0.7 + 0.6 * rng());
|
|
809
|
+
kink_rx += zx * z_amp;
|
|
810
|
+
kink_ry += zy * z_amp;
|
|
811
|
+
kink_rz += zz * z_amp;
|
|
812
|
+
}
|
|
813
|
+
|
|
814
|
+
const kink_mag = Math.hypot(kink_rx, kink_ry, kink_rz);
|
|
815
|
+
if (kink_mag > 1e-5) {
|
|
816
|
+
const kx = kink_rx / kink_mag;
|
|
817
|
+
const ky = kink_ry / kink_mag;
|
|
818
|
+
const kz = kink_rz / kink_mag;
|
|
819
|
+
// Bend axis = T x K
|
|
820
|
+
let bx = cur_ty * kz - cur_tz * ky;
|
|
821
|
+
let by = cur_tz * kx - cur_tx * kz;
|
|
822
|
+
let bz = cur_tx * ky - cur_ty * kx;
|
|
823
|
+
const b_len = Math.hypot(bx, by, bz);
|
|
824
|
+
if (b_len > 1e-6) {
|
|
825
|
+
bx /= b_len;
|
|
826
|
+
by /= b_len;
|
|
827
|
+
bz /= b_len;
|
|
828
|
+
const clamped_kink = Math.min(0.42, kink_mag);
|
|
829
|
+
rotate_around_axis(rot_scratch, cur_tx, cur_ty, cur_tz, bx, by, bz, clamped_kink);
|
|
830
|
+
cur_tx = rot_scratch[0];
|
|
831
|
+
cur_ty = rot_scratch[1];
|
|
832
|
+
cur_tz = rot_scratch[2];
|
|
833
|
+
rotate_around_axis(rot_scratch, cur_rx, cur_ry, cur_rz, bx, by, bz, clamped_kink);
|
|
834
|
+
cur_rx = rot_scratch[0];
|
|
835
|
+
cur_ry = rot_scratch[1];
|
|
836
|
+
cur_rz = rot_scratch[2];
|
|
837
|
+
cur_sx = cur_ty * cur_rz - cur_tz * cur_ry;
|
|
838
|
+
cur_sy = cur_tz * cur_rx - cur_tx * cur_rz;
|
|
839
|
+
cur_sz = cur_tx * cur_ry - cur_ty * cur_rx;
|
|
840
|
+
}
|
|
841
|
+
}
|
|
842
|
+
|
|
843
|
+
// 3. Biomechanical Tropism steering (Gravitropic sag + Terminal Phototropic Up-Curl + Outward spread)
|
|
844
|
+
let steer_x = 0.0;
|
|
845
|
+
let steer_y = 0.0;
|
|
846
|
+
let steer_z = 0.0;
|
|
847
|
+
|
|
848
|
+
if (level === 0 && branch_id === 0) {
|
|
849
|
+
// Orthotropic upward striving & plumb-line righting reflex along guide curve (default vertical +Y)
|
|
850
|
+
evaluate_trunk_guide(SCRATCH_GUIDE_P0, SCRATCH_GUIDE_T, species.trunk_guide, t_prev, job.length);
|
|
851
|
+
evaluate_trunk_guide(SCRATCH_GUIDE_P1, SCRATCH_GUIDE_T, species.trunk_guide, t_curr, job.length);
|
|
852
|
+
const gtx = SCRATCH_GUIDE_T[0];
|
|
853
|
+
const gty = SCRATCH_GUIDE_T[1];
|
|
854
|
+
const gtz = SCRATCH_GUIDE_T[2];
|
|
855
|
+
|
|
856
|
+
const is_conifer = lvl_cfg.excurrent;
|
|
857
|
+
const apical_relax = (!is_conifer && (t_shape > 0.80 || job.has_split)) ? 0.55 : 1.0;
|
|
858
|
+
const righting = (1.65 + Math.max(0.0, -lvl_cfg.gravitropism) * 2.5 + Math.max(0.0, lvl_cfg.phototropism)) * apical_relax;
|
|
859
|
+
steer_x += gtx * righting;
|
|
860
|
+
steer_y += gty * righting;
|
|
861
|
+
steer_z += gtz * righting;
|
|
862
|
+
|
|
863
|
+
// Plumb-line centering force pulling lateral drift back toward the guide curve
|
|
864
|
+
const dx_g = cur_px - SCRATCH_GUIDE_P0[0];
|
|
865
|
+
const dy_g = cur_py - SCRATCH_GUIDE_P0[1];
|
|
866
|
+
const dz_g = cur_pz - SCRATCH_GUIDE_P0[2];
|
|
867
|
+
const dot_g = dx_g * gtx + dy_g * gty + dz_g * gtz;
|
|
868
|
+
const lat_x = dx_g - dot_g * gtx;
|
|
869
|
+
const lat_y = dy_g - dot_g * gty;
|
|
870
|
+
const lat_z = dz_g - dot_g * gtz;
|
|
871
|
+
const plumb_k = ((is_conifer ? 5.2 : 3.4) * apical_relax) / Math.max(1.0, job.length);
|
|
872
|
+
steer_x -= lat_x * plumb_k * N_seg * 0.5;
|
|
873
|
+
steer_y -= lat_y * plumb_k * N_seg * 0.5;
|
|
874
|
+
steer_z -= lat_z * plumb_k * N_seg * 0.5;
|
|
875
|
+
} else if (level === 0 && branch_id > 0) {
|
|
876
|
+
// Secondary bifurcated trunk leader (fork): ascend skyward while preserving fork divergence
|
|
877
|
+
steer_x += emerge_hx * 0.35;
|
|
878
|
+
steer_y += 1.25 + Math.max(0.0, lvl_cfg.phototropism);
|
|
879
|
+
steer_z += emerge_hz * 0.35;
|
|
880
|
+
} else {
|
|
881
|
+
if (lvl_cfg.gravitropism !== 0.0 || tip_up !== 0.0) {
|
|
882
|
+
// Continuous blend from cantilever mid-branch sag arch (sin(pi * t^0.75)) to
|
|
883
|
+
// pendulous weeping cascade (0.65 + 0.95 * t) based on gravitropism vs. tip_upcurl
|
|
884
|
+
const w_pendulous = level >= 2
|
|
885
|
+
? clamp((lvl_cfg.gravitropism - 0.35 - 0.5 * Math.max(0.0, tip_up)) / 0.45, 0.0, 1.0)
|
|
886
|
+
: 0.0;
|
|
887
|
+
const arch_grav_env = Math.sin(Math.PI * Math.pow(t_shape, 0.75));
|
|
888
|
+
const weep_grav_env = 0.65 + 0.95 * t_shape;
|
|
889
|
+
const grav_env = lerp(arch_grav_env, weep_grav_env, w_pendulous);
|
|
890
|
+
const apical_grav_atten = level === 1 && job.parent_attach_t > 0.75 && w_pendulous < 0.1
|
|
891
|
+
? clamp(1.0 - (job.parent_attach_t - 0.75) * 3.2, 0.15, 1.0)
|
|
892
|
+
: 1.0;
|
|
893
|
+
const up_env = t_shape * t_shape * (1.0 + 0.5 * Math.max(0.0, -cur_ty));
|
|
894
|
+
steer_y += -lvl_cfg.gravitropism * grav_env * apical_grav_atten + tip_up * up_env;
|
|
895
|
+
}
|
|
896
|
+
|
|
897
|
+
if (lvl_cfg.phototropism !== 0.0) {
|
|
898
|
+
const sky_mix = crown.sky_phototropism_mix;
|
|
899
|
+
const horiz_r = Math.sqrt(cur_px * cur_px + cur_pz * cur_pz);
|
|
900
|
+
let out_x = 0.0;
|
|
901
|
+
let out_z = 0.0;
|
|
902
|
+
if (horiz_r > 0.52) {
|
|
903
|
+
out_x = cur_px / horiz_r;
|
|
904
|
+
out_z = cur_pz / horiz_r;
|
|
905
|
+
} else if (horiz_r > 1e-4) {
|
|
906
|
+
const w_rad = horiz_r / 0.52;
|
|
907
|
+
const bx = lerp(emerge_hx, cur_px / horiz_r, w_rad);
|
|
908
|
+
const bz = lerp(emerge_hz, cur_pz / horiz_r, w_rad);
|
|
909
|
+
const bl = Math.hypot(bx, bz) || 1.0;
|
|
910
|
+
out_x = bx / bl;
|
|
911
|
+
out_z = bz / bl;
|
|
912
|
+
} else {
|
|
913
|
+
out_x = emerge_hx;
|
|
914
|
+
out_z = emerge_hz;
|
|
915
|
+
}
|
|
916
|
+
|
|
917
|
+
steer_x += lvl_cfg.phototropism * (1.0 - sky_mix) * out_x;
|
|
918
|
+
steer_y += lvl_cfg.phototropism * sky_mix;
|
|
919
|
+
steer_z += lvl_cfg.phototropism * (1.0 - sky_mix) * out_z;
|
|
920
|
+
}
|
|
921
|
+
}
|
|
922
|
+
|
|
923
|
+
// 4. 2-Octave 3D Curl Noise gnarl scaled properly by sqrt(6 / N_seg)
|
|
924
|
+
if (lvl_cfg.gnarl_strength > 0.0) {
|
|
925
|
+
const freq = lvl_cfg.gnarl_frequency;
|
|
926
|
+
curl_noise_3d(
|
|
927
|
+
SCRATCH_CURL,
|
|
928
|
+
cur_px * freq + noise_ox + level * 17.3,
|
|
929
|
+
cur_py * freq + noise_oy + level * 31.7,
|
|
930
|
+
cur_pz * freq + noise_oz + level * 47.1
|
|
931
|
+
);
|
|
932
|
+
const c1x = SCRATCH_CURL[0], c1y = SCRATCH_CURL[1], c1z = SCRATCH_CURL[2];
|
|
933
|
+
curl_noise_3d(
|
|
934
|
+
SCRATCH_CURL,
|
|
935
|
+
cur_px * freq * 2.15 + noise_ox + 53.1 + phase_hash * 29.3,
|
|
936
|
+
cur_py * freq * 2.15 + noise_oy + 79.3,
|
|
937
|
+
cur_pz * freq * 2.15 + noise_oz + 113.7
|
|
938
|
+
);
|
|
939
|
+
const cx_tot = 0.68 * c1x + 0.32 * SCRATCH_CURL[0];
|
|
940
|
+
const cy_tot = 0.68 * c1y + 0.32 * SCRATCH_CURL[1];
|
|
941
|
+
const cz_tot = 0.68 * c1z + 0.32 * SCRATCH_CURL[2];
|
|
942
|
+
|
|
943
|
+
const gnarl_scale = lvl_cfg.gnarl_strength * Math.sqrt(6.0 / Math.max(2, N_shape));
|
|
944
|
+
// Project curl vector perpendicular to T so it steers direction cleanly
|
|
945
|
+
const dot_ct = cx_tot * cur_tx + cy_tot * cur_ty + cz_tot * cur_tz;
|
|
946
|
+
steer_x += (cx_tot - dot_ct * cur_tx) * gnarl_scale * 2.2;
|
|
947
|
+
steer_y += (cy_tot - dot_ct * cur_ty) * gnarl_scale * 1.6;
|
|
948
|
+
steer_z += (cz_tot - dot_ct * cur_tz) * gnarl_scale * 2.2;
|
|
949
|
+
}
|
|
950
|
+
|
|
951
|
+
// 4b. A plagiotropic shoot is pulled towards the horizontal; straightness pulls back towards the bud's heading
|
|
952
|
+
if (level >= 1 && lvl_cfg.plagiotropism > 0.0) {
|
|
953
|
+
steer_y -= lvl_cfg.plagiotropism * cur_ty;
|
|
954
|
+
}
|
|
955
|
+
if (lvl_cfg.straightness > 0.0 && !(level === 0 && branch_id === 0)) {
|
|
956
|
+
steer_x += lvl_cfg.straightness * (aim_x - cur_tx);
|
|
957
|
+
steer_y += lvl_cfg.straightness * (aim_y - cur_ty);
|
|
958
|
+
steer_z += lvl_cfg.straightness * (aim_z - cur_tz);
|
|
959
|
+
}
|
|
960
|
+
|
|
961
|
+
// 5. Space colonization attraction steering (for branches in crown, level >= 1)
|
|
962
|
+
if (use_space_col && level >= 1 && job.in_crown && attr_grid !== null) {
|
|
963
|
+
let attr_vx = 0.0;
|
|
964
|
+
let attr_vy = 0.0;
|
|
965
|
+
let attr_vz = 0.0;
|
|
966
|
+
let attr_hits = 0;
|
|
967
|
+
|
|
968
|
+
attr_grid.forEachNear(cur_px, cur_py, cur_pz, (idx) => {
|
|
969
|
+
if (attr_alive[idx] === 0) return;
|
|
970
|
+
const ax = attr_positions[idx * 3] - cur_px;
|
|
971
|
+
const ay = attr_positions[idx * 3 + 1] - cur_py;
|
|
972
|
+
const az = attr_positions[idx * 3 + 2] - cur_pz;
|
|
973
|
+
const d2 = ax * ax + ay * ay + az * az;
|
|
974
|
+
if (d2 <= r_kill_sq) {
|
|
975
|
+
attr_alive[idx] = 0;
|
|
976
|
+
} else if (d2 <= r_influence_sq && d2 > 1e-8) {
|
|
977
|
+
const inv_d = 1.0 / Math.sqrt(d2);
|
|
978
|
+
attr_vx += ax * inv_d;
|
|
979
|
+
attr_vy += ay * inv_d;
|
|
980
|
+
attr_vz += az * inv_d;
|
|
981
|
+
attr_hits++;
|
|
982
|
+
}
|
|
983
|
+
});
|
|
984
|
+
|
|
985
|
+
if (attr_hits > 0) {
|
|
986
|
+
const attr_len = Math.sqrt(attr_vx * attr_vx + attr_vy * attr_vy + attr_vz * attr_vz);
|
|
987
|
+
if (attr_len > 1e-6) {
|
|
988
|
+
const w_sc = crown.space_colonization_weight / attr_len;
|
|
989
|
+
steer_x += attr_vx * w_sc;
|
|
990
|
+
steer_y += attr_vy * w_sc;
|
|
991
|
+
steer_z += attr_vz * w_sc;
|
|
992
|
+
}
|
|
993
|
+
}
|
|
994
|
+
}
|
|
995
|
+
|
|
996
|
+
// 6. Crown envelope soft containment for lateral branches (level >= 1)
|
|
997
|
+
let seg_len = step_len;
|
|
998
|
+
if (level >= 1 && job.in_crown && crown.prune_ratio > 0.0) {
|
|
999
|
+
const probe_x = cur_px + cur_tx * step_len;
|
|
1000
|
+
const probe_y = cur_py + cur_ty * step_len;
|
|
1001
|
+
const probe_z = cur_pz + cur_tz * step_len;
|
|
1002
|
+
const sdf = crown_envelope_sdf(probe_x, probe_y, probe_z, crown);
|
|
1003
|
+
if (sdf > 0.0) {
|
|
1004
|
+
// Steer radially inward toward trunk axis (only pulling vertically if outside vertical crown span)
|
|
1005
|
+
const crown_top_y = crown.base_height + crown.height;
|
|
1006
|
+
const to_cx = -probe_x;
|
|
1007
|
+
const to_cy = probe_y > crown_top_y
|
|
1008
|
+
? crown_top_y - probe_y
|
|
1009
|
+
: (probe_y < crown.base_height ? crown.base_height - probe_y : 0.0);
|
|
1010
|
+
const to_cz = -probe_z;
|
|
1011
|
+
const to_c_len = Math.sqrt(to_cx * to_cx + to_cy * to_cy + to_cz * to_cz);
|
|
1012
|
+
if (to_c_len > 1e-5) {
|
|
1013
|
+
const pull = crown.prune_ratio * 0.45 / to_c_len;
|
|
1014
|
+
steer_x += to_cx * pull;
|
|
1015
|
+
steer_y += to_cy * pull;
|
|
1016
|
+
steer_z += to_cz * pull;
|
|
1017
|
+
}
|
|
1018
|
+
seg_len *= Math.max(0.35, 1.0 - crown.prune_ratio * 0.5);
|
|
1019
|
+
}
|
|
1020
|
+
}
|
|
1021
|
+
|
|
1022
|
+
// Compute target radius r_curr for this segment before BVH collision checks
|
|
1023
|
+
const t_spine = t_shape;
|
|
1024
|
+
const u_prof = prof_span > 1e-4
|
|
1025
|
+
? clamp((prof_p0 - lvl_cfg.radius_profile.evaluate(t_spine)) / prof_span, 0.0, 1.0)
|
|
1026
|
+
: t_spine;
|
|
1027
|
+
const min_tip_frac = level === 0 ? 0.12 : (has_children ? 0.14 : 0.24);
|
|
1028
|
+
const apical_shoot_taper = level === 0
|
|
1029
|
+
? (t_spine > 0.65 ? lerp(1.0, 0.11, Math.pow((t_spine - 0.65) / 0.35, 1.45)) : 1.0)
|
|
1030
|
+
: (has_children && t_curr > 0.80 ? lerp(1.0, 0.62, Math.pow((t_curr - 0.80) / 0.20, 1.35)) : 1.0);
|
|
1031
|
+
const r_curr = Math.max(
|
|
1032
|
+
level === 0 ? 0.0015 : 0.002,
|
|
1033
|
+
job.base_radius * Math.max(1.0 - lvl_cfg.taper * u_prof, min_tip_frac) * apical_shoot_taper
|
|
1034
|
+
);
|
|
1035
|
+
const r_prev = out.node_read_radius(prev_v);
|
|
1036
|
+
const local_seg_idx = branch_edges.length;
|
|
1037
|
+
const parent_bA = job.parent_branch_id;
|
|
1038
|
+
const attach_seg_A = job.parent_attach_seg_idx ?? -1;
|
|
1039
|
+
const is_split_A = Boolean(job.is_split_fork);
|
|
1040
|
+
|
|
1041
|
+
// 6b. Soft BVH Repulsion Field (steers growing shoot smoothly around nearby existing branches)
|
|
1042
|
+
if ((level >= 1 || branch_id > 0) && bvh.size > 0) {
|
|
1043
|
+
const look_len = seg_len * 1.55;
|
|
1044
|
+
const look_x = cur_px + cur_tx * look_len;
|
|
1045
|
+
const look_y = cur_py + cur_ty * look_len;
|
|
1046
|
+
const look_z = cur_pz + cur_tz * look_len;
|
|
1047
|
+
const soft_margin = Math.max(0.08, Math.min(0.24, seg_len * 0.65));
|
|
1048
|
+
|
|
1049
|
+
query_capsule[0] = cur_px;
|
|
1050
|
+
query_capsule[1] = cur_py;
|
|
1051
|
+
query_capsule[2] = cur_pz;
|
|
1052
|
+
query_capsule[3] = look_x;
|
|
1053
|
+
query_capsule[4] = look_y;
|
|
1054
|
+
query_capsule[5] = look_z;
|
|
1055
|
+
query_capsule[6] = Math.max(r_prev, r_curr) * 1.15 + soft_margin;
|
|
1056
|
+
|
|
1057
|
+
const hit_count = bvh_query_user_data_intersects_capsule(bvh_hits, 0, bvh, query_capsule);
|
|
1058
|
+
for (let h = 0; h < hit_count; h++) {
|
|
1059
|
+
const eB = bvh_hits[h];
|
|
1060
|
+
const bB = seg_branch_id[eB];
|
|
1061
|
+
const local_idx_B = seg_local_idx[eB];
|
|
1062
|
+
if (!resolve_subsegment_bounds(
|
|
1063
|
+
branch_id, parent_bA, attach_seg_A, is_split_A, local_seg_idx,
|
|
1064
|
+
bB, out.branch_parent[bB], branch_parent_seg_idx[bB], branch_is_split_fork[bB], local_idx_B,
|
|
1065
|
+
sub_bounds
|
|
1066
|
+
)) {
|
|
1067
|
+
continue;
|
|
1068
|
+
}
|
|
1069
|
+
|
|
1070
|
+
const s_min = sub_bounds[0];
|
|
1071
|
+
const t_min = sub_bounds[1];
|
|
1072
|
+
const sa0x = cur_px + (look_x - cur_px) * s_min;
|
|
1073
|
+
const sa0y = cur_py + (look_y - cur_py) * s_min;
|
|
1074
|
+
const sa0z = cur_pz + (look_z - cur_pz) * s_min;
|
|
1075
|
+
|
|
1076
|
+
const b0x = seg_p0x[eB], b0y = seg_p0y[eB], b0z = seg_p0z[eB];
|
|
1077
|
+
const b1x = seg_p1x[eB], b1y = seg_p1y[eB], b1z = seg_p1z[eB];
|
|
1078
|
+
const sb0x = b0x + (b1x - b0x) * t_min;
|
|
1079
|
+
const sb0y = b0y + (b1y - b0y) * t_min;
|
|
1080
|
+
const sb0z = b0z + (b1z - b0z) * t_min;
|
|
1081
|
+
|
|
1082
|
+
line3_compute_segment_segment_closest_points(
|
|
1083
|
+
closest_st,
|
|
1084
|
+
sa0x, sa0y, sa0z, look_x, look_y, look_z,
|
|
1085
|
+
sb0x, sb0y, sb0z, b1x, b1y, b1z
|
|
1086
|
+
);
|
|
1087
|
+
|
|
1088
|
+
const s_f = s_min + (1.0 - s_min) * closest_st[0];
|
|
1089
|
+
const t_f = t_min + (1.0 - t_min) * closest_st[1];
|
|
1090
|
+
|
|
1091
|
+
const qAx = cur_px + (look_x - cur_px) * s_f;
|
|
1092
|
+
const qAy = cur_py + (look_y - cur_py) * s_f;
|
|
1093
|
+
const qAz = cur_pz + (look_z - cur_pz) * s_f;
|
|
1094
|
+
const qBx = b0x + (b1x - b0x) * t_f;
|
|
1095
|
+
const qBy = b0y + (b1y - b0y) * t_f;
|
|
1096
|
+
const qBz = b0z + (b1z - b0z) * t_f;
|
|
1097
|
+
|
|
1098
|
+
const dx = qAx - qBx;
|
|
1099
|
+
const dy = qAy - qBy;
|
|
1100
|
+
const dz = qAz - qBz;
|
|
1101
|
+
const dist = Math.hypot(dx, dy, dz);
|
|
1102
|
+
const rA = r_prev + (r_curr - r_prev) * Math.min(1.0, s_f);
|
|
1103
|
+
const rB = seg_r0[eB] + (seg_r1[eB] - seg_r0[eB]) * t_f;
|
|
1104
|
+
const r_req = (rA + rB) * 1.12 + 0.005;
|
|
1105
|
+
|
|
1106
|
+
if (dist < r_req + soft_margin) {
|
|
1107
|
+
let nx = dist > 1e-5 ? dx / dist : cur_rx;
|
|
1108
|
+
let ny = dist > 1e-5 ? dy / dist : cur_ry;
|
|
1109
|
+
let nz = dist > 1e-5 ? dz / dist : cur_rz;
|
|
1110
|
+
// Project repulsion normal perpendicular to cur_T so it steers smoothly around the obstacle
|
|
1111
|
+
const dot_nt = nx * cur_tx + ny * cur_ty + nz * cur_tz;
|
|
1112
|
+
nx -= dot_nt * cur_tx;
|
|
1113
|
+
ny -= dot_nt * cur_ty;
|
|
1114
|
+
nz -= dot_nt * cur_tz;
|
|
1115
|
+
const n_len = Math.hypot(nx, ny, nz);
|
|
1116
|
+
if (n_len > 1e-5) {
|
|
1117
|
+
nx /= n_len;
|
|
1118
|
+
ny /= n_len;
|
|
1119
|
+
nz /= n_len;
|
|
1120
|
+
const u_prox = clamp(1.0 - Math.max(0.0, dist - r_req) / soft_margin, 0.0, 1.0);
|
|
1121
|
+
const rep_w = u_prox * u_prox * 2.8;
|
|
1122
|
+
steer_x += nx * rep_w;
|
|
1123
|
+
steer_y += ny * rep_w;
|
|
1124
|
+
steer_z += nz * rep_w;
|
|
1125
|
+
}
|
|
1126
|
+
}
|
|
1127
|
+
}
|
|
1128
|
+
}
|
|
1129
|
+
|
|
1130
|
+
// Apply steering to tangent and normalize
|
|
1131
|
+
const steer_div = Math.max(2.0, Math.sqrt(N_shape) * 1.35);
|
|
1132
|
+
let next_tx = cur_tx + steer_x / steer_div;
|
|
1133
|
+
let next_ty = cur_ty + steer_y / steer_div;
|
|
1134
|
+
let next_tz = cur_tz + steer_z / steer_div;
|
|
1135
|
+
const t_len = Math.sqrt(next_tx * next_tx + next_ty * next_ty + next_tz * next_tz);
|
|
1136
|
+
if (t_len > 1e-12) {
|
|
1137
|
+
next_tx /= t_len;
|
|
1138
|
+
next_ty /= t_len;
|
|
1139
|
+
next_tz /= t_len;
|
|
1140
|
+
} else {
|
|
1141
|
+
next_tx = cur_tx;
|
|
1142
|
+
next_ty = cur_ty;
|
|
1143
|
+
next_tz = cur_tz;
|
|
1144
|
+
}
|
|
1145
|
+
|
|
1146
|
+
let next_px = cur_px + 0.5 * (cur_tx + next_tx) * seg_len;
|
|
1147
|
+
let next_py = cur_py + 0.5 * (cur_ty + next_ty) * seg_len;
|
|
1148
|
+
let next_pz = cur_pz + 0.5 * (cur_tz + next_tz) * seg_len;
|
|
1149
|
+
|
|
1150
|
+
// Orthotropic plumb-tube containment on trunk (level === 0):
|
|
1151
|
+
// Preserves local 3D nodal kinks and serpentine sweep while guaranteeing the trunk never drifts sideways
|
|
1152
|
+
if (level === 0 && branch_id === 0) {
|
|
1153
|
+
const gx = SCRATCH_GUIDE_P1[0];
|
|
1154
|
+
const gy = SCRATCH_GUIDE_P1[1];
|
|
1155
|
+
const gz = SCRATCH_GUIDE_P1[2];
|
|
1156
|
+
const gtx = SCRATCH_GUIDE_T[0];
|
|
1157
|
+
const gty = SCRATCH_GUIDE_T[1];
|
|
1158
|
+
const gtz = SCRATCH_GUIDE_T[2];
|
|
1159
|
+
|
|
1160
|
+
const dx = next_px - gx;
|
|
1161
|
+
const dy = next_py - gy;
|
|
1162
|
+
const dz = next_pz - gz;
|
|
1163
|
+
const dot_g = dx * gtx + dy * gty + dz * gtz;
|
|
1164
|
+
const off_x = dx - dot_g * gtx;
|
|
1165
|
+
const off_y = dy - dot_g * gty;
|
|
1166
|
+
const off_z = dz - dot_g * gtz;
|
|
1167
|
+
const off_r = Math.hypot(off_x, off_y, off_z);
|
|
1168
|
+
|
|
1169
|
+
const is_conifer = lvl_cfg.excurrent;
|
|
1170
|
+
const max_drift_frac = is_conifer ? 0.032 : (job.has_split ? 0.078 : 0.058);
|
|
1171
|
+
// Envelope rises from 0 at root, peaks in mid-trunk (allowing 3D sweep/crookedness), and tapers near tip
|
|
1172
|
+
const env = Math.sin(Math.PI * Math.min(0.92, t_curr * 0.88)) * (1.0 - 0.38 * t_curr * t_curr);
|
|
1173
|
+
const max_r = job.length * max_drift_frac * Math.max(job.has_split ? 0.42 : 0.18, env);
|
|
1174
|
+
|
|
1175
|
+
if (off_r > max_r && off_r > 1e-6) {
|
|
1176
|
+
const scale_r = max_r / off_r;
|
|
1177
|
+
next_px = gx + dot_g * gtx + off_x * scale_r;
|
|
1178
|
+
next_py = gy + dot_g * gty + off_y * scale_r;
|
|
1179
|
+
next_pz = gz + dot_g * gtz + off_z * scale_r;
|
|
1180
|
+
|
|
1181
|
+
let ch_x = next_px - cur_px;
|
|
1182
|
+
let ch_y = next_py - cur_py;
|
|
1183
|
+
let ch_z = next_pz - cur_pz;
|
|
1184
|
+
const ch_l = Math.hypot(ch_x, ch_y, ch_z);
|
|
1185
|
+
if (ch_l > 1e-6) {
|
|
1186
|
+
next_tx = ch_x / ch_l;
|
|
1187
|
+
next_ty = ch_y / ch_l;
|
|
1188
|
+
next_tz = ch_z / ch_l;
|
|
1189
|
+
}
|
|
1190
|
+
}
|
|
1191
|
+
}
|
|
1192
|
+
|
|
1193
|
+
// 6c. Monotonic Parent Collar Escape + Hard BVH Capsule Contact Projection & Self-Pruning
|
|
1194
|
+
if ((level >= 1 || branch_id > 0) && bvh.size > 0) {
|
|
1195
|
+
let was_projected = false;
|
|
1196
|
+
|
|
1197
|
+
// Ensure lateral child branch exits its parent attachment segment cleanly on local_seg_idx <= 1
|
|
1198
|
+
if (job.parent_edge_id >= 0 && !is_split_A && local_seg_idx <= 1) {
|
|
1199
|
+
const eP = job.parent_edge_id;
|
|
1200
|
+
const p0x = seg_p0x[eP], p0y = seg_p0y[eP], p0z = seg_p0z[eP];
|
|
1201
|
+
const p1x = seg_p1x[eP], p1y = seg_p1y[eP], p1z = seg_p1z[eP];
|
|
1202
|
+
|
|
1203
|
+
line3_compute_segment_segment_closest_points(
|
|
1204
|
+
closest_st,
|
|
1205
|
+
next_px, next_py, next_pz, next_px, next_py, next_pz,
|
|
1206
|
+
p0x, p0y, p0z, p1x, p1y, p1z
|
|
1207
|
+
);
|
|
1208
|
+
const t_p = closest_st[1];
|
|
1209
|
+
const qPx = p0x + (p1x - p0x) * t_p;
|
|
1210
|
+
const qPy = p0y + (p1y - p0y) * t_p;
|
|
1211
|
+
const qPz = p0z + (p1z - p0z) * t_p;
|
|
1212
|
+
const r_p = seg_r0[eP] + (seg_r1[eP] - seg_r0[eP]) * t_p;
|
|
1213
|
+
|
|
1214
|
+
let rx_p = next_px - qPx;
|
|
1215
|
+
let ry_p = next_py - qPy;
|
|
1216
|
+
let rz_p = next_pz - qPz;
|
|
1217
|
+
const d_p = Math.hypot(rx_p, ry_p, rz_p);
|
|
1218
|
+
if (local_seg_idx === 0 && (r_p + r_curr) * 1.18 > seg_len) {
|
|
1219
|
+
seg_len = (r_p + r_curr) * 1.18;
|
|
1220
|
+
}
|
|
1221
|
+
const min_d_p = local_seg_idx === 0
|
|
1222
|
+
? Math.min(seg_len * 0.88, (r_p + r_curr) * 1.05)
|
|
1223
|
+
: (r_p + r_curr) * 1.10 + 0.004;
|
|
1224
|
+
|
|
1225
|
+
const em_drx = job.emerge_drx ?? cur_rx;
|
|
1226
|
+
const em_dry = job.emerge_dry ?? cur_ry;
|
|
1227
|
+
const em_drz = job.emerge_drz ?? cur_rz;
|
|
1228
|
+
const dot_em = rx_p * em_drx + ry_p * em_dry + rz_p * em_drz;
|
|
1229
|
+
|
|
1230
|
+
if (d_p < min_d_p || dot_em < 0.0) {
|
|
1231
|
+
const ux_p = (d_p > 1e-5 && dot_em > 0.0) ? rx_p / d_p : em_drx;
|
|
1232
|
+
const uy_p = (d_p > 1e-5 && dot_em > 0.0) ? ry_p / d_p : em_dry;
|
|
1233
|
+
const uz_p = (d_p > 1e-5 && dot_em > 0.0) ? rz_p / d_p : em_drz;
|
|
1234
|
+
const push_d = Math.max(0.0, min_d_p - (dot_em > 0.0 ? d_p : -d_p));
|
|
1235
|
+
next_px += ux_p * push_d;
|
|
1236
|
+
next_py += uy_p * push_d;
|
|
1237
|
+
next_pz += uz_p * push_d;
|
|
1238
|
+
|
|
1239
|
+
let ch_x = next_px - cur_px;
|
|
1240
|
+
let ch_y = next_py - cur_py;
|
|
1241
|
+
let ch_z = next_pz - cur_pz;
|
|
1242
|
+
const ch_l = Math.hypot(ch_x, ch_y, ch_z);
|
|
1243
|
+
if (ch_l > 1e-6) {
|
|
1244
|
+
next_tx = ch_x / ch_l;
|
|
1245
|
+
next_ty = ch_y / ch_l;
|
|
1246
|
+
next_tz = ch_z / ch_l;
|
|
1247
|
+
next_px = cur_px + next_tx * seg_len;
|
|
1248
|
+
next_py = cur_py + next_ty * seg_len;
|
|
1249
|
+
next_pz = cur_pz + next_tz * seg_len;
|
|
1250
|
+
was_projected = true;
|
|
1251
|
+
}
|
|
1252
|
+
}
|
|
1253
|
+
}
|
|
1254
|
+
|
|
1255
|
+
// Iterative BVH capsule contact projection
|
|
1256
|
+
for (let iter = 0; iter < 4; iter++) {
|
|
1257
|
+
query_capsule[0] = cur_px;
|
|
1258
|
+
query_capsule[1] = cur_py;
|
|
1259
|
+
query_capsule[2] = cur_pz;
|
|
1260
|
+
query_capsule[3] = next_px;
|
|
1261
|
+
query_capsule[4] = next_py;
|
|
1262
|
+
query_capsule[5] = next_pz;
|
|
1263
|
+
query_capsule[6] = Math.max(r_prev, r_curr) * 1.15 + 0.025;
|
|
1264
|
+
|
|
1265
|
+
const hit_count = bvh_query_user_data_intersects_capsule(bvh_hits, 0, bvh, query_capsule);
|
|
1266
|
+
let moved = false;
|
|
1267
|
+
|
|
1268
|
+
for (let h = 0; h < hit_count; h++) {
|
|
1269
|
+
const eB = bvh_hits[h];
|
|
1270
|
+
const bB = seg_branch_id[eB];
|
|
1271
|
+
const local_idx_B = seg_local_idx[eB];
|
|
1272
|
+
if (!resolve_subsegment_bounds(
|
|
1273
|
+
branch_id, parent_bA, attach_seg_A, is_split_A, local_seg_idx,
|
|
1274
|
+
bB, out.branch_parent[bB], branch_parent_seg_idx[bB], branch_is_split_fork[bB], local_idx_B,
|
|
1275
|
+
sub_bounds
|
|
1276
|
+
)) {
|
|
1277
|
+
continue;
|
|
1278
|
+
}
|
|
1279
|
+
|
|
1280
|
+
const s_min = sub_bounds[0];
|
|
1281
|
+
const t_min = sub_bounds[1];
|
|
1282
|
+
const sa0x = cur_px + (next_px - cur_px) * s_min;
|
|
1283
|
+
const sa0y = cur_py + (next_py - cur_py) * s_min;
|
|
1284
|
+
const sa0z = cur_pz + (next_pz - cur_pz) * s_min;
|
|
1285
|
+
|
|
1286
|
+
const b0x = seg_p0x[eB], b0y = seg_p0y[eB], b0z = seg_p0z[eB];
|
|
1287
|
+
const b1x = seg_p1x[eB], b1y = seg_p1y[eB], b1z = seg_p1z[eB];
|
|
1288
|
+
const sb0x = b0x + (b1x - b0x) * t_min;
|
|
1289
|
+
const sb0y = b0y + (b1y - b0y) * t_min;
|
|
1290
|
+
const sb0z = b0z + (b1z - b0z) * t_min;
|
|
1291
|
+
|
|
1292
|
+
line3_compute_segment_segment_closest_points(
|
|
1293
|
+
closest_st,
|
|
1294
|
+
sa0x, sa0y, sa0z, next_px, next_py, next_pz,
|
|
1295
|
+
sb0x, sb0y, sb0z, b1x, b1y, b1z
|
|
1296
|
+
);
|
|
1297
|
+
|
|
1298
|
+
const s_f = s_min + (1.0 - s_min) * closest_st[0];
|
|
1299
|
+
const t_f = t_min + (1.0 - t_min) * closest_st[1];
|
|
1300
|
+
if (local_seg_idx === 0 && s_f <= 0.05) continue;
|
|
1301
|
+
|
|
1302
|
+
const qAx = cur_px + (next_px - cur_px) * s_f;
|
|
1303
|
+
const qAy = cur_py + (next_py - cur_py) * s_f;
|
|
1304
|
+
const qAz = cur_pz + (next_pz - cur_pz) * s_f;
|
|
1305
|
+
const qBx = b0x + (b1x - b0x) * t_f;
|
|
1306
|
+
const qBy = b0y + (b1y - b0y) * t_f;
|
|
1307
|
+
const qBz = b0z + (b1z - b0z) * t_f;
|
|
1308
|
+
|
|
1309
|
+
const dx = qAx - qBx;
|
|
1310
|
+
const dy = qAy - qBy;
|
|
1311
|
+
const dz = qAz - qBz;
|
|
1312
|
+
const dist = Math.hypot(dx, dy, dz);
|
|
1313
|
+
const rA = r_prev + (r_curr - r_prev) * s_f;
|
|
1314
|
+
const rB = seg_r0[eB] + (seg_r1[eB] - seg_r0[eB]) * t_f;
|
|
1315
|
+
const r_req = (rA + rB) * 1.08 + 0.004;
|
|
1316
|
+
|
|
1317
|
+
if (dist < r_req) {
|
|
1318
|
+
let nx = dist > 1e-5 ? dx / dist : cur_rx;
|
|
1319
|
+
let ny = dist > 1e-5 ? dy / dist : cur_ry;
|
|
1320
|
+
let nz = dist > 1e-5 ? dz / dist : cur_rz;
|
|
1321
|
+
const push = (r_req - dist + 0.004) / Math.max(0.35, s_f);
|
|
1322
|
+
next_px += nx * push;
|
|
1323
|
+
next_py += ny * push;
|
|
1324
|
+
next_pz += nz * push;
|
|
1325
|
+
|
|
1326
|
+
let ch_x = next_px - cur_px;
|
|
1327
|
+
let ch_y = next_py - cur_py;
|
|
1328
|
+
let ch_z = next_pz - cur_pz;
|
|
1329
|
+
const ch_l = Math.hypot(ch_x, ch_y, ch_z);
|
|
1330
|
+
if (ch_l > 1e-6) {
|
|
1331
|
+
next_tx = ch_x / ch_l;
|
|
1332
|
+
next_ty = ch_y / ch_l;
|
|
1333
|
+
next_tz = ch_z / ch_l;
|
|
1334
|
+
next_px = cur_px + next_tx * seg_len;
|
|
1335
|
+
next_py = cur_py + next_ty * seg_len;
|
|
1336
|
+
next_pz = cur_pz + next_tz * seg_len;
|
|
1337
|
+
moved = true;
|
|
1338
|
+
was_projected = true;
|
|
1339
|
+
}
|
|
1340
|
+
}
|
|
1341
|
+
}
|
|
1342
|
+
if (!moved) break;
|
|
1343
|
+
}
|
|
1344
|
+
|
|
1345
|
+
// If segment >= 1 still penetrates an existing branch or was forced into an unnatural sharp reversal,
|
|
1346
|
+
// self-prune / arrest the branch at prev_v so it never spears through another bough.
|
|
1347
|
+
if (local_seg_idx >= 1) {
|
|
1348
|
+
const final_clear = evaluate_candidate_clearance(
|
|
1349
|
+
branch_id, parent_bA, attach_seg_A, is_split_A, local_seg_idx,
|
|
1350
|
+
cur_px, cur_py, cur_pz, r_prev,
|
|
1351
|
+
next_px, next_py, next_pz, r_curr,
|
|
1352
|
+
-0.004
|
|
1353
|
+
);
|
|
1354
|
+
const turn_cos = cur_tx * next_tx + cur_ty * next_ty + cur_tz * next_tz;
|
|
1355
|
+
if (final_clear < 0.0 || (was_projected && turn_cos < 0.25)) {
|
|
1356
|
+
break;
|
|
1357
|
+
}
|
|
1358
|
+
} else if (was_projected) {
|
|
1359
|
+
// Keep root node tangent aligned with projected first segment so base collar has zero S-hook
|
|
1360
|
+
cur_tx = next_tx;
|
|
1361
|
+
cur_ty = next_ty;
|
|
1362
|
+
cur_tz = next_tz;
|
|
1363
|
+
out.node_write_tangent(prev_v, cur_tx, cur_ty, cur_tz);
|
|
1364
|
+
}
|
|
1365
|
+
}
|
|
1366
|
+
|
|
1367
|
+
// Structural surface root: creep along the ground plane y = 0 while sinking into it, its centreline at
|
|
1368
|
+
// r(t) - 2 r_base t: it leaves the stem fully exposed and its top drops by twice its base radius over
|
|
1369
|
+
// its length, so it dissolves into the soil about halfway out and its tip is never seen. Applied after all
|
|
1370
|
+
// steering and contact handling so nothing lifts it off or pushes it under; the first segment keeps
|
|
1371
|
+
// the bud's heading so the root leaves the stem where it was planted (e.g. on a flare lobe crest).
|
|
1372
|
+
if (lvl_cfg.root) {
|
|
1373
|
+
let hx = local_seg_idx === 0 ? emerge_hx : next_px - cur_px;
|
|
1374
|
+
let hz = local_seg_idx === 0 ? emerge_hz : next_pz - cur_pz;
|
|
1375
|
+
let h_len = Math.hypot(hx, hz);
|
|
1376
|
+
if (h_len < 1e-6) {
|
|
1377
|
+
hx = emerge_hx;
|
|
1378
|
+
hz = emerge_hz;
|
|
1379
|
+
h_len = Math.hypot(hx, hz) || 1.0;
|
|
1380
|
+
}
|
|
1381
|
+
hx /= h_len;
|
|
1382
|
+
hz /= h_len;
|
|
1383
|
+
const dy = clamp(r_curr - 2.0 * job.base_radius * t_curr - cur_py, -0.7 * seg_len, 0.7 * seg_len);
|
|
1384
|
+
const h_step = Math.sqrt(seg_len * seg_len - dy * dy);
|
|
1385
|
+
next_px = cur_px + hx * h_step;
|
|
1386
|
+
next_py = cur_py + dy;
|
|
1387
|
+
next_pz = cur_pz + hz * h_step;
|
|
1388
|
+
// arrive following the sinking profile, whose slope along the root is -(2 + taper) r_base / length
|
|
1389
|
+
const sink_slope = -(2.0 + lvl_cfg.taper) * job.base_radius / Math.max(1e-3, job.length);
|
|
1390
|
+
const t_norm_len = Math.hypot(1.0, sink_slope);
|
|
1391
|
+
next_tx = hx / t_norm_len;
|
|
1392
|
+
next_ty = sink_slope / t_norm_len;
|
|
1393
|
+
next_tz = hz / t_norm_len;
|
|
1394
|
+
if (local_seg_idx === 0) {
|
|
1395
|
+
// the root node leaves along its first chord, as a projected collar escape would
|
|
1396
|
+
cur_tx = (next_px - cur_px) / seg_len;
|
|
1397
|
+
cur_ty = (next_py - cur_py) / seg_len;
|
|
1398
|
+
cur_tz = (next_pz - cur_pz) / seg_len;
|
|
1399
|
+
out.node_write_tangent(prev_v, cur_tx, cur_ty, cur_tz);
|
|
1400
|
+
}
|
|
1401
|
+
}
|
|
1402
|
+
|
|
1403
|
+
// Transport RMF via Wang et al. Double Reflection
|
|
1404
|
+
spine_frame_double_reflection(
|
|
1405
|
+
SCRATCH_RMF, 0,
|
|
1406
|
+
cur_px, cur_py, cur_pz,
|
|
1407
|
+
cur_tx, cur_ty, cur_tz,
|
|
1408
|
+
cur_rx, cur_ry, cur_rz,
|
|
1409
|
+
next_px, next_py, next_pz,
|
|
1410
|
+
next_tx, next_ty, next_tz
|
|
1411
|
+
);
|
|
1412
|
+
let next_rx = SCRATCH_RMF[0];
|
|
1413
|
+
let next_ry = SCRATCH_RMF[1];
|
|
1414
|
+
let next_rz = SCRATCH_RMF[2];
|
|
1415
|
+
cur_sx = SCRATCH_RMF[3];
|
|
1416
|
+
cur_sy = SCRATCH_RMF[4];
|
|
1417
|
+
cur_sz = SCRATCH_RMF[5];
|
|
1418
|
+
|
|
1419
|
+
cur_arc_s += seg_len;
|
|
1420
|
+
|
|
1421
|
+
const curr_v = out.add_node(
|
|
1422
|
+
next_px, next_py, next_pz,
|
|
1423
|
+
next_tx, next_ty, next_tz,
|
|
1424
|
+
next_rx, next_ry, next_rz,
|
|
1425
|
+
r_curr,
|
|
1426
|
+
branch_id,
|
|
1427
|
+
level,
|
|
1428
|
+
job.parent_branch_id,
|
|
1429
|
+
t_curr,
|
|
1430
|
+
cur_arc_s,
|
|
1431
|
+
phase_hash
|
|
1432
|
+
);
|
|
1433
|
+
|
|
1434
|
+
const edge_id = out.add_segment(
|
|
1435
|
+
prev_v,
|
|
1436
|
+
curr_v,
|
|
1437
|
+
cur_tx * seg_len,
|
|
1438
|
+
cur_ty * seg_len,
|
|
1439
|
+
cur_tz * seg_len,
|
|
1440
|
+
next_tx * seg_len,
|
|
1441
|
+
next_ty * seg_len,
|
|
1442
|
+
next_tz * seg_len,
|
|
1443
|
+
seg_len,
|
|
1444
|
+
t_prev === 0.0 ? job.parent_attach_t : t_prev
|
|
1445
|
+
);
|
|
1446
|
+
|
|
1447
|
+
// Register segment in scope-local BVH
|
|
1448
|
+
const bvh_pad = Math.max(r_prev, r_curr) * 1.25 + 0.008;
|
|
1449
|
+
const bvh_leaf = bvh.allocate_node();
|
|
1450
|
+
bvh.node_set_user_data(bvh_leaf, edge_id);
|
|
1451
|
+
bvh.node_set_aabb_primitive(
|
|
1452
|
+
bvh_leaf,
|
|
1453
|
+
Math.min(cur_px, next_px) - bvh_pad,
|
|
1454
|
+
Math.min(cur_py, next_py) - bvh_pad,
|
|
1455
|
+
Math.min(cur_pz, next_pz) - bvh_pad,
|
|
1456
|
+
Math.max(cur_px, next_px) + bvh_pad,
|
|
1457
|
+
Math.max(cur_py, next_py) + bvh_pad,
|
|
1458
|
+
Math.max(cur_pz, next_pz) + bvh_pad
|
|
1459
|
+
);
|
|
1460
|
+
bvh.insert_leaf(bvh_leaf);
|
|
1461
|
+
|
|
1462
|
+
seg_branch_id[edge_id] = branch_id;
|
|
1463
|
+
seg_local_idx[edge_id] = local_seg_idx;
|
|
1464
|
+
seg_p0x[edge_id] = cur_px;
|
|
1465
|
+
seg_p0y[edge_id] = cur_py;
|
|
1466
|
+
seg_p0z[edge_id] = cur_pz;
|
|
1467
|
+
seg_r0[edge_id] = r_prev;
|
|
1468
|
+
seg_p1x[edge_id] = next_px;
|
|
1469
|
+
seg_p1y[edge_id] = next_py;
|
|
1470
|
+
seg_p1z[edge_id] = next_pz;
|
|
1471
|
+
seg_r1[edge_id] = r_curr;
|
|
1472
|
+
seg_bvh_leaf[edge_id] = bvh_leaf;
|
|
1473
|
+
|
|
1474
|
+
branch_edges.push(edge_id);
|
|
1475
|
+
branch_edge_t0.push(t_prev);
|
|
1476
|
+
branch_edge_t1.push(t_curr);
|
|
1477
|
+
branch_vertices.push(curr_v);
|
|
1478
|
+
|
|
1479
|
+
out.branch_tip_vertex[branch_id] = curr_v;
|
|
1480
|
+
out.branch_length[branch_id] = cur_arc_s - job.initial_arc_s;
|
|
1481
|
+
|
|
1482
|
+
// Check for dichotomous / sympodial splitting at interior segments (only when stem is structurally thick enough)
|
|
1483
|
+
const min_split_seg = level === 0
|
|
1484
|
+
? Math.max(2, Math.floor(N_seg * 0.5))
|
|
1485
|
+
: Math.max(1, Math.floor(N_seg * 0.25));
|
|
1486
|
+
if (
|
|
1487
|
+
!job.has_split
|
|
1488
|
+
&& !job.dead
|
|
1489
|
+
&& lvl_cfg.split_probability > 0.0
|
|
1490
|
+
&& r_curr >= 0.012
|
|
1491
|
+
&& s >= min_split_seg
|
|
1492
|
+
&& s <= Math.floor(N_seg * 0.75)
|
|
1493
|
+
&& rng() < lvl_cfg.split_probability
|
|
1494
|
+
) {
|
|
1495
|
+
job.has_split = true;
|
|
1496
|
+
const fork_count = Math.max(2, lvl_cfg.split_count | 0);
|
|
1497
|
+
const split_ang = lvl_cfg.split_angle;
|
|
1498
|
+
let base_az = rng() * PI2;
|
|
1499
|
+
|
|
1500
|
+
// Preserve pre-split orthonormal triad (T, R, S) before deflecting fork 0
|
|
1501
|
+
const pre_tx = next_tx, pre_ty = next_ty, pre_tz = next_tz;
|
|
1502
|
+
const pre_rx = next_rx, pre_ry = next_ry, pre_rz = next_rz;
|
|
1503
|
+
const pre_sx = cur_sx, pre_sy = cur_sy, pre_sz = cur_sz;
|
|
1504
|
+
|
|
1505
|
+
// On lateral branches (level >= 1), align the split bend axis toward local vertical (+Y)
|
|
1506
|
+
// so the two daughter forks spread horizontally in the canopy rather than pitching into neighbor boughs.
|
|
1507
|
+
if (level >= 1) {
|
|
1508
|
+
const up_az = Math.atan2(pre_sy, pre_ry);
|
|
1509
|
+
const side_sign = base_az < Math.PI ? 1.0 : -1.0;
|
|
1510
|
+
base_az = up_az + (side_sign < 0.0 ? Math.PI : 0.0) + ((base_az % Math.PI) / Math.PI - 0.5) * 0.45;
|
|
1511
|
+
}
|
|
1512
|
+
|
|
1513
|
+
// Current branch deflects as fork 0: rotate both T and R around bend_axis so R remains orthogonal to T
|
|
1514
|
+
const fork0_deflect = level === 0 ? split_ang * 0.22 : split_ang * 0.5;
|
|
1515
|
+
const bend_axis_x = Math.cos(base_az) * pre_rx + Math.sin(base_az) * pre_sx;
|
|
1516
|
+
const bend_axis_y = Math.cos(base_az) * pre_ry + Math.sin(base_az) * pre_sy;
|
|
1517
|
+
const bend_axis_z = Math.cos(base_az) * pre_rz + Math.sin(base_az) * pre_sz;
|
|
1518
|
+
rotate_around_axis(
|
|
1519
|
+
rot_scratch,
|
|
1520
|
+
pre_tx, pre_ty, pre_tz,
|
|
1521
|
+
bend_axis_x, bend_axis_y, bend_axis_z,
|
|
1522
|
+
fork0_deflect
|
|
1523
|
+
);
|
|
1524
|
+
next_tx = rot_scratch[0];
|
|
1525
|
+
next_ty = rot_scratch[1];
|
|
1526
|
+
next_tz = rot_scratch[2];
|
|
1527
|
+
// fork 0 is aimed where it was deflected to, as the other forks are aimed along their own headings
|
|
1528
|
+
aim_x = next_tx;
|
|
1529
|
+
aim_y = next_ty;
|
|
1530
|
+
aim_z = next_tz;
|
|
1531
|
+
|
|
1532
|
+
rotate_around_axis(
|
|
1533
|
+
rot_scratch,
|
|
1534
|
+
pre_rx, pre_ry, pre_rz,
|
|
1535
|
+
bend_axis_x, bend_axis_y, bend_axis_z,
|
|
1536
|
+
fork0_deflect
|
|
1537
|
+
);
|
|
1538
|
+
next_rx = rot_scratch[0];
|
|
1539
|
+
next_ry = rot_scratch[1];
|
|
1540
|
+
next_rz = rot_scratch[2];
|
|
1541
|
+
|
|
1542
|
+
cur_sx = next_ty * next_rz - next_tz * next_ry;
|
|
1543
|
+
cur_sy = next_tz * next_rx - next_tx * next_rz;
|
|
1544
|
+
cur_sz = next_tx * next_ry - next_ty * next_rx;
|
|
1545
|
+
|
|
1546
|
+
// Spawn fork 1..fork_count-1 as continuation branches with their own root vertex connected to curr_v
|
|
1547
|
+
const rem_segs = Math.max(1, N_seg - s);
|
|
1548
|
+
const rem_fraction = Math.max(0.15, rem_segs / Math.max(1, N_seg));
|
|
1549
|
+
const fork_cum_t0 = lerp(job.cum_t0 ?? 0.0, job.cum_t1 ?? 1.0, t_curr);
|
|
1550
|
+
const fork_cum_t1 = job.cum_t1 ?? 1.0;
|
|
1551
|
+
const fork_len = Math.max(0.15, job.length * rem_fraction);
|
|
1552
|
+
const fork_r0 = r_curr * 0.78;
|
|
1553
|
+
const fork_step = fork_len / rem_segs;
|
|
1554
|
+
|
|
1555
|
+
for (let f = 1; f < fork_count; f++) {
|
|
1556
|
+
const f_az = base_az + (f * PI2) / fork_count;
|
|
1557
|
+
const fax = Math.cos(f_az) * pre_rx + Math.sin(f_az) * pre_sx;
|
|
1558
|
+
const fay = Math.cos(f_az) * pre_ry + Math.sin(f_az) * pre_sy;
|
|
1559
|
+
const faz = Math.cos(f_az) * pre_rz + Math.sin(f_az) * pre_sz;
|
|
1560
|
+
|
|
1561
|
+
const f_tan = [0, 0, 0];
|
|
1562
|
+
rotate_around_axis(f_tan, pre_tx, pre_ty, pre_tz, fax, fay, faz, split_ang * 0.65);
|
|
1563
|
+
|
|
1564
|
+
// Verify fork emergence clearance against BVH (and prevent inward-toward-trunk forks on lateral boughs)
|
|
1565
|
+
if (level >= 1) {
|
|
1566
|
+
const r_horiz_here = Math.hypot(next_px, next_pz);
|
|
1567
|
+
if (r_horiz_here > 0.35 && (next_px * f_tan[0] + next_pz * f_tan[2]) < -0.10 * r_horiz_here) {
|
|
1568
|
+
continue;
|
|
1569
|
+
}
|
|
1570
|
+
const f_clear = evaluate_candidate_clearance(
|
|
1571
|
+
-1, branch_id, local_seg_idx, true, 0,
|
|
1572
|
+
next_px, next_py, next_pz, fork_r0,
|
|
1573
|
+
next_px + f_tan[0] * fork_step,
|
|
1574
|
+
next_py + f_tan[1] * fork_step,
|
|
1575
|
+
next_pz + f_tan[2] * fork_step,
|
|
1576
|
+
fork_r0 * 0.85,
|
|
1577
|
+
0.002
|
|
1578
|
+
);
|
|
1579
|
+
if (f_clear < -0.002) {
|
|
1580
|
+
continue;
|
|
1581
|
+
}
|
|
1582
|
+
}
|
|
1583
|
+
|
|
1584
|
+
const f_r = [0, 0, 0];
|
|
1585
|
+
rotate_around_axis(f_r, pre_rx, pre_ry, pre_rz, fax, fay, faz, split_ang * 0.65);
|
|
1586
|
+
|
|
1587
|
+
queue.push({
|
|
1588
|
+
level,
|
|
1589
|
+
generator,
|
|
1590
|
+
in_crown: job.in_crown,
|
|
1591
|
+
parent_branch_id: branch_id,
|
|
1592
|
+
parent_edge_id: edge_id,
|
|
1593
|
+
parent_attach_seg_idx: local_seg_idx,
|
|
1594
|
+
parent_attach_t: t_curr,
|
|
1595
|
+
attach_parent_vertex: curr_v,
|
|
1596
|
+
start_vertex: -1,
|
|
1597
|
+
px: next_px,
|
|
1598
|
+
py: next_py,
|
|
1599
|
+
pz: next_pz,
|
|
1600
|
+
tx: f_tan[0],
|
|
1601
|
+
ty: f_tan[1],
|
|
1602
|
+
tz: f_tan[2],
|
|
1603
|
+
rx: f_r[0],
|
|
1604
|
+
ry: f_r[1],
|
|
1605
|
+
rz: f_r[2],
|
|
1606
|
+
emerge_drx: fax,
|
|
1607
|
+
emerge_dry: fay,
|
|
1608
|
+
emerge_drz: faz,
|
|
1609
|
+
length: fork_len,
|
|
1610
|
+
full_branch_length: job.full_branch_length ?? job.length,
|
|
1611
|
+
base_radius: fork_r0,
|
|
1612
|
+
start_seg: 0,
|
|
1613
|
+
total_segs: rem_segs,
|
|
1614
|
+
shape_segs: rem_segs,
|
|
1615
|
+
initial_arc_s: cur_arc_s,
|
|
1616
|
+
has_split: true,
|
|
1617
|
+
is_split_fork: true,
|
|
1618
|
+
child_span_fraction: rem_fraction,
|
|
1619
|
+
cum_t0: fork_cum_t0,
|
|
1620
|
+
cum_t1: fork_cum_t1
|
|
1621
|
+
});
|
|
1622
|
+
}
|
|
1623
|
+
}
|
|
1624
|
+
|
|
1625
|
+
cur_px = next_px;
|
|
1626
|
+
cur_py = next_py;
|
|
1627
|
+
cur_pz = next_pz;
|
|
1628
|
+
cur_tx = next_tx;
|
|
1629
|
+
cur_ty = next_ty;
|
|
1630
|
+
cur_tz = next_tz;
|
|
1631
|
+
cur_rx = next_rx;
|
|
1632
|
+
cur_ry = next_ry;
|
|
1633
|
+
cur_rz = next_rz;
|
|
1634
|
+
prev_v = curr_v;
|
|
1635
|
+
}
|
|
1636
|
+
|
|
1637
|
+
// If the branch was self-pruned early on contact (actual_segs < remaining_segs), renormalize
|
|
1638
|
+
// t_norm and taper radii across the surviving vertices [0..actual_segs] so its tip terminates cleanly at t_norm = 1.0
|
|
1639
|
+
const actual_segs = branch_edges.length;
|
|
1640
|
+
if (actual_segs > 0 && actual_segs < remaining_segs) {
|
|
1641
|
+
const s_param = /** @type {Float32Array} */ (out.attr_node_spine_param.data);
|
|
1642
|
+
for (let i = 0; i < actual_segs; i++) {
|
|
1643
|
+
const tn0 = i / actual_segs;
|
|
1644
|
+
const tn1 = (i + 1) / actual_segs;
|
|
1645
|
+
branch_edge_t0[i] = tn0;
|
|
1646
|
+
branch_edge_t1[i] = tn1;
|
|
1647
|
+
|
|
1648
|
+
const v_curr = branch_vertices[i + 1];
|
|
1649
|
+
s_param[v_curr * 3] = tn1;
|
|
1650
|
+
|
|
1651
|
+
const u_p = prof_span > 1e-4
|
|
1652
|
+
? clamp((prof_p0 - lvl_cfg.radius_profile.evaluate(lerp(job.cum_t0, job.cum_t1, tn1))) / prof_span, 0.0, 1.0)
|
|
1653
|
+
: tn1;
|
|
1654
|
+
const min_tf = has_children ? 0.14 : 0.24;
|
|
1655
|
+
const ap_taper = has_children && tn1 > 0.80
|
|
1656
|
+
? lerp(1.0, 0.62, Math.pow((tn1 - 0.80) / 0.20, 1.35))
|
|
1657
|
+
: 1.0;
|
|
1658
|
+
const r_new = Math.max(
|
|
1659
|
+
0.002,
|
|
1660
|
+
job.base_radius * Math.max(1.0 - lvl_cfg.taper * u_p, min_tf) * ap_taper
|
|
1661
|
+
);
|
|
1662
|
+
out.node_write_radius(v_curr, r_new);
|
|
1663
|
+
|
|
1664
|
+
const e_curr = branch_edges[i];
|
|
1665
|
+
seg_r1[e_curr] = r_new;
|
|
1666
|
+
if (i + 1 < actual_segs) {
|
|
1667
|
+
seg_r0[branch_edges[i + 1]] = r_new;
|
|
1668
|
+
}
|
|
1669
|
+
}
|
|
1670
|
+
}
|
|
1671
|
+
|
|
1672
|
+
// Smooth or preserve crisp interior Hermite tangents across consecutive edges of this branch
|
|
1673
|
+
// (preserving branch_edges[0]'s m0 so continuation forks keep their exact fork departure tangent)
|
|
1674
|
+
if (branch_edges.length >= 2) {
|
|
1675
|
+
const kink_sharp = clamp(lvl_cfg.kink_sharpness ?? 0.5, 0.0, 0.92);
|
|
1676
|
+
for (let k = 1; k < branch_edges.length; k++) {
|
|
1677
|
+
const e_prev = branch_edges[k - 1];
|
|
1678
|
+
const e_next = branch_edges[k];
|
|
1679
|
+
const v_mid = branch_vertices[k];
|
|
1680
|
+
const l_prev = Math.max(1e-5, out.segment_length(e_prev));
|
|
1681
|
+
const l_next = Math.max(1e-5, out.segment_length(e_next));
|
|
1682
|
+
|
|
1683
|
+
out.segment_read_m1(SCRATCH_M_PREV, 0, e_prev);
|
|
1684
|
+
out.segment_read_m0(SCRATCH_M_NEXT, 0, e_next);
|
|
1685
|
+
|
|
1686
|
+
const t_in_x = SCRATCH_M_PREV[0] / l_prev;
|
|
1687
|
+
const t_in_y = SCRATCH_M_PREV[1] / l_prev;
|
|
1688
|
+
const t_in_z = SCRATCH_M_PREV[2] / l_prev;
|
|
1689
|
+
const t_out_x = SCRATCH_M_NEXT[0] / l_next;
|
|
1690
|
+
const t_out_y = SCRATCH_M_NEXT[1] / l_next;
|
|
1691
|
+
const t_out_z = SCRATCH_M_NEXT[2] / l_next;
|
|
1692
|
+
|
|
1693
|
+
let tx = t_in_x + t_out_x;
|
|
1694
|
+
let ty = t_in_y + t_out_y;
|
|
1695
|
+
let tz = t_in_z + t_out_z;
|
|
1696
|
+
const t_len = Math.sqrt(tx * tx + ty * ty + tz * tz);
|
|
1697
|
+
if (t_len > 1e-12) {
|
|
1698
|
+
tx /= t_len;
|
|
1699
|
+
ty /= t_len;
|
|
1700
|
+
tz /= t_len;
|
|
1701
|
+
|
|
1702
|
+
out.node_write_tangent(v_mid, tx, ty, tz);
|
|
1703
|
+
|
|
1704
|
+
// Blend between smooth C1 average tangent and crisp sympodial kink tangents
|
|
1705
|
+
let m1x = lerp(tx, t_in_x, kink_sharp);
|
|
1706
|
+
let m1y = lerp(ty, t_in_y, kink_sharp);
|
|
1707
|
+
let m1z = lerp(tz, t_in_z, kink_sharp);
|
|
1708
|
+
const m1_l = Math.sqrt(m1x * m1x + m1y * m1y + m1z * m1z);
|
|
1709
|
+
if (m1_l > 1e-12) { m1x /= m1_l; m1y /= m1_l; m1z /= m1_l; }
|
|
1710
|
+
|
|
1711
|
+
let m0x = lerp(tx, t_out_x, kink_sharp);
|
|
1712
|
+
let m0y = lerp(ty, t_out_y, kink_sharp);
|
|
1713
|
+
let m0z = lerp(tz, t_out_z, kink_sharp);
|
|
1714
|
+
const m0_l = Math.sqrt(m0x * m0x + m0y * m0y + m0z * m0z);
|
|
1715
|
+
if (m0_l > 1e-12) { m0x /= m0_l; m0y /= m0_l; m0z /= m0_l; }
|
|
1716
|
+
|
|
1717
|
+
out.segment_write_m1(e_prev, m1x * l_prev, m1y * l_prev, m1z * l_prev);
|
|
1718
|
+
out.segment_write_m0(e_next, m0x * l_next, m0y * l_next, m0z * l_next);
|
|
1719
|
+
}
|
|
1720
|
+
}
|
|
1721
|
+
}
|
|
1722
|
+
|
|
1723
|
+
// Spawn lateral child branches at level + 1 using pre-scheduled attachments
|
|
1724
|
+
const next_level = level + 1;
|
|
1725
|
+
if (scheduled_children.length > 0 && branch_edges.length > 0) {
|
|
1726
|
+
const t_max = branch_edge_t1[branch_edge_t1.length - 1];
|
|
1727
|
+
const PHI_CANDIDATES = [0.0, 0.36, -0.36, 0.72, -0.72, 1.08, -1.08, 1.48, -1.48];
|
|
1728
|
+
|
|
1729
|
+
for (let c = 0; c < scheduled_children.length; c++) {
|
|
1730
|
+
const sc = scheduled_children[c];
|
|
1731
|
+
const rule = sc.rule;
|
|
1732
|
+
const next_cfg = species.branches[rule.target];
|
|
1733
|
+
if (sc.t_attach > t_max * 1.02) continue;
|
|
1734
|
+
const t_attach = clamp(sc.t_attach, branch_edge_t0[0], t_max * 0.985);
|
|
1735
|
+
const base_phi_c = sc.phi;
|
|
1736
|
+
|
|
1737
|
+
// Find parent edge containing t_attach
|
|
1738
|
+
let seg_idx = 0;
|
|
1739
|
+
for (let i = 0; i < branch_edges.length; i++) {
|
|
1740
|
+
if (t_attach >= branch_edge_t0[i] && t_attach <= branch_edge_t1[i]) {
|
|
1741
|
+
seg_idx = i;
|
|
1742
|
+
break;
|
|
1743
|
+
}
|
|
1744
|
+
}
|
|
1745
|
+
|
|
1746
|
+
const parent_e = branch_edges[seg_idx];
|
|
1747
|
+
const t0_e = branch_edge_t0[seg_idx];
|
|
1748
|
+
const t1_e = branch_edge_t1[seg_idx];
|
|
1749
|
+
const local_u = clamp((t_attach - t0_e) / Math.max(1e-5, t1_e - t0_e), 0.0, 1.0);
|
|
1750
|
+
|
|
1751
|
+
out.evaluate_segment_position(SCRATCH_POS, 0, parent_e, local_u);
|
|
1752
|
+
out.evaluate_segment_tangent(SCRATCH_TAN, 0, parent_e, local_u);
|
|
1753
|
+
|
|
1754
|
+
const p_v0 = branch_vertices[seg_idx];
|
|
1755
|
+
const p_v1 = branch_vertices[seg_idx + 1];
|
|
1756
|
+
const r_p0 = out.node_read_radius(p_v0);
|
|
1757
|
+
const r_p1 = out.node_read_radius(p_v1);
|
|
1758
|
+
const parent_r_at_attach = lerp(r_p0, r_p1, local_u);
|
|
1759
|
+
if (parent_r_at_attach < 0.004) continue;
|
|
1760
|
+
|
|
1761
|
+
// Transport parent RMF R vector from p_v0 along parent_e to SCRATCH_POS at local_u
|
|
1762
|
+
out.node_read_position(SCRATCH_P0, 0, p_v0);
|
|
1763
|
+
out.node_read_tangent(SCRATCH_T0, 0, p_v0);
|
|
1764
|
+
out.node_read_frame_r(SCRATCH_R0, 0, p_v0);
|
|
1765
|
+
const p_rx = SCRATCH_R0[0];
|
|
1766
|
+
const p_ry = SCRATCH_R0[1];
|
|
1767
|
+
const p_rz = SCRATCH_R0[2];
|
|
1768
|
+
|
|
1769
|
+
spine_frame_double_reflection(
|
|
1770
|
+
SCRATCH_RMF, 0,
|
|
1771
|
+
SCRATCH_P0[0], SCRATCH_P0[1], SCRATCH_P0[2],
|
|
1772
|
+
SCRATCH_T0[0], SCRATCH_T0[1], SCRATCH_T0[2],
|
|
1773
|
+
p_rx, p_ry, p_rz,
|
|
1774
|
+
SCRATCH_POS[0], SCRATCH_POS[1], SCRATCH_POS[2],
|
|
1775
|
+
SCRATCH_TAN[0], SCRATCH_TAN[1], SCRATCH_TAN[2]
|
|
1776
|
+
);
|
|
1777
|
+
const prx = SCRATCH_RMF[0], pry = SCRATCH_RMF[1], prz = SCRATCH_RMF[2];
|
|
1778
|
+
const psx = SCRATCH_RMF[3], psy = SCRATCH_RMF[4], psz = SCRATCH_RMF[5];
|
|
1779
|
+
|
|
1780
|
+
// Genealogical position along the full parent axis (accounts for continuation forks)
|
|
1781
|
+
const t_genealogical = lerp(job.cum_t0 ?? 0.0, job.cum_t1 ?? 1.0, t_attach);
|
|
1782
|
+
|
|
1783
|
+
// Insertion polar angle alpha from parent tangent T_p toward D_rad
|
|
1784
|
+
const alpha_scale = rule.insertion_angle_profile.evaluate(t_genealogical);
|
|
1785
|
+
const alpha = clamp(
|
|
1786
|
+
rule.insertion_angle * alpha_scale + (rng() * 2.0 - 1.0) * rule.insertion_angle_variation,
|
|
1787
|
+
0.1,
|
|
1788
|
+
Math.PI * 0.85
|
|
1789
|
+
);
|
|
1790
|
+
const cos_a = Math.cos(alpha);
|
|
1791
|
+
const sin_a = Math.sin(alpha);
|
|
1792
|
+
const var_scale = 1.0 + (rng() * 2.0 - 1.0) * next_cfg.length_variance;
|
|
1793
|
+
|
|
1794
|
+
// A plagiotropic parent is dorsiventral: its buds lie in the plane of its tangent T_p and the horizontal
|
|
1795
|
+
// H = T_p x Y across it, whose normal N = H x T_p points up. A vertical parent has no such plane.
|
|
1796
|
+
const tpx = SCRATCH_TAN[0], tpy = SCRATCH_TAN[1], tpz = SCRATCH_TAN[2];
|
|
1797
|
+
const horizontality = Math.hypot(tpx, tpz);
|
|
1798
|
+
const plagio = level >= 1 ? lvl_cfg.plagiotropism : 0.0;
|
|
1799
|
+
const w_plagio = horizontality > 1e-3 ? plagio * horizontality : 0.0;
|
|
1800
|
+
const dv_nx = horizontality > 1e-3 ? (-tpx * tpy) / horizontality : 0.0;
|
|
1801
|
+
const dv_ny = horizontality;
|
|
1802
|
+
const dv_nz = horizontality > 1e-3 ? (-tpy * tpz) / horizontality : 0.0;
|
|
1803
|
+
|
|
1804
|
+
// Helper to compute radial normal D_rad and child tangent T_c for a given azimuth phi_cand
|
|
1805
|
+
const compute_child_basis = (phi_cand, out_dr, out_ct) => {
|
|
1806
|
+
const cp = Math.cos(phi_cand);
|
|
1807
|
+
const sp = Math.sin(phi_cand);
|
|
1808
|
+
let dx_r = cp * prx + sp * psx;
|
|
1809
|
+
let dy_r = cp * pry + sp * psy;
|
|
1810
|
+
let dz_r = cp * prz + sp * psz;
|
|
1811
|
+
|
|
1812
|
+
if (w_plagio > 1e-3) {
|
|
1813
|
+
// fan into the dorsiventral plane: take off w of the radial's component along N
|
|
1814
|
+
const along_n = (dx_r * dv_nx + dy_r * dv_ny + dz_r * dv_nz) * w_plagio;
|
|
1815
|
+
dx_r -= along_n * dv_nx;
|
|
1816
|
+
dy_r -= along_n * dv_ny;
|
|
1817
|
+
dz_r -= along_n * dv_nz;
|
|
1818
|
+
const d_len = Math.sqrt(dx_r * dx_r + dy_r * dy_r + dz_r * dz_r);
|
|
1819
|
+
if (d_len > 1e-6) {
|
|
1820
|
+
dx_r /= d_len;
|
|
1821
|
+
dy_r /= d_len;
|
|
1822
|
+
dz_r /= d_len;
|
|
1823
|
+
} else {
|
|
1824
|
+
// a bud straight above (below) a fully dorsiventral shoot: to the side, along H
|
|
1825
|
+
dx_r = -tpz / horizontality;
|
|
1826
|
+
dy_r = 0.0;
|
|
1827
|
+
dz_r = tpx / horizontality;
|
|
1828
|
+
}
|
|
1829
|
+
}
|
|
1830
|
+
out_dr[0] = dx_r;
|
|
1831
|
+
out_dr[1] = dy_r;
|
|
1832
|
+
out_dr[2] = dz_r;
|
|
1833
|
+
|
|
1834
|
+
let tx_c = cos_a * SCRATCH_TAN[0] + sin_a * dx_r;
|
|
1835
|
+
let ty_c = cos_a * SCRATCH_TAN[1] + sin_a * dy_r;
|
|
1836
|
+
let tz_c = cos_a * SCRATCH_TAN[2] + sin_a * dz_r;
|
|
1837
|
+
const ct_l = Math.sqrt(tx_c * tx_c + ty_c * ty_c + tz_c * tz_c) || 1.0;
|
|
1838
|
+
out_ct[0] = tx_c / ct_l;
|
|
1839
|
+
out_ct[1] = ty_c / ct_l;
|
|
1840
|
+
out_ct[2] = tz_c / ct_l;
|
|
1841
|
+
};
|
|
1842
|
+
|
|
1843
|
+
// Ventral knockout: on a dorsiventral parent a bud whose own heading points into the downward cone of
|
|
1844
|
+
// half-angle plagiotropism * pi / 2 does not break
|
|
1845
|
+
const ventral_cos = Math.cos(plagio * Math.PI * 0.5);
|
|
1846
|
+
if (plagio > 0.0) {
|
|
1847
|
+
const bud_y = cos_a * tpy + sin_a * (Math.cos(base_phi_c) * pry + Math.sin(base_phi_c) * psy);
|
|
1848
|
+
if (-bud_y > ventral_cos) {
|
|
1849
|
+
continue;
|
|
1850
|
+
}
|
|
1851
|
+
}
|
|
1852
|
+
|
|
1853
|
+
const cand_dr = [0, 0, 0];
|
|
1854
|
+
const cand_ct = [0, 0, 0];
|
|
1855
|
+
compute_child_basis(base_phi_c, cand_dr, cand_ct);
|
|
1856
|
+
|
|
1857
|
+
// 1. Raw configured child branch length modulated by length_profile at t_genealogical and crown envelope
|
|
1858
|
+
const prof_scale = Math.max(0.12, rule.length_profile.evaluate(t_genealogical));
|
|
1859
|
+
const est_mid_y = SCRATCH_POS[1] + Math.max(0.0, cand_ct[1]) * next_cfg.length * prof_scale * 0.35;
|
|
1860
|
+
const h_norm = clamp((est_mid_y - crown.base_height) / Math.max(0.1, crown.height), 0.0, 1.0);
|
|
1861
|
+
// a dead branch grew before today's crown took its shape
|
|
1862
|
+
const dead = sc.age > 0.0;
|
|
1863
|
+
const env_scale = !rule.crown_envelope || dead
|
|
1864
|
+
? 1.0
|
|
1865
|
+
: (level === 0
|
|
1866
|
+
? crown_envelope_evaluate(crown.envelope_type, h_norm)
|
|
1867
|
+
: lerp(1.0, crown_envelope_evaluate(crown.envelope_type, h_norm), 0.5));
|
|
1868
|
+
const raw_child_len = Math.max(0.12, next_cfg.length * prof_scale * env_scale * var_scale);
|
|
1869
|
+
|
|
1870
|
+
// 2. Continuous Gravity-Orientation & Allometric Slenderness Coupling (Cantilever vs. Pendulous Tension)
|
|
1871
|
+
const rho_design = Math.max(0.012, next_cfg.radius_ratio);
|
|
1872
|
+
const s_design = 1.0 / (2.0 * rho_design);
|
|
1873
|
+
const g_trop = next_cfg.gravitropism ?? 0.0;
|
|
1874
|
+
const u_curl = next_cfg.tip_upcurl ?? 0.0;
|
|
1875
|
+
const t_eff_y = clamp(cand_ct[1] - 0.85 * g_trop + 0.35 * u_curl, -1.0, 1.0);
|
|
1876
|
+
|
|
1877
|
+
// Cantilever load (horizontal bending / upward compression) vs. pendulous tensile compliance
|
|
1878
|
+
const k_cantilever = Math.sqrt(Math.max(0.0, 1.0 - t_eff_y * t_eff_y)) + 0.65 * Math.max(0.0, t_eff_y);
|
|
1879
|
+
const tau_tension = clamp(g_trop, 0.0, 1.0) * Math.max(0.0, -t_eff_y);
|
|
1880
|
+
|
|
1881
|
+
// 3. Parent-relative distal conical envelope (prevents distal shoots or split forks from outgrowing their parent)
|
|
1882
|
+
const actual_parent_len = Math.max(0.15, out.branch_length[branch_id]);
|
|
1883
|
+
const parent_full_len = Math.max(actual_parent_len, job.full_branch_length ?? actual_parent_len);
|
|
1884
|
+
const distal_tip_ratio = lerp(0.32, 0.55, tau_tension);
|
|
1885
|
+
const cone_max_len = level === 0
|
|
1886
|
+
? parent_full_len * lerp(0.85, 0.32, Math.pow(t_genealogical, 1.6))
|
|
1887
|
+
: Math.min(
|
|
1888
|
+
actual_parent_len * lerp(0.90, 1.05, tau_tension),
|
|
1889
|
+
parent_full_len * lerp(0.85, distal_tip_ratio, Math.pow(t_genealogical, 1.25))
|
|
1890
|
+
);
|
|
1891
|
+
const desired_len = Math.max(0.12, Math.min(raw_child_len, cone_max_len));
|
|
1892
|
+
|
|
1893
|
+
const nom_len = Math.max(0.15, next_cfg.length);
|
|
1894
|
+
const r_design = (nom_len * rho_design * Math.pow(desired_len / nom_len, 0.75)) / (1.0 + 0.65 * tau_tension);
|
|
1895
|
+
// children on the flare crests sit side by side around the stem: N of them fit at most R sin(pi / N) thick
|
|
1896
|
+
const side_by_side_r = rule.phyllotaxis_mode === PhyllotaxisMode.FlareLobes
|
|
1897
|
+
? parent_r_at_attach * Math.sin(Math.PI / Math.max(2, lvl_cfg.flare_lobes | 0))
|
|
1898
|
+
: Infinity;
|
|
1899
|
+
const child_base_r = Math.min(
|
|
1900
|
+
parent_r_at_attach * 0.78,
|
|
1901
|
+
side_by_side_r,
|
|
1902
|
+
Math.max(0.0035, r_design)
|
|
1903
|
+
);
|
|
1904
|
+
|
|
1905
|
+
const gamma = lerp(0.82, 0.65, tau_tension);
|
|
1906
|
+
const allometric_len = child_base_r < r_design
|
|
1907
|
+
? desired_len * Math.pow(child_base_r / Math.max(1e-5, r_design), gamma)
|
|
1908
|
+
: desired_len;
|
|
1909
|
+
const s_max = s_design * (1.35 + 0.65 * tau_tension) / (0.65 + 0.35 * k_cantilever);
|
|
1910
|
+
const full_len = clamp(Math.min(allometric_len, 2.0 * child_base_r * s_max), 0.12, desired_len);
|
|
1911
|
+
// a dead branch is what is left of it: its base part, if that still clears the bark; otherwise it has
|
|
1912
|
+
// been grown over and the stem carries its scar
|
|
1913
|
+
const child_len = full_len * sc.retained;
|
|
1914
|
+
if (dead && child_len <= parent_r_at_attach) {
|
|
1915
|
+
out.add_scar(branch_id, t_attach, cand_ct[0], cand_ct[1], cand_ct[2], child_base_r * (1.0 - sc.age));
|
|
1916
|
+
continue;
|
|
1917
|
+
}
|
|
1918
|
+
const child_segs = Math.max(1, Math.ceil(next_cfg.segments * sc.retained));
|
|
1919
|
+
const child_step = child_len / child_segs;
|
|
1920
|
+
|
|
1921
|
+
// 4. Pre-Spawn BVH Bud Clearance Probing (selects open canopy azimuth or inhibits blocked bud)
|
|
1922
|
+
let best_drx = cand_dr[0], best_dry = cand_dr[1], best_drz = cand_dr[2];
|
|
1923
|
+
let best_ctx = cand_ct[0], best_cty = cand_ct[1], best_ctz = cand_ct[2];
|
|
1924
|
+
let best_clear = -Infinity;
|
|
1925
|
+
const r_horiz_attach = Math.hypot(SCRATCH_POS[0], SCRATCH_POS[2]);
|
|
1926
|
+
|
|
1927
|
+
for (let k = 0; k < PHI_CANDIDATES.length; k++) {
|
|
1928
|
+
if (k > 0) {
|
|
1929
|
+
compute_child_basis(base_phi_c + PHI_CANDIDATES[k], cand_dr, cand_ct);
|
|
1930
|
+
}
|
|
1931
|
+
// nor may fanning or a turn for clearance carry it into the cone: a bud with no heading left
|
|
1932
|
+
// outside it does not break
|
|
1933
|
+
if (plagio > 0.0 && -cand_ct[1] > ventral_cos) continue;
|
|
1934
|
+
// Prevent lateral shoots on boughs from pointing backward into the trunk core
|
|
1935
|
+
if (level >= 1 && r_horiz_attach > 0.30) {
|
|
1936
|
+
const radial_dot = (SCRATCH_POS[0] * cand_ct[0] + SCRATCH_POS[2] * cand_ct[2]) / r_horiz_attach;
|
|
1937
|
+
if (radial_dot < -0.15) continue;
|
|
1938
|
+
}
|
|
1939
|
+
|
|
1940
|
+
const p1_x = SCRATCH_POS[0] + cand_ct[0] * child_step;
|
|
1941
|
+
const p1_y = SCRATCH_POS[1] + cand_ct[1] * child_step;
|
|
1942
|
+
const p1_z = SCRATCH_POS[2] + cand_ct[2] * child_step;
|
|
1943
|
+
|
|
1944
|
+
const clear0 = evaluate_candidate_clearance(
|
|
1945
|
+
-1, branch_id, seg_idx, false, 0,
|
|
1946
|
+
SCRATCH_POS[0], SCRATCH_POS[1], SCRATCH_POS[2], child_base_r,
|
|
1947
|
+
p1_x, p1_y, p1_z, child_base_r * 0.88,
|
|
1948
|
+
0.002
|
|
1949
|
+
);
|
|
1950
|
+
|
|
1951
|
+
const p2_x = p1_x + cand_ct[0] * child_step;
|
|
1952
|
+
const p2_y = p1_y + cand_ct[1] * child_step;
|
|
1953
|
+
const p2_z = p1_z + cand_ct[2] * child_step;
|
|
1954
|
+
const clear1 = child_segs >= 2
|
|
1955
|
+
? evaluate_candidate_clearance(
|
|
1956
|
+
-1, branch_id, seg_idx, false, 1,
|
|
1957
|
+
p1_x, p1_y, p1_z, child_base_r * 0.88,
|
|
1958
|
+
p2_x, p2_y, p2_z, child_base_r * 0.75,
|
|
1959
|
+
0.002
|
|
1960
|
+
)
|
|
1961
|
+
: clear0;
|
|
1962
|
+
|
|
1963
|
+
const min_c = Math.min(clear0, clear1);
|
|
1964
|
+
if (min_c > best_clear) {
|
|
1965
|
+
best_clear = min_c;
|
|
1966
|
+
best_drx = cand_dr[0];
|
|
1967
|
+
best_dry = cand_dr[1];
|
|
1968
|
+
best_drz = cand_dr[2];
|
|
1969
|
+
best_ctx = cand_ct[0];
|
|
1970
|
+
best_cty = cand_ct[1];
|
|
1971
|
+
best_ctz = cand_ct[2];
|
|
1972
|
+
}
|
|
1973
|
+
if (min_c >= 0.004) {
|
|
1974
|
+
break;
|
|
1975
|
+
}
|
|
1976
|
+
}
|
|
1977
|
+
|
|
1978
|
+
// Botanical bud inhibition: if all candidate directions are blocked by existing branches, suppress bud
|
|
1979
|
+
if (best_clear < -0.004) {
|
|
1980
|
+
continue;
|
|
1981
|
+
}
|
|
1982
|
+
|
|
1983
|
+
const drx = best_drx, dry = best_dry, drz = best_drz;
|
|
1984
|
+
const ctx = best_ctx, cty = best_cty, ctz = best_ctz;
|
|
1985
|
+
|
|
1986
|
+
// Initial RMF radial vector for child branch:
|
|
1987
|
+
// R_c = cos(alpha) * D_rad - sin(alpha) * T_p is exact unit length and orthogonal
|
|
1988
|
+
// to T_c = cos(alpha) * T_p + sin(alpha) * D_rad for all alpha in [0, pi],
|
|
1989
|
+
// avoiding any singularity at alpha = pi/2.
|
|
1990
|
+
let crx = cos_a * drx - sin_a * SCRATCH_TAN[0];
|
|
1991
|
+
let cry = cos_a * dry - sin_a * SCRATCH_TAN[1];
|
|
1992
|
+
let crz = cos_a * drz - sin_a * SCRATCH_TAN[2];
|
|
1993
|
+
const cr_dot = crx * ctx + cry * cty + crz * ctz;
|
|
1994
|
+
crx -= cr_dot * ctx;
|
|
1995
|
+
cry -= cr_dot * cty;
|
|
1996
|
+
crz -= cr_dot * ctz;
|
|
1997
|
+
const cr_len = Math.sqrt(crx * crx + cry * cry + crz * crz);
|
|
1998
|
+
if (cr_len > 1e-12) {
|
|
1999
|
+
crx /= cr_len;
|
|
2000
|
+
cry /= cr_len;
|
|
2001
|
+
crz /= cr_len;
|
|
2002
|
+
}
|
|
2003
|
+
|
|
2004
|
+
queue.push({
|
|
2005
|
+
level: next_level,
|
|
2006
|
+
generator: rule.target,
|
|
2007
|
+
in_crown: rule.crown_envelope && !dead,
|
|
2008
|
+
dead,
|
|
2009
|
+
parent_branch_id: branch_id,
|
|
2010
|
+
parent_edge_id: parent_e,
|
|
2011
|
+
parent_attach_seg_idx: seg_idx,
|
|
2012
|
+
parent_attach_t: t_attach,
|
|
2013
|
+
attach_parent_vertex: p_v0,
|
|
2014
|
+
start_vertex: -1,
|
|
2015
|
+
px: SCRATCH_POS[0],
|
|
2016
|
+
py: SCRATCH_POS[1],
|
|
2017
|
+
pz: SCRATCH_POS[2],
|
|
2018
|
+
tx: ctx,
|
|
2019
|
+
ty: cty,
|
|
2020
|
+
tz: ctz,
|
|
2021
|
+
rx: crx,
|
|
2022
|
+
ry: cry,
|
|
2023
|
+
rz: crz,
|
|
2024
|
+
emerge_drx: drx,
|
|
2025
|
+
emerge_dry: dry,
|
|
2026
|
+
emerge_drz: drz,
|
|
2027
|
+
length: child_len,
|
|
2028
|
+
full_branch_length: child_len,
|
|
2029
|
+
base_radius: child_base_r * (1.0 - sc.age),
|
|
2030
|
+
start_seg: 0,
|
|
2031
|
+
total_segs: child_segs,
|
|
2032
|
+
shape_segs: Math.max(1, next_cfg.segments),
|
|
2033
|
+
initial_arc_s: 0.0,
|
|
2034
|
+
has_split: false,
|
|
2035
|
+
is_split_fork: false,
|
|
2036
|
+
cum_t0: 0.0,
|
|
2037
|
+
cum_t1: sc.retained
|
|
2038
|
+
});
|
|
2039
|
+
}
|
|
2040
|
+
}
|
|
2041
|
+
}
|
|
2042
|
+
|
|
2043
|
+
// Bottom-up Pipe Model radius calculation & blending
|
|
2044
|
+
tree_skeleton_compute_pipe_radii(out, species);
|
|
2045
|
+
|
|
2046
|
+
// the crown is where the shoot systems grow
|
|
2047
|
+
tree_skeleton_fit_crown_frame(out, species);
|
|
2048
|
+
|
|
2049
|
+
return out;
|
|
2050
|
+
}
|