@zephyr3d/scene 0.9.3 → 0.9.5

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.
Files changed (188) hide show
  1. package/dist/animation/animationmask.js +224 -0
  2. package/dist/animation/animationmask.js.map +1 -0
  3. package/dist/animation/animationset.js +268 -67
  4. package/dist/animation/animationset.js.map +1 -1
  5. package/dist/animation/animationtrack.js.map +1 -1
  6. package/dist/animation/eulerrotationtrack.js +3 -0
  7. package/dist/animation/eulerrotationtrack.js.map +1 -1
  8. package/dist/animation/fixed_geometry_cache_track.js +7 -0
  9. package/dist/animation/fixed_geometry_cache_track.js.map +1 -1
  10. package/dist/animation/ik_modifier.js.map +1 -1
  11. package/dist/animation/joint_dynamics/collision.js +6 -4
  12. package/dist/animation/joint_dynamics/collision.js.map +1 -1
  13. package/dist/animation/joint_dynamics/controller.js +390 -43
  14. package/dist/animation/joint_dynamics/controller.js.map +1 -1
  15. package/dist/animation/joint_dynamics/joint_dynamics_system.js +62 -3
  16. package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -1
  17. package/dist/animation/joint_dynamics/solver.js +4 -3
  18. package/dist/animation/joint_dynamics/solver.js.map +1 -1
  19. package/dist/animation/joint_dynamics/types.js.map +1 -1
  20. package/dist/animation/joint_dynamics_modifier.js +2 -0
  21. package/dist/animation/joint_dynamics_modifier.js.map +1 -1
  22. package/dist/animation/morphtarget.js +3 -72
  23. package/dist/animation/morphtarget.js.map +1 -1
  24. package/dist/animation/morphtrack.js +3 -0
  25. package/dist/animation/morphtrack.js.map +1 -1
  26. package/dist/animation/pca_geometry_cache_track.js +3 -0
  27. package/dist/animation/pca_geometry_cache_track.js.map +1 -1
  28. package/dist/animation/proptrack.js +3 -0
  29. package/dist/animation/proptrack.js.map +1 -1
  30. package/dist/animation/rotationtrack.js +3 -0
  31. package/dist/animation/rotationtrack.js.map +1 -1
  32. package/dist/animation/scaletrack.js +3 -0
  33. package/dist/animation/scaletrack.js.map +1 -1
  34. package/dist/animation/skeleton.js +254 -79
  35. package/dist/animation/skeleton.js.map +1 -1
  36. package/dist/animation/skeleton_modifier.js.map +1 -1
  37. package/dist/animation/spring/spring_particle.js +4 -4
  38. package/dist/animation/spring/spring_particle.js.map +1 -1
  39. package/dist/animation/spring_modifier.js.map +1 -1
  40. package/dist/animation/translationtrack.js +3 -0
  41. package/dist/animation/translationtrack.js.map +1 -1
  42. package/dist/app/engine.js +129 -17
  43. package/dist/app/engine.js.map +1 -1
  44. package/dist/app/scriptregistry.js +251 -80
  45. package/dist/app/scriptregistry.js.map +1 -1
  46. package/dist/asset/assetmanager.js +133 -102
  47. package/dist/asset/assetmanager.js.map +1 -1
  48. package/dist/asset/loaders/gltf/gltf_loader.js +18 -14
  49. package/dist/asset/loaders/gltf/gltf_loader.js.map +1 -1
  50. package/dist/asset/loaders/loader.js +1 -6
  51. package/dist/asset/loaders/loader.js.map +1 -1
  52. package/dist/asset/loaders/zabc/zabc_loader.js.map +1 -1
  53. package/dist/asset/model.js +1052 -183
  54. package/dist/asset/model.js.map +1 -1
  55. package/dist/avatar/wardrobe.js +474 -0
  56. package/dist/avatar/wardrobe.js.map +1 -0
  57. package/dist/index.d.ts +1810 -233
  58. package/dist/index.js +13 -3
  59. package/dist/index.js.map +1 -1
  60. package/dist/material/material.js +1 -1
  61. package/dist/material/material.js.map +1 -1
  62. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +6 -3
  63. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
  64. package/dist/material/mixins/pbr/common.js +72 -15
  65. package/dist/material/mixins/pbr/common.js.map +1 -1
  66. package/dist/material/msdf_text.js +180 -0
  67. package/dist/material/msdf_text.js.map +1 -0
  68. package/dist/material/msdf_text_sprite.js +64 -0
  69. package/dist/material/msdf_text_sprite.js.map +1 -0
  70. package/dist/material/pbrblueprint.js +21 -6
  71. package/dist/material/pbrblueprint.js.map +1 -1
  72. package/dist/material/shader/helper.js +277 -277
  73. package/dist/material/shader/helper.js.map +1 -1
  74. package/dist/material/sprite_sdf.js +106 -0
  75. package/dist/material/sprite_sdf.js.map +1 -0
  76. package/dist/posteffect/ssr.js +1 -0
  77. package/dist/posteffect/ssr.js.map +1 -1
  78. package/dist/render/abuffer_oit.js +1 -0
  79. package/dist/render/abuffer_oit.js.map +1 -1
  80. package/dist/render/cluster_light.js.map +1 -1
  81. package/dist/render/cull_visitor.js +28 -0
  82. package/dist/render/cull_visitor.js.map +1 -1
  83. package/dist/render/drawable.js.map +1 -1
  84. package/dist/render/drawable_mixin.js +1 -0
  85. package/dist/render/drawable_mixin.js.map +1 -1
  86. package/dist/render/envlight.js +54 -1
  87. package/dist/render/envlight.js.map +1 -1
  88. package/dist/render/fbm_wavegenerator.js +1 -0
  89. package/dist/render/fbm_wavegenerator.js.map +1 -1
  90. package/dist/render/gerstner_wavegenerator.js +1 -0
  91. package/dist/render/gerstner_wavegenerator.js.map +1 -1
  92. package/dist/render/globalbindgroup_allocator.js +1 -0
  93. package/dist/render/globalbindgroup_allocator.js.map +1 -1
  94. package/dist/render/render_queue.js +1 -0
  95. package/dist/render/render_queue.js.map +1 -1
  96. package/dist/render/sky.js +9 -0
  97. package/dist/render/sky.js.map +1 -1
  98. package/dist/scene/basesprite.js +1 -5
  99. package/dist/scene/basesprite.js.map +1 -1
  100. package/dist/scene/batchgroup.js +18 -8
  101. package/dist/scene/batchgroup.js.map +1 -1
  102. package/dist/scene/environment.js +16 -2
  103. package/dist/scene/environment.js.map +1 -1
  104. package/dist/scene/mesh.js +164 -102
  105. package/dist/scene/mesh.js.map +1 -1
  106. package/dist/scene/meshdrawable.js +96 -0
  107. package/dist/scene/meshdrawable.js.map +1 -0
  108. package/dist/scene/msdftext.js +341 -0
  109. package/dist/scene/msdftext.js.map +1 -0
  110. package/dist/scene/msdftextsprite.js +349 -0
  111. package/dist/scene/msdftextsprite.js.map +1 -0
  112. package/dist/scene/particlesys.js +1 -0
  113. package/dist/scene/particlesys.js.map +1 -1
  114. package/dist/scene/scene.js +2 -0
  115. package/dist/scene/scene.js.map +1 -1
  116. package/dist/scene/scene_node.js +437 -230
  117. package/dist/scene/scene_node.js.map +1 -1
  118. package/dist/scene/sdftextsprite.js +322 -0
  119. package/dist/scene/sdftextsprite.js.map +1 -0
  120. package/dist/scene/terrain-cm/grass.js +1 -0
  121. package/dist/scene/terrain-cm/grass.js.map +1 -1
  122. package/dist/scene/terrain-cm/grassmaterial.js +1 -0
  123. package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
  124. package/dist/scene/terrain-cm/terrain-cm.js +1 -0
  125. package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
  126. package/dist/scene/textsprite.js +120 -0
  127. package/dist/scene/textsprite.js.map +1 -0
  128. package/dist/scene/water.js +1 -0
  129. package/dist/scene/water.js.map +1 -1
  130. package/dist/shadow/shader.js +1 -0
  131. package/dist/shadow/shader.js.map +1 -1
  132. package/dist/text/font/font_asset.js +884 -0
  133. package/dist/text/font/font_asset.js.map +1 -0
  134. package/dist/text/font/sfnt_reader.js +43 -0
  135. package/dist/text/font/sfnt_reader.js.map +1 -0
  136. package/dist/text/msdf/generator.js +417 -0
  137. package/dist/text/msdf/generator.js.map +1 -0
  138. package/dist/text/msdf/shape.js +146 -0
  139. package/dist/text/msdf/shape.js.map +1 -0
  140. package/dist/text/runtime/msdf_glyph_atlas.js +146 -0
  141. package/dist/text/runtime/msdf_glyph_atlas.js.map +1 -0
  142. package/dist/text/runtime/msdf_text_atlas_manager.js +50 -0
  143. package/dist/text/runtime/msdf_text_atlas_manager.js.map +1 -0
  144. package/dist/text/runtime/text_layout.js +96 -0
  145. package/dist/text/runtime/text_layout.js.map +1 -0
  146. package/dist/utility/blueprint/material/inputs.js +188 -1
  147. package/dist/utility/blueprint/material/inputs.js.map +1 -1
  148. package/dist/utility/blueprint/material/ir.js +16 -1
  149. package/dist/utility/blueprint/material/ir.js.map +1 -1
  150. package/dist/utility/blueprint/material/pbr.js +32 -0
  151. package/dist/utility/blueprint/material/pbr.js.map +1 -1
  152. package/dist/utility/bounding_volume.js.map +1 -1
  153. package/dist/utility/pmrem.js +34 -8
  154. package/dist/utility/pmrem.js.map +1 -1
  155. package/dist/utility/serialization/manager.js +340 -283
  156. package/dist/utility/serialization/manager.js.map +1 -1
  157. package/dist/utility/serialization/scene/animation.js +702 -7
  158. package/dist/utility/serialization/scene/animation.js.map +1 -1
  159. package/dist/utility/serialization/scene/batch.js +2 -0
  160. package/dist/utility/serialization/scene/batch.js.map +1 -1
  161. package/dist/utility/serialization/scene/camera.js +2 -0
  162. package/dist/utility/serialization/scene/camera.js.map +1 -1
  163. package/dist/utility/serialization/scene/light.js +2 -0
  164. package/dist/utility/serialization/scene/light.js.map +1 -1
  165. package/dist/utility/serialization/scene/material.js +1 -0
  166. package/dist/utility/serialization/scene/material.js.map +1 -1
  167. package/dist/utility/serialization/scene/mesh.js +66 -4
  168. package/dist/utility/serialization/scene/mesh.js.map +1 -1
  169. package/dist/utility/serialization/scene/node.js +189 -8
  170. package/dist/utility/serialization/scene/node.js.map +1 -1
  171. package/dist/utility/serialization/scene/particle.js +2 -0
  172. package/dist/utility/serialization/scene/particle.js.map +1 -1
  173. package/dist/utility/serialization/scene/primitive.js +1 -0
  174. package/dist/utility/serialization/scene/primitive.js.map +1 -1
  175. package/dist/utility/serialization/scene/sprite.js +2 -0
  176. package/dist/utility/serialization/scene/sprite.js.map +1 -1
  177. package/dist/utility/serialization/scene/terrain.js +2 -0
  178. package/dist/utility/serialization/scene/terrain.js.map +1 -1
  179. package/dist/utility/serialization/scene/text.js +516 -0
  180. package/dist/utility/serialization/scene/text.js.map +1 -0
  181. package/dist/utility/serialization/scene/water.js +2 -0
  182. package/dist/utility/serialization/scene/water.js.map +1 -1
  183. package/dist/utility/serialization/types.js.map +1 -1
  184. package/dist/utility/textures/sheenlut.js +138 -0
  185. package/dist/utility/textures/sheenlut.js.map +1 -0
  186. package/dist/values.js +48 -48
  187. package/dist/values.js.map +1 -1
  188. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"animationset.js","sources":["../../src/animation/animationset.ts"],"sourcesContent":["import { weightedAverage, Disposable, Interpolator, Vector3 } from '@zephyr3d/base';\r\nimport type { DRef, IDisposable, Nullable } from '@zephyr3d/base';\r\nimport { Quaternion } from '@zephyr3d/base';\r\nimport type { SceneNode } from '../scene';\r\nimport { AnimationClip } from './animation';\r\nimport type { AnimationTrack } from './animationtrack';\r\nimport { NodeRotationTrack } from './rotationtrack';\r\nimport { NodeEulerRotationTrack } from './eulerrotationtrack';\r\nimport { NodeTranslationTrack } from './translationtrack';\r\nimport { NodeScaleTrack } from './scaletrack';\r\nimport { HumanoidBodyRig, Skeleton } from './skeleton';\r\n\r\n/**\r\n * Options for playing an animation.\r\n *\r\n * Controls looping, playback speed (including reverse), and fade-in blending.\r\n * @public\r\n **/\r\nexport type PlayAnimationOptions = {\r\n /**\r\n * Number of loops to play.\r\n *\r\n * - 0: infinite looping (default).\r\n * - n \\> 0: play exactly n loops (each loop is one full duration of the clip).\r\n */\r\n repeat?: number;\r\n /**\r\n * Playback speed multiplier.\r\n *\r\n * - 1: normal speed (default).\r\n * - \\>1: faster; \\<1: slower.\r\n * - Negative values play the clip in reverse. The initial `currentTime` will be set to the end.\r\n */\r\n speedRatio?: number;\r\n /**\r\n * Fade-in duration in seconds.\r\n *\r\n * Interpolates the animation weight from 0 to the clip's configured weight over this time.\r\n * Use together with `stopAnimation(..., { fadeOut })` for smooth cross-fading.\r\n * Default is 0 (no fade-in).\r\n */\r\n fadeIn?: number;\r\n /**\r\n * Weight of the animation clip.\r\n *\r\n * Used during blending when multiple animations affect the same property.\r\n * Default is the clip's configured weight.\r\n */\r\n weight?: number;\r\n};\r\n\r\n/**\r\n * Options for stopping an animation.\r\n *\r\n * Allows a graceful fade-out instead of abrupt stop.\r\n * @public\r\n */\r\nexport type StopAnimationOptions = {\r\n /**\r\n * Fade-out duration in seconds.\r\n *\r\n * Interpolates the current animation weight down to 0 over this time.\r\n * Default is 0 (immediate stop).\r\n */\r\n fadeOut?: number;\r\n};\r\n\r\ntype JointRetargetRemap = {\r\n dstNode: SceneNode;\r\n dstJointIndex: number;\r\n srcNode: SceneNode;\r\n srcBindRotInv: Quaternion;\r\n dstBindRot: Quaternion;\r\n srcBindPos: Vector3;\r\n dstBindPos: Vector3;\r\n translationScale: number;\r\n translationRotation?: Quaternion;\r\n};\r\n\r\nfunction cloneInterpolator(src: Interpolator): Interpolator {\r\n return new Interpolator(\r\n src.mode,\r\n src.target,\r\n src.inputs instanceof Float32Array ? new Float32Array(src.inputs) : [...src.inputs],\r\n src.outputs instanceof Float32Array ? new Float32Array(src.outputs) : [...src.outputs]\r\n );\r\n}\r\n\r\nfunction createJointRetargetRemap(\r\n srcSkeleton: Skeleton,\r\n dstSkeleton: Skeleton,\r\n srcJoint: SceneNode,\r\n dstJoint: SceneNode,\r\n translationRotation?: Quaternion\r\n): JointRetargetRemap {\r\n const si = srcSkeleton.joints.indexOf(srcJoint);\r\n const di = dstSkeleton.joints.indexOf(dstJoint);\r\n const srcBindPose = srcSkeleton.bindPose[si];\r\n const dstBindPose = dstSkeleton.bindPose[di];\r\n const srcLen = srcBindPose.position.magnitude;\r\n const dstLen = dstBindPose.position.magnitude;\r\n return {\r\n dstNode: dstJoint,\r\n dstJointIndex: di,\r\n srcNode: srcJoint,\r\n srcBindRotInv: Quaternion.inverse(srcBindPose.rotation),\r\n dstBindRot: dstBindPose.rotation.clone(),\r\n srcBindPos: srcBindPose.position.clone(),\r\n dstBindPos: dstBindPose.position.clone(),\r\n translationScale: srcLen > 1e-6 ? dstLen / srcLen : 1,\r\n translationRotation\r\n };\r\n}\r\n\r\nfunction retargetRotation(qSrcAnim: Quaternion, remap: JointRetargetRemap, out: Quaternion): Quaternion {\r\n Quaternion.multiply(remap.srcBindRotInv, qSrcAnim, out);\r\n Quaternion.multiply(remap.dstBindRot, out, out);\r\n return out.inplaceNormalize();\r\n}\r\n\r\nfunction retargetRotationTangent(\r\n qSrcTangent: Quaternion,\r\n remap: JointRetargetRemap,\r\n out: Quaternion\r\n): Quaternion {\r\n Quaternion.multiply(remap.srcBindRotInv, qSrcTangent, out);\r\n Quaternion.multiply(remap.dstBindRot, out, out);\r\n return out;\r\n}\r\n\r\nfunction retargetTranslationValue(srcValue: Vector3, remap: JointRetargetRemap, out: Vector3): Vector3 {\r\n out.setXYZ(srcValue.x, srcValue.y, srcValue.z);\r\n out.subBy(remap.srcBindPos);\r\n out.scaleBy(remap.translationScale);\r\n if (remap.translationRotation) {\r\n remap.translationRotation.transform(out, out);\r\n }\r\n out.addBy(remap.dstBindPos);\r\n return out;\r\n}\r\n\r\nfunction retargetTranslationTangent(srcValue: Vector3, remap: JointRetargetRemap, out: Vector3): Vector3 {\r\n out.setXYZ(srcValue.x, srcValue.y, srcValue.z);\r\n out.scaleBy(remap.translationScale);\r\n if (remap.translationRotation) {\r\n remap.translationRotation.transform(out, out);\r\n }\r\n return out;\r\n}\r\n\r\nfunction retargetRotationTrack(src: NodeRotationTrack, remap: JointRetargetRemap): NodeRotationTrack {\r\n const isCubic = src.interpolator.mode === 'cubicspline';\r\n const frameStride = isCubic ? 12 : 4;\r\n const numFrames = (src.interpolator.inputs as Float32Array).length;\r\n const srcOutputs = src.interpolator.outputs as Float32Array;\r\n const newOutputs = new Float32Array(srcOutputs.length);\r\n const t = isCubic ? 4 : 0;\r\n const q = new Quaternion();\r\n for (let f = 0; f < numFrames; f++) {\r\n const base = f * frameStride;\r\n q.setXYZW(\r\n srcOutputs[base + t],\r\n srcOutputs[base + t + 1],\r\n srcOutputs[base + t + 2],\r\n srcOutputs[base + t + 3]\r\n );\r\n retargetRotation(q, remap, q);\r\n if (isCubic) {\r\n // Cubic quaternion tangents live in the same component space, so apply the\r\n // same constant bind-pose transform without normalizing them.\r\n q.setXYZW(srcOutputs[base], srcOutputs[base + 1], srcOutputs[base + 2], srcOutputs[base + 3]);\r\n newOutputs.set(retargetRotationTangent(q, remap, q), base);\r\n newOutputs.set(\r\n retargetRotation(new Quaternion(srcOutputs.subarray(base + 4, base + 8)), remap, q),\r\n base + 4\r\n );\r\n q.setXYZW(srcOutputs[base + 8], srcOutputs[base + 9], srcOutputs[base + 10], srcOutputs[base + 11]);\r\n newOutputs.set(retargetRotationTangent(q, remap, q), base + 8);\r\n } else {\r\n newOutputs.set(q, base);\r\n }\r\n }\r\n return new NodeRotationTrack(\r\n new Interpolator(\r\n src.interpolator.mode,\r\n 'quat',\r\n new Float32Array(src.interpolator.inputs as Float32Array),\r\n newOutputs\r\n )\r\n );\r\n}\r\n\r\nfunction retargetEulerToRotationTrack(\r\n src: NodeEulerRotationTrack,\r\n remap: JointRetargetRemap\r\n): NodeRotationTrack {\r\n const srcInputs = src.interpolator.inputs as Float32Array;\r\n const srcOutputs = src.interpolator.outputs as Float32Array;\r\n const isCubic = src.interpolator.mode === 'cubicspline';\r\n const frameStride = isCubic ? 9 : 3;\r\n const t = isCubic ? 3 : 0;\r\n const numFrames = srcInputs.length;\r\n const newOutputs = new Float32Array(numFrames * 4);\r\n const q = new Quaternion();\r\n for (let f = 0; f < numFrames; f++) {\r\n const base = f * frameStride + t;\r\n q.fromEulerAngle(srcOutputs[base], srcOutputs[base + 1], srcOutputs[base + 2]);\r\n retargetRotation(q, remap, q);\r\n newOutputs.set(q, f * 4);\r\n }\r\n return new NodeRotationTrack(\r\n new Interpolator(\r\n src.interpolator.mode === 'step' ? 'step' : 'linear',\r\n 'quat',\r\n new Float32Array(srcInputs),\r\n newOutputs\r\n )\r\n );\r\n}\r\n\r\nfunction retargetTranslationTrack(\r\n src: NodeTranslationTrack,\r\n remap: JointRetargetRemap\r\n): NodeTranslationTrack {\r\n const isCubic = src.interpolator.mode === 'cubicspline';\r\n const frameStride = isCubic ? 9 : 3;\r\n const numFrames = (src.interpolator.inputs as Float32Array).length;\r\n const srcOutputs = src.interpolator.outputs as Float32Array;\r\n const newOutputs = new Float32Array(srcOutputs.length);\r\n const t = isCubic ? 3 : 0;\r\n const v = new Vector3();\r\n for (let f = 0; f < numFrames; f++) {\r\n const base = f * frameStride;\r\n v.setXYZ(srcOutputs[base + t], srcOutputs[base + t + 1], srcOutputs[base + t + 2]);\r\n retargetTranslationValue(v, remap, v);\r\n if (isCubic) {\r\n v.setXYZ(srcOutputs[base], srcOutputs[base + 1], srcOutputs[base + 2]);\r\n newOutputs.set(retargetTranslationTangent(v, remap, v), base);\r\n v.setXYZ(srcOutputs[base + 3], srcOutputs[base + 4], srcOutputs[base + 5]);\r\n newOutputs.set(retargetTranslationValue(v, remap, v), base + 3);\r\n v.setXYZ(srcOutputs[base + 6], srcOutputs[base + 7], srcOutputs[base + 8]);\r\n newOutputs.set(retargetTranslationTangent(v, remap, v), base + 6);\r\n } else {\r\n newOutputs.set(v, base);\r\n }\r\n }\r\n return new NodeTranslationTrack(\r\n new Interpolator(\r\n src.interpolator.mode,\r\n 'vec3',\r\n new Float32Array(src.interpolator.inputs as Float32Array),\r\n newOutputs\r\n )\r\n );\r\n}\r\n\r\nfunction findRotationTrack(\r\n tracks: AnimationTrack[] | undefined\r\n): NodeRotationTrack | NodeEulerRotationTrack | null {\r\n return (tracks?.find(\r\n (track) => track instanceof NodeRotationTrack || track instanceof NodeEulerRotationTrack\r\n ) ?? null) as NodeRotationTrack | NodeEulerRotationTrack | null;\r\n}\r\n\r\nfunction collectTrackTimes(track: AnimationTrack | null, times: Set<number>) {\r\n if (track instanceof NodeRotationTrack || track instanceof NodeEulerRotationTrack) {\r\n for (const time of track.interpolator.inputs as Float32Array) {\r\n times.add(time);\r\n }\r\n }\r\n}\r\n\r\nfunction sampleRotationTrack(\r\n track: NodeRotationTrack | NodeEulerRotationTrack | null,\r\n time: number,\r\n fallback: Quaternion,\r\n out: Quaternion\r\n): Quaternion {\r\n if (!track) {\r\n out.set(fallback);\r\n return out;\r\n }\r\n const state = track.calculateState({}, time);\r\n out.set(state);\r\n return out;\r\n}\r\n\r\nfunction bakeHumanoidRotationTracks(\r\n sourceClip: AnimationClip,\r\n srcSkeleton: Skeleton,\r\n dstSkeleton: Skeleton,\r\n srcRootRotation: Quaternion,\r\n dstRootRotation: Quaternion,\r\n dstClip: AnimationClip,\r\n remaps: JointRetargetRemap[]\r\n) {\r\n const rotationTracksByRemap = new Map<\r\n JointRetargetRemap,\r\n NodeRotationTrack | NodeEulerRotationTrack | null\r\n >();\r\n const times = new Set<number>([0, sourceClip.timeDuration]);\r\n const remapsByDstNode = new Map<object, JointRetargetRemap>();\r\n const srcJointSet = new Set(srcSkeleton.joints);\r\n const dstJointSet = new Set(dstSkeleton.joints);\r\n const srcBindRotByNode = new Map<SceneNode, Quaternion>();\r\n const dstBindRotByNode = new Map<SceneNode, Quaternion>();\r\n const srcRotationTrackByNode = new Map<SceneNode, NodeRotationTrack | NodeEulerRotationTrack | null>();\r\n\r\n for (let i = 0; i < srcSkeleton.joints.length; i++) {\r\n const joint = srcSkeleton.joints[i];\r\n srcBindRotByNode.set(joint, srcSkeleton.bindPose[i].rotation);\r\n const track = findRotationTrack(sourceClip.tracks.get(joint));\r\n srcRotationTrackByNode.set(joint, track);\r\n collectTrackTimes(track, times);\r\n }\r\n for (let i = 0; i < dstSkeleton.joints.length; i++) {\r\n dstBindRotByNode.set(dstSkeleton.joints[i], dstSkeleton.bindPose[i].rotation);\r\n }\r\n for (const remap of remaps) {\r\n const track = findRotationTrack(sourceClip.tracks.get(remap.srcNode));\r\n rotationTracksByRemap.set(remap, track);\r\n remapsByDstNode.set(remap.dstNode, remap);\r\n }\r\n const inputs = new Float32Array([...times].sort((a, b) => a - b));\r\n const srcBindWorldRots = new Map<SceneNode, Quaternion>();\r\n const dstBindWorldRots = new Map<SceneNode, Quaternion>();\r\n const srcAnimWorldRots = new Map<SceneNode, Quaternion>();\r\n const dstAnimWorldRots = new Map<SceneNode, Quaternion>();\r\n const outputsByRemap = new Map<JointRetargetRemap, Float32Array>();\r\n const tmpLocalRot = new Quaternion();\r\n const tmpWorldDelta = new Quaternion();\r\n const tmpParentInv = new Quaternion();\r\n\r\n for (const remap of remaps) {\r\n outputsByRemap.set(remap, new Float32Array(inputs.length * 4));\r\n }\r\n\r\n function getSrcBindWorldRot(node: SceneNode): Quaternion {\r\n let rot = srcBindWorldRots.get(node);\r\n if (!rot) {\r\n rot = (srcBindRotByNode.get(node) ?? Quaternion.identity()).clone();\r\n const parent = node.parent;\r\n if (parent && srcJointSet.has(parent)) {\r\n Quaternion.multiply(getSrcBindWorldRot(parent), rot, rot);\r\n } else {\r\n Quaternion.multiply(srcRootRotation, rot, rot);\r\n }\r\n srcBindWorldRots.set(node, rot);\r\n }\r\n return rot;\r\n }\r\n\r\n function getDstBindWorldRot(node: SceneNode): Quaternion {\r\n let rot = dstBindWorldRots.get(node);\r\n if (!rot) {\r\n rot = (dstBindRotByNode.get(node) ?? Quaternion.identity()).clone();\r\n const parent = node.parent;\r\n if (parent && dstJointSet.has(parent)) {\r\n Quaternion.multiply(getDstBindWorldRot(parent), rot, rot);\r\n } else {\r\n Quaternion.multiply(dstRootRotation, rot, rot);\r\n }\r\n dstBindWorldRots.set(node, rot);\r\n }\r\n return rot;\r\n }\r\n\r\n function getSrcAnimWorldRot(node: SceneNode, time: number): Quaternion {\r\n let rot = srcAnimWorldRots.get(node);\r\n if (!rot) {\r\n rot = new Quaternion();\r\n srcAnimWorldRots.set(node, rot);\r\n }\r\n const parent = node.parent;\r\n const parentWorldRot = parent && srcJointSet.has(parent) ? getSrcAnimWorldRot(parent, time) : null;\r\n sampleRotationTrack(\r\n srcRotationTrackByNode.get(node) ?? null,\r\n time,\r\n srcBindRotByNode.get(node) ?? Quaternion.identity(),\r\n tmpLocalRot\r\n );\r\n if (parentWorldRot) {\r\n Quaternion.multiply(parentWorldRot, tmpLocalRot, rot);\r\n } else {\r\n Quaternion.multiply(srcRootRotation, tmpLocalRot, rot);\r\n }\r\n return rot;\r\n }\r\n\r\n function getDstAnimWorldRot(remap: JointRetargetRemap, time: number): Quaternion {\r\n let rot = dstAnimWorldRots.get(remap.dstNode);\r\n if (!rot) {\r\n rot = new Quaternion();\r\n dstAnimWorldRots.set(remap.dstNode, rot);\r\n }\r\n const srcBindWorldRot = getSrcBindWorldRot(remap.srcNode);\r\n const srcAnimWorldRot = getSrcAnimWorldRot(remap.srcNode, time);\r\n Quaternion.multiply(srcAnimWorldRot, Quaternion.inverse(srcBindWorldRot, tmpWorldDelta), tmpWorldDelta);\r\n Quaternion.multiply(tmpWorldDelta, getDstBindWorldRot(remap.dstNode), rot);\r\n return rot;\r\n }\r\n\r\n function getDstParentAnimWorldRot(node: SceneNode, time: number): Quaternion | null {\r\n const parent = node.parent;\r\n if (!parent || !dstJointSet.has(parent)) {\r\n return dstRootRotation;\r\n }\r\n const mappedParent = remapsByDstNode.get(parent);\r\n if (mappedParent) {\r\n return getDstAnimWorldRot(mappedParent, time);\r\n }\r\n let rot = dstAnimWorldRots.get(parent);\r\n if (!rot) {\r\n rot = (dstBindRotByNode.get(parent) ?? Quaternion.identity()).clone();\r\n const parentWorldRot = getDstParentAnimWorldRot(parent, time);\r\n if (parentWorldRot) {\r\n Quaternion.multiply(parentWorldRot, rot, rot);\r\n }\r\n dstAnimWorldRots.set(parent, rot);\r\n }\r\n return rot;\r\n }\r\n\r\n for (let i = 0; i < inputs.length; i++) {\r\n const time = inputs[i];\r\n srcAnimWorldRots.clear();\r\n dstAnimWorldRots.clear();\r\n for (const remap of remaps) {\r\n const dstAnimWorldRot = getDstAnimWorldRot(remap, time);\r\n const parentWorldRot = getDstParentAnimWorldRot(remap.dstNode, time);\r\n if (parentWorldRot) {\r\n Quaternion.multiply(Quaternion.inverse(parentWorldRot, tmpParentInv), dstAnimWorldRot, tmpLocalRot);\r\n } else {\r\n tmpLocalRot.set(dstAnimWorldRot);\r\n }\r\n tmpLocalRot.inplaceNormalize();\r\n outputsByRemap.get(remap)!.set(tmpLocalRot, i * 4);\r\n }\r\n }\r\n\r\n for (const remap of remaps) {\r\n if (!rotationTracksByRemap.get(remap)) {\r\n continue;\r\n }\r\n const outputs = new Float32Array(outputsByRemap.get(remap)!);\r\n const track = new NodeRotationTrack(\r\n new Interpolator('linear', 'quat', new Float32Array(inputs), outputs)\r\n );\r\n track.name = 'rotation';\r\n track.target = remap.dstNode.persistentId;\r\n track.jointIndex = remap.dstJointIndex;\r\n dstClip.addTrack(remap.dstNode, track);\r\n }\r\n}\r\n\r\n/**\r\n * Animation set\r\n *\r\n * Manages a collection of named animation clips for a model and orchestrates:\r\n * - Playback state (time, loops, speed, weights, fade-in/out).\r\n * - Blending across multiple tracks targeting the same property via weighted averages.\r\n * - Skeleton usage and application for clips that drive skeletal animation.\r\n * - Active track registration and cleanup as clips start/stop.\r\n *\r\n * Usage:\r\n * - Create or retrieve `AnimationClip`s by name.\r\n * - Start playback with `playAnimation(name, options)`.\r\n * - Advance animation with `update(deltaSeconds)`.\r\n * - Optionally adjust weight while playing with `setAnimationWeight(name, weight)`.\r\n *\r\n * Lifetime:\r\n * - Disposing the set releases references to the model, clips, and clears active state.\r\n *\r\n * @public\r\n */\r\nexport class AnimationSet extends Disposable implements IDisposable {\r\n /** @internal */\r\n private _model: SceneNode;\r\n /** @internal */\r\n private _animations: Partial<Record<string, AnimationClip>>;\r\n /** @internal */\r\n private _skeletons: DRef<Skeleton>[];\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 * Create an AnimationSet controlling the provided model.\r\n *\r\n * @param model - The SceneNode (model root) controlled by this animation set.\r\n */\r\n constructor(model: SceneNode) {\r\n super();\r\n this._model = 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 this._skeletons = [];\r\n }\r\n /**\r\n * The model (SceneNode) controlled by this animation set.\r\n */\r\n get model() {\r\n return this._model;\r\n }\r\n /**\r\n * Number of animation clips registered in this set.\r\n */\r\n get numAnimations() {\r\n return Object.getOwnPropertyNames(this._animations).length;\r\n }\r\n /**\r\n * The skeletons used by animations in this set.\r\n */\r\n get skeletons() {\r\n return this._skeletons;\r\n }\r\n /**\r\n * Retrieve an animation clip by name.\r\n *\r\n * @param name - Name of the animation.\r\n * @returns The clip if present; otherwise null.\r\n */\r\n get(name: string) {\r\n return this._animations[name] ?? null;\r\n }\r\n /**\r\n * Create and register a new animation clip.\r\n *\r\n * @param name - Unique name for the animation clip.\r\n * @param embedded - Whether the clip is embedded/owned (implementation-specific). Default false.\r\n * @returns The created clip, or null if the name is empty or not unique.\r\n */\r\n createAnimation(name: string, embedded = false) {\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 this._model.scene?.queueUpdateNode(this._model);\r\n return animation;\r\n }\r\n }\r\n /**\r\n * Delete and dispose an animation clip by name.\r\n *\r\n * - If the animation is currently playing, it is first stopped (immediately).\r\n *\r\n * @param name - Name of the animation to remove.\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 * Get the list of all registered animation names.\r\n *\r\n * @returns An array of clip names.\r\n */\r\n getAnimationNames() {\r\n return Object.keys(this._animations);\r\n }\r\n /**\r\n * Advance and apply active animations.\r\n *\r\n * Responsibilities per call:\r\n * - Update time cursor for each active clip (respecting speedRatio and looping).\r\n * - Enforce repeat limits and apply fade-out termination if configured.\r\n * - For each animated target, blend active tracks (weighted by clip weight × fade-in × fade-out)\r\n * and apply the resulting state to the target.\r\n * - Apply all active skeletons to update skinning transforms.\r\n *\r\n * @param deltaInSeconds - Time step in seconds since last update.\r\n */\r\n update(deltaInSeconds: number) {\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 const info = this._activeAnimations.get(track.animation!)!;\r\n const t = (info.currentTime / track.animation!.timeDuration) * track.getDuration();\r\n return track.calculateState(k, t);\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._skeletons.forEach((v) => {\r\n v.get()?.apply(deltaInSeconds);\r\n });\r\n }\r\n /**\r\n * Check whether an animation is currently playing.\r\n *\r\n * @param name - Optional animation name. If omitted, returns true if any animation is playing.\r\n * @returns True if playing; otherwise false.\r\n */\r\n isPlayingAnimation(name?: string) {\r\n if (name) {\r\n const animation = this._animations[name];\r\n return !!animation && this._activeAnimations.has(animation);\r\n }\r\n return this._activeAnimations.size > 0;\r\n }\r\n /**\r\n * Get an animation clip by name.\r\n *\r\n * Alias of `get(name)` returning a nullable type.\r\n *\r\n * @param name - Name of the animation.\r\n * @returns The clip if present; otherwise null.\r\n */\r\n getAnimationClip(name: string) {\r\n return this._animations[name] ?? null;\r\n }\r\n /**\r\n * Set the runtime blend weight for a currently playing animation.\r\n *\r\n * Has no effect if the clip is not active.\r\n *\r\n * @param name - Name of the playing animation.\r\n * @param weight - New weight value used during blending.\r\n */\r\n setAnimationWeight(name: string, weight: number) {\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 info = this._activeAnimations.get(ani);\r\n if (info) {\r\n info.weight = weight;\r\n }\r\n }\r\n /**\r\n * Start (or update) playback of an animation clip.\r\n *\r\n * Behavior:\r\n * - If the clip is already playing, updates its fade-in (resets fade-out).\r\n * - Otherwise initializes playback state (repeat counter, speed, weight, initial time).\r\n * - Registers clip tracks and skeletons into the active sets for blending and application.\r\n *\r\n * @param name - Name of the animation to play.\r\n * @param options - Playback options (repeat, speedRatio, fadeIn).\r\n */\r\n playAnimation(name: string, options?: PlayAnimationOptions) {\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 = options?.weight ?? ani.weight ?? 1;\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 skeleton = this.model.findSkeletonById(k);\r\n if (skeleton) {\r\n const refcount = this._activeSkeletons.get(skeleton);\r\n if (refcount) {\r\n this._activeSkeletons.set(skeleton, refcount + 1);\r\n } else {\r\n this._activeSkeletons.set(skeleton, 1);\r\n }\r\n skeleton.playing = true;\r\n }\r\n });\r\n }\r\n }\r\n /**\r\n * Stop playback of an animation clip.\r\n *\r\n * Behavior:\r\n * - If `options.fadeOut > 0`, marks the clip for fade-out; actual removal occurs after fade completes.\r\n * - If `fadeOut` is 0 or omitted, immediately:\r\n * - Removes the clip from active animations.\r\n * - Unregisters its tracks from active track maps.\r\n * - Decrements skeleton reference counts; resets and removes skeletons when refcount reaches 0.\r\n *\r\n * @param name - Name of the animation to stop.\r\n * @param options - Optional fade-out configuration.\r\n */\r\n stopAnimation(name: string, options?: StopAnimationOptions) {\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 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 skeleton = this.model.findSkeletonById(k);\r\n if (skeleton) {\r\n const refcount = this._activeSkeletons.get(skeleton)!;\r\n if (refcount === 1) {\r\n skeleton.reset();\r\n this._activeSkeletons.delete(skeleton);\r\n } else {\r\n this._activeSkeletons.set(skeleton, refcount - 1);\r\n }\r\n }\r\n });\r\n }\r\n }\r\n }\r\n /**\r\n * Copy a humanoid animation clip from another AnimationSet into this one via humanoid rig mapping.\r\n *\r\n * Prerequisites:\r\n * - Both source and destination skeletons must have a non-null `humanoidJointMapping`.\r\n * - Joints are matched by shared `HumanoidBodyRig` / `HumanoidHandRig` keys instead of joint names.\r\n * - The source clip must exist in `sourceSet` and must be driven by exactly one skeleton.\r\n *\r\n * @param sourceSet - The AnimationSet to copy from.\r\n * @param animationName - Name of the clip to copy.\r\n * @param targetName - Name for the new clip in this set. Defaults to `animationName`.\r\n * @returns The newly created AnimationClip, or null on failure.\r\n */\r\n copyHumanoidAnimationFrom(\r\n sourceSet: AnimationSet,\r\n animationName: string,\r\n targetName?: string\r\n ): AnimationClip | null {\r\n const destName = targetName ?? animationName;\r\n const sourceClip = sourceSet.get(animationName);\r\n if (!sourceClip) {\r\n console.error(`copyHumanoidAnimationFrom: animation '${animationName}' not found in source set`);\r\n return null;\r\n }\r\n if (this._animations[destName]) {\r\n console.error(`copyHumanoidAnimationFrom: animation '${destName}' already exists in target set`);\r\n return null;\r\n }\r\n\r\n if (sourceClip.skeletons.size !== 1) {\r\n console.error(\r\n `copyHumanoidAnimationFrom: source animation clip must be affected by exactly one skeleton`\r\n );\r\n return null;\r\n }\r\n const srcSkeletonId = [...sourceClip.skeletons][0];\r\n const srcSkeleton = Skeleton.findSkeletonById(srcSkeletonId);\r\n if (!srcSkeleton) {\r\n console.error(`copyHumanoidAnimationFrom: source skeleton '${srcSkeletonId}' not found`);\r\n return null;\r\n }\r\n\r\n // Check that source skeleton has humanoid mapping\r\n const srcHumanoidMapping = srcSkeleton.humanoidJointMapping;\r\n if (!srcHumanoidMapping) {\r\n console.error(`copyHumanoidAnimationFrom: source skeleton does not have a humanoid joint mapping`);\r\n return null;\r\n }\r\n\r\n const nodeMap = new Map<object, SceneNode>();\r\n const jointRemapBySrcNode = new Map<object, JointRetargetRemap>();\r\n\r\n // Find a destination skeleton that has a humanoid mapping and share at least the body rig keys\r\n let srcJointsFiltered: SceneNode[] = [];\r\n let dstJointsFiltered: SceneNode[] = [];\r\n\r\n const dstSkeleton = this._skeletons\r\n .map((ref) => ref.get())\r\n .find((sk) => {\r\n if (!sk) {\r\n return false;\r\n }\r\n // Check that destination skeleton has humanoid mapping\r\n const dstHumanoidMapping = sk.humanoidJointMapping;\r\n if (!dstHumanoidMapping) {\r\n return false;\r\n }\r\n\r\n // Collect matched (srcJoint, dstJoint) pairs via shared humanoid rig keys\r\n const srcMatched: SceneNode[] = [];\r\n const dstMatched: SceneNode[] = [];\r\n\r\n // Match body rig joints\r\n for (const key of Object.keys(srcHumanoidMapping.body) as (keyof typeof srcHumanoidMapping.body)[]) {\r\n const srcJoint = srcHumanoidMapping.body[key];\r\n const dstJoint = dstHumanoidMapping.body[key];\r\n if (srcJoint && dstJoint) {\r\n srcMatched.push(srcJoint);\r\n dstMatched.push(dstJoint);\r\n }\r\n }\r\n\r\n // Match left hand rig joints only when both sides define them; skip silently if either is absent\r\n if (srcHumanoidMapping.leftHand && dstHumanoidMapping.leftHand) {\r\n for (const key of Object.keys(\r\n srcHumanoidMapping.leftHand\r\n ) as (keyof typeof srcHumanoidMapping.leftHand)[]) {\r\n const srcJoint = srcHumanoidMapping.leftHand[key];\r\n const dstJoint = dstHumanoidMapping.leftHand[key];\r\n if (srcJoint && dstJoint) {\r\n srcMatched.push(srcJoint);\r\n dstMatched.push(dstJoint);\r\n }\r\n }\r\n }\r\n\r\n // Match right hand rig joints only when both sides define them; skip silently if either is absent\r\n if (srcHumanoidMapping.rightHand && dstHumanoidMapping.rightHand) {\r\n for (const key of Object.keys(\r\n srcHumanoidMapping.rightHand\r\n ) as (keyof typeof srcHumanoidMapping.rightHand)[]) {\r\n const srcJoint = srcHumanoidMapping.rightHand[key];\r\n const dstJoint = dstHumanoidMapping.rightHand[key];\r\n if (srcJoint && dstJoint) {\r\n srcMatched.push(srcJoint);\r\n dstMatched.push(dstJoint);\r\n }\r\n }\r\n }\r\n\r\n if (srcMatched.length === 0) {\r\n return false;\r\n }\r\n\r\n srcJointsFiltered = srcMatched;\r\n dstJointsFiltered = dstMatched;\r\n return true;\r\n });\r\n\r\n if (!dstSkeleton) {\r\n console.error(\r\n `copyHumanoidAnimationFrom: no matching humanoid skeleton in target set for '${srcSkeletonId}'`\r\n );\r\n return null;\r\n }\r\n\r\n // Compute the world-space rotation of the parent chain above the Hips joint,\r\n // walking ALL ancestor nodes up to (but not including) the model root.\r\n // This must include non-joint nodes such as \"Armature\" in Mixamo rigs, which\r\n // carry a 90° X rotation that is NOT captured by humanoidRootRotation (which\r\n // only traverses nodes inside the skeleton joints list).\r\n function computeHipsParentChainRotation(\r\n hipsNode: SceneNode,\r\n modelRoot: SceneNode,\r\n skeleton: Skeleton\r\n ): Quaternion {\r\n const result = Quaternion.identity();\r\n const jointSet = new Set(skeleton.joints);\r\n let p = hipsNode.parent;\r\n while (p && p !== modelRoot) {\r\n if (!jointSet.has(p)) {\r\n Quaternion.multiply(p.rotation, result, result);\r\n }\r\n p = p.parent;\r\n }\r\n return result;\r\n }\r\n\r\n const srcHipsNode = srcSkeleton.humanoidJointMapping!.body[HumanoidBodyRig.Hips];\r\n const dstHipsNode = dstSkeleton.humanoidJointMapping!.body[HumanoidBodyRig.Hips];\r\n const srcRootRot = computeHipsParentChainRotation(srcHipsNode, sourceSet.model, srcSkeleton);\r\n const dstRootRot = computeHipsParentChainRotation(dstHipsNode, this._model, dstSkeleton);\r\n const hipsTranslationRotation = Quaternion.multiply(Quaternion.inverse(dstRootRot), srcRootRot);\r\n const jointRemaps: JointRetargetRemap[] = [];\r\n const mappedSrcNodes = new Set<SceneNode>();\r\n const mappedDstNodes = new Set<SceneNode>();\r\n // Build remap for matched joint pairs\r\n for (let fi = 0; fi < srcJointsFiltered.length; fi++) {\r\n const srcJoint = srcJointsFiltered[fi];\r\n const dstJoint = dstJointsFiltered[fi];\r\n if (mappedSrcNodes.has(srcJoint) || mappedDstNodes.has(dstJoint)) {\r\n continue;\r\n }\r\n mappedSrcNodes.add(srcJoint);\r\n mappedDstNodes.add(dstJoint);\r\n const isHipsBone = srcJoint === srcHipsNode;\r\n nodeMap.set(srcJoint, dstJoint);\r\n const remap = createJointRetargetRemap(\r\n srcSkeleton,\r\n dstSkeleton,\r\n srcJoint,\r\n dstJoint,\r\n isHipsBone ? hipsTranslationRotation : undefined\r\n );\r\n jointRemaps.push(remap);\r\n jointRemapBySrcNode.set(srcJoint, remap);\r\n }\r\n\r\n const dstClip = this.createAnimation(destName);\r\n if (!dstClip) {\r\n return null;\r\n }\r\n dstClip.timeDuration = sourceClip.timeDuration;\r\n dstClip.weight = sourceClip.weight;\r\n dstClip.autoPlay = sourceClip.autoPlay;\r\n\r\n // Register destination skeleton\r\n dstClip.addSkeleton(dstSkeleton.persistentId);\r\n\r\n bakeHumanoidRotationTracks(\r\n sourceClip,\r\n srcSkeleton,\r\n dstSkeleton,\r\n srcRootRot,\r\n dstRootRot,\r\n dstClip,\r\n jointRemaps\r\n );\r\n\r\n for (const srcNode of srcJointsFiltered) {\r\n const srcTracks = sourceClip.tracks.get(srcNode);\r\n if (!srcTracks) {\r\n // Not every humanoid joint must have a track; skip silently\r\n continue;\r\n }\r\n const dstNode = nodeMap.get(srcNode)!;\r\n const remap = jointRemapBySrcNode.get(srcNode)!;\r\n\r\n for (const srcTrack of srcTracks) {\r\n let dstTrack: AnimationTrack;\r\n if (srcTrack instanceof NodeRotationTrack) {\r\n continue;\r\n } else if (srcTrack instanceof NodeEulerRotationTrack) {\r\n continue;\r\n } else if (srcTrack instanceof NodeTranslationTrack) {\r\n dstTrack = retargetTranslationTrack(srcTrack, remap);\r\n } else if (srcTrack instanceof NodeScaleTrack) {\r\n dstTrack = new NodeScaleTrack(cloneInterpolator(srcTrack.interpolator));\r\n } else {\r\n console.warn(\r\n `copyHumanoidAnimationFrom: unsupported track type '${srcTrack.constructor.name}', skipping`\r\n );\r\n continue;\r\n }\r\n\r\n dstTrack.name = srcTrack.name;\r\n dstTrack.target = dstNode.persistentId;\r\n dstTrack.jointIndex = remap.dstJointIndex;\r\n dstClip.addTrack(dstNode, dstTrack);\r\n }\r\n }\r\n\r\n return dstClip;\r\n }\r\n /**\r\n * Copy an animation clip from another AnimationSet into this one.\r\n *\r\n * Prerequisites:\r\n * - Both sets must reference skeletons with identical joint names and counts.\r\n * - The source clip must exist in `sourceSet`.\r\n *\r\n * @param sourceSet - The AnimationSet to copy from.\r\n * @param animationName - Name of the clip to copy.\r\n * @param targetName - Name for the new clip in this set. Defaults to `animationName`.\r\n * @param excludeJoint - Optional predicate; joints whose name returns true are excluded from\r\n * skeleton structure matching.\r\n * @returns The newly created AnimationClip, or null on failure.\r\n *\r\n * @deprecated Use the new {@link AnimationSet.copyHumanoidAnimationFrom} method instead.\r\n */\r\n copyAnimationFrom(\r\n sourceSet: AnimationSet,\r\n animationName: string,\r\n targetName?: string,\r\n excludeJoint?: (jointName: string) => boolean\r\n ): AnimationClip | null {\r\n const destName = targetName ?? animationName;\r\n const sourceClip = sourceSet.get(animationName);\r\n if (!sourceClip) {\r\n console.error(`copyAnimationFrom: animation '${animationName}' not found in source set`);\r\n return null;\r\n }\r\n if (this._animations[destName]) {\r\n console.error(`copyAnimationFrom: animation '${destName}' already exists in target set`);\r\n return null;\r\n }\r\n\r\n if (sourceClip.skeletons.size !== 1) {\r\n console.error(`copyAnimationFrom: source animation clip must be affected by exactly one skeleton`);\r\n return null;\r\n }\r\n const srcSkeletonId = [...sourceClip.skeletons][0];\r\n const srcSkeleton = Skeleton.findSkeletonById(srcSkeletonId);\r\n if (!srcSkeleton) {\r\n console.error(`copyAnimationFrom: source skeleton '${srcSkeletonId}' not found`);\r\n return null;\r\n }\r\n const nodeMap = new Map<object, SceneNode>();\r\n const jointRemapBySrcNode = new Map<object, JointRetargetRemap>();\r\n\r\n const jointsFiltered = srcSkeleton.joints.filter((j) => !excludeJoint?.(j.name));\r\n const srcRootNode = findRootJoint(jointsFiltered);\r\n if (!srcRootNode) {\r\n console.error(`copyAnimationFrom: cannot determine the root joint for source skeleton`);\r\n return null;\r\n }\r\n // Build filtered joint lists for matching (exclude joints rejected by filterJoint)\r\n const srcJointsFiltered = sortJoints(srcRootNode, jointsFiltered);\r\n if (!srcJointsFiltered) {\r\n console.error(`copyAnimationFrom: invalid source skeleton structure`);\r\n return null;\r\n }\r\n let dstJointsFiltered: SceneNode[] = [];\r\n const dstSkeleton = this._skeletons\r\n .map((ref) => ref.get())\r\n .find((sk) => {\r\n if (!sk) {\r\n return false;\r\n }\r\n const jointsFiltered = sk.joints.filter((j) => !excludeJoint?.(j.name));\r\n if (jointsFiltered.length !== srcJointsFiltered.length) {\r\n return false;\r\n }\r\n const rootNode = findRootJoint(jointsFiltered);\r\n if (!rootNode) {\r\n return false;\r\n }\r\n const sortedJointsFiltered = sortJoints(rootNode, jointsFiltered);\r\n if (\r\n sortedJointsFiltered &&\r\n srcJointsFiltered.every((j, i) => j.name === sortedJointsFiltered[i].name)\r\n ) {\r\n dstJointsFiltered = sortedJointsFiltered;\r\n return true;\r\n }\r\n return false;\r\n });\r\n if (!dstJointsFiltered || !dstSkeleton) {\r\n console.error(`copyAnimationFrom: no matching skeleton in target set for '${srcSkeletonId}'`);\r\n return null;\r\n }\r\n // Build remap only for joints that pass the filter\r\n for (let fi = 0; fi < srcJointsFiltered.length; fi++) {\r\n const srcJoint = srcJointsFiltered[fi];\r\n const dstJoint = dstJointsFiltered[fi];\r\n nodeMap.set(srcJoint, dstJoint);\r\n jointRemapBySrcNode.set(\r\n srcJoint,\r\n createJointRetargetRemap(srcSkeleton, dstSkeleton, srcJoint, dstJoint)\r\n );\r\n }\r\n\r\n const dstClip = this.createAnimation(destName);\r\n if (!dstClip) {\r\n return null;\r\n }\r\n dstClip.timeDuration = sourceClip.timeDuration;\r\n dstClip.weight = sourceClip.weight;\r\n dstClip.autoPlay = sourceClip.autoPlay;\r\n\r\n // Register destination skeleton\r\n dstClip.addSkeleton(dstSkeleton.persistentId);\r\n\r\n for (const srcNode of srcJointsFiltered) {\r\n const srcTracks = sourceClip.tracks.get(srcNode);\r\n if (!srcTracks) {\r\n console.error(`copyAnimationFrom: no track for joint: ${srcNode.name}`);\r\n return null;\r\n }\r\n const dstNode = nodeMap.get(srcNode)!;\r\n const remap = jointRemapBySrcNode.get(srcNode)!;\r\n\r\n for (const srcTrack of srcTracks) {\r\n let dstTrack: AnimationTrack;\r\n if (srcTrack instanceof NodeRotationTrack) {\r\n dstTrack = retargetRotationTrack(srcTrack, remap);\r\n } else if (srcTrack instanceof NodeEulerRotationTrack) {\r\n dstTrack = retargetEulerToRotationTrack(srcTrack, remap);\r\n } else if (srcTrack instanceof NodeTranslationTrack) {\r\n dstTrack = retargetTranslationTrack(srcTrack, remap);\r\n } else if (srcTrack instanceof NodeScaleTrack) {\r\n dstTrack = new NodeScaleTrack(cloneInterpolator(srcTrack.interpolator));\r\n } else {\r\n console.warn(`copyAnimationFrom: unsupported track type '${srcTrack.constructor.name}', skipping`);\r\n continue;\r\n }\r\n\r\n dstTrack.name = srcTrack.name;\r\n dstTrack.target = dstNode.persistentId;\r\n dstTrack.jointIndex = remap.dstJointIndex;\r\n dstClip.addTrack(dstNode, dstTrack);\r\n }\r\n }\r\n\r\n return dstClip;\r\n\r\n function findRootJoint(joints: SceneNode[]) {\r\n let root: Nullable<SceneNode> = null;\r\n for (const joint of joints) {\r\n if (!root) {\r\n root = joint;\r\n }\r\n while (!root!.isParentOf(joint)) {\r\n root = root!.parent;\r\n }\r\n if (!root) {\r\n break;\r\n }\r\n }\r\n if (!root || !joints.includes(root)) {\r\n return null;\r\n }\r\n return root;\r\n }\r\n\r\n function sortJoints(root: SceneNode, joints: SceneNode[]): Nullable<SceneNode[]> {\r\n const ordered: SceneNode[] = [];\r\n const visited = new Set<SceneNode>();\r\n function visit(joint: SceneNode) {\r\n if (visited.has(joint)) {\r\n return true;\r\n }\r\n if (!joints.includes(joint)) {\r\n return false;\r\n }\r\n if (joint !== root) {\r\n visit(joint.parent!);\r\n }\r\n visited.add(joint);\r\n ordered.push(joint);\r\n return true;\r\n }\r\n for (const joint of joints) {\r\n if (!visit(joint)) {\r\n return null;\r\n }\r\n }\r\n return ordered;\r\n }\r\n }\r\n\r\n /**\r\n * Dispose the animation set and release owned resources.\r\n *\r\n * - Disposes the weak reference to the model.\r\n * - Disposes all registered animation clips.\r\n * - Clears active animations, tracks, and skeleton references.\r\n */\r\n protected onDispose() {\r\n super.onDispose();\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":["cloneInterpolator","src","Interpolator","mode","target","inputs","Float32Array","outputs","createJointRetargetRemap","srcSkeleton","dstSkeleton","srcJoint","dstJoint","translationRotation","si","joints","indexOf","di","srcBindPose","bindPose","dstBindPose","srcLen","position","magnitude","dstLen","dstNode","dstJointIndex","srcNode","srcBindRotInv","Quaternion","inverse","rotation","dstBindRot","clone","srcBindPos","dstBindPos","translationScale","retargetRotation","qSrcAnim","remap","out","multiply","inplaceNormalize","retargetRotationTangent","qSrcTangent","retargetTranslationValue","srcValue","setXYZ","x","y","z","subBy","scaleBy","transform","addBy","retargetTranslationTangent","retargetRotationTrack","isCubic","interpolator","frameStride","numFrames","length","srcOutputs","newOutputs","t","q","f","base","setXYZW","set","subarray","NodeRotationTrack","retargetEulerToRotationTrack","srcInputs","fromEulerAngle","retargetTranslationTrack","v","Vector3","NodeTranslationTrack","findRotationTrack","tracks","find","track","NodeEulerRotationTrack","collectTrackTimes","times","time","add","sampleRotationTrack","fallback","state","calculateState","bakeHumanoidRotationTracks","sourceClip","srcRootRotation","dstRootRotation","dstClip","remaps","rotationTracksByRemap","Map","Set","timeDuration","remapsByDstNode","srcJointSet","dstJointSet","srcBindRotByNode","dstBindRotByNode","srcRotationTrackByNode","i","joint","get","sort","a","b","srcBindWorldRots","dstBindWorldRots","srcAnimWorldRots","dstAnimWorldRots","outputsByRemap","tmpLocalRot","tmpWorldDelta","tmpParentInv","getSrcBindWorldRot","node","rot","identity","parent","has","getDstBindWorldRot","getSrcAnimWorldRot","parentWorldRot","getDstAnimWorldRot","srcBindWorldRot","srcAnimWorldRot","getDstParentAnimWorldRot","mappedParent","clear","dstAnimWorldRot","name","persistentId","jointIndex","addTrack","AnimationSet","Disposable","model","_model","_animations","_activeTracks","_activeSkeletons","_activeAnimations","_skeletons","numAnimations","Object","getOwnPropertyNames","skeletons","createAnimation","embedded","console","error","animation","AnimationClip","scene","queueUpdateNode","deleteAnimation","stopAnimation","dispose","getAnimationNames","keys","update","deltaInSeconds","forEach","k","fadeOut","fadeOutStart","animateTime","firstFrame","timeAdvance","speedRatio","currentTime","repeatCounter","repeat","alltracks","filter","isPlayingAnimation","weights","map","info","weight","fadeIn","Math","min","states","getDuration","weightedAverage","mixState","applyState","apply","size","getAnimationClip","setAnimationWeight","ani","playAnimation","options","max","nodeTracks","blendId","getBlendId","blendedTracks","push","skeleton","findSkeletonById","refcount","playing","delete","id","reset","copyHumanoidAnimationFrom","sourceSet","animationName","targetName","destName","srcSkeletonId","Skeleton","srcHumanoidMapping","humanoidJointMapping","nodeMap","jointRemapBySrcNode","srcJointsFiltered","dstJointsFiltered","ref","sk","dstHumanoidMapping","srcMatched","dstMatched","key","body","leftHand","rightHand","computeHipsParentChainRotation","hipsNode","modelRoot","result","jointSet","p","srcHipsNode","HumanoidBodyRig","Hips","dstHipsNode","srcRootRot","dstRootRot","hipsTranslationRotation","jointRemaps","mappedSrcNodes","mappedDstNodes","fi","isHipsBone","undefined","autoPlay","addSkeleton","srcTracks","srcTrack","dstTrack","NodeScaleTrack","warn","copyAnimationFrom","excludeJoint","jointsFiltered","j","srcRootNode","findRootJoint","sortJoints","rootNode","sortedJointsFiltered","every","root","isParentOf","includes","ordered","visited","visit","onDispose"],"mappings":"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"}
