@zephyr3d/scene 0.9.26 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +60 -27
- package/dist/animation/animation_bank.js +634 -0
- package/dist/animation/animation_bank.js.map +1 -0
- package/dist/animation/animation_bank_gpu.js +256 -0
- package/dist/animation/animation_bank_gpu.js.map +1 -0
- package/dist/animation/animationset.js +146 -30
- package/dist/animation/animationset.js.map +1 -1
- package/dist/animation/cloth/gpu_cloth_component.js +406 -0
- package/dist/animation/cloth/gpu_cloth_component.js.map +1 -0
- package/dist/animation/cloth/gpu_cloth_system.js +332 -202
- package/dist/animation/cloth/gpu_cloth_system.js.map +1 -1
- package/dist/animation/gpu_animation_driver.js +289 -0
- package/dist/animation/gpu_animation_driver.js.map +1 -0
- package/dist/animation/joint_dynamics/collision.js +112 -1
- package/dist/animation/joint_dynamics/collision.js.map +1 -1
- package/dist/animation/joint_dynamics/controller.js +6 -0
- package/dist/animation/joint_dynamics/controller.js.map +1 -1
- package/dist/animation/joint_dynamics/joint_dynamics_system.js +11 -0
- package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -1
- package/dist/animation/joint_dynamics/solver.js +50 -12
- package/dist/animation/joint_dynamics/solver.js.map +1 -1
- package/dist/animation/joint_dynamics/types.js.map +1 -1
- package/dist/animation/skeleton.js +300 -56
- package/dist/animation/skeleton.js.map +1 -1
- package/dist/animation/skin_palette_atlas.js +252 -0
- package/dist/animation/skin_palette_atlas.js.map +1 -0
- package/dist/animation/spring/multi_chain_spring_system.js +298 -38
- package/dist/animation/spring/multi_chain_spring_system.js.map +1 -1
- package/dist/animation/spring/spring_chain.js +2 -0
- package/dist/animation/spring/spring_chain.js.map +1 -1
- package/dist/animation/spring/spring_collider.js +159 -21
- package/dist/animation/spring/spring_collider.js.map +1 -1
- package/dist/animation/spring/spring_particle.js +1 -0
- package/dist/animation/spring/spring_particle.js.map +1 -1
- package/dist/animation/spring/spring_solver.js +173 -0
- package/dist/animation/spring/spring_solver.js.map +1 -0
- package/dist/animation/spring/spring_system.js +249 -24
- package/dist/animation/spring/spring_system.js.map +1 -1
- package/dist/animation/spring_modifier.js +32 -1
- package/dist/animation/spring_modifier.js.map +1 -1
- package/dist/app/app.js +26 -0
- package/dist/app/app.js.map +1 -1
- package/dist/app/engine.js +86 -15
- package/dist/app/engine.js.map +1 -1
- package/dist/app/gamepad.js +191 -0
- package/dist/app/gamepad.js.map +1 -0
- package/dist/app/inputactions.js +271 -0
- package/dist/app/inputactions.js.map +1 -0
- package/dist/app/inputmgr.js +331 -22
- package/dist/app/inputmgr.js.map +1 -1
- package/dist/app/loading.js +138 -0
- package/dist/app/loading.js.map +1 -0
- package/dist/app/pipelinecache.js +209 -0
- package/dist/app/pipelinecache.js.map +1 -0
- package/dist/app/runtimescript.js +25 -0
- package/dist/app/runtimescript.js.map +1 -1
- package/dist/app/scriptingsystem.js +54 -0
- package/dist/app/scriptingsystem.js.map +1 -1
- package/dist/app/scriptregistry.js +7 -2
- package/dist/app/scriptregistry.js.map +1 -1
- package/dist/asset/asset_manifest.js +59 -0
- package/dist/asset/asset_manifest.js.map +1 -0
- package/dist/asset/asset_preload.js +258 -0
- package/dist/asset/asset_preload.js.map +1 -0
- package/dist/asset/assetmanager.js +117 -65
- package/dist/asset/assetmanager.js.map +1 -1
- package/dist/asset/loaders/ktx2/basis/LICENSE +201 -0
- package/dist/asset/loaders/ktx2/basis/basis_transcoder.js +2 -0
- package/dist/asset/loaders/ktx2/basis/basis_transcoder.wasm +0 -0
- package/dist/asset/loaders/ktx2/basis_location.js +17 -0
- package/dist/asset/loaders/ktx2/basis_location.js.map +1 -0
- package/dist/asset/loaders/ktx2/ktx2_loader.js +88 -0
- package/dist/asset/loaders/ktx2/ktx2_loader.js.map +1 -0
- package/dist/asset/loaders/ktx2/ktx2_targets.js +118 -0
- package/dist/asset/loaders/ktx2/ktx2_targets.js.map +1 -0
- package/dist/asset/loaders/ktx2/transcoder_pool.js +259 -0
- package/dist/asset/loaders/ktx2/transcoder_pool.js.map +1 -0
- package/dist/asset/mesh_lod_builder.js +104 -0
- package/dist/asset/mesh_lod_builder.js.map +1 -0
- package/dist/asset/mesh_settings.js +111 -0
- package/dist/asset/mesh_settings.js.map +1 -0
- package/dist/asset/meshopt_decoder.js +18 -0
- package/dist/asset/meshopt_decoder.js.map +1 -0
- package/dist/asset/meshopt_simplifier.js +26 -0
- package/dist/asset/meshopt_simplifier.js.map +1 -0
- package/dist/asset/model.js +177 -3
- package/dist/asset/model.js.map +1 -1
- package/dist/asset/texture_settings.js +231 -0
- package/dist/asset/texture_settings.js.map +1 -0
- package/dist/asset/zmsh_binary.js +131 -0
- package/dist/asset/zmsh_binary.js.map +1 -0
- package/dist/asset/zsdf_binary.js +111 -0
- package/dist/asset/zsdf_binary.js.map +1 -0
- package/dist/blitter/bilateralblur.js +1 -2
- package/dist/blitter/bilateralblur.js.map +1 -1
- package/dist/blitter/gaussianblur.js +1 -6
- package/dist/blitter/gaussianblur.js.map +1 -1
- package/dist/camera/base.js +31 -10
- package/dist/camera/base.js.map +1 -1
- package/dist/camera/camera.js +178 -200
- package/dist/camera/camera.js.map +1 -1
- package/dist/camera/follow.js +342 -0
- package/dist/camera/follow.js.map +1 -0
- package/dist/camera/fps.js +9 -7
- package/dist/camera/fps.js.map +1 -1
- package/dist/camera/orbit.js +46 -19
- package/dist/camera/orbit.js.map +1 -1
- package/dist/index.d.ts +30475 -19865
- package/dist/index.js +67 -12
- package/dist/index.js.map +1 -1
- package/dist/material/blinn.js +3 -0
- package/dist/material/blinn.js.map +1 -1
- package/dist/material/eye.js +1 -1
- package/dist/material/eye.js.map +1 -1
- package/dist/material/hair.js +2 -3
- package/dist/material/hair.js.map +1 -1
- package/dist/material/hairstrand.js +235 -235
- package/dist/material/hairstrand.js.map +1 -1
- package/dist/material/lambert.js +4 -1
- package/dist/material/lambert.js.map +1 -1
- package/dist/material/material.js +362 -300
- package/dist/material/material.js.map +1 -1
- package/dist/material/meshmaterial.js +118 -45
- package/dist/material/meshmaterial.js.map +1 -1
- package/dist/material/mixins/lightmodel/blinnphong.js +1 -1
- package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
- package/dist/material/mixins/lightmodel/lambert.js +1 -1
- package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +34 -61
- package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +16 -2
- package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrspecularglossness.js +2 -1
- package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
- package/dist/material/mixins/lit.js +223 -83
- package/dist/material/mixins/lit.js.map +1 -1
- package/dist/material/mixins/pbr/common.js +31 -206
- package/dist/material/mixins/pbr/common.js.map +1 -1
- package/dist/material/mtoon.js +1 -1
- package/dist/material/mtoon.js.map +1 -1
- package/dist/material/pbrmr.js +3 -0
- package/dist/material/pbrmr.js.map +1 -1
- package/dist/material/pbrsg.js +3 -0
- package/dist/material/pbrsg.js.map +1 -1
- package/dist/material/sdf_debug.js +78 -0
- package/dist/material/sdf_debug.js.map +1 -0
- package/dist/material/shader/helper.js +733 -190
- package/dist/material/shader/helper.js.map +1 -1
- package/dist/material/shader/terrain_blend.js +204 -43
- package/dist/material/shader/terrain_blend.js.map +1 -1
- package/dist/material/skin.js +331 -297
- package/dist/material/skin.js.map +1 -1
- package/dist/material/skinprofile.js +1058 -0
- package/dist/material/skinprofile.js.map +1 -0
- package/dist/material/sss.js +353 -0
- package/dist/material/sss.js.map +1 -0
- package/dist/material/sss_kernel.js +265 -0
- package/dist/material/sss_kernel.js.map +1 -0
- package/dist/material/sssprofile.js +879 -0
- package/dist/material/sssprofile.js.map +1 -0
- package/dist/material/subsurfaceprofile.js +4 -8
- package/dist/material/subsurfaceprofile.js.map +1 -1
- package/dist/material/terrain-cm.js +464 -188
- package/dist/material/terrain-cm.js.map +1 -1
- package/dist/material/unlit.js +3 -0
- package/dist/material/unlit.js.map +1 -1
- package/dist/material/water.js +2009 -201
- package/dist/material/water.js.map +1 -1
- package/dist/node_modules/meshoptimizer/LICENSE +21 -0
- package/dist/node_modules/meshoptimizer/meshopt_decoder.js +197 -0
- package/dist/node_modules/meshoptimizer/meshopt_decoder.js.map +1 -0
- package/dist/node_modules/meshoptimizer/meshopt_simplifier.js +677 -0
- package/dist/node_modules/meshoptimizer/meshopt_simplifier.js.map +1 -0
- package/dist/physics/character.js +226 -0
- package/dist/physics/character.js.map +1 -0
- package/dist/physics/collider.js +209 -0
- package/dist/physics/collider.js.map +1 -0
- package/dist/physics/events.js +79 -0
- package/dist/physics/events.js.map +1 -0
- package/dist/physics/joint.js +272 -0
- package/dist/physics/joint.js.map +1 -0
- package/dist/physics/node_physics.js +234 -0
- package/dist/physics/node_physics.js.map +1 -0
- package/dist/physics/part.js +91 -0
- package/dist/physics/part.js.map +1 -0
- package/dist/physics/rigid_body.js +379 -0
- package/dist/physics/rigid_body.js.map +1 -0
- package/dist/physics/vehicle.js +335 -0
- package/dist/physics/vehicle.js.map +1 -0
- package/dist/physics/world.js +25 -0
- package/dist/physics/world.js.map +1 -0
- package/dist/posteffect/bloom.js +49 -14
- package/dist/posteffect/bloom.js.map +1 -1
- package/dist/posteffect/motionblur.js +668 -63
- package/dist/posteffect/motionblur.js.map +1 -1
- package/dist/posteffect/posteffect.js +12 -1
- package/dist/posteffect/posteffect.js.map +1 -1
- package/dist/posteffect/postsss.js +572 -0
- package/dist/posteffect/postsss.js.map +1 -0
- package/dist/posteffect/sao.js +48 -50
- package/dist/posteffect/sao.js.map +1 -1
- package/dist/posteffect/skinsss.js +605 -355
- package/dist/posteffect/skinsss.js.map +1 -1
- package/dist/posteffect/ssgi.js +91 -162
- package/dist/posteffect/ssgi.js.map +1 -1
- package/dist/posteffect/ssr.js +3 -11
- package/dist/posteffect/ssr.js.map +1 -1
- package/dist/posteffect/sss.js +34 -15
- package/dist/posteffect/sss.js.map +1 -1
- package/dist/posteffect/taa.js +1 -0
- package/dist/posteffect/taa.js.map +1 -1
- package/dist/render/abuffer_oit.js +40 -39
- package/dist/render/abuffer_oit.js.map +1 -1
- package/dist/render/clipmap.js +328 -62
- package/dist/render/clipmap.js.map +1 -1
- package/dist/render/cluster_light.js +958 -224
- package/dist/render/cluster_light.js.map +1 -1
- package/dist/render/cull_visitor.js +26 -5
- package/dist/render/cull_visitor.js.map +1 -1
- package/dist/render/debug_views.js +37 -0
- package/dist/render/debug_views.js.map +1 -0
- package/dist/render/depthpass.js +5 -1
- package/dist/render/depthpass.js.map +1 -1
- package/dist/render/drawable_mixin.js +53 -6
- package/dist/render/drawable_mixin.js.map +1 -1
- package/dist/render/dualdepthpeeling_oit.js +53 -53
- package/dist/render/dualdepthpeeling_oit.js.map +1 -1
- package/dist/render/envlight.js +196 -113
- package/dist/render/envlight.js.map +1 -1
- package/dist/render/fbm_wavegenerator.js +8 -13
- package/dist/render/fbm_wavegenerator.js.map +1 -1
- package/dist/render/fft_wavegenerator.js +268 -136
- package/dist/render/fft_wavegenerator.js.map +1 -1
- package/dist/render/gerstner_wavegenerator.js +113 -28
- package/dist/render/gerstner_wavegenerator.js.map +1 -1
- package/dist/render/gi/probe_volume.js +1334 -0
- package/dist/render/gi/probe_volume.js.map +1 -0
- package/dist/render/gi/scene_gi.js +282 -0
- package/dist/render/gi/scene_gi.js.map +1 -0
- package/dist/render/gi/voxel_atlas.js +198 -0
- package/dist/render/gi/voxel_atlas.js.map +1 -0
- package/dist/render/gi/voxel_lighting.js +652 -0
- package/dist/render/gi/voxel_lighting.js.map +1 -0
- package/dist/render/gi/voxel_scene.js +642 -0
- package/dist/render/gi/voxel_scene.js.map +1 -0
- package/dist/render/gi/voxelize_pass.js +223 -0
- package/dist/render/gi/voxelize_pass.js.map +1 -0
- package/dist/render/globalbindgroup_allocator.js +3 -2
- package/dist/render/globalbindgroup_allocator.js.map +1 -1
- package/dist/render/gpu_picking.js +9 -36
- package/dist/render/gpu_picking.js.map +1 -1
- package/dist/render/hzb.js +80 -22
- package/dist/render/hzb.js.map +1 -1
- package/dist/render/instance_culling.js +499 -0
- package/dist/render/instance_culling.js.map +1 -0
- package/dist/render/lightpass.js +23 -9
- package/dist/render/lightpass.js.map +1 -1
- package/dist/render/lod.js +46 -0
- package/dist/render/lod.js.map +1 -0
- package/dist/render/oit.js +11 -11
- package/dist/render/oit.js.map +1 -1
- package/dist/render/primitive.js +301 -9
- package/dist/render/primitive.js.map +1 -1
- package/dist/render/primitive_readback.js +209 -0
- package/dist/render/primitive_readback.js.map +1 -0
- package/dist/render/render_queue.js +198 -11
- package/dist/render/render_queue.js.map +1 -1
- package/dist/render/renderer.js +14 -7
- package/dist/render/renderer.js.map +1 -1
- package/dist/render/rendergraph/blackboard.js +15 -1
- package/dist/render/rendergraph/blackboard.js.map +1 -1
- package/dist/render/rendergraph/executor.js +136 -0
- package/dist/render/rendergraph/executor.js.map +1 -1
- package/dist/render/rendergraph/forward_plus_builder.js +585 -59
- package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
- package/dist/render/rendergraph/frame_resource_requirements.js +1 -0
- package/dist/render/rendergraph/frame_resource_requirements.js.map +1 -1
- package/dist/render/rendergraph/history_resources.js +8 -1
- package/dist/render/rendergraph/history_resources.js.map +1 -1
- package/dist/render/rendergraph/scene_render_context.js +31 -2
- package/dist/render/rendergraph/scene_render_context.js.map +1 -1
- package/dist/render/rendergraph/types.js.map +1 -1
- package/dist/render/renderpass.js +28 -5
- package/dist/render/renderpass.js.map +1 -1
- package/dist/render/sdf/box_allocator.js +98 -0
- package/dist/render/sdf/box_allocator.js.map +1 -0
- package/dist/render/sdf/global_sdf.js +865 -0
- package/dist/render/sdf/global_sdf.js.map +1 -0
- package/dist/render/sdf/scene_sdf.js +562 -0
- package/dist/render/sdf/scene_sdf.js.map +1 -0
- package/dist/render/sdf/sdf_atlas.js +227 -0
- package/dist/render/sdf/sdf_atlas.js.map +1 -0
- package/dist/render/sdf/sdf_programs.js +42 -0
- package/dist/render/sdf/sdf_programs.js.map +1 -0
- package/dist/render/sdf/sdf_view.js +199 -0
- package/dist/render/sdf/sdf_view.js.map +1 -0
- package/dist/render/sdf/waterline.js +610 -0
- package/dist/render/sdf/waterline.js.map +1 -0
- package/dist/render/shadow_mask_pass.js +142 -25
- package/dist/render/shadow_mask_pass.js.map +1 -1
- package/dist/render/shore_wave_generator.js +1193 -0
- package/dist/render/shore_wave_generator.js.map +1 -0
- package/dist/render/sky.js +516 -86
- package/dist/render/sky.js.map +1 -1
- package/dist/render/transmission_thickness_pass.js +477 -0
- package/dist/render/transmission_thickness_pass.js.map +1 -0
- package/dist/render/underwater.js +524 -0
- package/dist/render/underwater.js.map +1 -0
- package/dist/render/virtualtexture/virtual_texture.js +1214 -0
- package/dist/render/virtualtexture/virtual_texture.js.map +1 -0
- package/dist/render/volumetric_cloud/cloud_common.js +472 -0
- package/dist/render/volumetric_cloud/cloud_common.js.map +1 -0
- package/dist/render/volumetric_cloud/cloud_noise.js +189 -0
- package/dist/render/volumetric_cloud/cloud_noise.js.map +1 -0
- package/dist/render/volumetric_cloud/debug_view.js +131 -0
- package/dist/render/volumetric_cloud/debug_view.js.map +1 -0
- package/dist/render/volumetric_cloud/resources.js +380 -0
- package/dist/render/volumetric_cloud/resources.js.map +1 -0
- package/dist/render/volumetric_cloud/sky_cache.js +380 -0
- package/dist/render/volumetric_cloud/sky_cache.js.map +1 -0
- package/dist/render/volumetric_cloud/volumetric_cloud.js +318 -0
- package/dist/render/volumetric_cloud/volumetric_cloud.js.map +1 -0
- package/dist/render/water_caustics.js +1195 -0
- package/dist/render/water_caustics.js.map +1 -0
- package/dist/render/water_foam.js +627 -0
- package/dist/render/water_foam.js.map +1 -0
- package/dist/render/water_interaction.js +1795 -0
- package/dist/render/water_interaction.js.map +1 -0
- package/dist/render/weightedblended_oit.js +36 -36
- package/dist/render/weightedblended_oit.js.map +1 -1
- package/dist/scene/basesprite.js +9 -4
- package/dist/scene/basesprite.js.map +1 -1
- package/dist/scene/batchgroup.js +108 -12
- package/dist/scene/batchgroup.js.map +1 -1
- package/dist/scene/environment.js +28 -7
- package/dist/scene/environment.js.map +1 -1
- package/dist/scene/foliage.js +1020 -0
- package/dist/scene/foliage.js.map +1 -0
- package/dist/scene/foliage_buckets.js +147 -0
- package/dist/scene/foliage_buckets.js.map +1 -0
- package/dist/scene/foliage_mask.js +358 -0
- package/dist/scene/foliage_mask.js.map +1 -0
- package/dist/scene/hair.js +15 -4
- package/dist/scene/hair.js.map +1 -1
- package/dist/scene/light.js +179 -13
- package/dist/scene/light.js.map +1 -1
- package/dist/scene/mesh.js +327 -45
- package/dist/scene/mesh.js.map +1 -1
- package/dist/scene/meshdrawable.js +6 -0
- package/dist/scene/meshdrawable.js.map +1 -1
- package/dist/scene/msdftext.js +9 -3
- package/dist/scene/msdftext.js.map +1 -1
- package/dist/scene/msdftextsprite.js +9 -3
- package/dist/scene/msdftextsprite.js.map +1 -1
- package/dist/scene/particlesys.js +8 -2
- package/dist/scene/particlesys.js.map +1 -1
- package/dist/scene/physics_settings.js +157 -0
- package/dist/scene/physics_settings.js.map +1 -0
- package/dist/scene/scene.js +190 -44
- package/dist/scene/scene.js.map +1 -1
- package/dist/scene/scene_node.js +147 -6
- package/dist/scene/scene_node.js.map +1 -1
- package/dist/scene/terrain-cm/bladegrassmaterial.js +735 -0
- package/dist/scene/terrain-cm/bladegrassmaterial.js.map +1 -0
- package/dist/scene/terrain-cm/grass.js +881 -42
- package/dist/scene/terrain-cm/grass.js.map +1 -1
- package/dist/scene/terrain-cm/grass_gpu.js +929 -0
- package/dist/scene/terrain-cm/grass_gpu.js.map +1 -0
- package/dist/scene/terrain-cm/grassmaterial.js +180 -9
- package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
- package/dist/scene/terrain-cm/terrain-cm.js +465 -36
- package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
- package/dist/scene/terrain-cm/terrain_gi_albedo.js +257 -0
- package/dist/scene/terrain-cm/terrain_gi_albedo.js.map +1 -0
- package/dist/scene/terrain-cm/terrain_rvt.js +395 -0
- package/dist/scene/terrain-cm/terrain_rvt.js.map +1 -0
- package/dist/scene/update_queue.js +54 -0
- package/dist/scene/update_queue.js.map +1 -0
- package/dist/scene/water.js +997 -96
- package/dist/scene/water.js.map +1 -1
- package/dist/scene/water_surface_sampler.js +324 -0
- package/dist/scene/water_surface_sampler.js.map +1 -0
- package/dist/scene/wind.js +317 -0
- package/dist/scene/wind.js.map +1 -0
- package/dist/shaders/atmosphere.js +388 -166
- package/dist/shaders/atmosphere.js.map +1 -1
- package/dist/shaders/fog.js +100 -32
- package/dist/shaders/fog.js.map +1 -1
- package/dist/shaders/gi.js +365 -0
- package/dist/shaders/gi.js.map +1 -0
- package/dist/shaders/ltc_rect.js +202 -0
- package/dist/shaders/ltc_rect.js.map +1 -0
- package/dist/shaders/misc.js +1 -10
- package/dist/shaders/misc.js.map +1 -1
- package/dist/shaders/noise.js +5 -1
- package/dist/shaders/noise.js.map +1 -1
- package/dist/shaders/probes.js +309 -0
- package/dist/shaders/probes.js.map +1 -0
- package/dist/shaders/sdf.js +537 -0
- package/dist/shaders/sdf.js.map +1 -0
- package/dist/shaders/shadow.js +104 -70
- package/dist/shaders/shadow.js.map +1 -1
- package/dist/shaders/skin_brdf.js +243 -0
- package/dist/shaders/skin_brdf.js.map +1 -0
- package/dist/shaders/ssr.js +6 -159
- package/dist/shaders/ssr.js.map +1 -1
- package/dist/shaders/temporal.js +38 -27
- package/dist/shaders/temporal.js.map +1 -1
- package/dist/shaders/water.js +40 -87
- package/dist/shaders/water.js.map +1 -1
- package/dist/shaders/water_medium.js +42 -0
- package/dist/shaders/water_medium.js.map +1 -0
- package/dist/shadow/dom.js +110 -19
- package/dist/shadow/dom.js.map +1 -1
- package/dist/shadow/esm.js +3 -3
- package/dist/shadow/esm.js.map +1 -1
- package/dist/shadow/pcf_opt.js +15 -48
- package/dist/shadow/pcf_opt.js.map +1 -1
- package/dist/shadow/pcf_pd.js +15 -53
- package/dist/shadow/pcf_pd.js.map +1 -1
- package/dist/shadow/pcss.js +34 -9
- package/dist/shadow/pcss.js.map +1 -1
- package/dist/shadow/shadow_impl.js +3 -8
- package/dist/shadow/shadow_impl.js.map +1 -1
- package/dist/shadow/shadow_region.js +87 -49
- package/dist/shadow/shadow_region.js.map +1 -1
- package/dist/shadow/shadowmapper.js +93 -53
- package/dist/shadow/shadowmapper.js.map +1 -1
- package/dist/shadow/ssm.js +18 -72
- package/dist/shadow/ssm.js.map +1 -1
- package/dist/shadow/vsm.js +3 -3
- package/dist/shadow/vsm.js.map +1 -1
- package/dist/shapes/shape.js +44 -1
- package/dist/shapes/shape.js.map +1 -1
- package/dist/utility/buoyancy.js +287 -0
- package/dist/utility/buoyancy.js.map +1 -0
- package/dist/utility/physical.js +10 -1
- package/dist/utility/physical.js.map +1 -1
- package/dist/utility/pmrem.js +17 -43
- package/dist/utility/pmrem.js.map +1 -1
- package/dist/utility/sdf/bake.js +435 -0
- package/dist/utility/sdf/bake.js.map +1 -0
- package/dist/utility/sdf/bvh.js +576 -0
- package/dist/utility/sdf/bvh.js.map +1 -0
- package/dist/utility/serialization/manager.js +36 -6
- package/dist/utility/serialization/manager.js.map +1 -1
- package/dist/utility/serialization/scene/animation.js +77 -7
- package/dist/utility/serialization/scene/animation.js.map +1 -1
- package/dist/utility/serialization/scene/batch.js +11 -4
- package/dist/utility/serialization/scene/batch.js.map +1 -1
- package/dist/utility/serialization/scene/camera.js +140 -279
- package/dist/utility/serialization/scene/camera.js.map +1 -1
- package/dist/utility/serialization/scene/cloth.js +25 -0
- package/dist/utility/serialization/scene/cloth.js.map +1 -0
- package/dist/utility/serialization/scene/common.js +14 -6
- package/dist/utility/serialization/scene/common.js.map +1 -1
- package/dist/utility/serialization/scene/foliage.js +821 -0
- package/dist/utility/serialization/scene/foliage.js.map +1 -0
- package/dist/utility/serialization/scene/hair.js +11 -4
- package/dist/utility/serialization/scene/hair.js.map +1 -1
- package/dist/utility/serialization/scene/light.js +115 -7
- package/dist/utility/serialization/scene/light.js.map +1 -1
- package/dist/utility/serialization/scene/material.js +388 -220
- package/dist/utility/serialization/scene/material.js.map +1 -1
- package/dist/utility/serialization/scene/mesh.js +69 -4
- package/dist/utility/serialization/scene/mesh.js.map +1 -1
- package/dist/utility/serialization/scene/node.js +140 -5
- package/dist/utility/serialization/scene/node.js.map +1 -1
- package/dist/utility/serialization/scene/node_physics.js +1318 -0
- package/dist/utility/serialization/scene/node_physics.js.map +1 -0
- package/dist/utility/serialization/scene/particle.js +11 -4
- package/dist/utility/serialization/scene/particle.js.map +1 -1
- package/dist/utility/serialization/scene/physics.js +120 -0
- package/dist/utility/serialization/scene/physics.js.map +1 -0
- package/dist/utility/serialization/scene/primitive.js +124 -10
- package/dist/utility/serialization/scene/primitive.js.map +1 -1
- package/dist/utility/serialization/scene/scene.js +1687 -51
- package/dist/utility/serialization/scene/scene.js.map +1 -1
- package/dist/utility/serialization/scene/sprite.js +11 -4
- package/dist/utility/serialization/scene/sprite.js.map +1 -1
- package/dist/utility/serialization/scene/terrain.js +163 -33
- package/dist/utility/serialization/scene/terrain.js.map +1 -1
- package/dist/utility/serialization/scene/text.js +11 -4
- package/dist/utility/serialization/scene/text.js.map +1 -1
- package/dist/utility/serialization/scene/water.js +2473 -114
- package/dist/utility/serialization/scene/water.js.map +1 -1
- package/dist/utility/serialization/types.js.map +1 -1
- package/dist/utility/shprojector.js +97 -109
- package/dist/utility/shprojector.js.map +1 -1
- package/dist/utility/textures/foam.js +170 -0
- package/dist/utility/textures/foam.js.map +1 -0
- package/dist/utility/textures/ggxlut.js +17 -43
- package/dist/utility/textures/ggxlut.js.map +1 -1
- package/dist/utility/textures/ltcdata.js +4 -4
- package/dist/utility/textures/ltcdata.js.map +1 -1
- package/dist/utility/textures/ltclut.js +16 -6
- package/dist/utility/textures/ltclut.js.map +1 -1
- package/dist/utility/unsupported.js +24 -0
- package/dist/utility/unsupported.js.map +1 -0
- package/dist/values.js +13 -1
- package/dist/values.js.map +1 -1
- package/package.json +25 -12
- package/src/asset/loaders/ktx2/basis/LICENSE +201 -0
- package/src/asset/loaders/ktx2/basis/basis_transcoder.js +2 -0
- package/src/asset/loaders/ktx2/basis/basis_transcoder.wasm +0 -0
- package/src/asset/meshoptimizer/LICENSE +21 -0
|
@@ -0,0 +1,406 @@
|
|
|
1
|
+
import { Disposable, Vector3 } from '@zephyr3d/base';
|
|
2
|
+
import { createCapsuleCollider, createPlaneCollider, createBoxCollider, createSphereCollider } from '../spring/spring_collider.js';
|
|
3
|
+
import { GPUClothSystem } from './gpu_cloth_system.js';
|
|
4
|
+
|
|
5
|
+
const DEFAULT_CONFIG = {
|
|
6
|
+
version: 1,
|
|
7
|
+
sourceId: '',
|
|
8
|
+
enabled: true,
|
|
9
|
+
simulationMeshId: '',
|
|
10
|
+
gravity: [
|
|
11
|
+
0,
|
|
12
|
+
-9.8,
|
|
13
|
+
0
|
|
14
|
+
],
|
|
15
|
+
damping: 0.02,
|
|
16
|
+
dynamicFriction: 0.15,
|
|
17
|
+
staticFriction: 0.3,
|
|
18
|
+
stiffness: 0.3,
|
|
19
|
+
poseFollow: 0,
|
|
20
|
+
substeps: 2,
|
|
21
|
+
solverIterations: 5,
|
|
22
|
+
maxNeighbors: 8,
|
|
23
|
+
maxTrianglesPerVertex: 16,
|
|
24
|
+
workgroupSize: 64,
|
|
25
|
+
rebuildNormals: true,
|
|
26
|
+
pinnedVertexWeights: '',
|
|
27
|
+
wrapTargets: [],
|
|
28
|
+
colliders: []
|
|
29
|
+
};
|
|
30
|
+
function finite(value, fallback) {
|
|
31
|
+
const result = Number(value);
|
|
32
|
+
return Number.isFinite(result) ? result : fallback;
|
|
33
|
+
}
|
|
34
|
+
function clamp(value, min, max, fallback) {
|
|
35
|
+
return Math.min(Math.max(finite(value, fallback), min), max);
|
|
36
|
+
}
|
|
37
|
+
function vec3(value, fallback) {
|
|
38
|
+
const source = Array.isArray(value) ? value : fallback;
|
|
39
|
+
return [
|
|
40
|
+
finite(source[0], fallback[0]),
|
|
41
|
+
finite(source[1], fallback[1]),
|
|
42
|
+
finite(source[2], fallback[2])
|
|
43
|
+
];
|
|
44
|
+
}
|
|
45
|
+
function cloneBindingData(value) {
|
|
46
|
+
return {
|
|
47
|
+
version: 4,
|
|
48
|
+
vertexCount: Math.max(0, finite(value?.vertexCount, 0) | 0),
|
|
49
|
+
sourceVertexCount: Math.max(0, finite(value?.sourceVertexCount, 0) | 0),
|
|
50
|
+
influenceCount: Math.max(0, finite(value?.influenceCount, 0) | 0),
|
|
51
|
+
maxOffsetDistance: Math.max(0, finite(value?.maxOffsetDistance, 0)),
|
|
52
|
+
sourceTriangleIndices: String(value?.sourceTriangleIndices ?? ''),
|
|
53
|
+
sourceBarycentrics: String(value?.sourceBarycentrics ?? ''),
|
|
54
|
+
targetLocalOffsets: String(value?.targetLocalOffsets ?? '')
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
function normalizeNodePath(value) {
|
|
58
|
+
return Array.isArray(value) ? value.filter((entry)=>entry && typeof entry === 'object').map((entry)=>({
|
|
59
|
+
name: String(entry.name ?? ''),
|
|
60
|
+
sameNameIndex: Math.max(0, Math.floor(Number(entry.sameNameIndex) || 0))
|
|
61
|
+
})) : [];
|
|
62
|
+
}
|
|
63
|
+
function resolveMeshByReference(host, id, path) {
|
|
64
|
+
const root = typeof host?.getPrefabNode === 'function' && host.getPrefabNode() || host.scene?.rootNode || host;
|
|
65
|
+
if (Array.isArray(path)) {
|
|
66
|
+
let current = root;
|
|
67
|
+
for (const segment of normalizeNodePath(path)){
|
|
68
|
+
if (!current) {
|
|
69
|
+
break;
|
|
70
|
+
}
|
|
71
|
+
const matches = current.children.filter((child)=>child.name === segment.name);
|
|
72
|
+
current = matches[segment.sameNameIndex] ?? null;
|
|
73
|
+
if (!current) {
|
|
74
|
+
break;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
if (isMesh(current)) {
|
|
78
|
+
return current;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
const candidate = host.findNodeById(id) ?? root.findNodeById(id);
|
|
82
|
+
return isMesh(candidate) ? candidate : null;
|
|
83
|
+
}
|
|
84
|
+
/** Normalizes untrusted or older component data into the current schema. */ function normalizeGPUClothComponentConfig(value) {
|
|
85
|
+
const source = value ?? {};
|
|
86
|
+
return {
|
|
87
|
+
version: 1,
|
|
88
|
+
sourceId: String(source.sourceId ?? ''),
|
|
89
|
+
enabled: source.enabled !== false,
|
|
90
|
+
simulationMeshId: String(source.simulationMeshId ?? ''),
|
|
91
|
+
...Array.isArray(source.simulationMeshPath) ? {
|
|
92
|
+
simulationMeshPath: normalizeNodePath(source.simulationMeshPath)
|
|
93
|
+
} : {},
|
|
94
|
+
gravity: vec3(source.gravity, DEFAULT_CONFIG.gravity),
|
|
95
|
+
damping: clamp(source.damping, 0, 1, DEFAULT_CONFIG.damping),
|
|
96
|
+
dynamicFriction: clamp(source.dynamicFriction, 0, 1, DEFAULT_CONFIG.dynamicFriction),
|
|
97
|
+
staticFriction: clamp(source.staticFriction, 0, 1, DEFAULT_CONFIG.staticFriction),
|
|
98
|
+
stiffness: clamp(source.stiffness, 0, 1, DEFAULT_CONFIG.stiffness),
|
|
99
|
+
poseFollow: clamp(source.poseFollow, 0, 1, DEFAULT_CONFIG.poseFollow),
|
|
100
|
+
substeps: clamp(source.substeps, 1, 8, DEFAULT_CONFIG.substeps) | 0,
|
|
101
|
+
solverIterations: Math.max(1, finite(source.solverIterations, DEFAULT_CONFIG.solverIterations) | 0),
|
|
102
|
+
maxNeighbors: Math.max(1, finite(source.maxNeighbors, DEFAULT_CONFIG.maxNeighbors) | 0),
|
|
103
|
+
maxTrianglesPerVertex: Math.max(1, finite(source.maxTrianglesPerVertex, DEFAULT_CONFIG.maxTrianglesPerVertex) | 0),
|
|
104
|
+
workgroupSize: clamp(source.workgroupSize, 1, 256, DEFAULT_CONFIG.workgroupSize) | 0,
|
|
105
|
+
rebuildNormals: source.rebuildNormals !== false,
|
|
106
|
+
pinnedVertexWeights: String(source.pinnedVertexWeights ?? ''),
|
|
107
|
+
wrapTargets: (Array.isArray(source.wrapTargets) ? source.wrapTargets : []).filter((entry)=>!!entry?.meshId && !!entry.bindingData).map((entry)=>({
|
|
108
|
+
meshId: String(entry.meshId),
|
|
109
|
+
...Array.isArray(entry.meshPath) ? {
|
|
110
|
+
meshPath: normalizeNodePath(entry.meshPath)
|
|
111
|
+
} : {},
|
|
112
|
+
bindingData: cloneBindingData(entry.bindingData),
|
|
113
|
+
targetWrapWeights: String(entry.targetWrapWeights ?? '')
|
|
114
|
+
})),
|
|
115
|
+
colliders: (Array.isArray(source.colliders) ? source.colliders : []).map((entry)=>({
|
|
116
|
+
type: entry?.type === 'capsule' || entry?.type === 'plane' || entry?.type === 'box' ? entry.type : 'sphere',
|
|
117
|
+
enabled: entry?.enabled !== false,
|
|
118
|
+
nodeId: String(entry?.nodeId ?? ''),
|
|
119
|
+
offset: vec3(entry?.offset, [
|
|
120
|
+
0,
|
|
121
|
+
0,
|
|
122
|
+
0
|
|
123
|
+
]),
|
|
124
|
+
endOffset: vec3(entry?.endOffset, [
|
|
125
|
+
0,
|
|
126
|
+
0.2,
|
|
127
|
+
0
|
|
128
|
+
]),
|
|
129
|
+
radius: Math.max(0, finite(entry?.radius, 0.15)),
|
|
130
|
+
normal: vec3(entry?.normal, [
|
|
131
|
+
0,
|
|
132
|
+
1,
|
|
133
|
+
0
|
|
134
|
+
]),
|
|
135
|
+
size: vec3(entry?.size, [
|
|
136
|
+
0.3,
|
|
137
|
+
0.3,
|
|
138
|
+
0.3
|
|
139
|
+
])
|
|
140
|
+
}))
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
function isMesh(node) {
|
|
144
|
+
return !!node?.isMesh?.() && !!node.primitive;
|
|
145
|
+
}
|
|
146
|
+
function parsePinnedWeights(source, vertexCount) {
|
|
147
|
+
if (!source.trim() || vertexCount <= 0) {
|
|
148
|
+
return undefined;
|
|
149
|
+
}
|
|
150
|
+
const result = new Float32Array(vertexCount);
|
|
151
|
+
for (const token of source.split(',')){
|
|
152
|
+
const separator = token.indexOf(':');
|
|
153
|
+
if (separator < 0) {
|
|
154
|
+
continue;
|
|
155
|
+
}
|
|
156
|
+
const parsedIndex = Number(token.slice(0, separator).trim());
|
|
157
|
+
const clothWeight = clamp(Number(token.slice(separator + 1).trim()), 0, 1, 1);
|
|
158
|
+
if (!Number.isInteger(parsedIndex) || parsedIndex < 0 || parsedIndex >= vertexCount) {
|
|
159
|
+
continue;
|
|
160
|
+
}
|
|
161
|
+
result[parsedIndex] = 1 - clothWeight;
|
|
162
|
+
}
|
|
163
|
+
return result;
|
|
164
|
+
}
|
|
165
|
+
function parseTargetWrapWeights(source, vertexCount) {
|
|
166
|
+
if (!source.trim() || vertexCount <= 0) {
|
|
167
|
+
return undefined;
|
|
168
|
+
}
|
|
169
|
+
const result = new Float32Array(vertexCount);
|
|
170
|
+
result.fill(1);
|
|
171
|
+
for (const token of source.split(',')){
|
|
172
|
+
const separator = token.indexOf(':');
|
|
173
|
+
if (separator < 0) {
|
|
174
|
+
continue;
|
|
175
|
+
}
|
|
176
|
+
const parsedIndex = Number(token.slice(0, separator).trim());
|
|
177
|
+
if (!Number.isInteger(parsedIndex) || parsedIndex < 0 || parsedIndex >= vertexCount) {
|
|
178
|
+
continue;
|
|
179
|
+
}
|
|
180
|
+
result[parsedIndex] = clamp(Number(token.slice(separator + 1).trim()), 0, 1, 1);
|
|
181
|
+
}
|
|
182
|
+
return result;
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Serializable owner for one GPU cloth simulation.
|
|
186
|
+
*
|
|
187
|
+
* The component stores only stable asset data. GPU buffers are rebuilt when its host enters a scene.
|
|
188
|
+
*/ class GPUClothComponent extends Disposable {
|
|
189
|
+
_config;
|
|
190
|
+
_host;
|
|
191
|
+
_system;
|
|
192
|
+
_generation;
|
|
193
|
+
_rebuildPromise;
|
|
194
|
+
_disabledReason;
|
|
195
|
+
_simulationMesh;
|
|
196
|
+
constructor(config){
|
|
197
|
+
super();
|
|
198
|
+
this._config = normalizeGPUClothComponentConfig(config);
|
|
199
|
+
this._host = null;
|
|
200
|
+
this._system = null;
|
|
201
|
+
this._generation = 0;
|
|
202
|
+
this._rebuildPromise = null;
|
|
203
|
+
this._disabledReason = null;
|
|
204
|
+
this._simulationMesh = null;
|
|
205
|
+
}
|
|
206
|
+
get config() {
|
|
207
|
+
return normalizeGPUClothComponentConfig(this._config);
|
|
208
|
+
}
|
|
209
|
+
get host() {
|
|
210
|
+
return this._host;
|
|
211
|
+
}
|
|
212
|
+
get system() {
|
|
213
|
+
return this._system;
|
|
214
|
+
}
|
|
215
|
+
get disabledReason() {
|
|
216
|
+
return this._disabledReason;
|
|
217
|
+
}
|
|
218
|
+
setConfig(config) {
|
|
219
|
+
this._config = normalizeGPUClothComponentConfig(config);
|
|
220
|
+
return this.rebuild();
|
|
221
|
+
}
|
|
222
|
+
/** @internal */ attach(host) {
|
|
223
|
+
if (this._host === host) {
|
|
224
|
+
return;
|
|
225
|
+
}
|
|
226
|
+
if (this._host) {
|
|
227
|
+
throw new Error('GPU cloth component is already attached to another scene node.');
|
|
228
|
+
}
|
|
229
|
+
this._host = host;
|
|
230
|
+
host.on('nodeattached', this._handleHierarchyChanged, this);
|
|
231
|
+
host.on('noderemoved', this._handleHierarchyChanged, this);
|
|
232
|
+
if (host.attached) {
|
|
233
|
+
void this.rebuild();
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
/** @internal */ detach(host) {
|
|
237
|
+
if (!this._host || host && this._host !== host) {
|
|
238
|
+
return;
|
|
239
|
+
}
|
|
240
|
+
this._host.off('nodeattached', this._handleHierarchyChanged, this);
|
|
241
|
+
this._host.off('noderemoved', this._handleHierarchyChanged, this);
|
|
242
|
+
this._host = null;
|
|
243
|
+
this.releaseRuntime();
|
|
244
|
+
}
|
|
245
|
+
/** @internal */ hostAttached() {
|
|
246
|
+
if (this._host?.attached) {
|
|
247
|
+
void this.rebuild();
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
/** @internal */ hostDetached() {
|
|
251
|
+
this.releaseRuntime();
|
|
252
|
+
}
|
|
253
|
+
async rebuild() {
|
|
254
|
+
const generation = ++this._generation;
|
|
255
|
+
this.releaseSystem();
|
|
256
|
+
const previous = this._rebuildPromise;
|
|
257
|
+
const task = (async ()=>{
|
|
258
|
+
if (previous) {
|
|
259
|
+
await previous.catch(()=>undefined);
|
|
260
|
+
}
|
|
261
|
+
const host = this._host;
|
|
262
|
+
if (generation !== this._generation || !host?.attached || this.disposed) {
|
|
263
|
+
return;
|
|
264
|
+
}
|
|
265
|
+
await this.createSystem(host, generation);
|
|
266
|
+
})();
|
|
267
|
+
this._rebuildPromise = task;
|
|
268
|
+
try {
|
|
269
|
+
await task;
|
|
270
|
+
} finally{
|
|
271
|
+
if (this._rebuildPromise === task) {
|
|
272
|
+
this._rebuildPromise = null;
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
async createSystem(host, generation) {
|
|
277
|
+
const config = this._config;
|
|
278
|
+
const simulationMesh = resolveMeshByReference(host, config.simulationMeshId, config.simulationMeshPath);
|
|
279
|
+
if (!isMesh(simulationMesh)) {
|
|
280
|
+
this._disabledReason = 'GPU cloth simulation mesh was not found.';
|
|
281
|
+
return;
|
|
282
|
+
}
|
|
283
|
+
this.watchSimulationMesh(simulationMesh);
|
|
284
|
+
const gravity = simulationMesh.invWorldMatrix.transformVectorAffine(new Vector3(config.gravity[0], config.gravity[1], config.gravity[2]), new Vector3());
|
|
285
|
+
let system = null;
|
|
286
|
+
try {
|
|
287
|
+
system = await GPUClothSystem.createFromMesh(simulationMesh, {
|
|
288
|
+
enabled: config.enabled,
|
|
289
|
+
gravity,
|
|
290
|
+
damping: config.damping,
|
|
291
|
+
dynamicFriction: config.dynamicFriction,
|
|
292
|
+
staticFriction: config.staticFriction,
|
|
293
|
+
stiffness: config.stiffness,
|
|
294
|
+
poseFollow: config.poseFollow,
|
|
295
|
+
substeps: config.substeps,
|
|
296
|
+
solverIterations: config.solverIterations,
|
|
297
|
+
maxNeighbors: config.maxNeighbors,
|
|
298
|
+
maxTrianglesPerVertex: config.maxTrianglesPerVertex,
|
|
299
|
+
workgroupSize: config.workgroupSize,
|
|
300
|
+
rebuildNormals: config.rebuildNormals,
|
|
301
|
+
pinnedVertexWeights: parsePinnedWeights(config.pinnedVertexWeights, simulationMesh.primitive?.getNumVertices() ?? 0),
|
|
302
|
+
colliders: this.createColliders(host, config.colliders),
|
|
303
|
+
autoUpdate: true
|
|
304
|
+
});
|
|
305
|
+
const targets = this.resolveWrapTargets(host, simulationMesh, config.wrapTargets);
|
|
306
|
+
if (targets.length > 0) {
|
|
307
|
+
await system.setWrapTargetsFromBindingData(targets);
|
|
308
|
+
}
|
|
309
|
+
} catch (err) {
|
|
310
|
+
system?.dispose();
|
|
311
|
+
if (generation === this._generation) {
|
|
312
|
+
this._disabledReason = err instanceof Error ? err.message : String(err);
|
|
313
|
+
}
|
|
314
|
+
return;
|
|
315
|
+
}
|
|
316
|
+
if (generation !== this._generation || this.disposed || this._host !== host || !host.attached) {
|
|
317
|
+
system.dispose();
|
|
318
|
+
return;
|
|
319
|
+
}
|
|
320
|
+
this._system = system;
|
|
321
|
+
this._disabledReason = system.disabledReason;
|
|
322
|
+
}
|
|
323
|
+
createColliders(host, configs) {
|
|
324
|
+
const result = [];
|
|
325
|
+
for (const config of configs){
|
|
326
|
+
const node = (config.nodeId ? host.findNodeById(config.nodeId) : null) ?? host;
|
|
327
|
+
const offset = vec3(config.offset, [
|
|
328
|
+
0,
|
|
329
|
+
0,
|
|
330
|
+
0
|
|
331
|
+
]);
|
|
332
|
+
const endOffset = vec3(config.endOffset, [
|
|
333
|
+
0,
|
|
334
|
+
0.2,
|
|
335
|
+
0
|
|
336
|
+
]);
|
|
337
|
+
const normal = vec3(config.normal, [
|
|
338
|
+
0,
|
|
339
|
+
1,
|
|
340
|
+
0
|
|
341
|
+
]);
|
|
342
|
+
let collider;
|
|
343
|
+
if (config.type === 'capsule') {
|
|
344
|
+
collider = createCapsuleCollider(new Vector3(offset[0], offset[1], offset[2]), new Vector3(endOffset[0], endOffset[1], endOffset[2]), Math.max(0, finite(config.radius, 0.15)), node);
|
|
345
|
+
} else if (config.type === 'plane') {
|
|
346
|
+
collider = createPlaneCollider(new Vector3(offset[0], offset[1], offset[2]), new Vector3(normal[0], normal[1], normal[2]), node);
|
|
347
|
+
} else if (config.type === 'box') {
|
|
348
|
+
const size = vec3(config.size, [
|
|
349
|
+
0.3,
|
|
350
|
+
0.3,
|
|
351
|
+
0.3
|
|
352
|
+
]);
|
|
353
|
+
collider = createBoxCollider(new Vector3(offset[0], offset[1], offset[2]), new Vector3(Math.max(0.0001, size[0] * 0.5), Math.max(0.0001, size[1] * 0.5), Math.max(0.0001, size[2] * 0.5)), node);
|
|
354
|
+
} else {
|
|
355
|
+
collider = createSphereCollider(new Vector3(offset[0], offset[1], offset[2]), Math.max(0, finite(config.radius, 0.15)), node);
|
|
356
|
+
}
|
|
357
|
+
collider.enabled = config.enabled !== false;
|
|
358
|
+
result.push(collider);
|
|
359
|
+
}
|
|
360
|
+
return result;
|
|
361
|
+
}
|
|
362
|
+
resolveWrapTargets(host, simulationMesh, configs) {
|
|
363
|
+
const result = [];
|
|
364
|
+
for (const config of configs){
|
|
365
|
+
const target = resolveMeshByReference(host, config.meshId, config.meshPath);
|
|
366
|
+
if (isMesh(target) && target !== simulationMesh) {
|
|
367
|
+
result.push({
|
|
368
|
+
target,
|
|
369
|
+
data: cloneBindingData(config.bindingData),
|
|
370
|
+
targetWrapWeights: parseTargetWrapWeights(config.targetWrapWeights ?? '', target.primitive?.getNumVertices() ?? 0)
|
|
371
|
+
});
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
return result;
|
|
375
|
+
}
|
|
376
|
+
watchSimulationMesh(mesh) {
|
|
377
|
+
if (this._simulationMesh === mesh) {
|
|
378
|
+
return;
|
|
379
|
+
}
|
|
380
|
+
this._simulationMesh?.off('primitive_changed', this._handlePrimitiveChanged, this);
|
|
381
|
+
this._simulationMesh = mesh;
|
|
382
|
+
this._simulationMesh?.on('primitive_changed', this._handlePrimitiveChanged, this);
|
|
383
|
+
}
|
|
384
|
+
releaseSystem() {
|
|
385
|
+
this.watchSimulationMesh(null);
|
|
386
|
+
this._system?.dispose();
|
|
387
|
+
this._system = null;
|
|
388
|
+
}
|
|
389
|
+
releaseRuntime() {
|
|
390
|
+
this._generation++;
|
|
391
|
+
this.releaseSystem();
|
|
392
|
+
}
|
|
393
|
+
_handleHierarchyChanged() {
|
|
394
|
+
void this.rebuild();
|
|
395
|
+
}
|
|
396
|
+
_handlePrimitiveChanged() {
|
|
397
|
+
void this.rebuild();
|
|
398
|
+
}
|
|
399
|
+
onDispose() {
|
|
400
|
+
this.detach();
|
|
401
|
+
super.onDispose();
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
export { GPUClothComponent, normalizeGPUClothComponentConfig };
|
|
406
|
+
//# sourceMappingURL=gpu_cloth_component.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gpu_cloth_component.js","sources":["../../../src/animation/cloth/gpu_cloth_component.ts"],"sourcesContent":["import { Disposable, Vector3, type Nullable } from '@zephyr3d/base';\r\nimport type { Mesh } from '../../scene/mesh';\r\nimport type { SceneNode } from '../../scene/scene_node';\r\nimport {\r\n createCapsuleCollider,\r\n createBoxCollider,\r\n createPlaneCollider,\r\n createSphereCollider,\r\n type SpringCollider\r\n} from '../spring';\r\nimport {\r\n GPUClothSystem,\r\n type GPUClothWrapBindingData,\r\n type GPUClothWrapBindingTarget\r\n} from './gpu_cloth_system';\r\n\r\n/** Serialized collider used by {@link GPUClothComponent}. */\r\nexport type GPUClothColliderConfig = {\r\n type: 'sphere' | 'capsule' | 'plane' | 'box';\r\n enabled?: boolean;\r\n nodeId?: string;\r\n offset?: [number, number, number];\r\n endOffset?: [number, number, number];\r\n radius?: number;\r\n size?: [number, number, number];\r\n normal?: [number, number, number];\r\n};\r\n\r\n/** Serialized wrap target used by {@link GPUClothComponent}. */\r\nexport type GPUClothWrapTargetConfig = {\r\n meshId: string;\r\n meshPath?: Array<{ name: string; sameNameIndex: number }>;\r\n bindingData: GPUClothWrapBindingData;\r\n /** Sparse per-vertex wrap weights encoded as `vertexIndex:weight`. Missing vertices default to 1. */\r\n targetWrapWeights?: string;\r\n};\r\n\r\n/** Persistent configuration for a GPU cloth component. */\r\nexport type GPUClothComponentConfig = {\r\n version: 1;\r\n sourceId?: string;\r\n enabled: boolean;\r\n simulationMeshId: string;\r\n simulationMeshPath?: Array<{ name: string; sameNameIndex: number }>;\r\n gravity: [number, number, number];\r\n damping: number;\r\n dynamicFriction: number;\r\n staticFriction: number;\r\n stiffness: number;\r\n poseFollow: number;\r\n substeps: number;\r\n solverIterations: number;\r\n maxNeighbors: number;\r\n maxTrianglesPerVertex: number;\r\n workgroupSize: number;\r\n rebuildNormals: boolean;\r\n pinnedVertexWeights: string;\r\n wrapTargets: GPUClothWrapTargetConfig[];\r\n colliders: GPUClothColliderConfig[];\r\n};\r\n\r\nconst DEFAULT_CONFIG: GPUClothComponentConfig = {\r\n version: 1,\r\n sourceId: '',\r\n enabled: true,\r\n simulationMeshId: '',\r\n gravity: [0, -9.8, 0],\r\n damping: 0.02,\r\n dynamicFriction: 0.15,\r\n staticFriction: 0.3,\r\n stiffness: 0.3,\r\n poseFollow: 0,\r\n substeps: 2,\r\n solverIterations: 5,\r\n maxNeighbors: 8,\r\n maxTrianglesPerVertex: 16,\r\n workgroupSize: 64,\r\n rebuildNormals: true,\r\n pinnedVertexWeights: '',\r\n wrapTargets: [],\r\n colliders: []\r\n};\r\n\r\nfunction finite(value: unknown, fallback: number) {\r\n const result = Number(value);\r\n return Number.isFinite(result) ? result : fallback;\r\n}\r\n\r\nfunction clamp(value: unknown, min: number, max: number, fallback: number) {\r\n return Math.min(Math.max(finite(value, fallback), min), max);\r\n}\r\n\r\nfunction vec3(value: unknown, fallback: [number, number, number]): [number, number, number] {\r\n const source = Array.isArray(value) ? value : fallback;\r\n return [finite(source[0], fallback[0]), finite(source[1], fallback[1]), finite(source[2], fallback[2])];\r\n}\r\n\r\nfunction cloneBindingData(value: GPUClothWrapBindingData): GPUClothWrapBindingData {\r\n return {\r\n version: 4,\r\n vertexCount: Math.max(0, finite(value?.vertexCount, 0) | 0),\r\n sourceVertexCount: Math.max(0, finite(value?.sourceVertexCount, 0) | 0),\r\n influenceCount: Math.max(0, finite(value?.influenceCount, 0) | 0),\r\n maxOffsetDistance: Math.max(0, finite(value?.maxOffsetDistance, 0)),\r\n sourceTriangleIndices: String(value?.sourceTriangleIndices ?? ''),\r\n sourceBarycentrics: String(value?.sourceBarycentrics ?? ''),\r\n targetLocalOffsets: String(value?.targetLocalOffsets ?? '')\r\n };\r\n}\r\n\r\nfunction normalizeNodePath(value: unknown) {\r\n return Array.isArray(value)\r\n ? value\r\n .filter((entry) => entry && typeof entry === 'object')\r\n .map((entry: any) => ({\r\n name: String(entry.name ?? ''),\r\n sameNameIndex: Math.max(0, Math.floor(Number(entry.sameNameIndex) || 0))\r\n }))\r\n : [];\r\n}\r\n\r\nfunction resolveMeshByReference(\r\n host: SceneNode,\r\n id: string,\r\n path: Array<{ name: string; sameNameIndex: number }> | undefined\r\n) {\r\n const root = ((typeof (host as any)?.getPrefabNode === 'function' && (host as any).getPrefabNode()) ||\r\n host.scene?.rootNode ||\r\n host) as SceneNode;\r\n if (Array.isArray(path)) {\r\n let current: SceneNode | null = root;\r\n for (const segment of normalizeNodePath(path)) {\r\n if (!current) {\r\n break;\r\n }\r\n const matches: SceneNode[] = current.children.filter(\r\n (child) => child.name === segment.name\r\n ) as SceneNode[];\r\n current = matches[segment.sameNameIndex] ?? null;\r\n if (!current) {\r\n break;\r\n }\r\n }\r\n if (isMesh(current)) {\r\n return current;\r\n }\r\n }\r\n const candidate = host.findNodeById<SceneNode>(id) ?? root.findNodeById<SceneNode>(id);\r\n return isMesh(candidate) ? candidate : null;\r\n}\r\n\r\n/** Normalizes untrusted or older component data into the current schema. */\r\nexport function normalizeGPUClothComponentConfig(\r\n value?: Partial<GPUClothComponentConfig> | null\r\n): GPUClothComponentConfig {\r\n const source = value ?? {};\r\n return {\r\n version: 1,\r\n sourceId: String(source.sourceId ?? ''),\r\n enabled: source.enabled !== false,\r\n simulationMeshId: String(source.simulationMeshId ?? ''),\r\n ...(Array.isArray(source.simulationMeshPath)\r\n ? { simulationMeshPath: normalizeNodePath(source.simulationMeshPath) }\r\n : {}),\r\n gravity: vec3(source.gravity, DEFAULT_CONFIG.gravity),\r\n damping: clamp(source.damping, 0, 1, DEFAULT_CONFIG.damping),\r\n dynamicFriction: clamp(source.dynamicFriction, 0, 1, DEFAULT_CONFIG.dynamicFriction),\r\n staticFriction: clamp(source.staticFriction, 0, 1, DEFAULT_CONFIG.staticFriction),\r\n stiffness: clamp(source.stiffness, 0, 1, DEFAULT_CONFIG.stiffness),\r\n poseFollow: clamp(source.poseFollow, 0, 1, DEFAULT_CONFIG.poseFollow),\r\n substeps: clamp(source.substeps, 1, 8, DEFAULT_CONFIG.substeps) | 0,\r\n solverIterations: Math.max(1, finite(source.solverIterations, DEFAULT_CONFIG.solverIterations) | 0),\r\n maxNeighbors: Math.max(1, finite(source.maxNeighbors, DEFAULT_CONFIG.maxNeighbors) | 0),\r\n maxTrianglesPerVertex: Math.max(\r\n 1,\r\n finite(source.maxTrianglesPerVertex, DEFAULT_CONFIG.maxTrianglesPerVertex) | 0\r\n ),\r\n workgroupSize: clamp(source.workgroupSize, 1, 256, DEFAULT_CONFIG.workgroupSize) | 0,\r\n rebuildNormals: source.rebuildNormals !== false,\r\n pinnedVertexWeights: String(source.pinnedVertexWeights ?? ''),\r\n wrapTargets: (Array.isArray(source.wrapTargets) ? source.wrapTargets : [])\r\n .filter((entry) => !!entry?.meshId && !!entry.bindingData)\r\n .map((entry) => ({\r\n meshId: String(entry.meshId),\r\n ...(Array.isArray(entry.meshPath) ? { meshPath: normalizeNodePath(entry.meshPath) } : {}),\r\n bindingData: cloneBindingData(entry.bindingData),\r\n targetWrapWeights: String(entry.targetWrapWeights ?? '')\r\n })),\r\n colliders: (Array.isArray(source.colliders) ? source.colliders : []).map((entry) => ({\r\n type:\r\n entry?.type === 'capsule' || entry?.type === 'plane' || entry?.type === 'box' ? entry.type : 'sphere',\r\n enabled: entry?.enabled !== false,\r\n nodeId: String(entry?.nodeId ?? ''),\r\n offset: vec3(entry?.offset, [0, 0, 0]),\r\n endOffset: vec3(entry?.endOffset, [0, 0.2, 0]),\r\n radius: Math.max(0, finite(entry?.radius, 0.15)),\r\n normal: vec3(entry?.normal, [0, 1, 0]),\r\n size: vec3(entry?.size, [0.3, 0.3, 0.3])\r\n }))\r\n };\r\n}\r\n\r\nfunction isMesh(node: Nullable<SceneNode>): node is Mesh {\r\n return !!node?.isMesh?.() && !!(node as Mesh).primitive;\r\n}\r\n\r\nfunction parsePinnedWeights(source: string, vertexCount: number) {\r\n if (!source.trim() || vertexCount <= 0) {\r\n return undefined;\r\n }\r\n const result = new Float32Array(vertexCount);\r\n for (const token of source.split(',')) {\r\n const separator = token.indexOf(':');\r\n if (separator < 0) {\r\n continue;\r\n }\r\n const parsedIndex = Number(token.slice(0, separator).trim());\r\n const clothWeight = clamp(Number(token.slice(separator + 1).trim()), 0, 1, 1);\r\n if (!Number.isInteger(parsedIndex) || parsedIndex < 0 || parsedIndex >= vertexCount) {\r\n continue;\r\n }\r\n result[parsedIndex] = 1 - clothWeight;\r\n }\r\n return result;\r\n}\r\n\r\nfunction parseTargetWrapWeights(source: string, vertexCount: number) {\r\n if (!source.trim() || vertexCount <= 0) {\r\n return undefined;\r\n }\r\n const result = new Float32Array(vertexCount);\r\n result.fill(1);\r\n for (const token of source.split(',')) {\r\n const separator = token.indexOf(':');\r\n if (separator < 0) {\r\n continue;\r\n }\r\n const parsedIndex = Number(token.slice(0, separator).trim());\r\n if (!Number.isInteger(parsedIndex) || parsedIndex < 0 || parsedIndex >= vertexCount) {\r\n continue;\r\n }\r\n result[parsedIndex] = clamp(Number(token.slice(separator + 1).trim()), 0, 1, 1);\r\n }\r\n return result;\r\n}\r\n\r\n/**\r\n * Serializable owner for one GPU cloth simulation.\r\n *\r\n * The component stores only stable asset data. GPU buffers are rebuilt when its host enters a scene.\r\n */\r\nexport class GPUClothComponent extends Disposable {\r\n private _config: GPUClothComponentConfig;\r\n private _host: Nullable<SceneNode>;\r\n private _system: Nullable<GPUClothSystem>;\r\n private _generation: number;\r\n private _rebuildPromise: Nullable<Promise<void>>;\r\n private _disabledReason: Nullable<string>;\r\n private _simulationMesh: Nullable<Mesh>;\r\n\r\n constructor(config?: Partial<GPUClothComponentConfig> | null) {\r\n super();\r\n this._config = normalizeGPUClothComponentConfig(config);\r\n this._host = null;\r\n this._system = null;\r\n this._generation = 0;\r\n this._rebuildPromise = null;\r\n this._disabledReason = null;\r\n this._simulationMesh = null;\r\n }\r\n\r\n get config() {\r\n return normalizeGPUClothComponentConfig(this._config);\r\n }\r\n\r\n get host() {\r\n return this._host;\r\n }\r\n\r\n get system() {\r\n return this._system;\r\n }\r\n\r\n get disabledReason() {\r\n return this._disabledReason;\r\n }\r\n\r\n setConfig(config: Partial<GPUClothComponentConfig>) {\r\n this._config = normalizeGPUClothComponentConfig(config);\r\n return this.rebuild();\r\n }\r\n\r\n /** @internal */\r\n attach(host: SceneNode) {\r\n if (this._host === host) {\r\n return;\r\n }\r\n if (this._host) {\r\n throw new Error('GPU cloth component is already attached to another scene node.');\r\n }\r\n this._host = host;\r\n host.on('nodeattached', this._handleHierarchyChanged, this);\r\n host.on('noderemoved', this._handleHierarchyChanged, this);\r\n if (host.attached) {\r\n void this.rebuild();\r\n }\r\n }\r\n\r\n /** @internal */\r\n detach(host?: SceneNode) {\r\n if (!this._host || (host && this._host !== host)) {\r\n return;\r\n }\r\n this._host.off('nodeattached', this._handleHierarchyChanged, this);\r\n this._host.off('noderemoved', this._handleHierarchyChanged, this);\r\n this._host = null;\r\n this.releaseRuntime();\r\n }\r\n\r\n /** @internal */\r\n hostAttached() {\r\n if (this._host?.attached) {\r\n void this.rebuild();\r\n }\r\n }\r\n\r\n /** @internal */\r\n hostDetached() {\r\n this.releaseRuntime();\r\n }\r\n\r\n async rebuild() {\r\n const generation = ++this._generation;\r\n this.releaseSystem();\r\n const previous = this._rebuildPromise;\r\n const task = (async () => {\r\n if (previous) {\r\n await previous.catch(() => undefined);\r\n }\r\n const host = this._host;\r\n if (generation !== this._generation || !host?.attached || this.disposed) {\r\n return;\r\n }\r\n await this.createSystem(host, generation);\r\n })();\r\n this._rebuildPromise = task;\r\n try {\r\n await task;\r\n } finally {\r\n if (this._rebuildPromise === task) {\r\n this._rebuildPromise = null;\r\n }\r\n }\r\n }\r\n\r\n private async createSystem(host: SceneNode, generation: number) {\r\n const config = this._config;\r\n const simulationMesh = resolveMeshByReference(host, config.simulationMeshId, config.simulationMeshPath);\r\n if (!isMesh(simulationMesh)) {\r\n this._disabledReason = 'GPU cloth simulation mesh was not found.';\r\n return;\r\n }\r\n this.watchSimulationMesh(simulationMesh);\r\n const gravity = simulationMesh.invWorldMatrix.transformVectorAffine(\r\n new Vector3(config.gravity[0], config.gravity[1], config.gravity[2]),\r\n new Vector3()\r\n );\r\n let system: Nullable<GPUClothSystem> = null;\r\n try {\r\n system = await GPUClothSystem.createFromMesh(simulationMesh, {\r\n enabled: config.enabled,\r\n gravity,\r\n damping: config.damping,\r\n dynamicFriction: config.dynamicFriction,\r\n staticFriction: config.staticFriction,\r\n stiffness: config.stiffness,\r\n poseFollow: config.poseFollow,\r\n substeps: config.substeps,\r\n solverIterations: config.solverIterations,\r\n maxNeighbors: config.maxNeighbors,\r\n maxTrianglesPerVertex: config.maxTrianglesPerVertex,\r\n workgroupSize: config.workgroupSize,\r\n rebuildNormals: config.rebuildNormals,\r\n pinnedVertexWeights: parsePinnedWeights(\r\n config.pinnedVertexWeights,\r\n simulationMesh.primitive?.getNumVertices() ?? 0\r\n ),\r\n colliders: this.createColliders(host, config.colliders),\r\n autoUpdate: true\r\n });\r\n const targets = this.resolveWrapTargets(host, simulationMesh, config.wrapTargets);\r\n if (targets.length > 0) {\r\n await system.setWrapTargetsFromBindingData(targets);\r\n }\r\n } catch (err) {\r\n system?.dispose();\r\n if (generation === this._generation) {\r\n this._disabledReason = err instanceof Error ? err.message : String(err);\r\n }\r\n return;\r\n }\r\n if (generation !== this._generation || this.disposed || this._host !== host || !host.attached) {\r\n system.dispose();\r\n return;\r\n }\r\n this._system = system;\r\n this._disabledReason = system.disabledReason;\r\n }\r\n\r\n private createColliders(host: SceneNode, configs: GPUClothColliderConfig[]) {\r\n const result: SpringCollider[] = [];\r\n for (const config of configs) {\r\n const node = (config.nodeId ? host.findNodeById<SceneNode>(config.nodeId) : null) ?? host;\r\n const offset = vec3(config.offset, [0, 0, 0]);\r\n const endOffset = vec3(config.endOffset, [0, 0.2, 0]);\r\n const normal = vec3(config.normal, [0, 1, 0]);\r\n let collider: SpringCollider;\r\n if (config.type === 'capsule') {\r\n collider = createCapsuleCollider(\r\n new Vector3(offset[0], offset[1], offset[2]),\r\n new Vector3(endOffset[0], endOffset[1], endOffset[2]),\r\n Math.max(0, finite(config.radius, 0.15)),\r\n node\r\n );\r\n } else if (config.type === 'plane') {\r\n collider = createPlaneCollider(\r\n new Vector3(offset[0], offset[1], offset[2]),\r\n new Vector3(normal[0], normal[1], normal[2]),\r\n node\r\n );\r\n } else if (config.type === 'box') {\r\n const size = vec3(config.size, [0.3, 0.3, 0.3]);\r\n collider = createBoxCollider(\r\n new Vector3(offset[0], offset[1], offset[2]),\r\n new Vector3(\r\n Math.max(0.0001, size[0] * 0.5),\r\n Math.max(0.0001, size[1] * 0.5),\r\n Math.max(0.0001, size[2] * 0.5)\r\n ),\r\n node\r\n );\r\n } else {\r\n collider = createSphereCollider(\r\n new Vector3(offset[0], offset[1], offset[2]),\r\n Math.max(0, finite(config.radius, 0.15)),\r\n node\r\n );\r\n }\r\n collider.enabled = config.enabled !== false;\r\n result.push(collider);\r\n }\r\n return result;\r\n }\r\n\r\n private resolveWrapTargets(host: SceneNode, simulationMesh: Mesh, configs: GPUClothWrapTargetConfig[]) {\r\n const result: GPUClothWrapBindingTarget[] = [];\r\n for (const config of configs) {\r\n const target = resolveMeshByReference(host, config.meshId, config.meshPath);\r\n if (isMesh(target) && target !== simulationMesh) {\r\n result.push({\r\n target,\r\n data: cloneBindingData(config.bindingData),\r\n targetWrapWeights: parseTargetWrapWeights(\r\n config.targetWrapWeights ?? '',\r\n target.primitive?.getNumVertices() ?? 0\r\n )\r\n });\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n private watchSimulationMesh(mesh: Nullable<Mesh>) {\r\n if (this._simulationMesh === mesh) {\r\n return;\r\n }\r\n this._simulationMesh?.off('primitive_changed', this._handlePrimitiveChanged, this);\r\n this._simulationMesh = mesh;\r\n this._simulationMesh?.on('primitive_changed', this._handlePrimitiveChanged, this);\r\n }\r\n\r\n private releaseSystem() {\r\n this.watchSimulationMesh(null);\r\n this._system?.dispose();\r\n this._system = null;\r\n }\r\n\r\n private releaseRuntime() {\r\n this._generation++;\r\n this.releaseSystem();\r\n }\r\n\r\n private _handleHierarchyChanged() {\r\n void this.rebuild();\r\n }\r\n\r\n private _handlePrimitiveChanged() {\r\n void this.rebuild();\r\n }\r\n\r\n protected onDispose() {\r\n this.detach();\r\n super.onDispose();\r\n }\r\n}\r\n"],"names":["DEFAULT_CONFIG","version","sourceId","enabled","simulationMeshId","gravity","damping","dynamicFriction","staticFriction","stiffness","poseFollow","substeps","solverIterations","maxNeighbors","maxTrianglesPerVertex","workgroupSize","rebuildNormals","pinnedVertexWeights","wrapTargets","colliders","finite","value","fallback","result","Number","isFinite","clamp","min","max","Math","vec3","source","Array","isArray","cloneBindingData","vertexCount","sourceVertexCount","influenceCount","maxOffsetDistance","sourceTriangleIndices","String","sourceBarycentrics","targetLocalOffsets","normalizeNodePath","filter","entry","map","name","sameNameIndex","floor","resolveMeshByReference","host","id","path","root","getPrefabNode","scene","rootNode","current","segment","matches","children","child","isMesh","candidate","findNodeById","normalizeGPUClothComponentConfig","simulationMeshPath","meshId","bindingData","meshPath","targetWrapWeights","type","nodeId","offset","endOffset","radius","normal","size","node","primitive","parsePinnedWeights","trim","undefined","Float32Array","token","split","separator","indexOf","parsedIndex","slice","clothWeight","isInteger","parseTargetWrapWeights","fill","GPUClothComponent","Disposable","_config","_host","_system","_generation","_rebuildPromise","_disabledReason","_simulationMesh","config","system","disabledReason","setConfig","rebuild","attach","Error","on","_handleHierarchyChanged","attached","detach","off","releaseRuntime","hostAttached","hostDetached","generation","releaseSystem","previous","task","catch","disposed","createSystem","simulationMesh","watchSimulationMesh","invWorldMatrix","transformVectorAffine","Vector3","GPUClothSystem","createFromMesh","getNumVertices","createColliders","autoUpdate","targets","resolveWrapTargets","length","setWrapTargetsFromBindingData","err","dispose","message","configs","collider","createCapsuleCollider","createPlaneCollider","createBoxCollider","createSphereCollider","push","target","data","mesh","_handlePrimitiveChanged","onDispose"],"mappings":"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"}
|