@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":"weightedblended_oit.js","sources":["../../src/render/weightedblended_oit.ts"],"sourcesContent":["import type {\n AbstractDevice,\n BindGroup,\n GPUProgram,\n PBGlobalScope,\n PBInsideFunctionScope,\n PBShaderExp,\n RenderStateSet,\n Texture2D\n} from '@zephyr3d/device';\nimport { OIT } from './oit';\nimport type { DrawContext } from './drawable';\nimport { drawFullscreenQuad } from './fullscreenquad';\nimport { DEPTH_FARTHEST, REVERSE_Z, Vector4 } from '@zephyr3d/base';\n\n/**\n * Weighted-blended OIT renderer.\n *\n * @remarks\n * The weighed-blended OIT renderer supports both WebGL, WebGL2 and WebGPU device.\n *\n * @public\n */\nexport class WeightedBlendedOIT extends OIT {\n /** Type name of WeightedBlendedOIT */\n public static readonly type = 'wb';\n private static _compositeProgram: GPUProgram;\n private static _compositeBindGroup: BindGroup;\n private static _compositeRenderStates: RenderStateSet;\n\n constructor() {\n super();\n }\n /**\n * {@inheritDoc OIT.getType}\n */\n getType() {\n return WeightedBlendedOIT.type;\n }\n /**\n * {@inheritDoc OIT.supportDevice}\n */\n supportDevice(_deviceType: string) {\n return true;\n }\n /**\n * {@inheritDoc OIT.wantsPremultipliedAlpha}\n */\n wantsPremultipliedAlpha() {\n return false;\n }\n /**\n * {@inheritDoc OIT.wantsAdditiveLightPassAlpha}\n */\n wantsAdditiveLightPassAlpha() {\n return false;\n }\n /**\n * {@inheritDoc OIT.begin}\n */\n begin(_ctx: DrawContext) {\n return 1;\n }\n /**\n * {@inheritDoc OIT.end}\n */\n end(_ctx: DrawContext) {\n return;\n }\n /**\n * {@inheritDoc OIT.setupFragmentOutput}\n */\n setupFragmentOutput(scope: PBGlobalScope) {\n const pb = scope.$builder;\n scope.$outputs.outColor = pb.vec4();\n scope.$outputs.outAlpha = pb.getDevice().type === 'webgl' ? pb.vec4() : pb.float();\n }\n /**\n * {@inheritDoc OIT.beginPass}\n */\n beginPass(ctx: DrawContext, _pass: number) {\n const device = ctx.device;\n const accumBuffer = this.getAccumFramebuffer(ctx, device);\n device.pushDeviceStates();\n device.setFramebuffer(accumBuffer);\n device.clearFrameBuffer(new Vector4(0, 0, 0, 1), null, null);\n return true;\n }\n /**\n * {@inheritDoc OIT.endPass}\n */\n endPass(ctx: DrawContext, _pass: number) {\n const device = ctx.device;\n const accumBuffer = device.getFramebuffer()!;\n device.popDeviceStates();\n const accumTargets = accumBuffer.getColorAttachments();\n this.composite(ctx, device, accumTargets[0] as Texture2D, accumTargets[1] as Texture2D);\n }\n /**\n * {@inheritDoc OIT.calculateHash}\n */\n calculateHash() {\n return this.getType();\n }\n /**\n * {@inheritDoc OIT.applyUniforms}\n */\n applyUniforms(_ctx: DrawContext, _bindGroup: BindGroup) {\n return;\n }\n /**\n * {@inheritDoc OIT.outputFragmentColor}\n */\n outputFragmentColor(scope: PBInsideFunctionScope, color: PBShaderExp) {\n const pb = scope.$builder;\n pb.func('Z_WBOIT_depthWeight', [pb.float('z'), pb.float('a')], function () {\n this.$return(\n pb.clamp(\n pb.mul(\n pb.pow(pb.add(pb.min(1, pb.mul(this.a, 10)), 0.01), 3),\n 1e8,\n pb.pow(pb.sub(1, pb.mul(this.z, 0.9)), 2)\n ),\n 1e-2,\n 3e3\n )\n );\n });\n pb.func('Z_WBOIT_output', [pb.vec4('color')], function () {\n // The weight ramp expects standard-oriented depth (0 = near)\n this.$l.w = this.Z_WBOIT_depthWeight(\n REVERSE_Z ? pb.sub(1, this.$builtins.fragCoord.z) : this.$builtins.fragCoord.z,\n this.color.a\n );\n this.$outputs[0] = pb.vec4(pb.mul(this.color.rgb, this.w), this.color.a);\n this.$outputs[1] =\n pb.getDevice().type === 'webgl'\n ? pb.vec4(pb.mul(this.color.a, this.w))\n : pb.mul(this.color.a, this.w);\n });\n scope.Z_WBOIT_output(color);\n return true;\n }\n /**\n * {@inheritDoc OIT.setRenderStates}\n */\n setRenderStates(rs: RenderStateSet) {\n const blendingState = rs.useBlendingState();\n blendingState.enable(true);\n blendingState.setBlendEquation('add', 'add');\n blendingState.setBlendFuncRGB('one', 'one');\n blendingState.setBlendFuncAlpha('zero', 'inv-src-alpha');\n const depthState = rs.useDepthState();\n depthState.enableWrite(false).enableTest(true);\n }\n /** @internal */\n private composite(ctx: DrawContext, device: AbstractDevice, accumColor: Texture2D, accumAlpha: Texture2D) {\n const currentFramebuffer = device.getFramebuffer();\n const colorAttachment = currentFramebuffer?.getColorAttachments()[0] ?? null;\n const singleColorFramebuffer =\n currentFramebuffer && currentFramebuffer.getColorAttachments().length > 1 && colorAttachment\n ? device.pool.fetchTemporalFramebuffer(\n false,\n 0,\n 0,\n colorAttachment,\n currentFramebuffer.getDepthAttachment(),\n false\n )\n : null;\n if (singleColorFramebuffer) {\n const viewport = device.getViewport();\n const scissor = device.getScissor();\n device.pushDeviceStates();\n device.setFramebuffer(singleColorFramebuffer);\n device.setViewport(viewport);\n device.setScissor(scissor);\n }\n try {\n device.setProgram(WeightedBlendedOIT.getCompositeProgram(device));\n WeightedBlendedOIT._compositeBindGroup.setTexture('accumColorTex', accumColor);\n WeightedBlendedOIT._compositeBindGroup.setTexture('accumAlphaTex', accumAlpha);\n device.setBindGroup(0, WeightedBlendedOIT._compositeBindGroup);\n drawFullscreenQuad(WeightedBlendedOIT._compositeRenderStates);\n } finally {\n if (singleColorFramebuffer) {\n device.popDeviceStates();\n device.pool.releaseFrameBuffer(singleColorFramebuffer);\n }\n }\n }\n /** @internal */\n private getAccumFramebuffer(ctx: DrawContext, device: AbstractDevice) {\n const width = ctx.depthTexture!.width;\n const height = ctx.depthTexture!.height;\n const accumColor = device.pool.fetchTemporalTexture2D(false, 'rgba16f', width, height, false);\n const accumAlpha = device.pool.fetchTemporalTexture2D(\n false,\n device.type === 'webgl' ? 'rgba16f' : 'r16f',\n width,\n height,\n false\n );\n const fb = device.pool.createTemporalFramebuffer(true, [accumColor, accumAlpha], ctx.depthTexture);\n device.pool.releaseTexture(accumColor);\n device.pool.releaseTexture(accumAlpha);\n return fb;\n }\n /** @internal */\n private static getCompositeProgram(device: AbstractDevice) {\n if (!this._compositeProgram) {\n this._compositeProgram = device.buildRenderProgram({\n vertex(pb) {\n this.$inputs.pos = pb.vec2().attrib('position');\n this.$outputs.uv = pb.vec2();\n pb.main(function () {\n this.$builtins.position = pb.vec4(this.$inputs.pos, DEPTH_FARTHEST, 1);\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\n if (device.type === 'webgpu') {\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\n }\n });\n },\n fragment(pb) {\n this.$outputs.outColor = pb.vec4();\n this.accumColorTex = pb.tex2D().uniform(0);\n this.accumAlphaTex = pb.tex2D().uniform(0);\n pb.main(function () {\n this.$l.accumColor = pb.textureSample(this.accumColorTex, this.$inputs.uv);\n this.$l.accumAlpha = pb.textureSample(this.accumAlphaTex, this.$inputs.uv);\n this.$l.r = this.accumColor.a;\n this.accumColor.a = this.accumAlpha.r;\n this.$outputs.outColor = pb.vec4(\n pb.div(this.accumColor.rgb, pb.clamp(this.accumColor.a, 0.0001, 50000)),\n this.r\n );\n });\n }\n })!;\n this._compositeProgram.name = '@WBOIT_Composite';\n this._compositeBindGroup = device.createBindGroup(this._compositeProgram.bindGroupLayouts[0]);\n this._compositeRenderStates = device.createRenderStateSet();\n this._compositeRenderStates\n .useBlendingState()\n .enable(true)\n .setBlendFuncRGB('inv-src-alpha', 'src-alpha')\n .setBlendFuncAlpha('zero', 'one');\n this._compositeRenderStates.useDepthState().enableTest(false).enableWrite(false);\n }\n return this._compositeProgram;\n }\n}\n"],"names":["WeightedBlendedOIT","OIT","type","_compositeProgram","_compositeBindGroup","_compositeRenderStates","getType","supportDevice","_deviceType","wantsPremultipliedAlpha","wantsAdditiveLightPassAlpha","begin","_ctx","end","setupFragmentOutput","scope","pb","$builder","$outputs","outColor","vec4","outAlpha","getDevice","float","beginPass","ctx","_pass","device","accumBuffer","getAccumFramebuffer","pushDeviceStates","setFramebuffer","clearFrameBuffer","Vector4","endPass","getFramebuffer","popDeviceStates","accumTargets","getColorAttachments","composite","calculateHash","applyUniforms","_bindGroup","outputFragmentColor","color","func","$return","clamp","mul","pow","add","min","a","sub","z","$l","w","Z_WBOIT_depthWeight","REVERSE_Z","$builtins","fragCoord","rgb","Z_WBOIT_output","setRenderStates","rs","blendingState","useBlendingState","enable","setBlendEquation","setBlendFuncRGB","setBlendFuncAlpha","depthState","useDepthState","enableWrite","enableTest","accumColor","accumAlpha","currentFramebuffer","colorAttachment","singleColorFramebuffer","length","pool","fetchTemporalFramebuffer","getDepthAttachment","viewport","getViewport","scissor","getScissor","setViewport","setScissor","setProgram","getCompositeProgram","setTexture","setBindGroup","drawFullscreenQuad","releaseFrameBuffer","width","depthTexture","height","fetchTemporalTexture2D","fb","createTemporalFramebuffer","releaseTexture","buildRenderProgram","vertex","$inputs","pos","vec2","attrib","uv","main","position","DEPTH_FARTHEST","xy","y","neg","fragment","accumColorTex","tex2D","uniform","accumAlphaTex","textureSample","r","div","name","createBindGroup","bindGroupLayouts","createRenderStateSet"],"mappings":";;;;AAeA;;;;;;;IAQO,MAAMA,kBAA2BC,SAAAA,GAAAA,CAAAA;2CAEtC,OAAuBC,IAAAA,GAAO,IAAK;AACnC,IAAA,OAAeC,iBAA8B;AAC7C,IAAA,OAAeC,mBAA+B;AAC9C,IAAA,OAAeC,sBAAuC;IAEtD,WAAc,EAAA;QACZ,KAAK,EAAA;AACP;AACA;;AAEC,MACDC,OAAU,GAAA;AACR,QAAA,OAAON,mBAAmBE,IAAI;AAChC;AACA;;MAGAK,aAAAA,CAAcC,WAAmB,EAAE;QACjC,OAAO,IAAA;AACT;AACA;;AAEC,MACDC,uBAA0B,GAAA;QACxB,OAAO,KAAA;AACT;AACA;;AAEC,MACDC,2BAA8B,GAAA;QAC5B,OAAO,KAAA;AACT;AACA;;MAGAC,KAAAA,CAAMC,IAAiB,EAAE;QACvB,OAAO,CAAA;AACT;AACA;;MAGAC,GAAAA,CAAID,IAAiB,EAAE;AACrB,QAAA;AACF;AACA;;MAGAE,mBAAAA,CAAoBC,KAAoB,EAAE;QACxC,MAAMC,EAAAA,GAAKD,MAAME,QAAQ;AACzBF,QAAAA,KAAAA,CAAMG,QAAQ,CAACC,QAAQ,GAAGH,GAAGI,IAAI,EAAA;AACjCL,QAAAA,KAAAA,CAAMG,QAAQ,CAACG,QAAQ,GAAGL,GAAGM,SAAS,EAAA,CAAGpB,IAAI,KAAK,OAAUc,GAAAA,EAAAA,CAAGI,IAAI,EAAA,GAAKJ,GAAGO,KAAK,EAAA;AAClF;AACA;;AAEC,MACDC,SAAUC,CAAAA,GAAgB,EAAEC,KAAa,EAAE;QACzC,MAAMC,MAAAA,GAASF,IAAIE,MAAM;AACzB,QAAA,MAAMC,WAAc,GAAA,IAAI,CAACC,mBAAmB,CAACJ,GAAKE,EAAAA,MAAAA,CAAAA;AAClDA,QAAAA,MAAAA,CAAOG,gBAAgB,EAAA;AACvBH,QAAAA,MAAAA,CAAOI,cAAc,CAACH,WAAAA,CAAAA;QACtBD,MAAOK,CAAAA,gBAAgB,CAAC,IAAIC,OAAAA,CAAQ,GAAG,CAAG,EAAA,CAAA,EAAG,IAAI,IAAM,EAAA,IAAA,CAAA;QACvD,OAAO,IAAA;AACT;AACA;;AAEC,MACDC,OAAQT,CAAAA,GAAgB,EAAEC,KAAa,EAAE;QACvC,MAAMC,MAAAA,GAASF,IAAIE,MAAM;QACzB,MAAMC,WAAAA,GAAcD,OAAOQ,cAAc,EAAA;AACzCR,QAAAA,MAAAA,CAAOS,eAAe,EAAA;QACtB,MAAMC,YAAAA,GAAeT,YAAYU,mBAAmB,EAAA;QACpD,IAAI,CAACC,SAAS,CAACd,GAAKE,EAAAA,MAAAA,EAAQU,YAAY,CAAC,CAAE,CAAA,EAAeA,YAAY,CAAC,CAAE,CAAA,CAAA;AAC3E;AACA;;AAEC,MACDG,aAAgB,GAAA;QACd,OAAO,IAAI,CAAClC,OAAO,EAAA;AACrB;AACA;;AAEC,MACDmC,aAAc7B,CAAAA,IAAiB,EAAE8B,UAAqB,EAAE;AACtD,QAAA;AACF;AACA;;AAEC,MACDC,mBAAoB5B,CAAAA,KAA4B,EAAE6B,KAAkB,EAAE;QACpE,MAAM5B,EAAAA,GAAKD,MAAME,QAAQ;QACzBD,EAAG6B,CAAAA,IAAI,CAAC,qBAAuB,EAAA;AAAC7B,YAAAA,EAAAA,CAAGO,KAAK,CAAC,GAAA,CAAA;AAAMP,YAAAA,EAAAA,CAAGO,KAAK,CAAC,GAAA;SAAK,EAAE,WAAA;YAC7D,IAAI,CAACuB,OAAO,CACV9B,EAAAA,CAAG+B,KAAK,CACN/B,EAAAA,CAAGgC,GAAG,CACJhC,EAAAA,CAAGiC,GAAG,CAACjC,EAAAA,CAAGkC,GAAG,CAAClC,EAAAA,CAAGmC,GAAG,CAAC,CAAA,EAAGnC,EAAGgC,CAAAA,GAAG,CAAC,IAAI,CAACI,CAAC,EAAE,MAAM,IAAO,CAAA,EAAA,CAAA,CAAA,EACpD,KACApC,EAAGiC,CAAAA,GAAG,CAACjC,EAAGqC,CAAAA,GAAG,CAAC,CAAGrC,EAAAA,EAAAA,CAAGgC,GAAG,CAAC,IAAI,CAACM,CAAC,EAAE,GAAO,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,EAEzC,IACA,EAAA,GAAA,CAAA,CAAA;AAGN,SAAA,CAAA;QACAtC,EAAG6B,CAAAA,IAAI,CAAC,gBAAkB,EAAA;AAAC7B,YAAAA,EAAAA,CAAGI,IAAI,CAAC,OAAA;SAAS,EAAE,WAAA;;AAE5C,YAAA,IAAI,CAACmC,EAAE,CAACC,CAAC,GAAG,IAAI,CAACC,mBAAmB,CAClCC,YAAY1C,EAAGqC,CAAAA,GAAG,CAAC,CAAA,EAAG,IAAI,CAACM,SAAS,CAACC,SAAS,CAACN,CAAC,CAAI,GAAA,IAAI,CAACK,SAAS,CAACC,SAAS,CAACN,CAAC,EAC9E,IAAI,CAACV,KAAK,CAACQ,CAAC,CAAA;YAEd,IAAI,CAAClC,QAAQ,CAAC,CAAE,CAAA,GAAGF,GAAGI,IAAI,CAACJ,EAAGgC,CAAAA,GAAG,CAAC,IAAI,CAACJ,KAAK,CAACiB,GAAG,EAAE,IAAI,CAACL,CAAC,CAAA,EAAG,IAAI,CAACZ,KAAK,CAACQ,CAAC,CAAA;AACvE,YAAA,IAAI,CAAClC,QAAQ,CAAC,CAAE,CAAA,GACdF,GAAGM,SAAS,EAAA,CAAGpB,IAAI,KAAK,UACpBc,EAAGI,CAAAA,IAAI,CAACJ,EAAGgC,CAAAA,GAAG,CAAC,IAAI,CAACJ,KAAK,CAACQ,CAAC,EAAE,IAAI,CAACI,CAAC,KACnCxC,EAAGgC,CAAAA,GAAG,CAAC,IAAI,CAACJ,KAAK,CAACQ,CAAC,EAAE,IAAI,CAACI,CAAC,CAAA;AACnC,SAAA,CAAA;AACAzC,QAAAA,KAAAA,CAAM+C,cAAc,CAAClB,KAAAA,CAAAA;QACrB,OAAO,IAAA;AACT;AACA;;MAGAmB,eAAAA,CAAgBC,EAAkB,EAAE;QAClC,MAAMC,aAAAA,GAAgBD,GAAGE,gBAAgB,EAAA;AACzCD,QAAAA,aAAAA,CAAcE,MAAM,CAAC,IAAA,CAAA;QACrBF,aAAcG,CAAAA,gBAAgB,CAAC,KAAO,EAAA,KAAA,CAAA;QACtCH,aAAcI,CAAAA,eAAe,CAAC,KAAO,EAAA,KAAA,CAAA;QACrCJ,aAAcK,CAAAA,iBAAiB,CAAC,MAAQ,EAAA,eAAA,CAAA;QACxC,MAAMC,UAAAA,GAAaP,GAAGQ,aAAa,EAAA;AACnCD,QAAAA,UAAAA,CAAWE,WAAW,CAAC,KAAOC,CAAAA,CAAAA,UAAU,CAAC,IAAA,CAAA;AAC3C;qBAEA,SAAQnC,CAAUd,GAAgB,EAAEE,MAAsB,EAAEgD,UAAqB,EAAEC,UAAqB,EAAE;QACxG,MAAMC,kBAAAA,GAAqBlD,OAAOQ,cAAc,EAAA;AAChD,QAAA,MAAM2C,eAAkBD,GAAAA,kBAAAA,EAAoBvC,mBAAqB,EAAA,CAAC,EAAE,IAAI,IAAA;QACxE,MAAMyC,sBAAAA,GACJF,sBAAsBA,kBAAmBvC,CAAAA,mBAAmB,GAAG0C,MAAM,GAAG,KAAKF,eACzEnD,GAAAA,MAAAA,CAAOsD,IAAI,CAACC,wBAAwB,CAClC,KACA,EAAA,CAAA,EACA,GACAJ,eACAD,EAAAA,kBAAAA,CAAmBM,kBAAkB,EAAA,EACrC,KAEF,CAAA,GAAA,IAAA;AACN,QAAA,IAAIJ,sBAAwB,EAAA;YAC1B,MAAMK,QAAAA,GAAWzD,OAAO0D,WAAW,EAAA;YACnC,MAAMC,OAAAA,GAAU3D,OAAO4D,UAAU,EAAA;AACjC5D,YAAAA,MAAAA,CAAOG,gBAAgB,EAAA;AACvBH,YAAAA,MAAAA,CAAOI,cAAc,CAACgD,sBAAAA,CAAAA;AACtBpD,YAAAA,MAAAA,CAAO6D,WAAW,CAACJ,QAAAA,CAAAA;AACnBzD,YAAAA,MAAAA,CAAO8D,UAAU,CAACH,OAAAA,CAAAA;AACpB;QACA,IAAI;AACF3D,YAAAA,MAAAA,CAAO+D,UAAU,CAAC1F,kBAAmB2F,CAAAA,mBAAmB,CAAChE,MAAAA,CAAAA,CAAAA;AACzD3B,YAAAA,kBAAAA,CAAmBI,mBAAmB,CAACwF,UAAU,CAAC,eAAiBjB,EAAAA,UAAAA,CAAAA;AACnE3E,YAAAA,kBAAAA,CAAmBI,mBAAmB,CAACwF,UAAU,CAAC,eAAiBhB,EAAAA,UAAAA,CAAAA;AACnEjD,YAAAA,MAAAA,CAAOkE,YAAY,CAAC,CAAG7F,EAAAA,kBAAAA,CAAmBI,mBAAmB,CAAA;AAC7D0F,YAAAA,kBAAAA,CAAmB9F,mBAAmBK,sBAAsB,CAAA;SACpD,QAAA;AACR,YAAA,IAAI0E,sBAAwB,EAAA;AAC1BpD,gBAAAA,MAAAA,CAAOS,eAAe,EAAA;gBACtBT,MAAOsD,CAAAA,IAAI,CAACc,kBAAkB,CAAChB,sBAAAA,CAAAA;AACjC;AACF;AACF;AACA,qBACA,mBAAQlD,CAAoBJ,GAAgB,EAAEE,MAAsB,EAAE;AACpE,QAAA,MAAMqE,KAAQvE,GAAAA,GAAAA,CAAIwE,YAAY,CAAED,KAAK;AACrC,QAAA,MAAME,MAASzE,GAAAA,GAAAA,CAAIwE,YAAY,CAAEC,MAAM;QACvC,MAAMvB,UAAAA,GAAahD,OAAOsD,IAAI,CAACkB,sBAAsB,CAAC,KAAA,EAAO,SAAWH,EAAAA,KAAAA,EAAOE,MAAQ,EAAA,KAAA,CAAA;AACvF,QAAA,MAAMtB,UAAajD,GAAAA,MAAAA,CAAOsD,IAAI,CAACkB,sBAAsB,CACnD,KAAA,EACAxE,MAAOzB,CAAAA,IAAI,KAAK,OAAA,GAAU,SAAY,GAAA,MAAA,EACtC8F,OACAE,MACA,EAAA,KAAA,CAAA;AAEF,QAAA,MAAME,KAAKzE,MAAOsD,CAAAA,IAAI,CAACoB,yBAAyB,CAAC,IAAM,EAAA;AAAC1B,YAAAA,UAAAA;AAAYC,YAAAA;AAAW,SAAA,EAAEnD,IAAIwE,YAAY,CAAA;QACjGtE,MAAOsD,CAAAA,IAAI,CAACqB,cAAc,CAAC3B,UAAAA,CAAAA;QAC3BhD,MAAOsD,CAAAA,IAAI,CAACqB,cAAc,CAAC1B,UAAAA,CAAAA;QAC3B,OAAOwB,EAAAA;AACT;AACA,qBACA,OAAeT,mBAAoBhE,CAAAA,MAAsB,EAAE;AACzD,QAAA,IAAI,CAAC,IAAI,CAACxB,iBAAiB,EAAE;AAC3B,YAAA,IAAI,CAACA,iBAAiB,GAAGwB,MAAAA,CAAO4E,kBAAkB,CAAC;AACjDC,gBAAAA,MAAAA,CAAAA,CAAOxF,EAAE,EAAA;oBACP,IAAI,CAACyF,OAAO,CAACC,GAAG,GAAG1F,EAAG2F,CAAAA,IAAI,EAAGC,CAAAA,MAAM,CAAC,UAAA,CAAA;AACpC,oBAAA,IAAI,CAAC1F,QAAQ,CAAC2F,EAAE,GAAG7F,GAAG2F,IAAI,EAAA;AAC1B3F,oBAAAA,EAAAA,CAAG8F,IAAI,CAAC,WAAA;AACN,wBAAA,IAAI,CAACnD,SAAS,CAACoD,QAAQ,GAAG/F,EAAGI,CAAAA,IAAI,CAAC,IAAI,CAACqF,OAAO,CAACC,GAAG,EAAEM,cAAgB,EAAA,CAAA,CAAA;wBACpE,IAAI,CAAC9F,QAAQ,CAAC2F,EAAE,GAAG7F,EAAGkC,CAAAA,GAAG,CAAClC,EAAAA,CAAGgC,GAAG,CAAC,IAAI,CAACyD,OAAO,CAACC,GAAG,CAACO,EAAE,EAAE,GAAA,CAAA,EAAMjG,EAAG2F,CAAAA,IAAI,CAAC,GAAA,CAAA,CAAA;wBACpE,IAAIhF,MAAAA,CAAOzB,IAAI,KAAK,QAAU,EAAA;AAC5B,4BAAA,IAAI,CAACyD,SAAS,CAACoD,QAAQ,CAACG,CAAC,GAAGlG,EAAAA,CAAGmG,GAAG,CAAC,IAAI,CAACxD,SAAS,CAACoD,QAAQ,CAACG,CAAC,CAAA;AAC9D;AACF,qBAAA,CAAA;AACF,iBAAA;AACAE,gBAAAA,QAAAA,CAAAA,CAASpG,EAAE,EAAA;AACT,oBAAA,IAAI,CAACE,QAAQ,CAACC,QAAQ,GAAGH,GAAGI,IAAI,EAAA;AAChC,oBAAA,IAAI,CAACiG,aAAa,GAAGrG,GAAGsG,KAAK,EAAA,CAAGC,OAAO,CAAC,CAAA,CAAA;AACxC,oBAAA,IAAI,CAACC,aAAa,GAAGxG,GAAGsG,KAAK,EAAA,CAAGC,OAAO,CAAC,CAAA,CAAA;AACxCvG,oBAAAA,EAAAA,CAAG8F,IAAI,CAAC,WAAA;AACN,wBAAA,IAAI,CAACvD,EAAE,CAACoB,UAAU,GAAG3D,GAAGyG,aAAa,CAAC,IAAI,CAACJ,aAAa,EAAE,IAAI,CAACZ,OAAO,CAACI,EAAE,CAAA;AACzE,wBAAA,IAAI,CAACtD,EAAE,CAACqB,UAAU,GAAG5D,GAAGyG,aAAa,CAAC,IAAI,CAACD,aAAa,EAAE,IAAI,CAACf,OAAO,CAACI,EAAE,CAAA;wBACzE,IAAI,CAACtD,EAAE,CAACmE,CAAC,GAAG,IAAI,CAAC/C,UAAU,CAACvB,CAAC;wBAC7B,IAAI,CAACuB,UAAU,CAACvB,CAAC,GAAG,IAAI,CAACwB,UAAU,CAAC8C,CAAC;AACrC,wBAAA,IAAI,CAACxG,QAAQ,CAACC,QAAQ,GAAGH,EAAAA,CAAGI,IAAI,CAC9BJ,EAAG2G,CAAAA,GAAG,CAAC,IAAI,CAAChD,UAAU,CAACd,GAAG,EAAE7C,EAAG+B,CAAAA,KAAK,CAAC,IAAI,CAAC4B,UAAU,CAACvB,CAAC,EAAE,MAAA,EAAQ,KAChE,CAAA,CAAA,EAAA,IAAI,CAACsE,CAAC,CAAA;AAEV,qBAAA,CAAA;AACF;AACF,aAAA,CAAA;AACA,YAAA,IAAI,CAACvH,iBAAiB,CAACyH,IAAI,GAAG,kBAAA;AAC9B,YAAA,IAAI,CAACxH,mBAAmB,GAAGuB,MAAAA,CAAOkG,eAAe,CAAC,IAAI,CAAC1H,iBAAiB,CAAC2H,gBAAgB,CAAC,CAAE,CAAA,CAAA;AAC5F,YAAA,IAAI,CAACzH,sBAAsB,GAAGsB,MAAAA,CAAOoG,oBAAoB,EAAA;AACzD,YAAA,IAAI,CAAC1H,sBAAsB,CACxB6D,gBAAgB,GAChBC,MAAM,CAAC,IACPE,CAAAA,CAAAA,eAAe,CAAC,eAAA,EAAiB,WACjCC,CAAAA,CAAAA,iBAAiB,CAAC,MAAQ,EAAA,KAAA,CAAA;YAC7B,IAAI,CAACjE,sBAAsB,CAACmE,aAAa,GAAGE,UAAU,CAAC,KAAOD,CAAAA,CAAAA,WAAW,CAAC,KAAA,CAAA;AAC5E;QACA,OAAO,IAAI,CAACtE,iBAAiB;AAC/B;AACF;;;;"}
|
|
1
|
+
{"version":3,"file":"weightedblended_oit.js","sources":["../../src/render/weightedblended_oit.ts"],"sourcesContent":["import type {\r\n AbstractDevice,\r\n BindGroup,\r\n GPUProgram,\r\n PBGlobalScope,\r\n PBInsideFunctionScope,\r\n PBShaderExp,\r\n RenderStateSet,\r\n Texture2D\r\n} from '@zephyr3d/device';\r\nimport { OIT } from './oit';\r\nimport type { DrawContext } from './drawable';\r\nimport { drawFullscreenQuad } from './fullscreenquad';\r\nimport { DEPTH_FARTHEST, REVERSE_Z, Vector4 } from '@zephyr3d/base';\r\n\r\n/**\r\n * Weighted-blended OIT renderer.\r\n *\r\n * @remarks\r\n * The weighed-blended OIT renderer supports both WebGL, WebGL2 and WebGPU device.\r\n *\r\n * @public\r\n */\r\nexport class WeightedBlendedOIT extends OIT {\r\n /** Type name of WeightedBlendedOIT */\r\n public static readonly type = 'wb';\r\n private static _compositeProgram: GPUProgram;\r\n private static _compositeBindGroup: BindGroup;\r\n private static _compositeRenderStates: RenderStateSet;\r\n\r\n constructor() {\r\n super();\r\n }\r\n /**\r\n * {@inheritDoc OIT.getType}\r\n */\r\n getType() {\r\n return WeightedBlendedOIT.type;\r\n }\r\n /**\r\n * {@inheritDoc OIT.supportDevice}\r\n */\r\n supportDevice(_deviceType: string) {\r\n return true;\r\n }\r\n /**\r\n * {@inheritDoc OIT.wantsPremultipliedAlpha}\r\n */\r\n wantsPremultipliedAlpha() {\r\n return false;\r\n }\r\n /**\r\n * {@inheritDoc OIT.wantsAdditiveLightPassAlpha}\r\n */\r\n wantsAdditiveLightPassAlpha() {\r\n return false;\r\n }\r\n /**\r\n * {@inheritDoc OIT.begin}\r\n */\r\n begin(_ctx: DrawContext) {\r\n return 1;\r\n }\r\n /**\r\n * {@inheritDoc OIT.end}\r\n */\r\n end(_ctx: DrawContext) {\r\n return;\r\n }\r\n /**\r\n * {@inheritDoc OIT.setupFragmentOutput}\r\n */\r\n setupFragmentOutput(scope: PBGlobalScope) {\r\n const pb = scope.$builder;\r\n scope.$outputs.outColor = pb.vec4();\r\n scope.$outputs.outAlpha = pb.float();\r\n }\r\n /**\r\n * {@inheritDoc OIT.beginPass}\r\n */\r\n beginPass(ctx: DrawContext, _pass: number) {\r\n const device = ctx.device;\r\n const accumBuffer = this.getAccumFramebuffer(ctx, device);\r\n device.pushDeviceStates();\r\n device.setFramebuffer(accumBuffer);\r\n device.clearFrameBuffer(new Vector4(0, 0, 0, 1), null, null);\r\n return true;\r\n }\r\n /**\r\n * {@inheritDoc OIT.endPass}\r\n */\r\n endPass(ctx: DrawContext, _pass: number) {\r\n const device = ctx.device;\r\n const accumBuffer = device.getFramebuffer()!;\r\n device.popDeviceStates();\r\n const accumTargets = accumBuffer.getColorAttachments();\r\n this.composite(ctx, device, accumTargets[0] as Texture2D, accumTargets[1] as Texture2D);\r\n }\r\n /**\r\n * {@inheritDoc OIT.calculateHash}\r\n */\r\n calculateHash() {\r\n return this.getType();\r\n }\r\n /**\r\n * {@inheritDoc OIT.applyUniforms}\r\n */\r\n applyUniforms(_ctx: DrawContext, _bindGroup: BindGroup) {\r\n return;\r\n }\r\n /**\r\n * {@inheritDoc OIT.outputFragmentColor}\r\n */\r\n outputFragmentColor(scope: PBInsideFunctionScope, color: PBShaderExp) {\r\n const pb = scope.$builder;\r\n pb.func('Z_WBOIT_depthWeight', [pb.float('z'), pb.float('a')], function () {\r\n this.$return(\r\n pb.clamp(\r\n pb.mul(\r\n pb.pow(pb.add(pb.min(1, pb.mul(this.a, 10)), 0.01), 3),\r\n 1e8,\r\n pb.pow(pb.sub(1, pb.mul(this.z, 0.9)), 2)\r\n ),\r\n 1e-2,\r\n 3e3\r\n )\r\n );\r\n });\r\n pb.func('Z_WBOIT_output', [pb.vec4('color')], function () {\r\n // The weight ramp expects standard-oriented depth (0 = near)\r\n this.$l.w = this.Z_WBOIT_depthWeight(\r\n REVERSE_Z ? pb.sub(1, this.$builtins.fragCoord.z) : this.$builtins.fragCoord.z,\r\n this.color.a\r\n );\r\n this.$outputs[0] = pb.vec4(pb.mul(this.color.rgb, this.w), this.color.a);\r\n this.$outputs[1] = pb.mul(this.color.a, this.w);\r\n });\r\n scope.Z_WBOIT_output(color);\r\n return true;\r\n }\r\n /**\r\n * {@inheritDoc OIT.setRenderStates}\r\n */\r\n setRenderStates(rs: RenderStateSet) {\r\n const blendingState = rs.useBlendingState();\r\n blendingState.enable(true);\r\n blendingState.setBlendEquation('add', 'add');\r\n blendingState.setBlendFuncRGB('one', 'one');\r\n blendingState.setBlendFuncAlpha('zero', 'inv-src-alpha');\r\n const depthState = rs.useDepthState();\r\n depthState.enableWrite(false).enableTest(true);\r\n }\r\n /** @internal */\r\n private composite(ctx: DrawContext, device: AbstractDevice, accumColor: Texture2D, accumAlpha: Texture2D) {\r\n const currentFramebuffer = device.getFramebuffer();\r\n const colorAttachment = currentFramebuffer?.getColorAttachments()[0] ?? null;\r\n const singleColorFramebuffer =\r\n currentFramebuffer && currentFramebuffer.getColorAttachments().length > 1 && colorAttachment\r\n ? device.pool.fetchTemporalFramebuffer(\r\n false,\r\n 0,\r\n 0,\r\n colorAttachment,\r\n currentFramebuffer.getDepthAttachment(),\r\n false\r\n )\r\n : null;\r\n if (singleColorFramebuffer) {\r\n const viewport = device.getViewport();\r\n const scissor = device.getScissor();\r\n device.pushDeviceStates();\r\n device.setFramebuffer(singleColorFramebuffer);\r\n device.setViewport(viewport);\r\n device.setScissor(scissor);\r\n }\r\n try {\r\n device.setProgram(WeightedBlendedOIT.getCompositeProgram(device));\r\n WeightedBlendedOIT._compositeBindGroup.setTexture('accumColorTex', accumColor);\r\n WeightedBlendedOIT._compositeBindGroup.setTexture('accumAlphaTex', accumAlpha);\r\n device.setBindGroup(0, WeightedBlendedOIT._compositeBindGroup);\r\n drawFullscreenQuad(WeightedBlendedOIT._compositeRenderStates);\r\n } finally {\r\n if (singleColorFramebuffer) {\r\n device.popDeviceStates();\r\n device.pool.releaseFrameBuffer(singleColorFramebuffer);\r\n }\r\n }\r\n }\r\n /** @internal */\r\n private getAccumFramebuffer(ctx: DrawContext, device: AbstractDevice) {\r\n const width = ctx.depthTexture!.width;\r\n const height = ctx.depthTexture!.height;\r\n const accumColor = device.pool.fetchTemporalTexture2D(false, 'rgba16f', width, height, false);\r\n const accumAlpha = device.pool.fetchTemporalTexture2D(false, 'r16f', width, height, false);\r\n const fb = device.pool.createTemporalFramebuffer(true, [accumColor, accumAlpha], ctx.depthTexture);\r\n device.pool.releaseTexture(accumColor);\r\n device.pool.releaseTexture(accumAlpha);\r\n return fb;\r\n }\r\n /** @internal */\r\n private static getCompositeProgram(device: AbstractDevice) {\r\n if (!this._compositeProgram) {\r\n this._compositeProgram = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, DEPTH_FARTHEST, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n if (device.type === 'webgpu') {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n }\r\n });\r\n },\r\n fragment(pb) {\r\n this.$outputs.outColor = pb.vec4();\r\n this.accumColorTex = pb.tex2D().uniform(0);\r\n this.accumAlphaTex = pb.tex2D().uniform(0);\r\n pb.main(function () {\r\n this.$l.accumColor = pb.textureSample(this.accumColorTex, this.$inputs.uv);\r\n this.$l.accumAlpha = pb.textureSample(this.accumAlphaTex, this.$inputs.uv);\r\n this.$l.r = this.accumColor.a;\r\n this.accumColor.a = this.accumAlpha.r;\r\n this.$outputs.outColor = pb.vec4(\r\n pb.div(this.accumColor.rgb, pb.clamp(this.accumColor.a, 0.0001, 50000)),\r\n this.r\r\n );\r\n });\r\n }\r\n })!;\r\n this._compositeProgram.name = '@WBOIT_Composite';\r\n this._compositeBindGroup = device.createBindGroup(this._compositeProgram.bindGroupLayouts[0]);\r\n this._compositeRenderStates = device.createRenderStateSet();\r\n this._compositeRenderStates\r\n .useBlendingState()\r\n .enable(true)\r\n .setBlendFuncRGB('inv-src-alpha', 'src-alpha')\r\n .setBlendFuncAlpha('zero', 'one');\r\n this._compositeRenderStates.useDepthState().enableTest(false).enableWrite(false);\r\n }\r\n return this._compositeProgram;\r\n }\r\n}\r\n"],"names":["WeightedBlendedOIT","OIT","type","_compositeProgram","_compositeBindGroup","_compositeRenderStates","getType","supportDevice","_deviceType","wantsPremultipliedAlpha","wantsAdditiveLightPassAlpha","begin","_ctx","end","setupFragmentOutput","scope","pb","$builder","$outputs","outColor","vec4","outAlpha","float","beginPass","ctx","_pass","device","accumBuffer","getAccumFramebuffer","pushDeviceStates","setFramebuffer","clearFrameBuffer","Vector4","endPass","getFramebuffer","popDeviceStates","accumTargets","getColorAttachments","composite","calculateHash","applyUniforms","_bindGroup","outputFragmentColor","color","func","$return","clamp","mul","pow","add","min","a","sub","z","$l","w","Z_WBOIT_depthWeight","REVERSE_Z","$builtins","fragCoord","rgb","Z_WBOIT_output","setRenderStates","rs","blendingState","useBlendingState","enable","setBlendEquation","setBlendFuncRGB","setBlendFuncAlpha","depthState","useDepthState","enableWrite","enableTest","accumColor","accumAlpha","currentFramebuffer","colorAttachment","singleColorFramebuffer","length","pool","fetchTemporalFramebuffer","getDepthAttachment","viewport","getViewport","scissor","getScissor","setViewport","setScissor","setProgram","getCompositeProgram","setTexture","setBindGroup","drawFullscreenQuad","releaseFrameBuffer","width","depthTexture","height","fetchTemporalTexture2D","fb","createTemporalFramebuffer","releaseTexture","buildRenderProgram","vertex","$inputs","pos","vec2","attrib","uv","main","position","DEPTH_FARTHEST","xy","y","neg","fragment","accumColorTex","tex2D","uniform","accumAlphaTex","textureSample","r","div","name","createBindGroup","bindGroupLayouts","createRenderStateSet"],"mappings":";;;;AAeA;;;;;;;IAQO,MAAMA,kBAA2BC,SAAAA,GAAAA,CAAAA;2CAEtC,OAAuBC,IAAAA,GAAO,IAAK;AACnC,IAAA,OAAeC,iBAA8B;AAC7C,IAAA,OAAeC,mBAA+B;AAC9C,IAAA,OAAeC,sBAAuC;IAEtD,WAAc,EAAA;QACZ,KAAK,EAAA;AACP;AACA;;AAEC,MACDC,OAAU,GAAA;AACR,QAAA,OAAON,mBAAmBE,IAAI;AAChC;AACA;;MAGAK,aAAAA,CAAcC,WAAmB,EAAE;QACjC,OAAO,IAAA;AACT;AACA;;AAEC,MACDC,uBAA0B,GAAA;QACxB,OAAO,KAAA;AACT;AACA;;AAEC,MACDC,2BAA8B,GAAA;QAC5B,OAAO,KAAA;AACT;AACA;;MAGAC,KAAAA,CAAMC,IAAiB,EAAE;QACvB,OAAO,CAAA;AACT;AACA;;MAGAC,GAAAA,CAAID,IAAiB,EAAE;AACrB,QAAA;AACF;AACA;;MAGAE,mBAAAA,CAAoBC,KAAoB,EAAE;QACxC,MAAMC,EAAAA,GAAKD,MAAME,QAAQ;AACzBF,QAAAA,KAAAA,CAAMG,QAAQ,CAACC,QAAQ,GAAGH,GAAGI,IAAI,EAAA;AACjCL,QAAAA,KAAAA,CAAMG,QAAQ,CAACG,QAAQ,GAAGL,GAAGM,KAAK,EAAA;AACpC;AACA;;AAEC,MACDC,SAAUC,CAAAA,GAAgB,EAAEC,KAAa,EAAE;QACzC,MAAMC,MAAAA,GAASF,IAAIE,MAAM;AACzB,QAAA,MAAMC,WAAc,GAAA,IAAI,CAACC,mBAAmB,CAACJ,GAAKE,EAAAA,MAAAA,CAAAA;AAClDA,QAAAA,MAAAA,CAAOG,gBAAgB,EAAA;AACvBH,QAAAA,MAAAA,CAAOI,cAAc,CAACH,WAAAA,CAAAA;QACtBD,MAAOK,CAAAA,gBAAgB,CAAC,IAAIC,OAAAA,CAAQ,GAAG,CAAG,EAAA,CAAA,EAAG,IAAI,IAAM,EAAA,IAAA,CAAA;QACvD,OAAO,IAAA;AACT;AACA;;AAEC,MACDC,OAAQT,CAAAA,GAAgB,EAAEC,KAAa,EAAE;QACvC,MAAMC,MAAAA,GAASF,IAAIE,MAAM;QACzB,MAAMC,WAAAA,GAAcD,OAAOQ,cAAc,EAAA;AACzCR,QAAAA,MAAAA,CAAOS,eAAe,EAAA;QACtB,MAAMC,YAAAA,GAAeT,YAAYU,mBAAmB,EAAA;QACpD,IAAI,CAACC,SAAS,CAACd,GAAKE,EAAAA,MAAAA,EAAQU,YAAY,CAAC,CAAE,CAAA,EAAeA,YAAY,CAAC,CAAE,CAAA,CAAA;AAC3E;AACA;;AAEC,MACDG,aAAgB,GAAA;QACd,OAAO,IAAI,CAACjC,OAAO,EAAA;AACrB;AACA;;AAEC,MACDkC,aAAc5B,CAAAA,IAAiB,EAAE6B,UAAqB,EAAE;AACtD,QAAA;AACF;AACA;;AAEC,MACDC,mBAAoB3B,CAAAA,KAA4B,EAAE4B,KAAkB,EAAE;QACpE,MAAM3B,EAAAA,GAAKD,MAAME,QAAQ;QACzBD,EAAG4B,CAAAA,IAAI,CAAC,qBAAuB,EAAA;AAAC5B,YAAAA,EAAAA,CAAGM,KAAK,CAAC,GAAA,CAAA;AAAMN,YAAAA,EAAAA,CAAGM,KAAK,CAAC,GAAA;SAAK,EAAE,WAAA;YAC7D,IAAI,CAACuB,OAAO,CACV7B,EAAAA,CAAG8B,KAAK,CACN9B,EAAAA,CAAG+B,GAAG,CACJ/B,EAAAA,CAAGgC,GAAG,CAAChC,EAAAA,CAAGiC,GAAG,CAACjC,EAAAA,CAAGkC,GAAG,CAAC,CAAA,EAAGlC,EAAG+B,CAAAA,GAAG,CAAC,IAAI,CAACI,CAAC,EAAE,MAAM,IAAO,CAAA,EAAA,CAAA,CAAA,EACpD,KACAnC,EAAGgC,CAAAA,GAAG,CAAChC,EAAGoC,CAAAA,GAAG,CAAC,CAAGpC,EAAAA,EAAAA,CAAG+B,GAAG,CAAC,IAAI,CAACM,CAAC,EAAE,GAAO,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,EAEzC,IACA,EAAA,GAAA,CAAA,CAAA;AAGN,SAAA,CAAA;QACArC,EAAG4B,CAAAA,IAAI,CAAC,gBAAkB,EAAA;AAAC5B,YAAAA,EAAAA,CAAGI,IAAI,CAAC,OAAA;SAAS,EAAE,WAAA;;AAE5C,YAAA,IAAI,CAACkC,EAAE,CAACC,CAAC,GAAG,IAAI,CAACC,mBAAmB,CAClCC,YAAYzC,EAAGoC,CAAAA,GAAG,CAAC,CAAA,EAAG,IAAI,CAACM,SAAS,CAACC,SAAS,CAACN,CAAC,CAAI,GAAA,IAAI,CAACK,SAAS,CAACC,SAAS,CAACN,CAAC,EAC9E,IAAI,CAACV,KAAK,CAACQ,CAAC,CAAA;YAEd,IAAI,CAACjC,QAAQ,CAAC,CAAE,CAAA,GAAGF,GAAGI,IAAI,CAACJ,EAAG+B,CAAAA,GAAG,CAAC,IAAI,CAACJ,KAAK,CAACiB,GAAG,EAAE,IAAI,CAACL,CAAC,CAAA,EAAG,IAAI,CAACZ,KAAK,CAACQ,CAAC,CAAA;AACvE,YAAA,IAAI,CAACjC,QAAQ,CAAC,CAAE,CAAA,GAAGF,GAAG+B,GAAG,CAAC,IAAI,CAACJ,KAAK,CAACQ,CAAC,EAAE,IAAI,CAACI,CAAC,CAAA;AAChD,SAAA,CAAA;AACAxC,QAAAA,KAAAA,CAAM8C,cAAc,CAAClB,KAAAA,CAAAA;QACrB,OAAO,IAAA;AACT;AACA;;MAGAmB,eAAAA,CAAgBC,EAAkB,EAAE;QAClC,MAAMC,aAAAA,GAAgBD,GAAGE,gBAAgB,EAAA;AACzCD,QAAAA,aAAAA,CAAcE,MAAM,CAAC,IAAA,CAAA;QACrBF,aAAcG,CAAAA,gBAAgB,CAAC,KAAO,EAAA,KAAA,CAAA;QACtCH,aAAcI,CAAAA,eAAe,CAAC,KAAO,EAAA,KAAA,CAAA;QACrCJ,aAAcK,CAAAA,iBAAiB,CAAC,MAAQ,EAAA,eAAA,CAAA;QACxC,MAAMC,UAAAA,GAAaP,GAAGQ,aAAa,EAAA;AACnCD,QAAAA,UAAAA,CAAWE,WAAW,CAAC,KAAOC,CAAAA,CAAAA,UAAU,CAAC,IAAA,CAAA;AAC3C;qBAEA,SAAQnC,CAAUd,GAAgB,EAAEE,MAAsB,EAAEgD,UAAqB,EAAEC,UAAqB,EAAE;QACxG,MAAMC,kBAAAA,GAAqBlD,OAAOQ,cAAc,EAAA;AAChD,QAAA,MAAM2C,eAAkBD,GAAAA,kBAAAA,EAAoBvC,mBAAqB,EAAA,CAAC,EAAE,IAAI,IAAA;QACxE,MAAMyC,sBAAAA,GACJF,sBAAsBA,kBAAmBvC,CAAAA,mBAAmB,GAAG0C,MAAM,GAAG,KAAKF,eACzEnD,GAAAA,MAAAA,CAAOsD,IAAI,CAACC,wBAAwB,CAClC,KACA,EAAA,CAAA,EACA,GACAJ,eACAD,EAAAA,kBAAAA,CAAmBM,kBAAkB,EAAA,EACrC,KAEF,CAAA,GAAA,IAAA;AACN,QAAA,IAAIJ,sBAAwB,EAAA;YAC1B,MAAMK,QAAAA,GAAWzD,OAAO0D,WAAW,EAAA;YACnC,MAAMC,OAAAA,GAAU3D,OAAO4D,UAAU,EAAA;AACjC5D,YAAAA,MAAAA,CAAOG,gBAAgB,EAAA;AACvBH,YAAAA,MAAAA,CAAOI,cAAc,CAACgD,sBAAAA,CAAAA;AACtBpD,YAAAA,MAAAA,CAAO6D,WAAW,CAACJ,QAAAA,CAAAA;AACnBzD,YAAAA,MAAAA,CAAO8D,UAAU,CAACH,OAAAA,CAAAA;AACpB;QACA,IAAI;AACF3D,YAAAA,MAAAA,CAAO+D,UAAU,CAACzF,kBAAmB0F,CAAAA,mBAAmB,CAAChE,MAAAA,CAAAA,CAAAA;AACzD1B,YAAAA,kBAAAA,CAAmBI,mBAAmB,CAACuF,UAAU,CAAC,eAAiBjB,EAAAA,UAAAA,CAAAA;AACnE1E,YAAAA,kBAAAA,CAAmBI,mBAAmB,CAACuF,UAAU,CAAC,eAAiBhB,EAAAA,UAAAA,CAAAA;AACnEjD,YAAAA,MAAAA,CAAOkE,YAAY,CAAC,CAAG5F,EAAAA,kBAAAA,CAAmBI,mBAAmB,CAAA;AAC7DyF,YAAAA,kBAAAA,CAAmB7F,mBAAmBK,sBAAsB,CAAA;SACpD,QAAA;AACR,YAAA,IAAIyE,sBAAwB,EAAA;AAC1BpD,gBAAAA,MAAAA,CAAOS,eAAe,EAAA;gBACtBT,MAAOsD,CAAAA,IAAI,CAACc,kBAAkB,CAAChB,sBAAAA,CAAAA;AACjC;AACF;AACF;AACA,qBACA,mBAAQlD,CAAoBJ,GAAgB,EAAEE,MAAsB,EAAE;AACpE,QAAA,MAAMqE,KAAQvE,GAAAA,GAAAA,CAAIwE,YAAY,CAAED,KAAK;AACrC,QAAA,MAAME,MAASzE,GAAAA,GAAAA,CAAIwE,YAAY,CAAEC,MAAM;QACvC,MAAMvB,UAAAA,GAAahD,OAAOsD,IAAI,CAACkB,sBAAsB,CAAC,KAAA,EAAO,SAAWH,EAAAA,KAAAA,EAAOE,MAAQ,EAAA,KAAA,CAAA;QACvF,MAAMtB,UAAAA,GAAajD,OAAOsD,IAAI,CAACkB,sBAAsB,CAAC,KAAA,EAAO,MAAQH,EAAAA,KAAAA,EAAOE,MAAQ,EAAA,KAAA,CAAA;AACpF,QAAA,MAAME,KAAKzE,MAAOsD,CAAAA,IAAI,CAACoB,yBAAyB,CAAC,IAAM,EAAA;AAAC1B,YAAAA,UAAAA;AAAYC,YAAAA;AAAW,SAAA,EAAEnD,IAAIwE,YAAY,CAAA;QACjGtE,MAAOsD,CAAAA,IAAI,CAACqB,cAAc,CAAC3B,UAAAA,CAAAA;QAC3BhD,MAAOsD,CAAAA,IAAI,CAACqB,cAAc,CAAC1B,UAAAA,CAAAA;QAC3B,OAAOwB,EAAAA;AACT;AACA,qBACA,OAAeT,mBAAoBhE,CAAAA,MAAsB,EAAE;AACzD,QAAA,IAAI,CAAC,IAAI,CAACvB,iBAAiB,EAAE;AAC3B,YAAA,IAAI,CAACA,iBAAiB,GAAGuB,MAAAA,CAAO4E,kBAAkB,CAAC;AACjDC,gBAAAA,MAAAA,CAAAA,CAAOvF,EAAE,EAAA;oBACP,IAAI,CAACwF,OAAO,CAACC,GAAG,GAAGzF,EAAG0F,CAAAA,IAAI,EAAGC,CAAAA,MAAM,CAAC,UAAA,CAAA;AACpC,oBAAA,IAAI,CAACzF,QAAQ,CAAC0F,EAAE,GAAG5F,GAAG0F,IAAI,EAAA;AAC1B1F,oBAAAA,EAAAA,CAAG6F,IAAI,CAAC,WAAA;AACN,wBAAA,IAAI,CAACnD,SAAS,CAACoD,QAAQ,GAAG9F,EAAGI,CAAAA,IAAI,CAAC,IAAI,CAACoF,OAAO,CAACC,GAAG,EAAEM,cAAgB,EAAA,CAAA,CAAA;wBACpE,IAAI,CAAC7F,QAAQ,CAAC0F,EAAE,GAAG5F,EAAGiC,CAAAA,GAAG,CAACjC,EAAAA,CAAG+B,GAAG,CAAC,IAAI,CAACyD,OAAO,CAACC,GAAG,CAACO,EAAE,EAAE,GAAA,CAAA,EAAMhG,EAAG0F,CAAAA,IAAI,CAAC,GAAA,CAAA,CAAA;wBACpE,IAAIhF,MAAAA,CAAOxB,IAAI,KAAK,QAAU,EAAA;AAC5B,4BAAA,IAAI,CAACwD,SAAS,CAACoD,QAAQ,CAACG,CAAC,GAAGjG,EAAAA,CAAGkG,GAAG,CAAC,IAAI,CAACxD,SAAS,CAACoD,QAAQ,CAACG,CAAC,CAAA;AAC9D;AACF,qBAAA,CAAA;AACF,iBAAA;AACAE,gBAAAA,QAAAA,CAAAA,CAASnG,EAAE,EAAA;AACT,oBAAA,IAAI,CAACE,QAAQ,CAACC,QAAQ,GAAGH,GAAGI,IAAI,EAAA;AAChC,oBAAA,IAAI,CAACgG,aAAa,GAAGpG,GAAGqG,KAAK,EAAA,CAAGC,OAAO,CAAC,CAAA,CAAA;AACxC,oBAAA,IAAI,CAACC,aAAa,GAAGvG,GAAGqG,KAAK,EAAA,CAAGC,OAAO,CAAC,CAAA,CAAA;AACxCtG,oBAAAA,EAAAA,CAAG6F,IAAI,CAAC,WAAA;AACN,wBAAA,IAAI,CAACvD,EAAE,CAACoB,UAAU,GAAG1D,GAAGwG,aAAa,CAAC,IAAI,CAACJ,aAAa,EAAE,IAAI,CAACZ,OAAO,CAACI,EAAE,CAAA;AACzE,wBAAA,IAAI,CAACtD,EAAE,CAACqB,UAAU,GAAG3D,GAAGwG,aAAa,CAAC,IAAI,CAACD,aAAa,EAAE,IAAI,CAACf,OAAO,CAACI,EAAE,CAAA;wBACzE,IAAI,CAACtD,EAAE,CAACmE,CAAC,GAAG,IAAI,CAAC/C,UAAU,CAACvB,CAAC;wBAC7B,IAAI,CAACuB,UAAU,CAACvB,CAAC,GAAG,IAAI,CAACwB,UAAU,CAAC8C,CAAC;AACrC,wBAAA,IAAI,CAACvG,QAAQ,CAACC,QAAQ,GAAGH,EAAAA,CAAGI,IAAI,CAC9BJ,EAAG0G,CAAAA,GAAG,CAAC,IAAI,CAAChD,UAAU,CAACd,GAAG,EAAE5C,EAAG8B,CAAAA,KAAK,CAAC,IAAI,CAAC4B,UAAU,CAACvB,CAAC,EAAE,MAAA,EAAQ,KAChE,CAAA,CAAA,EAAA,IAAI,CAACsE,CAAC,CAAA;AAEV,qBAAA,CAAA;AACF;AACF,aAAA,CAAA;AACA,YAAA,IAAI,CAACtH,iBAAiB,CAACwH,IAAI,GAAG,kBAAA;AAC9B,YAAA,IAAI,CAACvH,mBAAmB,GAAGsB,MAAAA,CAAOkG,eAAe,CAAC,IAAI,CAACzH,iBAAiB,CAAC0H,gBAAgB,CAAC,CAAE,CAAA,CAAA;AAC5F,YAAA,IAAI,CAACxH,sBAAsB,GAAGqB,MAAAA,CAAOoG,oBAAoB,EAAA;AACzD,YAAA,IAAI,CAACzH,sBAAsB,CACxB4D,gBAAgB,GAChBC,MAAM,CAAC,IACPE,CAAAA,CAAAA,eAAe,CAAC,eAAA,EAAiB,WACjCC,CAAAA,CAAAA,iBAAiB,CAAC,MAAQ,EAAA,KAAA,CAAA;YAC7B,IAAI,CAAChE,sBAAsB,CAACkE,aAAa,GAAGE,UAAU,CAAC,KAAOD,CAAAA,CAAAA,WAAW,CAAC,KAAA,CAAA;AAC5E;QACA,OAAO,IAAI,CAACrE,iBAAiB;AAC/B;AACF;;;;"}
|
package/dist/scene/basesprite.js
CHANGED
|
@@ -3,18 +3,18 @@ import { GraphNode } from './graph_node.js';
|
|
|
3
3
|
import { QUEUE_OPAQUE } from '../values.js';
|
|
4
4
|
import '../render/render_queue.js';
|
|
5
5
|
import { RenderBundleWrapper } from '../render/renderbundle_wrapper.js';
|
|
6
|
-
import { getDevice } from '../app/api.js';
|
|
7
6
|
import { Primitive } from '../render/primitive.js';
|
|
8
7
|
import '@zephyr3d/device';
|
|
9
8
|
import '../material/shader/helper.js';
|
|
10
9
|
import '../material/lambert.js';
|
|
11
10
|
import '../material/blinn.js';
|
|
12
11
|
import '../material/unlit.js';
|
|
12
|
+
import '../material/meshmaterial.js';
|
|
13
13
|
import '../material/particle.js';
|
|
14
14
|
import '../material/subsurfaceprofile.js';
|
|
15
|
-
import '../material/
|
|
15
|
+
import '../material/sssprofile.js';
|
|
16
|
+
import '../material/sss.js';
|
|
16
17
|
import '../material/eye.js';
|
|
17
|
-
import '../material/meshmaterial.js';
|
|
18
18
|
import '../material/hair.js';
|
|
19
19
|
import '../material/hairstrand.js';
|
|
20
20
|
import '../material/grassmaterial.js';
|
|
@@ -31,9 +31,14 @@ import '../render/lightpass.js';
|
|
|
31
31
|
import '../render/sky.js';
|
|
32
32
|
import '../render/clipmap.js';
|
|
33
33
|
import '../render/envlight.js';
|
|
34
|
+
import '../render/lod.js';
|
|
34
35
|
import '../render/dualdepthpeeling_oit.js';
|
|
35
36
|
import '../shaders/atmosphere.js';
|
|
37
|
+
import '../render/water_interaction.js';
|
|
36
38
|
import '../render/rendergraph/scene_render_context.js';
|
|
39
|
+
import '../render/sdf/scene_sdf.js';
|
|
40
|
+
import '../render/sdf/global_sdf.js';
|
|
41
|
+
import '../render/gi/voxelize_pass.js';
|
|
37
42
|
import { BoundingBox } from '../utility/bounding_volume.js';
|
|
38
43
|
import { mixinDrawable } from '../render/drawable_mixin.js';
|
|
39
44
|
|
|
@@ -61,7 +66,7 @@ import { mixinDrawable } from '../render/drawable_mixin.js';
|
|
|
61
66
|
this._pickTarget = {
|
|
62
67
|
node: this
|
|
63
68
|
};
|
|
64
|
-
this._batchable =
|
|
69
|
+
this._batchable = true;
|
|
65
70
|
this._anchor = new Vector2(0.5, 0.5);
|
|
66
71
|
this._rotateAngle = 0;
|
|
67
72
|
this._renderBundle = {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"basesprite.js","sources":["../../src/scene/basesprite.ts"],"sourcesContent":["import type { Matrix4x4, Nullable } from '@zephyr3d/base';\r\nimport { applyMixins, DRef, Quaternion, Vector2, Vector3 } from '@zephyr3d/base';\r\nimport { GraphNode } from './graph_node';\r\nimport type {\r\n RenderPass,\r\n BatchDrawable,\r\n DrawContext,\r\n PickTarget,\r\n RenderQueue,\r\n SkinInfluenceData\r\n} from '../render';\r\nimport { Primitive } from '../render';\r\nimport type { RenderBundle } from '@zephyr3d/device';\r\nimport type { Scene } from './scene';\r\nimport { BoundingBox } from '../utility/bounding_volume';\r\nimport { QUEUE_OPAQUE } from '../values';\r\nimport { mixinDrawable } from '../render/drawable_mixin';\r\nimport { RenderBundleWrapper } from '../render/renderbundle_wrapper';\r\nimport type { SceneNode } from './scene_node';\r\nimport { getDevice } from '../app/api';\r\nimport { SpriteMaterial } from '../material/sprite';\r\n\r\n/**\r\n * Mesh node\r\n * @public\r\n */\r\nexport class BaseSprite<M extends SpriteMaterial>\r\n extends applyMixins(GraphNode, mixinDrawable)\r\n implements BatchDrawable\r\n{\r\n /** @internal */\r\n private static _primitive: DRef<Primitive> = new DRef();\r\n /** @internal */\r\n protected readonly _material: DRef<M>;\r\n /** @internal */\r\n protected _instanceHash: Nullable<string>;\r\n /** @internal */\r\n protected _batchable: boolean;\r\n /** @internal */\r\n protected _pickTarget: PickTarget;\r\n /** @internal */\r\n protected _renderBundle: Record<string, RenderBundle>;\r\n /** @internal */\r\n protected _useRenderBundle: boolean;\r\n /** @internal */\r\n protected _materialChangeTag: Nullable<number>;\r\n /** @internal */\r\n protected _anchor: Vector2;\r\n /** @internal */\r\n protected _rotateAngle: number;\r\n /**\r\n * Creates an instance of mesh node\r\n * @param scene - The scene to which the mesh node belongs\r\n */\r\n constructor(scene: Scene) {\r\n super(scene);\r\n this._material = new DRef();\r\n this._instanceHash = null;\r\n this._pickTarget = { node: this };\r\n this._batchable = getDevice().type !== 'webgl';\r\n this._anchor = new Vector2(0.5, 0.5);\r\n this._rotateAngle = 0;\r\n this._renderBundle = {};\r\n this._useRenderBundle = true;\r\n this._materialChangeTag = null;\r\n }\r\n /**\r\n * Returns the batch instance ID for the current render pass.\r\n */\r\n getInstanceId(_renderPass: RenderPass) {\r\n return `${this._instanceHash}:${this.worldMatrixDet >= 0}`;\r\n }\r\n /**\r\n * Returns the packed instance-uniform buffer used for batching.\r\n */\r\n getInstanceUniforms() {\r\n return this._material.get()!.$instanceUniforms;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getPickTarget }\r\n */\r\n getPickTarget() {\r\n return this._pickTarget;\r\n }\r\n setPickTarget(node: SceneNode, label?: string) {\r\n this._pickTarget = { node, label };\r\n }\r\n /** Material of the mesh */\r\n get material() {\r\n return this._material.get()!;\r\n }\r\n set material(m) {\r\n if (this._material.get() !== m && m instanceof SpriteMaterial) {\r\n this._material.set(m);\r\n if (m) {\r\n this.onSetMaterial(m);\r\n RenderBundleWrapper.materialAttached(m.coreMaterial, this);\r\n }\r\n this._instanceHash = m ? `${this.constructor.name}:${this._scene?.id ?? 0}:${m.instanceId}` : null;\r\n RenderBundleWrapper.drawableChanged(this);\r\n this._materialChangeTag = null;\r\n }\r\n }\r\n get anchorX() {\r\n return this._anchor.x;\r\n }\r\n set anchorX(value) {\r\n if (this._anchor.x !== value) {\r\n this._anchor.x = value;\r\n this.invalidateWorldBoundingVolume(false);\r\n const material = this._material.get();\r\n if (material) {\r\n material.anchorX = this._anchor.x;\r\n }\r\n }\r\n }\r\n get anchorY() {\r\n return this._anchor.y;\r\n }\r\n set anchorY(value) {\r\n if (this._anchor.y !== value) {\r\n this._anchor.y = value;\r\n this.invalidateWorldBoundingVolume(false);\r\n const material = this._material.get();\r\n if (material) {\r\n material.anchorY = this._anchor.y;\r\n }\r\n }\r\n }\r\n get uvTopLeft() {\r\n const uvinfo = this._material.get()!.uvinfo;\r\n return new Vector2(uvinfo.x, uvinfo.y);\r\n }\r\n set uvTopLeft(value) {\r\n const uvinfo = this._material.get()!.uvinfo;\r\n this._material.get()!.setUVInfo(value.x, value.y, uvinfo.z, uvinfo.w);\r\n }\r\n get uvBottomRight() {\r\n const uvinfo = this._material.get()!.uvinfo;\r\n return new Vector2(uvinfo.z, uvinfo.w);\r\n }\r\n set uvBottomRight(value) {\r\n const uvinfo = this._material.get()!.uvinfo;\r\n this._material.get()!.setUVInfo(uvinfo.x, uvinfo.y, value.x, value.y);\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getMorphData}\r\n */\r\n getMorphData() {\r\n return null;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getMorphInfo}\r\n */\r\n getMorphInfo() {\r\n return null;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.isBatchable}\r\n */\r\n isBatchable(): this is BatchDrawable {\r\n return this._batchable && !!this._material.get() && this._material.get()!.isBatchable();\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getQueueType}\r\n */\r\n getQueueType() {\r\n return this.material?.getQueueType() ?? QUEUE_OPAQUE;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.isUnlit}\r\n */\r\n isUnlit() {\r\n return !this.material?.supportLighting();\r\n }\r\n /**\r\n * {@inheritDoc Drawable.needSceneColor}\r\n */\r\n needSceneColor() {\r\n return this.material?.needSceneColor();\r\n }\r\n /**\r\n * {@inheritDoc Drawable.needSceneDepth}\r\n */\r\n needSceneDepth() {\r\n return this.material?.needSceneDepth();\r\n }\r\n /**\r\n * {@inheritDoc Drawable.draw}\r\n */\r\n draw(ctx: DrawContext, renderQueue: Nullable<RenderQueue>, hash?: string) {\r\n const material = this.material;\r\n const primitive = this.getPrimitive();\r\n if (material && primitive) {\r\n if (this._useRenderBundle && !ctx.instanceData && hash) {\r\n if (this._materialChangeTag !== material.changeTag) {\r\n this._renderBundle = {};\r\n this._materialChangeTag = material.changeTag;\r\n }\r\n const renderBundle = this._renderBundle[hash];\r\n if (!renderBundle) {\r\n ctx.device.beginCapture();\r\n this.bind(ctx, renderQueue);\r\n material.draw(primitive, ctx);\r\n this._renderBundle[hash] = ctx.device.endCapture();\r\n } else {\r\n ctx.device.executeRenderBundle(renderBundle);\r\n }\r\n } else {\r\n this.bind(ctx, renderQueue);\r\n material.draw(primitive, ctx);\r\n }\r\n }\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getMaterial}\r\n */\r\n getMaterial() {\r\n return this.material;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getPrimitive}\r\n */\r\n getPrimitive() {\r\n let primitive = BaseSprite._primitive.get();\r\n if (!primitive) {\r\n primitive = new Primitive();\r\n primitive.createAndSetVertexBuffer('position_f32', new Float32Array([0, 1, 2, 3]));\r\n primitive.createAndSetIndexBuffer(new Uint16Array([0, 1, 2, 3]));\r\n primitive.primitiveType = 'triangle-strip';\r\n BaseSprite._primitive.set(primitive);\r\n }\r\n return primitive;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getBoneMatrices}\r\n */\r\n getBoneMatrices() {\r\n return null;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getSkinInfluenceData}\r\n */\r\n getSkinInfluenceData(): Nullable<SkinInfluenceData> {\r\n return null;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getNode}\r\n */\r\n getNode() {\r\n // mesh transform should be ignored when skinned\r\n return this;\r\n }\r\n /**\r\n * {@inheritDoc SceneNode.computeBoundingVolume}\r\n */\r\n computeBoundingVolume() {\r\n return null;\r\n }\r\n /**\r\n * {@inheritDoc SceneNode.computeWorldBoundingVolume}\r\n */\r\n computeWorldBoundingVolume() {\r\n const p = this.worldMatrix.transformPointAffine(Vector3.zero());\r\n const scaleX = Math.hypot(this.worldMatrix[0], this.worldMatrix[1], this.worldMatrix[2]);\r\n const scaleY = Math.hypot(this.worldMatrix[4], this.worldMatrix[5], this.worldMatrix[6]);\r\n const mat = this._material?.get();\r\n if (mat) {\r\n const boundingBox = new BoundingBox();\r\n const cx = Math.max(Math.abs(this._anchor.x), Math.abs(1 - this._anchor.x)) * scaleX;\r\n const cy = Math.max(Math.abs(this._anchor.y), Math.abs(1 - this._anchor.y)) * scaleY;\r\n const size = Math.max(cx, cy);\r\n boundingBox.minPoint.setXYZ(p.x - size, p.y - size, p.z - size);\r\n boundingBox.maxPoint.setXYZ(p.x + size, p.y + size, p.z + size);\r\n return boundingBox;\r\n }\r\n return null;\r\n }\r\n calculateLocalTransform(outMatrix: Matrix4x4) {\r\n const rot = this.rotation.toEulerAngles().z;\r\n const rotationZ = Quaternion.fromAxisAngle(Vector3.axisPZ(), rot);\r\n outMatrix.compose(this._scaling, rotationZ, this._position);\r\n if (this._material?.get()) {\r\n this._rotateAngle = -rot;\r\n this._material.get()!.rotation = this._rotateAngle;\r\n }\r\n\r\n //outMatrix.scaling(this.scale).translateLeft(this._position);\r\n }\r\n calculateWorldTransform(outMatrix: Matrix4x4) {\r\n outMatrix.set(this.localMatrix);\r\n if (this.parent) {\r\n outMatrix.m03 += this.parent.worldMatrix.m03;\r\n outMatrix.m13 += this.parent.worldMatrix.m13;\r\n outMatrix.m23 += this.parent.worldMatrix.m23;\r\n }\r\n }\r\n /** Called when new material is set */\r\n protected onSetMaterial(material: M) {\r\n material.anchor = this._anchor;\r\n material.rotation = this._rotateAngle;\r\n }\r\n /** Disposes the mesh node */\r\n protected onDispose() {\r\n super.onDispose();\r\n this._material.dispose();\r\n RenderBundleWrapper.drawableChanged(this);\r\n }\r\n}\r\n"],"names":["BaseSprite","applyMixins","GraphNode","mixinDrawable","_primitive","DRef","scene","_material","_instanceHash","_pickTarget","node","_batchable","getDevice","type","_anchor","Vector2","_rotateAngle","_renderBundle","_useRenderBundle","_materialChangeTag","getInstanceId","_renderPass","worldMatrixDet","getInstanceUniforms","get","$instanceUniforms","getPickTarget","setPickTarget","label","material","m","SpriteMaterial","set","onSetMaterial","RenderBundleWrapper","materialAttached","coreMaterial","name","_scene","id","instanceId","drawableChanged","anchorX","x","value","invalidateWorldBoundingVolume","anchorY","y","uvTopLeft","uvinfo","setUVInfo","z","w","uvBottomRight","getMorphData","getMorphInfo","isBatchable","getQueueType","QUEUE_OPAQUE","isUnlit","supportLighting","needSceneColor","needSceneDepth","draw","ctx","renderQueue","hash","primitive","getPrimitive","instanceData","changeTag","renderBundle","device","beginCapture","bind","endCapture","executeRenderBundle","getMaterial","Primitive","createAndSetVertexBuffer","Float32Array","createAndSetIndexBuffer","Uint16Array","primitiveType","getBoneMatrices","getSkinInfluenceData","getNode","computeBoundingVolume","computeWorldBoundingVolume","p","worldMatrix","transformPointAffine","Vector3","zero","scaleX","Math","hypot","scaleY","mat","boundingBox","BoundingBox","cx","max","abs","cy","size","minPoint","setXYZ","maxPoint","calculateLocalTransform","outMatrix","rot","rotation","toEulerAngles","rotationZ","Quaternion","fromAxisAngle","axisPZ","compose","_scaling","_position","calculateWorldTransform","localMatrix","parent","m03","m13","m23","anchor","onDispose","dispose"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"basesprite.js","sources":["../../src/scene/basesprite.ts"],"sourcesContent":["import type { Matrix4x4, Nullable } from '@zephyr3d/base';\r\nimport { applyMixins, DRef, Quaternion, Vector2, Vector3 } from '@zephyr3d/base';\r\nimport { GraphNode } from './graph_node';\r\nimport type {\r\n RenderPass,\r\n BatchDrawable,\r\n DrawContext,\r\n PickTarget,\r\n RenderQueue,\r\n SkinInfluenceData\r\n} from '../render';\r\nimport { Primitive } from '../render';\r\nimport type { RenderBundle } from '@zephyr3d/device';\r\nimport type { Scene } from './scene';\r\nimport { BoundingBox } from '../utility/bounding_volume';\r\nimport { QUEUE_OPAQUE } from '../values';\r\nimport { mixinDrawable } from '../render/drawable_mixin';\r\nimport { RenderBundleWrapper } from '../render/renderbundle_wrapper';\r\nimport type { SceneNode } from './scene_node';\r\nimport { SpriteMaterial } from '../material/sprite';\r\n\r\n/**\r\n * Mesh node\r\n * @public\r\n */\r\nexport class BaseSprite<M extends SpriteMaterial>\r\n extends applyMixins(GraphNode, mixinDrawable)\r\n implements BatchDrawable\r\n{\r\n /** @internal */\r\n private static _primitive: DRef<Primitive> = new DRef();\r\n /** @internal */\r\n protected readonly _material: DRef<M>;\r\n /** @internal */\r\n protected _instanceHash: Nullable<string>;\r\n /** @internal */\r\n protected _batchable: boolean;\r\n /** @internal */\r\n protected _pickTarget: PickTarget;\r\n /** @internal */\r\n protected _renderBundle: Record<string, RenderBundle>;\r\n /** @internal */\r\n protected _useRenderBundle: boolean;\r\n /** @internal */\r\n protected _materialChangeTag: Nullable<number>;\r\n /** @internal */\r\n protected _anchor: Vector2;\r\n /** @internal */\r\n protected _rotateAngle: number;\r\n /**\r\n * Creates an instance of mesh node\r\n * @param scene - The scene to which the mesh node belongs\r\n */\r\n constructor(scene: Scene) {\r\n super(scene);\r\n this._material = new DRef();\r\n this._instanceHash = null;\r\n this._pickTarget = { node: this };\r\n this._batchable = true;\r\n this._anchor = new Vector2(0.5, 0.5);\r\n this._rotateAngle = 0;\r\n this._renderBundle = {};\r\n this._useRenderBundle = true;\r\n this._materialChangeTag = null;\r\n }\r\n /**\r\n * Returns the batch instance ID for the current render pass.\r\n */\r\n getInstanceId(_renderPass: RenderPass) {\r\n return `${this._instanceHash}:${this.worldMatrixDet >= 0}`;\r\n }\r\n /**\r\n * Returns the packed instance-uniform buffer used for batching.\r\n */\r\n getInstanceUniforms() {\r\n return this._material.get()!.$instanceUniforms;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getPickTarget }\r\n */\r\n getPickTarget() {\r\n return this._pickTarget;\r\n }\r\n setPickTarget(node: SceneNode, label?: string) {\r\n this._pickTarget = { node, label };\r\n }\r\n /** Material of the mesh */\r\n get material() {\r\n return this._material.get()!;\r\n }\r\n set material(m) {\r\n if (this._material.get() !== m && m instanceof SpriteMaterial) {\r\n this._material.set(m);\r\n if (m) {\r\n this.onSetMaterial(m);\r\n RenderBundleWrapper.materialAttached(m.coreMaterial, this);\r\n }\r\n this._instanceHash = m ? `${this.constructor.name}:${this._scene?.id ?? 0}:${m.instanceId}` : null;\r\n RenderBundleWrapper.drawableChanged(this);\r\n this._materialChangeTag = null;\r\n }\r\n }\r\n get anchorX() {\r\n return this._anchor.x;\r\n }\r\n set anchorX(value) {\r\n if (this._anchor.x !== value) {\r\n this._anchor.x = value;\r\n this.invalidateWorldBoundingVolume(false);\r\n const material = this._material.get();\r\n if (material) {\r\n material.anchorX = this._anchor.x;\r\n }\r\n }\r\n }\r\n get anchorY() {\r\n return this._anchor.y;\r\n }\r\n set anchorY(value) {\r\n if (this._anchor.y !== value) {\r\n this._anchor.y = value;\r\n this.invalidateWorldBoundingVolume(false);\r\n const material = this._material.get();\r\n if (material) {\r\n material.anchorY = this._anchor.y;\r\n }\r\n }\r\n }\r\n get uvTopLeft() {\r\n const uvinfo = this._material.get()!.uvinfo;\r\n return new Vector2(uvinfo.x, uvinfo.y);\r\n }\r\n set uvTopLeft(value) {\r\n const uvinfo = this._material.get()!.uvinfo;\r\n this._material.get()!.setUVInfo(value.x, value.y, uvinfo.z, uvinfo.w);\r\n }\r\n get uvBottomRight() {\r\n const uvinfo = this._material.get()!.uvinfo;\r\n return new Vector2(uvinfo.z, uvinfo.w);\r\n }\r\n set uvBottomRight(value) {\r\n const uvinfo = this._material.get()!.uvinfo;\r\n this._material.get()!.setUVInfo(uvinfo.x, uvinfo.y, value.x, value.y);\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getMorphData}\r\n */\r\n getMorphData() {\r\n return null;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getMorphInfo}\r\n */\r\n getMorphInfo() {\r\n return null;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.isBatchable}\r\n */\r\n isBatchable(): this is BatchDrawable {\r\n return this._batchable && !!this._material.get() && this._material.get()!.isBatchable();\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getQueueType}\r\n */\r\n getQueueType() {\r\n return this.material?.getQueueType() ?? QUEUE_OPAQUE;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.isUnlit}\r\n */\r\n isUnlit() {\r\n return !this.material?.supportLighting();\r\n }\r\n /**\r\n * {@inheritDoc Drawable.needSceneColor}\r\n */\r\n needSceneColor() {\r\n return this.material?.needSceneColor();\r\n }\r\n /**\r\n * {@inheritDoc Drawable.needSceneDepth}\r\n */\r\n needSceneDepth() {\r\n return this.material?.needSceneDepth();\r\n }\r\n /**\r\n * {@inheritDoc Drawable.draw}\r\n */\r\n draw(ctx: DrawContext, renderQueue: Nullable<RenderQueue>, hash?: string) {\r\n const material = this.material;\r\n const primitive = this.getPrimitive();\r\n if (material && primitive) {\r\n if (this._useRenderBundle && !ctx.instanceData && hash) {\r\n if (this._materialChangeTag !== material.changeTag) {\r\n this._renderBundle = {};\r\n this._materialChangeTag = material.changeTag;\r\n }\r\n const renderBundle = this._renderBundle[hash];\r\n if (!renderBundle) {\r\n ctx.device.beginCapture();\r\n this.bind(ctx, renderQueue);\r\n material.draw(primitive, ctx);\r\n this._renderBundle[hash] = ctx.device.endCapture();\r\n } else {\r\n ctx.device.executeRenderBundle(renderBundle);\r\n }\r\n } else {\r\n this.bind(ctx, renderQueue);\r\n material.draw(primitive, ctx);\r\n }\r\n }\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getMaterial}\r\n */\r\n getMaterial() {\r\n return this.material;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getPrimitive}\r\n */\r\n getPrimitive() {\r\n let primitive = BaseSprite._primitive.get();\r\n if (!primitive) {\r\n primitive = new Primitive();\r\n primitive.createAndSetVertexBuffer('position_f32', new Float32Array([0, 1, 2, 3]));\r\n primitive.createAndSetIndexBuffer(new Uint16Array([0, 1, 2, 3]));\r\n primitive.primitiveType = 'triangle-strip';\r\n BaseSprite._primitive.set(primitive);\r\n }\r\n return primitive;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getBoneMatrices}\r\n */\r\n getBoneMatrices() {\r\n return null;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getSkinInfluenceData}\r\n */\r\n getSkinInfluenceData(): Nullable<SkinInfluenceData> {\r\n return null;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getNode}\r\n */\r\n getNode() {\r\n // mesh transform should be ignored when skinned\r\n return this;\r\n }\r\n /**\r\n * {@inheritDoc SceneNode.computeBoundingVolume}\r\n */\r\n computeBoundingVolume() {\r\n return null;\r\n }\r\n /**\r\n * {@inheritDoc SceneNode.computeWorldBoundingVolume}\r\n */\r\n computeWorldBoundingVolume() {\r\n const p = this.worldMatrix.transformPointAffine(Vector3.zero());\r\n const scaleX = Math.hypot(this.worldMatrix[0], this.worldMatrix[1], this.worldMatrix[2]);\r\n const scaleY = Math.hypot(this.worldMatrix[4], this.worldMatrix[5], this.worldMatrix[6]);\r\n const mat = this._material?.get();\r\n if (mat) {\r\n const boundingBox = new BoundingBox();\r\n const cx = Math.max(Math.abs(this._anchor.x), Math.abs(1 - this._anchor.x)) * scaleX;\r\n const cy = Math.max(Math.abs(this._anchor.y), Math.abs(1 - this._anchor.y)) * scaleY;\r\n const size = Math.max(cx, cy);\r\n boundingBox.minPoint.setXYZ(p.x - size, p.y - size, p.z - size);\r\n boundingBox.maxPoint.setXYZ(p.x + size, p.y + size, p.z + size);\r\n return boundingBox;\r\n }\r\n return null;\r\n }\r\n calculateLocalTransform(outMatrix: Matrix4x4) {\r\n const rot = this.rotation.toEulerAngles().z;\r\n const rotationZ = Quaternion.fromAxisAngle(Vector3.axisPZ(), rot);\r\n outMatrix.compose(this._scaling, rotationZ, this._position);\r\n if (this._material?.get()) {\r\n this._rotateAngle = -rot;\r\n this._material.get()!.rotation = this._rotateAngle;\r\n }\r\n\r\n //outMatrix.scaling(this.scale).translateLeft(this._position);\r\n }\r\n calculateWorldTransform(outMatrix: Matrix4x4) {\r\n outMatrix.set(this.localMatrix);\r\n if (this.parent) {\r\n outMatrix.m03 += this.parent.worldMatrix.m03;\r\n outMatrix.m13 += this.parent.worldMatrix.m13;\r\n outMatrix.m23 += this.parent.worldMatrix.m23;\r\n }\r\n }\r\n /** Called when new material is set */\r\n protected onSetMaterial(material: M) {\r\n material.anchor = this._anchor;\r\n material.rotation = this._rotateAngle;\r\n }\r\n /** Disposes the mesh node */\r\n protected onDispose() {\r\n super.onDispose();\r\n this._material.dispose();\r\n RenderBundleWrapper.drawableChanged(this);\r\n }\r\n}\r\n"],"names":["BaseSprite","applyMixins","GraphNode","mixinDrawable","_primitive","DRef","scene","_material","_instanceHash","_pickTarget","node","_batchable","_anchor","Vector2","_rotateAngle","_renderBundle","_useRenderBundle","_materialChangeTag","getInstanceId","_renderPass","worldMatrixDet","getInstanceUniforms","get","$instanceUniforms","getPickTarget","setPickTarget","label","material","m","SpriteMaterial","set","onSetMaterial","RenderBundleWrapper","materialAttached","coreMaterial","name","_scene","id","instanceId","drawableChanged","anchorX","x","value","invalidateWorldBoundingVolume","anchorY","y","uvTopLeft","uvinfo","setUVInfo","z","w","uvBottomRight","getMorphData","getMorphInfo","isBatchable","getQueueType","QUEUE_OPAQUE","isUnlit","supportLighting","needSceneColor","needSceneDepth","draw","ctx","renderQueue","hash","primitive","getPrimitive","instanceData","changeTag","renderBundle","device","beginCapture","bind","endCapture","executeRenderBundle","getMaterial","Primitive","createAndSetVertexBuffer","Float32Array","createAndSetIndexBuffer","Uint16Array","primitiveType","getBoneMatrices","getSkinInfluenceData","getNode","computeBoundingVolume","computeWorldBoundingVolume","p","worldMatrix","transformPointAffine","Vector3","zero","scaleX","Math","hypot","scaleY","mat","boundingBox","BoundingBox","cx","max","abs","cy","size","minPoint","setXYZ","maxPoint","calculateLocalTransform","outMatrix","rot","rotation","toEulerAngles","rotationZ","Quaternion","fromAxisAngle","axisPZ","compose","_scaling","_position","calculateWorldTransform","localMatrix","parent","m03","m13","m23","anchor","onDispose","dispose"],"mappings":"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"}
|
package/dist/scene/batchgroup.js
CHANGED
|
@@ -8,11 +8,12 @@ import '../material/shader/helper.js';
|
|
|
8
8
|
import '../material/lambert.js';
|
|
9
9
|
import '../material/blinn.js';
|
|
10
10
|
import '../material/unlit.js';
|
|
11
|
+
import '../material/meshmaterial.js';
|
|
11
12
|
import '../material/particle.js';
|
|
12
13
|
import '../material/subsurfaceprofile.js';
|
|
13
|
-
import '../material/
|
|
14
|
+
import '../material/sssprofile.js';
|
|
15
|
+
import '../material/sss.js';
|
|
14
16
|
import '../material/eye.js';
|
|
15
|
-
import '../material/meshmaterial.js';
|
|
16
17
|
import '../material/hair.js';
|
|
17
18
|
import '../material/hairstrand.js';
|
|
18
19
|
import '../material/grassmaterial.js';
|
|
@@ -29,9 +30,15 @@ import '../render/lightpass.js';
|
|
|
29
30
|
import '../render/sky.js';
|
|
30
31
|
import '../render/clipmap.js';
|
|
31
32
|
import '../render/envlight.js';
|
|
33
|
+
import '../render/lod.js';
|
|
32
34
|
import '../render/dualdepthpeeling_oit.js';
|
|
33
35
|
import '../shaders/atmosphere.js';
|
|
36
|
+
import '../render/water_interaction.js';
|
|
34
37
|
import '../render/rendergraph/scene_render_context.js';
|
|
38
|
+
import '../render/sdf/scene_sdf.js';
|
|
39
|
+
import '../render/sdf/global_sdf.js';
|
|
40
|
+
import '../render/gi/voxelize_pass.js';
|
|
41
|
+
import { InstanceCuller } from '../render/instance_culling.js';
|
|
35
42
|
import { BoundingBox } from '../utility/bounding_volume.js';
|
|
36
43
|
|
|
37
44
|
const tmpMatrix = new Matrix4x4();
|
|
@@ -42,7 +49,12 @@ const tmpMatrix = new Matrix4x4();
|
|
|
42
49
|
_renderQueueMap;
|
|
43
50
|
_bindGroupAllocator;
|
|
44
51
|
_changeTag;
|
|
52
|
+
/**
|
|
53
|
+
* Child meshes split by how they are drawn, keyed by whether GPU instance culling selects the
|
|
54
|
+
* levels of detail of the queue, see getMeshSplit
|
|
55
|
+
*/ _meshSplits;
|
|
45
56
|
_staticBV;
|
|
57
|
+
_gpuInstanceCulling;
|
|
46
58
|
/**
|
|
47
59
|
* Creates an instance of mesh node
|
|
48
60
|
* @param scene - The scene to which the mesh node belongs
|
|
@@ -50,20 +62,39 @@ const tmpMatrix = new Matrix4x4();
|
|
|
50
62
|
super(scene);
|
|
51
63
|
this._renderQueueMap = new Map();
|
|
52
64
|
this._changeTag = 0;
|
|
65
|
+
this._meshSplits = new Map();
|
|
53
66
|
this._bindGroupAllocator = new InstanceBindGroupAllocator();
|
|
54
67
|
this._staticBV = false;
|
|
55
|
-
|
|
68
|
+
this._gpuInstanceCulling = true;
|
|
69
|
+
const bvCallback = (node)=>{
|
|
56
70
|
if (!this._staticBV) {
|
|
57
71
|
this.invalidateBoundingVolume();
|
|
58
72
|
}
|
|
73
|
+
// Bounds of the child mesh, transformed or animated
|
|
74
|
+
if (node?.isMesh()) {
|
|
75
|
+
for (const { queue } of this._renderQueueMap.values()){
|
|
76
|
+
queue.markInstanceBoundsDirty(node);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
59
79
|
};
|
|
60
80
|
const primitiveCallback = ()=>{
|
|
61
|
-
|
|
81
|
+
if (!this._staticBV) {
|
|
82
|
+
this.invalidateBoundingVolume();
|
|
83
|
+
}
|
|
62
84
|
this.invalidate();
|
|
63
85
|
};
|
|
64
86
|
const materialCallback = ()=>{
|
|
65
87
|
this.invalidate();
|
|
66
88
|
};
|
|
89
|
+
// A forced level decides whether the view selects the mesh's level, so the meshes are split
|
|
90
|
+
// again; cached queues hold forced levels as they were built with, so they are rebuilt too.
|
|
91
|
+
// Levels selected by GPU culling read the level limits of the mesh with its bounds
|
|
92
|
+
const lodCallback = (mesh)=>{
|
|
93
|
+
for (const { queue } of this._renderQueueMap.values()){
|
|
94
|
+
queue.markInstanceBoundsDirty(mesh);
|
|
95
|
+
}
|
|
96
|
+
this.invalidate();
|
|
97
|
+
};
|
|
67
98
|
this.on('visiblechanged', (node)=>{
|
|
68
99
|
node.iterate((child)=>{
|
|
69
100
|
if (child.isMesh()) {
|
|
@@ -83,6 +114,7 @@ const tmpMatrix = new Matrix4x4();
|
|
|
83
114
|
child.on('bvchanged', bvCallback);
|
|
84
115
|
child.on('primitive_changed', primitiveCallback);
|
|
85
116
|
child.on('material_changed', materialCallback);
|
|
117
|
+
child.on('lod_changed', lodCallback);
|
|
86
118
|
this.invalidate();
|
|
87
119
|
}
|
|
88
120
|
});
|
|
@@ -97,11 +129,32 @@ const tmpMatrix = new Matrix4x4();
|
|
|
97
129
|
child.off('bvchanged', bvCallback);
|
|
98
130
|
child.off('primitive_changed', primitiveCallback);
|
|
99
131
|
child.off('material_changed', materialCallback);
|
|
132
|
+
child.off('lod_changed', lodCallback);
|
|
100
133
|
this.invalidate();
|
|
101
134
|
}
|
|
102
135
|
});
|
|
103
136
|
});
|
|
104
137
|
}
|
|
138
|
+
/**
|
|
139
|
+
* Whether the instances of the child meshes are frustum culled on the GPU, for each view the
|
|
140
|
+
* group is drawn in (WebGPU only). Default true.
|
|
141
|
+
*
|
|
142
|
+
* @remarks
|
|
143
|
+
* The group draws its child meshes as batches recorded once, which the CPU only culls as a whole.
|
|
144
|
+
* With this on, each view also drops the meshes it does not see from the batches before drawing
|
|
145
|
+
* them, which cuts the vertex work of large groups seen in part, shadow cascades included.
|
|
146
|
+
*/ get gpuInstanceCulling() {
|
|
147
|
+
return this._gpuInstanceCulling;
|
|
148
|
+
}
|
|
149
|
+
set gpuInstanceCulling(val) {
|
|
150
|
+
if (val !== this._gpuInstanceCulling) {
|
|
151
|
+
this._gpuInstanceCulling = val;
|
|
152
|
+
for (const { queue } of this._renderQueueMap.values()){
|
|
153
|
+
queue.dispose();
|
|
154
|
+
}
|
|
155
|
+
this._renderQueueMap.clear();
|
|
156
|
+
}
|
|
157
|
+
}
|
|
105
158
|
/** Gets the batch group name. */ getName() {
|
|
106
159
|
return this._name;
|
|
107
160
|
}
|
|
@@ -158,28 +211,71 @@ const tmpMatrix = new Matrix4x4();
|
|
|
158
211
|
let queueInfo = this._renderQueueMap.get(cullVisitor.renderPass);
|
|
159
212
|
if (!queueInfo) {
|
|
160
213
|
queueInfo = {
|
|
161
|
-
queue: new RenderQueue(cullVisitor.renderPass, this._bindGroupAllocator),
|
|
162
|
-
tag: -1
|
|
214
|
+
queue: new RenderQueue(cullVisitor.renderPass, this._bindGroupAllocator, this._gpuInstanceCulling),
|
|
215
|
+
tag: -1,
|
|
216
|
+
lodColoration: false
|
|
163
217
|
};
|
|
164
218
|
this._renderQueueMap.set(cullVisitor.renderPass, queueInfo);
|
|
165
219
|
}
|
|
166
|
-
|
|
220
|
+
// The cached queue holds its meshes at the levels of detail they were built with, none of
|
|
221
|
+
// which the view selects, so moving the view does not rebuild it
|
|
222
|
+
const lodColoration = !!cullVisitor.camera?.lodColoration;
|
|
223
|
+
const split = this.getMeshSplit(queueInfo.queue.culledOnGpu && !lodColoration);
|
|
224
|
+
if (queueInfo.tag !== this._changeTag || queueInfo.lodColoration !== lodColoration) {
|
|
167
225
|
queueInfo.tag = this._changeTag;
|
|
226
|
+
queueInfo.lodColoration = lodColoration;
|
|
168
227
|
queueInfo.queue.reset();
|
|
169
228
|
const frustumCulling = cullVisitor.frustumCulling;
|
|
170
229
|
const renderQueue = cullVisitor.renderQueue;
|
|
171
230
|
cullVisitor.frustumCulling = false;
|
|
172
231
|
cullVisitor.renderQueue = queueInfo.queue;
|
|
232
|
+
for (const mesh of split.cached){
|
|
233
|
+
cullVisitor.visit(mesh);
|
|
234
|
+
}
|
|
235
|
+
queueInfo.queue.end(cullVisitor.camera, true, cullVisitor.lodCamera);
|
|
236
|
+
cullVisitor.frustumCulling = frustumCulling;
|
|
237
|
+
cullVisitor.renderQueue = renderQueue;
|
|
238
|
+
} else if (cullVisitor.camera?.getPickResultResolveFunc()) {
|
|
239
|
+
// The queue is kept across frames and was built in one that did not pick, so its drawables
|
|
240
|
+
// have neither their object colors nor a place in the picking lookup
|
|
241
|
+
queueInfo.queue.registerObjectColors();
|
|
242
|
+
}
|
|
243
|
+
cullVisitor.pushRenderQueue(queueInfo.queue);
|
|
244
|
+
// Culled, and their levels selected, in the view's queue as if they were not in the group
|
|
245
|
+
for (const mesh of split.dynamic){
|
|
246
|
+
cullVisitor.visit(mesh);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Splits the child meshes into those the cached queues hold and the dynamic ones, whose level of
|
|
251
|
+
* detail the CPU selects from the view: a primitive with levels, no forced level, and GPU culling
|
|
252
|
+
* not selecting the level. Batchable meshes are dynamic too when the CPU selects their level
|
|
253
|
+
* (WebGL, no indirect first instance, or level coloration).
|
|
254
|
+
*
|
|
255
|
+
* @remarks
|
|
256
|
+
* Taken again whenever the group changes. Forcing or freeing the level of a mesh does so through
|
|
257
|
+
* lod_changed; assigning Primitive.lods to a primitive already in the group does not, and it is
|
|
258
|
+
* only picked up with the next change.
|
|
259
|
+
*
|
|
260
|
+
* @param gpuLod - Whether GPU instance culling selects the levels of the queue's batches
|
|
261
|
+
*/ getMeshSplit(gpuLod) {
|
|
262
|
+
let split = this._meshSplits.get(gpuLod);
|
|
263
|
+
if (!split || split.tag !== this._changeTag) {
|
|
264
|
+
split = {
|
|
265
|
+
tag: this._changeTag,
|
|
266
|
+
cached: [],
|
|
267
|
+
dynamic: []
|
|
268
|
+
};
|
|
269
|
+
this._meshSplits.set(gpuLod, split);
|
|
173
270
|
this.iterate((node)=>{
|
|
174
271
|
if (node.isMesh()) {
|
|
175
|
-
|
|
272
|
+
const viewLod = (node.primitive?.lodCount ?? 1) > 1 && node.forcedLod < 0 && !(gpuLod && node.isBatchable() && InstanceCuller.selectsLod(node));
|
|
273
|
+
(viewLod ? split.dynamic : split.cached).push(node);
|
|
176
274
|
}
|
|
275
|
+
return false;
|
|
177
276
|
});
|
|
178
|
-
queueInfo.queue.end(cullVisitor.camera, true);
|
|
179
|
-
cullVisitor.frustumCulling = frustumCulling;
|
|
180
|
-
cullVisitor.renderQueue = renderQueue;
|
|
181
277
|
}
|
|
182
|
-
|
|
278
|
+
return split;
|
|
183
279
|
}
|
|
184
280
|
}
|
|
185
281
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"batchgroup.js","sources":["../../src/scene/batchgroup.ts"],"sourcesContent":["import { GraphNode } from './graph_node';\r\nimport type { CullVisitor, RenderPass } from '../render';\r\nimport { RenderQueue, InstanceBindGroupAllocator } from '../render';\r\nimport type { Scene } from './scene';\r\nimport { BoundingBox, type BoundingVolume } from '../utility/bounding_volume';\r\nimport { Matrix4x4 } from '@zephyr3d/base';\r\n\r\nconst tmpMatrix = new Matrix4x4();\r\n\r\n/**\r\n * Batch group node\r\n * @public\r\n */\r\nexport class BatchGroup extends GraphNode {\r\n private readonly _renderQueueMap: Map<\r\n RenderPass,\r\n {\r\n queue: RenderQueue;\r\n tag: number;\r\n }\r\n >;\r\n private readonly _bindGroupAllocator: InstanceBindGroupAllocator;\r\n private _changeTag: number;\r\n private _staticBV: boolean;\r\n /**\r\n * Creates an instance of mesh node\r\n * @param scene - The scene to which the mesh node belongs\r\n */\r\n constructor(scene: Scene) {\r\n super(scene);\r\n this._renderQueueMap = new Map();\r\n this._changeTag = 0;\r\n this._bindGroupAllocator = new InstanceBindGroupAllocator();\r\n this._staticBV = false;\r\n const bvCallback = () => {\r\n if (!this._staticBV) {\r\n this.invalidateBoundingVolume();\r\n }\r\n };\r\n const primitiveCallback = () => {\r\n bvCallback();\r\n this.invalidate();\r\n };\r\n const materialCallback = () => {\r\n this.invalidate();\r\n };\r\n this.on('visiblechanged', (node) => {\r\n node.iterate((child) => {\r\n if (child.isMesh()) {\r\n this.invalidate();\r\n return true;\r\n }\r\n return false;\r\n });\r\n });\r\n this.on('nodeattached', (node) => {\r\n node.iterate((child) => {\r\n if (child.isMesh()) {\r\n child.placeToOctree = false;\r\n if (!this._staticBV) {\r\n this.invalidateBoundingVolume();\r\n }\r\n child.on('bvchanged', bvCallback);\r\n child.on('primitive_changed', primitiveCallback);\r\n child.on('material_changed', materialCallback);\r\n this.invalidate();\r\n }\r\n });\r\n });\r\n this.on('noderemoved', (node) => {\r\n node.iterate((child) => {\r\n if (child.isMesh()) {\r\n child.placeToOctree = true;\r\n if (!this._staticBV) {\r\n this.invalidateBoundingVolume();\r\n }\r\n child.off('bvchanged', bvCallback);\r\n child.off('primitive_changed', primitiveCallback);\r\n child.off('material_changed', materialCallback);\r\n this.invalidate();\r\n }\r\n });\r\n });\r\n }\r\n /** Gets the batch group name. */\r\n getName() {\r\n return this._name;\r\n }\r\n /**\r\n * {@inheritDoc SceneNode.isBatchGroup}\r\n */\r\n isBatchGroup(): this is BatchGroup {\r\n return true;\r\n }\r\n /**\r\n * Force the batch state to be rebuilt\r\n */\r\n invalidate() {\r\n this._changeTag++;\r\n }\r\n /** @internal */\r\n protected _onDetached() {\r\n super._onDetached();\r\n // Usually the node will be garbage collected after it is detached,\r\n // We should reset the render queue to release the render bundles.\r\n this._renderQueueMap.forEach((val) => {\r\n val.queue.reset();\r\n });\r\n this.invalidate();\r\n }\r\n /** @internal */\r\n protected _onAttached() {\r\n // Reset the render queue when attached to a new scene.\r\n this.invalidate();\r\n }\r\n /** Release cached queues and their private instance bind groups. */\r\n protected onDispose() {\r\n for (const { queue } of this._renderQueueMap.values()) {\r\n queue.dispose();\r\n }\r\n this._renderQueueMap.clear();\r\n this._bindGroupAllocator.dispose();\r\n super.onDispose();\r\n }\r\n /** @internal */\r\n computeBoundingVolume() {\r\n const bv = new BoundingBox();\r\n const invWorldMatrix = Matrix4x4.invertAffine(this.worldMatrix);\r\n bv.beginExtend();\r\n this.iterate((node) => {\r\n if (node.isMesh()) {\r\n Matrix4x4.multiplyAffine(invWorldMatrix, node.worldMatrix, tmpMatrix);\r\n const wb = node.getBoundingVolume()!.transform(tmpMatrix).toAABB();\r\n bv.extend(wb.minPoint);\r\n bv.extend(wb.maxPoint);\r\n }\r\n });\r\n return bv.isValid() ? bv : null;\r\n }\r\n /** @internal */\r\n setBoundingVolume(bv: BoundingVolume) {\r\n this._staticBV = !!bv;\r\n super.setBoundingVolume(bv);\r\n }\r\n /** @internal */\r\n cull(cullVisitor: CullVisitor) {\r\n let queueInfo = this._renderQueueMap.get(cullVisitor.renderPass);\r\n if (!queueInfo) {\r\n queueInfo = {\r\n queue: new RenderQueue(cullVisitor.renderPass, this._bindGroupAllocator),\r\n tag: -1\r\n };\r\n this._renderQueueMap.set(cullVisitor.renderPass, queueInfo);\r\n }\r\n if (queueInfo.tag !== this._changeTag) {\r\n queueInfo.tag = this._changeTag;\r\n queueInfo.queue.reset();\r\n const frustumCulling = cullVisitor.frustumCulling;\r\n const renderQueue = cullVisitor.renderQueue;\r\n cullVisitor.frustumCulling = false;\r\n cullVisitor.renderQueue = queueInfo.queue;\r\n this.iterate((node) => {\r\n if (node.isMesh()) {\r\n cullVisitor.visit(node);\r\n }\r\n });\r\n queueInfo.queue.end(cullVisitor.camera, true);\r\n cullVisitor.frustumCulling = frustumCulling;\r\n cullVisitor.renderQueue = renderQueue;\r\n }\r\n cullVisitor.pushRenderQueue(queueInfo.queue);\r\n }\r\n}\r\n"],"names":["tmpMatrix","Matrix4x4","BatchGroup","GraphNode","_renderQueueMap","_bindGroupAllocator","_changeTag","_staticBV","scene","Map","InstanceBindGroupAllocator","bvCallback","invalidateBoundingVolume","primitiveCallback","invalidate","materialCallback","on","node","iterate","child","isMesh","placeToOctree","off","getName","_name","isBatchGroup","_onDetached","forEach","val","queue","reset","values","dispose","clear","onDispose","computeBoundingVolume","bv","BoundingBox","invWorldMatrix","invertAffine","worldMatrix","beginExtend","multiplyAffine","wb","getBoundingVolume","transform","toAABB","extend","minPoint","maxPoint","isValid","setBoundingVolume","cull","cullVisitor","queueInfo","get","renderPass","RenderQueue","tag","set","frustumCulling","renderQueue","visit","end","camera","pushRenderQueue"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"batchgroup.js","sources":["../../src/scene/batchgroup.ts"],"sourcesContent":["import { GraphNode } from './graph_node';\r\nimport type { CullVisitor, RenderPass } from '../render';\r\nimport { RenderQueue, InstanceBindGroupAllocator } from '../render';\r\nimport { InstanceCuller } from '../render/instance_culling';\r\nimport type { Scene } from './scene';\r\nimport type { Mesh } from './mesh';\r\nimport type { SceneNode } from './scene_node';\r\nimport { BoundingBox, type BoundingVolume } from '../utility/bounding_volume';\r\nimport { Matrix4x4 } from '@zephyr3d/base';\r\n\r\nconst tmpMatrix = new Matrix4x4();\r\n\r\n/** Child meshes of a batch group split by how they are drawn, collected at tag */\r\ninterface BatchGroupMeshSplit {\r\n tag: number;\r\n /** Meshes the cached queues hold, recorded into render bundles */\r\n cached: Mesh[];\r\n /**\r\n * Meshes whose level of detail the CPU selects from the view, culled like any mesh every frame\r\n * instead: a cached queue holding them would be rebuilt, with all its render bundles recorded\r\n * again, whenever one switched level, which happens every few frames while the view moves\r\n */\r\n dynamic: Mesh[];\r\n}\r\n\r\n/**\r\n * Batch group node\r\n * @public\r\n */\r\nexport class BatchGroup extends GraphNode {\r\n private readonly _renderQueueMap: Map<\r\n RenderPass,\r\n {\r\n queue: RenderQueue;\r\n tag: number;\r\n /** Whether the queue was built for a camera coloring levels of detail */\r\n lodColoration: boolean;\r\n }\r\n >;\r\n private readonly _bindGroupAllocator: InstanceBindGroupAllocator;\r\n private _changeTag: number;\r\n /**\r\n * Child meshes split by how they are drawn, keyed by whether GPU instance culling selects the\r\n * levels of detail of the queue, see getMeshSplit\r\n */\r\n private readonly _meshSplits: Map<boolean, BatchGroupMeshSplit>;\r\n private _staticBV: boolean;\r\n private _gpuInstanceCulling: boolean;\r\n /**\r\n * Creates an instance of mesh node\r\n * @param scene - The scene to which the mesh node belongs\r\n */\r\n constructor(scene: Scene) {\r\n super(scene);\r\n this._renderQueueMap = new Map();\r\n this._changeTag = 0;\r\n this._meshSplits = new Map();\r\n this._bindGroupAllocator = new InstanceBindGroupAllocator();\r\n this._staticBV = false;\r\n this._gpuInstanceCulling = true;\r\n const bvCallback = (node: SceneNode) => {\r\n if (!this._staticBV) {\r\n this.invalidateBoundingVolume();\r\n }\r\n // Bounds of the child mesh, transformed or animated\r\n if (node?.isMesh()) {\r\n for (const { queue } of this._renderQueueMap.values()) {\r\n queue.markInstanceBoundsDirty(node);\r\n }\r\n }\r\n };\r\n const primitiveCallback = () => {\r\n if (!this._staticBV) {\r\n this.invalidateBoundingVolume();\r\n }\r\n this.invalidate();\r\n };\r\n const materialCallback = () => {\r\n this.invalidate();\r\n };\r\n // A forced level decides whether the view selects the mesh's level, so the meshes are split\r\n // again; cached queues hold forced levels as they were built with, so they are rebuilt too.\r\n // Levels selected by GPU culling read the level limits of the mesh with its bounds\r\n const lodCallback = (mesh: Mesh) => {\r\n for (const { queue } of this._renderQueueMap.values()) {\r\n queue.markInstanceBoundsDirty(mesh);\r\n }\r\n this.invalidate();\r\n };\r\n this.on('visiblechanged', (node) => {\r\n node.iterate((child) => {\r\n if (child.isMesh()) {\r\n this.invalidate();\r\n return true;\r\n }\r\n return false;\r\n });\r\n });\r\n this.on('nodeattached', (node) => {\r\n node.iterate((child) => {\r\n if (child.isMesh()) {\r\n child.placeToOctree = false;\r\n if (!this._staticBV) {\r\n this.invalidateBoundingVolume();\r\n }\r\n child.on('bvchanged', bvCallback);\r\n child.on('primitive_changed', primitiveCallback);\r\n child.on('material_changed', materialCallback);\r\n child.on('lod_changed', lodCallback);\r\n this.invalidate();\r\n }\r\n });\r\n });\r\n this.on('noderemoved', (node) => {\r\n node.iterate((child) => {\r\n if (child.isMesh()) {\r\n child.placeToOctree = true;\r\n if (!this._staticBV) {\r\n this.invalidateBoundingVolume();\r\n }\r\n child.off('bvchanged', bvCallback);\r\n child.off('primitive_changed', primitiveCallback);\r\n child.off('material_changed', materialCallback);\r\n child.off('lod_changed', lodCallback);\r\n this.invalidate();\r\n }\r\n });\r\n });\r\n }\r\n /**\r\n * Whether the instances of the child meshes are frustum culled on the GPU, for each view the\r\n * group is drawn in (WebGPU only). Default true.\r\n *\r\n * @remarks\r\n * The group draws its child meshes as batches recorded once, which the CPU only culls as a whole.\r\n * With this on, each view also drops the meshes it does not see from the batches before drawing\r\n * them, which cuts the vertex work of large groups seen in part, shadow cascades included.\r\n */\r\n get gpuInstanceCulling() {\r\n return this._gpuInstanceCulling;\r\n }\r\n set gpuInstanceCulling(val: boolean) {\r\n if (val !== this._gpuInstanceCulling) {\r\n this._gpuInstanceCulling = val;\r\n for (const { queue } of this._renderQueueMap.values()) {\r\n queue.dispose();\r\n }\r\n this._renderQueueMap.clear();\r\n }\r\n }\r\n /** Gets the batch group name. */\r\n getName() {\r\n return this._name;\r\n }\r\n /**\r\n * {@inheritDoc SceneNode.isBatchGroup}\r\n */\r\n isBatchGroup(): this is BatchGroup {\r\n return true;\r\n }\r\n /**\r\n * Force the batch state to be rebuilt\r\n */\r\n invalidate() {\r\n this._changeTag++;\r\n }\r\n /** @internal */\r\n protected _onDetached() {\r\n super._onDetached();\r\n // Usually the node will be garbage collected after it is detached,\r\n // We should reset the render queue to release the render bundles.\r\n this._renderQueueMap.forEach((val) => {\r\n val.queue.reset();\r\n });\r\n this.invalidate();\r\n }\r\n /** @internal */\r\n protected _onAttached() {\r\n // Reset the render queue when attached to a new scene.\r\n this.invalidate();\r\n }\r\n /** Release cached queues and their private instance bind groups. */\r\n protected onDispose() {\r\n for (const { queue } of this._renderQueueMap.values()) {\r\n queue.dispose();\r\n }\r\n this._renderQueueMap.clear();\r\n this._bindGroupAllocator.dispose();\r\n super.onDispose();\r\n }\r\n /** @internal */\r\n computeBoundingVolume() {\r\n const bv = new BoundingBox();\r\n const invWorldMatrix = Matrix4x4.invertAffine(this.worldMatrix);\r\n bv.beginExtend();\r\n this.iterate((node) => {\r\n if (node.isMesh()) {\r\n Matrix4x4.multiplyAffine(invWorldMatrix, node.worldMatrix, tmpMatrix);\r\n const wb = node.getBoundingVolume()!.transform(tmpMatrix).toAABB();\r\n bv.extend(wb.minPoint);\r\n bv.extend(wb.maxPoint);\r\n }\r\n });\r\n return bv.isValid() ? bv : null;\r\n }\r\n /** @internal */\r\n setBoundingVolume(bv: BoundingVolume) {\r\n this._staticBV = !!bv;\r\n super.setBoundingVolume(bv);\r\n }\r\n /** @internal */\r\n cull(cullVisitor: CullVisitor) {\r\n let queueInfo = this._renderQueueMap.get(cullVisitor.renderPass);\r\n if (!queueInfo) {\r\n queueInfo = {\r\n queue: new RenderQueue(cullVisitor.renderPass, this._bindGroupAllocator, this._gpuInstanceCulling),\r\n tag: -1,\r\n lodColoration: false\r\n };\r\n this._renderQueueMap.set(cullVisitor.renderPass, queueInfo);\r\n }\r\n // The cached queue holds its meshes at the levels of detail they were built with, none of\r\n // which the view selects, so moving the view does not rebuild it\r\n const lodColoration = !!cullVisitor.camera?.lodColoration;\r\n const split = this.getMeshSplit(queueInfo.queue.culledOnGpu && !lodColoration);\r\n if (queueInfo.tag !== this._changeTag || queueInfo.lodColoration !== lodColoration) {\r\n queueInfo.tag = this._changeTag;\r\n queueInfo.lodColoration = lodColoration;\r\n queueInfo.queue.reset();\r\n const frustumCulling = cullVisitor.frustumCulling;\r\n const renderQueue = cullVisitor.renderQueue;\r\n cullVisitor.frustumCulling = false;\r\n cullVisitor.renderQueue = queueInfo.queue;\r\n for (const mesh of split.cached) {\r\n cullVisitor.visit(mesh);\r\n }\r\n queueInfo.queue.end(cullVisitor.camera, true, cullVisitor.lodCamera);\r\n cullVisitor.frustumCulling = frustumCulling;\r\n cullVisitor.renderQueue = renderQueue;\r\n } else if (cullVisitor.camera?.getPickResultResolveFunc()) {\r\n // The queue is kept across frames and was built in one that did not pick, so its drawables\r\n // have neither their object colors nor a place in the picking lookup\r\n queueInfo.queue.registerObjectColors();\r\n }\r\n cullVisitor.pushRenderQueue(queueInfo.queue);\r\n // Culled, and their levels selected, in the view's queue as if they were not in the group\r\n for (const mesh of split.dynamic) {\r\n cullVisitor.visit(mesh);\r\n }\r\n }\r\n /**\r\n * Splits the child meshes into those the cached queues hold and the dynamic ones, whose level of\r\n * detail the CPU selects from the view: a primitive with levels, no forced level, and GPU culling\r\n * not selecting the level. Batchable meshes are dynamic too when the CPU selects their level\r\n * (WebGL, no indirect first instance, or level coloration).\r\n *\r\n * @remarks\r\n * Taken again whenever the group changes. Forcing or freeing the level of a mesh does so through\r\n * lod_changed; assigning Primitive.lods to a primitive already in the group does not, and it is\r\n * only picked up with the next change.\r\n *\r\n * @param gpuLod - Whether GPU instance culling selects the levels of the queue's batches\r\n */\r\n private getMeshSplit(gpuLod: boolean) {\r\n let split = this._meshSplits.get(gpuLod);\r\n if (!split || split.tag !== this._changeTag) {\r\n split = { tag: this._changeTag, cached: [], dynamic: [] };\r\n this._meshSplits.set(gpuLod, split);\r\n this.iterate((node) => {\r\n if (node.isMesh()) {\r\n const viewLod =\r\n (node.primitive?.lodCount ?? 1) > 1 &&\r\n node.forcedLod < 0 &&\r\n !(gpuLod && node.isBatchable() && InstanceCuller.selectsLod(node));\r\n (viewLod ? split!.dynamic : split!.cached).push(node);\r\n }\r\n return false;\r\n });\r\n }\r\n return split;\r\n }\r\n}\r\n"],"names":["tmpMatrix","Matrix4x4","BatchGroup","GraphNode","_renderQueueMap","_bindGroupAllocator","_changeTag","_staticBV","_gpuInstanceCulling","scene","Map","_meshSplits","InstanceBindGroupAllocator","bvCallback","node","invalidateBoundingVolume","isMesh","queue","values","markInstanceBoundsDirty","primitiveCallback","invalidate","materialCallback","lodCallback","mesh","on","iterate","child","placeToOctree","off","gpuInstanceCulling","val","dispose","clear","getName","_name","isBatchGroup","_onDetached","forEach","reset","onDispose","computeBoundingVolume","bv","BoundingBox","invWorldMatrix","invertAffine","worldMatrix","beginExtend","multiplyAffine","wb","getBoundingVolume","transform","toAABB","extend","minPoint","maxPoint","isValid","setBoundingVolume","cull","cullVisitor","queueInfo","get","renderPass","RenderQueue","tag","lodColoration","set","camera","split","getMeshSplit","culledOnGpu","frustumCulling","renderQueue","cached","visit","end","lodCamera","getPickResultResolveFunc","registerObjectColors","pushRenderQueue","dynamic","gpuLod","viewLod","primitive","lodCount","forcedLod","isBatchable","InstanceCuller","selectsLod","push"],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Disposable, ObservableVector4, DRef, Vector3 } from '@zephyr3d/base';
|
|
2
|
+
import { getProbeVolumeForDraw } from '../render/gi/probe_volume.js';
|
|
2
3
|
import '../values.js';
|
|
3
4
|
import '../render/render_queue.js';
|
|
4
5
|
import '../render/primitive.js';
|
|
@@ -7,11 +8,12 @@ import '../material/shader/helper.js';
|
|
|
7
8
|
import '../material/lambert.js';
|
|
8
9
|
import '../material/blinn.js';
|
|
9
10
|
import '../material/unlit.js';
|
|
11
|
+
import '../material/meshmaterial.js';
|
|
10
12
|
import '../material/particle.js';
|
|
11
13
|
import '../material/subsurfaceprofile.js';
|
|
12
|
-
import '../material/
|
|
14
|
+
import '../material/sssprofile.js';
|
|
15
|
+
import '../material/sss.js';
|
|
13
16
|
import '../material/eye.js';
|
|
14
|
-
import '../material/meshmaterial.js';
|
|
15
17
|
import '../material/hair.js';
|
|
16
18
|
import '../material/hairstrand.js';
|
|
17
19
|
import '../material/grassmaterial.js';
|
|
@@ -27,16 +29,23 @@ import '../render/rendergraph/forward_plus_builder.js';
|
|
|
27
29
|
import '../render/lightpass.js';
|
|
28
30
|
import { SkyRenderer } from '../render/sky.js';
|
|
29
31
|
import '../render/clipmap.js';
|
|
30
|
-
import { EnvShIBL, EnvHemisphericAmbient, EnvConstantAmbient } from '../render/envlight.js';
|
|
32
|
+
import { EnvShIBL, EnvProbesOnly, EnvHemisphericAmbient, EnvConstantAmbient } from '../render/envlight.js';
|
|
33
|
+
import '../render/lod.js';
|
|
31
34
|
import '../render/dualdepthpeeling_oit.js';
|
|
32
35
|
import '../shaders/atmosphere.js';
|
|
36
|
+
import '../render/water_interaction.js';
|
|
33
37
|
import '../render/rendergraph/scene_render_context.js';
|
|
38
|
+
import '../render/sdf/scene_sdf.js';
|
|
39
|
+
import '../render/sdf/global_sdf.js';
|
|
40
|
+
import '../render/gi/voxelize_pass.js';
|
|
41
|
+
import { WindField } from './wind.js';
|
|
34
42
|
|
|
35
43
|
/**
|
|
36
44
|
* Wrapper for environmant lighting
|
|
37
45
|
* @public
|
|
38
46
|
*/ class EnvLightWrapper extends Disposable {
|
|
39
47
|
_envLight;
|
|
48
|
+
/** Stands in for the environment light of type `none`, see {@link EnvLightWrapper.envLight}. */ _probesOnly;
|
|
40
49
|
_ambientColor;
|
|
41
50
|
_ambientDown;
|
|
42
51
|
_ambientUp;
|
|
@@ -53,6 +62,7 @@ import '../render/rendergraph/scene_render_context.js';
|
|
|
53
62
|
/** @internal */ constructor(){
|
|
54
63
|
super();
|
|
55
64
|
this._envLight = new EnvShIBL();
|
|
65
|
+
this._probesOnly = new EnvProbesOnly();
|
|
56
66
|
this._ambientColor = new ObservableVector4(0.2, 0.2, 0.2, 1).setCallback(()=>{
|
|
57
67
|
if (this.type === 'constant') {
|
|
58
68
|
this._envLight.ambientColor.set(this._ambientColor);
|
|
@@ -89,11 +99,16 @@ import '../render/rendergraph/scene_render_context.js';
|
|
|
89
99
|
}
|
|
90
100
|
/** @internal */ getHash(ctx) {
|
|
91
101
|
const irradianceSource = this.type === 'ibl' ? this._irradianceSHFB.get() ? 'fb' : this._irradianceSH.get() ? 'buf' : 'none' : 'na';
|
|
92
|
-
const ssgiHistory = !!ctx?.SSGI && !!ctx.SSGIIrradianceHistoryTexture && !!ctx.SSGISurfaceHistoryTexture &&
|
|
93
|
-
|
|
102
|
+
const ssgiHistory = !!ctx?.SSGI && !!ctx.SSGIIrradianceHistoryTexture && !!ctx.SSGISurfaceHistoryTexture && !!ctx.motionVectorTexture;
|
|
103
|
+
const envLight = this.envLight;
|
|
104
|
+
return !ctx || ctx.drawEnvLight ? `${this.type}:${envLight.hasRadiance() ? '1' : '0'}:${envLight.hasSheenRadiance() ? '1' : '0'}:${envLight.hasIrradiance() ? '1' : '0'}:${irradianceSource}:ssgi${ssgiHistory ? '1' : '0'}:probes${getProbeVolumeForDraw(ctx) ? '1' : '0'}` : 'none';
|
|
94
105
|
}
|
|
95
|
-
/**
|
|
96
|
-
|
|
106
|
+
/**
|
|
107
|
+
* @internal
|
|
108
|
+
* Environment lighting used by materials. For type `none`, a sky-less stand-in
|
|
109
|
+
* that applies probe GI only; passes reading the sky check {@link EnvLightWrapper.type}.
|
|
110
|
+
*/ get envLight() {
|
|
111
|
+
return this._envLight ?? this._probesOnly;
|
|
97
112
|
}
|
|
98
113
|
/**
|
|
99
114
|
* Multiplier on environment lighting, in both lighting modes.
|
|
@@ -245,6 +260,7 @@ import '../render/rendergraph/scene_render_context.js';
|
|
|
245
260
|
/** Disposes the environment lighting wrapper */ onDispose() {
|
|
246
261
|
super.onDispose();
|
|
247
262
|
this._envLight?.dispose();
|
|
263
|
+
this._probesOnly.dispose();
|
|
248
264
|
this._radianceMap.dispose();
|
|
249
265
|
this._sheenRadianceMap.dispose();
|
|
250
266
|
this._irradianceMap.dispose();
|
|
@@ -258,10 +274,12 @@ import '../render/rendergraph/scene_render_context.js';
|
|
|
258
274
|
*/ class Environment extends Disposable {
|
|
259
275
|
_sky;
|
|
260
276
|
_light;
|
|
277
|
+
_wind;
|
|
261
278
|
/** @internal */ constructor(){
|
|
262
279
|
super();
|
|
263
280
|
this._sky = new SkyRenderer();
|
|
264
281
|
this._light = new EnvLightWrapper();
|
|
282
|
+
this._wind = new WindField();
|
|
265
283
|
// The physical `intensity` only reaches the image through the cached sky bake, so changing it
|
|
266
284
|
// has to re-bake; otherwise the cubemap keeps the value it was baked with.
|
|
267
285
|
this._light.setBakeInvalidator(()=>this._sky.invalidate());
|
|
@@ -272,6 +290,9 @@ import '../render/rendergraph/scene_render_context.js';
|
|
|
272
290
|
/** The environment lighting renderer */ get light() {
|
|
273
291
|
return this._light;
|
|
274
292
|
}
|
|
293
|
+
/** The scene-wide wind */ get wind() {
|
|
294
|
+
return this._wind;
|
|
295
|
+
}
|
|
275
296
|
/** @internal */ getHash(ctx) {
|
|
276
297
|
return `${this.light?.getHash(ctx)}:${this._sky?.getHash(ctx)}`;
|
|
277
298
|
}
|