@onerjs/core 8.51.3 → 8.51.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (227) hide show
  1. package/Animations/animationGroup.d.ts +2 -1
  2. package/Animations/animationGroup.js +3 -2
  3. package/Animations/animationGroup.js.map +1 -1
  4. package/Animations/animatorAvatar.d.ts +2 -0
  5. package/Animations/animatorAvatar.js +163 -94
  6. package/Animations/animatorAvatar.js.map +1 -1
  7. package/Engines/WebGPU/webgpuSnapshotRendering.js +7 -3
  8. package/Engines/WebGPU/webgpuSnapshotRendering.js.map +1 -1
  9. package/Engines/constants.d.ts +10 -0
  10. package/Engines/constants.js +10 -0
  11. package/Engines/constants.js.map +1 -1
  12. package/Events/deviceInputEvents.d.ts +5 -0
  13. package/Events/deviceInputEvents.js.map +1 -1
  14. package/FlowGraph/Blocks/Data/flowGraphIsKeyPressedBlock.d.ts +65 -0
  15. package/FlowGraph/Blocks/Data/flowGraphIsKeyPressedBlock.js +74 -0
  16. package/FlowGraph/Blocks/Data/flowGraphIsKeyPressedBlock.js.map +1 -0
  17. package/FlowGraph/Blocks/Data/index.d.ts +1 -0
  18. package/FlowGraph/Blocks/Data/index.js +1 -0
  19. package/FlowGraph/Blocks/Data/index.js.map +1 -1
  20. package/FlowGraph/Blocks/Event/flowGraphKeyDownEventBlock.d.ts +39 -0
  21. package/FlowGraph/Blocks/Event/flowGraphKeyDownEventBlock.js +42 -0
  22. package/FlowGraph/Blocks/Event/flowGraphKeyDownEventBlock.js.map +1 -0
  23. package/FlowGraph/Blocks/Event/flowGraphKeyUpEventBlock.d.ts +19 -0
  24. package/FlowGraph/Blocks/Event/flowGraphKeyUpEventBlock.js +25 -0
  25. package/FlowGraph/Blocks/Event/flowGraphKeyUpEventBlock.js.map +1 -0
  26. package/FlowGraph/Blocks/Event/flowGraphKeyboardEventBlock.d.ts +64 -0
  27. package/FlowGraph/Blocks/Event/flowGraphKeyboardEventBlock.js +50 -0
  28. package/FlowGraph/Blocks/Event/flowGraphKeyboardEventBlock.js.map +1 -0
  29. package/FlowGraph/Blocks/Event/index.d.ts +3 -0
  30. package/FlowGraph/Blocks/Event/index.js +3 -0
  31. package/FlowGraph/Blocks/Event/index.js.map +1 -1
  32. package/FlowGraph/Blocks/flowGraphBlockFactory.js +7 -0
  33. package/FlowGraph/Blocks/flowGraphBlockFactory.js.map +1 -1
  34. package/FlowGraph/Blocks/flowGraphBlockNames.d.ts +3 -0
  35. package/FlowGraph/Blocks/flowGraphBlockNames.js +3 -0
  36. package/FlowGraph/Blocks/flowGraphBlockNames.js.map +1 -1
  37. package/FlowGraph/flowGraph.d.ts +6 -0
  38. package/FlowGraph/flowGraph.js +10 -1
  39. package/FlowGraph/flowGraph.js.map +1 -1
  40. package/FlowGraph/flowGraphContext.d.ts +8 -0
  41. package/FlowGraph/flowGraphContext.js.map +1 -1
  42. package/FlowGraph/flowGraphEventType.d.ts +2 -0
  43. package/FlowGraph/flowGraphEventType.js +2 -0
  44. package/FlowGraph/flowGraphEventType.js.map +1 -1
  45. package/FlowGraph/flowGraphSceneEventCoordinator.d.ts +14 -0
  46. package/FlowGraph/flowGraphSceneEventCoordinator.js +56 -0
  47. package/FlowGraph/flowGraphSceneEventCoordinator.js.map +1 -1
  48. package/FlowGraph/utils.d.ts +7 -0
  49. package/FlowGraph/utils.js +8 -0
  50. package/FlowGraph/utils.js.map +1 -1
  51. package/Materials/GaussianSplatting/gaussianSplattingMaterial.js +6 -0
  52. package/Materials/GaussianSplatting/gaussianSplattingMaterial.js.map +1 -1
  53. package/Materials/Node/Blocks/Fragment/perturbNormalBlock.js +6 -3
  54. package/Materials/Node/Blocks/Fragment/perturbNormalBlock.js.map +1 -1
  55. package/Materials/PBR/openpbrMaterial.d.ts +8 -0
  56. package/Materials/PBR/openpbrMaterial.js +16 -0
  57. package/Materials/PBR/openpbrMaterial.js.map +1 -1
  58. package/Materials/PBR/pbrBaseMaterial.d.ts +1 -0
  59. package/Materials/PBR/pbrBaseMaterial.js +8 -0
  60. package/Materials/PBR/pbrBaseMaterial.js.map +1 -1
  61. package/Materials/Textures/Procedurals/proceduralTexture.d.ts +6 -0
  62. package/Materials/Textures/Procedurals/proceduralTexture.js +3 -1
  63. package/Materials/Textures/Procedurals/proceduralTexture.js.map +1 -1
  64. package/Materials/Textures/index.d.ts +1 -0
  65. package/Materials/Textures/index.js +1 -0
  66. package/Materials/Textures/index.js.map +1 -1
  67. package/Materials/Textures/textureMerger.js +1 -0
  68. package/Materials/Textures/textureMerger.js.map +1 -1
  69. package/Materials/Textures/textureProcessor.d.ts +315 -0
  70. package/Materials/Textures/textureProcessor.js +792 -0
  71. package/Materials/Textures/textureProcessor.js.map +1 -0
  72. package/Materials/material.d.ts +24 -0
  73. package/Materials/material.js +39 -0
  74. package/Materials/material.js.map +1 -1
  75. package/Materials/standardMaterial.d.ts +1 -0
  76. package/Materials/standardMaterial.js +6 -0
  77. package/Materials/standardMaterial.js.map +1 -1
  78. package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.js +30 -8
  79. package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.js.map +1 -1
  80. package/Misc/snapshotRenderingHelper.d.ts +4 -2
  81. package/Misc/snapshotRenderingHelper.js +33 -22
  82. package/Misc/snapshotRenderingHelper.js.map +1 -1
  83. package/Particles/thinParticleSystem.d.ts +6 -1
  84. package/Particles/thinParticleSystem.js +23 -6
  85. package/Particles/thinParticleSystem.js.map +1 -1
  86. package/Physics/v2/characterController.d.ts +104 -7
  87. package/Physics/v2/characterController.js +355 -7
  88. package/Physics/v2/characterController.js.map +1 -1
  89. package/Shaders/ShadersInclude/bumpFragment.js +3 -3
  90. package/Shaders/ShadersInclude/bumpFragment.js.map +1 -1
  91. package/Shaders/ShadersInclude/bumpFragmentMainFunctions.js +5 -1
  92. package/Shaders/ShadersInclude/bumpFragmentMainFunctions.js.map +1 -1
  93. package/Shaders/ShadersInclude/defaultFragmentDeclaration.js +3 -0
  94. package/Shaders/ShadersInclude/defaultFragmentDeclaration.js.map +1 -1
  95. package/Shaders/ShadersInclude/defaultUboDeclaration.js +1 -1
  96. package/Shaders/ShadersInclude/defaultUboDeclaration.js.map +1 -1
  97. package/Shaders/ShadersInclude/defaultVertexDeclaration.js +1 -1
  98. package/Shaders/ShadersInclude/defaultVertexDeclaration.js.map +1 -1
  99. package/Shaders/ShadersInclude/openpbrAmbientOcclusionData.js +1 -1
  100. package/Shaders/ShadersInclude/openpbrAmbientOcclusionData.js.map +1 -1
  101. package/Shaders/ShadersInclude/openpbrBackgroundTransmission.js +1 -1
  102. package/Shaders/ShadersInclude/openpbrBackgroundTransmission.js.map +1 -1
  103. package/Shaders/ShadersInclude/openpbrBaseLayerData.js +14 -14
  104. package/Shaders/ShadersInclude/openpbrBaseLayerData.js.map +1 -1
  105. package/Shaders/ShadersInclude/openpbrCoatLayerData.js +6 -6
  106. package/Shaders/ShadersInclude/openpbrCoatLayerData.js.map +1 -1
  107. package/Shaders/ShadersInclude/openpbrDirectLighting.js +1 -1
  108. package/Shaders/ShadersInclude/openpbrDirectLighting.js.map +1 -1
  109. package/Shaders/ShadersInclude/openpbrEnvironmentLighting.js +1 -1
  110. package/Shaders/ShadersInclude/openpbrEnvironmentLighting.js.map +1 -1
  111. package/Shaders/ShadersInclude/openpbrFragmentDeclaration.js +3 -0
  112. package/Shaders/ShadersInclude/openpbrFragmentDeclaration.js.map +1 -1
  113. package/Shaders/ShadersInclude/openpbrFuzzLayerData.js +3 -3
  114. package/Shaders/ShadersInclude/openpbrFuzzLayerData.js.map +1 -1
  115. package/Shaders/ShadersInclude/openpbrNormalMapFragment.js +4 -4
  116. package/Shaders/ShadersInclude/openpbrNormalMapFragment.js.map +1 -1
  117. package/Shaders/ShadersInclude/openpbrSubsurfaceLayerData.js +7 -3
  118. package/Shaders/ShadersInclude/openpbrSubsurfaceLayerData.js.map +1 -1
  119. package/Shaders/ShadersInclude/openpbrThinFilmLayerData.js +2 -2
  120. package/Shaders/ShadersInclude/openpbrThinFilmLayerData.js.map +1 -1
  121. package/Shaders/ShadersInclude/openpbrTransmissionLayerData.js +5 -5
  122. package/Shaders/ShadersInclude/openpbrTransmissionLayerData.js.map +1 -1
  123. package/Shaders/ShadersInclude/openpbrUboDeclaration.js +1 -1
  124. package/Shaders/ShadersInclude/openpbrUboDeclaration.js.map +1 -1
  125. package/Shaders/ShadersInclude/openpbrVertexDeclaration.js +1 -1
  126. package/Shaders/ShadersInclude/openpbrVertexDeclaration.js.map +1 -1
  127. package/Shaders/ShadersInclude/pbrBlockFinalUnlitComponents.js +1 -1
  128. package/Shaders/ShadersInclude/pbrBlockFinalUnlitComponents.js.map +1 -1
  129. package/Shaders/ShadersInclude/pbrBlockLightmapInit.js +1 -1
  130. package/Shaders/ShadersInclude/pbrBlockLightmapInit.js.map +1 -1
  131. package/Shaders/ShadersInclude/pbrFragmentDeclaration.js +3 -0
  132. package/Shaders/ShadersInclude/pbrFragmentDeclaration.js.map +1 -1
  133. package/Shaders/ShadersInclude/pbrHelperFunctions.js +4 -0
  134. package/Shaders/ShadersInclude/pbrHelperFunctions.js.map +1 -1
  135. package/Shaders/ShadersInclude/pbrUboDeclaration.js +1 -1
  136. package/Shaders/ShadersInclude/pbrUboDeclaration.js.map +1 -1
  137. package/Shaders/ShadersInclude/pbrVertexDeclaration.js +1 -1
  138. package/Shaders/ShadersInclude/pbrVertexDeclaration.js.map +1 -1
  139. package/Shaders/ShadersInclude/textureRepetitionFunctions.d.ts +5 -0
  140. package/Shaders/ShadersInclude/textureRepetitionFunctions.js +52 -0
  141. package/Shaders/ShadersInclude/textureRepetitionFunctions.js.map +1 -0
  142. package/Shaders/default.fragment.d.ts +1 -0
  143. package/Shaders/default.fragment.js +8 -6
  144. package/Shaders/default.fragment.js.map +1 -1
  145. package/Shaders/geometry.fragment.js +3 -3
  146. package/Shaders/geometry.fragment.js.map +1 -1
  147. package/Shaders/openpbr.fragment.d.ts +1 -0
  148. package/Shaders/openpbr.fragment.js +4 -2
  149. package/Shaders/openpbr.fragment.js.map +1 -1
  150. package/Shaders/pbr.fragment.d.ts +1 -0
  151. package/Shaders/pbr.fragment.js +24 -22
  152. package/Shaders/pbr.fragment.js.map +1 -1
  153. package/Shaders/textureProcessor.fragment.d.ts +5 -0
  154. package/Shaders/textureProcessor.fragment.js +156 -0
  155. package/Shaders/textureProcessor.fragment.js.map +1 -0
  156. package/ShadersWGSL/ShadersInclude/bumpFragment.js +3 -3
  157. package/ShadersWGSL/ShadersInclude/bumpFragment.js.map +1 -1
  158. package/ShadersWGSL/ShadersInclude/bumpFragmentMainFunctions.js +5 -1
  159. package/ShadersWGSL/ShadersInclude/bumpFragmentMainFunctions.js.map +1 -1
  160. package/ShadersWGSL/ShadersInclude/defaultUboDeclaration.js +1 -1
  161. package/ShadersWGSL/ShadersInclude/defaultUboDeclaration.js.map +1 -1
  162. package/ShadersWGSL/ShadersInclude/openpbrAmbientOcclusionData.js +1 -1
  163. package/ShadersWGSL/ShadersInclude/openpbrAmbientOcclusionData.js.map +1 -1
  164. package/ShadersWGSL/ShadersInclude/openpbrBackgroundTransmission.js +1 -1
  165. package/ShadersWGSL/ShadersInclude/openpbrBackgroundTransmission.js.map +1 -1
  166. package/ShadersWGSL/ShadersInclude/openpbrBaseLayerData.js +15 -15
  167. package/ShadersWGSL/ShadersInclude/openpbrBaseLayerData.js.map +1 -1
  168. package/ShadersWGSL/ShadersInclude/openpbrCoatLayerData.js +7 -7
  169. package/ShadersWGSL/ShadersInclude/openpbrCoatLayerData.js.map +1 -1
  170. package/ShadersWGSL/ShadersInclude/openpbrDirectLighting.js +1 -1
  171. package/ShadersWGSL/ShadersInclude/openpbrDirectLighting.js.map +1 -1
  172. package/ShadersWGSL/ShadersInclude/openpbrEnvironmentLighting.js +1 -1
  173. package/ShadersWGSL/ShadersInclude/openpbrEnvironmentLighting.js.map +1 -1
  174. package/ShadersWGSL/ShadersInclude/openpbrFuzzLayerData.js +4 -4
  175. package/ShadersWGSL/ShadersInclude/openpbrFuzzLayerData.js.map +1 -1
  176. package/ShadersWGSL/ShadersInclude/openpbrIblFunctions.js +3 -3
  177. package/ShadersWGSL/ShadersInclude/openpbrIblFunctions.js.map +1 -1
  178. package/ShadersWGSL/ShadersInclude/openpbrNormalMapFragment.js +4 -4
  179. package/ShadersWGSL/ShadersInclude/openpbrNormalMapFragment.js.map +1 -1
  180. package/ShadersWGSL/ShadersInclude/openpbrSubsurfaceLayerData.js +7 -3
  181. package/ShadersWGSL/ShadersInclude/openpbrSubsurfaceLayerData.js.map +1 -1
  182. package/ShadersWGSL/ShadersInclude/openpbrThinFilmLayerData.js +2 -2
  183. package/ShadersWGSL/ShadersInclude/openpbrThinFilmLayerData.js.map +1 -1
  184. package/ShadersWGSL/ShadersInclude/openpbrTransmissionLayerData.js +6 -6
  185. package/ShadersWGSL/ShadersInclude/openpbrTransmissionLayerData.js.map +1 -1
  186. package/ShadersWGSL/ShadersInclude/openpbrUboDeclaration.js +1 -1
  187. package/ShadersWGSL/ShadersInclude/openpbrUboDeclaration.js.map +1 -1
  188. package/ShadersWGSL/ShadersInclude/pbrBlockFinalUnlitComponents.js +1 -1
  189. package/ShadersWGSL/ShadersInclude/pbrBlockFinalUnlitComponents.js.map +1 -1
  190. package/ShadersWGSL/ShadersInclude/pbrBlockLightmapInit.js +1 -1
  191. package/ShadersWGSL/ShadersInclude/pbrBlockLightmapInit.js.map +1 -1
  192. package/ShadersWGSL/ShadersInclude/pbrHelperFunctions.js +4 -0
  193. package/ShadersWGSL/ShadersInclude/pbrHelperFunctions.js.map +1 -1
  194. package/ShadersWGSL/ShadersInclude/pbrUboDeclaration.js +1 -1
  195. package/ShadersWGSL/ShadersInclude/pbrUboDeclaration.js.map +1 -1
  196. package/ShadersWGSL/ShadersInclude/textureRepetitionFunctions.d.ts +5 -0
  197. package/ShadersWGSL/ShadersInclude/textureRepetitionFunctions.js +52 -0
  198. package/ShadersWGSL/ShadersInclude/textureRepetitionFunctions.js.map +1 -0
  199. package/ShadersWGSL/default.fragment.d.ts +1 -0
  200. package/ShadersWGSL/default.fragment.js +8 -6
  201. package/ShadersWGSL/default.fragment.js.map +1 -1
  202. package/ShadersWGSL/geometry.fragment.js +3 -3
  203. package/ShadersWGSL/geometry.fragment.js.map +1 -1
  204. package/ShadersWGSL/openpbr.fragment.d.ts +1 -0
  205. package/ShadersWGSL/openpbr.fragment.js +5 -3
  206. package/ShadersWGSL/openpbr.fragment.js.map +1 -1
  207. package/ShadersWGSL/openpbr.vertex.js +1 -1
  208. package/ShadersWGSL/openpbr.vertex.js.map +1 -1
  209. package/ShadersWGSL/pbr.fragment.d.ts +1 -0
  210. package/ShadersWGSL/pbr.fragment.js +24 -22
  211. package/ShadersWGSL/pbr.fragment.js.map +1 -1
  212. package/ShadersWGSL/textureProcessor.fragment.d.ts +5 -0
  213. package/ShadersWGSL/textureProcessor.fragment.js +161 -0
  214. package/ShadersWGSL/textureProcessor.fragment.js.map +1 -0
  215. package/SmartAssets/index.d.ts +2 -0
  216. package/SmartAssets/index.js +2 -0
  217. package/SmartAssets/index.js.map +1 -0
  218. package/SmartAssets/smartAssetManager.d.ts +156 -0
  219. package/SmartAssets/smartAssetManager.js +531 -0
  220. package/SmartAssets/smartAssetManager.js.map +1 -0
  221. package/SmartAssets/smartAssetSerializer.d.ts +61 -0
  222. package/SmartAssets/smartAssetSerializer.js +97 -0
  223. package/SmartAssets/smartAssetSerializer.js.map +1 -0
  224. package/index.d.ts +1 -0
  225. package/index.js +1 -0
  226. package/index.js.map +1 -1
  227. package/package.json +1 -1
