@zephyr3d/scene 0.7.1 → 0.8.1
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/dist/animation/animation.js +0 -18
- package/dist/animation/animation.js.map +1 -1
- package/dist/animation/animationset.js +200 -3
- package/dist/animation/animationset.js.map +1 -1
- package/dist/animation/ik/ccd_solver.js +371 -0
- package/dist/animation/ik/ccd_solver.js.map +1 -0
- package/dist/animation/ik/fabrik_solver.js +398 -0
- package/dist/animation/ik/fabrik_solver.js.map +1 -0
- package/dist/animation/ik/ik_angle_constraint.js +181 -0
- package/dist/animation/ik/ik_angle_constraint.js.map +1 -0
- package/dist/animation/ik/ik_chain.js +163 -0
- package/dist/animation/ik/ik_chain.js.map +1 -0
- package/dist/animation/ik/ik_constraint.js +25 -0
- package/dist/animation/ik/ik_constraint.js.map +1 -0
- package/dist/animation/ik/ik_pole_constraint.js +128 -0
- package/dist/animation/ik/ik_pole_constraint.js.map +1 -0
- package/dist/animation/ik/ik_solver.js +48 -0
- package/dist/animation/ik/ik_solver.js.map +1 -0
- package/dist/animation/ik/ik_track.js +96 -0
- package/dist/animation/ik/ik_track.js.map +1 -0
- package/dist/animation/ik/ik_utils.js +191 -0
- package/dist/animation/ik/ik_utils.js.map +1 -0
- package/dist/animation/ik/two_bone_ik_solver.js +331 -0
- package/dist/animation/ik/two_bone_ik_solver.js.map +1 -0
- package/dist/animation/ik_modifier.js +61 -0
- package/dist/animation/ik_modifier.js.map +1 -0
- package/dist/animation/ik_postprocessor.js +71 -0
- package/dist/animation/ik_postprocessor.js.map +1 -0
- package/dist/animation/manual_transform_processor.js +156 -0
- package/dist/animation/manual_transform_processor.js.map +1 -0
- package/dist/animation/skeleton.js +55 -51
- package/dist/animation/skeleton.js.map +1 -1
- package/dist/animation/skeleton_modifier.js +38 -0
- package/dist/animation/skeleton_modifier.js.map +1 -0
- package/dist/animation/skeleton_postprocessor.js +50 -0
- package/dist/animation/skeleton_postprocessor.js.map +1 -0
- package/dist/animation/spring/multi_chain_spring_system.js +503 -0
- package/dist/animation/spring/multi_chain_spring_system.js.map +1 -0
- package/dist/animation/spring/spring_bone.js +240 -0
- package/dist/animation/spring/spring_bone.js.map +1 -0
- package/dist/animation/spring/spring_bone_collider.js +198 -0
- package/dist/animation/spring/spring_bone_collider.js.map +1 -0
- package/dist/animation/spring/spring_bone_constraint.js +170 -0
- package/dist/animation/spring/spring_bone_constraint.js.map +1 -0
- package/dist/animation/spring/spring_bone_system.js +328 -0
- package/dist/animation/spring/spring_bone_system.js.map +1 -0
- package/dist/animation/spring/spring_chain.js +103 -0
- package/dist/animation/spring/spring_chain.js.map +1 -0
- package/dist/animation/spring/spring_collider.js +247 -0
- package/dist/animation/spring/spring_collider.js.map +1 -0
- package/dist/animation/spring/spring_constraint.js +21 -0
- package/dist/animation/spring/spring_constraint.js.map +1 -0
- package/dist/animation/spring/spring_particle.js +20 -0
- package/dist/animation/spring/spring_particle.js.map +1 -0
- package/dist/animation/spring/spring_system.js +526 -0
- package/dist/animation/spring/spring_system.js.map +1 -0
- package/dist/animation/spring_modifier.js +45 -0
- package/dist/animation/spring_modifier.js.map +1 -0
- package/dist/animation/spring_postprocessor.js +54 -0
- package/dist/animation/spring_postprocessor.js.map +1 -0
- package/dist/app/screen.js +1 -1
- package/dist/app/screen.js.map +1 -1
- package/dist/asset/model.js +10 -6
- package/dist/asset/model.js.map +1 -1
- package/dist/camera/perspectivecamera.js +3 -3
- package/dist/camera/perspectivecamera.js.map +1 -1
- package/dist/index.d.ts +1400 -4
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -1
- package/dist/material/mixins/lightmodel/blinnphong.js +66 -4
- package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
- package/dist/material/mixins/pbr/common.js +20 -17
- package/dist/material/mixins/pbr/common.js.map +1 -1
- package/dist/material/shader/helper.js +5 -3
- package/dist/material/shader/helper.js.map +1 -1
- package/dist/render/gpu_picking.js +100 -0
- package/dist/render/gpu_picking.js.map +1 -0
- package/dist/render/rendergraph/device_pool_allocator.js +41 -0
- package/dist/render/rendergraph/device_pool_allocator.js.map +1 -0
- package/dist/render/rendergraph/executor.js +146 -0
- package/dist/render/rendergraph/executor.js.map +1 -0
- package/dist/render/rendergraph/forward_plus_builder.js +414 -0
- package/dist/render/rendergraph/forward_plus_builder.js.map +1 -0
- package/dist/render/rendergraph/rendergraph.js +306 -0
- package/dist/render/rendergraph/rendergraph.js.map +1 -0
- package/dist/render/rendergraph/types.js +57 -0
- package/dist/render/rendergraph/types.js.map +1 -0
- package/dist/render/sky_motion_vector.js +85 -0
- package/dist/render/sky_motion_vector.js.map +1 -0
- package/dist/scene/mesh.js +15 -23
- package/dist/scene/mesh.js.map +1 -1
- package/dist/utility/serialization/scene/animation.js +24 -23
- package/dist/utility/serialization/scene/animation.js.map +1 -1
- package/dist/utility/serialization/scene/material.js +62 -0
- package/dist/utility/serialization/scene/material.js.map +1 -1
- package/dist/utility/serialization/scene/node.js +1 -1
- package/package.json +3 -3
- package/dist/node_modules/@zephyr3d/runtime/dist/runtime/runtimemgr.js +0 -38
- package/dist/node_modules/@zephyr3d/runtime/dist/runtime/runtimemgr.js.map +0 -1
- package/dist/node_modules/@zephyr3d/runtime/dist/runtime/runtimescript.js +0 -10
- package/dist/node_modules/@zephyr3d/runtime/dist/runtime/runtimescript.js.map +0 -1
- package/dist/node_modules/@zephyr3d/runtime/dist/runtime/scriptingsystem.js +0 -127
- package/dist/node_modules/@zephyr3d/runtime/dist/runtime/scriptingsystem.js.map +0 -1
- package/dist/node_modules/@zephyr3d/runtime/dist/runtime/scriptregistry.js +0 -263
- package/dist/node_modules/@zephyr3d/runtime/dist/runtime/scriptregistry.js.map +0 -1
- package/dist/src/animation/animation.js +0 -127
- package/dist/src/animation/animation.js.map +0 -1
- package/dist/src/animation/animationset.js +0 -255
- package/dist/src/animation/animationset.js.map +0 -1
- package/dist/src/animation/animationtrack.js +0 -34
- package/dist/src/animation/animationtrack.js.map +0 -1
- package/dist/src/animation/eulerrotationtrack.js +0 -52
- package/dist/src/animation/eulerrotationtrack.js.map +0 -1
- package/dist/src/animation/morphtarget.js +0 -93
- package/dist/src/animation/morphtarget.js.map +0 -1
- package/dist/src/animation/morphtrack.js +0 -70
- package/dist/src/animation/morphtrack.js.map +0 -1
- package/dist/src/animation/proptrack.js +0 -161
- package/dist/src/animation/proptrack.js.map +0 -1
- package/dist/src/animation/rotationtrack.js +0 -51
- package/dist/src/animation/rotationtrack.js.map +0 -1
- package/dist/src/animation/scaletrack.js +0 -50
- package/dist/src/animation/scaletrack.js.map +0 -1
- package/dist/src/animation/skeleton.js +0 -204
- package/dist/src/animation/skeleton.js.map +0 -1
- package/dist/src/animation/translationtrack.js +0 -50
- package/dist/src/animation/translationtrack.js.map +0 -1
- package/dist/src/app/app.js +0 -129
- package/dist/src/app/app.js.map +0 -1
- package/dist/src/app/inputmgr.js +0 -267
- package/dist/src/app/inputmgr.js.map +0 -1
- package/dist/src/asset/assetmanager.js +0 -404
- package/dist/src/asset/assetmanager.js.map +0 -1
- package/dist/src/asset/builtin.js +0 -337
- package/dist/src/asset/builtin.js.map +0 -1
- package/dist/src/asset/loaders/dds/dds.js +0 -470
- package/dist/src/asset/loaders/dds/dds.js.map +0 -1
- package/dist/src/asset/loaders/dds/dds_loader.js +0 -28
- package/dist/src/asset/loaders/dds/dds_loader.js.map +0 -1
- package/dist/src/asset/loaders/gltf/gltf_loader.js +0 -1265
- package/dist/src/asset/loaders/gltf/gltf_loader.js.map +0 -1
- package/dist/src/asset/loaders/gltf/helpers.js +0 -327
- package/dist/src/asset/loaders/gltf/helpers.js.map +0 -1
- package/dist/src/asset/loaders/hdr/hdr.js +0 -180
- package/dist/src/asset/loaders/hdr/hdr.js.map +0 -1
- package/dist/src/asset/loaders/image/tga_Loader.js +0 -116
- package/dist/src/asset/loaders/image/tga_Loader.js.map +0 -1
- package/dist/src/asset/loaders/image/webimage_loader.js +0 -63
- package/dist/src/asset/loaders/image/webimage_loader.js.map +0 -1
- package/dist/src/asset/loaders/loader.js +0 -45
- package/dist/src/asset/loaders/loader.js.map +0 -1
- package/dist/src/asset/model.js +0 -414
- package/dist/src/asset/model.js.map +0 -1
- package/dist/src/blitter/bilateralblur.js +0 -221
- package/dist/src/blitter/bilateralblur.js.map +0 -1
- package/dist/src/blitter/blitter.js +0 -390
- package/dist/src/blitter/blitter.js.map +0 -1
- package/dist/src/blitter/box.js +0 -118
- package/dist/src/blitter/box.js.map +0 -1
- package/dist/src/blitter/copy.js +0 -22
- package/dist/src/blitter/copy.js.map +0 -1
- package/dist/src/blitter/gaussianblur.js +0 -228
- package/dist/src/blitter/gaussianblur.js.map +0 -1
- package/dist/src/camera/base.js +0 -92
- package/dist/src/camera/base.js.map +0 -1
- package/dist/src/camera/camera.js +0 -1005
- package/dist/src/camera/camera.js.map +0 -1
- package/dist/src/camera/fps.js +0 -238
- package/dist/src/camera/fps.js.map +0 -1
- package/dist/src/camera/orbit.js +0 -245
- package/dist/src/camera/orbit.js.map +0 -1
- package/dist/src/camera/orthocamera.js +0 -167
- package/dist/src/camera/orthocamera.js.map +0 -1
- package/dist/src/camera/perspectivecamera.js +0 -141
- package/dist/src/camera/perspectivecamera.js.map +0 -1
- package/dist/src/index.js +0 -120
- package/dist/src/index.js.map +0 -1
- package/dist/src/material/blinn.js +0 -81
- package/dist/src/material/blinn.js.map +0 -1
- package/dist/src/material/grassmaterial.js +0 -113
- package/dist/src/material/grassmaterial.js.map +0 -1
- package/dist/src/material/lambert.js +0 -92
- package/dist/src/material/lambert.js.map +0 -1
- package/dist/src/material/material.js +0 -301
- package/dist/src/material/material.js.map +0 -1
- package/dist/src/material/meshmaterial.js +0 -704
- package/dist/src/material/meshmaterial.js.map +0 -1
- package/dist/src/material/mixins/albedocolor.js +0 -76
- package/dist/src/material/mixins/albedocolor.js.map +0 -1
- package/dist/src/material/mixins/foliage.js +0 -47
- package/dist/src/material/mixins/foliage.js.map +0 -1
- package/dist/src/material/mixins/lightmodel/blinnphong.js +0 -112
- package/dist/src/material/mixins/lightmodel/blinnphong.js.map +0 -1
- package/dist/src/material/mixins/lightmodel/lambert.js +0 -58
- package/dist/src/material/mixins/lightmodel/lambert.js.map +0 -1
- package/dist/src/material/mixins/lightmodel/pbrmetallicroughness.js +0 -178
- package/dist/src/material/mixins/lightmodel/pbrmetallicroughness.js.map +0 -1
- package/dist/src/material/mixins/lightmodel/pbrspecularglossness.js +0 -139
- package/dist/src/material/mixins/lightmodel/pbrspecularglossness.js.map +0 -1
- package/dist/src/material/mixins/lit.js +0 -476
- package/dist/src/material/mixins/lit.js.map +0 -1
- package/dist/src/material/mixins/pbr/common.js +0 -918
- package/dist/src/material/mixins/pbr/common.js.map +0 -1
- package/dist/src/material/mixins/texture.js +0 -172
- package/dist/src/material/mixins/texture.js.map +0 -1
- package/dist/src/material/mixins/vertexcolor.js +0 -56
- package/dist/src/material/mixins/vertexcolor.js.map +0 -1
- package/dist/src/material/particle.js +0 -178
- package/dist/src/material/particle.js.map +0 -1
- package/dist/src/material/pbrmr.js +0 -97
- package/dist/src/material/pbrmr.js.map +0 -1
- package/dist/src/material/pbrsg.js +0 -97
- package/dist/src/material/pbrsg.js.map +0 -1
- package/dist/src/material/shader/helper.js +0 -1209
- package/dist/src/material/shader/helper.js.map +0 -1
- package/dist/src/material/terrain-cm.js +0 -606
- package/dist/src/material/terrain-cm.js.map +0 -1
- package/dist/src/material/terrainmaterial.js +0 -375
- package/dist/src/material/terrainmaterial.js.map +0 -1
- package/dist/src/material/unlit.js +0 -41
- package/dist/src/material/unlit.js.map +0 -1
- package/dist/src/material/water.js +0 -417
- package/dist/src/material/water.js.map +0 -1
- package/dist/src/posteffect/bloom.js +0 -361
- package/dist/src/posteffect/bloom.js.map +0 -1
- package/dist/src/posteffect/compositor.js +0 -226
- package/dist/src/posteffect/compositor.js.map +0 -1
- package/dist/src/posteffect/fxaa.js +0 -273
- package/dist/src/posteffect/fxaa.js.map +0 -1
- package/dist/src/posteffect/grayscale.js +0 -69
- package/dist/src/posteffect/grayscale.js.map +0 -1
- package/dist/src/posteffect/motionblur.js +0 -96
- package/dist/src/posteffect/motionblur.js.map +0 -1
- package/dist/src/posteffect/posteffect.js +0 -126
- package/dist/src/posteffect/posteffect.js.map +0 -1
- package/dist/src/posteffect/sao.js +0 -324
- package/dist/src/posteffect/sao.js.map +0 -1
- package/dist/src/posteffect/ssr.js +0 -489
- package/dist/src/posteffect/ssr.js.map +0 -1
- package/dist/src/posteffect/taa.js +0 -172
- package/dist/src/posteffect/taa.js.map +0 -1
- package/dist/src/posteffect/tonemap.js +0 -94
- package/dist/src/posteffect/tonemap.js.map +0 -1
- package/dist/src/render/abuffer_oit.js +0 -361
- package/dist/src/render/abuffer_oit.js.map +0 -1
- package/dist/src/render/clipmap.js +0 -851
- package/dist/src/render/clipmap.js.map +0 -1
- package/dist/src/render/cluster_light.js +0 -333
- package/dist/src/render/cluster_light.js.map +0 -1
- package/dist/src/render/cull_visitor.js +0 -187
- package/dist/src/render/cull_visitor.js.map +0 -1
- package/dist/src/render/depthpass.js +0 -68
- package/dist/src/render/depthpass.js.map +0 -1
- package/dist/src/render/drawable_mixin.js +0 -227
- package/dist/src/render/drawable_mixin.js.map +0 -1
- package/dist/src/render/envlight.js +0 -463
- package/dist/src/render/envlight.js.map +0 -1
- package/dist/src/render/fbm_wavegenerator.js +0 -251
- package/dist/src/render/fbm_wavegenerator.js.map +0 -1
- package/dist/src/render/fft_wavegenerator.js +0 -1006
- package/dist/src/render/fft_wavegenerator.js.map +0 -1
- package/dist/src/render/fullscreenquad.js +0 -38
- package/dist/src/render/fullscreenquad.js.map +0 -1
- package/dist/src/render/gerstner_wavegenerator.js +0 -314
- package/dist/src/render/gerstner_wavegenerator.js.map +0 -1
- package/dist/src/render/globalbindgroup_allocator.js +0 -60
- package/dist/src/render/globalbindgroup_allocator.js.map +0 -1
- package/dist/src/render/hzb.js +0 -273
- package/dist/src/render/hzb.js.map +0 -1
- package/dist/src/render/lightpass.js +0 -172
- package/dist/src/render/lightpass.js.map +0 -1
- package/dist/src/render/objectcolorpass.js +0 -51
- package/dist/src/render/objectcolorpass.js.map +0 -1
- package/dist/src/render/primitive.js +0 -364
- package/dist/src/render/primitive.js.map +0 -1
- package/dist/src/render/render_queue.js +0 -467
- package/dist/src/render/render_queue.js.map +0 -1
- package/dist/src/render/renderbundle_wrapper.js +0 -152
- package/dist/src/render/renderbundle_wrapper.js.map +0 -1
- package/dist/src/render/renderer.js +0 -455
- package/dist/src/render/renderer.js.map +0 -1
- package/dist/src/render/renderpass.js +0 -200
- package/dist/src/render/renderpass.js.map +0 -1
- package/dist/src/render/shadowmap_pass.js +0 -56
- package/dist/src/render/shadowmap_pass.js.map +0 -1
- package/dist/src/render/sky.js +0 -1103
- package/dist/src/render/sky.js.map +0 -1
- package/dist/src/render/weightedblended_oit.js +0 -168
- package/dist/src/render/weightedblended_oit.js.map +0 -1
- package/dist/src/scene/batchgroup.js +0 -162
- package/dist/src/scene/batchgroup.js.map +0 -1
- package/dist/src/scene/environment.js +0 -209
- package/dist/src/scene/environment.js.map +0 -1
- package/dist/src/scene/graph_node.js +0 -72
- package/dist/src/scene/graph_node.js.map +0 -1
- package/dist/src/scene/light.js +0 -416
- package/dist/src/scene/light.js.map +0 -1
- package/dist/src/scene/mesh.js +0 -341
- package/dist/src/scene/mesh.js.map +0 -1
- package/dist/src/scene/octree.js +0 -649
- package/dist/src/scene/octree.js.map +0 -1
- package/dist/src/scene/particlesys.js +0 -738
- package/dist/src/scene/particlesys.js.map +0 -1
- package/dist/src/scene/raycast_visitor.js +0 -103
- package/dist/src/scene/raycast_visitor.js.map +0 -1
- package/dist/src/scene/scene.js +0 -284
- package/dist/src/scene/scene.js.map +0 -1
- package/dist/src/scene/scene_node.js +0 -732
- package/dist/src/scene/scene_node.js.map +0 -1
- package/dist/src/scene/terrain/grass.js +0 -278
- package/dist/src/scene/terrain/grass.js.map +0 -1
- package/dist/src/scene/terrain/heightfield.js +0 -475
- package/dist/src/scene/terrain/heightfield.js.map +0 -1
- package/dist/src/scene/terrain/patch.js +0 -530
- package/dist/src/scene/terrain/patch.js.map +0 -1
- package/dist/src/scene/terrain/quadtree.js +0 -461
- package/dist/src/scene/terrain/quadtree.js.map +0 -1
- package/dist/src/scene/terrain/terrain.js +0 -246
- package/dist/src/scene/terrain/terrain.js.map +0 -1
- package/dist/src/scene/terrain-cm/grass.js +0 -594
- package/dist/src/scene/terrain-cm/grass.js.map +0 -1
- package/dist/src/scene/terrain-cm/grassmaterial.js +0 -159
- package/dist/src/scene/terrain-cm/grassmaterial.js.map +0 -1
- package/dist/src/scene/terrain-cm/terrain-cm.js +0 -538
- package/dist/src/scene/terrain-cm/terrain-cm.js.map +0 -1
- package/dist/src/scene/water.js +0 -374
- package/dist/src/scene/water.js.map +0 -1
- package/dist/src/shaders/atmosphere.js +0 -957
- package/dist/src/shaders/atmosphere.js.map +0 -1
- package/dist/src/shaders/fog.js +0 -112
- package/dist/src/shaders/fog.js.map +0 -1
- package/dist/src/shaders/misc.js +0 -266
- package/dist/src/shaders/misc.js.map +0 -1
- package/dist/src/shaders/noise.js +0 -222
- package/dist/src/shaders/noise.js.map +0 -1
- package/dist/src/shaders/pbr.js +0 -51
- package/dist/src/shaders/pbr.js.map +0 -1
- package/dist/src/shaders/shadow.js +0 -636
- package/dist/src/shaders/shadow.js.map +0 -1
- package/dist/src/shaders/ssr.js +0 -490
- package/dist/src/shaders/ssr.js.map +0 -1
- package/dist/src/shaders/temporal.js +0 -215
- package/dist/src/shaders/temporal.js.map +0 -1
- package/dist/src/shaders/water.js +0 -756
- package/dist/src/shaders/water.js.map +0 -1
- package/dist/src/shadow/esm.js +0 -237
- package/dist/src/shadow/esm.js.map +0 -1
- package/dist/src/shadow/pcf_opt.js +0 -181
- package/dist/src/shadow/pcf_opt.js.map +0 -1
- package/dist/src/shadow/pcf_pd.js +0 -189
- package/dist/src/shadow/pcf_pd.js.map +0 -1
- package/dist/src/shadow/shader.js +0 -37
- package/dist/src/shadow/shader.js.map +0 -1
- package/dist/src/shadow/shadow_impl.js +0 -15
- package/dist/src/shadow/shadow_impl.js.map +0 -1
- package/dist/src/shadow/shadowmapper.js +0 -790
- package/dist/src/shadow/shadowmapper.js.map +0 -1
- package/dist/src/shadow/ssm.js +0 -159
- package/dist/src/shadow/ssm.js.map +0 -1
- package/dist/src/shadow/vsm.js +0 -297
- package/dist/src/shadow/vsm.js.map +0 -1
- package/dist/src/shapes/box.js +0 -386
- package/dist/src/shapes/box.js.map +0 -1
- package/dist/src/shapes/cylinder.js +0 -125
- package/dist/src/shapes/cylinder.js.map +0 -1
- package/dist/src/shapes/plane.js +0 -88
- package/dist/src/shapes/plane.js.map +0 -1
- package/dist/src/shapes/shape.js +0 -87
- package/dist/src/shapes/shape.js.map +0 -1
- package/dist/src/shapes/sphere.js +0 -114
- package/dist/src/shapes/sphere.js.map +0 -1
- package/dist/src/shapes/tetrahedron.js +0 -188
- package/dist/src/shapes/tetrahedron.js.map +0 -1
- package/dist/src/shapes/torus.js +0 -111
- package/dist/src/shapes/torus.js.map +0 -1
- package/dist/src/utility/aabbtree.js +0 -400
- package/dist/src/utility/aabbtree.js.map +0 -1
- package/dist/src/utility/bounding_volume.js +0 -29
- package/dist/src/utility/bounding_volume.js.map +0 -1
- package/dist/src/utility/debug.js +0 -28
- package/dist/src/utility/debug.js.map +0 -1
- package/dist/src/utility/draco/decoder.js +0 -116
- package/dist/src/utility/draco/decoder.js.map +0 -1
- package/dist/src/utility/misc.js +0 -105
- package/dist/src/utility/misc.js.map +0 -1
- package/dist/src/utility/panorama.js +0 -163
- package/dist/src/utility/panorama.js.map +0 -1
- package/dist/src/utility/pmrem.js +0 -354
- package/dist/src/utility/pmrem.js.map +0 -1
- package/dist/src/utility/rendermipmap.js +0 -115
- package/dist/src/utility/rendermipmap.js.map +0 -1
- package/dist/src/utility/serialization/json.js +0 -402
- package/dist/src/utility/serialization/json.js.map +0 -1
- package/dist/src/utility/serialization/manager.js +0 -623
- package/dist/src/utility/serialization/manager.js.map +0 -1
- package/dist/src/utility/serialization/scene/animation.js +0 -248
- package/dist/src/utility/serialization/scene/animation.js.map +0 -1
- package/dist/src/utility/serialization/scene/batch.js +0 -59
- package/dist/src/utility/serialization/scene/batch.js.map +0 -1
- package/dist/src/utility/serialization/scene/camera.js +0 -790
- package/dist/src/utility/serialization/scene/camera.js.map +0 -1
- package/dist/src/utility/serialization/scene/common.js +0 -222
- package/dist/src/utility/serialization/scene/common.js.map +0 -1
- package/dist/src/utility/serialization/scene/light.js +0 -575
- package/dist/src/utility/serialization/scene/light.js.map +0 -1
- package/dist/src/utility/serialization/scene/material.js +0 -1111
- package/dist/src/utility/serialization/scene/material.js.map +0 -1
- package/dist/src/utility/serialization/scene/mesh.js +0 -148
- package/dist/src/utility/serialization/scene/mesh.js.map +0 -1
- package/dist/src/utility/serialization/scene/misc.js +0 -39
- package/dist/src/utility/serialization/scene/misc.js.map +0 -1
- package/dist/src/utility/serialization/scene/node.js +0 -451
- package/dist/src/utility/serialization/scene/node.js.map +0 -1
- package/dist/src/utility/serialization/scene/particle.js +0 -425
- package/dist/src/utility/serialization/scene/particle.js.map +0 -1
- package/dist/src/utility/serialization/scene/primitive.js +0 -692
- package/dist/src/utility/serialization/scene/primitive.js.map +0 -1
- package/dist/src/utility/serialization/scene/scene.js +0 -704
- package/dist/src/utility/serialization/scene/scene.js.map +0 -1
- package/dist/src/utility/serialization/scene/terrain.js +0 -488
- package/dist/src/utility/serialization/scene/terrain.js.map +0 -1
- package/dist/src/utility/serialization/scene/water.js +0 -465
- package/dist/src/utility/serialization/scene/water.js.map +0 -1
- package/dist/src/utility/shprojector.js +0 -297
- package/dist/src/utility/shprojector.js.map +0 -1
- package/dist/src/utility/textures/ggxlut.js +0 -213
- package/dist/src/utility/textures/ggxlut.js.map +0 -1
- package/dist/src/utility/textures/gradientnoise.js +0 -62
- package/dist/src/utility/textures/gradientnoise.js.map +0 -1
- package/dist/src/utility/textures/randomnoise.js +0 -41
- package/dist/src/utility/textures/randomnoise.js.map +0 -1
- package/dist/src/values.js +0 -162
- package/dist/src/values.js.map +0 -1
- package/dist/utility/blueprint/material/common.js +0 -7
- package/dist/utility/blueprint/material/common.js.map +0 -1
- package/dist/utility/serialization/blueprint/constants.js +0 -255
- package/dist/utility/serialization/blueprint/constants.js.map +0 -1
- package/dist/utility/serialization/blueprint/material/constants.js +0 -203
- package/dist/utility/serialization/blueprint/material/constants.js.map +0 -1
- package/dist/utility/serialization/blueprint/material/texture.js +0 -165
- package/dist/utility/serialization/blueprint/material/texture.js.map +0 -1
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { Vector3, Quaternion } from '@zephyr3d/base';
|
|
2
|
+
import { createSpringParticle } from './spring_particle.js';
|
|
3
|
+
import { createSpringConstraint } from './spring_constraint.js';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Manages a chain of spring particles and constraints
|
|
7
|
+
*
|
|
8
|
+
* @public
|
|
9
|
+
*/ class SpringChain {
|
|
10
|
+
/** Array of particles in the chain */ particles;
|
|
11
|
+
/** Array of constraints between particles */ constraints;
|
|
12
|
+
constructor(){
|
|
13
|
+
this.particles = [];
|
|
14
|
+
this.constraints = [];
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Creates a spring chain from a bone hierarchy
|
|
18
|
+
* @param startNode - Root node of the bone chain
|
|
19
|
+
* @param endNode - End node of the bone chain (optional, if null uses all descendants)
|
|
20
|
+
* @param options - Additional options
|
|
21
|
+
* @returns A new SpringChain instance
|
|
22
|
+
*/ static fromBoneChain(startNode, endNode = null, options) {
|
|
23
|
+
const chain = new SpringChain();
|
|
24
|
+
const mass = options?.mass ?? 1.0;
|
|
25
|
+
const damping = options?.damping ?? 0.95;
|
|
26
|
+
const stiffness = options?.stiffness ?? 0.8;
|
|
27
|
+
// Collect nodes from startNode to endNode
|
|
28
|
+
const nodes = [];
|
|
29
|
+
let current = startNode;
|
|
30
|
+
while(current){
|
|
31
|
+
nodes.push(current);
|
|
32
|
+
if (current === endNode) {
|
|
33
|
+
break;
|
|
34
|
+
}
|
|
35
|
+
if (current.children && current.children.length > 0) {
|
|
36
|
+
current = current.children[0].get();
|
|
37
|
+
} else {
|
|
38
|
+
break;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
// Create particles for each bone
|
|
42
|
+
for(let i = 0; i < nodes.length; i++){
|
|
43
|
+
const node = nodes[i];
|
|
44
|
+
const worldPos = new Vector3(node.worldMatrix.m03, node.worldMatrix.m13, node.worldMatrix.m23);
|
|
45
|
+
// Get the original world rotation
|
|
46
|
+
const originalRotation = new Quaternion();
|
|
47
|
+
node.worldMatrix.decompose(null, originalRotation, null);
|
|
48
|
+
const particle = createSpringParticle(worldPos, {
|
|
49
|
+
mass,
|
|
50
|
+
damping,
|
|
51
|
+
fixed: i === 0,
|
|
52
|
+
node,
|
|
53
|
+
originalRotation
|
|
54
|
+
});
|
|
55
|
+
const particleIndex = chain.addParticle(particle);
|
|
56
|
+
// Create constraint with previous particle
|
|
57
|
+
if (i > 0) {
|
|
58
|
+
const prevIndex = particleIndex - 1;
|
|
59
|
+
const prevParticle = chain.particles[prevIndex];
|
|
60
|
+
const restLength = Vector3.distance(particle.position, prevParticle.position);
|
|
61
|
+
chain.addConstraint(createSpringConstraint(prevIndex, particleIndex, restLength, stiffness));
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return chain;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Adds a particle to the chain
|
|
68
|
+
* @param particle - The particle to add
|
|
69
|
+
* @returns The index of the added particle
|
|
70
|
+
*/ addParticle(particle) {
|
|
71
|
+
this.particles.push(particle);
|
|
72
|
+
return this.particles.length - 1;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Adds a constraint to the chain
|
|
76
|
+
* @param constraint - The constraint to add
|
|
77
|
+
*/ addConstraint(constraint) {
|
|
78
|
+
this.constraints.push(constraint);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Adds cross constraints between particles for cloth-like behavior
|
|
82
|
+
* @param stiffness - Stiffness of the cross constraints
|
|
83
|
+
* @param skipDistance - Distance between particles to connect (default: 2)
|
|
84
|
+
*/ addCrossConstraints(stiffness = 0.6, skipDistance = 2) {
|
|
85
|
+
for(let i = 0; i < this.particles.length - skipDistance; i++){
|
|
86
|
+
const pA = this.particles[i];
|
|
87
|
+
const pB = this.particles[i + skipDistance];
|
|
88
|
+
const restLength = Vector3.distance(pA.position, pB.position);
|
|
89
|
+
this.addConstraint(createSpringConstraint(i, i + skipDistance, restLength, stiffness));
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Resets all particles to their original positions
|
|
94
|
+
*/ reset() {
|
|
95
|
+
for (const particle of this.particles){
|
|
96
|
+
particle.position.set(particle.originalPosition);
|
|
97
|
+
particle.prevPosition.set(particle.originalPosition);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
export { SpringChain };
|
|
103
|
+
//# sourceMappingURL=spring_chain.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spring_chain.js","sources":["../../../src/animation/spring/spring_chain.ts"],"sourcesContent":["import { Vector3, Quaternion } from '@zephyr3d/base';\r\nimport type { SceneNode } from '../../scene/scene_node';\r\nimport type { SpringParticle } from './spring_particle';\r\nimport { createSpringParticle } from './spring_particle';\r\nimport type { SpringConstraint } from './spring_constraint';\r\nimport { createSpringConstraint } from './spring_constraint';\r\n\r\n/**\r\n * Manages a chain of spring particles and constraints\r\n *\r\n * @public\r\n */\r\nexport class SpringChain {\r\n /** Array of particles in the chain */\r\n particles: SpringParticle[];\r\n /** Array of constraints between particles */\r\n constraints: SpringConstraint[];\r\n\r\n constructor() {\r\n this.particles = [];\r\n this.constraints = [];\r\n }\r\n\r\n /**\r\n * Creates a spring chain from a bone hierarchy\r\n * @param startNode - Root node of the bone chain\r\n * @param endNode - End node of the bone chain (optional, if null uses all descendants)\r\n * @param options - Additional options\r\n * @returns A new SpringChain instance\r\n */\r\n static fromBoneChain(\r\n startNode: SceneNode,\r\n endNode: SceneNode | null = null,\r\n options?: {\r\n mass?: number;\r\n damping?: number;\r\n stiffness?: number;\r\n }\r\n ): SpringChain {\r\n const chain = new SpringChain();\r\n const mass = options?.mass ?? 1.0;\r\n const damping = options?.damping ?? 0.95;\r\n const stiffness = options?.stiffness ?? 0.8;\r\n\r\n // Collect nodes from startNode to endNode\r\n const nodes: SceneNode[] = [];\r\n let current: SceneNode | null = startNode;\r\n\r\n while (current) {\r\n nodes.push(current);\r\n if (current === endNode) {\r\n break;\r\n }\r\n\r\n if (current.children && current.children.length > 0) {\r\n current = current.children[0].get();\r\n } else {\r\n break;\r\n }\r\n }\r\n\r\n // Create particles for each bone\r\n for (let i = 0; i < nodes.length; i++) {\r\n const node = nodes[i];\r\n const worldPos = new Vector3(node.worldMatrix.m03, node.worldMatrix.m13, node.worldMatrix.m23);\r\n\r\n // Get the original world rotation\r\n const originalRotation = new Quaternion();\r\n node.worldMatrix.decompose(null, originalRotation, null);\r\n\r\n const particle = createSpringParticle(worldPos, {\r\n mass,\r\n damping,\r\n fixed: i === 0, // First particle is fixed (anchor)\r\n node,\r\n originalRotation\r\n });\r\n\r\n const particleIndex = chain.addParticle(particle);\r\n\r\n // Create constraint with previous particle\r\n if (i > 0) {\r\n const prevIndex = particleIndex - 1;\r\n const prevParticle = chain.particles[prevIndex];\r\n const restLength = Vector3.distance(particle.position, prevParticle.position);\r\n\r\n chain.addConstraint(createSpringConstraint(prevIndex, particleIndex, restLength, stiffness));\r\n }\r\n }\r\n\r\n return chain;\r\n }\r\n\r\n /**\r\n * Adds a particle to the chain\r\n * @param particle - The particle to add\r\n * @returns The index of the added particle\r\n */\r\n addParticle(particle: SpringParticle): number {\r\n this.particles.push(particle);\r\n return this.particles.length - 1;\r\n }\r\n\r\n /**\r\n * Adds a constraint to the chain\r\n * @param constraint - The constraint to add\r\n */\r\n addConstraint(constraint: SpringConstraint): void {\r\n this.constraints.push(constraint);\r\n }\r\n\r\n /**\r\n * Adds cross constraints between particles for cloth-like behavior\r\n * @param stiffness - Stiffness of the cross constraints\r\n * @param skipDistance - Distance between particles to connect (default: 2)\r\n */\r\n addCrossConstraints(stiffness: number = 0.6, skipDistance: number = 2): void {\r\n for (let i = 0; i < this.particles.length - skipDistance; i++) {\r\n const pA = this.particles[i];\r\n const pB = this.particles[i + skipDistance];\r\n const restLength = Vector3.distance(pA.position, pB.position);\r\n\r\n this.addConstraint(createSpringConstraint(i, i + skipDistance, restLength, stiffness));\r\n }\r\n }\r\n\r\n /**\r\n * Resets all particles to their original positions\r\n */\r\n reset(): void {\r\n for (const particle of this.particles) {\r\n particle.position.set(particle.originalPosition);\r\n particle.prevPosition.set(particle.originalPosition);\r\n }\r\n }\r\n}\r\n"],"names":["SpringChain","particles","constraints","fromBoneChain","startNode","endNode","options","chain","mass","damping","stiffness","nodes","current","push","children","length","get","i","node","worldPos","Vector3","worldMatrix","m03","m13","m23","originalRotation","Quaternion","decompose","particle","createSpringParticle","fixed","particleIndex","addParticle","prevIndex","prevParticle","restLength","distance","position","addConstraint","createSpringConstraint","constraint","addCrossConstraints","skipDistance","pA","pB","reset","set","originalPosition","prevPosition"],"mappings":"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"}
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
import { Vector3 } from '@zephyr3d/base';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Creates a sphere collider
|
|
5
|
+
* @param centerOrOffset - Center position in world space, or local offset if node is provided
|
|
6
|
+
* @param radius - Radius of the sphere
|
|
7
|
+
* @param node - Optional scene node to attach to (if provided, centerOrOffset is treated as local offset)
|
|
8
|
+
*
|
|
9
|
+
* @public
|
|
10
|
+
*/ function createSphereCollider(centerOrOffset, radius, node) {
|
|
11
|
+
if (node) {
|
|
12
|
+
// If node is provided, treat centerOrOffset as local offset
|
|
13
|
+
const worldMatrix = node.worldMatrix;
|
|
14
|
+
const worldCenter = new Vector3(worldMatrix.m03 + centerOrOffset.x, worldMatrix.m13 + centerOrOffset.y, worldMatrix.m23 + centerOrOffset.z);
|
|
15
|
+
return {
|
|
16
|
+
type: 'sphere',
|
|
17
|
+
center: worldCenter,
|
|
18
|
+
radius,
|
|
19
|
+
node,
|
|
20
|
+
enabled: true,
|
|
21
|
+
localOffset: centerOrOffset.clone()
|
|
22
|
+
};
|
|
23
|
+
} else {
|
|
24
|
+
// No node, use as world position
|
|
25
|
+
return {
|
|
26
|
+
type: 'sphere',
|
|
27
|
+
center: centerOrOffset.clone(),
|
|
28
|
+
radius,
|
|
29
|
+
node: null,
|
|
30
|
+
enabled: true
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Creates a capsule collider
|
|
36
|
+
* @param startOrOffset - Start point in world space, or local offset if node is provided
|
|
37
|
+
* @param endOrOffset - End point in world space, or local offset if node is provided
|
|
38
|
+
* @param radius - Radius of the capsule
|
|
39
|
+
* @param node - Optional scene node to attach to (if provided, offsets are treated as local)
|
|
40
|
+
*
|
|
41
|
+
* @public
|
|
42
|
+
*/ function createCapsuleCollider(startOrOffset, endOrOffset, radius, node) {
|
|
43
|
+
if (node) {
|
|
44
|
+
// If node is provided, treat as local offsets
|
|
45
|
+
const worldMatrix = node.worldMatrix;
|
|
46
|
+
const worldStart = new Vector3(worldMatrix.m03 + startOrOffset.x, worldMatrix.m13 + startOrOffset.y, worldMatrix.m23 + startOrOffset.z);
|
|
47
|
+
const worldEnd = new Vector3(worldMatrix.m03 + endOrOffset.x, worldMatrix.m13 + endOrOffset.y, worldMatrix.m23 + endOrOffset.z);
|
|
48
|
+
return {
|
|
49
|
+
type: 'capsule',
|
|
50
|
+
start: worldStart,
|
|
51
|
+
end: worldEnd,
|
|
52
|
+
radius,
|
|
53
|
+
node,
|
|
54
|
+
enabled: true,
|
|
55
|
+
localStartOffset: startOrOffset.clone(),
|
|
56
|
+
localEndOffset: endOrOffset.clone()
|
|
57
|
+
};
|
|
58
|
+
} else {
|
|
59
|
+
// No node, use as world positions
|
|
60
|
+
return {
|
|
61
|
+
type: 'capsule',
|
|
62
|
+
start: startOrOffset.clone(),
|
|
63
|
+
end: endOrOffset.clone(),
|
|
64
|
+
radius,
|
|
65
|
+
node: null,
|
|
66
|
+
enabled: true
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Creates a plane collider
|
|
72
|
+
* @param pointOrOffset - Point on plane in world space, or local offset if node is provided
|
|
73
|
+
* @param normal - Normal vector (will be normalized)
|
|
74
|
+
* @param node - Optional scene node to attach to (if provided, pointOrOffset is treated as local offset)
|
|
75
|
+
*
|
|
76
|
+
* @public
|
|
77
|
+
*/ function createPlaneCollider(pointOrOffset, normal, node) {
|
|
78
|
+
const normalizedNormal = new Vector3();
|
|
79
|
+
Vector3.normalize(normal, normalizedNormal);
|
|
80
|
+
if (node) {
|
|
81
|
+
// If node is provided, treat as local offset
|
|
82
|
+
const worldMatrix = node.worldMatrix;
|
|
83
|
+
const worldPoint = new Vector3(worldMatrix.m03 + pointOrOffset.x, worldMatrix.m13 + pointOrOffset.y, worldMatrix.m23 + pointOrOffset.z);
|
|
84
|
+
return {
|
|
85
|
+
type: 'plane',
|
|
86
|
+
point: worldPoint,
|
|
87
|
+
normal: normalizedNormal.clone(),
|
|
88
|
+
node,
|
|
89
|
+
enabled: true,
|
|
90
|
+
localPointOffset: pointOrOffset.clone(),
|
|
91
|
+
localNormal: normalizedNormal.clone()
|
|
92
|
+
};
|
|
93
|
+
} else {
|
|
94
|
+
// No node, use as world position
|
|
95
|
+
return {
|
|
96
|
+
type: 'plane',
|
|
97
|
+
point: pointOrOffset.clone(),
|
|
98
|
+
normal: normalizedNormal,
|
|
99
|
+
node: null,
|
|
100
|
+
enabled: true
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Resolves collision between a particle and a sphere collider
|
|
106
|
+
* @returns true if collision occurred
|
|
107
|
+
*
|
|
108
|
+
* @public
|
|
109
|
+
*/ function resolveSphereCollision(particlePos, collider) {
|
|
110
|
+
const toParticle = Vector3.sub(particlePos, collider.center, new Vector3());
|
|
111
|
+
const distSq = toParticle.magnitudeSq;
|
|
112
|
+
const radiusSq = collider.radius * collider.radius;
|
|
113
|
+
if (distSq < radiusSq && distSq > 0.0001) {
|
|
114
|
+
// Particle is inside sphere, push it out
|
|
115
|
+
const dist = Math.sqrt(distSq);
|
|
116
|
+
const penetration = collider.radius - dist;
|
|
117
|
+
// Push particle to sphere surface
|
|
118
|
+
Vector3.normalize(toParticle, toParticle);
|
|
119
|
+
toParticle.scaleBy(penetration);
|
|
120
|
+
Vector3.add(particlePos, toParticle, particlePos);
|
|
121
|
+
return true;
|
|
122
|
+
}
|
|
123
|
+
return false;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Resolves collision between a particle and a capsule collider
|
|
127
|
+
* @returns true if collision occurred
|
|
128
|
+
*
|
|
129
|
+
* @public
|
|
130
|
+
*/ function resolveCapsuleCollision(particlePos, collider) {
|
|
131
|
+
// Find closest point on capsule axis
|
|
132
|
+
const axis = Vector3.sub(collider.end, collider.start, new Vector3());
|
|
133
|
+
const axisLength = axis.magnitude;
|
|
134
|
+
if (axisLength < 0.0001) {
|
|
135
|
+
// Degenerate capsule, treat as sphere
|
|
136
|
+
const toParticle = Vector3.sub(particlePos, collider.start, new Vector3());
|
|
137
|
+
const distSq = toParticle.magnitudeSq;
|
|
138
|
+
const radiusSq = collider.radius * collider.radius;
|
|
139
|
+
if (distSq < radiusSq && distSq > 0.0001) {
|
|
140
|
+
const dist = Math.sqrt(distSq);
|
|
141
|
+
const penetration = collider.radius - dist;
|
|
142
|
+
Vector3.normalize(toParticle, toParticle);
|
|
143
|
+
toParticle.scaleBy(penetration);
|
|
144
|
+
Vector3.add(particlePos, toParticle, particlePos);
|
|
145
|
+
return true;
|
|
146
|
+
}
|
|
147
|
+
return false;
|
|
148
|
+
}
|
|
149
|
+
Vector3.normalize(axis, axis);
|
|
150
|
+
const toParticle = Vector3.sub(particlePos, collider.start, new Vector3());
|
|
151
|
+
const projection = Vector3.dot(toParticle, axis);
|
|
152
|
+
// Clamp projection to capsule length
|
|
153
|
+
const t = Math.max(0, Math.min(axisLength, projection));
|
|
154
|
+
// Closest point on capsule axis
|
|
155
|
+
const closestPoint = Vector3.add(collider.start, Vector3.scale(axis, t, new Vector3()), new Vector3());
|
|
156
|
+
// Check distance from closest point
|
|
157
|
+
const toParticleFromAxis = Vector3.sub(particlePos, closestPoint, new Vector3());
|
|
158
|
+
const distSq = toParticleFromAxis.magnitudeSq;
|
|
159
|
+
const radiusSq = collider.radius * collider.radius;
|
|
160
|
+
if (distSq < radiusSq && distSq > 0.0001) {
|
|
161
|
+
const dist = Math.sqrt(distSq);
|
|
162
|
+
const penetration = collider.radius - dist;
|
|
163
|
+
Vector3.normalize(toParticleFromAxis, toParticleFromAxis);
|
|
164
|
+
toParticleFromAxis.scaleBy(penetration);
|
|
165
|
+
Vector3.add(particlePos, toParticleFromAxis, particlePos);
|
|
166
|
+
return true;
|
|
167
|
+
}
|
|
168
|
+
return false;
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Resolves collision between a particle and a plane collider
|
|
172
|
+
* @returns true if collision occurred
|
|
173
|
+
*
|
|
174
|
+
* @public
|
|
175
|
+
*/ function resolvePlaneCollision(particlePos, collider) {
|
|
176
|
+
const toParticle = Vector3.sub(particlePos, collider.point, new Vector3());
|
|
177
|
+
const distance = Vector3.dot(toParticle, collider.normal);
|
|
178
|
+
if (distance < 0) {
|
|
179
|
+
// Particle is below plane, push it up
|
|
180
|
+
const correction = Vector3.scale(collider.normal, -distance, new Vector3());
|
|
181
|
+
Vector3.add(particlePos, correction, particlePos);
|
|
182
|
+
return true;
|
|
183
|
+
}
|
|
184
|
+
return false;
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Updates collider position from its associated node
|
|
188
|
+
*
|
|
189
|
+
* @public
|
|
190
|
+
*/ function updateColliderFromNode(collider) {
|
|
191
|
+
if (!collider.node || !collider.enabled) {
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
const worldMatrix = collider.node.worldMatrix;
|
|
195
|
+
switch(collider.type){
|
|
196
|
+
case 'sphere':
|
|
197
|
+
{
|
|
198
|
+
const sphere = collider;
|
|
199
|
+
if (sphere.localOffset) {
|
|
200
|
+
// Transform local offset to world space
|
|
201
|
+
worldMatrix.transformPointAffine(sphere.localOffset, sphere.center);
|
|
202
|
+
} else {
|
|
203
|
+
// No local offset, just use node position
|
|
204
|
+
sphere.center.x = worldMatrix.m03;
|
|
205
|
+
sphere.center.y = worldMatrix.m13;
|
|
206
|
+
sphere.center.z = worldMatrix.m23;
|
|
207
|
+
}
|
|
208
|
+
break;
|
|
209
|
+
}
|
|
210
|
+
case 'capsule':
|
|
211
|
+
{
|
|
212
|
+
const capsule = collider;
|
|
213
|
+
if (capsule.localStartOffset && capsule.localEndOffset) {
|
|
214
|
+
// Transform local offsets to world space
|
|
215
|
+
worldMatrix.transformPointAffine(capsule.localStartOffset, capsule.start);
|
|
216
|
+
worldMatrix.transformPointAffine(capsule.localEndOffset, capsule.end);
|
|
217
|
+
} else {
|
|
218
|
+
// No local offsets, just use node position for start
|
|
219
|
+
capsule.start.x = worldMatrix.m03;
|
|
220
|
+
capsule.start.y = worldMatrix.m13;
|
|
221
|
+
capsule.start.z = worldMatrix.m23;
|
|
222
|
+
}
|
|
223
|
+
break;
|
|
224
|
+
}
|
|
225
|
+
case 'plane':
|
|
226
|
+
{
|
|
227
|
+
const plane = collider;
|
|
228
|
+
if (plane.localPointOffset) {
|
|
229
|
+
// Transform local offset to world space
|
|
230
|
+
worldMatrix.transformPointAffine(plane.localPointOffset, plane.point);
|
|
231
|
+
} else {
|
|
232
|
+
// No local offset, just use node position
|
|
233
|
+
plane.point.x = worldMatrix.m03;
|
|
234
|
+
plane.point.y = worldMatrix.m13;
|
|
235
|
+
plane.point.z = worldMatrix.m23;
|
|
236
|
+
}
|
|
237
|
+
if (plane.localNormal) {
|
|
238
|
+
// Transform local normal to world space (rotation only)
|
|
239
|
+
worldMatrix.transformVectorAffine(plane.localNormal, plane.normal).inplaceNormalize;
|
|
240
|
+
}
|
|
241
|
+
break;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
export { createCapsuleCollider, createPlaneCollider, createSphereCollider, resolveCapsuleCollision, resolvePlaneCollision, resolveSphereCollision, updateColliderFromNode };
|
|
247
|
+
//# sourceMappingURL=spring_collider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spring_collider.js","sources":["../../../src/animation/spring/spring_collider.ts"],"sourcesContent":["import type { Nullable } from '@zephyr3d/base';\r\nimport { Vector3 } from '@zephyr3d/base';\r\nimport type { SceneNode } from '../../scene/scene_node';\r\n\r\n/**\r\n * Base interface for spring collision shapes\r\n *\r\n * @public\r\n */\r\nexport interface SpringCollider {\r\n /** Type of collider */\r\n type: 'sphere' | 'capsule' | 'plane';\r\n /** Associated scene node (optional, for dynamic colliders) */\r\n node?: Nullable<SceneNode>;\r\n /** Whether this collider is enabled */\r\n enabled: boolean;\r\n}\r\n\r\n/**\r\n * Sphere collider for spring collision detection\r\n *\r\n * @public\r\n */\r\nexport interface SphereCollider extends SpringCollider {\r\n type: 'sphere';\r\n /** Center position in world space */\r\n center: Vector3;\r\n /** Radius of the sphere */\r\n radius: number;\r\n /** Local offset from node (if node is set) */\r\n localOffset?: Vector3;\r\n}\r\n\r\n/**\r\n * Capsule collider for spring collision detection\r\n *\r\n * @public\r\n */\r\nexport interface CapsuleCollider extends SpringCollider {\r\n type: 'capsule';\r\n /** Start point of the capsule axis in world space */\r\n start: Vector3;\r\n /** End point of the capsule axis in world space */\r\n end: Vector3;\r\n /** Radius of the capsule */\r\n radius: number;\r\n /** Local start offset from node (if node is set) */\r\n localStartOffset?: Vector3;\r\n /** Local end offset from node (if node is set) */\r\n localEndOffset?: Vector3;\r\n}\r\n\r\n/**\r\n * Plane collider for spring collision detection\r\n *\r\n * @public\r\n */\r\nexport interface PlaneCollider extends SpringCollider {\r\n type: 'plane';\r\n /** Point on the plane in world space */\r\n point: Vector3;\r\n /** Normal vector of the plane (should be normalized) */\r\n normal: Vector3;\r\n /** Local point offset from node (if node is set) */\r\n localPointOffset?: Vector3;\r\n /** Local normal direction (if node is set) */\r\n localNormal?: Vector3;\r\n}\r\n\r\n/**\r\n * Creates a sphere collider\r\n * @param centerOrOffset - Center position in world space, or local offset if node is provided\r\n * @param radius - Radius of the sphere\r\n * @param node - Optional scene node to attach to (if provided, centerOrOffset is treated as local offset)\r\n *\r\n * @public\r\n */\r\nexport function createSphereCollider(\r\n centerOrOffset: Vector3,\r\n radius: number,\r\n node?: SceneNode\r\n): SphereCollider {\r\n if (node) {\r\n // If node is provided, treat centerOrOffset as local offset\r\n const worldMatrix = node.worldMatrix;\r\n const worldCenter = new Vector3(\r\n worldMatrix.m03 + centerOrOffset.x,\r\n worldMatrix.m13 + centerOrOffset.y,\r\n worldMatrix.m23 + centerOrOffset.z\r\n );\r\n\r\n return {\r\n type: 'sphere',\r\n center: worldCenter,\r\n radius,\r\n node,\r\n enabled: true,\r\n localOffset: centerOrOffset.clone()\r\n };\r\n } else {\r\n // No node, use as world position\r\n return {\r\n type: 'sphere',\r\n center: centerOrOffset.clone(),\r\n radius,\r\n node: null,\r\n enabled: true\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Creates a capsule collider\r\n * @param startOrOffset - Start point in world space, or local offset if node is provided\r\n * @param endOrOffset - End point in world space, or local offset if node is provided\r\n * @param radius - Radius of the capsule\r\n * @param node - Optional scene node to attach to (if provided, offsets are treated as local)\r\n *\r\n * @public\r\n */\r\nexport function createCapsuleCollider(\r\n startOrOffset: Vector3,\r\n endOrOffset: Vector3,\r\n radius: number,\r\n node?: SceneNode\r\n): CapsuleCollider {\r\n if (node) {\r\n // If node is provided, treat as local offsets\r\n const worldMatrix = node.worldMatrix;\r\n const worldStart = new Vector3(\r\n worldMatrix.m03 + startOrOffset.x,\r\n worldMatrix.m13 + startOrOffset.y,\r\n worldMatrix.m23 + startOrOffset.z\r\n );\r\n const worldEnd = new Vector3(\r\n worldMatrix.m03 + endOrOffset.x,\r\n worldMatrix.m13 + endOrOffset.y,\r\n worldMatrix.m23 + endOrOffset.z\r\n );\r\n\r\n return {\r\n type: 'capsule',\r\n start: worldStart,\r\n end: worldEnd,\r\n radius,\r\n node,\r\n enabled: true,\r\n localStartOffset: startOrOffset.clone(),\r\n localEndOffset: endOrOffset.clone()\r\n };\r\n } else {\r\n // No node, use as world positions\r\n return {\r\n type: 'capsule',\r\n start: startOrOffset.clone(),\r\n end: endOrOffset.clone(),\r\n radius,\r\n node: null,\r\n enabled: true\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Creates a plane collider\r\n * @param pointOrOffset - Point on plane in world space, or local offset if node is provided\r\n * @param normal - Normal vector (will be normalized)\r\n * @param node - Optional scene node to attach to (if provided, pointOrOffset is treated as local offset)\r\n *\r\n * @public\r\n */\r\nexport function createPlaneCollider(\r\n pointOrOffset: Vector3,\r\n normal: Vector3,\r\n node?: SceneNode\r\n): PlaneCollider {\r\n const normalizedNormal = new Vector3();\r\n Vector3.normalize(normal, normalizedNormal);\r\n\r\n if (node) {\r\n // If node is provided, treat as local offset\r\n const worldMatrix = node.worldMatrix;\r\n const worldPoint = new Vector3(\r\n worldMatrix.m03 + pointOrOffset.x,\r\n worldMatrix.m13 + pointOrOffset.y,\r\n worldMatrix.m23 + pointOrOffset.z\r\n );\r\n\r\n return {\r\n type: 'plane',\r\n point: worldPoint,\r\n normal: normalizedNormal.clone(),\r\n node,\r\n enabled: true,\r\n localPointOffset: pointOrOffset.clone(),\r\n localNormal: normalizedNormal.clone()\r\n };\r\n } else {\r\n // No node, use as world position\r\n return {\r\n type: 'plane',\r\n point: pointOrOffset.clone(),\r\n normal: normalizedNormal,\r\n node: null,\r\n enabled: true\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Resolves collision between a particle and a sphere collider\r\n * @returns true if collision occurred\r\n *\r\n * @public\r\n */\r\nexport function resolveSphereCollision(particlePos: Vector3, collider: SphereCollider): boolean {\r\n const toParticle = Vector3.sub(particlePos, collider.center, new Vector3());\r\n const distSq = toParticle.magnitudeSq;\r\n const radiusSq = collider.radius * collider.radius;\r\n\r\n if (distSq < radiusSq && distSq > 0.0001) {\r\n // Particle is inside sphere, push it out\r\n const dist = Math.sqrt(distSq);\r\n const penetration = collider.radius - dist;\r\n\r\n // Push particle to sphere surface\r\n Vector3.normalize(toParticle, toParticle);\r\n toParticle.scaleBy(penetration);\r\n Vector3.add(particlePos, toParticle, particlePos);\r\n\r\n return true;\r\n }\r\n\r\n return false;\r\n}\r\n\r\n/**\r\n * Resolves collision between a particle and a capsule collider\r\n * @returns true if collision occurred\r\n *\r\n * @public\r\n */\r\nexport function resolveCapsuleCollision(particlePos: Vector3, collider: CapsuleCollider): boolean {\r\n // Find closest point on capsule axis\r\n const axis = Vector3.sub(collider.end, collider.start, new Vector3());\r\n const axisLength = axis.magnitude;\r\n\r\n if (axisLength < 0.0001) {\r\n // Degenerate capsule, treat as sphere\r\n const toParticle = Vector3.sub(particlePos, collider.start, new Vector3());\r\n const distSq = toParticle.magnitudeSq;\r\n const radiusSq = collider.radius * collider.radius;\r\n\r\n if (distSq < radiusSq && distSq > 0.0001) {\r\n const dist = Math.sqrt(distSq);\r\n const penetration = collider.radius - dist;\r\n Vector3.normalize(toParticle, toParticle);\r\n toParticle.scaleBy(penetration);\r\n Vector3.add(particlePos, toParticle, particlePos);\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n Vector3.normalize(axis, axis);\r\n\r\n const toParticle = Vector3.sub(particlePos, collider.start, new Vector3());\r\n const projection = Vector3.dot(toParticle, axis);\r\n\r\n // Clamp projection to capsule length\r\n const t = Math.max(0, Math.min(axisLength, projection));\r\n\r\n // Closest point on capsule axis\r\n const closestPoint = Vector3.add(collider.start, Vector3.scale(axis, t, new Vector3()), new Vector3());\r\n\r\n // Check distance from closest point\r\n const toParticleFromAxis = Vector3.sub(particlePos, closestPoint, new Vector3());\r\n const distSq = toParticleFromAxis.magnitudeSq;\r\n const radiusSq = collider.radius * collider.radius;\r\n\r\n if (distSq < radiusSq && distSq > 0.0001) {\r\n const dist = Math.sqrt(distSq);\r\n const penetration = collider.radius - dist;\r\n Vector3.normalize(toParticleFromAxis, toParticleFromAxis);\r\n toParticleFromAxis.scaleBy(penetration);\r\n Vector3.add(particlePos, toParticleFromAxis, particlePos);\r\n return true;\r\n }\r\n\r\n return false;\r\n}\r\n\r\n/**\r\n * Resolves collision between a particle and a plane collider\r\n * @returns true if collision occurred\r\n *\r\n * @public\r\n */\r\nexport function resolvePlaneCollision(particlePos: Vector3, collider: PlaneCollider): boolean {\r\n const toParticle = Vector3.sub(particlePos, collider.point, new Vector3());\r\n const distance = Vector3.dot(toParticle, collider.normal);\r\n\r\n if (distance < 0) {\r\n // Particle is below plane, push it up\r\n const correction = Vector3.scale(collider.normal, -distance, new Vector3());\r\n Vector3.add(particlePos, correction, particlePos);\r\n return true;\r\n }\r\n\r\n return false;\r\n}\r\n\r\n/**\r\n * Updates collider position from its associated node\r\n *\r\n * @public\r\n */\r\nexport function updateColliderFromNode(collider: SpringCollider): void {\r\n if (!collider.node || !collider.enabled) {\r\n return;\r\n }\r\n\r\n const worldMatrix = collider.node.worldMatrix;\r\n\r\n switch (collider.type) {\r\n case 'sphere': {\r\n const sphere = collider as SphereCollider;\r\n if (sphere.localOffset) {\r\n // Transform local offset to world space\r\n worldMatrix.transformPointAffine(sphere.localOffset, sphere.center);\r\n } else {\r\n // No local offset, just use node position\r\n sphere.center.x = worldMatrix.m03;\r\n sphere.center.y = worldMatrix.m13;\r\n sphere.center.z = worldMatrix.m23;\r\n }\r\n break;\r\n }\r\n\r\n case 'capsule': {\r\n const capsule = collider as CapsuleCollider;\r\n if (capsule.localStartOffset && capsule.localEndOffset) {\r\n // Transform local offsets to world space\r\n worldMatrix.transformPointAffine(capsule.localStartOffset, capsule.start);\r\n worldMatrix.transformPointAffine(capsule.localEndOffset, capsule.end);\r\n } else {\r\n // No local offsets, just use node position for start\r\n capsule.start.x = worldMatrix.m03;\r\n capsule.start.y = worldMatrix.m13;\r\n capsule.start.z = worldMatrix.m23;\r\n }\r\n break;\r\n }\r\n\r\n case 'plane': {\r\n const plane = collider as PlaneCollider;\r\n if (plane.localPointOffset) {\r\n // Transform local offset to world space\r\n worldMatrix.transformPointAffine(plane.localPointOffset, plane.point);\r\n } else {\r\n // No local offset, just use node position\r\n plane.point.x = worldMatrix.m03;\r\n plane.point.y = worldMatrix.m13;\r\n plane.point.z = worldMatrix.m23;\r\n }\r\n\r\n if (plane.localNormal) {\r\n // Transform local normal to world space (rotation only)\r\n worldMatrix.transformVectorAffine(plane.localNormal, plane.normal).inplaceNormalize;\r\n }\r\n break;\r\n }\r\n }\r\n}\r\n"],"names":["createSphereCollider","centerOrOffset","radius","node","worldMatrix","worldCenter","Vector3","m03","x","m13","y","m23","z","type","center","enabled","localOffset","clone","createCapsuleCollider","startOrOffset","endOrOffset","worldStart","worldEnd","start","end","localStartOffset","localEndOffset","createPlaneCollider","pointOrOffset","normal","normalizedNormal","normalize","worldPoint","point","localPointOffset","localNormal","resolveSphereCollision","particlePos","collider","toParticle","sub","distSq","magnitudeSq","radiusSq","dist","Math","sqrt","penetration","scaleBy","add","resolveCapsuleCollision","axis","axisLength","magnitude","projection","dot","t","max","min","closestPoint","scale","toParticleFromAxis","resolvePlaneCollision","distance","correction","updateColliderFromNode","sphere","transformPointAffine","capsule","plane","transformVectorAffine","inplaceNormalize"],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Represents a spring constraint between two particles
|
|
3
|
+
*
|
|
4
|
+
* @public
|
|
5
|
+
*/ /**
|
|
6
|
+
* Creates a new spring constraint
|
|
7
|
+
*
|
|
8
|
+
* @public
|
|
9
|
+
*/ function createSpringConstraint(particleA, particleB, restLength, stiffness = 0.8, compliance = 0) {
|
|
10
|
+
return {
|
|
11
|
+
particleA,
|
|
12
|
+
particleB,
|
|
13
|
+
restLength,
|
|
14
|
+
stiffness,
|
|
15
|
+
compliance,
|
|
16
|
+
lambda: 0
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export { createSpringConstraint };
|
|
21
|
+
//# sourceMappingURL=spring_constraint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spring_constraint.js","sources":["../../../src/animation/spring/spring_constraint.ts"],"sourcesContent":["/**\r\n * Represents a spring constraint between two particles\r\n *\r\n * @public\r\n */\r\nexport interface SpringConstraint {\r\n /** Index of the first particle */\r\n particleA: number;\r\n /** Index of the second particle */\r\n particleB: number;\r\n /** Rest length of the spring */\r\n restLength: number;\r\n /** Stiffness coefficient [0-1] used by Verlet solver (0 = no constraint, 1 = rigid) */\r\n stiffness: number;\r\n /**\r\n * XPBD compliance (inverse stiffness) in m/N.\r\n * 0 = perfectly rigid, larger values = softer spring.\r\n * Typical ranges: 0 (rigid) ~ 1e-7 (very stiff) ~ 1e-3 (soft cloth) ~ 1e-1 (rubber band).\r\n * Only used when solver is 'xpbd'.\r\n */\r\n compliance: number;\r\n /**\r\n * XPBD Lagrange multiplier accumulator, reset to 0 at the start of each time step.\r\n * Managed internally by the solver — do not set manually.\r\n */\r\n lambda: number;\r\n}\r\n\r\n/**\r\n * Creates a new spring constraint\r\n *\r\n * @public\r\n */\r\nexport function createSpringConstraint(\r\n particleA: number,\r\n particleB: number,\r\n restLength: number,\r\n stiffness: number = 0.8,\r\n compliance: number = 0\r\n): SpringConstraint {\r\n return {\r\n particleA,\r\n particleB,\r\n restLength,\r\n stiffness,\r\n compliance,\r\n lambda: 0\r\n };\r\n}\r\n"],"names":["createSpringConstraint","particleA","particleB","restLength","stiffness","compliance","lambda"],"mappings":"AAAA;;;;;;;;AAgCC,IACM,SAASA,sBACdC,CAAAA,SAAiB,EACjBC,SAAiB,EACjBC,UAAkB,EAClBC,SAAAA,GAAoB,GAAG,EACvBC,aAAqB,CAAC,EAAA;IAEtB,OAAO;AACLJ,QAAAA,SAAAA;AACAC,QAAAA,SAAAA;AACAC,QAAAA,UAAAA;AACAC,QAAAA,SAAAA;AACAC,QAAAA,UAAAA;QACAC,MAAQ,EAAA;AACV,KAAA;AACF;;;;"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Creates a new spring particle
|
|
3
|
+
*
|
|
4
|
+
* @public
|
|
5
|
+
*/ function createSpringParticle(position, options) {
|
|
6
|
+
return {
|
|
7
|
+
position: position.clone(),
|
|
8
|
+
prevPosition: position.clone(),
|
|
9
|
+
originalPosition: position.clone(),
|
|
10
|
+
originalRotation: options?.originalRotation?.clone() ?? null,
|
|
11
|
+
mass: options?.mass ?? 1.0,
|
|
12
|
+
damping: options?.damping ?? 0.95,
|
|
13
|
+
fixed: options?.fixed ?? false,
|
|
14
|
+
node: options?.node ?? null,
|
|
15
|
+
lastFramePosition: position.clone()
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export { createSpringParticle };
|
|
20
|
+
//# sourceMappingURL=spring_particle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spring_particle.js","sources":["../../../src/animation/spring/spring_particle.ts"],"sourcesContent":["import type { Vector3, Quaternion, Nullable } from '@zephyr3d/base';\r\nimport type { SceneNode } from '../../scene/scene_node';\r\n\r\n/**\r\n * Represents a particle in the spring system\r\n *\r\n * @public\r\n */\r\nexport interface SpringParticle {\r\n /** Current position in world space */\r\n position: Vector3;\r\n /** Previous position for Verlet integration */\r\n prevPosition: Vector3;\r\n /** Original position for reset */\r\n originalPosition: Vector3;\r\n /** Original world rotation (for calculating rotation delta) */\r\n originalRotation: Quaternion | null;\r\n /** Mass of the particle (affects inertia) */\r\n mass: number;\r\n /** Damping coefficient [0-1] (0 = no damping, 1 = full damping) */\r\n damping: number;\r\n /** Whether this particle is fixed (anchor point) */\r\n fixed: boolean;\r\n /** Associated scene node (optional) */\r\n node: Nullable<SceneNode>;\r\n /** Previous frame position (used to calculate velocity for inertial forces) */\r\n lastFramePosition: Vector3;\r\n /** Position history for rotation center estimation (for fixed particles) */\r\n positionHistory?: Vector3[];\r\n}\r\n\r\n/**\r\n * Creates a new spring particle\r\n *\r\n * @public\r\n */\r\nexport function createSpringParticle(\r\n position: Vector3,\r\n options?: {\r\n mass?: number;\r\n damping?: number;\r\n fixed?: boolean;\r\n node?: SceneNode;\r\n originalRotation?: Quaternion;\r\n }\r\n): SpringParticle {\r\n return {\r\n position: position.clone(),\r\n prevPosition: position.clone(),\r\n originalPosition: position.clone(),\r\n originalRotation: options?.originalRotation?.clone() ?? null,\r\n mass: options?.mass ?? 1.0,\r\n damping: options?.damping ?? 0.95,\r\n fixed: options?.fixed ?? false,\r\n node: options?.node ?? null,\r\n lastFramePosition: position.clone()\r\n };\r\n}\r\n"],"names":["createSpringParticle","position","options","clone","prevPosition","originalPosition","originalRotation","mass","damping","fixed","node","lastFramePosition"],"mappings":"AA+BA;;;;AAIC,IACM,SAASA,oBACdC,CAAAA,QAAiB,EACjBC,OAMC,EAAA;IAED,OAAO;AACLD,QAAAA,QAAAA,EAAUA,SAASE,KAAK,EAAA;AACxBC,QAAAA,YAAAA,EAAcH,SAASE,KAAK,EAAA;AAC5BE,QAAAA,gBAAAA,EAAkBJ,SAASE,KAAK,EAAA;QAChCG,gBAAkBJ,EAAAA,OAAAA,EAASI,kBAAkBH,KAAW,EAAA,IAAA,IAAA;AACxDI,QAAAA,IAAAA,EAAML,SAASK,IAAQ,IAAA,GAAA;AACvBC,QAAAA,OAAAA,EAASN,SAASM,OAAW,IAAA,IAAA;AAC7BC,QAAAA,KAAAA,EAAOP,SAASO,KAAS,IAAA,KAAA;AACzBC,QAAAA,IAAAA,EAAMR,SAASQ,IAAQ,IAAA,IAAA;AACvBC,QAAAA,iBAAAA,EAAmBV,SAASE,KAAK;AACnC,KAAA;AACF;;;;"}
|