@zephyr3d/scene 0.9.26 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +60 -27
- package/dist/animation/animation_bank.js +634 -0
- package/dist/animation/animation_bank.js.map +1 -0
- package/dist/animation/animation_bank_gpu.js +256 -0
- package/dist/animation/animation_bank_gpu.js.map +1 -0
- package/dist/animation/animationset.js +146 -30
- package/dist/animation/animationset.js.map +1 -1
- package/dist/animation/cloth/gpu_cloth_component.js +406 -0
- package/dist/animation/cloth/gpu_cloth_component.js.map +1 -0
- package/dist/animation/cloth/gpu_cloth_system.js +332 -202
- package/dist/animation/cloth/gpu_cloth_system.js.map +1 -1
- package/dist/animation/gpu_animation_driver.js +289 -0
- package/dist/animation/gpu_animation_driver.js.map +1 -0
- package/dist/animation/joint_dynamics/collision.js +112 -1
- package/dist/animation/joint_dynamics/collision.js.map +1 -1
- package/dist/animation/joint_dynamics/controller.js +6 -0
- package/dist/animation/joint_dynamics/controller.js.map +1 -1
- package/dist/animation/joint_dynamics/joint_dynamics_system.js +11 -0
- package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -1
- package/dist/animation/joint_dynamics/solver.js +50 -12
- package/dist/animation/joint_dynamics/solver.js.map +1 -1
- package/dist/animation/joint_dynamics/types.js.map +1 -1
- package/dist/animation/skeleton.js +300 -56
- package/dist/animation/skeleton.js.map +1 -1
- package/dist/animation/skin_palette_atlas.js +252 -0
- package/dist/animation/skin_palette_atlas.js.map +1 -0
- package/dist/animation/spring/multi_chain_spring_system.js +298 -38
- package/dist/animation/spring/multi_chain_spring_system.js.map +1 -1
- package/dist/animation/spring/spring_chain.js +2 -0
- package/dist/animation/spring/spring_chain.js.map +1 -1
- package/dist/animation/spring/spring_collider.js +159 -21
- package/dist/animation/spring/spring_collider.js.map +1 -1
- package/dist/animation/spring/spring_particle.js +1 -0
- package/dist/animation/spring/spring_particle.js.map +1 -1
- package/dist/animation/spring/spring_solver.js +173 -0
- package/dist/animation/spring/spring_solver.js.map +1 -0
- package/dist/animation/spring/spring_system.js +249 -24
- package/dist/animation/spring/spring_system.js.map +1 -1
- package/dist/animation/spring_modifier.js +32 -1
- package/dist/animation/spring_modifier.js.map +1 -1
- package/dist/app/app.js +26 -0
- package/dist/app/app.js.map +1 -1
- package/dist/app/engine.js +86 -15
- package/dist/app/engine.js.map +1 -1
- package/dist/app/gamepad.js +191 -0
- package/dist/app/gamepad.js.map +1 -0
- package/dist/app/inputactions.js +271 -0
- package/dist/app/inputactions.js.map +1 -0
- package/dist/app/inputmgr.js +331 -22
- package/dist/app/inputmgr.js.map +1 -1
- package/dist/app/loading.js +138 -0
- package/dist/app/loading.js.map +1 -0
- package/dist/app/pipelinecache.js +209 -0
- package/dist/app/pipelinecache.js.map +1 -0
- package/dist/app/runtimescript.js +25 -0
- package/dist/app/runtimescript.js.map +1 -1
- package/dist/app/scriptingsystem.js +54 -0
- package/dist/app/scriptingsystem.js.map +1 -1
- package/dist/app/scriptregistry.js +7 -2
- package/dist/app/scriptregistry.js.map +1 -1
- package/dist/asset/asset_manifest.js +59 -0
- package/dist/asset/asset_manifest.js.map +1 -0
- package/dist/asset/asset_preload.js +258 -0
- package/dist/asset/asset_preload.js.map +1 -0
- package/dist/asset/assetmanager.js +117 -65
- package/dist/asset/assetmanager.js.map +1 -1
- package/dist/asset/loaders/ktx2/basis/LICENSE +201 -0
- package/dist/asset/loaders/ktx2/basis/basis_transcoder.js +2 -0
- package/dist/asset/loaders/ktx2/basis/basis_transcoder.wasm +0 -0
- package/dist/asset/loaders/ktx2/basis_location.js +17 -0
- package/dist/asset/loaders/ktx2/basis_location.js.map +1 -0
- package/dist/asset/loaders/ktx2/ktx2_loader.js +88 -0
- package/dist/asset/loaders/ktx2/ktx2_loader.js.map +1 -0
- package/dist/asset/loaders/ktx2/ktx2_targets.js +118 -0
- package/dist/asset/loaders/ktx2/ktx2_targets.js.map +1 -0
- package/dist/asset/loaders/ktx2/transcoder_pool.js +259 -0
- package/dist/asset/loaders/ktx2/transcoder_pool.js.map +1 -0
- package/dist/asset/mesh_lod_builder.js +104 -0
- package/dist/asset/mesh_lod_builder.js.map +1 -0
- package/dist/asset/mesh_settings.js +111 -0
- package/dist/asset/mesh_settings.js.map +1 -0
- package/dist/asset/meshopt_decoder.js +18 -0
- package/dist/asset/meshopt_decoder.js.map +1 -0
- package/dist/asset/meshopt_simplifier.js +26 -0
- package/dist/asset/meshopt_simplifier.js.map +1 -0
- package/dist/asset/model.js +177 -3
- package/dist/asset/model.js.map +1 -1
- package/dist/asset/texture_settings.js +231 -0
- package/dist/asset/texture_settings.js.map +1 -0
- package/dist/asset/zmsh_binary.js +131 -0
- package/dist/asset/zmsh_binary.js.map +1 -0
- package/dist/asset/zsdf_binary.js +111 -0
- package/dist/asset/zsdf_binary.js.map +1 -0
- package/dist/blitter/bilateralblur.js +1 -2
- package/dist/blitter/bilateralblur.js.map +1 -1
- package/dist/blitter/gaussianblur.js +1 -6
- package/dist/blitter/gaussianblur.js.map +1 -1
- package/dist/camera/base.js +31 -10
- package/dist/camera/base.js.map +1 -1
- package/dist/camera/camera.js +178 -200
- package/dist/camera/camera.js.map +1 -1
- package/dist/camera/follow.js +342 -0
- package/dist/camera/follow.js.map +1 -0
- package/dist/camera/fps.js +9 -7
- package/dist/camera/fps.js.map +1 -1
- package/dist/camera/orbit.js +46 -19
- package/dist/camera/orbit.js.map +1 -1
- package/dist/index.d.ts +30475 -19865
- package/dist/index.js +67 -12
- package/dist/index.js.map +1 -1
- package/dist/material/blinn.js +3 -0
- package/dist/material/blinn.js.map +1 -1
- package/dist/material/eye.js +1 -1
- package/dist/material/eye.js.map +1 -1
- package/dist/material/hair.js +2 -3
- package/dist/material/hair.js.map +1 -1
- package/dist/material/hairstrand.js +235 -235
- package/dist/material/hairstrand.js.map +1 -1
- package/dist/material/lambert.js +4 -1
- package/dist/material/lambert.js.map +1 -1
- package/dist/material/material.js +362 -300
- package/dist/material/material.js.map +1 -1
- package/dist/material/meshmaterial.js +118 -45
- package/dist/material/meshmaterial.js.map +1 -1
- package/dist/material/mixins/lightmodel/blinnphong.js +1 -1
- package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
- package/dist/material/mixins/lightmodel/lambert.js +1 -1
- package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +34 -61
- package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +16 -2
- package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrspecularglossness.js +2 -1
- package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
- package/dist/material/mixins/lit.js +223 -83
- package/dist/material/mixins/lit.js.map +1 -1
- package/dist/material/mixins/pbr/common.js +31 -206
- package/dist/material/mixins/pbr/common.js.map +1 -1
- package/dist/material/mtoon.js +1 -1
- package/dist/material/mtoon.js.map +1 -1
- package/dist/material/pbrmr.js +3 -0
- package/dist/material/pbrmr.js.map +1 -1
- package/dist/material/pbrsg.js +3 -0
- package/dist/material/pbrsg.js.map +1 -1
- package/dist/material/sdf_debug.js +78 -0
- package/dist/material/sdf_debug.js.map +1 -0
- package/dist/material/shader/helper.js +733 -190
- package/dist/material/shader/helper.js.map +1 -1
- package/dist/material/shader/terrain_blend.js +204 -43
- package/dist/material/shader/terrain_blend.js.map +1 -1
- package/dist/material/skin.js +331 -297
- package/dist/material/skin.js.map +1 -1
- package/dist/material/skinprofile.js +1058 -0
- package/dist/material/skinprofile.js.map +1 -0
- package/dist/material/sss.js +353 -0
- package/dist/material/sss.js.map +1 -0
- package/dist/material/sss_kernel.js +265 -0
- package/dist/material/sss_kernel.js.map +1 -0
- package/dist/material/sssprofile.js +879 -0
- package/dist/material/sssprofile.js.map +1 -0
- package/dist/material/subsurfaceprofile.js +4 -8
- package/dist/material/subsurfaceprofile.js.map +1 -1
- package/dist/material/terrain-cm.js +464 -188
- package/dist/material/terrain-cm.js.map +1 -1
- package/dist/material/unlit.js +3 -0
- package/dist/material/unlit.js.map +1 -1
- package/dist/material/water.js +2009 -201
- package/dist/material/water.js.map +1 -1
- package/dist/node_modules/meshoptimizer/LICENSE +21 -0
- package/dist/node_modules/meshoptimizer/meshopt_decoder.js +197 -0
- package/dist/node_modules/meshoptimizer/meshopt_decoder.js.map +1 -0
- package/dist/node_modules/meshoptimizer/meshopt_simplifier.js +677 -0
- package/dist/node_modules/meshoptimizer/meshopt_simplifier.js.map +1 -0
- package/dist/physics/character.js +226 -0
- package/dist/physics/character.js.map +1 -0
- package/dist/physics/collider.js +209 -0
- package/dist/physics/collider.js.map +1 -0
- package/dist/physics/events.js +79 -0
- package/dist/physics/events.js.map +1 -0
- package/dist/physics/joint.js +272 -0
- package/dist/physics/joint.js.map +1 -0
- package/dist/physics/node_physics.js +234 -0
- package/dist/physics/node_physics.js.map +1 -0
- package/dist/physics/part.js +91 -0
- package/dist/physics/part.js.map +1 -0
- package/dist/physics/rigid_body.js +379 -0
- package/dist/physics/rigid_body.js.map +1 -0
- package/dist/physics/vehicle.js +335 -0
- package/dist/physics/vehicle.js.map +1 -0
- package/dist/physics/world.js +25 -0
- package/dist/physics/world.js.map +1 -0
- package/dist/posteffect/bloom.js +49 -14
- package/dist/posteffect/bloom.js.map +1 -1
- package/dist/posteffect/motionblur.js +668 -63
- package/dist/posteffect/motionblur.js.map +1 -1
- package/dist/posteffect/posteffect.js +12 -1
- package/dist/posteffect/posteffect.js.map +1 -1
- package/dist/posteffect/postsss.js +572 -0
- package/dist/posteffect/postsss.js.map +1 -0
- package/dist/posteffect/sao.js +48 -50
- package/dist/posteffect/sao.js.map +1 -1
- package/dist/posteffect/skinsss.js +605 -355
- package/dist/posteffect/skinsss.js.map +1 -1
- package/dist/posteffect/ssgi.js +91 -162
- package/dist/posteffect/ssgi.js.map +1 -1
- package/dist/posteffect/ssr.js +3 -11
- package/dist/posteffect/ssr.js.map +1 -1
- package/dist/posteffect/sss.js +34 -15
- package/dist/posteffect/sss.js.map +1 -1
- package/dist/posteffect/taa.js +1 -0
- package/dist/posteffect/taa.js.map +1 -1
- package/dist/render/abuffer_oit.js +40 -39
- package/dist/render/abuffer_oit.js.map +1 -1
- package/dist/render/clipmap.js +328 -62
- package/dist/render/clipmap.js.map +1 -1
- package/dist/render/cluster_light.js +958 -224
- package/dist/render/cluster_light.js.map +1 -1
- package/dist/render/cull_visitor.js +26 -5
- package/dist/render/cull_visitor.js.map +1 -1
- package/dist/render/debug_views.js +37 -0
- package/dist/render/debug_views.js.map +1 -0
- package/dist/render/depthpass.js +5 -1
- package/dist/render/depthpass.js.map +1 -1
- package/dist/render/drawable_mixin.js +53 -6
- package/dist/render/drawable_mixin.js.map +1 -1
- package/dist/render/dualdepthpeeling_oit.js +53 -53
- package/dist/render/dualdepthpeeling_oit.js.map +1 -1
- package/dist/render/envlight.js +196 -113
- package/dist/render/envlight.js.map +1 -1
- package/dist/render/fbm_wavegenerator.js +8 -13
- package/dist/render/fbm_wavegenerator.js.map +1 -1
- package/dist/render/fft_wavegenerator.js +268 -136
- package/dist/render/fft_wavegenerator.js.map +1 -1
- package/dist/render/gerstner_wavegenerator.js +113 -28
- package/dist/render/gerstner_wavegenerator.js.map +1 -1
- package/dist/render/gi/probe_volume.js +1334 -0
- package/dist/render/gi/probe_volume.js.map +1 -0
- package/dist/render/gi/scene_gi.js +282 -0
- package/dist/render/gi/scene_gi.js.map +1 -0
- package/dist/render/gi/voxel_atlas.js +198 -0
- package/dist/render/gi/voxel_atlas.js.map +1 -0
- package/dist/render/gi/voxel_lighting.js +652 -0
- package/dist/render/gi/voxel_lighting.js.map +1 -0
- package/dist/render/gi/voxel_scene.js +642 -0
- package/dist/render/gi/voxel_scene.js.map +1 -0
- package/dist/render/gi/voxelize_pass.js +223 -0
- package/dist/render/gi/voxelize_pass.js.map +1 -0
- package/dist/render/globalbindgroup_allocator.js +3 -2
- package/dist/render/globalbindgroup_allocator.js.map +1 -1
- package/dist/render/gpu_picking.js +9 -36
- package/dist/render/gpu_picking.js.map +1 -1
- package/dist/render/hzb.js +80 -22
- package/dist/render/hzb.js.map +1 -1
- package/dist/render/instance_culling.js +499 -0
- package/dist/render/instance_culling.js.map +1 -0
- package/dist/render/lightpass.js +23 -9
- package/dist/render/lightpass.js.map +1 -1
- package/dist/render/lod.js +46 -0
- package/dist/render/lod.js.map +1 -0
- package/dist/render/oit.js +11 -11
- package/dist/render/oit.js.map +1 -1
- package/dist/render/primitive.js +301 -9
- package/dist/render/primitive.js.map +1 -1
- package/dist/render/primitive_readback.js +209 -0
- package/dist/render/primitive_readback.js.map +1 -0
- package/dist/render/render_queue.js +198 -11
- package/dist/render/render_queue.js.map +1 -1
- package/dist/render/renderer.js +14 -7
- package/dist/render/renderer.js.map +1 -1
- package/dist/render/rendergraph/blackboard.js +15 -1
- package/dist/render/rendergraph/blackboard.js.map +1 -1
- package/dist/render/rendergraph/executor.js +136 -0
- package/dist/render/rendergraph/executor.js.map +1 -1
- package/dist/render/rendergraph/forward_plus_builder.js +585 -59
- package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
- package/dist/render/rendergraph/frame_resource_requirements.js +1 -0
- package/dist/render/rendergraph/frame_resource_requirements.js.map +1 -1
- package/dist/render/rendergraph/history_resources.js +8 -1
- package/dist/render/rendergraph/history_resources.js.map +1 -1
- package/dist/render/rendergraph/scene_render_context.js +31 -2
- package/dist/render/rendergraph/scene_render_context.js.map +1 -1
- package/dist/render/rendergraph/types.js.map +1 -1
- package/dist/render/renderpass.js +28 -5
- package/dist/render/renderpass.js.map +1 -1
- package/dist/render/sdf/box_allocator.js +98 -0
- package/dist/render/sdf/box_allocator.js.map +1 -0
- package/dist/render/sdf/global_sdf.js +865 -0
- package/dist/render/sdf/global_sdf.js.map +1 -0
- package/dist/render/sdf/scene_sdf.js +562 -0
- package/dist/render/sdf/scene_sdf.js.map +1 -0
- package/dist/render/sdf/sdf_atlas.js +227 -0
- package/dist/render/sdf/sdf_atlas.js.map +1 -0
- package/dist/render/sdf/sdf_programs.js +42 -0
- package/dist/render/sdf/sdf_programs.js.map +1 -0
- package/dist/render/sdf/sdf_view.js +199 -0
- package/dist/render/sdf/sdf_view.js.map +1 -0
- package/dist/render/sdf/waterline.js +610 -0
- package/dist/render/sdf/waterline.js.map +1 -0
- package/dist/render/shadow_mask_pass.js +142 -25
- package/dist/render/shadow_mask_pass.js.map +1 -1
- package/dist/render/shore_wave_generator.js +1193 -0
- package/dist/render/shore_wave_generator.js.map +1 -0
- package/dist/render/sky.js +516 -86
- package/dist/render/sky.js.map +1 -1
- package/dist/render/transmission_thickness_pass.js +477 -0
- package/dist/render/transmission_thickness_pass.js.map +1 -0
- package/dist/render/underwater.js +524 -0
- package/dist/render/underwater.js.map +1 -0
- package/dist/render/virtualtexture/virtual_texture.js +1214 -0
- package/dist/render/virtualtexture/virtual_texture.js.map +1 -0
- package/dist/render/volumetric_cloud/cloud_common.js +472 -0
- package/dist/render/volumetric_cloud/cloud_common.js.map +1 -0
- package/dist/render/volumetric_cloud/cloud_noise.js +189 -0
- package/dist/render/volumetric_cloud/cloud_noise.js.map +1 -0
- package/dist/render/volumetric_cloud/debug_view.js +131 -0
- package/dist/render/volumetric_cloud/debug_view.js.map +1 -0
- package/dist/render/volumetric_cloud/resources.js +380 -0
- package/dist/render/volumetric_cloud/resources.js.map +1 -0
- package/dist/render/volumetric_cloud/sky_cache.js +380 -0
- package/dist/render/volumetric_cloud/sky_cache.js.map +1 -0
- package/dist/render/volumetric_cloud/volumetric_cloud.js +318 -0
- package/dist/render/volumetric_cloud/volumetric_cloud.js.map +1 -0
- package/dist/render/water_caustics.js +1195 -0
- package/dist/render/water_caustics.js.map +1 -0
- package/dist/render/water_foam.js +627 -0
- package/dist/render/water_foam.js.map +1 -0
- package/dist/render/water_interaction.js +1795 -0
- package/dist/render/water_interaction.js.map +1 -0
- package/dist/render/weightedblended_oit.js +36 -36
- package/dist/render/weightedblended_oit.js.map +1 -1
- package/dist/scene/basesprite.js +9 -4
- package/dist/scene/basesprite.js.map +1 -1
- package/dist/scene/batchgroup.js +108 -12
- package/dist/scene/batchgroup.js.map +1 -1
- package/dist/scene/environment.js +28 -7
- package/dist/scene/environment.js.map +1 -1
- package/dist/scene/foliage.js +1020 -0
- package/dist/scene/foliage.js.map +1 -0
- package/dist/scene/foliage_buckets.js +147 -0
- package/dist/scene/foliage_buckets.js.map +1 -0
- package/dist/scene/foliage_mask.js +358 -0
- package/dist/scene/foliage_mask.js.map +1 -0
- package/dist/scene/hair.js +15 -4
- package/dist/scene/hair.js.map +1 -1
- package/dist/scene/light.js +179 -13
- package/dist/scene/light.js.map +1 -1
- package/dist/scene/mesh.js +327 -45
- package/dist/scene/mesh.js.map +1 -1
- package/dist/scene/meshdrawable.js +6 -0
- package/dist/scene/meshdrawable.js.map +1 -1
- package/dist/scene/msdftext.js +9 -3
- package/dist/scene/msdftext.js.map +1 -1
- package/dist/scene/msdftextsprite.js +9 -3
- package/dist/scene/msdftextsprite.js.map +1 -1
- package/dist/scene/particlesys.js +8 -2
- package/dist/scene/particlesys.js.map +1 -1
- package/dist/scene/physics_settings.js +157 -0
- package/dist/scene/physics_settings.js.map +1 -0
- package/dist/scene/scene.js +190 -44
- package/dist/scene/scene.js.map +1 -1
- package/dist/scene/scene_node.js +147 -6
- package/dist/scene/scene_node.js.map +1 -1
- package/dist/scene/terrain-cm/bladegrassmaterial.js +735 -0
- package/dist/scene/terrain-cm/bladegrassmaterial.js.map +1 -0
- package/dist/scene/terrain-cm/grass.js +881 -42
- package/dist/scene/terrain-cm/grass.js.map +1 -1
- package/dist/scene/terrain-cm/grass_gpu.js +929 -0
- package/dist/scene/terrain-cm/grass_gpu.js.map +1 -0
- package/dist/scene/terrain-cm/grassmaterial.js +180 -9
- package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
- package/dist/scene/terrain-cm/terrain-cm.js +465 -36
- package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
- package/dist/scene/terrain-cm/terrain_gi_albedo.js +257 -0
- package/dist/scene/terrain-cm/terrain_gi_albedo.js.map +1 -0
- package/dist/scene/terrain-cm/terrain_rvt.js +395 -0
- package/dist/scene/terrain-cm/terrain_rvt.js.map +1 -0
- package/dist/scene/update_queue.js +54 -0
- package/dist/scene/update_queue.js.map +1 -0
- package/dist/scene/water.js +997 -96
- package/dist/scene/water.js.map +1 -1
- package/dist/scene/water_surface_sampler.js +324 -0
- package/dist/scene/water_surface_sampler.js.map +1 -0
- package/dist/scene/wind.js +317 -0
- package/dist/scene/wind.js.map +1 -0
- package/dist/shaders/atmosphere.js +388 -166
- package/dist/shaders/atmosphere.js.map +1 -1
- package/dist/shaders/fog.js +100 -32
- package/dist/shaders/fog.js.map +1 -1
- package/dist/shaders/gi.js +365 -0
- package/dist/shaders/gi.js.map +1 -0
- package/dist/shaders/ltc_rect.js +202 -0
- package/dist/shaders/ltc_rect.js.map +1 -0
- package/dist/shaders/misc.js +1 -10
- package/dist/shaders/misc.js.map +1 -1
- package/dist/shaders/noise.js +5 -1
- package/dist/shaders/noise.js.map +1 -1
- package/dist/shaders/probes.js +309 -0
- package/dist/shaders/probes.js.map +1 -0
- package/dist/shaders/sdf.js +537 -0
- package/dist/shaders/sdf.js.map +1 -0
- package/dist/shaders/shadow.js +104 -70
- package/dist/shaders/shadow.js.map +1 -1
- package/dist/shaders/skin_brdf.js +243 -0
- package/dist/shaders/skin_brdf.js.map +1 -0
- package/dist/shaders/ssr.js +6 -159
- package/dist/shaders/ssr.js.map +1 -1
- package/dist/shaders/temporal.js +38 -27
- package/dist/shaders/temporal.js.map +1 -1
- package/dist/shaders/water.js +40 -87
- package/dist/shaders/water.js.map +1 -1
- package/dist/shaders/water_medium.js +42 -0
- package/dist/shaders/water_medium.js.map +1 -0
- package/dist/shadow/dom.js +110 -19
- package/dist/shadow/dom.js.map +1 -1
- package/dist/shadow/esm.js +3 -3
- package/dist/shadow/esm.js.map +1 -1
- package/dist/shadow/pcf_opt.js +15 -48
- package/dist/shadow/pcf_opt.js.map +1 -1
- package/dist/shadow/pcf_pd.js +15 -53
- package/dist/shadow/pcf_pd.js.map +1 -1
- package/dist/shadow/pcss.js +34 -9
- package/dist/shadow/pcss.js.map +1 -1
- package/dist/shadow/shadow_impl.js +3 -8
- package/dist/shadow/shadow_impl.js.map +1 -1
- package/dist/shadow/shadow_region.js +87 -49
- package/dist/shadow/shadow_region.js.map +1 -1
- package/dist/shadow/shadowmapper.js +93 -53
- package/dist/shadow/shadowmapper.js.map +1 -1
- package/dist/shadow/ssm.js +18 -72
- package/dist/shadow/ssm.js.map +1 -1
- package/dist/shadow/vsm.js +3 -3
- package/dist/shadow/vsm.js.map +1 -1
- package/dist/shapes/shape.js +44 -1
- package/dist/shapes/shape.js.map +1 -1
- package/dist/utility/buoyancy.js +287 -0
- package/dist/utility/buoyancy.js.map +1 -0
- package/dist/utility/physical.js +10 -1
- package/dist/utility/physical.js.map +1 -1
- package/dist/utility/pmrem.js +17 -43
- package/dist/utility/pmrem.js.map +1 -1
- package/dist/utility/sdf/bake.js +435 -0
- package/dist/utility/sdf/bake.js.map +1 -0
- package/dist/utility/sdf/bvh.js +576 -0
- package/dist/utility/sdf/bvh.js.map +1 -0
- package/dist/utility/serialization/manager.js +36 -6
- package/dist/utility/serialization/manager.js.map +1 -1
- package/dist/utility/serialization/scene/animation.js +77 -7
- package/dist/utility/serialization/scene/animation.js.map +1 -1
- package/dist/utility/serialization/scene/batch.js +11 -4
- package/dist/utility/serialization/scene/batch.js.map +1 -1
- package/dist/utility/serialization/scene/camera.js +140 -279
- package/dist/utility/serialization/scene/camera.js.map +1 -1
- package/dist/utility/serialization/scene/cloth.js +25 -0
- package/dist/utility/serialization/scene/cloth.js.map +1 -0
- package/dist/utility/serialization/scene/common.js +14 -6
- package/dist/utility/serialization/scene/common.js.map +1 -1
- package/dist/utility/serialization/scene/foliage.js +821 -0
- package/dist/utility/serialization/scene/foliage.js.map +1 -0
- package/dist/utility/serialization/scene/hair.js +11 -4
- package/dist/utility/serialization/scene/hair.js.map +1 -1
- package/dist/utility/serialization/scene/light.js +115 -7
- package/dist/utility/serialization/scene/light.js.map +1 -1
- package/dist/utility/serialization/scene/material.js +388 -220
- package/dist/utility/serialization/scene/material.js.map +1 -1
- package/dist/utility/serialization/scene/mesh.js +69 -4
- package/dist/utility/serialization/scene/mesh.js.map +1 -1
- package/dist/utility/serialization/scene/node.js +140 -5
- package/dist/utility/serialization/scene/node.js.map +1 -1
- package/dist/utility/serialization/scene/node_physics.js +1318 -0
- package/dist/utility/serialization/scene/node_physics.js.map +1 -0
- package/dist/utility/serialization/scene/particle.js +11 -4
- package/dist/utility/serialization/scene/particle.js.map +1 -1
- package/dist/utility/serialization/scene/physics.js +120 -0
- package/dist/utility/serialization/scene/physics.js.map +1 -0
- package/dist/utility/serialization/scene/primitive.js +124 -10
- package/dist/utility/serialization/scene/primitive.js.map +1 -1
- package/dist/utility/serialization/scene/scene.js +1687 -51
- package/dist/utility/serialization/scene/scene.js.map +1 -1
- package/dist/utility/serialization/scene/sprite.js +11 -4
- package/dist/utility/serialization/scene/sprite.js.map +1 -1
- package/dist/utility/serialization/scene/terrain.js +163 -33
- package/dist/utility/serialization/scene/terrain.js.map +1 -1
- package/dist/utility/serialization/scene/text.js +11 -4
- package/dist/utility/serialization/scene/text.js.map +1 -1
- package/dist/utility/serialization/scene/water.js +2473 -114
- package/dist/utility/serialization/scene/water.js.map +1 -1
- package/dist/utility/serialization/types.js.map +1 -1
- package/dist/utility/shprojector.js +97 -109
- package/dist/utility/shprojector.js.map +1 -1
- package/dist/utility/textures/foam.js +170 -0
- package/dist/utility/textures/foam.js.map +1 -0
- package/dist/utility/textures/ggxlut.js +17 -43
- package/dist/utility/textures/ggxlut.js.map +1 -1
- package/dist/utility/textures/ltcdata.js +4 -4
- package/dist/utility/textures/ltcdata.js.map +1 -1
- package/dist/utility/textures/ltclut.js +16 -6
- package/dist/utility/textures/ltclut.js.map +1 -1
- package/dist/utility/unsupported.js +24 -0
- package/dist/utility/unsupported.js.map +1 -0
- package/dist/values.js +13 -1
- package/dist/values.js.map +1 -1
- package/package.json +25 -12
- package/src/asset/loaders/ktx2/basis/LICENSE +201 -0
- package/src/asset/loaders/ktx2/basis/basis_transcoder.js +2 -0
- package/src/asset/loaders/ktx2/basis/basis_transcoder.wasm +0 -0
- package/src/asset/meshoptimizer/LICENSE +21 -0
|
@@ -0,0 +1,365 @@
|
|
|
1
|
+
import { sampleInstanceField, sampleGlobalSDFHinted, sdfSurfaceExpand, GLOBAL_SDF_PARAMS, GLOBAL_SDF_LEVELS, globalSDFVoxelCurrent, SDF_LEVEL_BLEND_VOXELS } from './sdf.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Uniform names of the voxelize pass, see {@link declareVoxelizeUniforms}.
|
|
5
|
+
* @internal
|
|
6
|
+
*/ const VOXELIZE_ALBEDO = 'zVoxelizeAlbedo';
|
|
7
|
+
/** @internal */ const VOXELIZE_EMISSIVE = 'zVoxelizeEmissive';
|
|
8
|
+
/** @internal */ const VOXELIZE_PARAMS = 'zVoxelizeParams';
|
|
9
|
+
/**
|
|
10
|
+
* Uniform names of the voxel scene (material clipmaps), see
|
|
11
|
+
* {@link declareVoxelSceneUniforms}.
|
|
12
|
+
* @internal
|
|
13
|
+
*/ const VOXEL_SCENE_ALBEDO = 'zVoxelSceneAlbedo';
|
|
14
|
+
/** @internal */ const VOXEL_SCENE_EMISSIVE = 'zVoxelSceneEmissive';
|
|
15
|
+
/** @internal */ const VOXEL_SCENE_RADIANCE = 'zVoxelSceneRadiance';
|
|
16
|
+
/** @internal */ const VOXEL_SCENE_ANISO0 = 'zVoxelSceneAniso0';
|
|
17
|
+
/** @internal */ const VOXEL_SCENE_ANISO1 = 'zVoxelSceneAniso1';
|
|
18
|
+
/**
|
|
19
|
+
* Declares the voxelize pass targets of {@link storeVoxelMaterial}; fragment stage only
|
|
20
|
+
* (write-only storage textures).
|
|
21
|
+
*
|
|
22
|
+
* - albedo: rgba8unorm storage, rgb albedo, a = 1 where rasterized (trilinear reads as
|
|
23
|
+
* premultiplied colour and coverage).
|
|
24
|
+
* - emissive: rgba8unorm storage holding RGBE.
|
|
25
|
+
* - params[0]: (field box min, voxel size), params[1]: (atlas slot offset, 0),
|
|
26
|
+
* params[2]: (voxels per axis of the slot, 0); all in mesh local space.
|
|
27
|
+
* @internal
|
|
28
|
+
*/ function declareVoxelizeUniforms(scope, group) {
|
|
29
|
+
const pb = scope.$builder;
|
|
30
|
+
scope[VOXELIZE_ALBEDO] = pb.texStorage3D.rgba8unorm().storage(group);
|
|
31
|
+
scope[VOXELIZE_EMISSIVE] = pb.texStorage3D.rgba8unorm().storage(group);
|
|
32
|
+
scope[VOXELIZE_PARAMS] = pb.vec4[3]().uniform(group);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Packs an HDR colour as RGBE into four unorm8 channels: the mantissas scaled
|
|
36
|
+
* so the largest lies in (0.5, 1], the shared exponent biased by 128 in alpha.
|
|
37
|
+
* Zero for black.
|
|
38
|
+
* @internal
|
|
39
|
+
*/ function encodeRGBE(scope, color) {
|
|
40
|
+
const pb = scope.$builder;
|
|
41
|
+
const funcName = 'Z_encodeRGBE';
|
|
42
|
+
pb.func(funcName, [
|
|
43
|
+
pb.vec3('c')
|
|
44
|
+
], function() {
|
|
45
|
+
this.$l.m = pb.max(pb.max(this.c.r, this.c.g), this.c.b);
|
|
46
|
+
this.$if(pb.lessThanEqual(this.m, 1e-6), function() {
|
|
47
|
+
this.$return(pb.vec4(0));
|
|
48
|
+
});
|
|
49
|
+
this.$l.e = pb.clamp(pb.ceil(pb.log2(this.m)), -127, 127);
|
|
50
|
+
this.$return(pb.vec4(pb.div(this.c, pb.exp2(this.e)), pb.div(pb.add(this.e, 128), 255)));
|
|
51
|
+
});
|
|
52
|
+
return scope[funcName](color);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Unpacks what {@link encodeRGBE} packed.
|
|
56
|
+
* @internal
|
|
57
|
+
*/ function decodeRGBE(scope, value) {
|
|
58
|
+
const pb = scope.$builder;
|
|
59
|
+
const funcName = 'Z_decodeRGBE';
|
|
60
|
+
pb.func(funcName, [
|
|
61
|
+
pb.vec4('v')
|
|
62
|
+
], function() {
|
|
63
|
+
this.$if(pb.lessThanEqual(this.v.a, 0), function() {
|
|
64
|
+
this.$return(pb.vec3(0));
|
|
65
|
+
});
|
|
66
|
+
this.$return(pb.mul(this.v.rgb, pb.exp2(pb.sub(pb.mul(this.v.a, 255), 128))));
|
|
67
|
+
});
|
|
68
|
+
return scope[funcName](value);
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Stores a fragment's material in the atlas slot voxel holding its mesh-local position
|
|
72
|
+
* (the voxelize pass draws with an identity world matrix); fragments outside the box are dropped.
|
|
73
|
+
* @internal
|
|
74
|
+
*/ function storeVoxelMaterial(scope, localPos, albedo, emissive) {
|
|
75
|
+
const pb = scope.$builder;
|
|
76
|
+
const funcName = 'Z_storeVoxelMaterial';
|
|
77
|
+
pb.func(funcName, [
|
|
78
|
+
pb.vec3('pos'),
|
|
79
|
+
pb.vec3('albedo'),
|
|
80
|
+
pb.vec3('emissive')
|
|
81
|
+
], function() {
|
|
82
|
+
this.$l.p0 = this[VOXELIZE_PARAMS].at(0);
|
|
83
|
+
this.$l.p1 = this[VOXELIZE_PARAMS].at(1);
|
|
84
|
+
this.$l.p2 = this[VOXELIZE_PARAMS].at(2);
|
|
85
|
+
this.$l.v = pb.floor(pb.div(pb.sub(this.pos, this.p0.xyz), this.p0.w));
|
|
86
|
+
this.$if(pb.and(pb.all(pb.greaterThanEqual(this.v, pb.vec3(0))), pb.all(pb.lessThan(this.v, this.p2.xyz))), function() {
|
|
87
|
+
this.$l.t = pb.uvec3(pb.add(this.p1.xyz, this.v));
|
|
88
|
+
pb.textureStore(this[VOXELIZE_ALBEDO], this.t, pb.vec4(this.albedo, 1));
|
|
89
|
+
pb.textureStore(this[VOXELIZE_EMISSIVE], this.t, encodeRGBE(this, this.emissive));
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
scope[funcName](localPos, albedo, emissive);
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Albedo and emissive of one packed instance at a local point, read from the material
|
|
96
|
+
* atlases after projecting the point onto the surface along the baked field's gradient.
|
|
97
|
+
* No coverage, or no material slot (`matSlot.w <= 0`), gives alpha 0.
|
|
98
|
+
*
|
|
99
|
+
* Declares locals `outAlbedo` (vec4, a = 1 where valid) and `outEmissive` (vec3).
|
|
100
|
+
* @internal
|
|
101
|
+
*/ function sampleInstanceMaterial(scope, lp, bmin, bmax, slot, matSlot, matRes, sdfAtlas, sdfAtlasInvSize, matAlbedo, matEmissive, matAtlasInvSize, outAlbedo, outEmissive) {
|
|
102
|
+
const pb = scope.$builder;
|
|
103
|
+
scope.$l[outAlbedo] = pb.vec4(0);
|
|
104
|
+
scope.$l[outEmissive] = pb.vec3(0);
|
|
105
|
+
scope.$if(pb.greaterThan(matSlot.w, 0), function() {
|
|
106
|
+
// Unclamped so the gradient stays valid outside the field box; several steps
|
|
107
|
+
// because in corners the differenced gradient blends faces and one step falls short
|
|
108
|
+
this.$l.gmH = bmin.w;
|
|
109
|
+
this.$l.gmS = lp;
|
|
110
|
+
this.$l.gmN = pb.vec3(0, 1, 0);
|
|
111
|
+
this.$for(pb.int('gmIt'), 0, 3, function() {
|
|
112
|
+
this.$l.gmD = sampleInstanceField(this, this.gmS, bmin, bmax, slot, sdfAtlas, sdfAtlasInvSize);
|
|
113
|
+
this.$l.gmG = pb.vec3(pb.sub(sampleInstanceField(this, pb.add(this.gmS, pb.vec3(this.gmH, 0, 0)), bmin, bmax, slot, sdfAtlas, sdfAtlasInvSize), this.gmD), pb.sub(sampleInstanceField(this, pb.add(this.gmS, pb.vec3(0, this.gmH, 0)), bmin, bmax, slot, sdfAtlas, sdfAtlasInvSize), this.gmD), pb.sub(sampleInstanceField(this, pb.add(this.gmS, pb.vec3(0, 0, this.gmH)), bmin, bmax, slot, sdfAtlas, sdfAtlasInvSize), this.gmD));
|
|
114
|
+
this.gmN = pb.div(this.gmG, pb.max(pb.length(this.gmG), 1e-6));
|
|
115
|
+
this.gmS = pb.sub(this.gmS, pb.mul(this.gmN, this.gmD));
|
|
116
|
+
});
|
|
117
|
+
// Material voxels are twice the field's. The surface is a one-voxel shell, so take
|
|
118
|
+
// the best covered of three samples along the normal
|
|
119
|
+
this.$l.gmA = pb.vec4(0);
|
|
120
|
+
this.$l.gmUVW = pb.vec3(0);
|
|
121
|
+
for (const [k, tag] of [
|
|
122
|
+
[
|
|
123
|
+
0,
|
|
124
|
+
'On'
|
|
125
|
+
],
|
|
126
|
+
[
|
|
127
|
+
-0.5,
|
|
128
|
+
'In'
|
|
129
|
+
],
|
|
130
|
+
[
|
|
131
|
+
0.5,
|
|
132
|
+
'Out'
|
|
133
|
+
]
|
|
134
|
+
]){
|
|
135
|
+
this.$l[`gmF${tag}`] = pb.clamp(pb.div(pb.sub(pb.add(this.gmS, pb.mul(this.gmN, this.gmH, 2 * k)), bmin.xyz), pb.mul(this.gmH, 2)), pb.vec3(0.5), pb.sub(matRes.xyz, pb.vec3(0.5)));
|
|
136
|
+
this.$l[`gmUVW${tag}`] = pb.mul(pb.add(matSlot.xyz, this[`gmF${tag}`]), matAtlasInvSize);
|
|
137
|
+
this.$l[`gmA${tag}`] = pb.textureSampleLevel(matAlbedo, this[`gmUVW${tag}`], 0);
|
|
138
|
+
this.$if(pb.greaterThan(this[`gmA${tag}`].a, this.gmA.a), function() {
|
|
139
|
+
this.gmA = this[`gmA${tag}`];
|
|
140
|
+
this.gmUVW = this[`gmUVW${tag}`];
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
this.$if(pb.greaterThan(this.gmA.a, 0.02), function() {
|
|
144
|
+
this[outAlbedo] = pb.vec4(pb.div(this.gmA.rgb, this.gmA.a), 1);
|
|
145
|
+
// RGBE cannot be filtered: manual trilinear over decoded texels, weighted by coverage
|
|
146
|
+
this.$l.gmSize = pb.div(pb.vec3(1), matAtlasInvSize);
|
|
147
|
+
this.$l.gmTc = pb.sub(pb.mul(this.gmUVW, this.gmSize), pb.vec3(0.5));
|
|
148
|
+
this.$l.gmBase = pb.ivec3(pb.floor(this.gmTc));
|
|
149
|
+
this.$l.gmFr = pb.sub(this.gmTc, pb.floor(this.gmTc));
|
|
150
|
+
this.$l.gmEsum = pb.vec3(0);
|
|
151
|
+
this.$l.gmWsum = pb.float(0);
|
|
152
|
+
for(let k = 0; k < 8; k++){
|
|
153
|
+
const off = [
|
|
154
|
+
k & 1,
|
|
155
|
+
k >> 1 & 1,
|
|
156
|
+
k >> 2 & 1
|
|
157
|
+
];
|
|
158
|
+
this.$l[`gmT${k}`] = pb.add(this.gmBase, pb.ivec3(off[0], off[1], off[2]));
|
|
159
|
+
this.$l[`gmW${k}`] = pb.mul(off[0] ? this.gmFr.x : pb.sub(1, this.gmFr.x), off[1] ? this.gmFr.y : pb.sub(1, this.gmFr.y), off[2] ? this.gmFr.z : pb.sub(1, this.gmFr.z), pb.textureLoad(matAlbedo, this[`gmT${k}`], 0).a);
|
|
160
|
+
this.gmEsum = pb.add(this.gmEsum, pb.mul(decodeRGBE(this, pb.textureLoad(matEmissive, this[`gmT${k}`], 0)), this[`gmW${k}`]));
|
|
161
|
+
this.gmWsum = pb.add(this.gmWsum, this[`gmW${k}`]);
|
|
162
|
+
}
|
|
163
|
+
this[outEmissive] = pb.div(this.gmEsum, pb.max(this.gmWsum, 1e-4));
|
|
164
|
+
});
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Declares the voxel scene clipmaps; same layout as the global SDF (levels stacked along z,
|
|
169
|
+
* toroidal windows, same bricks) at half resolution. Requires {@link declareGlobalSDFUniforms}.
|
|
170
|
+
*
|
|
171
|
+
* - albedo: rgba8unorm, rgb albedo, a = 1 where a surface is.
|
|
172
|
+
* - emissive: rgba16float, emitted radiance.
|
|
173
|
+
* - radiance: rgba16float, outgoing radiance summed over the six axis faces.
|
|
174
|
+
* - aniso0, aniso1: rgba8unorm (aniso1 rg8unorm with texture-formats-tier1), per-face share
|
|
175
|
+
* of that sum by luminance: (+x, +y, +z, -x) and (-y, -z) in rg.
|
|
176
|
+
* @internal
|
|
177
|
+
*/ function declareVoxelSceneUniforms(scope, group) {
|
|
178
|
+
const pb = scope.$builder;
|
|
179
|
+
scope[VOXEL_SCENE_ALBEDO] = pb.tex3D().sampleType('unfilterable-float').uniform(group);
|
|
180
|
+
scope[VOXEL_SCENE_EMISSIVE] = pb.tex3D().sampleType('unfilterable-float').uniform(group);
|
|
181
|
+
scope[VOXEL_SCENE_RADIANCE] = pb.tex3D().sampleType('unfilterable-float').uniform(group);
|
|
182
|
+
scope[VOXEL_SCENE_ANISO0] = pb.tex3D().sampleType('unfilterable-float').uniform(group);
|
|
183
|
+
scope[VOXEL_SCENE_ANISO1] = pb.tex3D().sampleType('unfilterable-float').uniform(group);
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Outgoing radiance at a texel of {@link voxelSceneTexel} toward `normal`, weighted by the
|
|
187
|
+
* per-face anisotropy shares. Zero for level -1.
|
|
188
|
+
* @internal
|
|
189
|
+
*/ function loadVoxelSceneRadiance(scope, texel, normal) {
|
|
190
|
+
const pb = scope.$builder;
|
|
191
|
+
const funcName = 'Z_loadVoxelSceneRadiance';
|
|
192
|
+
pb.func(funcName, [
|
|
193
|
+
pb.ivec4('t'),
|
|
194
|
+
pb.vec3('n')
|
|
195
|
+
], function() {
|
|
196
|
+
this.$if(pb.lessThan(this.t.w, 0), function() {
|
|
197
|
+
this.$return(pb.vec3(0));
|
|
198
|
+
});
|
|
199
|
+
this.$l.total = pb.textureLoad(this[VOXEL_SCENE_RADIANCE], this.t.xyz, 0).rgb;
|
|
200
|
+
this.$l.a0 = pb.textureLoad(this[VOXEL_SCENE_ANISO0], this.t.xyz, 0);
|
|
201
|
+
this.$l.a1 = pb.textureLoad(this[VOXEL_SCENE_ANISO1], this.t.xyz, 0);
|
|
202
|
+
this.$l.pos = pb.max(pb.vec3(0), pb.mul(this.n, this.a0.xyz));
|
|
203
|
+
this.$l.neg = pb.max(pb.vec3(0), pb.mul(pb.neg(this.n), pb.vec3(this.a0.w, this.a1.x, this.a1.y)));
|
|
204
|
+
this.$return(pb.mul(this.total, pb.add(pb.dot(this.pos, pb.vec3(1)), pb.dot(this.neg, pb.vec3(1)))));
|
|
205
|
+
});
|
|
206
|
+
return scope[funcName](texel, normal);
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Distant-light visibility by SDF cone tracing through the global field (Wright,
|
|
210
|
+
* "Dynamic Occlusion with Signed Distance Fields", SIGGRAPH 2015).
|
|
211
|
+
*
|
|
212
|
+
* `start` should already be offset off the surface; `tanHalfAngle` sets softness, `minStep`
|
|
213
|
+
* prevents stalling, `maxDistance` ends the march. Levels finer than `minLevel` are skipped.
|
|
214
|
+
* Static geometry only.
|
|
215
|
+
* @internal
|
|
216
|
+
*/ function sdfConeShadow(scope, start, dir, tanHalfAngle, minStep, maxDistance, levels, steps = 24, minLevel) {
|
|
217
|
+
const pb = scope.$builder;
|
|
218
|
+
const funcName = 'Z_sdfConeShadow';
|
|
219
|
+
pb.func(funcName, [
|
|
220
|
+
pb.vec3('start'),
|
|
221
|
+
pb.vec3('dir'),
|
|
222
|
+
pb.float('tanHalf'),
|
|
223
|
+
pb.float('minStep'),
|
|
224
|
+
pb.float('maxDist'),
|
|
225
|
+
pb.int('minLevel')
|
|
226
|
+
], function() {
|
|
227
|
+
this.$l.shadow = pb.float(1);
|
|
228
|
+
this.$l.t = this.minStep;
|
|
229
|
+
this.$l.prevD = pb.float(0);
|
|
230
|
+
this.$for(pb.int('i'), 0, steps, function() {
|
|
231
|
+
this.$l.sp = pb.add(this.start, pb.mul(this.dir, this.t));
|
|
232
|
+
this.$l.s = sampleGlobalSDFHinted(this, this.sp, this.prevD, levels, this.minLevel);
|
|
233
|
+
this.$l.d = this.s.x;
|
|
234
|
+
this.prevD = this.d;
|
|
235
|
+
this.$l.expand = sdfSurfaceExpand(this, this.sp, this.s, pb.sub(this.t, this.minStep), levels);
|
|
236
|
+
this.shadow = pb.min(this.shadow, pb.clamp(pb.div(pb.sub(this.d, this.expand), pb.mul(this.t, this.tanHalf)), 0, 1));
|
|
237
|
+
this.$if(pb.lessThan(this.shadow, 0.01), function() {
|
|
238
|
+
this.$break();
|
|
239
|
+
});
|
|
240
|
+
this.t = pb.add(this.t, pb.clamp(this.d, this.minStep, pb.mul(this.minStep, 16)));
|
|
241
|
+
this.$if(pb.greaterThan(this.t, this.maxDist), function() {
|
|
242
|
+
this.$break();
|
|
243
|
+
});
|
|
244
|
+
});
|
|
245
|
+
this.$return(this.shadow);
|
|
246
|
+
});
|
|
247
|
+
return scope[funcName](start, dir, tanHalfAngle, minStep, maxDistance, minLevel ?? pb.int(0));
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Texel (x, y, z, level) of the finest material clipmap level holding a world position with a
|
|
251
|
+
* current brick; level -1 when none does.
|
|
252
|
+
* @internal
|
|
253
|
+
*/ function voxelSceneTexel(scope, worldPos, levels) {
|
|
254
|
+
const pb = scope.$builder;
|
|
255
|
+
const funcName = 'Z_voxelSceneTexel';
|
|
256
|
+
pb.func(funcName, [
|
|
257
|
+
pb.vec3('p')
|
|
258
|
+
], function() {
|
|
259
|
+
this.$l.res = pb.int(this[GLOBAL_SDF_PARAMS].x);
|
|
260
|
+
this.$l.half = pb.div(this.res, 2);
|
|
261
|
+
this.$l.halfV = pb.ivec3(this.half);
|
|
262
|
+
this.$l.result = pb.ivec4(0, 0, 0, -1);
|
|
263
|
+
for(let i = levels - 1; i >= 0; i--){
|
|
264
|
+
this.$l[`info${i}`] = this[GLOBAL_SDF_LEVELS].at(i);
|
|
265
|
+
this.$l[`vf${i}`] = pb.ivec3(pb.floor(pb.div(this.p, this[`info${i}`].w)));
|
|
266
|
+
this.$l[`o${i}`] = pb.ivec3(this[`info${i}`].xyz);
|
|
267
|
+
this.$l[`in${i}`] = pb.and(pb.all(pb.greaterThanEqual(this[`vf${i}`], this[`o${i}`])), pb.all(pb.lessThan(this[`vf${i}`], pb.add(this[`o${i}`], pb.ivec3(this.res)))));
|
|
268
|
+
this.$if(this[`in${i}`], function() {
|
|
269
|
+
this.$if(globalSDFVoxelCurrent(this, this[`vf${i}`], i), function() {
|
|
270
|
+
this.$l.vc = pb.ivec3(pb.floor(pb.div(pb.vec3(this[`vf${i}`]), 2)));
|
|
271
|
+
this.$l.t = pb.mod(pb.add(pb.mod(this.vc, this.halfV), this.halfV), this.halfV);
|
|
272
|
+
this.result = pb.ivec4(this.t.x, this.t.y, pb.add(this.t.z, pb.mul(this.half, i)), i);
|
|
273
|
+
});
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
this.$return(this.result);
|
|
277
|
+
});
|
|
278
|
+
return scope[funcName](worldPos);
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Voxel scene radiance at a world position toward `normal` (see {@link loadVoxelSceneRadiance}),
|
|
282
|
+
* blended across levels like {@link sampleGlobalSDF} within {@link SDF_LEVEL_BLEND_VOXELS} of a
|
|
283
|
+
* window edge. Zero where no level holds the point with a current brick.
|
|
284
|
+
* @internal
|
|
285
|
+
*/ function sampleVoxelSceneRadiance(scope, worldPos, normal, levels) {
|
|
286
|
+
const pb = scope.$builder;
|
|
287
|
+
const funcName = 'Z_sampleVoxelSceneRadiance';
|
|
288
|
+
pb.func(funcName, [
|
|
289
|
+
pb.vec3('p'),
|
|
290
|
+
pb.vec3('n')
|
|
291
|
+
], function() {
|
|
292
|
+
this.$l.res = pb.int(this[GLOBAL_SDF_PARAMS].x);
|
|
293
|
+
this.$l.resF = this[GLOBAL_SDF_PARAMS].x;
|
|
294
|
+
this.$l.half = pb.div(this.res, 2);
|
|
295
|
+
this.$l.halfV = pb.ivec3(this.half);
|
|
296
|
+
this.$l.sum = pb.vec3(0);
|
|
297
|
+
this.$l.remaining = pb.float(1);
|
|
298
|
+
for(let i = 0; i < levels; i++){
|
|
299
|
+
// Finest first, each level taking the share its finer levels left
|
|
300
|
+
this.$if(pb.greaterThan(this.remaining, 1e-4), function() {
|
|
301
|
+
this.$l.info = this[GLOBAL_SDF_LEVELS].at(i);
|
|
302
|
+
this.$l.vf = pb.ivec3(pb.floor(pb.div(this.p, this.info.w)));
|
|
303
|
+
this.$l.o = pb.ivec3(this.info.xyz);
|
|
304
|
+
this.$l.inside = pb.and(pb.all(pb.greaterThanEqual(this.vf, this.o)), pb.all(pb.lessThan(this.vf, pb.add(this.o, pb.ivec3(this.res)))));
|
|
305
|
+
this.$if(this.inside, function() {
|
|
306
|
+
this.$if(globalSDFVoxelCurrent(this, this.vf, i), function() {
|
|
307
|
+
this.$l.vc = pb.ivec3(pb.floor(pb.div(pb.vec3(this.vf), 2)));
|
|
308
|
+
this.$l.t = pb.mod(pb.add(pb.mod(this.vc, this.halfV), this.halfV), this.halfV);
|
|
309
|
+
this.$l.rad = loadVoxelSceneRadiance(this, pb.ivec4(this.t.x, this.t.y, pb.add(this.t.z, pb.mul(this.half, i)), i), this.n);
|
|
310
|
+
if (i === levels - 1) {
|
|
311
|
+
this.$l.w = pb.float(1);
|
|
312
|
+
} else {
|
|
313
|
+
// Field voxels to the window edge, sample centres at integers
|
|
314
|
+
this.$l.f = pb.sub(pb.div(this.p, this.info.w), pb.add(this.info.xyz, pb.vec3(0.5)));
|
|
315
|
+
this.$l.lo = pb.min(pb.min(this.f.x, this.f.y), this.f.z);
|
|
316
|
+
this.$l.hi = pb.sub(pb.sub(this.resF, 1), pb.max(pb.max(this.f.x, this.f.y), this.f.z));
|
|
317
|
+
this.$l.w = pb.smoothStep(1, 1 + SDF_LEVEL_BLEND_VOXELS, pb.min(this.lo, this.hi));
|
|
318
|
+
}
|
|
319
|
+
this.$l.share = pb.mul(this.remaining, this.w);
|
|
320
|
+
this.sum = pb.add(this.sum, pb.mul(this.rad, this.share));
|
|
321
|
+
this.remaining = pb.sub(this.remaining, this.share);
|
|
322
|
+
});
|
|
323
|
+
});
|
|
324
|
+
});
|
|
325
|
+
}
|
|
326
|
+
this.$return(this.sum);
|
|
327
|
+
});
|
|
328
|
+
return scope[funcName](worldPos, normal);
|
|
329
|
+
}
|
|
330
|
+
/**
|
|
331
|
+
* Albedo (rgb) and presence (a) at a texel of {@link voxelSceneTexel}; zero
|
|
332
|
+
* for level -1.
|
|
333
|
+
* @internal
|
|
334
|
+
*/ function loadVoxelSceneAlbedo(scope, texel) {
|
|
335
|
+
const pb = scope.$builder;
|
|
336
|
+
const funcName = 'Z_loadVoxelSceneAlbedo';
|
|
337
|
+
pb.func(funcName, [
|
|
338
|
+
pb.ivec4('t')
|
|
339
|
+
], function() {
|
|
340
|
+
this.$if(pb.lessThan(this.t.w, 0), function() {
|
|
341
|
+
this.$return(pb.vec4(0));
|
|
342
|
+
});
|
|
343
|
+
this.$return(pb.textureLoad(this[VOXEL_SCENE_ALBEDO], this.t.xyz, 0));
|
|
344
|
+
});
|
|
345
|
+
return scope[funcName](texel);
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* Emitted radiance at a texel of {@link voxelSceneTexel}; zero for level -1.
|
|
349
|
+
* @internal
|
|
350
|
+
*/ function loadVoxelSceneEmissive(scope, texel) {
|
|
351
|
+
const pb = scope.$builder;
|
|
352
|
+
const funcName = 'Z_loadVoxelSceneEmissive';
|
|
353
|
+
pb.func(funcName, [
|
|
354
|
+
pb.ivec4('t')
|
|
355
|
+
], function() {
|
|
356
|
+
this.$if(pb.lessThan(this.t.w, 0), function() {
|
|
357
|
+
this.$return(pb.vec3(0));
|
|
358
|
+
});
|
|
359
|
+
this.$return(pb.textureLoad(this[VOXEL_SCENE_EMISSIVE], this.t.xyz, 0).rgb);
|
|
360
|
+
});
|
|
361
|
+
return scope[funcName](texel);
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
export { VOXELIZE_ALBEDO, VOXELIZE_EMISSIVE, VOXELIZE_PARAMS, VOXEL_SCENE_ALBEDO, VOXEL_SCENE_ANISO0, VOXEL_SCENE_ANISO1, VOXEL_SCENE_EMISSIVE, VOXEL_SCENE_RADIANCE, declareVoxelSceneUniforms, declareVoxelizeUniforms, decodeRGBE, encodeRGBE, loadVoxelSceneAlbedo, loadVoxelSceneEmissive, loadVoxelSceneRadiance, sampleInstanceMaterial, sampleVoxelSceneRadiance, sdfConeShadow, storeVoxelMaterial, voxelSceneTexel };
|
|
365
|
+
//# sourceMappingURL=gi.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gi.js","sources":["../../src/shaders/gi.ts"],"sourcesContent":["import type { PBGlobalScope, PBInsideFunctionScope, PBShaderExp } from '@zephyr3d/device';\r\nimport {\r\n GLOBAL_SDF_LEVELS,\r\n GLOBAL_SDF_PARAMS,\r\n globalSDFVoxelCurrent,\r\n sampleGlobalSDFHinted,\r\n sampleInstanceField,\r\n sdfSurfaceExpand,\r\n SDF_LEVEL_BLEND_VOXELS\r\n} from './sdf';\r\n\r\n/**\r\n * Uniform names of the voxelize pass, see {@link declareVoxelizeUniforms}.\r\n * @internal\r\n */\r\nexport const VOXELIZE_ALBEDO = 'zVoxelizeAlbedo';\r\n/** @internal */\r\nexport const VOXELIZE_EMISSIVE = 'zVoxelizeEmissive';\r\n/** @internal */\r\nexport const VOXELIZE_PARAMS = 'zVoxelizeParams';\r\n\r\n/**\r\n * Uniform names of the voxel scene (material clipmaps), see\r\n * {@link declareVoxelSceneUniforms}.\r\n * @internal\r\n */\r\nexport const VOXEL_SCENE_ALBEDO = 'zVoxelSceneAlbedo';\r\n/** @internal */\r\nexport const VOXEL_SCENE_EMISSIVE = 'zVoxelSceneEmissive';\r\n/** @internal */\r\nexport const VOXEL_SCENE_RADIANCE = 'zVoxelSceneRadiance';\r\n/** @internal */\r\nexport const VOXEL_SCENE_ANISO0 = 'zVoxelSceneAniso0';\r\n/** @internal */\r\nexport const VOXEL_SCENE_ANISO1 = 'zVoxelSceneAniso1';\r\n\r\n/**\r\n * Declares the voxelize pass targets of {@link storeVoxelMaterial}; fragment stage only\r\n * (write-only storage textures).\r\n *\r\n * - albedo: rgba8unorm storage, rgb albedo, a = 1 where rasterized (trilinear reads as\r\n * premultiplied colour and coverage).\r\n * - emissive: rgba8unorm storage holding RGBE.\r\n * - params[0]: (field box min, voxel size), params[1]: (atlas slot offset, 0),\r\n * params[2]: (voxels per axis of the slot, 0); all in mesh local space.\r\n * @internal\r\n */\r\nexport function declareVoxelizeUniforms(scope: PBGlobalScope, group: number) {\r\n const pb = scope.$builder;\r\n scope[VOXELIZE_ALBEDO] = pb.texStorage3D.rgba8unorm().storage(group);\r\n scope[VOXELIZE_EMISSIVE] = pb.texStorage3D.rgba8unorm().storage(group);\r\n scope[VOXELIZE_PARAMS] = pb.vec4[3]().uniform(group);\r\n}\r\n\r\n/**\r\n * Packs an HDR colour as RGBE into four unorm8 channels: the mantissas scaled\r\n * so the largest lies in (0.5, 1], the shared exponent biased by 128 in alpha.\r\n * Zero for black.\r\n * @internal\r\n */\r\nexport function encodeRGBE(scope: PBInsideFunctionScope, color: PBShaderExp) {\r\n const pb = scope.$builder;\r\n const funcName = 'Z_encodeRGBE';\r\n pb.func(funcName, [pb.vec3('c')], function () {\r\n this.$l.m = pb.max(pb.max(this.c.r, this.c.g), this.c.b);\r\n this.$if(pb.lessThanEqual(this.m, 1e-6), function () {\r\n this.$return(pb.vec4(0));\r\n });\r\n this.$l.e = pb.clamp(pb.ceil(pb.log2(this.m)), -127, 127);\r\n this.$return(pb.vec4(pb.div(this.c, pb.exp2(this.e)), pb.div(pb.add(this.e, 128), 255)));\r\n });\r\n return scope[funcName](color) as PBShaderExp;\r\n}\r\n\r\n/**\r\n * Unpacks what {@link encodeRGBE} packed.\r\n * @internal\r\n */\r\nexport function decodeRGBE(scope: PBInsideFunctionScope, value: PBShaderExp) {\r\n const pb = scope.$builder;\r\n const funcName = 'Z_decodeRGBE';\r\n pb.func(funcName, [pb.vec4('v')], function () {\r\n this.$if(pb.lessThanEqual(this.v.a, 0), function () {\r\n this.$return(pb.vec3(0));\r\n });\r\n this.$return(pb.mul(this.v.rgb, pb.exp2(pb.sub(pb.mul(this.v.a, 255), 128))));\r\n });\r\n return scope[funcName](value) as PBShaderExp;\r\n}\r\n\r\n/**\r\n * Stores a fragment's material in the atlas slot voxel holding its mesh-local position\r\n * (the voxelize pass draws with an identity world matrix); fragments outside the box are dropped.\r\n * @internal\r\n */\r\nexport function storeVoxelMaterial(\r\n scope: PBInsideFunctionScope,\r\n localPos: PBShaderExp,\r\n albedo: PBShaderExp,\r\n emissive: PBShaderExp\r\n) {\r\n const pb = scope.$builder;\r\n const funcName = 'Z_storeVoxelMaterial';\r\n pb.func(funcName, [pb.vec3('pos'), pb.vec3('albedo'), pb.vec3('emissive')], function () {\r\n this.$l.p0 = this[VOXELIZE_PARAMS].at(0);\r\n this.$l.p1 = this[VOXELIZE_PARAMS].at(1);\r\n this.$l.p2 = this[VOXELIZE_PARAMS].at(2);\r\n this.$l.v = pb.floor(pb.div(pb.sub(this.pos, this.p0.xyz), this.p0.w));\r\n this.$if(\r\n pb.and(pb.all(pb.greaterThanEqual(this.v, pb.vec3(0))), pb.all(pb.lessThan(this.v, this.p2.xyz))),\r\n function () {\r\n this.$l.t = pb.uvec3(pb.add(this.p1.xyz, this.v));\r\n pb.textureStore(this[VOXELIZE_ALBEDO], this.t, pb.vec4(this.albedo, 1));\r\n pb.textureStore(this[VOXELIZE_EMISSIVE], this.t, encodeRGBE(this, this.emissive));\r\n }\r\n );\r\n });\r\n scope[funcName](localPos, albedo, emissive);\r\n}\r\n\r\n/**\r\n * Albedo and emissive of one packed instance at a local point, read from the material\r\n * atlases after projecting the point onto the surface along the baked field's gradient.\r\n * No coverage, or no material slot (`matSlot.w <= 0`), gives alpha 0.\r\n *\r\n * Declares locals `outAlbedo` (vec4, a = 1 where valid) and `outEmissive` (vec3).\r\n * @internal\r\n */\r\nexport function sampleInstanceMaterial(\r\n scope: PBInsideFunctionScope,\r\n lp: PBShaderExp,\r\n bmin: PBShaderExp,\r\n bmax: PBShaderExp,\r\n slot: PBShaderExp,\r\n matSlot: PBShaderExp,\r\n matRes: PBShaderExp,\r\n sdfAtlas: PBShaderExp,\r\n sdfAtlasInvSize: PBShaderExp,\r\n matAlbedo: PBShaderExp,\r\n matEmissive: PBShaderExp,\r\n matAtlasInvSize: PBShaderExp,\r\n outAlbedo: string,\r\n outEmissive: string\r\n) {\r\n const pb = scope.$builder;\r\n scope.$l[outAlbedo] = pb.vec4(0);\r\n scope.$l[outEmissive] = pb.vec3(0);\r\n scope.$if(pb.greaterThan(matSlot.w, 0), function () {\r\n // Unclamped so the gradient stays valid outside the field box; several steps\r\n // because in corners the differenced gradient blends faces and one step falls short\r\n this.$l.gmH = bmin.w;\r\n this.$l.gmS = lp;\r\n this.$l.gmN = pb.vec3(0, 1, 0);\r\n this.$for(pb.int('gmIt'), 0, 3, function () {\r\n this.$l.gmD = sampleInstanceField(this, this.gmS, bmin, bmax, slot, sdfAtlas, sdfAtlasInvSize);\r\n this.$l.gmG = pb.vec3(\r\n pb.sub(\r\n sampleInstanceField(\r\n this,\r\n pb.add(this.gmS, pb.vec3(this.gmH, 0, 0)),\r\n bmin,\r\n bmax,\r\n slot,\r\n sdfAtlas,\r\n sdfAtlasInvSize\r\n ),\r\n this.gmD\r\n ),\r\n pb.sub(\r\n sampleInstanceField(\r\n this,\r\n pb.add(this.gmS, pb.vec3(0, this.gmH, 0)),\r\n bmin,\r\n bmax,\r\n slot,\r\n sdfAtlas,\r\n sdfAtlasInvSize\r\n ),\r\n this.gmD\r\n ),\r\n pb.sub(\r\n sampleInstanceField(\r\n this,\r\n pb.add(this.gmS, pb.vec3(0, 0, this.gmH)),\r\n bmin,\r\n bmax,\r\n slot,\r\n sdfAtlas,\r\n sdfAtlasInvSize\r\n ),\r\n this.gmD\r\n )\r\n );\r\n this.gmN = pb.div(this.gmG, pb.max(pb.length(this.gmG), 1e-6));\r\n this.gmS = pb.sub(this.gmS, pb.mul(this.gmN, this.gmD));\r\n });\r\n // Material voxels are twice the field's. The surface is a one-voxel shell, so take\r\n // the best covered of three samples along the normal\r\n this.$l.gmA = pb.vec4(0);\r\n this.$l.gmUVW = pb.vec3(0);\r\n for (const [k, tag] of [\r\n [0, 'On'],\r\n [-0.5, 'In'],\r\n [0.5, 'Out']\r\n ] as [number, string][]) {\r\n this.$l[`gmF${tag}`] = pb.clamp(\r\n pb.div(pb.sub(pb.add(this.gmS, pb.mul(this.gmN, this.gmH, 2 * k)), bmin.xyz), pb.mul(this.gmH, 2)),\r\n pb.vec3(0.5),\r\n pb.sub(matRes.xyz, pb.vec3(0.5))\r\n );\r\n this.$l[`gmUVW${tag}`] = pb.mul(pb.add(matSlot.xyz, this[`gmF${tag}`]), matAtlasInvSize);\r\n this.$l[`gmA${tag}`] = pb.textureSampleLevel(matAlbedo, this[`gmUVW${tag}`], 0);\r\n this.$if(pb.greaterThan(this[`gmA${tag}`].a, this.gmA.a), function () {\r\n this.gmA = this[`gmA${tag}`];\r\n this.gmUVW = this[`gmUVW${tag}`];\r\n });\r\n }\r\n this.$if(pb.greaterThan(this.gmA.a, 0.02), function () {\r\n this[outAlbedo] = pb.vec4(pb.div(this.gmA.rgb, this.gmA.a), 1);\r\n // RGBE cannot be filtered: manual trilinear over decoded texels, weighted by coverage\r\n this.$l.gmSize = pb.div(pb.vec3(1), matAtlasInvSize);\r\n this.$l.gmTc = pb.sub(pb.mul(this.gmUVW, this.gmSize), pb.vec3(0.5));\r\n this.$l.gmBase = pb.ivec3(pb.floor(this.gmTc));\r\n this.$l.gmFr = pb.sub(this.gmTc, pb.floor(this.gmTc));\r\n this.$l.gmEsum = pb.vec3(0);\r\n this.$l.gmWsum = pb.float(0);\r\n for (let k = 0; k < 8; k++) {\r\n const off = [k & 1, (k >> 1) & 1, (k >> 2) & 1];\r\n this.$l[`gmT${k}`] = pb.add(this.gmBase, pb.ivec3(off[0], off[1], off[2]));\r\n this.$l[`gmW${k}`] = pb.mul(\r\n off[0] ? this.gmFr.x : pb.sub(1, this.gmFr.x),\r\n off[1] ? this.gmFr.y : pb.sub(1, this.gmFr.y),\r\n off[2] ? this.gmFr.z : pb.sub(1, this.gmFr.z),\r\n pb.textureLoad(matAlbedo, this[`gmT${k}`], 0).a\r\n );\r\n this.gmEsum = pb.add(\r\n this.gmEsum,\r\n pb.mul(decodeRGBE(this, pb.textureLoad(matEmissive, this[`gmT${k}`], 0)), this[`gmW${k}`])\r\n );\r\n this.gmWsum = pb.add(this.gmWsum, this[`gmW${k}`]);\r\n }\r\n this[outEmissive] = pb.div(this.gmEsum, pb.max(this.gmWsum, 1e-4));\r\n });\r\n });\r\n}\r\n\r\n/**\r\n * Declares the voxel scene clipmaps; same layout as the global SDF (levels stacked along z,\r\n * toroidal windows, same bricks) at half resolution. Requires {@link declareGlobalSDFUniforms}.\r\n *\r\n * - albedo: rgba8unorm, rgb albedo, a = 1 where a surface is.\r\n * - emissive: rgba16float, emitted radiance.\r\n * - radiance: rgba16float, outgoing radiance summed over the six axis faces.\r\n * - aniso0, aniso1: rgba8unorm (aniso1 rg8unorm with texture-formats-tier1), per-face share\r\n * of that sum by luminance: (+x, +y, +z, -x) and (-y, -z) in rg.\r\n * @internal\r\n */\r\nexport function declareVoxelSceneUniforms(scope: PBGlobalScope, group: number) {\r\n const pb = scope.$builder;\r\n scope[VOXEL_SCENE_ALBEDO] = pb.tex3D().sampleType('unfilterable-float').uniform(group);\r\n scope[VOXEL_SCENE_EMISSIVE] = pb.tex3D().sampleType('unfilterable-float').uniform(group);\r\n scope[VOXEL_SCENE_RADIANCE] = pb.tex3D().sampleType('unfilterable-float').uniform(group);\r\n scope[VOXEL_SCENE_ANISO0] = pb.tex3D().sampleType('unfilterable-float').uniform(group);\r\n scope[VOXEL_SCENE_ANISO1] = pb.tex3D().sampleType('unfilterable-float').uniform(group);\r\n}\r\n\r\n/**\r\n * Outgoing radiance at a texel of {@link voxelSceneTexel} toward `normal`, weighted by the\r\n * per-face anisotropy shares. Zero for level -1.\r\n * @internal\r\n */\r\nexport function loadVoxelSceneRadiance(\r\n scope: PBInsideFunctionScope,\r\n texel: PBShaderExp,\r\n normal: PBShaderExp\r\n) {\r\n const pb = scope.$builder;\r\n const funcName = 'Z_loadVoxelSceneRadiance';\r\n pb.func(funcName, [pb.ivec4('t'), pb.vec3('n')], function () {\r\n this.$if(pb.lessThan(this.t.w, 0), function () {\r\n this.$return(pb.vec3(0));\r\n });\r\n this.$l.total = pb.textureLoad(this[VOXEL_SCENE_RADIANCE], this.t.xyz, 0).rgb;\r\n this.$l.a0 = pb.textureLoad(this[VOXEL_SCENE_ANISO0], this.t.xyz, 0);\r\n this.$l.a1 = pb.textureLoad(this[VOXEL_SCENE_ANISO1], this.t.xyz, 0);\r\n this.$l.pos = pb.max(pb.vec3(0), pb.mul(this.n, this.a0.xyz));\r\n this.$l.neg = pb.max(pb.vec3(0), pb.mul(pb.neg(this.n), pb.vec3(this.a0.w, this.a1.x, this.a1.y)));\r\n this.$return(pb.mul(this.total, pb.add(pb.dot(this.pos, pb.vec3(1)), pb.dot(this.neg, pb.vec3(1)))));\r\n });\r\n return scope[funcName](texel, normal) as PBShaderExp;\r\n}\r\n\r\n/**\r\n * Distant-light visibility by SDF cone tracing through the global field (Wright,\r\n * \"Dynamic Occlusion with Signed Distance Fields\", SIGGRAPH 2015).\r\n *\r\n * `start` should already be offset off the surface; `tanHalfAngle` sets softness, `minStep`\r\n * prevents stalling, `maxDistance` ends the march. Levels finer than `minLevel` are skipped.\r\n * Static geometry only.\r\n * @internal\r\n */\r\nexport function sdfConeShadow(\r\n scope: PBInsideFunctionScope,\r\n start: PBShaderExp,\r\n dir: PBShaderExp,\r\n tanHalfAngle: PBShaderExp,\r\n minStep: PBShaderExp,\r\n maxDistance: PBShaderExp,\r\n levels: number,\r\n steps = 24,\r\n minLevel?: PBShaderExp\r\n) {\r\n const pb = scope.$builder;\r\n const funcName = 'Z_sdfConeShadow';\r\n pb.func(\r\n funcName,\r\n [\r\n pb.vec3('start'),\r\n pb.vec3('dir'),\r\n pb.float('tanHalf'),\r\n pb.float('minStep'),\r\n pb.float('maxDist'),\r\n pb.int('minLevel')\r\n ],\r\n function () {\r\n this.$l.shadow = pb.float(1);\r\n this.$l.t = this.minStep;\r\n this.$l.prevD = pb.float(0);\r\n this.$for(pb.int('i'), 0, steps, function () {\r\n this.$l.sp = pb.add(this.start, pb.mul(this.dir, this.t));\r\n this.$l.s = sampleGlobalSDFHinted(this, this.sp, this.prevD, levels, this.minLevel);\r\n this.$l.d = this.s.x;\r\n this.prevD = this.d;\r\n this.$l.expand = sdfSurfaceExpand(this, this.sp, this.s, pb.sub(this.t, this.minStep), levels);\r\n this.shadow = pb.min(\r\n this.shadow,\r\n pb.clamp(pb.div(pb.sub(this.d, this.expand), pb.mul(this.t, this.tanHalf)), 0, 1)\r\n );\r\n this.$if(pb.lessThan(this.shadow, 0.01), function () {\r\n this.$break();\r\n });\r\n this.t = pb.add(this.t, pb.clamp(this.d, this.minStep, pb.mul(this.minStep, 16)));\r\n this.$if(pb.greaterThan(this.t, this.maxDist), function () {\r\n this.$break();\r\n });\r\n });\r\n this.$return(this.shadow);\r\n }\r\n );\r\n return scope[funcName](\r\n start,\r\n dir,\r\n tanHalfAngle,\r\n minStep,\r\n maxDistance,\r\n minLevel ?? pb.int(0)\r\n ) as PBShaderExp;\r\n}\r\n\r\n/**\r\n * Texel (x, y, z, level) of the finest material clipmap level holding a world position with a\r\n * current brick; level -1 when none does.\r\n * @internal\r\n */\r\nexport function voxelSceneTexel(scope: PBInsideFunctionScope, worldPos: PBShaderExp, levels: number) {\r\n const pb = scope.$builder;\r\n const funcName = 'Z_voxelSceneTexel';\r\n pb.func(funcName, [pb.vec3('p')], function () {\r\n this.$l.res = pb.int(this[GLOBAL_SDF_PARAMS].x);\r\n this.$l.half = pb.div(this.res, 2);\r\n this.$l.halfV = pb.ivec3(this.half);\r\n this.$l.result = pb.ivec4(0, 0, 0, -1);\r\n for (let i = levels - 1; i >= 0; i--) {\r\n this.$l[`info${i}`] = this[GLOBAL_SDF_LEVELS].at(i);\r\n this.$l[`vf${i}`] = pb.ivec3(pb.floor(pb.div(this.p, this[`info${i}`].w)));\r\n this.$l[`o${i}`] = pb.ivec3(this[`info${i}`].xyz);\r\n this.$l[`in${i}`] = pb.and(\r\n pb.all(pb.greaterThanEqual(this[`vf${i}`], this[`o${i}`])),\r\n pb.all(pb.lessThan(this[`vf${i}`], pb.add(this[`o${i}`], pb.ivec3(this.res))))\r\n );\r\n this.$if(this[`in${i}`], function () {\r\n this.$if(globalSDFVoxelCurrent(this, this[`vf${i}`], i), function () {\r\n this.$l.vc = pb.ivec3(pb.floor(pb.div(pb.vec3(this[`vf${i}`]), 2)));\r\n this.$l.t = pb.mod(pb.add(pb.mod(this.vc, this.halfV), this.halfV), this.halfV);\r\n this.result = pb.ivec4(this.t.x, this.t.y, pb.add(this.t.z, pb.mul(this.half, i)), i);\r\n });\r\n });\r\n }\r\n this.$return(this.result);\r\n });\r\n return scope[funcName](worldPos) as PBShaderExp;\r\n}\r\n\r\n/**\r\n * Voxel scene radiance at a world position toward `normal` (see {@link loadVoxelSceneRadiance}),\r\n * blended across levels like {@link sampleGlobalSDF} within {@link SDF_LEVEL_BLEND_VOXELS} of a\r\n * window edge. Zero where no level holds the point with a current brick.\r\n * @internal\r\n */\r\nexport function sampleVoxelSceneRadiance(\r\n scope: PBInsideFunctionScope,\r\n worldPos: PBShaderExp,\r\n normal: PBShaderExp,\r\n levels: number\r\n) {\r\n const pb = scope.$builder;\r\n const funcName = 'Z_sampleVoxelSceneRadiance';\r\n pb.func(funcName, [pb.vec3('p'), pb.vec3('n')], function () {\r\n this.$l.res = pb.int(this[GLOBAL_SDF_PARAMS].x);\r\n this.$l.resF = this[GLOBAL_SDF_PARAMS].x;\r\n this.$l.half = pb.div(this.res, 2);\r\n this.$l.halfV = pb.ivec3(this.half);\r\n this.$l.sum = pb.vec3(0);\r\n this.$l.remaining = pb.float(1);\r\n for (let i = 0; i < levels; i++) {\r\n // Finest first, each level taking the share its finer levels left\r\n this.$if(pb.greaterThan(this.remaining, 1e-4), function () {\r\n this.$l.info = this[GLOBAL_SDF_LEVELS].at(i);\r\n this.$l.vf = pb.ivec3(pb.floor(pb.div(this.p, this.info.w)));\r\n this.$l.o = pb.ivec3(this.info.xyz);\r\n this.$l.inside = pb.and(\r\n pb.all(pb.greaterThanEqual(this.vf, this.o)),\r\n pb.all(pb.lessThan(this.vf, pb.add(this.o, pb.ivec3(this.res))))\r\n );\r\n this.$if(this.inside, function () {\r\n this.$if(globalSDFVoxelCurrent(this, this.vf, i), function () {\r\n this.$l.vc = pb.ivec3(pb.floor(pb.div(pb.vec3(this.vf), 2)));\r\n this.$l.t = pb.mod(pb.add(pb.mod(this.vc, this.halfV), this.halfV), this.halfV);\r\n this.$l.rad = loadVoxelSceneRadiance(\r\n this,\r\n pb.ivec4(this.t.x, this.t.y, pb.add(this.t.z, pb.mul(this.half, i)), i),\r\n this.n\r\n );\r\n if (i === levels - 1) {\r\n this.$l.w = pb.float(1);\r\n } else {\r\n // Field voxels to the window edge, sample centres at integers\r\n this.$l.f = pb.sub(pb.div(this.p, this.info.w), pb.add(this.info.xyz, pb.vec3(0.5)));\r\n this.$l.lo = pb.min(pb.min(this.f.x, this.f.y), this.f.z);\r\n this.$l.hi = pb.sub(pb.sub(this.resF, 1), pb.max(pb.max(this.f.x, this.f.y), this.f.z));\r\n this.$l.w = pb.smoothStep(1, 1 + SDF_LEVEL_BLEND_VOXELS, pb.min(this.lo, this.hi));\r\n }\r\n this.$l.share = pb.mul(this.remaining, this.w);\r\n this.sum = pb.add(this.sum, pb.mul(this.rad, this.share));\r\n this.remaining = pb.sub(this.remaining, this.share);\r\n });\r\n });\r\n });\r\n }\r\n this.$return(this.sum);\r\n });\r\n return scope[funcName](worldPos, normal) as PBShaderExp;\r\n}\r\n\r\n/**\r\n * Albedo (rgb) and presence (a) at a texel of {@link voxelSceneTexel}; zero\r\n * for level -1.\r\n * @internal\r\n */\r\nexport function loadVoxelSceneAlbedo(scope: PBInsideFunctionScope, texel: PBShaderExp) {\r\n const pb = scope.$builder;\r\n const funcName = 'Z_loadVoxelSceneAlbedo';\r\n pb.func(funcName, [pb.ivec4('t')], function () {\r\n this.$if(pb.lessThan(this.t.w, 0), function () {\r\n this.$return(pb.vec4(0));\r\n });\r\n this.$return(pb.textureLoad(this[VOXEL_SCENE_ALBEDO], this.t.xyz, 0));\r\n });\r\n return scope[funcName](texel) as PBShaderExp;\r\n}\r\n\r\n/**\r\n * Emitted radiance at a texel of {@link voxelSceneTexel}; zero for level -1.\r\n * @internal\r\n */\r\nexport function loadVoxelSceneEmissive(scope: PBInsideFunctionScope, texel: PBShaderExp) {\r\n const pb = scope.$builder;\r\n const funcName = 'Z_loadVoxelSceneEmissive';\r\n pb.func(funcName, [pb.ivec4('t')], function () {\r\n this.$if(pb.lessThan(this.t.w, 0), function () {\r\n this.$return(pb.vec3(0));\r\n });\r\n this.$return(pb.textureLoad(this[VOXEL_SCENE_EMISSIVE], this.t.xyz, 0).rgb);\r\n });\r\n return scope[funcName](texel) as PBShaderExp;\r\n}\r\n"],"names":["VOXELIZE_ALBEDO","VOXELIZE_EMISSIVE","VOXELIZE_PARAMS","VOXEL_SCENE_ALBEDO","VOXEL_SCENE_EMISSIVE","VOXEL_SCENE_RADIANCE","VOXEL_SCENE_ANISO0","VOXEL_SCENE_ANISO1","declareVoxelizeUniforms","scope","group","pb","$builder","texStorage3D","rgba8unorm","storage","vec4","uniform","encodeRGBE","color","funcName","func","vec3","$l","m","max","c","r","g","b","$if","lessThanEqual","$return","e","clamp","ceil","log2","div","exp2","add","decodeRGBE","value","v","a","mul","rgb","sub","storeVoxelMaterial","localPos","albedo","emissive","p0","at","p1","p2","floor","pos","xyz","w","and","all","greaterThanEqual","lessThan","t","uvec3","textureStore","sampleInstanceMaterial","lp","bmin","bmax","slot","matSlot","matRes","sdfAtlas","sdfAtlasInvSize","matAlbedo","matEmissive","matAtlasInvSize","outAlbedo","outEmissive","greaterThan","gmH","gmS","gmN","$for","int","gmD","sampleInstanceField","gmG","length","gmA","gmUVW","k","tag","textureSampleLevel","gmSize","gmTc","gmBase","ivec3","gmFr","gmEsum","gmWsum","float","off","x","y","z","textureLoad","declareVoxelSceneUniforms","tex3D","sampleType","loadVoxelSceneRadiance","texel","normal","ivec4","total","a0","a1","n","neg","dot","sdfConeShadow","start","dir","tanHalfAngle","minStep","maxDistance","levels","steps","minLevel","shadow","prevD","sp","s","sampleGlobalSDFHinted","d","expand","sdfSurfaceExpand","min","tanHalf","$break","maxDist","voxelSceneTexel","worldPos","res","GLOBAL_SDF_PARAMS","half","halfV","result","i","GLOBAL_SDF_LEVELS","p","globalSDFVoxelCurrent","vc","mod","sampleVoxelSceneRadiance","resF","sum","remaining","info","vf","o","inside","rad","f","lo","hi","smoothStep","SDF_LEVEL_BLEND_VOXELS","share","loadVoxelSceneAlbedo","loadVoxelSceneEmissive"],"mappings":"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"}
|