1
+ {"version":3,"file":"animationset.js","sources":["../../src/animation/animationset.ts"],"sourcesContent":["import { weightedAverage, Disposable, Interpolator, Vector3 } from '@zephyr3d/base';\r\nimport type { DRef, IDisposable, Nullable } from '@zephyr3d/base';\r\nimport { Quaternion } from '@zephyr3d/base';\r\nimport type { SceneNode } from '../scene';\r\nimport { AnimationClip } from './animation';\r\nimport type { AnimationTrack } from './animationtrack';\r\nimport { NodeRotationTrack } from './rotationtrack';\r\nimport { NodeEulerRotationTrack } from './eulerrotationtrack';\r\nimport { NodeTranslationTrack } from './translationtrack';\r\nimport { NodeScaleTrack } from './scaletrack';\r\nimport type { SkeletonBindPose, SkeletonRig, SkinBinding } from './skeleton';\r\nimport { HumanoidBodyRig } from './skeleton';\r\nimport type { SkeletalAnimationMaskOptions } from './animationmask';\r\nimport { createSkeletalMaskedAnimationClip } from './animationmask';\r\n\r\n/**\r\n * Options for playing an animation.\r\n *\r\n * Controls looping, playback speed (including reverse), and fade-in blending.\r\n * @public\r\n **/\r\nexport type PlayAnimationOptions = {\r\n /**\r\n * Number of loops to play.\r\n *\r\n * - 0: infinite looping (default).\r\n * - n \\> 0: play exactly n loops (each loop is one full duration of the clip).\r\n */\r\n repeat?: number;\r\n /**\r\n * Playback speed multiplier.\r\n *\r\n * - 1: normal speed (default).\r\n * - \\>1: faster; \\<1: slower.\r\n * - Negative values play the clip in reverse. The initial `currentTime` will be set to the end.\r\n */\r\n speedRatio?: number;\r\n /**\r\n * Fade-in duration in seconds.\r\n *\r\n * Interpolates the animation weight from 0 to the clip's configured weight over this time.\r\n * Use together with `stopAnimation(..., { fadeOut })` for smooth cross-fading.\r\n * Default is 0 (no fade-in).\r\n */\r\n fadeIn?: number;\r\n /**\r\n * Weight of the animation clip.\r\n *\r\n * Used during blending when multiple animations affect the same property.\r\n * Default is the clip's configured weight.\r\n */\r\n weight?: number;\r\n};\r\n\r\n/**\r\n * Options for stopping an animation.\r\n *\r\n * Allows a graceful fade-out instead of abrupt stop.\r\n * @public\r\n */\r\nexport type StopAnimationOptions = {\r\n /**\r\n * Fade-out duration in seconds.\r\n *\r\n * Interpolates the current animation weight down to 0 over this time.\r\n * Default is 0 (immediate stop).\r\n */\r\n fadeOut?: number;\r\n};\r\n\r\n/** @public */\r\nexport type HumanoidRootMotionMode = 'scaled' | 'copy' | 'locked' | 'none';\r\n\r\n/** @public */\r\nexport type HumanoidRootMotionScaleMode = 'legLength' | 'none' | number;\r\n\r\n/** @public */\r\nexport type HumanoidRetargetAxisLocks = {\r\n x?: boolean;\r\n y?: boolean;\r\n z?: boolean;\r\n};\r\n\r\n/** @public */\r\nexport type CopyHumanoidAnimationOptions = {\r\n /**\r\n * Name for the new clip. Ignored when the legacy third `targetName` argument is a string.\r\n */\r\n targetName?: string;\r\n /**\r\n * How root translation should be handled.\r\n *\r\n * - `scaled`: retarget and scale root motion to the destination rig size.\r\n * - `copy`: retarget root motion without scale.\r\n * - `locked`: write a constant destination bind-pose root translation.\r\n * - `none`: do not create a root translation track.\r\n */\r\n rootMotion?: HumanoidRootMotionMode;\r\n /**\r\n * Scale used when `rootMotion` is `scaled`.\r\n */\r\n rootMotionScale?: HumanoidRootMotionScaleMode;\r\n /**\r\n * Axis locks applied after root motion retargeting. Locked axes stay at the destination bind pose.\r\n */\r\n lockRootMotionAxes?: HumanoidRetargetAxisLocks;\r\n /**\r\n * Whether to preserve non-root humanoid translation tracks. These are skipped by default because\r\n * retargeting humanoid joints should normally keep the destination skeleton lengths intact.\r\n */\r\n jointTranslations?: 'skip' | 'preserve';\r\n};\r\n\r\ntype JointRetargetRemap = {\r\n dstNode: SceneNode;\r\n dstJointIndex: number;\r\n srcNode: SceneNode;\r\n srcBindRotInv: Quaternion;\r\n dstBindRot: Quaternion;\r\n srcBindPos: Vector3;\r\n dstBindPos: Vector3;\r\n translationScale: number;\r\n translationRotation?: Quaternion;\r\n translationAxisLocks?: HumanoidRetargetAxisLocks;\r\n};\r\n\r\nfunction cloneInterpolator(src: Interpolator): Interpolator {\r\n return new Interpolator(\r\n src.mode,\r\n src.target,\r\n src.inputs instanceof Float32Array ? new Float32Array(src.inputs) : [...src.inputs],\r\n src.outputs instanceof Float32Array ? new Float32Array(src.outputs) : [...src.outputs]\r\n );\r\n}\r\n\r\nfunction createJointRetargetRemap(\r\n srcSkeleton: SkeletonRig,\r\n dstSkeleton: SkeletonRig,\r\n srcJoint: SceneNode,\r\n dstJoint: SceneNode,\r\n translationRotation?: Quaternion,\r\n translationScale?: number,\r\n translationAxisLocks?: HumanoidRetargetAxisLocks\r\n): JointRetargetRemap {\r\n const si = srcSkeleton.joints.indexOf(srcJoint);\r\n const di = dstSkeleton.joints.indexOf(dstJoint);\r\n const srcBindPose = srcSkeleton.bindPose[si];\r\n const dstBindPose = dstSkeleton.bindPose[di];\r\n const srcLen = srcBindPose.position.magnitude;\r\n const dstLen = dstBindPose.position.magnitude;\r\n return {\r\n dstNode: dstJoint,\r\n dstJointIndex: di,\r\n srcNode: srcJoint,\r\n srcBindRotInv: Quaternion.inverse(srcBindPose.rotation),\r\n dstBindRot: dstBindPose.rotation.clone(),\r\n srcBindPos: srcBindPose.position.clone(),\r\n dstBindPos: dstBindPose.position.clone(),\r\n translationScale: translationScale ?? (srcLen > 1e-6 ? dstLen / srcLen : 1),\r\n translationRotation,\r\n translationAxisLocks\r\n };\r\n}\r\n\r\nfunction createTranslationRetargetRemap(\r\n srcNode: SceneNode,\r\n dstNode: SceneNode,\r\n srcBindPos: Vector3,\r\n dstBindPos: Vector3,\r\n dstJointIndex: number,\r\n translationScale: number,\r\n translationRotation?: Quaternion,\r\n translationAxisLocks?: HumanoidRetargetAxisLocks\r\n): JointRetargetRemap {\r\n return {\r\n dstNode,\r\n dstJointIndex,\r\n srcNode,\r\n srcBindRotInv: Quaternion.identity(),\r\n dstBindRot: Quaternion.identity(),\r\n srcBindPos: srcBindPos.clone(),\r\n dstBindPos: dstBindPos.clone(),\r\n translationScale,\r\n translationRotation,\r\n translationAxisLocks\r\n };\r\n}\r\n\r\nfunction getBindPosition(skeleton: SkeletonRig, joint: SceneNode): Vector3 | null {\r\n const index = skeleton.joints.indexOf(joint);\r\n return index >= 0 ? skeleton.bindPose[index].position : null;\r\n}\r\n\r\nfunction getRigBindPoseForNode(skeleton: SkeletonRig, node: SceneNode): SkeletonBindPose {\r\n return (\r\n skeleton.getBindPoseForJoint(node) ??\r\n (node === skeleton.rootJoint\r\n ? skeleton.rootBindPose\r\n : {\r\n position: node.position,\r\n rotation: node.rotation,\r\n scale: node.scale\r\n })\r\n );\r\n}\r\n\r\nfunction getBindDistanceToAncestor(skeleton: SkeletonRig, joint: SceneNode, ancestor: SceneNode): number {\r\n let distance = 0;\r\n let node: SceneNode | null = joint;\r\n while (node && node !== ancestor) {\r\n const bindPosition = getBindPosition(skeleton, node);\r\n if (!bindPosition) {\r\n return 0;\r\n }\r\n distance += bindPosition.magnitude;\r\n node = node.parent;\r\n }\r\n return node === ancestor ? distance : 0;\r\n}\r\n\r\nfunction getHumanoidLegLength(skeleton: SkeletonRig, side: 'left' | 'right'): number {\r\n const mapping = skeleton.humanoidJointMapping;\r\n if (!mapping) {\r\n return 0;\r\n }\r\n const body = mapping.body;\r\n const hips = body[HumanoidBodyRig.Hips];\r\n const foot = side === 'left' ? body[HumanoidBodyRig.LeftFoot] : body[HumanoidBodyRig.RightFoot];\r\n const toes = side === 'left' ? body[HumanoidBodyRig.LeftToes] : body[HumanoidBodyRig.RightToes];\r\n return Math.max(\r\n getBindDistanceToAncestor(skeleton, foot, hips),\r\n getBindDistanceToAncestor(skeleton, toes, hips)\r\n );\r\n}\r\n\r\nfunction getHumanoidRootMotionScale(srcSkeleton: SkeletonRig, dstSkeleton: SkeletonRig): number {\r\n const srcLeftLeg = getHumanoidLegLength(srcSkeleton, 'left');\r\n const srcRightLeg = getHumanoidLegLength(srcSkeleton, 'right');\r\n const dstLeftLeg = getHumanoidLegLength(dstSkeleton, 'left');\r\n const dstRightLeg = getHumanoidLegLength(dstSkeleton, 'right');\r\n const srcLegLength = Math.max(srcLeftLeg, srcRightLeg);\r\n const dstLegLength = Math.max(dstLeftLeg, dstRightLeg);\r\n return srcLegLength > 1e-6 && dstLegLength > 1e-6 ? dstLegLength / srcLegLength : 1;\r\n}\r\n\r\nfunction findTranslationTrack(tracks: AnimationTrack[] | undefined): NodeTranslationTrack | null {\r\n return (tracks?.find((track) => track instanceof NodeTranslationTrack) ??\r\n null) as NodeTranslationTrack | null;\r\n}\r\n\r\nfunction applyTranslationAxisLocks(\r\n value: Vector3,\r\n bindValue: Vector3,\r\n locks: HumanoidRetargetAxisLocks | undefined\r\n) {\r\n if (locks?.x) {\r\n value.x = bindValue.x;\r\n }\r\n if (locks?.y) {\r\n value.y = bindValue.y;\r\n }\r\n if (locks?.z) {\r\n value.z = bindValue.z;\r\n }\r\n}\r\n\r\nfunction applyTranslationTangentAxisLocks(value: Vector3, locks: HumanoidRetargetAxisLocks | undefined) {\r\n if (locks?.x) {\r\n value.x = 0;\r\n }\r\n if (locks?.y) {\r\n value.y = 0;\r\n }\r\n if (locks?.z) {\r\n value.z = 0;\r\n }\r\n}\r\n\r\nfunction retargetRotation(qSrcAnim: Quaternion, remap: JointRetargetRemap, out: Quaternion): Quaternion {\r\n Quaternion.multiply(remap.srcBindRotInv, qSrcAnim, out);\r\n Quaternion.multiply(remap.dstBindRot, out, out);\r\n return out.inplaceNormalize();\r\n}\r\n\r\nfunction retargetRotationTangent(\r\n qSrcTangent: Quaternion,\r\n remap: JointRetargetRemap,\r\n out: Quaternion\r\n): Quaternion {\r\n Quaternion.multiply(remap.srcBindRotInv, qSrcTangent, out);\r\n Quaternion.multiply(remap.dstBindRot, out, out);\r\n return out;\r\n}\r\n\r\nfunction retargetTranslationValue(srcValue: Vector3, remap: JointRetargetRemap, out: Vector3): Vector3 {\r\n out.setXYZ(srcValue.x, srcValue.y, srcValue.z);\r\n out.subBy(remap.srcBindPos);\r\n out.scaleBy(remap.translationScale);\r\n if (remap.translationRotation) {\r\n remap.translationRotation.transform(out, out);\r\n }\r\n out.addBy(remap.dstBindPos);\r\n applyTranslationAxisLocks(out, remap.dstBindPos, remap.translationAxisLocks);\r\n return out;\r\n}\r\n\r\nfunction retargetTranslationTangent(srcValue: Vector3, remap: JointRetargetRemap, out: Vector3): Vector3 {\r\n out.setXYZ(srcValue.x, srcValue.y, srcValue.z);\r\n out.scaleBy(remap.translationScale);\r\n if (remap.translationRotation) {\r\n remap.translationRotation.transform(out, out);\r\n }\r\n applyTranslationTangentAxisLocks(out, remap.translationAxisLocks);\r\n return out;\r\n}\r\n\r\nfunction retargetRotationTrack(src: NodeRotationTrack, remap: JointRetargetRemap): NodeRotationTrack {\r\n const isCubic = src.interpolator.mode === 'cubicspline';\r\n const frameStride = isCubic ? 12 : 4;\r\n const numFrames = (src.interpolator.inputs as Float32Array).length;\r\n const srcOutputs = src.interpolator.outputs as Float32Array;\r\n const newOutputs = new Float32Array(srcOutputs.length);\r\n const t = isCubic ? 4 : 0;\r\n const q = new Quaternion();\r\n for (let f = 0; f < numFrames; f++) {\r\n const base = f * frameStride;\r\n q.setXYZW(\r\n srcOutputs[base + t],\r\n srcOutputs[base + t + 1],\r\n srcOutputs[base + t + 2],\r\n srcOutputs[base + t + 3]\r\n );\r\n retargetRotation(q, remap, q);\r\n if (isCubic) {\r\n // Cubic quaternion tangents live in the same component space, so apply the\r\n // same constant bind-pose transform without normalizing them.\r\n q.setXYZW(srcOutputs[base], srcOutputs[base + 1], srcOutputs[base + 2], srcOutputs[base + 3]);\r\n newOutputs.set(retargetRotationTangent(q, remap, q), base);\r\n newOutputs.set(\r\n retargetRotation(new Quaternion(srcOutputs.subarray(base + 4, base + 8)), remap, q),\r\n base + 4\r\n );\r\n q.setXYZW(srcOutputs[base + 8], srcOutputs[base + 9], srcOutputs[base + 10], srcOutputs[base + 11]);\r\n newOutputs.set(retargetRotationTangent(q, remap, q), base + 8);\r\n } else {\r\n newOutputs.set(q, base);\r\n }\r\n }\r\n return new NodeRotationTrack(\r\n new Interpolator(\r\n src.interpolator.mode,\r\n 'quat',\r\n new Float32Array(src.interpolator.inputs as Float32Array),\r\n newOutputs\r\n )\r\n );\r\n}\r\n\r\nfunction retargetEulerToRotationTrack(\r\n src: NodeEulerRotationTrack,\r\n remap: JointRetargetRemap\r\n): NodeRotationTrack {\r\n const srcInputs = src.interpolator.inputs as Float32Array;\r\n const srcOutputs = src.interpolator.outputs as Float32Array;\r\n const isCubic = src.interpolator.mode === 'cubicspline';\r\n const frameStride = isCubic ? 9 : 3;\r\n const t = isCubic ? 3 : 0;\r\n const numFrames = srcInputs.length;\r\n const newOutputs = new Float32Array(numFrames * 4);\r\n const q = new Quaternion();\r\n for (let f = 0; f < numFrames; f++) {\r\n const base = f * frameStride + t;\r\n q.fromEulerAngle(srcOutputs[base], srcOutputs[base + 1], srcOutputs[base + 2]);\r\n retargetRotation(q, remap, q);\r\n newOutputs.set(q, f * 4);\r\n }\r\n return new NodeRotationTrack(\r\n new Interpolator(\r\n src.interpolator.mode === 'step' ? 'step' : 'linear',\r\n 'quat',\r\n new Float32Array(srcInputs),\r\n newOutputs\r\n )\r\n );\r\n}\r\n\r\nfunction retargetTranslationTrack(\r\n src: NodeTranslationTrack,\r\n remap: JointRetargetRemap\r\n): NodeTranslationTrack {\r\n const isCubic = src.interpolator.mode === 'cubicspline';\r\n const frameStride = isCubic ? 9 : 3;\r\n const numFrames = (src.interpolator.inputs as Float32Array).length;\r\n const srcOutputs = src.interpolator.outputs as Float32Array;\r\n const newOutputs = new Float32Array(srcOutputs.length);\r\n const t = isCubic ? 3 : 0;\r\n const v = new Vector3();\r\n for (let f = 0; f < numFrames; f++) {\r\n const base = f * frameStride;\r\n v.setXYZ(srcOutputs[base + t], srcOutputs[base + t + 1], srcOutputs[base + t + 2]);\r\n retargetTranslationValue(v, remap, v);\r\n if (isCubic) {\r\n v.setXYZ(srcOutputs[base], srcOutputs[base + 1], srcOutputs[base + 2]);\r\n newOutputs.set(retargetTranslationTangent(v, remap, v), base);\r\n v.setXYZ(srcOutputs[base + 3], srcOutputs[base + 4], srcOutputs[base + 5]);\r\n newOutputs.set(retargetTranslationValue(v, remap, v), base + 3);\r\n v.setXYZ(srcOutputs[base + 6], srcOutputs[base + 7], srcOutputs[base + 8]);\r\n newOutputs.set(retargetTranslationTangent(v, remap, v), base + 6);\r\n } else {\r\n newOutputs.set(v, base);\r\n }\r\n }\r\n return new NodeTranslationTrack(\r\n new Interpolator(\r\n src.interpolator.mode,\r\n 'vec3',\r\n new Float32Array(src.interpolator.inputs as Float32Array),\r\n newOutputs\r\n )\r\n );\r\n}\r\n\r\nfunction createConstantTranslationTrack(value: Vector3): NodeTranslationTrack {\r\n return new NodeTranslationTrack(\r\n new Interpolator('step', 'vec3', new Float32Array([0]), new Float32Array([value.x, value.y, value.z]))\r\n );\r\n}\r\n\r\nfunction findRotationTrack(\r\n tracks: AnimationTrack[] | undefined\r\n): NodeRotationTrack | NodeEulerRotationTrack | null {\r\n return (tracks?.find(\r\n (track) => track instanceof NodeRotationTrack || track instanceof NodeEulerRotationTrack\r\n ) ?? null) as NodeRotationTrack | NodeEulerRotationTrack | null;\r\n}\r\n\r\nfunction collectTrackTimes(track: AnimationTrack | null, times: Set<number>) {\r\n if (track instanceof NodeRotationTrack || track instanceof NodeEulerRotationTrack) {\r\n for (const time of track.interpolator.inputs as Float32Array) {\r\n times.add(time);\r\n }\r\n }\r\n}\r\n\r\nfunction sampleRotationTrack(\r\n track: NodeRotationTrack | NodeEulerRotationTrack | null,\r\n time: number,\r\n fallback: Quaternion,\r\n out: Quaternion\r\n): Quaternion {\r\n if (!track) {\r\n out.set(fallback);\r\n return out;\r\n }\r\n const state = track.calculateState({}, time);\r\n out.set(state);\r\n return out;\r\n}\r\n\r\nfunction bakeHumanoidRotationTracks(\r\n sourceClip: AnimationClip,\r\n srcSkeleton: SkeletonRig,\r\n dstSkeleton: SkeletonRig,\r\n srcRootRotation: Quaternion,\r\n dstRootRotation: Quaternion,\r\n dstClip: AnimationClip,\r\n remaps: JointRetargetRemap[]\r\n) {\r\n const rotationTracksByRemap = new Map<\r\n JointRetargetRemap,\r\n NodeRotationTrack | NodeEulerRotationTrack | null\r\n >();\r\n const times = new Set<number>([0, sourceClip.timeDuration]);\r\n const remapsByDstNode = new Map<object, JointRetargetRemap>();\r\n const srcJointSet = new Set(srcSkeleton.joints);\r\n const dstJointSet = new Set(dstSkeleton.joints);\r\n const srcBindRotByNode = new Map<SceneNode, Quaternion>();\r\n const dstBindRotByNode = new Map<SceneNode, Quaternion>();\r\n const srcRotationTrackByNode = new Map<SceneNode, NodeRotationTrack | NodeEulerRotationTrack | null>();\r\n\r\n for (let i = 0; i < srcSkeleton.joints.length; i++) {\r\n const joint = srcSkeleton.joints[i];\r\n srcBindRotByNode.set(joint, srcSkeleton.bindPose[i].rotation);\r\n const track = findRotationTrack(sourceClip.tracks.get(joint));\r\n srcRotationTrackByNode.set(joint, track);\r\n collectTrackTimes(track, times);\r\n }\r\n for (let i = 0; i < dstSkeleton.joints.length; i++) {\r\n dstBindRotByNode.set(dstSkeleton.joints[i], dstSkeleton.bindPose[i].rotation);\r\n }\r\n for (const remap of remaps) {\r\n const track = findRotationTrack(sourceClip.tracks.get(remap.srcNode));\r\n rotationTracksByRemap.set(remap, track);\r\n remapsByDstNode.set(remap.dstNode, remap);\r\n }\r\n const inputs = new Float32Array([...times].sort((a, b) => a - b));\r\n const srcBindWorldRots = new Map<SceneNode, Quaternion>();\r\n const dstBindWorldRots = new Map<SceneNode, Quaternion>();\r\n const srcAnimWorldRots = new Map<SceneNode, Quaternion>();\r\n const dstAnimWorldRots = new Map<SceneNode, Quaternion>();\r\n const outputsByRemap = new Map<JointRetargetRemap, Float32Array>();\r\n const tmpLocalRot = new Quaternion();\r\n const tmpWorldDelta = new Quaternion();\r\n const tmpParentInv = new Quaternion();\r\n\r\n for (const remap of remaps) {\r\n outputsByRemap.set(remap, new Float32Array(inputs.length * 4));\r\n }\r\n\r\n function getSrcBindWorldRot(node: SceneNode): Quaternion {\r\n let rot = srcBindWorldRots.get(node);\r\n if (!rot) {\r\n rot = (srcBindRotByNode.get(node) ?? Quaternion.identity()).clone();\r\n const parent = node.parent;\r\n if (parent && srcJointSet.has(parent)) {\r\n Quaternion.multiply(getSrcBindWorldRot(parent), rot, rot);\r\n } else {\r\n Quaternion.multiply(srcRootRotation, rot, rot);\r\n }\r\n srcBindWorldRots.set(node, rot);\r\n }\r\n return rot;\r\n }\r\n\r\n function getDstBindWorldRot(node: SceneNode): Quaternion {\r\n let rot = dstBindWorldRots.get(node);\r\n if (!rot) {\r\n rot = (dstBindRotByNode.get(node) ?? Quaternion.identity()).clone();\r\n const parent = node.parent;\r\n if (parent && dstJointSet.has(parent)) {\r\n Quaternion.multiply(getDstBindWorldRot(parent), rot, rot);\r\n } else {\r\n Quaternion.multiply(dstRootRotation, rot, rot);\r\n }\r\n dstBindWorldRots.set(node, rot);\r\n }\r\n return rot;\r\n }\r\n\r\n function getSrcAnimWorldRot(node: SceneNode, time: number): Quaternion {\r\n let rot = srcAnimWorldRots.get(node);\r\n if (!rot) {\r\n rot = new Quaternion();\r\n srcAnimWorldRots.set(node, rot);\r\n }\r\n const parent = node.parent;\r\n const parentWorldRot = parent && srcJointSet.has(parent) ? getSrcAnimWorldRot(parent, time) : null;\r\n sampleRotationTrack(\r\n srcRotationTrackByNode.get(node) ?? null,\r\n time,\r\n srcBindRotByNode.get(node) ?? Quaternion.identity(),\r\n tmpLocalRot\r\n );\r\n if (parentWorldRot) {\r\n Quaternion.multiply(parentWorldRot, tmpLocalRot, rot);\r\n } else {\r\n Quaternion.multiply(srcRootRotation, tmpLocalRot, rot);\r\n }\r\n return rot;\r\n }\r\n\r\n function getDstAnimWorldRot(remap: JointRetargetRemap, time: number): Quaternion {\r\n let rot = dstAnimWorldRots.get(remap.dstNode);\r\n if (!rot) {\r\n rot = new Quaternion();\r\n dstAnimWorldRots.set(remap.dstNode, rot);\r\n }\r\n const srcBindWorldRot = getSrcBindWorldRot(remap.srcNode);\r\n const srcAnimWorldRot = getSrcAnimWorldRot(remap.srcNode, time);\r\n Quaternion.multiply(srcAnimWorldRot, Quaternion.inverse(srcBindWorldRot, tmpWorldDelta), tmpWorldDelta);\r\n Quaternion.multiply(tmpWorldDelta, getDstBindWorldRot(remap.dstNode), rot);\r\n return rot;\r\n }\r\n\r\n function getDstParentAnimWorldRot(node: SceneNode, time: number): Quaternion | null {\r\n const parent = node.parent;\r\n if (!parent || !dstJointSet.has(parent)) {\r\n return dstRootRotation;\r\n }\r\n const mappedParent = remapsByDstNode.get(parent);\r\n if (mappedParent) {\r\n return getDstAnimWorldRot(mappedParent, time);\r\n }\r\n let rot = dstAnimWorldRots.get(parent);\r\n if (!rot) {\r\n rot = (dstBindRotByNode.get(parent) ?? Quaternion.identity()).clone();\r\n const parentWorldRot = getDstParentAnimWorldRot(parent, time);\r\n if (parentWorldRot) {\r\n Quaternion.multiply(parentWorldRot, rot, rot);\r\n }\r\n dstAnimWorldRots.set(parent, rot);\r\n }\r\n return rot;\r\n }\r\n\r\n for (let i = 0; i < inputs.length; i++) {\r\n const time = inputs[i];\r\n srcAnimWorldRots.clear();\r\n dstAnimWorldRots.clear();\r\n for (const remap of remaps) {\r\n const dstAnimWorldRot = getDstAnimWorldRot(remap, time);\r\n const parentWorldRot = getDstParentAnimWorldRot(remap.dstNode, time);\r\n if (parentWorldRot) {\r\n Quaternion.multiply(Quaternion.inverse(parentWorldRot, tmpParentInv), dstAnimWorldRot, tmpLocalRot);\r\n } else {\r\n tmpLocalRot.set(dstAnimWorldRot);\r\n }\r\n tmpLocalRot.inplaceNormalize();\r\n outputsByRemap.get(remap)!.set(tmpLocalRot, i * 4);\r\n }\r\n }\r\n\r\n for (const remap of remaps) {\r\n if (!rotationTracksByRemap.get(remap)) {\r\n continue;\r\n }\r\n const outputs = new Float32Array(outputsByRemap.get(remap)!);\r\n const track = new NodeRotationTrack(\r\n new Interpolator('linear', 'quat', new Float32Array(inputs), outputs)\r\n );\r\n track.name = 'rotation';\r\n track.target = remap.dstNode.persistentId;\r\n track.jointIndex = remap.dstJointIndex;\r\n dstClip.addTrack(remap.dstNode, track);\r\n }\r\n}\r\n\r\n/**\r\n * Animation set\r\n *\r\n * Manages a collection of named animation clips for a model and orchestrates:\r\n * - Playback state (time, loops, speed, weights, fade-in/out).\r\n * - Blending across multiple tracks targeting the same property via weighted averages.\r\n * - Skeleton usage and application for clips that drive skeletal animation.\r\n * - Active track registration and cleanup as clips start/stop.\r\n *\r\n * Usage:\r\n * - Create or retrieve `AnimationClip`s by name.\r\n * - Start playback with `playAnimation(name, options)`.\r\n * - Advance animation with `update(deltaSeconds)`.\r\n * - Optionally adjust weight while playing with `setAnimationWeight(name, weight)`.\r\n *\r\n * Lifetime:\r\n * - Disposing the set releases references to the model, clips, and clears active state.\r\n *\r\n * @public\r\n */\r\nexport class AnimationSet extends Disposable implements IDisposable {\r\n /** @internal */\r\n private _model: SceneNode;\r\n /** @internal */\r\n private _animations: Partial<Record<string, AnimationClip>>;\r\n /** @internal */\r\n private _skeletons: DRef<SkinBinding>[];\r\n /** @internal */\r\n private _rigs: DRef<SkeletonRig>[];\r\n /** @internal */\r\n private readonly _activeTracks: Map<object, Map<unknown, AnimationTrack[]>>;\r\n /** @internal */\r\n private readonly _activeSkinBindings: Map<SkinBinding, number>;\r\n /** @internal */\r\n private readonly _activeRigs: Map<SkeletonRig, 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 * Create an AnimationSet controlling the provided model.\r\n *\r\n * @param model - The SceneNode (model root) controlled by this animation set.\r\n */\r\n constructor(model: SceneNode) {\r\n super();\r\n this._model = model;\r\n this._animations = {};\r\n this._activeTracks = new Map();\r\n this._activeSkinBindings = new Map();\r\n this._activeRigs = new Map();\r\n this._activeAnimations = new Map();\r\n this._skeletons = [];\r\n this._rigs = [];\r\n }\r\n /**\r\n * The model (SceneNode) controlled by this animation set.\r\n */\r\n get model() {\r\n return this._model;\r\n }\r\n /**\r\n * Number of animation clips registered in this set.\r\n */\r\n get numAnimations() {\r\n return Object.getOwnPropertyNames(this._animations).length;\r\n }\r\n /**\r\n * The skeletons used by animations in this set.\r\n */\r\n get skeletons() {\r\n return this._skeletons;\r\n }\r\n /**\r\n * The shared rigs used by animations in this set.\r\n */\r\n get rigs() {\r\n return this._rigs;\r\n }\r\n /**\r\n * Per-skin bindings used by skinned meshes in this set.\r\n */\r\n get skinBindings() {\r\n return this._skeletons;\r\n }\r\n private resolveRigByAnimationBindingId(id: string): SkeletonRig | null {\r\n return this._model.findSkeletonRigById(id) ?? this._model.findSkinBindingById(id)?.rig ?? null;\r\n }\r\n private resolveClipRig(clip: AnimationClip): SkeletonRig | null {\r\n let rig: SkeletonRig | null = null;\r\n for (const id of clip.skeletons) {\r\n const nextRig = this.resolveRigByAnimationBindingId(id);\r\n if (!nextRig) {\r\n continue;\r\n }\r\n if (!rig) {\r\n rig = nextRig;\r\n } else if (rig !== nextRig) {\r\n return null;\r\n }\r\n }\r\n return rig;\r\n }\r\n /**\r\n * Retrieve an animation clip by name.\r\n *\r\n * @param name - Name of the animation.\r\n * @returns The clip if present; otherwise null.\r\n */\r\n get(name: string) {\r\n return this._animations[name] ?? null;\r\n }\r\n /**\r\n * Create and register a new animation clip.\r\n *\r\n * @param name - Unique name for the animation clip.\r\n * @param embedded - Whether the clip is embedded/owned (implementation-specific). Default false.\r\n * @returns The created clip, or null if the name is empty or not unique.\r\n */\r\n createAnimation(name: string, embedded = false) {\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 this._model.scene?.queueUpdateNode(this._model);\r\n return animation;\r\n }\r\n }\r\n /**\r\n * Delete and dispose an animation clip by name.\r\n *\r\n * - If the animation is currently playing, it is first stopped (immediately).\r\n *\r\n * @param name - Name of the animation to remove.\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 * Get the list of all registered animation names.\r\n *\r\n * @returns An array of clip names.\r\n */\r\n getAnimationNames() {\r\n return Object.keys(this._animations);\r\n }\r\n /**\r\n * Advance and apply active animations.\r\n *\r\n * Responsibilities per call:\r\n * - Update time cursor for each active clip (respecting speedRatio and looping).\r\n * - Enforce repeat limits and apply fade-out termination if configured.\r\n * - For each animated target, blend active tracks (weighted by clip weight × fade-in × fade-out)\r\n * and apply the resulting state to the target.\r\n * - Apply shared rig modifiers once, then update skin binding palettes.\r\n *\r\n * @param deltaInSeconds - Time step in seconds since last update.\r\n */\r\n update(deltaInSeconds: number) {\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 (k.timeDuration > 0) {\r\n if (v.currentTime > k.timeDuration) {\r\n v.repeatCounter += Math.max(1, Math.floor(v.currentTime / k.timeDuration));\r\n v.currentTime %= k.timeDuration;\r\n } else if (v.currentTime < 0) {\r\n v.repeatCounter += Math.max(1, Math.ceil(-v.currentTime / k.timeDuration));\r\n v.currentTime = ((v.currentTime % k.timeDuration) + k.timeDuration) % k.timeDuration;\r\n }\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 const info = this._activeAnimations.get(track.animation!)!;\r\n const t = (info.currentTime / track.animation!.timeDuration) * track.getDuration();\r\n return track.calculateState(k, t);\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 rigs once before computing per-skin palettes.\r\n this._rigs.forEach((v) => {\r\n v.get()?.apply(deltaInSeconds);\r\n });\r\n this._skeletons.forEach((v) => {\r\n v.get()?.apply();\r\n });\r\n }\r\n /**\r\n * Check whether an animation is currently playing.\r\n *\r\n * @param name - Optional animation name. If omitted, returns true if any animation is playing.\r\n * @returns True if playing; otherwise false.\r\n */\r\n isPlayingAnimation(name?: string) {\r\n if (name) {\r\n const animation = this._animations[name];\r\n return !!animation && this._activeAnimations.has(animation);\r\n }\r\n return this._activeAnimations.size > 0;\r\n }\r\n /**\r\n * Get an animation clip by name.\r\n *\r\n * Alias of `get(name)` returning a nullable type.\r\n *\r\n * @param name - Name of the animation.\r\n * @returns The clip if present; otherwise null.\r\n */\r\n getAnimationClip(name: string) {\r\n return this._animations[name] ?? null;\r\n }\r\n /**\r\n * Set the runtime blend weight for a currently playing animation.\r\n *\r\n * Has no effect if the clip is not active.\r\n *\r\n * @param name - Name of the playing animation.\r\n * @param weight - New weight value used during blending.\r\n */\r\n setAnimationWeight(name: string, weight: number) {\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 info = this._activeAnimations.get(ani);\r\n if (info) {\r\n info.weight = weight;\r\n }\r\n }\r\n /**\r\n * Start (or update) playback of an animation clip.\r\n *\r\n * Behavior:\r\n * - If the clip is already playing, updates its fade-in (resets fade-out).\r\n * - Otherwise initializes playback state (repeat counter, speed, weight, initial time).\r\n * - Registers clip tracks and skeletons into the active sets for blending and application.\r\n *\r\n * @param name - Name of the animation to play.\r\n * @param options - Playback options (repeat, speedRatio, fadeIn).\r\n */\r\n playAnimation(name: string, options?: PlayAnimationOptions) {\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 = options?.weight ?? ani.weight ?? 1;\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 rig = this.model.findSkeletonRigById(k);\r\n if (rig) {\r\n const refcount = this._activeRigs.get(rig);\r\n this._activeRigs.set(rig, refcount ? refcount + 1 : 1);\r\n rig.playing = true;\r\n return;\r\n }\r\n const binding = this.model.findSkinBindingById(k);\r\n if (binding) {\r\n const refcount = this._activeSkinBindings.get(binding);\r\n this._activeSkinBindings.set(binding, refcount ? refcount + 1 : 1);\r\n binding.playing = true;\r\n const rigRefcount = this._activeRigs.get(binding.rig);\r\n this._activeRigs.set(binding.rig, rigRefcount ? rigRefcount + 1 : 1);\r\n binding.rig.playing = true;\r\n }\r\n });\r\n }\r\n }\r\n /**\r\n * Stop playback of an animation clip.\r\n *\r\n * Behavior:\r\n * - If `options.fadeOut > 0`, marks the clip for fade-out; actual removal occurs after fade completes.\r\n * - If `fadeOut` is 0 or omitted, immediately:\r\n * - Removes the clip from active animations.\r\n * - Unregisters its tracks from active track maps.\r\n * - Decrements skeleton reference counts; resets and removes skeletons when refcount reaches 0.\r\n *\r\n * @param name - Name of the animation to stop.\r\n * @param options - Optional fade-out configuration.\r\n */\r\n stopAnimation(name: string, options?: StopAnimationOptions) {\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 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 rig = this.model.findSkeletonRigById(k);\r\n if (rig) {\r\n const refcount = this._activeRigs.get(rig)!;\r\n if (refcount === 1) {\r\n rig.reset();\r\n this._activeRigs.delete(rig);\r\n } else {\r\n this._activeRigs.set(rig, refcount - 1);\r\n }\r\n return;\r\n }\r\n const binding = this.model.findSkinBindingById(k);\r\n if (binding) {\r\n const refcount = this._activeSkinBindings.get(binding)!;\r\n if (refcount === 1) {\r\n binding.reset();\r\n this._activeSkinBindings.delete(binding);\r\n } else {\r\n this._activeSkinBindings.set(binding, refcount - 1);\r\n }\r\n const rigRefcount = this._activeRigs.get(binding.rig)!;\r\n if (rigRefcount === 1) {\r\n binding.rig.reset();\r\n this._activeRigs.delete(binding.rig);\r\n } else {\r\n this._activeRigs.set(binding.rig, rigRefcount - 1);\r\n }\r\n }\r\n });\r\n }\r\n }\r\n }\r\n /**\r\n * Create a skeletal-only masked clip from an existing clip in this set.\r\n *\r\n * The generated clip is a regular `AnimationClip`: it contains cloned node transform tracks\r\n * for the selected rig joints and can be played/blended through the normal animation system.\r\n * Non-skeletal tracks are skipped by default.\r\n *\r\n * @param sourceName - Name of the source clip.\r\n * @param targetName - Name of the generated clip.\r\n * @param options - Humanoid semantic or joint-name based mask options.\r\n * @returns The generated clip, or null on failure.\r\n */\r\n createSkeletalMaskedAnimation(\r\n sourceName: string,\r\n targetName: string,\r\n options: SkeletalAnimationMaskOptions\r\n ): AnimationClip | null {\r\n const sourceClip = this.get(sourceName);\r\n if (!sourceClip) {\r\n console.error(`createSkeletalMaskedAnimation: animation '${sourceName}' not found`);\r\n return null;\r\n }\r\n const rig = this.resolveClipRig(sourceClip);\r\n if (!rig) {\r\n console.error(`createSkeletalMaskedAnimation: source animation must resolve to exactly one rig`);\r\n return null;\r\n }\r\n return createSkeletalMaskedAnimationClip(this, sourceClip, targetName, rig, options);\r\n }\r\n /**\r\n * Copy a humanoid animation clip from another AnimationSet into this one via humanoid rig mapping.\r\n *\r\n * Prerequisites:\r\n * - Both source and destination skeletons must have a non-null `humanoidJointMapping`.\r\n * - Joints are matched by shared `HumanoidBodyRig` / `HumanoidHandRig` keys instead of joint names.\r\n * - The source clip must exist in `sourceSet` and must be driven by exactly one skeleton.\r\n *\r\n * @param sourceSet - The AnimationSet to copy from.\r\n * @param animationName - Name of the clip to copy.\r\n * @param targetName - Name for the new clip in this set. Defaults to `animationName`.\r\n * @returns The newly created AnimationClip, or null on failure.\r\n */\r\n copyHumanoidAnimationFrom(\r\n sourceSet: AnimationSet,\r\n animationName: string,\r\n options?: CopyHumanoidAnimationOptions\r\n ): AnimationClip | null;\r\n copyHumanoidAnimationFrom(\r\n sourceSet: AnimationSet,\r\n animationName: string,\r\n targetName?: string,\r\n options?: CopyHumanoidAnimationOptions\r\n ): AnimationClip | null;\r\n copyHumanoidAnimationFrom(\r\n sourceSet: AnimationSet,\r\n animationName: string,\r\n targetNameOrOptions?: string | CopyHumanoidAnimationOptions,\r\n copyOptions?: CopyHumanoidAnimationOptions\r\n ): AnimationClip | null {\r\n const options =\r\n typeof targetNameOrOptions === 'string' ? (copyOptions ?? {}) : (targetNameOrOptions ?? {});\r\n const destName =\r\n typeof targetNameOrOptions === 'string' ? targetNameOrOptions : (options.targetName ?? animationName);\r\n const rootMotion = options.rootMotion ?? 'scaled';\r\n const jointTranslations = options.jointTranslations ?? 'skip';\r\n const sourceClip = sourceSet.get(animationName);\r\n if (!sourceClip) {\r\n console.error(`copyHumanoidAnimationFrom: animation '${animationName}' not found in source set`);\r\n return null;\r\n }\r\n if (this._animations[destName]) {\r\n console.error(`copyHumanoidAnimationFrom: animation '${destName}' already exists in target set`);\r\n return null;\r\n }\r\n\r\n const srcSkeletonId = [...sourceClip.skeletons][0] ?? '';\r\n const srcSkeleton = sourceSet.resolveClipRig(sourceClip);\r\n if (!srcSkeleton) {\r\n console.error(\r\n `copyHumanoidAnimationFrom: source animation clip must resolve to exactly one humanoid rig`\r\n );\r\n return null;\r\n }\r\n\r\n // Check that source skeleton has humanoid mapping\r\n const srcHumanoidMapping = srcSkeleton.humanoidJointMapping;\r\n if (!srcHumanoidMapping) {\r\n console.error(`copyHumanoidAnimationFrom: source skeleton does not have a humanoid joint mapping`);\r\n return null;\r\n }\r\n\r\n const nodeMap = new Map<object, SceneNode>();\r\n const jointRemapBySrcNode = new Map<object, JointRetargetRemap>();\r\n\r\n // Find a destination skeleton that has a humanoid mapping and share at least the body rig keys\r\n let srcJointsFiltered: SceneNode[] = [];\r\n let dstJointsFiltered: SceneNode[] = [];\r\n\r\n const dstSkeleton = this._rigs\r\n .map((ref) => ref.get())\r\n .find((sk) => {\r\n if (!sk) {\r\n return false;\r\n }\r\n // Check that destination skeleton has humanoid mapping\r\n const dstHumanoidMapping = sk.humanoidJointMapping;\r\n if (!dstHumanoidMapping) {\r\n return false;\r\n }\r\n\r\n // Collect matched (srcJoint, dstJoint) pairs via shared humanoid rig keys\r\n const srcMatched: SceneNode[] = [];\r\n const dstMatched: SceneNode[] = [];\r\n\r\n // Match body rig joints\r\n for (const key of Object.keys(srcHumanoidMapping.body) as (keyof typeof srcHumanoidMapping.body)[]) {\r\n const srcJoint = srcHumanoidMapping.body[key];\r\n const dstJoint = dstHumanoidMapping.body[key];\r\n if (srcJoint && dstJoint) {\r\n srcMatched.push(srcJoint);\r\n dstMatched.push(dstJoint);\r\n }\r\n }\r\n\r\n // Match left hand rig joints only when both sides define them; skip silently if either is absent\r\n if (srcHumanoidMapping.leftHand && dstHumanoidMapping.leftHand) {\r\n for (const key of Object.keys(\r\n srcHumanoidMapping.leftHand\r\n ) as (keyof typeof srcHumanoidMapping.leftHand)[]) {\r\n const srcJoint = srcHumanoidMapping.leftHand[key];\r\n const dstJoint = dstHumanoidMapping.leftHand[key];\r\n if (srcJoint && dstJoint) {\r\n srcMatched.push(srcJoint);\r\n dstMatched.push(dstJoint);\r\n }\r\n }\r\n }\r\n\r\n // Match right hand rig joints only when both sides define them; skip silently if either is absent\r\n if (srcHumanoidMapping.rightHand && dstHumanoidMapping.rightHand) {\r\n for (const key of Object.keys(\r\n srcHumanoidMapping.rightHand\r\n ) as (keyof typeof srcHumanoidMapping.rightHand)[]) {\r\n const srcJoint = srcHumanoidMapping.rightHand[key];\r\n const dstJoint = dstHumanoidMapping.rightHand[key];\r\n if (srcJoint && dstJoint) {\r\n srcMatched.push(srcJoint);\r\n dstMatched.push(dstJoint);\r\n }\r\n }\r\n }\r\n\r\n if (srcMatched.length === 0) {\r\n return false;\r\n }\r\n\r\n srcJointsFiltered = srcMatched;\r\n dstJointsFiltered = dstMatched;\r\n return true;\r\n });\r\n\r\n if (!dstSkeleton) {\r\n console.error(\r\n `copyHumanoidAnimationFrom: no matching humanoid skeleton in target set for '${srcSkeletonId}'`\r\n );\r\n return null;\r\n }\r\n\r\n // Compute the world-space rotation of the parent chain above a motion node,\r\n // walking ALL ancestor nodes up to (but not including) the model root.\r\n // This must include non-joint nodes such as \"Armature\" in Mixamo rigs, which\r\n // carry a 90° X rotation that is NOT captured by humanoidRootRotation (which\r\n // only traverses nodes inside the skeleton joints list).\r\n function computeParentChainRotation(\r\n node: SceneNode,\r\n modelRoot: SceneNode,\r\n skeleton: SkeletonRig\r\n ): Quaternion {\r\n const result = Quaternion.identity();\r\n const jointSet = new Set(skeleton.joints);\r\n let p = node.parent;\r\n while (p && p !== modelRoot) {\r\n if (!jointSet.has(p)) {\r\n Quaternion.multiply(p.rotation, result, result);\r\n }\r\n p = p.parent;\r\n }\r\n return result;\r\n }\r\n\r\n const srcHipsNode = srcSkeleton.humanoidJointMapping!.body[HumanoidBodyRig.Hips];\r\n const dstHipsNode = dstSkeleton.humanoidJointMapping!.body[HumanoidBodyRig.Hips];\r\n const srcRootNode = srcSkeleton.rootJoint ?? srcHipsNode;\r\n const dstRootNode = dstSkeleton.rootJoint ?? dstHipsNode;\r\n const srcRootRot = computeParentChainRotation(srcRootNode, sourceSet.model, srcSkeleton);\r\n const dstRootRot = computeParentChainRotation(dstRootNode, this._model, dstSkeleton);\r\n const srcRootTranslationTrack = findTranslationTrack(sourceClip.tracks.get(srcRootNode));\r\n const srcFallbackHipsTranslationTrack =\r\n !srcRootTranslationTrack && srcRootNode !== srcHipsNode\r\n ? findTranslationTrack(sourceClip.tracks.get(srcHipsNode))\r\n : null;\r\n const srcMotionTrack = srcRootTranslationTrack ?? srcFallbackHipsTranslationTrack;\r\n const srcMotionNode = srcRootTranslationTrack\r\n ? srcRootNode\r\n : srcFallbackHipsTranslationTrack\r\n ? srcHipsNode\r\n : null;\r\n const srcMotionParentRot = srcMotionNode\r\n ? computeParentChainRotation(srcMotionNode, sourceSet.model, srcSkeleton)\r\n : srcRootRot;\r\n const rootTranslationRotation = Quaternion.multiply(Quaternion.inverse(dstRootRot), srcMotionParentRot);\r\n const rootTranslationScale =\r\n rootMotion === 'scaled'\r\n ? typeof options.rootMotionScale === 'number'\r\n ? options.rootMotionScale\r\n : options.rootMotionScale === 'none'\r\n ? 1\r\n : getHumanoidRootMotionScale(srcSkeleton, dstSkeleton)\r\n : 1;\r\n const jointRemaps: JointRetargetRemap[] = [];\r\n const mappedSrcNodes = new Set<SceneNode>();\r\n const mappedDstNodes = new Set<SceneNode>();\r\n // Build remap for matched joint pairs\r\n for (let fi = 0; fi < srcJointsFiltered.length; fi++) {\r\n const srcJoint = srcJointsFiltered[fi];\r\n const dstJoint = dstJointsFiltered[fi];\r\n if (mappedSrcNodes.has(srcJoint) || mappedDstNodes.has(dstJoint)) {\r\n continue;\r\n }\r\n mappedSrcNodes.add(srcJoint);\r\n mappedDstNodes.add(dstJoint);\r\n nodeMap.set(srcJoint, dstJoint);\r\n const remap = createJointRetargetRemap(srcSkeleton, dstSkeleton, srcJoint, dstJoint);\r\n jointRemaps.push(remap);\r\n jointRemapBySrcNode.set(srcJoint, remap);\r\n }\r\n\r\n const dstClip = this.createAnimation(destName);\r\n if (!dstClip) {\r\n return null;\r\n }\r\n dstClip.timeDuration = sourceClip.timeDuration;\r\n dstClip.weight = sourceClip.weight;\r\n dstClip.autoPlay = sourceClip.autoPlay;\r\n\r\n // Register destination skeleton\r\n dstClip.addSkeleton(dstSkeleton.persistentId);\r\n\r\n bakeHumanoidRotationTracks(\r\n sourceClip,\r\n srcSkeleton,\r\n dstSkeleton,\r\n srcRootRot,\r\n dstRootRot,\r\n dstClip,\r\n jointRemaps\r\n );\r\n\r\n if (rootMotion !== 'none') {\r\n const dstRootBindPose = getRigBindPoseForNode(dstSkeleton, dstRootNode);\r\n let dstRootTrack: NodeTranslationTrack | null = null;\r\n if (rootMotion === 'locked') {\r\n dstRootTrack = createConstantTranslationTrack(dstRootBindPose.position);\r\n } else if (srcMotionTrack && srcMotionNode) {\r\n const srcMotionBindPose = getRigBindPoseForNode(srcSkeleton, srcMotionNode);\r\n const rootRemap = createTranslationRetargetRemap(\r\n srcMotionNode,\r\n dstRootNode,\r\n srcMotionBindPose.position,\r\n dstRootBindPose.position,\r\n dstSkeleton.joints.indexOf(dstRootNode),\r\n rootTranslationScale,\r\n rootTranslationRotation,\r\n options.lockRootMotionAxes\r\n );\r\n dstRootTrack = retargetTranslationTrack(srcMotionTrack, rootRemap);\r\n }\r\n if (dstRootTrack) {\r\n dstRootTrack.name = srcMotionTrack?.name ?? 'translation';\r\n dstRootTrack.target = dstRootNode.persistentId;\r\n dstRootTrack.jointIndex = dstSkeleton.joints.indexOf(dstRootNode);\r\n dstClip.addTrack(dstRootNode, dstRootTrack);\r\n }\r\n }\r\n\r\n for (const srcNode of srcJointsFiltered) {\r\n const srcTracks = sourceClip.tracks.get(srcNode);\r\n if (!srcTracks) {\r\n // Not every humanoid joint must have a track; skip silently\r\n continue;\r\n }\r\n const dstNode = nodeMap.get(srcNode)!;\r\n const remap = jointRemapBySrcNode.get(srcNode)!;\r\n\r\n for (const srcTrack of srcTracks) {\r\n let dstTrack: AnimationTrack;\r\n if (srcTrack instanceof NodeRotationTrack) {\r\n continue;\r\n } else if (srcTrack instanceof NodeEulerRotationTrack) {\r\n continue;\r\n } else if (srcTrack instanceof NodeTranslationTrack) {\r\n if (srcNode === srcRootNode || srcTrack === srcMotionTrack || jointTranslations !== 'preserve') {\r\n continue;\r\n }\r\n dstTrack = retargetTranslationTrack(srcTrack, remap);\r\n } else if (srcTrack instanceof NodeScaleTrack) {\r\n dstTrack = new NodeScaleTrack(cloneInterpolator(srcTrack.interpolator));\r\n } else {\r\n console.warn(\r\n `copyHumanoidAnimationFrom: unsupported track type '${srcTrack.constructor.name}', skipping`\r\n );\r\n continue;\r\n }\r\n\r\n dstTrack.name = srcTrack.name;\r\n dstTrack.target = dstNode.persistentId;\r\n dstTrack.jointIndex = remap.dstJointIndex;\r\n dstClip.addTrack(dstNode, dstTrack);\r\n }\r\n }\r\n\r\n return dstClip;\r\n }\r\n /**\r\n * Copy an animation clip from another AnimationSet into this one.\r\n *\r\n * Prerequisites:\r\n * - Both sets must reference skeletons with identical joint names and counts.\r\n * - The source clip must exist in `sourceSet`.\r\n *\r\n * @param sourceSet - The AnimationSet to copy from.\r\n * @param animationName - Name of the clip to copy.\r\n * @param targetName - Name for the new clip in this set. Defaults to `animationName`.\r\n * @param excludeJoint - Optional predicate; joints whose name returns true are excluded from\r\n * skeleton structure matching.\r\n * @returns The newly created AnimationClip, or null on failure.\r\n *\r\n * @deprecated Use AnimationSet.copyHumanoidAnimationFrom instead.\r\n */\r\n copyAnimationFrom(\r\n sourceSet: AnimationSet,\r\n animationName: string,\r\n targetName?: string,\r\n excludeJoint?: (jointName: string) => boolean\r\n ): AnimationClip | null {\r\n const destName = targetName ?? animationName;\r\n const sourceClip = sourceSet.get(animationName);\r\n if (!sourceClip) {\r\n console.error(`copyAnimationFrom: animation '${animationName}' not found in source set`);\r\n return null;\r\n }\r\n if (this._animations[destName]) {\r\n console.error(`copyAnimationFrom: animation '${destName}' already exists in target set`);\r\n return null;\r\n }\r\n\r\n const srcSkeletonId = [...sourceClip.skeletons][0] ?? '';\r\n const srcSkeleton = sourceSet.resolveClipRig(sourceClip);\r\n if (!srcSkeleton) {\r\n console.error(`copyAnimationFrom: source animation clip must resolve to exactly one rig`);\r\n return null;\r\n }\r\n const nodeMap = new Map<object, SceneNode>();\r\n const jointRemapBySrcNode = new Map<object, JointRetargetRemap>();\r\n\r\n const jointsFiltered = srcSkeleton.joints.filter((j) => !excludeJoint?.(j.name));\r\n const srcRootNode = findRootJoint(jointsFiltered);\r\n if (!srcRootNode) {\r\n console.error(`copyAnimationFrom: cannot determine the root joint for source skeleton`);\r\n return null;\r\n }\r\n // Build filtered joint lists for matching (exclude joints rejected by filterJoint)\r\n const srcJointsFiltered = sortJoints(srcRootNode, jointsFiltered);\r\n if (!srcJointsFiltered) {\r\n console.error(`copyAnimationFrom: invalid source skeleton structure`);\r\n return null;\r\n }\r\n let dstJointsFiltered: SceneNode[] = [];\r\n const dstSkeleton = this._rigs\r\n .map((ref) => ref.get())\r\n .find((sk) => {\r\n if (!sk) {\r\n return false;\r\n }\r\n const jointsFiltered = sk.joints.filter((j) => !excludeJoint?.(j.name));\r\n if (jointsFiltered.length !== srcJointsFiltered.length) {\r\n return false;\r\n }\r\n const rootNode = findRootJoint(jointsFiltered);\r\n if (!rootNode) {\r\n return false;\r\n }\r\n const sortedJointsFiltered = sortJoints(rootNode, jointsFiltered);\r\n if (\r\n sortedJointsFiltered &&\r\n srcJointsFiltered.every((j, i) => j.name === sortedJointsFiltered[i].name)\r\n ) {\r\n dstJointsFiltered = sortedJointsFiltered;\r\n return true;\r\n }\r\n return false;\r\n });\r\n if (!dstJointsFiltered || !dstSkeleton) {\r\n console.error(`copyAnimationFrom: no matching skeleton in target set for '${srcSkeletonId}'`);\r\n return null;\r\n }\r\n // Build remap only for joints that pass the filter\r\n for (let fi = 0; fi < srcJointsFiltered.length; fi++) {\r\n const srcJoint = srcJointsFiltered[fi];\r\n const dstJoint = dstJointsFiltered[fi];\r\n nodeMap.set(srcJoint, dstJoint);\r\n jointRemapBySrcNode.set(\r\n srcJoint,\r\n createJointRetargetRemap(srcSkeleton, dstSkeleton, srcJoint, dstJoint)\r\n );\r\n }\r\n\r\n const dstClip = this.createAnimation(destName);\r\n if (!dstClip) {\r\n return null;\r\n }\r\n dstClip.timeDuration = sourceClip.timeDuration;\r\n dstClip.weight = sourceClip.weight;\r\n dstClip.autoPlay = sourceClip.autoPlay;\r\n\r\n // Register destination skeleton\r\n dstClip.addSkeleton(dstSkeleton.persistentId);\r\n\r\n for (const srcNode of srcJointsFiltered) {\r\n const srcTracks = sourceClip.tracks.get(srcNode);\r\n if (!srcTracks) {\r\n console.error(`copyAnimationFrom: no track for joint: ${srcNode.name}`);\r\n return null;\r\n }\r\n const dstNode = nodeMap.get(srcNode)!;\r\n const remap = jointRemapBySrcNode.get(srcNode)!;\r\n\r\n for (const srcTrack of srcTracks) {\r\n let dstTrack: AnimationTrack;\r\n if (srcTrack instanceof NodeRotationTrack) {\r\n dstTrack = retargetRotationTrack(srcTrack, remap);\r\n } else if (srcTrack instanceof NodeEulerRotationTrack) {\r\n dstTrack = retargetEulerToRotationTrack(srcTrack, remap);\r\n } else if (srcTrack instanceof NodeTranslationTrack) {\r\n dstTrack = retargetTranslationTrack(srcTrack, remap);\r\n } else if (srcTrack instanceof NodeScaleTrack) {\r\n dstTrack = new NodeScaleTrack(cloneInterpolator(srcTrack.interpolator));\r\n } else {\r\n console.warn(`copyAnimationFrom: unsupported track type '${srcTrack.constructor.name}', skipping`);\r\n continue;\r\n }\r\n\r\n dstTrack.name = srcTrack.name;\r\n dstTrack.target = dstNode.persistentId;\r\n dstTrack.jointIndex = remap.dstJointIndex;\r\n dstClip.addTrack(dstNode, dstTrack);\r\n }\r\n }\r\n\r\n return dstClip;\r\n\r\n function findRootJoint(joints: SceneNode[]) {\r\n let root: Nullable<SceneNode> = null;\r\n for (const joint of joints) {\r\n if (!root) {\r\n root = joint;\r\n }\r\n while (!root!.isParentOf(joint)) {\r\n root = root!.parent;\r\n }\r\n if (!root) {\r\n break;\r\n }\r\n }\r\n if (!root || !joints.includes(root)) {\r\n return null;\r\n }\r\n return root;\r\n }\r\n\r\n function sortJoints(root: SceneNode, joints: SceneNode[]): Nullable<SceneNode[]> {\r\n const ordered: SceneNode[] = [];\r\n const visited = new Set<SceneNode>();\r\n function visit(joint: SceneNode) {\r\n if (visited.has(joint)) {\r\n return true;\r\n }\r\n if (!joints.includes(joint)) {\r\n return false;\r\n }\r\n if (joint !== root) {\r\n visit(joint.parent!);\r\n }\r\n visited.add(joint);\r\n ordered.push(joint);\r\n return true;\r\n }\r\n for (const joint of joints) {\r\n if (!visit(joint)) {\r\n return null;\r\n }\r\n }\r\n return ordered;\r\n }\r\n }\r\n\r\n /**\r\n * Reset all skeleton modifiers\r\n */\r\n resetSkeletonModifiers() {\r\n for (const sk of this._skeletons) {\r\n for (const modifier of sk.get()!.modifiers) {\r\n modifier.reset();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Dispose the animation set and release owned resources.\r\n *\r\n * - Disposes the weak reference to the model.\r\n * - Disposes all registered animation clips.\r\n * - Clears active animations, tracks, and skeleton references.\r\n */\r\n protected onDispose() {\r\n super.onDispose();\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._activeSkinBindings.clear();\r\n this._activeRigs.clear();\r\n this._activeTracks.clear();\r\n }\r\n}\r\n"],"names":["cloneInterpolator","src","Interpolator","mode","target","inputs","Float32Array","outputs","createJointRetargetRemap","srcSkeleton","dstSkeleton","srcJoint","dstJoint","translationRotation","translationScale","translationAxisLocks","si","joints","indexOf","di","srcBindPose","bindPose","dstBindPose","srcLen","position","magnitude","dstLen","dstNode","dstJointIndex","srcNode","srcBindRotInv","Quaternion","inverse","rotation","dstBindRot","clone","srcBindPos","dstBindPos","createTranslationRetargetRemap","identity","getBindPosition","skeleton","joint","index","getRigBindPoseForNode","node","getBindPoseForJoint","rootJoint","rootBindPose","scale","getBindDistanceToAncestor","ancestor","distance","bindPosition","parent","getHumanoidLegLength","side","mapping","humanoidJointMapping","body","hips","HumanoidBodyRig","Hips","foot","LeftFoot","RightFoot","toes","LeftToes","RightToes","Math","max","getHumanoidRootMotionScale","srcLeftLeg","srcRightLeg","dstLeftLeg","dstRightLeg","srcLegLength","dstLegLength","findTranslationTrack","tracks","find","track","NodeTranslationTrack","applyTranslationAxisLocks","value","bindValue","locks","x","y","z","applyTranslationTangentAxisLocks","retargetRotation","qSrcAnim","remap","out","multiply","inplaceNormalize","retargetRotationTangent","qSrcTangent","retargetTranslationValue","srcValue","setXYZ","subBy","scaleBy","transform","addBy","retargetTranslationTangent","retargetRotationTrack","isCubic","interpolator","frameStride","numFrames","length","srcOutputs","newOutputs","t","q","f","base","setXYZW","set","subarray","NodeRotationTrack","retargetEulerToRotationTrack","srcInputs","fromEulerAngle","retargetTranslationTrack","v","Vector3","createConstantTranslationTrack","findRotationTrack","NodeEulerRotationTrack","collectTrackTimes","times","time","add","sampleRotationTrack","fallback","state","calculateState","bakeHumanoidRotationTracks","sourceClip","srcRootRotation","dstRootRotation","dstClip","remaps","rotationTracksByRemap","Map","Set","timeDuration","remapsByDstNode","srcJointSet","dstJointSet","srcBindRotByNode","dstBindRotByNode","srcRotationTrackByNode","i","get","sort","a","b","srcBindWorldRots","dstBindWorldRots","srcAnimWorldRots","dstAnimWorldRots","outputsByRemap","tmpLocalRot","tmpWorldDelta","tmpParentInv","getSrcBindWorldRot","rot","has","getDstBindWorldRot","getSrcAnimWorldRot","parentWorldRot","getDstAnimWorldRot","srcBindWorldRot","srcAnimWorldRot","getDstParentAnimWorldRot","mappedParent","clear","dstAnimWorldRot","name","persistentId","jointIndex","addTrack","AnimationSet","Disposable","model","_model","_animations","_activeTracks","_activeSkinBindings","_activeRigs","_activeAnimations","_skeletons","_rigs","numAnimations","Object","getOwnPropertyNames","skeletons","rigs","skinBindings","resolveRigByAnimationBindingId","id","findSkeletonRigById","findSkinBindingById","rig","resolveClipRig","clip","nextRig","createAnimation","embedded","console","error","animation","AnimationClip","scene","queueUpdateNode","deleteAnimation","stopAnimation","dispose","getAnimationNames","keys","update","deltaInSeconds","forEach","k","fadeOut","fadeOutStart","animateTime","firstFrame","timeAdvance","speedRatio","currentTime","repeatCounter","floor","ceil","repeat","alltracks","filter","isPlayingAnimation","weights","map","info","weight","fadeIn","min","states","getDuration","weightedAverage","mixState","applyState","apply","size","getAnimationClip","setAnimationWeight","ani","playAnimation","options","nodeTracks","blendId","getBlendId","blendedTracks","push","refcount","playing","binding","rigRefcount","delete","reset","createSkeletalMaskedAnimation","sourceName","targetName","createSkeletalMaskedAnimationClip","copyHumanoidAnimationFrom","sourceSet","animationName","targetNameOrOptions","copyOptions","destName","rootMotion","jointTranslations","srcSkeletonId","srcHumanoidMapping","nodeMap","jointRemapBySrcNode","srcJointsFiltered","dstJointsFiltered","ref","sk","dstHumanoidMapping","srcMatched","dstMatched","key","leftHand","rightHand","computeParentChainRotation","modelRoot","result","jointSet","p","srcHipsNode","dstHipsNode","srcRootNode","dstRootNode","srcRootRot","dstRootRot","srcRootTranslationTrack","srcFallbackHipsTranslationTrack","srcMotionTrack","srcMotionNode","srcMotionParentRot","rootTranslationRotation","rootTranslationScale","rootMotionScale","jointRemaps","mappedSrcNodes","mappedDstNodes","fi","autoPlay","addSkeleton","dstRootBindPose","dstRootTrack","srcMotionBindPose","rootRemap","lockRootMotionAxes","srcTracks","srcTrack","dstTrack","NodeScaleTrack","warn","copyAnimationFrom","excludeJoint","jointsFiltered","j","findRootJoint","sortJoints","rootNode","sortedJointsFiltered","every","root","isParentOf","includes","ordered","visited","visit","resetSkeletonModifiers","modifier","modifiers","onDispose"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"animationtrack.js","sources":["../../src/animation/animationtrack.ts"],"sourcesContent":["import type { Nullable } from '@zephyr3d/base';\r\nimport type { AnimationClip } from './animation';\r\n\r\n/**\r\n * Base class for animation tracks.\r\n *\r\n * A track produces time-varying state for a specific target and defines how to:\r\n * - Compute state at a given time (`calculateState`)\r\n * - Apply that state to a target (`applyState`)\r\n * - Blend between two states (`mixState`)\r\n * - Report its blend compatibility (`getBlendId`)\r\n * - Report its intrinsic duration (`getDuration`)\r\n *\r\n * Generic:\r\n * - `StateType` is the shape of the computed/applied state (e.g., number, vector, pose).\r\n *\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: Nullable<AnimationClip>;\r\n /** @internal */\r\n protected _target: string;\r\n /** @internal */\r\n protected _jointIndex: number;\r\n /**\r\n * Construct a new animation track.\r\n *\r\n * @param embedded - Whether this track is embedded/owned inline by its container. Default false.\r\n */\r\n constructor(embedded?: boolean) {\r\n this._name = 'noname';\r\n this._animation = null;\r\n this._embedded = !!embedded;\r\n this._target = '';\r\n this._jointIndex = -1;\r\n }\r\n /**\r\n * Human-readable name of the track.\r\n */\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 /**\r\n * Whether this track is embedded (owned inline by a resource/container).\r\n */\r\n get embedded() {\r\n return this._embedded;\r\n }\r\n /**\r\n * The `AnimationClip` that owns this track.\r\n */\r\n get animation() {\r\n return this._animation;\r\n }\r\n set animation(ani) {\r\n this._animation = ani;\r\n }\r\n /**\r\n * Logical target identifier for this track (optional metadata).\r\n *\r\n * This does not affect application; it can be used by tooling or higher-level\r\n * systems to label/group tracks.\r\n */\r\n get target() {\r\n return this._target;\r\n }\r\n set target(val: string) {\r\n this._target = val;\r\n }\r\n /**\r\n * Joint index if this track controls a joint, otherwise -1\r\n */\r\n get jointIndex() {\r\n return this._jointIndex;\r\n }\r\n set jointIndex(index: number) {\r\n this._jointIndex = index;\r\n }\r\n /**\r\n * Reset the track to its initial state for the given target.\r\n *\r\n * Intended to stop playback and rewind the target to the first frame or default state.\r\n *\r\n * @param _target - The animated object to reset.\r\n */\r\n reset(_target: object) {}\r\n /**\r\n * Compute the animation state at the specified time.\r\n *\r\n * Implementations should be pure with respect to inputs: given the same `target` and\r\n * `currentTime`, return the same `StateType`.\r\n *\r\n * @param target - The animated object (used to resolve current baseline if needed).\r\n * @param currentTime - Time cursor in seconds within the track's timeline.\r\n * @returns The computed state at `currentTime`.\r\n */\r\n abstract calculateState(target: object, currentTime: number): StateType;\r\n /**\r\n * Apply a previously computed animation state to the target.\r\n *\r\n * @param target - The animated object to modify.\r\n * @param state - The state to apply.\r\n */\r\n abstract applyState(target: object, state: StateType): unknown;\r\n /**\r\n * Blend two states into a new state using a weight.\r\n *\r\n * @param a - First state.\r\n * @param b - Second state.\r\n * @param t - Blend weight in \\[0, 1\\], where 0 yields `a` and 1 yields `b`.\r\n * @returns The blended state.\r\n */\r\n abstract mixState(a: StateType, b: StateType, t: number): StateType;\r\n /**\r\n * Get the blend identifier for this track.\r\n *\r\n * Tracks with the same blend ID are considered compatible for blending on the\r\n * same target channel/property.\r\n *\r\n * @returns An identifier used to group compatible tracks for blending.\r\n */\r\n abstract getBlendId(): unknown;\r\n /**\r\n * Get the intrinsic duration of this track in seconds.\r\n *\r\n * Used by clips to determine overall clip duration and looping behavior.\r\n *\r\n * @returns Track duration (seconds).\r\n */\r\n abstract getDuration(): number;\r\n}\r\n"],"names":["AnimationTrack","embedded","_name","_animation","_embedded","_target","_jointIndex","name","val","animation","ani","target","jointIndex","index","reset"],"mappings":"AAGA;;;;;;;;;;;;;;AAcC,IACM,MAAeA,cAAAA,CAAAA;qBAEpB,KAAwB;qBAExB,SAA6B;qBAE7B,UAA8C;qBAE9C,OAA0B;qBAE1B,WAA8B;AAC9B;;;;MAKA,WAAA,CAAYC,QAAkB,CAAE;QAC9B,IAAI,CAACC,KAAK,GAAG,QAAA;QACb,IAAI,CAACC,UAAU,GAAG,IAAA;AAClB,QAAA,IAAI,CAACC,SAAS,GAAG,CAAC,CAACH,QAAAA;QACnB,IAAI,CAACI,OAAO,GAAG,EAAA;QACf,IAAI,CAACC,WAAW,GAAG,EAAC;AACtB;AACA;;AAEC,MACD,IAAIC,IAAO,GAAA;QACT,OAAO,IAAI,CAACL,KAAK;AACnB;IACA,IAAIK,IAAAA,CAAKC,GAAW,EAAE;QACpB,IAAI,CAACN,KAAK,GAAGM,GAAAA;AACf;AACA;;AAEC,MACD,IAAIP,QAAW,GAAA;QACb,OAAO,IAAI,CAACG,SAAS;AACvB;AACA;;AAEC,MACD,IAAIK,SAAY,GAAA;QACd,OAAO,IAAI,CAACN,UAAU;AACxB;IACA,IAAIM,SAAAA,CAAUC,GAAG,EAAE;QACjB,IAAI,CAACP,UAAU,GAAGO,GAAAA;AACpB;AACA;;;;;AAKC,MACD,IAAIC,MAAS,GAAA;QACX,OAAO,IAAI,CAACN,OAAO;AACrB;IACA,IAAIM,MAAAA,CAAOH,GAAW,EAAE;QACtB,IAAI,CAACH,OAAO,GAAGG,GAAAA;AACjB;AACA;;AAEC,MACD,IAAII,UAAa,GAAA;QACf,OAAO,IAAI,CAACN,WAAW;AACzB;IACA,IAAIM,UAAAA,CAAWC,KAAa,EAAE;QAC5B,IAAI,CAACP,WAAW,GAAGO,KAAAA;AACrB;AACA;;;;;;MAOAC,KAAAA,CAAMT,OAAe,EAAE;AA6CzB;;;;"}
1
+ {"version":3,"file":"animationtrack.js","sources":["../../src/animation/animationtrack.ts"],"sourcesContent":["import type { Nullable } from '@zephyr3d/base';\r\nimport type { AnimationClip } from './animation';\r\n\r\n/**\r\n * Base class for animation tracks.\r\n *\r\n * A track produces time-varying state for a specific target and defines how to:\r\n * - Compute state at a given time (`calculateState`)\r\n * - Apply that state to a target (`applyState`)\r\n * - Blend between two states (`mixState`)\r\n * - Report its blend compatibility (`getBlendId`)\r\n * - Report its intrinsic duration (`getDuration`)\r\n *\r\n * Generic:\r\n * - `StateType` is the shape of the computed/applied state (e.g., number, vector, pose).\r\n *\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: Nullable<AnimationClip>;\r\n /** @internal */\r\n protected _target: string;\r\n /** @internal */\r\n protected _jointIndex: number;\r\n /**\r\n * Construct a new animation track.\r\n *\r\n * @param embedded - Whether this track is embedded/owned inline by its container. Default false.\r\n */\r\n constructor(embedded?: boolean) {\r\n this._name = 'noname';\r\n this._animation = null;\r\n this._embedded = !!embedded;\r\n this._target = '';\r\n this._jointIndex = -1;\r\n }\r\n /**\r\n * Human-readable name of the track.\r\n */\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 /**\r\n * Whether this track is embedded (owned inline by a resource/container).\r\n */\r\n get embedded() {\r\n return this._embedded;\r\n }\r\n /**\r\n * The `AnimationClip` that owns this track.\r\n */\r\n get animation() {\r\n return this._animation;\r\n }\r\n set animation(ani) {\r\n this._animation = ani;\r\n }\r\n /**\r\n * Logical target identifier for this track (optional metadata).\r\n *\r\n * This does not affect application; it can be used by tooling or higher-level\r\n * systems to label/group tracks.\r\n */\r\n get target() {\r\n return this._target;\r\n }\r\n set target(val: string) {\r\n this._target = val;\r\n }\r\n /**\r\n * Joint index if this track controls a joint, otherwise -1\r\n */\r\n get jointIndex() {\r\n return this._jointIndex;\r\n }\r\n set jointIndex(index: number) {\r\n this._jointIndex = index;\r\n }\r\n /**\r\n * Clone this animation track\r\n */\r\n abstract clone(): this;\r\n /**\r\n * Reset the track to its initial state for the given target.\r\n *\r\n * Intended to stop playback and rewind the target to the first frame or default state.\r\n *\r\n * @param _target - The animated object to reset.\r\n */\r\n reset(_target: object) {}\r\n /**\r\n * Compute the animation state at the specified time.\r\n *\r\n * Implementations should be pure with respect to inputs: given the same `target` and\r\n * `currentTime`, return the same `StateType`.\r\n *\r\n * @param target - The animated object (used to resolve current baseline if needed).\r\n * @param currentTime - Time cursor in seconds within the track's timeline.\r\n * @returns The computed state at `currentTime`.\r\n */\r\n abstract calculateState(target: object, currentTime: number): StateType;\r\n /**\r\n * Apply a previously computed animation state to the target.\r\n *\r\n * @param target - The animated object to modify.\r\n * @param state - The state to apply.\r\n */\r\n abstract applyState(target: object, state: StateType): unknown;\r\n /**\r\n * Blend two states into a new state using a weight.\r\n *\r\n * @param a - First state.\r\n * @param b - Second state.\r\n * @param t - Blend weight in \\[0, 1\\], where 0 yields `a` and 1 yields `b`.\r\n * @returns The blended state.\r\n */\r\n abstract mixState(a: StateType, b: StateType, t: number): StateType;\r\n /**\r\n * Get the blend identifier for this track.\r\n *\r\n * Tracks with the same blend ID are considered compatible for blending on the\r\n * same target channel/property.\r\n *\r\n * @returns An identifier used to group compatible tracks for blending.\r\n */\r\n abstract getBlendId(): unknown;\r\n /**\r\n * Get the intrinsic duration of this track in seconds.\r\n *\r\n * Used by clips to determine overall clip duration and looping behavior.\r\n *\r\n * @returns Track duration (seconds).\r\n */\r\n abstract getDuration(): number;\r\n}\r\n"],"names":["AnimationTrack","embedded","_name","_animation","_embedded","_target","_jointIndex","name","val","animation","ani","target","jointIndex","index","reset"],"mappings":"AAGA;;;;;;;;;;;;;;AAcC,IACM,MAAeA,cAAAA,CAAAA;qBAEpB,KAAwB;qBAExB,SAA6B;qBAE7B,UAA8C;qBAE9C,OAA0B;qBAE1B,WAA8B;AAC9B;;;;MAKA,WAAA,CAAYC,QAAkB,CAAE;QAC9B,IAAI,CAACC,KAAK,GAAG,QAAA;QACb,IAAI,CAACC,UAAU,GAAG,IAAA;AAClB,QAAA,IAAI,CAACC,SAAS,GAAG,CAAC,CAACH,QAAAA;QACnB,IAAI,CAACI,OAAO,GAAG,EAAA;QACf,IAAI,CAACC,WAAW,GAAG,EAAC;AACtB;AACA;;AAEC,MACD,IAAIC,IAAO,GAAA;QACT,OAAO,IAAI,CAACL,KAAK;AACnB;IACA,IAAIK,IAAAA,CAAKC,GAAW,EAAE;QACpB,IAAI,CAACN,KAAK,GAAGM,GAAAA;AACf;AACA;;AAEC,MACD,IAAIP,QAAW,GAAA;QACb,OAAO,IAAI,CAACG,SAAS;AACvB;AACA;;AAEC,MACD,IAAIK,SAAY,GAAA;QACd,OAAO,IAAI,CAACN,UAAU;AACxB;IACA,IAAIM,SAAAA,CAAUC,GAAG,EAAE;QACjB,IAAI,CAACP,UAAU,GAAGO,GAAAA;AACpB;AACA;;;;;AAKC,MACD,IAAIC,MAAS,GAAA;QACX,OAAO,IAAI,CAACN,OAAO;AACrB;IACA,IAAIM,MAAAA,CAAOH,GAAW,EAAE;QACtB,IAAI,CAACH,OAAO,GAAGG,GAAAA;AACjB;AACA;;AAEC,MACD,IAAII,UAAa,GAAA;QACf,OAAO,IAAI,CAACN,WAAW;AACzB;IACA,IAAIM,UAAAA,CAAWC,KAAa,EAAE;QAC5B,IAAI,CAACP,WAAW,GAAGO,KAAAA;AACrB;AAKA;;;;;;MAOAC,KAAAA,CAAMT,OAAe,EAAE;AA6CzB;;;;"}
@@ -40,6 +40,9 @@ const tmpVec3 = new Vector3();
40
40
  }
