@onerjs/core 8.42.7 → 8.42.9

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 (327) hide show
  1. package/Animations/animatable.core.js +1 -1
  2. package/Animations/animatable.core.js.map +1 -1
  3. package/Animations/animatorAvatar.js +2 -2
  4. package/Animations/animatorAvatar.js.map +1 -1
  5. package/Animations/runtimeAnimation.js +1 -1
  6. package/Animations/runtimeAnimation.js.map +1 -1
  7. package/Audio/audioSceneComponent.js +1 -2
  8. package/Audio/audioSceneComponent.js.map +1 -1
  9. package/AudioV2/audioUtils.d.ts +23 -0
  10. package/AudioV2/audioUtils.js +37 -0
  11. package/AudioV2/audioUtils.js.map +1 -1
  12. package/AudioV2/webAudio/subNodes/webAudioBusAndSoundSubGraph.js +3 -3
  13. package/AudioV2/webAudio/subNodes/webAudioBusAndSoundSubGraph.js.map +1 -1
  14. package/AudioV2/webAudio/webAudioEngine.js +1 -1
  15. package/AudioV2/webAudio/webAudioEngine.js.map +1 -1
  16. package/AudioV2/webAudio/webAudioStaticSound.js +3 -2
  17. package/AudioV2/webAudio/webAudioStaticSound.js.map +1 -1
  18. package/AudioV2/webAudio/webAudioStreamingSound.js +10 -3
  19. package/AudioV2/webAudio/webAudioStreamingSound.js.map +1 -1
  20. package/Behaviors/Meshes/followBehavior.js +1 -1
  21. package/Behaviors/Meshes/followBehavior.js.map +1 -1
  22. package/Behaviors/Meshes/pointerDragBehavior.js +1 -1
  23. package/Behaviors/Meshes/pointerDragBehavior.js.map +1 -1
  24. package/Bones/boneLookController.js +1 -1
  25. package/Bones/boneLookController.js.map +1 -1
  26. package/Buffers/buffer.js +1 -1
  27. package/Buffers/buffer.js.map +1 -1
  28. package/Cameras/Inputs/arcRotateCameraMouseWheelInput.js +2 -2
  29. package/Cameras/Inputs/arcRotateCameraMouseWheelInput.js.map +1 -1
  30. package/Cameras/camera.js +2 -2
  31. package/Cameras/camera.js.map +1 -1
  32. package/Engines/AbstractEngine/abstractEngine.renderPass.js +1 -0
  33. package/Engines/AbstractEngine/abstractEngine.renderPass.js.map +1 -1
  34. package/Engines/Extensions/engine.query.js +1 -1
  35. package/Engines/Extensions/engine.query.js.map +1 -1
  36. package/Engines/Processors/shaderProcessor.js +2 -3
  37. package/Engines/Processors/shaderProcessor.js.map +1 -1
  38. package/Engines/WebGL/webGLRenderTargetWrapper.js +1 -1
  39. package/Engines/WebGL/webGLRenderTargetWrapper.js.map +1 -1
  40. package/Engines/WebGPU/Extensions/engine.debugging.d.ts +87 -0
  41. package/Engines/WebGPU/Extensions/engine.debugging.js +123 -31
  42. package/Engines/WebGPU/Extensions/engine.debugging.js.map +1 -1
  43. package/Engines/WebGPU/webgpuBufferManager.js +1 -1
  44. package/Engines/WebGPU/webgpuBufferManager.js.map +1 -1
  45. package/Engines/WebGPU/webgpuShaderProcessor.js +1 -1
  46. package/Engines/WebGPU/webgpuShaderProcessor.js.map +1 -1
  47. package/Engines/WebGPU/webgpuShaderProcessorsGLSL.js +1 -1
  48. package/Engines/WebGPU/webgpuShaderProcessorsGLSL.js.map +1 -1
  49. package/Engines/WebGPU/webgpuShaderProcessorsWGSL.js +1 -1
  50. package/Engines/WebGPU/webgpuShaderProcessorsWGSL.js.map +1 -1
  51. package/Engines/WebGPU/webgpuTextureManager.js +20 -6
  52. package/Engines/WebGPU/webgpuTextureManager.js.map +1 -1
  53. package/Engines/abstractEngine.js +2 -2
  54. package/Engines/abstractEngine.js.map +1 -1
  55. package/Engines/engine.common.js +2 -2
  56. package/Engines/engine.common.js.map +1 -1
  57. package/Engines/engine.js +0 -1
  58. package/Engines/engine.js.map +1 -1
  59. package/Engines/thinEngine.functions.js +1 -1
  60. package/Engines/thinEngine.functions.js.map +1 -1
  61. package/Engines/thinEngine.js +4 -5
  62. package/Engines/thinEngine.js.map +1 -1
  63. package/Engines/thinNativeEngine.js +2 -5
  64. package/Engines/thinNativeEngine.js.map +1 -1
  65. package/Engines/thinWebGPUEngine.d.ts +6 -4
  66. package/Engines/thinWebGPUEngine.js +49 -25
  67. package/Engines/thinWebGPUEngine.js.map +1 -1
  68. package/Engines/webgpuEngine.d.ts +2 -1
  69. package/Engines/webgpuEngine.js +18 -16
  70. package/Engines/webgpuEngine.js.map +1 -1
  71. package/FlowGraph/flowGraph.d.ts +1 -0
  72. package/FlowGraph/flowGraph.js.map +1 -1
  73. package/FlowGraph/flowGraphBlock.d.ts +1 -0
  74. package/FlowGraph/flowGraphBlock.js.map +1 -1
  75. package/FlowGraph/flowGraphContext.d.ts +1 -0
  76. package/FlowGraph/flowGraphContext.js.map +1 -1
  77. package/FlowGraph/flowGraphCoordinator.d.ts +1 -0
  78. package/FlowGraph/flowGraphCoordinator.js.map +1 -1
  79. package/FrameGraph/Node/nodeRenderGraph.d.ts +12 -1
  80. package/FrameGraph/Node/nodeRenderGraph.js +36 -2
  81. package/FrameGraph/Node/nodeRenderGraph.js.map +1 -1
  82. package/FrameGraph/Tasks/Layers/baseLayerTask.js +1 -1
  83. package/FrameGraph/Tasks/Layers/baseLayerTask.js.map +1 -1
  84. package/FrameGraph/Tasks/PostProcesses/ssao2RenderingPipelineTask.js +3 -0
  85. package/FrameGraph/Tasks/PostProcesses/ssao2RenderingPipelineTask.js.map +1 -1
  86. package/FrameGraph/Tasks/PostProcesses/ssrRenderingPipelineTask.js +3 -0
  87. package/FrameGraph/Tasks/PostProcesses/ssrRenderingPipelineTask.js.map +1 -1
  88. package/FrameGraph/Tasks/PostProcesses/volumetricLightingTask.d.ts +3 -1
  89. package/FrameGraph/Tasks/PostProcesses/volumetricLightingTask.js +14 -0
  90. package/FrameGraph/Tasks/PostProcesses/volumetricLightingTask.js.map +1 -1
  91. package/FrameGraph/Tasks/Rendering/csmShadowGeneratorTask.d.ts +2 -2
  92. package/FrameGraph/Tasks/Rendering/csmShadowGeneratorTask.js +20 -14
  93. package/FrameGraph/Tasks/Rendering/csmShadowGeneratorTask.js.map +1 -1
  94. package/FrameGraph/Tasks/Rendering/shadowGeneratorTask.d.ts +3 -2
  95. package/FrameGraph/Tasks/Rendering/shadowGeneratorTask.js +38 -14
  96. package/FrameGraph/Tasks/Rendering/shadowGeneratorTask.js.map +1 -1
  97. package/Layers/glowLayer.js +1 -1
  98. package/Layers/glowLayer.js.map +1 -1
  99. package/Layers/highlightLayer.js +1 -1
  100. package/Layers/highlightLayer.js.map +1 -1
  101. package/Layers/selectionOutlineLayer.js +8 -0
  102. package/Layers/selectionOutlineLayer.js.map +1 -1
  103. package/Layers/thinSelectionOutlineLayer.js +15 -0
  104. package/Layers/thinSelectionOutlineLayer.js.map +1 -1
  105. package/Lights/Shadows/cascadedShadowGenerator.js +0 -1
  106. package/Lights/Shadows/cascadedShadowGenerator.js.map +1 -1
  107. package/Lights/Shadows/shadowGenerator.d.ts +28 -1
  108. package/Lights/Shadows/shadowGenerator.js +77 -11
  109. package/Lights/Shadows/shadowGenerator.js.map +1 -1
  110. package/Lights/lightingVolume.d.ts +1 -0
  111. package/Lights/lightingVolume.js +10 -2
  112. package/Lights/lightingVolume.js.map +1 -1
  113. package/Loading/sceneLoader.js +1 -1
  114. package/Loading/sceneLoader.js.map +1 -1
  115. package/Materials/Node/Blocks/Dual/fogBlock.js +1 -1
  116. package/Materials/Node/Blocks/Dual/fogBlock.js.map +1 -1
  117. package/Materials/Node/Blocks/Dual/imageSourceBlock.js +1 -1
  118. package/Materials/Node/Blocks/Dual/imageSourceBlock.js.map +1 -1
  119. package/Materials/Node/Blocks/PBR/sheenBlock.js +1 -2
  120. package/Materials/Node/Blocks/PBR/sheenBlock.js.map +1 -1
  121. package/Materials/Node/Blocks/cloudBlock.js +1 -1
  122. package/Materials/Node/Blocks/cloudBlock.js.map +1 -1
  123. package/Materials/Node/Blocks/curveBlock.js +2 -3
  124. package/Materials/Node/Blocks/curveBlock.js.map +1 -1
  125. package/Materials/Node/nodeMaterial.js +1 -2
  126. package/Materials/Node/nodeMaterial.js.map +1 -1
  127. package/Materials/PBR/openpbrMaterial.js +3 -5
  128. package/Materials/PBR/openpbrMaterial.js.map +1 -1
  129. package/Materials/PBR/pbrBaseMaterial.js +2 -3
  130. package/Materials/PBR/pbrBaseMaterial.js.map +1 -1
  131. package/Materials/Textures/Procedurals/proceduralTexture.js +0 -1
  132. package/Materials/Textures/Procedurals/proceduralTexture.js.map +1 -1
  133. package/Materials/Textures/cubeTexture.js +1 -1
  134. package/Materials/Textures/cubeTexture.js.map +1 -1
  135. package/Materials/Textures/htmlElementTexture.js +2 -2
  136. package/Materials/Textures/htmlElementTexture.js.map +1 -1
  137. package/Materials/Textures/multiRenderTarget.js +1 -1
  138. package/Materials/Textures/multiRenderTarget.js.map +1 -1
  139. package/Materials/Textures/renderTargetTexture.js +13 -2
  140. package/Materials/Textures/renderTargetTexture.js.map +1 -1
  141. package/Materials/effect.js +2 -1
  142. package/Materials/effect.js.map +1 -1
  143. package/Materials/materialHelper.functions.js +1 -1
  144. package/Materials/materialHelper.functions.js.map +1 -1
  145. package/Materials/multiMaterial.js +1 -1
  146. package/Materials/multiMaterial.js.map +1 -1
  147. package/Materials/standardMaterial.js +1 -2
  148. package/Materials/standardMaterial.js.map +1 -1
  149. package/Maths/math.geospatial.d.ts +17 -2
  150. package/Maths/math.geospatial.functions.d.ts +16 -2
  151. package/Maths/math.geospatial.functions.js +37 -4
  152. package/Maths/math.geospatial.functions.js.map +1 -1
  153. package/Maths/math.geospatial.js.map +1 -1
  154. package/Maths/math.path.js +1 -1
  155. package/Maths/math.path.js.map +1 -1
  156. package/Maths/math.scalar.functions.js +3 -3
  157. package/Maths/math.scalar.functions.js.map +1 -1
  158. package/Maths/math.vector.js +1 -1
  159. package/Maths/math.vector.js.map +1 -1
  160. package/Meshes/Builders/boxBuilder.js +1 -2
  161. package/Meshes/Builders/boxBuilder.js.map +1 -1
  162. package/Meshes/Builders/cylinderBuilder.js +2 -2
  163. package/Meshes/Builders/cylinderBuilder.js.map +1 -1
  164. package/Meshes/Builders/decalBuilder.js +1 -2
  165. package/Meshes/Builders/decalBuilder.js.map +1 -1
  166. package/Meshes/Builders/latheBuilder.js +2 -2
  167. package/Meshes/Builders/latheBuilder.js.map +1 -1
  168. package/Meshes/Builders/linesBuilder.js +11 -15
  169. package/Meshes/Builders/linesBuilder.js.map +1 -1
  170. package/Meshes/Builders/polygonBuilder.js +6 -6
  171. package/Meshes/Builders/polygonBuilder.js.map +1 -1
  172. package/Meshes/Builders/polyhedronBuilder.js +2 -2
  173. package/Meshes/Builders/polyhedronBuilder.js.map +1 -1
  174. package/Meshes/Builders/ribbonBuilder.js +6 -6
  175. package/Meshes/Builders/ribbonBuilder.js.map +1 -1
  176. package/Meshes/Builders/shapeBuilder.js +2 -3
  177. package/Meshes/Builders/shapeBuilder.js.map +1 -1
  178. package/Meshes/Builders/tiledBoxBuilder.js +1 -1
  179. package/Meshes/Builders/tiledBoxBuilder.js.map +1 -1
  180. package/Meshes/Builders/tiledPlaneBuilder.js +1 -1
  181. package/Meshes/Builders/tiledPlaneBuilder.js.map +1 -1
  182. package/Meshes/GreasedLine/greasedLineMesh.js +1 -2
  183. package/Meshes/GreasedLine/greasedLineMesh.js.map +1 -1
  184. package/Meshes/GreasedLine/greasedLineRibbonMesh.js +1 -1
  185. package/Meshes/GreasedLine/greasedLineRibbonMesh.js.map +1 -1
  186. package/Meshes/Node/Blocks/Instances/instantiateOnFacesBlock.js +1 -1
  187. package/Meshes/Node/Blocks/Instances/instantiateOnFacesBlock.js.map +1 -1
  188. package/Meshes/Node/Blocks/Instances/instantiateOnVolumeBlock.js +1 -1
  189. package/Meshes/Node/Blocks/Instances/instantiateOnVolumeBlock.js.map +1 -1
  190. package/Meshes/Node/Blocks/extrudeGeometryBlock.d.ts +61 -0
  191. package/Meshes/Node/Blocks/extrudeGeometryBlock.js +297 -0
  192. package/Meshes/Node/Blocks/extrudeGeometryBlock.js.map +1 -0
  193. package/Meshes/Node/Blocks/mappingBlock.js +1 -1
  194. package/Meshes/Node/Blocks/mappingBlock.js.map +1 -1
  195. package/Meshes/Node/index.d.ts +1 -0
  196. package/Meshes/Node/index.js +1 -0
  197. package/Meshes/Node/index.js.map +1 -1
  198. package/Meshes/abstractMesh.d.ts +4 -0
  199. package/Meshes/abstractMesh.js +14 -10
  200. package/Meshes/abstractMesh.js.map +1 -1
  201. package/Meshes/csg.js +1 -1
  202. package/Meshes/csg.js.map +1 -1
  203. package/Meshes/csg2.js +1 -1
  204. package/Meshes/csg2.js.map +1 -1
  205. package/Meshes/geodesicMesh.js +11 -13
  206. package/Meshes/geodesicMesh.js.map +1 -1
  207. package/Meshes/geometry.js +2 -2
  208. package/Meshes/geometry.js.map +1 -1
  209. package/Meshes/groundMesh.js +7 -7
  210. package/Meshes/groundMesh.js.map +1 -1
  211. package/Meshes/mesh.d.ts +2 -0
  212. package/Meshes/mesh.js +21 -7
  213. package/Meshes/mesh.js.map +1 -1
  214. package/Meshes/mesh.vertexData.js +22 -22
  215. package/Meshes/mesh.vertexData.js.map +1 -1
  216. package/Meshes/meshSimplification.js +1 -1
  217. package/Meshes/meshSimplification.js.map +1 -1
  218. package/Meshes/polygonMesh.js +1 -1
  219. package/Meshes/polygonMesh.js.map +1 -1
  220. package/Meshes/trailMesh.js +1 -1
  221. package/Meshes/trailMesh.js.map +1 -1
  222. package/Misc/HighDynamicRange/hdr.js +4 -6
  223. package/Misc/HighDynamicRange/hdr.js.map +1 -1
  224. package/Misc/HighDynamicRange/panoramaToCubemap.js +1 -1
  225. package/Misc/HighDynamicRange/panoramaToCubemap.js.map +1 -1
  226. package/Misc/basisWorker.js +1 -1
  227. package/Misc/basisWorker.js.map +1 -1
  228. package/Misc/environmentTextureTools.js +1 -1
  229. package/Misc/environmentTextureTools.js.map +1 -1
  230. package/Misc/meshExploder.js +1 -2
  231. package/Misc/meshExploder.js.map +1 -1
  232. package/Misc/tga.js +2 -2
  233. package/Misc/tga.js.map +1 -1
  234. package/Misc/timer.js +4 -2
  235. package/Misc/timer.js.map +1 -1
  236. package/Misc/tools.d.ts +7 -0
  237. package/Misc/tools.js +25 -7
  238. package/Misc/tools.js.map +1 -1
  239. package/Misc/webRequest.d.ts +34 -3
  240. package/Misc/webRequest.js +107 -24
  241. package/Misc/webRequest.js.map +1 -1
  242. package/Morph/morphTargetManager.js +1 -1
  243. package/Morph/morphTargetManager.js.map +1 -1
  244. package/Particles/Node/Blocks/Update/updateNoiseBlock.js +1 -1
  245. package/Particles/Node/Blocks/Update/updateNoiseBlock.js.map +1 -1
  246. package/Particles/Node/Blocks/particleSourceTextureBlock.d.ts +11 -1
  247. package/Particles/Node/Blocks/particleSourceTextureBlock.js +25 -11
  248. package/Particles/Node/Blocks/particleSourceTextureBlock.js.map +1 -1
  249. package/Particles/Node/nodeParticleSystemSet.helper.js +3 -3
  250. package/Particles/Node/nodeParticleSystemSet.helper.js.map +1 -1
  251. package/Particles/Node/nodeParticleSystemSet.js +1 -1
  252. package/Particles/Node/nodeParticleSystemSet.js.map +1 -1
  253. package/Particles/computeShaderParticleSystem.js +2 -0
  254. package/Particles/computeShaderParticleSystem.js.map +1 -1
  255. package/Particles/gpuParticleSystem.d.ts +14 -0
  256. package/Particles/gpuParticleSystem.js +94 -12
  257. package/Particles/gpuParticleSystem.js.map +1 -1
  258. package/Particles/particleSystem.js +4 -1
  259. package/Particles/particleSystem.js.map +1 -1
  260. package/Particles/pointsCloudSystem.js +46 -47
  261. package/Particles/pointsCloudSystem.js.map +1 -1
  262. package/Particles/solidParticleSystem.js +5 -6
  263. package/Particles/solidParticleSystem.js.map +1 -1
  264. package/Particles/thinParticleSystem.js +3 -4
  265. package/Particles/thinParticleSystem.js.map +1 -1
  266. package/Particles/webgl2ParticleSystem.js +2 -1
  267. package/Particles/webgl2ParticleSystem.js.map +1 -1
  268. package/Physics/v1/Plugins/ammoJSPlugin.js +0 -8
  269. package/Physics/v1/Plugins/ammoJSPlugin.js.map +1 -1
  270. package/Physics/v2/characterController.js +4 -8
  271. package/Physics/v2/characterController.js.map +1 -1
  272. package/Physics/v2/ragdoll.js +1 -2
  273. package/Physics/v2/ragdoll.js.map +1 -1
  274. package/PostProcesses/postProcess.js +3 -3
  275. package/PostProcesses/postProcess.js.map +1 -1
  276. package/PostProcesses/thinDepthOfFieldEffect.js +2 -2
  277. package/PostProcesses/thinDepthOfFieldEffect.js.map +1 -1
  278. package/Probes/reflectionProbe.js +0 -1
  279. package/Probes/reflectionProbe.js.map +1 -1
  280. package/Rendering/IBLShadows/iblShadowsRenderPipeline.js +0 -5
  281. package/Rendering/IBLShadows/iblShadowsRenderPipeline.js.map +1 -1
  282. package/Rendering/depthRenderer.js +0 -11
  283. package/Rendering/depthRenderer.js.map +1 -1
  284. package/Rendering/depthRendererSceneComponent.js +1 -1
  285. package/Rendering/depthRendererSceneComponent.js.map +1 -1
  286. package/Rendering/geometryBufferRenderer.js +0 -1
  287. package/Rendering/geometryBufferRenderer.js.map +1 -1
  288. package/Rendering/objectRenderer.js +7 -5
  289. package/Rendering/objectRenderer.js.map +1 -1
  290. package/Rendering/thinDepthPeelingRenderer.js +1 -1
  291. package/Rendering/thinDepthPeelingRenderer.js.map +1 -1
  292. package/Rendering/utilityLayerRenderer.js +1 -1
  293. package/Rendering/utilityLayerRenderer.js.map +1 -1
  294. package/Shaders/ShadersInclude/screenSpaceRayTrace.js +18 -8
  295. package/Shaders/ShadersInclude/screenSpaceRayTrace.js.map +1 -1
  296. package/Shaders/gpuRenderParticles.vertex.js +4 -0
  297. package/Shaders/gpuRenderParticles.vertex.js.map +1 -1
  298. package/Shaders/gpuUpdateParticles.vertex.js +15 -3
  299. package/Shaders/gpuUpdateParticles.vertex.js.map +1 -1
  300. package/ShadersWGSL/ShadersInclude/screenSpaceRayTrace.js +18 -7
  301. package/ShadersWGSL/ShadersInclude/screenSpaceRayTrace.js.map +1 -1
  302. package/ShadersWGSL/gpuUpdateParticles.compute.js +16 -1
  303. package/ShadersWGSL/gpuUpdateParticles.compute.js.map +1 -1
  304. package/ShadersWGSL/lightingVolume.compute.js +1 -1
  305. package/ShadersWGSL/lightingVolume.compute.js.map +1 -1
  306. package/Sprites/spriteManager.js +4 -4
  307. package/Sprites/spriteManager.js.map +1 -1
  308. package/XR/features/WebXRAnchorSystem.js +2 -2
  309. package/XR/features/WebXRAnchorSystem.js.map +1 -1
  310. package/XR/features/WebXRHandTracking.js +1 -1
  311. package/XR/features/WebXRHandTracking.js.map +1 -1
  312. package/XR/features/WebXRNearInteraction.js +1 -1
  313. package/XR/features/WebXRNearInteraction.js.map +1 -1
  314. package/XR/motionController/webXRMicrosoftMixedRealityController.js +1 -1
  315. package/XR/motionController/webXRMicrosoftMixedRealityController.js.map +1 -1
  316. package/XR/motionController/webXROculusTouchMotionController.js +1 -1
  317. package/XR/motionController/webXROculusTouchMotionController.js.map +1 -1
  318. package/XR/webXRFeaturesManager.js +1 -1
  319. package/XR/webXRFeaturesManager.js.map +1 -1
  320. package/assetContainer.js +1 -1
  321. package/assetContainer.js.map +1 -1
  322. package/package.json +1 -1
  323. package/scene.d.ts +16 -0
  324. package/scene.js +28 -0
  325. package/scene.js.map +1 -1
  326. package/sceneComponent.js +1 -1
  327. package/sceneComponent.js.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"animatorAvatar.js","sourceRoot":"","sources":["../../../../dev/core/src/Animations/animatorAvatar.ts"],"names":[],"mappings":"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","sourcesContent":["import type { MorphTargetManager, Immutable, Bone, Nullable, MorphTarget, AnimationGroup, Animation, Node, Skeleton, TargetedAnimation, DeepImmutableObject } from \"core/index\";\r\nimport { Vector3, Quaternion, TmpVectors, Matrix } from \"core/Maths/math.vector\";\r\nimport { Logger } from \"../Misc/logger\";\r\nimport { TransformNode } from \"../Meshes/transformNode\";\r\nimport { AbstractMesh } from \"../Meshes/abstractMesh\";\r\n\r\n/**\r\n * Options for retargeting an animation group to an avatar.\r\n */\r\nexport interface IRetargetOptions {\r\n /**\r\n * The name to assign to the (cloned) retargeted animation group.\r\n * If not specified, the same name as the original animation group will be used.\r\n */\r\n animationGroupName?: string;\r\n\r\n /**\r\n * If true, the retargeted animations will be fixed to correct common issues like orthogonal quaternions.\r\n * Default is false.\r\n */\r\n fixAnimations?: boolean;\r\n\r\n /**\r\n * If true, the parent hierarchy of bones and transform nodes will be checked during retargeting.\r\n * Animations will be removed if the hierarchies don't match.\r\n * Default is false.\r\n */\r\n checkHierarchy?: boolean;\r\n\r\n /**\r\n * If true, the frame values in the animation keyframes will be adjusted during retargeting to account for differences\r\n * between the source and target bone transforms.\r\n * Default is true.\r\n */\r\n retargetAnimationKeys?: boolean;\r\n\r\n /**\r\n * If true, scales and adjusts the root position animation to account for size differences between the source and target avatars.\r\n * This helps maintain the relative motion of the character when retargeting between avatars of different proportions.\r\n * Default is true.\r\n */\r\n fixRootPosition?: boolean;\r\n\r\n /**\r\n * If true, adjusts the root position animation to correct for ground reference height differences between the source and target avatars.\r\n * This ensures that the animated character maintains proper contact with the ground during retargeting.\r\n * Requires groundReferenceNodeName to be specified to determine the ground reference point in the source animation.\r\n * Default is false.\r\n */\r\n fixGroundReference?: boolean;\r\n\r\n /**\r\n * If true, adjusts the ground reference dynamically during retargeting. fixGroundReference must be true for this to work.\r\n * When enabled, the system will continuously adjust the ground reference point throughout the retargeting process to make sure it's the lowest point of the character.\r\n * This allows for more accurate ground contact correction, especially in animations where groundReferenceNodeName is not always the lowest point (e.g., walking, running).\r\n * Default is false.\r\n */\r\n fixGroundReferenceDynamicRefNode?: boolean;\r\n\r\n /**\r\n * The name of the root transform node in the source animation group (typically \"Hips\" or similar).\r\n * If not specified, the system will attempt to automatically find the first bone without a parent.\r\n * This bone is used as a reference point for fixing root position during retargeting.\r\n * It's also used by the ground reference fixing processing.\r\n */\r\n rootNodeName?: string;\r\n\r\n /**\r\n * The name of the transform node in the source animation group used as a ground reference point (typically a foot bone like \"LeftFoot\" or \"RightFoot\").\r\n * This bone is used to determine the vertical offset needed to maintain proper ground contact during retargeting.\r\n * Required when fixGroundReference or fixRootPosition is enabled.\r\n */\r\n groundReferenceNodeName?: string;\r\n\r\n /**\r\n * Specifies which axis represents the vertical/up direction in the animation space.\r\n * Use \"X\", \"Y\", or \"Z\" to explicitly set the vertical axis, or \"\" (empty string) / undefined to auto-detect.\r\n * If not specified or empty, the system will automatically determine the vertical axis based on the difference\r\n * between the root node and ground reference node positions.\r\n * Default is undefined (auto-detect).\r\n */\r\n groundReferenceVerticalAxis?: \"\" | \"X\" | \"Y\" | \"Z\";\r\n\r\n /**\r\n * A map for renaming nodes during retargeting when the source transform node hierarchy and target skeleton use different naming conventions.\r\n * The map keys are the original node names from the source animation group, and the values are the corresponding\r\n * node names in the target skeleton. This is useful when bone names don't match between avatars.\r\n */\r\n mapNodeNames?: Map<string, string>;\r\n}\r\n\r\ntype TransformNodeNameToNode = Map<string, { node: TransformNode; initialTransformations: { position: Vector3; scaling: Vector3; quaternion?: Quaternion; rotation: Vector3 } }>;\r\n\r\n/**\r\n * Represents an animator avatar that manages meshes, skeletons and morph target managers for a hierarchical transform node and mesh structure.\r\n * This class is used to group and manage animation-related resources (meshes, skeletons and morph targets) associated with a root transform node and its descendants.\r\n */\r\nexport class AnimatorAvatar {\r\n /**\r\n * List of meshes found in the hierarchy of the root node. Only meshes with at least one vertex are included.\r\n */\r\n public meshes: AbstractMesh[];\r\n\r\n /**\r\n * Set of skeletons found in the mesh hierarchy.\r\n */\r\n public skeletons: Set<Skeleton>;\r\n\r\n /**\r\n * Set of morph target managers found in the mesh hierarchy.\r\n * Each morph target manager is configured with the appropriate mesh name and influencer count.\r\n */\r\n public morphTargetManagers: Set<MorphTargetManager>;\r\n\r\n private _mapMorphTargetNameToMorphTarget: Map<string, MorphTarget>;\r\n /**\r\n * Map of morph target names to their corresponding MorphTarget instances.\r\n * The keys are constructed using the format \"meshName_morphTargetName\".\r\n */\r\n public get mapMorphTargetNameToMorphTarget(): Immutable<Map<string, MorphTarget>> {\r\n if (!this._mapMorphTargetNameToMorphTarget) {\r\n this._buildMorphTargetMap();\r\n }\r\n return this._mapMorphTargetNameToMorphTarget;\r\n }\r\n\r\n /**\r\n * Indicates whether to show warnings during retargeting operations.\r\n */\r\n public showWarnings = true;\r\n\r\n /**\r\n * Creates an instance of AnimatorAvatar.\r\n * @param name - The name to assign to this avatar and its root node\r\n * @param rootNode - The root node of the avatar hierarchy. This node and its descendants will be scanned for meshes, skeletons and morph target managers. If not provided, you are expected to manually manage meshes, skeletons and morph target managers.\r\n * @param _disposeResources - Indicates whether to dispose of resources (meshes, skeletons, morph target managers, root node and descendants + materials and textures) when the avatar is disposed (true by default)\r\n * @param setAvatarName - Indicates whether to set the name of the root node to the avatar name. Default is true. Set this to false if you don't want the root node to be renamed, or if you want to set it to a different name after creating the avatar.\r\n */\r\n constructor(\r\n public readonly name: string,\r\n public readonly rootNode?: TransformNode,\r\n private _disposeResources = true,\r\n setAvatarName = true\r\n ) {\r\n this.meshes = [];\r\n this.skeletons = new Set<Skeleton>();\r\n this.morphTargetManagers = new Set<MorphTargetManager>();\r\n\r\n if (!rootNode) {\r\n return;\r\n }\r\n\r\n if (setAvatarName) {\r\n rootNode.name = name;\r\n }\r\n\r\n if (rootNode instanceof AbstractMesh && rootNode.getTotalVertices() > 0) {\r\n this._collectMesh(rootNode);\r\n }\r\n\r\n rootNode.getChildMeshes(false).forEach((mesh) => {\r\n if (mesh.getTotalVertices() > 0) {\r\n this._collectMesh(mesh);\r\n }\r\n });\r\n }\r\n\r\n private _collectMesh(mesh: AbstractMesh) {\r\n this.meshes.push(mesh);\r\n\r\n if (mesh.skeleton) {\r\n this.skeletons.add(mesh.skeleton);\r\n }\r\n\r\n if (mesh.morphTargetManager) {\r\n mesh.morphTargetManager.meshName = mesh.name;\r\n mesh.morphTargetManager.numMaxInfluencers = mesh.morphTargetManager.numTargets;\r\n\r\n this.morphTargetManagers.add(mesh.morphTargetManager);\r\n }\r\n }\r\n\r\n /**\r\n * Finds a bone in the avatar's skeletons by its linked transform node or the name of the linked transform node.\r\n * @param nameOrTransformNode The linked transform node or the name of the linked transform node\r\n * @returns The found bone or null if not found\r\n */\r\n public findBoneByTransformNode(nameOrTransformNode: string | TransformNode): Nullable<Bone> {\r\n const isName = !this._isTransformNode(nameOrTransformNode);\r\n const iterator = this.skeletons.keys();\r\n\r\n let bone: Nullable<Bone> = null;\r\n\r\n for (let key = iterator.next(); key.done !== true; key = iterator.next()) {\r\n const skeleton = key.value;\r\n\r\n if (isName) {\r\n bone = skeleton.findBoneFromLinkedTransformNodeName(nameOrTransformNode);\r\n } else {\r\n bone = skeleton.findBoneFromLinkedTransformNode(nameOrTransformNode);\r\n }\r\n\r\n if (bone) {\r\n return bone;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Finds a bone in the avatar's skeletons by its name.\r\n * @param name The name of the bone\r\n * @returns The found bone or null if not found\r\n */\r\n public findBoneByName(name: string): Nullable<Bone> {\r\n const iterator = this.skeletons.keys();\r\n\r\n for (let key = iterator.next(); key.done !== true; key = iterator.next()) {\r\n const skeleton = key.value;\r\n const index = skeleton.getBoneIndexByName(name);\r\n\r\n if (index !== -1) {\r\n return skeleton.bones[index];\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Make sures that the animation group passed as the first parameter will animate the bones in the skeleton(s) / the morphs in the morph target manager(s) of the avatar.\r\n * Retargeting is based on the names of the targets (TransformNode or MorphTarget) in the animation and the names of the bones in the skeleton / morph targets in the morph target manager.\r\n * Note that you can use the mapNodeNames option to specify a mapping between source transform node names and target bone names in case they are different.\r\n * If no bones with the same name as a target (TransformNode) of a targeted animation are found, the targeted animation is removed from the animation group.\r\n * Same for morph targets.\r\n * Note that for the time being, we only support a source animation group which animates transform nodes, not bones!\r\n * That's typically the case when the source animation group is created from a glTF file, as glTF animations always target transform nodes.\r\n * @param sourceAnimationGroup The animation group to retarget\r\n * @param options Options for retargeting the animation group (optional)\r\n * @returns The retargeted (new) animation group\r\n */\r\n public retargetAnimationGroup(sourceAnimationGroup: AnimationGroup, options?: IRetargetOptions): AnimationGroup {\r\n const localOptions: IRetargetOptions = {\r\n animationGroupName: sourceAnimationGroup.name,\r\n fixAnimations: false,\r\n checkHierarchy: false,\r\n retargetAnimationKeys: true,\r\n fixGroundReference: false,\r\n fixGroundReferenceDynamicRefNode: false,\r\n fixRootPosition: true,\r\n ...options,\r\n };\r\n\r\n // Make sure that all world matrices are up to date, both in the bone hierarchy and in the animation transform node hierarchy\r\n this._computeBoneWorldMatrices();\r\n\r\n const mapNodeNames = localOptions.mapNodeNames ?? new Map();\r\n const lstSourceTransformNodes = new Set<TransformNode>();\r\n const sourceTransformNodeNameToNode: TransformNodeNameToNode = new Map();\r\n\r\n for (let i = 0; i < sourceAnimationGroup.targetedAnimations.length; ++i) {\r\n const ta = sourceAnimationGroup.targetedAnimations[i];\r\n if (ta.target.getClassName?.() === \"TransformNode\" && !lstSourceTransformNodes.has(ta.target)) {\r\n const tn = ta.target as TransformNode;\r\n\r\n lstSourceTransformNodes.add(tn);\r\n\r\n sourceTransformNodeNameToNode.set(mapNodeNames.get(tn.name) ?? tn.name, {\r\n node: tn,\r\n initialTransformations: {\r\n position: tn.position.clone(),\r\n scaling: tn.scaling.clone(),\r\n quaternion: tn.rotationQuaternion?.clone(),\r\n rotation: tn.rotation.clone(),\r\n },\r\n });\r\n\r\n if (!tn.rotationQuaternion) {\r\n tn.rotationQuaternion = Quaternion.FromEulerAngles(tn.rotation.x, tn.rotation.y, tn.rotation.z);\r\n tn.rotation.setAll(0);\r\n }\r\n }\r\n }\r\n\r\n lstSourceTransformNodes.forEach((node) => {\r\n node.computeWorldMatrix(true);\r\n });\r\n\r\n // Clone the source animation and retarget it\r\n const animationGroup = sourceAnimationGroup.clone(localOptions.animationGroupName!, undefined, true, true);\r\n\r\n const mapTransformNodeToRootNode: Map<TransformNode, Node> = new Map<TransformNode, Node>();\r\n const lstAnims = new Set<Animation>();\r\n\r\n for (let i = 0; i < animationGroup.targetedAnimations.length; ++i) {\r\n const ta = animationGroup.targetedAnimations[i];\r\n const animation = ta.animation;\r\n\r\n if (lstAnims.has(animation)) {\r\n if (this.showWarnings) {\r\n Logger.Warn(\r\n `RetargetAnimationGroup - Avatar '${this.name}', AnimationGroup '${animationGroup.name}': animation '${animation.name}' is used multiple times in the same animation group: duplicated animations are not supported, the retargeted animation may not work as expected.`\r\n );\r\n }\r\n }\r\n\r\n lstAnims.add(animation);\r\n\r\n switch (animation.targetProperty) {\r\n case \"influence\": {\r\n if (!this._retargetMorphTarget(ta, animationGroup.name)) {\r\n animationGroup.targetedAnimations.splice(i, 1);\r\n i--;\r\n }\r\n break;\r\n }\r\n case \"position\":\r\n case \"rotationQuaternion\":\r\n case \"scaling\": {\r\n if (ta.target.getClassName?.() !== \"TransformNode\") {\r\n break;\r\n }\r\n\r\n const sourceTransformNode = ta.target as TransformNode;\r\n const sourceTransformNodeName = mapNodeNames.get(sourceTransformNode.name) ?? sourceTransformNode.name;\r\n let targetBone = this.findBoneByTransformNode(sourceTransformNodeName);\r\n\r\n if (!targetBone) {\r\n targetBone = this.findBoneByName(sourceTransformNodeName);\r\n }\r\n\r\n if (!targetBone) {\r\n if (this.showWarnings) {\r\n Logger.Warn(\r\n `RetargetAnimationGroup - Avatar '${this.name}', AnimationGroup '${animationGroup.name}': \"${sourceTransformNodeName}\" bone not found in any skeleton of avatar: animation removed.`\r\n );\r\n }\r\n animationGroup.targetedAnimations.splice(i, 1);\r\n i--;\r\n break;\r\n }\r\n\r\n if (\r\n !this._retargetTransformNodeToBone(\r\n ta,\r\n sourceTransformNode,\r\n targetBone,\r\n animationGroup.name,\r\n mapTransformNodeToRootNode,\r\n mapNodeNames,\r\n !!localOptions.checkHierarchy\r\n )\r\n ) {\r\n animationGroup.targetedAnimations.splice(i, 1);\r\n i--;\r\n } else if (localOptions.retargetAnimationKeys) {\r\n this._retargetAnimationKeys(ta.animation, sourceTransformNode, targetBone);\r\n }\r\n\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (localOptions.fixAnimations) {\r\n this._fixAnimationGroup(animationGroup);\r\n }\r\n\r\n if (localOptions.fixGroundReference || localOptions.fixRootPosition) {\r\n const msg =\r\n localOptions.fixGroundReference && localOptions.fixRootPosition\r\n ? \"Ground reference and root position fixing processes skipped.\"\r\n : localOptions.fixGroundReference\r\n ? \"Ground reference fixing process skipped.\"\r\n : \"Root position fixing process skipped.\";\r\n\r\n const res = this._findVerticalAxis(\r\n msg,\r\n animationGroup,\r\n mapNodeNames.get(localOptions.rootNodeName) ?? localOptions.rootNodeName,\r\n sourceTransformNodeNameToNode,\r\n mapNodeNames.get(localOptions.groundReferenceNodeName) ?? localOptions.groundReferenceNodeName,\r\n localOptions.groundReferenceVerticalAxis\r\n );\r\n\r\n if (res) {\r\n const {\r\n verticalAxis,\r\n sourceRootTransformNode,\r\n targetRootTransformNodeOrBone,\r\n targetRootPositionAnimation,\r\n sourceGroundReferenceTransformNode,\r\n targetGroundReferenceTransformNodeOrBone,\r\n proportionRatio,\r\n } = res;\r\n\r\n if (localOptions.fixRootPosition) {\r\n this._fixRootPosition(\r\n sourceAnimationGroup,\r\n animationGroup,\r\n sourceRootTransformNode,\r\n targetRootTransformNodeOrBone,\r\n targetRootPositionAnimation,\r\n proportionRatio\r\n );\r\n this._resetStates(sourceTransformNodeNameToNode);\r\n }\r\n\r\n const fixGroundReferenceDynamicRefNode = !!localOptions.fixGroundReferenceDynamicRefNode;\r\n\r\n if (localOptions.fixGroundReference) {\r\n this._fixGroundReference(\r\n sourceAnimationGroup,\r\n animationGroup,\r\n verticalAxis,\r\n targetRootTransformNodeOrBone,\r\n targetRootPositionAnimation,\r\n sourceGroundReferenceTransformNode,\r\n targetGroundReferenceTransformNodeOrBone,\r\n lstSourceTransformNodes,\r\n mapNodeNames,\r\n fixGroundReferenceDynamicRefNode\r\n );\r\n this._resetStates(sourceTransformNodeNameToNode);\r\n } else if (fixGroundReferenceDynamicRefNode) {\r\n if (this.showWarnings) {\r\n Logger.Warn(\r\n `RetargetAnimationGroup - Avatar '${this.name}', AnimationGroup '${animationGroup.name}': fixGroundReferenceDynamicRefNode option is set to true but fixGroundReference is false: dynamic ground reference node fixing process skipped.`\r\n );\r\n }\r\n }\r\n }\r\n }\r\n\r\n return animationGroup;\r\n }\r\n\r\n /**\r\n * Disposes of the avatar and releases all associated resources.\r\n * This will dispose all skeletons, morph target managers, and the root mesh with its descendants (including materials and textures).\r\n * If disposeResources was set to false in the constructor, this method does nothing.\r\n */\r\n public dispose(): void {\r\n if (!this._disposeResources) {\r\n return;\r\n }\r\n\r\n const iterator = this.skeletons.keys();\r\n for (let key = iterator.next(); key.done !== true; key = iterator.next()) {\r\n key.value.dispose();\r\n }\r\n\r\n const iterator2 = this.morphTargetManagers.keys();\r\n for (let key = iterator2.next(); key.done !== true; key = iterator2.next()) {\r\n key.value.dispose();\r\n }\r\n\r\n this.rootNode?.dispose(false, true);\r\n }\r\n\r\n private _computeBoneWorldMatrices() {\r\n this.skeletons.forEach((skeleton) => {\r\n skeleton.returnToRest();\r\n skeleton.prepare(true);\r\n\r\n skeleton.bones.forEach((bone) => {\r\n bone._linkedTransformNode?.computeWorldMatrix(true);\r\n });\r\n });\r\n }\r\n\r\n private _isTransformNode(nameOrTransformNode: string | TransformNode): nameOrTransformNode is TransformNode {\r\n return typeof nameOrTransformNode !== \"string\";\r\n }\r\n\r\n private _buildMorphTargetMap(): void {\r\n this._mapMorphTargetNameToMorphTarget = new Map<string, MorphTarget>();\r\n\r\n this.morphTargetManagers.forEach((manager) => {\r\n const numTargets = manager.numTargets;\r\n\r\n for (let t = 0; t < numTargets; ++t) {\r\n const target = manager.getTarget(t);\r\n const key = manager.meshName + \"_\" + target.name;\r\n\r\n this._mapMorphTargetNameToMorphTarget.set(key, target);\r\n }\r\n });\r\n }\r\n\r\n private _retargetMorphTarget(ta: TargetedAnimation, animationGroupName: string) {\r\n const morphTarget = ta.target as MorphTarget;\r\n const key = morphTarget.morphTargetManager?.meshName + \"_\" + morphTarget.name;\r\n\r\n if (!this.mapMorphTargetNameToMorphTarget.has(key)) {\r\n if (this.showWarnings) {\r\n Logger.Warn(\r\n `RetargetAnimationGroup - Avatar '${this.name}', AnimationGroup '${animationGroupName}': \"${morphTarget.name}\" morph target not found in morph target manager of mesh \"${morphTarget.morphTargetManager?.meshName}\": animation removed`\r\n );\r\n }\r\n return false;\r\n }\r\n\r\n ta.target = this.mapMorphTargetNameToMorphTarget.get(key)!;\r\n\r\n return true;\r\n }\r\n\r\n private _retargetTransformNodeToBone(\r\n ta: TargetedAnimation,\r\n sourceTransformNode: TransformNode,\r\n targetBone: Bone,\r\n animationGroupName: string,\r\n mapTransformNodeToRootNode: Map<TransformNode, Node>,\r\n mapNodeNames: Map<string, string>,\r\n checkHierarchy: boolean\r\n ) {\r\n if (checkHierarchy) {\r\n let rootNode = mapTransformNodeToRootNode.get(sourceTransformNode);\r\n\r\n if (!rootNode) {\r\n rootNode = this._getRootNode(sourceTransformNode);\r\n mapTransformNodeToRootNode.set(sourceTransformNode, rootNode);\r\n }\r\n\r\n if (!this._checkParentHierarchy(targetBone, rootNode!, mapNodeNames)) {\r\n if (this.showWarnings) {\r\n Logger.Warn(\r\n `RetargetAnimationGroup - Avatar '${this.name}', AnimationGroup '${animationGroupName}': parent hierarchy mismatch between bone \"${targetBone._linkedTransformNode?.name ?? targetBone.name}\" and transform node \"${sourceTransformNode.name}\": animation removed`\r\n );\r\n }\r\n return false;\r\n }\r\n }\r\n\r\n ta.target = targetBone._linkedTransformNode ?? targetBone;\r\n\r\n return true;\r\n }\r\n\r\n private _retargetAnimationKeys(animation: Animation, sourceTransformNode: TransformNode, targetBone: Bone) {\r\n const keys = animation.getKeys();\r\n const targetTransformNode = targetBone._linkedTransformNode;\r\n\r\n let targetWorldMatrix: Matrix;\r\n let targetParentWorldMatrix: DeepImmutableObject<Matrix>;\r\n\r\n if (targetTransformNode) {\r\n targetWorldMatrix = targetTransformNode.getWorldMatrix();\r\n targetParentWorldMatrix = targetTransformNode.parent ? targetTransformNode.parent.getWorldMatrix() : Matrix.IdentityReadOnly;\r\n } else {\r\n targetWorldMatrix = targetBone.getFinalMatrix();\r\n targetParentWorldMatrix = targetBone.parent ? targetBone.parent.getFinalMatrix() : Matrix.IdentityReadOnly;\r\n }\r\n\r\n const targetParentInverseWorldMatrix = targetParentWorldMatrix.invertToRef(TmpVectors.Matrix[0]);\r\n\r\n const sourceInverseWorld = sourceTransformNode.getWorldMatrix().invertToRef(TmpVectors.Matrix[1]);\r\n const sourceParentWorld = sourceTransformNode.parent ? sourceTransformNode.parent.getWorldMatrix() : Matrix.IdentityReadOnly;\r\n\r\n switch (animation.targetProperty) {\r\n case \"rotationQuaternion\": {\r\n for (const key of keys) {\r\n const quaternion = key.value as Quaternion;\r\n\r\n const localMat = Matrix.ComposeToRef(sourceTransformNode.scaling, quaternion, sourceTransformNode.position, TmpVectors.Matrix[2]);\r\n\r\n sourceInverseWorld.multiplyToRef(localMat, localMat).multiplyToRef(sourceParentWorld, localMat);\r\n targetWorldMatrix.multiplyToRef(localMat, localMat).multiplyToRef(targetParentInverseWorldMatrix, localMat).decompose(undefined, quaternion, undefined);\r\n }\r\n break;\r\n }\r\n case \"position\": {\r\n for (const key of keys) {\r\n const position = key.value as Vector3;\r\n\r\n const localMat = Matrix.ComposeToRef(sourceTransformNode.scaling, sourceTransformNode.rotationQuaternion!, position, TmpVectors.Matrix[2]);\r\n\r\n sourceInverseWorld.multiplyToRef(localMat, localMat).multiplyToRef(sourceParentWorld, localMat);\r\n targetWorldMatrix.multiplyToRef(localMat, localMat).multiplyToRef(targetParentInverseWorldMatrix, localMat).decompose(undefined, undefined, position);\r\n }\r\n break;\r\n }\r\n case \"scaling\": {\r\n for (const key of keys) {\r\n const scaling = key.value as Vector3;\r\n\r\n const localMat = Matrix.ComposeToRef(scaling, sourceTransformNode.rotationQuaternion!, sourceTransformNode.position, TmpVectors.Matrix[2]);\r\n\r\n sourceInverseWorld.multiplyToRef(localMat, localMat).multiplyToRef(sourceParentWorld, localMat);\r\n targetWorldMatrix.multiplyToRef(localMat, localMat).multiplyToRef(targetParentInverseWorldMatrix, localMat).decompose(scaling, undefined, undefined);\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * This method corrects quaternion animations when two consecutive quaternions are orthogonal to each other. When this happens, in 99.99% of\r\n * cases it's an error in the animation data, as two consecutive rotations should normally be close to each other and not have a large gap.\r\n * The fix is to copy the first quaternion into the second.\r\n * @param animationGroup The animation group to fix\r\n * @internal\r\n */\r\n private _fixAnimationGroup(animationGroup: AnimationGroup) {\r\n for (let i = 0; i < animationGroup.targetedAnimations.length; ++i) {\r\n const ta = animationGroup.targetedAnimations[i];\r\n\r\n switch (ta.animation.targetProperty) {\r\n case \"rotationQuaternion\": {\r\n const keys = ta.animation.getKeys();\r\n\r\n for (let i = 0; i < keys.length - 1; ++i) {\r\n const curQuat = keys[i].value as Quaternion;\r\n const nextQuat = keys[i + 1].value as Quaternion;\r\n\r\n if (Math.abs(Quaternion.Dot(curQuat, nextQuat)) < 0.001) {\r\n keys[i + 1].value = curQuat.clone();\r\n i += 1;\r\n }\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n private _getRootNode(node: Node): Node {\r\n let current: Node = node;\r\n\r\n while (current.parent) {\r\n current = current.parent;\r\n }\r\n\r\n return current;\r\n }\r\n\r\n /**\r\n * Checks whether the parent hierarchy of a bone matches that of a given transform node. Checks are performed by name.\r\n * It works by first finding the transform node in the descendants of the root transform node that matches the bone's linked transform node.\r\n * Then it traverses up the hierarchy of both the bone and the transform node, comparing their names at each level.\r\n * @param bone The bone to check\r\n * @param rootTransformNode The root transform node to check against\r\n * @returns True if the hierarchies match, false otherwise\r\n * @internal\r\n */\r\n private _checkParentHierarchy(bone: Bone, rootTransformNode: Node, mapNodeNames: Map<string, string>) {\r\n const children = rootTransformNode.getDescendants(false, (node) => (mapNodeNames.get(node.name) ?? node.name) === (bone._linkedTransformNode?.name ?? bone.name));\r\n if (!children || children.length !== 1) {\r\n if (this.showWarnings) {\r\n Logger.Warn(\r\n `RetargetAnimationGroup - Avatar '${this.name}', CheckParentHierarchy: unable to find a corresponding transform node to bone name \"${bone._linkedTransformNode?.name ?? bone.name}\" in the source animation.`\r\n );\r\n }\r\n return false;\r\n }\r\n\r\n let transformNode: Nullable<Node> = children[0];\r\n\r\n while (bone) {\r\n const name = mapNodeNames.get(transformNode?.name ?? \"\") ?? transformNode?.name;\r\n const boneName = bone._linkedTransformNode?.name ?? bone.name;\r\n if (boneName !== name) {\r\n if (this.showWarnings) {\r\n Logger.Warn(`RetargetAnimationGroup - Avatar '${this.name}', CheckParentHierarchy: bone name \"${boneName}\" is different from transform node name \"${name}\".`);\r\n }\r\n return false;\r\n }\r\n\r\n bone = bone.parent;\r\n transformNode = transformNode!.parent;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private _getRootNodeName(rootNodeName: string | undefined, transformNodeNameToNode: TransformNodeNameToNode) {\r\n if (rootNodeName) {\r\n return rootNodeName;\r\n }\r\n\r\n // Look for the first bone that doesn't have a parent\r\n const iterator = this.skeletons.keys();\r\n for (let key = iterator.next(); key.done !== true; key = iterator.next()) {\r\n const skeleton = key.value;\r\n\r\n for (const bone of skeleton.bones) {\r\n if (!bone.parent) {\r\n // Make sure there's a transform node with that name in the source animation\r\n if (transformNodeNameToNode.get(bone.name)) {\r\n return bone.name;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return;\r\n }\r\n\r\n private _findVerticalAxis(\r\n msg: string,\r\n animationGroup: AnimationGroup,\r\n remappedRootNodeName: string | undefined,\r\n sourceTransformNodeNameToNode: TransformNodeNameToNode,\r\n remappedGroundReferenceNodeName?: string,\r\n groundReferenceVerticalAxis?: string\r\n ) {\r\n if (!remappedGroundReferenceNodeName) {\r\n if (this.showWarnings) {\r\n Logger.Warn(\r\n `RetargetAnimationGroup - Avatar '${this.name}', AnimationGroup '${animationGroup.name}': you must provide the name of the ground reference node (option parameter \"groundReferenceNodeName\"). ${msg}`\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n remappedRootNodeName = this._getRootNodeName(remappedRootNodeName, sourceTransformNodeNameToNode);\r\n\r\n if (!remappedRootNodeName) {\r\n if (this.showWarnings) {\r\n Logger.Warn(\r\n `RetargetAnimationGroup - Avatar '${this.name}', AnimationGroup '${animationGroup.name}': unable to find a suitable root node in the source animation. You should provide its name through the \"rootNodeName\" optional parameter. ${msg}`\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n const sourceRootTransformNode = sourceTransformNodeNameToNode.get(remappedRootNodeName)?.node;\r\n const sourceGroundReferenceTransformNode = sourceTransformNodeNameToNode.get(remappedGroundReferenceNodeName)?.node;\r\n\r\n if (!sourceRootTransformNode) {\r\n if (this.showWarnings) {\r\n Logger.Warn(\r\n `RetargetAnimationGroup - Avatar '${this.name}', AnimationGroup '${animationGroup.name}': unable to find the transform node corresponding to \"${remappedRootNodeName}\" in the source animation. This transform node either doesn't exist or is not animated. ${msg}`\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n if (!sourceGroundReferenceTransformNode) {\r\n if (this.showWarnings) {\r\n Logger.Warn(\r\n `RetargetAnimationGroup - Avatar '${this.name}', AnimationGroup '${animationGroup.name}': unable to find the transform node corresponding to \"${remappedGroundReferenceNodeName}\" in the source animation. This transform node either doesn't exist or is not animated. ${msg}`\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n // Look for the position animation + target node of the root node name (generally the hips) in the retargeted animation\r\n let targetRootPositionAnimation: Animation | undefined;\r\n let targetRootTransformNodeOrBone: TransformNode | Bone | undefined;\r\n\r\n for (let i = 0; i < animationGroup.targetedAnimations.length; ++i) {\r\n const ta = animationGroup.targetedAnimations[i];\r\n const target = ta.target;\r\n const animation = ta.animation;\r\n\r\n if (target.name === remappedRootNodeName && animation.targetProperty === \"position\") {\r\n targetRootPositionAnimation = animation;\r\n targetRootTransformNodeOrBone = ta.target;\r\n break;\r\n }\r\n }\r\n\r\n if (!targetRootPositionAnimation || !targetRootTransformNodeOrBone) {\r\n if (this.showWarnings) {\r\n Logger.Warn(\r\n `RetargetAnimationGroup - Avatar '${this.name}', AnimationGroup '${animationGroup.name}': unable to find a \"position\" animation for the node \"${remappedRootNodeName}\". ${msg}`\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n let targetGroundReferenceTransformNodeOrBone: Nullable<TransformNode | Bone> = null;\r\n\r\n if (targetRootTransformNodeOrBone instanceof TransformNode) {\r\n targetGroundReferenceTransformNodeOrBone = this.findBoneByTransformNode(remappedGroundReferenceNodeName)?._linkedTransformNode!;\r\n } else {\r\n targetGroundReferenceTransformNodeOrBone = this.findBoneByName(remappedGroundReferenceNodeName);\r\n }\r\n\r\n if (!targetGroundReferenceTransformNodeOrBone) {\r\n if (this.showWarnings) {\r\n Logger.Warn(\r\n `RetargetAnimationGroup - Avatar '${this.name}', AnimationGroup '${animationGroup.name}': unable to find the bone/transform node corresponding with name \"${remappedGroundReferenceNodeName}\" in the avatar skeleton. Ensure that this bone exists. ${msg}`\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n sourceRootTransformNode.computeWorldMatrix(true);\r\n sourceGroundReferenceTransformNode.computeWorldMatrix(true);\r\n\r\n // Determine the vertical axis\r\n const sourceRootGroundReferenceDiff = sourceRootTransformNode.getAbsolutePosition().subtract(sourceGroundReferenceTransformNode.getAbsolutePosition());\r\n\r\n let verticalAxis = 0;\r\n\r\n if (groundReferenceVerticalAxis) {\r\n switch (groundReferenceVerticalAxis) {\r\n case \"Y\":\r\n verticalAxis = 1;\r\n break;\r\n case \"Z\":\r\n verticalAxis = 2;\r\n break;\r\n }\r\n } else {\r\n // No axis provided: assume the vertical axis is the one with the larger difference between the reference and the ground reference transform nodes\r\n if (Math.abs(sourceRootGroundReferenceDiff.y) > Math.abs(sourceRootGroundReferenceDiff.x)) {\r\n verticalAxis = 1;\r\n }\r\n if (Math.abs(sourceRootGroundReferenceDiff.z) > Math.abs(sourceRootGroundReferenceDiff.y)) {\r\n verticalAxis = 2;\r\n }\r\n }\r\n\r\n const targetRootGroundReferenceDiff = targetRootTransformNodeOrBone.getAbsolutePosition().subtract(targetGroundReferenceTransformNodeOrBone.getAbsolutePosition());\r\n\r\n return {\r\n verticalAxis,\r\n sourceRootTransformNode,\r\n sourceGroundReferenceTransformNode,\r\n targetRootTransformNodeOrBone,\r\n targetRootPositionAnimation,\r\n targetGroundReferenceTransformNodeOrBone,\r\n proportionRatio:\r\n verticalAxis === 0\r\n ? targetRootGroundReferenceDiff.x / sourceRootGroundReferenceDiff.x\r\n : verticalAxis === 1\r\n ? targetRootGroundReferenceDiff.y / sourceRootGroundReferenceDiff.y\r\n : targetRootGroundReferenceDiff.z / sourceRootGroundReferenceDiff.z,\r\n };\r\n }\r\n\r\n private _resetStates(sourceTransformNodeNameToNode: TransformNodeNameToNode) {\r\n this.skeletons.forEach((skeleton) => skeleton.returnToRest());\r\n\r\n sourceTransformNodeNameToNode.forEach((data) => {\r\n const { node, initialTransformations } = data;\r\n node.position.copyFrom(initialTransformations.position);\r\n node.scaling.copyFrom(initialTransformations.scaling);\r\n if (initialTransformations.quaternion) {\r\n node.rotationQuaternion!.copyFrom(initialTransformations.quaternion);\r\n } else {\r\n node.rotation.copyFrom(initialTransformations.rotation);\r\n }\r\n node.computeWorldMatrix(true);\r\n });\r\n }\r\n\r\n private _fixRootPosition(\r\n sourceAnimationGroup: AnimationGroup,\r\n animationGroup: AnimationGroup,\r\n sourceRootTransformNode: TransformNode,\r\n targetRootTransformNodeOrBone: TransformNode | Bone,\r\n targetRootPositionAnimation: Animation,\r\n proportionRatio: number\r\n ) {\r\n const targetNodeInverseParentWorldMatrix =\r\n targetRootTransformNodeOrBone instanceof TransformNode\r\n ? (targetRootTransformNodeOrBone.parent?.getWorldMatrix().invertToRef(TmpVectors.Matrix[0]) ?? Matrix.IdentityReadOnly)\r\n : (targetRootTransformNodeOrBone.parent?.getFinalMatrix().invertToRef(TmpVectors.Matrix[0]) ?? Matrix.IdentityReadOnly);\r\n\r\n sourceRootTransformNode.computeWorldMatrix(true);\r\n targetRootTransformNodeOrBone.computeWorldMatrix(true);\r\n\r\n const sourceWorldPosition = sourceRootTransformNode.absolutePosition.clone();\r\n const targetWorldPosition = targetRootTransformNodeOrBone.getAbsolutePosition().clone();\r\n\r\n sourceAnimationGroup.play(false);\r\n animationGroup.play(false);\r\n\r\n // Loop over the position animation of the root transform node\r\n for (const key of targetRootPositionAnimation.getKeys()) {\r\n const frame = key.frame;\r\n\r\n // Advance the source and retargeted animations to this frame\r\n sourceAnimationGroup.goToFrame(frame);\r\n sourceAnimationGroup.pause();\r\n\r\n animationGroup.goToFrame(frame);\r\n animationGroup.pause();\r\n\r\n sourceRootTransformNode.computeWorldMatrix(true);\r\n\r\n const offset = sourceRootTransformNode.absolutePosition.subtractToRef(sourceWorldPosition, TmpVectors.Vector3[0]);\r\n\r\n offset.scaleInPlace(proportionRatio);\r\n offset.addInPlace(targetWorldPosition);\r\n\r\n Vector3.TransformNormalToRef(offset, targetNodeInverseParentWorldMatrix, key.value);\r\n }\r\n\r\n sourceAnimationGroup.stop();\r\n animationGroup.stop();\r\n }\r\n\r\n private _fixGroundReference(\r\n sourceAnimationGroup: AnimationGroup,\r\n animationGroup: AnimationGroup,\r\n verticalAxis: number,\r\n targetRootTransformNodeOrBone: TransformNode | Bone,\r\n targetRootPositionAnimation: Animation,\r\n sourceGroundReferenceTransformNode: TransformNode,\r\n targetGroundReferenceTransformNodeOrBone: TransformNode | Bone,\r\n sourceListTransformNodes: Set<TransformNode>,\r\n mapNodeNames: Map<string, string>,\r\n fixGroundReferenceDynamicRefNode: boolean\r\n ) {\r\n const targetNodeInverseParentWorldMatrix =\r\n targetRootTransformNodeOrBone instanceof TransformNode\r\n ? (targetRootTransformNodeOrBone.parent?.getWorldMatrix().invertToRef(TmpVectors.Matrix[0]) ?? Matrix.IdentityReadOnly)\r\n : (targetRootTransformNodeOrBone.parent?.getFinalMatrix().invertToRef(TmpVectors.Matrix[0]) ?? Matrix.IdentityReadOnly);\r\n\r\n sourceAnimationGroup.play(false);\r\n animationGroup.play(false);\r\n\r\n // Loop over the position animation of the root transform node\r\n for (const key of targetRootPositionAnimation.getKeys()) {\r\n const frame = key.frame;\r\n\r\n // Advance the source and retargeted animations to this frame\r\n sourceAnimationGroup.goToFrame(frame);\r\n sourceAnimationGroup.pause();\r\n\r\n animationGroup.goToFrame(frame);\r\n animationGroup.pause();\r\n\r\n sourceGroundReferenceTransformNode.computeWorldMatrix(true);\r\n targetGroundReferenceTransformNodeOrBone.computeWorldMatrix(true);\r\n\r\n // Calculate the offset to apply to the root position in the target to have the ground reference at the same height in the source and target animations\r\n const diffGroundReferences = targetGroundReferenceTransformNodeOrBone\r\n .getAbsolutePosition()\r\n .subtractToRef(sourceGroundReferenceTransformNode.absolutePosition, TmpVectors.Vector3[0]);\r\n\r\n let groundReferenceOffset = verticalAxis === 0 ? diffGroundReferences.x : verticalAxis === 1 ? diffGroundReferences.y : diffGroundReferences.z;\r\n\r\n if (fixGroundReferenceDynamicRefNode) {\r\n // Try to find a bone in this frame that has a greater offset than the ground reference, to use it instead of the ground reference.\r\n const targetRootToGroundReferenceDiff = targetRootTransformNodeOrBone\r\n .getAbsolutePosition()\r\n .subtractToRef(targetGroundReferenceTransformNodeOrBone.getAbsolutePosition(), TmpVectors.Vector3[0]);\r\n\r\n const targetRootToGroundReferenceOffset =\r\n verticalAxis === 0 ? targetRootToGroundReferenceDiff.x : verticalAxis === 1 ? targetRootToGroundReferenceDiff.y : targetRootToGroundReferenceDiff.z;\r\n\r\n const iterator = sourceListTransformNodes.keys();\r\n\r\n for (let key = iterator.next(); key.done !== true; key = iterator.next()) {\r\n const sourceTransformNode = key.value;\r\n if (sourceTransformNode === sourceGroundReferenceTransformNode) {\r\n continue;\r\n }\r\n\r\n const targetNodeName = mapNodeNames.get(sourceTransformNode.name) ?? sourceTransformNode.name;\r\n\r\n let targetBone = this.findBoneByTransformNode(targetNodeName);\r\n if (!targetBone) {\r\n targetBone = this.findBoneByName(targetNodeName);\r\n }\r\n if (!targetBone) {\r\n continue;\r\n }\r\n\r\n sourceTransformNode.computeWorldMatrix();\r\n targetBone.computeWorldMatrix();\r\n\r\n const targetBoneWorldPosition = targetBone._linkedTransformNode?.getAbsolutePosition() ?? targetBone.getAbsolutePosition();\r\n const targetRootToBoneDiff = targetRootTransformNodeOrBone.getAbsolutePosition().subtractToRef(targetBoneWorldPosition, TmpVectors.Vector3[0]);\r\n const rootToBoneOffset = verticalAxis === 0 ? targetRootToBoneDiff.x : verticalAxis === 1 ? targetRootToBoneDiff.y : targetRootToBoneDiff.z;\r\n\r\n if (Math.abs(rootToBoneOffset) > Math.abs(targetRootToGroundReferenceOffset) && Math.sign(rootToBoneOffset) === Math.sign(targetRootToGroundReferenceOffset)) {\r\n const diff = targetBoneWorldPosition.subtractToRef(sourceTransformNode.getAbsolutePosition(), TmpVectors.Vector3[0]);\r\n const offset = verticalAxis === 0 ? diff.x : verticalAxis === 1 ? diff.y : diff.z;\r\n\r\n groundReferenceOffset = offset;\r\n }\r\n }\r\n }\r\n\r\n const localOffset = Vector3.TransformNormalToRef(\r\n new Vector3(verticalAxis === 0 ? groundReferenceOffset : 0, verticalAxis === 1 ? groundReferenceOffset : 0, verticalAxis === 2 ? groundReferenceOffset : 0),\r\n targetNodeInverseParentWorldMatrix,\r\n TmpVectors.Vector3[1]\r\n );\r\n\r\n key.value.subtractInPlace(localOffset);\r\n }\r\n\r\n sourceAnimationGroup.stop();\r\n animationGroup.stop();\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"animatorAvatar.js","sourceRoot":"","sources":["../../../../dev/core/src/Animations/animatorAvatar.ts"],"names":[],"mappings":"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","sourcesContent":["import type { MorphTargetManager, Immutable, Bone, Nullable, MorphTarget, AnimationGroup, Animation, Node, Skeleton, TargetedAnimation, DeepImmutableObject } from \"core/index\";\r\nimport { Vector3, Quaternion, TmpVectors, Matrix } from \"core/Maths/math.vector\";\r\nimport { Logger } from \"../Misc/logger\";\r\nimport { TransformNode } from \"../Meshes/transformNode\";\r\nimport { AbstractMesh } from \"../Meshes/abstractMesh\";\r\n\r\n/**\r\n * Options for retargeting an animation group to an avatar.\r\n */\r\nexport interface IRetargetOptions {\r\n /**\r\n * The name to assign to the (cloned) retargeted animation group.\r\n * If not specified, the same name as the original animation group will be used.\r\n */\r\n animationGroupName?: string;\r\n\r\n /**\r\n * If true, the retargeted animations will be fixed to correct common issues like orthogonal quaternions.\r\n * Default is false.\r\n */\r\n fixAnimations?: boolean;\r\n\r\n /**\r\n * If true, the parent hierarchy of bones and transform nodes will be checked during retargeting.\r\n * Animations will be removed if the hierarchies don't match.\r\n * Default is false.\r\n */\r\n checkHierarchy?: boolean;\r\n\r\n /**\r\n * If true, the frame values in the animation keyframes will be adjusted during retargeting to account for differences\r\n * between the source and target bone transforms.\r\n * Default is true.\r\n */\r\n retargetAnimationKeys?: boolean;\r\n\r\n /**\r\n * If true, scales and adjusts the root position animation to account for size differences between the source and target avatars.\r\n * This helps maintain the relative motion of the character when retargeting between avatars of different proportions.\r\n * Default is true.\r\n */\r\n fixRootPosition?: boolean;\r\n\r\n /**\r\n * If true, adjusts the root position animation to correct for ground reference height differences between the source and target avatars.\r\n * This ensures that the animated character maintains proper contact with the ground during retargeting.\r\n * Requires groundReferenceNodeName to be specified to determine the ground reference point in the source animation.\r\n * Default is false.\r\n */\r\n fixGroundReference?: boolean;\r\n\r\n /**\r\n * If true, adjusts the ground reference dynamically during retargeting. fixGroundReference must be true for this to work.\r\n * When enabled, the system will continuously adjust the ground reference point throughout the retargeting process to make sure it's the lowest point of the character.\r\n * This allows for more accurate ground contact correction, especially in animations where groundReferenceNodeName is not always the lowest point (e.g., walking, running).\r\n * Default is false.\r\n */\r\n fixGroundReferenceDynamicRefNode?: boolean;\r\n\r\n /**\r\n * The name of the root transform node in the source animation group (typically \"Hips\" or similar).\r\n * If not specified, the system will attempt to automatically find the first bone without a parent.\r\n * This bone is used as a reference point for fixing root position during retargeting.\r\n * It's also used by the ground reference fixing processing.\r\n */\r\n rootNodeName?: string;\r\n\r\n /**\r\n * The name of the transform node in the source animation group used as a ground reference point (typically a foot bone like \"LeftFoot\" or \"RightFoot\").\r\n * This bone is used to determine the vertical offset needed to maintain proper ground contact during retargeting.\r\n * Required when fixGroundReference or fixRootPosition is enabled.\r\n */\r\n groundReferenceNodeName?: string;\r\n\r\n /**\r\n * Specifies which axis represents the vertical/up direction in the animation space.\r\n * Use \"X\", \"Y\", or \"Z\" to explicitly set the vertical axis, or \"\" (empty string) / undefined to auto-detect.\r\n * If not specified or empty, the system will automatically determine the vertical axis based on the difference\r\n * between the root node and ground reference node positions.\r\n * Default is undefined (auto-detect).\r\n */\r\n groundReferenceVerticalAxis?: \"\" | \"X\" | \"Y\" | \"Z\";\r\n\r\n /**\r\n * A map for renaming nodes during retargeting when the source transform node hierarchy and target skeleton use different naming conventions.\r\n * The map keys are the original node names from the source animation group, and the values are the corresponding\r\n * node names in the target skeleton. This is useful when bone names don't match between avatars.\r\n */\r\n mapNodeNames?: Map<string, string>;\r\n}\r\n\r\ntype TransformNodeNameToNode = Map<string, { node: TransformNode; initialTransformations: { position: Vector3; scaling: Vector3; quaternion?: Quaternion; rotation: Vector3 } }>;\r\n\r\n/**\r\n * Represents an animator avatar that manages meshes, skeletons and morph target managers for a hierarchical transform node and mesh structure.\r\n * This class is used to group and manage animation-related resources (meshes, skeletons and morph targets) associated with a root transform node and its descendants.\r\n */\r\nexport class AnimatorAvatar {\r\n /**\r\n * List of meshes found in the hierarchy of the root node. Only meshes with at least one vertex are included.\r\n */\r\n public meshes: AbstractMesh[];\r\n\r\n /**\r\n * Set of skeletons found in the mesh hierarchy.\r\n */\r\n public skeletons: Set<Skeleton>;\r\n\r\n /**\r\n * Set of morph target managers found in the mesh hierarchy.\r\n * Each morph target manager is configured with the appropriate mesh name and influencer count.\r\n */\r\n public morphTargetManagers: Set<MorphTargetManager>;\r\n\r\n private _mapMorphTargetNameToMorphTarget: Map<string, MorphTarget>;\r\n /**\r\n * Map of morph target names to their corresponding MorphTarget instances.\r\n * The keys are constructed using the format \"meshName_morphTargetName\".\r\n */\r\n public get mapMorphTargetNameToMorphTarget(): Immutable<Map<string, MorphTarget>> {\r\n if (!this._mapMorphTargetNameToMorphTarget) {\r\n this._buildMorphTargetMap();\r\n }\r\n return this._mapMorphTargetNameToMorphTarget;\r\n }\r\n\r\n /**\r\n * Indicates whether to show warnings during retargeting operations.\r\n */\r\n public showWarnings = true;\r\n\r\n /**\r\n * Creates an instance of AnimatorAvatar.\r\n * @param name - The name to assign to this avatar and its root node\r\n * @param rootNode - The root node of the avatar hierarchy. This node and its descendants will be scanned for meshes, skeletons and morph target managers. If not provided, you are expected to manually manage meshes, skeletons and morph target managers.\r\n * @param _disposeResources - Indicates whether to dispose of resources (meshes, skeletons, morph target managers, root node and descendants + materials and textures) when the avatar is disposed (true by default)\r\n * @param setAvatarName - Indicates whether to set the name of the root node to the avatar name. Default is true. Set this to false if you don't want the root node to be renamed, or if you want to set it to a different name after creating the avatar.\r\n */\r\n constructor(\r\n public readonly name: string,\r\n public readonly rootNode?: TransformNode,\r\n private _disposeResources = true,\r\n setAvatarName = true\r\n ) {\r\n this.meshes = [];\r\n this.skeletons = new Set<Skeleton>();\r\n this.morphTargetManagers = new Set<MorphTargetManager>();\r\n\r\n if (!rootNode) {\r\n return;\r\n }\r\n\r\n if (setAvatarName) {\r\n rootNode.name = name;\r\n }\r\n\r\n if (rootNode instanceof AbstractMesh && rootNode.getTotalVertices() > 0) {\r\n this._collectMesh(rootNode);\r\n }\r\n\r\n rootNode.getChildMeshes(false).forEach((mesh) => {\r\n if (mesh.getTotalVertices() > 0) {\r\n this._collectMesh(mesh);\r\n }\r\n });\r\n }\r\n\r\n private _collectMesh(mesh: AbstractMesh) {\r\n this.meshes.push(mesh);\r\n\r\n if (mesh.skeleton) {\r\n this.skeletons.add(mesh.skeleton);\r\n }\r\n\r\n if (mesh.morphTargetManager) {\r\n mesh.morphTargetManager.meshName = mesh.name;\r\n mesh.morphTargetManager.numMaxInfluencers = mesh.morphTargetManager.numTargets;\r\n\r\n this.morphTargetManagers.add(mesh.morphTargetManager);\r\n }\r\n }\r\n\r\n /**\r\n * Finds a bone in the avatar's skeletons by its linked transform node or the name of the linked transform node.\r\n * @param nameOrTransformNode The linked transform node or the name of the linked transform node\r\n * @returns The found bone or null if not found\r\n */\r\n public findBoneByTransformNode(nameOrTransformNode: string | TransformNode): Nullable<Bone> {\r\n const isName = !this._isTransformNode(nameOrTransformNode);\r\n const iterator = this.skeletons.keys();\r\n\r\n let bone: Nullable<Bone>;\r\n\r\n for (let key = iterator.next(); key.done !== true; key = iterator.next()) {\r\n const skeleton = key.value;\r\n\r\n if (isName) {\r\n bone = skeleton.findBoneFromLinkedTransformNodeName(nameOrTransformNode);\r\n } else {\r\n bone = skeleton.findBoneFromLinkedTransformNode(nameOrTransformNode);\r\n }\r\n\r\n if (bone) {\r\n return bone;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Finds a bone in the avatar's skeletons by its name.\r\n * @param name The name of the bone\r\n * @returns The found bone or null if not found\r\n */\r\n public findBoneByName(name: string): Nullable<Bone> {\r\n const iterator = this.skeletons.keys();\r\n\r\n for (let key = iterator.next(); key.done !== true; key = iterator.next()) {\r\n const skeleton = key.value;\r\n const index = skeleton.getBoneIndexByName(name);\r\n\r\n if (index !== -1) {\r\n return skeleton.bones[index];\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Make sures that the animation group passed as the first parameter will animate the bones in the skeleton(s) / the morphs in the morph target manager(s) of the avatar.\r\n * Retargeting is based on the names of the targets (TransformNode or MorphTarget) in the animation and the names of the bones in the skeleton / morph targets in the morph target manager.\r\n * Note that you can use the mapNodeNames option to specify a mapping between source transform node names and target bone names in case they are different.\r\n * If no bones with the same name as a target (TransformNode) of a targeted animation are found, the targeted animation is removed from the animation group.\r\n * Same for morph targets.\r\n * Note that for the time being, we only support a source animation group which animates transform nodes, not bones!\r\n * That's typically the case when the source animation group is created from a glTF file, as glTF animations always target transform nodes.\r\n * @param sourceAnimationGroup The animation group to retarget\r\n * @param options Options for retargeting the animation group (optional)\r\n * @returns The retargeted (new) animation group\r\n */\r\n public retargetAnimationGroup(sourceAnimationGroup: AnimationGroup, options?: IRetargetOptions): AnimationGroup {\r\n const localOptions: IRetargetOptions = {\r\n animationGroupName: sourceAnimationGroup.name,\r\n fixAnimations: false,\r\n checkHierarchy: false,\r\n retargetAnimationKeys: true,\r\n fixGroundReference: false,\r\n fixGroundReferenceDynamicRefNode: false,\r\n fixRootPosition: true,\r\n ...options,\r\n };\r\n\r\n // Make sure that all world matrices are up to date, both in the bone hierarchy and in the animation transform node hierarchy\r\n this._computeBoneWorldMatrices();\r\n\r\n const mapNodeNames = localOptions.mapNodeNames ?? new Map();\r\n const lstSourceTransformNodes = new Set<TransformNode>();\r\n const sourceTransformNodeNameToNode: TransformNodeNameToNode = new Map();\r\n\r\n for (let i = 0; i < sourceAnimationGroup.targetedAnimations.length; ++i) {\r\n const ta = sourceAnimationGroup.targetedAnimations[i];\r\n if (ta.target.getClassName?.() === \"TransformNode\" && !lstSourceTransformNodes.has(ta.target)) {\r\n const tn = ta.target as TransformNode;\r\n\r\n lstSourceTransformNodes.add(tn);\r\n\r\n sourceTransformNodeNameToNode.set(mapNodeNames.get(tn.name) ?? tn.name, {\r\n node: tn,\r\n initialTransformations: {\r\n position: tn.position.clone(),\r\n scaling: tn.scaling.clone(),\r\n quaternion: tn.rotationQuaternion?.clone(),\r\n rotation: tn.rotation.clone(),\r\n },\r\n });\r\n\r\n if (!tn.rotationQuaternion) {\r\n tn.rotationQuaternion = Quaternion.FromEulerAngles(tn.rotation.x, tn.rotation.y, tn.rotation.z);\r\n tn.rotation.setAll(0);\r\n }\r\n }\r\n }\r\n\r\n lstSourceTransformNodes.forEach((node) => {\r\n node.computeWorldMatrix(true);\r\n });\r\n\r\n // Clone the source animation and retarget it\r\n const animationGroup = sourceAnimationGroup.clone(localOptions.animationGroupName!, undefined, true, true);\r\n\r\n const mapTransformNodeToRootNode: Map<TransformNode, Node> = new Map<TransformNode, Node>();\r\n const lstAnims = new Set<Animation>();\r\n\r\n for (let i = 0; i < animationGroup.targetedAnimations.length; ++i) {\r\n const ta = animationGroup.targetedAnimations[i];\r\n const animation = ta.animation;\r\n\r\n if (lstAnims.has(animation)) {\r\n if (this.showWarnings) {\r\n Logger.Warn(\r\n `RetargetAnimationGroup - Avatar '${this.name}', AnimationGroup '${animationGroup.name}': animation '${animation.name}' is used multiple times in the same animation group: duplicated animations are not supported, the retargeted animation may not work as expected.`\r\n );\r\n }\r\n }\r\n\r\n lstAnims.add(animation);\r\n\r\n switch (animation.targetProperty) {\r\n case \"influence\": {\r\n if (!this._retargetMorphTarget(ta, animationGroup.name)) {\r\n animationGroup.targetedAnimations.splice(i, 1);\r\n i--;\r\n }\r\n break;\r\n }\r\n case \"position\":\r\n case \"rotationQuaternion\":\r\n case \"scaling\": {\r\n if (ta.target.getClassName?.() !== \"TransformNode\") {\r\n break;\r\n }\r\n\r\n const sourceTransformNode = ta.target as TransformNode;\r\n const sourceTransformNodeName = mapNodeNames.get(sourceTransformNode.name) ?? sourceTransformNode.name;\r\n let targetBone = this.findBoneByTransformNode(sourceTransformNodeName);\r\n\r\n if (!targetBone) {\r\n targetBone = this.findBoneByName(sourceTransformNodeName);\r\n }\r\n\r\n if (!targetBone) {\r\n if (this.showWarnings) {\r\n Logger.Warn(\r\n `RetargetAnimationGroup - Avatar '${this.name}', AnimationGroup '${animationGroup.name}': \"${sourceTransformNodeName}\" bone not found in any skeleton of avatar: animation removed.`\r\n );\r\n }\r\n animationGroup.targetedAnimations.splice(i, 1);\r\n i--;\r\n break;\r\n }\r\n\r\n if (\r\n !this._retargetTransformNodeToBone(\r\n ta,\r\n sourceTransformNode,\r\n targetBone,\r\n animationGroup.name,\r\n mapTransformNodeToRootNode,\r\n mapNodeNames,\r\n !!localOptions.checkHierarchy\r\n )\r\n ) {\r\n animationGroup.targetedAnimations.splice(i, 1);\r\n i--;\r\n } else if (localOptions.retargetAnimationKeys) {\r\n this._retargetAnimationKeys(ta.animation, sourceTransformNode, targetBone);\r\n }\r\n\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (localOptions.fixAnimations) {\r\n this._fixAnimationGroup(animationGroup);\r\n }\r\n\r\n if (localOptions.fixGroundReference || localOptions.fixRootPosition) {\r\n const msg =\r\n localOptions.fixGroundReference && localOptions.fixRootPosition\r\n ? \"Ground reference and root position fixing processes skipped.\"\r\n : localOptions.fixGroundReference\r\n ? \"Ground reference fixing process skipped.\"\r\n : \"Root position fixing process skipped.\";\r\n\r\n const res = this._findVerticalAxis(\r\n msg,\r\n animationGroup,\r\n mapNodeNames.get(localOptions.rootNodeName) ?? localOptions.rootNodeName,\r\n sourceTransformNodeNameToNode,\r\n mapNodeNames.get(localOptions.groundReferenceNodeName) ?? localOptions.groundReferenceNodeName,\r\n localOptions.groundReferenceVerticalAxis\r\n );\r\n\r\n if (res) {\r\n const {\r\n verticalAxis,\r\n sourceRootTransformNode,\r\n targetRootTransformNodeOrBone,\r\n targetRootPositionAnimation,\r\n sourceGroundReferenceTransformNode,\r\n targetGroundReferenceTransformNodeOrBone,\r\n proportionRatio,\r\n } = res;\r\n\r\n if (localOptions.fixRootPosition) {\r\n this._fixRootPosition(\r\n sourceAnimationGroup,\r\n animationGroup,\r\n sourceRootTransformNode,\r\n targetRootTransformNodeOrBone,\r\n targetRootPositionAnimation,\r\n proportionRatio\r\n );\r\n this._resetStates(sourceTransformNodeNameToNode);\r\n }\r\n\r\n const fixGroundReferenceDynamicRefNode = !!localOptions.fixGroundReferenceDynamicRefNode;\r\n\r\n if (localOptions.fixGroundReference) {\r\n this._fixGroundReference(\r\n sourceAnimationGroup,\r\n animationGroup,\r\n verticalAxis,\r\n targetRootTransformNodeOrBone,\r\n targetRootPositionAnimation,\r\n sourceGroundReferenceTransformNode,\r\n targetGroundReferenceTransformNodeOrBone,\r\n lstSourceTransformNodes,\r\n mapNodeNames,\r\n fixGroundReferenceDynamicRefNode\r\n );\r\n this._resetStates(sourceTransformNodeNameToNode);\r\n } else if (fixGroundReferenceDynamicRefNode) {\r\n if (this.showWarnings) {\r\n Logger.Warn(\r\n `RetargetAnimationGroup - Avatar '${this.name}', AnimationGroup '${animationGroup.name}': fixGroundReferenceDynamicRefNode option is set to true but fixGroundReference is false: dynamic ground reference node fixing process skipped.`\r\n );\r\n }\r\n }\r\n }\r\n }\r\n\r\n return animationGroup;\r\n }\r\n\r\n /**\r\n * Disposes of the avatar and releases all associated resources.\r\n * This will dispose all skeletons, morph target managers, and the root mesh with its descendants (including materials and textures).\r\n * If disposeResources was set to false in the constructor, this method does nothing.\r\n */\r\n public dispose(): void {\r\n if (!this._disposeResources) {\r\n return;\r\n }\r\n\r\n const iterator = this.skeletons.keys();\r\n for (let key = iterator.next(); key.done !== true; key = iterator.next()) {\r\n key.value.dispose();\r\n }\r\n\r\n const iterator2 = this.morphTargetManagers.keys();\r\n for (let key = iterator2.next(); key.done !== true; key = iterator2.next()) {\r\n key.value.dispose();\r\n }\r\n\r\n this.rootNode?.dispose(false, true);\r\n }\r\n\r\n private _computeBoneWorldMatrices() {\r\n this.skeletons.forEach((skeleton) => {\r\n skeleton.returnToRest();\r\n skeleton.prepare(true);\r\n\r\n skeleton.bones.forEach((bone) => {\r\n bone._linkedTransformNode?.computeWorldMatrix(true);\r\n });\r\n });\r\n }\r\n\r\n private _isTransformNode(nameOrTransformNode: string | TransformNode): nameOrTransformNode is TransformNode {\r\n return typeof nameOrTransformNode !== \"string\";\r\n }\r\n\r\n private _buildMorphTargetMap(): void {\r\n this._mapMorphTargetNameToMorphTarget = new Map<string, MorphTarget>();\r\n\r\n this.morphTargetManagers.forEach((manager) => {\r\n const numTargets = manager.numTargets;\r\n\r\n for (let t = 0; t < numTargets; ++t) {\r\n const target = manager.getTarget(t);\r\n const key = manager.meshName + \"_\" + target.name;\r\n\r\n this._mapMorphTargetNameToMorphTarget.set(key, target);\r\n }\r\n });\r\n }\r\n\r\n private _retargetMorphTarget(ta: TargetedAnimation, animationGroupName: string) {\r\n const morphTarget = ta.target as MorphTarget;\r\n const key = morphTarget.morphTargetManager?.meshName + \"_\" + morphTarget.name;\r\n\r\n if (!this.mapMorphTargetNameToMorphTarget.has(key)) {\r\n if (this.showWarnings) {\r\n Logger.Warn(\r\n `RetargetAnimationGroup - Avatar '${this.name}', AnimationGroup '${animationGroupName}': \"${morphTarget.name}\" morph target not found in morph target manager of mesh \"${morphTarget.morphTargetManager?.meshName}\": animation removed`\r\n );\r\n }\r\n return false;\r\n }\r\n\r\n ta.target = this.mapMorphTargetNameToMorphTarget.get(key)!;\r\n\r\n return true;\r\n }\r\n\r\n private _retargetTransformNodeToBone(\r\n ta: TargetedAnimation,\r\n sourceTransformNode: TransformNode,\r\n targetBone: Bone,\r\n animationGroupName: string,\r\n mapTransformNodeToRootNode: Map<TransformNode, Node>,\r\n mapNodeNames: Map<string, string>,\r\n checkHierarchy: boolean\r\n ) {\r\n if (checkHierarchy) {\r\n let rootNode = mapTransformNodeToRootNode.get(sourceTransformNode);\r\n\r\n if (!rootNode) {\r\n rootNode = this._getRootNode(sourceTransformNode);\r\n mapTransformNodeToRootNode.set(sourceTransformNode, rootNode);\r\n }\r\n\r\n if (!this._checkParentHierarchy(targetBone, rootNode!, mapNodeNames)) {\r\n if (this.showWarnings) {\r\n Logger.Warn(\r\n `RetargetAnimationGroup - Avatar '${this.name}', AnimationGroup '${animationGroupName}': parent hierarchy mismatch between bone \"${targetBone._linkedTransformNode?.name ?? targetBone.name}\" and transform node \"${sourceTransformNode.name}\": animation removed`\r\n );\r\n }\r\n return false;\r\n }\r\n }\r\n\r\n ta.target = targetBone._linkedTransformNode ?? targetBone;\r\n\r\n return true;\r\n }\r\n\r\n private _retargetAnimationKeys(animation: Animation, sourceTransformNode: TransformNode, targetBone: Bone) {\r\n const keys = animation.getKeys();\r\n const targetTransformNode = targetBone._linkedTransformNode;\r\n\r\n let targetWorldMatrix: Matrix;\r\n let targetParentWorldMatrix: DeepImmutableObject<Matrix>;\r\n\r\n if (targetTransformNode) {\r\n targetWorldMatrix = targetTransformNode.getWorldMatrix();\r\n targetParentWorldMatrix = targetTransformNode.parent ? targetTransformNode.parent.getWorldMatrix() : Matrix.IdentityReadOnly;\r\n } else {\r\n targetWorldMatrix = targetBone.getFinalMatrix();\r\n targetParentWorldMatrix = targetBone.parent ? targetBone.parent.getFinalMatrix() : Matrix.IdentityReadOnly;\r\n }\r\n\r\n const targetParentInverseWorldMatrix = targetParentWorldMatrix.invertToRef(TmpVectors.Matrix[0]);\r\n\r\n const sourceInverseWorld = sourceTransformNode.getWorldMatrix().invertToRef(TmpVectors.Matrix[1]);\r\n const sourceParentWorld = sourceTransformNode.parent ? sourceTransformNode.parent.getWorldMatrix() : Matrix.IdentityReadOnly;\r\n\r\n switch (animation.targetProperty) {\r\n case \"rotationQuaternion\": {\r\n for (const key of keys) {\r\n const quaternion = key.value as Quaternion;\r\n\r\n const localMat = Matrix.ComposeToRef(sourceTransformNode.scaling, quaternion, sourceTransformNode.position, TmpVectors.Matrix[2]);\r\n\r\n sourceInverseWorld.multiplyToRef(localMat, localMat).multiplyToRef(sourceParentWorld, localMat);\r\n targetWorldMatrix.multiplyToRef(localMat, localMat).multiplyToRef(targetParentInverseWorldMatrix, localMat).decompose(undefined, quaternion, undefined);\r\n }\r\n break;\r\n }\r\n case \"position\": {\r\n for (const key of keys) {\r\n const position = key.value as Vector3;\r\n\r\n const localMat = Matrix.ComposeToRef(sourceTransformNode.scaling, sourceTransformNode.rotationQuaternion!, position, TmpVectors.Matrix[2]);\r\n\r\n sourceInverseWorld.multiplyToRef(localMat, localMat).multiplyToRef(sourceParentWorld, localMat);\r\n targetWorldMatrix.multiplyToRef(localMat, localMat).multiplyToRef(targetParentInverseWorldMatrix, localMat).decompose(undefined, undefined, position);\r\n }\r\n break;\r\n }\r\n case \"scaling\": {\r\n for (const key of keys) {\r\n const scaling = key.value as Vector3;\r\n\r\n const localMat = Matrix.ComposeToRef(scaling, sourceTransformNode.rotationQuaternion!, sourceTransformNode.position, TmpVectors.Matrix[2]);\r\n\r\n sourceInverseWorld.multiplyToRef(localMat, localMat).multiplyToRef(sourceParentWorld, localMat);\r\n targetWorldMatrix.multiplyToRef(localMat, localMat).multiplyToRef(targetParentInverseWorldMatrix, localMat).decompose(scaling, undefined, undefined);\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * This method corrects quaternion animations when two consecutive quaternions are orthogonal to each other. When this happens, in 99.99% of\r\n * cases it's an error in the animation data, as two consecutive rotations should normally be close to each other and not have a large gap.\r\n * The fix is to copy the first quaternion into the second.\r\n * @param animationGroup The animation group to fix\r\n * @internal\r\n */\r\n private _fixAnimationGroup(animationGroup: AnimationGroup) {\r\n for (let i = 0; i < animationGroup.targetedAnimations.length; ++i) {\r\n const ta = animationGroup.targetedAnimations[i];\r\n\r\n switch (ta.animation.targetProperty) {\r\n case \"rotationQuaternion\": {\r\n const keys = ta.animation.getKeys();\r\n\r\n for (let i = 0; i < keys.length - 1; ++i) {\r\n const curQuat = keys[i].value as Quaternion;\r\n const nextQuat = keys[i + 1].value as Quaternion;\r\n\r\n if (Math.abs(Quaternion.Dot(curQuat, nextQuat)) < 0.001) {\r\n keys[i + 1].value = curQuat.clone();\r\n i += 1;\r\n }\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n private _getRootNode(node: Node): Node {\r\n let current: Node = node;\r\n\r\n while (current.parent) {\r\n current = current.parent;\r\n }\r\n\r\n return current;\r\n }\r\n\r\n /**\r\n * Checks whether the parent hierarchy of a bone matches that of a given transform node. Checks are performed by name.\r\n * It works by first finding the transform node in the descendants of the root transform node that matches the bone's linked transform node.\r\n * Then it traverses up the hierarchy of both the bone and the transform node, comparing their names at each level.\r\n * @param bone The bone to check\r\n * @param rootTransformNode The root transform node to check against\r\n * @returns True if the hierarchies match, false otherwise\r\n * @internal\r\n */\r\n private _checkParentHierarchy(bone: Bone, rootTransformNode: Node, mapNodeNames: Map<string, string>) {\r\n const children = rootTransformNode.getDescendants(false, (node) => (mapNodeNames.get(node.name) ?? node.name) === (bone._linkedTransformNode?.name ?? bone.name));\r\n if (!children || children.length !== 1) {\r\n if (this.showWarnings) {\r\n Logger.Warn(\r\n `RetargetAnimationGroup - Avatar '${this.name}', CheckParentHierarchy: unable to find a corresponding transform node to bone name \"${bone._linkedTransformNode?.name ?? bone.name}\" in the source animation.`\r\n );\r\n }\r\n return false;\r\n }\r\n\r\n let transformNode: Nullable<Node> = children[0];\r\n\r\n while (bone) {\r\n const name = mapNodeNames.get(transformNode?.name ?? \"\") ?? transformNode?.name;\r\n const boneName = bone._linkedTransformNode?.name ?? bone.name;\r\n if (boneName !== name) {\r\n if (this.showWarnings) {\r\n Logger.Warn(`RetargetAnimationGroup - Avatar '${this.name}', CheckParentHierarchy: bone name \"${boneName}\" is different from transform node name \"${name}\".`);\r\n }\r\n return false;\r\n }\r\n\r\n bone = bone.parent;\r\n transformNode = transformNode!.parent;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private _getRootNodeName(rootNodeName: string | undefined, transformNodeNameToNode: TransformNodeNameToNode) {\r\n if (rootNodeName) {\r\n return rootNodeName;\r\n }\r\n\r\n // Look for the first bone that doesn't have a parent\r\n const iterator = this.skeletons.keys();\r\n for (let key = iterator.next(); key.done !== true; key = iterator.next()) {\r\n const skeleton = key.value;\r\n\r\n for (const bone of skeleton.bones) {\r\n if (!bone.parent) {\r\n // Make sure there's a transform node with that name in the source animation\r\n if (transformNodeNameToNode.get(bone.name)) {\r\n return bone.name;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return;\r\n }\r\n\r\n private _findVerticalAxis(\r\n msg: string,\r\n animationGroup: AnimationGroup,\r\n remappedRootNodeName: string | undefined,\r\n sourceTransformNodeNameToNode: TransformNodeNameToNode,\r\n remappedGroundReferenceNodeName?: string,\r\n groundReferenceVerticalAxis?: string\r\n ) {\r\n if (!remappedGroundReferenceNodeName) {\r\n if (this.showWarnings) {\r\n Logger.Warn(\r\n `RetargetAnimationGroup - Avatar '${this.name}', AnimationGroup '${animationGroup.name}': you must provide the name of the ground reference node (option parameter \"groundReferenceNodeName\"). ${msg}`\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n remappedRootNodeName = this._getRootNodeName(remappedRootNodeName, sourceTransformNodeNameToNode);\r\n\r\n if (!remappedRootNodeName) {\r\n if (this.showWarnings) {\r\n Logger.Warn(\r\n `RetargetAnimationGroup - Avatar '${this.name}', AnimationGroup '${animationGroup.name}': unable to find a suitable root node in the source animation. You should provide its name through the \"rootNodeName\" optional parameter. ${msg}`\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n const sourceRootTransformNode = sourceTransformNodeNameToNode.get(remappedRootNodeName)?.node;\r\n const sourceGroundReferenceTransformNode = sourceTransformNodeNameToNode.get(remappedGroundReferenceNodeName)?.node;\r\n\r\n if (!sourceRootTransformNode) {\r\n if (this.showWarnings) {\r\n Logger.Warn(\r\n `RetargetAnimationGroup - Avatar '${this.name}', AnimationGroup '${animationGroup.name}': unable to find the transform node corresponding to \"${remappedRootNodeName}\" in the source animation. This transform node either doesn't exist or is not animated. ${msg}`\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n if (!sourceGroundReferenceTransformNode) {\r\n if (this.showWarnings) {\r\n Logger.Warn(\r\n `RetargetAnimationGroup - Avatar '${this.name}', AnimationGroup '${animationGroup.name}': unable to find the transform node corresponding to \"${remappedGroundReferenceNodeName}\" in the source animation. This transform node either doesn't exist or is not animated. ${msg}`\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n // Look for the position animation + target node of the root node name (generally the hips) in the retargeted animation\r\n let targetRootPositionAnimation: Animation | undefined;\r\n let targetRootTransformNodeOrBone: TransformNode | Bone | undefined;\r\n\r\n for (let i = 0; i < animationGroup.targetedAnimations.length; ++i) {\r\n const ta = animationGroup.targetedAnimations[i];\r\n const target = ta.target;\r\n const animation = ta.animation;\r\n\r\n if (target.name === remappedRootNodeName && animation.targetProperty === \"position\") {\r\n targetRootPositionAnimation = animation;\r\n targetRootTransformNodeOrBone = ta.target;\r\n break;\r\n }\r\n }\r\n\r\n if (!targetRootPositionAnimation || !targetRootTransformNodeOrBone) {\r\n if (this.showWarnings) {\r\n Logger.Warn(\r\n `RetargetAnimationGroup - Avatar '${this.name}', AnimationGroup '${animationGroup.name}': unable to find a \"position\" animation for the node \"${remappedRootNodeName}\". ${msg}`\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n let targetGroundReferenceTransformNodeOrBone: Nullable<TransformNode | Bone>;\r\n\r\n if (targetRootTransformNodeOrBone instanceof TransformNode) {\r\n targetGroundReferenceTransformNodeOrBone = this.findBoneByTransformNode(remappedGroundReferenceNodeName)?._linkedTransformNode!;\r\n } else {\r\n targetGroundReferenceTransformNodeOrBone = this.findBoneByName(remappedGroundReferenceNodeName);\r\n }\r\n\r\n if (!targetGroundReferenceTransformNodeOrBone) {\r\n if (this.showWarnings) {\r\n Logger.Warn(\r\n `RetargetAnimationGroup - Avatar '${this.name}', AnimationGroup '${animationGroup.name}': unable to find the bone/transform node corresponding with name \"${remappedGroundReferenceNodeName}\" in the avatar skeleton. Ensure that this bone exists. ${msg}`\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n sourceRootTransformNode.computeWorldMatrix(true);\r\n sourceGroundReferenceTransformNode.computeWorldMatrix(true);\r\n\r\n // Determine the vertical axis\r\n const sourceRootGroundReferenceDiff = sourceRootTransformNode.getAbsolutePosition().subtract(sourceGroundReferenceTransformNode.getAbsolutePosition());\r\n\r\n let verticalAxis = 0;\r\n\r\n if (groundReferenceVerticalAxis) {\r\n switch (groundReferenceVerticalAxis) {\r\n case \"Y\":\r\n verticalAxis = 1;\r\n break;\r\n case \"Z\":\r\n verticalAxis = 2;\r\n break;\r\n }\r\n } else {\r\n // No axis provided: assume the vertical axis is the one with the larger difference between the reference and the ground reference transform nodes\r\n if (Math.abs(sourceRootGroundReferenceDiff.y) > Math.abs(sourceRootGroundReferenceDiff.x)) {\r\n verticalAxis = 1;\r\n }\r\n if (Math.abs(sourceRootGroundReferenceDiff.z) > Math.abs(sourceRootGroundReferenceDiff.y)) {\r\n verticalAxis = 2;\r\n }\r\n }\r\n\r\n const targetRootGroundReferenceDiff = targetRootTransformNodeOrBone.getAbsolutePosition().subtract(targetGroundReferenceTransformNodeOrBone.getAbsolutePosition());\r\n\r\n return {\r\n verticalAxis,\r\n sourceRootTransformNode,\r\n sourceGroundReferenceTransformNode,\r\n targetRootTransformNodeOrBone,\r\n targetRootPositionAnimation,\r\n targetGroundReferenceTransformNodeOrBone,\r\n proportionRatio:\r\n verticalAxis === 0\r\n ? targetRootGroundReferenceDiff.x / sourceRootGroundReferenceDiff.x\r\n : verticalAxis === 1\r\n ? targetRootGroundReferenceDiff.y / sourceRootGroundReferenceDiff.y\r\n : targetRootGroundReferenceDiff.z / sourceRootGroundReferenceDiff.z,\r\n };\r\n }\r\n\r\n private _resetStates(sourceTransformNodeNameToNode: TransformNodeNameToNode) {\r\n this.skeletons.forEach((skeleton) => skeleton.returnToRest());\r\n\r\n sourceTransformNodeNameToNode.forEach((data) => {\r\n const { node, initialTransformations } = data;\r\n node.position.copyFrom(initialTransformations.position);\r\n node.scaling.copyFrom(initialTransformations.scaling);\r\n if (initialTransformations.quaternion) {\r\n node.rotationQuaternion!.copyFrom(initialTransformations.quaternion);\r\n } else {\r\n node.rotation.copyFrom(initialTransformations.rotation);\r\n }\r\n node.computeWorldMatrix(true);\r\n });\r\n }\r\n\r\n private _fixRootPosition(\r\n sourceAnimationGroup: AnimationGroup,\r\n animationGroup: AnimationGroup,\r\n sourceRootTransformNode: TransformNode,\r\n targetRootTransformNodeOrBone: TransformNode | Bone,\r\n targetRootPositionAnimation: Animation,\r\n proportionRatio: number\r\n ) {\r\n const targetNodeInverseParentWorldMatrix =\r\n targetRootTransformNodeOrBone instanceof TransformNode\r\n ? (targetRootTransformNodeOrBone.parent?.getWorldMatrix().invertToRef(TmpVectors.Matrix[0]) ?? Matrix.IdentityReadOnly)\r\n : (targetRootTransformNodeOrBone.parent?.getFinalMatrix().invertToRef(TmpVectors.Matrix[0]) ?? Matrix.IdentityReadOnly);\r\n\r\n sourceRootTransformNode.computeWorldMatrix(true);\r\n targetRootTransformNodeOrBone.computeWorldMatrix(true);\r\n\r\n const sourceWorldPosition = sourceRootTransformNode.absolutePosition.clone();\r\n const targetWorldPosition = targetRootTransformNodeOrBone.getAbsolutePosition().clone();\r\n\r\n sourceAnimationGroup.play(false);\r\n animationGroup.play(false);\r\n\r\n // Loop over the position animation of the root transform node\r\n for (const key of targetRootPositionAnimation.getKeys()) {\r\n const frame = key.frame;\r\n\r\n // Advance the source and retargeted animations to this frame\r\n sourceAnimationGroup.goToFrame(frame);\r\n sourceAnimationGroup.pause();\r\n\r\n animationGroup.goToFrame(frame);\r\n animationGroup.pause();\r\n\r\n sourceRootTransformNode.computeWorldMatrix(true);\r\n\r\n const offset = sourceRootTransformNode.absolutePosition.subtractToRef(sourceWorldPosition, TmpVectors.Vector3[0]);\r\n\r\n offset.scaleInPlace(proportionRatio);\r\n offset.addInPlace(targetWorldPosition);\r\n\r\n Vector3.TransformNormalToRef(offset, targetNodeInverseParentWorldMatrix, key.value);\r\n }\r\n\r\n sourceAnimationGroup.stop();\r\n animationGroup.stop();\r\n }\r\n\r\n private _fixGroundReference(\r\n sourceAnimationGroup: AnimationGroup,\r\n animationGroup: AnimationGroup,\r\n verticalAxis: number,\r\n targetRootTransformNodeOrBone: TransformNode | Bone,\r\n targetRootPositionAnimation: Animation,\r\n sourceGroundReferenceTransformNode: TransformNode,\r\n targetGroundReferenceTransformNodeOrBone: TransformNode | Bone,\r\n sourceListTransformNodes: Set<TransformNode>,\r\n mapNodeNames: Map<string, string>,\r\n fixGroundReferenceDynamicRefNode: boolean\r\n ) {\r\n const targetNodeInverseParentWorldMatrix =\r\n targetRootTransformNodeOrBone instanceof TransformNode\r\n ? (targetRootTransformNodeOrBone.parent?.getWorldMatrix().invertToRef(TmpVectors.Matrix[0]) ?? Matrix.IdentityReadOnly)\r\n : (targetRootTransformNodeOrBone.parent?.getFinalMatrix().invertToRef(TmpVectors.Matrix[0]) ?? Matrix.IdentityReadOnly);\r\n\r\n sourceAnimationGroup.play(false);\r\n animationGroup.play(false);\r\n\r\n // Loop over the position animation of the root transform node\r\n for (const key of targetRootPositionAnimation.getKeys()) {\r\n const frame = key.frame;\r\n\r\n // Advance the source and retargeted animations to this frame\r\n sourceAnimationGroup.goToFrame(frame);\r\n sourceAnimationGroup.pause();\r\n\r\n animationGroup.goToFrame(frame);\r\n animationGroup.pause();\r\n\r\n sourceGroundReferenceTransformNode.computeWorldMatrix(true);\r\n targetGroundReferenceTransformNodeOrBone.computeWorldMatrix(true);\r\n\r\n // Calculate the offset to apply to the root position in the target to have the ground reference at the same height in the source and target animations\r\n const diffGroundReferences = targetGroundReferenceTransformNodeOrBone\r\n .getAbsolutePosition()\r\n .subtractToRef(sourceGroundReferenceTransformNode.absolutePosition, TmpVectors.Vector3[0]);\r\n\r\n let groundReferenceOffset = verticalAxis === 0 ? diffGroundReferences.x : verticalAxis === 1 ? diffGroundReferences.y : diffGroundReferences.z;\r\n\r\n if (fixGroundReferenceDynamicRefNode) {\r\n // Try to find a bone in this frame that has a greater offset than the ground reference, to use it instead of the ground reference.\r\n const targetRootToGroundReferenceDiff = targetRootTransformNodeOrBone\r\n .getAbsolutePosition()\r\n .subtractToRef(targetGroundReferenceTransformNodeOrBone.getAbsolutePosition(), TmpVectors.Vector3[0]);\r\n\r\n const targetRootToGroundReferenceOffset =\r\n verticalAxis === 0 ? targetRootToGroundReferenceDiff.x : verticalAxis === 1 ? targetRootToGroundReferenceDiff.y : targetRootToGroundReferenceDiff.z;\r\n\r\n const iterator = sourceListTransformNodes.keys();\r\n\r\n for (let key = iterator.next(); key.done !== true; key = iterator.next()) {\r\n const sourceTransformNode = key.value;\r\n if (sourceTransformNode === sourceGroundReferenceTransformNode) {\r\n continue;\r\n }\r\n\r\n const targetNodeName = mapNodeNames.get(sourceTransformNode.name) ?? sourceTransformNode.name;\r\n\r\n let targetBone = this.findBoneByTransformNode(targetNodeName);\r\n if (!targetBone) {\r\n targetBone = this.findBoneByName(targetNodeName);\r\n }\r\n if (!targetBone) {\r\n continue;\r\n }\r\n\r\n sourceTransformNode.computeWorldMatrix();\r\n targetBone.computeWorldMatrix();\r\n\r\n const targetBoneWorldPosition = targetBone._linkedTransformNode?.getAbsolutePosition() ?? targetBone.getAbsolutePosition();\r\n const targetRootToBoneDiff = targetRootTransformNodeOrBone.getAbsolutePosition().subtractToRef(targetBoneWorldPosition, TmpVectors.Vector3[0]);\r\n const rootToBoneOffset = verticalAxis === 0 ? targetRootToBoneDiff.x : verticalAxis === 1 ? targetRootToBoneDiff.y : targetRootToBoneDiff.z;\r\n\r\n if (Math.abs(rootToBoneOffset) > Math.abs(targetRootToGroundReferenceOffset) && Math.sign(rootToBoneOffset) === Math.sign(targetRootToGroundReferenceOffset)) {\r\n const diff = targetBoneWorldPosition.subtractToRef(sourceTransformNode.getAbsolutePosition(), TmpVectors.Vector3[0]);\r\n const offset = verticalAxis === 0 ? diff.x : verticalAxis === 1 ? diff.y : diff.z;\r\n\r\n groundReferenceOffset = offset;\r\n }\r\n }\r\n }\r\n\r\n const localOffset = Vector3.TransformNormalToRef(\r\n new Vector3(verticalAxis === 0 ? groundReferenceOffset : 0, verticalAxis === 1 ? groundReferenceOffset : 0, verticalAxis === 2 ? groundReferenceOffset : 0),\r\n targetNodeInverseParentWorldMatrix,\r\n TmpVectors.Vector3[1]\r\n );\r\n\r\n key.value.subtractInPlace(localOffset);\r\n }\r\n\r\n sourceAnimationGroup.stop();\r\n animationGroup.stop();\r\n }\r\n}\r\n"]}
