@woosh/meep-engine 3.52.0 → 3.54.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/package.json +1 -1
- package/src/core/math/noise/worley_noise_2d.d.ts +14 -0
- package/src/core/math/noise/worley_noise_2d.d.ts.map +1 -0
- package/src/core/math/noise/worley_noise_2d.js +74 -0
- package/src/engine/ecs/animation/Animation.d.ts +4 -25
- package/src/engine/ecs/animation/Animation.d.ts.map +1 -1
- package/src/engine/ecs/animation/Animation.js +9 -41
- package/src/engine/ecs/ik/IKGoalSystem.d.ts +4 -5
- package/src/engine/ecs/ik/IKGoalSystem.d.ts.map +1 -1
- package/src/engine/ecs/ik/IKGoalSystem.js +4 -6
- package/src/engine/graphics/ecs/mesh/assetTypeByPath.js +1 -1
- package/src/engine/graphics/texture/atlas/CachingTextureAtlas.d.ts +6 -1
- package/src/engine/graphics/texture/atlas/CachingTextureAtlas.d.ts.map +1 -1
- package/src/engine/graphics/texture/atlas/CachingTextureAtlas.js +363 -325
- package/src/engine/graphics/texture/atlas/ManagedTextureAtlas.d.ts +93 -14
- package/src/engine/graphics/texture/atlas/ManagedTextureAtlas.d.ts.map +1 -1
- package/src/engine/graphics/texture/atlas/ManagedTextureAtlas.js +322 -183
- package/src/engine/graphics/texture/atlas/ReferencedTextureAtlas.d.ts +9 -0
- package/src/engine/graphics/texture/atlas/ReferencedTextureAtlas.d.ts.map +1 -1
- package/src/engine/graphics/texture/atlas/ReferencedTextureAtlas.js +110 -83
- package/src/engine/graphics/texture/atlas/SpriteAtlas.d.ts +42 -0
- package/src/engine/graphics/texture/atlas/SpriteAtlas.d.ts.map +1 -0
- package/src/engine/{graphics3/decal/DecalAtlas.js → graphics/texture/atlas/SpriteAtlas.js} +202 -194
- package/src/engine/graphics/texture/atlas/SpriteAtlasFill.d.ts +12 -0
- package/src/engine/graphics/texture/atlas/SpriteAtlasFill.d.ts.map +1 -0
- package/src/engine/graphics/texture/atlas/SpriteAtlasFill.js +30 -0
- package/src/engine/graphics/texture/atlas/TextureAtlas.d.ts +7 -0
- package/src/engine/graphics/texture/atlas/TextureAtlas.d.ts.map +1 -1
- package/src/engine/graphics/texture/atlas/TextureAtlas.js +11 -1
- package/src/engine/graphics/texture/atlas/sprite_atlas_border.d.ts +52 -0
- package/src/engine/graphics/texture/atlas/sprite_atlas_border.d.ts.map +1 -0
- package/src/engine/{graphics3/decal/decal_atlas_border.js → graphics/texture/atlas/sprite_atlas_border.js} +69 -69
- package/src/engine/graphics3/AnimationGraphSystem.d.ts +9 -22
- package/src/engine/graphics3/AnimationGraphSystem.d.ts.map +1 -1
- package/src/engine/graphics3/AnimationGraphSystem.js +58 -203
- package/src/engine/graphics3/AnimationSystem.d.ts +7 -18
- package/src/engine/graphics3/AnimationSystem.d.ts.map +1 -1
- package/src/engine/graphics3/AnimationSystem.js +62 -243
- package/src/engine/graphics3/DecalSystem.d.ts.map +1 -1
- package/src/engine/graphics3/DecalSystem.js +447 -450
- package/src/engine/graphics3/FoliageWindSystem.d.ts +67 -0
- package/src/engine/graphics3/FoliageWindSystem.d.ts.map +1 -0
- package/src/engine/graphics3/FoliageWindSystem.js +257 -0
- package/src/engine/graphics3/GPUFluidSystem.d.ts +7 -0
- package/src/engine/graphics3/GPUFluidSystem.d.ts.map +1 -1
- package/src/engine/graphics3/GPUFluidSystem.js +39 -1
- package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts +9 -23
- package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts.map +1 -1
- package/src/engine/graphics3/GPUParticleEmitterSystem.js +904 -949
- package/src/engine/graphics3/animation/AnimationClips.d.ts +107 -13
- package/src/engine/graphics3/animation/AnimationClips.d.ts.map +1 -1
- package/src/engine/graphics3/animation/AnimationClips.js +207 -10
- package/src/engine/graphics3/animation/AnimationClipsSink.d.ts +89 -0
- package/src/engine/graphics3/animation/AnimationClipsSink.d.ts.map +1 -0
- package/src/engine/graphics3/animation/AnimationClipsSink.js +205 -0
- package/src/engine/graphics3/animation/FoliageWindRigs.d.ts +43 -0
- package/src/engine/graphics3/animation/FoliageWindRigs.d.ts.map +1 -0
- package/src/engine/graphics3/animation/FoliageWindRigs.js +69 -0
- package/src/engine/graphics3/animation/write_clip_playback.d.ts +17 -11
- package/src/engine/graphics3/animation/write_clip_playback.d.ts.map +1 -1
- package/src/engine/graphics3/animation/write_clip_playback.js +36 -27
- package/src/engine/graphics3/decal/GPUDecalRenderer.d.ts.map +1 -1
- package/src/engine/graphics3/decal/GPUDecalRenderer.js +8 -6
- package/src/engine/graphics3/decal/shader_decal_composite.d.ts.map +1 -1
- package/src/engine/graphics3/decal/shader_decal_composite.js +11 -5
- package/src/engine/graphics3/pose/collect_entity_playbacks.d.ts +7 -7
- package/src/engine/graphics3/pose/collect_entity_playbacks.d.ts.map +1 -1
- package/src/engine/graphics3/pose/collect_entity_playbacks.js +14 -15
- package/src/engine/graphics3/prefab/Prefab.d.ts +6 -0
- package/src/engine/graphics3/prefab/Prefab.d.ts.map +1 -1
- package/src/engine/graphics3/prefab/Prefab.js +169 -162
- package/src/engine/graphics3/prefab/prefab_compile.d.ts.map +1 -1
- package/src/engine/graphics3/prefab/prefab_compile.js +369 -334
- package/src/engine/graphics3/prefab/prefab_instantiate.d.ts.map +1 -1
- package/src/engine/graphics3/prefab/prefab_instantiate.js +43 -2
- package/src/engine/graphics3/terrain/chunk_terrain_material_surface.js +2 -2
- package/src/engine/physics/ecs/ContactProbeSystem.d.ts +2 -3
- package/src/engine/physics/ecs/ContactProbeSystem.d.ts.map +1 -1
- package/src/engine/physics/ecs/ContactProbeSystem.js +2 -4
- package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
- package/src/engine/sound/simulation/PROBE_PLACEMENT.md +4 -4
- package/src/engine/sound/simulation/README.md +1 -1
- package/src/engine/sound/simulation/probe/bakeProbeField.d.ts +22 -8
- package/src/engine/sound/simulation/probe/bakeProbeField.d.ts.map +1 -1
- package/src/engine/sound/simulation/probe/bakeProbeField.js +60 -15
- package/src/engine/sound/simulation/probe/bakeProbeReflectors.d.ts.map +1 -1
- package/src/engine/sound/simulation/probe/bakeProbeReflectors.js +19 -23
- package/src/engine/sound/simulation/probe/probe_sdf_grid.d.ts +63 -17
- package/src/engine/sound/simulation/probe/probe_sdf_grid.d.ts.map +1 -1
- package/src/engine/sound/simulation/probe/probe_sdf_grid.js +67 -17
- package/src/generation/foliage/FOLIAGE_DESIGN.md +319 -0
- package/src/generation/foliage/FOLIAGE_PLAN.md +198 -0
- package/src/generation/foliage/animation/build_tree_wind_rig.d.ts +20 -0
- package/src/generation/foliage/animation/build_tree_wind_rig.d.ts.map +1 -0
- package/src/generation/foliage/animation/build_tree_wind_rig.js +108 -0
- package/src/generation/foliage/asset/TreeAsset.d.ts +86 -0
- package/src/generation/foliage/asset/TreeAsset.d.ts.map +1 -0
- package/src/generation/foliage/asset/TreeAsset.js +111 -0
- package/src/generation/foliage/asset/TreeLODAsset.d.ts +115 -0
- package/src/generation/foliage/asset/TreeLODAsset.d.ts.map +1 -0
- package/src/generation/foliage/asset/TreeLODAsset.js +346 -0
- package/src/generation/foliage/asset/generate_tree.d.ts +15 -0
- package/src/generation/foliage/asset/generate_tree.d.ts.map +1 -0
- package/src/generation/foliage/asset/generate_tree.js +93 -0
- package/src/generation/foliage/asset/place_tree.d.ts +82 -0
- package/src/generation/foliage/asset/place_tree.d.ts.map +1 -0
- package/src/generation/foliage/asset/place_tree.js +194 -0
- package/src/generation/foliage/config/BarkMaterialConfig.d.ts +121 -0
- package/src/generation/foliage/config/BarkMaterialConfig.d.ts.map +1 -0
- package/src/generation/foliage/config/BarkMaterialConfig.js +250 -0
- package/src/generation/foliage/config/BranchLevelConfig.d.ts +288 -0
- package/src/generation/foliage/config/BranchLevelConfig.d.ts.map +1 -0
- package/src/generation/foliage/config/BranchLevelConfig.js +536 -0
- package/src/generation/foliage/config/CrownConfig.d.ts +100 -0
- package/src/generation/foliage/config/CrownConfig.d.ts.map +1 -0
- package/src/generation/foliage/config/CrownConfig.js +186 -0
- package/src/generation/foliage/config/CrownEnvelopeType.d.ts +16 -0
- package/src/generation/foliage/config/CrownEnvelopeType.d.ts.map +1 -0
- package/src/generation/foliage/config/CrownEnvelopeType.js +17 -0
- package/src/generation/foliage/config/FoliageBarkType.d.ts +11 -0
- package/src/generation/foliage/config/FoliageBarkType.d.ts.map +1 -0
- package/src/generation/foliage/config/FoliageBarkType.js +16 -0
- package/src/generation/foliage/config/FoliageCardType.d.ts +12 -0
- package/src/generation/foliage/config/FoliageCardType.d.ts.map +1 -0
- package/src/generation/foliage/config/FoliageCardType.js +18 -0
- package/src/generation/foliage/config/FoliageConfig.d.ts +151 -0
- package/src/generation/foliage/config/FoliageConfig.d.ts.map +1 -0
- package/src/generation/foliage/config/FoliageConfig.js +283 -0
- package/src/generation/foliage/config/FoliageMaterialConfig.d.ts +143 -0
- package/src/generation/foliage/config/FoliageMaterialConfig.d.ts.map +1 -0
- package/src/generation/foliage/config/FoliageMaterialConfig.js +279 -0
- package/src/generation/foliage/config/PhyllotaxisMode.d.ts +13 -0
- package/src/generation/foliage/config/PhyllotaxisMode.d.ts.map +1 -0
- package/src/generation/foliage/config/PhyllotaxisMode.js +20 -0
- package/src/generation/foliage/config/TreeLODConfig.d.ts +87 -0
- package/src/generation/foliage/config/TreeLODConfig.d.ts.map +1 -0
- package/src/generation/foliage/config/TreeLODConfig.js +211 -0
- package/src/generation/foliage/config/TreePreset.d.ts +16 -0
- package/src/generation/foliage/config/TreePreset.d.ts.map +1 -0
- package/src/generation/foliage/config/TreePreset.js +17 -0
- package/src/generation/foliage/config/TreeSpeciesConfig.d.ts +109 -0
- package/src/generation/foliage/config/TreeSpeciesConfig.d.ts.map +1 -0
- package/src/generation/foliage/config/TreeSpeciesConfig.js +400 -0
- package/src/generation/foliage/config/TreeWindConfig.d.ts +84 -0
- package/src/generation/foliage/config/TreeWindConfig.d.ts.map +1 -0
- package/src/generation/foliage/config/TreeWindConfig.js +157 -0
- package/src/generation/foliage/index.d.ts +39 -0
- package/src/generation/foliage/index.d.ts.map +1 -0
- package/src/generation/foliage/index.js +44 -0
- package/src/generation/foliage/material/make_bark_material.d.ts +37 -0
- package/src/generation/foliage/material/make_bark_material.d.ts.map +1 -0
- package/src/generation/foliage/material/make_bark_material.js +730 -0
- package/src/generation/foliage/material/make_foliage_material.d.ts +40 -0
- package/src/generation/foliage/material/make_foliage_material.d.ts.map +1 -0
- package/src/generation/foliage/material/make_foliage_material.js +605 -0
- package/src/generation/foliage/mesh/branch_collar_project.d.ts +42 -0
- package/src/generation/foliage/mesh/branch_collar_project.d.ts.map +1 -0
- package/src/generation/foliage/mesh/branch_collar_project.js +205 -0
- package/src/generation/foliage/mesh/branch_ring_triangulate.d.ts +35 -0
- package/src/generation/foliage/mesh/branch_ring_triangulate.d.ts.map +1 -0
- package/src/generation/foliage/mesh/branch_ring_triangulate.js +72 -0
- package/src/generation/foliage/mesh/foliage_collect_attachments.d.ts +95 -0
- package/src/generation/foliage/mesh/foliage_collect_attachments.d.ts.map +1 -0
- package/src/generation/foliage/mesh/foliage_collect_attachments.js +569 -0
- package/src/generation/foliage/mesh/tree_mesh_apply_canopy_ao.d.ts +19 -0
- package/src/generation/foliage/mesh/tree_mesh_apply_canopy_ao.d.ts.map +1 -0
- package/src/generation/foliage/mesh/tree_mesh_apply_canopy_ao.js +150 -0
- package/src/generation/foliage/mesh/tree_mesh_build_bark.d.ts +55 -0
- package/src/generation/foliage/mesh/tree_mesh_build_bark.d.ts.map +1 -0
- package/src/generation/foliage/mesh/tree_mesh_build_bark.js +1049 -0
- package/src/generation/foliage/mesh/tree_mesh_build_foliage.d.ts +22 -0
- package/src/generation/foliage/mesh/tree_mesh_build_foliage.d.ts.map +1 -0
- package/src/generation/foliage/mesh/tree_mesh_build_foliage.js +454 -0
- package/src/generation/foliage/presets/make_tree_species_preset.d.ts +13 -0
- package/src/generation/foliage/presets/make_tree_species_preset.d.ts.map +1 -0
- package/src/generation/foliage/presets/make_tree_species_preset.js +870 -0
- package/src/generation/foliage/skeleton/TreeSkeleton.d.ts +443 -0
- package/src/generation/foliage/skeleton/TreeSkeleton.d.ts.map +1 -0
- package/src/generation/foliage/skeleton/TreeSkeleton.js +1100 -0
- package/src/generation/foliage/skeleton/crown_envelope_evaluate.d.ts +27 -0
- package/src/generation/foliage/skeleton/crown_envelope_evaluate.d.ts.map +1 -0
- package/src/generation/foliage/skeleton/crown_envelope_evaluate.js +121 -0
- package/src/generation/foliage/skeleton/spine_frame_double_reflection.d.ts +32 -0
- package/src/generation/foliage/skeleton/spine_frame_double_reflection.d.ts.map +1 -0
- package/src/generation/foliage/skeleton/spine_frame_double_reflection.js +87 -0
- package/src/generation/foliage/skeleton/tree_skeleton_assign_skin_joints.d.ts +33 -0
- package/src/generation/foliage/skeleton/tree_skeleton_assign_skin_joints.d.ts.map +1 -0
- package/src/generation/foliage/skeleton/tree_skeleton_assign_skin_joints.js +205 -0
- package/src/generation/foliage/skeleton/tree_skeleton_compute_pipe_radii.d.ts +17 -0
- package/src/generation/foliage/skeleton/tree_skeleton_compute_pipe_radii.d.ts.map +1 -0
- package/src/generation/foliage/skeleton/tree_skeleton_compute_pipe_radii.js +206 -0
- package/src/generation/foliage/skeleton/tree_skeleton_grow.d.ts +18 -0
- package/src/generation/foliage/skeleton/tree_skeleton_grow.d.ts.map +1 -0
- package/src/generation/foliage/skeleton/tree_skeleton_grow.js +1871 -0
- package/src/shade/playground/additive_blending/index.html +197 -0
- package/src/shade/playground/additive_blending/main.d.ts +2 -0
- package/src/shade/playground/additive_blending/main.d.ts.map +1 -0
- package/src/shade/playground/additive_blending/main.js +529 -0
- package/src/shade/playground/foliage_wind/README.md +18 -0
- package/src/shade/playground/foliage_wind/foliage_world.d.ts +133 -0
- package/src/shade/playground/foliage_wind/foliage_world.d.ts.map +1 -0
- package/src/shade/playground/foliage_wind/foliage_world.js +602 -0
- package/src/shade/playground/foliage_wind/index.html +260 -0
- package/src/shade/playground/foliage_wind/main.d.ts +2 -0
- package/src/shade/playground/foliage_wind/main.d.ts.map +1 -0
- package/src/shade/playground/foliage_wind/main.js +275 -0
- package/src/shade/renderer/Renderer.d.ts.map +1 -1
- package/src/shade/renderer/Renderer.js +45 -16
- package/src/shade/renderer/animation/ADDITIVE_BLENDING_PLAN.md +145 -0
- package/src/shade/renderer/animation/ANIMATION_DATABASE_SPEC.d.ts +9 -1
- package/src/shade/renderer/animation/ANIMATION_DATABASE_SPEC.d.ts.map +1 -1
- package/src/shade/renderer/animation/ANIMATION_DATABASE_SPEC.js +53 -1
- package/src/shade/renderer/animation/ANIMATION_FOLIAGE_JOINT_STRUCT.d.ts +8 -0
- package/src/shade/renderer/animation/ANIMATION_FOLIAGE_JOINT_STRUCT.d.ts.map +1 -0
- package/src/shade/renderer/animation/ANIMATION_FOLIAGE_JOINT_STRUCT.js +71 -0
- package/src/shade/renderer/animation/ANIMATION_FOLIAGE_RIG_STRUCT.d.ts +11 -0
- package/src/shade/renderer/animation/ANIMATION_FOLIAGE_RIG_STRUCT.d.ts.map +1 -0
- package/src/shade/renderer/animation/ANIMATION_FOLIAGE_RIG_STRUCT.js +32 -0
- package/src/shade/renderer/animation/GPUAnimationManager.d.ts +30 -3
- package/src/shade/renderer/animation/GPUAnimationManager.d.ts.map +1 -1
- package/src/shade/renderer/animation/GPUAnimationManager.js +532 -79
- package/src/shade/renderer/animation/POSE_ACCUMULATOR_LAYOUT.d.ts +19 -12
- package/src/shade/renderer/animation/POSE_ACCUMULATOR_LAYOUT.d.ts.map +1 -1
- package/src/shade/renderer/animation/POSE_ACCUMULATOR_LAYOUT.js +20 -13
- package/src/shade/renderer/animation/ShadeAnimationClip.d.ts +35 -8
- package/src/shade/renderer/animation/ShadeAnimationClip.d.ts.map +1 -1
- package/src/shade/renderer/animation/ShadeAnimationClip.js +433 -2
- package/src/shade/renderer/animation/chunk_pose_accumulator.d.ts.map +1 -1
- package/src/shade/renderer/animation/chunk_pose_accumulator.js +40 -32
- package/src/shade/renderer/animation/foliage/FoliageWindJoint.d.ts +97 -0
- package/src/shade/renderer/animation/foliage/FoliageWindJoint.d.ts.map +1 -0
- package/src/shade/renderer/animation/foliage/FoliageWindJoint.js +161 -0
- package/src/shade/renderer/animation/foliage/FoliageWindRig.d.ts +65 -0
- package/src/shade/renderer/animation/foliage/FoliageWindRig.d.ts.map +1 -0
- package/src/shade/renderer/animation/foliage/FoliageWindRig.js +89 -0
- package/src/shade/renderer/animation/foliage/chunk_foliage_wind_step.d.ts +19 -0
- package/src/shade/renderer/animation/foliage/chunk_foliage_wind_step.d.ts.map +1 -0
- package/src/shade/renderer/animation/foliage/chunk_foliage_wind_step.js +143 -0
- package/src/shade/renderer/animation/foliage/shader_foliage_wind_apply.d.ts +14 -0
- package/src/shade/renderer/animation/foliage/shader_foliage_wind_apply.d.ts.map +1 -0
- package/src/shade/renderer/animation/foliage/shader_foliage_wind_apply.js +116 -0
- package/src/shade/renderer/animation/pose/pose_evaluate_local.d.ts.map +1 -1
- package/src/shade/renderer/animation/pose/pose_evaluate_local.js +39 -29
- package/src/shade/renderer/animation/shader_animation_pose_resolve.js +37 -37
- package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.js +2 -2
- package/src/shade/renderer/extension/RenderExtension.d.ts +7 -0
- package/src/shade/renderer/extension/RenderExtension.d.ts.map +1 -1
- package/src/shade/renderer/extension/RenderExtension.js +9 -0
- package/src/shade/renderer/extension/RenderExtensionRegistry.d.ts +6 -0
- package/src/shade/renderer/extension/RenderExtensionRegistry.d.ts.map +1 -1
- package/src/shade/renderer/extension/RenderExtensionRegistry.js +15 -0
- package/src/shade/renderer/fluid/GPUFluidCascade.d.ts +10 -3
- package/src/shade/renderer/fluid/GPUFluidCascade.d.ts.map +1 -1
- package/src/shade/renderer/fluid/GPUFluidCascade.js +15 -0
- package/src/shade/renderer/fluid/GPUFluidCascadeStack.d.ts +8 -1
- package/src/shade/renderer/fluid/GPUFluidCascadeStack.d.ts.map +1 -1
- package/src/shade/renderer/fluid/GPUFluidCascadeStack.js +11 -0
- package/src/shade/renderer/fluid/coupling/chunk_fluid_cascade_parent.d.ts.map +1 -1
- package/src/shade/renderer/fluid/coupling/chunk_fluid_cascade_parent.js +51 -48
- package/src/shade/renderer/fluid/forcing/GPUFluidForcing.d.ts +6 -6
- package/src/shade/renderer/fluid/mac/FluidMacPasses.d.ts +6 -0
- package/src/shade/renderer/fluid/mac/FluidMacPasses.d.ts.map +1 -1
- package/src/shade/renderer/fluid/mac/FluidMacPasses.js +16 -0
- package/src/shade/renderer/fluid/mac/chunk_fluid_mac_seams.d.ts.map +1 -1
- package/src/shade/renderer/fluid/mac/chunk_fluid_mac_seams.js +15 -3
- package/src/shade/renderer/fluid/mac/chunk_v3_mac_lattice_corners.d.ts.map +1 -1
- package/src/shade/renderer/fluid/mac/chunk_v3_mac_lattice_corners.js +102 -96
- package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_correct.js +12 -12
- package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_predict.js +12 -12
- package/src/shade/renderer/fluid/pressure/GPUFluidPressureSolve.d.ts +8 -1
- package/src/shade/renderer/fluid/pressure/GPUFluidPressureSolve.d.ts.map +1 -1
- package/src/shade/renderer/fluid/pressure/GPUFluidPressureSolve.js +16 -0
- package/src/shade/renderer/fluid/publish/FluidWindPublish.d.ts +7 -0
- package/src/shade/renderer/fluid/publish/FluidWindPublish.d.ts.map +1 -1
- package/src/shade/renderer/fluid/publish/FluidWindPublish.js +10 -0
- package/src/shade/renderer/fluid/query/GPUFluidQueries.d.ts +1 -1
- package/src/shade/renderer/geometry/bvh/GPUBLASRefitBatch.js +2 -2
- package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.js +1 -1
- package/src/shade/renderer/hiz/HierarchicalZBuffer.d.ts +3 -3
- package/src/shade/renderer/hiz/HierarchicalZBuffer.d.ts.map +1 -1
- package/src/shade/renderer/hiz/HierarchicalZBuffer.js +350 -294
- package/src/shade/renderer/hiz/generate_downsampler_code.d.ts +0 -2
- package/src/shade/renderer/hiz/generate_downsampler_code.d.ts.map +1 -1
- package/src/shade/renderer/hiz/generate_downsampler_code.js +99 -100
- package/src/shade/renderer/hiz/hzb_pick_alignment.d.ts +15 -0
- package/src/shade/renderer/hiz/hzb_pick_alignment.d.ts.map +1 -0
- package/src/shade/renderer/hiz/hzb_pick_alignment.js +148 -0
- package/src/shade/renderer/hiz/hzb_plan_reduction_steps.d.ts +28 -0
- package/src/shade/renderer/hiz/hzb_plan_reduction_steps.d.ts.map +1 -0
- package/src/shade/renderer/hiz/hzb_plan_reduction_steps.js +58 -0
- package/src/shade/renderer/hiz/shader_hzb_reduce_any.d.ts +5 -5
- package/src/shade/renderer/hiz/shader_hzb_reduce_any.d.ts.map +1 -1
- package/src/shade/renderer/hiz/shader_hzb_reduce_any.js +57 -67
- package/src/shade/renderer/hiz/shader_hzb_reduce_mip0_clip.d.ts +3 -3
- package/src/shade/renderer/hiz/shader_hzb_reduce_mip0_clip.d.ts.map +1 -1
- package/src/shade/renderer/hiz/shader_hzb_reduce_mip0_clip.js +111 -112
- package/src/shade/renderer/hiz/shader_hzb_spd.d.ts +5 -0
- package/src/shade/renderer/hiz/shader_hzb_spd.d.ts.map +1 -0
- package/src/shade/renderer/hiz/shader_hzb_spd.js +160 -0
- package/src/shade/renderer/light/GPULightCollection.d.ts +8 -0
- package/src/shade/renderer/light/GPULightCollection.d.ts.map +1 -1
- package/src/shade/renderer/light/GPULightCollection.js +67 -0
- package/src/shade/renderer/light/environment/FAR_FIELD_IRRADIANCE_SH_RESOURCE.d.ts +7 -0
- package/src/shade/renderer/light/environment/FAR_FIELD_IRRADIANCE_SH_RESOURCE.d.ts.map +1 -0
- package/src/shade/renderer/light/environment/FAR_FIELD_IRRADIANCE_SH_RESOURCE.js +13 -0
- package/src/shade/renderer/light/environment/shader_project_far_field_irradiance_sh.d.ts +10 -0
- package/src/shade/renderer/light/environment/shader_project_far_field_irradiance_sh.d.ts.map +1 -0
- package/src/shade/renderer/light/environment/shader_project_far_field_irradiance_sh.js +72 -0
- package/src/shade/renderer/light/world_cluster/WORLD_LIGHT_CLUSTER.d.ts +39 -0
- package/src/shade/renderer/light/world_cluster/WORLD_LIGHT_CLUSTER.d.ts.map +1 -0
- package/src/shade/renderer/light/world_cluster/WORLD_LIGHT_CLUSTER.js +90 -0
- package/src/shade/renderer/light/world_cluster/chunk_world_light_cluster_lookup.d.ts +12 -0
- package/src/shade/renderer/light/world_cluster/chunk_world_light_cluster_lookup.d.ts.map +1 -0
- package/src/shade/renderer/light/world_cluster/chunk_world_light_cluster_lookup.js +56 -0
- package/src/shade/renderer/light/world_cluster/graph_build_world_light_clusters.d.ts +31 -0
- package/src/shade/renderer/light/world_cluster/graph_build_world_light_clusters.d.ts.map +1 -0
- package/src/shade/renderer/light/world_cluster/graph_build_world_light_clusters.js +196 -0
- package/src/shade/renderer/light/world_cluster/shader_world_cluster_assign_lights.d.ts +10 -0
- package/src/shade/renderer/light/world_cluster/shader_world_cluster_assign_lights.d.ts.map +1 -0
- package/src/shade/renderer/light/world_cluster/shader_world_cluster_assign_lights.js +163 -0
- package/src/shade/renderer/light/world_cluster/shader_world_cluster_cull_lights.d.ts +4 -0
- package/src/shade/renderer/light/world_cluster/shader_world_cluster_cull_lights.d.ts.map +1 -0
- package/src/shade/renderer/light/world_cluster/shader_world_cluster_cull_lights.js +137 -0
- package/src/shade/renderer/loader/SceneBundle.d.ts +7 -0
- package/src/shade/renderer/loader/SceneBundle.d.ts.map +1 -1
- package/src/shade/renderer/loader/SceneBundle.js +119 -111
- package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
- package/src/shade/renderer/material/standard/fragment_gbuffer.d.ts +4 -0
- package/src/shade/renderer/material/standard/fragment_gbuffer.d.ts.map +1 -1
- package/src/shade/renderer/material/standard/fragment_gbuffer.js +6 -5
- package/src/shade/renderer/object_property/chunk_write_object_property_node3d.d.ts +8 -7
- package/src/shade/renderer/object_property/chunk_write_object_property_node3d.d.ts.map +1 -1
- package/src/shade/renderer/object_property/chunk_write_object_property_node3d.js +9 -8
- package/src/shade/renderer/particles/GPUParticleSystem.d.ts.map +1 -1
- package/src/shade/renderer/particles/GPUParticleSystem.js +4 -1
- package/src/shade/renderer/particles/graph_particles_avboit.d.ts +4 -3
- package/src/shade/renderer/particles/graph_particles_avboit.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph_particles_avboit.js +28 -11
- package/src/shade/renderer/particles/shaders/chunk_particle_lighting.d.ts +9 -13
- package/src/shade/renderer/particles/shaders/chunk_particle_lighting.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/chunk_particle_lighting.js +25 -20
- package/src/shade/renderer/particles/shaders/shader_particle_avboit_draw.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/shader_particle_avboit_draw.js +22 -34
- package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -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 +9 -7
- package/src/shade/renderer/rasterize/forward/chunk_forward_shade_standard_fragment.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/forward/chunk_forward_shade_standard_fragment.js +15 -7
- package/src/shade/renderer/rasterize/native/avboit/avboit_draw_fragment_body.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/avboit/avboit_draw_fragment_body.js +6 -4
- package/src/shade/renderer/rasterize/native/oit/oit_resolve_fragment_body.js +3 -3
- package/src/shade/renderer/rasterize/native/oit/shader_oit_generate_moments.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/oit/shader_oit_generate_moments.js +8 -5
- package/src/shade/renderer/rasterize/native/viz/viz_rasterization_alpha_tested_pass_descriptor.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/viz/viz_rasterization_alpha_tested_pass_descriptor.js +4 -3
- package/src/shade/renderer/shader/chunk/depth/chunk_query_depth_from_screen_space_bb.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/depth/chunk_query_depth_from_screen_space_bb.js +62 -62
- package/src/shade/renderer/shader/chunk/random/lowbias/chunk_hash_lowbias32_vec2u.d.ts +6 -0
- package/src/shade/renderer/shader/chunk/random/lowbias/chunk_hash_lowbias32_vec2u.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/random/lowbias/chunk_hash_lowbias32_vec2u.js +19 -0
- package/src/shade/renderer/shader/chunk/screen_space/chunk_ffx_sssr_get_mip_resolution.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/screen_space/chunk_ffx_sssr_get_mip_resolution.js +16 -10
- package/src/shade/renderer/shader/chunk/screen_space/chunk_ffx_sssr_hierarchical_raymarch.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/screen_space/chunk_ffx_sssr_hierarchical_raymarch.js +118 -117
- package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.js +1 -1
- package/src/shade/renderer/texture/SAMPLER_ANISOTROPIC_CLAMP.d.ts +9 -0
- package/src/shade/renderer/texture/SAMPLER_ANISOTROPIC_CLAMP.d.ts.map +1 -0
- package/src/shade/renderer/texture/SAMPLER_ANISOTROPIC_CLAMP.js +17 -0
- package/src/shade/renderer/texture/SAMPLER_LINEAR_UPSCALE.d.ts +8 -0
- package/src/shade/renderer/texture/SAMPLER_LINEAR_UPSCALE.d.ts.map +1 -1
- package/src/shade/renderer/texture/SAMPLER_LINEAR_UPSCALE.js +28 -20
- package/src/shade/renderer/texture/SAMPLER_TRILINEAR_CLAMP.d.ts +8 -0
- package/src/shade/renderer/texture/SAMPLER_TRILINEAR_CLAMP.d.ts.map +1 -0
- package/src/shade/renderer/texture/SAMPLER_TRILINEAR_CLAMP.js +15 -0
- package/src/shade/renderer/texture/atlas/GPUTileAtlas3D.d.ts +41 -7
- package/src/shade/renderer/texture/atlas/GPUTileAtlas3D.d.ts.map +1 -1
- package/src/shade/renderer/texture/atlas/GPUTileAtlas3D.js +162 -58
- package/src/shade/renderer/view/chunk_view_mip_bias.d.ts +21 -0
- package/src/shade/renderer/view/chunk_view_mip_bias.d.ts.map +1 -0
- package/src/shade/renderer/view/chunk_view_mip_bias.js +44 -0
- package/src/shade/renderer/volumetrics/GPUSceneVolumetrics.js +1 -1
- package/src/shade/renderer/volumetrics/GPUViewVolumetrics.d.ts +10 -12
- package/src/shade/renderer/volumetrics/GPUViewVolumetrics.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/GPUViewVolumetrics.js +583 -606
- package/src/shade/renderer/volumetrics/chunk_volumetrics_froxel_sample.d.ts +24 -0
- package/src/shade/renderer/volumetrics/chunk_volumetrics_froxel_sample.d.ts.map +1 -0
- package/src/shade/renderer/volumetrics/gi/chunk_volumetrics_gi_sample.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/graph_build_volumetrics.d.ts +1 -1
- package/src/shade/renderer/volumetrics/graph_build_volumetrics.js +640 -640
- package/src/shade/renderer/volumetrics/irradiance_clipmap/GPUIrradianceClipmap.d.ts +113 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/GPUIrradianceClipmap.d.ts.map +1 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/GPUIrradianceClipmap.js +484 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/IRRADIANCE_CLIPMAP.d.ts +50 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/IRRADIANCE_CLIPMAP.d.ts.map +1 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/IRRADIANCE_CLIPMAP.js +60 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/IRRADIANCE_CLIPMAP_STRUCT.d.ts +25 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/IRRADIANCE_CLIPMAP_STRUCT.d.ts.map +1 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/IRRADIANCE_CLIPMAP_STRUCT.js +47 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/IrradianceCascadePlacement.d.ts +74 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/IrradianceCascadePlacement.d.ts.map +1 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/IrradianceCascadePlacement.js +173 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_gi_sample.d.ts +26 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_gi_sample.d.ts.map +1 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_gi_sample.js +83 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_local_light.d.ts +31 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_local_light.d.ts.map +1 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_local_light.js +113 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_sample.d.ts +121 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_sample.d.ts.map +1 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_sample.js +356 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/shader_irradiance_clipmap_build.d.ts +16 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/shader_irradiance_clipmap_build.d.ts.map +1 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/shader_irradiance_clipmap_build.js +191 -0
- package/src/shade/renderer/volumetrics/shader_volumetrics_classify_froxels.d.ts +16 -0
- package/src/shade/renderer/volumetrics/shader_volumetrics_classify_froxels.d.ts.map +1 -0
- package/src/shade/renderer/volumetrics/shader_volumetrics_lighting_regimes.d.ts +23 -0
- package/src/shade/renderer/volumetrics/shader_volumetrics_lighting_regimes.d.ts.map +1 -0
- package/src/shade/renderer/wind/GPUSceneWind.d.ts +1 -1
- package/src/shade/renderer/wind/GPUSceneWind.js +1 -1
- package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js +1 -1
- package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts.map +1 -1
- package/src/shade/wgsl/emulator/WGSLLanguageCore.js +105 -26
- package/src/engine/graphics/composit/CompositingStages.d.ts +0 -6
- package/src/engine/graphics/composit/CompositingStages.d.ts.map +0 -1
- package/src/engine/graphics/composit/CompositingStages.js +0 -8
- package/src/engine/graphics/geometry/buffered/computeBufferAttributeHash.d.ts +0 -7
- package/src/engine/graphics/geometry/buffered/computeBufferAttributeHash.d.ts.map +0 -1
- package/src/engine/graphics/geometry/buffered/computeBufferAttributeHash.js +0 -24
- package/src/engine/graphics/geometry/buffered/computeGeometryBoundingSphereMiniball.d.ts +0 -8
- package/src/engine/graphics/geometry/buffered/computeGeometryBoundingSphereMiniball.d.ts.map +0 -1
- package/src/engine/graphics/geometry/buffered/computeGeometryBoundingSphereMiniball.js +0 -17
- package/src/engine/graphics/geometry/buffered/computeGeometryEquality.d.ts +0 -8
- package/src/engine/graphics/geometry/buffered/computeGeometryEquality.d.ts.map +0 -1
- package/src/engine/graphics/geometry/buffered/computeGeometryEquality.js +0 -60
- package/src/engine/graphics/geometry/buffered/computeGeometryHash.d.ts +0 -7
- package/src/engine/graphics/geometry/buffered/computeGeometryHash.d.ts.map +0 -1
- package/src/engine/graphics/geometry/buffered/computeGeometryHash.js +0 -26
- package/src/engine/graphics/geometry/buffered/compute_buffer_geometry_byte_size.d.ts +0 -7
- package/src/engine/graphics/geometry/buffered/compute_buffer_geometry_byte_size.d.ts.map +0 -1
- package/src/engine/graphics/geometry/buffered/compute_buffer_geometry_byte_size.js +0 -23
- package/src/engine/graphics/geometry/instancing/geometry_copy.d.ts +0 -7
- package/src/engine/graphics/geometry/instancing/geometry_copy.d.ts.map +0 -1
- package/src/engine/graphics/geometry/instancing/geometry_copy.js +0 -15
- package/src/engine/graphics/geometry/instancing/rewriteMaterial.d.ts +0 -2
- package/src/engine/graphics/geometry/instancing/rewriteMaterial.d.ts.map +0 -1
- package/src/engine/graphics/geometry/instancing/rewriteMaterial.js +0 -57
- package/src/engine/graphics/geometry/ribbon/Quad.d.ts +0 -96
- package/src/engine/graphics/geometry/ribbon/Quad.d.ts.map +0 -1
- package/src/engine/graphics/geometry/ribbon/Quad.js +0 -213
- package/src/engine/graphics/geometry/ribbon/copyAttributeV3.d.ts +0 -9
- package/src/engine/graphics/geometry/ribbon/copyAttributeV3.d.ts.map +0 -1
- package/src/engine/graphics/geometry/ribbon/copyAttributeV3.js +0 -12
- package/src/engine/graphics/geometry/ribbon/copyAttributeValue.d.ts +0 -10
- package/src/engine/graphics/geometry/ribbon/copyAttributeValue.d.ts.map +0 -1
- package/src/engine/graphics/geometry/ribbon/copyAttributeValue.js +0 -17
- package/src/engine/graphics/geometry/ribbon/equalAttributeV3.d.ts +0 -10
- package/src/engine/graphics/geometry/ribbon/equalAttributeV3.d.ts.map +0 -1
- package/src/engine/graphics/geometry/ribbon/equalAttributeV3.js +0 -13
- package/src/engine/graphics/geometry/ribbon/equalAttributeValue.d.ts +0 -11
- package/src/engine/graphics/geometry/ribbon/equalAttributeValue.d.ts.map +0 -1
- package/src/engine/graphics/geometry/ribbon/equalAttributeValue.js +0 -24
- package/src/engine/graphics/geometry/ribbon/rotateRibbon.d.ts +0 -6
- package/src/engine/graphics/geometry/ribbon/rotateRibbon.d.ts.map +0 -1
- package/src/engine/graphics/geometry/ribbon/rotateRibbon.js +0 -37
- package/src/engine/graphics/geometry/ribbon/updateTipPosition.d.ts +0 -9
- package/src/engine/graphics/geometry/ribbon/updateTipPosition.d.ts.map +0 -1
- package/src/engine/graphics/geometry/ribbon/updateTipPosition.js +0 -52
- package/src/engine/graphics/geometry/skining/computeSkinnedMeshVertices.d.ts +0 -8
- package/src/engine/graphics/geometry/skining/computeSkinnedMeshVertices.d.ts.map +0 -1
- package/src/engine/graphics/geometry/skining/computeSkinnedMeshVertices.js +0 -54
- package/src/engine/graphics/render/RenderPassType.d.ts +0 -6
- package/src/engine/graphics/render/RenderPassType.d.ts.map +0 -1
- package/src/engine/graphics/render/RenderPassType.js +0 -8
- package/src/engine/graphics/render/layers/RenderLayer.d.ts +0 -78
- package/src/engine/graphics/render/layers/RenderLayer.d.ts.map +0 -1
- package/src/engine/graphics/render/layers/RenderLayer.js +0 -95
- package/src/engine/graphics/render/layers/RenderLayerManager.d.ts +0 -72
- package/src/engine/graphics/render/layers/RenderLayerManager.d.ts.map +0 -1
- package/src/engine/graphics/render/layers/RenderLayerManager.js +0 -160
- package/src/engine/graphics/render/layers/RenderLayerManagerState.d.ts +0 -18
- package/src/engine/graphics/render/layers/RenderLayerManagerState.d.ts.map +0 -1
- package/src/engine/graphics/render/layers/RenderLayerManagerState.js +0 -48
- package/src/engine/graphics/render/layers/RenderLayerState.d.ts +0 -18
- package/src/engine/graphics/render/layers/RenderLayerState.d.ts.map +0 -1
- package/src/engine/graphics/render/layers/RenderLayerState.js +0 -27
- package/src/engine/graphics/render/layers/RenderLayerUtils.d.ts +0 -8
- package/src/engine/graphics/render/layers/RenderLayerUtils.d.ts.map +0 -1
- package/src/engine/graphics/render/layers/RenderLayerUtils.js +0 -103
- package/src/engine/graphics/render/make_bvh_visibility_builder.d.ts +0 -10
- package/src/engine/graphics/render/make_bvh_visibility_builder.d.ts.map +0 -1
- package/src/engine/graphics/render/make_bvh_visibility_builder.js +0 -64
- package/src/engine/graphics/render/view/CameraViewFlags.d.ts +0 -7
- package/src/engine/graphics/render/view/CameraViewFlags.d.ts.map +0 -1
- package/src/engine/graphics/render/view/CameraViewFlags.js +0 -9
- package/src/engine/graphics/render/visibility/IncrementalDeltaSet.d.ts +0 -143
- package/src/engine/graphics/render/visibility/IncrementalDeltaSet.d.ts.map +0 -1
- package/src/engine/graphics/render/visibility/IncrementalDeltaSet.js +0 -328
- package/src/engine/graphics/render/visibility/VisibilityComputer.d.ts +0 -39
- package/src/engine/graphics/render/visibility/VisibilityComputer.d.ts.map +0 -1
- package/src/engine/graphics/render/visibility/VisibilityComputer.js +0 -80
- package/src/engine/graphics/render/visibility/VisibilityFilter.d.ts +0 -29
- package/src/engine/graphics/render/visibility/VisibilityFilter.d.ts.map +0 -1
- package/src/engine/graphics/render/visibility/VisibilityFilter.js +0 -37
- package/src/engine/graphics3/animation/write_graph_playback.d.ts +0 -24
- package/src/engine/graphics3/animation/write_graph_playback.d.ts.map +0 -1
- package/src/engine/graphics3/animation/write_graph_playback.js +0 -48
- package/src/engine/graphics3/decal/DecalAtlasFill.js +0 -32
- package/src/shade/renderer/volumetrics/gi/chunk_volumetrics_froxel_centre_ws.js +0 -49
- package/src/shade/renderer/volumetrics/gi/chunk_volumetrics_gi.js +0 -50
- package/src/shade/renderer/volumetrics/gi/chunk_volumetrics_gi_sample.js +0 -105
- package/src/shade/renderer/volumetrics/gi/graph_build_froxel_gi.js +0 -80
- package/src/shade/renderer/volumetrics/gi/shader_volumetrics_gi.js +0 -51
- package/src/shade/renderer/volumetrics/gi/volumetrics_gi_resources.js +0 -39
- package/src/shade/renderer/volumetrics/graph_build_froxel_irradiance.js +0 -121
- package/src/shade/renderer/volumetrics/shader_volumetrics_build_irradiance.js +0 -237
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
# Meep Procedural Foliage & Tree Generation System — Implementation Plan
|
|
2
|
+
|
|
3
|
+
This implementation plan translates `FOLIAGE_DESIGN.md` (including all §9 adversarial review resolutions) into concrete, verifiable phases with exact file paths, function signatures, invariants, and co-located Vitest unit test suites.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Phase 1: Core Engine Primitives Leveraged (`Graph`, `Transform64`, `Attribute`)
|
|
8
|
+
|
|
9
|
+
The foliage system directly composes Meep's existing primitives without modifying `BinaryTopology`:
|
|
10
|
+
1. **`Graph` & `Edge` (`src/core/graph/v2/Graph.js`, `src/core/graph/Edge.js`)**: Directed skeletal graph (`EdgeDirectionType.Forward`).
|
|
11
|
+
2. **`Transform64` & `t64_look_rotation` (`src/engine/ecs/transform/Transform64.js`, `t64_look_rotation.js`)**: Per-node and per-attachment 3D position, RMF quaternion orientation (`[R, S, T]`), and radius scale.
|
|
12
|
+
3. **`Attribute` (`src/shade/renderer/geometry/Attribute.js`)**: Typed-array per-node, per-segment, and per-attachment data channels.
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## Phase 2: Species Configuration, Enums, Curves, & Botanical Presets
|
|
17
|
+
Location: `packages/meep-engine/src/generation/foliage/config/` & `presets/`
|
|
18
|
+
|
|
19
|
+
### Files & Signatures
|
|
20
|
+
1. **`config/CrownEnvelopeType.js`**
|
|
21
|
+
- Enum: `Conical = 0`, `Spherical = 1`, `Hemispherical = 2`, `Cylindrical = 3`, `TaperedCylindrical = 4`, `Flame = 5`, `InverseConical = 6`, `TendFlame = 7`, `Weeping = 8`.
|
|
22
|
+
2. **`config/PhyllotaxisMode.js`**
|
|
23
|
+
- Enum: `SpiralGolden = 0`, `AlternateDistichous = 1`, `Tristichous = 2`, `Opposite = 3`, `OppositeDecussate = 4`, `Whorled = 5`.
|
|
24
|
+
3. **`config/FoliageCardType.js`**
|
|
25
|
+
- Enum: `FoldedVCard = 0`, `CrossCard = 1`, `TriStarCluster = 2`, `RibbedFrond = 3`, `OctagonalCutoutHull = 4`.
|
|
26
|
+
4. **`config/TreePreset.js`**
|
|
27
|
+
- Enum: `Oak = "oak"`, `Pine = "pine"`, `Birch = "birch"`, `Willow = "willow"`, `Maple = "maple"`, `Spruce = "spruce"`, `Palm = "palm"`, `Shrub = "shrub"`, `Fern = "fern"`.
|
|
28
|
+
5. **`config/BranchLevelConfig.js`**
|
|
29
|
+
- Fields:
|
|
30
|
+
- `level = 0`
|
|
31
|
+
- `segments = 8` (Hermite segments along branch spine)
|
|
32
|
+
- `radial_segments_max = 12` ($\ge 3$), `radial_segments_min = 4` ($\ge 3$)
|
|
33
|
+
- `length = 8.0`, `length_variance = 0.1`
|
|
34
|
+
- `length_profile: AnimationCurve` (scales child length along parent $t \in [0, 1]$)
|
|
35
|
+
- `radius_ratio = 0.06` (base radius relative to length, or pipe-model tip floor)
|
|
36
|
+
- `taper = 0.85`, `radius_profile: AnimationCurve`
|
|
37
|
+
- `bare_length_ratio = 0.25` (bare zone at base of this branch before children spawn)
|
|
38
|
+
- `child_count = 12` (number of lateral child nodes spawned along this branch)
|
|
39
|
+
- `phyllotaxis_mode = PhyllotaxisMode.SpiralGolden`, `whorl_count = 3`, `azimuth_jitter = 0.15`
|
|
40
|
+
- `insertion_angle = 0.75` (radians from parent tangent), `insertion_angle_variation = 0.2`, `insertion_angle_profile: AnimationCurve`
|
|
41
|
+
- `curvature = 0.15` (total pitch bend in radians), `curve_back = 0.0`, `spiral_twist = 0.0`
|
|
42
|
+
- `gravitropism = 0.1` (positive bends toward $-Y$, negative bends toward $+Y$), `phototropism = 0.15`
|
|
43
|
+
- `gnarl_strength = 0.1`, `gnarl_frequency = 0.35`
|
|
44
|
+
- `split_probability = 0.0`, `split_count = 2`, `split_angle = 0.4`
|
|
45
|
+
- `flare_amplitude = 0.0`, `flare_height_ratio = 0.18`, `flare_lobes = 5`, `flare_sharpness = 4.0`
|
|
46
|
+
- `flute_amplitude = 0.0`, `flute_frequency = 6`
|
|
47
|
+
- `collar_weld_rings = 2`, `collar_length_ratio = 0.08`, `collar_spread_upper = 0.25`, `collar_spread_lower = 0.45`, `collar_normal_blend = 0.85`
|
|
48
|
+
- Methods: `static from(options)`, `copy(other)`, `clone()`, `equals(other)`, `hash()`.
|
|
49
|
+
6. **`config/CrownConfig.js`**
|
|
50
|
+
- Fields: `envelope_type = CrownEnvelopeType.Spherical`, `height = 10.0`, `radius = 4.5`, `base_height = 2.0`, `prune_ratio = 0.35`, `space_colonization_weight = 0.25`, `attraction_point_count = 160`, `attraction_radius = 2.5`, `kill_radius = 0.6`, `pipe_model_exponent = 2.3`, `pipe_model_weight = 0.65`, `sky_phototropism_mix = 0.6`.
|
|
51
|
+
- Methods: `static from(options)`, `copy(other)`, `clone()`, `equals(other)`, `hash()`.
|
|
52
|
+
7. **`config/FoliageConfig.js`**
|
|
53
|
+
- Fields: `enabled = true`, `card_type = FoliageCardType.FoldedVCard`, `attach_min_level = 2`, `cards_per_branch = 10`, `terminal_rosette_count = 3`, `bare_ratio = 0.2`, `phyllotaxis_mode = PhyllotaxisMode.SpiralGolden`, `whorl_count = 2`, `insertion_angle = 0.85`, `card_width = 0.85`, `card_length = 0.95`, `size_variance = 0.2`, `fold_angle = 0.28`, `arch_height = 0.08`, `camber_droop = 0.1`, `frond_segments = 5`, `phototropism = 0.6`, `gravitropism = 0.25`, `angular_jitter = 0.25`, `normal_puffiness = 0.35`, `ao_core_darkening = 0.35`, `color_variation = 0.08`.
|
|
54
|
+
- Methods: `static from(options)`, `copy(other)`, `clone()`, `equals(other)`, `hash()`.
|
|
55
|
+
8. **`config/BarkMaterialConfig.js` & `config/FoliageMaterialConfig.js`**
|
|
56
|
+
- `BarkMaterialConfig`: `resolution = 128`, `primary_color: Color`, `secondary_color: Color`, `moss_color: Color`, `moss_amount = 0.1`, `fissure_frequency = 8`, `fissure_depth = 0.65`, `lenticel_amount = 0.0` (birch horizontal marks), `roughness = 0.85`, `texel_density = 1.5`, `twist_uv = 0.0`.
|
|
57
|
+
- `FoliageMaterialConfig`: `resolution = 128`, `primary_color: Color`, `secondary_color: Color`, `autumn_tint = 0.0`, `leaf_shape = "lobed"` (`"ovate" | "lobed" | "serrated" | "palmate" | "needle" | "frond"`), `leaflets_per_cluster = 5`, `roughness = 0.58`, `vein_strength = 0.5`.
|
|
58
|
+
9. **`config/TreeWindConfig.js` & `config/TreeLODConfig.js`**
|
|
59
|
+
- `TreeWindConfig`: `enabled = true`, `max_joints = 32`, `trunk_compliance = 0.012`, `branch_compliance = 0.045`, `natural_frequency = 2.8`, `damping_ratio = 0.32`, `turbulence = 0.28`, `max_bend_angle = 0.65`.
|
|
60
|
+
- `TreeLODConfig`: `level = 0`, `radial_scale = 1.0`, `longitudinal_scale = 1.0`, `max_branch_level = 3`, `min_branch_radius = 0.0`, `foliage_keep_ratio = 1.0`, `foliage_area_compensation_exponent = 0.42`, `simplify_cards = false`.
|
|
61
|
+
10. **`config/TreeSpeciesConfig.js` + `config/TreeSpeciesConfig.spec.js`**
|
|
62
|
+
- Combines `name`, `preset`, `seed`, `crown: CrownConfig`, `levels: BranchLevelConfig[]`, `foliage: FoliageConfig`, `bark_material: BarkMaterialConfig`, `foliage_material: FoliageMaterialConfig`, `wind: TreeWindConfig`, `lods: TreeLODConfig[]`.
|
|
63
|
+
- Methods: `static from(options)`, `applyOverrides(overrides)`, `copy(other)`, `clone()`, `equals(other)`, `hash()`.
|
|
64
|
+
11. **`presets/make_tree_species_preset.js` + `presets/make_tree_species_preset.spec.js`**
|
|
65
|
+
- `export function make_tree_species_preset(preset = TreePreset.Oak, overrides = {}): TreeSpeciesConfig`
|
|
66
|
+
- Botanically tuned configurations for `Oak`, `Pine`, `Birch`, `Willow`, `Maple`, `Spruce`, `Palm`, `Shrub`, `Fern`.
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
## Phase 3: Skeleton Topology, Rotation-Minimizing Frames, & Hybrid Growth
|
|
71
|
+
Location: `packages/meep-engine/src/generation/foliage/skeleton/`
|
|
72
|
+
|
|
73
|
+
### Files & Signatures
|
|
74
|
+
1. **`skeleton/TreeSkeleton.js` + `skeleton/TreeSkeleton.spec.js`**
|
|
75
|
+
- Wraps `graph = new Graph()`, `node_transforms: Transform64[]`, 3 per-node `Attribute`s (`attr_node_branch_info`, `attr_node_spine_param`, `attr_node_joint`), and 4 per-segment `Attribute`s (`attr_segment_endpoints`, `attr_segment_hermite_m0`, `attr_segment_hermite_m1`, `attr_segment_metrics`).
|
|
76
|
+
- Also holds flat branch metadata table (`branch_count`, `branch_root_vertex: Int32Array`, `branch_tip_vertex: Int32Array`, `branch_level: Uint8Array`, `branch_parent: Int32Array`, `branch_parent_edge: Int32Array`, `branch_length: Float32Array`, `branch_base_radius: Float32Array`, `crown_center: Float32Array(3)`, `crown_radii: Float32Array(3)`).
|
|
77
|
+
- `add_node(px, py, pz, tx, ty, tz, rx, ry, rz, radius, branch_id, level, parent_branch_id, t_norm, arc_s, phase_hash): number`
|
|
78
|
+
- Adds node `v` to `this.graph`, populates `this.node_transforms[v]` (`Transform64` with `setTranslation`, `t64_look_rotation`, `setScaleScalar(radius)`, `updateMatrix()`), and writes per-node `Attribute`s.
|
|
79
|
+
- `add_segment(v0, v1, m0x, m0y, m0z, m1x, m1y, m1z, length, parent_attach_t): number`
|
|
80
|
+
- Creates a directed `EdgeDirectionType.Forward` edge `v0 -> v1` in `this.graph` and writes per-segment `Attribute`s.
|
|
81
|
+
- `evaluate_segment_position(out, out_offset, edge_id, u)` & `evaluate_segment_tangent(out, out_offset, edge_id, u)`:
|
|
82
|
+
- Evaluates 3D cubic Hermite position/derivative via `spline3_hermite` / `spline3_hermite_derivative`.
|
|
83
|
+
- `copy(other)` & `clone()`:
|
|
84
|
+
- Deep-copies `this.graph`, `this.node_transforms`, and all `Attribute` buffers.
|
|
85
|
+
2. **`skeleton/crown_envelope_evaluate.js` + `skeleton/crown_envelope_evaluate.spec.js`**
|
|
86
|
+
- `export function crown_envelope_evaluate(envelope_type, h_norm, prune_width_peak = 0.6, power_low = 1.5, power_high = 1.5): number`
|
|
87
|
+
- Evaluates the normalized radial envelope $S_{\text{env}}(h_{\text{norm}}) \in [0.05, 1.0]$ for all 9 `CrownEnvelopeType` modes.
|
|
88
|
+
- `export function crown_envelope_sdf(px, py, pz, crown_config): number` — signed distance to the 3D crown envelope around `+Y` trunk axis.
|
|
89
|
+
3. **`skeleton/spine_frame_double_reflection.js` + `skeleton/spine_frame_double_reflection.spec.js`**
|
|
90
|
+
- `export function spine_frame_double_reflection(out, out_offset, x0, y0, z0, tx0, ty0, tz0, rx0, ry0, rz0, x1, y1, z1, tx1, ty1, tz1): void`
|
|
91
|
+
- Computes Wang et al. (2008) fourth-order Rotation-Minimizing Frame `[Rx1, Ry1, Rz1, Sx1, Sy1, Sz1]` at `(x1, y1, z1)` with full guards for $c_1 \le 10^{-12}$ (`tube_frame_transport` fallback), $c_2 \le 10^{-12}$ (identity second reflection), and Gram-Schmidt re-orthonormalization.
|
|
92
|
+
4. **`skeleton/tree_skeleton_grow.js` + `skeleton/tree_skeleton_grow.spec.js`**
|
|
93
|
+
- `export function tree_skeleton_grow(config, out = new TreeSkeleton()): TreeSkeleton`
|
|
94
|
+
- Seeds `seededRandom(config.seed)` and computes a seed-derived 3D noise offset $\mathbf{o}_{\text{seed}}$.
|
|
95
|
+
- Populates space colonization attraction points in the crown envelope and builds `PointHashGrid3` once with `cell_size = config.crown.attraction_radius` and an external `Uint8Array` `alive` mask.
|
|
96
|
+
- Generates trunk ($l=0$) and recursive branch levels ($l=1 \dots L_{\max}$), handling phyllotaxis, `AnimationCurve` profiles, gravitropism (along $-Y$), phototropism (toward $+Y$ and radial crown exterior), `curl_noise_3d` gnarl, dichotomous/sympodial splitting, RMF transport, and Hermite tangent fitting.
|
|
97
|
+
5. **`skeleton/tree_skeleton_compute_pipe_radii.js` + `skeleton/tree_skeleton_compute_pipe_radii.spec.js`**
|
|
98
|
+
- `export function tree_skeleton_compute_pipe_radii(skeleton, config): void`
|
|
99
|
+
- Post-order bottom-up pass over `skeleton.topology` vertices, accumulating $R_{\text{pipe}}(v) = (R_{\text{tip}}^\alpha + \sum_{e=(v\to u)} R_{\text{pipe}}(u)^\alpha)^{1/\alpha}$ and blending with parametric taper `radius_profile.evaluate(t)` via `config.crown.pipe_model_weight`.
|
|
100
|
+
6. **`skeleton/tree_skeleton_assign_skin_joints.js` + `skeleton/tree_skeleton_assign_skin_joints.spec.js`**
|
|
101
|
+
- `export function tree_skeleton_assign_skin_joints(skeleton, max_joints = 32): { joint_count: number, joint_vertex_ids: Int32Array, joint_parents: Int32Array, joint_positions: Float32Array, joint_levels: Uint8Array, joint_phases: Float32Array }`
|
|
102
|
+
- Selects up to `max_joints` structural skeleton nodes in topological pre-order (`joint_parents[j] < j`) and assigns every skeleton vertex its `[primary_joint, parent_joint]` indices in `layer_node_joint`.
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## Phase 4: Bark & Foliage Mesh Synthesis, Collar Welding, & Canopy AO
|
|
107
|
+
Location: `packages/meep-engine/src/generation/foliage/mesh/`
|
|
108
|
+
|
|
109
|
+
### Files & Signatures
|
|
110
|
+
1. **`mesh/branch_collar_project.js` + `mesh/branch_collar_project.spec.js`**
|
|
111
|
+
- `export function branch_collar_project(out_pos, out_pos_offset, out_norm, out_norm_offset, ring_x, ring_y, ring_z, tube_nx, tube_ny, tube_nz, child_tx, child_ty, child_tz, parent_px, parent_py, parent_pz, parent_tx, parent_ty, parent_tz, parent_radius, weld_factor, normal_blend): void`
|
|
112
|
+
- Projects lateral branch collar vertices onto the parent branch cylinder surface with bounded axial pullback ($|\tau| \le 1.25 R_p$) and interpolates vertex normals from the parent cylinder normal $\mathbf{n}_{\text{parent}}$ to $\mathbf{n}_{\text{child}}$.
|
|
113
|
+
2. **`mesh/branch_ring_triangulate.js` + `mesh/branch_ring_triangulate.spec.js`**
|
|
114
|
+
- `export function branch_ring_triangulate(indices, index_cursor, ring0_start, m0, ring1_start, m1): number`
|
|
115
|
+
- `export function branch_apex_triangulate(indices, index_cursor, ring_start, m, apex_start): number`
|
|
116
|
+
- Enforces $m_0 \ge 3, m_1 \ge 3$, zippers unequal rings using exact integer cross-multiplication `(j0 + 1) * m1 <= (j1 + 1) * m0` with outward CCW winding, and guarantees **zero repeated vertex indices** (`i0 !== i1 && i1 !== i2 && i2 !== i0`).
|
|
117
|
+
3. **`mesh/tree_mesh_build_bark.js` + `mesh/tree_mesh_build_bark.spec.js`**
|
|
118
|
+
- `export function tree_mesh_build_bark(skeleton, config, lod_config, skin_info = null, out = new Geometry()): Geometry`
|
|
119
|
+
- Sweeps all retained branches ($l \le \text{lod\_config.max\_branch\_level}$ and $R_0 \ge \text{lod\_config.min\_branch\_radius}$) using `spline3_hermite`, `spine_frame_double_reflection`, root buttress lobes, bark flutes, lateral collar welding (for `parent_attach_t < 0.95`), terminal fork blending (for `parent_attach_t >= 0.95`), quantized seamless bark UVs (`uv0`), wind weights (`uv1`), canopy/collar AO (`color`), and 4-joint skinning attributes (`joints`, `weights`).
|
|
120
|
+
- Calls `out.ensureBounds()` and `out.ensureTangents()`.
|
|
121
|
+
4. **`mesh/foliage_collect_attachments.js` + `mesh/foliage_collect_attachments.spec.js`**
|
|
122
|
+
- `export function foliage_collect_attachments(skeleton, config): FoliageAttachmentSet`
|
|
123
|
+
- Generates phyllotactic attachment points, heliotropic/gravitropic orthonormal bases $(\mathbf{F}, \mathbf{U}, \mathbf{W})$ with outward hemisphere alignment ($\mathbf{U} \cdot \mathbf{n}_{\text{canopy}} \ge 0$), golden-ratio decimation rank $h_i = (i \cdot \varphi^{-1}) \bmod 1$, and inherited skin joint indices/weights.
|
|
124
|
+
5. **`mesh/tree_mesh_build_foliage.js` + `mesh/tree_mesh_build_foliage.spec.js`**
|
|
125
|
+
- `export function tree_mesh_build_foliage(skeleton, attachments, config, lod_config, out = new Geometry()): Geometry`
|
|
126
|
+
- Filters attachments by $h_i < k_{\text{keep}}$, applies area compensation scaling $s_{\text{comp}} = k_{\text{keep}}^{-\eta}$, and emits the selected `FoliageCardType` (`FoldedVCard`, `CrossCard`, `TriStarCluster`, `RibbedFrond`, `OctagonalCutoutHull`) with `position`, `normal`, `uv0`, `uv1` (wind weights), `color` (AO + color jitter), and `joints`/`weights`.
|
|
127
|
+
6. **`mesh/tree_mesh_apply_canopy_ao.js` + `mesh/tree_mesh_apply_canopy_ao.spec.js`**
|
|
128
|
+
- `export function tree_mesh_apply_canopy_ao(geometry, crown_center, crown_radii, options): void`
|
|
129
|
+
- Computes analytic crown ellipsoid + sky-exposure AO into `StandardAttributes.Color` and applies hemisphere-safe normal puffing ($\mathbf{n}_{\text{vertex}} \cdot \mathbf{n}_{\text{face}} \ge 0.55$) before `geometry.ensureTangents()`.
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
133
|
+
## Phase 5: Procedural PBR Materials, Wind Clips, & Turn-Key Asset Pipeline
|
|
134
|
+
Location: `packages/meep-engine/src/generation/foliage/material/`, `animation/`, `asset/`
|
|
135
|
+
|
|
136
|
+
### Files & Signatures
|
|
137
|
+
1. **`material/make_bark_material.js` + `material/make_bark_material.spec.js`**
|
|
138
|
+
- `export function make_bark_material(config = new BarkMaterialConfig(), seed = 1): StandardShadeMaterial`
|
|
139
|
+
- Synthesizes tileable `Sampler2D` $\to$ `ShadeImage` $\to$ `ShadeTexture` for bark Albedo (`ColorSpace.SRGB`), 2-channel Normal (`ColorSpace.None` / `LinearSRGB`, `TextureFilterType.LinearNormal`), and ORM (`ColorSpace.None` / `LinearSRGB`), sets `material.ambient_factors.set(1, 0)`, `TransparencyMode.Opaque`, `ShadeDrawSide.Front`.
|
|
140
|
+
2. **`material/make_foliage_material.js` + `material/make_foliage_material.spec.js`**
|
|
141
|
+
- `export function make_foliage_material(config = new FoliageMaterialConfig(), seed = 1): StandardShadeMaterial`
|
|
142
|
+
- Synthesizes botanical leaf/needle cluster Albedo + Alpha mask (dilated straight RGB into $A=0$ texels with `AlphaMode.Straight` so GPU upload premultiplies cleanly once), Normal map (vein relief), and ORM map, sets `material.ambient_factors.set(1, 0)`, `TransparencyMode.AlphaTested`, `ShadeDrawSide.Double`, `transmission_factor = 0`.
|
|
143
|
+
3. **`animation/build_tree_wind_rig.js` + `animation/build_tree_wind_rig.spec.js`**
|
|
144
|
+
- `export function build_tree_wind_rig(skin_info, wind_config = new TreeWindConfig()): FoliageWindRig|null`
|
|
145
|
+
- Generates a GPU fluid-driven `FoliageWindRig` (`name: "foliage_wind"`) whose joints (`2..J`, with joint `0` / `SceneNode` `1` anchored at the trunk base) carry physical Euler-Bernoulli cantilever `compliance`, `natural_frequency`, `damping_ratio`, `max_angle`, `turbulence`, `branch_axis`, and `flutter_phase`. At runtime, `GPUAnimationManager` dispatches `shader_foliage_wind_apply` to sample `GPUSceneWind` (`chunk_wind_field_sample`) at each bone's world position and step a 2nd-order damped oscillator into `pose_accumulator`.
|
|
146
|
+
4. **`asset/TreeLODAsset.js` & `asset/TreeAsset.js`**
|
|
147
|
+
- `TreeLODAsset`: holds `level`, `bark_geometry: Geometry`, `foliage_geometry: Geometry|null`, `bark_material: StandardShadeMaterial`, `foliage_material: StandardShadeMaterial`, `wind_rig: FoliageWindRig|null`, and **lazy memoized getters** `.bark_meshlet_geometry`, `.foliage_meshlet_geometry`, `.scene_bundle`, `.prefab`.
|
|
148
|
+
- `TreeAsset`: holds `config: TreeSpeciesConfig`, `skeleton: TreeSkeleton`, `attachments: FoliageAttachmentSet`, `skin_info`, `wind_rig: FoliageWindRig|null`, `bark_material: StandardShadeMaterial`, `foliage_material: StandardShadeMaterial`, `lods: TreeLODAsset[]`, plus convenience getters `.bark_geometry`, `.foliage_geometry`, `.bark_meshlet_geometry`, `.foliage_meshlet_geometry`, `.scene_bundle`, `.prefab` aliasing `lods[0]`.
|
|
149
|
+
5. **`asset/generate_tree.js` + `asset/generate_tree.spec.js`**
|
|
150
|
+
- `export function generate_tree(options = {}): TreeAsset`
|
|
151
|
+
- Turn-key entry point accepting zero arguments (`generate_tree()`), a `TreeSpeciesConfig`, or `{ preset, seed, crown, levels, foliage, bark_material, foliage_material, wind, lod_count, eager_meshlets }`.
|
|
152
|
+
6. **`asset/place_tree.js` + `asset/place_tree.spec.js`**
|
|
153
|
+
- `export function place_tree(scene_context, dataset, options = {}): PlacedTree`
|
|
154
|
+
- `export function unplace_tree(scene_context, dataset, placed): void`
|
|
155
|
+
- Accepts either an existing `tree` (`TreeAsset`) / `prefab` (`Prefab`) or generation options, constructs `Transform64` from `placement` or `{ position, rotation, rotation_y, scale }`, calls `prefab_place`, registers `FoliageWindRig`s on `scene_context.animation_manager` with position-derived phase offsets, and provides `unplace_tree` for complete cleanup.
|
|
156
|
+
|
|
157
|
+
---
|
|
158
|
+
|
|
159
|
+
## Adversarial Review of the Implementation Plan
|
|
160
|
+
|
|
161
|
+
Before beginning implementation, each phase of this plan was audited against the exact runtime contracts in `packages/meep-engine/src`:
|
|
162
|
+
|
|
163
|
+
1. **`StandardAttributes.SkinningJoints` TypedArray Contract**:
|
|
164
|
+
- `geometry_obtain_attribute` always allocates a `Float32Array`, whereas `meshlet_encode_attribute` expects `StandardAttributes.SkinningJoints` (`'joints'`) to be backed by a `Uint16Array(vertex_count * 4)`.
|
|
165
|
+
- *Plan Adjustment*: `tree_mesh_build_bark` and `tree_mesh_build_foliage` will obtain `'joints'` via a dedicated `Uint16Array` attribute helper (`Attribute.from(new Uint16Array(vertex_count * 4), 4, StandardAttributes.SkinningJoints)`) and `'weights'` via `geometry_obtain_attribute(geometry, StandardAttributes.SkinningWeights, 4, vertex_count)`.
|
|
166
|
+
2. **`Sampler2D.uint8(itemSize, width, height)` Parameter Order & Direct Buffer Writes**:
|
|
167
|
+
- `Sampler2D.uint8` takes `(itemSize, width, height)` with `itemSize` first.
|
|
168
|
+
- *Plan Adjustment*: `make_bark_material` and `make_foliage_material` will construct `Sampler2D.uint8(channels, resolution, resolution)` and write directly into `sampler.data` (`Uint8Array`) for fast zero-overhead texture synthesis.
|
|
169
|
+
3. **`GPUAnimationManager` Clip Registration & Unregistration Order in `place_tree` / `unplace_tree`**:
|
|
170
|
+
- `GPUAnimationManager` methods are `register_clip(clip)`, `set_flags(clip_id, AnimationClipFlags.Playing | AnimationClipFlags.Loop)`, `set_time(clip_id, time)`, `set_playback_rate(clip_id, rate)`, `set_playback_weight(clip_id, weight)`, and `unregister_clip(clip_id)`.
|
|
171
|
+
- `register_clip` grants `GPUStateAuthorityFlags.TransformAttachment | GPUStateAuthorityFlags.Transform64` on target entities and registers an entity event listener on `dataset`.
|
|
172
|
+
- *Plan Adjustment*: In `unplace_tree(scene_context, dataset, placed)`, `animation_manager.unregister_clip(clip_id)` **must** be called **before** `prefab_unplace(scene_context, dataset, placed)` so target entities and their `GPUStateAuthority` components still exist in `dataset` when `unregister_clip` revokes GPU authority and removes the event listener.
|
|
173
|
+
4. **Root Joint Binding for Unassigned / Root Vertices**:
|
|
174
|
+
- In `tree_skeleton_assign_skin_joints`, joint `0` (`SceneNode` index `1`) is placed at the trunk base `(0, 0, 0)`. Any vertex at the very base of the trunk (`t = 0`) binds with weight `1.0` to joint `0` (`joints = [0, 0, 0, 0]`, `weights = [1, 0, 0, 0]`), and `build_tree_wind_clip` keeps joint `0` stationary (or applies only micro-base flex) so the base of the trunk stays anchored to the ground during wind sway.
|
|
175
|
+
|
|
176
|
+
---
|
|
177
|
+
|
|
178
|
+
## Step 7: Adversarial Review of the Implementation & Resolutions
|
|
179
|
+
|
|
180
|
+
Following completion of Phases 1–5, a comprehensive adversarial review of the implementation was conducted across `src/core/geom/3d/topology/struct/binary/query/` and `src/generation/foliage/`. Every identified edge case and mathematical hazard was resolved and covered with regression unit tests:
|
|
181
|
+
|
|
182
|
+
1. **Adaxial Crotch Root Selection in `branch_collar_project.js`**:
|
|
183
|
+
- *Finding*: For the upper (adaxial/crotch) half of a tilted lateral branch ($\alpha \in (0, \pi/2)$) originating on the parent spine axis, the ring offset $\mathbf{q}$ has a negative projection onto the emerging direction $\mathbf{u}$ ($b_{\text{half}} = \mathbf{q} \cdot \mathbf{u} < 0$). Selecting `Math.abs(t_plus) < Math.abs(t_minus)` caused $b_{\text{half}} < 0$ vertices to select $t_{\text{minus}} = \frac{-b_{\text{half}} - \sqrt{\Delta}}{\|\mathbf{u}\|^2}$, which satisfies $(\mathbf{q} + t_{\text{minus}}\mathbf{u})\cdot\mathbf{u} = -\sqrt{\Delta} < 0$ (the opposite back wall of the parent trunk!).
|
|
184
|
+
- *Resolution*: Always select the emerging ($+\mathbf{u}$) cylinder root $\tau = t_{\text{plus}} = \frac{-b_{\text{half}} + \sqrt{\Delta}}{\|\mathbf{u}\|^2}$, which algebraically guarantees $(\mathbf{q} + t_{\text{plus}}\mathbf{u})\cdot\mathbf{u} = +\sqrt{\Delta} \ge 0$ for all collar vertices regardless of the sign of $b_{\text{half}}$, and bias steep-angle radial projection into the $+\mathbf{u}$ hemisphere.
|
|
185
|
+
2. **Parent RMF Transport & Singularity-Free Child RMF Initialization in `tree_skeleton_grow.js` and `foliage_collect_attachments.js`**:
|
|
186
|
+
- *Finding*: When interpolating the parent branch's Rotation-Minimizing Frame at `local_u` along `parent_e`, `spine_frame_double_reflection` was called with `SCRATCH_POS` for both start and end points (`c1 === 0`), skipping the spatial chord reflection from `p_v0` to `SCRATCH_POS`. Additionally, initializing the child branch RMF radial vector from `D_rad` when $\alpha \approx \pi/2$ caused near-collinearity with `T_c`.
|
|
187
|
+
- *Resolution*: Pass `p_v0`'s actual position and tangent as `(x0, y0, z0, tx0, ty0, tz0)` into `spine_frame_double_reflection`, and initialize the child branch's radial vector using the exact orthonormal vector in the $(\mathbf{T}_p, \mathbf{D}_{\text{rad}})$ plane: $\mathbf{R}_c = \cos(\alpha)\mathbf{D}_{\text{rad}} - \sin(\alpha)\mathbf{T}_p$, which has unit length and zero singularity across all $\alpha \in [0, \pi]$.
|
|
188
|
+
3. **Dichotomous Split Frame Preservation & Interior Hermite Tangent Smoothing in `tree_skeleton_grow.js`**:
|
|
189
|
+
- *Finding*: During a dichotomous split, rotating `next_t` for fork 0 without rotating `next_r` broke frame orthogonality, and re-writing `m0` from `vertex_read_normal(branch_vertices[0])` overwrote continuation fork `f`'s departure tangent with fork 0's tangent at the shared split vertex.
|
|
190
|
+
- *Resolution*: Preserve the pre-split orthonormal triad `(pre_t, pre_r, pre_s)`, rotate both `T` and `R` around each fork's bend axis so every fork maintains an exact right-handed orthonormal triad, and smooth only interior vertices (`1 <= k < branch_edges.length`) so continuation forks retain their exact departure Hermite tangent `m0`.
|
|
191
|
+
4. **Longitudinal Hermite Spline Resampling (`longitudinal_scale`), Watertight Apex Cones (`branch_apex_triangulate`), Collar Tip Guard, & Empty Skeleton Fallback in `tree_mesh_build_bark.js`**:
|
|
192
|
+
- *Finding*: `tree_mesh_build_bark.js` iterated over raw skeleton nodes without resampling by `lod_config.longitudinal_scale`, left branch tips uncapped, could pull short branch tips (`sample_steps <= collar_weld_rings`) back onto the parent trunk, and left the 4-vertex empty-skeleton fallback buffer zero-filled.
|
|
193
|
+
- *Resolution*: Resample each branch's Cubic Hermite spline chain into `sample_steps = Math.max(1, Math.round(E * long_scale))` longitudinal rings using `evaluate_segment_position`, `evaluate_segment_tangent`, and `spine_frame_double_reflection`; cap all branch tips into watertight cones via `branch_apex_triangulate`; guard collar welding with `i < sample_steps && t_norm < 0.65` using exact parent Hermite evaluation at `parent_local_u`; and populate a valid non-degenerate quad when `branch_plans.length === 0`.
|
|
194
|
+
5. **Single-Joint Wind Clips (`max_joints: 1`), Static Trees (`wind: false`), & Foliage Texture Clamping**:
|
|
195
|
+
- *Finding*: `build_tree_wind_clip` returned a 0-channel clip when `joint_count === 1`; boolean shorthand `{ wind: false }` / `{ foliage: false }` was ignored by `applyOverrides`; `generate_tree` with `wind.enabled === false` still attached a `Skin` to `TreeLODAsset`; and foliage `ShadeTexture`s defaulted to `Repeat` wrapping along $V \in [0, 1]$.
|
|
196
|
+
- *Resolution*: Animate joint `0` (`SceneNode` index `1`) when `joint_count === 1`; support boolean shorthand in `TreeWindConfig.applyOverrides` and `FoliageConfig.applyOverrides`; omit `Skin` on `TreeLODAsset` when `wind.enabled === false`; bind rest-pose skins cleanly in `place_tree` when `wind: false`; and set `TextureWrapType.ClampToEdge` on foliage textures in `make_foliage_material.js`.
|
|
197
|
+
|
|
198
|
+
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Constructs a GPU fluid-driven `FoliageWindRig` (`name = "foliage_wind"`) for the structural
|
|
3
|
+
* `Skin` joints (`SceneNode` indices `1 .. J`) of a procedurally generated tree.
|
|
4
|
+
*
|
|
5
|
+
* Joint `0` (`SceneNode` index `1`, at the trunk base `(0, 0, 0)`) remains anchored at its bind
|
|
6
|
+
* pose so the base of the trunk never pivots off the ground, while upper trunk and branch joints
|
|
7
|
+
* carry physically derived Euler-Bernoulli cantilever compliance, natural frequency, damping ratio,
|
|
8
|
+
* branch axis, and vortex-shedding turbulence parameters. At runtime, `GPUAnimationManager`
|
|
9
|
+
* dispatches `shader_foliage_wind_apply` to sample Meep's 3D fluid simulation wind field
|
|
10
|
+
* (`GPUSceneWind`: `GlobalFluidEffector` far-field + 3D MAC `GPUFluidCascadeStack` wakes/vortices)
|
|
11
|
+
* at each bone's world position and step a 2nd-order damped oscillator directly into `pose_accumulator`.
|
|
12
|
+
*
|
|
13
|
+
* @param {ReturnType<import("../skeleton/tree_skeleton_assign_skin_joints.js").tree_skeleton_assign_skin_joints>} skin_info
|
|
14
|
+
* @param {TreeWindConfig|Object} [wind_config]
|
|
15
|
+
* @returns {FoliageWindRig|null}
|
|
16
|
+
*/
|
|
17
|
+
export function build_tree_wind_rig(skin_info: ReturnType<typeof import("../skeleton/tree_skeleton_assign_skin_joints.js").tree_skeleton_assign_skin_joints>, wind_config?: TreeWindConfig | any): FoliageWindRig | null;
|
|
18
|
+
import { TreeWindConfig } from "../config/TreeWindConfig.js";
|
|
19
|
+
import { FoliageWindRig } from "../../../shade/renderer/animation/foliage/FoliageWindRig.js";
|
|
20
|
+
//# sourceMappingURL=build_tree_wind_rig.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build_tree_wind_rig.d.ts","sourceRoot":"","sources":["../../../../../src/generation/foliage/animation/build_tree_wind_rig.js"],"names":[],"mappings":"AAMA;;;;;;;;;;;;;;;GAeG;AACH,+CAJW,6GAAsG,gBACtG,cAAc,MAAO,GACnB,cAAc,GAAC,IAAI,CAuF/B;+BAvG8B,6BAA6B;+BAD7B,6DAA6D"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { PI2 } from "../../../core/math/PI2.js";
|
|
2
|
+
import { clamp } from "../../../core/math/clamp.js";
|
|
3
|
+
import { FoliageWindJoint } from "../../../shade/renderer/animation/foliage/FoliageWindJoint.js";
|
|
4
|
+
import { FoliageWindRig } from "../../../shade/renderer/animation/foliage/FoliageWindRig.js";
|
|
5
|
+
import { TreeWindConfig } from "../config/TreeWindConfig.js";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Constructs a GPU fluid-driven `FoliageWindRig` (`name = "foliage_wind"`) for the structural
|
|
9
|
+
* `Skin` joints (`SceneNode` indices `1 .. J`) of a procedurally generated tree.
|
|
10
|
+
*
|
|
11
|
+
* Joint `0` (`SceneNode` index `1`, at the trunk base `(0, 0, 0)`) remains anchored at its bind
|
|
12
|
+
* pose so the base of the trunk never pivots off the ground, while upper trunk and branch joints
|
|
13
|
+
* carry physically derived Euler-Bernoulli cantilever compliance, natural frequency, damping ratio,
|
|
14
|
+
* branch axis, and vortex-shedding turbulence parameters. At runtime, `GPUAnimationManager`
|
|
15
|
+
* dispatches `shader_foliage_wind_apply` to sample Meep's 3D fluid simulation wind field
|
|
16
|
+
* (`GPUSceneWind`: `GlobalFluidEffector` far-field + 3D MAC `GPUFluidCascadeStack` wakes/vortices)
|
|
17
|
+
* at each bone's world position and step a 2nd-order damped oscillator directly into `pose_accumulator`.
|
|
18
|
+
*
|
|
19
|
+
* @param {ReturnType<import("../skeleton/tree_skeleton_assign_skin_joints.js").tree_skeleton_assign_skin_joints>} skin_info
|
|
20
|
+
* @param {TreeWindConfig|Object} [wind_config]
|
|
21
|
+
* @returns {FoliageWindRig|null}
|
|
22
|
+
*/
|
|
23
|
+
export function build_tree_wind_rig(skin_info, wind_config = new TreeWindConfig()) {
|
|
24
|
+
const cfg = wind_config && wind_config.isTreeWindConfig ? wind_config : TreeWindConfig.from(wind_config);
|
|
25
|
+
if (!cfg.enabled || !skin_info || skin_info.joint_count <= 0) {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const rig = new FoliageWindRig();
|
|
30
|
+
rig.name = "foliage_wind";
|
|
31
|
+
rig.root = 0; // SceneNode 0 is the tree root in SceneBundle
|
|
32
|
+
|
|
33
|
+
const r0 = (skin_info.joint_radii && skin_info.joint_radii.length > 0)
|
|
34
|
+
? Math.max(0.02, skin_info.joint_radii[0])
|
|
35
|
+
: 0.25;
|
|
36
|
+
|
|
37
|
+
const start_joint = skin_info.joint_count === 1 ? 0 : 1;
|
|
38
|
+
|
|
39
|
+
// Count how many driven joints share the same structural level along each joint's ancestor chain
|
|
40
|
+
// so serial chains of joints on the same trunk/bough divide the total branch deflection cleanly.
|
|
41
|
+
const same_level_chain_count = new Uint8Array(skin_info.joint_count);
|
|
42
|
+
for (let j = 0; j < skin_info.joint_count; j++) {
|
|
43
|
+
const lvl = skin_info.joint_levels[j];
|
|
44
|
+
let count = 0;
|
|
45
|
+
let cur = j;
|
|
46
|
+
while (cur > 0) {
|
|
47
|
+
if (skin_info.joint_levels[cur] === lvl) {
|
|
48
|
+
count++;
|
|
49
|
+
}
|
|
50
|
+
cur = skin_info.joint_parents[cur];
|
|
51
|
+
}
|
|
52
|
+
same_level_chain_count[j] = Math.max(1, count);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
for (let j = start_joint; j < skin_info.joint_count; j++) {
|
|
56
|
+
const level = skin_info.joint_levels[j];
|
|
57
|
+
const t_norm = j === 0 ? 0.5 : skin_info.joint_t_norms[j];
|
|
58
|
+
const phase = skin_info.joint_phases[j] * PI2;
|
|
59
|
+
const r_j = (skin_info.joint_radii && j < skin_info.joint_radii.length)
|
|
60
|
+
? Math.max(0.005, skin_info.joint_radii[j])
|
|
61
|
+
: r0 * Math.pow(0.5, level);
|
|
62
|
+
|
|
63
|
+
let tx = skin_info.joint_tangents[j * 3];
|
|
64
|
+
let ty = skin_info.joint_tangents[j * 3 + 1];
|
|
65
|
+
let tz = skin_info.joint_tangents[j * 3 + 2];
|
|
66
|
+
const t_len = Math.hypot(tx, ty, tz);
|
|
67
|
+
if (t_len > 1e-6) {
|
|
68
|
+
tx /= t_len;
|
|
69
|
+
ty /= t_len;
|
|
70
|
+
tz /= t_len;
|
|
71
|
+
} else {
|
|
72
|
+
tx = 0.0;
|
|
73
|
+
ty = 1.0;
|
|
74
|
+
tz = 0.0;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
const chain_div = Math.max(1, same_level_chain_count[j]);
|
|
78
|
+
const base_comp = level === 0
|
|
79
|
+
? cfg.trunk_compliance * 0.18
|
|
80
|
+
: cfg.branch_compliance * 0.24 * (1.0 + 0.35 * (level - 1));
|
|
81
|
+
const radius_factor = level === 0
|
|
82
|
+
? clamp(Math.pow(r0 / Math.max(r_j, 0.25 * r0), 0.35), 0.6, 1.6)
|
|
83
|
+
: clamp(Math.pow(r0 / Math.max(r_j, 0.08 * r0), 0.45), 0.8, 3.2);
|
|
84
|
+
const compliance = (base_comp * radius_factor * clamp(0.35 + 0.65 * t_norm, 0.3, 1.15)) / chain_div;
|
|
85
|
+
|
|
86
|
+
const natural_frequency = cfg.natural_frequency * (1.0 + 0.65 * level + 0.35 * t_norm);
|
|
87
|
+
const damping_ratio = clamp(cfg.damping_ratio * (1.0 + 0.12 * level), 0.05, 1.5);
|
|
88
|
+
const max_angle = clamp(
|
|
89
|
+
(cfg.max_bend_angle * (level === 0 ? 0.18 : (0.42 + 0.18 * Math.min(level, 2)))) / chain_div,
|
|
90
|
+
0.02,
|
|
91
|
+
0.85
|
|
92
|
+
);
|
|
93
|
+
const turbulence = clamp(cfg.turbulence * (level === 0 ? 0.35 : (0.65 + 0.35 * Math.min(level, 2))), 0.0, 1.0);
|
|
94
|
+
|
|
95
|
+
rig.joints.push(FoliageWindJoint.from({
|
|
96
|
+
target: j + 1, // SceneNode 0 is tree_root; Joint j is SceneNode (j + 1)
|
|
97
|
+
branch_axis: [tx, ty, tz],
|
|
98
|
+
compliance,
|
|
99
|
+
natural_frequency,
|
|
100
|
+
damping_ratio,
|
|
101
|
+
max_angle,
|
|
102
|
+
turbulence,
|
|
103
|
+
phase_offset: phase,
|
|
104
|
+
}));
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
return rig;
|
|
108
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Complete procedurally generated tree asset containing the botanical configuration,
|
|
3
|
+
* `TreeSkeleton`, `FoliageAttachmentSet`, shared procedural bark and foliage PBR `StandardShadeMaterial`s,
|
|
4
|
+
* skeletal wind `ShadeAnimationClip`, and the multi-LOD `TreeLODAsset[]` chain.
|
|
5
|
+
*
|
|
6
|
+
* Exposes top-level convenience getters (`.bark_geometry`, `.foliage_geometry`, `.bark_meshlet_geometry`,
|
|
7
|
+
* `.foliage_meshlet_geometry`, `.scene_bundle`, `.prefab`) aliasing `lods[0]`.
|
|
8
|
+
*/
|
|
9
|
+
export class TreeAsset {
|
|
10
|
+
/**
|
|
11
|
+
* Resolved species configuration used to generate this asset.
|
|
12
|
+
* @type {import("../config/TreeSpeciesConfig.js").TreeSpeciesConfig}
|
|
13
|
+
*/
|
|
14
|
+
config: import("../config/TreeSpeciesConfig.js").TreeSpeciesConfig;
|
|
15
|
+
/**
|
|
16
|
+
* Directed botanical skeleton graph (`Graph` + `Transform64` + `Attribute`s).
|
|
17
|
+
* @type {import("../skeleton/TreeSkeleton.js").TreeSkeleton}
|
|
18
|
+
*/
|
|
19
|
+
skeleton: import("../skeleton/TreeSkeleton.js").TreeSkeleton;
|
|
20
|
+
/**
|
|
21
|
+
* Phyllotactic foliage card attachment transforms and ranks.
|
|
22
|
+
* @type {import("../mesh/foliage_collect_attachments.js").FoliageAttachmentSet}
|
|
23
|
+
*/
|
|
24
|
+
attachments: import("../mesh/foliage_collect_attachments.js").FoliageAttachmentSet;
|
|
25
|
+
/**
|
|
26
|
+
* Extracted structural skin joint descriptors.
|
|
27
|
+
* @type {ReturnType<import("../skeleton/tree_skeleton_assign_skin_joints.js").tree_skeleton_assign_skin_joints>}
|
|
28
|
+
*/
|
|
29
|
+
skin_info: ReturnType<typeof import("../skeleton/tree_skeleton_assign_skin_joints.js").tree_skeleton_assign_skin_joints>;
|
|
30
|
+
/**
|
|
31
|
+
* GPU fluid-driven foliage wind rig (`name = "foliage_wind"`), or `null` if wind disabled.
|
|
32
|
+
* @type {import("../../../shade/renderer/animation/foliage/FoliageWindRig.js").FoliageWindRig|null}
|
|
33
|
+
*/
|
|
34
|
+
wind_rig: import("../../../shade/renderer/animation/foliage/FoliageWindRig.js").FoliageWindRig | null;
|
|
35
|
+
/**
|
|
36
|
+
* Procedural bark PBR `StandardShadeMaterial` shared across all LODs.
|
|
37
|
+
* @type {import("../../../shade/renderer/material/StandardShadeMaterial.js").StandardShadeMaterial}
|
|
38
|
+
*/
|
|
39
|
+
bark_material: import("../../../shade/renderer/material/StandardShadeMaterial.js").StandardShadeMaterial;
|
|
40
|
+
/**
|
|
41
|
+
* Procedural foliage cutout PBR `StandardShadeMaterial` shared across all LODs.
|
|
42
|
+
* @type {import("../../../shade/renderer/material/StandardShadeMaterial.js").StandardShadeMaterial}
|
|
43
|
+
*/
|
|
44
|
+
foliage_material: import("../../../shade/renderer/material/StandardShadeMaterial.js").StandardShadeMaterial;
|
|
45
|
+
/**
|
|
46
|
+
* Progressive LOD asset chain (`lods[0]` = highest detail).
|
|
47
|
+
* @type {import("./TreeLODAsset.js").TreeLODAsset[]}
|
|
48
|
+
*/
|
|
49
|
+
lods: import("./TreeLODAsset.js").TreeLODAsset[];
|
|
50
|
+
/**
|
|
51
|
+
* Highest-detail (`lods[0]`) bark `Geometry`.
|
|
52
|
+
* @returns {import("../../../shade/renderer/geometry/Geometry.js").Geometry|null}
|
|
53
|
+
*/
|
|
54
|
+
get bark_geometry(): import("../../../shade/renderer/geometry/Geometry.js").Geometry;
|
|
55
|
+
/**
|
|
56
|
+
* Highest-detail (`lods[0]`) foliage `Geometry`.
|
|
57
|
+
* @returns {import("../../../shade/renderer/geometry/Geometry.js").Geometry|null}
|
|
58
|
+
*/
|
|
59
|
+
get foliage_geometry(): import("../../../shade/renderer/geometry/Geometry.js").Geometry;
|
|
60
|
+
/**
|
|
61
|
+
* Highest-detail (`lods[0]`) bark `MeshletGeometry` (lazy memoized).
|
|
62
|
+
* @returns {import("../../../shade/renderer/geometry/MeshletGeometry.js").MeshletGeometry|null}
|
|
63
|
+
*/
|
|
64
|
+
get bark_meshlet_geometry(): import("../../../shade/renderer/geometry/MeshletGeometry.js").MeshletGeometry;
|
|
65
|
+
/**
|
|
66
|
+
* Highest-detail (`lods[0]`) foliage `MeshletGeometry` (lazy memoized).
|
|
67
|
+
* @returns {import("../../../shade/renderer/geometry/MeshletGeometry.js").MeshletGeometry|null}
|
|
68
|
+
*/
|
|
69
|
+
get foliage_meshlet_geometry(): import("../../../shade/renderer/geometry/MeshletGeometry.js").MeshletGeometry;
|
|
70
|
+
/**
|
|
71
|
+
* Highest-detail (`lods[0]`) `SceneBundle` (lazy memoized).
|
|
72
|
+
* @returns {import("../../../shade/renderer/loader/SceneBundle.js").SceneBundle|null}
|
|
73
|
+
*/
|
|
74
|
+
get scene_bundle(): import("../../../shade/renderer/loader/SceneBundle.js").SceneBundle;
|
|
75
|
+
/**
|
|
76
|
+
* Highest-detail (`lods[0]`) compiled `Prefab` (lazy memoized).
|
|
77
|
+
* @returns {import("../../../engine/graphics3/prefab/Prefab.js").Prefab|null}
|
|
78
|
+
*/
|
|
79
|
+
get prefab(): import("../../../engine/graphics3/prefab/Prefab.js").Prefab;
|
|
80
|
+
/**
|
|
81
|
+
* @readonly
|
|
82
|
+
* @type {boolean}
|
|
83
|
+
*/
|
|
84
|
+
readonly isTreeAsset: boolean;
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=TreeAsset.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TreeAsset.d.ts","sourceRoot":"","sources":["../../../../../src/generation/foliage/asset/TreeAsset.js"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH;IACI;;;OAGG;IACH,QAFU,OAAO,gCAAgC,EAAE,iBAAiB,CAEtD;IAEd;;;OAGG;IACH,UAFU,OAAO,6BAA6B,EAAE,YAAY,CAE5C;IAEhB;;;OAGG;IACH,aAFU,OAAO,wCAAwC,EAAE,oBAAoB,CAE5D;IAEnB;;;OAGG;IACH,WAFU,6GAAsG,CAE/F;IAEjB;;;OAGG;IACH,UAFU,OAAO,6DAA6D,EAAE,cAAc,GAAC,IAAI,CAEnF;IAEhB;;;OAGG;IACH,eAFU,OAAO,2DAA2D,EAAE,qBAAqB,CAE9E;IAErB;;;OAGG;IACH,kBAFU,OAAO,2DAA2D,EAAE,qBAAqB,CAE3E;IAExB;;;OAGG;IACH,MAFU,OAAO,mBAAmB,EAAE,YAAY,EAAE,CAE1C;IAEV;;;OAGG;IACH,qFAEC;IAED;;;OAGG;IACH,wFAEC;IAED;;;OAGG;IACH,2GAEC;IAED;;;OAGG;IACH,8GAEC;IAED;;;OAGG;IACH,wFAEC;IAED;;;OAGG;IACH,0EAEC;IAGL;;;OAGG;IACH,sBAFU,OAAO,CAEc;CAN9B"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Complete procedurally generated tree asset containing the botanical configuration,
|
|
3
|
+
* `TreeSkeleton`, `FoliageAttachmentSet`, shared procedural bark and foliage PBR `StandardShadeMaterial`s,
|
|
4
|
+
* skeletal wind `ShadeAnimationClip`, and the multi-LOD `TreeLODAsset[]` chain.
|
|
5
|
+
*
|
|
6
|
+
* Exposes top-level convenience getters (`.bark_geometry`, `.foliage_geometry`, `.bark_meshlet_geometry`,
|
|
7
|
+
* `.foliage_meshlet_geometry`, `.scene_bundle`, `.prefab`) aliasing `lods[0]`.
|
|
8
|
+
*/
|
|
9
|
+
export class TreeAsset {
|
|
10
|
+
/**
|
|
11
|
+
* Resolved species configuration used to generate this asset.
|
|
12
|
+
* @type {import("../config/TreeSpeciesConfig.js").TreeSpeciesConfig}
|
|
13
|
+
*/
|
|
14
|
+
config = null;
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Directed botanical skeleton graph (`Graph` + `Transform64` + `Attribute`s).
|
|
18
|
+
* @type {import("../skeleton/TreeSkeleton.js").TreeSkeleton}
|
|
19
|
+
*/
|
|
20
|
+
skeleton = null;
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Phyllotactic foliage card attachment transforms and ranks.
|
|
24
|
+
* @type {import("../mesh/foliage_collect_attachments.js").FoliageAttachmentSet}
|
|
25
|
+
*/
|
|
26
|
+
attachments = null;
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Extracted structural skin joint descriptors.
|
|
30
|
+
* @type {ReturnType<import("../skeleton/tree_skeleton_assign_skin_joints.js").tree_skeleton_assign_skin_joints>}
|
|
31
|
+
*/
|
|
32
|
+
skin_info = null;
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* GPU fluid-driven foliage wind rig (`name = "foliage_wind"`), or `null` if wind disabled.
|
|
36
|
+
* @type {import("../../../shade/renderer/animation/foliage/FoliageWindRig.js").FoliageWindRig|null}
|
|
37
|
+
*/
|
|
38
|
+
wind_rig = null;
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Procedural bark PBR `StandardShadeMaterial` shared across all LODs.
|
|
42
|
+
* @type {import("../../../shade/renderer/material/StandardShadeMaterial.js").StandardShadeMaterial}
|
|
43
|
+
*/
|
|
44
|
+
bark_material = null;
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Procedural foliage cutout PBR `StandardShadeMaterial` shared across all LODs.
|
|
48
|
+
* @type {import("../../../shade/renderer/material/StandardShadeMaterial.js").StandardShadeMaterial}
|
|
49
|
+
*/
|
|
50
|
+
foliage_material = null;
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Progressive LOD asset chain (`lods[0]` = highest detail).
|
|
54
|
+
* @type {import("./TreeLODAsset.js").TreeLODAsset[]}
|
|
55
|
+
*/
|
|
56
|
+
lods = [];
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Highest-detail (`lods[0]`) bark `Geometry`.
|
|
60
|
+
* @returns {import("../../../shade/renderer/geometry/Geometry.js").Geometry|null}
|
|
61
|
+
*/
|
|
62
|
+
get bark_geometry() {
|
|
63
|
+
return this.lods.length > 0 ? this.lods[0].bark_geometry : null;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Highest-detail (`lods[0]`) foliage `Geometry`.
|
|
68
|
+
* @returns {import("../../../shade/renderer/geometry/Geometry.js").Geometry|null}
|
|
69
|
+
*/
|
|
70
|
+
get foliage_geometry() {
|
|
71
|
+
return this.lods.length > 0 ? this.lods[0].foliage_geometry : null;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Highest-detail (`lods[0]`) bark `MeshletGeometry` (lazy memoized).
|
|
76
|
+
* @returns {import("../../../shade/renderer/geometry/MeshletGeometry.js").MeshletGeometry|null}
|
|
77
|
+
*/
|
|
78
|
+
get bark_meshlet_geometry() {
|
|
79
|
+
return this.lods.length > 0 ? this.lods[0].bark_meshlet_geometry : null;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Highest-detail (`lods[0]`) foliage `MeshletGeometry` (lazy memoized).
|
|
84
|
+
* @returns {import("../../../shade/renderer/geometry/MeshletGeometry.js").MeshletGeometry|null}
|
|
85
|
+
*/
|
|
86
|
+
get foliage_meshlet_geometry() {
|
|
87
|
+
return this.lods.length > 0 ? this.lods[0].foliage_meshlet_geometry : null;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Highest-detail (`lods[0]`) `SceneBundle` (lazy memoized).
|
|
92
|
+
* @returns {import("../../../shade/renderer/loader/SceneBundle.js").SceneBundle|null}
|
|
93
|
+
*/
|
|
94
|
+
get scene_bundle() {
|
|
95
|
+
return this.lods.length > 0 ? this.lods[0].scene_bundle : null;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Highest-detail (`lods[0]`) compiled `Prefab` (lazy memoized).
|
|
100
|
+
* @returns {import("../../../engine/graphics3/prefab/Prefab.js").Prefab|null}
|
|
101
|
+
*/
|
|
102
|
+
get prefab() {
|
|
103
|
+
return this.lods.length > 0 ? this.lods[0].prefab : null;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* @readonly
|
|
109
|
+
* @type {boolean}
|
|
110
|
+
*/
|
|
111
|
+
TreeAsset.prototype.isTreeAsset = true;
|