@zephyr3d/scene 0.9.26 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +60 -27
- package/dist/animation/animation_bank.js +634 -0
- package/dist/animation/animation_bank.js.map +1 -0
- package/dist/animation/animation_bank_gpu.js +256 -0
- package/dist/animation/animation_bank_gpu.js.map +1 -0
- package/dist/animation/animationset.js +146 -30
- package/dist/animation/animationset.js.map +1 -1
- package/dist/animation/cloth/gpu_cloth_component.js +406 -0
- package/dist/animation/cloth/gpu_cloth_component.js.map +1 -0
- package/dist/animation/cloth/gpu_cloth_system.js +332 -202
- package/dist/animation/cloth/gpu_cloth_system.js.map +1 -1
- package/dist/animation/gpu_animation_driver.js +289 -0
- package/dist/animation/gpu_animation_driver.js.map +1 -0
- package/dist/animation/joint_dynamics/collision.js +112 -1
- package/dist/animation/joint_dynamics/collision.js.map +1 -1
- package/dist/animation/joint_dynamics/controller.js +6 -0
- package/dist/animation/joint_dynamics/controller.js.map +1 -1
- package/dist/animation/joint_dynamics/joint_dynamics_system.js +11 -0
- package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -1
- package/dist/animation/joint_dynamics/solver.js +50 -12
- package/dist/animation/joint_dynamics/solver.js.map +1 -1
- package/dist/animation/joint_dynamics/types.js.map +1 -1
- package/dist/animation/skeleton.js +300 -56
- package/dist/animation/skeleton.js.map +1 -1
- package/dist/animation/skin_palette_atlas.js +252 -0
- package/dist/animation/skin_palette_atlas.js.map +1 -0
- package/dist/animation/spring/multi_chain_spring_system.js +298 -38
- package/dist/animation/spring/multi_chain_spring_system.js.map +1 -1
- package/dist/animation/spring/spring_chain.js +2 -0
- package/dist/animation/spring/spring_chain.js.map +1 -1
- package/dist/animation/spring/spring_collider.js +159 -21
- package/dist/animation/spring/spring_collider.js.map +1 -1
- package/dist/animation/spring/spring_particle.js +1 -0
- package/dist/animation/spring/spring_particle.js.map +1 -1
- package/dist/animation/spring/spring_solver.js +173 -0
- package/dist/animation/spring/spring_solver.js.map +1 -0
- package/dist/animation/spring/spring_system.js +249 -24
- package/dist/animation/spring/spring_system.js.map +1 -1
- package/dist/animation/spring_modifier.js +32 -1
- package/dist/animation/spring_modifier.js.map +1 -1
- package/dist/app/app.js +26 -0
- package/dist/app/app.js.map +1 -1
- package/dist/app/engine.js +86 -15
- package/dist/app/engine.js.map +1 -1
- package/dist/app/gamepad.js +191 -0
- package/dist/app/gamepad.js.map +1 -0
- package/dist/app/inputactions.js +271 -0
- package/dist/app/inputactions.js.map +1 -0
- package/dist/app/inputmgr.js +331 -22
- package/dist/app/inputmgr.js.map +1 -1
- package/dist/app/loading.js +138 -0
- package/dist/app/loading.js.map +1 -0
- package/dist/app/pipelinecache.js +209 -0
- package/dist/app/pipelinecache.js.map +1 -0
- package/dist/app/runtimescript.js +25 -0
- package/dist/app/runtimescript.js.map +1 -1
- package/dist/app/scriptingsystem.js +54 -0
- package/dist/app/scriptingsystem.js.map +1 -1
- package/dist/app/scriptregistry.js +7 -2
- package/dist/app/scriptregistry.js.map +1 -1
- package/dist/asset/asset_manifest.js +59 -0
- package/dist/asset/asset_manifest.js.map +1 -0
- package/dist/asset/asset_preload.js +258 -0
- package/dist/asset/asset_preload.js.map +1 -0
- package/dist/asset/assetmanager.js +117 -65
- package/dist/asset/assetmanager.js.map +1 -1
- package/dist/asset/loaders/ktx2/basis/LICENSE +201 -0
- package/dist/asset/loaders/ktx2/basis/basis_transcoder.js +2 -0
- package/dist/asset/loaders/ktx2/basis/basis_transcoder.wasm +0 -0
- package/dist/asset/loaders/ktx2/basis_location.js +17 -0
- package/dist/asset/loaders/ktx2/basis_location.js.map +1 -0
- package/dist/asset/loaders/ktx2/ktx2_loader.js +88 -0
- package/dist/asset/loaders/ktx2/ktx2_loader.js.map +1 -0
- package/dist/asset/loaders/ktx2/ktx2_targets.js +118 -0
- package/dist/asset/loaders/ktx2/ktx2_targets.js.map +1 -0
- package/dist/asset/loaders/ktx2/transcoder_pool.js +259 -0
- package/dist/asset/loaders/ktx2/transcoder_pool.js.map +1 -0
- package/dist/asset/mesh_lod_builder.js +104 -0
- package/dist/asset/mesh_lod_builder.js.map +1 -0
- package/dist/asset/mesh_settings.js +111 -0
- package/dist/asset/mesh_settings.js.map +1 -0
- package/dist/asset/meshopt_decoder.js +18 -0
- package/dist/asset/meshopt_decoder.js.map +1 -0
- package/dist/asset/meshopt_simplifier.js +26 -0
- package/dist/asset/meshopt_simplifier.js.map +1 -0
- package/dist/asset/model.js +177 -3
- package/dist/asset/model.js.map +1 -1
- package/dist/asset/texture_settings.js +231 -0
- package/dist/asset/texture_settings.js.map +1 -0
- package/dist/asset/zmsh_binary.js +131 -0
- package/dist/asset/zmsh_binary.js.map +1 -0
- package/dist/asset/zsdf_binary.js +111 -0
- package/dist/asset/zsdf_binary.js.map +1 -0
- package/dist/blitter/bilateralblur.js +1 -2
- package/dist/blitter/bilateralblur.js.map +1 -1
- package/dist/blitter/gaussianblur.js +1 -6
- package/dist/blitter/gaussianblur.js.map +1 -1
- package/dist/camera/base.js +31 -10
- package/dist/camera/base.js.map +1 -1
- package/dist/camera/camera.js +178 -200
- package/dist/camera/camera.js.map +1 -1
- package/dist/camera/follow.js +342 -0
- package/dist/camera/follow.js.map +1 -0
- package/dist/camera/fps.js +9 -7
- package/dist/camera/fps.js.map +1 -1
- package/dist/camera/orbit.js +46 -19
- package/dist/camera/orbit.js.map +1 -1
- package/dist/index.d.ts +30475 -19865
- package/dist/index.js +67 -12
- package/dist/index.js.map +1 -1
- package/dist/material/blinn.js +3 -0
- package/dist/material/blinn.js.map +1 -1
- package/dist/material/eye.js +1 -1
- package/dist/material/eye.js.map +1 -1
- package/dist/material/hair.js +2 -3
- package/dist/material/hair.js.map +1 -1
- package/dist/material/hairstrand.js +235 -235
- package/dist/material/hairstrand.js.map +1 -1
- package/dist/material/lambert.js +4 -1
- package/dist/material/lambert.js.map +1 -1
- package/dist/material/material.js +362 -300
- package/dist/material/material.js.map +1 -1
- package/dist/material/meshmaterial.js +118 -45
- package/dist/material/meshmaterial.js.map +1 -1
- package/dist/material/mixins/lightmodel/blinnphong.js +1 -1
- package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
- package/dist/material/mixins/lightmodel/lambert.js +1 -1
- package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +34 -61
- package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +16 -2
- package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrspecularglossness.js +2 -1
- package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
- package/dist/material/mixins/lit.js +223 -83
- package/dist/material/mixins/lit.js.map +1 -1
- package/dist/material/mixins/pbr/common.js +31 -206
- package/dist/material/mixins/pbr/common.js.map +1 -1
- package/dist/material/mtoon.js +1 -1
- package/dist/material/mtoon.js.map +1 -1
- package/dist/material/pbrmr.js +3 -0
- package/dist/material/pbrmr.js.map +1 -1
- package/dist/material/pbrsg.js +3 -0
- package/dist/material/pbrsg.js.map +1 -1
- package/dist/material/sdf_debug.js +78 -0
- package/dist/material/sdf_debug.js.map +1 -0
- package/dist/material/shader/helper.js +733 -190
- package/dist/material/shader/helper.js.map +1 -1
- package/dist/material/shader/terrain_blend.js +204 -43
- package/dist/material/shader/terrain_blend.js.map +1 -1
- package/dist/material/skin.js +331 -297
- package/dist/material/skin.js.map +1 -1
- package/dist/material/skinprofile.js +1058 -0
- package/dist/material/skinprofile.js.map +1 -0
- package/dist/material/sss.js +353 -0
- package/dist/material/sss.js.map +1 -0
- package/dist/material/sss_kernel.js +265 -0
- package/dist/material/sss_kernel.js.map +1 -0
- package/dist/material/sssprofile.js +879 -0
- package/dist/material/sssprofile.js.map +1 -0
- package/dist/material/subsurfaceprofile.js +4 -8
- package/dist/material/subsurfaceprofile.js.map +1 -1
- package/dist/material/terrain-cm.js +464 -188
- package/dist/material/terrain-cm.js.map +1 -1
- package/dist/material/unlit.js +3 -0
- package/dist/material/unlit.js.map +1 -1
- package/dist/material/water.js +2009 -201
- package/dist/material/water.js.map +1 -1
- package/dist/node_modules/meshoptimizer/LICENSE +21 -0
- package/dist/node_modules/meshoptimizer/meshopt_decoder.js +197 -0
- package/dist/node_modules/meshoptimizer/meshopt_decoder.js.map +1 -0
- package/dist/node_modules/meshoptimizer/meshopt_simplifier.js +677 -0
- package/dist/node_modules/meshoptimizer/meshopt_simplifier.js.map +1 -0
- package/dist/physics/character.js +226 -0
- package/dist/physics/character.js.map +1 -0
- package/dist/physics/collider.js +209 -0
- package/dist/physics/collider.js.map +1 -0
- package/dist/physics/events.js +79 -0
- package/dist/physics/events.js.map +1 -0
- package/dist/physics/joint.js +272 -0
- package/dist/physics/joint.js.map +1 -0
- package/dist/physics/node_physics.js +234 -0
- package/dist/physics/node_physics.js.map +1 -0
- package/dist/physics/part.js +91 -0
- package/dist/physics/part.js.map +1 -0
- package/dist/physics/rigid_body.js +379 -0
- package/dist/physics/rigid_body.js.map +1 -0
- package/dist/physics/vehicle.js +335 -0
- package/dist/physics/vehicle.js.map +1 -0
- package/dist/physics/world.js +25 -0
- package/dist/physics/world.js.map +1 -0
- package/dist/posteffect/bloom.js +49 -14
- package/dist/posteffect/bloom.js.map +1 -1
- package/dist/posteffect/motionblur.js +668 -63
- package/dist/posteffect/motionblur.js.map +1 -1
- package/dist/posteffect/posteffect.js +12 -1
- package/dist/posteffect/posteffect.js.map +1 -1
- package/dist/posteffect/postsss.js +572 -0
- package/dist/posteffect/postsss.js.map +1 -0
- package/dist/posteffect/sao.js +48 -50
- package/dist/posteffect/sao.js.map +1 -1
- package/dist/posteffect/skinsss.js +605 -355
- package/dist/posteffect/skinsss.js.map +1 -1
- package/dist/posteffect/ssgi.js +91 -162
- package/dist/posteffect/ssgi.js.map +1 -1
- package/dist/posteffect/ssr.js +3 -11
- package/dist/posteffect/ssr.js.map +1 -1
- package/dist/posteffect/sss.js +34 -15
- package/dist/posteffect/sss.js.map +1 -1
- package/dist/posteffect/taa.js +1 -0
- package/dist/posteffect/taa.js.map +1 -1
- package/dist/render/abuffer_oit.js +40 -39
- package/dist/render/abuffer_oit.js.map +1 -1
- package/dist/render/clipmap.js +328 -62
- package/dist/render/clipmap.js.map +1 -1
- package/dist/render/cluster_light.js +958 -224
- package/dist/render/cluster_light.js.map +1 -1
- package/dist/render/cull_visitor.js +26 -5
- package/dist/render/cull_visitor.js.map +1 -1
- package/dist/render/debug_views.js +37 -0
- package/dist/render/debug_views.js.map +1 -0
- package/dist/render/depthpass.js +5 -1
- package/dist/render/depthpass.js.map +1 -1
- package/dist/render/drawable_mixin.js +53 -6
- package/dist/render/drawable_mixin.js.map +1 -1
- package/dist/render/dualdepthpeeling_oit.js +53 -53
- package/dist/render/dualdepthpeeling_oit.js.map +1 -1
- package/dist/render/envlight.js +196 -113
- package/dist/render/envlight.js.map +1 -1
- package/dist/render/fbm_wavegenerator.js +8 -13
- package/dist/render/fbm_wavegenerator.js.map +1 -1
- package/dist/render/fft_wavegenerator.js +268 -136
- package/dist/render/fft_wavegenerator.js.map +1 -1
- package/dist/render/gerstner_wavegenerator.js +113 -28
- package/dist/render/gerstner_wavegenerator.js.map +1 -1
- package/dist/render/gi/probe_volume.js +1334 -0
- package/dist/render/gi/probe_volume.js.map +1 -0
- package/dist/render/gi/scene_gi.js +282 -0
- package/dist/render/gi/scene_gi.js.map +1 -0
- package/dist/render/gi/voxel_atlas.js +198 -0
- package/dist/render/gi/voxel_atlas.js.map +1 -0
- package/dist/render/gi/voxel_lighting.js +652 -0
- package/dist/render/gi/voxel_lighting.js.map +1 -0
- package/dist/render/gi/voxel_scene.js +642 -0
- package/dist/render/gi/voxel_scene.js.map +1 -0
- package/dist/render/gi/voxelize_pass.js +223 -0
- package/dist/render/gi/voxelize_pass.js.map +1 -0
- package/dist/render/globalbindgroup_allocator.js +3 -2
- package/dist/render/globalbindgroup_allocator.js.map +1 -1
- package/dist/render/gpu_picking.js +9 -36
- package/dist/render/gpu_picking.js.map +1 -1
- package/dist/render/hzb.js +80 -22
- package/dist/render/hzb.js.map +1 -1
- package/dist/render/instance_culling.js +499 -0
- package/dist/render/instance_culling.js.map +1 -0
- package/dist/render/lightpass.js +23 -9
- package/dist/render/lightpass.js.map +1 -1
- package/dist/render/lod.js +46 -0
- package/dist/render/lod.js.map +1 -0
- package/dist/render/oit.js +11 -11
- package/dist/render/oit.js.map +1 -1
- package/dist/render/primitive.js +301 -9
- package/dist/render/primitive.js.map +1 -1
- package/dist/render/primitive_readback.js +209 -0
- package/dist/render/primitive_readback.js.map +1 -0
- package/dist/render/render_queue.js +198 -11
- package/dist/render/render_queue.js.map +1 -1
- package/dist/render/renderer.js +14 -7
- package/dist/render/renderer.js.map +1 -1
- package/dist/render/rendergraph/blackboard.js +15 -1
- package/dist/render/rendergraph/blackboard.js.map +1 -1
- package/dist/render/rendergraph/executor.js +136 -0
- package/dist/render/rendergraph/executor.js.map +1 -1
- package/dist/render/rendergraph/forward_plus_builder.js +585 -59
- package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
- package/dist/render/rendergraph/frame_resource_requirements.js +1 -0
- package/dist/render/rendergraph/frame_resource_requirements.js.map +1 -1
- package/dist/render/rendergraph/history_resources.js +8 -1
- package/dist/render/rendergraph/history_resources.js.map +1 -1
- package/dist/render/rendergraph/scene_render_context.js +31 -2
- package/dist/render/rendergraph/scene_render_context.js.map +1 -1
- package/dist/render/rendergraph/types.js.map +1 -1
- package/dist/render/renderpass.js +28 -5
- package/dist/render/renderpass.js.map +1 -1
- package/dist/render/sdf/box_allocator.js +98 -0
- package/dist/render/sdf/box_allocator.js.map +1 -0
- package/dist/render/sdf/global_sdf.js +865 -0
- package/dist/render/sdf/global_sdf.js.map +1 -0
- package/dist/render/sdf/scene_sdf.js +562 -0
- package/dist/render/sdf/scene_sdf.js.map +1 -0
- package/dist/render/sdf/sdf_atlas.js +227 -0
- package/dist/render/sdf/sdf_atlas.js.map +1 -0
- package/dist/render/sdf/sdf_programs.js +42 -0
- package/dist/render/sdf/sdf_programs.js.map +1 -0
- package/dist/render/sdf/sdf_view.js +199 -0
- package/dist/render/sdf/sdf_view.js.map +1 -0
- package/dist/render/sdf/waterline.js +610 -0
- package/dist/render/sdf/waterline.js.map +1 -0
- package/dist/render/shadow_mask_pass.js +142 -25
- package/dist/render/shadow_mask_pass.js.map +1 -1
- package/dist/render/shore_wave_generator.js +1193 -0
- package/dist/render/shore_wave_generator.js.map +1 -0
- package/dist/render/sky.js +516 -86
- package/dist/render/sky.js.map +1 -1
- package/dist/render/transmission_thickness_pass.js +477 -0
- package/dist/render/transmission_thickness_pass.js.map +1 -0
- package/dist/render/underwater.js +524 -0
- package/dist/render/underwater.js.map +1 -0
- package/dist/render/virtualtexture/virtual_texture.js +1214 -0
- package/dist/render/virtualtexture/virtual_texture.js.map +1 -0
- package/dist/render/volumetric_cloud/cloud_common.js +472 -0
- package/dist/render/volumetric_cloud/cloud_common.js.map +1 -0
- package/dist/render/volumetric_cloud/cloud_noise.js +189 -0
- package/dist/render/volumetric_cloud/cloud_noise.js.map +1 -0
- package/dist/render/volumetric_cloud/debug_view.js +131 -0
- package/dist/render/volumetric_cloud/debug_view.js.map +1 -0
- package/dist/render/volumetric_cloud/resources.js +380 -0
- package/dist/render/volumetric_cloud/resources.js.map +1 -0
- package/dist/render/volumetric_cloud/sky_cache.js +380 -0
- package/dist/render/volumetric_cloud/sky_cache.js.map +1 -0
- package/dist/render/volumetric_cloud/volumetric_cloud.js +318 -0
- package/dist/render/volumetric_cloud/volumetric_cloud.js.map +1 -0
- package/dist/render/water_caustics.js +1195 -0
- package/dist/render/water_caustics.js.map +1 -0
- package/dist/render/water_foam.js +627 -0
- package/dist/render/water_foam.js.map +1 -0
- package/dist/render/water_interaction.js +1795 -0
- package/dist/render/water_interaction.js.map +1 -0
- package/dist/render/weightedblended_oit.js +36 -36
- package/dist/render/weightedblended_oit.js.map +1 -1
- package/dist/scene/basesprite.js +9 -4
- package/dist/scene/basesprite.js.map +1 -1
- package/dist/scene/batchgroup.js +108 -12
- package/dist/scene/batchgroup.js.map +1 -1
- package/dist/scene/environment.js +28 -7
- package/dist/scene/environment.js.map +1 -1
- package/dist/scene/foliage.js +1020 -0
- package/dist/scene/foliage.js.map +1 -0
- package/dist/scene/foliage_buckets.js +147 -0
- package/dist/scene/foliage_buckets.js.map +1 -0
- package/dist/scene/foliage_mask.js +358 -0
- package/dist/scene/foliage_mask.js.map +1 -0
- package/dist/scene/hair.js +15 -4
- package/dist/scene/hair.js.map +1 -1
- package/dist/scene/light.js +179 -13
- package/dist/scene/light.js.map +1 -1
- package/dist/scene/mesh.js +327 -45
- package/dist/scene/mesh.js.map +1 -1
- package/dist/scene/meshdrawable.js +6 -0
- package/dist/scene/meshdrawable.js.map +1 -1
- package/dist/scene/msdftext.js +9 -3
- package/dist/scene/msdftext.js.map +1 -1
- package/dist/scene/msdftextsprite.js +9 -3
- package/dist/scene/msdftextsprite.js.map +1 -1
- package/dist/scene/particlesys.js +8 -2
- package/dist/scene/particlesys.js.map +1 -1
- package/dist/scene/physics_settings.js +157 -0
- package/dist/scene/physics_settings.js.map +1 -0
- package/dist/scene/scene.js +190 -44
- package/dist/scene/scene.js.map +1 -1
- package/dist/scene/scene_node.js +147 -6
- package/dist/scene/scene_node.js.map +1 -1
- package/dist/scene/terrain-cm/bladegrassmaterial.js +735 -0
- package/dist/scene/terrain-cm/bladegrassmaterial.js.map +1 -0
- package/dist/scene/terrain-cm/grass.js +881 -42
- package/dist/scene/terrain-cm/grass.js.map +1 -1
- package/dist/scene/terrain-cm/grass_gpu.js +929 -0
- package/dist/scene/terrain-cm/grass_gpu.js.map +1 -0
- package/dist/scene/terrain-cm/grassmaterial.js +180 -9
- package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
- package/dist/scene/terrain-cm/terrain-cm.js +465 -36
- package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
- package/dist/scene/terrain-cm/terrain_gi_albedo.js +257 -0
- package/dist/scene/terrain-cm/terrain_gi_albedo.js.map +1 -0
- package/dist/scene/terrain-cm/terrain_rvt.js +395 -0
- package/dist/scene/terrain-cm/terrain_rvt.js.map +1 -0
- package/dist/scene/update_queue.js +54 -0
- package/dist/scene/update_queue.js.map +1 -0
- package/dist/scene/water.js +997 -96
- package/dist/scene/water.js.map +1 -1
- package/dist/scene/water_surface_sampler.js +324 -0
- package/dist/scene/water_surface_sampler.js.map +1 -0
- package/dist/scene/wind.js +317 -0
- package/dist/scene/wind.js.map +1 -0
- package/dist/shaders/atmosphere.js +388 -166
- package/dist/shaders/atmosphere.js.map +1 -1
- package/dist/shaders/fog.js +100 -32
- package/dist/shaders/fog.js.map +1 -1
- package/dist/shaders/gi.js +365 -0
- package/dist/shaders/gi.js.map +1 -0
- package/dist/shaders/ltc_rect.js +202 -0
- package/dist/shaders/ltc_rect.js.map +1 -0
- package/dist/shaders/misc.js +1 -10
- package/dist/shaders/misc.js.map +1 -1
- package/dist/shaders/noise.js +5 -1
- package/dist/shaders/noise.js.map +1 -1
- package/dist/shaders/probes.js +309 -0
- package/dist/shaders/probes.js.map +1 -0
- package/dist/shaders/sdf.js +537 -0
- package/dist/shaders/sdf.js.map +1 -0
- package/dist/shaders/shadow.js +104 -70
- package/dist/shaders/shadow.js.map +1 -1
- package/dist/shaders/skin_brdf.js +243 -0
- package/dist/shaders/skin_brdf.js.map +1 -0
- package/dist/shaders/ssr.js +6 -159
- package/dist/shaders/ssr.js.map +1 -1
- package/dist/shaders/temporal.js +38 -27
- package/dist/shaders/temporal.js.map +1 -1
- package/dist/shaders/water.js +40 -87
- package/dist/shaders/water.js.map +1 -1
- package/dist/shaders/water_medium.js +42 -0
- package/dist/shaders/water_medium.js.map +1 -0
- package/dist/shadow/dom.js +110 -19
- package/dist/shadow/dom.js.map +1 -1
- package/dist/shadow/esm.js +3 -3
- package/dist/shadow/esm.js.map +1 -1
- package/dist/shadow/pcf_opt.js +15 -48
- package/dist/shadow/pcf_opt.js.map +1 -1
- package/dist/shadow/pcf_pd.js +15 -53
- package/dist/shadow/pcf_pd.js.map +1 -1
- package/dist/shadow/pcss.js +34 -9
- package/dist/shadow/pcss.js.map +1 -1
- package/dist/shadow/shadow_impl.js +3 -8
- package/dist/shadow/shadow_impl.js.map +1 -1
- package/dist/shadow/shadow_region.js +87 -49
- package/dist/shadow/shadow_region.js.map +1 -1
- package/dist/shadow/shadowmapper.js +93 -53
- package/dist/shadow/shadowmapper.js.map +1 -1
- package/dist/shadow/ssm.js +18 -72
- package/dist/shadow/ssm.js.map +1 -1
- package/dist/shadow/vsm.js +3 -3
- package/dist/shadow/vsm.js.map +1 -1
- package/dist/shapes/shape.js +44 -1
- package/dist/shapes/shape.js.map +1 -1
- package/dist/utility/buoyancy.js +287 -0
- package/dist/utility/buoyancy.js.map +1 -0
- package/dist/utility/physical.js +10 -1
- package/dist/utility/physical.js.map +1 -1
- package/dist/utility/pmrem.js +17 -43
- package/dist/utility/pmrem.js.map +1 -1
- package/dist/utility/sdf/bake.js +435 -0
- package/dist/utility/sdf/bake.js.map +1 -0
- package/dist/utility/sdf/bvh.js +576 -0
- package/dist/utility/sdf/bvh.js.map +1 -0
- package/dist/utility/serialization/manager.js +36 -6
- package/dist/utility/serialization/manager.js.map +1 -1
- package/dist/utility/serialization/scene/animation.js +77 -7
- package/dist/utility/serialization/scene/animation.js.map +1 -1
- package/dist/utility/serialization/scene/batch.js +11 -4
- package/dist/utility/serialization/scene/batch.js.map +1 -1
- package/dist/utility/serialization/scene/camera.js +140 -279
- package/dist/utility/serialization/scene/camera.js.map +1 -1
- package/dist/utility/serialization/scene/cloth.js +25 -0
- package/dist/utility/serialization/scene/cloth.js.map +1 -0
- package/dist/utility/serialization/scene/common.js +14 -6
- package/dist/utility/serialization/scene/common.js.map +1 -1
- package/dist/utility/serialization/scene/foliage.js +821 -0
- package/dist/utility/serialization/scene/foliage.js.map +1 -0
- package/dist/utility/serialization/scene/hair.js +11 -4
- package/dist/utility/serialization/scene/hair.js.map +1 -1
- package/dist/utility/serialization/scene/light.js +115 -7
- package/dist/utility/serialization/scene/light.js.map +1 -1
- package/dist/utility/serialization/scene/material.js +388 -220
- package/dist/utility/serialization/scene/material.js.map +1 -1
- package/dist/utility/serialization/scene/mesh.js +69 -4
- package/dist/utility/serialization/scene/mesh.js.map +1 -1
- package/dist/utility/serialization/scene/node.js +140 -5
- package/dist/utility/serialization/scene/node.js.map +1 -1
- package/dist/utility/serialization/scene/node_physics.js +1318 -0
- package/dist/utility/serialization/scene/node_physics.js.map +1 -0
- package/dist/utility/serialization/scene/particle.js +11 -4
- package/dist/utility/serialization/scene/particle.js.map +1 -1
- package/dist/utility/serialization/scene/physics.js +120 -0
- package/dist/utility/serialization/scene/physics.js.map +1 -0
- package/dist/utility/serialization/scene/primitive.js +124 -10
- package/dist/utility/serialization/scene/primitive.js.map +1 -1
- package/dist/utility/serialization/scene/scene.js +1687 -51
- package/dist/utility/serialization/scene/scene.js.map +1 -1
- package/dist/utility/serialization/scene/sprite.js +11 -4
- package/dist/utility/serialization/scene/sprite.js.map +1 -1
- package/dist/utility/serialization/scene/terrain.js +163 -33
- package/dist/utility/serialization/scene/terrain.js.map +1 -1
- package/dist/utility/serialization/scene/text.js +11 -4
- package/dist/utility/serialization/scene/text.js.map +1 -1
- package/dist/utility/serialization/scene/water.js +2473 -114
- package/dist/utility/serialization/scene/water.js.map +1 -1
- package/dist/utility/serialization/types.js.map +1 -1
- package/dist/utility/shprojector.js +97 -109
- package/dist/utility/shprojector.js.map +1 -1
- package/dist/utility/textures/foam.js +170 -0
- package/dist/utility/textures/foam.js.map +1 -0
- package/dist/utility/textures/ggxlut.js +17 -43
- package/dist/utility/textures/ggxlut.js.map +1 -1
- package/dist/utility/textures/ltcdata.js +4 -4
- package/dist/utility/textures/ltcdata.js.map +1 -1
- package/dist/utility/textures/ltclut.js +16 -6
- package/dist/utility/textures/ltclut.js.map +1 -1
- package/dist/utility/unsupported.js +24 -0
- package/dist/utility/unsupported.js.map +1 -0
- package/dist/values.js +13 -1
- package/dist/values.js.map +1 -1
- package/package.json +25 -12
- package/src/asset/loaders/ktx2/basis/LICENSE +201 -0
- package/src/asset/loaders/ktx2/basis/basis_transcoder.js +2 -0
- package/src/asset/loaders/ktx2/basis/basis_transcoder.wasm +0 -0
- package/src/asset/meshoptimizer/LICENSE +21 -0
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
import { PBPrimitiveType } from '@zephyr3d/device';
|
|
2
|
+
|
|
3
|
+
function scalarByteSize(type) {
|
|
4
|
+
switch(type){
|
|
5
|
+
case PBPrimitiveType.I16:
|
|
6
|
+
case PBPrimitiveType.I16_NORM:
|
|
7
|
+
case PBPrimitiveType.U16:
|
|
8
|
+
case PBPrimitiveType.U16_NORM:
|
|
9
|
+
case PBPrimitiveType.F16:
|
|
10
|
+
return 2;
|
|
11
|
+
case PBPrimitiveType.I32:
|
|
12
|
+
case PBPrimitiveType.I32_NORM:
|
|
13
|
+
case PBPrimitiveType.U32:
|
|
14
|
+
case PBPrimitiveType.U32_NORM:
|
|
15
|
+
case PBPrimitiveType.F32:
|
|
16
|
+
return 4;
|
|
17
|
+
default:
|
|
18
|
+
return 1;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
function readScalar(view, byteOffset, scalarType, normalized) {
|
|
22
|
+
switch(scalarType){
|
|
23
|
+
case PBPrimitiveType.I8:
|
|
24
|
+
case PBPrimitiveType.I8_NORM:
|
|
25
|
+
{
|
|
26
|
+
const value = view.getInt8(byteOffset);
|
|
27
|
+
return normalized ? Math.max(-1, value / 127) : value;
|
|
28
|
+
}
|
|
29
|
+
case PBPrimitiveType.U8:
|
|
30
|
+
case PBPrimitiveType.U8_NORM:
|
|
31
|
+
{
|
|
32
|
+
const value = view.getUint8(byteOffset);
|
|
33
|
+
return normalized ? value / 255 : value;
|
|
34
|
+
}
|
|
35
|
+
case PBPrimitiveType.I16:
|
|
36
|
+
case PBPrimitiveType.I16_NORM:
|
|
37
|
+
{
|
|
38
|
+
const value = view.getInt16(byteOffset, true);
|
|
39
|
+
return normalized ? Math.max(-1, value / 32767) : value;
|
|
40
|
+
}
|
|
41
|
+
case PBPrimitiveType.U16:
|
|
42
|
+
case PBPrimitiveType.U16_NORM:
|
|
43
|
+
{
|
|
44
|
+
const value = view.getUint16(byteOffset, true);
|
|
45
|
+
return normalized ? value / 65535 : value;
|
|
46
|
+
}
|
|
47
|
+
case PBPrimitiveType.I32:
|
|
48
|
+
case PBPrimitiveType.I32_NORM:
|
|
49
|
+
{
|
|
50
|
+
const value = view.getInt32(byteOffset, true);
|
|
51
|
+
return normalized ? Math.max(-1, value / 2147483647) : value;
|
|
52
|
+
}
|
|
53
|
+
case PBPrimitiveType.U32:
|
|
54
|
+
case PBPrimitiveType.U32_NORM:
|
|
55
|
+
{
|
|
56
|
+
const value = view.getUint32(byteOffset, true);
|
|
57
|
+
return normalized ? value / 4294967295 : value;
|
|
58
|
+
}
|
|
59
|
+
case PBPrimitiveType.F32:
|
|
60
|
+
return view.getFloat32(byteOffset, true);
|
|
61
|
+
default:
|
|
62
|
+
return 0;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Reads a vertex attribute of a primitive back from the GPU, as tightly packed
|
|
67
|
+
* floats: `componentCount` per vertex, for every vertex in the vertex buffer.
|
|
68
|
+
*
|
|
69
|
+
* @remarks
|
|
70
|
+
* Handles interleaved buffers and integer formats, normalized or not. Half
|
|
71
|
+
* float attributes are not supported and throw.
|
|
72
|
+
*
|
|
73
|
+
* @returns The data, or null if the primitive has no such attribute or it has
|
|
74
|
+
* fewer than `componentCount` components.
|
|
75
|
+
*
|
|
76
|
+
* @public
|
|
77
|
+
*/ async function readPrimitiveAttribute(primitive, semantic, componentCount) {
|
|
78
|
+
const info = primitive.getVertexBufferInfo(semantic);
|
|
79
|
+
if (!info || !info.type.isPrimitiveType() || info.type.cols < componentCount) {
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
const vertexCount = primitive.getNumVertices();
|
|
83
|
+
if (vertexCount <= 0) {
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
const bytes = await info.buffer.getBufferSubData();
|
|
87
|
+
const result = new Float32Array(vertexCount * componentCount);
|
|
88
|
+
const scalarType = info.type.scalarType;
|
|
89
|
+
const normalized = info.type.normalized;
|
|
90
|
+
const componentByteSize = scalarByteSize(scalarType);
|
|
91
|
+
const baseByteOffset = info.drawOffset + info.offset;
|
|
92
|
+
if (scalarType === PBPrimitiveType.F32 && !normalized && baseByteOffset % 4 === 0 && info.stride % 4 === 0) {
|
|
93
|
+
const raw = new Float32Array(bytes.buffer, bytes.byteOffset, bytes.byteLength >> 2);
|
|
94
|
+
const stride = info.stride >> 2;
|
|
95
|
+
const srcOffset = baseByteOffset >> 2;
|
|
96
|
+
for(let i = 0; i < vertexCount; i++){
|
|
97
|
+
const src = srcOffset + i * stride;
|
|
98
|
+
const dst = i * componentCount;
|
|
99
|
+
for(let c = 0; c < componentCount; c++){
|
|
100
|
+
result[dst + c] = raw[src + c];
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return result;
|
|
104
|
+
}
|
|
105
|
+
if (scalarType === PBPrimitiveType.F16) {
|
|
106
|
+
throw new Error(`Unsupported ${semantic} attribute format: half float`);
|
|
107
|
+
}
|
|
108
|
+
const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|
|
109
|
+
for(let i = 0; i < vertexCount; i++){
|
|
110
|
+
const src = baseByteOffset + i * info.stride;
|
|
111
|
+
const dst = i * componentCount;
|
|
112
|
+
for(let c = 0; c < componentCount; c++){
|
|
113
|
+
result[dst + c] = readScalar(view, src + c * componentByteSize, scalarType, normalized);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return result;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Reads a range of a triangle-list primitive's indices back from the GPU, as
|
|
120
|
+
* indices into its whole vertex buffer.
|
|
121
|
+
*
|
|
122
|
+
* @remarks
|
|
123
|
+
* The range defaults to what the primitive draws at full detail: its
|
|
124
|
+
* `indexStart` and `indexCount`, which for a primitive with LODs is LOD 0 only
|
|
125
|
+
* (the other levels are further ranges of the same index buffer). For a
|
|
126
|
+
* primitive without an index buffer the range is of vertices.
|
|
127
|
+
*
|
|
128
|
+
* @public
|
|
129
|
+
*/ async function readPrimitiveIndices(primitive, indexStart = primitive.indexStart, indexCount = primitive.indexCount) {
|
|
130
|
+
if (primitive.primitiveType !== 'triangle-list') {
|
|
131
|
+
throw new Error(`Only triangle-list primitives can be read as triangles, not ${primitive.primitiveType}`);
|
|
132
|
+
}
|
|
133
|
+
if (indexCount <= 0 || indexCount % 3 !== 0 || indexStart < 0) {
|
|
134
|
+
throw new Error(`Invalid triangle range: start ${indexStart}, count ${indexCount}`);
|
|
135
|
+
}
|
|
136
|
+
const indexBuffer = primitive.getIndexBuffer();
|
|
137
|
+
if (!indexBuffer) {
|
|
138
|
+
if (indexStart + indexCount > primitive.getNumVertices()) {
|
|
139
|
+
throw new Error(`Invalid triangle range: start ${indexStart}, count ${indexCount}`);
|
|
140
|
+
}
|
|
141
|
+
const indices = new Uint32Array(indexCount);
|
|
142
|
+
for(let i = 0; i < indexCount; i++){
|
|
143
|
+
indices[i] = indexStart + i;
|
|
144
|
+
}
|
|
145
|
+
return indices;
|
|
146
|
+
}
|
|
147
|
+
const bytes = await indexBuffer.getBufferSubData();
|
|
148
|
+
const is16 = indexBuffer.indexType.primitiveType === PBPrimitiveType.U16;
|
|
149
|
+
const all = is16 ? new Uint16Array(bytes.buffer, bytes.byteOffset, bytes.byteLength >> 1) : new Uint32Array(bytes.buffer, bytes.byteOffset, bytes.byteLength >> 2);
|
|
150
|
+
if (indexStart + indexCount > all.length) {
|
|
151
|
+
throw new Error(`Invalid triangle range: start ${indexStart}, count ${indexCount}`);
|
|
152
|
+
}
|
|
153
|
+
return Uint32Array.from(all.subarray(indexStart, indexStart + indexCount));
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Reads the triangles of one level of detail of a triangle-list primitive back
|
|
157
|
+
* from the GPU, keeping only the vertices they use.
|
|
158
|
+
*
|
|
159
|
+
* @param lod - Level of detail; 0 is full detail. Levels beyond the primitive's
|
|
160
|
+
* lowest detail use the lowest.
|
|
161
|
+
*
|
|
162
|
+
* @public
|
|
163
|
+
*/ async function readPrimitiveTriangles(primitive, lod = 0) {
|
|
164
|
+
const level = Math.min(Math.max(0, Math.floor(lod)), primitive.lods.length);
|
|
165
|
+
const [indexStart, indexCount] = level === 0 ? [
|
|
166
|
+
primitive.indexStart,
|
|
167
|
+
primitive.indexCount
|
|
168
|
+
] : [
|
|
169
|
+
primitive.lods[level - 1].indexStart,
|
|
170
|
+
primitive.lods[level - 1].indexCount
|
|
171
|
+
];
|
|
172
|
+
const [positions, indices] = await Promise.all([
|
|
173
|
+
readPrimitiveAttribute(primitive, 'position', 3),
|
|
174
|
+
readPrimitiveIndices(primitive, indexStart, indexCount)
|
|
175
|
+
]);
|
|
176
|
+
if (!positions) {
|
|
177
|
+
throw new Error('Primitive has no vertex positions');
|
|
178
|
+
}
|
|
179
|
+
// Other levels share the vertex buffer; keep only the vertices this one uses.
|
|
180
|
+
const vertexCount = positions.length / 3;
|
|
181
|
+
const remap = new Int32Array(vertexCount).fill(-1);
|
|
182
|
+
let used = 0;
|
|
183
|
+
for(let i = 0; i < indices.length; i++){
|
|
184
|
+
const v = indices[i];
|
|
185
|
+
if (v >= vertexCount) {
|
|
186
|
+
throw new Error(`Index ${v} out of range of ${vertexCount} vertices`);
|
|
187
|
+
}
|
|
188
|
+
if (remap[v] < 0) {
|
|
189
|
+
remap[v] = used++;
|
|
190
|
+
}
|
|
191
|
+
indices[i] = remap[v];
|
|
192
|
+
}
|
|
193
|
+
const compact = new Float32Array(used * 3);
|
|
194
|
+
for(let v = 0; v < vertexCount; v++){
|
|
195
|
+
const dst = remap[v];
|
|
196
|
+
if (dst >= 0) {
|
|
197
|
+
compact[dst * 3] = positions[v * 3];
|
|
198
|
+
compact[dst * 3 + 1] = positions[v * 3 + 1];
|
|
199
|
+
compact[dst * 3 + 2] = positions[v * 3 + 2];
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
return {
|
|
203
|
+
positions: compact,
|
|
204
|
+
indices
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
export { readPrimitiveAttribute, readPrimitiveIndices, readPrimitiveTriangles };
|
|
209
|
+
//# sourceMappingURL=primitive_readback.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"primitive_readback.js","sources":["../../src/render/primitive_readback.ts"],"sourcesContent":["import { PBPrimitiveType } from '@zephyr3d/device';\r\nimport type { Primitive } from './primitive';\r\n\r\n/**\r\n * Triangles read back from a primitive, with only the vertices they use.\r\n *\r\n * @public\r\n */\r\nexport interface PrimitiveTriangles {\r\n /** Vertex positions in the primitive's local space, xyz per vertex. */\r\n positions: Float32Array<ArrayBuffer>;\r\n /** Three indices into `positions` per triangle. */\r\n indices: Uint32Array<ArrayBuffer>;\r\n}\r\n\r\nfunction scalarByteSize(type: PBPrimitiveType) {\r\n switch (type) {\r\n case PBPrimitiveType.I16:\r\n case PBPrimitiveType.I16_NORM:\r\n case PBPrimitiveType.U16:\r\n case PBPrimitiveType.U16_NORM:\r\n case PBPrimitiveType.F16:\r\n return 2;\r\n case PBPrimitiveType.I32:\r\n case PBPrimitiveType.I32_NORM:\r\n case PBPrimitiveType.U32:\r\n case PBPrimitiveType.U32_NORM:\r\n case PBPrimitiveType.F32:\r\n return 4;\r\n default:\r\n return 1;\r\n }\r\n}\r\n\r\nfunction readScalar(view: DataView, byteOffset: number, scalarType: PBPrimitiveType, normalized: boolean) {\r\n switch (scalarType) {\r\n case PBPrimitiveType.I8:\r\n case PBPrimitiveType.I8_NORM: {\r\n const value = view.getInt8(byteOffset);\r\n return normalized ? Math.max(-1, value / 127) : value;\r\n }\r\n case PBPrimitiveType.U8:\r\n case PBPrimitiveType.U8_NORM: {\r\n const value = view.getUint8(byteOffset);\r\n return normalized ? value / 255 : value;\r\n }\r\n case PBPrimitiveType.I16:\r\n case PBPrimitiveType.I16_NORM: {\r\n const value = view.getInt16(byteOffset, true);\r\n return normalized ? Math.max(-1, value / 32767) : value;\r\n }\r\n case PBPrimitiveType.U16:\r\n case PBPrimitiveType.U16_NORM: {\r\n const value = view.getUint16(byteOffset, true);\r\n return normalized ? value / 65535 : value;\r\n }\r\n case PBPrimitiveType.I32:\r\n case PBPrimitiveType.I32_NORM: {\r\n const value = view.getInt32(byteOffset, true);\r\n return normalized ? Math.max(-1, value / 2147483647) : value;\r\n }\r\n case PBPrimitiveType.U32:\r\n case PBPrimitiveType.U32_NORM: {\r\n const value = view.getUint32(byteOffset, true);\r\n return normalized ? value / 4294967295 : value;\r\n }\r\n case PBPrimitiveType.F32:\r\n return view.getFloat32(byteOffset, true);\r\n default:\r\n return 0;\r\n }\r\n}\r\n\r\n/**\r\n * Reads a vertex attribute of a primitive back from the GPU, as tightly packed\r\n * floats: `componentCount` per vertex, for every vertex in the vertex buffer.\r\n *\r\n * @remarks\r\n * Handles interleaved buffers and integer formats, normalized or not. Half\r\n * float attributes are not supported and throw.\r\n *\r\n * @returns The data, or null if the primitive has no such attribute or it has\r\n * fewer than `componentCount` components.\r\n *\r\n * @public\r\n */\r\nexport async function readPrimitiveAttribute(\r\n primitive: Primitive,\r\n semantic: 'position' | 'normal' | 'blendIndices' | 'blendWeights',\r\n componentCount: number\r\n): Promise<Float32Array<ArrayBuffer> | null> {\r\n const info = primitive.getVertexBufferInfo(semantic);\r\n if (!info || !info.type.isPrimitiveType() || info.type.cols < componentCount) {\r\n return null;\r\n }\r\n const vertexCount = primitive.getNumVertices();\r\n if (vertexCount <= 0) {\r\n return null;\r\n }\r\n const bytes = await info.buffer.getBufferSubData();\r\n const result = new Float32Array(vertexCount * componentCount);\r\n const scalarType = info.type.scalarType;\r\n const normalized = info.type.normalized;\r\n const componentByteSize = scalarByteSize(scalarType);\r\n const baseByteOffset = info.drawOffset + info.offset;\r\n if (\r\n scalarType === PBPrimitiveType.F32 &&\r\n !normalized &&\r\n baseByteOffset % 4 === 0 &&\r\n info.stride % 4 === 0\r\n ) {\r\n const raw = new Float32Array(bytes.buffer, bytes.byteOffset, bytes.byteLength >> 2);\r\n const stride = info.stride >> 2;\r\n const srcOffset = baseByteOffset >> 2;\r\n for (let i = 0; i < vertexCount; i++) {\r\n const src = srcOffset + i * stride;\r\n const dst = i * componentCount;\r\n for (let c = 0; c < componentCount; c++) {\r\n result[dst + c] = raw[src + c];\r\n }\r\n }\r\n return result;\r\n }\r\n if (scalarType === PBPrimitiveType.F16) {\r\n throw new Error(`Unsupported ${semantic} attribute format: half float`);\r\n }\r\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\r\n for (let i = 0; i < vertexCount; i++) {\r\n const src = baseByteOffset + i * info.stride;\r\n const dst = i * componentCount;\r\n for (let c = 0; c < componentCount; c++) {\r\n result[dst + c] = readScalar(view, src + c * componentByteSize, scalarType, normalized);\r\n }\r\n }\r\n return result;\r\n}\r\n\r\n/**\r\n * Reads a range of a triangle-list primitive's indices back from the GPU, as\r\n * indices into its whole vertex buffer.\r\n *\r\n * @remarks\r\n * The range defaults to what the primitive draws at full detail: its\r\n * `indexStart` and `indexCount`, which for a primitive with LODs is LOD 0 only\r\n * (the other levels are further ranges of the same index buffer). For a\r\n * primitive without an index buffer the range is of vertices.\r\n *\r\n * @public\r\n */\r\nexport async function readPrimitiveIndices(\r\n primitive: Primitive,\r\n indexStart = primitive.indexStart,\r\n indexCount = primitive.indexCount\r\n): Promise<Uint32Array<ArrayBuffer>> {\r\n if (primitive.primitiveType !== 'triangle-list') {\r\n throw new Error(`Only triangle-list primitives can be read as triangles, not ${primitive.primitiveType}`);\r\n }\r\n if (indexCount <= 0 || indexCount % 3 !== 0 || indexStart < 0) {\r\n throw new Error(`Invalid triangle range: start ${indexStart}, count ${indexCount}`);\r\n }\r\n const indexBuffer = primitive.getIndexBuffer();\r\n if (!indexBuffer) {\r\n if (indexStart + indexCount > primitive.getNumVertices()) {\r\n throw new Error(`Invalid triangle range: start ${indexStart}, count ${indexCount}`);\r\n }\r\n const indices = new Uint32Array(indexCount);\r\n for (let i = 0; i < indexCount; i++) {\r\n indices[i] = indexStart + i;\r\n }\r\n return indices;\r\n }\r\n const bytes = await indexBuffer.getBufferSubData();\r\n const is16 = indexBuffer.indexType.primitiveType === PBPrimitiveType.U16;\r\n const all = is16\r\n ? new Uint16Array(bytes.buffer, bytes.byteOffset, bytes.byteLength >> 1)\r\n : new Uint32Array(bytes.buffer, bytes.byteOffset, bytes.byteLength >> 2);\r\n if (indexStart + indexCount > all.length) {\r\n throw new Error(`Invalid triangle range: start ${indexStart}, count ${indexCount}`);\r\n }\r\n return Uint32Array.from(all.subarray(indexStart, indexStart + indexCount));\r\n}\r\n\r\n/**\r\n * Reads the triangles of one level of detail of a triangle-list primitive back\r\n * from the GPU, keeping only the vertices they use.\r\n *\r\n * @param lod - Level of detail; 0 is full detail. Levels beyond the primitive's\r\n * lowest detail use the lowest.\r\n *\r\n * @public\r\n */\r\nexport async function readPrimitiveTriangles(primitive: Primitive, lod = 0): Promise<PrimitiveTriangles> {\r\n const level = Math.min(Math.max(0, Math.floor(lod)), primitive.lods.length);\r\n const [indexStart, indexCount] =\r\n level === 0\r\n ? [primitive.indexStart, primitive.indexCount]\r\n : [primitive.lods[level - 1].indexStart, primitive.lods[level - 1].indexCount];\r\n const [positions, indices] = await Promise.all([\r\n readPrimitiveAttribute(primitive, 'position', 3),\r\n readPrimitiveIndices(primitive, indexStart, indexCount)\r\n ]);\r\n if (!positions) {\r\n throw new Error('Primitive has no vertex positions');\r\n }\r\n // Other levels share the vertex buffer; keep only the vertices this one uses.\r\n const vertexCount = positions.length / 3;\r\n const remap = new Int32Array(vertexCount).fill(-1);\r\n let used = 0;\r\n for (let i = 0; i < indices.length; i++) {\r\n const v = indices[i];\r\n if (v >= vertexCount) {\r\n throw new Error(`Index ${v} out of range of ${vertexCount} vertices`);\r\n }\r\n if (remap[v] < 0) {\r\n remap[v] = used++;\r\n }\r\n indices[i] = remap[v];\r\n }\r\n const compact = new Float32Array(used * 3);\r\n for (let v = 0; v < vertexCount; v++) {\r\n const dst = remap[v];\r\n if (dst >= 0) {\r\n compact[dst * 3] = positions[v * 3];\r\n compact[dst * 3 + 1] = positions[v * 3 + 1];\r\n compact[dst * 3 + 2] = positions[v * 3 + 2];\r\n }\r\n }\r\n return { positions: compact, indices };\r\n}\r\n"],"names":["scalarByteSize","type","PBPrimitiveType","I16","I16_NORM","U16","U16_NORM","F16","I32","I32_NORM","U32","U32_NORM","F32","readScalar","view","byteOffset","scalarType","normalized","I8","I8_NORM","value","getInt8","Math","max","U8","U8_NORM","getUint8","getInt16","getUint16","getInt32","getUint32","getFloat32","readPrimitiveAttribute","primitive","semantic","componentCount","info","getVertexBufferInfo","isPrimitiveType","cols","vertexCount","getNumVertices","bytes","buffer","getBufferSubData","result","Float32Array","componentByteSize","baseByteOffset","drawOffset","offset","stride","raw","byteLength","srcOffset","i","src","dst","c","Error","DataView","readPrimitiveIndices","indexStart","indexCount","primitiveType","indexBuffer","getIndexBuffer","indices","Uint32Array","is16","indexType","all","Uint16Array","length","from","subarray","readPrimitiveTriangles","lod","level","min","floor","lods","positions","Promise","remap","Int32Array","fill","used","v","compact"],"mappings":"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"}
|
|
@@ -5,13 +5,14 @@ import { ShaderHelper } from '../material/shader/helper.js';
|
|
|
5
5
|
import '../material/lambert.js';
|
|
6
6
|
import '../material/blinn.js';
|
|
7
7
|
import '../material/unlit.js';
|
|
8
|
+
import '../material/meshmaterial.js';
|
|
8
9
|
import '../material/particle.js';
|
|
9
10
|
import '../material/subsurfaceprofile.js';
|
|
10
|
-
import '../material/
|
|
11
|
+
import '../material/sssprofile.js';
|
|
12
|
+
import '../material/sss.js';
|
|
11
13
|
import '../material/eye.js';
|
|
12
14
|
import { RenderBundleWrapper } from './renderbundle_wrapper.js';
|
|
13
15
|
import { getDevice } from '../app/api.js';
|
|
14
|
-
import '../material/meshmaterial.js';
|
|
15
16
|
import '../material/hair.js';
|
|
16
17
|
import '../material/hairstrand.js';
|
|
17
18
|
import '../material/grassmaterial.js';
|
|
@@ -23,6 +24,7 @@ import '../material/pbrblueprint.js';
|
|
|
23
24
|
import '../material/sprite.js';
|
|
24
25
|
import '../material/sprite_std.js';
|
|
25
26
|
import '../utility/blueprint/material/texture.js';
|
|
27
|
+
import { InstanceCuller } from './instance_culling.js';
|
|
26
28
|
|
|
27
29
|
const maxBufferSizeInFloats = 65536 / 4;
|
|
28
30
|
/**
|
|
@@ -100,18 +102,34 @@ const tmpDrawablePos = new Vector3();
|
|
|
100
102
|
/** @internal */ _sunLight;
|
|
101
103
|
/** @internal */ _primaryDirectionalLight;
|
|
102
104
|
/** @internal */ _primaryTransmissionLight;
|
|
105
|
+
/**
|
|
106
|
+
* Visible water surfaces, in visit order.
|
|
107
|
+
*
|
|
108
|
+
* Collected separately from the item lists so passes that run before the light
|
|
109
|
+
* pass - the caustics pass, which has to know where the water plane is before
|
|
110
|
+
* anything shades under it - can find them without walking every draw item.
|
|
111
|
+
* @internal
|
|
112
|
+
*/ _waterList;
|
|
103
113
|
/** @internal */ _bindGroupAllocator;
|
|
104
114
|
/** @internal */ _ref;
|
|
105
115
|
/** @internal */ _instanceInfo;
|
|
106
116
|
/** @internal */ _needSceneColor;
|
|
107
117
|
_needSceneDepth;
|
|
118
|
+
_needHiZNearest;
|
|
108
119
|
_needSceneColorWithDepth;
|
|
109
120
|
/** @internal */ _drawTransparent;
|
|
110
121
|
/** @internal */ _objectColorMaps;
|
|
122
|
+
/** @internal */ _cullCamera;
|
|
123
|
+
/** @internal */ _lodCamera;
|
|
124
|
+
/** @internal Culls the instances of the batches on the GPU, see InstanceCuller */ _instanceCuller;
|
|
125
|
+
/** @internal Queues pushed into this one, which may cull their instances for its view */ _childQueues;
|
|
111
126
|
/**
|
|
112
127
|
* Creates an instance of a render queue
|
|
113
128
|
* @param renderPass - The render pass to which the render queue belongs
|
|
114
|
-
|
|
129
|
+
* @param bindGroupAllocator - Allocator of instance data, default the shared one
|
|
130
|
+
* @param instanceCulling - Whether the instances of the batches are frustum culled on the GPU
|
|
131
|
+
* for each view the queue is pushed to, where supported. For queues built once and replayed
|
|
132
|
+
*/ constructor(renderPass, bindGroupAllocator, instanceCulling){
|
|
115
133
|
super();
|
|
116
134
|
this._bindGroupAllocator = bindGroupAllocator ?? defaultInstanceBindGroupAlloator;
|
|
117
135
|
this._itemList = null;
|
|
@@ -121,6 +139,7 @@ const tmpDrawablePos = new Vector3();
|
|
|
121
139
|
this._sunLight = null;
|
|
122
140
|
this._primaryDirectionalLight = null;
|
|
123
141
|
this._primaryTransmissionLight = null;
|
|
142
|
+
this._waterList = [];
|
|
124
143
|
this._ref = {
|
|
125
144
|
ref: this,
|
|
126
145
|
valid: true
|
|
@@ -128,11 +147,56 @@ const tmpDrawablePos = new Vector3();
|
|
|
128
147
|
this._instanceInfo = new Map();
|
|
129
148
|
this._needSceneColor = false;
|
|
130
149
|
this._needSceneDepth = false;
|
|
150
|
+
this._needHiZNearest = false;
|
|
131
151
|
this._needSceneColorWithDepth = false;
|
|
132
152
|
this._drawTransparent = false;
|
|
133
153
|
this._objectColorMaps = [
|
|
134
154
|
new Map()
|
|
135
155
|
];
|
|
156
|
+
this._cullCamera = null;
|
|
157
|
+
this._lodCamera = null;
|
|
158
|
+
this._instanceCuller = instanceCulling && InstanceCuller.isSupported() ? new InstanceCuller() : null;
|
|
159
|
+
this._childQueues = [];
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Cull the instances of the queues pushed into this one for its view, before drawing it.
|
|
163
|
+
*
|
|
164
|
+
* @internal
|
|
165
|
+
*/ cullInstances() {
|
|
166
|
+
for (const child of this._childQueues){
|
|
167
|
+
child._instanceCuller?.cull(this);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Have the bounds of a batched drawable updated for GPU instance culling.
|
|
172
|
+
*
|
|
173
|
+
* @internal
|
|
174
|
+
*/ markInstanceBoundsDirty(drawable) {
|
|
175
|
+
this._instanceCuller?.markBoundsDirty(drawable);
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* The camera this queue was culled with, set by {@link RenderQueue.end}.
|
|
179
|
+
*
|
|
180
|
+
* Differs from the draw context camera in shadow passes, which cull from the light. Drawables
|
|
181
|
+
* that cull their own sub-parts (clipmap terrain tiles) need it to keep only what the pass
|
|
182
|
+
* can see.
|
|
183
|
+
* @internal
|
|
184
|
+
*/ get cullCamera() {
|
|
185
|
+
return this._cullCamera;
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* The camera whose view selects the levels of detail, set by {@link RenderQueue.end}: the main
|
|
189
|
+
* camera in shadow passes, where it differs from the cull camera.
|
|
190
|
+
* @internal
|
|
191
|
+
*/ get lodCamera() {
|
|
192
|
+
return this._lodCamera;
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Whether the instances of the batches are culled on the GPU, which then also selects the
|
|
196
|
+
* levels of detail where the device allows
|
|
197
|
+
* @internal
|
|
198
|
+
*/ get culledOnGpu() {
|
|
199
|
+
return !!this._instanceCuller;
|
|
136
200
|
}
|
|
137
201
|
/** The sun light */ get sunLight() {
|
|
138
202
|
return this._sunLight;
|
|
@@ -168,6 +232,17 @@ const tmpDrawablePos = new Vector3();
|
|
|
168
232
|
/** @internal */ needSceneDepth() {
|
|
169
233
|
return this._needSceneDepth;
|
|
170
234
|
}
|
|
235
|
+
/**
|
|
236
|
+
* Whether any drawable needs the Hi-Z pyramid's nearest-depth channel.
|
|
237
|
+
*
|
|
238
|
+
* Materials request it the way they request the scene colour and depth, which
|
|
239
|
+
* is what lets a surface that queries the scene's proximity - water foam
|
|
240
|
+
* against a shoreline or a piling - turn the second channel on without the
|
|
241
|
+
* application having to know it exists.
|
|
242
|
+
* @internal
|
|
243
|
+
*/ needHiZNearest() {
|
|
244
|
+
return this._needHiZNearest;
|
|
245
|
+
}
|
|
171
246
|
/** @internal */ needSceneColorWithDepth() {
|
|
172
247
|
return this._needSceneColorWithDepth;
|
|
173
248
|
}
|
|
@@ -187,6 +262,15 @@ const tmpDrawablePos = new Vector3();
|
|
|
187
262
|
*/ get shadowedLights() {
|
|
188
263
|
return this._shadowedLightList;
|
|
189
264
|
}
|
|
265
|
+
/** Visible water surfaces collected while culling. */ get waters() {
|
|
266
|
+
return this._waterList;
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Record a visible water surface.
|
|
270
|
+
* @param water - The water node that passed culling.
|
|
271
|
+
*/ pushWater(water) {
|
|
272
|
+
this._waterList.push(water);
|
|
273
|
+
}
|
|
190
274
|
/**
|
|
191
275
|
* Gets the unshadowed lights
|
|
192
276
|
*/ get unshadowedLights() {
|
|
@@ -236,6 +320,10 @@ const tmpDrawablePos = new Vector3();
|
|
|
236
320
|
* Push items from another render queue
|
|
237
321
|
* @param queue - The render queue to be pushed
|
|
238
322
|
*/ pushRenderQueue(queue) {
|
|
323
|
+
if (queue._instanceCuller) {
|
|
324
|
+
this._childQueues.push(queue);
|
|
325
|
+
}
|
|
326
|
+
this._waterList.push(...queue._waterList);
|
|
239
327
|
const newItemLists = queue._itemList;
|
|
240
328
|
if (!newItemLists) {
|
|
241
329
|
return;
|
|
@@ -253,6 +341,7 @@ const tmpDrawablePos = new Vector3();
|
|
|
253
341
|
this._itemList.transmission_trans.unlit.push(...newItemLists.transmission_trans.unlit);
|
|
254
342
|
this._needSceneColor ||= queue._needSceneColor;
|
|
255
343
|
this._needSceneDepth ||= queue._needSceneDepth;
|
|
344
|
+
this._needHiZNearest ||= queue._needHiZNearest;
|
|
256
345
|
this._needSceneColorWithDepth ||= queue._needSceneColorWithDepth;
|
|
257
346
|
this._drawTransparent ||= queue._drawTransparent;
|
|
258
347
|
this._sunLight ||= queue._sunLight;
|
|
@@ -268,7 +357,8 @@ const tmpDrawablePos = new Vector3();
|
|
|
268
357
|
* Push an item to the render queue
|
|
269
358
|
* @param camera - The camera for drawing the item
|
|
270
359
|
* @param drawable - The object to be drawn
|
|
271
|
-
|
|
360
|
+
* @param lod - Level of detail to draw the drawable's primitive at, default 0
|
|
361
|
+
*/ push(camera, drawable, lod = 0) {
|
|
272
362
|
if (drawable) {
|
|
273
363
|
drawable.pushRenderQueueRef(this._ref);
|
|
274
364
|
if (!this._itemList) {
|
|
@@ -281,19 +371,30 @@ const tmpDrawablePos = new Vector3();
|
|
|
281
371
|
const transmission = !!drawable.needSceneColor() || needDepth;
|
|
282
372
|
this._needSceneColor ||= transmission;
|
|
283
373
|
this._needSceneDepth ||= drawable.needSceneDepth();
|
|
374
|
+
this._needHiZNearest ||= !!drawable.needHiZNearest?.();
|
|
284
375
|
this._needSceneColorWithDepth ||= transmission && needDepth;
|
|
285
376
|
this._drawTransparent ||= trans;
|
|
286
377
|
if (camera.getPickResultResolveFunc()) {
|
|
287
378
|
drawable.getMaterial().objectColor = drawable.getObjectColor();
|
|
288
379
|
this._objectColorMaps[0].set(drawable.getDrawableId(), drawable);
|
|
289
380
|
}
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
381
|
+
// Meshes colored by level of detail draw with another material than the one whose instance
|
|
382
|
+
// data a batch would hold
|
|
383
|
+
if (drawable.isBatchable() && !camera.lodColoration) {
|
|
384
|
+
const info = trans ? transmission ? unlit ? this._itemList.transmission_trans.unlit[0] : this._itemList.transmission_trans.lit[0] : unlit ? this._itemList.transparent.unlit[0] : this._itemList.transparent.lit[0] : transmission ? unlit ? this._itemList.transmission.unlit[0] : this._itemList.transmission.lit[0] : unlit ? this._itemList.opaque.unlit[0] : this._itemList.opaque.lit[0];
|
|
385
|
+
const instanceList = info.instanceList;
|
|
386
|
+
// Levels of detail of one primitive draw different index ranges, each its own batch,
|
|
387
|
+
// unless GPU culling selects the level of every instance of the batch
|
|
388
|
+
if (this._instanceCuller && InstanceCuller.selectsLod(drawable)) {
|
|
389
|
+
lod = 0;
|
|
390
|
+
}
|
|
391
|
+
const id = drawable.getInstanceId(this._renderPass);
|
|
392
|
+
const hash = lod > 0 ? `${id}:lod${lod}` : id;
|
|
293
393
|
let drawableList = instanceList[hash];
|
|
294
394
|
if (!drawableList) {
|
|
295
395
|
drawableList = [];
|
|
296
396
|
instanceList[hash] = drawableList;
|
|
397
|
+
info.instanceLods[hash] = lod;
|
|
297
398
|
}
|
|
298
399
|
drawableList.push(drawable);
|
|
299
400
|
} else {
|
|
@@ -313,7 +414,8 @@ const tmpDrawablePos = new Vector3();
|
|
|
313
414
|
this.binaryInsert(queue, {
|
|
314
415
|
drawable,
|
|
315
416
|
sortDistance: drawable.getSortDistance(camera),
|
|
316
|
-
instanceData: null
|
|
417
|
+
instanceData: null,
|
|
418
|
+
lod
|
|
317
419
|
});
|
|
318
420
|
if (material) {
|
|
319
421
|
list.materialList.add(material.coreMaterial);
|
|
@@ -322,6 +424,55 @@ const tmpDrawablePos = new Vector3();
|
|
|
322
424
|
}
|
|
323
425
|
}
|
|
324
426
|
}
|
|
427
|
+
/**
|
|
428
|
+
* Give every drawable of the queue its object color and register it for GPU picking.
|
|
429
|
+
*
|
|
430
|
+
* @remarks
|
|
431
|
+
* {@link push} does this for queues culled in a frame that picks. A queue built once and kept
|
|
432
|
+
* across frames (BatchGroup) was usually built in a frame that did not, so it is done again
|
|
433
|
+
* whenever a frame picks.
|
|
434
|
+
*
|
|
435
|
+
* @internal
|
|
436
|
+
*/ registerObjectColors() {
|
|
437
|
+
const map = this._objectColorMaps[0];
|
|
438
|
+
const register = (drawable)=>{
|
|
439
|
+
const material = drawable.getMaterial();
|
|
440
|
+
if (material) {
|
|
441
|
+
material.objectColor = drawable.getObjectColor();
|
|
442
|
+
}
|
|
443
|
+
map.set(drawable.getDrawableId(), drawable);
|
|
444
|
+
};
|
|
445
|
+
for (const drawable of this._instanceInfo.keys()){
|
|
446
|
+
register(drawable);
|
|
447
|
+
}
|
|
448
|
+
const itemList = this._itemList;
|
|
449
|
+
if (itemList) {
|
|
450
|
+
for (const bundle of [
|
|
451
|
+
itemList.opaque,
|
|
452
|
+
itemList.transmission,
|
|
453
|
+
itemList.transparent,
|
|
454
|
+
itemList.transmission_trans
|
|
455
|
+
]){
|
|
456
|
+
for (const info of [
|
|
457
|
+
...bundle.lit,
|
|
458
|
+
...bundle.unlit
|
|
459
|
+
]){
|
|
460
|
+
if (info.renderQueue === this) {
|
|
461
|
+
for (const list of [
|
|
462
|
+
info.itemList,
|
|
463
|
+
info.skinItemList,
|
|
464
|
+
info.morphItemList,
|
|
465
|
+
info.skinAndMorphItemList
|
|
466
|
+
]){
|
|
467
|
+
for (const item of list){
|
|
468
|
+
register(item.drawable);
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
}
|
|
325
476
|
/** @internal */ getDrawableByColor(c, map) {
|
|
326
477
|
const id = (c[0] << 24) + (c[1] << 16) + (c[2] << 8) + c[3];
|
|
327
478
|
map = map ?? this._objectColorMaps;
|
|
@@ -366,6 +517,9 @@ const tmpDrawablePos = new Vector3();
|
|
|
366
517
|
if (info.instanceRenderBundle) {
|
|
367
518
|
info.instanceRenderBundle.dispose();
|
|
368
519
|
}
|
|
520
|
+
if (info.skinInstanceRenderBundle) {
|
|
521
|
+
info.skinInstanceRenderBundle.dispose();
|
|
522
|
+
}
|
|
369
523
|
}
|
|
370
524
|
}
|
|
371
525
|
}
|
|
@@ -378,6 +532,7 @@ const tmpDrawablePos = new Vector3();
|
|
|
378
532
|
valid: true
|
|
379
533
|
};
|
|
380
534
|
this._instanceInfo.clear();
|
|
535
|
+
this._childQueues.length = 0;
|
|
381
536
|
this._objectColorMaps.length = 0;
|
|
382
537
|
this._objectColorMaps.push(new Map());
|
|
383
538
|
this._shadowedLightList = [];
|
|
@@ -385,12 +540,22 @@ const tmpDrawablePos = new Vector3();
|
|
|
385
540
|
this._sunLight = null;
|
|
386
541
|
this._primaryDirectionalLight = null;
|
|
387
542
|
this._primaryTransmissionLight = null;
|
|
543
|
+
this._waterList = [];
|
|
388
544
|
this._needSceneColor = false;
|
|
389
545
|
this._needSceneDepth = false;
|
|
546
|
+
this._needHiZNearest = false;
|
|
390
547
|
this._needSceneColorWithDepth = false;
|
|
391
548
|
this._drawTransparent = false;
|
|
392
549
|
}
|
|
393
|
-
/**
|
|
550
|
+
/**
|
|
551
|
+
* Finish the queue after pushing its items.
|
|
552
|
+
* @param camera - The camera the queue was culled with
|
|
553
|
+
* @param createRenderBundles - Whether the batches are recorded into render bundles
|
|
554
|
+
* @param lodCamera - The camera whose view selected the levels of detail, the culling camera by default
|
|
555
|
+
* @internal
|
|
556
|
+
*/ end(camera, createRenderBundles, lodCamera) {
|
|
557
|
+
this._cullCamera = camera;
|
|
558
|
+
this._lodCamera = lodCamera ?? camera;
|
|
394
559
|
const frameCounter = getDevice().frameInfo.frameCounter;
|
|
395
560
|
const itemList = this._itemList;
|
|
396
561
|
if (!this.itemList) {
|
|
@@ -432,9 +597,10 @@ const tmpDrawablePos = new Vector3();
|
|
|
432
597
|
offset: bindGroup.offset,
|
|
433
598
|
numInstances: 0,
|
|
434
599
|
stride
|
|
435
|
-
}
|
|
600
|
+
},
|
|
601
|
+
lod: info.instanceLods[x] ?? 0
|
|
436
602
|
};
|
|
437
|
-
this.binaryInsert(info.instanceItemList, item);
|
|
603
|
+
this.binaryInsert(drawable.getBoneMatrices() ? info.skinInstanceItemList : info.instanceItemList, item);
|
|
438
604
|
drawable.applyInstanceOffsetAndStride(this, stride, bindGroup.offset);
|
|
439
605
|
}
|
|
440
606
|
const instanceInfo = {
|
|
@@ -453,6 +619,7 @@ const tmpDrawablePos = new Vector3();
|
|
|
453
619
|
}
|
|
454
620
|
}
|
|
455
621
|
info.instanceList = {};
|
|
622
|
+
info.instanceLods = {};
|
|
456
623
|
if (createRenderBundles) {
|
|
457
624
|
if (info.itemList.length > 0) {
|
|
458
625
|
info.renderBundle = new RenderBundleWrapper();
|
|
@@ -469,8 +636,22 @@ const tmpDrawablePos = new Vector3();
|
|
|
469
636
|
if (info.instanceItemList.length > 0) {
|
|
470
637
|
info.instanceRenderBundle = new RenderBundleWrapper();
|
|
471
638
|
}
|
|
639
|
+
if (info.skinInstanceItemList.length > 0) {
|
|
640
|
+
info.skinInstanceRenderBundle = new RenderBundleWrapper();
|
|
641
|
+
}
|
|
642
|
+
}
|
|
643
|
+
}
|
|
644
|
+
}
|
|
645
|
+
if (this._instanceCuller) {
|
|
646
|
+
const items = [];
|
|
647
|
+
for (const list of lists){
|
|
648
|
+
for (const info of list){
|
|
649
|
+
if (info.renderQueue === this) {
|
|
650
|
+
items.push(...info.instanceItemList, ...info.skinInstanceItemList);
|
|
651
|
+
}
|
|
472
652
|
}
|
|
473
653
|
}
|
|
654
|
+
this._instanceCuller.rebuild(items, this._instanceInfo);
|
|
474
655
|
}
|
|
475
656
|
return this;
|
|
476
657
|
}
|
|
@@ -510,6 +691,10 @@ const tmpDrawablePos = new Vector3();
|
|
|
510
691
|
super.onDispose();
|
|
511
692
|
this.reset();
|
|
512
693
|
this._ref.valid = false;
|
|
694
|
+
this._cullCamera = null;
|
|
695
|
+
this._lodCamera = null;
|
|
696
|
+
this._instanceCuller?.dispose();
|
|
697
|
+
this._instanceCuller = null;
|
|
513
698
|
}
|
|
514
699
|
drawableDistanceToCamera(drawable, cameraPos) {
|
|
515
700
|
const drawablePos = drawable.getNode().getWorldPosition(tmpDrawablePos);
|
|
@@ -522,8 +707,10 @@ const tmpDrawablePos = new Vector3();
|
|
|
522
707
|
morphItemList: [],
|
|
523
708
|
skinAndMorphItemList: [],
|
|
524
709
|
instanceItemList: [],
|
|
710
|
+
skinInstanceItemList: [],
|
|
525
711
|
materialList: new Set(),
|
|
526
712
|
instanceList: {},
|
|
713
|
+
instanceLods: {},
|
|
527
714
|
renderQueue: this
|
|
528
715
|
};
|
|
529
716
|
}
|