@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
package/dist/render/primitive.js
CHANGED
|
@@ -1,8 +1,65 @@
|
|
|
1
|
-
import { makeObservable, Disposable, releaseObject, retainObject } from '@zephyr3d/base';
|
|
1
|
+
import { makeObservable, Disposable, releaseObject, retainObject, DEBUG_VIEWS } from '@zephyr3d/base';
|
|
2
2
|
import { PBPrimitiveType, matchVertexBuffer } from '@zephyr3d/device';
|
|
3
3
|
import { RenderBundleWrapper } from './renderbundle_wrapper.js';
|
|
4
4
|
import { getDevice } from '../app/api.js';
|
|
5
|
+
import { isWireframeActive } from './debug_views.js';
|
|
5
6
|
|
|
7
|
+
/** @internal Triangles one edge pattern covers, more are drawn in chunks of it */ const EDGE_PATTERN_TRIANGLES = 1 << 16;
|
|
8
|
+
const edgePatterns = [
|
|
9
|
+
null,
|
|
10
|
+
null
|
|
11
|
+
];
|
|
12
|
+
/** @internal Edge indices of a triangle list or strip of a given index count, 6 per triangle */ function edgeIndexCount(count, strip) {
|
|
13
|
+
return (strip ? Math.max(count - 2, 0) : Math.floor(count / 3)) * 6;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* @internal Write the 6 edge indices of every triangle: slot t, at 6t, holds triangle t of a list
|
|
17
|
+
* (indices 3t to 3t + 2) or of a strip (indices t to t + 2)
|
|
18
|
+
*/ function writeEdges(out, strip, index, count) {
|
|
19
|
+
const triangles = edgeIndexCount(count, strip) / 6;
|
|
20
|
+
for(let t = 0; t < triangles; t++){
|
|
21
|
+
const i = strip ? t : t * 3;
|
|
22
|
+
const a = index(i);
|
|
23
|
+
const b = index(i + 1);
|
|
24
|
+
const c = index(i + 2);
|
|
25
|
+
out.set([
|
|
26
|
+
a,
|
|
27
|
+
b,
|
|
28
|
+
b,
|
|
29
|
+
c,
|
|
30
|
+
c,
|
|
31
|
+
a
|
|
32
|
+
], t * 6);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/** @internal Triangles [first, count] drawn by a range [start, count] of indices or vertices */ function edgeTriangles(start, count, strip) {
|
|
36
|
+
return strip ? [
|
|
37
|
+
start,
|
|
38
|
+
Math.max(count - 2, 0)
|
|
39
|
+
] : [
|
|
40
|
+
Math.floor(start / 3),
|
|
41
|
+
Math.floor(count / 3)
|
|
42
|
+
];
|
|
43
|
+
}
|
|
44
|
+
/** @internal The edge pattern of non-indexed triangle lists or strips, created on first use */ function getEdgePattern(strip) {
|
|
45
|
+
let pattern = edgePatterns[strip ? 1 : 0];
|
|
46
|
+
if (!pattern) {
|
|
47
|
+
const triangles = EDGE_PATTERN_TRIANGLES;
|
|
48
|
+
const data = new Uint32Array(triangles * 6);
|
|
49
|
+
writeEdges(data, strip, (i)=>i, strip ? triangles + 2 : triangles * 3);
|
|
50
|
+
const buffer = getDevice().createIndexBuffer(data, {
|
|
51
|
+
managed: true
|
|
52
|
+
});
|
|
53
|
+
// Held for the lifetime of the module, the edge primitives only borrow it
|
|
54
|
+
retainObject(buffer);
|
|
55
|
+
pattern = {
|
|
56
|
+
buffer,
|
|
57
|
+
triangles
|
|
58
|
+
};
|
|
59
|
+
edgePatterns[strip ? 1 : 0] = pattern;
|
|
60
|
+
}
|
|
61
|
+
return pattern;
|
|
62
|
+
}
|
|
6
63
|
/**
|
|
7
64
|
* Holds vertex/index data and draw parameters for a mesh geometry.
|
|
8
65
|
*
|
|
@@ -31,6 +88,9 @@ import { getDevice } from '../app/api.js';
|
|
|
31
88
|
/** @internal Unique runtime id for the instance. */ _id;
|
|
32
89
|
/** @internal Optional bounding volume for culling/raycast. */ _bbox;
|
|
33
90
|
/** @internal Change tag increments when draw-affecting state changes. */ _changeTag;
|
|
91
|
+
/** @internal Levels of detail after the first, finest to coarsest */ _lods;
|
|
92
|
+
/** @internal Edges drawn in a wireframe view, see getEdges() */ _edges;
|
|
93
|
+
/** @internal Change tag the wireframe was built or is being built for, -1 for none */ _edgesTag;
|
|
34
94
|
/**
|
|
35
95
|
* Create an empty primitive.
|
|
36
96
|
*
|
|
@@ -53,6 +113,9 @@ import { getDevice } from '../app/api.js';
|
|
|
53
113
|
this._id = ++Primitive._nextId;
|
|
54
114
|
this._changeTag = 0;
|
|
55
115
|
this._bbox = null;
|
|
116
|
+
this._lods = [];
|
|
117
|
+
this._edges = null;
|
|
118
|
+
this._edgesTag = -1;
|
|
56
119
|
}
|
|
57
120
|
/**
|
|
58
121
|
* Unique runtime identifier of this primitive.
|
|
@@ -98,6 +161,7 @@ import { getDevice } from '../app/api.js';
|
|
|
98
161
|
this.primitiveType = other.primitiveType;
|
|
99
162
|
this.indexStart = other.indexStart;
|
|
100
163
|
this.indexCount = other.indexCount;
|
|
164
|
+
this.lods = other.lods;
|
|
101
165
|
}
|
|
102
166
|
/**
|
|
103
167
|
* Primitive topology.
|
|
@@ -137,6 +201,24 @@ import { getDevice } from '../app/api.js';
|
|
|
137
201
|
}
|
|
138
202
|
}
|
|
139
203
|
/**
|
|
204
|
+
* Levels of detail after the first, finest to coarsest, each a range of the index buffer.
|
|
205
|
+
* Level 0 is the draw range given by indexStart and indexCount. Empty by default.
|
|
206
|
+
*/ get lods() {
|
|
207
|
+
return this._lods;
|
|
208
|
+
}
|
|
209
|
+
set lods(val) {
|
|
210
|
+
this._lods = (val ?? []).map((lod)=>({
|
|
211
|
+
...lod
|
|
212
|
+
}));
|
|
213
|
+
this._changeTag++;
|
|
214
|
+
RenderBundleWrapper.primitiveChanged(this);
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Number of levels of detail, the first one included
|
|
218
|
+
*/ get lodCount() {
|
|
219
|
+
return this._lods.length + 1;
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
140
222
|
* Query total vertex count from the position buffer, if present.
|
|
141
223
|
*
|
|
142
224
|
* @returns Total vertex count; 0 if no position buffer is set.
|
|
@@ -223,10 +305,11 @@ import { getDevice } from '../app/api.js';
|
|
|
223
305
|
* @param format - Vertex attribute format(s).
|
|
224
306
|
* @param data - Typed array with vertex data.
|
|
225
307
|
* @param stepMode - Optional step mode (e.g., 'vertex', 'instance').
|
|
308
|
+
* @param options - Optional buffer creation options, e.g. `dynamic` for data rewritten often.
|
|
226
309
|
* @returns The created `StructuredBuffer`.
|
|
227
|
-
*/ createAndSetVertexBuffer(format, data, stepMode) {
|
|
310
|
+
*/ createAndSetVertexBuffer(format, data, stepMode, options) {
|
|
228
311
|
const device = getDevice();
|
|
229
|
-
const buffer = Array.isArray(format) ? device.createInterleavedVertexBuffer(format, data) : device.createVertexBuffer(format, data);
|
|
312
|
+
const buffer = Array.isArray(format) ? device.createInterleavedVertexBuffer(format, data, options) : device.createVertexBuffer(format, data, options);
|
|
230
313
|
return this.setVertexBuffer(buffer, stepMode);
|
|
231
314
|
}
|
|
232
315
|
/**
|
|
@@ -292,10 +375,16 @@ import { getDevice } from '../app/api.js';
|
|
|
292
375
|
* Issue a non-instanced draw for the current topology and range.
|
|
293
376
|
*
|
|
294
377
|
* Preconditions: A valid vertex layout and `indexCount > 0`.
|
|
295
|
-
|
|
378
|
+
*
|
|
379
|
+
* @param lod - Level of detail to draw, clamped to the available levels. Default 0.
|
|
380
|
+
*/ draw(lod = 0) {
|
|
296
381
|
this.checkVertexLayout();
|
|
297
|
-
|
|
298
|
-
|
|
382
|
+
const [start, count] = this.getLodRange(lod);
|
|
383
|
+
if (DEBUG_VIEWS && isWireframeActive() && this.drawEdges(start, count, 0)) {
|
|
384
|
+
return;
|
|
385
|
+
}
|
|
386
|
+
if (count > 0) {
|
|
387
|
+
this._vertexLayout?.draw(this._primitiveType, start, count);
|
|
299
388
|
}
|
|
300
389
|
}
|
|
301
390
|
/**
|
|
@@ -304,16 +393,219 @@ import { getDevice } from '../app/api.js';
|
|
|
304
393
|
* Preconditions: A valid vertex layout and `indexCount > 0`.
|
|
305
394
|
*
|
|
306
395
|
* @param numInstances - Number of instances to draw.
|
|
307
|
-
|
|
396
|
+
* @param lod - Level of detail to draw, clamped to the available levels. Default 0.
|
|
397
|
+
*/ drawInstanced(numInstances, lod = 0) {
|
|
398
|
+
this.checkVertexLayout();
|
|
399
|
+
const [start, count] = this.getLodRange(lod);
|
|
400
|
+
if (DEBUG_VIEWS && isWireframeActive() && this.drawEdges(start, count, numInstances)) {
|
|
401
|
+
return;
|
|
402
|
+
}
|
|
403
|
+
if (count > 0) {
|
|
404
|
+
this._vertexLayout?.drawInstanced(this._primitiveType, start, count, numInstances);
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
/** @internal Draw range of a level of detail as [indexStart, indexCount] */ getLodRange(lod) {
|
|
408
|
+
if (lod > 0 && this._lods.length > 0) {
|
|
409
|
+
const level = this._lods[Math.min(lod, this._lods.length) - 1];
|
|
410
|
+
return [
|
|
411
|
+
level.indexStart,
|
|
412
|
+
level.indexCount
|
|
413
|
+
];
|
|
414
|
+
}
|
|
415
|
+
return [
|
|
416
|
+
this._indexStart,
|
|
417
|
+
this.indexCount
|
|
418
|
+
];
|
|
419
|
+
}
|
|
420
|
+
/**
|
|
421
|
+
* Issue a draw whose arguments are read from a GPU buffer, typically written by a compute pass
|
|
422
|
+
* (WebGPU only, see `MiscCaps.supportDrawIndirect`).
|
|
423
|
+
*
|
|
424
|
+
* Uses `drawIndexedIndirect` when the primitive has an index buffer and `drawIndirect`
|
|
425
|
+
* otherwise. The buffer supplies the whole range and instance count, so `indexStart` and
|
|
426
|
+
* `indexCount` are ignored. It must be created with the 'indirect' usage and hold, at
|
|
427
|
+
* `indirectOffset`, five uint32 values (indexCount, instanceCount, firstIndex, baseVertex,
|
|
428
|
+
* firstInstance) for indexed primitives or four (vertexCount, instanceCount, firstVertex,
|
|
429
|
+
* firstInstance) otherwise. A non-zero firstInstance needs the 'indirect-first-instance'
|
|
430
|
+
* feature.
|
|
431
|
+
*
|
|
432
|
+
* Render bundles capturing an indirect draw read the arguments when they are executed.
|
|
433
|
+
*
|
|
434
|
+
* @param indirectBuffer - Buffer holding the draw arguments.
|
|
435
|
+
* @param indirectOffset - Byte offset of the arguments, a multiple of 4.
|
|
436
|
+
* @param edgeOffset - Byte offset of the arguments of the same draw for the edges of an indexed
|
|
437
|
+
* triangle list in a wireframe view, twice the index count and first index; the triangles are
|
|
438
|
+
* drawn in a wireframe view without them
|
|
439
|
+
* @param edgeBuffer - Buffer holding the edge arguments, indirectBuffer by default
|
|
440
|
+
*/ drawIndirect(indirectBuffer, indirectOffset = 0, edgeOffset = -1, edgeBuffer) {
|
|
308
441
|
this.checkVertexLayout();
|
|
309
|
-
if (
|
|
310
|
-
|
|
442
|
+
if (DEBUG_VIEWS && edgeOffset >= 0 && isWireframeActive()) {
|
|
443
|
+
const edges = this.getEdges();
|
|
444
|
+
if (edges && !edges.strip && !edges.pattern) {
|
|
445
|
+
edges.primitive.checkVertexLayout();
|
|
446
|
+
if (edges.primitive._vertexLayout) {
|
|
447
|
+
const device = getDevice();
|
|
448
|
+
device.setVertexLayout(edges.primitive._vertexLayout);
|
|
449
|
+
device.drawIndexedIndirect('line-list', edgeBuffer ?? indirectBuffer, edgeOffset);
|
|
450
|
+
}
|
|
451
|
+
return;
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
if (this._vertexLayout) {
|
|
455
|
+
const device = getDevice();
|
|
456
|
+
device.setVertexLayout(this._vertexLayout);
|
|
457
|
+
if (this.getIndexBuffer()) {
|
|
458
|
+
device.drawIndexedIndirect(this._primitiveType, indirectBuffer, indirectOffset);
|
|
459
|
+
} else {
|
|
460
|
+
device.drawIndirect(this._primitiveType, indirectBuffer, indirectOffset);
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
/**
|
|
465
|
+
* @internal The edges this primitive draws in a wireframe view, see isWireframeActive(): null
|
|
466
|
+
* while they are read back from the GPU, and for primitives that are not triangles. Edges of
|
|
467
|
+
* indexed primitives are built from their indices; those of non-indexed ones index the
|
|
468
|
+
* vertices through a shared pattern, so shaders deriving geometry from the vertex index draw
|
|
469
|
+
* their edges unchanged.
|
|
470
|
+
*/ getEdges() {
|
|
471
|
+
if (!DEBUG_VIEWS || this._primitiveType !== 'triangle-list' && this._primitiveType !== 'triangle-strip') {
|
|
472
|
+
return null;
|
|
473
|
+
}
|
|
474
|
+
const strip = this._primitiveType === 'triangle-strip';
|
|
475
|
+
if (!this.getIndexBuffer()) {
|
|
476
|
+
const pattern = getEdgePattern(strip);
|
|
477
|
+
if (!this._edges || this._edgesTag !== this._changeTag || this._edges.pattern !== pattern) {
|
|
478
|
+
this._edgesTag = this._changeTag;
|
|
479
|
+
this._edges?.primitive.dispose();
|
|
480
|
+
this._edges = {
|
|
481
|
+
primitive: this.createEdgePrimitive(pattern.buffer),
|
|
482
|
+
strip,
|
|
483
|
+
pattern,
|
|
484
|
+
args: null
|
|
485
|
+
};
|
|
486
|
+
}
|
|
487
|
+
return this._edges;
|
|
488
|
+
}
|
|
489
|
+
if (this._edgesTag !== this._changeTag) {
|
|
490
|
+
this._edgesTag = this._changeTag;
|
|
491
|
+
this._edges?.primitive.dispose();
|
|
492
|
+
this._edges = null;
|
|
493
|
+
const tag = this._changeTag;
|
|
494
|
+
this.buildEdges(strip).then((edges)=>{
|
|
495
|
+
// Superseded by a change made while reading back
|
|
496
|
+
if (this.disposed || this._edgesTag !== tag) {
|
|
497
|
+
edges?.primitive.dispose();
|
|
498
|
+
} else {
|
|
499
|
+
this._edges = edges;
|
|
500
|
+
}
|
|
501
|
+
}, (err)=>console.error(`Building the wireframe of a primitive failed: ${err}`));
|
|
502
|
+
}
|
|
503
|
+
return this._edges;
|
|
504
|
+
}
|
|
505
|
+
/** @internal A line list over the vertex buffers of this primitive */ createEdgePrimitive(indexBuffer) {
|
|
506
|
+
const primitive = new Primitive();
|
|
507
|
+
for (const info of this._vertexLayoutOptions.vertexBuffers){
|
|
508
|
+
primitive.setVertexBuffer(info.buffer, info.stepMode);
|
|
509
|
+
}
|
|
510
|
+
primitive.setIndexBuffer(indexBuffer);
|
|
511
|
+
primitive.primitiveType = 'line-list';
|
|
512
|
+
return primitive;
|
|
513
|
+
}
|
|
514
|
+
/**
|
|
515
|
+
* @internal Edges of an indexed primitive from its indices read back: 6 per triangle, every
|
|
516
|
+
* edge of every triangle, so a range of a triangle list maps to twice its start and count
|
|
517
|
+
*/ async buildEdges(strip) {
|
|
518
|
+
const ib = this.getIndexBuffer();
|
|
519
|
+
const bytes = await ib.getBufferSubData();
|
|
520
|
+
const indices = ib.indexType.primitiveType === PBPrimitiveType.U16 ? new Uint16Array(bytes.buffer, bytes.byteOffset, bytes.byteLength >> 1) : new Uint32Array(bytes.buffer, bytes.byteOffset, bytes.byteLength >> 2);
|
|
521
|
+
const lines = ib.indexType.primitiveType === PBPrimitiveType.U16 ? new Uint16Array(edgeIndexCount(indices.length, strip)) : new Uint32Array(edgeIndexCount(indices.length, strip));
|
|
522
|
+
writeEdges(lines, strip, (i)=>indices[i], indices.length);
|
|
523
|
+
if (this.disposed) {
|
|
524
|
+
return null;
|
|
525
|
+
}
|
|
526
|
+
const device = getDevice();
|
|
527
|
+
const buffer = device.createIndexBuffer(lines, {
|
|
528
|
+
managed: true
|
|
529
|
+
});
|
|
530
|
+
return {
|
|
531
|
+
primitive: this.createEdgePrimitive(buffer),
|
|
532
|
+
strip,
|
|
533
|
+
pattern: null,
|
|
534
|
+
args: null
|
|
535
|
+
};
|
|
536
|
+
}
|
|
537
|
+
/**
|
|
538
|
+
* @internal Draw the edges of a range of this primitive in place of its triangles, false if
|
|
539
|
+
* they are not available
|
|
540
|
+
*/ drawEdges(start, count, numInstances) {
|
|
541
|
+
const edges = this.getEdges();
|
|
542
|
+
if (!edges) {
|
|
543
|
+
return false;
|
|
544
|
+
}
|
|
545
|
+
const [first, triangles] = edgeTriangles(start, count, edges.strip);
|
|
546
|
+
if (triangles <= 0) {
|
|
547
|
+
return true;
|
|
548
|
+
}
|
|
549
|
+
const primitive = edges.primitive;
|
|
550
|
+
primitive.checkVertexLayout();
|
|
551
|
+
const layout = primitive._vertexLayout;
|
|
552
|
+
if (!layout) {
|
|
553
|
+
return true;
|
|
554
|
+
}
|
|
555
|
+
const pattern = edges.pattern;
|
|
556
|
+
if (!pattern || first + triangles <= pattern.triangles) {
|
|
557
|
+
// Index buffers hold 6 edge indices per triangle, slot t at 6t
|
|
558
|
+
if (numInstances > 0) {
|
|
559
|
+
layout.drawInstanced('line-list', first * 6, triangles * 6, numInstances);
|
|
560
|
+
} else {
|
|
561
|
+
layout.draw('line-list', first * 6, triangles * 6);
|
|
562
|
+
}
|
|
563
|
+
return true;
|
|
564
|
+
}
|
|
565
|
+
// Beyond the pattern: chunks of it, moved along the vertices by the base vertex of indirect draws
|
|
566
|
+
const device = getDevice();
|
|
567
|
+
if (!device.getDeviceCaps().miscCaps.supportDrawIndirect) {
|
|
568
|
+
return false;
|
|
569
|
+
}
|
|
570
|
+
const chunk = pattern.triangles;
|
|
571
|
+
const chunks = Math.ceil(triangles / chunk);
|
|
572
|
+
const key = `${first}:${triangles}:${numInstances}`;
|
|
573
|
+
let args = edges.args;
|
|
574
|
+
if (!args || args.key !== key) {
|
|
575
|
+
const data = new Uint32Array(chunks * 5);
|
|
576
|
+
for(let i = 0; i < chunks; i++){
|
|
577
|
+
const t = first + i * chunk;
|
|
578
|
+
data[i * 5] = Math.min(chunk, triangles - i * chunk) * 6;
|
|
579
|
+
data[i * 5 + 1] = Math.max(numInstances, 1);
|
|
580
|
+
// Triangle t starts at vertex 3t of a list, t of a strip
|
|
581
|
+
data[i * 5 + 3] = t * (edges.strip ? 1 : 3);
|
|
582
|
+
}
|
|
583
|
+
if (!args || args.buffer.byteLength < data.byteLength) {
|
|
584
|
+
args?.buffer.dispose();
|
|
585
|
+
args = {
|
|
586
|
+
key,
|
|
587
|
+
buffer: device.createBuffer(Math.max(data.byteLength, 320), {
|
|
588
|
+
usage: 'indirect'
|
|
589
|
+
})
|
|
590
|
+
};
|
|
591
|
+
edges.args = args;
|
|
592
|
+
}
|
|
593
|
+
args.key = key;
|
|
594
|
+
args.buffer.bufferSubData(0, data);
|
|
595
|
+
}
|
|
596
|
+
device.setVertexLayout(layout);
|
|
597
|
+
for(let i = 0; i < chunks; i++){
|
|
598
|
+
device.drawIndexedIndirect('line-list', args.buffer, i * 20);
|
|
311
599
|
}
|
|
600
|
+
return true;
|
|
312
601
|
}
|
|
313
602
|
/**
|
|
314
603
|
* Dispose this primitive and release associated GPU resources.
|
|
315
604
|
*/ onDispose() {
|
|
316
605
|
super.onDispose();
|
|
606
|
+
this._edges?.primitive.dispose();
|
|
607
|
+
this._edges?.args?.buffer.dispose();
|
|
608
|
+
this._edges = null;
|
|
317
609
|
this._vertexLayout?.dispose();
|
|
318
610
|
this._vertexLayout = null;
|
|
319
611
|
if (this._vertexLayoutOptions) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"primitive.js","sources":["../../src/render/primitive.ts"],"sourcesContent":["import type { Nullable } from '@zephyr3d/base';\r\nimport {\r\n Disposable,\r\n makeObservable,\r\n releaseObject,\r\n retainObject,\r\n type Clonable,\r\n type Ray,\r\n type TypedArray\r\n} from '@zephyr3d/base';\r\nimport {\r\n type VertexStepMode,\r\n type VertexLayout,\r\n type VertexLayoutOptions,\r\n type PrimitiveType,\r\n type StructuredBuffer,\r\n type IndexBuffer,\r\n type VertexSemantic,\r\n type VertexAttribFormat,\r\n PBPrimitiveType,\r\n matchVertexBuffer\r\n} from '@zephyr3d/device';\r\nimport type { BoundingVolume } from '../utility/bounding_volume';\r\nimport { RenderBundleWrapper } from './renderbundle_wrapper';\r\nimport { getDevice } from '../app/api';\r\n\r\n/**\r\n * Holds vertex/index data and draw parameters for a mesh geometry.\r\n *\r\n * Responsibilities:\r\n * - Owns one or more vertex buffers and an optional index buffer.\r\n * - Defines primitive topology, draw range (start/count), and vertex layout.\r\n * - Provides utilities to create/set/remove buffers and query vertex/face counts.\r\n * - Tracks changes via a change tag and notifies render-bundle caching.\r\n * - Optionally stores a bounding volume and supports ray intersection tests.\r\n *\r\n * Ownership and lifecycle:\r\n * - When adding buffers (`setVertexBuffer`, `setIndexBuffer`), the primitive retains them.\r\n * - When removing/overwriting buffers, the primitive releases the previous buffers.\r\n * - Disposing the primitive also disposes the internal `VertexLayout` and releases retained buffers.\r\n *\r\n * @public\r\n */\r\nexport class Primitive\r\n extends makeObservable(Disposable)<{\r\n bv_changed: [];\r\n }>()\r\n implements Clonable<Primitive>\r\n{\r\n /** @internal Current vertex layout object (created lazily from options). */\r\n protected _vertexLayout: Nullable<VertexLayout>;\r\n /** @internal Mutable options used to build the vertex layout. */\r\n protected _vertexLayoutOptions: VertexLayoutOptions;\r\n /** @internal Primitive topology (e.g., 'triangle-list', 'line-strip'). */\r\n protected _primitiveType: PrimitiveType;\r\n /** @internal First index/vertex to draw. */\r\n protected _indexStart: number;\r\n /** @internal Number of indices/vertices to draw (computed lazily if null). */\r\n protected _indexCount: Nullable<number>;\r\n /** @internal Cached default index count (derived when needed). */\r\n protected _defaultIndexCount: number;\r\n /** @internal Marks layout dirty when buffers/topology change. */\r\n protected _vertexLayoutDirty: boolean;\r\n /** @internal Monotonic runtime id. */\r\n private static _nextId = 0;\r\n /** @internal Unique runtime id for the instance. */\r\n protected _id: number;\r\n /** @internal Optional bounding volume for culling/raycast. */\r\n protected _bbox: Nullable<BoundingVolume>;\r\n /** @internal Change tag increments when draw-affecting state changes. */\r\n private _changeTag: number;\r\n /**\r\n * Create an empty primitive.\r\n *\r\n * Defaults:\r\n * - Primitive type: 'triangle-list'\r\n * - `indexStart = 0`, `indexCount = null` (auto-computed)\r\n * - No vertex/index buffers attached\r\n * - No bounding volume\r\n */\r\n constructor() {\r\n super();\r\n this._vertexLayout = null;\r\n this._vertexLayoutOptions = { vertexBuffers: [] };\r\n this._primitiveType = 'triangle-list';\r\n this._indexStart = 0;\r\n this._indexCount = null;\r\n this._defaultIndexCount = 0;\r\n this._vertexLayoutDirty = false;\r\n this._id = ++Primitive._nextId;\r\n this._changeTag = 0;\r\n this._bbox = null;\r\n }\r\n /**\r\n * Unique runtime identifier of this primitive.\r\n *\r\n * @returns The numeric instance id.\r\n * @public\r\n */\r\n get id() {\r\n return this._id;\r\n }\r\n /**\r\n * Change tag that increments whenever draw-affecting state changes.\r\n * Useful for invalidating cached render bundles.\r\n *\r\n * @returns The current change tag value.\r\n */\r\n get changeTag() {\r\n return this._changeTag;\r\n }\r\n /**\r\n * Create a shallow clone: copies topology, draw range, and buffers.\r\n *\r\n * Note: Buffers are re-retained on the new primitive.\r\n *\r\n * @returns A cloned Primitive instance.\r\n */\r\n clone() {\r\n const other = new Primitive();\r\n other.copyFrom(this);\r\n return other;\r\n }\r\n /**\r\n * Copy from another primitive.\r\n *\r\n * Copies:\r\n * - All vertex buffers and the index buffer\r\n * - Primitive type, index start, index count\r\n *\r\n * @param other - The source primitive to copy from.\r\n * @returns void\r\n */\r\n copyFrom(other: this) {\r\n for (const info of other._vertexLayoutOptions.vertexBuffers) {\r\n this.setVertexBuffer(info.buffer, info.stepMode);\r\n }\r\n this.setIndexBuffer(other._vertexLayoutOptions.indexBuffer ?? null);\r\n this.primitiveType = other.primitiveType;\r\n this.indexStart = other.indexStart;\r\n this.indexCount = other.indexCount;\r\n }\r\n /**\r\n * Primitive topology.\r\n */\r\n get primitiveType() {\r\n return this._primitiveType;\r\n }\r\n set primitiveType(type) {\r\n if (type !== this._primitiveType) {\r\n this._primitiveType = type;\r\n this._changeTag++;\r\n RenderBundleWrapper.primitiveChanged(this);\r\n }\r\n }\r\n /**\r\n * Starting index/vertex for drawing.\r\n */\r\n get indexStart() {\r\n return this._indexStart;\r\n }\r\n set indexStart(val) {\r\n if (val !== this._indexStart) {\r\n this._indexStart = val;\r\n this._changeTag++;\r\n RenderBundleWrapper.primitiveChanged(this);\r\n }\r\n }\r\n /**\r\n * Number of indices/vertices to draw.\r\n */\r\n get indexCount() {\r\n this._indexCount = this._indexCount ?? this.calcDefaultIndexCount();\r\n return this._indexCount;\r\n }\r\n set indexCount(val) {\r\n if (val !== this._indexCount) {\r\n this._indexCount = val;\r\n this._changeTag++;\r\n RenderBundleWrapper.primitiveChanged(this);\r\n }\r\n }\r\n /**\r\n * Query total vertex count from the position buffer, if present.\r\n *\r\n * @returns Total vertex count; 0 if no position buffer is set.\r\n */\r\n getNumVertices() {\r\n const posInfo = this.getVertexBufferInfo('position');\r\n return posInfo?.buffer ? (posInfo.buffer.byteLength / posInfo.stride) >> 0 : 0;\r\n }\r\n /**\r\n * Query total face/segment count based on topology and buffer size.\r\n *\r\n * - For indexed geometry: derived from index buffer.\r\n * - For non-indexed: derived from position vertex count.\r\n *\r\n * @returns Total primitive count for the current topology.\r\n */\r\n getNumFaces() {\r\n const ib = this.getIndexBuffer();\r\n const count = ib\r\n ? ib.byteLength >> (ib.indexType.primitiveType === PBPrimitiveType.U16 ? 1 : 2)\r\n : this.getNumVertices();\r\n switch (this.primitiveType) {\r\n case 'line-list':\r\n return count >> 1;\r\n case 'point-list':\r\n return count;\r\n case 'line-strip':\r\n return count - 1;\r\n case 'triangle-fan':\r\n return count - 2;\r\n case 'triangle-strip':\r\n return count - 2;\r\n case 'triangle-list':\r\n return (count / 3) >> 0;\r\n default:\r\n return 0;\r\n }\r\n }\r\n /**\r\n * Remove all vertex buffers that match a given semantic.\r\n *\r\n * This releases retained buffers, marks the layout dirty, and invalidates bundles.\r\n *\r\n * @param semantic - The vertex semantic to remove (e.g., 'position', 'normal').\r\n * @returns void\r\n */\r\n removeVertexBuffer(semantic: VertexSemantic) {\r\n for (let i = this._vertexLayoutOptions.vertexBuffers.length - 1; i >= 0; i--) {\r\n const info = this._vertexLayoutOptions.vertexBuffers[i];\r\n if (matchVertexBuffer(info.buffer, semantic)) {\r\n releaseObject(info.buffer);\r\n this._vertexLayoutOptions.vertexBuffers.splice(i, 1);\r\n this._vertexLayoutDirty = true;\r\n }\r\n }\r\n if (this._vertexLayoutDirty) {\r\n this._changeTag++;\r\n RenderBundleWrapper.primitiveChanged(this);\r\n }\r\n }\r\n /**\r\n * Get the vertex buffer that matches a given semantic.\r\n *\r\n * @param semantic - The vertex semantic to look up.\r\n * @returns The matching vertex buffer, or `null` if not found.\r\n */\r\n getVertexBuffer(semantic: VertexSemantic) {\r\n for (const info of this._vertexLayoutOptions.vertexBuffers) {\r\n if (info.buffer && matchVertexBuffer(info.buffer, semantic)) {\r\n return info.buffer;\r\n }\r\n }\r\n return null;\r\n }\r\n /**\r\n * Get vertex buffer information for a given semantic.\r\n *\r\n * @param semantic - The vertex semantic to look up.\r\n * @returns The `VertexBufferInfo`, or `null` if not found.\r\n */\r\n getVertexBufferInfo(semantic: VertexSemantic) {\r\n this.checkVertexLayout();\r\n return this._vertexLayout?.getVertexBufferInfo(semantic) ?? null;\r\n }\r\n /**\r\n * Create a vertex buffer from data and add it to the primitive.\r\n *\r\n * - For interleaved layouts, pass an array of `VertexAttribFormat`.\r\n * - For a single attribute, pass a single `VertexAttribFormat`.\r\n *\r\n * @param format - Vertex attribute format(s).\r\n * @param data - Typed array with vertex data.\r\n * @param stepMode - Optional step mode (e.g., 'vertex', 'instance').\r\n * @returns The created `StructuredBuffer`.\r\n */\r\n createAndSetVertexBuffer(\r\n format: VertexAttribFormat[] | VertexAttribFormat,\r\n data: TypedArray,\r\n stepMode?: VertexStepMode\r\n ) {\r\n const device = getDevice();\r\n const buffer = Array.isArray(format)\r\n ? device.createInterleavedVertexBuffer(format, data)!\r\n : device.createVertexBuffer(format, data)!;\r\n return this.setVertexBuffer(buffer, stepMode);\r\n }\r\n /**\r\n * Add an existing vertex buffer to the primitive.\r\n *\r\n * Ownership note: The primitive retains the buffer; it will be released or disposed when replaced or on dispose.\r\n *\r\n * @param buffer - The vertex buffer to add.\r\n * @param stepMode - Optional step mode for the buffer.\r\n * @returns The same buffer.\r\n */\r\n setVertexBuffer(buffer: StructuredBuffer, stepMode?: VertexStepMode) {\r\n retainObject(buffer);\r\n this._vertexLayoutOptions.vertexBuffers.push({\r\n buffer,\r\n stepMode\r\n });\r\n this._vertexLayoutDirty = true;\r\n this._changeTag++;\r\n RenderBundleWrapper.primitiveChanged(this);\r\n return buffer;\r\n }\r\n /**\r\n * Create an index buffer from data and set it on the primitive.\r\n *\r\n * @param data - Index data as Uint16Array or Uint32Array.\r\n * @param dynamic - Whether the index buffer is dynamic (unmanaged).\r\n * @returns The created `IndexBuffer`.\r\n */\r\n createAndSetIndexBuffer(data: Uint16Array<ArrayBuffer> | Uint32Array<ArrayBuffer>, dynamic?: boolean) {\r\n const device = getDevice();\r\n const buffer = device.createIndexBuffer(data, {\r\n dynamic: !!dynamic,\r\n managed: !dynamic\r\n });\r\n this.setIndexBuffer(buffer);\r\n return buffer;\r\n }\r\n /**\r\n * Set or replace the index buffer.\r\n *\r\n * Ownership note: The primitive retains the buffer; previous buffer is released.\r\n * Marks the vertex layout dirty and invalidates bundles.\r\n *\r\n * @param buffer - The index buffer to set (non-null).\r\n * @returns void\r\n */\r\n setIndexBuffer(buffer: Nullable<IndexBuffer>) {\r\n if (this._vertexLayoutOptions.indexBuffer !== buffer) {\r\n retainObject(buffer);\r\n releaseObject(this._vertexLayoutOptions.indexBuffer ?? null);\r\n this._vertexLayoutOptions.indexBuffer = buffer;\r\n this._vertexLayoutDirty = true;\r\n this._changeTag++;\r\n RenderBundleWrapper.primitiveChanged(this);\r\n }\r\n }\r\n /**\r\n * Get the current index buffer.\r\n *\r\n * @returns The index buffer, or `undefined`/`null` if none set.\r\n */\r\n getIndexBuffer() {\r\n return this._vertexLayoutOptions.indexBuffer ?? null;\r\n }\r\n /**\r\n * Issue a non-instanced draw for the current topology and range.\r\n *\r\n * Preconditions: A valid vertex layout and `indexCount > 0`.\r\n */\r\n draw() {\r\n this.checkVertexLayout();\r\n if (this.indexCount > 0) {\r\n this._vertexLayout?.draw(this._primitiveType, this._indexStart, this.indexCount);\r\n }\r\n }\r\n /**\r\n * Issue an instanced draw for the current topology and range.\r\n *\r\n * Preconditions: A valid vertex layout and `indexCount > 0`.\r\n *\r\n * @param numInstances - Number of instances to draw.\r\n */\r\n drawInstanced(numInstances: number) {\r\n this.checkVertexLayout();\r\n if (this.indexCount > 0) {\r\n this._vertexLayout?.drawInstanced(this._primitiveType, this._indexStart, this.indexCount, numInstances);\r\n }\r\n }\r\n /**\r\n * Dispose this primitive and release associated GPU resources.\r\n */\r\n protected onDispose() {\r\n super.onDispose();\r\n this._vertexLayout?.dispose();\r\n this._vertexLayout = null;\r\n if (this._vertexLayoutOptions) {\r\n releaseObject(this._vertexLayoutOptions.indexBuffer ?? null);\r\n for (const info of this._vertexLayoutOptions.vertexBuffers) {\r\n releaseObject(info.buffer);\r\n }\r\n }\r\n }\r\n /*\r\n createAABBTree(): AABBTree {\r\n const indices = this.getIndexBuffer() ? this.getIndexBuffer().getData() : null;\r\n const vertices = (this.getVertexBuffer(VERTEX_ATTRIB_POSITION)?.getData() as Float32Array) || null;\r\n const aabbtree = new AABBTree();\r\n aabbtree.buildFromPrimitives(vertices, indices, this._primitiveType);\r\n return aabbtree;\r\n }\r\n */\r\n /**\r\n * Get the bounding volume associated with this primitive.\r\n *\r\n * @returns The current bounding volume, or `null` if not set.\r\n */\r\n getBoundingVolume() {\r\n return this._bbox;\r\n }\r\n /**\r\n * Set or replace the bounding volume of this primitive.\r\n *\r\n * Triggers registered bounding-volume change callbacks.\r\n *\r\n * @param bv - The bounding volume to set.\r\n * @returns void\r\n */\r\n setBoundingVolume(bv: BoundingVolume) {\r\n if (bv !== this._bbox) {\r\n this._bbox = bv;\r\n this.dispatchEvent('bv_changed');\r\n }\r\n }\r\n /**\r\n * Test intersection against the current axis-aligned bounding box (AABB).\r\n *\r\n * @param ray - Ray to test against the primitive's AABB (derived from its bounding volume).\r\n * @returns The distance from ray origin to the intersection, or `null` if no hit or no AABB.\r\n */\r\n raycast(ray: Ray) {\r\n const aabb = this.getBoundingVolume()?.toAABB();\r\n return aabb ? ray.bboxIntersectionTestEx(aabb) : null;\r\n }\r\n /** @internal */\r\n private checkVertexLayout() {\r\n if (this._vertexLayoutDirty) {\r\n this._vertexLayout?.dispose();\r\n const device = getDevice();\r\n this._vertexLayout = device.createVertexLayout(this._vertexLayoutOptions);\r\n this._vertexLayoutDirty = false;\r\n }\r\n }\r\n /** @internal */\r\n private calcDefaultIndexCount() {\r\n const indexBuffer = this.getIndexBuffer();\r\n if (indexBuffer) {\r\n return Math.max(0, indexBuffer.length - this._indexStart);\r\n }\r\n const info = this.getVertexBufferInfo('position');\r\n if (info) {\r\n return Math.max(\r\n 0,\r\n Math.floor((info.buffer.byteLength - info.drawOffset) / info.stride) - this._indexStart\r\n );\r\n }\r\n return 0;\r\n }\r\n}\r\n"],"names":["Primitive","makeObservable","Disposable","_nextId","_vertexLayout","_vertexLayoutOptions","vertexBuffers","_primitiveType","_indexStart","_indexCount","_defaultIndexCount","_vertexLayoutDirty","_id","_changeTag","_bbox","id","changeTag","clone","other","copyFrom","info","setVertexBuffer","buffer","stepMode","setIndexBuffer","indexBuffer","primitiveType","indexStart","indexCount","type","RenderBundleWrapper","primitiveChanged","val","calcDefaultIndexCount","getNumVertices","posInfo","getVertexBufferInfo","byteLength","stride","getNumFaces","ib","getIndexBuffer","count","indexType","PBPrimitiveType","U16","removeVertexBuffer","semantic","i","length","matchVertexBuffer","releaseObject","splice","getVertexBuffer","checkVertexLayout","createAndSetVertexBuffer","format","data","device","getDevice","Array","isArray","createInterleavedVertexBuffer","createVertexBuffer","retainObject","push","createAndSetIndexBuffer","dynamic","createIndexBuffer","managed","draw","drawInstanced","numInstances","onDispose","dispose","getBoundingVolume","setBoundingVolume","bv","dispatchEvent","raycast","ray","aabb","toAABB","bboxIntersectionTestEx","createVertexLayout","Math","max","floor","drawOffset"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"primitive.js","sources":["../../src/render/primitive.ts"],"sourcesContent":["import type { Nullable } from '@zephyr3d/base';\r\nimport {\r\n DEBUG_VIEWS,\r\n Disposable,\r\n makeObservable,\r\n releaseObject,\r\n retainObject,\r\n type Clonable,\r\n type Ray,\r\n type TypedArray\r\n} from '@zephyr3d/base';\r\nimport {\r\n type VertexStepMode,\r\n type VertexLayout,\r\n type VertexLayoutOptions,\r\n type PrimitiveType,\r\n type StructuredBuffer,\r\n type IndexBuffer,\r\n type VertexSemantic,\r\n type VertexAttribFormat,\r\n type GPUDataBuffer,\r\n type BufferCreationOptions,\r\n PBPrimitiveType,\r\n matchVertexBuffer\r\n} from '@zephyr3d/device';\r\nimport type { BoundingVolume } from '../utility/bounding_volume';\r\nimport { RenderBundleWrapper } from './renderbundle_wrapper';\r\nimport { getDevice } from '../app/api';\r\nimport { isWireframeActive } from './debug_views';\r\n\r\n/** @internal Triangles one edge pattern covers, more are drawn in chunks of it */\r\nconst EDGE_PATTERN_TRIANGLES = 1 << 16;\r\n\r\n/** @internal Shared index pattern drawing the edges of non-indexed triangles */\r\ninterface EdgePattern {\r\n buffer: IndexBuffer;\r\n triangles: number;\r\n}\r\n\r\n/** @internal Edges of a primitive, see Primitive.getEdges() */\r\ninterface PrimitiveEdges {\r\n /** Line list over the vertex buffers of the primitive */\r\n primitive: Primitive;\r\n /** Whether the primitive is a triangle strip */\r\n strip: boolean;\r\n /** Pattern indexing the vertices of a non-indexed primitive, null for an indexed one */\r\n pattern: Nullable<EdgePattern>;\r\n /** Indirect arguments of the chunks of a range beyond the pattern, for the range in key */\r\n args: Nullable<{ key: string; buffer: GPUDataBuffer }>;\r\n}\r\n\r\nconst edgePatterns: Nullable<EdgePattern>[] = [null, null];\r\n\r\n/** @internal Edge indices of a triangle list or strip of a given index count, 6 per triangle */\r\nfunction edgeIndexCount(count: number, strip: boolean) {\r\n return (strip ? Math.max(count - 2, 0) : Math.floor(count / 3)) * 6;\r\n}\r\n\r\n/**\r\n * @internal Write the 6 edge indices of every triangle: slot t, at 6t, holds triangle t of a list\r\n * (indices 3t to 3t + 2) or of a strip (indices t to t + 2)\r\n */\r\nfunction writeEdges(\r\n out: Uint16Array | Uint32Array,\r\n strip: boolean,\r\n index: (i: number) => number,\r\n count: number\r\n) {\r\n const triangles = edgeIndexCount(count, strip) / 6;\r\n for (let t = 0; t < triangles; t++) {\r\n const i = strip ? t : t * 3;\r\n const a = index(i);\r\n const b = index(i + 1);\r\n const c = index(i + 2);\r\n out.set([a, b, b, c, c, a], t * 6);\r\n }\r\n}\r\n\r\n/** @internal Triangles [first, count] drawn by a range [start, count] of indices or vertices */\r\nfunction edgeTriangles(start: number, count: number, strip: boolean): [number, number] {\r\n return strip ? [start, Math.max(count - 2, 0)] : [Math.floor(start / 3), Math.floor(count / 3)];\r\n}\r\n\r\n/** @internal The edge pattern of non-indexed triangle lists or strips, created on first use */\r\nfunction getEdgePattern(strip: boolean) {\r\n let pattern = edgePatterns[strip ? 1 : 0];\r\n if (!pattern) {\r\n const triangles = EDGE_PATTERN_TRIANGLES;\r\n const data = new Uint32Array(triangles * 6);\r\n writeEdges(data, strip, (i) => i, strip ? triangles + 2 : triangles * 3);\r\n const buffer = getDevice().createIndexBuffer(data, { managed: true });\r\n // Held for the lifetime of the module, the edge primitives only borrow it\r\n retainObject(buffer);\r\n pattern = { buffer, triangles };\r\n edgePatterns[strip ? 1 : 0] = pattern;\r\n }\r\n return pattern;\r\n}\r\n\r\n/**\r\n * A coarser level of detail of a {@link Primitive}: a range of its index buffer drawing the same\r\n * vertices with fewer triangles.\r\n * @public\r\n */\r\nexport interface PrimitiveLod {\r\n /** First index of the level */\r\n indexStart: number;\r\n /** Number of indices of the level */\r\n indexCount: number;\r\n /** Projected bounds size below which the level is used */\r\n screenSize: number;\r\n /**\r\n * Added to screenSize when switching back to a finer level, so the level does not flip at the\r\n * threshold every frame\r\n */\r\n hysteresis: number;\r\n}\r\n\r\n/**\r\n * Holds vertex/index data and draw parameters for a mesh geometry.\r\n *\r\n * Responsibilities:\r\n * - Owns one or more vertex buffers and an optional index buffer.\r\n * - Defines primitive topology, draw range (start/count), and vertex layout.\r\n * - Provides utilities to create/set/remove buffers and query vertex/face counts.\r\n * - Tracks changes via a change tag and notifies render-bundle caching.\r\n * - Optionally stores a bounding volume and supports ray intersection tests.\r\n *\r\n * Ownership and lifecycle:\r\n * - When adding buffers (`setVertexBuffer`, `setIndexBuffer`), the primitive retains them.\r\n * - When removing/overwriting buffers, the primitive releases the previous buffers.\r\n * - Disposing the primitive also disposes the internal `VertexLayout` and releases retained buffers.\r\n *\r\n * @public\r\n */\r\nexport class Primitive\r\n extends makeObservable(Disposable)<{\r\n bv_changed: [];\r\n }>()\r\n implements Clonable<Primitive>\r\n{\r\n /** @internal Current vertex layout object (created lazily from options). */\r\n protected _vertexLayout: Nullable<VertexLayout>;\r\n /** @internal Mutable options used to build the vertex layout. */\r\n protected _vertexLayoutOptions: VertexLayoutOptions;\r\n /** @internal Primitive topology (e.g., 'triangle-list', 'line-strip'). */\r\n protected _primitiveType: PrimitiveType;\r\n /** @internal First index/vertex to draw. */\r\n protected _indexStart: number;\r\n /** @internal Number of indices/vertices to draw (computed lazily if null). */\r\n protected _indexCount: Nullable<number>;\r\n /** @internal Cached default index count (derived when needed). */\r\n protected _defaultIndexCount: number;\r\n /** @internal Marks layout dirty when buffers/topology change. */\r\n protected _vertexLayoutDirty: boolean;\r\n /** @internal Monotonic runtime id. */\r\n private static _nextId = 0;\r\n /** @internal Unique runtime id for the instance. */\r\n protected _id: number;\r\n /** @internal Optional bounding volume for culling/raycast. */\r\n protected _bbox: Nullable<BoundingVolume>;\r\n /** @internal Change tag increments when draw-affecting state changes. */\r\n private _changeTag: number;\r\n /** @internal Levels of detail after the first, finest to coarsest */\r\n protected _lods: PrimitiveLod[];\r\n /** @internal Edges drawn in a wireframe view, see getEdges() */\r\n private _edges: Nullable<PrimitiveEdges>;\r\n /** @internal Change tag the wireframe was built or is being built for, -1 for none */\r\n private _edgesTag: number;\r\n /**\r\n * Create an empty primitive.\r\n *\r\n * Defaults:\r\n * - Primitive type: 'triangle-list'\r\n * - `indexStart = 0`, `indexCount = null` (auto-computed)\r\n * - No vertex/index buffers attached\r\n * - No bounding volume\r\n */\r\n constructor() {\r\n super();\r\n this._vertexLayout = null;\r\n this._vertexLayoutOptions = { vertexBuffers: [] };\r\n this._primitiveType = 'triangle-list';\r\n this._indexStart = 0;\r\n this._indexCount = null;\r\n this._defaultIndexCount = 0;\r\n this._vertexLayoutDirty = false;\r\n this._id = ++Primitive._nextId;\r\n this._changeTag = 0;\r\n this._bbox = null;\r\n this._lods = [];\r\n this._edges = null;\r\n this._edgesTag = -1;\r\n }\r\n /**\r\n * Unique runtime identifier of this primitive.\r\n *\r\n * @returns The numeric instance id.\r\n * @public\r\n */\r\n get id() {\r\n return this._id;\r\n }\r\n /**\r\n * Change tag that increments whenever draw-affecting state changes.\r\n * Useful for invalidating cached render bundles.\r\n *\r\n * @returns The current change tag value.\r\n */\r\n get changeTag() {\r\n return this._changeTag;\r\n }\r\n /**\r\n * Create a shallow clone: copies topology, draw range, and buffers.\r\n *\r\n * Note: Buffers are re-retained on the new primitive.\r\n *\r\n * @returns A cloned Primitive instance.\r\n */\r\n clone() {\r\n const other = new Primitive();\r\n other.copyFrom(this);\r\n return other;\r\n }\r\n /**\r\n * Copy from another primitive.\r\n *\r\n * Copies:\r\n * - All vertex buffers and the index buffer\r\n * - Primitive type, index start, index count\r\n *\r\n * @param other - The source primitive to copy from.\r\n * @returns void\r\n */\r\n copyFrom(other: this) {\r\n for (const info of other._vertexLayoutOptions.vertexBuffers) {\r\n this.setVertexBuffer(info.buffer, info.stepMode);\r\n }\r\n this.setIndexBuffer(other._vertexLayoutOptions.indexBuffer ?? null);\r\n this.primitiveType = other.primitiveType;\r\n this.indexStart = other.indexStart;\r\n this.indexCount = other.indexCount;\r\n this.lods = other.lods;\r\n }\r\n /**\r\n * Primitive topology.\r\n */\r\n get primitiveType() {\r\n return this._primitiveType;\r\n }\r\n set primitiveType(type) {\r\n if (type !== this._primitiveType) {\r\n this._primitiveType = type;\r\n this._changeTag++;\r\n RenderBundleWrapper.primitiveChanged(this);\r\n }\r\n }\r\n /**\r\n * Starting index/vertex for drawing.\r\n */\r\n get indexStart() {\r\n return this._indexStart;\r\n }\r\n set indexStart(val) {\r\n if (val !== this._indexStart) {\r\n this._indexStart = val;\r\n this._changeTag++;\r\n RenderBundleWrapper.primitiveChanged(this);\r\n }\r\n }\r\n /**\r\n * Number of indices/vertices to draw.\r\n */\r\n get indexCount() {\r\n this._indexCount = this._indexCount ?? this.calcDefaultIndexCount();\r\n return this._indexCount;\r\n }\r\n set indexCount(val) {\r\n if (val !== this._indexCount) {\r\n this._indexCount = val;\r\n this._changeTag++;\r\n RenderBundleWrapper.primitiveChanged(this);\r\n }\r\n }\r\n /**\r\n * Levels of detail after the first, finest to coarsest, each a range of the index buffer.\r\n * Level 0 is the draw range given by indexStart and indexCount. Empty by default.\r\n */\r\n get lods(): readonly Readonly<PrimitiveLod>[] {\r\n return this._lods;\r\n }\r\n set lods(val: readonly Readonly<PrimitiveLod>[]) {\r\n this._lods = (val ?? []).map((lod) => ({ ...lod }));\r\n this._changeTag++;\r\n RenderBundleWrapper.primitiveChanged(this);\r\n }\r\n /**\r\n * Number of levels of detail, the first one included\r\n */\r\n get lodCount() {\r\n return this._lods.length + 1;\r\n }\r\n /**\r\n * Query total vertex count from the position buffer, if present.\r\n *\r\n * @returns Total vertex count; 0 if no position buffer is set.\r\n */\r\n getNumVertices() {\r\n const posInfo = this.getVertexBufferInfo('position');\r\n return posInfo?.buffer ? (posInfo.buffer.byteLength / posInfo.stride) >> 0 : 0;\r\n }\r\n /**\r\n * Query total face/segment count based on topology and buffer size.\r\n *\r\n * - For indexed geometry: derived from index buffer.\r\n * - For non-indexed: derived from position vertex count.\r\n *\r\n * @returns Total primitive count for the current topology.\r\n */\r\n getNumFaces() {\r\n const ib = this.getIndexBuffer();\r\n const count = ib\r\n ? ib.byteLength >> (ib.indexType.primitiveType === PBPrimitiveType.U16 ? 1 : 2)\r\n : this.getNumVertices();\r\n switch (this.primitiveType) {\r\n case 'line-list':\r\n return count >> 1;\r\n case 'point-list':\r\n return count;\r\n case 'line-strip':\r\n return count - 1;\r\n case 'triangle-fan':\r\n return count - 2;\r\n case 'triangle-strip':\r\n return count - 2;\r\n case 'triangle-list':\r\n return (count / 3) >> 0;\r\n default:\r\n return 0;\r\n }\r\n }\r\n /**\r\n * Remove all vertex buffers that match a given semantic.\r\n *\r\n * This releases retained buffers, marks the layout dirty, and invalidates bundles.\r\n *\r\n * @param semantic - The vertex semantic to remove (e.g., 'position', 'normal').\r\n * @returns void\r\n */\r\n removeVertexBuffer(semantic: VertexSemantic) {\r\n for (let i = this._vertexLayoutOptions.vertexBuffers.length - 1; i >= 0; i--) {\r\n const info = this._vertexLayoutOptions.vertexBuffers[i];\r\n if (matchVertexBuffer(info.buffer, semantic)) {\r\n releaseObject(info.buffer);\r\n this._vertexLayoutOptions.vertexBuffers.splice(i, 1);\r\n this._vertexLayoutDirty = true;\r\n }\r\n }\r\n if (this._vertexLayoutDirty) {\r\n this._changeTag++;\r\n RenderBundleWrapper.primitiveChanged(this);\r\n }\r\n }\r\n /**\r\n * Get the vertex buffer that matches a given semantic.\r\n *\r\n * @param semantic - The vertex semantic to look up.\r\n * @returns The matching vertex buffer, or `null` if not found.\r\n */\r\n getVertexBuffer(semantic: VertexSemantic) {\r\n for (const info of this._vertexLayoutOptions.vertexBuffers) {\r\n if (info.buffer && matchVertexBuffer(info.buffer, semantic)) {\r\n return info.buffer;\r\n }\r\n }\r\n return null;\r\n }\r\n /**\r\n * Get vertex buffer information for a given semantic.\r\n *\r\n * @param semantic - The vertex semantic to look up.\r\n * @returns The `VertexBufferInfo`, or `null` if not found.\r\n */\r\n getVertexBufferInfo(semantic: VertexSemantic) {\r\n this.checkVertexLayout();\r\n return this._vertexLayout?.getVertexBufferInfo(semantic) ?? null;\r\n }\r\n /**\r\n * Create a vertex buffer from data and add it to the primitive.\r\n *\r\n * - For interleaved layouts, pass an array of `VertexAttribFormat`.\r\n * - For a single attribute, pass a single `VertexAttribFormat`.\r\n *\r\n * @param format - Vertex attribute format(s).\r\n * @param data - Typed array with vertex data.\r\n * @param stepMode - Optional step mode (e.g., 'vertex', 'instance').\r\n * @param options - Optional buffer creation options, e.g. `dynamic` for data rewritten often.\r\n * @returns The created `StructuredBuffer`.\r\n */\r\n createAndSetVertexBuffer(\r\n format: VertexAttribFormat[] | VertexAttribFormat,\r\n data: TypedArray,\r\n stepMode?: VertexStepMode,\r\n options?: BufferCreationOptions\r\n ) {\r\n const device = getDevice();\r\n const buffer = Array.isArray(format)\r\n ? device.createInterleavedVertexBuffer(format, data, options)!\r\n : device.createVertexBuffer(format, data, options)!;\r\n return this.setVertexBuffer(buffer, stepMode);\r\n }\r\n /**\r\n * Add an existing vertex buffer to the primitive.\r\n *\r\n * Ownership note: The primitive retains the buffer; it will be released or disposed when replaced or on dispose.\r\n *\r\n * @param buffer - The vertex buffer to add.\r\n * @param stepMode - Optional step mode for the buffer.\r\n * @returns The same buffer.\r\n */\r\n setVertexBuffer(buffer: StructuredBuffer, stepMode?: VertexStepMode) {\r\n retainObject(buffer);\r\n this._vertexLayoutOptions.vertexBuffers.push({\r\n buffer,\r\n stepMode\r\n });\r\n this._vertexLayoutDirty = true;\r\n this._changeTag++;\r\n RenderBundleWrapper.primitiveChanged(this);\r\n return buffer;\r\n }\r\n /**\r\n * Create an index buffer from data and set it on the primitive.\r\n *\r\n * @param data - Index data as Uint16Array or Uint32Array.\r\n * @param dynamic - Whether the index buffer is dynamic (unmanaged).\r\n * @returns The created `IndexBuffer`.\r\n */\r\n createAndSetIndexBuffer(data: Uint16Array<ArrayBuffer> | Uint32Array<ArrayBuffer>, dynamic?: boolean) {\r\n const device = getDevice();\r\n const buffer = device.createIndexBuffer(data, {\r\n dynamic: !!dynamic,\r\n managed: !dynamic\r\n });\r\n this.setIndexBuffer(buffer);\r\n return buffer;\r\n }\r\n /**\r\n * Set or replace the index buffer.\r\n *\r\n * Ownership note: The primitive retains the buffer; previous buffer is released.\r\n * Marks the vertex layout dirty and invalidates bundles.\r\n *\r\n * @param buffer - The index buffer to set (non-null).\r\n * @returns void\r\n */\r\n setIndexBuffer(buffer: Nullable<IndexBuffer>) {\r\n if (this._vertexLayoutOptions.indexBuffer !== buffer) {\r\n retainObject(buffer);\r\n releaseObject(this._vertexLayoutOptions.indexBuffer ?? null);\r\n this._vertexLayoutOptions.indexBuffer = buffer;\r\n this._vertexLayoutDirty = true;\r\n this._changeTag++;\r\n RenderBundleWrapper.primitiveChanged(this);\r\n }\r\n }\r\n /**\r\n * Get the current index buffer.\r\n *\r\n * @returns The index buffer, or `undefined`/`null` if none set.\r\n */\r\n getIndexBuffer() {\r\n return this._vertexLayoutOptions.indexBuffer ?? null;\r\n }\r\n /**\r\n * Issue a non-instanced draw for the current topology and range.\r\n *\r\n * Preconditions: A valid vertex layout and `indexCount > 0`.\r\n *\r\n * @param lod - Level of detail to draw, clamped to the available levels. Default 0.\r\n */\r\n draw(lod = 0) {\r\n this.checkVertexLayout();\r\n const [start, count] = this.getLodRange(lod);\r\n if (DEBUG_VIEWS && isWireframeActive() && this.drawEdges(start, count, 0)) {\r\n return;\r\n }\r\n if (count > 0) {\r\n this._vertexLayout?.draw(this._primitiveType, start, count);\r\n }\r\n }\r\n /**\r\n * Issue an instanced draw for the current topology and range.\r\n *\r\n * Preconditions: A valid vertex layout and `indexCount > 0`.\r\n *\r\n * @param numInstances - Number of instances to draw.\r\n * @param lod - Level of detail to draw, clamped to the available levels. Default 0.\r\n */\r\n drawInstanced(numInstances: number, lod = 0) {\r\n this.checkVertexLayout();\r\n const [start, count] = this.getLodRange(lod);\r\n if (DEBUG_VIEWS && isWireframeActive() && this.drawEdges(start, count, numInstances)) {\r\n return;\r\n }\r\n if (count > 0) {\r\n this._vertexLayout?.drawInstanced(this._primitiveType, start, count, numInstances);\r\n }\r\n }\r\n /** @internal Draw range of a level of detail as [indexStart, indexCount] */\r\n getLodRange(lod: number): [number, number] {\r\n if (lod > 0 && this._lods.length > 0) {\r\n const level = this._lods[Math.min(lod, this._lods.length) - 1];\r\n return [level.indexStart, level.indexCount];\r\n }\r\n return [this._indexStart, this.indexCount];\r\n }\r\n /**\r\n * Issue a draw whose arguments are read from a GPU buffer, typically written by a compute pass\r\n * (WebGPU only, see `MiscCaps.supportDrawIndirect`).\r\n *\r\n * Uses `drawIndexedIndirect` when the primitive has an index buffer and `drawIndirect`\r\n * otherwise. The buffer supplies the whole range and instance count, so `indexStart` and\r\n * `indexCount` are ignored. It must be created with the 'indirect' usage and hold, at\r\n * `indirectOffset`, five uint32 values (indexCount, instanceCount, firstIndex, baseVertex,\r\n * firstInstance) for indexed primitives or four (vertexCount, instanceCount, firstVertex,\r\n * firstInstance) otherwise. A non-zero firstInstance needs the 'indirect-first-instance'\r\n * feature.\r\n *\r\n * Render bundles capturing an indirect draw read the arguments when they are executed.\r\n *\r\n * @param indirectBuffer - Buffer holding the draw arguments.\r\n * @param indirectOffset - Byte offset of the arguments, a multiple of 4.\r\n * @param edgeOffset - Byte offset of the arguments of the same draw for the edges of an indexed\r\n * triangle list in a wireframe view, twice the index count and first index; the triangles are\r\n * drawn in a wireframe view without them\r\n * @param edgeBuffer - Buffer holding the edge arguments, indirectBuffer by default\r\n */\r\n drawIndirect(\r\n indirectBuffer: GPUDataBuffer,\r\n indirectOffset = 0,\r\n edgeOffset = -1,\r\n edgeBuffer?: GPUDataBuffer\r\n ) {\r\n this.checkVertexLayout();\r\n if (DEBUG_VIEWS && edgeOffset >= 0 && isWireframeActive()) {\r\n const edges = this.getEdges();\r\n if (edges && !edges.strip && !edges.pattern) {\r\n edges.primitive.checkVertexLayout();\r\n if (edges.primitive._vertexLayout) {\r\n const device = getDevice();\r\n device.setVertexLayout(edges.primitive._vertexLayout);\r\n device.drawIndexedIndirect('line-list', edgeBuffer ?? indirectBuffer, edgeOffset);\r\n }\r\n return;\r\n }\r\n }\r\n if (this._vertexLayout) {\r\n const device = getDevice();\r\n device.setVertexLayout(this._vertexLayout);\r\n if (this.getIndexBuffer()) {\r\n device.drawIndexedIndirect(this._primitiveType, indirectBuffer, indirectOffset);\r\n } else {\r\n device.drawIndirect(this._primitiveType, indirectBuffer, indirectOffset);\r\n }\r\n }\r\n }\r\n /**\r\n * @internal The edges this primitive draws in a wireframe view, see isWireframeActive(): null\r\n * while they are read back from the GPU, and for primitives that are not triangles. Edges of\r\n * indexed primitives are built from their indices; those of non-indexed ones index the\r\n * vertices through a shared pattern, so shaders deriving geometry from the vertex index draw\r\n * their edges unchanged.\r\n */\r\n getEdges(): Nullable<PrimitiveEdges> {\r\n if (\r\n !DEBUG_VIEWS ||\r\n (this._primitiveType !== 'triangle-list' && this._primitiveType !== 'triangle-strip')\r\n ) {\r\n return null;\r\n }\r\n const strip = this._primitiveType === 'triangle-strip';\r\n if (!this.getIndexBuffer()) {\r\n const pattern = getEdgePattern(strip);\r\n if (!this._edges || this._edgesTag !== this._changeTag || this._edges.pattern !== pattern) {\r\n this._edgesTag = this._changeTag;\r\n this._edges?.primitive.dispose();\r\n this._edges = { primitive: this.createEdgePrimitive(pattern.buffer), strip, pattern, args: null };\r\n }\r\n return this._edges;\r\n }\r\n if (this._edgesTag !== this._changeTag) {\r\n this._edgesTag = this._changeTag;\r\n this._edges?.primitive.dispose();\r\n this._edges = null;\r\n const tag = this._changeTag;\r\n this.buildEdges(strip).then(\r\n (edges) => {\r\n // Superseded by a change made while reading back\r\n if (this.disposed || this._edgesTag !== tag) {\r\n edges?.primitive.dispose();\r\n } else {\r\n this._edges = edges;\r\n }\r\n },\r\n (err) => console.error(`Building the wireframe of a primitive failed: ${err}`)\r\n );\r\n }\r\n return this._edges;\r\n }\r\n /** @internal A line list over the vertex buffers of this primitive */\r\n private createEdgePrimitive(indexBuffer: IndexBuffer) {\r\n const primitive = new Primitive();\r\n for (const info of this._vertexLayoutOptions.vertexBuffers) {\r\n primitive.setVertexBuffer(info.buffer, info.stepMode);\r\n }\r\n primitive.setIndexBuffer(indexBuffer);\r\n primitive.primitiveType = 'line-list';\r\n return primitive;\r\n }\r\n /**\r\n * @internal Edges of an indexed primitive from its indices read back: 6 per triangle, every\r\n * edge of every triangle, so a range of a triangle list maps to twice its start and count\r\n */\r\n private async buildEdges(strip: boolean): Promise<Nullable<PrimitiveEdges>> {\r\n const ib = this.getIndexBuffer()!;\r\n const bytes = await ib.getBufferSubData();\r\n const indices =\r\n ib.indexType.primitiveType === PBPrimitiveType.U16\r\n ? new Uint16Array(bytes.buffer, bytes.byteOffset, bytes.byteLength >> 1)\r\n : new Uint32Array(bytes.buffer, bytes.byteOffset, bytes.byteLength >> 2);\r\n const lines =\r\n ib.indexType.primitiveType === PBPrimitiveType.U16\r\n ? new Uint16Array(edgeIndexCount(indices.length, strip))\r\n : new Uint32Array(edgeIndexCount(indices.length, strip));\r\n writeEdges(lines, strip, (i) => indices[i], indices.length);\r\n if (this.disposed) {\r\n return null;\r\n }\r\n const device = getDevice();\r\n const buffer = device.createIndexBuffer(lines as Uint16Array<ArrayBuffer> | Uint32Array<ArrayBuffer>, {\r\n managed: true\r\n });\r\n return { primitive: this.createEdgePrimitive(buffer), strip, pattern: null, args: null };\r\n }\r\n /**\r\n * @internal Draw the edges of a range of this primitive in place of its triangles, false if\r\n * they are not available\r\n */\r\n private drawEdges(start: number, count: number, numInstances: number) {\r\n const edges = this.getEdges();\r\n if (!edges) {\r\n return false;\r\n }\r\n const [first, triangles] = edgeTriangles(start, count, edges.strip);\r\n if (triangles <= 0) {\r\n return true;\r\n }\r\n const primitive = edges.primitive;\r\n primitive.checkVertexLayout();\r\n const layout = primitive._vertexLayout;\r\n if (!layout) {\r\n return true;\r\n }\r\n const pattern = edges.pattern;\r\n if (!pattern || first + triangles <= pattern.triangles) {\r\n // Index buffers hold 6 edge indices per triangle, slot t at 6t\r\n if (numInstances > 0) {\r\n layout.drawInstanced('line-list', first * 6, triangles * 6, numInstances);\r\n } else {\r\n layout.draw('line-list', first * 6, triangles * 6);\r\n }\r\n return true;\r\n }\r\n // Beyond the pattern: chunks of it, moved along the vertices by the base vertex of indirect draws\r\n const device = getDevice();\r\n if (!device.getDeviceCaps().miscCaps.supportDrawIndirect) {\r\n return false;\r\n }\r\n const chunk = pattern.triangles;\r\n const chunks = Math.ceil(triangles / chunk);\r\n const key = `${first}:${triangles}:${numInstances}`;\r\n let args = edges.args;\r\n if (!args || args.key !== key) {\r\n const data = new Uint32Array(chunks * 5);\r\n for (let i = 0; i < chunks; i++) {\r\n const t = first + i * chunk;\r\n data[i * 5] = Math.min(chunk, triangles - i * chunk) * 6;\r\n data[i * 5 + 1] = Math.max(numInstances, 1);\r\n // Triangle t starts at vertex 3t of a list, t of a strip\r\n data[i * 5 + 3] = t * (edges.strip ? 1 : 3);\r\n }\r\n if (!args || args.buffer.byteLength < data.byteLength) {\r\n args?.buffer.dispose();\r\n args = {\r\n key,\r\n buffer: device.createBuffer(Math.max(data.byteLength, 320), { usage: 'indirect' })\r\n };\r\n edges.args = args;\r\n }\r\n args.key = key;\r\n args.buffer.bufferSubData(0, data);\r\n }\r\n device.setVertexLayout(layout);\r\n for (let i = 0; i < chunks; i++) {\r\n device.drawIndexedIndirect('line-list', args.buffer, i * 20);\r\n }\r\n return true;\r\n }\r\n /**\r\n * Dispose this primitive and release associated GPU resources.\r\n */\r\n protected onDispose() {\r\n super.onDispose();\r\n this._edges?.primitive.dispose();\r\n this._edges?.args?.buffer.dispose();\r\n this._edges = null;\r\n this._vertexLayout?.dispose();\r\n this._vertexLayout = null;\r\n if (this._vertexLayoutOptions) {\r\n releaseObject(this._vertexLayoutOptions.indexBuffer ?? null);\r\n for (const info of this._vertexLayoutOptions.vertexBuffers) {\r\n releaseObject(info.buffer);\r\n }\r\n }\r\n }\r\n /*\r\n createAABBTree(): AABBTree {\r\n const indices = this.getIndexBuffer() ? this.getIndexBuffer().getData() : null;\r\n const vertices = (this.getVertexBuffer(VERTEX_ATTRIB_POSITION)?.getData() as Float32Array) || null;\r\n const aabbtree = new AABBTree();\r\n aabbtree.buildFromPrimitives(vertices, indices, this._primitiveType);\r\n return aabbtree;\r\n }\r\n */\r\n /**\r\n * Get the bounding volume associated with this primitive.\r\n *\r\n * @returns The current bounding volume, or `null` if not set.\r\n */\r\n getBoundingVolume() {\r\n return this._bbox;\r\n }\r\n /**\r\n * Set or replace the bounding volume of this primitive.\r\n *\r\n * Triggers registered bounding-volume change callbacks.\r\n *\r\n * @param bv - The bounding volume to set.\r\n * @returns void\r\n */\r\n setBoundingVolume(bv: BoundingVolume) {\r\n if (bv !== this._bbox) {\r\n this._bbox = bv;\r\n this.dispatchEvent('bv_changed');\r\n }\r\n }\r\n /**\r\n * Test intersection against the current axis-aligned bounding box (AABB).\r\n *\r\n * @param ray - Ray to test against the primitive's AABB (derived from its bounding volume).\r\n * @returns The distance from ray origin to the intersection, or `null` if no hit or no AABB.\r\n */\r\n raycast(ray: Ray) {\r\n const aabb = this.getBoundingVolume()?.toAABB();\r\n return aabb ? ray.bboxIntersectionTestEx(aabb) : null;\r\n }\r\n /** @internal */\r\n private checkVertexLayout() {\r\n if (this._vertexLayoutDirty) {\r\n this._vertexLayout?.dispose();\r\n const device = getDevice();\r\n this._vertexLayout = device.createVertexLayout(this._vertexLayoutOptions);\r\n this._vertexLayoutDirty = false;\r\n }\r\n }\r\n /** @internal */\r\n private calcDefaultIndexCount() {\r\n const indexBuffer = this.getIndexBuffer();\r\n if (indexBuffer) {\r\n return Math.max(0, indexBuffer.length - this._indexStart);\r\n }\r\n const info = this.getVertexBufferInfo('position');\r\n if (info) {\r\n return Math.max(\r\n 0,\r\n Math.floor((info.buffer.byteLength - info.drawOffset) / info.stride) - this._indexStart\r\n );\r\n }\r\n return 0;\r\n }\r\n}\r\n"],"names":["EDGE_PATTERN_TRIANGLES","edgePatterns","edgeIndexCount","count","strip","Math","max","floor","writeEdges","out","index","triangles","t","i","a","b","c","set","edgeTriangles","start","getEdgePattern","pattern","data","Uint32Array","buffer","getDevice","createIndexBuffer","managed","retainObject","Primitive","makeObservable","Disposable","_nextId","_vertexLayout","_vertexLayoutOptions","vertexBuffers","_primitiveType","_indexStart","_indexCount","_defaultIndexCount","_vertexLayoutDirty","_id","_changeTag","_bbox","_lods","_edges","_edgesTag","id","changeTag","clone","other","copyFrom","info","setVertexBuffer","stepMode","setIndexBuffer","indexBuffer","primitiveType","indexStart","indexCount","lods","type","RenderBundleWrapper","primitiveChanged","val","calcDefaultIndexCount","map","lod","lodCount","length","getNumVertices","posInfo","getVertexBufferInfo","byteLength","stride","getNumFaces","ib","getIndexBuffer","indexType","PBPrimitiveType","U16","removeVertexBuffer","semantic","matchVertexBuffer","releaseObject","splice","getVertexBuffer","checkVertexLayout","createAndSetVertexBuffer","format","options","device","Array","isArray","createInterleavedVertexBuffer","createVertexBuffer","push","createAndSetIndexBuffer","dynamic","draw","getLodRange","DEBUG_VIEWS","isWireframeActive","drawEdges","drawInstanced","numInstances","level","min","drawIndirect","indirectBuffer","indirectOffset","edgeOffset","edgeBuffer","edges","getEdges","primitive","setVertexLayout","drawIndexedIndirect","dispose","createEdgePrimitive","args","tag","buildEdges","then","disposed","err","console","error","bytes","getBufferSubData","indices","Uint16Array","byteOffset","lines","first","layout","getDeviceCaps","miscCaps","supportDrawIndirect","chunk","chunks","ceil","key","createBuffer","usage","bufferSubData","onDispose","getBoundingVolume","setBoundingVolume","bv","dispatchEvent","raycast","ray","aabb","toAABB","bboxIntersectionTestEx","createVertexLayout","drawOffset"],"mappings":"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"}
|