@zephyr3d/scene 0.9.27 → 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 +54 -0
- 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 +279 -55
- 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 +171 -1
- 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 +104 -178
- 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 +25436 -15990
- package/dist/index.js +65 -11
- 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/lambert.js +4 -1
- package/dist/material/lambert.js.map +1 -1
- package/dist/material/material.js +66 -4
- 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 +191 -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 +333 -191
- 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 +1261 -1438
- 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 +106 -106
- package/dist/posteffect/motionblur.js.map +1 -1
- package/dist/posteffect/postsss.js +572 -0
- package/dist/posteffect/postsss.js.map +1 -0
- package/dist/posteffect/sao.js +2 -6
- 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 +4 -13
- 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 +3 -2
- package/dist/render/abuffer_oit.js.map +1 -1
- package/dist/render/clipmap.js +179 -64
- 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 +25 -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 +5 -5
- 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 +5 -10
- package/dist/render/fbm_wavegenerator.js.map +1 -1
- package/dist/render/fft_wavegenerator.js +247 -157
- package/dist/render/fft_wavegenerator.js.map +1 -1
- package/dist/render/gerstner_wavegenerator.js +16 -38
- 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/instance_culling.js +499 -0
- package/dist/render/instance_culling.js.map +1 -0
- package/dist/render/lightpass.js +19 -8
- 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/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 +162 -11
- package/dist/render/render_queue.js.map +1 -1
- package/dist/render/renderer.js +10 -7
- package/dist/render/renderer.js.map +1 -1
- package/dist/render/rendergraph/blackboard.js +14 -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 +272 -55
- package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
- package/dist/render/rendergraph/frame_graph_context.js +41 -0
- package/dist/render/rendergraph/frame_graph_context.js.map +1 -0
- 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 +58 -158
- package/dist/render/underwater.js.map +1 -1
- 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 +134 -319
- package/dist/render/water_caustics.js.map +1 -1
- 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 +3 -3
- 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 +633 -268
- 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/ssgi.js +63 -0
- package/dist/shaders/ssgi.js.map +1 -0
- package/dist/shaders/ssgi_reprojection.js +118 -0
- package/dist/shaders/ssgi_reprojection.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 +32 -82
- package/dist/shaders/water.js.map +1 -1
- package/dist/shaders/water_medium.js +7 -21
- package/dist/shaders/water_medium.js.map +1 -1
- 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 +40 -2
- 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 +34 -6
- package/dist/utility/serialization/manager.js.map +1 -1
- package/dist/utility/serialization/scene/animation.js +46 -5
- 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 +87 -254
- 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 +1543 -264
- package/dist/utility/serialization/scene/water.js.map +1 -1
- package/dist/utility/serialization/types.js.map +1 -1
- package/dist/utility/shprojector.js +10 -22
- 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
- package/dist/animation/joint_dynamics/convex_collider.js +0 -320
- package/dist/animation/joint_dynamics/convex_collider.js.map +0 -1
|
@@ -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
|
/**
|
|
@@ -117,10 +119,17 @@ const tmpDrawablePos = new Vector3();
|
|
|
117
119
|
_needSceneColorWithDepth;
|
|
118
120
|
/** @internal */ _drawTransparent;
|
|
119
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;
|
|
120
126
|
/**
|
|
121
127
|
* Creates an instance of a render queue
|
|
122
128
|
* @param renderPass - The render pass to which the render queue belongs
|
|
123
|
-
|
|
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){
|
|
124
133
|
super();
|
|
125
134
|
this._bindGroupAllocator = bindGroupAllocator ?? defaultInstanceBindGroupAlloator;
|
|
126
135
|
this._itemList = null;
|
|
@@ -144,6 +153,50 @@ const tmpDrawablePos = new Vector3();
|
|
|
144
153
|
this._objectColorMaps = [
|
|
145
154
|
new Map()
|
|
146
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;
|
|
147
200
|
}
|
|
148
201
|
/** The sun light */ get sunLight() {
|
|
149
202
|
return this._sunLight;
|
|
@@ -267,6 +320,9 @@ const tmpDrawablePos = new Vector3();
|
|
|
267
320
|
* Push items from another render queue
|
|
268
321
|
* @param queue - The render queue to be pushed
|
|
269
322
|
*/ pushRenderQueue(queue) {
|
|
323
|
+
if (queue._instanceCuller) {
|
|
324
|
+
this._childQueues.push(queue);
|
|
325
|
+
}
|
|
270
326
|
this._waterList.push(...queue._waterList);
|
|
271
327
|
const newItemLists = queue._itemList;
|
|
272
328
|
if (!newItemLists) {
|
|
@@ -301,7 +357,8 @@ const tmpDrawablePos = new Vector3();
|
|
|
301
357
|
* Push an item to the render queue
|
|
302
358
|
* @param camera - The camera for drawing the item
|
|
303
359
|
* @param drawable - The object to be drawn
|
|
304
|
-
|
|
360
|
+
* @param lod - Level of detail to draw the drawable's primitive at, default 0
|
|
361
|
+
*/ push(camera, drawable, lod = 0) {
|
|
305
362
|
if (drawable) {
|
|
306
363
|
drawable.pushRenderQueueRef(this._ref);
|
|
307
364
|
if (!this._itemList) {
|
|
@@ -321,13 +378,23 @@ const tmpDrawablePos = new Vector3();
|
|
|
321
378
|
drawable.getMaterial().objectColor = drawable.getObjectColor();
|
|
322
379
|
this._objectColorMaps[0].set(drawable.getDrawableId(), drawable);
|
|
323
380
|
}
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
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;
|
|
327
393
|
let drawableList = instanceList[hash];
|
|
328
394
|
if (!drawableList) {
|
|
329
395
|
drawableList = [];
|
|
330
396
|
instanceList[hash] = drawableList;
|
|
397
|
+
info.instanceLods[hash] = lod;
|
|
331
398
|
}
|
|
332
399
|
drawableList.push(drawable);
|
|
333
400
|
} else {
|
|
@@ -347,7 +414,8 @@ const tmpDrawablePos = new Vector3();
|
|
|
347
414
|
this.binaryInsert(queue, {
|
|
348
415
|
drawable,
|
|
349
416
|
sortDistance: drawable.getSortDistance(camera),
|
|
350
|
-
instanceData: null
|
|
417
|
+
instanceData: null,
|
|
418
|
+
lod
|
|
351
419
|
});
|
|
352
420
|
if (material) {
|
|
353
421
|
list.materialList.add(material.coreMaterial);
|
|
@@ -356,6 +424,55 @@ const tmpDrawablePos = new Vector3();
|
|
|
356
424
|
}
|
|
357
425
|
}
|
|
358
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
|
+
}
|
|
359
476
|
/** @internal */ getDrawableByColor(c, map) {
|
|
360
477
|
const id = (c[0] << 24) + (c[1] << 16) + (c[2] << 8) + c[3];
|
|
361
478
|
map = map ?? this._objectColorMaps;
|
|
@@ -400,6 +517,9 @@ const tmpDrawablePos = new Vector3();
|
|
|
400
517
|
if (info.instanceRenderBundle) {
|
|
401
518
|
info.instanceRenderBundle.dispose();
|
|
402
519
|
}
|
|
520
|
+
if (info.skinInstanceRenderBundle) {
|
|
521
|
+
info.skinInstanceRenderBundle.dispose();
|
|
522
|
+
}
|
|
403
523
|
}
|
|
404
524
|
}
|
|
405
525
|
}
|
|
@@ -412,6 +532,7 @@ const tmpDrawablePos = new Vector3();
|
|
|
412
532
|
valid: true
|
|
413
533
|
};
|
|
414
534
|
this._instanceInfo.clear();
|
|
535
|
+
this._childQueues.length = 0;
|
|
415
536
|
this._objectColorMaps.length = 0;
|
|
416
537
|
this._objectColorMaps.push(new Map());
|
|
417
538
|
this._shadowedLightList = [];
|
|
@@ -426,7 +547,15 @@ const tmpDrawablePos = new Vector3();
|
|
|
426
547
|
this._needSceneColorWithDepth = false;
|
|
427
548
|
this._drawTransparent = false;
|
|
428
549
|
}
|
|
429
|
-
/**
|
|
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;
|
|
430
559
|
const frameCounter = getDevice().frameInfo.frameCounter;
|
|
431
560
|
const itemList = this._itemList;
|
|
432
561
|
if (!this.itemList) {
|
|
@@ -468,9 +597,10 @@ const tmpDrawablePos = new Vector3();
|
|
|
468
597
|
offset: bindGroup.offset,
|
|
469
598
|
numInstances: 0,
|
|
470
599
|
stride
|
|
471
|
-
}
|
|
600
|
+
},
|
|
601
|
+
lod: info.instanceLods[x] ?? 0
|
|
472
602
|
};
|
|
473
|
-
this.binaryInsert(info.instanceItemList, item);
|
|
603
|
+
this.binaryInsert(drawable.getBoneMatrices() ? info.skinInstanceItemList : info.instanceItemList, item);
|
|
474
604
|
drawable.applyInstanceOffsetAndStride(this, stride, bindGroup.offset);
|
|
475
605
|
}
|
|
476
606
|
const instanceInfo = {
|
|
@@ -489,6 +619,7 @@ const tmpDrawablePos = new Vector3();
|
|
|
489
619
|
}
|
|
490
620
|
}
|
|
491
621
|
info.instanceList = {};
|
|
622
|
+
info.instanceLods = {};
|
|
492
623
|
if (createRenderBundles) {
|
|
493
624
|
if (info.itemList.length > 0) {
|
|
494
625
|
info.renderBundle = new RenderBundleWrapper();
|
|
@@ -505,8 +636,22 @@ const tmpDrawablePos = new Vector3();
|
|
|
505
636
|
if (info.instanceItemList.length > 0) {
|
|
506
637
|
info.instanceRenderBundle = new RenderBundleWrapper();
|
|
507
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
|
+
}
|
|
508
652
|
}
|
|
509
653
|
}
|
|
654
|
+
this._instanceCuller.rebuild(items, this._instanceInfo);
|
|
510
655
|
}
|
|
511
656
|
return this;
|
|
512
657
|
}
|
|
@@ -546,6 +691,10 @@ const tmpDrawablePos = new Vector3();
|
|
|
546
691
|
super.onDispose();
|
|
547
692
|
this.reset();
|
|
548
693
|
this._ref.valid = false;
|
|
694
|
+
this._cullCamera = null;
|
|
695
|
+
this._lodCamera = null;
|
|
696
|
+
this._instanceCuller?.dispose();
|
|
697
|
+
this._instanceCuller = null;
|
|
549
698
|
}
|
|
550
699
|
drawableDistanceToCamera(drawable, cameraPos) {
|
|
551
700
|
const drawablePos = drawable.getNode().getWorldPosition(tmpDrawablePos);
|
|
@@ -558,8 +707,10 @@ const tmpDrawablePos = new Vector3();
|
|
|
558
707
|
morphItemList: [],
|
|
559
708
|
skinAndMorphItemList: [],
|
|
560
709
|
instanceItemList: [],
|
|
710
|
+
skinInstanceItemList: [],
|
|
561
711
|
materialList: new Set(),
|
|
562
712
|
instanceList: {},
|
|
713
|
+
instanceLods: {},
|
|
563
714
|
renderQueue: this
|
|
564
715
|
};
|
|
565
716
|
}
|