@@ -123,115 +123,133 @@ export class AnimatorAvatar {
123
123
  fixRootPosition: true,
124
124
  ...options,
125
125
  };
126
- // Make sure that all world matrices are up to date, both in the bone hierarchy and in the animation transform node hierarchy
127
- this._computeBoneWorldMatrices();
128
- const mapNodeNames = localOptions.mapNodeNames ?? new Map();
129
- const lstSourceTransformNodes = new Set();
130
- const sourceTransformNodeNameToNode = new Map();
131
- for (let i = 0; i < sourceAnimationGroup.targetedAnimations.length; ++i) {
132
- const ta = sourceAnimationGroup.targetedAnimations[i];
133
- if (ta.target.getClassName?.() === "TransformNode" && !lstSourceTransformNodes.has(ta.target)) {
134
- const tn = ta.target;
135
- lstSourceTransformNodes.add(tn);
136
- sourceTransformNodeNameToNode.set(mapNodeNames.get(tn.name) ?? tn.name, {
137
- node: tn,
138
- initialTransformations: {
139
- position: tn.position.clone(),
140
- scaling: tn.scaling.clone(),
141
- quaternion: tn.rotationQuaternion?.clone(),
142
- rotation: tn.rotation.clone(),
143
- },
144
- });
145
- if (!tn.rotationQuaternion) {
146
- tn.rotationQuaternion = Quaternion.FromEulerAngles(tn.rotation.x, tn.rotation.y, tn.rotation.z);
147
- tn.rotation.setAll(0);
148
- }
149
- }
150
- }
151
- lstSourceTransformNodes.forEach((node) => {
152
- node.computeWorldMatrix(true);
153
- });
154
- // Clone the source animation and retarget it
155
- const animationGroup = sourceAnimationGroup.clone(localOptions.animationGroupName, undefined, true, true);
156
- const mapTransformNodeToRootNode = new Map();
157
- const lstAnims = new Set();
158
- for (let i = 0; i < animationGroup.targetedAnimations.length; ++i) {
159
- const ta = animationGroup.targetedAnimations[i];
160
- const animation = ta.animation;
161
- if (lstAnims.has(animation)) {
162
- if (this.showWarnings) {
163
- Logger.Warn(`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.`);
126
+ // Capture the avatar's current bone state so we can restore it before returning.
127
+ // _computeBoneWorldMatrices() (called next) returns the skeletons to rest, and the
128
+ // optional _fixRootPosition / _fixGroundReference helpers further drive the bones via
129
+ // an internal play / goToFrame loop. Without restoring afterwards, any animation
130
+ // already playing on the avatar gets clobbered (typically visible as a snap to the
131
+ // rest pose the moment that animation is later stopped). The restore is wrapped in
132
+ // a try/finally so the avatar is also reset if the body throws.
133
+ const avatarSkeletonStates = this._captureAvatarSkeletonStates();
134
+ try {
135
+ // Make sure that all world matrices are up to date, both in the bone hierarchy and in the animation transform node hierarchy
136
+ this._computeBoneWorldMatrices();
137
+ const mapNodeNames = localOptions.mapNodeNames ?? new Map();
138
+ const lstSourceTransformNodes = new Set();
139
+ const sourceTransformNodeNameToNode = new Map();
140
+ for (let i = 0; i < sourceAnimationGroup.targetedAnimations.length; ++i) {
141
+ const ta = sourceAnimationGroup.targetedAnimations[i];
142
+ if (ta.target.getClassName?.() === "TransformNode" && !lstSourceTransformNodes.has(ta.target)) {
143
+ const tn = ta.target;
144
+ lstSourceTransformNodes.add(tn);
145
+ sourceTransformNodeNameToNode.set(mapNodeNames.get(tn.name) ?? tn.name, {
146
+ node: tn,
147
+ initialTransformations: {
148
+ position: tn.position.clone(),
149
+ scaling: tn.scaling.clone(),
150
+ quaternion: tn.rotationQuaternion?.clone(),
151
+ rotation: tn.rotation.clone(),
152
+ },
153
+ });
154
+ if (!tn.rotationQuaternion) {
155
+ tn.rotationQuaternion = Quaternion.FromEulerAngles(tn.rotation.x, tn.rotation.y, tn.rotation.z);
156
+ tn.rotation.setAll(0);
157
+ }
164
158
  }
165
159
  }
166
- lstAnims.add(animation);
167
- switch (animation.targetProperty) {
168
- case "influence": {
169
- if (!this._retargetMorphTarget(ta, animationGroup.name)) {
170
- animationGroup.targetedAnimations.splice(i, 1);
171
- i--;
160
+ lstSourceTransformNodes.forEach((node) => {
161
+ node.computeWorldMatrix(true);
162
+ });
163
+ // Clone the source animation and retarget it
164
+ const animationGroup = sourceAnimationGroup.clone(localOptions.animationGroupName, undefined, true, true);
165
+ const mapTransformNodeToRootNode = new Map();
166
+ const lstAnims = new Set();
167
+ for (let i = 0; i < animationGroup.targetedAnimations.length; ++i) {
168
+ const ta = animationGroup.targetedAnimations[i];
169
+ const animation = ta.animation;
170
+ if (lstAnims.has(animation)) {
171
+ if (this.showWarnings) {
172
+ Logger.Warn(`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.`);
172
173
  }
173
- break;
174
174
  }
175
- case "position":
176
- case "rotationQuaternion":
177
- case "scaling": {
178
- if (ta.target.getClassName?.() !== "TransformNode") {
175
+ lstAnims.add(animation);
176
+ switch (animation.targetProperty) {
177
+ case "influence": {
178
+ if (!this._retargetMorphTarget(ta, animationGroup.name)) {
179
+ animationGroup.targetedAnimations.splice(i, 1);
180
+ i--;
181
+ }
179
182
  break;
180
183
  }
181
- const sourceTransformNode = ta.target;
182
- const sourceTransformNodeName = mapNodeNames.get(sourceTransformNode.name) ?? sourceTransformNode.name;
183
- let targetBone = this.findBoneByTransformNode(sourceTransformNodeName);
184
- if (!targetBone) {
185
- targetBone = this.findBoneByName(sourceTransformNodeName);
186
- }
187
- if (!targetBone) {
188
- if (this.showWarnings) {
189
- Logger.Warn(`RetargetAnimationGroup - Avatar '${this.name}', AnimationGroup '${animationGroup.name}': "${sourceTransformNodeName}" bone not found in any skeleton of avatar: animation removed.`);
184
+ case "position":
185
+ case "rotationQuaternion":
186
+ case "scaling": {
187
+ if (ta.target.getClassName?.() !== "TransformNode") {
188
+ break;
189
+ }
190
+ const sourceTransformNode = ta.target;
191
+ const sourceTransformNodeName = mapNodeNames.get(sourceTransformNode.name) ?? sourceTransformNode.name;
192
+ let targetBone = this.findBoneByTransformNode(sourceTransformNodeName);
193
+ if (!targetBone) {
194
+ targetBone = this.findBoneByName(sourceTransformNodeName);
195
+ }
196
+ if (!targetBone) {
197
+ if (this.showWarnings) {
198
+ Logger.Warn(`RetargetAnimationGroup - Avatar '${this.name}', AnimationGroup '${animationGroup.name}': "${sourceTransformNodeName}" bone not found in any skeleton of avatar: animation removed.`);
199
+ }
200
+ animationGroup.targetedAnimations.splice(i, 1);
201
+ i--;
202
+ break;
203
+ }
204
+ if (!this._retargetTransformNodeToBone(ta, sourceTransformNode, targetBone, animationGroup.name, mapTransformNodeToRootNode, mapNodeNames, !!localOptions.checkHierarchy)) {
205
+ animationGroup.targetedAnimations.splice(i, 1);
206
+ i--;
207
+ }
208
+ else if (localOptions.retargetAnimationKeys) {
209
+ this._retargetAnimationKeys(ta.animation, sourceTransformNode, targetBone);
190
210
  }
191
- animationGroup.targetedAnimations.splice(i, 1);
192
- i--;
193
211
  break;
194
212
  }
195
- if (!this._retargetTransformNodeToBone(ta, sourceTransformNode, targetBone, animationGroup.name, mapTransformNodeToRootNode, mapNodeNames, !!localOptions.checkHierarchy)) {
196
- animationGroup.targetedAnimations.splice(i, 1);
197
- i--;
198
- }
199
- else if (localOptions.retargetAnimationKeys) {
200
- this._retargetAnimationKeys(ta.animation, sourceTransformNode, targetBone);
201
- }
202
- break;
203
213
  }
204
214
  }
205
- }
206
- if (localOptions.fixAnimations) {
207
- this._fixAnimationGroup(animationGroup);
208
- }
209
- if (localOptions.fixGroundReference || localOptions.fixRootPosition) {
210
- const msg = localOptions.fixGroundReference && localOptions.fixRootPosition
211
- ? "Ground reference and root position fixing processes skipped."
212
- : localOptions.fixGroundReference
213
- ? "Ground reference fixing process skipped."
214
- : "Root position fixing process skipped.";
215
- const res = this._findVerticalAxis(msg, animationGroup, mapNodeNames.get(localOptions.rootNodeName) ?? localOptions.rootNodeName, sourceTransformNodeNameToNode, mapNodeNames.get(localOptions.groundReferenceNodeName) ?? localOptions.groundReferenceNodeName, localOptions.groundReferenceVerticalAxis);
216
- if (res) {
217
- const { verticalAxis, sourceRootTransformNode, targetRootTransformNodeOrBone, targetRootPositionAnimation, sourceGroundReferenceTransformNode, targetGroundReferenceTransformNodeOrBone, proportionRatio, } = res;
218
- if (localOptions.fixRootPosition) {
219
- this._fixRootPosition(sourceAnimationGroup, animationGroup, sourceRootTransformNode, targetRootTransformNodeOrBone, targetRootPositionAnimation, proportionRatio);
220
- this._resetStates(sourceTransformNodeNameToNode);
221
- }
222
- const fixGroundReferenceDynamicRefNode = !!localOptions.fixGroundReferenceDynamicRefNode;
223
- if (localOptions.fixGroundReference) {
224
- this._fixGroundReference(sourceAnimationGroup, animationGroup, verticalAxis, targetRootTransformNodeOrBone, targetRootPositionAnimation, sourceGroundReferenceTransformNode, targetGroundReferenceTransformNodeOrBone, lstSourceTransformNodes, mapNodeNames, fixGroundReferenceDynamicRefNode);
225
- this._resetStates(sourceTransformNodeNameToNode);
226
- }
227
- else if (fixGroundReferenceDynamicRefNode) {
228
- if (this.showWarnings) {
229
- Logger.Warn(`RetargetAnimationGroup - Avatar '${this.name}', AnimationGroup '${animationGroup.name}': fixGroundReferenceDynamicRefNode option is set to true but fixGroundReference is false: dynamic ground reference node fixing process skipped.`);
215
+ if (localOptions.fixAnimations) {
216
+ this._fixAnimationGroup(animationGroup);
217
+ }
218
+ if (localOptions.fixGroundReference || localOptions.fixRootPosition) {
219
+ const msg = localOptions.fixGroundReference && localOptions.fixRootPosition
220
+ ? "Ground reference and root position fixing processes skipped."
221
+ : localOptions.fixGroundReference
222
+ ? "Ground reference fixing process skipped."
223
+ : "Root position fixing process skipped.";
224
+ const res = this._findVerticalAxis(msg, animationGroup, mapNodeNames.get(localOptions.rootNodeName) ?? localOptions.rootNodeName, sourceTransformNodeNameToNode, mapNodeNames.get(localOptions.groundReferenceNodeName) ?? localOptions.groundReferenceNodeName, localOptions.groundReferenceVerticalAxis);
225
+ if (res) {
226
+ const { verticalAxis, sourceRootTransformNode, targetRootTransformNodeOrBone, targetRootPositionAnimation, sourceGroundReferenceTransformNode, targetGroundReferenceTransformNodeOrBone, proportionRatio, } = res;
227
+ if (localOptions.fixRootPosition) {
228
+ this._fixRootPosition(sourceAnimationGroup, animationGroup, sourceRootTransformNode, targetRootTransformNodeOrBone, targetRootPositionAnimation, proportionRatio);
229
+ this._resetStates(sourceTransformNodeNameToNode);
230
+ }
231
+ const fixGroundReferenceDynamicRefNode = !!localOptions.fixGroundReferenceDynamicRefNode;
232
+ if (localOptions.fixGroundReference) {
233
+ this._fixGroundReference(sourceAnimationGroup, animationGroup, verticalAxis, targetRootTransformNodeOrBone, targetRootPositionAnimation, sourceGroundReferenceTransformNode, targetGroundReferenceTransformNodeOrBone, lstSourceTransformNodes, mapNodeNames, fixGroundReferenceDynamicRefNode);
234
+ this._resetStates(sourceTransformNodeNameToNode);
235
+ }
236
+ else if (fixGroundReferenceDynamicRefNode) {
237
+ if (this.showWarnings) {
238
+ Logger.Warn(`RetargetAnimationGroup - Avatar '${this.name}', AnimationGroup '${animationGroup.name}': fixGroundReferenceDynamicRefNode option is set to true but fixGroundReference is false: dynamic ground reference node fixing process skipped.`);
239
+ }
230
240
  }
231
241
  }
232
242
  }
243
+ return animationGroup;
244
+ }
245
+ finally {
246
+ // Restore the avatar's bones to their pre-call state. The internal helpers above
247
+ // (_computeBoneWorldMatrices and, when enabled, _fixRootPosition / _fixGroundReference)
248
+ // overwrite the bone transforms; without restoring, any animation already driving the
249
+ // avatar appears clobbered (visible as a snap to rest pose the moment that animation
250
+ // is later stopped). Running in finally also makes sure we restore on exception.
251
+ this._restoreAvatarSkeletonStates(avatarSkeletonStates);
233
252
  }
234
- return animationGroup;
235
253
  }
236
254
  /**
237
255
  * Disposes of the avatar and releases all associated resources.
@@ -534,6 +552,57 @@ export class AnimatorAvatar {
534
552
  proportionRatio: sourceDiff !== 0 ? targetDiff / sourceDiff : 1.0,
535
553
  };
536
554
  }
555
+ _captureAvatarSkeletonStates() {
556
+ const transformNodeStates = new Map();
557
+ const boneMatrices = new Map();
558
+ this.skeletons.forEach((skeleton) => {
559
+ for (const bone of skeleton.bones) {
560
+ const linkedNode = bone._linkedTransformNode;
561
+ if (linkedNode) {
562
+ transformNodeStates.set(linkedNode, {
563
+ position: linkedNode.position.clone(),
564
+ scaling: linkedNode.scaling.clone(),
565
+ quaternion: linkedNode.rotationQuaternion?.clone(),
566
+ rotation: linkedNode.rotation.clone(),
567
+ });
568
+ }
569
+ else {
570
+ boneMatrices.set(bone, bone.getLocalMatrix().clone());
571
+ }
572
+ }
573
+ });
574
+ return { transformNodeStates, boneMatrices };
575
+ }
576
+ _restoreAvatarSkeletonStates(states) {
577
+ states.transformNodeStates.forEach((data, node) => {
578
+ node.position.copyFrom(data.position);
579
+ node.scaling.copyFrom(data.scaling);
580
+ if (data.quaternion) {
581
+ // Snapshot was using a quaternion: ensure the node still has one and restore it.
582
+ // _computeBoneWorldMatrices() can null/replace it via Bone.returnToRest, so we can't
583
+ // assume node.rotationQuaternion is the same instance (or non-null) we captured.
584
+ if (node.rotationQuaternion) {
585
+ node.rotationQuaternion.copyFrom(data.quaternion);
586
+ }
587
+ else {
588
+ node.rotationQuaternion = data.quaternion.clone();
589
+ }
590
+ }
591
+ else {
592
+ // Snapshot was using Euler rotation: clear any quaternion that may have been
593
+ // assigned in the meantime (Babylon ignores rotation when rotationQuaternion is set).
594
+ node.rotationQuaternion = null;
595
+ node.rotation.copyFrom(data.rotation);
596
+ }
597
+ node.computeWorldMatrix(true);
598
+ });
599
+ states.boneMatrices.forEach((matrix, bone) => {
600
+ bone._matrix = matrix;
601
+ });
602
+ // Re-prepare each skeleton so the restored bone state takes effect immediately
603
+ // rather than being left as stale world/final matrices until the next frame.
604
+ this.skeletons.forEach((skeleton) => skeleton.prepare(true));
605
+ }
537
606
  _resetStates(sourceTransformNodeNameToNode) {
538
607
  this.skeletons.forEach((skeleton) => skeleton.returnToRest());
539
608
  sourceTransformNodeNameToNode.forEach((data) => {