@zephyr3d/scene 0.9.26 → 0.10.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/README.md +60 -27
- package/dist/animation/animation_bank.js +634 -0
- package/dist/animation/animation_bank.js.map +1 -0
- package/dist/animation/animation_bank_gpu.js +256 -0
- package/dist/animation/animation_bank_gpu.js.map +1 -0
- package/dist/animation/animationset.js +146 -30
- package/dist/animation/animationset.js.map +1 -1
- package/dist/animation/cloth/gpu_cloth_component.js +406 -0
- package/dist/animation/cloth/gpu_cloth_component.js.map +1 -0
- package/dist/animation/cloth/gpu_cloth_system.js +332 -202
- package/dist/animation/cloth/gpu_cloth_system.js.map +1 -1
- package/dist/animation/gpu_animation_driver.js +289 -0
- package/dist/animation/gpu_animation_driver.js.map +1 -0
- package/dist/animation/joint_dynamics/collision.js +112 -1
- package/dist/animation/joint_dynamics/collision.js.map +1 -1
- package/dist/animation/joint_dynamics/controller.js +6 -0
- package/dist/animation/joint_dynamics/controller.js.map +1 -1
- package/dist/animation/joint_dynamics/joint_dynamics_system.js +11 -0
- package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -1
- package/dist/animation/joint_dynamics/solver.js +50 -12
- package/dist/animation/joint_dynamics/solver.js.map +1 -1
- package/dist/animation/joint_dynamics/types.js.map +1 -1
- package/dist/animation/skeleton.js +300 -56
- package/dist/animation/skeleton.js.map +1 -1
- package/dist/animation/skin_palette_atlas.js +252 -0
- package/dist/animation/skin_palette_atlas.js.map +1 -0
- package/dist/animation/spring/multi_chain_spring_system.js +298 -38
- package/dist/animation/spring/multi_chain_spring_system.js.map +1 -1
- package/dist/animation/spring/spring_chain.js +2 -0
- package/dist/animation/spring/spring_chain.js.map +1 -1
- package/dist/animation/spring/spring_collider.js +159 -21
- package/dist/animation/spring/spring_collider.js.map +1 -1
- package/dist/animation/spring/spring_particle.js +1 -0
- package/dist/animation/spring/spring_particle.js.map +1 -1
- package/dist/animation/spring/spring_solver.js +173 -0
- package/dist/animation/spring/spring_solver.js.map +1 -0
- package/dist/animation/spring/spring_system.js +249 -24
- package/dist/animation/spring/spring_system.js.map +1 -1
- package/dist/animation/spring_modifier.js +32 -1
- package/dist/animation/spring_modifier.js.map +1 -1
- package/dist/app/app.js +26 -0
- package/dist/app/app.js.map +1 -1
- package/dist/app/engine.js +86 -15
- package/dist/app/engine.js.map +1 -1
- package/dist/app/gamepad.js +191 -0
- package/dist/app/gamepad.js.map +1 -0
- package/dist/app/inputactions.js +271 -0
- package/dist/app/inputactions.js.map +1 -0
- package/dist/app/inputmgr.js +331 -22
- package/dist/app/inputmgr.js.map +1 -1
- package/dist/app/loading.js +138 -0
- package/dist/app/loading.js.map +1 -0
- package/dist/app/pipelinecache.js +209 -0
- package/dist/app/pipelinecache.js.map +1 -0
- package/dist/app/runtimescript.js +25 -0
- package/dist/app/runtimescript.js.map +1 -1
- package/dist/app/scriptingsystem.js +54 -0
- package/dist/app/scriptingsystem.js.map +1 -1
- package/dist/app/scriptregistry.js +7 -2
- package/dist/app/scriptregistry.js.map +1 -1
- package/dist/asset/asset_manifest.js +59 -0
- package/dist/asset/asset_manifest.js.map +1 -0
- package/dist/asset/asset_preload.js +258 -0
- package/dist/asset/asset_preload.js.map +1 -0
- package/dist/asset/assetmanager.js +117 -65
- package/dist/asset/assetmanager.js.map +1 -1
- package/dist/asset/loaders/ktx2/basis/LICENSE +201 -0
- package/dist/asset/loaders/ktx2/basis/basis_transcoder.js +2 -0
- package/dist/asset/loaders/ktx2/basis/basis_transcoder.wasm +0 -0
- package/dist/asset/loaders/ktx2/basis_location.js +17 -0
- package/dist/asset/loaders/ktx2/basis_location.js.map +1 -0
- package/dist/asset/loaders/ktx2/ktx2_loader.js +88 -0
- package/dist/asset/loaders/ktx2/ktx2_loader.js.map +1 -0
- package/dist/asset/loaders/ktx2/ktx2_targets.js +118 -0
- package/dist/asset/loaders/ktx2/ktx2_targets.js.map +1 -0
- package/dist/asset/loaders/ktx2/transcoder_pool.js +259 -0
- package/dist/asset/loaders/ktx2/transcoder_pool.js.map +1 -0
- package/dist/asset/mesh_lod_builder.js +104 -0
- package/dist/asset/mesh_lod_builder.js.map +1 -0
- package/dist/asset/mesh_settings.js +111 -0
- package/dist/asset/mesh_settings.js.map +1 -0
- package/dist/asset/meshopt_decoder.js +18 -0
- package/dist/asset/meshopt_decoder.js.map +1 -0
- package/dist/asset/meshopt_simplifier.js +26 -0
- package/dist/asset/meshopt_simplifier.js.map +1 -0
- package/dist/asset/model.js +177 -3
- package/dist/asset/model.js.map +1 -1
- package/dist/asset/texture_settings.js +231 -0
- package/dist/asset/texture_settings.js.map +1 -0
- package/dist/asset/zmsh_binary.js +131 -0
- package/dist/asset/zmsh_binary.js.map +1 -0
- package/dist/asset/zsdf_binary.js +111 -0
- package/dist/asset/zsdf_binary.js.map +1 -0
- package/dist/blitter/bilateralblur.js +1 -2
- package/dist/blitter/bilateralblur.js.map +1 -1
- package/dist/blitter/gaussianblur.js +1 -6
- package/dist/blitter/gaussianblur.js.map +1 -1
- package/dist/camera/base.js +31 -10
- package/dist/camera/base.js.map +1 -1
- package/dist/camera/camera.js +178 -200
- package/dist/camera/camera.js.map +1 -1
- package/dist/camera/follow.js +342 -0
- package/dist/camera/follow.js.map +1 -0
- package/dist/camera/fps.js +9 -7
- package/dist/camera/fps.js.map +1 -1
- package/dist/camera/orbit.js +46 -19
- package/dist/camera/orbit.js.map +1 -1
- package/dist/index.d.ts +30475 -19865
- package/dist/index.js +67 -12
- package/dist/index.js.map +1 -1
- package/dist/material/blinn.js +3 -0
- package/dist/material/blinn.js.map +1 -1
- package/dist/material/eye.js +1 -1
- package/dist/material/eye.js.map +1 -1
- package/dist/material/hair.js +2 -3
- package/dist/material/hair.js.map +1 -1
- package/dist/material/hairstrand.js +235 -235
- package/dist/material/hairstrand.js.map +1 -1
- package/dist/material/lambert.js +4 -1
- package/dist/material/lambert.js.map +1 -1
- package/dist/material/material.js +362 -300
- package/dist/material/material.js.map +1 -1
- package/dist/material/meshmaterial.js +118 -45
- package/dist/material/meshmaterial.js.map +1 -1
- package/dist/material/mixins/lightmodel/blinnphong.js +1 -1
- package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
- package/dist/material/mixins/lightmodel/lambert.js +1 -1
- package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +34 -61
- package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +16 -2
- package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrspecularglossness.js +2 -1
- package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
- package/dist/material/mixins/lit.js +223 -83
- package/dist/material/mixins/lit.js.map +1 -1
- package/dist/material/mixins/pbr/common.js +31 -206
- package/dist/material/mixins/pbr/common.js.map +1 -1
- package/dist/material/mtoon.js +1 -1
- package/dist/material/mtoon.js.map +1 -1
- package/dist/material/pbrmr.js +3 -0
- package/dist/material/pbrmr.js.map +1 -1
- package/dist/material/pbrsg.js +3 -0
- package/dist/material/pbrsg.js.map +1 -1
- package/dist/material/sdf_debug.js +78 -0
- package/dist/material/sdf_debug.js.map +1 -0
- package/dist/material/shader/helper.js +733 -190
- package/dist/material/shader/helper.js.map +1 -1
- package/dist/material/shader/terrain_blend.js +204 -43
- package/dist/material/shader/terrain_blend.js.map +1 -1
- package/dist/material/skin.js +331 -297
- package/dist/material/skin.js.map +1 -1
- package/dist/material/skinprofile.js +1058 -0
- package/dist/material/skinprofile.js.map +1 -0
- package/dist/material/sss.js +353 -0
- package/dist/material/sss.js.map +1 -0
- package/dist/material/sss_kernel.js +265 -0
- package/dist/material/sss_kernel.js.map +1 -0
- package/dist/material/sssprofile.js +879 -0
- package/dist/material/sssprofile.js.map +1 -0
- package/dist/material/subsurfaceprofile.js +4 -8
- package/dist/material/subsurfaceprofile.js.map +1 -1
- package/dist/material/terrain-cm.js +464 -188
- package/dist/material/terrain-cm.js.map +1 -1
- package/dist/material/unlit.js +3 -0
- package/dist/material/unlit.js.map +1 -1
- package/dist/material/water.js +2009 -201
- package/dist/material/water.js.map +1 -1
- package/dist/node_modules/meshoptimizer/LICENSE +21 -0
- package/dist/node_modules/meshoptimizer/meshopt_decoder.js +197 -0
- package/dist/node_modules/meshoptimizer/meshopt_decoder.js.map +1 -0
- package/dist/node_modules/meshoptimizer/meshopt_simplifier.js +677 -0
- package/dist/node_modules/meshoptimizer/meshopt_simplifier.js.map +1 -0
- package/dist/physics/character.js +226 -0
- package/dist/physics/character.js.map +1 -0
- package/dist/physics/collider.js +209 -0
- package/dist/physics/collider.js.map +1 -0
- package/dist/physics/events.js +79 -0
- package/dist/physics/events.js.map +1 -0
- package/dist/physics/joint.js +272 -0
- package/dist/physics/joint.js.map +1 -0
- package/dist/physics/node_physics.js +234 -0
- package/dist/physics/node_physics.js.map +1 -0
- package/dist/physics/part.js +91 -0
- package/dist/physics/part.js.map +1 -0
- package/dist/physics/rigid_body.js +379 -0
- package/dist/physics/rigid_body.js.map +1 -0
- package/dist/physics/vehicle.js +335 -0
- package/dist/physics/vehicle.js.map +1 -0
- package/dist/physics/world.js +25 -0
- package/dist/physics/world.js.map +1 -0
- package/dist/posteffect/bloom.js +49 -14
- package/dist/posteffect/bloom.js.map +1 -1
- package/dist/posteffect/motionblur.js +668 -63
- package/dist/posteffect/motionblur.js.map +1 -1
- package/dist/posteffect/posteffect.js +12 -1
- package/dist/posteffect/posteffect.js.map +1 -1
- package/dist/posteffect/postsss.js +572 -0
- package/dist/posteffect/postsss.js.map +1 -0
- package/dist/posteffect/sao.js +48 -50
- package/dist/posteffect/sao.js.map +1 -1
- package/dist/posteffect/skinsss.js +605 -355
- package/dist/posteffect/skinsss.js.map +1 -1
- package/dist/posteffect/ssgi.js +91 -162
- package/dist/posteffect/ssgi.js.map +1 -1
- package/dist/posteffect/ssr.js +3 -11
- package/dist/posteffect/ssr.js.map +1 -1
- package/dist/posteffect/sss.js +34 -15
- package/dist/posteffect/sss.js.map +1 -1
- package/dist/posteffect/taa.js +1 -0
- package/dist/posteffect/taa.js.map +1 -1
- package/dist/render/abuffer_oit.js +40 -39
- package/dist/render/abuffer_oit.js.map +1 -1
- package/dist/render/clipmap.js +328 -62
- package/dist/render/clipmap.js.map +1 -1
- package/dist/render/cluster_light.js +958 -224
- package/dist/render/cluster_light.js.map +1 -1
- package/dist/render/cull_visitor.js +26 -5
- package/dist/render/cull_visitor.js.map +1 -1
- package/dist/render/debug_views.js +37 -0
- package/dist/render/debug_views.js.map +1 -0
- package/dist/render/depthpass.js +5 -1
- package/dist/render/depthpass.js.map +1 -1
- package/dist/render/drawable_mixin.js +53 -6
- package/dist/render/drawable_mixin.js.map +1 -1
- package/dist/render/dualdepthpeeling_oit.js +53 -53
- package/dist/render/dualdepthpeeling_oit.js.map +1 -1
- package/dist/render/envlight.js +196 -113
- package/dist/render/envlight.js.map +1 -1
- package/dist/render/fbm_wavegenerator.js +8 -13
- package/dist/render/fbm_wavegenerator.js.map +1 -1
- package/dist/render/fft_wavegenerator.js +268 -136
- package/dist/render/fft_wavegenerator.js.map +1 -1
- package/dist/render/gerstner_wavegenerator.js +113 -28
- package/dist/render/gerstner_wavegenerator.js.map +1 -1
- package/dist/render/gi/probe_volume.js +1334 -0
- package/dist/render/gi/probe_volume.js.map +1 -0
- package/dist/render/gi/scene_gi.js +282 -0
- package/dist/render/gi/scene_gi.js.map +1 -0
- package/dist/render/gi/voxel_atlas.js +198 -0
- package/dist/render/gi/voxel_atlas.js.map +1 -0
- package/dist/render/gi/voxel_lighting.js +652 -0
- package/dist/render/gi/voxel_lighting.js.map +1 -0
- package/dist/render/gi/voxel_scene.js +642 -0
- package/dist/render/gi/voxel_scene.js.map +1 -0
- package/dist/render/gi/voxelize_pass.js +223 -0
- package/dist/render/gi/voxelize_pass.js.map +1 -0
- package/dist/render/globalbindgroup_allocator.js +3 -2
- package/dist/render/globalbindgroup_allocator.js.map +1 -1
- package/dist/render/gpu_picking.js +9 -36
- package/dist/render/gpu_picking.js.map +1 -1
- package/dist/render/hzb.js +80 -22
- package/dist/render/hzb.js.map +1 -1
- package/dist/render/instance_culling.js +499 -0
- package/dist/render/instance_culling.js.map +1 -0
- package/dist/render/lightpass.js +23 -9
- package/dist/render/lightpass.js.map +1 -1
- package/dist/render/lod.js +46 -0
- package/dist/render/lod.js.map +1 -0
- package/dist/render/oit.js +11 -11
- package/dist/render/oit.js.map +1 -1
- package/dist/render/primitive.js +301 -9
- package/dist/render/primitive.js.map +1 -1
- package/dist/render/primitive_readback.js +209 -0
- package/dist/render/primitive_readback.js.map +1 -0
- package/dist/render/render_queue.js +198 -11
- package/dist/render/render_queue.js.map +1 -1
- package/dist/render/renderer.js +14 -7
- package/dist/render/renderer.js.map +1 -1
- package/dist/render/rendergraph/blackboard.js +15 -1
- package/dist/render/rendergraph/blackboard.js.map +1 -1
- package/dist/render/rendergraph/executor.js +136 -0
- package/dist/render/rendergraph/executor.js.map +1 -1
- package/dist/render/rendergraph/forward_plus_builder.js +585 -59
- package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
- package/dist/render/rendergraph/frame_resource_requirements.js +1 -0
- package/dist/render/rendergraph/frame_resource_requirements.js.map +1 -1
- package/dist/render/rendergraph/history_resources.js +8 -1
- package/dist/render/rendergraph/history_resources.js.map +1 -1
- package/dist/render/rendergraph/scene_render_context.js +31 -2
- package/dist/render/rendergraph/scene_render_context.js.map +1 -1
- package/dist/render/rendergraph/types.js.map +1 -1
- package/dist/render/renderpass.js +28 -5
- package/dist/render/renderpass.js.map +1 -1
- package/dist/render/sdf/box_allocator.js +98 -0
- package/dist/render/sdf/box_allocator.js.map +1 -0
- package/dist/render/sdf/global_sdf.js +865 -0
- package/dist/render/sdf/global_sdf.js.map +1 -0
- package/dist/render/sdf/scene_sdf.js +562 -0
- package/dist/render/sdf/scene_sdf.js.map +1 -0
- package/dist/render/sdf/sdf_atlas.js +227 -0
- package/dist/render/sdf/sdf_atlas.js.map +1 -0
- package/dist/render/sdf/sdf_programs.js +42 -0
- package/dist/render/sdf/sdf_programs.js.map +1 -0
- package/dist/render/sdf/sdf_view.js +199 -0
- package/dist/render/sdf/sdf_view.js.map +1 -0
- package/dist/render/sdf/waterline.js +610 -0
- package/dist/render/sdf/waterline.js.map +1 -0
- package/dist/render/shadow_mask_pass.js +142 -25
- package/dist/render/shadow_mask_pass.js.map +1 -1
- package/dist/render/shore_wave_generator.js +1193 -0
- package/dist/render/shore_wave_generator.js.map +1 -0
- package/dist/render/sky.js +516 -86
- package/dist/render/sky.js.map +1 -1
- package/dist/render/transmission_thickness_pass.js +477 -0
- package/dist/render/transmission_thickness_pass.js.map +1 -0
- package/dist/render/underwater.js +524 -0
- package/dist/render/underwater.js.map +1 -0
- package/dist/render/virtualtexture/virtual_texture.js +1214 -0
- package/dist/render/virtualtexture/virtual_texture.js.map +1 -0
- package/dist/render/volumetric_cloud/cloud_common.js +472 -0
- package/dist/render/volumetric_cloud/cloud_common.js.map +1 -0
- package/dist/render/volumetric_cloud/cloud_noise.js +189 -0
- package/dist/render/volumetric_cloud/cloud_noise.js.map +1 -0
- package/dist/render/volumetric_cloud/debug_view.js +131 -0
- package/dist/render/volumetric_cloud/debug_view.js.map +1 -0
- package/dist/render/volumetric_cloud/resources.js +380 -0
- package/dist/render/volumetric_cloud/resources.js.map +1 -0
- package/dist/render/volumetric_cloud/sky_cache.js +380 -0
- package/dist/render/volumetric_cloud/sky_cache.js.map +1 -0
- package/dist/render/volumetric_cloud/volumetric_cloud.js +318 -0
- package/dist/render/volumetric_cloud/volumetric_cloud.js.map +1 -0
- package/dist/render/water_caustics.js +1195 -0
- package/dist/render/water_caustics.js.map +1 -0
- package/dist/render/water_foam.js +627 -0
- package/dist/render/water_foam.js.map +1 -0
- package/dist/render/water_interaction.js +1795 -0
- package/dist/render/water_interaction.js.map +1 -0
- package/dist/render/weightedblended_oit.js +36 -36
- package/dist/render/weightedblended_oit.js.map +1 -1
- package/dist/scene/basesprite.js +9 -4
- package/dist/scene/basesprite.js.map +1 -1
- package/dist/scene/batchgroup.js +108 -12
- package/dist/scene/batchgroup.js.map +1 -1
- package/dist/scene/environment.js +28 -7
- package/dist/scene/environment.js.map +1 -1
- package/dist/scene/foliage.js +1020 -0
- package/dist/scene/foliage.js.map +1 -0
- package/dist/scene/foliage_buckets.js +147 -0
- package/dist/scene/foliage_buckets.js.map +1 -0
- package/dist/scene/foliage_mask.js +358 -0
- package/dist/scene/foliage_mask.js.map +1 -0
- package/dist/scene/hair.js +15 -4
- package/dist/scene/hair.js.map +1 -1
- package/dist/scene/light.js +179 -13
- package/dist/scene/light.js.map +1 -1
- package/dist/scene/mesh.js +327 -45
- package/dist/scene/mesh.js.map +1 -1
- package/dist/scene/meshdrawable.js +6 -0
- package/dist/scene/meshdrawable.js.map +1 -1
- package/dist/scene/msdftext.js +9 -3
- package/dist/scene/msdftext.js.map +1 -1
- package/dist/scene/msdftextsprite.js +9 -3
- package/dist/scene/msdftextsprite.js.map +1 -1
- package/dist/scene/particlesys.js +8 -2
- package/dist/scene/particlesys.js.map +1 -1
- package/dist/scene/physics_settings.js +157 -0
- package/dist/scene/physics_settings.js.map +1 -0
- package/dist/scene/scene.js +190 -44
- package/dist/scene/scene.js.map +1 -1
- package/dist/scene/scene_node.js +147 -6
- package/dist/scene/scene_node.js.map +1 -1
- package/dist/scene/terrain-cm/bladegrassmaterial.js +735 -0
- package/dist/scene/terrain-cm/bladegrassmaterial.js.map +1 -0
- package/dist/scene/terrain-cm/grass.js +881 -42
- package/dist/scene/terrain-cm/grass.js.map +1 -1
- package/dist/scene/terrain-cm/grass_gpu.js +929 -0
- package/dist/scene/terrain-cm/grass_gpu.js.map +1 -0
- package/dist/scene/terrain-cm/grassmaterial.js +180 -9
- package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
- package/dist/scene/terrain-cm/terrain-cm.js +465 -36
- package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
- package/dist/scene/terrain-cm/terrain_gi_albedo.js +257 -0
- package/dist/scene/terrain-cm/terrain_gi_albedo.js.map +1 -0
- package/dist/scene/terrain-cm/terrain_rvt.js +395 -0
- package/dist/scene/terrain-cm/terrain_rvt.js.map +1 -0
- package/dist/scene/update_queue.js +54 -0
- package/dist/scene/update_queue.js.map +1 -0
- package/dist/scene/water.js +997 -96
- package/dist/scene/water.js.map +1 -1
- package/dist/scene/water_surface_sampler.js +324 -0
- package/dist/scene/water_surface_sampler.js.map +1 -0
- package/dist/scene/wind.js +317 -0
- package/dist/scene/wind.js.map +1 -0
- package/dist/shaders/atmosphere.js +388 -166
- package/dist/shaders/atmosphere.js.map +1 -1
- package/dist/shaders/fog.js +100 -32
- package/dist/shaders/fog.js.map +1 -1
- package/dist/shaders/gi.js +365 -0
- package/dist/shaders/gi.js.map +1 -0
- package/dist/shaders/ltc_rect.js +202 -0
- package/dist/shaders/ltc_rect.js.map +1 -0
- package/dist/shaders/misc.js +1 -10
- package/dist/shaders/misc.js.map +1 -1
- package/dist/shaders/noise.js +5 -1
- package/dist/shaders/noise.js.map +1 -1
- package/dist/shaders/probes.js +309 -0
- package/dist/shaders/probes.js.map +1 -0
- package/dist/shaders/sdf.js +537 -0
- package/dist/shaders/sdf.js.map +1 -0
- package/dist/shaders/shadow.js +104 -70
- package/dist/shaders/shadow.js.map +1 -1
- package/dist/shaders/skin_brdf.js +243 -0
- package/dist/shaders/skin_brdf.js.map +1 -0
- package/dist/shaders/ssr.js +6 -159
- package/dist/shaders/ssr.js.map +1 -1
- package/dist/shaders/temporal.js +38 -27
- package/dist/shaders/temporal.js.map +1 -1
- package/dist/shaders/water.js +40 -87
- package/dist/shaders/water.js.map +1 -1
- package/dist/shaders/water_medium.js +42 -0
- package/dist/shaders/water_medium.js.map +1 -0
- package/dist/shadow/dom.js +110 -19
- package/dist/shadow/dom.js.map +1 -1
- package/dist/shadow/esm.js +3 -3
- package/dist/shadow/esm.js.map +1 -1
- package/dist/shadow/pcf_opt.js +15 -48
- package/dist/shadow/pcf_opt.js.map +1 -1
- package/dist/shadow/pcf_pd.js +15 -53
- package/dist/shadow/pcf_pd.js.map +1 -1
- package/dist/shadow/pcss.js +34 -9
- package/dist/shadow/pcss.js.map +1 -1
- package/dist/shadow/shadow_impl.js +3 -8
- package/dist/shadow/shadow_impl.js.map +1 -1
- package/dist/shadow/shadow_region.js +87 -49
- package/dist/shadow/shadow_region.js.map +1 -1
- package/dist/shadow/shadowmapper.js +93 -53
- package/dist/shadow/shadowmapper.js.map +1 -1
- package/dist/shadow/ssm.js +18 -72
- package/dist/shadow/ssm.js.map +1 -1
- package/dist/shadow/vsm.js +3 -3
- package/dist/shadow/vsm.js.map +1 -1
- package/dist/shapes/shape.js +44 -1
- package/dist/shapes/shape.js.map +1 -1
- package/dist/utility/buoyancy.js +287 -0
- package/dist/utility/buoyancy.js.map +1 -0
- package/dist/utility/physical.js +10 -1
- package/dist/utility/physical.js.map +1 -1
- package/dist/utility/pmrem.js +17 -43
- package/dist/utility/pmrem.js.map +1 -1
- package/dist/utility/sdf/bake.js +435 -0
- package/dist/utility/sdf/bake.js.map +1 -0
- package/dist/utility/sdf/bvh.js +576 -0
- package/dist/utility/sdf/bvh.js.map +1 -0
- package/dist/utility/serialization/manager.js +36 -6
- package/dist/utility/serialization/manager.js.map +1 -1
- package/dist/utility/serialization/scene/animation.js +77 -7
- package/dist/utility/serialization/scene/animation.js.map +1 -1
- package/dist/utility/serialization/scene/batch.js +11 -4
- package/dist/utility/serialization/scene/batch.js.map +1 -1
- package/dist/utility/serialization/scene/camera.js +140 -279
- package/dist/utility/serialization/scene/camera.js.map +1 -1
- package/dist/utility/serialization/scene/cloth.js +25 -0
- package/dist/utility/serialization/scene/cloth.js.map +1 -0
- package/dist/utility/serialization/scene/common.js +14 -6
- package/dist/utility/serialization/scene/common.js.map +1 -1
- package/dist/utility/serialization/scene/foliage.js +821 -0
- package/dist/utility/serialization/scene/foliage.js.map +1 -0
- package/dist/utility/serialization/scene/hair.js +11 -4
- package/dist/utility/serialization/scene/hair.js.map +1 -1
- package/dist/utility/serialization/scene/light.js +115 -7
- package/dist/utility/serialization/scene/light.js.map +1 -1
- package/dist/utility/serialization/scene/material.js +388 -220
- package/dist/utility/serialization/scene/material.js.map +1 -1
- package/dist/utility/serialization/scene/mesh.js +69 -4
- package/dist/utility/serialization/scene/mesh.js.map +1 -1
- package/dist/utility/serialization/scene/node.js +140 -5
- package/dist/utility/serialization/scene/node.js.map +1 -1
- package/dist/utility/serialization/scene/node_physics.js +1318 -0
- package/dist/utility/serialization/scene/node_physics.js.map +1 -0
- package/dist/utility/serialization/scene/particle.js +11 -4
- package/dist/utility/serialization/scene/particle.js.map +1 -1
- package/dist/utility/serialization/scene/physics.js +120 -0
- package/dist/utility/serialization/scene/physics.js.map +1 -0
- package/dist/utility/serialization/scene/primitive.js +124 -10
- package/dist/utility/serialization/scene/primitive.js.map +1 -1
- package/dist/utility/serialization/scene/scene.js +1687 -51
- package/dist/utility/serialization/scene/scene.js.map +1 -1
- package/dist/utility/serialization/scene/sprite.js +11 -4
- package/dist/utility/serialization/scene/sprite.js.map +1 -1
- package/dist/utility/serialization/scene/terrain.js +163 -33
- package/dist/utility/serialization/scene/terrain.js.map +1 -1
- package/dist/utility/serialization/scene/text.js +11 -4
- package/dist/utility/serialization/scene/text.js.map +1 -1
- package/dist/utility/serialization/scene/water.js +2473 -114
- package/dist/utility/serialization/scene/water.js.map +1 -1
- package/dist/utility/serialization/types.js.map +1 -1
- package/dist/utility/shprojector.js +97 -109
- package/dist/utility/shprojector.js.map +1 -1
- package/dist/utility/textures/foam.js +170 -0
- package/dist/utility/textures/foam.js.map +1 -0
- package/dist/utility/textures/ggxlut.js +17 -43
- package/dist/utility/textures/ggxlut.js.map +1 -1
- package/dist/utility/textures/ltcdata.js +4 -4
- package/dist/utility/textures/ltcdata.js.map +1 -1
- package/dist/utility/textures/ltclut.js +16 -6
- package/dist/utility/textures/ltclut.js.map +1 -1
- package/dist/utility/unsupported.js +24 -0
- package/dist/utility/unsupported.js.map +1 -0
- package/dist/values.js +13 -1
- package/dist/values.js.map +1 -1
- package/package.json +25 -12
- package/src/asset/loaders/ktx2/basis/LICENSE +201 -0
- package/src/asset/loaders/ktx2/basis/basis_transcoder.js +2 -0
- package/src/asset/loaders/ktx2/basis/basis_transcoder.wasm +0 -0
- package/src/asset/meshoptimizer/LICENSE +21 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"foliage.js","sources":["../../src/scene/foliage.ts"],"sourcesContent":["import type { Nullable } from '@zephyr3d/base';\r\nimport { AABB, DRef, Matrix4x4, Quaternion, Vector3 } from '@zephyr3d/base';\r\nimport type { Scene } from './scene';\r\nimport { SceneNode } from './scene_node';\r\nimport { GraphNode } from './graph_node';\r\nimport { BatchGroup } from './batchgroup';\r\nimport { Mesh } from './mesh';\r\nimport type { ClipmapTerrain } from './terrain-cm';\r\nimport type { Primitive } from '../render';\r\nimport type { MeshMaterial } from '../material';\r\nimport type { Camera } from '../camera';\r\nimport { getEngine } from '../app/api';\r\nimport { Collider, NodePhysics, RigidBody } from '../physics';\r\nimport type { ColliderShape } from '../physics';\r\nimport { FOLIAGE_INSTANCE_STRIDE, FoliageInstanceBuckets } from './foliage_buckets';\r\nimport { FoliageDensityMask } from './foliage_mask';\r\n\r\nexport { FOLIAGE_INSTANCE_STRIDE } from './foliage_buckets';\r\nexport { FoliageDensityMask, FOLIAGE_MASK_TILE_SIZE, foliageBrushWeight } from './foliage_mask';\r\n\r\n/**\r\n * Settings of a {@link FoliageLayer}\r\n * @public\r\n */\r\nexport interface FoliageLayerSettings {\r\n /** Whether the instances cast shadows. Default true. */\r\n castShadow?: boolean;\r\n /** Distance from the camera beyond which the instances are not drawn. Default 300. */\r\n cullDistance?: number;\r\n /** How much the instances lean with the ground: 0 stays upright, 1 follows the normal. Default 0. */\r\n alignToNormal?: number;\r\n /** What the instances collide with in the physics simulation; null for nothing. Default null. */\r\n collision?: Nullable<FoliageCollision>;\r\n /** How painted instances are generated; omitted fields keep their defaults */\r\n generation?: Partial<FoliageGeneration>;\r\n}\r\n\r\n/**\r\n * Shape of the colliders of a {@link FoliageLayer}: a basic shape, or `'asset'` for the\r\n * colliders on the nodes of the scattered asset itself.\r\n * @public\r\n */\r\nexport type FoliageCollisionShape = 'box' | 'sphere' | 'capsule' | 'cylinder' | 'asset';\r\n\r\n/**\r\n * Colliders of the instances of a {@link FoliageLayer}, which make them static obstacles.\r\n *\r\n * @remarks\r\n * Sizes and the offset are in the asset's own units and scale with each instance. Sizes left\r\n * out are fitted to the bounds of the asset's meshes: give a trunk radius for a tree, whose\r\n * bounds are its canopy. A capsule or cylinder stands on the bottom of the bounds, centred on\r\n * the asset's origin; a box or sphere is centred on the bounds.\r\n *\r\n * With `'asset'`, the box, sphere, capsule and cylinder colliders found on the asset's nodes\r\n * are used as they are; mesh and convex colliders are skipped.\r\n * @public\r\n */\r\nexport interface FoliageCollision {\r\n shape: FoliageCollisionShape;\r\n /** Radius of a sphere, capsule or cylinder */\r\n radius?: number;\r\n /** Total height of a capsule or cylinder */\r\n height?: number;\r\n /** Full size of a box */\r\n size?: [number, number, number];\r\n /** Centre of the shape */\r\n offset?: [number, number, number];\r\n /** Default 0.5 */\r\n friction?: number;\r\n /** Default 0 */\r\n restitution?: number;\r\n /** Collision layer, 0 to 15. Default 0. */\r\n layer?: number;\r\n}\r\n\r\n/**\r\n * What painted instances of a {@link FoliageLayer} stand on: the terrain the foliage system is\r\n * a descendant of, following it when it changes, or whatever surface with a collider lies below,\r\n * at the height found when they were generated.\r\n * @public\r\n */\r\nexport type FoliageSurface = 'terrain' | 'any';\r\n\r\n/**\r\n * How the painted instances of a {@link FoliageLayer} are generated from its density mask.\r\n *\r\n * @remarks\r\n * Candidates lie on a grid of `spacing` aligned with the origin of the foliage system, one per\r\n * cell, jittered within it. Each cell draws its position, a threshold, a rotation and a scale\r\n * from a random sequence seeded only by its coordinates and `seed`, so a candidate is the same\r\n * whenever and wherever it is evaluated. A candidate becomes an instance where the density\r\n * there, times what the place script returns, is above its threshold and the slope and height\r\n * filters pass; painting denser adds instances without moving the ones already there.\r\n * @public\r\n */\r\nexport interface FoliageGeneration {\r\n /** Distance between candidates, roughly the closest two instances get, in meters. Default 4. */\r\n spacing: number;\r\n /** Range of the uniform scale. Default [0.8, 1.2]. */\r\n scaleRange: [number, number];\r\n /** Range of the slope, in degrees from horizontal, instances grow on. Default [0, 45]. */\r\n slopeRange: [number, number];\r\n /** Range of the world height instances grow at; null for no limit. Default null. */\r\n heightRange: Nullable<[number, number]>;\r\n /** Height above the surface, negative to sink the base into the ground. Default 0. */\r\n yOffset: number;\r\n /** Whether instances turn randomly about the vertical axis. Default true. */\r\n randomYaw: boolean;\r\n /** Seed of the candidate grid. Default random at creation. */\r\n seed: number;\r\n /** What the instances stand on. Default 'terrain'. */\r\n surface: FoliageSurface;\r\n /** Optional `function place(p, api, input)`, as for the scatter tool; empty for none. */\r\n placeScript: string;\r\n}\r\n\r\nfunction defaultGeneration(): FoliageGeneration {\r\n return {\r\n spacing: 4,\r\n scaleRange: [0.8, 1.2],\r\n slopeRange: [0, 45],\r\n heightRange: null,\r\n yOffset: 0,\r\n randomYaw: true,\r\n seed: Math.floor(Math.random() * 0x7fffffff),\r\n surface: 'terrain',\r\n placeScript: ''\r\n };\r\n}\r\n\r\nfunction copyGeneration(g: FoliageGeneration): FoliageGeneration {\r\n return {\r\n ...g,\r\n scaleRange: [g.scaleRange[0], g.scaleRange[1]],\r\n slopeRange: [g.slopeRange[0], g.slopeRange[1]],\r\n heightRange: g.heightRange ? [g.heightRange[0], g.heightRange[1]] : null\r\n };\r\n}\r\n\r\n/** A generation setting with the omitted and invalid fields of `g` taken from `base` */\r\nfunction mergeGeneration(base: FoliageGeneration, g: Partial<FoliageGeneration>): FoliageGeneration {\r\n const num = (v: unknown, d: number) => (typeof v === 'number' && Number.isFinite(v) ? v : d);\r\n const pair = (v: unknown, d: [number, number]): [number, number] =>\r\n Array.isArray(v) && v.length === 2 ? [num(v[0], d[0]), num(v[1], d[1])] : [d[0], d[1]];\r\n return {\r\n spacing: Math.max(0.05, num(g.spacing, base.spacing)),\r\n scaleRange: pair(g.scaleRange, base.scaleRange),\r\n slopeRange: pair(g.slopeRange, base.slopeRange),\r\n heightRange:\r\n g.heightRange === undefined\r\n ? base.heightRange\r\n ? [base.heightRange[0], base.heightRange[1]]\r\n : null\r\n : g.heightRange\r\n ? pair(g.heightRange, [-Infinity, Infinity])\r\n : null,\r\n yOffset: num(g.yOffset, base.yOffset),\r\n randomYaw: typeof g.randomYaw === 'boolean' ? g.randomYaw : base.randomYaw,\r\n seed: Math.floor(num(g.seed, base.seed)) | 0,\r\n surface: g.surface === 'terrain' || g.surface === 'any' ? g.surface : base.surface,\r\n placeScript: typeof g.placeScript === 'string' ? g.placeScript : base.placeScript\r\n };\r\n}\r\n\r\n/** A collider of every instance: its shape, and its transform relative to the instance */\r\ntype FoliageColliderTemplate = {\r\n matrix: Matrix4x4;\r\n shape: ColliderShape;\r\n size: Vector3;\r\n radius: number;\r\n height: number;\r\n offset: Vector3;\r\n friction: number;\r\n restitution: number;\r\n layer: number;\r\n};\r\n\r\nconst PRIMITIVE_COLLIDER_SHAPES: readonly ColliderShape[] = ['box', 'sphere', 'capsule', 'cylinder'];\r\n\r\n/** A mesh of the layer asset, with its transform relative to the asset root */\r\ntype FoliagePart = {\r\n primitive: DRef<Primitive>;\r\n material: DRef<MeshMaterial>;\r\n matrix: Matrix4x4;\r\n};\r\n\r\n/**\r\n * Which instances of a {@link FoliageLayer}: the ones generated from its density mask, the ones\r\n * placed directly (by the scatter tool or {@link FoliageSystem.setInstances}), or both.\r\n * @public\r\n */\r\nexport type FoliageInstanceGroup = 'generated' | 'manual' | 'all';\r\n\r\n/**\r\n * One kind of object scattered by a {@link FoliageSystem}: an asset and where its copies stand.\r\n *\r\n * @remarks\r\n * A layer holds two groups of instances. The generated ones follow from its\r\n * {@link FoliageLayer.mask | density mask} and {@link FoliageLayer.generation | generation\r\n * settings}, and only painting and regenerating change them. The manual ones are placed\r\n * directly and are left alone by generation; only erasing and the instance methods remove them.\r\n * Both are drawn and collide alike.\r\n * @public\r\n */\r\nexport class FoliageLayer {\r\n /** The foliage system the layer belongs to @internal */\r\n _owner: Nullable<FoliageSystem>;\r\n /** @internal */\r\n _asset: string;\r\n /** @internal */\r\n _generated: FoliageInstanceBuckets;\r\n /** @internal */\r\n _manual: FoliageInstanceBuckets;\r\n /** @internal */\r\n _mask: FoliageDensityMask;\r\n /** @internal */\r\n _generation: FoliageGeneration;\r\n /** @internal */\r\n _castShadow: boolean;\r\n /** @internal */\r\n _cullDistance: number;\r\n /** @internal */\r\n _alignToNormal: number;\r\n /** @internal */\r\n _collision: Nullable<FoliageCollision>;\r\n /** @internal */\r\n _parts: Nullable<FoliagePart[]>;\r\n /** Bounds of the asset's meshes, relative to its root @internal */\r\n _bounds: Nullable<AABB>;\r\n /** Colliders found on the asset's nodes @internal */\r\n _assetColliders: FoliageColliderTemplate[];\r\n /** @internal */\r\n _loading: Nullable<Promise<void>>;\r\n /**\r\n * Creates a layer; add it to a foliage system with {@link FoliageSystem.insertLayer}\r\n * @param asset - Path of the prefab or model asset the layer scatters\r\n * @param settings - Layer settings\r\n */\r\n constructor(asset = '', settings?: FoliageLayerSettings) {\r\n this._owner = null;\r\n this._asset = asset;\r\n this._generated = new FoliageInstanceBuckets(64);\r\n this._manual = new FoliageInstanceBuckets(64);\r\n this._mask = new FoliageDensityMask(1);\r\n this._generation = mergeGeneration(defaultGeneration(), settings?.generation ?? {});\r\n this._castShadow = settings?.castShadow ?? true;\r\n this._cullDistance = settings?.cullDistance ?? 300;\r\n this._alignToNormal = settings?.alignToNormal ?? 0;\r\n this._collision = copyCollision(settings?.collision);\r\n this._parts = null;\r\n this._bounds = null;\r\n this._assetColliders = [];\r\n this._loading = null;\r\n }\r\n /** The foliage system the layer belongs to */\r\n get owner() {\r\n return this._owner;\r\n }\r\n /** Path of the prefab or model asset the layer scatters; changing it keeps the instances */\r\n get asset() {\r\n return this._asset;\r\n }\r\n set asset(val: string) {\r\n if (val !== this._asset) {\r\n this._dispose();\r\n this._asset = val;\r\n this._owner?.invalidate();\r\n }\r\n }\r\n /** Number of instances of both groups */\r\n get count() {\r\n return this._generated.count + this._manual.count;\r\n }\r\n /** Number of instances generated from the density mask */\r\n get generatedCount() {\r\n return this._generated.count;\r\n }\r\n /** Number of instances placed directly */\r\n get manualCount() {\r\n return this._manual.count;\r\n }\r\n /**\r\n * Where the layer grows when painted. Change it through the foliage brush or\r\n * {@link FoliageSystem.paintMask}, which keep the generated instances in step.\r\n */\r\n get mask(): FoliageDensityMask {\r\n return this._mask;\r\n }\r\n /**\r\n * How painted instances are generated. Reading gives a copy; assigning one changes the\r\n * settings but not the instances, until the layer is regenerated.\r\n */\r\n get generation(): FoliageGeneration {\r\n return copyGeneration(this._generation);\r\n }\r\n set generation(val: Partial<FoliageGeneration>) {\r\n this._generation = mergeGeneration(this._generation, val);\r\n }\r\n /** Whether the instances cast shadows */\r\n get castShadow() {\r\n return this._castShadow;\r\n }\r\n set castShadow(val: boolean) {\r\n if (val !== this._castShadow) {\r\n this._castShadow = val;\r\n this._owner?.invalidate();\r\n }\r\n }\r\n /** Distance from the camera beyond which the instances are not drawn */\r\n get cullDistance() {\r\n return this._cullDistance;\r\n }\r\n set cullDistance(val: number) {\r\n // Only decides which chunks are shown each frame, nothing to rebuild\r\n this._cullDistance = val;\r\n }\r\n /** How much the instances lean with the ground: 0 stays upright, 1 follows the normal */\r\n get alignToNormal() {\r\n return this._alignToNormal;\r\n }\r\n set alignToNormal(val: number) {\r\n if (val !== this._alignToNormal) {\r\n this._alignToNormal = val;\r\n this._owner?.invalidate();\r\n }\r\n }\r\n /** What the instances collide with; null for nothing. Reading gives a copy; assign to change it. */\r\n get collision(): Nullable<FoliageCollision> {\r\n return copyCollision(this._collision);\r\n }\r\n set collision(val: Nullable<FoliageCollision>) {\r\n this._collision = copyCollision(val);\r\n this._owner?.invalidate();\r\n }\r\n /** @internal */\r\n _colliderTemplates(): FoliageColliderTemplate[] {\r\n const c = this._collision;\r\n if (!c) {\r\n return [];\r\n }\r\n if (c.shape === 'asset') {\r\n return this._assetColliders;\r\n }\r\n const b = this._bounds;\r\n const ext = b ? Vector3.sub(b.maxPoint, b.minPoint) : new Vector3(1, 1, 1);\r\n const center = b ? Vector3.scale(Vector3.add(b.minPoint, b.maxPoint), 0.5) : new Vector3(0, 0.5, 0);\r\n const bottom = b ? b.minPoint.y : 0;\r\n const height = c.height ?? ext.y;\r\n const radius =\r\n c.radius ?? (c.shape === 'sphere' ? Math.max(ext.x, ext.y, ext.z) : Math.min(ext.x, ext.z)) / 2;\r\n const offset = c.offset\r\n ? new Vector3(c.offset[0], c.offset[1], c.offset[2])\r\n : c.shape === 'capsule' || c.shape === 'cylinder'\r\n ? new Vector3(0, bottom + height / 2, 0)\r\n : center;\r\n return [\r\n {\r\n matrix: Matrix4x4.identity(),\r\n shape: c.shape,\r\n size: c.size ? new Vector3(c.size[0], c.size[1], c.size[2]) : ext,\r\n radius,\r\n height,\r\n offset,\r\n friction: c.friction ?? 0.5,\r\n restitution: c.restitution ?? 0,\r\n layer: c.layer ?? 0\r\n }\r\n ];\r\n }\r\n /**\r\n * The instances, {@link FOLIAGE_INSTANCE_STRIDE} floats each: x, z (local to the foliage system),\r\n * height offset above the ground, rotation about the vertical axis in radians, uniform scale.\r\n * A copy: change instances with the methods of {@link FoliageSystem}.\r\n * @param group - Which instances; both groups by default, the manual ones first\r\n */\r\n getInstances(group: FoliageInstanceGroup = 'all') {\r\n if (group === 'generated') {\r\n return this._generated.toArray();\r\n }\r\n if (group === 'manual') {\r\n return this._manual.toArray();\r\n }\r\n const manual = this._manual.toArray();\r\n const generated = this._generated.toArray();\r\n const out = new Float32Array(manual.length + generated.length);\r\n out.set(manual);\r\n out.set(generated, manual.length);\r\n return out;\r\n }\r\n /** @internal */\r\n _dispose() {\r\n for (const part of this._parts ?? []) {\r\n part.primitive.dispose();\r\n part.material.dispose();\r\n }\r\n this._parts = null;\r\n this._bounds = null;\r\n this._assetColliders = [];\r\n // A load still running is for the old asset, it discards its result\r\n this._loading = null;\r\n }\r\n}\r\n\r\nconst COLLISION_SHAPES: readonly FoliageCollisionShape[] = ['box', 'sphere', 'capsule', 'cylinder', 'asset'];\r\n\r\n/** A copy of a collision setting; null for none, or for one without a valid shape */\r\nfunction copyCollision(c: Nullable<FoliageCollision> | undefined): Nullable<FoliageCollision> {\r\n if (!c || !COLLISION_SHAPES.includes(c.shape)) {\r\n return null;\r\n }\r\n return {\r\n ...c,\r\n size: c.size ? [c.size[0], c.size[1], c.size[2]] : undefined,\r\n offset: c.offset ? [c.offset[0], c.offset[1], c.offset[2]] : undefined\r\n };\r\n}\r\n\r\n/** Deterministic value in [0, 1) from a position, standing in for the threshold of a manual instance */\r\nfunction positionHash(x: number, z: number) {\r\n const f = new Float32Array([x, z]);\r\n const u = new Uint32Array(f.buffer);\r\n let h = Math.imul(u[0] ^ 0x9e3779b9, 0x85ebca6b) ^ Math.imul(u[1] ^ 0x7f4a7c15, 0xc2b2ae35);\r\n h ^= h >>> 16;\r\n h = Math.imul(h, 0x7feb352d);\r\n h ^= h >>> 15;\r\n h = Math.imul(h, 0x846ca68b);\r\n h ^= h >>> 16;\r\n return (h >>> 0) / 4294967296;\r\n}\r\n\r\ntype FoliageChunk = {\r\n layer: FoliageLayer;\r\n key: string;\r\n group: BatchGroup;\r\n /** Static body holding the colliders of the chunk's instances */\r\n colliders: Nullable<SceneNode>;\r\n minX: number;\r\n minZ: number;\r\n maxX: number;\r\n maxZ: number;\r\n visible: boolean;\r\n};\r\n\r\nconst tmpQuat = new Quaternion();\r\nconst tmpAlign = new Quaternion();\r\nconst tmpNormal = new Vector3();\r\nconst tmpScale = new Vector3();\r\nconst tmpPos = new Vector3();\r\nconst tmpMatrix = new Matrix4x4();\r\nconst tmpMatrix2 = new Matrix4x4();\r\nconst UP = Vector3.axisPY();\r\n\r\n/** A region of the plane of a foliage system, `[minX, minZ, maxX, maxZ]` */\r\nexport type FoliageRegion = [number, number, number, number];\r\n\r\n/**\r\n * Scatters many copies of prefabs or models, such as trees, bushes and rocks, over a terrain.\r\n *\r\n * @remarks\r\n * Each {@link FoliageLayer} scatters one asset. An instance stores only its horizontal position,\r\n * an offset above the ground, a rotation about the vertical axis and a scale; its height is taken\r\n * from the {@link ClipmapTerrain} the system is a descendant of, so the instances follow the\r\n * ground when the terrain changes. Without a terrain ancestor the offset is the height.\r\n *\r\n * Instances are drawn in square chunks of {@link FoliageSystem.chunkSize}, each a\r\n * {@link BatchGroup} built on demand and not serialized, which draws a whole chunk in a few\r\n * instanced draw calls; chunks farther than the cull distance of their layer are hidden.\r\n * Changing the instances of an area rebuilds only the chunks it overlaps.\r\n *\r\n * Positions are in the space of the foliage system, which is meant to be translated only.\r\n * @public\r\n */\r\nexport class FoliageSystem extends GraphNode {\r\n private _layers: FoliageLayer[];\r\n private _chunkSize: number;\r\n private _maskCellSize: number;\r\n private _chunks: Map<FoliageLayer, Map<string, FoliageChunk>>;\r\n private _dirty: boolean;\r\n private _dirtyChunks: Map<FoliageLayer, Set<string>>;\r\n private _buildSerial: number;\r\n private _builtHeightData: unknown;\r\n private _builtTerrain: Nullable<ClipmapTerrain>;\r\n /**\r\n * Creates a foliage system\r\n * @param scene - The scene to which the node belongs\r\n */\r\n constructor(scene: Scene) {\r\n super(scene);\r\n this._layers = [];\r\n this._chunkSize = 64;\r\n this._maskCellSize = 1;\r\n this._chunks = new Map();\r\n this._dirty = false;\r\n this._dirtyChunks = new Map();\r\n this._buildSerial = 0;\r\n this._builtHeightData = null;\r\n this._builtTerrain = null;\r\n }\r\n /** Edge length of the square chunks the instances are drawn in. Default 64. */\r\n get chunkSize() {\r\n return this._chunkSize;\r\n }\r\n set chunkSize(val: number) {\r\n val = Math.max(1, val);\r\n if (val !== this._chunkSize) {\r\n this._chunkSize = val;\r\n for (const layer of this._layers) {\r\n layer._generated.setChunkSize(val);\r\n layer._manual.setChunkSize(val);\r\n }\r\n this.invalidate();\r\n }\r\n }\r\n /**\r\n * Edge of a cell of the density masks of the layers, in meters. Default 1. Changing it keeps\r\n * the cell values, so what was painted scales with it; regenerate the layers afterwards.\r\n */\r\n get maskCellSize() {\r\n return this._maskCellSize;\r\n }\r\n set maskCellSize(val: number) {\r\n val = Math.max(0.05, val);\r\n if (val !== this._maskCellSize) {\r\n this._maskCellSize = val;\r\n for (const layer of this._layers) {\r\n layer._mask.cellSize = val;\r\n }\r\n }\r\n }\r\n /** Number of layers */\r\n get numLayers() {\r\n return this._layers.length;\r\n }\r\n /** Total number of instances of all layers */\r\n get numInstances() {\r\n return this._layers.reduce((sum, layer) => sum + layer.count, 0);\r\n }\r\n /**\r\n * Gets a layer\r\n * @param index - Layer index\r\n */\r\n getLayer(index: number): Nullable<FoliageLayer> {\r\n return this._layers[index] ?? null;\r\n }\r\n /**\r\n * Index of a layer of this system\r\n * @param layer - The layer\r\n * @returns Its index, or -1\r\n */\r\n indexOfLayer(layer: FoliageLayer) {\r\n return this._layers.indexOf(layer);\r\n }\r\n /**\r\n * Adds a layer scattering a prefab (.zprefab) or a model asset\r\n * @param asset - Path of the asset\r\n * @param settings - Layer settings\r\n * @returns Index of the new layer\r\n */\r\n addLayer(asset: string, settings?: FoliageLayerSettings) {\r\n return this.insertLayer(new FoliageLayer(asset, settings));\r\n }\r\n /**\r\n * Inserts a layer, which is moved out of the foliage system it belongs to\r\n * @param layer - The layer\r\n * @param index - Position to insert at; appended when omitted\r\n * @returns Index of the layer\r\n */\r\n insertLayer(layer: FoliageLayer, index?: number) {\r\n if (layer._owner) {\r\n layer._owner.detachLayer(layer);\r\n }\r\n const at = Math.max(0, Math.min(index ?? this._layers.length, this._layers.length));\r\n this._layers.splice(at, 0, layer);\r\n this.adoptLayer(layer);\r\n this.invalidate();\r\n return at;\r\n }\r\n /**\r\n * Removes a layer and its instances\r\n * @param index - Layer index\r\n */\r\n removeLayer(index: number) {\r\n const layer = this._layers[index];\r\n if (layer) {\r\n this.detachLayer(layer);\r\n layer._dispose();\r\n }\r\n }\r\n /**\r\n * Removes every layer\r\n */\r\n clearLayers() {\r\n for (const layer of this._layers) {\r\n layer._owner = null;\r\n layer._dispose();\r\n }\r\n this._layers = [];\r\n this.invalidate();\r\n }\r\n /**\r\n * Replaces the layer list. Layers already in the system keep their loaded assets, layers\r\n * left out are disposed, and layers of another system are moved here.\r\n * @param layers - The new layers, in order\r\n */\r\n setLayers(layers: FoliageLayer[]) {\r\n const next = layers.filter((layer, i) => layers.indexOf(layer) === i);\r\n for (const layer of this._layers) {\r\n if (!next.includes(layer)) {\r\n layer._owner = null;\r\n layer._dispose();\r\n }\r\n }\r\n for (const layer of next) {\r\n if (layer._owner && layer._owner !== this) {\r\n layer._owner.detachLayer(layer);\r\n }\r\n this.adoptLayer(layer);\r\n }\r\n this._layers = next;\r\n this.invalidate();\r\n }\r\n /** Makes a layer use this system's chunk and mask cell sizes */\r\n private adoptLayer(layer: FoliageLayer) {\r\n layer._owner = this;\r\n layer._generated.setChunkSize(this._chunkSize);\r\n layer._manual.setChunkSize(this._chunkSize);\r\n layer._mask.cellSize = this._maskCellSize;\r\n }\r\n /** Takes a layer out of the list, keeping its instances */\r\n private detachLayer(layer: FoliageLayer) {\r\n const index = this._layers.indexOf(layer);\r\n if (index >= 0) {\r\n this._layers.splice(index, 1);\r\n layer._owner = null;\r\n this.invalidate();\r\n }\r\n }\r\n /**\r\n * Changes the settings of a layer\r\n * @param index - Layer index\r\n * @param settings - Settings to change; omitted ones are kept\r\n */\r\n setLayerSettings(index: number, settings: FoliageLayerSettings & { asset?: string }) {\r\n const layer = this._layers[index];\r\n if (!layer) {\r\n return;\r\n }\r\n if (settings.asset !== undefined) {\r\n layer.asset = settings.asset;\r\n }\r\n layer._castShadow = settings.castShadow ?? layer._castShadow;\r\n layer._cullDistance = settings.cullDistance ?? layer._cullDistance;\r\n layer._alignToNormal = settings.alignToNormal ?? layer._alignToNormal;\r\n if (settings.collision !== undefined) {\r\n layer._collision = copyCollision(settings.collision);\r\n }\r\n if (settings.generation) {\r\n layer._generation = mergeGeneration(layer._generation, settings.generation);\r\n }\r\n this.invalidate();\r\n }\r\n /**\r\n * Replaces the instances of a layer of one group\r\n * @param index - Layer index\r\n * @param data - {@link FOLIAGE_INSTANCE_STRIDE} floats per instance, see {@link FoliageLayer.getInstances}\r\n * @param group - Which instances to replace. Default 'manual'; 'all' empties the generated\r\n * group and puts the instances in the manual one.\r\n */\r\n setInstances(index: number, data: ArrayLike<number>, group: FoliageInstanceGroup = 'manual') {\r\n const layer = this._layers[index];\r\n if (!layer) {\r\n return;\r\n }\r\n const touched = new Set<string>();\r\n if (group === 'generated') {\r\n for (const key of layer._generated.clear()) {\r\n touched.add(key);\r\n }\r\n layer._generated.add(data, touched);\r\n } else {\r\n if (group === 'all') {\r\n for (const key of layer._generated.clear()) {\r\n touched.add(key);\r\n }\r\n }\r\n for (const key of layer._manual.clear()) {\r\n touched.add(key);\r\n }\r\n layer._manual.add(data, touched);\r\n }\r\n this.invalidateChunks(layer, touched);\r\n }\r\n /**\r\n * Appends instances to a layer\r\n * @param index - Layer index\r\n * @param data - {@link FOLIAGE_INSTANCE_STRIDE} floats per instance, see {@link FoliageLayer.getInstances}\r\n * @param group - Which group receives them. Default 'manual'.\r\n */\r\n addInstances(index: number, data: ArrayLike<number>, group: 'generated' | 'manual' = 'manual') {\r\n const layer = this._layers[index];\r\n if (!layer) {\r\n return;\r\n }\r\n const touched = new Set<string>();\r\n (group === 'generated' ? layer._generated : layer._manual).add(data, touched);\r\n this.invalidateChunks(layer, touched);\r\n }\r\n /**\r\n * Replaces the generated instances of a layer standing within a region\r\n *\r\n * @remarks\r\n * Used by the foliage generator: the region is aligned with the candidate grid, so the\r\n * instances removed and the ones added are of the same candidates.\r\n * @param index - Layer index\r\n * @param region - `[minX, minZ, maxX, maxZ]`, local; instances with minX ≤ x < maxX and\r\n * minZ ≤ z < maxZ are replaced\r\n * @param data - The new instances of the region\r\n */\r\n replaceGeneratedInRegion(index: number, region: Readonly<FoliageRegion>, data: ArrayLike<number>) {\r\n const layer = this._layers[index];\r\n if (!layer) {\r\n return;\r\n }\r\n const touched = new Set<string>();\r\n layer._generated.removeWhere(\r\n region,\r\n (d, o) => d[o] >= region[0] && d[o] < region[2] && d[o + 1] >= region[1] && d[o + 1] < region[3],\r\n touched\r\n );\r\n layer._generated.add(data, touched);\r\n this.invalidateChunks(layer, touched);\r\n }\r\n /**\r\n * Changes the density mask of a layer within a circle; the generated instances are not\r\n * regenerated, see {@link FoliageLayer.mask}\r\n * @param index - Layer index\r\n * @param x - Circle centre x, local\r\n * @param z - Circle centre z, local\r\n * @param radius - Circle radius\r\n * @param amount - Change at full weight, -1 to 1; negative erases\r\n * @param falloff - Fraction of the radius over which the brush weight falls to 0\r\n * @returns The changed region, or null\r\n */\r\n paintMask(index: number, x: number, z: number, radius: number, amount: number, falloff = 0.5) {\r\n return this._layers[index]?._mask.paintCircle(x, z, radius, amount, falloff) ?? null;\r\n }\r\n /**\r\n * Moves the density mask of a layer within a circle towards a density; the generated\r\n * instances are not regenerated, see {@link FoliageLayer.mask}\r\n * @param index - Layer index\r\n * @param x - Circle centre x, local\r\n * @param z - Circle centre z, local\r\n * @param radius - Circle radius\r\n * @param density - Density inside the circle, 0 to 1\r\n * @param falloff - Fraction of the radius over which it blends into what is around\r\n * @returns The changed region, or null\r\n */\r\n fillMaskCircle(index: number, x: number, z: number, radius: number, density: number, falloff = 0.5) {\r\n return this._layers[index]?._mask.blendCircle(x, z, radius, density, falloff) ?? null;\r\n }\r\n /**\r\n * Erases manual instances within a circle, by brush weight: an instance goes where the weight\r\n * of the brush there is above a value derived from its position, so a soft brush thins them\r\n * out towards its edge, the same way every time\r\n * @param index - Layer index\r\n * @param x - Circle centre x, local\r\n * @param z - Circle centre z, local\r\n * @param radius - Circle radius\r\n * @param strength - Weight at the centre, 0 to 1\r\n * @param weight - Brush weight from the distance over the radius\r\n * @returns Number of instances removed\r\n */\r\n eraseManualInstances(\r\n index: number,\r\n x: number,\r\n z: number,\r\n radius: number,\r\n strength: number,\r\n weight: (t: number) => number\r\n ) {\r\n const layer = this._layers[index];\r\n if (!layer || !(radius > 0) || !(strength > 0)) {\r\n return 0;\r\n }\r\n const touched = new Set<string>();\r\n const removed = layer._manual.removeWhere(\r\n [x - radius, z - radius, x + radius, z + radius],\r\n (d, o) => {\r\n const t = Math.hypot(d[o] - x, d[o + 1] - z) / radius;\r\n return t < 1 && strength * weight(t) > positionHash(d[o], d[o + 1]);\r\n },\r\n touched\r\n );\r\n this.invalidateChunks(layer, touched);\r\n return removed;\r\n }\r\n /**\r\n * Removes the instances standing within a circle\r\n *\r\n * @remarks\r\n * Generated instances are removed by clearing the density mask under the circle, so\r\n * regenerating the layer does not bring them back.\r\n * @param x - Circle centre x, local to the foliage system\r\n * @param z - Circle centre z, local to the foliage system\r\n * @param radius - Circle radius\r\n * @param index - Layer index, or -1 for every layer\r\n * @param group - Which instances. Default 'all'.\r\n * @returns Number of instances removed\r\n */\r\n removeInstancesInCircle(\r\n x: number,\r\n z: number,\r\n radius: number,\r\n index = -1,\r\n group: FoliageInstanceGroup = 'all'\r\n ) {\r\n let removed = 0;\r\n const r2 = radius * radius;\r\n const region: FoliageRegion = [x - radius, z - radius, x + radius, z + radius];\r\n const inside = (d: Float32Array, o: number) => {\r\n const dx = d[o] - x;\r\n const dz = d[o + 1] - z;\r\n return dx * dx + dz * dz <= r2;\r\n };\r\n this._layers.forEach((layer, i) => {\r\n if (index >= 0 && i !== index) {\r\n return;\r\n }\r\n const touched = new Set<string>();\r\n if (group !== 'generated') {\r\n removed += layer._manual.removeWhere(region, inside, touched);\r\n }\r\n if (group !== 'manual') {\r\n layer._mask.fillCircle(x, z, radius, 0);\r\n removed += layer._generated.removeWhere(region, inside, touched);\r\n }\r\n this.invalidateChunks(layer, touched);\r\n });\r\n return removed;\r\n }\r\n /**\r\n * The terrain the instances stand on: the closest {@link ClipmapTerrain} ancestor\r\n */\r\n get terrain(): Nullable<ClipmapTerrain> {\r\n let node = this.parent;\r\n while (node) {\r\n if (node.isClipmapTerrain()) {\r\n return node;\r\n }\r\n node = node.parent;\r\n }\r\n return null;\r\n }\r\n /**\r\n * Schedules every chunk to be rebuilt; called by the methods changing layers\r\n */\r\n invalidate() {\r\n this._dirty = true;\r\n // Also called while the base constructor attaches the node, before the fields exist\r\n this._dirtyChunks?.clear();\r\n this.scene?.queuePerCameraUpdateNode(this);\r\n }\r\n /** Schedules some chunks of a layer to be rebuilt */\r\n private invalidateChunks(layer: FoliageLayer, keys: Iterable<string>) {\r\n if (this._dirty) {\r\n return;\r\n }\r\n let set = this._dirtyChunks.get(layer);\r\n for (const key of keys) {\r\n if (!set) {\r\n set = new Set();\r\n this._dirtyChunks.set(layer, set);\r\n }\r\n set.add(key);\r\n }\r\n if (set) {\r\n this.scene?.queuePerCameraUpdateNode(this);\r\n }\r\n }\r\n /** {@inheritDoc SceneNode.updatePerCamera} */\r\n updatePerCamera(camera: Camera, _elapsedInSeconds: number, _deltaInSeconds: number) {\r\n this.scene?.queuePerCameraUpdateNode(this);\r\n const terrain = this.terrain;\r\n // Rebuilt once the terrain heights the instances stand on are known again after a change\r\n if (terrain !== this._builtTerrain || (terrain && terrain.heightData !== this._builtHeightData)) {\r\n if (!terrain || terrain.heightData) {\r\n this._dirty = true;\r\n } else {\r\n terrain.whenHeightDataReady();\r\n }\r\n }\r\n if (this._dirty) {\r\n this._dirty = false;\r\n this._dirtyChunks.clear();\r\n this.rebuild();\r\n } else if (this._dirtyChunks.size > 0) {\r\n this.rebuildChunks();\r\n }\r\n const eye = camera.getWorldPosition();\r\n const ox = this.worldMatrix.m03;\r\n const oz = this.worldMatrix.m23;\r\n const ex = eye.x - ox;\r\n const ez = eye.z - oz;\r\n for (const chunks of this._chunks.values()) {\r\n for (const chunk of chunks.values()) {\r\n const dx = Math.max(chunk.minX - ex, 0, ex - chunk.maxX);\r\n const dz = Math.max(chunk.minZ - ez, 0, ez - chunk.maxZ);\r\n const visible = dx * dx + dz * dz <= chunk.layer._cullDistance * chunk.layer._cullDistance;\r\n if (visible !== chunk.visible) {\r\n chunk.visible = visible;\r\n chunk.group.showState = visible ? 'inherit' : 'hidden';\r\n }\r\n }\r\n }\r\n }\r\n /** @internal */\r\n protected _onAttached(): void {\r\n super._onAttached();\r\n this.invalidate();\r\n }\r\n /** Rebuilds every chunk, loading the layer assets first */\r\n private rebuild() {\r\n const serial = ++this._buildSerial;\r\n const terrain = this.terrain;\r\n const heightData = terrain?.heightData ?? null;\r\n const pending = this._layers.filter((layer) => !layer._parts).map((layer) => this.loadLayer(layer));\r\n Promise.all(pending).then(() => {\r\n if (serial !== this._buildSerial || this.disposed) {\r\n return;\r\n }\r\n this.clearChunks();\r\n this._builtTerrain = terrain;\r\n this._builtHeightData = heightData;\r\n for (const layer of this._layers) {\r\n for (const key of new Set([...layer._generated.keys(), ...layer._manual.keys()])) {\r\n this.buildChunk(layer, key, terrain);\r\n }\r\n }\r\n });\r\n }\r\n /** Rebuilds the chunks marked dirty, once every layer is loaded */\r\n private rebuildChunks() {\r\n if (this._layers.some((layer) => !layer._parts)) {\r\n // A layer still loading: its full rebuild picks the changes up\r\n this._dirty = true;\r\n return;\r\n }\r\n const terrain = this._builtTerrain;\r\n for (const [layer, keys] of this._dirtyChunks) {\r\n if (!this._layers.includes(layer)) {\r\n continue;\r\n }\r\n for (const key of keys) {\r\n this.disposeChunk(layer, key);\r\n this.buildChunk(layer, key, terrain);\r\n }\r\n }\r\n this._dirtyChunks.clear();\r\n }\r\n private clearChunks() {\r\n for (const chunks of this._chunks.values()) {\r\n for (const chunk of chunks.values()) {\r\n chunk.group.remove();\r\n chunk.group.dispose();\r\n chunk.colliders?.dispose();\r\n }\r\n }\r\n this._chunks.clear();\r\n }\r\n private disposeChunk(layer: FoliageLayer, key: string) {\r\n const chunks = this._chunks.get(layer);\r\n const chunk = chunks?.get(key);\r\n if (chunk) {\r\n chunk.group.remove();\r\n chunk.group.dispose();\r\n chunk.colliders?.dispose();\r\n chunks!.delete(key);\r\n }\r\n }\r\n private loadLayer(layer: FoliageLayer) {\r\n if (!layer._asset) {\r\n // A layer just added in the editor, nothing to draw until an asset is picked\r\n layer._parts = [];\r\n return Promise.resolve();\r\n }\r\n if (!layer._loading) {\r\n const asset = layer._asset;\r\n layer._loading = (async () => {\r\n const scene = this.scene!;\r\n const tmp = new SceneNode(scene);\r\n tmp.remove();\r\n let root: Nullable<SceneNode> = null;\r\n try {\r\n const manager = getEngine().resourceManager;\r\n root = asset.toLowerCase().endsWith('.zprefab')\r\n ? await manager.instantiatePrefab(tmp, asset)\r\n : ((await manager.fetchModel(asset, scene)) ?? null);\r\n if (root) {\r\n root.parent = tmp;\r\n root.position.setXYZ(0, 0, 0);\r\n root.rotation.identity();\r\n root.scale.setXYZ(1, 1, 1);\r\n }\r\n } catch (err) {\r\n console.error(`Foliage: cannot load ${asset}: ${err}`);\r\n }\r\n const parts: FoliagePart[] = [];\r\n const colliders: FoliageColliderTemplate[] = [];\r\n let bounds: Nullable<AABB> = null;\r\n root?.iterate((node) => {\r\n for (const c of node.physics?.colliders ?? []) {\r\n if (PRIMITIVE_COLLIDER_SHAPES.includes(c.shape)) {\r\n colliders.push({\r\n matrix: new Matrix4x4(node.worldMatrix),\r\n shape: c.shape,\r\n size: new Vector3(c.size),\r\n radius: c.radius,\r\n height: c.height,\r\n offset: new Vector3(c.offset),\r\n friction: c.friction,\r\n restitution: c.restitution,\r\n layer: c.layer\r\n });\r\n } else {\r\n console.warn(`Foliage: ${c.shape} colliders of ${asset} are skipped`);\r\n }\r\n }\r\n if (node.isMesh() && node.primitive && node.material) {\r\n const box = node.primitive.getBoundingVolume()?.toAABB();\r\n if (box) {\r\n const world = AABB.transform(box, node.worldMatrix);\r\n if (bounds) {\r\n bounds.union(world);\r\n } else {\r\n bounds = world;\r\n }\r\n }\r\n if (node.skeletonName || node.morphTargetGroups?.length) {\r\n console.warn(`Foliage: skinned and morphed meshes of ${asset} are skipped`);\r\n return false;\r\n }\r\n const material = node.material as MeshMaterial;\r\n parts.push({\r\n primitive: new DRef(node.primitive),\r\n // Instance materials are what lets the copies of a mesh be drawn instanced\r\n material: new DRef(material.$isInstance ? material : material.createInstance()),\r\n matrix: new Matrix4x4(node.worldMatrix)\r\n });\r\n }\r\n return false;\r\n });\r\n tmp.dispose();\r\n if (layer._asset !== asset) {\r\n // The asset changed while loading: the meshes are of the old one\r\n for (const part of parts) {\r\n part.primitive.dispose();\r\n part.material.dispose();\r\n }\r\n return;\r\n }\r\n if (parts.length === 0) {\r\n console.error(`Foliage: ${asset} has no mesh to scatter`);\r\n }\r\n layer._parts = parts;\r\n layer._bounds = bounds;\r\n layer._assetColliders = colliders;\r\n layer._loading = null;\r\n })();\r\n }\r\n return layer._loading;\r\n }\r\n /** Builds the batch group and colliders of one chunk of a layer, from both instance groups */\r\n private buildChunk(layer: FoliageLayer, key: string, terrain: Nullable<ClipmapTerrain>) {\r\n const parts = layer._parts;\r\n if (!parts || parts.length === 0) {\r\n return;\r\n }\r\n const sources = [layer._manual.get(key), layer._generated.get(key)].filter(\r\n (d): d is Float32Array => !!d && d.length > 0\r\n );\r\n if (sources.length === 0) {\r\n return;\r\n }\r\n const size = this._chunkSize;\r\n const [cx, cz] = key.split(',').map(Number);\r\n const ox = this.worldMatrix.m03;\r\n const oy = this.worldMatrix.m13;\r\n const oz = this.worldMatrix.m23;\r\n const templates = layer._colliderTemplates();\r\n // Painted instances on any surface store their height; the others stand on the terrain\r\n const onTerrain = (generated: boolean) => !generated || layer._generation.surface === 'terrain';\r\n const group = new BatchGroup(this.scene!);\r\n group.sealed = true;\r\n group.name = `Foliage chunk ${cx},${cz}`;\r\n group.parent = this;\r\n // One static body per chunk, with a collider node per instance and template\r\n let colliders: Nullable<SceneNode> = null;\r\n if (templates.length > 0) {\r\n colliders = new SceneNode(this.scene!);\r\n colliders.sealed = true;\r\n colliders.name = `Foliage colliders ${cx},${cz}`;\r\n colliders.parent = this;\r\n const body = new RigidBody();\r\n body.motionType = 'static';\r\n colliders.physics = new NodePhysics({ body });\r\n }\r\n const manual = layer._manual.get(key);\r\n for (const d of sources) {\r\n const followTerrain = onTerrain(d !== manual);\r\n for (let o = 0; o < d.length; o += FOLIAGE_INSTANCE_STRIDE) {\r\n const x = d[o];\r\n const z = d[o + 1];\r\n let y = d[o + 2];\r\n let upright = true;\r\n if (terrain && followTerrain) {\r\n const h = terrain.getHeightAt(x + ox, z + oz);\r\n if (h !== null) {\r\n y += h - oy;\r\n if (layer._alignToNormal > 0 && terrain.getNormalAt(x + ox, z + oz, tmpNormal)) {\r\n Quaternion.unitVectorToUnitVector(UP, tmpNormal, tmpAlign);\r\n Quaternion.slerp(Quaternion.identity(tmpQuat), tmpAlign, layer._alignToNormal, tmpAlign);\r\n upright = false;\r\n }\r\n }\r\n }\r\n Quaternion.fromAxisAngle(UP, d[o + 3], tmpQuat);\r\n if (!upright) {\r\n Quaternion.multiply(tmpAlign, tmpQuat, tmpQuat);\r\n }\r\n const s = d[o + 4];\r\n Matrix4x4.compose(tmpScale.setXYZ(s, s, s), tmpQuat, tmpPos.setXYZ(x, y, z), tmpMatrix);\r\n for (const part of parts) {\r\n const mesh = new Mesh(this.scene!, part.primitive.get()!, part.material.get()!);\r\n mesh.sealed = true;\r\n mesh.castShadow = layer._castShadow;\r\n mesh.gpuPickable = false;\r\n mesh.parent = group;\r\n mesh.setLocalTransform(Matrix4x4.multiply(tmpMatrix, part.matrix, tmpMatrix2));\r\n // Chunks are built in updatePerCamera, after the frame update that refreshes the\r\n // matrices meshes draw with; without this the group draws them where they were created\r\n mesh.syncDrawableTransform();\r\n }\r\n for (const t of templates) {\r\n const node = new SceneNode(this.scene!);\r\n node.sealed = true;\r\n node.parent = colliders;\r\n node.setLocalTransform(Matrix4x4.multiply(tmpMatrix, t.matrix, tmpMatrix2));\r\n const collider = new Collider();\r\n collider.shape = t.shape;\r\n collider.size = t.size;\r\n collider.radius = t.radius;\r\n collider.height = t.height;\r\n collider.offset = t.offset;\r\n collider.friction = t.friction;\r\n collider.restitution = t.restitution;\r\n collider.layer = t.layer;\r\n node.physics = new NodePhysics({ colliders: [collider] });\r\n }\r\n }\r\n }\r\n let chunks = this._chunks.get(layer);\r\n if (!chunks) {\r\n chunks = new Map();\r\n this._chunks.set(layer, chunks);\r\n }\r\n chunks.set(key, {\r\n layer,\r\n key,\r\n group,\r\n colliders,\r\n minX: cx * size,\r\n minZ: cz * size,\r\n maxX: (cx + 1) * size,\r\n maxZ: (cz + 1) * size,\r\n visible: true\r\n });\r\n }\r\n /**\r\n * The chunk nodes built for this system, to tell them apart from other scene nodes\r\n * (e.g. to skip the foliage's own colliders when looking for the ground)\r\n * @param node - A scene node\r\n * @returns Whether the node is, or is below, a chunk of this system\r\n */\r\n ownsNode(node: Nullable<SceneNode>) {\r\n while (node && node !== this) {\r\n if (node.parent === this && node.sealed) {\r\n return true;\r\n }\r\n node = node.parent;\r\n }\r\n return false;\r\n }\r\n /** {@inheritDoc SceneNode.onDispose} */\r\n protected onDispose() {\r\n this._buildSerial++;\r\n this.clearChunks();\r\n for (const layer of this._layers) {\r\n layer._owner = null;\r\n layer._dispose();\r\n }\r\n this._layers = [];\r\n super.onDispose();\r\n }\r\n}\r\n"],"names":["defaultGeneration","spacing","scaleRange","slopeRange","heightRange","yOffset","randomYaw","seed","Math","floor","random","surface","placeScript","copyGeneration","g","mergeGeneration","base","num","v","d","Number","isFinite","pair","Array","isArray","length","max","undefined","Infinity","PRIMITIVE_COLLIDER_SHAPES","FoliageLayer","_owner","_asset","_generated","_manual","_mask","_generation","_castShadow","_cullDistance","_alignToNormal","_collision","_parts","_bounds","_assetColliders","_loading","asset","settings","FoliageInstanceBuckets","FoliageDensityMask","generation","castShadow","cullDistance","alignToNormal","copyCollision","collision","owner","val","_dispose","invalidate","count","generatedCount","manualCount","mask","_colliderTemplates","c","shape","b","ext","Vector3","sub","maxPoint","minPoint","center","scale","add","bottom","y","height","radius","x","z","min","offset","matrix","Matrix4x4","identity","size","friction","restitution","layer","getInstances","group","toArray","manual","generated","out","Float32Array","set","part","primitive","dispose","material","COLLISION_SHAPES","includes","positionHash","f","u","Uint32Array","buffer","h","imul","tmpQuat","Quaternion","tmpAlign","tmpNormal","tmpScale","tmpPos","tmpMatrix","tmpMatrix2","UP","axisPY","FoliageSystem","GraphNode","_layers","_chunkSize","_maskCellSize","_chunks","_dirty","_dirtyChunks","_buildSerial","_builtHeightData","_builtTerrain","scene","Map","chunkSize","setChunkSize","maskCellSize","cellSize","numLayers","numInstances","reduce","sum","getLayer","index","indexOfLayer","indexOf","addLayer","insertLayer","detachLayer","at","splice","adoptLayer","removeLayer","clearLayers","setLayers","layers","next","filter","i","setLayerSettings","setInstances","data","touched","Set","key","clear","invalidateChunks","addInstances","replaceGeneratedInRegion","region","removeWhere","o","paintMask","amount","falloff","paintCircle","fillMaskCircle","density","blendCircle","eraseManualInstances","strength","weight","removed","t","hypot","removeInstancesInCircle","r2","inside","dx","dz","forEach","fillCircle","terrain","node","parent","isClipmapTerrain","queuePerCameraUpdateNode","keys","get","updatePerCamera","camera","_elapsedInSeconds","_deltaInSeconds","heightData","whenHeightDataReady","rebuild","rebuildChunks","eye","getWorldPosition","ox","worldMatrix","m03","oz","m23","ex","ez","chunks","values","chunk","minX","maxX","minZ","maxZ","visible","showState","_onAttached","serial","pending","map","loadLayer","Promise","all","then","disposed","clearChunks","buildChunk","some","disposeChunk","remove","colliders","delete","resolve","tmp","SceneNode","root","manager","getEngine","resourceManager","toLowerCase","endsWith","instantiatePrefab","fetchModel","position","setXYZ","rotation","err","console","error","parts","bounds","iterate","physics","push","warn","isMesh","box","getBoundingVolume","toAABB","world","AABB","transform","union","skeletonName","morphTargetGroups","DRef","$isInstance","createInstance","sources","cx","cz","split","oy","m13","templates","onTerrain","BatchGroup","sealed","name","body","RigidBody","motionType","NodePhysics","followTerrain","FOLIAGE_INSTANCE_STRIDE","upright","getHeightAt","getNormalAt","unitVectorToUnitVector","slerp","fromAxisAngle","multiply","s","compose","mesh","Mesh","gpuPickable","setLocalTransform","syncDrawableTransform","collider","Collider","ownsNode","onDispose"],"mappings":"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"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/** Number of floats per foliage instance: x, z, y offset, rotation about Y, scale */ const FOLIAGE_INSTANCE_STRIDE = 5;
|
|
2
|
+
/**
|
|
3
|
+
* Instances of a foliage layer, kept in buckets by the chunk they stand in, so that changing a
|
|
4
|
+
* small area touches only the chunks it overlaps.
|
|
5
|
+
* @internal
|
|
6
|
+
*/ class FoliageInstanceBuckets {
|
|
7
|
+
_chunkSize;
|
|
8
|
+
_buckets;
|
|
9
|
+
_count;
|
|
10
|
+
constructor(chunkSize){
|
|
11
|
+
this._chunkSize = chunkSize;
|
|
12
|
+
this._buckets = new Map();
|
|
13
|
+
this._count = 0;
|
|
14
|
+
}
|
|
15
|
+
/** Number of instances */ get count() {
|
|
16
|
+
return this._count;
|
|
17
|
+
}
|
|
18
|
+
/** Keys of the chunks holding instances */ keys() {
|
|
19
|
+
return this._buckets.keys();
|
|
20
|
+
}
|
|
21
|
+
/** Key of the chunk a position stands in */ keyOf(x, z) {
|
|
22
|
+
return `${Math.floor(x / this._chunkSize)},${Math.floor(z / this._chunkSize)}`;
|
|
23
|
+
}
|
|
24
|
+
/** Instances of a chunk; a view, valid until the bucket changes */ get(key) {
|
|
25
|
+
const b = this._buckets.get(key);
|
|
26
|
+
return b ? b.data.subarray(0, b.count * FOLIAGE_INSTANCE_STRIDE) : null;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Re-sorts the instances into chunks of another size
|
|
30
|
+
* @param chunkSize - New chunk edge
|
|
31
|
+
*/ setChunkSize(chunkSize) {
|
|
32
|
+
if (chunkSize !== this._chunkSize) {
|
|
33
|
+
const all = this.toArray();
|
|
34
|
+
this._chunkSize = chunkSize;
|
|
35
|
+
this.clear();
|
|
36
|
+
this.add(all);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/** Removes every instance; returns the keys of the chunks that held some */ clear() {
|
|
40
|
+
const keys = new Set(this._buckets.keys());
|
|
41
|
+
this._buckets.clear();
|
|
42
|
+
this._count = 0;
|
|
43
|
+
return keys;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Appends instances
|
|
47
|
+
* @param data - {@link FOLIAGE_INSTANCE_STRIDE} floats per instance
|
|
48
|
+
* @param touched - Receives the keys of the chunks that changed
|
|
49
|
+
*/ add(data, touched) {
|
|
50
|
+
const n = Math.floor(data.length / FOLIAGE_INSTANCE_STRIDE);
|
|
51
|
+
for(let k = 0; k < n; k++){
|
|
52
|
+
const o = k * FOLIAGE_INSTANCE_STRIDE;
|
|
53
|
+
const key = this.keyOf(data[o], data[o + 1]);
|
|
54
|
+
let b = this._buckets.get(key);
|
|
55
|
+
if (!b) {
|
|
56
|
+
b = {
|
|
57
|
+
data: new Float32Array(16 * FOLIAGE_INSTANCE_STRIDE),
|
|
58
|
+
count: 0
|
|
59
|
+
};
|
|
60
|
+
this._buckets.set(key, b);
|
|
61
|
+
}
|
|
62
|
+
if ((b.count + 1) * FOLIAGE_INSTANCE_STRIDE > b.data.length) {
|
|
63
|
+
const grown = new Float32Array(b.data.length * 2);
|
|
64
|
+
grown.set(b.data);
|
|
65
|
+
b.data = grown;
|
|
66
|
+
}
|
|
67
|
+
const d = b.count * FOLIAGE_INSTANCE_STRIDE;
|
|
68
|
+
for(let c = 0; c < FOLIAGE_INSTANCE_STRIDE; c++){
|
|
69
|
+
b.data[d + c] = data[o + c];
|
|
70
|
+
}
|
|
71
|
+
b.count++;
|
|
72
|
+
this._count++;
|
|
73
|
+
touched?.add(key);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Removes the instances for which a test is true, from the chunks overlapping a region
|
|
78
|
+
* @param region - `[minX, minZ, maxX, maxZ]`; only chunks overlapping it are tested
|
|
79
|
+
* @param test - Called with the bucket data and the offset of an instance
|
|
80
|
+
* @param touched - Receives the keys of the chunks that changed
|
|
81
|
+
* @returns Number of instances removed
|
|
82
|
+
*/ removeWhere(region, test, touched) {
|
|
83
|
+
let removed = 0;
|
|
84
|
+
const cs = this._chunkSize;
|
|
85
|
+
const cx0 = Math.floor(region[0] / cs);
|
|
86
|
+
const cz0 = Math.floor(region[1] / cs);
|
|
87
|
+
const cx1 = Math.floor(region[2] / cs);
|
|
88
|
+
const cz1 = Math.floor(region[3] / cs);
|
|
89
|
+
const visit = (key)=>{
|
|
90
|
+
const b = this._buckets.get(key);
|
|
91
|
+
if (!b) {
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
const d = b.data;
|
|
95
|
+
let n = 0;
|
|
96
|
+
for(let k = 0; k < b.count; k++){
|
|
97
|
+
const o = k * FOLIAGE_INSTANCE_STRIDE;
|
|
98
|
+
if (test(d, o)) {
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
if (n !== k) {
|
|
102
|
+
d.copyWithin(n * FOLIAGE_INSTANCE_STRIDE, o, o + FOLIAGE_INSTANCE_STRIDE);
|
|
103
|
+
}
|
|
104
|
+
n++;
|
|
105
|
+
}
|
|
106
|
+
if (n !== b.count) {
|
|
107
|
+
removed += b.count - n;
|
|
108
|
+
this._count -= b.count - n;
|
|
109
|
+
b.count = n;
|
|
110
|
+
if (n === 0) {
|
|
111
|
+
this._buckets.delete(key);
|
|
112
|
+
}
|
|
113
|
+
touched?.add(key);
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
// Few chunks in the region: look them up; many: walk the existing ones instead
|
|
117
|
+
if ((cx1 - cx0 + 1) * (cz1 - cz0 + 1) <= this._buckets.size) {
|
|
118
|
+
for(let cz = cz0; cz <= cz1; cz++){
|
|
119
|
+
for(let cx = cx0; cx <= cx1; cx++){
|
|
120
|
+
visit(`${cx},${cz}`);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
} else {
|
|
124
|
+
for (const key of [
|
|
125
|
+
...this._buckets.keys()
|
|
126
|
+
]){
|
|
127
|
+
const [cx, cz] = key.split(',').map(Number);
|
|
128
|
+
if (cx >= cx0 && cx <= cx1 && cz >= cz0 && cz <= cz1) {
|
|
129
|
+
visit(key);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return removed;
|
|
134
|
+
}
|
|
135
|
+
/** All instances in one array */ toArray() {
|
|
136
|
+
const out = new Float32Array(this._count * FOLIAGE_INSTANCE_STRIDE);
|
|
137
|
+
let o = 0;
|
|
138
|
+
for (const b of this._buckets.values()){
|
|
139
|
+
out.set(b.data.subarray(0, b.count * FOLIAGE_INSTANCE_STRIDE), o);
|
|
140
|
+
o += b.count * FOLIAGE_INSTANCE_STRIDE;
|
|
141
|
+
}
|
|
142
|
+
return out;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
export { FOLIAGE_INSTANCE_STRIDE, FoliageInstanceBuckets };
|
|
147
|
+
//# sourceMappingURL=foliage_buckets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"foliage_buckets.js","sources":["../../src/scene/foliage_buckets.ts"],"sourcesContent":["/** Number of floats per foliage instance: x, z, y offset, rotation about Y, scale */\r\nexport const FOLIAGE_INSTANCE_STRIDE = 5;\r\n\r\n/** Instances of one chunk */\r\ntype Bucket = { data: Float32Array; count: number };\r\n\r\n/**\r\n * Instances of a foliage layer, kept in buckets by the chunk they stand in, so that changing a\r\n * small area touches only the chunks it overlaps.\r\n * @internal\r\n */\r\nexport class FoliageInstanceBuckets {\r\n private _chunkSize: number;\r\n private _buckets: Map<string, Bucket>;\r\n private _count: number;\r\n constructor(chunkSize: number) {\r\n this._chunkSize = chunkSize;\r\n this._buckets = new Map();\r\n this._count = 0;\r\n }\r\n /** Number of instances */\r\n get count() {\r\n return this._count;\r\n }\r\n /** Keys of the chunks holding instances */\r\n keys() {\r\n return this._buckets.keys();\r\n }\r\n /** Key of the chunk a position stands in */\r\n keyOf(x: number, z: number) {\r\n return `${Math.floor(x / this._chunkSize)},${Math.floor(z / this._chunkSize)}`;\r\n }\r\n /** Instances of a chunk; a view, valid until the bucket changes */\r\n get(key: string) {\r\n const b = this._buckets.get(key);\r\n return b ? b.data.subarray(0, b.count * FOLIAGE_INSTANCE_STRIDE) : null;\r\n }\r\n /**\r\n * Re-sorts the instances into chunks of another size\r\n * @param chunkSize - New chunk edge\r\n */\r\n setChunkSize(chunkSize: number) {\r\n if (chunkSize !== this._chunkSize) {\r\n const all = this.toArray();\r\n this._chunkSize = chunkSize;\r\n this.clear();\r\n this.add(all);\r\n }\r\n }\r\n /** Removes every instance; returns the keys of the chunks that held some */\r\n clear() {\r\n const keys = new Set(this._buckets.keys());\r\n this._buckets.clear();\r\n this._count = 0;\r\n return keys;\r\n }\r\n /**\r\n * Appends instances\r\n * @param data - {@link FOLIAGE_INSTANCE_STRIDE} floats per instance\r\n * @param touched - Receives the keys of the chunks that changed\r\n */\r\n add(data: ArrayLike<number>, touched?: Set<string>) {\r\n const n = Math.floor(data.length / FOLIAGE_INSTANCE_STRIDE);\r\n for (let k = 0; k < n; k++) {\r\n const o = k * FOLIAGE_INSTANCE_STRIDE;\r\n const key = this.keyOf(data[o], data[o + 1]);\r\n let b = this._buckets.get(key);\r\n if (!b) {\r\n b = { data: new Float32Array(16 * FOLIAGE_INSTANCE_STRIDE), count: 0 };\r\n this._buckets.set(key, b);\r\n }\r\n if ((b.count + 1) * FOLIAGE_INSTANCE_STRIDE > b.data.length) {\r\n const grown = new Float32Array(b.data.length * 2);\r\n grown.set(b.data);\r\n b.data = grown;\r\n }\r\n const d = b.count * FOLIAGE_INSTANCE_STRIDE;\r\n for (let c = 0; c < FOLIAGE_INSTANCE_STRIDE; c++) {\r\n b.data[d + c] = data[o + c];\r\n }\r\n b.count++;\r\n this._count++;\r\n touched?.add(key);\r\n }\r\n }\r\n /**\r\n * Removes the instances for which a test is true, from the chunks overlapping a region\r\n * @param region - `[minX, minZ, maxX, maxZ]`; only chunks overlapping it are tested\r\n * @param test - Called with the bucket data and the offset of an instance\r\n * @param touched - Receives the keys of the chunks that changed\r\n * @returns Number of instances removed\r\n */\r\n removeWhere(\r\n region: readonly [number, number, number, number],\r\n test: (d: Float32Array, o: number) => boolean,\r\n touched?: Set<string>\r\n ) {\r\n let removed = 0;\r\n const cs = this._chunkSize;\r\n const cx0 = Math.floor(region[0] / cs);\r\n const cz0 = Math.floor(region[1] / cs);\r\n const cx1 = Math.floor(region[2] / cs);\r\n const cz1 = Math.floor(region[3] / cs);\r\n const visit = (key: string) => {\r\n const b = this._buckets.get(key);\r\n if (!b) {\r\n return;\r\n }\r\n const d = b.data;\r\n let n = 0;\r\n for (let k = 0; k < b.count; k++) {\r\n const o = k * FOLIAGE_INSTANCE_STRIDE;\r\n if (test(d, o)) {\r\n continue;\r\n }\r\n if (n !== k) {\r\n d.copyWithin(n * FOLIAGE_INSTANCE_STRIDE, o, o + FOLIAGE_INSTANCE_STRIDE);\r\n }\r\n n++;\r\n }\r\n if (n !== b.count) {\r\n removed += b.count - n;\r\n this._count -= b.count - n;\r\n b.count = n;\r\n if (n === 0) {\r\n this._buckets.delete(key);\r\n }\r\n touched?.add(key);\r\n }\r\n };\r\n // Few chunks in the region: look them up; many: walk the existing ones instead\r\n if ((cx1 - cx0 + 1) * (cz1 - cz0 + 1) <= this._buckets.size) {\r\n for (let cz = cz0; cz <= cz1; cz++) {\r\n for (let cx = cx0; cx <= cx1; cx++) {\r\n visit(`${cx},${cz}`);\r\n }\r\n }\r\n } else {\r\n for (const key of [...this._buckets.keys()]) {\r\n const [cx, cz] = key.split(',').map(Number);\r\n if (cx >= cx0 && cx <= cx1 && cz >= cz0 && cz <= cz1) {\r\n visit(key);\r\n }\r\n }\r\n }\r\n return removed;\r\n }\r\n /** All instances in one array */\r\n toArray() {\r\n const out = new Float32Array(this._count * FOLIAGE_INSTANCE_STRIDE);\r\n let o = 0;\r\n for (const b of this._buckets.values()) {\r\n out.set(b.data.subarray(0, b.count * FOLIAGE_INSTANCE_STRIDE), o);\r\n o += b.count * FOLIAGE_INSTANCE_STRIDE;\r\n }\r\n return out;\r\n }\r\n}\r\n"],"names":["FOLIAGE_INSTANCE_STRIDE","FoliageInstanceBuckets","_chunkSize","_buckets","_count","chunkSize","Map","count","keys","keyOf","x","z","Math","floor","get","key","b","data","subarray","setChunkSize","all","toArray","clear","add","Set","touched","n","length","k","o","Float32Array","set","grown","d","c","removeWhere","region","test","removed","cs","cx0","cz0","cx1","cz1","visit","copyWithin","delete","size","cz","cx","split","map","Number","out","values"],"mappings":"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"}
|