@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":"render_queue.js","sources":["../../src/render/render_queue.ts"],"sourcesContent":["import type { Nullable, Vector4 } from '@zephyr3d/base';\r\nimport { Disposable, objectKeys, Vector3 } from '@zephyr3d/base';\r\nimport type { Camera } from '../camera/camera';\r\nimport type { BatchDrawable, Drawable } from './drawable';\r\nimport type { DirectionalLight, PunctualLight } from '../scene/light';\r\nimport type { RenderPass } from '.';\r\nimport { QUEUE_TRANSPARENT, RENDER_PASS_TYPE_SHADOWMAP } from '../values';\r\nimport type { BindGroup, BindGroupLayout } from '@zephyr3d/device';\r\nimport { ProgramBuilder } from '@zephyr3d/device';\r\nimport type { Material } from '../material';\r\nimport { ShaderHelper } from '../material';\r\nimport { RenderBundleWrapper } from './renderbundle_wrapper';\r\nimport { getDevice } from '../app/api';\r\n\r\n/** @public */\r\nexport type CachedBindGroup = {\r\n bindGroup: BindGroup;\r\n buffer: Float32Array;\r\n offset: number;\r\n dirty: boolean;\r\n};\r\n\r\nconst maxBufferSizeInFloats = 65536 / 4;\r\n\r\n/**\r\n * Instance bind group allocator\r\n * @public\r\n */\r\nexport class InstanceBindGroupAllocator extends Disposable {\r\n private static _instanceBindGroupLayout: Nullable<BindGroupLayout> = null;\r\n _bindGroupList: CachedBindGroup[] = [];\r\n private _allocFrameStamp: number;\r\n constructor() {\r\n super();\r\n this._allocFrameStamp = -1;\r\n this._bindGroupList = [];\r\n }\r\n allocateInstanceBindGroup(framestamp: number, sizeInFloats: number) {\r\n // Reset if render frame changed\r\n if (this._allocFrameStamp !== framestamp) {\r\n this._allocFrameStamp = framestamp;\r\n for (const k of this._bindGroupList) {\r\n k.offset = 0;\r\n }\r\n }\r\n for (const k of this._bindGroupList) {\r\n if (k.offset + sizeInFloats <= maxBufferSizeInFloats) {\r\n k.dirty = true;\r\n return k;\r\n }\r\n }\r\n if (!InstanceBindGroupAllocator._instanceBindGroupLayout) {\r\n const buildInfo = new ProgramBuilder(getDevice()).buildRender({\r\n vertex(pb) {\r\n this[ShaderHelper.getInstanceDataUniformName()] = pb.vec4[65536 >> 4]().uniformBuffer(3);\r\n pb.main(function () {});\r\n },\r\n fragment(pb) {\r\n pb.main(function () {});\r\n }\r\n });\r\n InstanceBindGroupAllocator._instanceBindGroupLayout = buildInfo[2][3];\r\n }\r\n const bindGroup = {\r\n bindGroup: getDevice().createBindGroup(InstanceBindGroupAllocator._instanceBindGroupLayout),\r\n buffer: new Float32Array(maxBufferSizeInFloats),\r\n offset: 0,\r\n dirty: true\r\n };\r\n this._bindGroupList.push(bindGroup);\r\n return bindGroup;\r\n }\r\n /** Reset all allocations so the owned bind groups can be reused. */\r\n reset() {\r\n this._allocFrameStamp = -1;\r\n for (const allocation of this._bindGroupList) {\r\n allocation.offset = 0;\r\n allocation.dirty = true;\r\n }\r\n }\r\n /** Release all bind groups owned by this allocator. */\r\n protected onDispose() {\r\n super.onDispose();\r\n for (const allocation of this._bindGroupList) {\r\n allocation.bindGroup.dispose();\r\n }\r\n this._bindGroupList.length = 0;\r\n }\r\n}\r\n\r\nconst defaultInstanceBindGroupAlloator = new InstanceBindGroupAllocator();\r\nconst tmpDrawablePos = new Vector3();\r\n\r\n/**\r\n * Instance data\r\n * @public\r\n */\r\nexport interface InstanceData {\r\n bindGroup: CachedBindGroup;\r\n stride: number;\r\n offset: number;\r\n numInstances: number;\r\n}\r\n\r\n/**\r\n * Render queue item\r\n * @public\r\n */\r\nexport interface RenderQueueItem {\r\n drawable: Drawable;\r\n sortDistance: number;\r\n instanceColor?: Vector4;\r\n instanceData: Nullable<InstanceData>;\r\n}\r\n\r\n/**\r\n * Render item list information\r\n * @public\r\n */\r\nexport interface RenderItemListInfo {\r\n itemList: RenderQueueItem[];\r\n renderBundle?: RenderBundleWrapper;\r\n skinItemList: RenderQueueItem[];\r\n skinRenderBundle?: RenderBundleWrapper;\r\n morphItemList: RenderQueueItem[];\r\n morphRenderBundle?: RenderBundleWrapper;\r\n skinAndMorphItemList: RenderQueueItem[];\r\n skinAndMorphRenderBundle?: RenderBundleWrapper;\r\n instanceItemList: RenderQueueItem[];\r\n instanceRenderBundle?: RenderBundleWrapper;\r\n instanceList: Record<string, BatchDrawable[]>;\r\n materialList: Set<Material>;\r\n renderQueue: RenderQueue;\r\n}\r\n\r\n/**\r\n * Render item list bundle\r\n * @public\r\n */\r\nexport interface RenderItemListBundle {\r\n lit: RenderItemListInfo[];\r\n unlit: RenderItemListInfo[];\r\n}\r\n\r\n/**\r\n * Item list of render queue\r\n * @public\r\n */\r\nexport interface RenderItemList {\r\n opaque: RenderItemListBundle;\r\n transmission: RenderItemListBundle;\r\n transparent: RenderItemListBundle;\r\n transmission_trans: RenderItemListBundle;\r\n}\r\n\r\n/**\r\n * Render queue reference\r\n * @public\r\n */\r\nexport interface RenderQueueRef {\r\n ref: RenderQueue;\r\n /** False after the queue is cleared and starts a new contents generation. */\r\n valid: boolean;\r\n}\r\n\r\n/**\r\n * Drawable instance information\r\n * @public\r\n */\r\nexport interface DrawableInstanceInfo {\r\n bindGroup: CachedBindGroup;\r\n offset: number;\r\n}\r\n\r\n/**\r\n * A queue that contains the items to be rendered\r\n * @public\r\n */\r\nexport class RenderQueue extends Disposable {\r\n /** @internal */\r\n private _itemList: Nullable<RenderItemList>;\r\n /** @internal */\r\n private readonly _renderPass: RenderPass;\r\n /** @internal */\r\n private _shadowedLightList: PunctualLight[];\r\n /** @internal */\r\n private _unshadowedLightList: PunctualLight[];\r\n /** @internal */\r\n private _sunLight: Nullable<DirectionalLight>;\r\n /** @internal */\r\n private _primaryDirectionalLight: Nullable<DirectionalLight>;\r\n /** @internal */\r\n private _primaryTransmissionLight: Nullable<PunctualLight>;\r\n /** @internal */\r\n private readonly _bindGroupAllocator: InstanceBindGroupAllocator;\r\n /** @internal */\r\n private _ref: RenderQueueRef;\r\n /** @internal */\r\n private readonly _instanceInfo: Map<Drawable, DrawableInstanceInfo>;\r\n /** @internal */\r\n private _needSceneColor: boolean;\r\n private _needSceneDepth: boolean;\r\n private _needSceneColorWithDepth: boolean;\r\n /** @internal */\r\n private _drawTransparent: boolean;\r\n /** @internal */\r\n private readonly _objectColorMaps: Map<number, Drawable>[];\r\n /**\r\n * Creates an instance of a render queue\r\n * @param renderPass - The render pass to which the render queue belongs\r\n */\r\n constructor(renderPass: RenderPass, bindGroupAllocator?: InstanceBindGroupAllocator) {\r\n super();\r\n this._bindGroupAllocator = bindGroupAllocator ?? defaultInstanceBindGroupAlloator;\r\n this._itemList = null;\r\n this._renderPass = renderPass;\r\n this._shadowedLightList = [];\r\n this._unshadowedLightList = [];\r\n this._sunLight = null;\r\n this._primaryDirectionalLight = null;\r\n this._primaryTransmissionLight = null;\r\n this._ref = { ref: this, valid: true };\r\n this._instanceInfo = new Map();\r\n this._needSceneColor = false;\r\n this._needSceneDepth = false;\r\n this._needSceneColorWithDepth = false;\r\n this._drawTransparent = false;\r\n this._objectColorMaps = [new Map()];\r\n }\r\n /** The sun light */\r\n get sunLight() {\r\n return this._sunLight;\r\n }\r\n set sunLight(light) {\r\n this._sunLight = light;\r\n }\r\n /** Primary directional light used by effects that need a main light direction. */\r\n get primaryDirectionalLight() {\r\n return this._primaryDirectionalLight;\r\n }\r\n set primaryDirectionalLight(light) {\r\n this._primaryDirectionalLight = light;\r\n }\r\n /** Primary punctual light used by thin-transmission effects when there is no main directional light. */\r\n get primaryTransmissionLight() {\r\n return this._primaryTransmissionLight;\r\n }\r\n set primaryTransmissionLight(light) {\r\n this._primaryTransmissionLight = light;\r\n }\r\n /** @internal */\r\n private getTransmissionLightScore(light: PunctualLight) {\r\n if (light.isDirectionLight()) {\r\n return -1;\r\n }\r\n const color = light.diffuseAndIntensity;\r\n const luma = color.x * 0.2126 + color.y * 0.7152 + color.z * 0.0722;\r\n const range = Math.max(1, light.positionAndRange.w);\r\n const typeWeight = light.isSpotLight()\r\n ? 1.2\r\n : light.isPointLight()\r\n ? 1.08\r\n : light.isRectLight()\r\n ? 1.02\r\n : 1;\r\n return Math.max(color.w, 0) * Math.max(luma, 0) * Math.sqrt(range) * typeWeight;\r\n }\r\n /** @internal */\r\n needSceneColor() {\r\n return this._needSceneColor;\r\n }\r\n /** @internal */\r\n needSceneDepth() {\r\n return this._needSceneDepth;\r\n }\r\n /** @internal */\r\n needSceneColorWithDepth() {\r\n return this._needSceneColorWithDepth;\r\n }\r\n /** Whether this render queue has transparent objects to be drawn */\r\n get drawTransparent() {\r\n return this._drawTransparent;\r\n }\r\n /** The render pass to which the render queue belongs */\r\n get renderPass() {\r\n return this._renderPass;\r\n }\r\n /**\r\n * Gets the items of the render queue\r\n */\r\n get itemList() {\r\n return this._itemList;\r\n }\r\n /**\r\n * Gets the shadowed lights\r\n */\r\n get shadowedLights() {\r\n return this._shadowedLightList;\r\n }\r\n /**\r\n * Gets the unshadowed lights\r\n */\r\n get unshadowedLights() {\r\n return this._unshadowedLightList;\r\n }\r\n /**\r\n * Gets the indirect reference of this\r\n */\r\n get ref() {\r\n return this._ref;\r\n }\r\n /**\r\n * Gets the instance information for given drawable object\r\n * @param drawable - The drawable object\r\n * @returns The instane information for given drawable object, null if no exists\r\n */\r\n getInstanceInfo(drawable: Drawable) {\r\n return this._instanceInfo.get(drawable);\r\n }\r\n /**\r\n * Gets the maximum batch size of a given device\r\n * @returns The maximum batch size of the device\r\n *\r\n * @internal\r\n */\r\n getMaxBatchSize() {\r\n return getDevice().getDeviceCaps().shaderCaps.maxUniformBufferSize / 64;\r\n }\r\n /**\r\n * Push a punctual light\r\n * @param light - The light to be pushed\r\n */\r\n pushLight(light: PunctualLight) {\r\n if (light.castShadow) {\r\n this._shadowedLightList.push(light);\r\n } else {\r\n this._unshadowedLightList.push(light);\r\n }\r\n if (light.isDirectionLight()) {\r\n if (!this._primaryDirectionalLight || light.intensity > this._primaryDirectionalLight.intensity) {\r\n this._primaryDirectionalLight = light;\r\n }\r\n if (light.sunLight) {\r\n this.sunLight = light;\r\n }\r\n } else if (\r\n !this._primaryTransmissionLight ||\r\n this.getTransmissionLightScore(light) > this.getTransmissionLightScore(this._primaryTransmissionLight)\r\n ) {\r\n this._primaryTransmissionLight = light;\r\n }\r\n }\r\n /**\r\n * Push items from another render queue\r\n * @param queue - The render queue to be pushed\r\n */\r\n pushRenderQueue(queue: RenderQueue) {\r\n const newItemLists = queue._itemList;\r\n if (!newItemLists) {\r\n return;\r\n }\r\n if (!this._itemList) {\r\n this._itemList = this.newRenderItemList();\r\n }\r\n this._itemList.opaque.lit.push(...newItemLists.opaque.lit);\r\n this._itemList.opaque.unlit.push(...newItemLists.opaque.unlit);\r\n this._itemList.transmission.lit.push(...newItemLists.transmission.lit);\r\n this._itemList.transmission.unlit.push(...newItemLists.transmission.unlit);\r\n this._itemList.transparent.lit.push(...newItemLists.transparent.lit);\r\n this._itemList.transparent.unlit.push(...newItemLists.transparent.unlit);\r\n this._itemList.transmission_trans.lit.push(...newItemLists.transmission_trans.lit);\r\n this._itemList.transmission_trans.unlit.push(...newItemLists.transmission_trans.unlit);\r\n this._needSceneColor ||= queue._needSceneColor;\r\n this._needSceneDepth ||= queue._needSceneDepth;\r\n this._needSceneColorWithDepth ||= queue._needSceneColorWithDepth;\r\n this._drawTransparent ||= queue._drawTransparent;\r\n this._sunLight ||= queue._sunLight;\r\n if (\r\n queue._primaryDirectionalLight &&\r\n (!this._primaryDirectionalLight ||\r\n queue._primaryDirectionalLight.intensity > this._primaryDirectionalLight.intensity)\r\n ) {\r\n this._primaryDirectionalLight = queue._primaryDirectionalLight;\r\n }\r\n if (\r\n queue._primaryTransmissionLight &&\r\n (!this._primaryTransmissionLight ||\r\n this.getTransmissionLightScore(queue._primaryTransmissionLight) >\r\n this.getTransmissionLightScore(this._primaryTransmissionLight))\r\n ) {\r\n this._primaryTransmissionLight = queue._primaryTransmissionLight;\r\n }\r\n this._objectColorMaps.push(...queue._objectColorMaps);\r\n }\r\n /**\r\n * Push an item to the render queue\r\n * @param camera - The camera for drawing the item\r\n * @param drawable - The object to be drawn\r\n */\r\n push(camera: Camera, drawable: Drawable) {\r\n if (drawable) {\r\n drawable.pushRenderQueueRef(this._ref);\r\n if (!this._itemList) {\r\n this._itemList = this.newRenderItemList();\r\n }\r\n const material = drawable.getMaterial();\r\n const trans =\r\n this._renderPass.type === RENDER_PASS_TYPE_SHADOWMAP &&\r\n material?.useTransparentShadowCasterForPass?.(this._renderPass.type)\r\n ? false\r\n : drawable.getQueueType() === QUEUE_TRANSPARENT;\r\n const unlit = drawable.isUnlit();\r\n const needDepth = !!drawable.needSceneDepth();\r\n const transmission = !!drawable.needSceneColor() || needDepth;\r\n this._needSceneColor ||= transmission;\r\n this._needSceneDepth ||= drawable.needSceneDepth();\r\n this._needSceneColorWithDepth ||= transmission && needDepth;\r\n this._drawTransparent ||= trans;\r\n if (camera.getPickResultResolveFunc()) {\r\n drawable.getMaterial()!.objectColor = drawable.getObjectColor();\r\n this._objectColorMaps[0].set(drawable.getDrawableId(), drawable);\r\n }\r\n if (drawable.isBatchable()) {\r\n const instanceList = trans\r\n ? transmission\r\n ? unlit\r\n ? this._itemList.transmission_trans.unlit[0].instanceList\r\n : this._itemList.transmission_trans.lit[0].instanceList\r\n : unlit\r\n ? this._itemList.transparent.unlit[0].instanceList\r\n : this._itemList.transparent.lit[0].instanceList\r\n : transmission\r\n ? unlit\r\n ? this._itemList.transmission.unlit[0].instanceList\r\n : this._itemList.transmission.lit[0].instanceList\r\n : unlit\r\n ? this._itemList.opaque.unlit[0].instanceList\r\n : this._itemList.opaque.lit[0].instanceList;\r\n const hash = drawable.getInstanceId(this._renderPass);\r\n let drawableList = instanceList[hash];\r\n if (!drawableList) {\r\n drawableList = [];\r\n instanceList[hash] = drawableList;\r\n }\r\n drawableList.push(drawable);\r\n } else {\r\n const list = trans\r\n ? transmission\r\n ? unlit\r\n ? this._itemList.transmission_trans.unlit[0]\r\n : this._itemList.transmission_trans.lit[0]\r\n : unlit\r\n ? this._itemList.transparent.unlit[0]\r\n : this._itemList.transparent.lit[0]\r\n : transmission\r\n ? unlit\r\n ? this._itemList.transmission.unlit[0]\r\n : this._itemList.transmission.lit[0]\r\n : unlit\r\n ? this._itemList.opaque.unlit[0]\r\n : this._itemList.opaque.lit[0];\r\n const skinAnimation = !!drawable.getBoneMatrices();\r\n const morphAnimation = !!drawable.getMorphData();\r\n let queue: RenderQueueItem[];\r\n if (skinAnimation && morphAnimation) {\r\n queue = list.skinAndMorphItemList;\r\n } else if (skinAnimation) {\r\n queue = list.skinItemList;\r\n } else if (morphAnimation) {\r\n queue = list.morphItemList;\r\n } else {\r\n queue = list.itemList;\r\n }\r\n this.binaryInsert(queue, {\r\n drawable,\r\n sortDistance: drawable.getSortDistance(camera),\r\n instanceData: null\r\n });\r\n if (material) {\r\n list.materialList.add(material.coreMaterial);\r\n }\r\n drawable.applyTransformUniforms(this);\r\n }\r\n }\r\n }\r\n /** @internal */\r\n getDrawableByColor(c: Uint8Array<ArrayBuffer>, map?: Map<number, Drawable>[]) {\r\n const id = (c[0] << 24) + (c[1] << 16) + (c[2] << 8) + c[3];\r\n map = map ?? this._objectColorMaps;\r\n for (const m of map) {\r\n const drawable = m.get(id);\r\n if (drawable) {\r\n return drawable;\r\n }\r\n }\r\n return null;\r\n }\r\n /**\r\n * Capture an object-color lookup that remains valid after this queue is reset or disposed.\r\n * @internal\r\n */\r\n createObjectColorLookupSnapshot(): (c: Uint8Array<ArrayBuffer>) => Nullable<Drawable> {\r\n const snapshot = this._objectColorMaps.slice();\r\n return (c: Uint8Array<ArrayBuffer>) => this.getDrawableByColor(c, snapshot);\r\n }\r\n /**\r\n * Removes all items in the render queue\r\n */\r\n reset() {\r\n if (this._itemList) {\r\n // Release all render bundles\r\n for (const k of objectKeys(this._itemList)) {\r\n const itemListBundle: RenderItemListBundle = this._itemList[k];\r\n for (const l of objectKeys(itemListBundle)) {\r\n const listInfo: RenderItemListInfo[] = itemListBundle[l];\r\n for (const info of listInfo) {\r\n if (info.renderQueue === this) {\r\n if (info.renderBundle) {\r\n info.renderBundle.dispose();\r\n }\r\n if (info.skinRenderBundle) {\r\n info.skinRenderBundle.dispose();\r\n }\r\n if (info.morphRenderBundle) {\r\n info.morphRenderBundle.dispose();\r\n }\r\n if (info.skinAndMorphRenderBundle) {\r\n info.skinAndMorphRenderBundle.dispose();\r\n }\r\n if (info.instanceRenderBundle) {\r\n info.instanceRenderBundle.dispose();\r\n }\r\n }\r\n }\r\n }\r\n }\r\n this._itemList = null;\r\n }\r\n this._ref.valid = false;\r\n this._ref = { ref: this, valid: true };\r\n this._instanceInfo.clear();\r\n this._objectColorMaps.length = 0;\r\n this._objectColorMaps.push(new Map());\r\n this._shadowedLightList = [];\r\n this._unshadowedLightList = [];\r\n this._sunLight = null;\r\n this._primaryDirectionalLight = null;\r\n this._primaryTransmissionLight = null;\r\n this._needSceneColor = false;\r\n this._needSceneDepth = false;\r\n this._needSceneColorWithDepth = false;\r\n this._drawTransparent = false;\r\n }\r\n /** @internal */\r\n end(camera: Camera, createRenderBundles?: boolean) {\r\n const frameCounter = getDevice().frameInfo.frameCounter;\r\n const itemList = this._itemList!;\r\n if (!this.itemList) {\r\n return this;\r\n }\r\n const lists = [\r\n itemList.opaque.lit,\r\n itemList.opaque.unlit,\r\n itemList.transmission.lit,\r\n itemList.transmission.unlit,\r\n itemList.transparent.lit,\r\n itemList.transparent.unlit,\r\n itemList.transmission_trans.lit,\r\n itemList.transmission_trans.unlit\r\n ];\r\n for (let i = 0; i < lists.length; i++) {\r\n const list = lists[i];\r\n for (const info of list) {\r\n if (info.renderQueue !== this) {\r\n continue;\r\n }\r\n const instanceList = info.instanceList;\r\n for (const x in instanceList) {\r\n const drawables = instanceList[x];\r\n let bindGroup: Nullable<CachedBindGroup> = null;\r\n let item: Nullable<RenderQueueItem> = null;\r\n for (let i = 0; i < drawables.length; i++) {\r\n const drawable = drawables[i];\r\n const instanceUniforms = drawable.getInstanceUniforms();\r\n const instanceUniformsSize = instanceUniforms?.length ?? 0;\r\n const stride = ShaderHelper.MATERIAL_INSTANCE_DATA_OFFSET * 4 + instanceUniformsSize;\r\n if (!bindGroup || bindGroup.offset + stride > maxBufferSizeInFloats) {\r\n bindGroup = this._bindGroupAllocator.allocateInstanceBindGroup(frameCounter, stride);\r\n item = {\r\n drawable,\r\n sortDistance: drawable.getSortDistance(camera),\r\n instanceData: {\r\n bindGroup,\r\n offset: bindGroup.offset,\r\n numInstances: 0,\r\n stride\r\n }\r\n };\r\n this.binaryInsert(info.instanceItemList, item);\r\n drawable.applyInstanceOffsetAndStride(this, stride, bindGroup.offset);\r\n }\r\n const instanceInfo = { bindGroup, offset: bindGroup.offset };\r\n this._instanceInfo.set(drawable, instanceInfo);\r\n drawable.applyTransformUniforms(this);\r\n drawable.applyMaterialUniforms(instanceInfo);\r\n bindGroup.offset += stride;\r\n item!.instanceData!.numInstances++;\r\n const mat = drawable.getMaterial();\r\n if (mat) {\r\n info.materialList.add(mat.coreMaterial);\r\n }\r\n }\r\n }\r\n info.instanceList = {};\r\n if (createRenderBundles) {\r\n if (info.itemList.length > 0) {\r\n info.renderBundle = new RenderBundleWrapper();\r\n }\r\n if (info.skinItemList.length > 0) {\r\n info.skinRenderBundle = new RenderBundleWrapper();\r\n }\r\n if (info.morphItemList.length > 0) {\r\n info.morphRenderBundle = new RenderBundleWrapper();\r\n }\r\n if (info.skinAndMorphItemList.length > 0) {\r\n info.skinAndMorphRenderBundle = new RenderBundleWrapper();\r\n }\r\n if (info.instanceItemList.length > 0) {\r\n info.instanceRenderBundle = new RenderBundleWrapper();\r\n }\r\n }\r\n }\r\n }\r\n return this;\r\n }\r\n binaryInsert(itemList: RenderQueueItem[], item: RenderQueueItem) {\r\n let left = 0;\r\n let right = itemList.length - 1;\r\n const newInstanceId = item.drawable.getMaterial()!.instanceId;\r\n while (left <= right) {\r\n const mid = Math.floor((left + right) / 2);\r\n const instanceId = itemList[mid].drawable.getMaterial()!.instanceId;\r\n if (instanceId === newInstanceId) {\r\n itemList.splice(mid + 1, 0, item);\r\n return;\r\n } else if (instanceId < newInstanceId) {\r\n left = mid + 1;\r\n } else {\r\n right = mid - 1;\r\n }\r\n }\r\n itemList.splice(left, 0, item);\r\n }\r\n /**\r\n * Sorts the items in the render queue for rendering\r\n */\r\n sortTransparentItems(cameraPos: Vector3) {\r\n if (this._itemList) {\r\n this._itemList.transparent.lit[0].itemList.sort(\r\n (a, b) =>\r\n this.drawableDistanceToCamera(b.drawable, cameraPos) -\r\n this.drawableDistanceToCamera(a.drawable, cameraPos)\r\n );\r\n this._itemList.transparent.lit[0].skinItemList.sort(\r\n (a, b) =>\r\n this.drawableDistanceToCamera(b.drawable, cameraPos) -\r\n this.drawableDistanceToCamera(a.drawable, cameraPos)\r\n );\r\n this._itemList.transparent.lit[0].morphItemList.sort(\r\n (a, b) =>\r\n this.drawableDistanceToCamera(b.drawable, cameraPos) -\r\n this.drawableDistanceToCamera(a.drawable, cameraPos)\r\n );\r\n this._itemList.transparent.lit[0].skinAndMorphItemList.sort(\r\n (a, b) =>\r\n this.drawableDistanceToCamera(b.drawable, cameraPos) -\r\n this.drawableDistanceToCamera(a.drawable, cameraPos)\r\n );\r\n this._itemList.transparent.unlit[0].itemList.sort(\r\n (a, b) =>\r\n this.drawableDistanceToCamera(b.drawable, cameraPos) -\r\n this.drawableDistanceToCamera(a.drawable, cameraPos)\r\n );\r\n this._itemList.transparent.unlit[0].skinItemList.sort(\r\n (a, b) =>\r\n this.drawableDistanceToCamera(b.drawable, cameraPos) -\r\n this.drawableDistanceToCamera(a.drawable, cameraPos)\r\n );\r\n this._itemList.transparent.unlit[0].morphItemList.sort(\r\n (a, b) =>\r\n this.drawableDistanceToCamera(b.drawable, cameraPos) -\r\n this.drawableDistanceToCamera(a.drawable, cameraPos)\r\n );\r\n this._itemList.transparent.unlit[0].skinAndMorphItemList.sort(\r\n (a, b) =>\r\n this.drawableDistanceToCamera(b.drawable, cameraPos) -\r\n this.drawableDistanceToCamera(a.drawable, cameraPos)\r\n );\r\n }\r\n }\r\n /** Disposes the render queue */\r\n protected onDispose() {\r\n super.onDispose();\r\n this.reset();\r\n this._ref.valid = false;\r\n }\r\n\r\n private drawableDistanceToCamera(drawable: Drawable, cameraPos: Vector3) {\r\n const drawablePos = drawable.getNode().getWorldPosition(tmpDrawablePos);\r\n return Vector3.distanceSq(drawablePos, cameraPos);\r\n }\r\n private newRenderItemListInfo() {\r\n return {\r\n itemList: [],\r\n skinItemList: [],\r\n morphItemList: [],\r\n skinAndMorphItemList: [],\r\n instanceItemList: [],\r\n materialList: new Set(),\r\n instanceList: {},\r\n renderQueue: this\r\n } as RenderItemListInfo;\r\n }\r\n private newRenderItemListBundle() {\r\n return {\r\n lit: [this.newRenderItemListInfo()],\r\n unlit: [this.newRenderItemListInfo()]\r\n };\r\n }\r\n private newRenderItemList() {\r\n return {\r\n opaque: this.newRenderItemListBundle(),\r\n transmission: this.newRenderItemListBundle(),\r\n transparent: this.newRenderItemListBundle(),\r\n transmission_trans: this.newRenderItemListBundle()\r\n };\r\n }\r\n}\r\n"],"names":["maxBufferSizeInFloats","InstanceBindGroupAllocator","Disposable","_instanceBindGroupLayout","_bindGroupList","_allocFrameStamp","allocateInstanceBindGroup","framestamp","sizeInFloats","k","offset","dirty","buildInfo","ProgramBuilder","getDevice","buildRender","vertex","pb","ShaderHelper","getInstanceDataUniformName","vec4","uniformBuffer","main","fragment","bindGroup","createBindGroup","buffer","Float32Array","push","reset","allocation","onDispose","dispose","length","defaultInstanceBindGroupAlloator","tmpDrawablePos","Vector3","RenderQueue","_needSceneDepth","_needSceneColorWithDepth","renderPass","bindGroupAllocator","_bindGroupAllocator","_itemList","_renderPass","_shadowedLightList","_unshadowedLightList","_sunLight","_primaryDirectionalLight","_primaryTransmissionLight","_ref","ref","valid","_instanceInfo","Map","_needSceneColor","_drawTransparent","_objectColorMaps","sunLight","light","primaryDirectionalLight","primaryTransmissionLight","getTransmissionLightScore","isDirectionLight","color","diffuseAndIntensity","luma","x","y","z","range","Math","max","positionAndRange","w","typeWeight","isSpotLight","isPointLight","isRectLight","sqrt","needSceneColor","needSceneDepth","needSceneColorWithDepth","drawTransparent","itemList","shadowedLights","unshadowedLights","getInstanceInfo","drawable","get","getMaxBatchSize","getDeviceCaps","shaderCaps","maxUniformBufferSize","pushLight","castShadow","intensity","pushRenderQueue","queue","newItemLists","newRenderItemList","opaque","lit","unlit","transmission","transparent","transmission_trans","camera","pushRenderQueueRef","material","getMaterial","trans","type","RENDER_PASS_TYPE_SHADOWMAP","useTransparentShadowCasterForPass","getQueueType","QUEUE_TRANSPARENT","isUnlit","needDepth","getPickResultResolveFunc","objectColor","getObjectColor","set","getDrawableId","isBatchable","instanceList","hash","getInstanceId","drawableList","list","skinAnimation","getBoneMatrices","morphAnimation","getMorphData","skinAndMorphItemList","skinItemList","morphItemList","binaryInsert","sortDistance","getSortDistance","instanceData","materialList","add","coreMaterial","applyTransformUniforms","getDrawableByColor","c","map","id","m","createObjectColorLookupSnapshot","snapshot","slice","objectKeys","itemListBundle","l","listInfo","info","renderQueue","renderBundle","skinRenderBundle","morphRenderBundle","skinAndMorphRenderBundle","instanceRenderBundle","clear","end","createRenderBundles","frameCounter","frameInfo","lists","i","drawables","item","instanceUniforms","getInstanceUniforms","instanceUniformsSize","stride","MATERIAL_INSTANCE_DATA_OFFSET","numInstances","instanceItemList","applyInstanceOffsetAndStride","instanceInfo","applyMaterialUniforms","mat","RenderBundleWrapper","left","right","newInstanceId","instanceId","mid","floor","splice","sortTransparentItems","cameraPos","sort","a","b","drawableDistanceToCamera","drawablePos","getNode","getWorldPosition","distanceSq","newRenderItemListInfo","Set","newRenderItemListBundle"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"render_queue.js","sources":["../../src/render/render_queue.ts"],"sourcesContent":["import type { Nullable, Vector4 } from '@zephyr3d/base';\r\nimport { Disposable, objectKeys, Vector3 } from '@zephyr3d/base';\r\nimport type { Camera } from '../camera/camera';\r\nimport type { BatchDrawable, Drawable } from './drawable';\r\nimport type { DirectionalLight, PunctualLight } from '../scene/light';\r\nimport type { Water } from '../scene/water';\r\nimport type { RenderPass } from '.';\r\nimport { QUEUE_TRANSPARENT, RENDER_PASS_TYPE_SHADOWMAP } from '../values';\r\nimport type { BindGroup, BindGroupLayout } from '@zephyr3d/device';\r\nimport { ProgramBuilder } from '@zephyr3d/device';\r\nimport type { Material } from '../material';\r\nimport { ShaderHelper } from '../material';\r\nimport { RenderBundleWrapper } from './renderbundle_wrapper';\r\nimport { getDevice } from '../app/api';\r\nimport { InstanceCuller } from './instance_culling';\r\nimport type { InstanceCullingDraw } from './instance_culling';\r\n\r\n/** @public */\r\nexport type CachedBindGroup = {\r\n bindGroup: BindGroup;\r\n buffer: Float32Array;\r\n offset: number;\r\n dirty: boolean;\r\n};\r\n\r\nconst maxBufferSizeInFloats = 65536 / 4;\r\n\r\n/**\r\n * Instance bind group allocator\r\n * @public\r\n */\r\nexport class InstanceBindGroupAllocator extends Disposable {\r\n private static _instanceBindGroupLayout: Nullable<BindGroupLayout> = null;\r\n _bindGroupList: CachedBindGroup[] = [];\r\n private _allocFrameStamp: number;\r\n constructor() {\r\n super();\r\n this._allocFrameStamp = -1;\r\n this._bindGroupList = [];\r\n }\r\n allocateInstanceBindGroup(framestamp: number, sizeInFloats: number) {\r\n // Reset if render frame changed\r\n if (this._allocFrameStamp !== framestamp) {\r\n this._allocFrameStamp = framestamp;\r\n for (const k of this._bindGroupList) {\r\n k.offset = 0;\r\n }\r\n }\r\n for (const k of this._bindGroupList) {\r\n if (k.offset + sizeInFloats <= maxBufferSizeInFloats) {\r\n k.dirty = true;\r\n return k;\r\n }\r\n }\r\n if (!InstanceBindGroupAllocator._instanceBindGroupLayout) {\r\n const buildInfo = new ProgramBuilder(getDevice()).buildRender({\r\n vertex(pb) {\r\n this[ShaderHelper.getInstanceDataUniformName()] = pb.vec4[65536 >> 4]().uniformBuffer(3);\r\n pb.main(function () {});\r\n },\r\n fragment(pb) {\r\n pb.main(function () {});\r\n }\r\n });\r\n InstanceBindGroupAllocator._instanceBindGroupLayout = buildInfo[2][3];\r\n }\r\n const bindGroup = {\r\n bindGroup: getDevice().createBindGroup(InstanceBindGroupAllocator._instanceBindGroupLayout),\r\n buffer: new Float32Array(maxBufferSizeInFloats),\r\n offset: 0,\r\n dirty: true\r\n };\r\n this._bindGroupList.push(bindGroup);\r\n return bindGroup;\r\n }\r\n /** Reset all allocations so the owned bind groups can be reused. */\r\n reset() {\r\n this._allocFrameStamp = -1;\r\n for (const allocation of this._bindGroupList) {\r\n allocation.offset = 0;\r\n allocation.dirty = true;\r\n }\r\n }\r\n /** Release all bind groups owned by this allocator. */\r\n protected onDispose() {\r\n super.onDispose();\r\n for (const allocation of this._bindGroupList) {\r\n allocation.bindGroup.dispose();\r\n }\r\n this._bindGroupList.length = 0;\r\n }\r\n}\r\n\r\nconst defaultInstanceBindGroupAlloator = new InstanceBindGroupAllocator();\r\nconst tmpDrawablePos = new Vector3();\r\n\r\n/**\r\n * Instance data\r\n * @public\r\n */\r\nexport interface InstanceData {\r\n bindGroup: CachedBindGroup;\r\n stride: number;\r\n offset: number;\r\n numInstances: number;\r\n /** Indirect draw of the instances left after GPU culling, see {@link InstanceCuller} */\r\n culled?: Nullable<InstanceCullingDraw>;\r\n}\r\n\r\n/**\r\n * Render queue item\r\n * @public\r\n */\r\nexport interface RenderQueueItem {\r\n drawable: Drawable;\r\n sortDistance: number;\r\n instanceColor?: Vector4;\r\n instanceData: Nullable<InstanceData>;\r\n /** Level of detail of the drawable's primitive, chosen when it was culled */\r\n lod?: number;\r\n}\r\n\r\n/**\r\n * Render item list information\r\n * @public\r\n */\r\nexport interface RenderItemListInfo {\r\n itemList: RenderQueueItem[];\r\n renderBundle?: RenderBundleWrapper;\r\n skinItemList: RenderQueueItem[];\r\n skinRenderBundle?: RenderBundleWrapper;\r\n morphItemList: RenderQueueItem[];\r\n morphRenderBundle?: RenderBundleWrapper;\r\n skinAndMorphItemList: RenderQueueItem[];\r\n skinAndMorphRenderBundle?: RenderBundleWrapper;\r\n instanceItemList: RenderQueueItem[];\r\n instanceRenderBundle?: RenderBundleWrapper;\r\n /** Batches of skinned meshes, each instance reading its own palette from the skin palette atlas */\r\n skinInstanceItemList: RenderQueueItem[];\r\n skinInstanceRenderBundle?: RenderBundleWrapper;\r\n instanceList: Record<string, BatchDrawable[]>;\r\n /** Level of detail of each instance list, by the same key */\r\n instanceLods: Record<string, number>;\r\n materialList: Set<Material>;\r\n renderQueue: RenderQueue;\r\n}\r\n\r\n/**\r\n * Render item list bundle\r\n * @public\r\n */\r\nexport interface RenderItemListBundle {\r\n lit: RenderItemListInfo[];\r\n unlit: RenderItemListInfo[];\r\n}\r\n\r\n/**\r\n * Item list of render queue\r\n * @public\r\n */\r\nexport interface RenderItemList {\r\n opaque: RenderItemListBundle;\r\n transmission: RenderItemListBundle;\r\n transparent: RenderItemListBundle;\r\n transmission_trans: RenderItemListBundle;\r\n}\r\n\r\n/**\r\n * Render queue reference\r\n * @public\r\n */\r\nexport interface RenderQueueRef {\r\n ref: RenderQueue;\r\n /** False after the queue is cleared and starts a new contents generation. */\r\n valid: boolean;\r\n}\r\n\r\n/**\r\n * Drawable instance information\r\n * @public\r\n */\r\nexport interface DrawableInstanceInfo {\r\n bindGroup: CachedBindGroup;\r\n offset: number;\r\n}\r\n\r\n/**\r\n * A queue that contains the items to be rendered\r\n * @public\r\n */\r\nexport class RenderQueue extends Disposable {\r\n /** @internal */\r\n private _itemList: Nullable<RenderItemList>;\r\n /** @internal */\r\n private readonly _renderPass: RenderPass;\r\n /** @internal */\r\n private _shadowedLightList: PunctualLight[];\r\n /** @internal */\r\n private _unshadowedLightList: PunctualLight[];\r\n /** @internal */\r\n private _sunLight: Nullable<DirectionalLight>;\r\n /** @internal */\r\n private _primaryDirectionalLight: Nullable<DirectionalLight>;\r\n /** @internal */\r\n private _primaryTransmissionLight: Nullable<PunctualLight>;\r\n /**\r\n * Visible water surfaces, in visit order.\r\n *\r\n * Collected separately from the item lists so passes that run before the light\r\n * pass - the caustics pass, which has to know where the water plane is before\r\n * anything shades under it - can find them without walking every draw item.\r\n * @internal\r\n */\r\n private _waterList: Water[];\r\n /** @internal */\r\n private readonly _bindGroupAllocator: InstanceBindGroupAllocator;\r\n /** @internal */\r\n private _ref: RenderQueueRef;\r\n /** @internal */\r\n private readonly _instanceInfo: Map<Drawable, DrawableInstanceInfo>;\r\n /** @internal */\r\n private _needSceneColor: boolean;\r\n private _needSceneDepth: boolean;\r\n private _needHiZNearest: boolean;\r\n private _needSceneColorWithDepth: boolean;\r\n /** @internal */\r\n private _drawTransparent: boolean;\r\n /** @internal */\r\n private readonly _objectColorMaps: Map<number, Drawable>[];\r\n /** @internal */\r\n private _cullCamera: Nullable<Camera>;\r\n /** @internal */\r\n private _lodCamera: Nullable<Camera>;\r\n /** @internal Culls the instances of the batches on the GPU, see InstanceCuller */\r\n private _instanceCuller: Nullable<InstanceCuller>;\r\n /** @internal Queues pushed into this one, which may cull their instances for its view */\r\n private readonly _childQueues: RenderQueue[];\r\n /**\r\n * Creates an instance of a render queue\r\n * @param renderPass - The render pass to which the render queue belongs\r\n * @param bindGroupAllocator - Allocator of instance data, default the shared one\r\n * @param instanceCulling - Whether the instances of the batches are frustum culled on the GPU\r\n * for each view the queue is pushed to, where supported. For queues built once and replayed\r\n */\r\n constructor(\r\n renderPass: RenderPass,\r\n bindGroupAllocator?: InstanceBindGroupAllocator,\r\n instanceCulling?: boolean\r\n ) {\r\n super();\r\n this._bindGroupAllocator = bindGroupAllocator ?? defaultInstanceBindGroupAlloator;\r\n this._itemList = null;\r\n this._renderPass = renderPass;\r\n this._shadowedLightList = [];\r\n this._unshadowedLightList = [];\r\n this._sunLight = null;\r\n this._primaryDirectionalLight = null;\r\n this._primaryTransmissionLight = null;\r\n this._waterList = [];\r\n this._ref = { ref: this, valid: true };\r\n this._instanceInfo = new Map();\r\n this._needSceneColor = false;\r\n this._needSceneDepth = false;\r\n this._needHiZNearest = false;\r\n this._needSceneColorWithDepth = false;\r\n this._drawTransparent = false;\r\n this._objectColorMaps = [new Map()];\r\n this._cullCamera = null;\r\n this._lodCamera = null;\r\n this._instanceCuller = instanceCulling && InstanceCuller.isSupported() ? new InstanceCuller() : null;\r\n this._childQueues = [];\r\n }\r\n /**\r\n * Cull the instances of the queues pushed into this one for its view, before drawing it.\r\n *\r\n * @internal\r\n */\r\n cullInstances() {\r\n for (const child of this._childQueues) {\r\n child._instanceCuller?.cull(this);\r\n }\r\n }\r\n /**\r\n * Have the bounds of a batched drawable updated for GPU instance culling.\r\n *\r\n * @internal\r\n */\r\n markInstanceBoundsDirty(drawable: Drawable) {\r\n this._instanceCuller?.markBoundsDirty(drawable);\r\n }\r\n /**\r\n * The camera this queue was culled with, set by {@link RenderQueue.end}.\r\n *\r\n * Differs from the draw context camera in shadow passes, which cull from the light. Drawables\r\n * that cull their own sub-parts (clipmap terrain tiles) need it to keep only what the pass\r\n * can see.\r\n * @internal\r\n */\r\n get cullCamera() {\r\n return this._cullCamera;\r\n }\r\n /**\r\n * The camera whose view selects the levels of detail, set by {@link RenderQueue.end}: the main\r\n * camera in shadow passes, where it differs from the cull camera.\r\n * @internal\r\n */\r\n get lodCamera() {\r\n return this._lodCamera;\r\n }\r\n /**\r\n * Whether the instances of the batches are culled on the GPU, which then also selects the\r\n * levels of detail where the device allows\r\n * @internal\r\n */\r\n get culledOnGpu() {\r\n return !!this._instanceCuller;\r\n }\r\n /** The sun light */\r\n get sunLight() {\r\n return this._sunLight;\r\n }\r\n set sunLight(light) {\r\n this._sunLight = light;\r\n }\r\n /** Primary directional light used by effects that need a main light direction. */\r\n get primaryDirectionalLight() {\r\n return this._primaryDirectionalLight;\r\n }\r\n set primaryDirectionalLight(light) {\r\n this._primaryDirectionalLight = light;\r\n }\r\n /** Primary punctual light used by thin-transmission effects when there is no main directional light. */\r\n get primaryTransmissionLight() {\r\n return this._primaryTransmissionLight;\r\n }\r\n set primaryTransmissionLight(light) {\r\n this._primaryTransmissionLight = light;\r\n }\r\n /** @internal */\r\n private getTransmissionLightScore(light: PunctualLight) {\r\n if (light.isDirectionLight()) {\r\n return -1;\r\n }\r\n const color = light.diffuseAndIntensity;\r\n const luma = color.x * 0.2126 + color.y * 0.7152 + color.z * 0.0722;\r\n const range = Math.max(1, light.positionAndRange.w);\r\n const typeWeight = light.isSpotLight()\r\n ? 1.2\r\n : light.isPointLight()\r\n ? 1.08\r\n : light.isRectLight()\r\n ? 1.02\r\n : 1;\r\n return Math.max(color.w, 0) * Math.max(luma, 0) * Math.sqrt(range) * typeWeight;\r\n }\r\n /** @internal */\r\n needSceneColor() {\r\n return this._needSceneColor;\r\n }\r\n /** @internal */\r\n needSceneDepth() {\r\n return this._needSceneDepth;\r\n }\r\n /**\r\n * Whether any drawable needs the Hi-Z pyramid's nearest-depth channel.\r\n *\r\n * Materials request it the way they request the scene colour and depth, which\r\n * is what lets a surface that queries the scene's proximity - water foam\r\n * against a shoreline or a piling - turn the second channel on without the\r\n * application having to know it exists.\r\n * @internal\r\n */\r\n needHiZNearest() {\r\n return this._needHiZNearest;\r\n }\r\n /** @internal */\r\n needSceneColorWithDepth() {\r\n return this._needSceneColorWithDepth;\r\n }\r\n /** Whether this render queue has transparent objects to be drawn */\r\n get drawTransparent() {\r\n return this._drawTransparent;\r\n }\r\n /** The render pass to which the render queue belongs */\r\n get renderPass() {\r\n return this._renderPass;\r\n }\r\n /**\r\n * Gets the items of the render queue\r\n */\r\n get itemList() {\r\n return this._itemList;\r\n }\r\n /**\r\n * Gets the shadowed lights\r\n */\r\n get shadowedLights() {\r\n return this._shadowedLightList;\r\n }\r\n /** Visible water surfaces collected while culling. */\r\n get waters(): readonly Water[] {\r\n return this._waterList;\r\n }\r\n /**\r\n * Record a visible water surface.\r\n * @param water - The water node that passed culling.\r\n */\r\n pushWater(water: Water) {\r\n this._waterList.push(water);\r\n }\r\n /**\r\n * Gets the unshadowed lights\r\n */\r\n get unshadowedLights() {\r\n return this._unshadowedLightList;\r\n }\r\n /**\r\n * Gets the indirect reference of this\r\n */\r\n get ref() {\r\n return this._ref;\r\n }\r\n /**\r\n * Gets the instance information for given drawable object\r\n * @param drawable - The drawable object\r\n * @returns The instane information for given drawable object, null if no exists\r\n */\r\n getInstanceInfo(drawable: Drawable) {\r\n return this._instanceInfo.get(drawable);\r\n }\r\n /**\r\n * Gets the maximum batch size of a given device\r\n * @returns The maximum batch size of the device\r\n *\r\n * @internal\r\n */\r\n getMaxBatchSize() {\r\n return getDevice().getDeviceCaps().shaderCaps.maxUniformBufferSize / 64;\r\n }\r\n /**\r\n * Push a punctual light\r\n * @param light - The light to be pushed\r\n */\r\n pushLight(light: PunctualLight) {\r\n if (light.castShadow) {\r\n this._shadowedLightList.push(light);\r\n } else {\r\n this._unshadowedLightList.push(light);\r\n }\r\n if (light.isDirectionLight()) {\r\n if (!this._primaryDirectionalLight || light.intensity > this._primaryDirectionalLight.intensity) {\r\n this._primaryDirectionalLight = light;\r\n }\r\n if (light.sunLight) {\r\n this.sunLight = light;\r\n }\r\n } else if (\r\n !this._primaryTransmissionLight ||\r\n this.getTransmissionLightScore(light) > this.getTransmissionLightScore(this._primaryTransmissionLight)\r\n ) {\r\n this._primaryTransmissionLight = light;\r\n }\r\n }\r\n /**\r\n * Push items from another render queue\r\n * @param queue - The render queue to be pushed\r\n */\r\n pushRenderQueue(queue: RenderQueue) {\r\n if (queue._instanceCuller) {\r\n this._childQueues.push(queue);\r\n }\r\n this._waterList.push(...queue._waterList);\r\n const newItemLists = queue._itemList;\r\n if (!newItemLists) {\r\n return;\r\n }\r\n if (!this._itemList) {\r\n this._itemList = this.newRenderItemList();\r\n }\r\n this._itemList.opaque.lit.push(...newItemLists.opaque.lit);\r\n this._itemList.opaque.unlit.push(...newItemLists.opaque.unlit);\r\n this._itemList.transmission.lit.push(...newItemLists.transmission.lit);\r\n this._itemList.transmission.unlit.push(...newItemLists.transmission.unlit);\r\n this._itemList.transparent.lit.push(...newItemLists.transparent.lit);\r\n this._itemList.transparent.unlit.push(...newItemLists.transparent.unlit);\r\n this._itemList.transmission_trans.lit.push(...newItemLists.transmission_trans.lit);\r\n this._itemList.transmission_trans.unlit.push(...newItemLists.transmission_trans.unlit);\r\n this._needSceneColor ||= queue._needSceneColor;\r\n this._needSceneDepth ||= queue._needSceneDepth;\r\n this._needHiZNearest ||= queue._needHiZNearest;\r\n this._needSceneColorWithDepth ||= queue._needSceneColorWithDepth;\r\n this._drawTransparent ||= queue._drawTransparent;\r\n this._sunLight ||= queue._sunLight;\r\n if (\r\n queue._primaryDirectionalLight &&\r\n (!this._primaryDirectionalLight ||\r\n queue._primaryDirectionalLight.intensity > this._primaryDirectionalLight.intensity)\r\n ) {\r\n this._primaryDirectionalLight = queue._primaryDirectionalLight;\r\n }\r\n if (\r\n queue._primaryTransmissionLight &&\r\n (!this._primaryTransmissionLight ||\r\n this.getTransmissionLightScore(queue._primaryTransmissionLight) >\r\n this.getTransmissionLightScore(this._primaryTransmissionLight))\r\n ) {\r\n this._primaryTransmissionLight = queue._primaryTransmissionLight;\r\n }\r\n this._objectColorMaps.push(...queue._objectColorMaps);\r\n }\r\n /**\r\n * Push an item to the render queue\r\n * @param camera - The camera for drawing the item\r\n * @param drawable - The object to be drawn\r\n * @param lod - Level of detail to draw the drawable's primitive at, default 0\r\n */\r\n push(camera: Camera, drawable: Drawable, lod = 0) {\r\n if (drawable) {\r\n drawable.pushRenderQueueRef(this._ref);\r\n if (!this._itemList) {\r\n this._itemList = this.newRenderItemList();\r\n }\r\n const material = drawable.getMaterial();\r\n const trans =\r\n this._renderPass.type === RENDER_PASS_TYPE_SHADOWMAP &&\r\n material?.useTransparentShadowCasterForPass?.(this._renderPass.type)\r\n ? false\r\n : drawable.getQueueType() === QUEUE_TRANSPARENT;\r\n const unlit = drawable.isUnlit();\r\n const needDepth = !!drawable.needSceneDepth();\r\n const transmission = !!drawable.needSceneColor() || needDepth;\r\n this._needSceneColor ||= transmission;\r\n this._needSceneDepth ||= drawable.needSceneDepth();\r\n this._needHiZNearest ||= !!drawable.needHiZNearest?.();\r\n this._needSceneColorWithDepth ||= transmission && needDepth;\r\n this._drawTransparent ||= trans;\r\n if (camera.getPickResultResolveFunc()) {\r\n drawable.getMaterial()!.objectColor = drawable.getObjectColor();\r\n this._objectColorMaps[0].set(drawable.getDrawableId(), drawable);\r\n }\r\n // Meshes colored by level of detail draw with another material than the one whose instance\r\n // data a batch would hold\r\n if (drawable.isBatchable() && !camera.lodColoration) {\r\n const info = trans\r\n ? transmission\r\n ? unlit\r\n ? this._itemList.transmission_trans.unlit[0]\r\n : this._itemList.transmission_trans.lit[0]\r\n : unlit\r\n ? this._itemList.transparent.unlit[0]\r\n : this._itemList.transparent.lit[0]\r\n : transmission\r\n ? unlit\r\n ? this._itemList.transmission.unlit[0]\r\n : this._itemList.transmission.lit[0]\r\n : unlit\r\n ? this._itemList.opaque.unlit[0]\r\n : this._itemList.opaque.lit[0];\r\n const instanceList = info.instanceList;\r\n // Levels of detail of one primitive draw different index ranges, each its own batch,\r\n // unless GPU culling selects the level of every instance of the batch\r\n if (this._instanceCuller && InstanceCuller.selectsLod(drawable)) {\r\n lod = 0;\r\n }\r\n const id = drawable.getInstanceId(this._renderPass);\r\n const hash = lod > 0 ? `${id}:lod${lod}` : id;\r\n let drawableList = instanceList[hash];\r\n if (!drawableList) {\r\n drawableList = [];\r\n instanceList[hash] = drawableList;\r\n info.instanceLods[hash] = lod;\r\n }\r\n drawableList.push(drawable);\r\n } else {\r\n const list = trans\r\n ? transmission\r\n ? unlit\r\n ? this._itemList.transmission_trans.unlit[0]\r\n : this._itemList.transmission_trans.lit[0]\r\n : unlit\r\n ? this._itemList.transparent.unlit[0]\r\n : this._itemList.transparent.lit[0]\r\n : transmission\r\n ? unlit\r\n ? this._itemList.transmission.unlit[0]\r\n : this._itemList.transmission.lit[0]\r\n : unlit\r\n ? this._itemList.opaque.unlit[0]\r\n : this._itemList.opaque.lit[0];\r\n const skinAnimation = !!drawable.getBoneMatrices();\r\n const morphAnimation = !!drawable.getMorphData();\r\n let queue: RenderQueueItem[];\r\n if (skinAnimation && morphAnimation) {\r\n queue = list.skinAndMorphItemList;\r\n } else if (skinAnimation) {\r\n queue = list.skinItemList;\r\n } else if (morphAnimation) {\r\n queue = list.morphItemList;\r\n } else {\r\n queue = list.itemList;\r\n }\r\n this.binaryInsert(queue, {\r\n drawable,\r\n sortDistance: drawable.getSortDistance(camera),\r\n instanceData: null,\r\n lod\r\n });\r\n if (material) {\r\n list.materialList.add(material.coreMaterial);\r\n }\r\n drawable.applyTransformUniforms(this);\r\n }\r\n }\r\n }\r\n /**\r\n * Give every drawable of the queue its object color and register it for GPU picking.\r\n *\r\n * @remarks\r\n * {@link push} does this for queues culled in a frame that picks. A queue built once and kept\r\n * across frames (BatchGroup) was usually built in a frame that did not, so it is done again\r\n * whenever a frame picks.\r\n *\r\n * @internal\r\n */\r\n registerObjectColors() {\r\n const map = this._objectColorMaps[0];\r\n const register = (drawable: Drawable) => {\r\n const material = drawable.getMaterial();\r\n if (material) {\r\n material.objectColor = drawable.getObjectColor();\r\n }\r\n map.set(drawable.getDrawableId(), drawable);\r\n };\r\n for (const drawable of this._instanceInfo.keys()) {\r\n register(drawable);\r\n }\r\n const itemList = this._itemList;\r\n if (itemList) {\r\n for (const bundle of [\r\n itemList.opaque,\r\n itemList.transmission,\r\n itemList.transparent,\r\n itemList.transmission_trans\r\n ]) {\r\n for (const info of [...bundle.lit, ...bundle.unlit]) {\r\n if (info.renderQueue === this) {\r\n for (const list of [\r\n info.itemList,\r\n info.skinItemList,\r\n info.morphItemList,\r\n info.skinAndMorphItemList\r\n ]) {\r\n for (const item of list) {\r\n register(item.drawable);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n /** @internal */\r\n getDrawableByColor(c: Uint8Array<ArrayBuffer>, map?: Map<number, Drawable>[]) {\r\n const id = (c[0] << 24) + (c[1] << 16) + (c[2] << 8) + c[3];\r\n map = map ?? this._objectColorMaps;\r\n for (const m of map) {\r\n const drawable = m.get(id);\r\n if (drawable) {\r\n return drawable;\r\n }\r\n }\r\n return null;\r\n }\r\n /**\r\n * Capture an object-color lookup that remains valid after this queue is reset or disposed.\r\n * @internal\r\n */\r\n createObjectColorLookupSnapshot(): (c: Uint8Array<ArrayBuffer>) => Nullable<Drawable> {\r\n const snapshot = this._objectColorMaps.slice();\r\n return (c: Uint8Array<ArrayBuffer>) => this.getDrawableByColor(c, snapshot);\r\n }\r\n /**\r\n * Removes all items in the render queue\r\n */\r\n reset() {\r\n if (this._itemList) {\r\n // Release all render bundles\r\n for (const k of objectKeys(this._itemList)) {\r\n const itemListBundle: RenderItemListBundle = this._itemList[k];\r\n for (const l of objectKeys(itemListBundle)) {\r\n const listInfo: RenderItemListInfo[] = itemListBundle[l];\r\n for (const info of listInfo) {\r\n if (info.renderQueue === this) {\r\n if (info.renderBundle) {\r\n info.renderBundle.dispose();\r\n }\r\n if (info.skinRenderBundle) {\r\n info.skinRenderBundle.dispose();\r\n }\r\n if (info.morphRenderBundle) {\r\n info.morphRenderBundle.dispose();\r\n }\r\n if (info.skinAndMorphRenderBundle) {\r\n info.skinAndMorphRenderBundle.dispose();\r\n }\r\n if (info.instanceRenderBundle) {\r\n info.instanceRenderBundle.dispose();\r\n }\r\n if (info.skinInstanceRenderBundle) {\r\n info.skinInstanceRenderBundle.dispose();\r\n }\r\n }\r\n }\r\n }\r\n }\r\n this._itemList = null;\r\n }\r\n this._ref.valid = false;\r\n this._ref = { ref: this, valid: true };\r\n this._instanceInfo.clear();\r\n this._childQueues.length = 0;\r\n this._objectColorMaps.length = 0;\r\n this._objectColorMaps.push(new Map());\r\n this._shadowedLightList = [];\r\n this._unshadowedLightList = [];\r\n this._sunLight = null;\r\n this._primaryDirectionalLight = null;\r\n this._primaryTransmissionLight = null;\r\n this._waterList = [];\r\n this._needSceneColor = false;\r\n this._needSceneDepth = false;\r\n this._needHiZNearest = false;\r\n this._needSceneColorWithDepth = false;\r\n this._drawTransparent = false;\r\n }\r\n /**\r\n * Finish the queue after pushing its items.\r\n * @param camera - The camera the queue was culled with\r\n * @param createRenderBundles - Whether the batches are recorded into render bundles\r\n * @param lodCamera - The camera whose view selected the levels of detail, the culling camera by default\r\n * @internal\r\n */\r\n end(camera: Camera, createRenderBundles?: boolean, lodCamera?: Camera) {\r\n this._cullCamera = camera;\r\n this._lodCamera = lodCamera ?? camera;\r\n const frameCounter = getDevice().frameInfo.frameCounter;\r\n const itemList = this._itemList!;\r\n if (!this.itemList) {\r\n return this;\r\n }\r\n const lists = [\r\n itemList.opaque.lit,\r\n itemList.opaque.unlit,\r\n itemList.transmission.lit,\r\n itemList.transmission.unlit,\r\n itemList.transparent.lit,\r\n itemList.transparent.unlit,\r\n itemList.transmission_trans.lit,\r\n itemList.transmission_trans.unlit\r\n ];\r\n for (let i = 0; i < lists.length; i++) {\r\n const list = lists[i];\r\n for (const info of list) {\r\n if (info.renderQueue !== this) {\r\n continue;\r\n }\r\n const instanceList = info.instanceList;\r\n for (const x in instanceList) {\r\n const drawables = instanceList[x];\r\n let bindGroup: Nullable<CachedBindGroup> = null;\r\n let item: Nullable<RenderQueueItem> = null;\r\n for (let i = 0; i < drawables.length; i++) {\r\n const drawable = drawables[i];\r\n const instanceUniforms = drawable.getInstanceUniforms();\r\n const instanceUniformsSize = instanceUniforms?.length ?? 0;\r\n const stride = ShaderHelper.MATERIAL_INSTANCE_DATA_OFFSET * 4 + instanceUniformsSize;\r\n if (!bindGroup || bindGroup.offset + stride > maxBufferSizeInFloats) {\r\n bindGroup = this._bindGroupAllocator.allocateInstanceBindGroup(frameCounter, stride);\r\n item = {\r\n drawable,\r\n sortDistance: drawable.getSortDistance(camera),\r\n instanceData: {\r\n bindGroup,\r\n offset: bindGroup.offset,\r\n numInstances: 0,\r\n stride\r\n },\r\n lod: info.instanceLods[x] ?? 0\r\n };\r\n this.binaryInsert(\r\n drawable.getBoneMatrices() ? info.skinInstanceItemList : info.instanceItemList,\r\n item\r\n );\r\n drawable.applyInstanceOffsetAndStride(this, stride, bindGroup.offset);\r\n }\r\n const instanceInfo = { bindGroup, offset: bindGroup.offset };\r\n this._instanceInfo.set(drawable, instanceInfo);\r\n drawable.applyTransformUniforms(this);\r\n drawable.applyMaterialUniforms(instanceInfo);\r\n bindGroup.offset += stride;\r\n item!.instanceData!.numInstances++;\r\n const mat = drawable.getMaterial();\r\n if (mat) {\r\n info.materialList.add(mat.coreMaterial);\r\n }\r\n }\r\n }\r\n info.instanceList = {};\r\n info.instanceLods = {};\r\n if (createRenderBundles) {\r\n if (info.itemList.length > 0) {\r\n info.renderBundle = new RenderBundleWrapper();\r\n }\r\n if (info.skinItemList.length > 0) {\r\n info.skinRenderBundle = new RenderBundleWrapper();\r\n }\r\n if (info.morphItemList.length > 0) {\r\n info.morphRenderBundle = new RenderBundleWrapper();\r\n }\r\n if (info.skinAndMorphItemList.length > 0) {\r\n info.skinAndMorphRenderBundle = new RenderBundleWrapper();\r\n }\r\n if (info.instanceItemList.length > 0) {\r\n info.instanceRenderBundle = new RenderBundleWrapper();\r\n }\r\n if (info.skinInstanceItemList.length > 0) {\r\n info.skinInstanceRenderBundle = new RenderBundleWrapper();\r\n }\r\n }\r\n }\r\n }\r\n if (this._instanceCuller) {\r\n const items: RenderQueueItem[] = [];\r\n for (const list of lists) {\r\n for (const info of list) {\r\n if (info.renderQueue === this) {\r\n items.push(...info.instanceItemList, ...info.skinInstanceItemList);\r\n }\r\n }\r\n }\r\n this._instanceCuller.rebuild(items, this._instanceInfo);\r\n }\r\n return this;\r\n }\r\n binaryInsert(itemList: RenderQueueItem[], item: RenderQueueItem) {\r\n let left = 0;\r\n let right = itemList.length - 1;\r\n const newInstanceId = item.drawable.getMaterial()!.instanceId;\r\n while (left <= right) {\r\n const mid = Math.floor((left + right) / 2);\r\n const instanceId = itemList[mid].drawable.getMaterial()!.instanceId;\r\n if (instanceId === newInstanceId) {\r\n itemList.splice(mid + 1, 0, item);\r\n return;\r\n } else if (instanceId < newInstanceId) {\r\n left = mid + 1;\r\n } else {\r\n right = mid - 1;\r\n }\r\n }\r\n itemList.splice(left, 0, item);\r\n }\r\n /**\r\n * Sorts the items in the render queue for rendering\r\n */\r\n sortTransparentItems(cameraPos: Vector3) {\r\n if (this._itemList) {\r\n this._itemList.transparent.lit[0].itemList.sort(\r\n (a, b) =>\r\n this.drawableDistanceToCamera(b.drawable, cameraPos) -\r\n this.drawableDistanceToCamera(a.drawable, cameraPos)\r\n );\r\n this._itemList.transparent.lit[0].skinItemList.sort(\r\n (a, b) =>\r\n this.drawableDistanceToCamera(b.drawable, cameraPos) -\r\n this.drawableDistanceToCamera(a.drawable, cameraPos)\r\n );\r\n this._itemList.transparent.lit[0].morphItemList.sort(\r\n (a, b) =>\r\n this.drawableDistanceToCamera(b.drawable, cameraPos) -\r\n this.drawableDistanceToCamera(a.drawable, cameraPos)\r\n );\r\n this._itemList.transparent.lit[0].skinAndMorphItemList.sort(\r\n (a, b) =>\r\n this.drawableDistanceToCamera(b.drawable, cameraPos) -\r\n this.drawableDistanceToCamera(a.drawable, cameraPos)\r\n );\r\n this._itemList.transparent.unlit[0].itemList.sort(\r\n (a, b) =>\r\n this.drawableDistanceToCamera(b.drawable, cameraPos) -\r\n this.drawableDistanceToCamera(a.drawable, cameraPos)\r\n );\r\n this._itemList.transparent.unlit[0].skinItemList.sort(\r\n (a, b) =>\r\n this.drawableDistanceToCamera(b.drawable, cameraPos) -\r\n this.drawableDistanceToCamera(a.drawable, cameraPos)\r\n );\r\n this._itemList.transparent.unlit[0].morphItemList.sort(\r\n (a, b) =>\r\n this.drawableDistanceToCamera(b.drawable, cameraPos) -\r\n this.drawableDistanceToCamera(a.drawable, cameraPos)\r\n );\r\n this._itemList.transparent.unlit[0].skinAndMorphItemList.sort(\r\n (a, b) =>\r\n this.drawableDistanceToCamera(b.drawable, cameraPos) -\r\n this.drawableDistanceToCamera(a.drawable, cameraPos)\r\n );\r\n }\r\n }\r\n /** Disposes the render queue */\r\n protected onDispose() {\r\n super.onDispose();\r\n this.reset();\r\n this._ref.valid = false;\r\n this._cullCamera = null;\r\n this._lodCamera = null;\r\n this._instanceCuller?.dispose();\r\n this._instanceCuller = null;\r\n }\r\n\r\n private drawableDistanceToCamera(drawable: Drawable, cameraPos: Vector3) {\r\n const drawablePos = drawable.getNode().getWorldPosition(tmpDrawablePos);\r\n return Vector3.distanceSq(drawablePos, cameraPos);\r\n }\r\n private newRenderItemListInfo() {\r\n return {\r\n itemList: [],\r\n skinItemList: [],\r\n morphItemList: [],\r\n skinAndMorphItemList: [],\r\n instanceItemList: [],\r\n skinInstanceItemList: [],\r\n materialList: new Set(),\r\n instanceList: {},\r\n instanceLods: {},\r\n renderQueue: this\r\n } as RenderItemListInfo;\r\n }\r\n private newRenderItemListBundle() {\r\n return {\r\n lit: [this.newRenderItemListInfo()],\r\n unlit: [this.newRenderItemListInfo()]\r\n };\r\n }\r\n private newRenderItemList() {\r\n return {\r\n opaque: this.newRenderItemListBundle(),\r\n transmission: this.newRenderItemListBundle(),\r\n transparent: this.newRenderItemListBundle(),\r\n transmission_trans: this.newRenderItemListBundle()\r\n };\r\n }\r\n}\r\n"],"names":["maxBufferSizeInFloats","InstanceBindGroupAllocator","Disposable","_instanceBindGroupLayout","_bindGroupList","_allocFrameStamp","allocateInstanceBindGroup","framestamp","sizeInFloats","k","offset","dirty","buildInfo","ProgramBuilder","getDevice","buildRender","vertex","pb","ShaderHelper","getInstanceDataUniformName","vec4","uniformBuffer","main","fragment","bindGroup","createBindGroup","buffer","Float32Array","push","reset","allocation","onDispose","dispose","length","defaultInstanceBindGroupAlloator","tmpDrawablePos","Vector3","RenderQueue","_needSceneDepth","_needHiZNearest","_needSceneColorWithDepth","renderPass","bindGroupAllocator","instanceCulling","_bindGroupAllocator","_itemList","_renderPass","_shadowedLightList","_unshadowedLightList","_sunLight","_primaryDirectionalLight","_primaryTransmissionLight","_waterList","_ref","ref","valid","_instanceInfo","Map","_needSceneColor","_drawTransparent","_objectColorMaps","_cullCamera","_lodCamera","_instanceCuller","InstanceCuller","isSupported","_childQueues","cullInstances","child","cull","markInstanceBoundsDirty","drawable","markBoundsDirty","cullCamera","lodCamera","culledOnGpu","sunLight","light","primaryDirectionalLight","primaryTransmissionLight","getTransmissionLightScore","isDirectionLight","color","diffuseAndIntensity","luma","x","y","z","range","Math","max","positionAndRange","w","typeWeight","isSpotLight","isPointLight","isRectLight","sqrt","needSceneColor","needSceneDepth","needHiZNearest","needSceneColorWithDepth","drawTransparent","itemList","shadowedLights","waters","pushWater","water","unshadowedLights","getInstanceInfo","get","getMaxBatchSize","getDeviceCaps","shaderCaps","maxUniformBufferSize","pushLight","castShadow","intensity","pushRenderQueue","queue","newItemLists","newRenderItemList","opaque","lit","unlit","transmission","transparent","transmission_trans","camera","lod","pushRenderQueueRef","material","getMaterial","trans","type","RENDER_PASS_TYPE_SHADOWMAP","useTransparentShadowCasterForPass","getQueueType","QUEUE_TRANSPARENT","isUnlit","needDepth","getPickResultResolveFunc","objectColor","getObjectColor","set","getDrawableId","isBatchable","lodColoration","info","instanceList","selectsLod","id","getInstanceId","hash","drawableList","instanceLods","list","skinAnimation","getBoneMatrices","morphAnimation","getMorphData","skinAndMorphItemList","skinItemList","morphItemList","binaryInsert","sortDistance","getSortDistance","instanceData","materialList","add","coreMaterial","applyTransformUniforms","registerObjectColors","map","register","keys","bundle","renderQueue","item","getDrawableByColor","c","m","createObjectColorLookupSnapshot","snapshot","slice","objectKeys","itemListBundle","l","listInfo","renderBundle","skinRenderBundle","morphRenderBundle","skinAndMorphRenderBundle","instanceRenderBundle","skinInstanceRenderBundle","clear","end","createRenderBundles","frameCounter","frameInfo","lists","i","drawables","instanceUniforms","getInstanceUniforms","instanceUniformsSize","stride","MATERIAL_INSTANCE_DATA_OFFSET","numInstances","skinInstanceItemList","instanceItemList","applyInstanceOffsetAndStride","instanceInfo","applyMaterialUniforms","mat","RenderBundleWrapper","items","rebuild","left","right","newInstanceId","instanceId","mid","floor","splice","sortTransparentItems","cameraPos","sort","a","b","drawableDistanceToCamera","drawablePos","getNode","getWorldPosition","distanceSq","newRenderItemListInfo","Set","newRenderItemListBundle"],"mappings":"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"}
|
package/dist/render/renderer.js
CHANGED
|
@@ -24,7 +24,7 @@ import { executeForwardPlusGraph } from './rendergraph/forward_plus_builder.js';
|
|
|
24
24
|
scene.frameUpdate();
|
|
25
25
|
scene.frameUpdatePerCamera(camera);
|
|
26
26
|
if (camera && !device.isContextLost()) {
|
|
27
|
-
const defaultViewport =
|
|
27
|
+
const defaultViewport = !camera.TAA && !camera.viewport && !camera.scissor;
|
|
28
28
|
const renderX = camera.viewport ? device.screenXToDevice(camera.viewport[0]) : 0;
|
|
29
29
|
const renderY = camera.viewport ? device.screenYToDevice(camera.viewport[1]) : 0;
|
|
30
30
|
const renderWidth = camera.viewport ? device.screenXToDevice(camera.viewport[2]) : device.getDrawingBufferWidth();
|
|
@@ -46,12 +46,18 @@ import { executeForwardPlusGraph } from './rendergraph/forward_plus_builder.js';
|
|
|
46
46
|
renderWidth,
|
|
47
47
|
renderHeight,
|
|
48
48
|
oit: null,
|
|
49
|
-
motionVectors:
|
|
50
|
-
|
|
49
|
+
motionVectors: camera.TAA || camera.motionBlur || SSR && camera.ssrTemporal,
|
|
50
|
+
// Resolved by deriveForwardPlusOptions, which knows whether the queue
|
|
51
|
+
// actually holds skin materials.
|
|
52
|
+
sssProfileId: false,
|
|
53
|
+
SSSProfileIdTexture: null,
|
|
54
|
+
HiZ: camera.HiZ,
|
|
51
55
|
HiZTexture: null,
|
|
52
|
-
|
|
53
|
-
//
|
|
54
|
-
|
|
56
|
+
screenSpaceShadowMask: camera.screenSpaceShadowMask,
|
|
57
|
+
// Set by the WaterCaustics module once it has produced a map.
|
|
58
|
+
waterCaustics: false,
|
|
59
|
+
// Resolved by executeForwardPlusGraph before the graph is built.
|
|
60
|
+
underwater: null,
|
|
55
61
|
globalBindGroupAllocator,
|
|
56
62
|
camera,
|
|
57
63
|
compositor: camera.compositor,
|
|
@@ -83,7 +89,8 @@ import { executeForwardPlusGraph } from './rendergraph/forward_plus_builder.js';
|
|
|
83
89
|
SSSParamTexture: null,
|
|
84
90
|
SSSDiffuseTexture: null,
|
|
85
91
|
SSSTransmissionTexture: null,
|
|
86
|
-
|
|
92
|
+
SSSMaskTexture: null,
|
|
93
|
+
postSSS: false,
|
|
87
94
|
ssrSDFBoxBuffer: null,
|
|
88
95
|
ssrSDFBoxCount: 0,
|
|
89
96
|
finalFramebuffer: device.getFramebuffer(),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderer.js","sources":["../../src/render/renderer.ts"],"sourcesContent":["import { CopyBlitter } from '../blitter';\r\nimport type { DrawContext } from './drawable';\r\nimport type { Scene } from '../scene';\r\nimport type { Camera } from '../camera';\r\nimport { GlobalBindGroupAllocator } from './globalbindgroup_allocator';\r\nimport { fetchSampler } from '../utility/misc';\r\nimport { getDevice } from '../app/api';\r\nimport { executeForwardPlusGraph } from './rendergraph/forward_plus_builder';\r\n\r\n/**\r\n * Forward render scheme\r\n * @internal\r\n */\r\nexport class SceneRenderer {\r\n /**\r\n * Renders a scene by given camera\r\n * @param scene - The scene to render\r\n * @param camera - The camera that will be used to render the scene\r\n */\r\n static renderScene(scene: Scene, camera: Camera): void {\r\n const device = getDevice();\r\n const halfFloatColorBuffer = device.getDeviceCaps().textureCaps.supportHalfFloatColorBuffer;\r\n const colorFormat = camera.HDR && halfFloatColorBuffer ? 'rgba16f' : 'rgba8unorm';\r\n const depthFormat = device.getDeviceCaps().framebufferCaps.supportDepth32floatStencil8\r\n ? 'd32fs8'\r\n : 'd24s8';\r\n const globalBindGroupAllocator = GlobalBindGroupAllocator.get();\r\n scene.frameUpdate();\r\n scene.frameUpdatePerCamera(camera);\r\n if (camera && !device.isContextLost()) {\r\n const defaultViewport = (!camera.TAA || device.type === 'webgl') && !camera.viewport && !camera.scissor;\r\n const renderX = camera.viewport ? device.screenXToDevice(camera.viewport[0]) : 0;\r\n const renderY = camera.viewport ? device.screenYToDevice(camera.viewport[1]) : 0;\r\n const renderWidth = camera.viewport\r\n ? device.screenXToDevice(camera.viewport[2])\r\n : device.getDrawingBufferWidth();\r\n const renderHeight = camera.viewport\r\n ? device.screenYToDevice(camera.viewport[3])\r\n : device.getDrawingBufferHeight();\r\n if (renderWidth > 0 && renderHeight > 0) {\r\n const tmpFramebuffer = defaultViewport\r\n ? null\r\n : device.pool.fetchTemporalFramebuffer(false, renderWidth, renderHeight, colorFormat, depthFormat);\r\n const originFramebuffer = device.getFramebuffer();\r\n if (tmpFramebuffer) {\r\n device.pushDeviceStates();\r\n device.setFramebuffer(tmpFramebuffer);\r\n }\r\n device.clearFrameBuffer(camera.clearColor, camera.clearDepth, camera.clearStencil);\r\n const SSR = camera.SSR && scene.env.light.envLight && scene.env.light.envLight.hasRadiance();\r\n const SSGI =\r\n camera.SSGI &&\r\n camera.HDR &&\r\n camera.ssgiIntensity > 0 &&\r\n scene.env.light.type === 'ibl' &&\r\n !!scene.env.light.envLight?.hasRadiance() &&\r\n !!scene.env.light.envLight?.hasIrradiance();\r\n const SSS = camera.SSS;\r\n const ctx: DrawContext = {\r\n device,\r\n scene,\r\n renderWidth,\r\n renderHeight,\r\n oit: null,\r\n motionVectors:\r\n device.type !== 'webgl' && (camera.TAA || camera.motionBlur || (SSR && camera.ssrTemporal)),\r\n HiZ: camera.HiZ && device.type !== 'webgl',\r\n HiZTexture: null,\r\n // WebGL1 has no 2D array textures; degrade gracefully to the legacy\r\n // per-light additive shadow path (mirrors the HiZ gating above).\r\n screenSpaceShadowMask: camera.screenSpaceShadowMask && device.type !== 'webgl',\r\n globalBindGroupAllocator,\r\n camera,\r\n compositor: camera.compositor,\r\n queue: 0,\r\n lightBlending: false,\r\n renderPass: null,\r\n renderPassHash: null,\r\n shaderVariantHash: null,\r\n flip: false,\r\n depthFormat,\r\n colorFormat,\r\n drawEnvLight: false,\r\n env: null,\r\n sunLight: null,\r\n primaryDirectionalLight: null,\r\n primaryTransmissionLight: null,\r\n materialFlags: 0,\r\n SSR,\r\n SSGI,\r\n SSGIIrradianceHistoryTexture: null,\r\n SSGISurfaceHistoryTexture: null,\r\n SSS,\r\n SSRCalcThickness: SSR && camera.ssrCalcThickness,\r\n // Surface roughness/normal MRT textures are render graph resources\r\n // created by the LightPass; resolved into these fields at execution.\r\n SceneRoughnessTexture: null,\r\n SceneNormalTexture: null,\r\n SSSProfileTexture: null,\r\n SSSParamTexture: null,\r\n SSSDiffuseTexture: null,\r\n SSSTransmissionTexture: null,\r\n SkinSSSTexture: null,\r\n ssrSDFBoxBuffer: null,\r\n ssrSDFBoxCount: 0,\r\n finalFramebuffer: device.getFramebuffer(),\r\n intermediateFramebuffer: null\r\n };\r\n this._renderScene(ctx);\r\n if (tmpFramebuffer) {\r\n device.popDeviceStates();\r\n const oversizedViewport =\r\n renderX < 0 ||\r\n renderY < 0 ||\r\n renderX + renderWidth > device.getDrawingBufferWidth() ||\r\n renderY + renderHeight > device.getDrawingBufferHeight();\r\n const blitter = new CopyBlitter();\r\n if (oversizedViewport) {\r\n blitter.destRect = [renderX, renderY, renderWidth, renderHeight];\r\n } else {\r\n blitter.viewport = camera.viewport ? camera.viewport.slice() : null;\r\n }\r\n blitter.scissor = camera.scissor ? camera.scissor.slice() : null;\r\n blitter.srgbOut = !originFramebuffer;\r\n blitter.blit(\r\n tmpFramebuffer.getColorAttachments()[0],\r\n originFramebuffer ?? null,\r\n fetchSampler('clamp_nearest_nomip')\r\n );\r\n device.pool.releaseFrameBuffer(tmpFramebuffer);\r\n }\r\n } else {\r\n camera.getPickResultResolveFunc()?.(null);\r\n return;\r\n }\r\n }\r\n GlobalBindGroupAllocator.release(globalBindGroupAllocator);\r\n }\r\n\r\n /** @internal */\r\n protected static _renderScene(ctx: DrawContext): void {\r\n executeForwardPlusGraph(ctx);\r\n }\r\n}\r\n"],"names":["SceneRenderer","renderScene","scene","camera","device","getDevice","halfFloatColorBuffer","getDeviceCaps","textureCaps","supportHalfFloatColorBuffer","colorFormat","HDR","depthFormat","framebufferCaps","supportDepth32floatStencil8","globalBindGroupAllocator","GlobalBindGroupAllocator","get","frameUpdate","frameUpdatePerCamera","isContextLost","defaultViewport","TAA","type","viewport","scissor","renderX","screenXToDevice","renderY","screenYToDevice","renderWidth","getDrawingBufferWidth","renderHeight","getDrawingBufferHeight","tmpFramebuffer","pool","fetchTemporalFramebuffer","originFramebuffer","getFramebuffer","pushDeviceStates","setFramebuffer","clearFrameBuffer","clearColor","clearDepth","clearStencil","SSR","env","light","envLight","hasRadiance","SSGI","ssgiIntensity","hasIrradiance","SSS","ctx","oit","motionVectors","motionBlur","ssrTemporal","HiZ","HiZTexture","screenSpaceShadowMask","compositor","queue","lightBlending","renderPass","renderPassHash","shaderVariantHash","flip","drawEnvLight","sunLight","primaryDirectionalLight","primaryTransmissionLight","materialFlags","SSGIIrradianceHistoryTexture","SSGISurfaceHistoryTexture","SSRCalcThickness","ssrCalcThickness","SceneRoughnessTexture","SceneNormalTexture","SSSProfileTexture","SSSParamTexture","SSSDiffuseTexture","SSSTransmissionTexture","SkinSSSTexture","ssrSDFBoxBuffer","ssrSDFBoxCount","finalFramebuffer","intermediateFramebuffer","_renderScene","popDeviceStates","oversizedViewport","blitter","CopyBlitter","destRect","slice","srgbOut","blit","getColorAttachments","fetchSampler","releaseFrameBuffer","getPickResultResolveFunc","release","executeForwardPlusGraph"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"renderer.js","sources":["../../src/render/renderer.ts"],"sourcesContent":["import { CopyBlitter } from '../blitter';\r\nimport type { DrawContext } from './drawable';\r\nimport type { Scene } from '../scene';\r\nimport type { Camera } from '../camera';\r\nimport { GlobalBindGroupAllocator } from './globalbindgroup_allocator';\r\nimport { fetchSampler } from '../utility/misc';\r\nimport { getDevice } from '../app/api';\r\nimport { executeForwardPlusGraph } from './rendergraph/forward_plus_builder';\r\n\r\n/**\r\n * Forward render scheme\r\n * @internal\r\n */\r\nexport class SceneRenderer {\r\n /**\r\n * Renders a scene by given camera\r\n * @param scene - The scene to render\r\n * @param camera - The camera that will be used to render the scene\r\n */\r\n static renderScene(scene: Scene, camera: Camera): void {\r\n const device = getDevice();\r\n const halfFloatColorBuffer = device.getDeviceCaps().textureCaps.supportHalfFloatColorBuffer;\r\n const colorFormat = camera.HDR && halfFloatColorBuffer ? 'rgba16f' : 'rgba8unorm';\r\n const depthFormat = device.getDeviceCaps().framebufferCaps.supportDepth32floatStencil8\r\n ? 'd32fs8'\r\n : 'd24s8';\r\n const globalBindGroupAllocator = GlobalBindGroupAllocator.get();\r\n scene.frameUpdate();\r\n scene.frameUpdatePerCamera(camera);\r\n if (camera && !device.isContextLost()) {\r\n const defaultViewport = !camera.TAA && !camera.viewport && !camera.scissor;\r\n const renderX = camera.viewport ? device.screenXToDevice(camera.viewport[0]) : 0;\r\n const renderY = camera.viewport ? device.screenYToDevice(camera.viewport[1]) : 0;\r\n const renderWidth = camera.viewport\r\n ? device.screenXToDevice(camera.viewport[2])\r\n : device.getDrawingBufferWidth();\r\n const renderHeight = camera.viewport\r\n ? device.screenYToDevice(camera.viewport[3])\r\n : device.getDrawingBufferHeight();\r\n if (renderWidth > 0 && renderHeight > 0) {\r\n const tmpFramebuffer = defaultViewport\r\n ? null\r\n : device.pool.fetchTemporalFramebuffer(false, renderWidth, renderHeight, colorFormat, depthFormat);\r\n const originFramebuffer = device.getFramebuffer();\r\n if (tmpFramebuffer) {\r\n device.pushDeviceStates();\r\n device.setFramebuffer(tmpFramebuffer);\r\n }\r\n device.clearFrameBuffer(camera.clearColor, camera.clearDepth, camera.clearStencil);\r\n const SSR = camera.SSR && scene.env.light.envLight && scene.env.light.envLight.hasRadiance();\r\n const SSGI =\r\n camera.SSGI &&\r\n camera.HDR &&\r\n camera.ssgiIntensity > 0 &&\r\n scene.env.light.type === 'ibl' &&\r\n !!scene.env.light.envLight?.hasRadiance() &&\r\n !!scene.env.light.envLight?.hasIrradiance();\r\n const SSS = camera.SSS;\r\n const ctx: DrawContext = {\r\n device,\r\n scene,\r\n renderWidth,\r\n renderHeight,\r\n oit: null,\r\n motionVectors: camera.TAA || camera.motionBlur || (SSR && camera.ssrTemporal),\r\n // Resolved by deriveForwardPlusOptions, which knows whether the queue\r\n // actually holds skin materials.\r\n sssProfileId: false,\r\n SSSProfileIdTexture: null,\r\n HiZ: camera.HiZ,\r\n HiZTexture: null,\r\n screenSpaceShadowMask: camera.screenSpaceShadowMask,\r\n // Set by the WaterCaustics module once it has produced a map.\r\n waterCaustics: false,\r\n // Resolved by executeForwardPlusGraph before the graph is built.\r\n underwater: null,\r\n globalBindGroupAllocator,\r\n camera,\r\n compositor: camera.compositor,\r\n queue: 0,\r\n lightBlending: false,\r\n renderPass: null,\r\n renderPassHash: null,\r\n shaderVariantHash: null,\r\n flip: false,\r\n depthFormat,\r\n colorFormat,\r\n drawEnvLight: false,\r\n env: null,\r\n sunLight: null,\r\n primaryDirectionalLight: null,\r\n primaryTransmissionLight: null,\r\n materialFlags: 0,\r\n SSR,\r\n SSGI,\r\n SSGIIrradianceHistoryTexture: null,\r\n SSGISurfaceHistoryTexture: null,\r\n SSS,\r\n SSRCalcThickness: SSR && camera.ssrCalcThickness,\r\n // Surface roughness/normal MRT textures are render graph resources\r\n // created by the LightPass; resolved into these fields at execution.\r\n SceneRoughnessTexture: null,\r\n SceneNormalTexture: null,\r\n SSSProfileTexture: null,\r\n SSSParamTexture: null,\r\n SSSDiffuseTexture: null,\r\n SSSTransmissionTexture: null,\r\n SSSMaskTexture: null,\r\n postSSS: false,\r\n ssrSDFBoxBuffer: null,\r\n ssrSDFBoxCount: 0,\r\n finalFramebuffer: device.getFramebuffer(),\r\n intermediateFramebuffer: null\r\n };\r\n this._renderScene(ctx);\r\n if (tmpFramebuffer) {\r\n device.popDeviceStates();\r\n const oversizedViewport =\r\n renderX < 0 ||\r\n renderY < 0 ||\r\n renderX + renderWidth > device.getDrawingBufferWidth() ||\r\n renderY + renderHeight > device.getDrawingBufferHeight();\r\n const blitter = new CopyBlitter();\r\n if (oversizedViewport) {\r\n blitter.destRect = [renderX, renderY, renderWidth, renderHeight];\r\n } else {\r\n blitter.viewport = camera.viewport ? camera.viewport.slice() : null;\r\n }\r\n blitter.scissor = camera.scissor ? camera.scissor.slice() : null;\r\n blitter.srgbOut = !originFramebuffer;\r\n blitter.blit(\r\n tmpFramebuffer.getColorAttachments()[0],\r\n originFramebuffer ?? null,\r\n fetchSampler('clamp_nearest_nomip')\r\n );\r\n device.pool.releaseFrameBuffer(tmpFramebuffer);\r\n }\r\n } else {\r\n camera.getPickResultResolveFunc()?.(null);\r\n return;\r\n }\r\n }\r\n GlobalBindGroupAllocator.release(globalBindGroupAllocator);\r\n }\r\n\r\n /** @internal */\r\n protected static _renderScene(ctx: DrawContext): void {\r\n executeForwardPlusGraph(ctx);\r\n }\r\n}\r\n"],"names":["SceneRenderer","renderScene","scene","camera","device","getDevice","halfFloatColorBuffer","getDeviceCaps","textureCaps","supportHalfFloatColorBuffer","colorFormat","HDR","depthFormat","framebufferCaps","supportDepth32floatStencil8","globalBindGroupAllocator","GlobalBindGroupAllocator","get","frameUpdate","frameUpdatePerCamera","isContextLost","defaultViewport","TAA","viewport","scissor","renderX","screenXToDevice","renderY","screenYToDevice","renderWidth","getDrawingBufferWidth","renderHeight","getDrawingBufferHeight","tmpFramebuffer","pool","fetchTemporalFramebuffer","originFramebuffer","getFramebuffer","pushDeviceStates","setFramebuffer","clearFrameBuffer","clearColor","clearDepth","clearStencil","SSR","env","light","envLight","hasRadiance","SSGI","ssgiIntensity","type","hasIrradiance","SSS","ctx","oit","motionVectors","motionBlur","ssrTemporal","sssProfileId","SSSProfileIdTexture","HiZ","HiZTexture","screenSpaceShadowMask","waterCaustics","underwater","compositor","queue","lightBlending","renderPass","renderPassHash","shaderVariantHash","flip","drawEnvLight","sunLight","primaryDirectionalLight","primaryTransmissionLight","materialFlags","SSGIIrradianceHistoryTexture","SSGISurfaceHistoryTexture","SSRCalcThickness","ssrCalcThickness","SceneRoughnessTexture","SceneNormalTexture","SSSProfileTexture","SSSParamTexture","SSSDiffuseTexture","SSSTransmissionTexture","SSSMaskTexture","postSSS","ssrSDFBoxBuffer","ssrSDFBoxCount","finalFramebuffer","intermediateFramebuffer","_renderScene","popDeviceStates","oversizedViewport","blitter","CopyBlitter","destRect","slice","srgbOut","blit","getColorAttachments","fetchSampler","releaseFrameBuffer","getPickResultResolveFunc","release","executeForwardPlusGraph"],"mappings":"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"}
|
|
@@ -20,8 +20,22 @@
|
|
|
20
20
|
SSSParam: 'sssParam',
|
|
21
21
|
SSSDiffuse: 'sssDiffuse',
|
|
22
22
|
SSSTransmission: 'sssTransmission',
|
|
23
|
-
|
|
23
|
+
PostSSS: 'postSSS',
|
|
24
|
+
/**
|
|
25
|
+
* Per-pixel skin profile id from the depth prepass.
|
|
26
|
+
*
|
|
27
|
+
* @remarks
|
|
28
|
+
* Produced early on purpose: the transmission thickness pass consumes it and
|
|
29
|
+
* runs before the light pass, so an id written during shading would be out of
|
|
30
|
+
* reach.
|
|
31
|
+
*/ SSSProfileId: 'sssProfileId',
|
|
24
32
|
ShadowMask: 'shadowMask',
|
|
33
|
+
/** Screen-space light-space thickness for subsurface transmission. */ TransmissionThickness: 'transmissionThickness',
|
|
34
|
+
/** Light-space caustic map projected onto whatever sits under the water. */ WaterCaustics: 'waterCaustics',
|
|
35
|
+
/**
|
|
36
|
+
* Ordering token: the scene's virtual textures have been updated and filled for this camera.
|
|
37
|
+
* Passes that sample them read this token.
|
|
38
|
+
*/ VirtualTexture: 'virtualTexture',
|
|
25
39
|
/** Final presented color. The last registration becomes the graph sink. */ PresentedColor: 'presentedColor'
|
|
26
40
|
};
|
|
27
41
|
/** Per-frame registry of named render graph resources. @public */ class RGBlackboard {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"blackboard.js","sources":["../../../src/render/rendergraph/blackboard.ts"],"sourcesContent":["import type { Nullable } from '@zephyr3d/base';\r\nimport type { RGHandle, RGTextureHandle } from './types';\r\n\r\n/** Typed key used to publish a frame resource. @public */\r\nexport type FrameResourceKey<THandle extends RGHandle = RGHandle> = string & {\r\n readonly __frameResourceHandle: THandle;\r\n};\r\n\r\ntype FrameResourceMap = {\r\n readonly SceneColor: FrameResourceKey<RGTextureHandle>;\r\n readonly SceneColorCopy: FrameResourceKey<RGTextureHandle>;\r\n readonly SceneColorNoFog: FrameResourceKey<RGTextureHandle>;\r\n readonly LinearDepth: FrameResourceKey<RGTextureHandle>;\r\n readonly SceneDepthAttachment: FrameResourceKey<RGTextureHandle>;\r\n readonly MotionVector: FrameResourceKey<RGTextureHandle>;\r\n readonly HiZ: FrameResourceKey<RGTextureHandle>;\r\n readonly SceneRoughness: FrameResourceKey<RGTextureHandle>;\r\n readonly SceneNormal: FrameResourceKey<RGTextureHandle>;\r\n readonly SSSProfile: FrameResourceKey<RGTextureHandle>;\r\n readonly SSSParam: FrameResourceKey<RGTextureHandle>;\r\n readonly SSSDiffuse: FrameResourceKey<RGTextureHandle>;\r\n readonly SSSTransmission: FrameResourceKey<RGTextureHandle>;\r\n readonly
|
|
1
|
+
{"version":3,"file":"blackboard.js","sources":["../../../src/render/rendergraph/blackboard.ts"],"sourcesContent":["import type { Nullable } from '@zephyr3d/base';\r\nimport type { RGHandle, RGTextureHandle, RGTokenHandle } from './types';\r\n\r\n/** Typed key used to publish a frame resource. @public */\r\nexport type FrameResourceKey<THandle extends RGHandle = RGHandle> = string & {\r\n readonly __frameResourceHandle: THandle;\r\n};\r\n\r\ntype FrameResourceMap = {\r\n readonly SceneColor: FrameResourceKey<RGTextureHandle>;\r\n readonly SceneColorCopy: FrameResourceKey<RGTextureHandle>;\r\n readonly SceneColorNoFog: FrameResourceKey<RGTextureHandle>;\r\n readonly LinearDepth: FrameResourceKey<RGTextureHandle>;\r\n readonly SceneDepthAttachment: FrameResourceKey<RGTextureHandle>;\r\n readonly MotionVector: FrameResourceKey<RGTextureHandle>;\r\n readonly HiZ: FrameResourceKey<RGTextureHandle>;\r\n readonly SceneRoughness: FrameResourceKey<RGTextureHandle>;\r\n readonly SceneNormal: FrameResourceKey<RGTextureHandle>;\r\n readonly SSSProfile: FrameResourceKey<RGTextureHandle>;\r\n readonly SSSParam: FrameResourceKey<RGTextureHandle>;\r\n readonly SSSDiffuse: FrameResourceKey<RGTextureHandle>;\r\n readonly SSSTransmission: FrameResourceKey<RGTextureHandle>;\r\n readonly PostSSS: FrameResourceKey<RGTextureHandle>;\r\n readonly SSSProfileId: FrameResourceKey<RGTextureHandle>;\r\n readonly ShadowMask: FrameResourceKey<RGTextureHandle>;\r\n readonly TransmissionThickness: FrameResourceKey<RGTextureHandle>;\r\n readonly WaterCaustics: FrameResourceKey<RGTextureHandle>;\r\n readonly VirtualTexture: FrameResourceKey<RGTokenHandle>;\r\n readonly PresentedColor: FrameResourceKey<RGTextureHandle>;\r\n};\r\n\r\n/** Well-known frame resource names shared through {@link RGBlackboard}. @public */\r\nexport const FrameResources = {\r\n SceneColor: 'sceneColor',\r\n SceneColorCopy: 'sceneColorCopy',\r\n /**\r\n * Opaque scene color with sky but before height fog is composited.\r\n *\r\n * Screen-space passes read this as the outgoing radiance of a traced hit. Fog\r\n * along the camera-to-hit ray is unrelated to the shading-point-to-hit path\r\n * those passes integrate, and sampling it would both tint hits with the fog\r\n * color and feed back into the next frame. Only published when fog is present\r\n * and a consumer needs it.\r\n */\r\n SceneColorNoFog: 'sceneColorNoFog',\r\n LinearDepth: 'linearDepth',\r\n SceneDepthAttachment: 'sceneDepthAttachment',\r\n MotionVector: 'motionVector',\r\n HiZ: 'hiZ',\r\n SceneRoughness: 'sceneRoughness',\r\n SceneNormal: 'sceneNormal',\r\n SSSProfile: 'sssProfile',\r\n SSSParam: 'sssParam',\r\n SSSDiffuse: 'sssDiffuse',\r\n SSSTransmission: 'sssTransmission',\r\n PostSSS: 'postSSS',\r\n /**\r\n * Per-pixel skin profile id from the depth prepass.\r\n *\r\n * @remarks\r\n * Produced early on purpose: the transmission thickness pass consumes it and\r\n * runs before the light pass, so an id written during shading would be out of\r\n * reach.\r\n */\r\n SSSProfileId: 'sssProfileId',\r\n ShadowMask: 'shadowMask',\r\n /** Screen-space light-space thickness for subsurface transmission. */\r\n TransmissionThickness: 'transmissionThickness',\r\n /** Light-space caustic map projected onto whatever sits under the water. */\r\n WaterCaustics: 'waterCaustics',\r\n /**\r\n * Ordering token: the scene's virtual textures have been updated and filled for this camera.\r\n * Passes that sample them read this token.\r\n */\r\n VirtualTexture: 'virtualTexture',\r\n /** Final presented color. The last registration becomes the graph sink. */\r\n PresentedColor: 'presentedColor'\r\n} as unknown as FrameResourceMap;\r\n\r\n/** Per-frame registry of named render graph resources. @public */\r\nexport class RGBlackboard {\r\n /** @internal */\r\n private _handles: Map<string, RGHandle> = new Map();\r\n /** Register or replace a resource handle. */\r\n set<THandle extends RGHandle>(name: FrameResourceKey<THandle>, handle: THandle): void {\r\n this._handles.set(name, handle);\r\n }\r\n /** Return a resource handle, or null when absent. */\r\n get<THandle extends RGHandle = RGHandle>(name: FrameResourceKey<THandle>): Nullable<THandle> {\r\n return (this._handles.get(name) as THandle | undefined) ?? null;\r\n }\r\n /** Check whether a resource is registered. */\r\n has(name: FrameResourceKey): boolean {\r\n return this._handles.has(name);\r\n }\r\n /** Return a required resource handle. */\r\n expect<THandle extends RGHandle = RGHandle>(name: FrameResourceKey<THandle>): THandle {\r\n const handle = this._handles.get(name);\r\n if (!handle) {\r\n throw new Error(`RGBlackboard: required frame resource \"${name}\" was not registered`);\r\n }\r\n return handle as THandle;\r\n }\r\n /** Remove all registered handles. */\r\n clear(): void {\r\n this._handles.clear();\r\n }\r\n}\r\n"],"names":["FrameResources","SceneColor","SceneColorCopy","SceneColorNoFog","LinearDepth","SceneDepthAttachment","MotionVector","HiZ","SceneRoughness","SceneNormal","SSSProfile","SSSParam","SSSDiffuse","SSSTransmission","PostSSS","SSSProfileId","ShadowMask","TransmissionThickness","WaterCaustics","VirtualTexture","PresentedColor","RGBlackboard","_handles","Map","set","name","handle","get","has","expect","Error","clear"],"mappings":"AA+BA,oFACO,MAAMA,cAAiB,GAAA;IAC5BC,UAAY,EAAA,YAAA;IACZC,cAAgB,EAAA,gBAAA;AAChB;;;;;;;;AAQC,MACDC,eAAiB,EAAA,iBAAA;IACjBC,WAAa,EAAA,aAAA;IACbC,oBAAsB,EAAA,sBAAA;IACtBC,YAAc,EAAA,cAAA;IACdC,GAAK,EAAA,KAAA;IACLC,cAAgB,EAAA,gBAAA;IAChBC,WAAa,EAAA,aAAA;IACbC,UAAY,EAAA,YAAA;IACZC,QAAU,EAAA,UAAA;IACVC,UAAY,EAAA,YAAA;IACZC,eAAiB,EAAA,iBAAA;IACjBC,OAAS,EAAA,SAAA;AACT;;;;;;;AAOC,MACDC,YAAc,EAAA,cAAA;IACdC,UAAY,EAAA,YAAA;AACZ,2EACAC,qBAAuB,EAAA,uBAAA;AACvB,iFACAC,aAAe,EAAA,eAAA;AACf;;;AAGC,MACDC,cAAgB,EAAA,gBAAA;AAChB,gFACAC,cAAgB,EAAA;AAClB;AAEA,mEACO,MAAMC,YAAAA,CAAAA;AACX,qBACQC,QAAkC,GAAA,IAAIC,GAAM,EAAA;AACpD,kDACAC,GAAAA,CAA8BC,IAA+B,EAAEC,MAAe,EAAQ;AACpF,QAAA,IAAI,CAACJ,QAAQ,CAACE,GAAG,CAACC,IAAMC,EAAAA,MAAAA,CAAAA;AAC1B;0DAEAC,GAAyCF,CAAAA,IAA+B,EAAqB;AAC3F,QAAA,OAAO,IAAK,CAACH,QAAQ,CAACK,GAAG,CAACF,IAAiC,CAAA,IAAA,IAAA;AAC7D;mDAEAG,GAAIH,CAAAA,IAAsB,EAAW;AACnC,QAAA,OAAO,IAAI,CAACH,QAAQ,CAACM,GAAG,CAACH,IAAAA,CAAAA;AAC3B;8CAEAI,MAA4CJ,CAAAA,IAA+B,EAAW;AACpF,QAAA,MAAMC,SAAS,IAAI,CAACJ,QAAQ,CAACK,GAAG,CAACF,IAAAA,CAAAA;AACjC,QAAA,IAAI,CAACC,MAAQ,EAAA;AACX,YAAA,MAAM,IAAII,KAAM,CAAA,CAAC,uCAAuC,EAAEL,IAAAA,CAAK,oBAAoB,CAAC,CAAA;AACtF;QACA,OAAOC,MAAAA;AACT;AACA,0CACAK,KAAc,GAAA;QACZ,IAAI,CAACT,QAAQ,CAACS,KAAK,EAAA;AACrB;AACF;;;;"}
|