41
41
  this._interpolator = interp ?? null;
42
42
  }
43
+ /** {@inheritDoc AnimationTrack.clone} */ clone() {
44
+ return new NodeEulerRotationTrack(this._interpolator?.clone(), false);
45
+ }
43
46
  /** {@inheritDoc AnimationTrack.calculateState} */ calculateState(target, currentTime) {
44
47
  this._interpolator.interpolate(currentTime, tmpVec3);
45
48
  this._state.fromEulerAngle(tmpVec3.x, tmpVec3.y, tmpVec3.z);
@@ -1 +1 @@
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 _interpolator!: Interpolator;\r\n /**\r\n * Create an instance of EulerRotationTrack\r\n */\r\n constructor();\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 === undefined) {\r\n super(false);\r\n } else if (modeOrInterpolator instanceof Interpolator) {\r\n if (modeOrInterpolator.target !== 'vec3') {\r\n throw new Error(`EulerRotationTrack(): 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 get interpolator() {\r\n return this._interpolator;\r\n }\r\n set interpolator(interp: Interpolator) {\r\n if (interp && interp.target !== 'vec3') {\r\n throw new Error(`EulerRotationTrack(): interpolator target must be 'vec3'`);\r\n }\r\n this._interpolator = interp ?? null;\r\n }\r\n /** {@inheritDoc AnimationTrack.calculateState} */\r\n calculateState(target: object, currentTime: number) {\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 /** {@inheritDoc AnimationTrack.applyState} */\r\n applyState(node: SceneNode, state: Quaternion) {\r\n node.rotation.set(state);\r\n }\r\n /** {@inheritDoc AnimationTrack.mixState} */\r\n mixState(a: Quaternion, b: Quaternion, t: number) {\r\n return Quaternion.slerp(a, b, t);\r\n }\r\n /** {@inheritDoc AnimationTrack.getBlendId} */\r\n getBlendId() {\r\n return 'node-rotation';\r\n }\r\n /** {@inheritDoc AnimationTrack.getDuration} */\r\n getDuration() {\r\n return this._interpolator.maxTime;\r\n }\r\n}\r\n"],"names":["tmpVec3","Vector3","NodeEulerRotationTrack","AnimationTrack","_state","_interpolator","modeOrInterpolator","keyFramesOrEmbedded","embedded","undefined","Interpolator","target","Error","keyFrames","inputs","Float32Array","map","val","time","outputs","length","i","value","x","y","z","Quaternion","interpolator","interp","calculateState","currentTime","interpolate","fromEulerAngle","applyState","node","state","rotation","set","mixState","a","b","t","slerp","getBlendId","getDuration","maxTime"],"mappings":"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"}
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 _interpolator!: Interpolator;\r\n /**\r\n * Create an instance of EulerRotationTrack\r\n */\r\n constructor();\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 === undefined) {\r\n super(false);\r\n } else if (modeOrInterpolator instanceof Interpolator) {\r\n if (modeOrInterpolator.target !== 'vec3') {\r\n throw new Error(`EulerRotationTrack(): 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 get interpolator() {\r\n return this._interpolator;\r\n }\r\n set interpolator(interp: Interpolator) {\r\n if (interp && interp.target !== 'vec3') {\r\n throw new Error(`EulerRotationTrack(): interpolator target must be 'vec3'`);\r\n }\r\n this._interpolator = interp ?? null;\r\n }\r\n /** {@inheritDoc AnimationTrack.clone} */\r\n clone(): this {\r\n return new NodeEulerRotationTrack(this._interpolator?.clone(), false) as this;\r\n }\r\n /** {@inheritDoc AnimationTrack.calculateState} */\r\n calculateState(target: object, currentTime: number) {\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 /** {@inheritDoc AnimationTrack.applyState} */\r\n applyState(node: SceneNode, state: Quaternion) {\r\n node.rotation.set(state);\r\n }\r\n /** {@inheritDoc AnimationTrack.mixState} */\r\n mixState(a: Quaternion, b: Quaternion, t: number) {\r\n return Quaternion.slerp(a, b, t);\r\n }\r\n /** {@inheritDoc AnimationTrack.getBlendId} */\r\n getBlendId() {\r\n return 'node-rotation';\r\n }\r\n /** {@inheritDoc AnimationTrack.getDuration} */\r\n getDuration() {\r\n return this._interpolator.maxTime;\r\n }\r\n}\r\n"],"names":["tmpVec3","Vector3","NodeEulerRotationTrack","AnimationTrack","_state","_interpolator","modeOrInterpolator","keyFramesOrEmbedded","embedded","undefined","Interpolator","target","Error","keyFrames","inputs","Float32Array","map","val","time","outputs","length","i","value","x","y","z","Quaternion","interpolator","interp","clone","calculateState","currentTime","interpolate","fromEulerAngle","applyState","node","state","rotation","set","mixState","a","b","t","slerp","getBlendId","getDuration","maxTime"],"mappings":"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"}
@@ -17,6 +17,13 @@ import { createGeometryCacheState, mixGeometryCacheBoundingBox, ensureGeometryCa
17
17
  this._state = this._frames.length > 0 ? createGeometryCacheState(this._frames[0]) : null;
18
18
  this._meshBindings = new WeakMap();
19
19
  }
20
+ clone() {
21
+ return new FixedGeometryCacheTrack(this._times.slice(), this._frames.map((frame)=>({
22
+ positions: frame.positions.slice(),
23
+ normals: frame.normals?.slice() ?? null,
24
+ boundingBox: frame.boundingBox.clone()
25
+ })), false);
26
+ }
20
27
  get times() {
21
28
  return this._times;
22
29
  }