@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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bloom.js","sources":["../../src/posteffect/bloom.ts"],"sourcesContent":["import type { AbstractDevice, BindGroup, GPUProgram, RenderStateSet, Texture2D } from '@zephyr3d/device';\r\nimport { AbstractPostEffect, PostEffectLayer } from './posteffect';\r\nimport type { PostEffectSetupContext } from './posteffect';\r\nimport { linearToGamma } from '../shaders/misc';\r\nimport type { DrawContext } from '../render';\r\nimport type { Nullable } from '@zephyr3d/base';\r\nimport { Vector2, Vector4 } from '@zephyr3d/base';\r\nimport type { RGHandle } from '../render/rendergraph/types';\r\n\r\n/**\r\n * The bloom post effect\r\n * @public\r\n */\r\nexport class Bloom extends AbstractPostEffect {\r\n static readonly className = 'Bloom' as const;\r\n /** Largest finite IEEE-754 half-float value used by the HDR post-effect chain. */\r\n private static readonly HALF_FLOAT_MAX = 65504;\r\n private static _programDownsampleH: Nullable<GPUProgram> = null;\r\n private static _programDownsampleV: Nullable<GPUProgram> = null;\r\n private static _programUpsample: Nullable<GPUProgram> = null;\r\n private static _programFinalCompose: Nullable<GPUProgram> = null;\r\n private static _programPrefilter: Nullable<GPUProgram> = null;\r\n private static _renderStateAdditive: Nullable<RenderStateSet> = null;\r\n private static _bindgroupDownsampleH: Nullable<BindGroup> = null;\r\n private static _bindgroupDownsampleV: Nullable<BindGroup> = null;\r\n private static _bindgroupUpsample: Nullable<BindGroup> = null;\r\n private static _bindgroupFinalCompose: Nullable<BindGroup> = null;\r\n private static _bindgroupPrefilter: Nullable<BindGroup> = null;\r\n private readonly _thresholdValue: Vector4;\r\n private readonly _invTexSize: Vector2;\r\n private _maxDownsampleLevels: number;\r\n private _downsampleLimit: number;\r\n private _threshold: number;\r\n private _thresholdKnee: number;\r\n private _intensity: number;\r\n private _filterRadius: number;\r\n private _karisAverage: boolean;\r\n /**\r\n * Creates an instance of tonemap post effect\r\n */\r\n constructor() {\r\n super();\r\n // End layer, so the pyramid is built from the TAA-resolved frame rather than the\r\n // jittered one (see Camera.setupPostEffects). Bloom does not read depth, so nothing\r\n // here depends on the transmission depth rewrite the transparent layer sits ahead of.\r\n this._layer = PostEffectLayer.end;\r\n this._thresholdValue = new Vector4();\r\n this._invTexSize = new Vector2();\r\n this._maxDownsampleLevels = 4;\r\n this._downsampleLimit = 32;\r\n this._threshold = 0.8;\r\n this._thresholdKnee = 0;\r\n this._intensity = 1;\r\n this._filterRadius = 1;\r\n this._karisAverage = true;\r\n }\r\n /** The maximum downsample levels */\r\n get maxDownsampleLevel() {\r\n return this._maxDownsampleLevels;\r\n }\r\n set maxDownsampleLevel(val) {\r\n this._maxDownsampleLevels = val;\r\n }\r\n /** Downsample resolution limitation */\r\n get downsampleLimit() {\r\n return this._downsampleLimit;\r\n }\r\n set downsampleLimit(val) {\r\n this._downsampleLimit = val;\r\n }\r\n /**\r\n * Luminance above which a pixel starts to bloom.\r\n *\r\n * @remarks\r\n * Compared against the value in the color buffer, whose meaning depends on the scene's lighting\r\n * mode -- the same number is a different physical brightness in each:\r\n *\r\n * - `legacy`: the buffer is display-referred, so the default 0.8 means \"near white\".\r\n * - `physical`: the buffer holds camera pre-exposed luminance. 0.8 then corresponds to\r\n * `0.8 / cameraExposure` cd/m², which at the Sunny-16 reference is ~30,700 cd/m² -- almost\r\n * exactly a white surface in direct sunlight (~31,800). Little in an ordinary daylight scene is\r\n * brighter than that, so only genuine emitters and specular highlights bloom.\r\n *\r\n * Physical scenes that want a more pronounced glow should lower this: ~0.3 makes a white surface\r\n * bloom, ~0.15 catches everything above mid-gray. Because the buffer is pre-exposed, a fixed\r\n * threshold tracks the camera -- stopping down dims the scene and reduces what blooms, as it\r\n * would on a real sensor.\r\n */\r\n get threshold() {\r\n return this._threshold;\r\n }\r\n set threshold(val) {\r\n this._threshold = val;\r\n }\r\n /** Bloom threshold knee */\r\n get thresholdKnee() {\r\n return this._thresholdKnee;\r\n }\r\n set thresholdKnee(val) {\r\n this._thresholdKnee = val;\r\n }\r\n /** Bloom intensity */\r\n get intensity() {\r\n return this._intensity;\r\n }\r\n set intensity(val) {\r\n this._intensity = val;\r\n }\r\n /**\r\n * Radius of the 3x3 tent filter used when upsampling the pyramid, in source texels.\r\n *\r\n * @remarks\r\n * 1 is the natural width and what the Call of Duty presentation uses. Raising it spreads each\r\n * level further and softens the halo, at the cost of the tent's taps drifting apart: past ~2 the\r\n * three lobes stop overlapping and the filter reintroduces the very grid pattern it exists to\r\n * remove. Lowering it toward 0 collapses the filter back to a plain bilinear tap and the blocky\r\n * banding returns.\r\n */\r\n get filterRadius() {\r\n return this._filterRadius;\r\n }\r\n set filterRadius(val) {\r\n this._filterRadius = Math.max(0, val);\r\n }\r\n /**\r\n * Whether the first downsample weights its taps by `1 / (1 + luma)` (the \"Karis average\").\r\n *\r\n * @remarks\r\n * Suppresses the fireflies a single blown-out specular texel produces: without it, such a texel\r\n * dominates its 2x2 group and flickers as the surface moves, since whether a normal map lands on\r\n * NdotL ~ 1 changes frame to frame. The trade is a slightly dimmer, slightly tighter halo,\r\n * because the weighting deliberately holds the brightest samples back. Turn it off for a static\r\n * scene that wants maximum reach and has no high-frequency speculars to stabilize.\r\n */\r\n get karisAverage() {\r\n return this._karisAverage;\r\n }\r\n set karisAverage(val) {\r\n this._karisAverage = !!val;\r\n }\r\n /** {@inheritDoc AbstractPostEffect.requireLinearDepthTexture} */\r\n requireLinearDepthTexture() {\r\n return false;\r\n }\r\n /** {@inheritDoc AbstractPostEffect.requireDepthAttachment} */\r\n requireDepthAttachment() {\r\n return false;\r\n }\r\n /** {@inheritDoc AbstractPostEffect.setup}\r\n *\r\n * Native multi-pass implementation: prefilter, one pass per pyramid level\r\n * (separable blur), one additive upsample pass per level, and a final\r\n * compose pass. Pyramid sizes are computed at build time with the same math\r\n * as {@link Bloom.apply}, so both paths produce identical results.\r\n */\r\n setup(s: PostEffectSetupContext): RGHandle {\r\n const { graph, ctx } = s;\r\n const format = s.colorFormat;\r\n // Mirror apply()'s runtime sizing math at build time.\r\n const prefilterWidth = Math.max(s.width >> 1, 1);\r\n const prefilterHeight = Math.max(s.height >> 1, 1);\r\n const t = Math.max(2, this._downsampleLimit);\r\n const levels: Array<{ width: number; height: number }> = [];\r\n {\r\n let w = Math.max(t, prefilterWidth >> 1);\r\n let h = Math.max(t, prefilterHeight >> 1);\r\n let maxLevels = Math.max(this._maxDownsampleLevels, 1);\r\n while ((w >= t || h >= t) && maxLevels > 0) {\r\n levels.push({ width: w, height: h });\r\n maxLevels--;\r\n w = Math.max(1, w >> 1);\r\n h = Math.max(1, h >> 1);\r\n }\r\n }\r\n if (levels.length === 0) {\r\n // Degenerate viewport: no pyramid possible, bloom contributes nothing.\r\n return s.input;\r\n }\r\n\r\n // 1. Prefilter (threshold/knee) at half resolution.\r\n const prefilterHandle = graph.addPass('Bloom:Prefilter', (builder) => {\r\n builder.read(s.input);\r\n for (const dep of s.dependencies) {\r\n builder.read(dep);\r\n }\r\n const out = builder.createTexture({\r\n format,\r\n sizeMode: 'absolute',\r\n width: prefilterWidth,\r\n height: prefilterHeight,\r\n label: 'Bloom:prefilter'\r\n });\r\n builder.setExecute((rg) => {\r\n const device = ctx.device;\r\n const inputTexture = rg.getTexture<Texture2D>(s.input);\r\n this._prepare(device, inputTexture);\r\n device.pushDeviceStates();\r\n try {\r\n this.prefilter(device, inputTexture, rg.getTexture<Texture2D>(out));\r\n } finally {\r\n device.popDeviceStates();\r\n }\r\n });\r\n return out;\r\n });\r\n\r\n // 2. Downsample pyramid: one pass per level (separable blur through a\r\n // pass-local intermediate texture).\r\n const levelHandles: RGHandle[] = [];\r\n let sourceHandle = prefilterHandle;\r\n for (let i = 0; i < levels.length; i++) {\r\n const level = levels[i];\r\n const src = sourceHandle;\r\n const levelHandle = graph.addPass(`Bloom:Downsample${i}`, (builder) => {\r\n builder.read(src);\r\n const middle = builder.createTexture({\r\n format,\r\n sizeMode: 'absolute',\r\n width: level.width,\r\n height: level.height,\r\n label: `Bloom:downsample${i}:middle`\r\n });\r\n const out = builder.createTexture({\r\n format,\r\n sizeMode: 'absolute',\r\n width: level.width,\r\n height: level.height,\r\n label: `Bloom:downsample${i}`\r\n });\r\n builder.setExecute((rg) => {\r\n const device = ctx.device;\r\n device.pushDeviceStates();\r\n try {\r\n const middleTexture = rg.getTexture<Texture2D>(middle);\r\n this.blurH(device, rg.getTexture<Texture2D>(src), middleTexture);\r\n this.blurV(device, middleTexture, rg.getTexture<Texture2D>(out));\r\n } finally {\r\n device.popDeviceStates();\r\n }\r\n });\r\n return out;\r\n });\r\n levelHandles.push(levelHandle);\r\n sourceHandle = levelHandle;\r\n }\r\n\r\n // 3. Upsample: additively blend each level into the level above (in-place\r\n // write, so each pass produces a new version of the target texture).\r\n for (let i = levels.length - 2; i >= 0; i--) {\r\n const src = levelHandles[i + 1];\r\n const dst = levelHandles[i];\r\n levelHandles[i] = graph.addPass(`Bloom:Upsample${i}`, (builder) => {\r\n builder.read(src);\r\n builder.read(dst);\r\n const out = builder.write(dst);\r\n builder.setExecute((rg) => {\r\n const device = ctx.device;\r\n device.pushDeviceStates();\r\n try {\r\n this._prepare(device, rg.getTexture<Texture2D>(src));\r\n this.upsampleInto(device, rg.getTexture<Texture2D>(src), rg.getTexture<Texture2D>(out));\r\n } finally {\r\n device.popDeviceStates();\r\n }\r\n });\r\n return out;\r\n });\r\n }\r\n\r\n // 4. Compose: scene color + bloom * intensity.\r\n const bloomHandle = levelHandles[0];\r\n return graph.addPass('Bloom:Compose', (builder) => {\r\n builder.read(s.input);\r\n builder.read(bloomHandle);\r\n for (const dep of s.dependencies) {\r\n builder.read(dep);\r\n }\r\n const output = s.createOutput(builder);\r\n builder.setExecute((rg) => {\r\n const device = ctx.device;\r\n device.pushDeviceStates();\r\n try {\r\n device.setFramebuffer(output.framebuffer ? rg.getFramebuffer(output.framebuffer) : null);\r\n device.setViewport(null);\r\n device.setScissor(null);\r\n this.finalCompose(\r\n device,\r\n rg.getTexture<Texture2D>(s.input),\r\n rg.getTexture<Texture2D>(bloomHandle),\r\n output.srgbOutput\r\n );\r\n } finally {\r\n device.popDeviceStates();\r\n }\r\n });\r\n return output.color;\r\n });\r\n }\r\n /** {@inheritDoc AbstractPostEffect.apply} */\r\n apply(ctx: DrawContext, inputColorTexture: Texture2D, _sceneDepthTexture: Texture2D, srgbOutput: boolean) {\r\n const device = ctx.device;\r\n const downsampleTextures: Texture2D[] = [];\r\n this._prepare(device, inputColorTexture);\r\n device.pushDeviceStates();\r\n const w = Math.max(inputColorTexture.width >> 1, 1);\r\n const h = Math.max(inputColorTexture.height >> 1, 1);\r\n const colorTex = device.pool.fetchTemporalTexture2D(false, inputColorTexture.format, w, h, false);\r\n this.prefilter(device, inputColorTexture, colorTex);\r\n this.downsample(device, colorTex, downsampleTextures);\r\n this.upsample(device, downsampleTextures);\r\n device.popDeviceStates();\r\n this.finalCompose(device, inputColorTexture, downsampleTextures[0], srgbOutput);\r\n for (const tex of downsampleTextures) {\r\n device.pool.releaseTexture(tex);\r\n }\r\n device.pool.releaseTexture(colorTex);\r\n }\r\n /** @internal */\r\n prefilter(device: AbstractDevice, srcTexture: Texture2D, rt: Texture2D) {\r\n this._thresholdValue.x = this._threshold * this._threshold;\r\n this._thresholdValue.y = this._thresholdValue.x * this._thresholdKnee;\r\n this._thresholdValue.z = 2 * this._thresholdValue.y;\r\n this._thresholdValue.w = 0.25 / (this._thresholdValue.y + 0.00001);\r\n this._thresholdValue.y -= this._thresholdValue.x;\r\n device.setFramebuffer([rt]);\r\n device.setViewport(null);\r\n device.setScissor(null);\r\n device.setProgram(Bloom._programPrefilter);\r\n device.setBindGroup(0, Bloom._bindgroupPrefilter!);\r\n Bloom._bindgroupPrefilter!.setTexture('tex', srcTexture);\r\n Bloom._bindgroupPrefilter!.setValue('flip', device.type === 'webgpu' ? 1 : 0);\r\n Bloom._bindgroupPrefilter!.setValue('threshold', this._thresholdValue);\r\n // Half-texel diagonals of the *source*, so each fetch lands on a 2x2 group boundary.\r\n this._invTexSize.setXY(1 / srcTexture.width, 1 / srcTexture.height);\r\n Bloom._bindgroupPrefilter!.setValue('invTexSize', this._invTexSize);\r\n Bloom._bindgroupPrefilter!.setValue('karis', this._karisAverage ? 1 : 0);\r\n this.drawFullscreenQuad();\r\n }\r\n /** @internal */\r\n finalCompose(device: AbstractDevice, srcTexture: Texture2D, bloomTexture: Texture2D, srgbOutput: boolean) {\r\n device.setProgram(Bloom._programFinalCompose);\r\n device.setBindGroup(0, Bloom._bindgroupFinalCompose!);\r\n Bloom._bindgroupFinalCompose!.setTexture('srcTex', srcTexture);\r\n Bloom._bindgroupFinalCompose!.setTexture('bloomTex', bloomTexture);\r\n Bloom._bindgroupFinalCompose!.setValue('intensity', this._intensity);\r\n // Legacy lighting puts Bloom last in the chain (see Camera.syncPostProcessingMode), so this\r\n // pass may be the one writing the sRGB screen. Without this the whole frame is handed to the\r\n // display scene-linear and everything darkens the moment bloom is switched on.\r\n Bloom._bindgroupFinalCompose!.setValue('srgbOut', srgbOutput ? 1 : 0);\r\n Bloom._bindgroupFinalCompose!.setValue(\r\n 'flip',\r\n device.type === 'webgpu' && device.getFramebuffer() ? 1 : 0\r\n );\r\n this.drawFullscreenQuad();\r\n }\r\n /** @internal */\r\n upsample(device: AbstractDevice, textures: Texture2D[]) {\r\n for (let i = textures.length - 2; i >= 0; i--) {\r\n this.upsampleInto(device, textures[i + 1], textures[i]);\r\n }\r\n }\r\n /** @internal */\r\n private upsampleInto(device: AbstractDevice, srcTexture: Texture2D, dstTexture: Texture2D) {\r\n device.setProgram(Bloom._programUpsample);\r\n device.setBindGroup(0, Bloom._bindgroupUpsample!);\r\n Bloom._bindgroupUpsample!.setValue('flip', device.type === 'webgpu' ? 1 : 0);\r\n Bloom._bindgroupUpsample!.setTexture('tex', srcTexture);\r\n // Tent offsets are in source-texel units, so the filter widens with the level it reads\r\n // from and every level contributes a similarly shaped blur in screen space.\r\n this._invTexSize.setXY(1 / srcTexture.width, 1 / srcTexture.height);\r\n Bloom._bindgroupUpsample!.setValue('invTexSize', this._invTexSize);\r\n Bloom._bindgroupUpsample!.setValue('radius', this._filterRadius);\r\n device.setFramebuffer([dstTexture]);\r\n device.setViewport(null);\r\n device.setScissor(null);\r\n this.drawFullscreenQuad(Bloom._renderStateAdditive!);\r\n }\r\n /** @internal */\r\n private blurH(device: AbstractDevice, srcTexture: Texture2D, dstTexture: Texture2D) {\r\n this._invTexSize.setXY(1 / srcTexture.width, 1 / srcTexture.height);\r\n device.setFramebuffer([dstTexture]);\r\n device.setViewport(null);\r\n device.setScissor(null);\r\n device.setProgram(Bloom._programDownsampleH);\r\n device.setBindGroup(0, Bloom._bindgroupDownsampleH!);\r\n Bloom._bindgroupDownsampleH!.setTexture('tex', srcTexture);\r\n Bloom._bindgroupDownsampleH!.setValue('invTexSize', this._invTexSize);\r\n Bloom._bindgroupDownsampleH!.setValue('flip', device.type === 'webgpu' ? 1 : 0);\r\n this.drawFullscreenQuad();\r\n }\r\n /** @internal */\r\n private blurV(device: AbstractDevice, srcTexture: Texture2D, dstTexture: Texture2D) {\r\n this._invTexSize.setXY(1 / srcTexture.width, 1 / srcTexture.height);\r\n device.setFramebuffer([dstTexture]);\r\n device.setViewport(null);\r\n device.setScissor(null);\r\n device.setProgram(Bloom._programDownsampleV);\r\n device.setBindGroup(0, Bloom._bindgroupDownsampleV!);\r\n Bloom._bindgroupDownsampleV!.setTexture('tex', srcTexture);\r\n Bloom._bindgroupDownsampleV!.setValue('invTexSize', this._invTexSize);\r\n Bloom._bindgroupDownsampleV!.setValue('flip', device.type === 'webgpu' ? 1 : 0);\r\n this.drawFullscreenQuad();\r\n }\r\n /** @internal */\r\n downsample(device: AbstractDevice, inputColorTexture: Texture2D, textures: Texture2D[]) {\r\n const t = Math.max(2, this._downsampleLimit);\r\n let w = Math.max(t, inputColorTexture.width >> 1);\r\n let h = Math.max(t, inputColorTexture.height >> 1);\r\n let maxLevels = Math.max(this._maxDownsampleLevels, 1);\r\n let sourceTex = inputColorTexture;\r\n while ((w >= t || h >= t) && maxLevels > 0) {\r\n const tex = device.pool.fetchTemporalTexture2D(false, inputColorTexture.format, w, h, false);\r\n textures.push(tex);\r\n\r\n const texMiddle = device.pool.fetchTemporalTexture2D(false, inputColorTexture.format, w, h, false);\r\n\r\n this.blurH(device, sourceTex, texMiddle);\r\n this.blurV(device, texMiddle, tex);\r\n\r\n maxLevels--;\r\n w = Math.max(1, w >> 1);\r\n h = Math.max(1, h >> 1);\r\n sourceTex = tex;\r\n\r\n device.pool.releaseTexture(texMiddle);\r\n }\r\n }\r\n /** @internal */\r\n private _prepare(device: AbstractDevice, _srcTexture: Texture2D) {\r\n if (!Bloom._programFinalCompose) {\r\n Bloom._programFinalCompose = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.flip = pb.int().uniform(0);\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, 0, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n this.$if(pb.notEqual(this.flip, 0), function () {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n });\r\n });\r\n },\r\n fragment(pb) {\r\n this.srcTex = pb.tex2D().uniform(0);\r\n this.bloomTex = pb.tex2D().uniform(0);\r\n this.intensity = pb.float().uniform(0);\r\n this.srgbOut = pb.int().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.main(function () {\r\n this.$l.srcSample = pb.textureSampleLevel(this.srcTex, this.$inputs.uv, 0);\r\n this.$l.bloomSample = pb.textureSampleLevel(this.bloomTex, this.$inputs.uv, 0);\r\n // Both inputs are camera pre-exposed (~1.0), so no unit conversion is needed.\r\n //\r\n // Sanitize each input explicitly rather than relying on clamp() to absorb a NaN: for a\r\n // NaN operand clamp only yields 0 because max(NaN, 0) happens to return its second\r\n // argument on most hardware, which the spec does not require. The scene color reaches\r\n // this pass without going through the prefilter, so this is its only guard.\r\n this.$l.src = this.$choice(\r\n pb.all(pb.lessThan(pb.abs(this.srcSample.rgb), pb.vec3(1e30))),\r\n this.srcSample.rgb,\r\n pb.vec3(0)\r\n );\r\n this.$l.bloom = this.$choice(\r\n pb.all(pb.lessThan(pb.abs(this.bloomSample.rgb), pb.vec3(1e30))),\r\n this.bloomSample.rgb,\r\n pb.vec3(0)\r\n );\r\n // The clamp then only guards the half-float write against accumulated overshoot.\r\n this.$l.composed = pb.clamp(\r\n pb.add(this.src, pb.mul(this.bloom, this.intensity)),\r\n pb.vec3(0),\r\n pb.vec3(Bloom.HALF_FLOAT_MAX)\r\n );\r\n // Only when this pass writes the screen directly; intermediate targets stay linear.\r\n this.$if(pb.notEqual(this.srgbOut, 0), function () {\r\n this.composed = linearToGamma(this, pb.clamp(this.composed, pb.vec3(0), pb.vec3(1)));\r\n });\r\n this.$outputs.outColor = pb.vec4(this.composed, 1);\r\n });\r\n }\r\n })!;\r\n Bloom._programFinalCompose.name = '@Bloom_FinalCompose';\r\n Bloom._bindgroupFinalCompose = device.createBindGroup(Bloom._programFinalCompose.bindGroupLayouts[0]);\r\n }\r\n if (!Bloom._programPrefilter) {\r\n Bloom._programPrefilter = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.flip = pb.int().uniform(0);\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, 0, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n this.$if(pb.notEqual(this.flip, 0), function () {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n });\r\n });\r\n },\r\n fragment(pb) {\r\n this.tex = pb.tex2D().uniform(0);\r\n this.threshold = pb.vec4().uniform(0);\r\n this.invTexSize = pb.vec2().uniform(0);\r\n this.karis = pb.int().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.main(function () {\r\n // This pass is also the first (full -> half resolution) downsample, which is where the\r\n // Call of Duty presentation puts the Karis average: a lone very bright texel -- a\r\n // specular hit where a normal map happens to put NdotL near 1 -- otherwise dominates\r\n // its 2x2 group, and flickers violently as the surface moves. Weighting each tap by\r\n // 1/(1+luma) lets the group's dimmer texels hold that spike down.\r\n //\r\n // The four taps sit at half-texel diagonals so each bilinear fetch already averages a\r\n // 2x2 block of the source, giving 4 groups (16 source texels) for 4 fetches.\r\n this.$l.raw = pb.vec4(0);\r\n this.$if(pb.notEqual(this.karis, 0), function () {\r\n this.$l.o = pb.mul(this.invTexSize, 0.5);\r\n this.$l.acc = pb.vec3(0);\r\n this.$l.wsum = pb.float(0);\r\n const quad: [number, number][] = [\r\n [-1, -1],\r\n [1, -1],\r\n [-1, 1],\r\n [1, 1]\r\n ];\r\n for (const [dx, dy] of quad) {\r\n this.$l.s = pb.textureSampleLevel(\r\n this.tex,\r\n pb.add(this.$inputs.uv, pb.mul(this.o, pb.vec2(dx, dy))),\r\n 0\r\n ).rgb;\r\n // Reject non-finite taps here too; see the guard below for why.\r\n this.s = this.$choice(\r\n pb.all(pb.lessThan(pb.abs(this.s), pb.vec3(1e30))),\r\n pb.clamp(this.s, pb.vec3(0), pb.vec3(Bloom.HALF_FLOAT_MAX)),\r\n pb.vec3(0)\r\n );\r\n // Karis weight uses perceived luminance, matching the original.\r\n this.$l.w = pb.div(1, pb.add(1, pb.dot(this.s, pb.vec3(0.2126, 0.7152, 0.0722))));\r\n this.acc = pb.add(this.acc, pb.mul(this.s, this.w));\r\n this.wsum = pb.add(this.wsum, this.w);\r\n }\r\n this.raw = pb.vec4(pb.div(this.acc, pb.max(this.wsum, 0.0001)), 1);\r\n }).$else(function () {\r\n this.raw = pb.textureSampleLevel(this.tex, this.$inputs.uv, 0);\r\n });\r\n // Reject non-finite input before any arithmetic. An Inf makes the contribution below\r\n // evaluate Inf/Inf = NaN, and a NaN survives every subsequent operation: the separable\r\n // blur smears it across the coarsest mip and the upsample chain expands that single\r\n // texel into a 2^maxDownsampleLevels black block on screen.\r\n //\r\n // Non-finite samples are dropped rather than clamped. With CPU pre-exposure the HDR\r\n // target sits near 1.0, so an Inf/NaN here means an upstream pass (SSR, SSGI, TAA\r\n // reprojection) produced garbage; contributing nothing is the conservative choice and\r\n // matches how SSGI sanitizes its own ray payloads. Finite values are still clamped so\r\n // the additive upsample cannot overflow the half-float target either.\r\n this.$l.finite = pb.all(pb.lessThan(pb.abs(this.raw.rgb), pb.vec3(1e30)));\r\n this.$l.p = this.$choice(\r\n this.finite,\r\n pb.clamp(this.raw.rgb, pb.vec3(0), pb.vec3(Bloom.HALF_FLOAT_MAX)),\r\n pb.vec3(0)\r\n );\r\n this.$l.brightness = pb.max(pb.max(this.p.r, this.p.g), this.p.b);\r\n this.$l.soft = pb.clamp(pb.add(this.brightness, this.threshold.y), 0, this.threshold.z);\r\n this.soft = pb.mul(this.soft, this.soft, this.threshold.w);\r\n this.$l.contrib = pb.div(\r\n pb.max(this.soft, pb.sub(this.brightness, this.threshold.x)),\r\n pb.max(this.brightness, 0.00001)\r\n );\r\n this.$outputs.outColor = pb.vec4(pb.mul(this.p, this.contrib), 1);\r\n });\r\n }\r\n })!;\r\n Bloom._programPrefilter.name = '@Bloom_Prefilter';\r\n Bloom._bindgroupPrefilter = device.createBindGroup(Bloom._programPrefilter.bindGroupLayouts[0]);\r\n }\r\n if (!Bloom._programUpsample) {\r\n Bloom._programUpsample = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.flip = pb.int().uniform(0);\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, 0, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n this.$if(pb.notEqual(this.flip, 0), function () {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n });\r\n });\r\n },\r\n fragment(pb) {\r\n this.tex = pb.tex2D().uniform(0);\r\n this.invTexSize = pb.vec2().uniform(0);\r\n this.radius = pb.float().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.main(function () {\r\n // 3x3 tent filter, the upsample kernel from \"Next Generation Post Processing in\r\n // Call of Duty: Advanced Warfare\". A bare bilinear tap here is what produced the\r\n // blocky halo: one coarse texel covers a large screen area, so the level's square\r\n // texel grid survives magnification and shows up as axis-aligned banding. The tent\r\n // weights (1 2 1 / 2 4 2 / 1 2 1) / 16 reconstruct a smooth ramp between texels.\r\n this.$l.o = pb.mul(this.invTexSize, this.radius);\r\n this.$l.sum = pb.vec3(0);\r\n const taps: [number, number, number][] = [\r\n [-1, -1, 1],\r\n [0, -1, 2],\r\n [1, -1, 1],\r\n [-1, 0, 2],\r\n [0, 0, 4],\r\n [1, 0, 2],\r\n [-1, 1, 1],\r\n [0, 1, 2],\r\n [1, 1, 1]\r\n ];\r\n for (const [dx, dy, w] of taps) {\r\n this.sum = pb.add(\r\n this.sum,\r\n pb.mul(\r\n pb.textureSampleLevel(this.tex, pb.add(this.$inputs.uv, pb.mul(this.o, pb.vec2(dx, dy))), 0)\r\n .rgb,\r\n w / 16\r\n )\r\n );\r\n }\r\n this.$outputs.outColor = pb.vec4(this.sum, 1);\r\n });\r\n }\r\n })!;\r\n Bloom._programUpsample.name = '@Bloom_Upsample';\r\n Bloom._bindgroupUpsample = device.createBindGroup(Bloom._programUpsample.bindGroupLayouts[0]);\r\n }\r\n if (!Bloom._programDownsampleH) {\r\n const offsets = [-4, -3, -2, -1, 0, 1, 2, 3, 4];\r\n const weights = [\r\n 0.01621622, 0.05405405, 0.12162162, 0.19459459, 0.22702703, 0.19459459, 0.12162162, 0.05405405,\r\n 0.01621622\r\n ];\r\n Bloom._programDownsampleH = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.flip = pb.int().uniform(0);\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, 0, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n this.$if(pb.notEqual(this.flip, 0), function () {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n });\r\n });\r\n },\r\n fragment(pb) {\r\n this.invTexSize = pb.vec2().uniform(0);\r\n this.tex = pb.tex2D().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.main(function () {\r\n this.$l.sum = pb.vec3(0);\r\n this.$l.offset = pb.float();\r\n for (let i = 0; i < 9; i++) {\r\n this.offset = pb.mul(this.invTexSize.x, offsets[i] * 2);\r\n this.sum = pb.add(\r\n this.sum,\r\n pb.mul(\r\n pb.textureSampleLevel(this.tex, pb.add(this.$inputs.uv, pb.vec2(this.offset, 0)), 0).rgb,\r\n weights[i]\r\n )\r\n );\r\n }\r\n this.$outputs.outColor = pb.vec4(this.sum, 1);\r\n });\r\n }\r\n })!;\r\n Bloom._programDownsampleH.name = '@Bloom_DownsampleH';\r\n Bloom._bindgroupDownsampleH = device.createBindGroup(Bloom._programDownsampleH.bindGroupLayouts[0]);\r\n }\r\n if (!Bloom._programDownsampleV) {\r\n const offsets = [-3.23076923, -1.38461538, 0.0, 1.38461538, 3.23076923];\r\n const weights = [0.07027027, 0.31621622, 0.22702703, 0.31621622, 0.07027027];\r\n Bloom._programDownsampleV = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.flip = pb.int().uniform(0);\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, 0, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n this.$if(pb.notEqual(this.flip, 0), function () {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n });\r\n });\r\n },\r\n fragment(pb) {\r\n this.invTexSize = pb.vec2().uniform(0);\r\n this.tex = pb.tex2D().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.main(function () {\r\n this.$l.sum = pb.vec3(0);\r\n this.$l.offset = pb.float();\r\n for (let i = 0; i < 5; i++) {\r\n this.offset = pb.mul(this.invTexSize.y, offsets[i]);\r\n this.sum = pb.add(\r\n this.sum,\r\n pb.mul(\r\n pb.textureSampleLevel(this.tex, pb.add(this.$inputs.uv, pb.vec2(0, this.offset)), 0).rgb,\r\n weights[i]\r\n )\r\n );\r\n }\r\n this.$outputs.outColor = pb.vec4(this.sum, 1);\r\n });\r\n }\r\n })!;\r\n Bloom._programDownsampleV.name = '@Bloom_DownsampleV';\r\n Bloom._bindgroupDownsampleV = device.createBindGroup(Bloom._programDownsampleV.bindGroupLayouts[0]);\r\n }\r\n if (!Bloom._renderStateAdditive) {\r\n Bloom._renderStateAdditive = device.createRenderStateSet();\r\n Bloom._renderStateAdditive.useRasterizerState().setCullMode('none');\r\n Bloom._renderStateAdditive.useDepthState().enableTest(false).enableWrite(false);\r\n Bloom._renderStateAdditive\r\n .useBlendingState()\r\n .enable(true)\r\n .setBlendFuncRGB('one', 'one')\r\n .setBlendFuncAlpha('one', 'zero');\r\n }\r\n }\r\n}\r\n"],"names":["Bloom","AbstractPostEffect","className","HALF_FLOAT_MAX","_programDownsampleH","_programDownsampleV","_programUpsample","_programFinalCompose","_programPrefilter","_renderStateAdditive","_bindgroupDownsampleH","_bindgroupDownsampleV","_bindgroupUpsample","_bindgroupFinalCompose","_bindgroupPrefilter","_thresholdValue","_invTexSize","_maxDownsampleLevels","_downsampleLimit","_threshold","_thresholdKnee","_intensity","_filterRadius","_karisAverage","_layer","PostEffectLayer","end","Vector4","Vector2","maxDownsampleLevel","val","downsampleLimit","threshold","thresholdKnee","intensity","filterRadius","Math","max","karisAverage","requireLinearDepthTexture","requireDepthAttachment","setup","s","graph","ctx","format","colorFormat","prefilterWidth","width","prefilterHeight","height","t","levels","w","h","maxLevels","push","length","input","prefilterHandle","addPass","builder","read","dep","dependencies","out","createTexture","sizeMode","label","setExecute","rg","device","inputTexture","getTexture","_prepare","pushDeviceStates","prefilter","popDeviceStates","levelHandles","sourceHandle","i","level","src","levelHandle","middle","middleTexture","blurH","blurV","dst","write","upsampleInto","bloomHandle","output","createOutput","setFramebuffer","framebuffer","getFramebuffer","setViewport","setScissor","finalCompose","srgbOutput","color","apply","inputColorTexture","_sceneDepthTexture","downsampleTextures","colorTex","pool","fetchTemporalTexture2D","downsample","upsample","tex","releaseTexture","srcTexture","rt","x","y","z","setProgram","setBindGroup","setTexture","setValue","type","setXY","drawFullscreenQuad","bloomTexture","textures","dstTexture","sourceTex","texMiddle","_srcTexture","buildRenderProgram","vertex","pb","flip","int","uniform","$inputs","pos","vec2","attrib","$outputs","uv","main","$builtins","position","vec4","add","mul","xy","$if","notEqual","neg","fragment","srcTex","tex2D","bloomTex","float","srgbOut","outColor","$l","srcSample","textureSampleLevel","bloomSample","$choice","all","lessThan","abs","rgb","vec3","bloom","composed","clamp","linearToGamma","name","createBindGroup","bindGroupLayouts","invTexSize","karis","raw","o","acc","wsum","quad","dx","dy","div","dot","$else","finite","p","brightness","r","g","b","soft","contrib","sub","radius","sum","taps","offsets","weights","offset","createRenderStateSet","useRasterizerState","setCullMode","useDepthState","enableTest","enableWrite","useBlendingState","enable","setBlendFuncRGB","setBlendFuncAlpha"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"bloom.js","sources":["../../src/posteffect/bloom.ts"],"sourcesContent":["import type { AbstractDevice, BindGroup, GPUProgram, RenderStateSet, Texture2D } from '@zephyr3d/device';\r\nimport { AbstractPostEffect, PostEffectLayer } from './posteffect';\r\nimport type { PostEffectSetupContext } from './posteffect';\r\nimport { linearToGamma } from '../shaders/misc';\r\nimport type { DrawContext } from '../render';\r\nimport type { Nullable } from '@zephyr3d/base';\r\nimport { Vector2, Vector4 } from '@zephyr3d/base';\r\nimport type { RGHandle } from '../render/rendergraph/types';\r\n\r\n/**\r\n * The bloom post effect\r\n * @public\r\n */\r\nexport class Bloom extends AbstractPostEffect {\r\n static readonly className = 'Bloom' as const;\r\n /** Largest finite IEEE-754 half-float value used by the HDR post-effect chain. */\r\n private static readonly HALF_FLOAT_MAX = 65504;\r\n private static readonly PHYSICAL_LEVEL_WEIGHTS = [0.3465 + 0.138, 0.1176, 0.066, 0.066, 0.061].map(\r\n (w) => w * 0.675\r\n );\r\n private static _programDownsampleH: Nullable<GPUProgram> = null;\r\n private static _programDownsampleV: Nullable<GPUProgram> = null;\r\n private static _programUpsample: Nullable<GPUProgram> = null;\r\n private static _programFinalCompose: Nullable<GPUProgram> = null;\r\n private static _programPrefilter: Nullable<GPUProgram> = null;\r\n private static _renderStateAdditive: Nullable<RenderStateSet> = null;\r\n private static _bindgroupDownsampleH: Nullable<BindGroup> = null;\r\n private static _bindgroupDownsampleV: Nullable<BindGroup> = null;\r\n private static _bindgroupUpsample: Nullable<BindGroup> = null;\r\n private static _bindgroupFinalCompose: Nullable<BindGroup> = null;\r\n private static _bindgroupPrefilter: Nullable<BindGroup> = null;\r\n private readonly _thresholdValue: Vector4;\r\n private readonly _invTexSize: Vector2;\r\n private _maxDownsampleLevels: number;\r\n private _downsampleLimit: number;\r\n private _threshold: number;\r\n private _thresholdKnee: number;\r\n private _intensity: number;\r\n private _filterRadius: number;\r\n private _karisAverage: boolean;\r\n /**\r\n * Creates an instance of tonemap post effect\r\n */\r\n constructor() {\r\n super();\r\n // End layer, so the pyramid is built from the TAA-resolved frame rather than the\r\n // jittered one (see Camera.setupPostEffects). Bloom does not read depth, so nothing\r\n // here depends on the transmission depth rewrite the transparent layer sits ahead of.\r\n this._layer = PostEffectLayer.end;\r\n this._thresholdValue = new Vector4();\r\n this._invTexSize = new Vector2();\r\n this._maxDownsampleLevels = 4;\r\n this._downsampleLimit = 32;\r\n this._threshold = 0.8;\r\n this._thresholdKnee = 0;\r\n this._intensity = 1;\r\n this._filterRadius = 1;\r\n this._karisAverage = true;\r\n }\r\n /** The maximum downsample levels */\r\n get maxDownsampleLevel() {\r\n return this._maxDownsampleLevels;\r\n }\r\n set maxDownsampleLevel(val) {\r\n this._maxDownsampleLevels = val;\r\n }\r\n /** Downsample resolution limitation */\r\n get downsampleLimit() {\r\n return this._downsampleLimit;\r\n }\r\n set downsampleLimit(val) {\r\n this._downsampleLimit = val;\r\n }\r\n /**\r\n * Luminance above which a pixel starts to bloom.\r\n *\r\n * @remarks\r\n * Compared against the value in the color buffer, whose meaning depends on the scene's lighting\r\n * mode -- the same number is a different physical brightness in each:\r\n *\r\n * - `legacy`: the buffer is display-referred, so the default 0.8 means \"near white\".\r\n * - `physical`: the buffer holds camera pre-exposed luminance. 0.8 then corresponds to\r\n * `0.8 / cameraExposure` cd/m², which at the Sunny-16 reference is ~30,700 cd/m² -- almost\r\n * exactly a white surface in direct sunlight (~31,800). Little in an ordinary daylight scene is\r\n * brighter than that, so only genuine emitters and specular highlights bloom.\r\n *\r\n * Physical scenes that want a more pronounced glow should lower this: ~0.3 makes a white surface\r\n * bloom, ~0.15 catches everything above mid-gray. Because the buffer is pre-exposed, a fixed\r\n * threshold tracks the camera -- stopping down dims the scene and reduces what blooms, as it\r\n * would on a real sensor.\r\n */\r\n get threshold() {\r\n return this._threshold;\r\n }\r\n set threshold(val) {\r\n this._threshold = val;\r\n }\r\n /** Bloom threshold knee */\r\n get thresholdKnee() {\r\n return this._thresholdKnee;\r\n }\r\n set thresholdKnee(val) {\r\n this._thresholdKnee = val;\r\n }\r\n /** Bloom intensity */\r\n get intensity() {\r\n return this._intensity;\r\n }\r\n set intensity(val) {\r\n this._intensity = val;\r\n }\r\n /**\r\n * Radius of the 3x3 tent filter used when upsampling the pyramid, in source texels.\r\n *\r\n * @remarks\r\n * 1 is the natural width and what the Call of Duty presentation uses. Raising it spreads each\r\n * level further and softens the halo, at the cost of the tent's taps drifting apart: past ~2 the\r\n * three lobes stop overlapping and the filter reintroduces the very grid pattern it exists to\r\n * remove. Lowering it toward 0 collapses the filter back to a plain bilinear tap and the blocky\r\n * banding returns.\r\n */\r\n get filterRadius() {\r\n return this._filterRadius;\r\n }\r\n set filterRadius(val) {\r\n this._filterRadius = Math.max(0, val);\r\n }\r\n /**\r\n * Whether the first downsample weights its taps by `1 / (1 + luma)` (the \"Karis average\").\r\n *\r\n * @remarks\r\n * Suppresses the fireflies a single blown-out specular texel produces: without it, such a texel\r\n * dominates its 2x2 group and flickers as the surface moves, since whether a normal map lands on\r\n * NdotL ~ 1 changes frame to frame. The trade is a slightly dimmer, slightly tighter halo,\r\n * because the weighting deliberately holds the brightest samples back. Turn it off for a static\r\n * scene that wants maximum reach and has no high-frequency speculars to stabilize.\r\n *\r\n * Only applies under legacy lighting. With physical lighting, bloom downsample is a\r\n * plain linear average and leaves fireflies to TAA (bloom reads the TAA-resolved frame).\r\n */\r\n get karisAverage() {\r\n return this._karisAverage;\r\n }\r\n set karisAverage(val) {\r\n this._karisAverage = !!val;\r\n }\r\n private static _levelWeights(ctx: DrawContext, count: number) {\r\n const physical = ctx.scene?.lightingMode === 'physical';\r\n const weights: number[] = [];\r\n for (let i = 0; i < count; i++) {\r\n weights.push(physical ? (Bloom.PHYSICAL_LEVEL_WEIGHTS[i] ?? 0) : 1);\r\n }\r\n return weights;\r\n }\r\n /** Whether the prefilter uses the Karis average, see {@link Bloom.karisAverage}. */\r\n private _useKarisAverage(ctx: DrawContext) {\r\n return this._karisAverage && ctx.scene?.lightingMode !== 'physical';\r\n }\r\n /**\r\n * Upsample source scale for level `i + 1` into level `i`.\r\n *\r\n * @remarks\r\n * The chain accumulates acc[i] = L[i] + (w[i+1] / w[i]) * up(acc[i+1]), which equals\r\n * sum(w[k] * L[k]) / w[i]; the final compose multiplies by w[0]. This weights every level with a\r\n * single scalar per pass.\r\n */\r\n private static _upsampleScale(weights: number[], i: number) {\r\n return weights[i] > 0 ? weights[i + 1] / weights[i] : 0;\r\n }\r\n /** {@inheritDoc AbstractPostEffect.requireLinearDepthTexture} */\r\n requireLinearDepthTexture() {\r\n return false;\r\n }\r\n /** {@inheritDoc AbstractPostEffect.requireDepthAttachment} */\r\n requireDepthAttachment() {\r\n return false;\r\n }\r\n /** {@inheritDoc AbstractPostEffect.setup}\r\n *\r\n * Native multi-pass implementation: prefilter, one pass per pyramid level\r\n * (separable blur), one additive upsample pass per level, and a final\r\n * compose pass. Pyramid sizes are computed at build time with the same math\r\n * as {@link Bloom.apply}, so both paths produce identical results.\r\n */\r\n setup(s: PostEffectSetupContext): RGHandle {\r\n const { graph, ctx } = s;\r\n const format = s.colorFormat;\r\n // Mirror apply()'s runtime sizing math at build time.\r\n const prefilterWidth = Math.max(s.width >> 1, 1);\r\n const prefilterHeight = Math.max(s.height >> 1, 1);\r\n const t = Math.max(2, this._downsampleLimit);\r\n const levels: Array<{ width: number; height: number }> = [];\r\n {\r\n let w = Math.max(t, prefilterWidth >> 1);\r\n let h = Math.max(t, prefilterHeight >> 1);\r\n let maxLevels = Math.max(this._maxDownsampleLevels, 1);\r\n while ((w >= t || h >= t) && maxLevels > 0) {\r\n levels.push({ width: w, height: h });\r\n maxLevels--;\r\n w = Math.max(1, w >> 1);\r\n h = Math.max(1, h >> 1);\r\n }\r\n }\r\n if (levels.length === 0) {\r\n // Degenerate viewport: no pyramid possible, bloom contributes nothing.\r\n return s.input;\r\n }\r\n const weights = Bloom._levelWeights(ctx, levels.length);\r\n\r\n // 1. Prefilter (threshold/knee) at half resolution.\r\n const prefilterHandle = graph.addPass('Bloom:Prefilter', (builder) => {\r\n builder.read(s.input);\r\n for (const dep of s.dependencies) {\r\n builder.read(dep);\r\n }\r\n const out = builder.createTexture({\r\n format,\r\n sizeMode: 'absolute',\r\n width: prefilterWidth,\r\n height: prefilterHeight,\r\n label: 'Bloom:prefilter'\r\n });\r\n builder.setExecute((rg) => {\r\n const device = ctx.device;\r\n const inputTexture = rg.getTexture<Texture2D>(s.input);\r\n this._prepare(device, inputTexture);\r\n device.pushDeviceStates();\r\n try {\r\n this.prefilter(device, inputTexture, rg.getTexture<Texture2D>(out), this._useKarisAverage(ctx));\r\n } finally {\r\n device.popDeviceStates();\r\n }\r\n });\r\n return out;\r\n });\r\n\r\n // 2. Downsample pyramid: one pass per level (separable blur through a\r\n // pass-local intermediate texture).\r\n const levelHandles: RGHandle[] = [];\r\n let sourceHandle = prefilterHandle;\r\n for (let i = 0; i < levels.length; i++) {\r\n const level = levels[i];\r\n const src = sourceHandle;\r\n const levelHandle = graph.addPass(`Bloom:Downsample${i}`, (builder) => {\r\n builder.read(src);\r\n const middle = builder.createTexture({\r\n format,\r\n sizeMode: 'absolute',\r\n width: level.width,\r\n height: level.height,\r\n label: `Bloom:downsample${i}:middle`\r\n });\r\n const out = builder.createTexture({\r\n format,\r\n sizeMode: 'absolute',\r\n width: level.width,\r\n height: level.height,\r\n label: `Bloom:downsample${i}`\r\n });\r\n builder.setExecute((rg) => {\r\n const device = ctx.device;\r\n device.pushDeviceStates();\r\n try {\r\n const middleTexture = rg.getTexture<Texture2D>(middle);\r\n this.blurH(device, rg.getTexture<Texture2D>(src), middleTexture);\r\n this.blurV(device, middleTexture, rg.getTexture<Texture2D>(out));\r\n } finally {\r\n device.popDeviceStates();\r\n }\r\n });\r\n return out;\r\n });\r\n levelHandles.push(levelHandle);\r\n sourceHandle = levelHandle;\r\n }\r\n\r\n // 3. Upsample: additively blend each level into the level above (in-place\r\n // write, so each pass produces a new version of the target texture).\r\n for (let i = levels.length - 2; i >= 0; i--) {\r\n const src = levelHandles[i + 1];\r\n const dst = levelHandles[i];\r\n levelHandles[i] = graph.addPass(`Bloom:Upsample${i}`, (builder) => {\r\n builder.read(src);\r\n builder.read(dst);\r\n const out = builder.write(dst);\r\n builder.setExecute((rg) => {\r\n const device = ctx.device;\r\n device.pushDeviceStates();\r\n try {\r\n this._prepare(device, rg.getTexture<Texture2D>(src));\r\n this.upsampleInto(\r\n device,\r\n rg.getTexture<Texture2D>(src),\r\n rg.getTexture<Texture2D>(out),\r\n Bloom._upsampleScale(weights, i)\r\n );\r\n } finally {\r\n device.popDeviceStates();\r\n }\r\n });\r\n return out;\r\n });\r\n }\r\n\r\n // 4. Compose: scene color + bloom * intensity.\r\n const bloomHandle = levelHandles[0];\r\n return graph.addPass('Bloom:Compose', (builder) => {\r\n builder.read(s.input);\r\n builder.read(bloomHandle);\r\n for (const dep of s.dependencies) {\r\n builder.read(dep);\r\n }\r\n const output = s.createOutput(builder);\r\n builder.setExecute((rg) => {\r\n const device = ctx.device;\r\n device.pushDeviceStates();\r\n try {\r\n device.setFramebuffer(output.framebuffer ? rg.getFramebuffer(output.framebuffer) : null);\r\n device.setViewport(null);\r\n device.setScissor(null);\r\n this.finalCompose(\r\n device,\r\n rg.getTexture<Texture2D>(s.input),\r\n rg.getTexture<Texture2D>(bloomHandle),\r\n output.srgbOutput,\r\n weights[0]\r\n );\r\n } finally {\r\n device.popDeviceStates();\r\n }\r\n });\r\n return output.color;\r\n });\r\n }\r\n /** {@inheritDoc AbstractPostEffect.apply} */\r\n apply(ctx: DrawContext, inputColorTexture: Texture2D, _sceneDepthTexture: Texture2D, srgbOutput: boolean) {\r\n const device = ctx.device;\r\n const downsampleTextures: Texture2D[] = [];\r\n this._prepare(device, inputColorTexture);\r\n device.pushDeviceStates();\r\n const w = Math.max(inputColorTexture.width >> 1, 1);\r\n const h = Math.max(inputColorTexture.height >> 1, 1);\r\n const colorTex = device.pool.fetchTemporalTexture2D(false, inputColorTexture.format, w, h, false);\r\n this.prefilter(device, inputColorTexture, colorTex, this._useKarisAverage(ctx));\r\n this.downsample(device, colorTex, downsampleTextures);\r\n const weights = Bloom._levelWeights(ctx, downsampleTextures.length);\r\n this.upsample(device, downsampleTextures, weights);\r\n device.popDeviceStates();\r\n this.finalCompose(device, inputColorTexture, downsampleTextures[0], srgbOutput, weights[0]);\r\n for (const tex of downsampleTextures) {\r\n device.pool.releaseTexture(tex);\r\n }\r\n device.pool.releaseTexture(colorTex);\r\n }\r\n /** @internal */\r\n prefilter(device: AbstractDevice, srcTexture: Texture2D, rt: Texture2D, karis = this._karisAverage) {\r\n this._thresholdValue.x = this._threshold * this._threshold;\r\n this._thresholdValue.y = this._thresholdValue.x * this._thresholdKnee;\r\n this._thresholdValue.z = 2 * this._thresholdValue.y;\r\n this._thresholdValue.w = 0.25 / (this._thresholdValue.y + 0.00001);\r\n this._thresholdValue.y -= this._thresholdValue.x;\r\n device.setFramebuffer([rt]);\r\n device.setViewport(null);\r\n device.setScissor(null);\r\n device.setProgram(Bloom._programPrefilter);\r\n device.setBindGroup(0, Bloom._bindgroupPrefilter!);\r\n Bloom._bindgroupPrefilter!.setTexture('tex', srcTexture);\r\n Bloom._bindgroupPrefilter!.setValue('flip', device.type === 'webgpu' ? 1 : 0);\r\n Bloom._bindgroupPrefilter!.setValue('threshold', this._thresholdValue);\r\n // Half-texel diagonals of the *source*, so each fetch lands on a 2x2 group boundary.\r\n this._invTexSize.setXY(1 / srcTexture.width, 1 / srcTexture.height);\r\n Bloom._bindgroupPrefilter!.setValue('invTexSize', this._invTexSize);\r\n Bloom._bindgroupPrefilter!.setValue('karis', karis ? 1 : 0);\r\n this.drawFullscreenQuad();\r\n }\r\n /** @internal */\r\n finalCompose(\r\n device: AbstractDevice,\r\n srcTexture: Texture2D,\r\n bloomTexture: Texture2D,\r\n srgbOutput: boolean,\r\n levelWeight = 1\r\n ) {\r\n device.setProgram(Bloom._programFinalCompose);\r\n device.setBindGroup(0, Bloom._bindgroupFinalCompose!);\r\n Bloom._bindgroupFinalCompose!.setTexture('srcTex', srcTexture);\r\n Bloom._bindgroupFinalCompose!.setTexture('bloomTex', bloomTexture);\r\n Bloom._bindgroupFinalCompose!.setValue('intensity', this._intensity * levelWeight);\r\n // Legacy lighting puts Bloom last in the chain (see Camera.syncPostProcessingMode), so this\r\n // pass may be the one writing the sRGB screen. Without this the whole frame is handed to the\r\n // display scene-linear and everything darkens the moment bloom is switched on.\r\n Bloom._bindgroupFinalCompose!.setValue('srgbOut', srgbOutput ? 1 : 0);\r\n Bloom._bindgroupFinalCompose!.setValue(\r\n 'flip',\r\n device.type === 'webgpu' && device.getFramebuffer() ? 1 : 0\r\n );\r\n this.drawFullscreenQuad();\r\n }\r\n /** @internal */\r\n upsample(device: AbstractDevice, textures: Texture2D[], weights?: number[]) {\r\n for (let i = textures.length - 2; i >= 0; i--) {\r\n this.upsampleInto(device, textures[i + 1], textures[i], weights ? Bloom._upsampleScale(weights, i) : 1);\r\n }\r\n }\r\n /** @internal */\r\n private upsampleInto(device: AbstractDevice, srcTexture: Texture2D, dstTexture: Texture2D, scale = 1) {\r\n device.setProgram(Bloom._programUpsample);\r\n device.setBindGroup(0, Bloom._bindgroupUpsample!);\r\n Bloom._bindgroupUpsample!.setValue('scale', scale);\r\n Bloom._bindgroupUpsample!.setValue('flip', device.type === 'webgpu' ? 1 : 0);\r\n Bloom._bindgroupUpsample!.setTexture('tex', srcTexture);\r\n // Tent offsets are in source-texel units, so the filter widens with the level it reads\r\n // from and every level contributes a similarly shaped blur in screen space.\r\n this._invTexSize.setXY(1 / srcTexture.width, 1 / srcTexture.height);\r\n Bloom._bindgroupUpsample!.setValue('invTexSize', this._invTexSize);\r\n Bloom._bindgroupUpsample!.setValue('radius', this._filterRadius);\r\n device.setFramebuffer([dstTexture]);\r\n device.setViewport(null);\r\n device.setScissor(null);\r\n this.drawFullscreenQuad(Bloom._renderStateAdditive!);\r\n }\r\n /** @internal */\r\n private blurH(device: AbstractDevice, srcTexture: Texture2D, dstTexture: Texture2D) {\r\n this._invTexSize.setXY(1 / srcTexture.width, 1 / srcTexture.height);\r\n device.setFramebuffer([dstTexture]);\r\n device.setViewport(null);\r\n device.setScissor(null);\r\n device.setProgram(Bloom._programDownsampleH);\r\n device.setBindGroup(0, Bloom._bindgroupDownsampleH!);\r\n Bloom._bindgroupDownsampleH!.setTexture('tex', srcTexture);\r\n Bloom._bindgroupDownsampleH!.setValue('invTexSize', this._invTexSize);\r\n Bloom._bindgroupDownsampleH!.setValue('flip', device.type === 'webgpu' ? 1 : 0);\r\n this.drawFullscreenQuad();\r\n }\r\n /** @internal */\r\n private blurV(device: AbstractDevice, srcTexture: Texture2D, dstTexture: Texture2D) {\r\n this._invTexSize.setXY(1 / srcTexture.width, 1 / srcTexture.height);\r\n device.setFramebuffer([dstTexture]);\r\n device.setViewport(null);\r\n device.setScissor(null);\r\n device.setProgram(Bloom._programDownsampleV);\r\n device.setBindGroup(0, Bloom._bindgroupDownsampleV!);\r\n Bloom._bindgroupDownsampleV!.setTexture('tex', srcTexture);\r\n Bloom._bindgroupDownsampleV!.setValue('invTexSize', this._invTexSize);\r\n Bloom._bindgroupDownsampleV!.setValue('flip', device.type === 'webgpu' ? 1 : 0);\r\n this.drawFullscreenQuad();\r\n }\r\n /** @internal */\r\n downsample(device: AbstractDevice, inputColorTexture: Texture2D, textures: Texture2D[]) {\r\n const t = Math.max(2, this._downsampleLimit);\r\n let w = Math.max(t, inputColorTexture.width >> 1);\r\n let h = Math.max(t, inputColorTexture.height >> 1);\r\n let maxLevels = Math.max(this._maxDownsampleLevels, 1);\r\n let sourceTex = inputColorTexture;\r\n while ((w >= t || h >= t) && maxLevels > 0) {\r\n const tex = device.pool.fetchTemporalTexture2D(false, inputColorTexture.format, w, h, false);\r\n textures.push(tex);\r\n\r\n const texMiddle = device.pool.fetchTemporalTexture2D(false, inputColorTexture.format, w, h, false);\r\n\r\n this.blurH(device, sourceTex, texMiddle);\r\n this.blurV(device, texMiddle, tex);\r\n\r\n maxLevels--;\r\n w = Math.max(1, w >> 1);\r\n h = Math.max(1, h >> 1);\r\n sourceTex = tex;\r\n\r\n device.pool.releaseTexture(texMiddle);\r\n }\r\n }\r\n /** @internal */\r\n private _prepare(device: AbstractDevice, _srcTexture: Texture2D) {\r\n if (!Bloom._programFinalCompose) {\r\n Bloom._programFinalCompose = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.flip = pb.int().uniform(0);\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, 0, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n this.$if(pb.notEqual(this.flip, 0), function () {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n });\r\n });\r\n },\r\n fragment(pb) {\r\n this.srcTex = pb.tex2D().uniform(0);\r\n this.bloomTex = pb.tex2D().uniform(0);\r\n this.intensity = pb.float().uniform(0);\r\n this.srgbOut = pb.int().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.main(function () {\r\n this.$l.srcSample = pb.textureSampleLevel(this.srcTex, this.$inputs.uv, 0);\r\n this.$l.bloomSample = pb.textureSampleLevel(this.bloomTex, this.$inputs.uv, 0);\r\n // Both inputs are camera pre-exposed (~1.0), so no unit conversion is needed.\r\n //\r\n // Sanitize each input explicitly rather than relying on clamp() to absorb a NaN: for a\r\n // NaN operand clamp only yields 0 because max(NaN, 0) happens to return its second\r\n // argument on most hardware, which the spec does not require. The scene color reaches\r\n // this pass without going through the prefilter, so this is its only guard.\r\n this.$l.src = this.$choice(\r\n pb.all(pb.lessThan(pb.abs(this.srcSample.rgb), pb.vec3(1e30))),\r\n this.srcSample.rgb,\r\n pb.vec3(0)\r\n );\r\n this.$l.bloom = this.$choice(\r\n pb.all(pb.lessThan(pb.abs(this.bloomSample.rgb), pb.vec3(1e30))),\r\n this.bloomSample.rgb,\r\n pb.vec3(0)\r\n );\r\n // The clamp then only guards the half-float write against accumulated overshoot.\r\n this.$l.composed = pb.clamp(\r\n pb.add(this.src, pb.mul(this.bloom, this.intensity)),\r\n pb.vec3(0),\r\n pb.vec3(Bloom.HALF_FLOAT_MAX)\r\n );\r\n // Only when this pass writes the screen directly; intermediate targets stay linear.\r\n this.$if(pb.notEqual(this.srgbOut, 0), function () {\r\n this.composed = linearToGamma(this, pb.clamp(this.composed, pb.vec3(0), pb.vec3(1)));\r\n });\r\n this.$outputs.outColor = pb.vec4(this.composed, 1);\r\n });\r\n }\r\n })!;\r\n Bloom._programFinalCompose.name = '@Bloom_FinalCompose';\r\n Bloom._bindgroupFinalCompose = device.createBindGroup(Bloom._programFinalCompose.bindGroupLayouts[0]);\r\n }\r\n if (!Bloom._programPrefilter) {\r\n Bloom._programPrefilter = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.flip = pb.int().uniform(0);\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, 0, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n this.$if(pb.notEqual(this.flip, 0), function () {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n });\r\n });\r\n },\r\n fragment(pb) {\r\n this.tex = pb.tex2D().uniform(0);\r\n this.threshold = pb.vec4().uniform(0);\r\n this.invTexSize = pb.vec2().uniform(0);\r\n this.karis = pb.int().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.main(function () {\r\n // This pass is also the first (full -> half resolution) downsample, which is where the\r\n // Call of Duty presentation puts the Karis average: a lone very bright texel -- a\r\n // specular hit where a normal map happens to put NdotL near 1 -- otherwise dominates\r\n // its 2x2 group, and flickers violently as the surface moves. Weighting each tap by\r\n // 1/(1+luma) lets the group's dimmer texels hold that spike down.\r\n //\r\n // The four taps sit at half-texel diagonals so each bilinear fetch already averages a\r\n // 2x2 block of the source, giving 4 groups (16 source texels) for 4 fetches.\r\n this.$l.raw = pb.vec4(0);\r\n this.$if(pb.notEqual(this.karis, 0), function () {\r\n this.$l.o = pb.mul(this.invTexSize, 0.5);\r\n this.$l.acc = pb.vec3(0);\r\n this.$l.wsum = pb.float(0);\r\n const quad: [number, number][] = [\r\n [-1, -1],\r\n [1, -1],\r\n [-1, 1],\r\n [1, 1]\r\n ];\r\n for (const [dx, dy] of quad) {\r\n this.$l.s = pb.textureSampleLevel(\r\n this.tex,\r\n pb.add(this.$inputs.uv, pb.mul(this.o, pb.vec2(dx, dy))),\r\n 0\r\n ).rgb;\r\n // Reject non-finite taps here too; see the guard below for why.\r\n this.s = this.$choice(\r\n pb.all(pb.lessThan(pb.abs(this.s), pb.vec3(1e30))),\r\n pb.clamp(this.s, pb.vec3(0), pb.vec3(Bloom.HALF_FLOAT_MAX)),\r\n pb.vec3(0)\r\n );\r\n // Karis weight uses perceived luminance, matching the original.\r\n this.$l.w = pb.div(1, pb.add(1, pb.dot(this.s, pb.vec3(0.2126, 0.7152, 0.0722))));\r\n this.acc = pb.add(this.acc, pb.mul(this.s, this.w));\r\n this.wsum = pb.add(this.wsum, this.w);\r\n }\r\n this.raw = pb.vec4(pb.div(this.acc, pb.max(this.wsum, 0.0001)), 1);\r\n }).$else(function () {\r\n this.raw = pb.textureSampleLevel(this.tex, this.$inputs.uv, 0);\r\n });\r\n // Reject non-finite input before any arithmetic. An Inf makes the contribution below\r\n // evaluate Inf/Inf = NaN, and a NaN survives every subsequent operation: the separable\r\n // blur smears it across the coarsest mip and the upsample chain expands that single\r\n // texel into a 2^maxDownsampleLevels black block on screen.\r\n //\r\n // Non-finite samples are dropped rather than clamped. With CPU pre-exposure the HDR\r\n // target sits near 1.0, so an Inf/NaN here means an upstream pass (SSR, SSGI, TAA\r\n // reprojection) produced garbage; contributing nothing is the conservative choice and\r\n // matches how SSGI sanitizes its own ray payloads. Finite values are still clamped so\r\n // the additive upsample cannot overflow the half-float target either.\r\n this.$l.finite = pb.all(pb.lessThan(pb.abs(this.raw.rgb), pb.vec3(1e30)));\r\n this.$l.p = this.$choice(\r\n this.finite,\r\n pb.clamp(this.raw.rgb, pb.vec3(0), pb.vec3(Bloom.HALF_FLOAT_MAX)),\r\n pb.vec3(0)\r\n );\r\n this.$l.brightness = pb.max(pb.max(this.p.r, this.p.g), this.p.b);\r\n this.$l.soft = pb.clamp(pb.add(this.brightness, this.threshold.y), 0, this.threshold.z);\r\n this.soft = pb.mul(this.soft, this.soft, this.threshold.w);\r\n this.$l.contrib = pb.div(\r\n pb.max(this.soft, pb.sub(this.brightness, this.threshold.x)),\r\n pb.max(this.brightness, 0.00001)\r\n );\r\n this.$outputs.outColor = pb.vec4(pb.mul(this.p, this.contrib), 1);\r\n });\r\n }\r\n })!;\r\n Bloom._programPrefilter.name = '@Bloom_Prefilter';\r\n Bloom._bindgroupPrefilter = device.createBindGroup(Bloom._programPrefilter.bindGroupLayouts[0]);\r\n }\r\n if (!Bloom._programUpsample) {\r\n Bloom._programUpsample = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.flip = pb.int().uniform(0);\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, 0, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n this.$if(pb.notEqual(this.flip, 0), function () {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n });\r\n });\r\n },\r\n fragment(pb) {\r\n this.tex = pb.tex2D().uniform(0);\r\n this.invTexSize = pb.vec2().uniform(0);\r\n this.radius = pb.float().uniform(0);\r\n this.scale = pb.float().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.main(function () {\r\n // 3x3 tent filter, the upsample kernel from \"Next Generation Post Processing in\r\n // Call of Duty: Advanced Warfare\". A bare bilinear tap here is what produced the\r\n // blocky halo: one coarse texel covers a large screen area, so the level's square\r\n // texel grid survives magnification and shows up as axis-aligned banding. The tent\r\n // weights (1 2 1 / 2 4 2 / 1 2 1) / 16 reconstruct a smooth ramp between texels.\r\n this.$l.o = pb.mul(this.invTexSize, this.radius);\r\n this.$l.sum = pb.vec3(0);\r\n const taps: [number, number, number][] = [\r\n [-1, -1, 1],\r\n [0, -1, 2],\r\n [1, -1, 1],\r\n [-1, 0, 2],\r\n [0, 0, 4],\r\n [1, 0, 2],\r\n [-1, 1, 1],\r\n [0, 1, 2],\r\n [1, 1, 1]\r\n ];\r\n for (const [dx, dy, w] of taps) {\r\n this.sum = pb.add(\r\n this.sum,\r\n pb.mul(\r\n pb.textureSampleLevel(this.tex, pb.add(this.$inputs.uv, pb.mul(this.o, pb.vec2(dx, dy))), 0)\r\n .rgb,\r\n w / 16\r\n )\r\n );\r\n }\r\n this.$outputs.outColor = pb.vec4(pb.mul(this.sum, this.scale), 1);\r\n });\r\n }\r\n })!;\r\n Bloom._programUpsample.name = '@Bloom_Upsample';\r\n Bloom._bindgroupUpsample = device.createBindGroup(Bloom._programUpsample.bindGroupLayouts[0]);\r\n }\r\n if (!Bloom._programDownsampleH) {\r\n const offsets = [-4, -3, -2, -1, 0, 1, 2, 3, 4];\r\n const weights = [\r\n 0.01621622, 0.05405405, 0.12162162, 0.19459459, 0.22702703, 0.19459459, 0.12162162, 0.05405405,\r\n 0.01621622\r\n ];\r\n Bloom._programDownsampleH = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.flip = pb.int().uniform(0);\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, 0, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n this.$if(pb.notEqual(this.flip, 0), function () {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n });\r\n });\r\n },\r\n fragment(pb) {\r\n this.invTexSize = pb.vec2().uniform(0);\r\n this.tex = pb.tex2D().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.main(function () {\r\n this.$l.sum = pb.vec3(0);\r\n this.$l.offset = pb.float();\r\n for (let i = 0; i < 9; i++) {\r\n this.offset = pb.mul(this.invTexSize.x, offsets[i] * 2);\r\n this.sum = pb.add(\r\n this.sum,\r\n pb.mul(\r\n pb.textureSampleLevel(this.tex, pb.add(this.$inputs.uv, pb.vec2(this.offset, 0)), 0).rgb,\r\n weights[i]\r\n )\r\n );\r\n }\r\n this.$outputs.outColor = pb.vec4(this.sum, 1);\r\n });\r\n }\r\n })!;\r\n Bloom._programDownsampleH.name = '@Bloom_DownsampleH';\r\n Bloom._bindgroupDownsampleH = device.createBindGroup(Bloom._programDownsampleH.bindGroupLayouts[0]);\r\n }\r\n if (!Bloom._programDownsampleV) {\r\n const offsets = [-3.23076923, -1.38461538, 0.0, 1.38461538, 3.23076923];\r\n const weights = [0.07027027, 0.31621622, 0.22702703, 0.31621622, 0.07027027];\r\n Bloom._programDownsampleV = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.flip = pb.int().uniform(0);\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, 0, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n this.$if(pb.notEqual(this.flip, 0), function () {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n });\r\n });\r\n },\r\n fragment(pb) {\r\n this.invTexSize = pb.vec2().uniform(0);\r\n this.tex = pb.tex2D().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.main(function () {\r\n this.$l.sum = pb.vec3(0);\r\n this.$l.offset = pb.float();\r\n for (let i = 0; i < 5; i++) {\r\n this.offset = pb.mul(this.invTexSize.y, offsets[i]);\r\n this.sum = pb.add(\r\n this.sum,\r\n pb.mul(\r\n pb.textureSampleLevel(this.tex, pb.add(this.$inputs.uv, pb.vec2(0, this.offset)), 0).rgb,\r\n weights[i]\r\n )\r\n );\r\n }\r\n this.$outputs.outColor = pb.vec4(this.sum, 1);\r\n });\r\n }\r\n })!;\r\n Bloom._programDownsampleV.name = '@Bloom_DownsampleV';\r\n Bloom._bindgroupDownsampleV = device.createBindGroup(Bloom._programDownsampleV.bindGroupLayouts[0]);\r\n }\r\n if (!Bloom._renderStateAdditive) {\r\n Bloom._renderStateAdditive = device.createRenderStateSet();\r\n Bloom._renderStateAdditive.useRasterizerState().setCullMode('none');\r\n Bloom._renderStateAdditive.useDepthState().enableTest(false).enableWrite(false);\r\n Bloom._renderStateAdditive\r\n .useBlendingState()\r\n .enable(true)\r\n .setBlendFuncRGB('one', 'one')\r\n .setBlendFuncAlpha('one', 'zero');\r\n }\r\n }\r\n}\r\n"],"names":["Bloom","AbstractPostEffect","className","HALF_FLOAT_MAX","PHYSICAL_LEVEL_WEIGHTS","map","w","_programDownsampleH","_programDownsampleV","_programUpsample","_programFinalCompose","_programPrefilter","_renderStateAdditive","_bindgroupDownsampleH","_bindgroupDownsampleV","_bindgroupUpsample","_bindgroupFinalCompose","_bindgroupPrefilter","_thresholdValue","_invTexSize","_maxDownsampleLevels","_downsampleLimit","_threshold","_thresholdKnee","_intensity","_filterRadius","_karisAverage","_layer","PostEffectLayer","end","Vector4","Vector2","maxDownsampleLevel","val","downsampleLimit","threshold","thresholdKnee","intensity","filterRadius","Math","max","karisAverage","_levelWeights","ctx","count","physical","scene","lightingMode","weights","i","push","_useKarisAverage","_upsampleScale","requireLinearDepthTexture","requireDepthAttachment","setup","s","graph","format","colorFormat","prefilterWidth","width","prefilterHeight","height","t","levels","h","maxLevels","length","input","prefilterHandle","addPass","builder","read","dep","dependencies","out","createTexture","sizeMode","label","setExecute","rg","device","inputTexture","getTexture","_prepare","pushDeviceStates","prefilter","popDeviceStates","levelHandles","sourceHandle","level","src","levelHandle","middle","middleTexture","blurH","blurV","dst","write","upsampleInto","bloomHandle","output","createOutput","setFramebuffer","framebuffer","getFramebuffer","setViewport","setScissor","finalCompose","srgbOutput","color","apply","inputColorTexture","_sceneDepthTexture","downsampleTextures","colorTex","pool","fetchTemporalTexture2D","downsample","upsample","tex","releaseTexture","srcTexture","rt","karis","x","y","z","setProgram","setBindGroup","setTexture","setValue","type","setXY","drawFullscreenQuad","bloomTexture","levelWeight","textures","dstTexture","scale","sourceTex","texMiddle","_srcTexture","buildRenderProgram","vertex","pb","flip","int","uniform","$inputs","pos","vec2","attrib","$outputs","uv","main","$builtins","position","vec4","add","mul","xy","$if","notEqual","neg","fragment","srcTex","tex2D","bloomTex","float","srgbOut","outColor","$l","srcSample","textureSampleLevel","bloomSample","$choice","all","lessThan","abs","rgb","vec3","bloom","composed","clamp","linearToGamma","name","createBindGroup","bindGroupLayouts","invTexSize","raw","o","acc","wsum","quad","dx","dy","div","dot","$else","finite","p","brightness","r","g","b","soft","contrib","sub","radius","sum","taps","offsets","offset","createRenderStateSet","useRasterizerState","setCullMode","useDepthState","enableTest","enableWrite","useBlendingState","enable","setBlendFuncRGB","setBlendFuncAlpha"],"mappings":"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"}
|