@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,317 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lattice period of the wind noise, in noise cells. The scroll offsets and the evolution
|
|
3
|
+
* coordinate wrap at this period, so they never lose float precision however long the scene runs.
|
|
4
|
+
*/ const NOISE_PERIOD = 256;
|
|
5
|
+
/**
|
|
6
|
+
* How fast the noise evolves in place, in noise cells per noise cell scrolled. Without it the gust
|
|
7
|
+
* pattern would slide along rigidly; with it the gusts form and fade as they travel.
|
|
8
|
+
*/ const GUST_EVOLUTION = 0.35;
|
|
9
|
+
const DETAIL_EVOLUTION = 0.7;
|
|
10
|
+
/**
|
|
11
|
+
* Period of the wind clock, in seconds. Oscillations driven by it (grass sway) jump once per
|
|
12
|
+
* period, which keeps float precision of the phase good for the whole period.
|
|
13
|
+
*/ const CLOCK_PERIOD = 86400;
|
|
14
|
+
/** Number of vec4 in the shader parameters of one frame, see WindField.shaderParams */ const PARAMS_PER_FRAME = 4;
|
|
15
|
+
/**
|
|
16
|
+
* Integer lattice hash shared by the CPU and GPU paths (same mixing as the grass placement hash).
|
|
17
|
+
* Inputs are lattice coordinates already wrapped into [0, NOISE_PERIOD).
|
|
18
|
+
*/ function latticeHash(x, y, z) {
|
|
19
|
+
let h = Math.imul(x, 0x27d4eb2d) ^ Math.imul(y, 0x165667b1) ^ Math.imul(z, 0x9e3779b9) | 0;
|
|
20
|
+
h = Math.imul(h ^ h >>> 15, 0x85ebca6b);
|
|
21
|
+
h = Math.imul(h ^ h >>> 13, 0xc2b2ae35);
|
|
22
|
+
h ^= h >>> 16;
|
|
23
|
+
return h >>> 0;
|
|
24
|
+
}
|
|
25
|
+
/** Gradient selection of Ken Perlin's improved noise (Perlin, "Improving Noise", SIGGRAPH 2002) */ function grad(h, x, y, z) {
|
|
26
|
+
h &= 15;
|
|
27
|
+
const u = h < 8 ? x : y;
|
|
28
|
+
const v = h < 4 ? y : h === 12 || h === 14 ? x : z;
|
|
29
|
+
return (h & 1 ? -u : u) + (h & 2 ? -v : v);
|
|
30
|
+
}
|
|
31
|
+
function fade(t) {
|
|
32
|
+
return t * t * t * (t * (t * 6 - 15) + 10);
|
|
33
|
+
}
|
|
34
|
+
function wrap(i) {
|
|
35
|
+
return i & NOISE_PERIOD - 1;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* 3D gradient noise in roughly [-1, 1], periodic with NOISE_PERIOD on every axis.
|
|
39
|
+
* @internal
|
|
40
|
+
*/ function windNoise3(x, y, z) {
|
|
41
|
+
const fx = Math.floor(x);
|
|
42
|
+
const fy = Math.floor(y);
|
|
43
|
+
const fz = Math.floor(z);
|
|
44
|
+
const x0 = wrap(fx);
|
|
45
|
+
const y0 = wrap(fy);
|
|
46
|
+
const z0 = wrap(fz);
|
|
47
|
+
const x1 = wrap(fx + 1);
|
|
48
|
+
const y1 = wrap(fy + 1);
|
|
49
|
+
const z1 = wrap(fz + 1);
|
|
50
|
+
const dx = x - fx;
|
|
51
|
+
const dy = y - fy;
|
|
52
|
+
const dz = z - fz;
|
|
53
|
+
const u = fade(dx);
|
|
54
|
+
const v = fade(dy);
|
|
55
|
+
const w = fade(dz);
|
|
56
|
+
const lerp = (a, b, t)=>a + (b - a) * t;
|
|
57
|
+
const n000 = grad(latticeHash(x0, y0, z0), dx, dy, dz);
|
|
58
|
+
const n100 = grad(latticeHash(x1, y0, z0), dx - 1, dy, dz);
|
|
59
|
+
const n010 = grad(latticeHash(x0, y1, z0), dx, dy - 1, dz);
|
|
60
|
+
const n110 = grad(latticeHash(x1, y1, z0), dx - 1, dy - 1, dz);
|
|
61
|
+
const n001 = grad(latticeHash(x0, y0, z1), dx, dy, dz - 1);
|
|
62
|
+
const n101 = grad(latticeHash(x1, y0, z1), dx - 1, dy, dz - 1);
|
|
63
|
+
const n011 = grad(latticeHash(x0, y1, z1), dx, dy - 1, dz - 1);
|
|
64
|
+
const n111 = grad(latticeHash(x1, y1, z1), dx - 1, dy - 1, dz - 1);
|
|
65
|
+
return lerp(lerp(lerp(n000, n100, u), lerp(n010, n110, u), v), lerp(lerp(n001, n101, u), lerp(n011, n111, u), v), w);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Scene-wide wind.
|
|
69
|
+
*
|
|
70
|
+
* The model follows Ghost of Tsushima (Rockenbeck, "Blowing from the West", GDC 2021; Wohllaib,
|
|
71
|
+
* "Procedural Grass in Ghost of Tsushima", GDC 2021): a single wind direction, and a push
|
|
72
|
+
* strength that varies from place to place with time-varying Perlin noise scrolled along the
|
|
73
|
+
* wind, so gusts can be seen travelling across fields. A second, finer noise layer adds the high
|
|
74
|
+
* frequency part. The talks do not give how the noise is shaped, so the push here is
|
|
75
|
+
*
|
|
76
|
+
* push = strength * max(0, 1 + gustStrength * gustNoise + detailStrength * detailNoise)
|
|
77
|
+
*
|
|
78
|
+
* with both noises in about [-1, 1].
|
|
79
|
+
*
|
|
80
|
+
* Systems that react to the wind (grass, foliage, particles...) sample it either on the CPU with
|
|
81
|
+
* {@link WindField.sample} or in shaders with {@link WindField.shaderPush}, using the parameters
|
|
82
|
+
* of {@link WindField.shaderParams}. Those carry the current and the previous frame, so a vertex
|
|
83
|
+
* shader can place a vertex where it was last frame and output a correct motion vector.
|
|
84
|
+
*
|
|
85
|
+
* @public
|
|
86
|
+
*/ class WindField {
|
|
87
|
+
_direction;
|
|
88
|
+
_strength;
|
|
89
|
+
_speed;
|
|
90
|
+
_gustStrength;
|
|
91
|
+
_gustScale;
|
|
92
|
+
_detailStrength;
|
|
93
|
+
_detailScale;
|
|
94
|
+
/** Scroll offsets and evolution coordinates, in noise cells, wrapped to the noise period */ _gust;
|
|
95
|
+
_detail;
|
|
96
|
+
/** vec4[2 * PARAMS_PER_FRAME]: current frame then previous frame */ _params;
|
|
97
|
+
_hasPrev;
|
|
98
|
+
_time;
|
|
99
|
+
/** @internal */ constructor(){
|
|
100
|
+
this._direction = 0;
|
|
101
|
+
this._strength = 0.3;
|
|
102
|
+
this._speed = 4;
|
|
103
|
+
this._gustStrength = 0.6;
|
|
104
|
+
this._gustScale = 30;
|
|
105
|
+
this._detailStrength = 0.25;
|
|
106
|
+
this._detailScale = 4;
|
|
107
|
+
this._gust = new Float64Array(3);
|
|
108
|
+
this._detail = new Float64Array(3);
|
|
109
|
+
this._params = new Float32Array(8 * PARAMS_PER_FRAME);
|
|
110
|
+
this._hasPrev = false;
|
|
111
|
+
this._time = 0;
|
|
112
|
+
this.writeParams(0);
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Direction the wind blows toward, in degrees on the ground plane. 0 blows toward +X,
|
|
116
|
+
* 90 toward +Z.
|
|
117
|
+
*/ get direction() {
|
|
118
|
+
return this._direction;
|
|
119
|
+
}
|
|
120
|
+
set direction(val) {
|
|
121
|
+
this._direction = val;
|
|
122
|
+
this.writeParams(0);
|
|
123
|
+
}
|
|
124
|
+
/** Overall push of the wind. 0 is calm air. */ get strength() {
|
|
125
|
+
return this._strength;
|
|
126
|
+
}
|
|
127
|
+
set strength(val) {
|
|
128
|
+
this._strength = Math.max(0, val);
|
|
129
|
+
this.writeParams(0);
|
|
130
|
+
}
|
|
131
|
+
/** Speed at which the gusts travel along the wind, in world units per second */ get speed() {
|
|
132
|
+
return this._speed;
|
|
133
|
+
}
|
|
134
|
+
set speed(val) {
|
|
135
|
+
this._speed = Math.max(0, val);
|
|
136
|
+
}
|
|
137
|
+
/** How much the gusts raise and lower the push, 0 for a steady wind */ get gustStrength() {
|
|
138
|
+
return this._gustStrength;
|
|
139
|
+
}
|
|
140
|
+
set gustStrength(val) {
|
|
141
|
+
this._gustStrength = Math.max(0, val);
|
|
142
|
+
this.writeParams(0);
|
|
143
|
+
}
|
|
144
|
+
/** Typical size of a gust, in world units */ get gustScale() {
|
|
145
|
+
return this._gustScale;
|
|
146
|
+
}
|
|
147
|
+
set gustScale(val) {
|
|
148
|
+
this._gustScale = Math.max(0.01, val);
|
|
149
|
+
this.writeParams(0);
|
|
150
|
+
}
|
|
151
|
+
/** How much the fine turbulence raises and lowers the push */ get detailStrength() {
|
|
152
|
+
return this._detailStrength;
|
|
153
|
+
}
|
|
154
|
+
set detailStrength(val) {
|
|
155
|
+
this._detailStrength = Math.max(0, val);
|
|
156
|
+
this.writeParams(0);
|
|
157
|
+
}
|
|
158
|
+
/** Typical size of the fine turbulence, in world units */ get detailScale() {
|
|
159
|
+
return this._detailScale;
|
|
160
|
+
}
|
|
161
|
+
set detailScale(val) {
|
|
162
|
+
this._detailScale = Math.max(0.01, val);
|
|
163
|
+
this.writeParams(0);
|
|
164
|
+
}
|
|
165
|
+
/** Unit wind direction on the ground plane as [x, z] */ get directionXZ() {
|
|
166
|
+
const a = this._direction * Math.PI / 180;
|
|
167
|
+
return [
|
|
168
|
+
Math.cos(a),
|
|
169
|
+
Math.sin(a)
|
|
170
|
+
];
|
|
171
|
+
}
|
|
172
|
+
/** Wind clock in seconds, wrapping once a day; drives oscillations such as grass sway */ get time() {
|
|
173
|
+
return this._time;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Shader parameters, 8 vec4: the current frame in [0, 4) and the previous frame in [4, 8).
|
|
177
|
+
* Pass either half to {@link WindField.shaderPush}.
|
|
178
|
+
*/ get shaderParams() {
|
|
179
|
+
return this._params;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Advances the wind by one frame. Called once per frame by the scene.
|
|
183
|
+
* @internal
|
|
184
|
+
*/ update(deltaSeconds) {
|
|
185
|
+
// The frame being left becomes the previous frame, parameter edits included
|
|
186
|
+
this._params.copyWithin(4 * PARAMS_PER_FRAME, 0, 4 * PARAMS_PER_FRAME);
|
|
187
|
+
const dt = Number.isFinite(deltaSeconds) ? Math.max(0, Math.min(deltaSeconds, 0.25)) : 0;
|
|
188
|
+
const [dx, dz] = this.directionXZ;
|
|
189
|
+
const advance = (state, scale, evolution)=>{
|
|
190
|
+
const cells = this._speed * dt / scale;
|
|
191
|
+
state[0] = (state[0] + dx * cells) % NOISE_PERIOD;
|
|
192
|
+
state[1] = (state[1] + dz * cells) % NOISE_PERIOD;
|
|
193
|
+
state[2] = (state[2] + cells * evolution) % NOISE_PERIOD;
|
|
194
|
+
};
|
|
195
|
+
advance(this._gust, this._gustScale, GUST_EVOLUTION);
|
|
196
|
+
advance(this._detail, this._detailScale, DETAIL_EVOLUTION);
|
|
197
|
+
this._time = (this._time + dt) % CLOCK_PERIOD;
|
|
198
|
+
this.writeParams(0);
|
|
199
|
+
if (!this._hasPrev) {
|
|
200
|
+
// No previous frame yet: report no motion
|
|
201
|
+
this._params.copyWithin(4 * PARAMS_PER_FRAME, 0, 4 * PARAMS_PER_FRAME);
|
|
202
|
+
this._hasPrev = true;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Samples the wind push at a world position on the CPU
|
|
207
|
+
* @param x - World X
|
|
208
|
+
* @param z - World Z
|
|
209
|
+
* @returns Push strength at the position, see {@link WindField}
|
|
210
|
+
*/ sample(x, z) {
|
|
211
|
+
const g = windNoise3(x / this._gustScale - this._gust[0], z / this._gustScale - this._gust[1], this._gust[2]);
|
|
212
|
+
const d = windNoise3(x / this._detailScale - this._detail[0], z / this._detailScale - this._detail[1], this._detail[2]);
|
|
213
|
+
return this._strength * Math.max(0, 1 + this._gustStrength * g + this._detailStrength * d);
|
|
214
|
+
}
|
|
215
|
+
/** @internal */ writeParams(frame) {
|
|
216
|
+
const p = this._params;
|
|
217
|
+
const o = frame * 4 * PARAMS_PER_FRAME;
|
|
218
|
+
const [dx, dz] = this.directionXZ;
|
|
219
|
+
// (direction.xz, strength, gustStrength)
|
|
220
|
+
p[o + 0] = dx;
|
|
221
|
+
p[o + 1] = dz;
|
|
222
|
+
p[o + 2] = this._strength;
|
|
223
|
+
p[o + 3] = this._gustStrength;
|
|
224
|
+
// (gust offset.xz, gust evolution, 1 / gustScale)
|
|
225
|
+
p[o + 4] = this._gust[0];
|
|
226
|
+
p[o + 5] = this._gust[1];
|
|
227
|
+
p[o + 6] = this._gust[2];
|
|
228
|
+
p[o + 7] = 1 / this._gustScale;
|
|
229
|
+
// (detail offset.xz, detail evolution, 1 / detailScale)
|
|
230
|
+
p[o + 8] = this._detail[0];
|
|
231
|
+
p[o + 9] = this._detail[1];
|
|
232
|
+
p[o + 10] = this._detail[2];
|
|
233
|
+
p[o + 11] = 1 / this._detailScale;
|
|
234
|
+
// (detailStrength, wind clock, unused, unused)
|
|
235
|
+
p[o + 12] = this._detailStrength;
|
|
236
|
+
p[o + 13] = this._time;
|
|
237
|
+
p[o + 14] = 0;
|
|
238
|
+
p[o + 15] = 0;
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Declares the wind shader functions and returns the push at a world position.
|
|
242
|
+
*
|
|
243
|
+
* @param scope - Current shader scope
|
|
244
|
+
* @param worldXZ - World position on the ground plane (vec2)
|
|
245
|
+
* @param p0 - First vec4 of the frame parameters, see {@link WindField.shaderParams}
|
|
246
|
+
* @param p1 - Second vec4
|
|
247
|
+
* @param p2 - Third vec4
|
|
248
|
+
* @param p3 - Fourth vec4
|
|
249
|
+
* @returns Push strength (float)
|
|
250
|
+
*/ static shaderPush(scope, worldXZ, p0, p1, p2, p3) {
|
|
251
|
+
const pb = scope.$builder;
|
|
252
|
+
const funcHash = 'Z_windLatticeHash';
|
|
253
|
+
const funcGrad = 'Z_windGrad';
|
|
254
|
+
const funcNoise = 'Z_windNoise3';
|
|
255
|
+
const funcPush = 'Z_windPush';
|
|
256
|
+
// See latticeHash()
|
|
257
|
+
pb.func(funcHash, [
|
|
258
|
+
pb.uint('x'),
|
|
259
|
+
pb.uint('y'),
|
|
260
|
+
pb.uint('z')
|
|
261
|
+
], function() {
|
|
262
|
+
this.$l.h = pb.compXor(pb.compXor(pb.mul(this.x, pb.uint(0x27d4eb2d)), pb.mul(this.y, pb.uint(0x165667b1))), pb.mul(this.z, pb.uint(0x9e3779b9)));
|
|
263
|
+
this.h = pb.mul(pb.compXor(this.h, pb.sar(this.h, 15)), pb.uint(0x85ebca6b));
|
|
264
|
+
this.h = pb.mul(pb.compXor(this.h, pb.sar(this.h, 13)), pb.uint(0xc2b2ae35));
|
|
265
|
+
this.h = pb.compXor(this.h, pb.sar(this.h, 16));
|
|
266
|
+
this.$return(this.h);
|
|
267
|
+
});
|
|
268
|
+
// See grad(). Branch-free with mix() since select() is not available on WebGL2
|
|
269
|
+
pb.func(funcGrad, [
|
|
270
|
+
pb.uint('hash'),
|
|
271
|
+
pb.vec3('d')
|
|
272
|
+
], function() {
|
|
273
|
+
this.$l.h = pb.compAnd(this.hash, pb.uint(15));
|
|
274
|
+
this.$l.u = pb.mix(this.d.y, this.d.x, pb.float(pb.lessThan(this.h, pb.uint(8))));
|
|
275
|
+
this.$l.xz = pb.mix(this.d.z, this.d.x, pb.add(pb.float(pb.equal(this.h, pb.uint(12))), pb.float(pb.equal(this.h, pb.uint(14)))));
|
|
276
|
+
this.$l.v = pb.mix(this.xz, this.d.y, pb.float(pb.lessThan(this.h, pb.uint(4))));
|
|
277
|
+
this.$l.su = pb.sub(1, pb.mul(pb.float(pb.compAnd(this.h, pb.uint(1))), 2));
|
|
278
|
+
this.$l.sv = pb.sub(1, pb.float(pb.compAnd(this.h, pb.uint(2))));
|
|
279
|
+
this.$return(pb.add(pb.mul(this.u, this.su), pb.mul(this.v, this.sv)));
|
|
280
|
+
});
|
|
281
|
+
// See windNoise3()
|
|
282
|
+
pb.func(funcNoise, [
|
|
283
|
+
pb.vec3('p')
|
|
284
|
+
], function() {
|
|
285
|
+
this.$l.fl = pb.floor(this.p);
|
|
286
|
+
this.$l.d = pb.sub(this.p, this.fl);
|
|
287
|
+
this.$l.i = pb.ivec3(this.fl);
|
|
288
|
+
this.$l.c0 = pb.uvec3(pb.compAnd(this.i, pb.ivec3(NOISE_PERIOD - 1)));
|
|
289
|
+
this.$l.c1 = pb.uvec3(pb.compAnd(pb.add(this.i, pb.ivec3(1)), pb.ivec3(NOISE_PERIOD - 1)));
|
|
290
|
+
this.$l.w = pb.mul(this.d, this.d, this.d, pb.add(pb.mul(this.d, pb.sub(pb.mul(this.d, 6), pb.vec3(15))), pb.vec3(10)));
|
|
291
|
+
this.$l.n000 = this[funcGrad](this[funcHash](this.c0.x, this.c0.y, this.c0.z), this.d);
|
|
292
|
+
this.$l.n100 = this[funcGrad](this[funcHash](this.c1.x, this.c0.y, this.c0.z), pb.sub(this.d, pb.vec3(1, 0, 0)));
|
|
293
|
+
this.$l.n010 = this[funcGrad](this[funcHash](this.c0.x, this.c1.y, this.c0.z), pb.sub(this.d, pb.vec3(0, 1, 0)));
|
|
294
|
+
this.$l.n110 = this[funcGrad](this[funcHash](this.c1.x, this.c1.y, this.c0.z), pb.sub(this.d, pb.vec3(1, 1, 0)));
|
|
295
|
+
this.$l.n001 = this[funcGrad](this[funcHash](this.c0.x, this.c0.y, this.c1.z), pb.sub(this.d, pb.vec3(0, 0, 1)));
|
|
296
|
+
this.$l.n101 = this[funcGrad](this[funcHash](this.c1.x, this.c0.y, this.c1.z), pb.sub(this.d, pb.vec3(1, 0, 1)));
|
|
297
|
+
this.$l.n011 = this[funcGrad](this[funcHash](this.c0.x, this.c1.y, this.c1.z), pb.sub(this.d, pb.vec3(0, 1, 1)));
|
|
298
|
+
this.$l.n111 = this[funcGrad](this[funcHash](this.c1.x, this.c1.y, this.c1.z), pb.sub(this.d, pb.vec3(1, 1, 1)));
|
|
299
|
+
this.$return(pb.mix(pb.mix(pb.mix(this.n000, this.n100, this.w.x), pb.mix(this.n010, this.n110, this.w.x), this.w.y), pb.mix(pb.mix(this.n001, this.n101, this.w.x), pb.mix(this.n011, this.n111, this.w.x), this.w.y), this.w.z));
|
|
300
|
+
});
|
|
301
|
+
pb.func(funcPush, [
|
|
302
|
+
pb.vec2('xz'),
|
|
303
|
+
pb.vec4('p0'),
|
|
304
|
+
pb.vec4('p1'),
|
|
305
|
+
pb.vec4('p2'),
|
|
306
|
+
pb.vec4('p3')
|
|
307
|
+
], function() {
|
|
308
|
+
this.$l.g = this[funcNoise](pb.vec3(pb.sub(pb.mul(this.xz, this.p1.w), this.p1.xy), this.p1.z));
|
|
309
|
+
this.$l.dn = this[funcNoise](pb.vec3(pb.sub(pb.mul(this.xz, this.p2.w), this.p2.xy), this.p2.z));
|
|
310
|
+
this.$return(pb.mul(this.p0.z, pb.max(0, pb.add(1, pb.add(pb.mul(this.p0.w, this.g), pb.mul(this.p3.x, this.dn))))));
|
|
311
|
+
});
|
|
312
|
+
return pb.getGlobalScope()[funcPush](worldXZ, p0, p1, p2, p3);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
export { WindField, windNoise3 };
|
|
317
|
+
//# sourceMappingURL=wind.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wind.js","sources":["../../src/scene/wind.ts"],"sourcesContent":["import type { PBInsideFunctionScope, PBShaderExp } from '@zephyr3d/device';\r\n\r\n/**\r\n * Lattice period of the wind noise, in noise cells. The scroll offsets and the evolution\r\n * coordinate wrap at this period, so they never lose float precision however long the scene runs.\r\n */\r\nconst NOISE_PERIOD = 256;\r\n/**\r\n * How fast the noise evolves in place, in noise cells per noise cell scrolled. Without it the gust\r\n * pattern would slide along rigidly; with it the gusts form and fade as they travel.\r\n */\r\nconst GUST_EVOLUTION = 0.35;\r\nconst DETAIL_EVOLUTION = 0.7;\r\n/**\r\n * Period of the wind clock, in seconds. Oscillations driven by it (grass sway) jump once per\r\n * period, which keeps float precision of the phase good for the whole period.\r\n */\r\nconst CLOCK_PERIOD = 86400;\r\n/** Number of vec4 in the shader parameters of one frame, see WindField.shaderParams */\r\nconst PARAMS_PER_FRAME = 4;\r\n\r\n/**\r\n * Integer lattice hash shared by the CPU and GPU paths (same mixing as the grass placement hash).\r\n * Inputs are lattice coordinates already wrapped into [0, NOISE_PERIOD).\r\n */\r\nfunction latticeHash(x: number, y: number, z: number): number {\r\n let h = (Math.imul(x, 0x27d4eb2d) ^ Math.imul(y, 0x165667b1) ^ Math.imul(z, 0x9e3779b9)) | 0;\r\n h = Math.imul(h ^ (h >>> 15), 0x85ebca6b);\r\n h = Math.imul(h ^ (h >>> 13), 0xc2b2ae35);\r\n h ^= h >>> 16;\r\n return h >>> 0;\r\n}\r\n\r\n/** Gradient selection of Ken Perlin's improved noise (Perlin, \"Improving Noise\", SIGGRAPH 2002) */\r\nfunction grad(h: number, x: number, y: number, z: number): number {\r\n h &= 15;\r\n const u = h < 8 ? x : y;\r\n const v = h < 4 ? y : h === 12 || h === 14 ? x : z;\r\n return (h & 1 ? -u : u) + (h & 2 ? -v : v);\r\n}\r\n\r\nfunction fade(t: number) {\r\n return t * t * t * (t * (t * 6 - 15) + 10);\r\n}\r\n\r\nfunction wrap(i: number) {\r\n return i & (NOISE_PERIOD - 1);\r\n}\r\n\r\n/**\r\n * 3D gradient noise in roughly [-1, 1], periodic with NOISE_PERIOD on every axis.\r\n * @internal\r\n */\r\nexport function windNoise3(x: number, y: number, z: number): number {\r\n const fx = Math.floor(x);\r\n const fy = Math.floor(y);\r\n const fz = Math.floor(z);\r\n const x0 = wrap(fx);\r\n const y0 = wrap(fy);\r\n const z0 = wrap(fz);\r\n const x1 = wrap(fx + 1);\r\n const y1 = wrap(fy + 1);\r\n const z1 = wrap(fz + 1);\r\n const dx = x - fx;\r\n const dy = y - fy;\r\n const dz = z - fz;\r\n const u = fade(dx);\r\n const v = fade(dy);\r\n const w = fade(dz);\r\n const lerp = (a: number, b: number, t: number) => a + (b - a) * t;\r\n const n000 = grad(latticeHash(x0, y0, z0), dx, dy, dz);\r\n const n100 = grad(latticeHash(x1, y0, z0), dx - 1, dy, dz);\r\n const n010 = grad(latticeHash(x0, y1, z0), dx, dy - 1, dz);\r\n const n110 = grad(latticeHash(x1, y1, z0), dx - 1, dy - 1, dz);\r\n const n001 = grad(latticeHash(x0, y0, z1), dx, dy, dz - 1);\r\n const n101 = grad(latticeHash(x1, y0, z1), dx - 1, dy, dz - 1);\r\n const n011 = grad(latticeHash(x0, y1, z1), dx, dy - 1, dz - 1);\r\n const n111 = grad(latticeHash(x1, y1, z1), dx - 1, dy - 1, dz - 1);\r\n return lerp(\r\n lerp(lerp(n000, n100, u), lerp(n010, n110, u), v),\r\n lerp(lerp(n001, n101, u), lerp(n011, n111, u), v),\r\n w\r\n );\r\n}\r\n\r\n/**\r\n * Scene-wide wind.\r\n *\r\n * The model follows Ghost of Tsushima (Rockenbeck, \"Blowing from the West\", GDC 2021; Wohllaib,\r\n * \"Procedural Grass in Ghost of Tsushima\", GDC 2021): a single wind direction, and a push\r\n * strength that varies from place to place with time-varying Perlin noise scrolled along the\r\n * wind, so gusts can be seen travelling across fields. A second, finer noise layer adds the high\r\n * frequency part. The talks do not give how the noise is shaped, so the push here is\r\n *\r\n * push = strength * max(0, 1 + gustStrength * gustNoise + detailStrength * detailNoise)\r\n *\r\n * with both noises in about [-1, 1].\r\n *\r\n * Systems that react to the wind (grass, foliage, particles...) sample it either on the CPU with\r\n * {@link WindField.sample} or in shaders with {@link WindField.shaderPush}, using the parameters\r\n * of {@link WindField.shaderParams}. Those carry the current and the previous frame, so a vertex\r\n * shader can place a vertex where it was last frame and output a correct motion vector.\r\n *\r\n * @public\r\n */\r\nexport class WindField {\r\n private _direction: number;\r\n private _strength: number;\r\n private _speed: number;\r\n private _gustStrength: number;\r\n private _gustScale: number;\r\n private _detailStrength: number;\r\n private _detailScale: number;\r\n /** Scroll offsets and evolution coordinates, in noise cells, wrapped to the noise period */\r\n private readonly _gust: Float64Array;\r\n private readonly _detail: Float64Array;\r\n /** vec4[2 * PARAMS_PER_FRAME]: current frame then previous frame */\r\n private readonly _params: Float32Array<ArrayBuffer>;\r\n private _hasPrev: boolean;\r\n private _time: number;\r\n /** @internal */\r\n constructor() {\r\n this._direction = 0;\r\n this._strength = 0.3;\r\n this._speed = 4;\r\n this._gustStrength = 0.6;\r\n this._gustScale = 30;\r\n this._detailStrength = 0.25;\r\n this._detailScale = 4;\r\n this._gust = new Float64Array(3);\r\n this._detail = new Float64Array(3);\r\n this._params = new Float32Array(8 * PARAMS_PER_FRAME);\r\n this._hasPrev = false;\r\n this._time = 0;\r\n this.writeParams(0);\r\n }\r\n /**\r\n * Direction the wind blows toward, in degrees on the ground plane. 0 blows toward +X,\r\n * 90 toward +Z.\r\n */\r\n get direction() {\r\n return this._direction;\r\n }\r\n set direction(val: number) {\r\n this._direction = val;\r\n this.writeParams(0);\r\n }\r\n /** Overall push of the wind. 0 is calm air. */\r\n get strength() {\r\n return this._strength;\r\n }\r\n set strength(val: number) {\r\n this._strength = Math.max(0, val);\r\n this.writeParams(0);\r\n }\r\n /** Speed at which the gusts travel along the wind, in world units per second */\r\n get speed() {\r\n return this._speed;\r\n }\r\n set speed(val: number) {\r\n this._speed = Math.max(0, val);\r\n }\r\n /** How much the gusts raise and lower the push, 0 for a steady wind */\r\n get gustStrength() {\r\n return this._gustStrength;\r\n }\r\n set gustStrength(val: number) {\r\n this._gustStrength = Math.max(0, val);\r\n this.writeParams(0);\r\n }\r\n /** Typical size of a gust, in world units */\r\n get gustScale() {\r\n return this._gustScale;\r\n }\r\n set gustScale(val: number) {\r\n this._gustScale = Math.max(0.01, val);\r\n this.writeParams(0);\r\n }\r\n /** How much the fine turbulence raises and lowers the push */\r\n get detailStrength() {\r\n return this._detailStrength;\r\n }\r\n set detailStrength(val: number) {\r\n this._detailStrength = Math.max(0, val);\r\n this.writeParams(0);\r\n }\r\n /** Typical size of the fine turbulence, in world units */\r\n get detailScale() {\r\n return this._detailScale;\r\n }\r\n set detailScale(val: number) {\r\n this._detailScale = Math.max(0.01, val);\r\n this.writeParams(0);\r\n }\r\n /** Unit wind direction on the ground plane as [x, z] */\r\n get directionXZ(): [number, number] {\r\n const a = (this._direction * Math.PI) / 180;\r\n return [Math.cos(a), Math.sin(a)];\r\n }\r\n /** Wind clock in seconds, wrapping once a day; drives oscillations such as grass sway */\r\n get time() {\r\n return this._time;\r\n }\r\n /**\r\n * Shader parameters, 8 vec4: the current frame in [0, 4) and the previous frame in [4, 8).\r\n * Pass either half to {@link WindField.shaderPush}.\r\n */\r\n get shaderParams(): Float32Array<ArrayBuffer> {\r\n return this._params;\r\n }\r\n /**\r\n * Advances the wind by one frame. Called once per frame by the scene.\r\n * @internal\r\n */\r\n update(deltaSeconds: number) {\r\n // The frame being left becomes the previous frame, parameter edits included\r\n this._params.copyWithin(4 * PARAMS_PER_FRAME, 0, 4 * PARAMS_PER_FRAME);\r\n const dt = Number.isFinite(deltaSeconds) ? Math.max(0, Math.min(deltaSeconds, 0.25)) : 0;\r\n const [dx, dz] = this.directionXZ;\r\n const advance = (state: Float64Array, scale: number, evolution: number) => {\r\n const cells = (this._speed * dt) / scale;\r\n state[0] = (state[0] + dx * cells) % NOISE_PERIOD;\r\n state[1] = (state[1] + dz * cells) % NOISE_PERIOD;\r\n state[2] = (state[2] + cells * evolution) % NOISE_PERIOD;\r\n };\r\n advance(this._gust, this._gustScale, GUST_EVOLUTION);\r\n advance(this._detail, this._detailScale, DETAIL_EVOLUTION);\r\n this._time = (this._time + dt) % CLOCK_PERIOD;\r\n this.writeParams(0);\r\n if (!this._hasPrev) {\r\n // No previous frame yet: report no motion\r\n this._params.copyWithin(4 * PARAMS_PER_FRAME, 0, 4 * PARAMS_PER_FRAME);\r\n this._hasPrev = true;\r\n }\r\n }\r\n /**\r\n * Samples the wind push at a world position on the CPU\r\n * @param x - World X\r\n * @param z - World Z\r\n * @returns Push strength at the position, see {@link WindField}\r\n */\r\n sample(x: number, z: number): number {\r\n const g = windNoise3(\r\n x / this._gustScale - this._gust[0],\r\n z / this._gustScale - this._gust[1],\r\n this._gust[2]\r\n );\r\n const d = windNoise3(\r\n x / this._detailScale - this._detail[0],\r\n z / this._detailScale - this._detail[1],\r\n this._detail[2]\r\n );\r\n return this._strength * Math.max(0, 1 + this._gustStrength * g + this._detailStrength * d);\r\n }\r\n /** @internal */\r\n private writeParams(frame: number) {\r\n const p = this._params;\r\n const o = frame * 4 * PARAMS_PER_FRAME;\r\n const [dx, dz] = this.directionXZ;\r\n // (direction.xz, strength, gustStrength)\r\n p[o + 0] = dx;\r\n p[o + 1] = dz;\r\n p[o + 2] = this._strength;\r\n p[o + 3] = this._gustStrength;\r\n // (gust offset.xz, gust evolution, 1 / gustScale)\r\n p[o + 4] = this._gust[0];\r\n p[o + 5] = this._gust[1];\r\n p[o + 6] = this._gust[2];\r\n p[o + 7] = 1 / this._gustScale;\r\n // (detail offset.xz, detail evolution, 1 / detailScale)\r\n p[o + 8] = this._detail[0];\r\n p[o + 9] = this._detail[1];\r\n p[o + 10] = this._detail[2];\r\n p[o + 11] = 1 / this._detailScale;\r\n // (detailStrength, wind clock, unused, unused)\r\n p[o + 12] = this._detailStrength;\r\n p[o + 13] = this._time;\r\n p[o + 14] = 0;\r\n p[o + 15] = 0;\r\n }\r\n /**\r\n * Declares the wind shader functions and returns the push at a world position.\r\n *\r\n * @param scope - Current shader scope\r\n * @param worldXZ - World position on the ground plane (vec2)\r\n * @param p0 - First vec4 of the frame parameters, see {@link WindField.shaderParams}\r\n * @param p1 - Second vec4\r\n * @param p2 - Third vec4\r\n * @param p3 - Fourth vec4\r\n * @returns Push strength (float)\r\n */\r\n static shaderPush(\r\n scope: PBInsideFunctionScope,\r\n worldXZ: PBShaderExp,\r\n p0: PBShaderExp,\r\n p1: PBShaderExp,\r\n p2: PBShaderExp,\r\n p3: PBShaderExp\r\n ): PBShaderExp {\r\n const pb = scope.$builder;\r\n const funcHash = 'Z_windLatticeHash';\r\n const funcGrad = 'Z_windGrad';\r\n const funcNoise = 'Z_windNoise3';\r\n const funcPush = 'Z_windPush';\r\n // See latticeHash()\r\n pb.func(funcHash, [pb.uint('x'), pb.uint('y'), pb.uint('z')], function () {\r\n this.$l.h = pb.compXor(\r\n pb.compXor(pb.mul(this.x, pb.uint(0x27d4eb2d)), pb.mul(this.y, pb.uint(0x165667b1))),\r\n pb.mul(this.z, pb.uint(0x9e3779b9))\r\n );\r\n this.h = pb.mul(pb.compXor(this.h, pb.sar(this.h, 15)), pb.uint(0x85ebca6b));\r\n this.h = pb.mul(pb.compXor(this.h, pb.sar(this.h, 13)), pb.uint(0xc2b2ae35));\r\n this.h = pb.compXor(this.h, pb.sar(this.h, 16));\r\n this.$return(this.h);\r\n });\r\n // See grad(). Branch-free with mix() since select() is not available on WebGL2\r\n pb.func(funcGrad, [pb.uint('hash'), pb.vec3('d')], function () {\r\n this.$l.h = pb.compAnd(this.hash, pb.uint(15));\r\n this.$l.u = pb.mix(this.d.y, this.d.x, pb.float(pb.lessThan(this.h, pb.uint(8))));\r\n this.$l.xz = pb.mix(\r\n this.d.z,\r\n this.d.x,\r\n pb.add(pb.float(pb.equal(this.h, pb.uint(12))), pb.float(pb.equal(this.h, pb.uint(14))))\r\n );\r\n this.$l.v = pb.mix(this.xz, this.d.y, pb.float(pb.lessThan(this.h, pb.uint(4))));\r\n this.$l.su = pb.sub(1, pb.mul(pb.float(pb.compAnd(this.h, pb.uint(1))), 2));\r\n this.$l.sv = pb.sub(1, pb.float(pb.compAnd(this.h, pb.uint(2))));\r\n this.$return(pb.add(pb.mul(this.u, this.su), pb.mul(this.v, this.sv)));\r\n });\r\n // See windNoise3()\r\n pb.func(funcNoise, [pb.vec3('p')], function () {\r\n this.$l.fl = pb.floor(this.p);\r\n this.$l.d = pb.sub(this.p, this.fl);\r\n this.$l.i = pb.ivec3(this.fl);\r\n this.$l.c0 = pb.uvec3(pb.compAnd(this.i, pb.ivec3(NOISE_PERIOD - 1)));\r\n this.$l.c1 = pb.uvec3(pb.compAnd(pb.add(this.i, pb.ivec3(1)), pb.ivec3(NOISE_PERIOD - 1)));\r\n this.$l.w = pb.mul(\r\n this.d,\r\n this.d,\r\n this.d,\r\n pb.add(pb.mul(this.d, pb.sub(pb.mul(this.d, 6), pb.vec3(15))), pb.vec3(10))\r\n );\r\n this.$l.n000 = this[funcGrad](this[funcHash](this.c0.x, this.c0.y, this.c0.z), this.d);\r\n this.$l.n100 = this[funcGrad](\r\n this[funcHash](this.c1.x, this.c0.y, this.c0.z),\r\n pb.sub(this.d, pb.vec3(1, 0, 0))\r\n );\r\n this.$l.n010 = this[funcGrad](\r\n this[funcHash](this.c0.x, this.c1.y, this.c0.z),\r\n pb.sub(this.d, pb.vec3(0, 1, 0))\r\n );\r\n this.$l.n110 = this[funcGrad](\r\n this[funcHash](this.c1.x, this.c1.y, this.c0.z),\r\n pb.sub(this.d, pb.vec3(1, 1, 0))\r\n );\r\n this.$l.n001 = this[funcGrad](\r\n this[funcHash](this.c0.x, this.c0.y, this.c1.z),\r\n pb.sub(this.d, pb.vec3(0, 0, 1))\r\n );\r\n this.$l.n101 = this[funcGrad](\r\n this[funcHash](this.c1.x, this.c0.y, this.c1.z),\r\n pb.sub(this.d, pb.vec3(1, 0, 1))\r\n );\r\n this.$l.n011 = this[funcGrad](\r\n this[funcHash](this.c0.x, this.c1.y, this.c1.z),\r\n pb.sub(this.d, pb.vec3(0, 1, 1))\r\n );\r\n this.$l.n111 = this[funcGrad](\r\n this[funcHash](this.c1.x, this.c1.y, this.c1.z),\r\n pb.sub(this.d, pb.vec3(1, 1, 1))\r\n );\r\n this.$return(\r\n pb.mix(\r\n pb.mix(pb.mix(this.n000, this.n100, this.w.x), pb.mix(this.n010, this.n110, this.w.x), this.w.y),\r\n pb.mix(pb.mix(this.n001, this.n101, this.w.x), pb.mix(this.n011, this.n111, this.w.x), this.w.y),\r\n this.w.z\r\n )\r\n );\r\n });\r\n pb.func(\r\n funcPush,\r\n [pb.vec2('xz'), pb.vec4('p0'), pb.vec4('p1'), pb.vec4('p2'), pb.vec4('p3')],\r\n function () {\r\n this.$l.g = this[funcNoise](pb.vec3(pb.sub(pb.mul(this.xz, this.p1.w), this.p1.xy), this.p1.z));\r\n this.$l.dn = this[funcNoise](pb.vec3(pb.sub(pb.mul(this.xz, this.p2.w), this.p2.xy), this.p2.z));\r\n this.$return(\r\n pb.mul(\r\n this.p0.z,\r\n pb.max(0, pb.add(1, pb.add(pb.mul(this.p0.w, this.g), pb.mul(this.p3.x, this.dn))))\r\n )\r\n );\r\n }\r\n );\r\n return pb.getGlobalScope()[funcPush](worldXZ, p0, p1, p2, p3) as PBShaderExp;\r\n }\r\n}\r\n"],"names":["NOISE_PERIOD","GUST_EVOLUTION","DETAIL_EVOLUTION","CLOCK_PERIOD","PARAMS_PER_FRAME","latticeHash","x","y","z","h","Math","imul","grad","u","v","fade","t","wrap","i","windNoise3","fx","floor","fy","fz","x0","y0","z0","x1","y1","z1","dx","dy","dz","w","lerp","a","b","n000","n100","n010","n110","n001","n101","n011","n111","WindField","_direction","_strength","_speed","_gustStrength","_gustScale","_detailStrength","_detailScale","_detail","_hasPrev","_time","_gust","Float64Array","_params","Float32Array","writeParams","direction","val","strength","max","speed","gustStrength","gustScale","detailStrength","detailScale","directionXZ","PI","cos","sin","time","shaderParams","update","deltaSeconds","copyWithin","dt","Number","isFinite","min","advance","state","scale","evolution","cells","sample","g","d","frame","p","o","shaderPush","scope","worldXZ","p0","p1","p2","p3","pb","$builder","funcHash","funcGrad","funcNoise","funcPush","func","uint","$l","compXor","mul","sar","$return","vec3","compAnd","hash","mix","float","lessThan","xz","add","equal","su","sub","sv","fl","ivec3","c0","uvec3","c1","vec2","vec4","xy","dn","getGlobalScope"],"mappings":"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"}
|