@@ -430,7 +430,7 @@ export class RuntimeAnimation {
430
430
  let returnValue = true;
431
431
  let currentFrame;
432
432
  const events = this._events;
433
- let frameRange = 0;
433
+ let frameRange;
434
434
  if (!this._coreRuntimeAnimation) {
435
435
  // Check limits
436
436
  if (from < this._minFrame || from > this._maxFrame) {
@@ -1 +1 @@
1
- {"version":3,"file":"runtimeAnimation.js","sourceRoot":"","sources":["../../../../dev/core/src/Animations/runtimeAnimation.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable } from \"../types\";\r\nimport { Matrix } from \"../Maths/math.vector\";\r\nimport type { _IAnimationState } from \"./animation\";\r\nimport {\r\n Animation,\r\n _StaticOffsetValueColor3,\r\n _StaticOffsetValueColor4,\r\n _StaticOffsetValueQuaternion,\r\n _StaticOffsetValueSize,\r\n _StaticOffsetValueVector2,\r\n _StaticOffsetValueVector3,\r\n} from \"./animation\";\r\nimport type { AnimationEvent } from \"./animationEvent\";\r\nimport type { Animatable } from \"./animatable\";\r\nimport type { Scene } from \"../scene\";\r\nimport type { IAnimationKey } from \"./animationKey\";\r\n\r\n/**\r\n * Defines a runtime animation\r\n */\r\nexport class RuntimeAnimation {\r\n private _events = new Array<AnimationEvent>();\r\n\r\n /**\r\n * The current frame of the runtime animation\r\n */\r\n private _currentFrame: number = 0;\r\n\r\n /**\r\n * The animation used by the runtime animation\r\n */\r\n public _animation: Animation;\r\n\r\n /**\r\n * The target of the runtime animation\r\n */\r\n private _target: any;\r\n\r\n /**\r\n * The initiating animatable\r\n */\r\n private _host: Animatable;\r\n\r\n /**\r\n * The original value of the runtime animation\r\n */\r\n private _originalValue = new Array<any>();\r\n\r\n /**\r\n * The original blend value of the runtime animation\r\n */\r\n private _originalBlendValue: Nullable<any> = null;\r\n\r\n /**\r\n * The offsets cache of the runtime animation\r\n */\r\n private _offsetsCache: { [key: string]: any } = {};\r\n\r\n /**\r\n * The high limits cache of the runtime animation\r\n */\r\n private _highLimitsCache: { [key: string]: any } = {};\r\n\r\n /**\r\n * Specifies if the runtime animation has been stopped\r\n */\r\n private _stopped = false;\r\n\r\n /**\r\n * The blending factor of the runtime animation\r\n */\r\n private _blendingFactor = 0;\r\n\r\n /**\r\n * The BabylonJS scene\r\n */\r\n private _scene: Scene;\r\n\r\n /**\r\n * The current value of the runtime animation\r\n */\r\n private _currentValue: Nullable<any> = null;\r\n\r\n /** @internal */\r\n public _animationState: _IAnimationState;\r\n\r\n /**\r\n * The active target of the runtime animation\r\n */\r\n private _activeTargets: any[];\r\n private _currentActiveTarget: Nullable<any> = null;\r\n private _directTarget: Nullable<any> = null;\r\n\r\n /**\r\n * The target path of the runtime animation\r\n */\r\n private _targetPath: string = \"\";\r\n\r\n /**\r\n * The weight of the runtime animation\r\n */\r\n private _weight = 1.0;\r\n\r\n /**\r\n * The absolute frame offset of the runtime animation\r\n */\r\n private _absoluteFrameOffset = 0;\r\n\r\n /**\r\n * The previous elapsed time (since start of animation) of the runtime animation\r\n */\r\n private _previousElapsedTime: number = 0;\r\n\r\n private _yoyoDirection: number = 1;\r\n\r\n /**\r\n * The previous absolute frame of the runtime animation (meaning, without taking into account the from/to values, only the elapsed time and the fps)\r\n */\r\n private _previousAbsoluteFrame: number = 0;\r\n\r\n private _enableBlending: boolean;\r\n\r\n private _keys: IAnimationKey[];\r\n private _minFrame: number;\r\n private _maxFrame: number;\r\n private _targetIsArray = false;\r\n\r\n /** @internal */\r\n public _coreRuntimeAnimation: RuntimeAnimation | null = null;\r\n\r\n /**\r\n * Gets the current frame of the runtime animation\r\n */\r\n public get currentFrame(): number {\r\n return this._currentFrame;\r\n }\r\n\r\n /**\r\n * Gets the weight of the runtime animation\r\n */\r\n public get weight(): number {\r\n return this._weight;\r\n }\r\n\r\n /**\r\n * Gets the current value of the runtime animation\r\n */\r\n public get currentValue(): any {\r\n return this._currentValue;\r\n }\r\n\r\n /**\r\n * Gets or sets the target path of the runtime animation\r\n */\r\n public get targetPath(): string {\r\n return this._targetPath;\r\n }\r\n\r\n /**\r\n * Gets the actual target of the runtime animation\r\n */\r\n public get target(): any {\r\n return this._currentActiveTarget;\r\n }\r\n\r\n /**\r\n * Gets the additive state of the runtime animation\r\n */\r\n public get isAdditive(): boolean {\r\n return this._host && this._host.isAdditive;\r\n }\r\n\r\n /** @internal */\r\n public _onLoop: () => void;\r\n\r\n /**\r\n * Create a new RuntimeAnimation object\r\n * @param target defines the target of the animation\r\n * @param animation defines the source animation object\r\n * @param scene defines the hosting scene\r\n * @param host defines the initiating Animatable\r\n */\r\n public constructor(target: any, animation: Animation, scene: Scene, host: Animatable) {\r\n this._animation = animation;\r\n this._target = target;\r\n this._scene = scene;\r\n this._host = host;\r\n this._activeTargets = [];\r\n\r\n animation._runtimeAnimations.push(this);\r\n\r\n // State\r\n this._animationState = {\r\n key: 0,\r\n repeatCount: 0,\r\n loopMode: this._getCorrectLoopMode(),\r\n };\r\n\r\n if (this._animation.dataType === Animation.ANIMATIONTYPE_MATRIX) {\r\n this._animationState.workValue = Matrix.Zero();\r\n }\r\n\r\n // Limits\r\n this._keys = this._animation.getKeys();\r\n this._minFrame = this._keys[0].frame;\r\n this._maxFrame = this._keys[this._keys.length - 1].frame;\r\n\r\n // Add a start key at frame 0 if missing\r\n if (this._minFrame !== 0) {\r\n const newKey = { frame: 0, value: this._keys[0].value };\r\n this._keys.splice(0, 0, newKey);\r\n }\r\n\r\n // Check data\r\n if (this._target instanceof Array) {\r\n let index = 0;\r\n for (const target of this._target) {\r\n this._preparePath(target, index);\r\n this._getOriginalValues(index);\r\n index++;\r\n }\r\n this._targetIsArray = true;\r\n } else {\r\n this._preparePath(this._target);\r\n this._getOriginalValues();\r\n this._targetIsArray = false;\r\n this._directTarget = this._activeTargets[0];\r\n }\r\n\r\n // Cloning events locally\r\n const events = animation.getEvents();\r\n if (events && events.length > 0) {\r\n for (const e of events) {\r\n this._events.push(e._clone());\r\n }\r\n }\r\n\r\n this._enableBlending = target && target.animationPropertiesOverride ? target.animationPropertiesOverride.enableBlending : this._animation.enableBlending;\r\n }\r\n\r\n private _preparePath(target: any, targetIndex = 0) {\r\n const targetPropertyPath = this._animation.targetPropertyPath;\r\n\r\n if (targetPropertyPath.length > 1) {\r\n let property = target;\r\n for (let index = 0; index < targetPropertyPath.length - 1; index++) {\r\n const name = targetPropertyPath[index];\r\n property = property[name];\r\n if (property === undefined) {\r\n throw new Error(`Invalid property (${name}) in property path (${targetPropertyPath.join(\".\")})`);\r\n }\r\n }\r\n\r\n this._targetPath = targetPropertyPath[targetPropertyPath.length - 1];\r\n this._activeTargets[targetIndex] = property;\r\n } else {\r\n this._targetPath = targetPropertyPath[0];\r\n this._activeTargets[targetIndex] = target;\r\n }\r\n\r\n if (this._activeTargets[targetIndex][this._targetPath] === undefined) {\r\n throw new Error(`Invalid property (${this._targetPath}) in property path (${targetPropertyPath.join(\".\")})`);\r\n }\r\n }\r\n\r\n /**\r\n * Gets the animation from the runtime animation\r\n */\r\n public get animation(): Animation {\r\n return this._animation;\r\n }\r\n\r\n /**\r\n * Resets the runtime animation to the beginning\r\n * @param restoreOriginal defines whether to restore the target property to the original value\r\n */\r\n public reset(restoreOriginal = false): void {\r\n if (restoreOriginal) {\r\n if (this._target instanceof Array) {\r\n let index = 0;\r\n for (const target of this._target) {\r\n if (this._originalValue[index] !== undefined) {\r\n this._setValue(target, this._activeTargets[index], this._originalValue[index], -1, index);\r\n }\r\n index++;\r\n }\r\n } else {\r\n if (this._originalValue[0] !== undefined) {\r\n this._setValue(this._target, this._directTarget, this._originalValue[0], -1, 0);\r\n }\r\n }\r\n }\r\n\r\n this._offsetsCache = {};\r\n this._highLimitsCache = {};\r\n this._currentFrame = 0;\r\n this._blendingFactor = 0;\r\n\r\n // Events\r\n for (let index = 0; index < this._events.length; index++) {\r\n this._events[index].isDone = false;\r\n }\r\n }\r\n\r\n /**\r\n * Specifies if the runtime animation is stopped\r\n * @returns Boolean specifying if the runtime animation is stopped\r\n */\r\n public isStopped(): boolean {\r\n return this._stopped;\r\n }\r\n\r\n /**\r\n * Disposes of the runtime animation\r\n */\r\n public dispose(): void {\r\n const index = this._animation.runtimeAnimations.indexOf(this);\r\n\r\n if (index > -1) {\r\n this._animation.runtimeAnimations.splice(index, 1);\r\n }\r\n }\r\n\r\n /**\r\n * Apply the interpolated value to the target\r\n * @param currentValue defines the value computed by the animation\r\n * @param weight defines the weight to apply to this value (Defaults to 1.0)\r\n */\r\n public setValue(currentValue: any, weight: number) {\r\n if (this._targetIsArray) {\r\n for (let index = 0; index < this._target.length; index++) {\r\n const target = this._target[index];\r\n this._setValue(target, this._activeTargets[index], currentValue, weight, index);\r\n }\r\n return;\r\n }\r\n this._setValue(this._target, this._directTarget, currentValue, weight, 0);\r\n }\r\n\r\n private _getOriginalValues(targetIndex = 0) {\r\n let originalValue: any;\r\n const target = this._activeTargets[targetIndex];\r\n\r\n if (target.getLocalMatrix && this._targetPath === \"_matrix\") {\r\n // For bones\r\n originalValue = target.getLocalMatrix();\r\n } else {\r\n originalValue = target[this._targetPath];\r\n }\r\n\r\n if (originalValue && originalValue.clone) {\r\n this._originalValue[targetIndex] = originalValue.clone();\r\n } else {\r\n this._originalValue[targetIndex] = originalValue;\r\n }\r\n }\r\n\r\n private _registerTargetForLateAnimationBinding(runtimeAnimation: RuntimeAnimation, originalValue: any): void {\r\n const target = runtimeAnimation.target;\r\n this._scene._registeredForLateAnimationBindings.pushNoDuplicate(target);\r\n\r\n if (!target._lateAnimationHolders) {\r\n target._lateAnimationHolders = {};\r\n }\r\n\r\n if (!target._lateAnimationHolders[runtimeAnimation.targetPath]) {\r\n target._lateAnimationHolders[runtimeAnimation.targetPath] = {\r\n totalWeight: 0,\r\n totalAdditiveWeight: 0,\r\n animations: [],\r\n additiveAnimations: [],\r\n originalValue: originalValue,\r\n };\r\n }\r\n\r\n if (runtimeAnimation.isAdditive) {\r\n target._lateAnimationHolders[runtimeAnimation.targetPath].additiveAnimations.push(runtimeAnimation);\r\n target._lateAnimationHolders[runtimeAnimation.targetPath].totalAdditiveWeight += runtimeAnimation.weight;\r\n } else {\r\n target._lateAnimationHolders[runtimeAnimation.targetPath].animations.push(runtimeAnimation);\r\n target._lateAnimationHolders[runtimeAnimation.targetPath].totalWeight += runtimeAnimation.weight;\r\n }\r\n }\r\n\r\n private _setValue(target: any, destination: any, currentValue: any, weight: number, targetIndex: number): void {\r\n // Set value\r\n this._currentActiveTarget = destination;\r\n\r\n this._weight = weight;\r\n\r\n if (this._enableBlending && this._blendingFactor <= 1.0) {\r\n if (!this._originalBlendValue) {\r\n const originalValue = destination[this._targetPath];\r\n\r\n if (originalValue.clone) {\r\n this._originalBlendValue = originalValue.clone();\r\n } else {\r\n this._originalBlendValue = originalValue;\r\n }\r\n }\r\n\r\n if (this._originalBlendValue.m) {\r\n // Matrix\r\n if (Animation.AllowMatrixDecomposeForInterpolation) {\r\n if (this._currentValue) {\r\n Matrix.DecomposeLerpToRef(this._originalBlendValue, currentValue, this._blendingFactor, this._currentValue);\r\n } else {\r\n this._currentValue = Matrix.DecomposeLerp(this._originalBlendValue, currentValue, this._blendingFactor);\r\n }\r\n } else {\r\n if (this._currentValue) {\r\n Matrix.LerpToRef(this._originalBlendValue, currentValue, this._blendingFactor, this._currentValue);\r\n } else {\r\n this._currentValue = Matrix.Lerp(this._originalBlendValue, currentValue, this._blendingFactor);\r\n }\r\n }\r\n } else {\r\n this._currentValue = Animation._UniversalLerp(this._originalBlendValue, currentValue, this._blendingFactor);\r\n }\r\n\r\n const blendingSpeed = target && target.animationPropertiesOverride ? target.animationPropertiesOverride.blendingSpeed : this._animation.blendingSpeed;\r\n this._blendingFactor += blendingSpeed;\r\n } else {\r\n if (!this._currentValue) {\r\n if (currentValue?.clone) {\r\n this._currentValue = currentValue.clone();\r\n } else {\r\n this._currentValue = currentValue;\r\n }\r\n } else if (this._currentValue.copyFrom) {\r\n if (currentValue !== null) {\r\n this._currentValue.copyFrom(currentValue);\r\n } else {\r\n this._currentValue = currentValue;\r\n }\r\n } else {\r\n this._currentValue = currentValue;\r\n }\r\n }\r\n\r\n if (weight !== -1.0) {\r\n this._registerTargetForLateAnimationBinding(this, this._originalValue[targetIndex]);\r\n } else {\r\n if (this._animationState.loopMode === Animation.ANIMATIONLOOPMODE_RELATIVE_FROM_CURRENT) {\r\n if (this._currentValue.addToRef) {\r\n this._currentValue.addToRef(this._originalValue[targetIndex], destination[this._targetPath]);\r\n } else {\r\n destination[this._targetPath] = this._originalValue[targetIndex] + this._currentValue;\r\n }\r\n } else {\r\n destination[this._targetPath] = this._currentValue;\r\n }\r\n }\r\n\r\n if (target.markAsDirty) {\r\n target.markAsDirty(this._animation.targetProperty);\r\n }\r\n }\r\n\r\n /**\r\n * Gets the loop pmode of the runtime animation\r\n * @returns Loop Mode\r\n */\r\n private _getCorrectLoopMode(): number | undefined {\r\n if (this._target && this._target.animationPropertiesOverride) {\r\n return this._target.animationPropertiesOverride.loopMode as number;\r\n }\r\n\r\n return this._animation.loopMode;\r\n }\r\n\r\n /**\r\n * Move the current animation to a given frame\r\n * @param frame defines the frame to move to\r\n * @param weight defines the weight to apply to the animation (-1.0 by default)\r\n */\r\n public goToFrame(frame: number, weight = -1): void {\r\n const keys = this._animation.getKeys();\r\n\r\n if (frame < keys[0].frame) {\r\n frame = keys[0].frame;\r\n } else if (frame > keys[keys.length - 1].frame) {\r\n frame = keys[keys.length - 1].frame;\r\n }\r\n\r\n // Need to reset animation events\r\n const events = this._events;\r\n if (events.length) {\r\n for (let index = 0; index < events.length; index++) {\r\n if (!events[index].onlyOnce) {\r\n // reset events in the future\r\n events[index].isDone = events[index].frame < frame;\r\n }\r\n }\r\n }\r\n\r\n this._currentFrame = frame;\r\n const currentValue = this._animation._interpolate(frame, this._animationState);\r\n\r\n this.setValue(currentValue, weight);\r\n }\r\n\r\n /**\r\n * @internal Internal use only\r\n */\r\n public _prepareForSpeedRatioChange(newSpeedRatio: number): void {\r\n const newAbsoluteFrame = (this._previousElapsedTime * (this._animation.framePerSecond * newSpeedRatio)) / 1000.0;\r\n\r\n this._absoluteFrameOffset = this._previousAbsoluteFrame - newAbsoluteFrame;\r\n }\r\n\r\n /**\r\n * Execute the current animation\r\n * @param elapsedTimeSinceAnimationStart defines the elapsed time (in milliseconds) since the animation was started\r\n * @param from defines the lower frame of the animation range\r\n * @param to defines the upper frame of the animation range\r\n * @param loop defines if the current animation must loop\r\n * @param speedRatio defines the current speed ratio\r\n * @param weight defines the weight of the animation (default is -1 so no weight)\r\n * @returns a boolean indicating if the animation is running\r\n */\r\n public animate(elapsedTimeSinceAnimationStart: number, from: number, to: number, loop: boolean, speedRatio: number, weight = -1.0): boolean {\r\n const animation = this._animation;\r\n const targetPropertyPath = animation.targetPropertyPath;\r\n if (!targetPropertyPath || targetPropertyPath.length < 1) {\r\n this._stopped = true;\r\n return false;\r\n }\r\n\r\n let returnValue = true;\r\n let currentFrame: number;\r\n const events = this._events;\r\n let frameRange = 0;\r\n\r\n if (!this._coreRuntimeAnimation) {\r\n // Check limits\r\n if (from < this._minFrame || from > this._maxFrame) {\r\n from = this._minFrame;\r\n }\r\n if (to < this._minFrame || to > this._maxFrame) {\r\n to = this._maxFrame;\r\n }\r\n\r\n frameRange = to - from;\r\n let offsetValue: any;\r\n\r\n // Compute the frame according to the elapsed time and the fps of the animation (\"from\" and \"to\" are not factored in!)\r\n let absoluteFrame = (elapsedTimeSinceAnimationStart * (animation.framePerSecond * speedRatio)) / 1000.0 + this._absoluteFrameOffset;\r\n let highLimitValue = 0;\r\n\r\n // Apply the yoyo function if required\r\n let yoyoLoop = false;\r\n const yoyoMode = loop && this._animationState.loopMode === Animation.ANIMATIONLOOPMODE_YOYO;\r\n if (yoyoMode) {\r\n const position = (absoluteFrame - from) / frameRange;\r\n\r\n // Apply the yoyo curve\r\n const sin = Math.sin(position * Math.PI);\r\n const yoyoPosition = Math.abs(sin);\r\n\r\n // Map the yoyo position back to the range\r\n absoluteFrame = yoyoPosition * frameRange + from;\r\n\r\n const direction = sin >= 0 ? 1 : -1;\r\n if (this._yoyoDirection !== direction) {\r\n yoyoLoop = true;\r\n }\r\n\r\n this._yoyoDirection = direction;\r\n }\r\n\r\n this._previousElapsedTime = elapsedTimeSinceAnimationStart;\r\n this._previousAbsoluteFrame = absoluteFrame;\r\n\r\n if (!loop && to >= from && ((absoluteFrame >= frameRange && speedRatio > 0) || (absoluteFrame <= 0 && speedRatio < 0))) {\r\n // If we are out of range and not looping get back to caller\r\n returnValue = false;\r\n highLimitValue = animation.evaluate(to);\r\n } else if (!loop && from >= to && ((absoluteFrame <= frameRange && speedRatio < 0) || (absoluteFrame >= 0 && speedRatio > 0))) {\r\n returnValue = false;\r\n highLimitValue = animation.evaluate(from);\r\n } else if (this._animationState.loopMode !== Animation.ANIMATIONLOOPMODE_CYCLE) {\r\n const keyOffset = to.toString() + from.toString();\r\n if (!this._offsetsCache[keyOffset]) {\r\n this._animationState.repeatCount = 0;\r\n this._animationState.loopMode = Animation.ANIMATIONLOOPMODE_CYCLE; // force a specific codepath in animation._interpolate()!\r\n const fromValue = animation._interpolate(from, this._animationState);\r\n const toValue = animation._interpolate(to, this._animationState);\r\n\r\n this._animationState.loopMode = this._getCorrectLoopMode();\r\n switch (animation.dataType) {\r\n // Float\r\n case Animation.ANIMATIONTYPE_FLOAT:\r\n this._offsetsCache[keyOffset] = toValue - fromValue;\r\n break;\r\n // Quaternion\r\n case Animation.ANIMATIONTYPE_QUATERNION:\r\n this._offsetsCache[keyOffset] = toValue.subtract(fromValue);\r\n break;\r\n // Vector3\r\n case Animation.ANIMATIONTYPE_VECTOR3:\r\n this._offsetsCache[keyOffset] = toValue.subtract(fromValue);\r\n break;\r\n // Vector2\r\n case Animation.ANIMATIONTYPE_VECTOR2:\r\n this._offsetsCache[keyOffset] = toValue.subtract(fromValue);\r\n break;\r\n // Size\r\n case Animation.ANIMATIONTYPE_SIZE:\r\n this._offsetsCache[keyOffset] = toValue.subtract(fromValue);\r\n break;\r\n // Color3\r\n case Animation.ANIMATIONTYPE_COLOR3:\r\n this._offsetsCache[keyOffset] = toValue.subtract(fromValue);\r\n break;\r\n default:\r\n break;\r\n }\r\n\r\n this._highLimitsCache[keyOffset] = toValue;\r\n }\r\n\r\n highLimitValue = this._highLimitsCache[keyOffset];\r\n offsetValue = this._offsetsCache[keyOffset];\r\n }\r\n\r\n if (offsetValue === undefined) {\r\n switch (animation.dataType) {\r\n // Float\r\n case Animation.ANIMATIONTYPE_FLOAT:\r\n offsetValue = 0;\r\n break;\r\n // Quaternion\r\n case Animation.ANIMATIONTYPE_QUATERNION:\r\n offsetValue = _StaticOffsetValueQuaternion;\r\n break;\r\n // Vector3\r\n case Animation.ANIMATIONTYPE_VECTOR3:\r\n offsetValue = _StaticOffsetValueVector3;\r\n break;\r\n // Vector2\r\n case Animation.ANIMATIONTYPE_VECTOR2:\r\n offsetValue = _StaticOffsetValueVector2;\r\n break;\r\n // Size\r\n case Animation.ANIMATIONTYPE_SIZE:\r\n offsetValue = _StaticOffsetValueSize;\r\n break;\r\n // Color3\r\n case Animation.ANIMATIONTYPE_COLOR3:\r\n offsetValue = _StaticOffsetValueColor3;\r\n break;\r\n case Animation.ANIMATIONTYPE_COLOR4:\r\n offsetValue = _StaticOffsetValueColor4;\r\n break;\r\n }\r\n }\r\n\r\n // Compute value\r\n\r\n if (this._host && this._host.syncRoot) {\r\n // If we must sync with an animatable, calculate the current frame based on the frame of the root animatable\r\n const syncRoot = this._host.syncRoot;\r\n const hostNormalizedFrame = (syncRoot.masterFrame - syncRoot.fromFrame) / (syncRoot.toFrame - syncRoot.fromFrame);\r\n currentFrame = from + frameRange * hostNormalizedFrame;\r\n } else {\r\n if ((absoluteFrame > 0 && from > to) || (absoluteFrame < 0 && from < to)) {\r\n currentFrame = returnValue && frameRange !== 0 ? to + (absoluteFrame % frameRange) : from;\r\n } else {\r\n currentFrame = returnValue && frameRange !== 0 ? from + (absoluteFrame % frameRange) : to;\r\n }\r\n }\r\n\r\n // Reset event/state if looping\r\n if ((!yoyoMode && ((speedRatio > 0 && this.currentFrame > currentFrame) || (speedRatio < 0 && this.currentFrame < currentFrame))) || (yoyoMode && yoyoLoop)) {\r\n this._onLoop();\r\n\r\n // Need to reset animation events\r\n for (let index = 0; index < events.length; index++) {\r\n if (!events[index].onlyOnce) {\r\n // reset event, the animation is looping\r\n events[index].isDone = false;\r\n }\r\n }\r\n\r\n this._animationState.key = speedRatio > 0 ? 0 : animation.getKeys().length - 1;\r\n }\r\n this._currentFrame = currentFrame;\r\n this._animationState.repeatCount = frameRange === 0 ? 0 : (absoluteFrame / frameRange) >> 0;\r\n this._animationState.highLimitValue = highLimitValue;\r\n this._animationState.offsetValue = offsetValue;\r\n } else {\r\n frameRange = to - from;\r\n currentFrame = this._coreRuntimeAnimation.currentFrame;\r\n this._currentFrame = currentFrame;\r\n this._animationState.repeatCount = this._coreRuntimeAnimation._animationState.repeatCount;\r\n this._animationState.highLimitValue = this._coreRuntimeAnimation._animationState.highLimitValue;\r\n this._animationState.offsetValue = this._coreRuntimeAnimation._animationState.offsetValue;\r\n }\r\n\r\n const currentValue = animation._interpolate(currentFrame, this._animationState);\r\n\r\n // Set value\r\n this.setValue(currentValue, weight);\r\n\r\n // Check events\r\n if (events.length) {\r\n for (let index = 0; index < events.length; index++) {\r\n // Make sure current frame has passed event frame and that event frame is within the current range\r\n // Also, handle both forward and reverse animations\r\n if (\r\n (frameRange >= 0 && currentFrame >= events[index].frame && events[index].frame >= from) ||\r\n (frameRange < 0 && currentFrame <= events[index].frame && events[index].frame <= from)\r\n ) {\r\n const event = events[index];\r\n if (!event.isDone) {\r\n // If event should be done only once, remove it.\r\n if (event.onlyOnce) {\r\n events.splice(index, 1);\r\n index--;\r\n }\r\n event.isDone = true;\r\n event.action(currentFrame);\r\n } // Don't do anything if the event has already been done.\r\n }\r\n }\r\n }\r\n\r\n if (!returnValue) {\r\n this._stopped = true;\r\n }\r\n\r\n return returnValue;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"runtimeAnimation.js","sourceRoot":"","sources":["../../../../dev/core/src/Animations/runtimeAnimation.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable } from \"../types\";\r\nimport { Matrix } from \"../Maths/math.vector\";\r\nimport type { _IAnimationState } from \"./animation\";\r\nimport {\r\n Animation,\r\n _StaticOffsetValueColor3,\r\n _StaticOffsetValueColor4,\r\n _StaticOffsetValueQuaternion,\r\n _StaticOffsetValueSize,\r\n _StaticOffsetValueVector2,\r\n _StaticOffsetValueVector3,\r\n} from \"./animation\";\r\nimport type { AnimationEvent } from \"./animationEvent\";\r\nimport type { Animatable } from \"./animatable\";\r\nimport type { Scene } from \"../scene\";\r\nimport type { IAnimationKey } from \"./animationKey\";\r\n\r\n/**\r\n * Defines a runtime animation\r\n */\r\nexport class RuntimeAnimation {\r\n private _events = new Array<AnimationEvent>();\r\n\r\n /**\r\n * The current frame of the runtime animation\r\n */\r\n private _currentFrame: number = 0;\r\n\r\n /**\r\n * The animation used by the runtime animation\r\n */\r\n public _animation: Animation;\r\n\r\n /**\r\n * The target of the runtime animation\r\n */\r\n private _target: any;\r\n\r\n /**\r\n * The initiating animatable\r\n */\r\n private _host: Animatable;\r\n\r\n /**\r\n * The original value of the runtime animation\r\n */\r\n private _originalValue = new Array<any>();\r\n\r\n /**\r\n * The original blend value of the runtime animation\r\n */\r\n private _originalBlendValue: Nullable<any> = null;\r\n\r\n /**\r\n * The offsets cache of the runtime animation\r\n */\r\n private _offsetsCache: { [key: string]: any } = {};\r\n\r\n /**\r\n * The high limits cache of the runtime animation\r\n */\r\n private _highLimitsCache: { [key: string]: any } = {};\r\n\r\n /**\r\n * Specifies if the runtime animation has been stopped\r\n */\r\n private _stopped = false;\r\n\r\n /**\r\n * The blending factor of the runtime animation\r\n */\r\n private _blendingFactor = 0;\r\n\r\n /**\r\n * The BabylonJS scene\r\n */\r\n private _scene: Scene;\r\n\r\n /**\r\n * The current value of the runtime animation\r\n */\r\n private _currentValue: Nullable<any> = null;\r\n\r\n /** @internal */\r\n public _animationState: _IAnimationState;\r\n\r\n /**\r\n * The active target of the runtime animation\r\n */\r\n private _activeTargets: any[];\r\n private _currentActiveTarget: Nullable<any> = null;\r\n private _directTarget: Nullable<any> = null;\r\n\r\n /**\r\n * The target path of the runtime animation\r\n */\r\n private _targetPath: string = \"\";\r\n\r\n /**\r\n * The weight of the runtime animation\r\n */\r\n private _weight = 1.0;\r\n\r\n /**\r\n * The absolute frame offset of the runtime animation\r\n */\r\n private _absoluteFrameOffset = 0;\r\n\r\n /**\r\n * The previous elapsed time (since start of animation) of the runtime animation\r\n */\r\n private _previousElapsedTime: number = 0;\r\n\r\n private _yoyoDirection: number = 1;\r\n\r\n /**\r\n * The previous absolute frame of the runtime animation (meaning, without taking into account the from/to values, only the elapsed time and the fps)\r\n */\r\n private _previousAbsoluteFrame: number = 0;\r\n\r\n private _enableBlending: boolean;\r\n\r\n private _keys: IAnimationKey[];\r\n private _minFrame: number;\r\n private _maxFrame: number;\r\n private _targetIsArray = false;\r\n\r\n /** @internal */\r\n public _coreRuntimeAnimation: RuntimeAnimation | null = null;\r\n\r\n /**\r\n * Gets the current frame of the runtime animation\r\n */\r\n public get currentFrame(): number {\r\n return this._currentFrame;\r\n }\r\n\r\n /**\r\n * Gets the weight of the runtime animation\r\n */\r\n public get weight(): number {\r\n return this._weight;\r\n }\r\n\r\n /**\r\n * Gets the current value of the runtime animation\r\n */\r\n public get currentValue(): any {\r\n return this._currentValue;\r\n }\r\n\r\n /**\r\n * Gets or sets the target path of the runtime animation\r\n */\r\n public get targetPath(): string {\r\n return this._targetPath;\r\n }\r\n\r\n /**\r\n * Gets the actual target of the runtime animation\r\n */\r\n public get target(): any {\r\n return this._currentActiveTarget;\r\n }\r\n\r\n /**\r\n * Gets the additive state of the runtime animation\r\n */\r\n public get isAdditive(): boolean {\r\n return this._host && this._host.isAdditive;\r\n }\r\n\r\n /** @internal */\r\n public _onLoop: () => void;\r\n\r\n /**\r\n * Create a new RuntimeAnimation object\r\n * @param target defines the target of the animation\r\n * @param animation defines the source animation object\r\n * @param scene defines the hosting scene\r\n * @param host defines the initiating Animatable\r\n */\r\n public constructor(target: any, animation: Animation, scene: Scene, host: Animatable) {\r\n this._animation = animation;\r\n this._target = target;\r\n this._scene = scene;\r\n this._host = host;\r\n this._activeTargets = [];\r\n\r\n animation._runtimeAnimations.push(this);\r\n\r\n // State\r\n this._animationState = {\r\n key: 0,\r\n repeatCount: 0,\r\n loopMode: this._getCorrectLoopMode(),\r\n };\r\n\r\n if (this._animation.dataType === Animation.ANIMATIONTYPE_MATRIX) {\r\n this._animationState.workValue = Matrix.Zero();\r\n }\r\n\r\n // Limits\r\n this._keys = this._animation.getKeys();\r\n this._minFrame = this._keys[0].frame;\r\n this._maxFrame = this._keys[this._keys.length - 1].frame;\r\n\r\n // Add a start key at frame 0 if missing\r\n if (this._minFrame !== 0) {\r\n const newKey = { frame: 0, value: this._keys[0].value };\r\n this._keys.splice(0, 0, newKey);\r\n }\r\n\r\n // Check data\r\n if (this._target instanceof Array) {\r\n let index = 0;\r\n for (const target of this._target) {\r\n this._preparePath(target, index);\r\n this._getOriginalValues(index);\r\n index++;\r\n }\r\n this._targetIsArray = true;\r\n } else {\r\n this._preparePath(this._target);\r\n this._getOriginalValues();\r\n this._targetIsArray = false;\r\n this._directTarget = this._activeTargets[0];\r\n }\r\n\r\n // Cloning events locally\r\n const events = animation.getEvents();\r\n if (events && events.length > 0) {\r\n for (const e of events) {\r\n this._events.push(e._clone());\r\n }\r\n }\r\n\r\n this._enableBlending = target && target.animationPropertiesOverride ? target.animationPropertiesOverride.enableBlending : this._animation.enableBlending;\r\n }\r\n\r\n private _preparePath(target: any, targetIndex = 0) {\r\n const targetPropertyPath = this._animation.targetPropertyPath;\r\n\r\n if (targetPropertyPath.length > 1) {\r\n let property = target;\r\n for (let index = 0; index < targetPropertyPath.length - 1; index++) {\r\n const name = targetPropertyPath[index];\r\n property = property[name];\r\n if (property === undefined) {\r\n throw new Error(`Invalid property (${name}) in property path (${targetPropertyPath.join(\".\")})`);\r\n }\r\n }\r\n\r\n this._targetPath = targetPropertyPath[targetPropertyPath.length - 1];\r\n this._activeTargets[targetIndex] = property;\r\n } else {\r\n this._targetPath = targetPropertyPath[0];\r\n this._activeTargets[targetIndex] = target;\r\n }\r\n\r\n if (this._activeTargets[targetIndex][this._targetPath] === undefined) {\r\n throw new Error(`Invalid property (${this._targetPath}) in property path (${targetPropertyPath.join(\".\")})`);\r\n }\r\n }\r\n\r\n /**\r\n * Gets the animation from the runtime animation\r\n */\r\n public get animation(): Animation {\r\n return this._animation;\r\n }\r\n\r\n /**\r\n * Resets the runtime animation to the beginning\r\n * @param restoreOriginal defines whether to restore the target property to the original value\r\n */\r\n public reset(restoreOriginal = false): void {\r\n if (restoreOriginal) {\r\n if (this._target instanceof Array) {\r\n let index = 0;\r\n for (const target of this._target) {\r\n if (this._originalValue[index] !== undefined) {\r\n this._setValue(target, this._activeTargets[index], this._originalValue[index], -1, index);\r\n }\r\n index++;\r\n }\r\n } else {\r\n if (this._originalValue[0] !== undefined) {\r\n this._setValue(this._target, this._directTarget, this._originalValue[0], -1, 0);\r\n }\r\n }\r\n }\r\n\r\n this._offsetsCache = {};\r\n this._highLimitsCache = {};\r\n this._currentFrame = 0;\r\n this._blendingFactor = 0;\r\n\r\n // Events\r\n for (let index = 0; index < this._events.length; index++) {\r\n this._events[index].isDone = false;\r\n }\r\n }\r\n\r\n /**\r\n * Specifies if the runtime animation is stopped\r\n * @returns Boolean specifying if the runtime animation is stopped\r\n */\r\n public isStopped(): boolean {\r\n return this._stopped;\r\n }\r\n\r\n /**\r\n * Disposes of the runtime animation\r\n */\r\n public dispose(): void {\r\n const index = this._animation.runtimeAnimations.indexOf(this);\r\n\r\n if (index > -1) {\r\n this._animation.runtimeAnimations.splice(index, 1);\r\n }\r\n }\r\n\r\n /**\r\n * Apply the interpolated value to the target\r\n * @param currentValue defines the value computed by the animation\r\n * @param weight defines the weight to apply to this value (Defaults to 1.0)\r\n */\r\n public setValue(currentValue: any, weight: number) {\r\n if (this._targetIsArray) {\r\n for (let index = 0; index < this._target.length; index++) {\r\n const target = this._target[index];\r\n this._setValue(target, this._activeTargets[index], currentValue, weight, index);\r\n }\r\n return;\r\n }\r\n this._setValue(this._target, this._directTarget, currentValue, weight, 0);\r\n }\r\n\r\n private _getOriginalValues(targetIndex = 0) {\r\n let originalValue: any;\r\n const target = this._activeTargets[targetIndex];\r\n\r\n if (target.getLocalMatrix && this._targetPath === \"_matrix\") {\r\n // For bones\r\n originalValue = target.getLocalMatrix();\r\n } else {\r\n originalValue = target[this._targetPath];\r\n }\r\n\r\n if (originalValue && originalValue.clone) {\r\n this._originalValue[targetIndex] = originalValue.clone();\r\n } else {\r\n this._originalValue[targetIndex] = originalValue;\r\n }\r\n }\r\n\r\n private _registerTargetForLateAnimationBinding(runtimeAnimation: RuntimeAnimation, originalValue: any): void {\r\n const target = runtimeAnimation.target;\r\n this._scene._registeredForLateAnimationBindings.pushNoDuplicate(target);\r\n\r\n if (!target._lateAnimationHolders) {\r\n target._lateAnimationHolders = {};\r\n }\r\n\r\n if (!target._lateAnimationHolders[runtimeAnimation.targetPath]) {\r\n target._lateAnimationHolders[runtimeAnimation.targetPath] = {\r\n totalWeight: 0,\r\n totalAdditiveWeight: 0,\r\n animations: [],\r\n additiveAnimations: [],\r\n originalValue: originalValue,\r\n };\r\n }\r\n\r\n if (runtimeAnimation.isAdditive) {\r\n target._lateAnimationHolders[runtimeAnimation.targetPath].additiveAnimations.push(runtimeAnimation);\r\n target._lateAnimationHolders[runtimeAnimation.targetPath].totalAdditiveWeight += runtimeAnimation.weight;\r\n } else {\r\n target._lateAnimationHolders[runtimeAnimation.targetPath].animations.push(runtimeAnimation);\r\n target._lateAnimationHolders[runtimeAnimation.targetPath].totalWeight += runtimeAnimation.weight;\r\n }\r\n }\r\n\r\n private _setValue(target: any, destination: any, currentValue: any, weight: number, targetIndex: number): void {\r\n // Set value\r\n this._currentActiveTarget = destination;\r\n\r\n this._weight = weight;\r\n\r\n if (this._enableBlending && this._blendingFactor <= 1.0) {\r\n if (!this._originalBlendValue) {\r\n const originalValue = destination[this._targetPath];\r\n\r\n if (originalValue.clone) {\r\n this._originalBlendValue = originalValue.clone();\r\n } else {\r\n this._originalBlendValue = originalValue;\r\n }\r\n }\r\n\r\n if (this._originalBlendValue.m) {\r\n // Matrix\r\n if (Animation.AllowMatrixDecomposeForInterpolation) {\r\n if (this._currentValue) {\r\n Matrix.DecomposeLerpToRef(this._originalBlendValue, currentValue, this._blendingFactor, this._currentValue);\r\n } else {\r\n this._currentValue = Matrix.DecomposeLerp(this._originalBlendValue, currentValue, this._blendingFactor);\r\n }\r\n } else {\r\n if (this._currentValue) {\r\n Matrix.LerpToRef(this._originalBlendValue, currentValue, this._blendingFactor, this._currentValue);\r\n } else {\r\n this._currentValue = Matrix.Lerp(this._originalBlendValue, currentValue, this._blendingFactor);\r\n }\r\n }\r\n } else {\r\n this._currentValue = Animation._UniversalLerp(this._originalBlendValue, currentValue, this._blendingFactor);\r\n }\r\n\r\n const blendingSpeed = target && target.animationPropertiesOverride ? target.animationPropertiesOverride.blendingSpeed : this._animation.blendingSpeed;\r\n this._blendingFactor += blendingSpeed;\r\n } else {\r\n if (!this._currentValue) {\r\n if (currentValue?.clone) {\r\n this._currentValue = currentValue.clone();\r\n } else {\r\n this._currentValue = currentValue;\r\n }\r\n } else if (this._currentValue.copyFrom) {\r\n if (currentValue !== null) {\r\n this._currentValue.copyFrom(currentValue);\r\n } else {\r\n this._currentValue = currentValue;\r\n }\r\n } else {\r\n this._currentValue = currentValue;\r\n }\r\n }\r\n\r\n if (weight !== -1.0) {\r\n this._registerTargetForLateAnimationBinding(this, this._originalValue[targetIndex]);\r\n } else {\r\n if (this._animationState.loopMode === Animation.ANIMATIONLOOPMODE_RELATIVE_FROM_CURRENT) {\r\n if (this._currentValue.addToRef) {\r\n this._currentValue.addToRef(this._originalValue[targetIndex], destination[this._targetPath]);\r\n } else {\r\n destination[this._targetPath] = this._originalValue[targetIndex] + this._currentValue;\r\n }\r\n } else {\r\n destination[this._targetPath] = this._currentValue;\r\n }\r\n }\r\n\r\n if (target.markAsDirty) {\r\n target.markAsDirty(this._animation.targetProperty);\r\n }\r\n }\r\n\r\n /**\r\n * Gets the loop pmode of the runtime animation\r\n * @returns Loop Mode\r\n */\r\n private _getCorrectLoopMode(): number | undefined {\r\n if (this._target && this._target.animationPropertiesOverride) {\r\n return this._target.animationPropertiesOverride.loopMode as number;\r\n }\r\n\r\n return this._animation.loopMode;\r\n }\r\n\r\n /**\r\n * Move the current animation to a given frame\r\n * @param frame defines the frame to move to\r\n * @param weight defines the weight to apply to the animation (-1.0 by default)\r\n */\r\n public goToFrame(frame: number, weight = -1): void {\r\n const keys = this._animation.getKeys();\r\n\r\n if (frame < keys[0].frame) {\r\n frame = keys[0].frame;\r\n } else if (frame > keys[keys.length - 1].frame) {\r\n frame = keys[keys.length - 1].frame;\r\n }\r\n\r\n // Need to reset animation events\r\n const events = this._events;\r\n if (events.length) {\r\n for (let index = 0; index < events.length; index++) {\r\n if (!events[index].onlyOnce) {\r\n // reset events in the future\r\n events[index].isDone = events[index].frame < frame;\r\n }\r\n }\r\n }\r\n\r\n this._currentFrame = frame;\r\n const currentValue = this._animation._interpolate(frame, this._animationState);\r\n\r\n this.setValue(currentValue, weight);\r\n }\r\n\r\n /**\r\n * @internal Internal use only\r\n */\r\n public _prepareForSpeedRatioChange(newSpeedRatio: number): void {\r\n const newAbsoluteFrame = (this._previousElapsedTime * (this._animation.framePerSecond * newSpeedRatio)) / 1000.0;\r\n\r\n this._absoluteFrameOffset = this._previousAbsoluteFrame - newAbsoluteFrame;\r\n }\r\n\r\n /**\r\n * Execute the current animation\r\n * @param elapsedTimeSinceAnimationStart defines the elapsed time (in milliseconds) since the animation was started\r\n * @param from defines the lower frame of the animation range\r\n * @param to defines the upper frame of the animation range\r\n * @param loop defines if the current animation must loop\r\n * @param speedRatio defines the current speed ratio\r\n * @param weight defines the weight of the animation (default is -1 so no weight)\r\n * @returns a boolean indicating if the animation is running\r\n */\r\n public animate(elapsedTimeSinceAnimationStart: number, from: number, to: number, loop: boolean, speedRatio: number, weight = -1.0): boolean {\r\n const animation = this._animation;\r\n const targetPropertyPath = animation.targetPropertyPath;\r\n if (!targetPropertyPath || targetPropertyPath.length < 1) {\r\n this._stopped = true;\r\n return false;\r\n }\r\n\r\n let returnValue = true;\r\n let currentFrame: number;\r\n const events = this._events;\r\n let frameRange: number;\r\n\r\n if (!this._coreRuntimeAnimation) {\r\n // Check limits\r\n if (from < this._minFrame || from > this._maxFrame) {\r\n from = this._minFrame;\r\n }\r\n if (to < this._minFrame || to > this._maxFrame) {\r\n to = this._maxFrame;\r\n }\r\n\r\n frameRange = to - from;\r\n let offsetValue: any;\r\n\r\n // Compute the frame according to the elapsed time and the fps of the animation (\"from\" and \"to\" are not factored in!)\r\n let absoluteFrame = (elapsedTimeSinceAnimationStart * (animation.framePerSecond * speedRatio)) / 1000.0 + this._absoluteFrameOffset;\r\n let highLimitValue = 0;\r\n\r\n // Apply the yoyo function if required\r\n let yoyoLoop = false;\r\n const yoyoMode = loop && this._animationState.loopMode === Animation.ANIMATIONLOOPMODE_YOYO;\r\n if (yoyoMode) {\r\n const position = (absoluteFrame - from) / frameRange;\r\n\r\n // Apply the yoyo curve\r\n const sin = Math.sin(position * Math.PI);\r\n const yoyoPosition = Math.abs(sin);\r\n\r\n // Map the yoyo position back to the range\r\n absoluteFrame = yoyoPosition * frameRange + from;\r\n\r\n const direction = sin >= 0 ? 1 : -1;\r\n if (this._yoyoDirection !== direction) {\r\n yoyoLoop = true;\r\n }\r\n\r\n this._yoyoDirection = direction;\r\n }\r\n\r\n this._previousElapsedTime = elapsedTimeSinceAnimationStart;\r\n this._previousAbsoluteFrame = absoluteFrame;\r\n\r\n if (!loop && to >= from && ((absoluteFrame >= frameRange && speedRatio > 0) || (absoluteFrame <= 0 && speedRatio < 0))) {\r\n // If we are out of range and not looping get back to caller\r\n returnValue = false;\r\n highLimitValue = animation.evaluate(to);\r\n } else if (!loop && from >= to && ((absoluteFrame <= frameRange && speedRatio < 0) || (absoluteFrame >= 0 && speedRatio > 0))) {\r\n returnValue = false;\r\n highLimitValue = animation.evaluate(from);\r\n } else if (this._animationState.loopMode !== Animation.ANIMATIONLOOPMODE_CYCLE) {\r\n const keyOffset = to.toString() + from.toString();\r\n if (!this._offsetsCache[keyOffset]) {\r\n this._animationState.repeatCount = 0;\r\n this._animationState.loopMode = Animation.ANIMATIONLOOPMODE_CYCLE; // force a specific codepath in animation._interpolate()!\r\n const fromValue = animation._interpolate(from, this._animationState);\r\n const toValue = animation._interpolate(to, this._animationState);\r\n\r\n this._animationState.loopMode = this._getCorrectLoopMode();\r\n switch (animation.dataType) {\r\n // Float\r\n case Animation.ANIMATIONTYPE_FLOAT:\r\n this._offsetsCache[keyOffset] = toValue - fromValue;\r\n break;\r\n // Quaternion\r\n case Animation.ANIMATIONTYPE_QUATERNION:\r\n this._offsetsCache[keyOffset] = toValue.subtract(fromValue);\r\n break;\r\n // Vector3\r\n case Animation.ANIMATIONTYPE_VECTOR3:\r\n this._offsetsCache[keyOffset] = toValue.subtract(fromValue);\r\n break;\r\n // Vector2\r\n case Animation.ANIMATIONTYPE_VECTOR2:\r\n this._offsetsCache[keyOffset] = toValue.subtract(fromValue);\r\n break;\r\n // Size\r\n case Animation.ANIMATIONTYPE_SIZE:\r\n this._offsetsCache[keyOffset] = toValue.subtract(fromValue);\r\n break;\r\n // Color3\r\n case Animation.ANIMATIONTYPE_COLOR3:\r\n this._offsetsCache[keyOffset] = toValue.subtract(fromValue);\r\n break;\r\n default:\r\n break;\r\n }\r\n\r\n this._highLimitsCache[keyOffset] = toValue;\r\n }\r\n\r\n highLimitValue = this._highLimitsCache[keyOffset];\r\n offsetValue = this._offsetsCache[keyOffset];\r\n }\r\n\r\n if (offsetValue === undefined) {\r\n switch (animation.dataType) {\r\n // Float\r\n case Animation.ANIMATIONTYPE_FLOAT:\r\n offsetValue = 0;\r\n break;\r\n // Quaternion\r\n case Animation.ANIMATIONTYPE_QUATERNION:\r\n offsetValue = _StaticOffsetValueQuaternion;\r\n break;\r\n // Vector3\r\n case Animation.ANIMATIONTYPE_VECTOR3:\r\n offsetValue = _StaticOffsetValueVector3;\r\n break;\r\n // Vector2\r\n case Animation.ANIMATIONTYPE_VECTOR2:\r\n offsetValue = _StaticOffsetValueVector2;\r\n break;\r\n // Size\r\n case Animation.ANIMATIONTYPE_SIZE:\r\n offsetValue = _StaticOffsetValueSize;\r\n break;\r\n // Color3\r\n case Animation.ANIMATIONTYPE_COLOR3:\r\n offsetValue = _StaticOffsetValueColor3;\r\n break;\r\n case Animation.ANIMATIONTYPE_COLOR4:\r\n offsetValue = _StaticOffsetValueColor4;\r\n break;\r\n }\r\n }\r\n\r\n // Compute value\r\n\r\n if (this._host && this._host.syncRoot) {\r\n // If we must sync with an animatable, calculate the current frame based on the frame of the root animatable\r\n const syncRoot = this._host.syncRoot;\r\n const hostNormalizedFrame = (syncRoot.masterFrame - syncRoot.fromFrame) / (syncRoot.toFrame - syncRoot.fromFrame);\r\n currentFrame = from + frameRange * hostNormalizedFrame;\r\n } else {\r\n if ((absoluteFrame > 0 && from > to) || (absoluteFrame < 0 && from < to)) {\r\n currentFrame = returnValue && frameRange !== 0 ? to + (absoluteFrame % frameRange) : from;\r\n } else {\r\n currentFrame = returnValue && frameRange !== 0 ? from + (absoluteFrame % frameRange) : to;\r\n }\r\n }\r\n\r\n // Reset event/state if looping\r\n if ((!yoyoMode && ((speedRatio > 0 && this.currentFrame > currentFrame) || (speedRatio < 0 && this.currentFrame < currentFrame))) || (yoyoMode && yoyoLoop)) {\r\n this._onLoop();\r\n\r\n // Need to reset animation events\r\n for (let index = 0; index < events.length; index++) {\r\n if (!events[index].onlyOnce) {\r\n // reset event, the animation is looping\r\n events[index].isDone = false;\r\n }\r\n }\r\n\r\n this._animationState.key = speedRatio > 0 ? 0 : animation.getKeys().length - 1;\r\n }\r\n this._currentFrame = currentFrame;\r\n this._animationState.repeatCount = frameRange === 0 ? 0 : (absoluteFrame / frameRange) >> 0;\r\n this._animationState.highLimitValue = highLimitValue;\r\n this._animationState.offsetValue = offsetValue;\r\n } else {\r\n frameRange = to - from;\r\n currentFrame = this._coreRuntimeAnimation.currentFrame;\r\n this._currentFrame = currentFrame;\r\n this._animationState.repeatCount = this._coreRuntimeAnimation._animationState.repeatCount;\r\n this._animationState.highLimitValue = this._coreRuntimeAnimation._animationState.highLimitValue;\r\n this._animationState.offsetValue = this._coreRuntimeAnimation._animationState.offsetValue;\r\n }\r\n\r\n const currentValue = animation._interpolate(currentFrame, this._animationState);\r\n\r\n // Set value\r\n this.setValue(currentValue, weight);\r\n\r\n // Check events\r\n if (events.length) {\r\n for (let index = 0; index < events.length; index++) {\r\n // Make sure current frame has passed event frame and that event frame is within the current range\r\n // Also, handle both forward and reverse animations\r\n if (\r\n (frameRange >= 0 && currentFrame >= events[index].frame && events[index].frame >= from) ||\r\n (frameRange < 0 && currentFrame <= events[index].frame && events[index].frame <= from)\r\n ) {\r\n const event = events[index];\r\n if (!event.isDone) {\r\n // If event should be done only once, remove it.\r\n if (event.onlyOnce) {\r\n events.splice(index, 1);\r\n index--;\r\n }\r\n event.isDone = true;\r\n event.action(currentFrame);\r\n } // Don't do anything if the event has already been done.\r\n }\r\n }\r\n }\r\n\r\n if (!returnValue) {\r\n this._stopped = true;\r\n }\r\n\r\n return returnValue;\r\n }\r\n}\r\n"]}