@zephyr3d/scene 0.9.27 → 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 +54 -0
- 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 +279 -55
- 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 +171 -1
- 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 +104 -178
- 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 +25436 -15990
- package/dist/index.js +65 -11
- 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/lambert.js +4 -1
- package/dist/material/lambert.js.map +1 -1
- package/dist/material/material.js +66 -4
- 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 +191 -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 +333 -191
- 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 +1261 -1438
- 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 +106 -106
- package/dist/posteffect/motionblur.js.map +1 -1
- package/dist/posteffect/postsss.js +572 -0
- package/dist/posteffect/postsss.js.map +1 -0
- package/dist/posteffect/sao.js +2 -6
- 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 +4 -13
- 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 +3 -2
- package/dist/render/abuffer_oit.js.map +1 -1
- package/dist/render/clipmap.js +179 -64
- 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 +25 -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 +5 -5
- 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 +5 -10
- package/dist/render/fbm_wavegenerator.js.map +1 -1
- package/dist/render/fft_wavegenerator.js +247 -157
- package/dist/render/fft_wavegenerator.js.map +1 -1
- package/dist/render/gerstner_wavegenerator.js +16 -38
- 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/instance_culling.js +499 -0
- package/dist/render/instance_culling.js.map +1 -0
- package/dist/render/lightpass.js +19 -8
- 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/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 +162 -11
- package/dist/render/render_queue.js.map +1 -1
- package/dist/render/renderer.js +10 -7
- package/dist/render/renderer.js.map +1 -1
- package/dist/render/rendergraph/blackboard.js +14 -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 +272 -55
- package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
- package/dist/render/rendergraph/frame_graph_context.js +41 -0
- package/dist/render/rendergraph/frame_graph_context.js.map +1 -0
- 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 +58 -158
- package/dist/render/underwater.js.map +1 -1
- 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 +134 -319
- package/dist/render/water_caustics.js.map +1 -1
- 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 +3 -3
- 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 +633 -268
- 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/ssgi.js +63 -0
- package/dist/shaders/ssgi.js.map +1 -0
- package/dist/shaders/ssgi_reprojection.js +118 -0
- package/dist/shaders/ssgi_reprojection.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 +32 -82
- package/dist/shaders/water.js.map +1 -1
- package/dist/shaders/water_medium.js +7 -21
- package/dist/shaders/water_medium.js.map +1 -1
- 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 +40 -2
- 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 +34 -6
- package/dist/utility/serialization/manager.js.map +1 -1
- package/dist/utility/serialization/scene/animation.js +46 -5
- 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 +87 -254
- 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 +1543 -264
- package/dist/utility/serialization/scene/water.js.map +1 -1
- package/dist/utility/serialization/types.js.map +1 -1
- package/dist/utility/shprojector.js +10 -22
- 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
- package/dist/animation/joint_dynamics/convex_collider.js +0 -320
- package/dist/animation/joint_dynamics/convex_collider.js.map +0 -1
|
@@ -0,0 +1,358 @@
|
|
|
1
|
+
/** Cells along each side of a {@link FoliageDensityMask} tile */ const FOLIAGE_MASK_TILE_SIZE = 64;
|
|
2
|
+
/** Key of a tile from its integer tile coordinates */ function tileKey(tx, tz) {
|
|
3
|
+
return `${tx},${tz}`;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Where a {@link FoliageLayer} grows, and how densely: a value from 0 to 1 per square cell of the
|
|
7
|
+
* plane of the foliage system, painted with the foliage brush.
|
|
8
|
+
*
|
|
9
|
+
* @remarks
|
|
10
|
+
* Cells are stored in square tiles of {@link FOLIAGE_MASK_TILE_SIZE} cells, and only tiles
|
|
11
|
+
* holding a non-zero value exist, so the mask covers an unbounded plane at the cost of what was
|
|
12
|
+
* painted. Values are kept in steps of 1/255.
|
|
13
|
+
*
|
|
14
|
+
* Cell `(i, j)` covers `[i, i + 1) × [j, j + 1)` cell sizes; its value is at its centre, and
|
|
15
|
+
* {@link FoliageDensityMask.sample} interpolates between centres.
|
|
16
|
+
* @public
|
|
17
|
+
*/ class FoliageDensityMask {
|
|
18
|
+
_cellSize;
|
|
19
|
+
_tiles;
|
|
20
|
+
/**
|
|
21
|
+
* Creates an empty mask
|
|
22
|
+
* @param cellSize - Edge of a cell, in meters
|
|
23
|
+
*/ constructor(cellSize = 1){
|
|
24
|
+
this._cellSize = Math.max(1e-3, cellSize);
|
|
25
|
+
this._tiles = new Map();
|
|
26
|
+
}
|
|
27
|
+
/** Edge of a cell, in meters. Changing it keeps the cell values, so what was painted scales. */ get cellSize() {
|
|
28
|
+
return this._cellSize;
|
|
29
|
+
}
|
|
30
|
+
set cellSize(val) {
|
|
31
|
+
this._cellSize = Math.max(1e-3, val);
|
|
32
|
+
}
|
|
33
|
+
/** Number of tiles holding painted cells */ get numTiles() {
|
|
34
|
+
return this._tiles.size;
|
|
35
|
+
}
|
|
36
|
+
/** Whether nothing is painted */ get empty() {
|
|
37
|
+
return this._tiles.size === 0;
|
|
38
|
+
}
|
|
39
|
+
/** Clears every cell */ clear() {
|
|
40
|
+
this._tiles.clear();
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Value of a cell, 0 to 1
|
|
44
|
+
* @param i - Cell column
|
|
45
|
+
* @param j - Cell row
|
|
46
|
+
*/ getCell(i, j) {
|
|
47
|
+
const n = FOLIAGE_MASK_TILE_SIZE;
|
|
48
|
+
const tx = Math.floor(i / n);
|
|
49
|
+
const tz = Math.floor(j / n);
|
|
50
|
+
const tile = this._tiles.get(tileKey(tx, tz));
|
|
51
|
+
return tile ? tile[(j - tz * n) * n + (i - tx * n)] / 255 : 0;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Sets the value of a cell
|
|
55
|
+
* @param i - Cell column
|
|
56
|
+
* @param j - Cell row
|
|
57
|
+
* @param value - New value, clamped to 0..1
|
|
58
|
+
*/ setCell(i, j, value) {
|
|
59
|
+
const n = FOLIAGE_MASK_TILE_SIZE;
|
|
60
|
+
const tx = Math.floor(i / n);
|
|
61
|
+
const tz = Math.floor(j / n);
|
|
62
|
+
const key = tileKey(tx, tz);
|
|
63
|
+
const v = Math.round(Math.min(1, Math.max(0, value)) * 255);
|
|
64
|
+
let tile = this._tiles.get(key);
|
|
65
|
+
if (!tile) {
|
|
66
|
+
if (v === 0) {
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
tile = new Uint8Array(n * n);
|
|
70
|
+
this._tiles.set(key, tile);
|
|
71
|
+
}
|
|
72
|
+
tile[(j - tz * n) * n + (i - tx * n)] = v;
|
|
73
|
+
if (v === 0 && tile.every((c)=>c === 0)) {
|
|
74
|
+
this._tiles.delete(key);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* The density at a point, interpolated between the centres of the cells around it
|
|
79
|
+
* @param x - Position x, local to the foliage system
|
|
80
|
+
* @param z - Position z, local to the foliage system
|
|
81
|
+
*/ sample(x, z) {
|
|
82
|
+
const fx = x / this._cellSize - 0.5;
|
|
83
|
+
const fz = z / this._cellSize - 0.5;
|
|
84
|
+
const i = Math.floor(fx);
|
|
85
|
+
const j = Math.floor(fz);
|
|
86
|
+
const u = fx - i;
|
|
87
|
+
const v = fz - j;
|
|
88
|
+
const a = this.getCell(i, j);
|
|
89
|
+
const b = this.getCell(i + 1, j);
|
|
90
|
+
const c = this.getCell(i, j + 1);
|
|
91
|
+
const d = this.getCell(i + 1, j + 1);
|
|
92
|
+
return (a * (1 - u) + b * u) * (1 - v) + (c * (1 - u) + d * u) * v;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Changes the cells within a circle, weighted by a falloff from the centre
|
|
96
|
+
*
|
|
97
|
+
* @remarks
|
|
98
|
+
* Each cell whose centre lies within the circle becomes
|
|
99
|
+
* `clamp(old + amount × weight)`, where weight is 1 at the centre and falls smoothly to 0 at
|
|
100
|
+
* the edge over the outer `falloff` fraction of the radius. A negative amount erases.
|
|
101
|
+
*
|
|
102
|
+
* @param x - Circle centre x, local to the foliage system
|
|
103
|
+
* @param z - Circle centre z, local to the foliage system
|
|
104
|
+
* @param radius - Circle radius
|
|
105
|
+
* @param amount - Change at full weight, -1 to 1
|
|
106
|
+
* @param falloff - Fraction of the radius over which the weight falls to 0, 0 to 1
|
|
107
|
+
* @returns The changed region `[minX, minZ, maxX, maxZ]`, local, or null when nothing changed
|
|
108
|
+
*/ paintCircle(x, z, radius, amount, falloff = 0.5) {
|
|
109
|
+
if (!(radius > 0) || amount === 0) {
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
const cs = this._cellSize;
|
|
113
|
+
const i0 = Math.floor((x - radius) / cs);
|
|
114
|
+
const i1 = Math.floor((x + radius) / cs);
|
|
115
|
+
const j0 = Math.floor((z - radius) / cs);
|
|
116
|
+
const j1 = Math.floor((z + radius) / cs);
|
|
117
|
+
let changed = false;
|
|
118
|
+
for(let j = j0; j <= j1; j++){
|
|
119
|
+
for(let i = i0; i <= i1; i++){
|
|
120
|
+
const w = foliageBrushWeight(Math.hypot((i + 0.5) * cs - x, (j + 0.5) * cs - z) / radius, falloff);
|
|
121
|
+
if (w <= 0) {
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
const old = this.getCell(i, j);
|
|
125
|
+
const next = Math.min(1, Math.max(0, old + amount * w));
|
|
126
|
+
if (Math.round(next * 255) !== Math.round(old * 255)) {
|
|
127
|
+
this.setCell(i, j, next);
|
|
128
|
+
changed = true;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return changed ? this.cellRegion(i0, j0, i1, j1) : null;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Moves the cells within a circle towards a density, by the brush weight: a cell at full
|
|
136
|
+
* weight becomes `value`, one at the soft edge moves part of the way
|
|
137
|
+
* @param x - Circle centre x, local to the foliage system
|
|
138
|
+
* @param z - Circle centre z, local to the foliage system
|
|
139
|
+
* @param radius - Circle radius
|
|
140
|
+
* @param value - Target density, 0 to 1
|
|
141
|
+
* @param falloff - Fraction of the radius over which the weight falls to 0, 0 to 1
|
|
142
|
+
* @returns The changed region `[minX, minZ, maxX, maxZ]`, local, or null when nothing changed
|
|
143
|
+
*/ blendCircle(x, z, radius, value, falloff = 0.5) {
|
|
144
|
+
if (!(radius > 0)) {
|
|
145
|
+
return null;
|
|
146
|
+
}
|
|
147
|
+
const target = Math.min(1, Math.max(0, value));
|
|
148
|
+
const cs = this._cellSize;
|
|
149
|
+
const i0 = Math.floor((x - radius) / cs);
|
|
150
|
+
const i1 = Math.floor((x + radius) / cs);
|
|
151
|
+
const j0 = Math.floor((z - radius) / cs);
|
|
152
|
+
const j1 = Math.floor((z + radius) / cs);
|
|
153
|
+
let changed = false;
|
|
154
|
+
for(let j = j0; j <= j1; j++){
|
|
155
|
+
for(let i = i0; i <= i1; i++){
|
|
156
|
+
const w = foliageBrushWeight(Math.hypot((i + 0.5) * cs - x, (j + 0.5) * cs - z) / radius, falloff);
|
|
157
|
+
if (w <= 0) {
|
|
158
|
+
continue;
|
|
159
|
+
}
|
|
160
|
+
const old = this.getCell(i, j);
|
|
161
|
+
const next = old + (target - old) * w;
|
|
162
|
+
if (Math.round(next * 255) !== Math.round(old * 255)) {
|
|
163
|
+
this.setCell(i, j, next);
|
|
164
|
+
changed = true;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
return changed ? this.cellRegion(i0, j0, i1, j1) : null;
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Sets every cell whose centre lies within a circle
|
|
172
|
+
* @param x - Circle centre x, local to the foliage system
|
|
173
|
+
* @param z - Circle centre z, local to the foliage system
|
|
174
|
+
* @param radius - Circle radius
|
|
175
|
+
* @param value - New value, 0 to 1
|
|
176
|
+
* @returns The changed region `[minX, minZ, maxX, maxZ]`, local, or null when nothing changed
|
|
177
|
+
*/ fillCircle(x, z, radius, value) {
|
|
178
|
+
if (!(radius > 0)) {
|
|
179
|
+
return null;
|
|
180
|
+
}
|
|
181
|
+
const cs = this._cellSize;
|
|
182
|
+
const i0 = Math.floor((x - radius) / cs);
|
|
183
|
+
const i1 = Math.floor((x + radius) / cs);
|
|
184
|
+
const j0 = Math.floor((z - radius) / cs);
|
|
185
|
+
const j1 = Math.floor((z + radius) / cs);
|
|
186
|
+
const r2 = radius * radius;
|
|
187
|
+
let changed = false;
|
|
188
|
+
for(let j = j0; j <= j1; j++){
|
|
189
|
+
for(let i = i0; i <= i1; i++){
|
|
190
|
+
const dx = (i + 0.5) * cs - x;
|
|
191
|
+
const dz = (j + 0.5) * cs - z;
|
|
192
|
+
if (dx * dx + dz * dz > r2) {
|
|
193
|
+
continue;
|
|
194
|
+
}
|
|
195
|
+
if (Math.round(this.getCell(i, j) * 255) !== Math.round(Math.min(1, Math.max(0, value)) * 255)) {
|
|
196
|
+
this.setCell(i, j, value);
|
|
197
|
+
changed = true;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
return changed ? this.cellRegion(i0, j0, i1, j1) : null;
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Region of the plane the painted tiles cover, `[minX, minZ, maxX, maxZ]` local to the
|
|
205
|
+
* foliage system, or null when nothing is painted
|
|
206
|
+
*/ getBounds() {
|
|
207
|
+
if (this._tiles.size === 0) {
|
|
208
|
+
return null;
|
|
209
|
+
}
|
|
210
|
+
let tx0 = Infinity;
|
|
211
|
+
let tz0 = Infinity;
|
|
212
|
+
let tx1 = -Infinity;
|
|
213
|
+
let tz1 = -Infinity;
|
|
214
|
+
for (const key of this._tiles.keys()){
|
|
215
|
+
const [tx, tz] = key.split(',').map(Number);
|
|
216
|
+
tx0 = Math.min(tx0, tx);
|
|
217
|
+
tz0 = Math.min(tz0, tz);
|
|
218
|
+
tx1 = Math.max(tx1, tx);
|
|
219
|
+
tz1 = Math.max(tz1, tz);
|
|
220
|
+
}
|
|
221
|
+
const n = FOLIAGE_MASK_TILE_SIZE;
|
|
222
|
+
return this.cellRegion(tx0 * n, tz0 * n, tx1 * n + n - 1, tz1 * n + n - 1);
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Regions of the plane the painted tiles cover, one `[minX, minZ, maxX, maxZ]` per tile
|
|
226
|
+
*/ getTileRegions() {
|
|
227
|
+
const n = FOLIAGE_MASK_TILE_SIZE;
|
|
228
|
+
const out = [];
|
|
229
|
+
for (const key of this._tiles.keys()){
|
|
230
|
+
const [tx, tz] = key.split(',').map(Number);
|
|
231
|
+
out.push(this.cellRegion(tx * n, tz * n, tx * n + n - 1, tz * n + n - 1));
|
|
232
|
+
}
|
|
233
|
+
return out;
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* The tiles touching a region, for undo: tile coordinates and a copy of the cells, null for
|
|
237
|
+
* a tile that does not exist
|
|
238
|
+
* @param region - `[minX, minZ, maxX, maxZ]`, local to the foliage system
|
|
239
|
+
*/ copyTiles(region) {
|
|
240
|
+
const out = [];
|
|
241
|
+
for (const [tx, tz] of this.tilesInRegion(region)){
|
|
242
|
+
const tile = this._tiles.get(tileKey(tx, tz));
|
|
243
|
+
out.push({
|
|
244
|
+
tx,
|
|
245
|
+
tz,
|
|
246
|
+
cells: tile ? tile.slice() : null
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
return out;
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Puts back tiles copied with {@link FoliageDensityMask.copyTiles}
|
|
253
|
+
* @param tiles - The copies
|
|
254
|
+
*/ restoreTiles(tiles) {
|
|
255
|
+
for (const { tx, tz, cells } of tiles){
|
|
256
|
+
if (cells && cells.some((c)=>c !== 0)) {
|
|
257
|
+
this._tiles.set(tileKey(tx, tz), cells.slice());
|
|
258
|
+
} else {
|
|
259
|
+
this._tiles.delete(tileKey(tx, tz));
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
/** Tile coordinates of the tiles touching a region */ tilesInRegion(region) {
|
|
264
|
+
const span = this._cellSize * FOLIAGE_MASK_TILE_SIZE;
|
|
265
|
+
const tx0 = Math.floor(region[0] / span);
|
|
266
|
+
const tz0 = Math.floor(region[1] / span);
|
|
267
|
+
const tx1 = Math.floor(region[2] / span);
|
|
268
|
+
const tz1 = Math.floor(region[3] / span);
|
|
269
|
+
const out = [];
|
|
270
|
+
for(let tz = tz0; tz <= tz1; tz++){
|
|
271
|
+
for(let tx = tx0; tx <= tx1; tx++){
|
|
272
|
+
out.push([
|
|
273
|
+
tx,
|
|
274
|
+
tz
|
|
275
|
+
]);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
return out;
|
|
279
|
+
}
|
|
280
|
+
/** Byte size of {@link FoliageDensityMask.write} */ get byteSize() {
|
|
281
|
+
const n = FOLIAGE_MASK_TILE_SIZE;
|
|
282
|
+
return 4 + this._tiles.size * (8 + n * n);
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Writes the tiles: their count, then per tile its coordinates as two int32 and its cells
|
|
286
|
+
* @param view - Destination
|
|
287
|
+
* @param offset - Byte offset to write at
|
|
288
|
+
* @returns Byte offset after the data
|
|
289
|
+
*/ write(view, offset) {
|
|
290
|
+
const n = FOLIAGE_MASK_TILE_SIZE;
|
|
291
|
+
view.setUint32(offset, this._tiles.size, true);
|
|
292
|
+
offset += 4;
|
|
293
|
+
// In a fixed order, so the same mask always writes the same bytes
|
|
294
|
+
const keys = [
|
|
295
|
+
...this._tiles.keys()
|
|
296
|
+
].sort();
|
|
297
|
+
for (const key of keys){
|
|
298
|
+
const [tx, tz] = key.split(',').map(Number);
|
|
299
|
+
view.setInt32(offset, tx, true);
|
|
300
|
+
view.setInt32(offset + 4, tz, true);
|
|
301
|
+
offset += 8;
|
|
302
|
+
new Uint8Array(view.buffer, view.byteOffset + offset, n * n).set(this._tiles.get(key));
|
|
303
|
+
offset += n * n;
|
|
304
|
+
}
|
|
305
|
+
return offset;
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Replaces the tiles with ones written by {@link FoliageDensityMask.write}
|
|
309
|
+
* @param view - Source
|
|
310
|
+
* @param offset - Byte offset to read at
|
|
311
|
+
* @returns Byte offset after the data
|
|
312
|
+
*/ read(view, offset) {
|
|
313
|
+
const n = FOLIAGE_MASK_TILE_SIZE;
|
|
314
|
+
this._tiles.clear();
|
|
315
|
+
const count = view.getUint32(offset, true);
|
|
316
|
+
offset += 4;
|
|
317
|
+
for(let k = 0; k < count; k++){
|
|
318
|
+
const tx = view.getInt32(offset, true);
|
|
319
|
+
const tz = view.getInt32(offset + 4, true);
|
|
320
|
+
offset += 8;
|
|
321
|
+
const cells = new Uint8Array(view.buffer, view.byteOffset + offset, n * n).slice();
|
|
322
|
+
offset += n * n;
|
|
323
|
+
if (cells.some((c)=>c !== 0)) {
|
|
324
|
+
this._tiles.set(tileKey(tx, tz), cells);
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
return offset;
|
|
328
|
+
}
|
|
329
|
+
/** Region covered by an inclusive range of cells */ cellRegion(i0, j0, i1, j1) {
|
|
330
|
+
const cs = this._cellSize;
|
|
331
|
+
return [
|
|
332
|
+
i0 * cs,
|
|
333
|
+
j0 * cs,
|
|
334
|
+
(i1 + 1) * cs,
|
|
335
|
+
(j1 + 1) * cs
|
|
336
|
+
];
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* Weight of the foliage brush at a distance from its centre: 1 up to `1 - falloff` of the radius,
|
|
341
|
+
* then falling smoothly to 0 at the edge
|
|
342
|
+
* @param t - Distance from the centre over the radius
|
|
343
|
+
* @param falloff - Fraction of the radius over which the weight falls, 0 to 1
|
|
344
|
+
* @public
|
|
345
|
+
*/ function foliageBrushWeight(t, falloff) {
|
|
346
|
+
if (t >= 1) {
|
|
347
|
+
return 0;
|
|
348
|
+
}
|
|
349
|
+
const f = Math.min(1, Math.max(0, falloff));
|
|
350
|
+
if (f <= 0 || t <= 1 - f) {
|
|
351
|
+
return 1;
|
|
352
|
+
}
|
|
353
|
+
const s = (1 - t) / f;
|
|
354
|
+
return s * s * (3 - 2 * s);
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
export { FOLIAGE_MASK_TILE_SIZE, FoliageDensityMask, foliageBrushWeight };
|
|
358
|
+
//# sourceMappingURL=foliage_mask.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"foliage_mask.js","sources":["../../src/scene/foliage_mask.ts"],"sourcesContent":["/** Cells along each side of a {@link FoliageDensityMask} tile */\r\nexport const FOLIAGE_MASK_TILE_SIZE = 64;\r\n\r\n/** Key of a tile from its integer tile coordinates */\r\nfunction tileKey(tx: number, tz: number) {\r\n return `${tx},${tz}`;\r\n}\r\n\r\n/**\r\n * Where a {@link FoliageLayer} grows, and how densely: a value from 0 to 1 per square cell of the\r\n * plane of the foliage system, painted with the foliage brush.\r\n *\r\n * @remarks\r\n * Cells are stored in square tiles of {@link FOLIAGE_MASK_TILE_SIZE} cells, and only tiles\r\n * holding a non-zero value exist, so the mask covers an unbounded plane at the cost of what was\r\n * painted. Values are kept in steps of 1/255.\r\n *\r\n * Cell `(i, j)` covers `[i, i + 1) × [j, j + 1)` cell sizes; its value is at its centre, and\r\n * {@link FoliageDensityMask.sample} interpolates between centres.\r\n * @public\r\n */\r\nexport class FoliageDensityMask {\r\n private _cellSize: number;\r\n private readonly _tiles: Map<string, Uint8Array>;\r\n /**\r\n * Creates an empty mask\r\n * @param cellSize - Edge of a cell, in meters\r\n */\r\n constructor(cellSize = 1) {\r\n this._cellSize = Math.max(1e-3, cellSize);\r\n this._tiles = new Map();\r\n }\r\n /** Edge of a cell, in meters. Changing it keeps the cell values, so what was painted scales. */\r\n get cellSize() {\r\n return this._cellSize;\r\n }\r\n set cellSize(val: number) {\r\n this._cellSize = Math.max(1e-3, val);\r\n }\r\n /** Number of tiles holding painted cells */\r\n get numTiles() {\r\n return this._tiles.size;\r\n }\r\n /** Whether nothing is painted */\r\n get empty() {\r\n return this._tiles.size === 0;\r\n }\r\n /** Clears every cell */\r\n clear() {\r\n this._tiles.clear();\r\n }\r\n /**\r\n * Value of a cell, 0 to 1\r\n * @param i - Cell column\r\n * @param j - Cell row\r\n */\r\n getCell(i: number, j: number) {\r\n const n = FOLIAGE_MASK_TILE_SIZE;\r\n const tx = Math.floor(i / n);\r\n const tz = Math.floor(j / n);\r\n const tile = this._tiles.get(tileKey(tx, tz));\r\n return tile ? tile[(j - tz * n) * n + (i - tx * n)] / 255 : 0;\r\n }\r\n /**\r\n * Sets the value of a cell\r\n * @param i - Cell column\r\n * @param j - Cell row\r\n * @param value - New value, clamped to 0..1\r\n */\r\n setCell(i: number, j: number, value: number) {\r\n const n = FOLIAGE_MASK_TILE_SIZE;\r\n const tx = Math.floor(i / n);\r\n const tz = Math.floor(j / n);\r\n const key = tileKey(tx, tz);\r\n const v = Math.round(Math.min(1, Math.max(0, value)) * 255);\r\n let tile = this._tiles.get(key);\r\n if (!tile) {\r\n if (v === 0) {\r\n return;\r\n }\r\n tile = new Uint8Array(n * n);\r\n this._tiles.set(key, tile);\r\n }\r\n tile[(j - tz * n) * n + (i - tx * n)] = v;\r\n if (v === 0 && tile.every((c) => c === 0)) {\r\n this._tiles.delete(key);\r\n }\r\n }\r\n /**\r\n * The density at a point, interpolated between the centres of the cells around it\r\n * @param x - Position x, local to the foliage system\r\n * @param z - Position z, local to the foliage system\r\n */\r\n sample(x: number, z: number) {\r\n const fx = x / this._cellSize - 0.5;\r\n const fz = z / this._cellSize - 0.5;\r\n const i = Math.floor(fx);\r\n const j = Math.floor(fz);\r\n const u = fx - i;\r\n const v = fz - j;\r\n const a = this.getCell(i, j);\r\n const b = this.getCell(i + 1, j);\r\n const c = this.getCell(i, j + 1);\r\n const d = this.getCell(i + 1, j + 1);\r\n return (a * (1 - u) + b * u) * (1 - v) + (c * (1 - u) + d * u) * v;\r\n }\r\n /**\r\n * Changes the cells within a circle, weighted by a falloff from the centre\r\n *\r\n * @remarks\r\n * Each cell whose centre lies within the circle becomes\r\n * `clamp(old + amount × weight)`, where weight is 1 at the centre and falls smoothly to 0 at\r\n * the edge over the outer `falloff` fraction of the radius. A negative amount erases.\r\n *\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 amount - Change at full weight, -1 to 1\r\n * @param falloff - Fraction of the radius over which the weight falls to 0, 0 to 1\r\n * @returns The changed region `[minX, minZ, maxX, maxZ]`, local, or null when nothing changed\r\n */\r\n paintCircle(\r\n x: number,\r\n z: number,\r\n radius: number,\r\n amount: number,\r\n falloff = 0.5\r\n ): [number, number, number, number] | null {\r\n if (!(radius > 0) || amount === 0) {\r\n return null;\r\n }\r\n const cs = this._cellSize;\r\n const i0 = Math.floor((x - radius) / cs);\r\n const i1 = Math.floor((x + radius) / cs);\r\n const j0 = Math.floor((z - radius) / cs);\r\n const j1 = Math.floor((z + radius) / cs);\r\n let changed = false;\r\n for (let j = j0; j <= j1; j++) {\r\n for (let i = i0; i <= i1; i++) {\r\n const w = foliageBrushWeight(Math.hypot((i + 0.5) * cs - x, (j + 0.5) * cs - z) / radius, falloff);\r\n if (w <= 0) {\r\n continue;\r\n }\r\n const old = this.getCell(i, j);\r\n const next = Math.min(1, Math.max(0, old + amount * w));\r\n if (Math.round(next * 255) !== Math.round(old * 255)) {\r\n this.setCell(i, j, next);\r\n changed = true;\r\n }\r\n }\r\n }\r\n return changed ? this.cellRegion(i0, j0, i1, j1) : null;\r\n }\r\n /**\r\n * Moves the cells within a circle towards a density, by the brush weight: a cell at full\r\n * weight becomes `value`, one at the soft edge moves part of the way\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 value - Target density, 0 to 1\r\n * @param falloff - Fraction of the radius over which the weight falls to 0, 0 to 1\r\n * @returns The changed region `[minX, minZ, maxX, maxZ]`, local, or null when nothing changed\r\n */\r\n blendCircle(\r\n x: number,\r\n z: number,\r\n radius: number,\r\n value: number,\r\n falloff = 0.5\r\n ): [number, number, number, number] | null {\r\n if (!(radius > 0)) {\r\n return null;\r\n }\r\n const target = Math.min(1, Math.max(0, value));\r\n const cs = this._cellSize;\r\n const i0 = Math.floor((x - radius) / cs);\r\n const i1 = Math.floor((x + radius) / cs);\r\n const j0 = Math.floor((z - radius) / cs);\r\n const j1 = Math.floor((z + radius) / cs);\r\n let changed = false;\r\n for (let j = j0; j <= j1; j++) {\r\n for (let i = i0; i <= i1; i++) {\r\n const w = foliageBrushWeight(Math.hypot((i + 0.5) * cs - x, (j + 0.5) * cs - z) / radius, falloff);\r\n if (w <= 0) {\r\n continue;\r\n }\r\n const old = this.getCell(i, j);\r\n const next = old + (target - old) * w;\r\n if (Math.round(next * 255) !== Math.round(old * 255)) {\r\n this.setCell(i, j, next);\r\n changed = true;\r\n }\r\n }\r\n }\r\n return changed ? this.cellRegion(i0, j0, i1, j1) : null;\r\n }\r\n /**\r\n * Sets every cell whose centre lies within a circle\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 value - New value, 0 to 1\r\n * @returns The changed region `[minX, minZ, maxX, maxZ]`, local, or null when nothing changed\r\n */\r\n fillCircle(x: number, z: number, radius: number, value: number): [number, number, number, number] | null {\r\n if (!(radius > 0)) {\r\n return null;\r\n }\r\n const cs = this._cellSize;\r\n const i0 = Math.floor((x - radius) / cs);\r\n const i1 = Math.floor((x + radius) / cs);\r\n const j0 = Math.floor((z - radius) / cs);\r\n const j1 = Math.floor((z + radius) / cs);\r\n const r2 = radius * radius;\r\n let changed = false;\r\n for (let j = j0; j <= j1; j++) {\r\n for (let i = i0; i <= i1; i++) {\r\n const dx = (i + 0.5) * cs - x;\r\n const dz = (j + 0.5) * cs - z;\r\n if (dx * dx + dz * dz > r2) {\r\n continue;\r\n }\r\n if (Math.round(this.getCell(i, j) * 255) !== Math.round(Math.min(1, Math.max(0, value)) * 255)) {\r\n this.setCell(i, j, value);\r\n changed = true;\r\n }\r\n }\r\n }\r\n return changed ? this.cellRegion(i0, j0, i1, j1) : null;\r\n }\r\n /**\r\n * Region of the plane the painted tiles cover, `[minX, minZ, maxX, maxZ]` local to the\r\n * foliage system, or null when nothing is painted\r\n */\r\n getBounds(): [number, number, number, number] | null {\r\n if (this._tiles.size === 0) {\r\n return null;\r\n }\r\n let tx0 = Infinity;\r\n let tz0 = Infinity;\r\n let tx1 = -Infinity;\r\n let tz1 = -Infinity;\r\n for (const key of this._tiles.keys()) {\r\n const [tx, tz] = key.split(',').map(Number);\r\n tx0 = Math.min(tx0, tx);\r\n tz0 = Math.min(tz0, tz);\r\n tx1 = Math.max(tx1, tx);\r\n tz1 = Math.max(tz1, tz);\r\n }\r\n const n = FOLIAGE_MASK_TILE_SIZE;\r\n return this.cellRegion(tx0 * n, tz0 * n, tx1 * n + n - 1, tz1 * n + n - 1);\r\n }\r\n /**\r\n * Regions of the plane the painted tiles cover, one `[minX, minZ, maxX, maxZ]` per tile\r\n */\r\n getTileRegions(): [number, number, number, number][] {\r\n const n = FOLIAGE_MASK_TILE_SIZE;\r\n const out: [number, number, number, number][] = [];\r\n for (const key of this._tiles.keys()) {\r\n const [tx, tz] = key.split(',').map(Number);\r\n out.push(this.cellRegion(tx * n, tz * n, tx * n + n - 1, tz * n + n - 1));\r\n }\r\n return out;\r\n }\r\n /**\r\n * The tiles touching a region, for undo: tile coordinates and a copy of the cells, null for\r\n * a tile that does not exist\r\n * @param region - `[minX, minZ, maxX, maxZ]`, local to the foliage system\r\n */\r\n copyTiles(region: readonly [number, number, number, number]) {\r\n const out: { tx: number; tz: number; cells: Uint8Array | null }[] = [];\r\n for (const [tx, tz] of this.tilesInRegion(region)) {\r\n const tile = this._tiles.get(tileKey(tx, tz));\r\n out.push({ tx, tz, cells: tile ? tile.slice() : null });\r\n }\r\n return out;\r\n }\r\n /**\r\n * Puts back tiles copied with {@link FoliageDensityMask.copyTiles}\r\n * @param tiles - The copies\r\n */\r\n restoreTiles(tiles: readonly { tx: number; tz: number; cells: Uint8Array | null }[]) {\r\n for (const { tx, tz, cells } of tiles) {\r\n if (cells && cells.some((c) => c !== 0)) {\r\n this._tiles.set(tileKey(tx, tz), cells.slice());\r\n } else {\r\n this._tiles.delete(tileKey(tx, tz));\r\n }\r\n }\r\n }\r\n /** Tile coordinates of the tiles touching a region */\r\n tilesInRegion(region: readonly [number, number, number, number]): [number, number][] {\r\n const span = this._cellSize * FOLIAGE_MASK_TILE_SIZE;\r\n const tx0 = Math.floor(region[0] / span);\r\n const tz0 = Math.floor(region[1] / span);\r\n const tx1 = Math.floor(region[2] / span);\r\n const tz1 = Math.floor(region[3] / span);\r\n const out: [number, number][] = [];\r\n for (let tz = tz0; tz <= tz1; tz++) {\r\n for (let tx = tx0; tx <= tx1; tx++) {\r\n out.push([tx, tz]);\r\n }\r\n }\r\n return out;\r\n }\r\n /** Byte size of {@link FoliageDensityMask.write} */\r\n get byteSize() {\r\n const n = FOLIAGE_MASK_TILE_SIZE;\r\n return 4 + this._tiles.size * (8 + n * n);\r\n }\r\n /**\r\n * Writes the tiles: their count, then per tile its coordinates as two int32 and its cells\r\n * @param view - Destination\r\n * @param offset - Byte offset to write at\r\n * @returns Byte offset after the data\r\n */\r\n write(view: DataView, offset: number) {\r\n const n = FOLIAGE_MASK_TILE_SIZE;\r\n view.setUint32(offset, this._tiles.size, true);\r\n offset += 4;\r\n // In a fixed order, so the same mask always writes the same bytes\r\n const keys = [...this._tiles.keys()].sort();\r\n for (const key of keys) {\r\n const [tx, tz] = key.split(',').map(Number);\r\n view.setInt32(offset, tx, true);\r\n view.setInt32(offset + 4, tz, true);\r\n offset += 8;\r\n new Uint8Array(view.buffer, view.byteOffset + offset, n * n).set(this._tiles.get(key)!);\r\n offset += n * n;\r\n }\r\n return offset;\r\n }\r\n /**\r\n * Replaces the tiles with ones written by {@link FoliageDensityMask.write}\r\n * @param view - Source\r\n * @param offset - Byte offset to read at\r\n * @returns Byte offset after the data\r\n */\r\n read(view: DataView, offset: number) {\r\n const n = FOLIAGE_MASK_TILE_SIZE;\r\n this._tiles.clear();\r\n const count = view.getUint32(offset, true);\r\n offset += 4;\r\n for (let k = 0; k < count; k++) {\r\n const tx = view.getInt32(offset, true);\r\n const tz = view.getInt32(offset + 4, true);\r\n offset += 8;\r\n const cells = new Uint8Array(view.buffer, view.byteOffset + offset, n * n).slice();\r\n offset += n * n;\r\n if (cells.some((c) => c !== 0)) {\r\n this._tiles.set(tileKey(tx, tz), cells);\r\n }\r\n }\r\n return offset;\r\n }\r\n /** Region covered by an inclusive range of cells */\r\n private cellRegion(i0: number, j0: number, i1: number, j1: number): [number, number, number, number] {\r\n const cs = this._cellSize;\r\n return [i0 * cs, j0 * cs, (i1 + 1) * cs, (j1 + 1) * cs];\r\n }\r\n}\r\n\r\n/**\r\n * Weight of the foliage brush at a distance from its centre: 1 up to `1 - falloff` of the radius,\r\n * then falling smoothly to 0 at the edge\r\n * @param t - Distance from the centre over the radius\r\n * @param falloff - Fraction of the radius over which the weight falls, 0 to 1\r\n * @public\r\n */\r\nexport function foliageBrushWeight(t: number, falloff: number) {\r\n if (t >= 1) {\r\n return 0;\r\n }\r\n const f = Math.min(1, Math.max(0, falloff));\r\n if (f <= 0 || t <= 1 - f) {\r\n return 1;\r\n }\r\n const s = (1 - t) / f;\r\n return s * s * (3 - 2 * s);\r\n}\r\n"],"names":["FOLIAGE_MASK_TILE_SIZE","tileKey","tx","tz","FoliageDensityMask","_cellSize","_tiles","cellSize","Math","max","Map","val","numTiles","size","empty","clear","getCell","i","j","n","floor","tile","get","setCell","value","key","v","round","min","Uint8Array","set","every","c","delete","sample","x","z","fx","fz","u","a","b","d","paintCircle","radius","amount","falloff","cs","i0","i1","j0","j1","changed","w","foliageBrushWeight","hypot","old","next","cellRegion","blendCircle","target","fillCircle","r2","dx","dz","getBounds","tx0","Infinity","tz0","tx1","tz1","keys","split","map","Number","getTileRegions","out","push","copyTiles","region","tilesInRegion","cells","slice","restoreTiles","tiles","some","span","byteSize","write","view","offset","setUint32","sort","setInt32","buffer","byteOffset","read","count","getUint32","k","getInt32","t","f","s"],"mappings":"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"}
|
package/dist/scene/hair.js
CHANGED
|
@@ -2,19 +2,21 @@ import { applyMixins, DRef, Vector3 } from '@zephyr3d/base';
|
|
|
2
2
|
import { GraphNode } from './graph_node.js';
|
|
3
3
|
import { mixinDrawable } from '../render/drawable_mixin.js';
|
|
4
4
|
import { QUEUE_OPAQUE } from '../values.js';
|
|
5
|
-
import '../render/render_queue.js';
|
|
6
5
|
import { getEngine } from '../app/api.js';
|
|
6
|
+
import { warnUnsupported } from '../utility/unsupported.js';
|
|
7
|
+
import '../render/render_queue.js';
|
|
7
8
|
import { Primitive } from '../render/primitive.js';
|
|
8
9
|
import '@zephyr3d/device';
|
|
9
10
|
import '../material/shader/helper.js';
|
|
10
11
|
import '../material/lambert.js';
|
|
11
12
|
import '../material/blinn.js';
|
|
12
13
|
import '../material/unlit.js';
|
|
14
|
+
import '../material/meshmaterial.js';
|
|
13
15
|
import '../material/particle.js';
|
|
14
16
|
import '../material/subsurfaceprofile.js';
|
|
15
|
-
import '../material/
|
|
17
|
+
import '../material/sssprofile.js';
|
|
18
|
+
import '../material/sss.js';
|
|
16
19
|
import '../material/eye.js';
|
|
17
|
-
import '../material/meshmaterial.js';
|
|
18
20
|
import '../material/hair.js';
|
|
19
21
|
import { HairStrandMaterial } from '../material/hairstrand.js';
|
|
20
22
|
import { HairStrandData } from '../material/hairstrand_data.js';
|
|
@@ -32,9 +34,14 @@ import '../render/lightpass.js';
|
|
|
32
34
|
import '../render/sky.js';
|
|
33
35
|
import '../render/clipmap.js';
|
|
34
36
|
import '../render/envlight.js';
|
|
37
|
+
import '../render/lod.js';
|
|
35
38
|
import '../render/dualdepthpeeling_oit.js';
|
|
36
39
|
import '../shaders/atmosphere.js';
|
|
40
|
+
import '../render/water_interaction.js';
|
|
37
41
|
import '../render/rendergraph/scene_render_context.js';
|
|
42
|
+
import '../render/sdf/scene_sdf.js';
|
|
43
|
+
import '../render/sdf/global_sdf.js';
|
|
44
|
+
import '../render/gi/voxelize_pass.js';
|
|
38
45
|
import { isHairSimulationSupported, GPUHairSimulation } from '../animation/hair/gpu_hair_simulation.js';
|
|
39
46
|
import { parseZHair } from '../asset/loaders/zhair/zhair_format.js';
|
|
40
47
|
import { mergeHairStrandSources, loadZHairStrandSources } from '../asset/loaders/zhair/zhair_loader.js';
|
|
@@ -851,7 +858,11 @@ import { BoundingBox } from '../utility/bounding_volume.js';
|
|
|
851
858
|
*/ _createSimulation() {
|
|
852
859
|
this._disposeSimulation();
|
|
853
860
|
const data = this._strands.get();
|
|
854
|
-
if (!data || !this._source
|
|
861
|
+
if (!data || !this._source) {
|
|
862
|
+
return;
|
|
863
|
+
}
|
|
864
|
+
if (!isHairSimulationSupported()) {
|
|
865
|
+
warnUnsupported('Hair strand dynamics (Hair.simulationEnabled)', 'WebGPU', 'strands stay in their rest pose');
|
|
855
866
|
return;
|
|
856
867
|
}
|
|
857
868
|
const simulation = new GPUHairSimulation(data, this._source, this._simulationOptions);
|