@zephyr3d/scene 0.8.0 → 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/animationset.js +198 -1
- package/dist/animation/animationset.js.map +1 -1
- package/dist/animation/ik/ccd_solver.js +3 -4
- package/dist/animation/ik/ccd_solver.js.map +1 -1
- package/dist/animation/ik/fabrik_solver.js +3 -4
- package/dist/animation/ik/fabrik_solver.js.map +1 -1
- package/dist/animation/ik/ik_pole_constraint.js +7 -2
- package/dist/animation/ik/ik_pole_constraint.js.map +1 -1
- package/dist/animation/ik/ik_utils.js +0 -79
- package/dist/animation/ik/ik_utils.js.map +1 -1
- package/dist/animation/ik/two_bone_ik_solver.js +3 -4
- package/dist/animation/ik/two_bone_ik_solver.js.map +1 -1
- 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/asset/model.js +2 -2
- package/dist/index.d.ts +15 -0
- package/dist/material/mixins/pbr/common.js +20 -17
- package/dist/material/mixins/pbr/common.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/utility/serialization/scene/animation.js +3 -3
- package/dist/utility/serialization/scene/node.js +1 -1
- package/package.json +2 -2
- package/dist/animation/ik/ik_chain_builder.js +0 -68
- package/dist/animation/ik/ik_chain_builder.js.map +0 -1
- 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
|
@@ -1,127 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Animation that contains multiple tracks
|
|
3
|
-
* @public
|
|
4
|
-
*/ class AnimationClip {
|
|
5
|
-
/** @internal */ _name;
|
|
6
|
-
/** @internal */ _animationSet;
|
|
7
|
-
/** @internal */ _embedded;
|
|
8
|
-
/** @internal */ _duration;
|
|
9
|
-
/** @internal */ _autoPlay;
|
|
10
|
-
/** @internal */ _tracks;
|
|
11
|
-
_weight;
|
|
12
|
-
/** @internal */ _skeletons;
|
|
13
|
-
/**
|
|
14
|
-
* Creates an animation instance
|
|
15
|
-
* @param name - Name of the animation
|
|
16
|
-
* @param model - Parent node if this is a skeleton animation
|
|
17
|
-
*/ constructor(name, animationSet, embedded = false){
|
|
18
|
-
this._name = name;
|
|
19
|
-
this._animationSet = animationSet;
|
|
20
|
-
this._embedded = embedded;
|
|
21
|
-
this._tracks = new Map();
|
|
22
|
-
this._duration = 0;
|
|
23
|
-
this._weight = 1;
|
|
24
|
-
this._autoPlay = false;
|
|
25
|
-
this._skeletons = new Set();
|
|
26
|
-
}
|
|
27
|
-
/** Whether this is an embedded animation */ get embedded() {
|
|
28
|
-
return this._embedded;
|
|
29
|
-
}
|
|
30
|
-
/** AnimationSet this animation belongs to */ get animationSet() {
|
|
31
|
-
return this._animationSet;
|
|
32
|
-
}
|
|
33
|
-
/** Animatoin weight */ get weight() {
|
|
34
|
-
return this._weight;
|
|
35
|
-
}
|
|
36
|
-
set weight(val) {
|
|
37
|
-
this._weight = val;
|
|
38
|
-
}
|
|
39
|
-
/** Whether animation should play automatically when loaded */ get autoPlay() {
|
|
40
|
-
return this._autoPlay;
|
|
41
|
-
}
|
|
42
|
-
set autoPlay(val) {
|
|
43
|
-
this._autoPlay = val;
|
|
44
|
-
}
|
|
45
|
-
/** Disposes self */ dispose() {
|
|
46
|
-
this._tracks = null;
|
|
47
|
-
this._skeletons?.forEach((val, key)=>key.dispose());
|
|
48
|
-
this._skeletons = null;
|
|
49
|
-
}
|
|
50
|
-
/** Gets the name of the animation */ get name() {
|
|
51
|
-
return this._name;
|
|
52
|
-
}
|
|
53
|
-
/** Gets all the tracks of this animation */ get tracks() {
|
|
54
|
-
return this._tracks;
|
|
55
|
-
}
|
|
56
|
-
/** Gets all skeletons */ get skeletons() {
|
|
57
|
-
return this._skeletons;
|
|
58
|
-
}
|
|
59
|
-
/** The duration of the animation */ get timeDuration() {
|
|
60
|
-
return this._duration;
|
|
61
|
-
}
|
|
62
|
-
set timeDuration(val) {
|
|
63
|
-
this._duration = val;
|
|
64
|
-
}
|
|
65
|
-
/**
|
|
66
|
-
* Adds a skeleton to the animation
|
|
67
|
-
* @param skeleton - The skeleton to be added
|
|
68
|
-
* @param meshList - The meshes controlled by the skeleton
|
|
69
|
-
* @param boundingBoxInfo - Bounding box information for the skeleton
|
|
70
|
-
*/ addSkeleton(skeleton) {
|
|
71
|
-
this._skeletons.add(skeleton);
|
|
72
|
-
}
|
|
73
|
-
/**
|
|
74
|
-
* Deletes an animation track from this animation
|
|
75
|
-
* @param track - The track to delete
|
|
76
|
-
* @returns self
|
|
77
|
-
*/ deleteTrack(track) {
|
|
78
|
-
if (track?.animation !== this) {
|
|
79
|
-
console.error('Cannot delete animation track which is not belongs to THIS animation');
|
|
80
|
-
}
|
|
81
|
-
for (const k of this._tracks.keys()){
|
|
82
|
-
const tracks = this._tracks.get(k);
|
|
83
|
-
const index = tracks.indexOf(track);
|
|
84
|
-
if (index >= 0) {
|
|
85
|
-
tracks.splice(index, 1);
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
return this;
|
|
89
|
-
}
|
|
90
|
-
/**
|
|
91
|
-
* Adds an animation track to this animation
|
|
92
|
-
* @param target - The node that will be controlled by the track
|
|
93
|
-
* @param track - The track to be added
|
|
94
|
-
* @returns self
|
|
95
|
-
*/ addTrack(target, track) {
|
|
96
|
-
if (!track) {
|
|
97
|
-
return;
|
|
98
|
-
}
|
|
99
|
-
if (track.animation) {
|
|
100
|
-
if (track.animation === this) {
|
|
101
|
-
return;
|
|
102
|
-
} else {
|
|
103
|
-
console.error('Track is already in another animation');
|
|
104
|
-
return;
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
const blendId = track.getBlendId();
|
|
108
|
-
const tracks = this._tracks.get(target);
|
|
109
|
-
if (tracks && tracks.findIndex((track)=>track.getBlendId() === blendId) >= 0) {
|
|
110
|
-
console.error('Tracks with same BlendId could not be added to same animation');
|
|
111
|
-
return;
|
|
112
|
-
}
|
|
113
|
-
track.animation = this;
|
|
114
|
-
let trackInfo = this._tracks.get(target);
|
|
115
|
-
if (!trackInfo) {
|
|
116
|
-
trackInfo = [];
|
|
117
|
-
this._tracks.set(target, trackInfo);
|
|
118
|
-
}
|
|
119
|
-
trackInfo.push(track);
|
|
120
|
-
this._duration = Math.max(this._duration, track.getDuration() ?? 0);
|
|
121
|
-
track.reset(target);
|
|
122
|
-
return this;
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
export { AnimationClip };
|
|
127
|
-
//# sourceMappingURL=animation.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"animation.js","sources":["../../../src/animation/animation.ts"],"sourcesContent":["import type { AnimationSet } from './animationset';\r\nimport type { AnimationTrack } from './animationtrack';\r\nimport type { Skeleton } from './skeleton';\r\n\r\n/**\r\n * Animation that contains multiple tracks\r\n * @public\r\n */\r\nexport class AnimationClip {\r\n /** @internal */\r\n protected _name: string;\r\n /** @internal */\r\n protected _animationSet: AnimationSet;\r\n /** @internal */\r\n protected _embedded: boolean;\r\n /** @internal */\r\n protected _duration: number;\r\n /** @internal */\r\n protected _autoPlay: boolean;\r\n /** @internal */\r\n protected _tracks: Map<object, AnimationTrack[]>;\r\n protected _weight: number;\r\n /** @internal */\r\n protected _skeletons: Set<Skeleton>;\r\n /**\r\n * Creates an animation instance\r\n * @param name - Name of the animation\r\n * @param model - Parent node if this is a skeleton animation\r\n */\r\n constructor(name: string, animationSet: AnimationSet, embedded = false) {\r\n this._name = name;\r\n this._animationSet = animationSet;\r\n this._embedded = embedded;\r\n this._tracks = new Map();\r\n this._duration = 0;\r\n this._weight = 1;\r\n this._autoPlay = false;\r\n this._skeletons = new Set();\r\n }\r\n /** Whether this is an embedded animation */\r\n get embedded(): boolean {\r\n return this._embedded;\r\n }\r\n /** AnimationSet this animation belongs to */\r\n get animationSet() {\r\n return this._animationSet;\r\n }\r\n /** Animatoin weight */\r\n get weight() {\r\n return this._weight;\r\n }\r\n set weight(val: number) {\r\n this._weight = val;\r\n }\r\n /** Whether animation should play automatically when loaded */\r\n get autoPlay() {\r\n return this._autoPlay;\r\n }\r\n set autoPlay(val: boolean) {\r\n this._autoPlay = val;\r\n }\r\n /** Disposes self */\r\n dispose() {\r\n this._tracks = null;\r\n this._skeletons?.forEach((val, key) => key.dispose());\r\n this._skeletons = null;\r\n }\r\n /** Gets the name of the animation */\r\n get name(): string {\r\n return this._name;\r\n }\r\n /** Gets all the tracks of this animation */\r\n get tracks() {\r\n return this._tracks;\r\n }\r\n /** Gets all skeletons */\r\n get skeletons() {\r\n return this._skeletons;\r\n }\r\n /** The duration of the animation */\r\n get timeDuration(): number {\r\n return this._duration;\r\n }\r\n set timeDuration(val: number) {\r\n this._duration = val;\r\n }\r\n /**\r\n * Adds a skeleton to the animation\r\n * @param skeleton - The skeleton to be added\r\n * @param meshList - The meshes controlled by the skeleton\r\n * @param boundingBoxInfo - Bounding box information for the skeleton\r\n */\r\n addSkeleton(skeleton: Skeleton) {\r\n this._skeletons.add(skeleton);\r\n }\r\n /**\r\n * Deletes an animation track from this animation\r\n * @param track - The track to delete\r\n * @returns self\r\n */\r\n deleteTrack(track: AnimationTrack): this {\r\n if (track?.animation !== this) {\r\n console.error('Cannot delete animation track which is not belongs to THIS animation');\r\n }\r\n for (const k of this._tracks.keys()) {\r\n const tracks = this._tracks.get(k);\r\n const index = tracks.indexOf(track);\r\n if (index >= 0) {\r\n tracks.splice(index, 1);\r\n }\r\n }\r\n return this;\r\n }\r\n /**\r\n * Adds an animation track to this animation\r\n * @param target - The node that will be controlled by the track\r\n * @param track - The track to be added\r\n * @returns self\r\n */\r\n addTrack(target: object, track: AnimationTrack): this {\r\n if (!track) {\r\n return;\r\n }\r\n if (track.animation) {\r\n if (track.animation === this) {\r\n return;\r\n } else {\r\n console.error('Track is already in another animation');\r\n return;\r\n }\r\n }\r\n const blendId = track.getBlendId();\r\n const tracks = this._tracks.get(target);\r\n if (tracks && tracks.findIndex((track) => track.getBlendId() === blendId) >= 0) {\r\n console.error('Tracks with same BlendId could not be added to same animation');\r\n return;\r\n }\r\n track.animation = this;\r\n let trackInfo = this._tracks.get(target);\r\n if (!trackInfo) {\r\n trackInfo = [];\r\n this._tracks.set(target, trackInfo);\r\n }\r\n trackInfo.push(track);\r\n this._duration = Math.max(this._duration, track.getDuration() ?? 0);\r\n track.reset(target);\r\n return this;\r\n }\r\n}\r\n"],"names":["AnimationClip","_weight","name","animationSet","embedded","_name","_animationSet","_embedded","_tracks","Map","_duration","_autoPlay","_skeletons","Set","weight","val","autoPlay","dispose","forEach","key","tracks","skeletons","timeDuration","addSkeleton","skeleton","add","deleteTrack","track","animation","console","error","k","keys","get","index","indexOf","splice","addTrack","target","blendId","getBlendId","findIndex","trackInfo","set","push","Math","max","getDuration","reset"],"mappings":"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"}
|
|
@@ -1,255 +0,0 @@
|
|
|
1
|
-
import { Disposable, DWeakRef, weightedAverage } from '@zephyr3d/base';
|
|
2
|
-
import { AnimationClip } from './animation.js';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Animation set
|
|
6
|
-
* @public
|
|
7
|
-
*/ class AnimationSet extends Disposable {
|
|
8
|
-
/** @internal */ _model;
|
|
9
|
-
/** @internal */ _animations;
|
|
10
|
-
/** @internal */ _activeTracks;
|
|
11
|
-
/** @internal */ _activeSkeletons;
|
|
12
|
-
/** @internal */ _activeAnimations;
|
|
13
|
-
/**
|
|
14
|
-
* Creates an instance of AnimationSet
|
|
15
|
-
* @param scene - The scene to which the animation set belongs
|
|
16
|
-
* @param model - The model which is controlled by the animation set
|
|
17
|
-
*/ constructor(model){
|
|
18
|
-
super();
|
|
19
|
-
this._model = new DWeakRef(model);
|
|
20
|
-
this._animations = {};
|
|
21
|
-
this._activeTracks = new Map();
|
|
22
|
-
this._activeSkeletons = new Map();
|
|
23
|
-
this._activeAnimations = new Map();
|
|
24
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* The model which is controlled by the animation set
|
|
27
|
-
*/ get model() {
|
|
28
|
-
return this._model.get();
|
|
29
|
-
}
|
|
30
|
-
/**
|
|
31
|
-
* How many animations in this set
|
|
32
|
-
*/ get numAnimations() {
|
|
33
|
-
return Object.getOwnPropertyNames(this._animations).length;
|
|
34
|
-
}
|
|
35
|
-
/**
|
|
36
|
-
* Gets an animation clip by name
|
|
37
|
-
* @param name - name of the animation to get
|
|
38
|
-
*/ get(name) {
|
|
39
|
-
return this._animations[name] ?? null;
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* Creates an animation
|
|
43
|
-
*/ createAnimation(name, embedded = false) {
|
|
44
|
-
if (!name || this._animations[name]) {
|
|
45
|
-
console.error('Animation must have unique name');
|
|
46
|
-
return null;
|
|
47
|
-
} else {
|
|
48
|
-
const animation = new AnimationClip(name, this, embedded);
|
|
49
|
-
this._animations[name] = animation;
|
|
50
|
-
return animation;
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
/**
|
|
54
|
-
* Deletes an animation
|
|
55
|
-
*/ deleteAnimation(name) {
|
|
56
|
-
const animation = this._animations[name];
|
|
57
|
-
if (animation) {
|
|
58
|
-
this.stopAnimation(name);
|
|
59
|
-
delete this._animations[name];
|
|
60
|
-
animation.dispose();
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
/**
|
|
64
|
-
* Gets names of all the animations of the model
|
|
65
|
-
* @returns An array of string that contains the animation names
|
|
66
|
-
*/ getAnimationNames() {
|
|
67
|
-
return Object.keys(this._animations);
|
|
68
|
-
}
|
|
69
|
-
/**
|
|
70
|
-
* Updates all animations of the model
|
|
71
|
-
*/ update(deltaInSeconds) {
|
|
72
|
-
this._activeAnimations.forEach((v, k)=>{
|
|
73
|
-
if (v.fadeOut > 0 && v.fadeOutStart < 0) {
|
|
74
|
-
v.fadeOutStart = v.animateTime;
|
|
75
|
-
}
|
|
76
|
-
// Update animation time
|
|
77
|
-
if (v.firstFrame) {
|
|
78
|
-
v.firstFrame = false;
|
|
79
|
-
} else {
|
|
80
|
-
const timeAdvance = deltaInSeconds * v.speedRatio;
|
|
81
|
-
v.currentTime += timeAdvance;
|
|
82
|
-
v.animateTime += timeAdvance;
|
|
83
|
-
if (v.currentTime > k.timeDuration) {
|
|
84
|
-
v.repeatCounter++;
|
|
85
|
-
v.currentTime = 0;
|
|
86
|
-
} else if (v.currentTime < 0) {
|
|
87
|
-
v.repeatCounter++;
|
|
88
|
-
v.currentTime = k.timeDuration;
|
|
89
|
-
}
|
|
90
|
-
if (v.repeat !== 0 && v.repeatCounter >= v.repeat) {
|
|
91
|
-
this.stopAnimation(k.name);
|
|
92
|
-
} else if (v.fadeOut > 0) {
|
|
93
|
-
if (v.animateTime - v.fadeOutStart >= v.fadeOut) {
|
|
94
|
-
this.stopAnimation(k.name);
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
});
|
|
99
|
-
// Update tracks
|
|
100
|
-
this._activeTracks.forEach((v, k)=>{
|
|
101
|
-
v.forEach((alltracks)=>{
|
|
102
|
-
// Only deal with tracks which have not been removed
|
|
103
|
-
const tracks = alltracks.filter((track)=>track.animation && this.isPlayingAnimation(track.animation.name));
|
|
104
|
-
if (tracks.length > 0) {
|
|
105
|
-
const weights = tracks.map((track)=>{
|
|
106
|
-
const info = this._activeAnimations.get(track.animation);
|
|
107
|
-
const weight = info.weight;
|
|
108
|
-
const fadeIn = info.fadeIn === 0 ? 1 : Math.min(1, info.animateTime / info.fadeIn);
|
|
109
|
-
let fadeOut = 1;
|
|
110
|
-
if (info.fadeOut !== 0) {
|
|
111
|
-
fadeOut = 1 - (info.animateTime - info.fadeOutStart) / info.fadeOut;
|
|
112
|
-
}
|
|
113
|
-
return weight * fadeIn * fadeOut;
|
|
114
|
-
});
|
|
115
|
-
const states = tracks.map((track)=>track.calculateState(k, this._activeAnimations.get(track.animation).currentTime / track.animation.timeDuration * track.getDuration()));
|
|
116
|
-
const state = weightedAverage(weights, states, (a, b, t)=>{
|
|
117
|
-
return tracks[0].mixState(a, b, t);
|
|
118
|
-
});
|
|
119
|
-
tracks[0].applyState(k, state);
|
|
120
|
-
}
|
|
121
|
-
});
|
|
122
|
-
});
|
|
123
|
-
// Update skeletons
|
|
124
|
-
this._activeSkeletons.forEach((v, k)=>{
|
|
125
|
-
k.apply();
|
|
126
|
-
});
|
|
127
|
-
}
|
|
128
|
-
/**
|
|
129
|
-
* Checks whether an animation is playing
|
|
130
|
-
* @param name - Name of the animation to be checked, if not given, checks if any animation is playing
|
|
131
|
-
* @returns true if the animation is playing, otherwise false
|
|
132
|
-
*/ isPlayingAnimation(name) {
|
|
133
|
-
return name ? this._activeAnimations.has(this._animations[name]) : this._activeAnimations.size > 0;
|
|
134
|
-
}
|
|
135
|
-
/**
|
|
136
|
-
* Gets the animation clip by name
|
|
137
|
-
* @param name - Name of the animation to get
|
|
138
|
-
* @returns The animation clip if exists, otherwise null
|
|
139
|
-
*/ getAnimationClip(name) {
|
|
140
|
-
return this._animations[name] ?? null;
|
|
141
|
-
}
|
|
142
|
-
/**
|
|
143
|
-
* Sets the weight of specific animation which is currently playing
|
|
144
|
-
* @param name - Name of the animation
|
|
145
|
-
* @param weight - New weight value
|
|
146
|
-
*/ setAnimationWeight(name, weight) {
|
|
147
|
-
const ani = this._animations[name];
|
|
148
|
-
const info = this._activeAnimations.get(ani);
|
|
149
|
-
if (info) {
|
|
150
|
-
info.weight = weight;
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
/**
|
|
154
|
-
* Starts playing an animation of the model
|
|
155
|
-
* @param name - Name of the animation to play
|
|
156
|
-
* @param options - Playing options
|
|
157
|
-
*/ playAnimation(name, options) {
|
|
158
|
-
const ani = this._animations[name];
|
|
159
|
-
if (!ani) {
|
|
160
|
-
console.error(`Animation ${name} not exists`);
|
|
161
|
-
return;
|
|
162
|
-
}
|
|
163
|
-
const fadeIn = Math.max(options?.fadeIn ?? 0, 0);
|
|
164
|
-
const info = this._activeAnimations.get(ani);
|
|
165
|
-
if (info) {
|
|
166
|
-
info.fadeOut = 0;
|
|
167
|
-
info.fadeIn = fadeIn;
|
|
168
|
-
} else {
|
|
169
|
-
const repeat = options?.repeat ?? 0;
|
|
170
|
-
const speedRatio = options?.speedRatio ?? 1;
|
|
171
|
-
const weight = ani.weight;
|
|
172
|
-
this._activeAnimations.set(ani, {
|
|
173
|
-
repeat,
|
|
174
|
-
weight,
|
|
175
|
-
speedRatio,
|
|
176
|
-
fadeIn,
|
|
177
|
-
fadeOut: 0,
|
|
178
|
-
repeatCounter: 0,
|
|
179
|
-
currentTime: speedRatio < 0 ? ani.timeDuration : 0,
|
|
180
|
-
animateTime: 0,
|
|
181
|
-
fadeOutStart: 0,
|
|
182
|
-
firstFrame: true
|
|
183
|
-
});
|
|
184
|
-
ani.tracks?.forEach((v, k)=>{
|
|
185
|
-
let nodeTracks = this._activeTracks.get(k);
|
|
186
|
-
if (!nodeTracks) {
|
|
187
|
-
nodeTracks = new Map();
|
|
188
|
-
this._activeTracks.set(k, nodeTracks);
|
|
189
|
-
}
|
|
190
|
-
for (const track of v){
|
|
191
|
-
const blendId = track.getBlendId();
|
|
192
|
-
let blendedTracks = nodeTracks.get(blendId);
|
|
193
|
-
if (!blendedTracks) {
|
|
194
|
-
blendedTracks = [];
|
|
195
|
-
nodeTracks.set(blendId, blendedTracks);
|
|
196
|
-
}
|
|
197
|
-
blendedTracks.push(track);
|
|
198
|
-
}
|
|
199
|
-
});
|
|
200
|
-
ani.skeletons?.forEach((v, k)=>{
|
|
201
|
-
const refcount = this._activeSkeletons.get(k);
|
|
202
|
-
if (refcount) {
|
|
203
|
-
this._activeSkeletons.set(k, refcount + 1);
|
|
204
|
-
} else {
|
|
205
|
-
this._activeSkeletons.set(k, 1);
|
|
206
|
-
}
|
|
207
|
-
});
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
/**
|
|
211
|
-
* Stops playing an animation of the model
|
|
212
|
-
* @param name - Name of the animation to stop playing
|
|
213
|
-
*/ stopAnimation(name, options) {
|
|
214
|
-
const ani = this._animations[name];
|
|
215
|
-
const info = this._activeAnimations.get(ani);
|
|
216
|
-
if (info) {
|
|
217
|
-
const fadeOut = Math.max(options?.fadeOut ?? 0, 0);
|
|
218
|
-
if (fadeOut !== 0) {
|
|
219
|
-
info.fadeOut = fadeOut;
|
|
220
|
-
info.fadeOutStart = -1;
|
|
221
|
-
} else {
|
|
222
|
-
this._activeAnimations.delete(ani);
|
|
223
|
-
this._activeTracks.forEach((v)=>{
|
|
224
|
-
v.forEach((tracks, id)=>{
|
|
225
|
-
v.set(id, tracks.filter((track)=>track.animation !== ani));
|
|
226
|
-
});
|
|
227
|
-
});
|
|
228
|
-
ani.skeletons?.forEach((v, k)=>{
|
|
229
|
-
const refcount = this._activeSkeletons.get(k);
|
|
230
|
-
if (refcount === 1) {
|
|
231
|
-
k.reset();
|
|
232
|
-
this._activeSkeletons.delete(k);
|
|
233
|
-
} else {
|
|
234
|
-
this._activeSkeletons.set(k, refcount - 1);
|
|
235
|
-
}
|
|
236
|
-
});
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
onDispose() {
|
|
241
|
-
super.onDispose();
|
|
242
|
-
this._model?.dispose();
|
|
243
|
-
this._model = null;
|
|
244
|
-
for(const k in this._animations){
|
|
245
|
-
this._animations[k].dispose();
|
|
246
|
-
}
|
|
247
|
-
this._animations = {};
|
|
248
|
-
this._activeAnimations.clear();
|
|
249
|
-
this._activeSkeletons.clear();
|
|
250
|
-
this._activeTracks.clear();
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
export { AnimationSet };
|
|
255
|
-
//# sourceMappingURL=animationset.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"animationset.js","sources":["../../../src/animation/animationset.ts"],"sourcesContent":["import { weightedAverage, DWeakRef, Disposable } from '@zephyr3d/base';\r\nimport type { IDisposable } from '@zephyr3d/base';\r\nimport type { SceneNode } from '../scene';\r\nimport { AnimationClip } from './animation';\r\nimport type { AnimationTrack } from './animationtrack';\r\nimport type { Skeleton } from './skeleton';\r\n\r\n/**\r\n * Options for playing animation\r\n * @public\r\n **/\r\nexport type PlayAnimationOptions = {\r\n /**\r\n * Repeat times\r\n *\r\n * @remarks\r\n * Number of loops, 0 for infinite loops. Default value is 0\r\n **/\r\n repeat?: number;\r\n /**\r\n * Speed factor\r\n *\r\n * @remarks\r\n * The larger the absolute value, the faster the speed.\r\n * If it is a negative value, it plays in reverse.\r\n * Default value is 1\r\n */\r\n speedRatio?: number;\r\n /**\r\n * Fade-in time\r\n *\r\n * @remarks\r\n * How long it takes for the animation weight to increase from 0 to weight,\r\n * default is 0, indicating no fade-in effect. Usually used in conjunction\r\n * with the fadeOut parameter of stopAnimation() for seamless transition\r\n * between two animations\r\n **/\r\n fadeIn?: number;\r\n};\r\n\r\n/**\r\n * Options for stop playing animation\r\n * @public\r\n **/\r\nexport type StopAnimationOptions = {\r\n /**\r\n * Fade-out time\r\n *\r\n * @remarks\r\n * How long it takes for the animation weight to decrease from current weight\r\n * to 0, default is 0, indicating no fade-out effect. Usually used in conjunction\r\n * with the fadeIn parameter of startAnimation() for seamless transition between\r\n * two animations\r\n */\r\n fadeOut?: number;\r\n};\r\n\r\n/**\r\n * Animation set\r\n * @public\r\n */\r\nexport class AnimationSet extends Disposable implements IDisposable {\r\n /** @internal */\r\n private _model: DWeakRef<SceneNode>;\r\n /** @internal */\r\n private _animations: Record<string, AnimationClip>;\r\n /** @internal */\r\n private readonly _activeTracks: Map<object, Map<unknown, AnimationTrack[]>>;\r\n /** @internal */\r\n private readonly _activeSkeletons: Map<Skeleton, number>;\r\n /** @internal */\r\n private readonly _activeAnimations: Map<\r\n AnimationClip,\r\n {\r\n currentTime: number;\r\n repeat: number;\r\n repeatCounter: number;\r\n weight: number;\r\n speedRatio: number;\r\n firstFrame: boolean;\r\n fadeIn: number;\r\n fadeOut: number;\r\n fadeOutStart: number;\r\n animateTime: number;\r\n }\r\n >;\r\n /**\r\n * Creates an instance of AnimationSet\r\n * @param scene - The scene to which the animation set belongs\r\n * @param model - The model which is controlled by the animation set\r\n */\r\n constructor(model: SceneNode) {\r\n super();\r\n this._model = new DWeakRef<SceneNode>(model);\r\n this._animations = {};\r\n this._activeTracks = new Map();\r\n this._activeSkeletons = new Map();\r\n this._activeAnimations = new Map();\r\n }\r\n /**\r\n * The model which is controlled by the animation set\r\n */\r\n get model(): SceneNode {\r\n return this._model.get();\r\n }\r\n /**\r\n * How many animations in this set\r\n */\r\n get numAnimations(): number {\r\n return Object.getOwnPropertyNames(this._animations).length;\r\n }\r\n /**\r\n * Gets an animation clip by name\r\n * @param name - name of the animation to get\r\n */\r\n get(name: string): AnimationClip {\r\n return this._animations[name] ?? null;\r\n }\r\n /**\r\n * Creates an animation\r\n */\r\n createAnimation(name: string, embedded = false): AnimationClip {\r\n if (!name || this._animations[name]) {\r\n console.error('Animation must have unique name');\r\n return null;\r\n } else {\r\n const animation = new AnimationClip(name, this, embedded);\r\n this._animations[name] = animation;\r\n return animation;\r\n }\r\n }\r\n /**\r\n * Deletes an animation\r\n */\r\n deleteAnimation(name: string) {\r\n const animation = this._animations[name];\r\n if (animation) {\r\n this.stopAnimation(name);\r\n delete this._animations[name];\r\n animation.dispose();\r\n }\r\n }\r\n /**\r\n * Gets names of all the animations of the model\r\n * @returns An array of string that contains the animation names\r\n */\r\n getAnimationNames(): string[] {\r\n return Object.keys(this._animations);\r\n }\r\n /**\r\n * Updates all animations of the model\r\n */\r\n update(deltaInSeconds: number): void {\r\n this._activeAnimations.forEach((v, k) => {\r\n if (v.fadeOut > 0 && v.fadeOutStart < 0) {\r\n v.fadeOutStart = v.animateTime;\r\n }\r\n // Update animation time\r\n if (v.firstFrame) {\r\n v.firstFrame = false;\r\n } else {\r\n const timeAdvance = deltaInSeconds * v.speedRatio;\r\n v.currentTime += timeAdvance;\r\n v.animateTime += timeAdvance;\r\n if (v.currentTime > k.timeDuration) {\r\n v.repeatCounter++;\r\n v.currentTime = 0;\r\n } else if (v.currentTime < 0) {\r\n v.repeatCounter++;\r\n v.currentTime = k.timeDuration;\r\n }\r\n if (v.repeat !== 0 && v.repeatCounter >= v.repeat) {\r\n this.stopAnimation(k.name);\r\n } else if (v.fadeOut > 0) {\r\n if (v.animateTime - v.fadeOutStart >= v.fadeOut) {\r\n this.stopAnimation(k.name);\r\n }\r\n }\r\n }\r\n });\r\n // Update tracks\r\n this._activeTracks.forEach((v, k) => {\r\n v.forEach((alltracks) => {\r\n // Only deal with tracks which have not been removed\r\n const tracks = alltracks.filter(\r\n (track) => track.animation && this.isPlayingAnimation(track.animation.name)\r\n );\r\n if (tracks.length > 0) {\r\n const weights = tracks.map((track) => {\r\n const info = this._activeAnimations.get(track.animation);\r\n const weight = info.weight;\r\n const fadeIn = info.fadeIn === 0 ? 1 : Math.min(1, info.animateTime / info.fadeIn);\r\n let fadeOut = 1;\r\n if (info.fadeOut !== 0) {\r\n fadeOut = 1 - (info.animateTime - info.fadeOutStart) / info.fadeOut;\r\n }\r\n return weight * fadeIn * fadeOut;\r\n });\r\n const states = tracks.map((track) =>\r\n track.calculateState(\r\n k,\r\n (this._activeAnimations.get(track.animation).currentTime / track.animation.timeDuration) *\r\n track.getDuration()\r\n )\r\n );\r\n const state = weightedAverage(weights, states, (a, b, t) => {\r\n return tracks[0].mixState(a, b, t);\r\n });\r\n tracks[0].applyState(k, state);\r\n }\r\n });\r\n });\r\n // Update skeletons\r\n this._activeSkeletons.forEach((v, k) => {\r\n k.apply();\r\n });\r\n }\r\n /**\r\n * Checks whether an animation is playing\r\n * @param name - Name of the animation to be checked, if not given, checks if any animation is playing\r\n * @returns true if the animation is playing, otherwise false\r\n */\r\n isPlayingAnimation(name?: string): boolean {\r\n return name ? this._activeAnimations.has(this._animations[name]) : this._activeAnimations.size > 0;\r\n }\r\n /**\r\n * Gets the animation clip by name\r\n * @param name - Name of the animation to get\r\n * @returns The animation clip if exists, otherwise null\r\n */\r\n getAnimationClip(name: string): AnimationClip | null {\r\n return this._animations[name] ?? null;\r\n }\r\n /**\r\n * Sets the weight of specific animation which is currently playing\r\n * @param name - Name of the animation\r\n * @param weight - New weight value\r\n */\r\n setAnimationWeight(name: string, weight: number): void {\r\n const ani = this._animations[name];\r\n const info = this._activeAnimations.get(ani);\r\n if (info) {\r\n info.weight = weight;\r\n }\r\n }\r\n /**\r\n * Starts playing an animation of the model\r\n * @param name - Name of the animation to play\r\n * @param options - Playing options\r\n */\r\n playAnimation(name: string, options?: PlayAnimationOptions): void {\r\n const ani = this._animations[name];\r\n if (!ani) {\r\n console.error(`Animation ${name} not exists`);\r\n return;\r\n }\r\n const fadeIn = Math.max(options?.fadeIn ?? 0, 0);\r\n const info = this._activeAnimations.get(ani);\r\n if (info) {\r\n info.fadeOut = 0;\r\n info.fadeIn = fadeIn;\r\n } else {\r\n const repeat = options?.repeat ?? 0;\r\n const speedRatio = options?.speedRatio ?? 1;\r\n const weight = ani.weight;\r\n this._activeAnimations.set(ani, {\r\n repeat,\r\n weight,\r\n speedRatio,\r\n fadeIn,\r\n fadeOut: 0,\r\n repeatCounter: 0,\r\n currentTime: speedRatio < 0 ? ani.timeDuration : 0,\r\n animateTime: 0,\r\n fadeOutStart: 0,\r\n firstFrame: true\r\n });\r\n ani.tracks?.forEach((v, k) => {\r\n let nodeTracks = this._activeTracks.get(k);\r\n if (!nodeTracks) {\r\n nodeTracks = new Map();\r\n this._activeTracks.set(k, nodeTracks);\r\n }\r\n for (const track of v) {\r\n const blendId = track.getBlendId();\r\n let blendedTracks = nodeTracks.get(blendId);\r\n if (!blendedTracks) {\r\n blendedTracks = [];\r\n nodeTracks.set(blendId, blendedTracks);\r\n }\r\n blendedTracks.push(track);\r\n }\r\n });\r\n ani.skeletons?.forEach((v, k) => {\r\n const refcount = this._activeSkeletons.get(k);\r\n if (refcount) {\r\n this._activeSkeletons.set(k, refcount + 1);\r\n } else {\r\n this._activeSkeletons.set(k, 1);\r\n }\r\n });\r\n }\r\n }\r\n /**\r\n * Stops playing an animation of the model\r\n * @param name - Name of the animation to stop playing\r\n */\r\n stopAnimation(name: string, options?: StopAnimationOptions): void {\r\n const ani = this._animations[name];\r\n const info = this._activeAnimations.get(ani);\r\n if (info) {\r\n const fadeOut = Math.max(options?.fadeOut ?? 0, 0);\r\n if (fadeOut !== 0) {\r\n info.fadeOut = fadeOut;\r\n info.fadeOutStart = -1;\r\n } else {\r\n this._activeAnimations.delete(ani);\r\n this._activeTracks.forEach((v) => {\r\n v.forEach((tracks, id) => {\r\n v.set(\r\n id,\r\n tracks.filter((track) => track.animation !== ani)\r\n );\r\n });\r\n });\r\n ani.skeletons?.forEach((v, k) => {\r\n const refcount = this._activeSkeletons.get(k);\r\n if (refcount === 1) {\r\n k.reset();\r\n this._activeSkeletons.delete(k);\r\n } else {\r\n this._activeSkeletons.set(k, refcount - 1);\r\n }\r\n });\r\n }\r\n }\r\n }\r\n protected onDispose() {\r\n super.onDispose();\r\n this._model?.dispose();\r\n this._model = null;\r\n for (const k in this._animations) {\r\n this._animations[k].dispose();\r\n }\r\n this._animations = {};\r\n this._activeAnimations.clear();\r\n this._activeSkeletons.clear();\r\n this._activeTracks.clear();\r\n }\r\n}\r\n"],"names":["AnimationSet","Disposable","model","_model","DWeakRef","_animations","_activeTracks","Map","_activeSkeletons","_activeAnimations","get","numAnimations","Object","getOwnPropertyNames","length","name","createAnimation","embedded","console","error","animation","AnimationClip","deleteAnimation","stopAnimation","dispose","getAnimationNames","keys","update","deltaInSeconds","forEach","v","k","fadeOut","fadeOutStart","animateTime","firstFrame","timeAdvance","speedRatio","currentTime","timeDuration","repeatCounter","repeat","alltracks","tracks","filter","track","isPlayingAnimation","weights","map","info","weight","fadeIn","Math","min","states","calculateState","getDuration","state","weightedAverage","a","b","t","mixState","applyState","apply","has","size","getAnimationClip","setAnimationWeight","ani","playAnimation","options","max","set","nodeTracks","blendId","getBlendId","blendedTracks","push","skeletons","refcount","delete","id","reset","onDispose","clear"],"mappings":"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"}
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Base class for any kind of animation track
|
|
3
|
-
* @public
|
|
4
|
-
*/ class AnimationTrack {
|
|
5
|
-
/** @internal */ _name;
|
|
6
|
-
/** @internal */ _embedded;
|
|
7
|
-
/** @internal */ _animation;
|
|
8
|
-
/**
|
|
9
|
-
* Creates a new animation track
|
|
10
|
-
* @param embedded - Whether this track is an embedded track
|
|
11
|
-
*/ constructor(embedded){
|
|
12
|
-
this._name = 'noname';
|
|
13
|
-
this._embedded = !!embedded;
|
|
14
|
-
}
|
|
15
|
-
/** Name of the track */ get name() {
|
|
16
|
-
return this._name;
|
|
17
|
-
}
|
|
18
|
-
set name(val) {
|
|
19
|
-
this._name = val;
|
|
20
|
-
}
|
|
21
|
-
/** Wether this is an embedded track */ get embedded() {
|
|
22
|
-
return this._embedded;
|
|
23
|
-
}
|
|
24
|
-
/** Animation this track belongs to */ get animation() {
|
|
25
|
-
return this._animation;
|
|
26
|
-
}
|
|
27
|
-
set animation(ani) {
|
|
28
|
-
this._animation = ani;
|
|
29
|
-
}
|
|
30
|
-
/** Stops playing the track and rewind to the first frame */ reset(_target) {}
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
export { AnimationTrack };
|
|
34
|
-
//# sourceMappingURL=animationtrack.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"animationtrack.js","sources":["../../../src/animation/animationtrack.ts"],"sourcesContent":["import type { AnimationClip } from './animation';\r\n\r\n/**\r\n * Base class for any kind of animation track\r\n * @public\r\n */\r\nexport abstract class AnimationTrack<StateType = unknown> {\r\n /** @internal */\r\n protected _name: string;\r\n /** @internal */\r\n protected _embedded: boolean;\r\n /** @internal */\r\n protected _animation: AnimationClip;\r\n /**\r\n * Creates a new animation track\r\n * @param embedded - Whether this track is an embedded track\r\n */\r\n constructor(embedded?: boolean) {\r\n this._name = 'noname';\r\n this._embedded = !!embedded;\r\n }\r\n /** Name of the track */\r\n get name() {\r\n return this._name;\r\n }\r\n set name(val: string) {\r\n this._name = val;\r\n }\r\n /** Wether this is an embedded track */\r\n get embedded(): boolean {\r\n return this._embedded;\r\n }\r\n /** Animation this track belongs to */\r\n get animation(): AnimationClip {\r\n return this._animation;\r\n }\r\n set animation(ani: AnimationClip) {\r\n this._animation = ani;\r\n }\r\n /** Stops playing the track and rewind to the first frame */\r\n reset(_target: object) {}\r\n /**\r\n * Calculates current animation state\r\n * @param target - The animated object\r\n * @param currentTime - At which time the animation state should be calculated.\r\n * @returns State object\r\n */\r\n abstract calculateState(target: object, currentTime: number): StateType;\r\n /**\r\n * Applys animation state to node\r\n * @param target - The animated object to which the state will be applied\r\n * @param state - The animation state\r\n */\r\n abstract applyState(target: object, state: StateType);\r\n /**\r\n * Mixes two animation state according to specific weight value\r\n * @param a - The first state object\r\n * @param b - The second state object\r\n * @param t - The weight value\r\n * @returns The mixed state object\r\n */\r\n abstract mixState(a: StateType, b: StateType, t: number): StateType;\r\n /**\r\n * Get the blend ID\r\n * @returns Blend ID\r\n *\r\n * @remarks\r\n * Two tracks which have same blend ID can be blended together\r\n */\r\n abstract getBlendId(): unknown;\r\n /**\r\n * Get the duration of the track\r\n * @returns Duration of the track\r\n */\r\n abstract getDuration(): number;\r\n}\r\n"],"names":["AnimationTrack","embedded","_name","_embedded","name","val","animation","_animation","ani","reset","_target"],"mappings":"AAEA;;;AAGC,IACM,MAAeA,cAAAA,CAAAA;qBAEpB,KAAwB;qBAExB,SAA6B;qBAE7B,UAAoC;AACpC;;;MAIA,WAAA,CAAYC,QAAkB,CAAE;QAC9B,IAAI,CAACC,KAAK,GAAG,QAAA;AACb,QAAA,IAAI,CAACC,SAAS,GAAG,CAAC,CAACF,QAAAA;AACrB;6BAEA,IAAIG,IAAO,GAAA;QACT,OAAO,IAAI,CAACF,KAAK;AACnB;IACA,IAAIE,IAAAA,CAAKC,GAAW,EAAE;QACpB,IAAI,CAACH,KAAK,GAAGG,GAAAA;AACf;4CAEA,IAAIJ,QAAoB,GAAA;QACtB,OAAO,IAAI,CAACE,SAAS;AACvB;2CAEA,IAAIG,SAA2B,GAAA;QAC7B,OAAO,IAAI,CAACC,UAAU;AACxB;IACA,IAAID,SAAAA,CAAUE,GAAkB,EAAE;QAChC,IAAI,CAACD,UAAU,GAAGC,GAAAA;AACpB;AACA,iEACAC,KAAAA,CAAMC,OAAe,EAAE;AAmCzB;;;;"}
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
import { Vector3, Interpolator, Quaternion } from '@zephyr3d/base';
|
|
2
|
-
import { AnimationTrack } from './animationtrack.js';
|
|
3
|
-
|
|
4
|
-
const tmpVec3 = new Vector3();
|
|
5
|
-
/**
|
|
6
|
-
* Euler angle rotation animation track
|
|
7
|
-
* @public
|
|
8
|
-
*/ class NodeEulerRotationTrack extends AnimationTrack {
|
|
9
|
-
_state;
|
|
10
|
-
_interpolator;
|
|
11
|
-
constructor(modeOrInterpolator, keyFramesOrEmbedded, embedded){
|
|
12
|
-
if (modeOrInterpolator instanceof Interpolator) {
|
|
13
|
-
if (modeOrInterpolator.target !== 'vec3') {
|
|
14
|
-
throw new Error(`TranslationTrack(): interpolator target must be 'vec3'`);
|
|
15
|
-
}
|
|
16
|
-
super(keyFramesOrEmbedded ?? false);
|
|
17
|
-
this._interpolator = modeOrInterpolator;
|
|
18
|
-
} else {
|
|
19
|
-
const keyFrames = keyFramesOrEmbedded;
|
|
20
|
-
const inputs = new Float32Array(keyFrames.map((val)=>val.time));
|
|
21
|
-
const outputs = new Float32Array(keyFrames.length * 3);
|
|
22
|
-
for(let i = 0; i < keyFrames.length; i++){
|
|
23
|
-
outputs[i * 3 + 0] = keyFrames[i].value.x;
|
|
24
|
-
outputs[i * 3 + 1] = keyFrames[i].value.y;
|
|
25
|
-
outputs[i * 3 + 2] = keyFrames[i].value.z;
|
|
26
|
-
}
|
|
27
|
-
super(embedded ?? false);
|
|
28
|
-
this._interpolator = new Interpolator(modeOrInterpolator, 'vec3', inputs, outputs);
|
|
29
|
-
}
|
|
30
|
-
this._state = new Quaternion();
|
|
31
|
-
}
|
|
32
|
-
calculateState(target, currentTime) {
|
|
33
|
-
this._interpolator.interpolate(currentTime, tmpVec3);
|
|
34
|
-
this._state.fromEulerAngle(tmpVec3.x, tmpVec3.y, tmpVec3.z);
|
|
35
|
-
return this._state;
|
|
36
|
-
}
|
|
37
|
-
applyState(node, state) {
|
|
38
|
-
node.rotation.set(state);
|
|
39
|
-
}
|
|
40
|
-
mixState(a, b, t) {
|
|
41
|
-
return Quaternion.slerp(a, b, t);
|
|
42
|
-
}
|
|
43
|
-
getBlendId() {
|
|
44
|
-
return 'node-rotation';
|
|
45
|
-
}
|
|
46
|
-
getDuration() {
|
|
47
|
-
return this._interpolator.maxTime;
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
export { NodeEulerRotationTrack };
|
|
52
|
-
//# sourceMappingURL=eulerrotationtrack.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"eulerrotationtrack.js","sources":["../../../src/animation/eulerrotationtrack.ts"],"sourcesContent":["import type { InterpolationMode } from '@zephyr3d/base';\r\nimport { Interpolator, Quaternion, Vector3 } from '@zephyr3d/base';\r\nimport { AnimationTrack } from './animationtrack';\r\nimport type { SceneNode } from '../scene';\r\n\r\nconst tmpVec3 = new Vector3();\r\n\r\n/**\r\n * Euler angle rotation animation track\r\n * @public\r\n */\r\nexport class NodeEulerRotationTrack extends AnimationTrack<Quaternion> {\r\n private readonly _state: Quaternion;\r\n private readonly _interpolator: Interpolator;\r\n /**\r\n * Create an instance of EulerRotationTrack from keyframe values\r\n * @param interpolator - Interpolator object that contains the keyframe values\r\n * @param embedded - Whether this track be an embedded track\r\n */\r\n constructor(interpolator: Interpolator, embedded?: boolean);\r\n /**\r\n * Create an instance of EulerRotationTrack from keyframe values\r\n * @param mode - The interpolation mode of keyframes\r\n * @param keyFrames - Keyframe values\r\n * @param embedded - Whether this track be an embedded track\r\n */\r\n constructor(mode: InterpolationMode, keyFrames: { time: number; value: Vector3 }[], embedded?: boolean);\r\n constructor(\r\n modeOrInterpolator?: Interpolator | InterpolationMode,\r\n keyFramesOrEmbedded?: { time: number; value: Vector3 }[] | boolean,\r\n embedded?: boolean\r\n ) {\r\n if (modeOrInterpolator instanceof Interpolator) {\r\n if (modeOrInterpolator.target !== 'vec3') {\r\n throw new Error(`TranslationTrack(): interpolator target must be 'vec3'`);\r\n }\r\n super((keyFramesOrEmbedded as boolean) ?? false);\r\n this._interpolator = modeOrInterpolator;\r\n } else {\r\n const keyFrames = keyFramesOrEmbedded as { time: number; value: Vector3 }[];\r\n const inputs = new Float32Array(keyFrames.map((val) => val.time));\r\n const outputs = new Float32Array(keyFrames.length * 3);\r\n for (let i = 0; i < keyFrames.length; i++) {\r\n outputs[i * 3 + 0] = keyFrames[i].value.x;\r\n outputs[i * 3 + 1] = keyFrames[i].value.y;\r\n outputs[i * 3 + 2] = keyFrames[i].value.z;\r\n }\r\n super(embedded ?? false);\r\n this._interpolator = new Interpolator(modeOrInterpolator, 'vec3', inputs, outputs);\r\n }\r\n this._state = new Quaternion();\r\n }\r\n calculateState(target: object, currentTime: number): Quaternion {\r\n this._interpolator.interpolate(currentTime, tmpVec3);\r\n this._state.fromEulerAngle(tmpVec3.x, tmpVec3.y, tmpVec3.z);\r\n return this._state;\r\n }\r\n applyState(node: SceneNode, state: Quaternion) {\r\n node.rotation.set(state);\r\n }\r\n mixState(a: Quaternion, b: Quaternion, t: number): Quaternion {\r\n return Quaternion.slerp(a, b, t);\r\n }\r\n getBlendId(): unknown {\r\n return 'node-rotation';\r\n }\r\n getDuration(): number {\r\n return this._interpolator.maxTime;\r\n }\r\n}\r\n"],"names":["tmpVec3","Vector3","NodeEulerRotationTrack","AnimationTrack","_state","_interpolator","modeOrInterpolator","keyFramesOrEmbedded","embedded","Interpolator","target","Error","keyFrames","inputs","Float32Array","map","val","time","outputs","length","i","value","x","y","z","Quaternion","calculateState","currentTime","interpolate","fromEulerAngle","applyState","node","state","rotation","set","mixState","a","b","t","slerp","getBlendId","getDuration","maxTime"],"mappings":";;;AAKA,MAAMA,UAAU,IAAIC,OAAAA,EAAAA;AAEpB;;;IAIO,MAAMC,sBAA+BC,SAAAA,cAAAA,CAAAA;IACzBC,MAAmB;IACnBC,aAA4B;AAc7C,IAAA,WAAA,CACEC,kBAAqD,EACrDC,mBAAkE,EAClEC,QAAkB,CAClB;AACA,QAAA,IAAIF,8BAA8BG,YAAc,EAAA;YAC9C,IAAIH,kBAAAA,CAAmBI,MAAM,KAAK,MAAQ,EAAA;AACxC,gBAAA,MAAM,IAAIC,KAAAA,CAAM,CAAC,sDAAsD,CAAC,CAAA;AAC1E;YACA,KAAK,CAAC,mBAAoC,IAAA,KAAA,CAAA;YAC1C,IAAI,CAACN,aAAa,GAAGC,kBAAAA;SAChB,MAAA;AACL,YAAA,MAAMM,SAAYL,GAAAA,mBAAAA;YAClB,MAAMM,MAAAA,GAAS,IAAIC,YAAaF,CAAAA,SAAAA,CAAUG,GAAG,CAAC,CAACC,GAAQA,GAAAA,GAAAA,CAAIC,IAAI,CAAA,CAAA;AAC/D,YAAA,MAAMC,OAAU,GAAA,IAAIJ,YAAaF,CAAAA,SAAAA,CAAUO,MAAM,GAAG,CAAA,CAAA;AACpD,YAAA,IAAK,IAAIC,CAAI,GAAA,CAAA,EAAGA,IAAIR,SAAUO,CAAAA,MAAM,EAAEC,CAAK,EAAA,CAAA;gBACzCF,OAAO,CAACE,CAAI,GAAA,CAAA,GAAI,CAAE,CAAA,GAAGR,SAAS,CAACQ,CAAE,CAAA,CAACC,KAAK,CAACC,CAAC;gBACzCJ,OAAO,CAACE,CAAI,GAAA,CAAA,GAAI,CAAE,CAAA,GAAGR,SAAS,CAACQ,CAAE,CAAA,CAACC,KAAK,CAACE,CAAC;gBACzCL,OAAO,CAACE,CAAI,GAAA,CAAA,GAAI,CAAE,CAAA,GAAGR,SAAS,CAACQ,CAAE,CAAA,CAACC,KAAK,CAACG,CAAC;AAC3C;AACA,YAAA,KAAK,CAAChB,QAAY,IAAA,KAAA,CAAA;AAClB,YAAA,IAAI,CAACH,aAAa,GAAG,IAAII,YAAaH,CAAAA,kBAAAA,EAAoB,QAAQO,MAAQK,EAAAA,OAAAA,CAAAA;AAC5E;QACA,IAAI,CAACd,MAAM,GAAG,IAAIqB,UAAAA,EAAAA;AACpB;IACAC,cAAehB,CAAAA,MAAc,EAAEiB,WAAmB,EAAc;AAC9D,QAAA,IAAI,CAACtB,aAAa,CAACuB,WAAW,CAACD,WAAa3B,EAAAA,OAAAA,CAAAA;AAC5C,QAAA,IAAI,CAACI,MAAM,CAACyB,cAAc,CAAC7B,OAAAA,CAAQsB,CAAC,EAAEtB,OAAQuB,CAAAA,CAAC,EAAEvB,OAAAA,CAAQwB,CAAC,CAAA;QAC1D,OAAO,IAAI,CAACpB,MAAM;AACpB;IACA0B,UAAWC,CAAAA,IAAe,EAAEC,KAAiB,EAAE;QAC7CD,IAAKE,CAAAA,QAAQ,CAACC,GAAG,CAACF,KAAAA,CAAAA;AACpB;AACAG,IAAAA,QAAAA,CAASC,CAAa,EAAEC,CAAa,EAAEC,CAAS,EAAc;AAC5D,QAAA,OAAOb,UAAWc,CAAAA,KAAK,CAACH,CAAAA,EAAGC,CAAGC,EAAAA,CAAAA,CAAAA;AAChC;IACAE,UAAsB,GAAA;QACpB,OAAO,eAAA;AACT;IACAC,WAAsB,GAAA;AACpB,QAAA,OAAO,IAAI,CAACpC,aAAa,CAACqC,OAAO;AACnC;AACF;;;;"}
|
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
import { PBStructTypeInfo, PBArrayTypeInfo, PBPrimitiveTypeInfo, PBPrimitiveType } from '@zephyr3d/device';
|
|
2
|
-
import { Application } from '../app/app.js';
|
|
3
|
-
import { MAX_MORPH_ATTRIBUTES, MAX_MORPH_TARGETS, MORPH_WEIGHTS_VECTOR_COUNT, MORPH_ATTRIBUTE_VECTOR_COUNT } from '../values.js';
|
|
4
|
-
import { ShaderHelper } from '../material/shader/helper.js';
|
|
5
|
-
import { BoundingBox } from '../utility/bounding_volume.js';
|
|
6
|
-
|
|
7
|
-
function processMorphData(subMesh, morphWeights) {
|
|
8
|
-
const device = Application.instance.device;
|
|
9
|
-
const numTargets = subMesh.numTargets;
|
|
10
|
-
if (numTargets === 0) {
|
|
11
|
-
return;
|
|
12
|
-
}
|
|
13
|
-
const attributes = Object.getOwnPropertyNames(subMesh.targets);
|
|
14
|
-
const numVertices = subMesh.primitive.get().getNumVertices();
|
|
15
|
-
const weightsAndOffsets = new Float32Array(4 + MAX_MORPH_TARGETS + MAX_MORPH_ATTRIBUTES);
|
|
16
|
-
for(let i = 0; i < numTargets; i++){
|
|
17
|
-
weightsAndOffsets[4 + i] = morphWeights?.[i] ?? 0;
|
|
18
|
-
}
|
|
19
|
-
const textureSize = Math.ceil(Math.sqrt(numVertices * attributes.length * numTargets));
|
|
20
|
-
if (textureSize > device.getDeviceCaps().textureCaps.maxTextureSize) {
|
|
21
|
-
// TODO: reduce morph attributes
|
|
22
|
-
throw new Error(`Morph target data too large`);
|
|
23
|
-
}
|
|
24
|
-
weightsAndOffsets[0] = textureSize;
|
|
25
|
-
weightsAndOffsets[1] = textureSize;
|
|
26
|
-
weightsAndOffsets[2] = numVertices;
|
|
27
|
-
weightsAndOffsets[3] = numTargets;
|
|
28
|
-
let offset = 0;
|
|
29
|
-
const textureData = new Float32Array(textureSize * textureSize * 4);
|
|
30
|
-
for(let attrib = 0; attrib < MAX_MORPH_ATTRIBUTES; attrib++){
|
|
31
|
-
const index = attributes.indexOf(String(attrib));
|
|
32
|
-
if (index < 0) {
|
|
33
|
-
weightsAndOffsets[4 + MAX_MORPH_TARGETS + attrib] = -1;
|
|
34
|
-
continue;
|
|
35
|
-
}
|
|
36
|
-
weightsAndOffsets[4 + MAX_MORPH_TARGETS + attrib] = offset >> 2;
|
|
37
|
-
const info = subMesh.targets[attrib];
|
|
38
|
-
if (info.data.length !== numTargets) {
|
|
39
|
-
console.error(`Invalid morph target data`);
|
|
40
|
-
return;
|
|
41
|
-
}
|
|
42
|
-
for(let t = 0; t < numTargets; t++){
|
|
43
|
-
const data = info.data[t];
|
|
44
|
-
for(let i = 0; i < numVertices; i++){
|
|
45
|
-
for(let j = 0; j < 4; j++){
|
|
46
|
-
textureData[offset++] = j < info.numComponents ? data[i * info.numComponents + j] : 1;
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
const morphTexture = device.createTexture2D('rgba32f', textureSize, textureSize, {
|
|
52
|
-
samplerOptions: {
|
|
53
|
-
minFilter: 'nearest',
|
|
54
|
-
magFilter: 'nearest',
|
|
55
|
-
mipFilter: 'none'
|
|
56
|
-
}
|
|
57
|
-
});
|
|
58
|
-
morphTexture.update(textureData, 0, 0, textureSize, textureSize);
|
|
59
|
-
const bufferType = new PBStructTypeInfo('dummy', 'std140', [
|
|
60
|
-
{
|
|
61
|
-
name: ShaderHelper.getMorphInfoUniformName(),
|
|
62
|
-
type: new PBArrayTypeInfo(new PBPrimitiveTypeInfo(PBPrimitiveType.F32VEC4), 1 + MORPH_WEIGHTS_VECTOR_COUNT + MORPH_ATTRIBUTE_VECTOR_COUNT)
|
|
63
|
-
}
|
|
64
|
-
]);
|
|
65
|
-
const morphUniformBuffer = device.createStructuredBuffer(bufferType, {
|
|
66
|
-
usage: 'uniform'
|
|
67
|
-
}, weightsAndOffsets);
|
|
68
|
-
const morphBoundingBox = new BoundingBox();
|
|
69
|
-
calculateMorphBoundingBox(morphBoundingBox, subMesh.targetBox, weightsAndOffsets.subarray(4, 4 + MAX_MORPH_TARGETS), numTargets);
|
|
70
|
-
const meshAABB = subMesh.mesh.getBoundingVolume().toAABB();
|
|
71
|
-
morphBoundingBox.minPoint.addBy(meshAABB.minPoint);
|
|
72
|
-
morphBoundingBox.maxPoint.addBy(meshAABB.maxPoint);
|
|
73
|
-
subMesh.mesh.setMorphData(morphTexture);
|
|
74
|
-
subMesh.mesh.setMorphInfo(morphUniformBuffer);
|
|
75
|
-
subMesh.mesh.setAnimatedBoundingBox(morphBoundingBox);
|
|
76
|
-
}
|
|
77
|
-
/** @internal */ function calculateMorphBoundingBox(morphBoundingBox, keyframeBoundingBox, weights, numTargets) {
|
|
78
|
-
morphBoundingBox.minPoint.setXYZ(0, 0, 0);
|
|
79
|
-
morphBoundingBox.maxPoint.setXYZ(0, 0, 0);
|
|
80
|
-
for(let i = 0; i < numTargets; i++){
|
|
81
|
-
const weight = weights[i];
|
|
82
|
-
const keyframeBox = keyframeBoundingBox[i];
|
|
83
|
-
morphBoundingBox.minPoint.x += keyframeBox.minPoint.x * weight;
|
|
84
|
-
morphBoundingBox.minPoint.y += keyframeBox.minPoint.y * weight;
|
|
85
|
-
morphBoundingBox.minPoint.y += keyframeBox.minPoint.z * weight;
|
|
86
|
-
morphBoundingBox.maxPoint.x += keyframeBox.maxPoint.x * weight;
|
|
87
|
-
morphBoundingBox.maxPoint.y += keyframeBox.maxPoint.y * weight;
|
|
88
|
-
morphBoundingBox.maxPoint.y += keyframeBox.maxPoint.z * weight;
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
export { calculateMorphBoundingBox, processMorphData };
|
|
93
|
-
//# sourceMappingURL=morphtarget.js.map
|