@woosh/meep-engine 3.52.0 → 3.53.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/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/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/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 +0 -1
- package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts.map +1 -1
- package/src/engine/graphics3/GPUParticleEmitterSystem.js +19 -5
- 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 +318 -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 +120 -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/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 +90 -0
- package/src/generation/foliage/config/FoliageMaterialConfig.d.ts.map +1 -0
- package/src/generation/foliage/config/FoliageMaterialConfig.js +181 -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 +38 -0
- package/src/generation/foliage/index.d.ts.map +1 -0
- package/src/generation/foliage/index.js +43 -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 +802 -0
- package/src/generation/foliage/material/make_foliage_material.d.ts +14 -0
- package/src/generation/foliage/material/make_foliage_material.d.ts.map +1 -0
- package/src/generation/foliage/material/make_foliage_material.js +359 -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 +203 -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 +80 -0
- package/src/generation/foliage/mesh/foliage_collect_attachments.d.ts.map +1 -0
- package/src/generation/foliage/mesh/foliage_collect_attachments.js +502 -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 +1047 -0
- package/src/generation/foliage/mesh/tree_mesh_build_foliage.d.ts +21 -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 +415 -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 +837 -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 +14 -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 +179 -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 +1104 -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 +127 -0
- package/src/shade/playground/foliage_wind/foliage_world.d.ts.map +1 -0
- package/src/shade/playground/foliage_wind/foliage_world.js +593 -0
- package/src/shade/playground/foliage_wind/index.html +254 -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 +263 -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 +7 -0
- 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 +7 -0
- 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/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 +7 -0
- 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/geometry/bvh/GPUBLASRefitBatch.js +2 -2
- 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/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 +3 -1
- 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 +9 -4
- 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/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/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/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
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Synthesizes a turn-key procedural PBR cutout `StandardShadeMaterial` (`TransparencyMode.AlphaTested`,
|
|
3
|
+
* `ShadeDrawSide.Double`) for botanical foliage cards, with dilated straight-alpha Albedo
|
|
4
|
+
* (`AlphaMode.Straight`, `ColorSpace.SRGB`), 2-channel Normal map (`ColorSpace.LinearSRGB`),
|
|
5
|
+
* and ORM (`ColorSpace.LinearSRGB`).
|
|
6
|
+
*
|
|
7
|
+
* @param {FoliageMaterialConfig|Object} [config]
|
|
8
|
+
* @param {number} [seed=1]
|
|
9
|
+
* @returns {StandardShadeMaterial}
|
|
10
|
+
*/
|
|
11
|
+
export function make_foliage_material(config?: FoliageMaterialConfig | any, seed?: number): StandardShadeMaterial;
|
|
12
|
+
import { FoliageMaterialConfig } from "../config/FoliageMaterialConfig.js";
|
|
13
|
+
import { StandardShadeMaterial } from "../../../shade/renderer/material/StandardShadeMaterial.js";
|
|
14
|
+
//# sourceMappingURL=make_foliage_material.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"make_foliage_material.d.ts","sourceRoot":"","sources":["../../../../../src/generation/foliage/material/make_foliage_material.js"],"names":[],"mappings":"AAgGA;;;;;;;;;GASG;AACH,+CAJW,qBAAqB,MAAO,SAC5B,MAAM,GACJ,qBAAqB,CA8PjC;sCAvVqC,oCAAoC;sCARpC,2DAA2D"}
|
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
import { clamp } from "../../../core/math/clamp.js";
|
|
2
|
+
import { lerp } from "../../../core/math/lerp.js";
|
|
3
|
+
import { sdnoise3_array } from "../../../core/math/noise/sdnoise.js";
|
|
4
|
+
import { seededRandom } from "../../../core/math/random/seededRandom.js";
|
|
5
|
+
import { smoothStep } from "../../../core/math/smoothStep.js";
|
|
6
|
+
import { Sampler2D } from "../../../engine/graphics/texture/sampler/Sampler2D.js";
|
|
7
|
+
import { ShadeDrawSide } from "../../../shade/renderer/material/ShadeDrawSide.js";
|
|
8
|
+
import { StandardShadeMaterial } from "../../../shade/renderer/material/StandardShadeMaterial.js";
|
|
9
|
+
import { TransparencyMode } from "../../../shade/renderer/material/TransparencyMode.js";
|
|
10
|
+
import { ColorSpace } from "../../../shade/renderer/texture/ColorSpace.js";
|
|
11
|
+
import { ShadeTexture } from "../../../shade/renderer/texture/ShadeTexture.js";
|
|
12
|
+
import { TextureFilterType } from "../../../shade/renderer/texture/TextureFilterType.js";
|
|
13
|
+
import { TextureWrapType } from "../../../shade/renderer/texture/TextureWrapType.js";
|
|
14
|
+
import { AlphaMode } from "../../../shade/renderer/texture/source/AlphaMode.js";
|
|
15
|
+
import { ShadeImage } from "../../../shade/renderer/texture/source/ShadeImage.js";
|
|
16
|
+
import { FoliageMaterialConfig } from "../config/FoliageMaterialConfig.js";
|
|
17
|
+
|
|
18
|
+
const SCRATCH_NOISE = new Float32Array(4);
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Evaluates a single leaflet SDF + venation relief in local leaflet coordinates `(lx, ly)`
|
|
22
|
+
* where `ly` in `[0, 1]` runs from petiole base to leaflet tip and `lx` in `[-0.5, 0.5]` runs across width.
|
|
23
|
+
*
|
|
24
|
+
* @param {number} lx
|
|
25
|
+
* @param {number} ly
|
|
26
|
+
* @param {string} shape `"ovate" | "lobed" | "serrated" | "palmate" | "needle" | "frond"`
|
|
27
|
+
* @returns {{ mask: number, vein: number, height: number }}
|
|
28
|
+
*/
|
|
29
|
+
function evaluate_leaflet(lx, ly, shape) {
|
|
30
|
+
if (ly < -0.05 || ly > 1.05) {
|
|
31
|
+
return { mask: 0.0, vein: 0.0, height: 0.0 };
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const t = clamp(ly, 0.0, 1.0);
|
|
35
|
+
const ax = Math.abs(lx);
|
|
36
|
+
|
|
37
|
+
let half_w = 0.34 * Math.sin(Math.PI * Math.pow(t, 0.72));
|
|
38
|
+
|
|
39
|
+
switch (shape) {
|
|
40
|
+
case "lobed": {
|
|
41
|
+
// Oak-like rounded lobes along margin
|
|
42
|
+
const lobe = 1.0 + 0.28 * Math.sin(t * Math.PI * 7.0 - 0.6) * Math.sin(Math.PI * t);
|
|
43
|
+
half_w *= lobe;
|
|
44
|
+
break;
|
|
45
|
+
}
|
|
46
|
+
case "serrated": {
|
|
47
|
+
// Birch/elm sawtooth serration
|
|
48
|
+
const tooth = (t * 14.0) % 1.0;
|
|
49
|
+
half_w *= (0.88 + 0.16 * (1.0 - tooth));
|
|
50
|
+
break;
|
|
51
|
+
}
|
|
52
|
+
case "palmate": {
|
|
53
|
+
// Maple-like broader lobed palmate blade
|
|
54
|
+
const lobe = 1.0 + 0.32 * Math.cos(t * Math.PI * 5.0);
|
|
55
|
+
half_w = 0.40 * Math.sin(Math.PI * Math.pow(t, 0.65)) * lobe;
|
|
56
|
+
break;
|
|
57
|
+
}
|
|
58
|
+
case "needle": {
|
|
59
|
+
// Slender conifer needle
|
|
60
|
+
half_w = 0.065 * (1.0 - 0.65 * t * t);
|
|
61
|
+
break;
|
|
62
|
+
}
|
|
63
|
+
case "frond": {
|
|
64
|
+
// Long tapering willow/palm/fern pinna
|
|
65
|
+
half_w = 0.19 * Math.sin(Math.PI * Math.pow(t, 0.6));
|
|
66
|
+
break;
|
|
67
|
+
}
|
|
68
|
+
case "ovate":
|
|
69
|
+
default:
|
|
70
|
+
break;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
if (ax > half_w + 0.04) {
|
|
74
|
+
return { mask: 0.0, vein: 0.0, height: 0.0 };
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
const edge_dist = half_w - ax;
|
|
78
|
+
const mask = smoothStep(-0.015, 0.018, edge_dist);
|
|
79
|
+
if (mask <= 0.0) {
|
|
80
|
+
return { mask: 0.0, vein: 0.0, height: 0.0 };
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// Midrib + herringbone secondary veins
|
|
84
|
+
const midrib = Math.exp(-ax * ax * 900.0) * (1.0 - 0.6 * t);
|
|
85
|
+
const sec_coord = (t * 9.0 - ax * 6.5);
|
|
86
|
+
const sec_frac = sec_coord - Math.floor(sec_coord);
|
|
87
|
+
const sec_vein = Math.exp(-Math.pow(sec_frac - 0.5, 2.0) * 65.0) * smoothStep(0.0, half_w, half_w - ax * 0.85) * 0.45;
|
|
88
|
+
|
|
89
|
+
const vein = clamp(midrib + sec_vein, 0.0, 1.0);
|
|
90
|
+
// Lamina pillow camber across width + vein ridge
|
|
91
|
+
const camber = Math.sqrt(Math.max(0.0, 1.0 - Math.pow(ax / Math.max(1e-3, half_w), 2.0))) * 0.65;
|
|
92
|
+
const height = (camber + vein * 0.35) * mask;
|
|
93
|
+
|
|
94
|
+
return { mask, vein, height };
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Synthesizes a turn-key procedural PBR cutout `StandardShadeMaterial` (`TransparencyMode.AlphaTested`,
|
|
99
|
+
* `ShadeDrawSide.Double`) for botanical foliage cards, with dilated straight-alpha Albedo
|
|
100
|
+
* (`AlphaMode.Straight`, `ColorSpace.SRGB`), 2-channel Normal map (`ColorSpace.LinearSRGB`),
|
|
101
|
+
* and ORM (`ColorSpace.LinearSRGB`).
|
|
102
|
+
*
|
|
103
|
+
* @param {FoliageMaterialConfig|Object} [config]
|
|
104
|
+
* @param {number} [seed=1]
|
|
105
|
+
* @returns {StandardShadeMaterial}
|
|
106
|
+
*/
|
|
107
|
+
export function make_foliage_material(config = new FoliageMaterialConfig(), seed = 1) {
|
|
108
|
+
const cfg = config && config.isFoliageMaterialConfig ? config : FoliageMaterialConfig.from(config);
|
|
109
|
+
const res = Math.max(16, cfg.resolution | 0);
|
|
110
|
+
const rng = seededRandom((seed ^ 0x7F4A7C15) | 0);
|
|
111
|
+
const ox = (rng() - 0.5) * 150.0;
|
|
112
|
+
const oy = (rng() - 0.5) * 150.0;
|
|
113
|
+
|
|
114
|
+
const albedo_sampler = Sampler2D.uint8(4, res, res);
|
|
115
|
+
const normal_sampler = Sampler2D.uint8(2, res, res);
|
|
116
|
+
const orm_sampler = Sampler2D.uint8(4, res, res);
|
|
117
|
+
|
|
118
|
+
const albedo_data = albedo_sampler.data;
|
|
119
|
+
const normal_data = normal_sampler.data;
|
|
120
|
+
const orm_data = orm_sampler.data;
|
|
121
|
+
|
|
122
|
+
const height_field = new Float32Array(res * res);
|
|
123
|
+
const shape = cfg.leaf_shape || "lobed";
|
|
124
|
+
const leaflet_count = Math.max(1, cfg.leaflets_per_cluster | 0);
|
|
125
|
+
const base_rough = clamp(cfg.roughness, 0.1, 1.0);
|
|
126
|
+
const vein_str = clamp(cfg.vein_strength, 0.0, 1.0);
|
|
127
|
+
const autumn = clamp(cfg.autumn_tint, 0.0, 1.0);
|
|
128
|
+
|
|
129
|
+
// Base leaf color (mixed with optional autumn golden-orange tint)
|
|
130
|
+
const r1 = lerp(cfg.primary_color.r, 0.78, autumn * 0.7);
|
|
131
|
+
const g1 = lerp(cfg.primary_color.g, 0.36, autumn * 0.5);
|
|
132
|
+
const b1 = lerp(cfg.primary_color.b, 0.08, autumn * 0.7);
|
|
133
|
+
|
|
134
|
+
const r2 = lerp(cfg.secondary_color.r, 0.88, autumn * 0.75);
|
|
135
|
+
const g2 = lerp(cfg.secondary_color.g, 0.55, autumn * 0.5);
|
|
136
|
+
const b2 = lerp(cfg.secondary_color.b, 0.12, autumn * 0.75);
|
|
137
|
+
|
|
138
|
+
// Precompute leaflet placement descriptors on the `[0, 1]^2` card anchored at `(anchor_u, anchor_v)`
|
|
139
|
+
const anchor_u = clamp(cfg.stem_anchor_u ?? 0.5, 0.1, 0.9);
|
|
140
|
+
const anchor_v = clamp(cfg.stem_anchor_v ?? 0.0, 0.0, 0.25);
|
|
141
|
+
const leaflets = [];
|
|
142
|
+
if (shape === "palmate") {
|
|
143
|
+
// Radiating palmate leaflets from basal hub above (anchor_u, anchor_v)
|
|
144
|
+
const count = Math.max(3, leaflet_count | 1);
|
|
145
|
+
for (let i = 0; i < count; i++) {
|
|
146
|
+
const frac = (i / (count - 1)) * 2.0 - 1.0; // [-1, 1]
|
|
147
|
+
const angle = frac * 1.05;
|
|
148
|
+
const scale = (1.0 - 0.32 * Math.abs(frac)) * 0.76;
|
|
149
|
+
leaflets.push({
|
|
150
|
+
ox: anchor_u,
|
|
151
|
+
oy: anchor_v + 0.08,
|
|
152
|
+
dir_x: Math.sin(angle),
|
|
153
|
+
dir_y: Math.cos(angle),
|
|
154
|
+
length: scale,
|
|
155
|
+
width: scale * 0.9
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
} else if (shape === "needle") {
|
|
159
|
+
// Fascicle of radiating conifer needles along central twig from anchor_v
|
|
160
|
+
const pairs = Math.max(4, leaflet_count);
|
|
161
|
+
for (let i = 0; i < pairs; i++) {
|
|
162
|
+
const v_stem = anchor_v + 0.04 + (i / pairs) * 0.74;
|
|
163
|
+
for (const side of [-1, 1]) {
|
|
164
|
+
const angle = side * (0.45 + 0.25 * (1.0 - i / pairs));
|
|
165
|
+
const len = 0.36 * (1.0 - 0.35 * (i / pairs));
|
|
166
|
+
leaflets.push({
|
|
167
|
+
ox: anchor_u,
|
|
168
|
+
oy: v_stem,
|
|
169
|
+
dir_x: Math.sin(angle),
|
|
170
|
+
dir_y: Math.cos(angle),
|
|
171
|
+
length: len,
|
|
172
|
+
width: len
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
// Terminal needle tuft
|
|
177
|
+
leaflets.push({ ox: anchor_u, oy: anchor_v + 0.72, dir_x: 0.0, dir_y: 1.0, length: 0.26, width: 0.26 });
|
|
178
|
+
} else {
|
|
179
|
+
// Pinnate twig cluster: pairs of lateral leaflets + 1 terminal apical leaflet starting near anchor_v
|
|
180
|
+
const pairs = Math.max(1, Math.floor(leaflet_count / 2));
|
|
181
|
+
for (let p = 0; p < pairs; p++) {
|
|
182
|
+
const u_p = (p + 0.35) / (pairs + 0.35);
|
|
183
|
+
const v_stem = anchor_v + 0.04 + u_p * 0.56;
|
|
184
|
+
const angle_mag = lerp(0.95, 0.55, u_p);
|
|
185
|
+
const len = lerp(0.40, 0.30, u_p);
|
|
186
|
+
for (const side of [-1, 1]) {
|
|
187
|
+
const angle = side * angle_mag;
|
|
188
|
+
leaflets.push({
|
|
189
|
+
ox: anchor_u,
|
|
190
|
+
oy: v_stem,
|
|
191
|
+
dir_x: Math.sin(angle),
|
|
192
|
+
dir_y: Math.cos(angle),
|
|
193
|
+
length: len,
|
|
194
|
+
width: len * 0.95
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
// Terminal apical leaflet
|
|
199
|
+
leaflets.push({
|
|
200
|
+
ox: anchor_u,
|
|
201
|
+
oy: anchor_v + 0.56,
|
|
202
|
+
dir_x: 0.0,
|
|
203
|
+
dir_y: 1.0,
|
|
204
|
+
length: 0.42,
|
|
205
|
+
width: 0.40
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
const min_stem_half_w = Math.max(0.022, 1.5 / res);
|
|
210
|
+
for (let y = 0; y < res; y++) {
|
|
211
|
+
const v = (y + 0.5) / res;
|
|
212
|
+
for (let x = 0; x < res; x++) {
|
|
213
|
+
const u = (x + 0.5) / res;
|
|
214
|
+
const p_idx = y * res + x;
|
|
215
|
+
|
|
216
|
+
// Central woody twig / rachis along u = anchor_u, v in [anchor_v, anchor_v + 0.72]
|
|
217
|
+
let stem_mask = 0.0;
|
|
218
|
+
if (v >= anchor_v && v <= anchor_v + 0.72) {
|
|
219
|
+
const u_stem = clamp((v - anchor_v) / 0.72, 0.0, 1.0);
|
|
220
|
+
const stem_half_w = lerp(min_stem_half_w, 0.007, u_stem);
|
|
221
|
+
const d_stem = stem_half_w - Math.abs(u - anchor_u);
|
|
222
|
+
stem_mask = smoothStep(-0.008, 0.008, d_stem);
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
let best_mask = 0.0;
|
|
226
|
+
let best_vein = 0.0;
|
|
227
|
+
let best_h = 0.0;
|
|
228
|
+
let best_tip = 0.0;
|
|
229
|
+
|
|
230
|
+
for (let l = 0; l < leaflets.length; l++) {
|
|
231
|
+
const lf = leaflets[l];
|
|
232
|
+
const dx = u - lf.ox;
|
|
233
|
+
const dy = v - lf.oy;
|
|
234
|
+
// Project onto leaflet forward (dir_x, dir_y) and right (dir_y, -dir_x)
|
|
235
|
+
const ly = (dx * lf.dir_x + dy * lf.dir_y) / lf.length;
|
|
236
|
+
const lx = (dx * lf.dir_y - dy * lf.dir_x) / lf.width;
|
|
237
|
+
|
|
238
|
+
const eval_res = evaluate_leaflet(lx, ly, shape);
|
|
239
|
+
if (eval_res.mask > best_mask) {
|
|
240
|
+
best_mask = eval_res.mask;
|
|
241
|
+
best_vein = eval_res.vein;
|
|
242
|
+
best_h = eval_res.height;
|
|
243
|
+
best_tip = clamp(ly, 0.0, 1.0);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
const alpha = clamp(Math.max(best_mask, stem_mask), 0.0, 1.0);
|
|
248
|
+
height_field[p_idx] = Math.max(best_h, stem_mask * 0.4);
|
|
249
|
+
|
|
250
|
+
sdnoise3_array(SCRATCH_NOISE, u * 6.0 + ox, v * 6.0 + oy, 0.0);
|
|
251
|
+
const n_var = SCRATCH_NOISE[0] * 0.5 + 0.5;
|
|
252
|
+
|
|
253
|
+
// Compute straight RGB even when alpha === 0 (automatic infinite dilation for mipmap bleeding safety!)
|
|
254
|
+
const mix_t = clamp(best_vein * vein_str * 0.65 + best_tip * 0.25 + n_var * 0.2, 0.0, 1.0);
|
|
255
|
+
let cr = lerp(r1, r2, mix_t);
|
|
256
|
+
let cg = lerp(g1, g2, mix_t);
|
|
257
|
+
let cb = lerp(b1, b2, mix_t);
|
|
258
|
+
|
|
259
|
+
if (stem_mask > best_mask) {
|
|
260
|
+
cr = lerp(cr, 0.32, stem_mask * 0.75);
|
|
261
|
+
cg = lerp(cg, 0.26, stem_mask * 0.75);
|
|
262
|
+
cb = lerp(cb, 0.16, stem_mask * 0.75);
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
// Subtle basal petiole ambient darkening
|
|
266
|
+
const base_shade = 0.82 + 0.18 * v;
|
|
267
|
+
cr *= base_shade;
|
|
268
|
+
cg *= base_shade;
|
|
269
|
+
cb *= base_shade;
|
|
270
|
+
|
|
271
|
+
const i4 = p_idx * 4;
|
|
272
|
+
albedo_data[i4] = clamp(Math.round(cr * 255), 0, 255);
|
|
273
|
+
albedo_data[i4 + 1] = clamp(Math.round(cg * 255), 0, 255);
|
|
274
|
+
albedo_data[i4 + 2] = clamp(Math.round(cb * 255), 0, 255);
|
|
275
|
+
albedo_data[i4 + 3] = clamp(Math.round(alpha * 255), 0, 255);
|
|
276
|
+
|
|
277
|
+
const ao = clamp(0.75 + 0.25 * best_h, 0.25, 1.0);
|
|
278
|
+
const rough = clamp(base_rough - best_vein * 0.08 + (1.0 - n_var) * 0.06, 0.15, 0.95);
|
|
279
|
+
orm_data[i4] = clamp(Math.round(ao * 255), 0, 255);
|
|
280
|
+
orm_data[i4 + 1] = clamp(Math.round(rough * 255), 0, 255);
|
|
281
|
+
orm_data[i4 + 2] = 0;
|
|
282
|
+
orm_data[i4 + 3] = 255;
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
// Pass 2: Central-difference tangent-space normal map from leaf venation heightfield
|
|
287
|
+
const norm_str = 1.6 * vein_str + 0.35;
|
|
288
|
+
for (let y = 0; y < res; y++) {
|
|
289
|
+
const y0 = Math.max(0, y - 1);
|
|
290
|
+
const y1 = Math.min(res - 1, y + 1);
|
|
291
|
+
for (let x = 0; x < res; x++) {
|
|
292
|
+
const x0 = Math.max(0, x - 1);
|
|
293
|
+
const x1 = Math.min(res - 1, x + 1);
|
|
294
|
+
|
|
295
|
+
const dh_du = (height_field[y * res + x1] - height_field[y * res + x0]) * 0.5 * norm_str;
|
|
296
|
+
const dh_dv = (height_field[y1 * res + x] - height_field[y0 * res + x]) * 0.5 * norm_str;
|
|
297
|
+
|
|
298
|
+
let nx = -dh_du;
|
|
299
|
+
let ny = -dh_dv;
|
|
300
|
+
let nz = 1.0;
|
|
301
|
+
const nl = Math.sqrt(nx * nx + ny * ny + nz * nz);
|
|
302
|
+
nx /= nl;
|
|
303
|
+
ny /= nl;
|
|
304
|
+
|
|
305
|
+
const i2 = (y * res + x) * 2;
|
|
306
|
+
normal_data[i2] = clamp(Math.round((nx * 0.5 + 0.5) * 255), 0, 255);
|
|
307
|
+
normal_data[i2 + 1] = clamp(Math.round((ny * 0.5 + 0.5) * 255), 0, 255);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
const albedo_image = ShadeImage.fromSampler2D(albedo_sampler);
|
|
312
|
+
albedo_image.color_space = ColorSpace.SRGB;
|
|
313
|
+
// CRITICAL: Keep AlphaMode.Straight so texture_write_to_gpu premultiplies once on upload
|
|
314
|
+
// and G-buffer albedo_unpremultiply recovers clean dilated leaf color at cutout boundaries.
|
|
315
|
+
albedo_image.alpha_mode = AlphaMode.Straight;
|
|
316
|
+
const texture_albedo = ShadeTexture.from(albedo_image);
|
|
317
|
+
texture_albedo.label = "foliage_leaf_albedo";
|
|
318
|
+
texture_albedo.color_space = ColorSpace.SRGB;
|
|
319
|
+
texture_albedo.mipmapGenerationFilter = TextureFilterType.MagicKernelSharp;
|
|
320
|
+
texture_albedo.wrapS = TextureWrapType.ClampToEdge;
|
|
321
|
+
texture_albedo.wrapT = TextureWrapType.ClampToEdge;
|
|
322
|
+
|
|
323
|
+
const normal_image = ShadeImage.fromSampler2D(normal_sampler);
|
|
324
|
+
normal_image.color_space = ColorSpace.None;
|
|
325
|
+
normal_image.alpha_mode = AlphaMode.Opaque;
|
|
326
|
+
const texture_normal = ShadeTexture.from(normal_image);
|
|
327
|
+
texture_normal.label = "foliage_leaf_normal";
|
|
328
|
+
texture_normal.color_space = ColorSpace.LinearSRGB;
|
|
329
|
+
texture_normal.mipmapGenerationFilter = TextureFilterType.LinearNormal;
|
|
330
|
+
texture_normal.wrapS = TextureWrapType.ClampToEdge;
|
|
331
|
+
texture_normal.wrapT = TextureWrapType.ClampToEdge;
|
|
332
|
+
|
|
333
|
+
const orm_image = ShadeImage.fromSampler2D(orm_sampler);
|
|
334
|
+
orm_image.color_space = ColorSpace.None;
|
|
335
|
+
orm_image.alpha_mode = AlphaMode.Opaque;
|
|
336
|
+
const texture_orm = ShadeTexture.from(orm_image);
|
|
337
|
+
texture_orm.label = "foliage_leaf_orm";
|
|
338
|
+
texture_orm.color_space = ColorSpace.LinearSRGB;
|
|
339
|
+
texture_orm.wrapS = TextureWrapType.ClampToEdge;
|
|
340
|
+
texture_orm.wrapT = TextureWrapType.ClampToEdge;
|
|
341
|
+
|
|
342
|
+
const material = new StandardShadeMaterial();
|
|
343
|
+
material.name = "foliage_leaf_material";
|
|
344
|
+
material.texture_albedo = texture_albedo;
|
|
345
|
+
material.texture_normal = texture_normal;
|
|
346
|
+
material.texture_orm = texture_orm;
|
|
347
|
+
material.roughness_factor = 1.0;
|
|
348
|
+
material.metallic_factor = 0.0;
|
|
349
|
+
// CRITICAL: Keep transmission_factor = 0 on AlphaTested cards so transparent card corners
|
|
350
|
+
// do not act as refractive glass in the path tracer!
|
|
351
|
+
material.transmission_factor = 0.0;
|
|
352
|
+
material.ambient_factors.a = 1.0;
|
|
353
|
+
material.ambient_factors.b = 0.0;
|
|
354
|
+
material.transparency_mode = TransparencyMode.AlphaTested;
|
|
355
|
+
material.transparency = TransparencyMode.AlphaTested;
|
|
356
|
+
material.draw_side = ShadeDrawSide.Double;
|
|
357
|
+
|
|
358
|
+
return material;
|
|
359
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Projects a child branch collar vertex `(ring_x, ring_y, ring_z)` into the parent branch's
|
|
3
|
+
* polygonal frustum in the orthonormal $(\mathbf{T}_p, \hat{\mathbf{u}}, \hat{\mathbf{w}})$ basis,
|
|
4
|
+
* guaranteeing that:
|
|
5
|
+
* 1. Every welded base vertex (`weld_factor === 1`) sits strictly inside the parent polygon's
|
|
6
|
+
* inscribed apothem radius $R_{\text{apothem}}(z) = R_p(z) (1 - \text{flute\_amp}_p) \cos(\pi / M_p)$
|
|
7
|
+
* at the vertex's axial height $z$ (preventing any daylight gap outside polygonal parent facets or tapering segments).
|
|
8
|
+
* 2. Every welded base vertex lands strictly on the emerging $+\hat{\mathbf{u}}$ hemisphere of the
|
|
9
|
+
* parent axis ($q_u > 0$, preventing any backward protrusion through the opposite side of the parent branch).
|
|
10
|
+
* 3. Axial offset $z$ along $\mathbf{T}_p$ is bounded within $[z_{\min}, z_{\max}]$.
|
|
11
|
+
* 4. Outward normals blend smoothly ($C^1$) from the parent cylinder normal to the child tube normal.
|
|
12
|
+
*
|
|
13
|
+
* @param {number[]|Float32Array} out_pos
|
|
14
|
+
* @param {number} out_pos_offset
|
|
15
|
+
* @param {number[]|Float32Array} out_norm
|
|
16
|
+
* @param {number} out_norm_offset
|
|
17
|
+
* @param {number} ring_x flared child ring vertex X
|
|
18
|
+
* @param {number} ring_y flared child ring vertex Y
|
|
19
|
+
* @param {number} ring_z flared child ring vertex Z
|
|
20
|
+
* @param {number} tube_nx outward child tube normal X
|
|
21
|
+
* @param {number} tube_ny outward child tube normal Y
|
|
22
|
+
* @param {number} tube_nz outward child tube normal Z
|
|
23
|
+
* @param {number} child_tx unit child spine tangent X
|
|
24
|
+
* @param {number} child_ty unit child spine tangent Y
|
|
25
|
+
* @param {number} child_tz unit child spine tangent Z
|
|
26
|
+
* @param {number} parent_px parent attachment center X
|
|
27
|
+
* @param {number} parent_py parent attachment center Y
|
|
28
|
+
* @param {number} parent_pz parent attachment center Z
|
|
29
|
+
* @param {number} parent_tx unit parent spine tangent X
|
|
30
|
+
* @param {number} parent_ty unit parent spine tangent Y
|
|
31
|
+
* @param {number} parent_tz unit parent spine tangent Z
|
|
32
|
+
* @param {number} parent_radius parent branch radius at attachment
|
|
33
|
+
* @param {number} weld_factor in [0, 1] (1 at base ring i=0, decaying to 0 across collar rings)
|
|
34
|
+
* @param {number} normal_blend in [0, 1] blend weight toward parent normal
|
|
35
|
+
* @param {number} [parent_radial_segments=8] radial polygon vertex count M_p of parent branch
|
|
36
|
+
* @param {number} [parent_flute_amplitude=0.0] flute amplitude of parent branch
|
|
37
|
+
* @param {number} [parent_taper_slope=0.0] linear radius change dR_p/dz along parent_T
|
|
38
|
+
* @param {number} [z_min=-Infinity] minimum axial offset along parent_T
|
|
39
|
+
* @param {number} [z_max=Infinity] maximum axial offset along parent_T
|
|
40
|
+
*/
|
|
41
|
+
export function branch_collar_project(out_pos: number[] | Float32Array, out_pos_offset: number, out_norm: number[] | Float32Array, out_norm_offset: number, ring_x: number, ring_y: number, ring_z: number, tube_nx: number, tube_ny: number, tube_nz: number, child_tx: number, child_ty: number, child_tz: number, parent_px: number, parent_py: number, parent_pz: number, parent_tx: number, parent_ty: number, parent_tz: number, parent_radius: number, weld_factor: number, normal_blend: number, parent_radial_segments?: number, parent_flute_amplitude?: number, parent_taper_slope?: number, z_min?: number, z_max?: number): void;
|
|
42
|
+
//# sourceMappingURL=branch_collar_project.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"branch_collar_project.d.ts","sourceRoot":"","sources":["../../../../../src/generation/foliage/mesh/branch_collar_project.js"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,+CA5BW,MAAM,EAAE,GAAC,YAAY,kBACrB,MAAM,YACN,MAAM,EAAE,GAAC,YAAY,mBACrB,MAAM,UACN,MAAM,UACN,MAAM,UACN,MAAM,WACN,MAAM,WACN,MAAM,WACN,MAAM,YACN,MAAM,YACN,MAAM,YACN,MAAM,aACN,MAAM,aACN,MAAM,aACN,MAAM,aACN,MAAM,aACN,MAAM,aACN,MAAM,iBACN,MAAM,eACN,MAAM,gBACN,MAAM,2BACN,MAAM,2BACN,MAAM,uBACN,MAAM,UACN,MAAM,UACN,MAAM,QAiKhB"}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import { clamp } from "../../../core/math/clamp.js";
|
|
2
|
+
import { lerp } from "../../../core/math/lerp.js";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Projects a child branch collar vertex `(ring_x, ring_y, ring_z)` into the parent branch's
|
|
6
|
+
* polygonal frustum in the orthonormal $(\mathbf{T}_p, \hat{\mathbf{u}}, \hat{\mathbf{w}})$ basis,
|
|
7
|
+
* guaranteeing that:
|
|
8
|
+
* 1. Every welded base vertex (`weld_factor === 1`) sits strictly inside the parent polygon's
|
|
9
|
+
* inscribed apothem radius $R_{\text{apothem}}(z) = R_p(z) (1 - \text{flute\_amp}_p) \cos(\pi / M_p)$
|
|
10
|
+
* at the vertex's axial height $z$ (preventing any daylight gap outside polygonal parent facets or tapering segments).
|
|
11
|
+
* 2. Every welded base vertex lands strictly on the emerging $+\hat{\mathbf{u}}$ hemisphere of the
|
|
12
|
+
* parent axis ($q_u > 0$, preventing any backward protrusion through the opposite side of the parent branch).
|
|
13
|
+
* 3. Axial offset $z$ along $\mathbf{T}_p$ is bounded within $[z_{\min}, z_{\max}]$.
|
|
14
|
+
* 4. Outward normals blend smoothly ($C^1$) from the parent cylinder normal to the child tube normal.
|
|
15
|
+
*
|
|
16
|
+
* @param {number[]|Float32Array} out_pos
|
|
17
|
+
* @param {number} out_pos_offset
|
|
18
|
+
* @param {number[]|Float32Array} out_norm
|
|
19
|
+
* @param {number} out_norm_offset
|
|
20
|
+
* @param {number} ring_x flared child ring vertex X
|
|
21
|
+
* @param {number} ring_y flared child ring vertex Y
|
|
22
|
+
* @param {number} ring_z flared child ring vertex Z
|
|
23
|
+
* @param {number} tube_nx outward child tube normal X
|
|
24
|
+
* @param {number} tube_ny outward child tube normal Y
|
|
25
|
+
* @param {number} tube_nz outward child tube normal Z
|
|
26
|
+
* @param {number} child_tx unit child spine tangent X
|
|
27
|
+
* @param {number} child_ty unit child spine tangent Y
|
|
28
|
+
* @param {number} child_tz unit child spine tangent Z
|
|
29
|
+
* @param {number} parent_px parent attachment center X
|
|
30
|
+
* @param {number} parent_py parent attachment center Y
|
|
31
|
+
* @param {number} parent_pz parent attachment center Z
|
|
32
|
+
* @param {number} parent_tx unit parent spine tangent X
|
|
33
|
+
* @param {number} parent_ty unit parent spine tangent Y
|
|
34
|
+
* @param {number} parent_tz unit parent spine tangent Z
|
|
35
|
+
* @param {number} parent_radius parent branch radius at attachment
|
|
36
|
+
* @param {number} weld_factor in [0, 1] (1 at base ring i=0, decaying to 0 across collar rings)
|
|
37
|
+
* @param {number} normal_blend in [0, 1] blend weight toward parent normal
|
|
38
|
+
* @param {number} [parent_radial_segments=8] radial polygon vertex count M_p of parent branch
|
|
39
|
+
* @param {number} [parent_flute_amplitude=0.0] flute amplitude of parent branch
|
|
40
|
+
* @param {number} [parent_taper_slope=0.0] linear radius change dR_p/dz along parent_T
|
|
41
|
+
* @param {number} [z_min=-Infinity] minimum axial offset along parent_T
|
|
42
|
+
* @param {number} [z_max=Infinity] maximum axial offset along parent_T
|
|
43
|
+
*/
|
|
44
|
+
export function branch_collar_project(
|
|
45
|
+
out_pos,
|
|
46
|
+
out_pos_offset,
|
|
47
|
+
out_norm,
|
|
48
|
+
out_norm_offset,
|
|
49
|
+
ring_x, ring_y, ring_z,
|
|
50
|
+
tube_nx, tube_ny, tube_nz,
|
|
51
|
+
child_tx, child_ty, child_tz,
|
|
52
|
+
parent_px, parent_py, parent_pz,
|
|
53
|
+
parent_tx, parent_ty, parent_tz,
|
|
54
|
+
parent_radius,
|
|
55
|
+
weld_factor,
|
|
56
|
+
normal_blend,
|
|
57
|
+
parent_radial_segments = 8,
|
|
58
|
+
parent_flute_amplitude = 0.0,
|
|
59
|
+
parent_taper_slope = 0.0,
|
|
60
|
+
z_min = -Infinity,
|
|
61
|
+
z_max = Infinity
|
|
62
|
+
) {
|
|
63
|
+
const w = clamp(weld_factor, 0.0, 1.0);
|
|
64
|
+
if (w <= 1e-5 || parent_radius <= 1e-5) {
|
|
65
|
+
out_pos[out_pos_offset] = ring_x;
|
|
66
|
+
out_pos[out_pos_offset + 1] = ring_y;
|
|
67
|
+
out_pos[out_pos_offset + 2] = ring_z;
|
|
68
|
+
out_norm[out_norm_offset] = tube_nx;
|
|
69
|
+
out_norm[out_norm_offset + 1] = tube_ny;
|
|
70
|
+
out_norm[out_norm_offset + 2] = tube_nz;
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// Polygon apothem factor of parent branch cross-section
|
|
75
|
+
const m_p = Math.max(3, parent_radial_segments | 0);
|
|
76
|
+
const flute_guard = Math.max(0.5, 1.0 - Math.max(0.0, parent_flute_amplitude));
|
|
77
|
+
const apothem_factor = Math.cos(Math.PI / m_p) * flute_guard;
|
|
78
|
+
const seat_ratio = 0.78 * apothem_factor;
|
|
79
|
+
|
|
80
|
+
// Vector from parent axis point to ring vertex
|
|
81
|
+
const dx = ring_x - parent_px;
|
|
82
|
+
const dy = ring_y - parent_py;
|
|
83
|
+
const dz = ring_z - parent_pz;
|
|
84
|
+
|
|
85
|
+
// Axial coordinate z_0 along parent_T and perpendicular radial offset q_0
|
|
86
|
+
const z_0 = dx * parent_tx + dy * parent_ty + dz * parent_tz;
|
|
87
|
+
const qx = dx - z_0 * parent_tx;
|
|
88
|
+
const qy = dy - z_0 * parent_ty;
|
|
89
|
+
const qz = dz - z_0 * parent_tz;
|
|
90
|
+
|
|
91
|
+
// Component of child_T perpendicular to parent_T
|
|
92
|
+
const dot_ct_pt = child_tx * parent_tx + child_ty * parent_ty + child_tz * parent_tz;
|
|
93
|
+
let ux = child_tx - dot_ct_pt * parent_tx;
|
|
94
|
+
let uy = child_ty - dot_ct_pt * parent_ty;
|
|
95
|
+
let uz = child_tz - dot_ct_pt * parent_tz;
|
|
96
|
+
const u_len = Math.sqrt(ux * ux + uy * uy + uz * uz);
|
|
97
|
+
|
|
98
|
+
let unx = 0.0, uny = 0.0, unz = 0.0;
|
|
99
|
+
if (u_len > 1e-5) {
|
|
100
|
+
unx = ux / u_len;
|
|
101
|
+
uny = uy / u_len;
|
|
102
|
+
unz = uz / u_len;
|
|
103
|
+
} else {
|
|
104
|
+
// Fallback orthogonal unit vector when child_T is collinear with parent_T
|
|
105
|
+
const q_len = Math.sqrt(qx * qx + qy * qy + qz * qz);
|
|
106
|
+
if (q_len > 1e-6) {
|
|
107
|
+
unx = qx / q_len;
|
|
108
|
+
uny = qy / q_len;
|
|
109
|
+
unz = qz / q_len;
|
|
110
|
+
} else {
|
|
111
|
+
if (Math.abs(parent_ty) < 0.9) {
|
|
112
|
+
unx = -parent_tz;
|
|
113
|
+
uny = 0.0;
|
|
114
|
+
unz = parent_tx;
|
|
115
|
+
} else {
|
|
116
|
+
unx = 1.0;
|
|
117
|
+
uny = 0.0;
|
|
118
|
+
unz = 0.0;
|
|
119
|
+
}
|
|
120
|
+
const d_p = unx * parent_tx + uny * parent_ty + unz * parent_tz;
|
|
121
|
+
unx -= d_p * parent_tx;
|
|
122
|
+
uny -= d_p * parent_ty;
|
|
123
|
+
unz -= d_p * parent_tz;
|
|
124
|
+
const nl = Math.sqrt(unx * unx + uny * uny + unz * unz) || 1.0;
|
|
125
|
+
unx /= nl;
|
|
126
|
+
uny /= nl;
|
|
127
|
+
unz /= nl;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// Lateral binormal w_hat = parent_T x u_hat
|
|
132
|
+
const wnx = parent_ty * unz - parent_tz * uny;
|
|
133
|
+
const wny = parent_tz * unx - parent_tx * unz;
|
|
134
|
+
const wnz = parent_tx * uny - parent_ty * unx;
|
|
135
|
+
|
|
136
|
+
const q_u = qx * unx + qy * uny + qz * unz;
|
|
137
|
+
const q_w = qx * wnx + qy * wny + qz * wnz;
|
|
138
|
+
|
|
139
|
+
const z_bound_min = Math.max(z_min, -0.95 * parent_radius);
|
|
140
|
+
const z_bound_max = Math.min(z_max, 0.95 * parent_radius);
|
|
141
|
+
const z_proj = z_bound_min <= z_bound_max
|
|
142
|
+
? clamp(z_0, z_bound_min, z_bound_max)
|
|
143
|
+
: clamp(z_0, z_min, z_max);
|
|
144
|
+
|
|
145
|
+
// Evaluate tapered parent radius and inscribed seat radius at z_proj
|
|
146
|
+
const r_parent_at_z = Math.max(0.25 * parent_radius, parent_radius + z_proj * parent_taper_slope);
|
|
147
|
+
const r_seat = r_parent_at_z * seat_ratio;
|
|
148
|
+
|
|
149
|
+
const q_w_proj = clamp(q_w, -0.78 * r_seat, 0.78 * r_seat);
|
|
150
|
+
const q_u_max = Math.sqrt(Math.max(0.0, r_seat * r_seat - q_w_proj * q_w_proj));
|
|
151
|
+
const s_u = clamp(q_u / Math.max(1e-5, r_parent_at_z), -1.0, 1.0);
|
|
152
|
+
const q_u_proj = q_u_max * (0.90 + 0.08 * s_u);
|
|
153
|
+
|
|
154
|
+
const proj_x = parent_px + z_proj * parent_tx + q_u_proj * unx + q_w_proj * wnx;
|
|
155
|
+
const proj_y = parent_py + z_proj * parent_ty + q_u_proj * uny + q_w_proj * wny;
|
|
156
|
+
const proj_z = parent_pz + z_proj * parent_tz + q_u_proj * unz + q_w_proj * wnz;
|
|
157
|
+
|
|
158
|
+
const final_x = lerp(ring_x, proj_x, w);
|
|
159
|
+
const final_y = lerp(ring_y, proj_y, w);
|
|
160
|
+
const final_z = lerp(ring_z, proj_z, w);
|
|
161
|
+
|
|
162
|
+
out_pos[out_pos_offset] = final_x;
|
|
163
|
+
out_pos[out_pos_offset + 1] = final_y;
|
|
164
|
+
out_pos[out_pos_offset + 2] = final_z;
|
|
165
|
+
|
|
166
|
+
// Compute parent cylinder outward normal at final position
|
|
167
|
+
const fdx = final_x - parent_px;
|
|
168
|
+
const fdy = final_y - parent_py;
|
|
169
|
+
const fdz = final_z - parent_pz;
|
|
170
|
+
const f_dot = fdx * parent_tx + fdy * parent_ty + fdz * parent_tz;
|
|
171
|
+
let pnx = fdx - f_dot * parent_tx;
|
|
172
|
+
let pny = fdy - f_dot * parent_ty;
|
|
173
|
+
let pnz = fdz - f_dot * parent_tz;
|
|
174
|
+
const pn_len = Math.sqrt(pnx * pnx + pny * pny + pnz * pnz);
|
|
175
|
+
if (pn_len > 1e-6) {
|
|
176
|
+
pnx /= pn_len;
|
|
177
|
+
pny /= pn_len;
|
|
178
|
+
pnz /= pn_len;
|
|
179
|
+
} else {
|
|
180
|
+
pnx = tube_nx;
|
|
181
|
+
pny = tube_ny;
|
|
182
|
+
pnz = tube_nz;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
const nb = clamp(w * normal_blend, 0.0, 1.0);
|
|
186
|
+
let nx = lerp(tube_nx, pnx, nb);
|
|
187
|
+
let ny = lerp(tube_ny, pny, nb);
|
|
188
|
+
let nz = lerp(tube_nz, pnz, nb);
|
|
189
|
+
const n_len = Math.sqrt(nx * nx + ny * ny + nz * nz);
|
|
190
|
+
if (n_len > 1e-8) {
|
|
191
|
+
nx /= n_len;
|
|
192
|
+
ny /= n_len;
|
|
193
|
+
nz /= n_len;
|
|
194
|
+
} else {
|
|
195
|
+
nx = tube_nx;
|
|
196
|
+
ny = tube_ny;
|
|
197
|
+
nz = tube_nz;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
out_norm[out_norm_offset] = nx;
|
|
201
|
+
out_norm[out_norm_offset + 1] = ny;
|
|
202
|
+
out_norm[out_norm_offset + 2] = nz;
|
|
203
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Triangulates the tubular strip between two UV-seam-duplicated cross-sectional rings
|
|
3
|
+
* (`ring0` with `m0 + 1` vertices and `ring1` with `m1 + 1` vertices, where `m0 >= 3` and `m1 >= 3`)
|
|
4
|
+
* using an exact integer cross-multiplied zipper (`(j0 + 1) * m1 <= (j1 + 1) * m0`).
|
|
5
|
+
*
|
|
6
|
+
* Guarantees:
|
|
7
|
+
* - Strictly `m0 + m1` triangles emitted.
|
|
8
|
+
* - Zero index-degenerate triangles (`i0 !== i1 && i1 !== i2 && i2 !== i0`), preventing
|
|
9
|
+
* `MeshoptClusterizer` / `meshlet_batch_to_bvh` from stripping triangles.
|
|
10
|
+
* - Consistent outward CCW winding for right-handed `(T, R, S = T x R)` rings where `theta`
|
|
11
|
+
* increases from `0` to `2*PI`.
|
|
12
|
+
*
|
|
13
|
+
* @param {Uint32Array|number[]} indices destination index buffer
|
|
14
|
+
* @param {number} index_cursor starting offset in `indices`
|
|
15
|
+
* @param {number} ring0_start starting vertex index of ring 0 (size `m0 + 1`)
|
|
16
|
+
* @param {number} m0 radial segment count of ring 0 (`>= 3`)
|
|
17
|
+
* @param {number} ring1_start starting vertex index of ring 1 (size `m1 + 1`)
|
|
18
|
+
* @param {number} m1 radial segment count of ring 1 (`>= 3`)
|
|
19
|
+
* @returns {number} updated `index_cursor` (`index_cursor + 3 * (m0 + m1)`)
|
|
20
|
+
*/
|
|
21
|
+
export function branch_ring_triangulate(indices: Uint32Array | number[], index_cursor: number, ring0_start: number, m0: number, ring1_start: number, m1: number): number;
|
|
22
|
+
/**
|
|
23
|
+
* Triangulates a terminal conical apex fan connecting a ring of `m + 1` vertices (`m >= 3`)
|
|
24
|
+
* to `m` distinct apex vertices (`apex_start .. apex_start + m - 1`), emitting `m` outward-facing
|
|
25
|
+
* triangles with zero repeated indices.
|
|
26
|
+
*
|
|
27
|
+
* @param {Uint32Array|number[]} indices destination index buffer
|
|
28
|
+
* @param {number} index_cursor starting offset in `indices`
|
|
29
|
+
* @param {number} ring_start starting vertex index of the last non-zero ring (size `m + 1`)
|
|
30
|
+
* @param {number} m radial segment count of the ring (`>= 3`)
|
|
31
|
+
* @param {number} apex_start starting vertex index of the `m` apex vertices
|
|
32
|
+
* @returns {number} updated `index_cursor` (`index_cursor + 3 * m`)
|
|
33
|
+
*/
|
|
34
|
+
export function branch_apex_triangulate(indices: Uint32Array | number[], index_cursor: number, ring_start: number, m: number, apex_start: number): number;
|
|
35
|
+
//# sourceMappingURL=branch_ring_triangulate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"branch_ring_triangulate.d.ts","sourceRoot":"","sources":["../../../../../src/generation/foliage/mesh/branch_ring_triangulate.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,iDARW,WAAW,GAAC,MAAM,EAAE,gBACpB,MAAM,eACN,MAAM,MACN,MAAM,eACN,MAAM,MACN,MAAM,GACJ,MAAM,CA2BlB;AAED;;;;;;;;;;;GAWG;AACH,iDAPW,WAAW,GAAC,MAAM,EAAE,gBACpB,MAAM,cACN,MAAM,KACN,MAAM,cACN,MAAM,GACJ,MAAM,CAYlB"}
|