@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,157 @@
|
|
|
1
|
+
import { Vector3 } from '@zephyr3d/base';
|
|
2
|
+
|
|
3
|
+
/** Number of collision layers. @public */ const PHYSICS_LAYER_COUNT = 16;
|
|
4
|
+
const ALL_LAYERS = (1 << PHYSICS_LAYER_COUNT) - 1;
|
|
5
|
+
/**
|
|
6
|
+
* Physics settings saved with a scene.
|
|
7
|
+
*
|
|
8
|
+
* @remarks
|
|
9
|
+
* Plain data: the scene package does not simulate anything. A physics package
|
|
10
|
+
* reads these when it simulates the scene, and picks up later changes through
|
|
11
|
+
* {@link ScenePhysicsSettings.version}. A scene without settings
|
|
12
|
+
* ({@link Scene.physicsSettings} null) uses the physics package's defaults,
|
|
13
|
+
* which match the defaults here.
|
|
14
|
+
*
|
|
15
|
+
* @public
|
|
16
|
+
*/ class ScenePhysicsSettings {
|
|
17
|
+
_gravity;
|
|
18
|
+
_fixedTimeStep;
|
|
19
|
+
_maxSubSteps;
|
|
20
|
+
_interpolation;
|
|
21
|
+
_waitForCollidersOnStart;
|
|
22
|
+
_layerNames;
|
|
23
|
+
_layerMasks;
|
|
24
|
+
_version;
|
|
25
|
+
constructor(){
|
|
26
|
+
this._gravity = new Vector3(0, -9.81, 0);
|
|
27
|
+
this._fixedTimeStep = 1 / 60;
|
|
28
|
+
this._maxSubSteps = 8;
|
|
29
|
+
this._interpolation = true;
|
|
30
|
+
this._waitForCollidersOnStart = true;
|
|
31
|
+
this._layerNames = Array.from({
|
|
32
|
+
length: PHYSICS_LAYER_COUNT
|
|
33
|
+
}, (_, i)=>ScenePhysicsSettings.defaultLayerName(i));
|
|
34
|
+
this._layerMasks = new Array(PHYSICS_LAYER_COUNT).fill(ALL_LAYERS);
|
|
35
|
+
this._version = 0;
|
|
36
|
+
}
|
|
37
|
+
/** Name a layer has until renamed. */ static defaultLayerName(layer) {
|
|
38
|
+
return layer === 0 ? 'Default' : `Layer ${layer}`;
|
|
39
|
+
}
|
|
40
|
+
/** Increases whenever a setting changes. */ get version() {
|
|
41
|
+
return this._version;
|
|
42
|
+
}
|
|
43
|
+
/** Gravity in m/s². Default (0, -9.81, 0). Returns a copy; assign to change it. */ get gravity() {
|
|
44
|
+
return new Vector3(this._gravity);
|
|
45
|
+
}
|
|
46
|
+
set gravity(value) {
|
|
47
|
+
if (!this._gravity.equalsTo(value)) {
|
|
48
|
+
this._gravity.set(value);
|
|
49
|
+
this._version++;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/** Length of one simulation step, in seconds. Default 1/60. */ get fixedTimeStep() {
|
|
53
|
+
return this._fixedTimeStep;
|
|
54
|
+
}
|
|
55
|
+
set fixedTimeStep(value) {
|
|
56
|
+
value = Math.max(1e-4, value);
|
|
57
|
+
if (value !== this._fixedTimeStep) {
|
|
58
|
+
this._fixedTimeStep = value;
|
|
59
|
+
this._version++;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/** Most simulation steps taken in one frame. Default 8: real time down to 7.5 frames per second at the default step. */ get maxSubSteps() {
|
|
63
|
+
return this._maxSubSteps;
|
|
64
|
+
}
|
|
65
|
+
set maxSubSteps(value) {
|
|
66
|
+
value = Math.max(1, Math.floor(value));
|
|
67
|
+
if (value !== this._maxSubSteps) {
|
|
68
|
+
this._maxSubSteps = value;
|
|
69
|
+
this._version++;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/** Whether moving bodies are drawn between simulation steps. Default true. */ get interpolation() {
|
|
73
|
+
return this._interpolation;
|
|
74
|
+
}
|
|
75
|
+
set interpolation(value) {
|
|
76
|
+
if (!!value !== this._interpolation) {
|
|
77
|
+
this._interpolation = !!value;
|
|
78
|
+
this._version++;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/** Whether the simulation waits for mesh and terrain colliders before starting. Default true. */ get waitForCollidersOnStart() {
|
|
82
|
+
return this._waitForCollidersOnStart;
|
|
83
|
+
}
|
|
84
|
+
set waitForCollidersOnStart(value) {
|
|
85
|
+
if (!!value !== this._waitForCollidersOnStart) {
|
|
86
|
+
this._waitForCollidersOnStart = !!value;
|
|
87
|
+
this._version++;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/** Display name of a layer. */ getLayerName(layer) {
|
|
91
|
+
return this._layerNames[layer] ?? '';
|
|
92
|
+
}
|
|
93
|
+
setLayerName(layer, name) {
|
|
94
|
+
if (layer >= 0 && layer < PHYSICS_LAYER_COUNT && this._layerNames[layer] !== name) {
|
|
95
|
+
this._layerNames[layer] = name;
|
|
96
|
+
this._version++;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/** Whether colliders on layers `a` and `b` collide. All layers collide by default. */ getLayerCollision(a, b) {
|
|
100
|
+
return !!((this._layerMasks[a] ?? 0) & 1 << b);
|
|
101
|
+
}
|
|
102
|
+
/** Sets whether colliders on layers `a` and `b` collide; applies to both orders. */ setLayerCollision(a, b, enabled) {
|
|
103
|
+
if (a < 0 || a >= PHYSICS_LAYER_COUNT || b < 0 || b >= PHYSICS_LAYER_COUNT) {
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
if (this.getLayerCollision(a, b) === !!enabled && this.getLayerCollision(b, a) === !!enabled) {
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
if (enabled) {
|
|
110
|
+
this._layerMasks[a] |= 1 << b;
|
|
111
|
+
this._layerMasks[b] |= 1 << a;
|
|
112
|
+
} else {
|
|
113
|
+
this._layerMasks[a] &= ~(1 << b);
|
|
114
|
+
this._layerMasks[b] &= ~(1 << a);
|
|
115
|
+
}
|
|
116
|
+
this._version++;
|
|
117
|
+
}
|
|
118
|
+
/** Layer names as saved: a JSON array of 16 strings. @internal */ get layerNamesData() {
|
|
119
|
+
return JSON.stringify(this._layerNames);
|
|
120
|
+
}
|
|
121
|
+
set layerNamesData(value) {
|
|
122
|
+
let names;
|
|
123
|
+
try {
|
|
124
|
+
names = JSON.parse(value);
|
|
125
|
+
} catch {
|
|
126
|
+
names = null;
|
|
127
|
+
}
|
|
128
|
+
for(let i = 0; i < PHYSICS_LAYER_COUNT; i++){
|
|
129
|
+
const name = Array.isArray(names) ? names[i] : undefined;
|
|
130
|
+
this.setLayerName(i, typeof name === 'string' ? name : ScenePhysicsSettings.defaultLayerName(i));
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Collision matrix as saved: 16 comma separated masks, bit `b` of mask `a`
|
|
135
|
+
* set when layers `a` and `b` collide. Made symmetric on load: a pair collides
|
|
136
|
+
* if either order says so. @internal
|
|
137
|
+
*/ get layerMatrixData() {
|
|
138
|
+
return this._layerMasks.join(',');
|
|
139
|
+
}
|
|
140
|
+
set layerMatrixData(value) {
|
|
141
|
+
const parts = value.split(',');
|
|
142
|
+
const masks = Array.from({
|
|
143
|
+
length: PHYSICS_LAYER_COUNT
|
|
144
|
+
}, (_, i)=>{
|
|
145
|
+
const n = Number(parts[i]);
|
|
146
|
+
return parts[i] !== undefined && parts[i].trim() !== '' && Number.isFinite(n) ? n & ALL_LAYERS : ALL_LAYERS;
|
|
147
|
+
});
|
|
148
|
+
for(let a = 0; a < PHYSICS_LAYER_COUNT; a++){
|
|
149
|
+
for(let b = a; b < PHYSICS_LAYER_COUNT; b++){
|
|
150
|
+
this.setLayerCollision(a, b, !!(masks[a] >> b & 1) || !!(masks[b] >> a & 1));
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
export { PHYSICS_LAYER_COUNT, ScenePhysicsSettings };
|
|
157
|
+
//# sourceMappingURL=physics_settings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"physics_settings.js","sources":["../../src/scene/physics_settings.ts"],"sourcesContent":["import { Vector3 } from '@zephyr3d/base';\r\n\r\n/** Number of collision layers. @public */\r\nexport const PHYSICS_LAYER_COUNT = 16;\r\nconst ALL_LAYERS = (1 << PHYSICS_LAYER_COUNT) - 1;\r\n\r\n/**\r\n * Physics settings saved with a scene.\r\n *\r\n * @remarks\r\n * Plain data: the scene package does not simulate anything. A physics package\r\n * reads these when it simulates the scene, and picks up later changes through\r\n * {@link ScenePhysicsSettings.version}. A scene without settings\r\n * ({@link Scene.physicsSettings} null) uses the physics package's defaults,\r\n * which match the defaults here.\r\n *\r\n * @public\r\n */\r\nexport class ScenePhysicsSettings {\r\n private readonly _gravity: Vector3;\r\n private _fixedTimeStep: number;\r\n private _maxSubSteps: number;\r\n private _interpolation: boolean;\r\n private _waitForCollidersOnStart: boolean;\r\n private readonly _layerNames: string[];\r\n private readonly _layerMasks: number[];\r\n private _version: number;\r\n constructor() {\r\n this._gravity = new Vector3(0, -9.81, 0);\r\n this._fixedTimeStep = 1 / 60;\r\n this._maxSubSteps = 8;\r\n this._interpolation = true;\r\n this._waitForCollidersOnStart = true;\r\n this._layerNames = Array.from({ length: PHYSICS_LAYER_COUNT }, (_, i) =>\r\n ScenePhysicsSettings.defaultLayerName(i)\r\n );\r\n this._layerMasks = new Array<number>(PHYSICS_LAYER_COUNT).fill(ALL_LAYERS);\r\n this._version = 0;\r\n }\r\n /** Name a layer has until renamed. */\r\n static defaultLayerName(layer: number) {\r\n return layer === 0 ? 'Default' : `Layer ${layer}`;\r\n }\r\n /** Increases whenever a setting changes. */\r\n get version() {\r\n return this._version;\r\n }\r\n /** Gravity in m/s². Default (0, -9.81, 0). Returns a copy; assign to change it. */\r\n get gravity(): Vector3 {\r\n return new Vector3(this._gravity);\r\n }\r\n set gravity(value: Vector3) {\r\n if (!this._gravity.equalsTo(value)) {\r\n this._gravity.set(value);\r\n this._version++;\r\n }\r\n }\r\n /** Length of one simulation step, in seconds. Default 1/60. */\r\n get fixedTimeStep() {\r\n return this._fixedTimeStep;\r\n }\r\n set fixedTimeStep(value: number) {\r\n value = Math.max(1e-4, value);\r\n if (value !== this._fixedTimeStep) {\r\n this._fixedTimeStep = value;\r\n this._version++;\r\n }\r\n }\r\n /** Most simulation steps taken in one frame. Default 8: real time down to 7.5 frames per second at the default step. */\r\n get maxSubSteps() {\r\n return this._maxSubSteps;\r\n }\r\n set maxSubSteps(value: number) {\r\n value = Math.max(1, Math.floor(value));\r\n if (value !== this._maxSubSteps) {\r\n this._maxSubSteps = value;\r\n this._version++;\r\n }\r\n }\r\n /** Whether moving bodies are drawn between simulation steps. Default true. */\r\n get interpolation() {\r\n return this._interpolation;\r\n }\r\n set interpolation(value: boolean) {\r\n if (!!value !== this._interpolation) {\r\n this._interpolation = !!value;\r\n this._version++;\r\n }\r\n }\r\n /** Whether the simulation waits for mesh and terrain colliders before starting. Default true. */\r\n get waitForCollidersOnStart() {\r\n return this._waitForCollidersOnStart;\r\n }\r\n set waitForCollidersOnStart(value: boolean) {\r\n if (!!value !== this._waitForCollidersOnStart) {\r\n this._waitForCollidersOnStart = !!value;\r\n this._version++;\r\n }\r\n }\r\n /** Display name of a layer. */\r\n getLayerName(layer: number) {\r\n return this._layerNames[layer] ?? '';\r\n }\r\n setLayerName(layer: number, name: string) {\r\n if (layer >= 0 && layer < PHYSICS_LAYER_COUNT && this._layerNames[layer] !== name) {\r\n this._layerNames[layer] = name;\r\n this._version++;\r\n }\r\n }\r\n /** Whether colliders on layers `a` and `b` collide. All layers collide by default. */\r\n getLayerCollision(a: number, b: number) {\r\n return !!((this._layerMasks[a] ?? 0) & (1 << b));\r\n }\r\n /** Sets whether colliders on layers `a` and `b` collide; applies to both orders. */\r\n setLayerCollision(a: number, b: number, enabled: boolean) {\r\n if (a < 0 || a >= PHYSICS_LAYER_COUNT || b < 0 || b >= PHYSICS_LAYER_COUNT) {\r\n return;\r\n }\r\n if (this.getLayerCollision(a, b) === !!enabled && this.getLayerCollision(b, a) === !!enabled) {\r\n return;\r\n }\r\n if (enabled) {\r\n this._layerMasks[a] |= 1 << b;\r\n this._layerMasks[b] |= 1 << a;\r\n } else {\r\n this._layerMasks[a] &= ~(1 << b);\r\n this._layerMasks[b] &= ~(1 << a);\r\n }\r\n this._version++;\r\n }\r\n /** Layer names as saved: a JSON array of 16 strings. @internal */\r\n get layerNamesData() {\r\n return JSON.stringify(this._layerNames);\r\n }\r\n set layerNamesData(value: string) {\r\n let names: unknown;\r\n try {\r\n names = JSON.parse(value);\r\n } catch {\r\n names = null;\r\n }\r\n for (let i = 0; i < PHYSICS_LAYER_COUNT; i++) {\r\n const name = Array.isArray(names) ? names[i] : undefined;\r\n this.setLayerName(i, typeof name === 'string' ? name : ScenePhysicsSettings.defaultLayerName(i));\r\n }\r\n }\r\n /**\r\n * Collision matrix as saved: 16 comma separated masks, bit `b` of mask `a`\r\n * set when layers `a` and `b` collide. Made symmetric on load: a pair collides\r\n * if either order says so. @internal\r\n */\r\n get layerMatrixData() {\r\n return this._layerMasks.join(',');\r\n }\r\n set layerMatrixData(value: string) {\r\n const parts = value.split(',');\r\n const masks = Array.from({ length: PHYSICS_LAYER_COUNT }, (_, i) => {\r\n const n = Number(parts[i]);\r\n return parts[i] !== undefined && parts[i].trim() !== '' && Number.isFinite(n)\r\n ? n & ALL_LAYERS\r\n : ALL_LAYERS;\r\n });\r\n for (let a = 0; a < PHYSICS_LAYER_COUNT; a++) {\r\n for (let b = a; b < PHYSICS_LAYER_COUNT; b++) {\r\n this.setLayerCollision(a, b, !!((masks[a] >> b) & 1) || !!((masks[b] >> a) & 1));\r\n }\r\n }\r\n }\r\n}\r\n"],"names":["PHYSICS_LAYER_COUNT","ALL_LAYERS","ScenePhysicsSettings","_gravity","_fixedTimeStep","_maxSubSteps","_interpolation","_waitForCollidersOnStart","_layerNames","_layerMasks","_version","Vector3","Array","from","length","_","i","defaultLayerName","fill","layer","version","gravity","value","equalsTo","set","fixedTimeStep","Math","max","maxSubSteps","floor","interpolation","waitForCollidersOnStart","getLayerName","setLayerName","name","getLayerCollision","a","b","setLayerCollision","enabled","layerNamesData","JSON","stringify","names","parse","isArray","undefined","layerMatrixData","join","parts","split","masks","n","Number","trim","isFinite"],"mappings":"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"}
|
package/dist/scene/scene.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { makeObservable, Disposable, DRef, Vector4, Vector3, Ray
|
|
1
|
+
import { makeObservable, Disposable, DRef, Vector4, Vector3, Ray } from '@zephyr3d/base';
|
|
2
2
|
import { SceneNode } from './scene_node.js';
|
|
3
3
|
import { Octree } from './octree.js';
|
|
4
4
|
import { RaycastVisitor } from './raycast_visitor.js';
|
|
5
5
|
import { Environment } from './environment.js';
|
|
6
6
|
import '../values.js';
|
|
7
|
+
import { getDevice, tryGetApp } from '../app/api.js';
|
|
7
8
|
import '../render/render_queue.js';
|
|
8
|
-
import { getDevice } from '../app/api.js';
|
|
9
9
|
import { SceneRenderer } from '../render/renderer.js';
|
|
10
10
|
import '../render/lightpass.js';
|
|
11
11
|
import '../material/shader/helper.js';
|
|
@@ -13,15 +13,17 @@ import '../render/sky.js';
|
|
|
13
13
|
import '../render/clipmap.js';
|
|
14
14
|
import '../render/envlight.js';
|
|
15
15
|
import '../render/primitive.js';
|
|
16
|
+
import '@zephyr3d/device';
|
|
17
|
+
import '../render/lod.js';
|
|
16
18
|
import '../material/lambert.js';
|
|
17
19
|
import '../material/blinn.js';
|
|
18
20
|
import '../material/unlit.js';
|
|
21
|
+
import '../material/meshmaterial.js';
|
|
19
22
|
import '../material/particle.js';
|
|
20
23
|
import '../material/subsurfaceprofile.js';
|
|
21
|
-
import '../material/
|
|
24
|
+
import '../material/sssprofile.js';
|
|
25
|
+
import '../material/sss.js';
|
|
22
26
|
import '../material/eye.js';
|
|
23
|
-
import '@zephyr3d/device';
|
|
24
|
-
import '../material/meshmaterial.js';
|
|
25
27
|
import '../material/hair.js';
|
|
26
28
|
import '../material/hairstrand.js';
|
|
27
29
|
import '../material/grassmaterial.js';
|
|
@@ -35,9 +37,19 @@ import '../material/sprite_std.js';
|
|
|
35
37
|
import '../utility/blueprint/material/texture.js';
|
|
36
38
|
import '../render/dualdepthpeeling_oit.js';
|
|
37
39
|
import '../shaders/atmosphere.js';
|
|
40
|
+
import '../render/water_interaction.js';
|
|
41
|
+
import { RenderGraphExecutor } from '../render/rendergraph/executor.js';
|
|
38
42
|
import '../render/rendergraph/forward_plus_builder.js';
|
|
39
43
|
import '../render/rendergraph/scene_render_context.js';
|
|
44
|
+
import { SceneSDF } from '../render/sdf/scene_sdf.js';
|
|
45
|
+
import '../render/sdf/global_sdf.js';
|
|
46
|
+
import '../render/gi/voxelize_pass.js';
|
|
47
|
+
import { SceneGI } from '../render/gi/scene_gi.js';
|
|
48
|
+
import { SkinPaletteAtlas } from '../animation/skin_palette_atlas.js';
|
|
49
|
+
import { UpdateQueue } from './update_queue.js';
|
|
50
|
+
import { AnimationBankTrack } from '../animation/animation_bank.js';
|
|
40
51
|
import { ScriptAttachment, normalizeScriptAttachmentConfig, normalizeScriptAttachments } from './script_attachment.js';
|
|
52
|
+
import { getPhysicsWorldFactory } from '../physics/world.js';
|
|
41
53
|
|
|
42
54
|
/**
|
|
43
55
|
* Represents a renderable world that manages scene graph, spatial indexing, and environment.
|
|
@@ -65,16 +77,24 @@ import { ScriptAttachment, normalizeScriptAttachmentConfig, normalizeScriptAttac
|
|
|
65
77
|
* Populated by {@link Scene.invalidateNodePlacement} and drained by {@link Scene.updateNodePlacement}.
|
|
66
78
|
*/ _nodePlaceList;
|
|
67
79
|
/** @internal Environment data (sky/light/IBL). */ _env;
|
|
80
|
+
/** @internal */ _sdf;
|
|
81
|
+
/** @internal */ _gi;
|
|
68
82
|
/** @internal Frame counter that last updated this scene. */ _updateFrame;
|
|
69
83
|
/** @internal Unique scene ID. */ _id;
|
|
70
|
-
/**
|
|
84
|
+
/**
|
|
85
|
+
* @internal One-shot per-frame update queue (runs before render). Thousands of nodes may
|
|
86
|
+
* re-queue themselves every frame, so duplicates are told by a stamp on the node
|
|
87
|
+
*/ _nodeUpdateQueue;
|
|
71
88
|
/** @internal */ _drawableUpdateQueue;
|
|
72
89
|
/** @internal One-shot per-frame-per-camera update queue. */ _perCameraUpdateQueue;
|
|
73
90
|
/** @internal Main camera reference. */ _mainCamera;
|
|
74
91
|
/** @internal Arbitrary metadata loaded with the scene (optional). */ _metaData;
|
|
92
|
+
/** @internal Physics settings saved with the scene (optional). */ _physicsSettings;
|
|
93
|
+
_physicsWorld;
|
|
75
94
|
/** @internal Lighting unit model used by this scene. */ _lightingMode;
|
|
76
95
|
/** @internal Number of physical meters represented by one scene unit. */ _metersPerUnit;
|
|
77
96
|
/** @internal User-attached script entries (engine-defined). */ _scripts;
|
|
97
|
+
/** @internal Virtual texture users updated by every camera rendering this scene. */ _virtualTextureClients;
|
|
78
98
|
/**
|
|
79
99
|
* Creates an instance of Scene.
|
|
80
100
|
*
|
|
@@ -91,20 +111,43 @@ import { ScriptAttachment, normalizeScriptAttachmentConfig, normalizeScriptAttac
|
|
|
91
111
|
this._name = name ?? '';
|
|
92
112
|
this._octree = new Octree(this, 8, 8);
|
|
93
113
|
this._nodePlaceList = new Set();
|
|
94
|
-
this._nodeUpdateQueue =
|
|
95
|
-
|
|
96
|
-
this.
|
|
114
|
+
this._nodeUpdateQueue = new UpdateQueue((node)=>node._updateQueueStamp, (node, stamp)=>node._updateQueueStamp = stamp);
|
|
115
|
+
// Drawables made without mixinDrawable get the field on first use
|
|
116
|
+
this._drawableUpdateQueue = new UpdateQueue((drawable)=>drawable._drawableQueueStamp, (drawable, stamp)=>drawable._drawableQueueStamp = stamp);
|
|
117
|
+
this._perCameraUpdateQueue = new UpdateQueue((node)=>node._perCameraQueueStamp, (node, stamp)=>node._perCameraQueueStamp = stamp);
|
|
97
118
|
this._env = new Environment();
|
|
119
|
+
this._sdf = null;
|
|
120
|
+
this._gi = null;
|
|
98
121
|
this._updateFrame = -1;
|
|
99
122
|
this._rootNode = new DRef();
|
|
100
123
|
this._rootNode.set(new SceneNode(this));
|
|
101
124
|
this._rootNode.get().name = 'Root';
|
|
102
125
|
this._metaData = null;
|
|
126
|
+
this._physicsSettings = null;
|
|
127
|
+
this._physicsWorld = null;
|
|
103
128
|
this._lightingMode = 'legacy';
|
|
104
129
|
this._metersPerUnit = 1;
|
|
105
130
|
this._scripts = [];
|
|
131
|
+
this._virtualTextureClients = [];
|
|
106
132
|
this._mainCamera = new DRef();
|
|
107
133
|
}
|
|
134
|
+
/** Virtual texture users updated by every camera rendering this scene. */ get virtualTextureClients() {
|
|
135
|
+
return this._virtualTextureClients;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Registers a virtual texture user. Every camera rendering the scene then updates and fills
|
|
139
|
+
* its pages between the depth prepass and the light pass. WebGPU only.
|
|
140
|
+
*/ addVirtualTextureClient(client) {
|
|
141
|
+
if (!this._virtualTextureClients.includes(client)) {
|
|
142
|
+
this._virtualTextureClients.push(client);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
/** Unregisters a virtual texture user. The client keeps ownership of its texture. */ removeVirtualTextureClient(client) {
|
|
146
|
+
const index = this._virtualTextureClients.indexOf(client);
|
|
147
|
+
if (index >= 0) {
|
|
148
|
+
this._virtualTextureClients.splice(index, 1);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
108
151
|
/**
|
|
109
152
|
* Gets the unique identifier of the scene.
|
|
110
153
|
*/ get id() {
|
|
@@ -154,6 +197,18 @@ import { ScriptAttachment, normalizeScriptAttachmentConfig, normalizeScriptAttac
|
|
|
154
197
|
*/ get env() {
|
|
155
198
|
return this._env;
|
|
156
199
|
}
|
|
200
|
+
/** Signed distance field data of the scene, off until enabled. */ get sdf() {
|
|
201
|
+
if (!this._sdf) {
|
|
202
|
+
this._sdf = new SceneSDF(this);
|
|
203
|
+
}
|
|
204
|
+
return this._sdf;
|
|
205
|
+
}
|
|
206
|
+
/** Global illumination of the scene, off until enabled. */ get gi() {
|
|
207
|
+
if (!this._gi) {
|
|
208
|
+
this._gi = new SceneGI(this);
|
|
209
|
+
}
|
|
210
|
+
return this._gi;
|
|
211
|
+
}
|
|
157
212
|
/** Lighting unit model. Legacy remains the default for backward compatibility. */ get lightingMode() {
|
|
158
213
|
return this._lightingMode;
|
|
159
214
|
}
|
|
@@ -190,6 +245,58 @@ import { ScriptAttachment, normalizeScriptAttachmentConfig, normalizeScriptAttac
|
|
|
190
245
|
this._metaData = val;
|
|
191
246
|
}
|
|
192
247
|
/**
|
|
248
|
+
* Physics settings of the scene, or null to use the physics package's
|
|
249
|
+
* defaults. Only scenes simulated with a physics package need them.
|
|
250
|
+
*/ get physicsSettings() {
|
|
251
|
+
return this._physicsSettings;
|
|
252
|
+
}
|
|
253
|
+
set physicsSettings(val) {
|
|
254
|
+
this._physicsSettings = val ?? null;
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* The physics simulation of this scene, or null when no physics
|
|
258
|
+
* implementation is loaded.
|
|
259
|
+
*
|
|
260
|
+
* @remarks
|
|
261
|
+
* Created the first time it is needed - when a node with physics data
|
|
262
|
+
* ({@link SceneNode.physics}) enters the scene, or when this is read - by the
|
|
263
|
+
* implementation loaded with `initPhysics`. See {@link Scene.setPhysicsWorld}
|
|
264
|
+
* to give the scene one directly.
|
|
265
|
+
*/ get physicsWorld() {
|
|
266
|
+
if (!this._physicsWorld && !this.disposed) {
|
|
267
|
+
const factory = getPhysicsWorldFactory();
|
|
268
|
+
if (factory) {
|
|
269
|
+
this._physicsWorld = factory(this);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
return this._physicsWorld;
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Gives the scene a physics world, replacing and disposing the current one;
|
|
276
|
+
* null removes it until it is next needed.
|
|
277
|
+
*
|
|
278
|
+
* @remarks
|
|
279
|
+
* The physics data of the scene's nodes moves to the new world.
|
|
280
|
+
*/ setPhysicsWorld(world) {
|
|
281
|
+
const current = this._physicsWorld;
|
|
282
|
+
if (current === (world ?? null)) {
|
|
283
|
+
return;
|
|
284
|
+
}
|
|
285
|
+
if (world && world.scene !== this) {
|
|
286
|
+
throw new Error('The physics world belongs to another scene.');
|
|
287
|
+
}
|
|
288
|
+
this.rootNode.iterate((node)=>{
|
|
289
|
+
node.physics?._hostDetached();
|
|
290
|
+
});
|
|
291
|
+
this._physicsWorld = world ?? null;
|
|
292
|
+
current?.dispose();
|
|
293
|
+
if (world) {
|
|
294
|
+
this.rootNode.iterate((node)=>{
|
|
295
|
+
node.physics?._hostAttached();
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
193
300
|
* Attached script filename or identifier (engine-specific).
|
|
194
301
|
*
|
|
195
302
|
* @remarks
|
|
@@ -327,8 +434,9 @@ import { ScriptAttachment, normalizeScriptAttachmentConfig, normalizeScriptAttac
|
|
|
327
434
|
* - To update continuously each frame, call `queueUpdateNode(this)` from within the node's `update` method.
|
|
328
435
|
* - Duplicate scheduling within the same frame is prevented.
|
|
329
436
|
*/ queueUpdateNode(node) {
|
|
330
|
-
|
|
331
|
-
|
|
437
|
+
// Only nodes of this scene, so a node waits in one update queue at most, as its stamp assumes
|
|
438
|
+
if (node && node.scene === this) {
|
|
439
|
+
this._nodeUpdateQueue.add(node);
|
|
332
440
|
}
|
|
333
441
|
}
|
|
334
442
|
/**
|
|
@@ -341,8 +449,8 @@ import { ScriptAttachment, normalizeScriptAttachmentConfig, normalizeScriptAttac
|
|
|
341
449
|
* - To update continuously each frame, call `queueUpdateDrawable(this)` from within the drawable's `updateState` method.
|
|
342
450
|
* - Duplicate scheduling within the same frame is prevented.
|
|
343
451
|
*/ queueUpdateDrawable(drawable) {
|
|
344
|
-
if (drawable &&
|
|
345
|
-
this._drawableUpdateQueue.
|
|
452
|
+
if (drawable && drawable.getNode()?.scene === this) {
|
|
453
|
+
this._drawableUpdateQueue.add(drawable);
|
|
346
454
|
}
|
|
347
455
|
}
|
|
348
456
|
/**
|
|
@@ -357,8 +465,8 @@ import { ScriptAttachment, normalizeScriptAttachmentConfig, normalizeScriptAttac
|
|
|
357
465
|
* - To run per-camera work continuously, re-queue from `updatePerCamera`.
|
|
358
466
|
* - Duplicate scheduling within the same frame is prevented.
|
|
359
467
|
*/ queuePerCameraUpdateNode(node) {
|
|
360
|
-
if (node &&
|
|
361
|
-
this._perCameraUpdateQueue.
|
|
468
|
+
if (node && node.scene === this) {
|
|
469
|
+
this._perCameraUpdateQueue.add(node);
|
|
362
470
|
}
|
|
363
471
|
}
|
|
364
472
|
/**
|
|
@@ -412,38 +520,66 @@ import { ScriptAttachment, normalizeScriptAttachmentConfig, normalizeScriptAttac
|
|
|
412
520
|
* - Ensure this runs only once per frame (via `frameInfo.frameCounter`).
|
|
413
521
|
* - Update environment light synchronization.
|
|
414
522
|
* - Dispatch `update` event.
|
|
523
|
+
* - Update the main camera's controller if its `updatePhase` is `'early'`.
|
|
415
524
|
* - Drain the one-shot node update queue and call `node.update(...)`.
|
|
525
|
+
* - Dispatch `afterupdate` event; a physics world steps here.
|
|
526
|
+
* - Call scripts' `onLateUpdate`, then update the main camera's controller if its
|
|
527
|
+
* `updatePhase` is `'late'`, then dispatch `lateupdate` event.
|
|
416
528
|
* - Apply pending octree placement updates.
|
|
417
529
|
*
|
|
418
530
|
*/ frameUpdate() {
|
|
419
531
|
const frameInfo = getDevice().frameInfo;
|
|
420
532
|
if (frameInfo.frameCounter !== this._updateFrame) {
|
|
421
533
|
this._updateFrame = frameInfo.frameCounter;
|
|
534
|
+
this._env.wind.update(frameInfo.elapsedFrame * 0.001);
|
|
422
535
|
this.updateEnvLight();
|
|
536
|
+
const deltaInSeconds = frameInfo.elapsedFrame * 0.001;
|
|
423
537
|
this.dispatchEvent('update', this);
|
|
424
|
-
this.mainCamera?.updateController();
|
|
425
|
-
if (this._nodeUpdateQueue.
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
538
|
+
this.mainCamera?.updateController(deltaInSeconds, 'early');
|
|
539
|
+
if (this._nodeUpdateQueue.size > 0 || this._drawableUpdateQueue.size > 0) {
|
|
540
|
+
RenderGraphExecutor.profileScope('SceneUpdate', ()=>{
|
|
541
|
+
if (this._nodeUpdateQueue.size > 0) {
|
|
542
|
+
const elapsedInSeconds = frameInfo.elapsedOverall * 0.001;
|
|
543
|
+
// Nodes queued while draining are updated next frame
|
|
544
|
+
for (const node of this._nodeUpdateQueue.take()){
|
|
545
|
+
if (!node.disposed && node.attached) {
|
|
546
|
+
node.update(frameInfo.frameCounter, elapsedInSeconds, deltaInSeconds);
|
|
547
|
+
}
|
|
548
|
+
}
|
|
435
549
|
}
|
|
436
|
-
|
|
437
|
-
|
|
550
|
+
if (this._drawableUpdateQueue.size > 0) {
|
|
551
|
+
for (const drawable of this._drawableUpdateQueue.take()){
|
|
552
|
+
drawable.updateState();
|
|
553
|
+
}
|
|
554
|
+
}
|
|
555
|
+
});
|
|
438
556
|
}
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
557
|
+
this.dispatchEvent('afterupdate', this);
|
|
558
|
+
tryGetApp()?.engine?.lateUpdate(deltaInSeconds, (host)=>host === this || host instanceof SceneNode && host.scene === this);
|
|
559
|
+
this.mainCamera?.updateController(deltaInSeconds, 'late');
|
|
560
|
+
this.dispatchEvent('lateupdate', this);
|
|
561
|
+
this.updateNodePlacement(this._octree, this._nodePlaceList);
|
|
562
|
+
const camera = this.mainCamera;
|
|
563
|
+
if (camera && (this._gi?.enabled || this._sdf?.enabled)) {
|
|
564
|
+
const cameraPos = camera.getWorldPosition();
|
|
565
|
+
// The voxel scene feeds the field's compositing, so it goes first
|
|
566
|
+
if (this._gi?.enabled) {
|
|
567
|
+
RenderGraphExecutor.profileScope('GIVoxelize', ()=>this._gi.update(cameraPos, deltaInSeconds));
|
|
568
|
+
}
|
|
569
|
+
if (this._sdf?.enabled) {
|
|
570
|
+
RenderGraphExecutor.profileScope('SceneSDF', ()=>this._sdf.update(cameraPos, deltaInSeconds));
|
|
571
|
+
}
|
|
572
|
+
// Lighting reads what the field just composited
|
|
573
|
+
if (this._gi?.enabled) {
|
|
574
|
+
RenderGraphExecutor.profileScope('GILighting', ()=>this._gi.updateLighting(camera));
|
|
442
575
|
}
|
|
443
|
-
this._drawableUpdateQueue = [];
|
|
444
576
|
}
|
|
445
|
-
this.updateNodePlacement(this._octree, this._nodePlaceList);
|
|
446
577
|
}
|
|
578
|
+
// Palettes written by animation updates are uploaded once all nodes and bank tracks are updated
|
|
579
|
+
RenderGraphExecutor.profileScope('Animation', ()=>{
|
|
580
|
+
AnimationBankTrack.updateAll(getDevice().frameInfo.elapsedFrame * 0.001);
|
|
581
|
+
SkinPaletteAtlas.flushPending();
|
|
582
|
+
});
|
|
447
583
|
}
|
|
448
584
|
/**
|
|
449
585
|
* Performs per-camera scene updates for the current frame.
|
|
@@ -454,19 +590,20 @@ import { ScriptAttachment, normalizeScriptAttachmentConfig, normalizeScriptAttac
|
|
|
454
590
|
*
|
|
455
591
|
* @param camera - The camera being updated for.
|
|
456
592
|
*/ frameUpdatePerCamera(camera) {
|
|
457
|
-
if (this._perCameraUpdateQueue.
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
}
|
|
593
|
+
if (this._perCameraUpdateQueue.size > 0) {
|
|
594
|
+
RenderGraphExecutor.profileScope('SceneUpdatePerCamera', ()=>{
|
|
595
|
+
const frameInfo = getDevice().frameInfo;
|
|
596
|
+
const elapsedInSeconds = frameInfo.elapsedOverall * 0.001;
|
|
597
|
+
const deltaInSeconds = frameInfo.elapsedFrame * 0.001;
|
|
598
|
+
for (const node of this._perCameraUpdateQueue.take()){
|
|
599
|
+
if (!node.disposed) {
|
|
600
|
+
node.updatePerCamera(camera, elapsedInSeconds, deltaInSeconds);
|
|
601
|
+
}
|
|
602
|
+
}
|
|
603
|
+
});
|
|
468
604
|
}
|
|
469
605
|
this.updateNodePlacement(this._octree, this._nodePlaceList);
|
|
606
|
+
SkinPaletteAtlas.flushPending();
|
|
470
607
|
}
|
|
471
608
|
/**
|
|
472
609
|
* Applies placement changes for nodes in `list` to the given `octree`.
|
|
@@ -507,9 +644,18 @@ import { ScriptAttachment, normalizeScriptAttachmentConfig, normalizeScriptAttac
|
|
|
507
644
|
* - Main camera reference wrapper
|
|
508
645
|
*
|
|
509
646
|
*/ onDispose() {
|
|
647
|
+
this._nodeUpdateQueue.clear();
|
|
648
|
+
this._drawableUpdateQueue.clear();
|
|
649
|
+
this._perCameraUpdateQueue.clear();
|
|
510
650
|
this._env.dispose();
|
|
651
|
+
this._gi?.dispose();
|
|
652
|
+
this._gi = null;
|
|
653
|
+
this._sdf?.dispose();
|
|
654
|
+
this._sdf = null;
|
|
511
655
|
this._rootNode.dispose();
|
|
512
656
|
this._mainCamera.dispose();
|
|
657
|
+
this._physicsWorld?.dispose();
|
|
658
|
+
this._physicsWorld = null;
|
|
513
659
|
}
|
|
514
660
|
}
|
|
515
661
|
|