@onerjs/core 8.51.4 → 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.
- package/Animations/animatorAvatar.d.ts +2 -0
- package/Animations/animatorAvatar.js +163 -94
- package/Animations/animatorAvatar.js.map +1 -1
- package/Engines/constants.d.ts +10 -0
- package/Engines/constants.js +10 -0
- package/Engines/constants.js.map +1 -1
- package/Materials/Node/Blocks/Fragment/perturbNormalBlock.js +6 -3
- package/Materials/Node/Blocks/Fragment/perturbNormalBlock.js.map +1 -1
- package/Materials/PBR/openpbrMaterial.d.ts +8 -0
- package/Materials/PBR/openpbrMaterial.js +16 -0
- package/Materials/PBR/openpbrMaterial.js.map +1 -1
- package/Materials/PBR/pbrBaseMaterial.d.ts +1 -0
- package/Materials/PBR/pbrBaseMaterial.js +8 -0
- package/Materials/PBR/pbrBaseMaterial.js.map +1 -1
- package/Materials/Textures/Procedurals/proceduralTexture.d.ts +6 -0
- package/Materials/Textures/Procedurals/proceduralTexture.js +3 -1
- package/Materials/Textures/Procedurals/proceduralTexture.js.map +1 -1
- package/Materials/Textures/index.d.ts +1 -0
- package/Materials/Textures/index.js +1 -0
- package/Materials/Textures/index.js.map +1 -1
- package/Materials/Textures/textureMerger.js +1 -0
- package/Materials/Textures/textureMerger.js.map +1 -1
- package/Materials/Textures/textureProcessor.d.ts +315 -0
- package/Materials/Textures/textureProcessor.js +792 -0
- package/Materials/Textures/textureProcessor.js.map +1 -0
- package/Materials/material.d.ts +24 -0
- package/Materials/material.js +39 -0
- package/Materials/material.js.map +1 -1
- package/Materials/standardMaterial.d.ts +1 -0
- package/Materials/standardMaterial.js +6 -0
- package/Materials/standardMaterial.js.map +1 -1
- package/Physics/v2/characterController.d.ts +104 -7
- package/Physics/v2/characterController.js +355 -7
- package/Physics/v2/characterController.js.map +1 -1
- package/Shaders/ShadersInclude/bumpFragment.js +3 -3
- package/Shaders/ShadersInclude/bumpFragment.js.map +1 -1
- package/Shaders/ShadersInclude/bumpFragmentMainFunctions.js +5 -1
- package/Shaders/ShadersInclude/bumpFragmentMainFunctions.js.map +1 -1
- package/Shaders/ShadersInclude/defaultFragmentDeclaration.js +3 -0
- package/Shaders/ShadersInclude/defaultFragmentDeclaration.js.map +1 -1
- package/Shaders/ShadersInclude/defaultUboDeclaration.js +1 -1
- package/Shaders/ShadersInclude/defaultUboDeclaration.js.map +1 -1
- package/Shaders/ShadersInclude/defaultVertexDeclaration.js +1 -1
- package/Shaders/ShadersInclude/defaultVertexDeclaration.js.map +1 -1
- package/Shaders/ShadersInclude/openpbrAmbientOcclusionData.js +1 -1
- package/Shaders/ShadersInclude/openpbrAmbientOcclusionData.js.map +1 -1
- package/Shaders/ShadersInclude/openpbrBackgroundTransmission.js +1 -1
- package/Shaders/ShadersInclude/openpbrBackgroundTransmission.js.map +1 -1
- package/Shaders/ShadersInclude/openpbrBaseLayerData.js +14 -14
- package/Shaders/ShadersInclude/openpbrBaseLayerData.js.map +1 -1
- package/Shaders/ShadersInclude/openpbrCoatLayerData.js +6 -6
- package/Shaders/ShadersInclude/openpbrCoatLayerData.js.map +1 -1
- package/Shaders/ShadersInclude/openpbrDirectLighting.js +1 -1
- package/Shaders/ShadersInclude/openpbrDirectLighting.js.map +1 -1
- package/Shaders/ShadersInclude/openpbrEnvironmentLighting.js +1 -1
- package/Shaders/ShadersInclude/openpbrEnvironmentLighting.js.map +1 -1
- package/Shaders/ShadersInclude/openpbrFragmentDeclaration.js +3 -0
- package/Shaders/ShadersInclude/openpbrFragmentDeclaration.js.map +1 -1
- package/Shaders/ShadersInclude/openpbrFuzzLayerData.js +3 -3
- package/Shaders/ShadersInclude/openpbrFuzzLayerData.js.map +1 -1
- package/Shaders/ShadersInclude/openpbrNormalMapFragment.js +4 -4
- package/Shaders/ShadersInclude/openpbrNormalMapFragment.js.map +1 -1
- package/Shaders/ShadersInclude/openpbrSubsurfaceLayerData.js +7 -3
- package/Shaders/ShadersInclude/openpbrSubsurfaceLayerData.js.map +1 -1
- package/Shaders/ShadersInclude/openpbrThinFilmLayerData.js +2 -2
- package/Shaders/ShadersInclude/openpbrThinFilmLayerData.js.map +1 -1
- package/Shaders/ShadersInclude/openpbrTransmissionLayerData.js +5 -5
- package/Shaders/ShadersInclude/openpbrTransmissionLayerData.js.map +1 -1
- package/Shaders/ShadersInclude/openpbrUboDeclaration.js +1 -1
- package/Shaders/ShadersInclude/openpbrUboDeclaration.js.map +1 -1
- package/Shaders/ShadersInclude/openpbrVertexDeclaration.js +1 -1
- package/Shaders/ShadersInclude/openpbrVertexDeclaration.js.map +1 -1
- package/Shaders/ShadersInclude/pbrBlockFinalUnlitComponents.js +1 -1
- package/Shaders/ShadersInclude/pbrBlockFinalUnlitComponents.js.map +1 -1
- package/Shaders/ShadersInclude/pbrBlockLightmapInit.js +1 -1
- package/Shaders/ShadersInclude/pbrBlockLightmapInit.js.map +1 -1
- package/Shaders/ShadersInclude/pbrFragmentDeclaration.js +3 -0
- package/Shaders/ShadersInclude/pbrFragmentDeclaration.js.map +1 -1
- package/Shaders/ShadersInclude/pbrHelperFunctions.js +4 -0
- package/Shaders/ShadersInclude/pbrHelperFunctions.js.map +1 -1
- package/Shaders/ShadersInclude/pbrUboDeclaration.js +1 -1
- package/Shaders/ShadersInclude/pbrUboDeclaration.js.map +1 -1
- package/Shaders/ShadersInclude/pbrVertexDeclaration.js +1 -1
- package/Shaders/ShadersInclude/pbrVertexDeclaration.js.map +1 -1
- package/Shaders/ShadersInclude/textureRepetitionFunctions.d.ts +5 -0
- package/Shaders/ShadersInclude/textureRepetitionFunctions.js +52 -0
- package/Shaders/ShadersInclude/textureRepetitionFunctions.js.map +1 -0
- package/Shaders/default.fragment.d.ts +1 -0
- package/Shaders/default.fragment.js +8 -6
- package/Shaders/default.fragment.js.map +1 -1
- package/Shaders/geometry.fragment.js +3 -3
- package/Shaders/geometry.fragment.js.map +1 -1
- package/Shaders/openpbr.fragment.d.ts +1 -0
- package/Shaders/openpbr.fragment.js +4 -2
- package/Shaders/openpbr.fragment.js.map +1 -1
- package/Shaders/pbr.fragment.d.ts +1 -0
- package/Shaders/pbr.fragment.js +24 -22
- package/Shaders/pbr.fragment.js.map +1 -1
- package/Shaders/textureProcessor.fragment.d.ts +5 -0
- package/Shaders/textureProcessor.fragment.js +156 -0
- package/Shaders/textureProcessor.fragment.js.map +1 -0
- package/ShadersWGSL/ShadersInclude/bumpFragment.js +3 -3
- package/ShadersWGSL/ShadersInclude/bumpFragment.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/bumpFragmentMainFunctions.js +5 -1
- package/ShadersWGSL/ShadersInclude/bumpFragmentMainFunctions.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/defaultUboDeclaration.js +1 -1
- package/ShadersWGSL/ShadersInclude/defaultUboDeclaration.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/openpbrAmbientOcclusionData.js +1 -1
- package/ShadersWGSL/ShadersInclude/openpbrAmbientOcclusionData.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/openpbrBackgroundTransmission.js +1 -1
- package/ShadersWGSL/ShadersInclude/openpbrBackgroundTransmission.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/openpbrBaseLayerData.js +15 -15
- package/ShadersWGSL/ShadersInclude/openpbrBaseLayerData.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/openpbrCoatLayerData.js +7 -7
- package/ShadersWGSL/ShadersInclude/openpbrCoatLayerData.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/openpbrDirectLighting.js +1 -1
- package/ShadersWGSL/ShadersInclude/openpbrDirectLighting.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/openpbrEnvironmentLighting.js +1 -1
- package/ShadersWGSL/ShadersInclude/openpbrEnvironmentLighting.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/openpbrFuzzLayerData.js +4 -4
- package/ShadersWGSL/ShadersInclude/openpbrFuzzLayerData.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/openpbrIblFunctions.js +3 -3
- package/ShadersWGSL/ShadersInclude/openpbrIblFunctions.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/openpbrNormalMapFragment.js +4 -4
- package/ShadersWGSL/ShadersInclude/openpbrNormalMapFragment.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/openpbrSubsurfaceLayerData.js +7 -3
- package/ShadersWGSL/ShadersInclude/openpbrSubsurfaceLayerData.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/openpbrThinFilmLayerData.js +2 -2
- package/ShadersWGSL/ShadersInclude/openpbrThinFilmLayerData.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/openpbrTransmissionLayerData.js +6 -6
- package/ShadersWGSL/ShadersInclude/openpbrTransmissionLayerData.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/openpbrUboDeclaration.js +1 -1
- package/ShadersWGSL/ShadersInclude/openpbrUboDeclaration.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/pbrBlockFinalUnlitComponents.js +1 -1
- package/ShadersWGSL/ShadersInclude/pbrBlockFinalUnlitComponents.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/pbrBlockLightmapInit.js +1 -1
- package/ShadersWGSL/ShadersInclude/pbrBlockLightmapInit.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/pbrHelperFunctions.js +4 -0
- package/ShadersWGSL/ShadersInclude/pbrHelperFunctions.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/pbrUboDeclaration.js +1 -1
- package/ShadersWGSL/ShadersInclude/pbrUboDeclaration.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/textureRepetitionFunctions.d.ts +5 -0
- package/ShadersWGSL/ShadersInclude/textureRepetitionFunctions.js +52 -0
- package/ShadersWGSL/ShadersInclude/textureRepetitionFunctions.js.map +1 -0
- package/ShadersWGSL/default.fragment.d.ts +1 -0
- package/ShadersWGSL/default.fragment.js +8 -6
- package/ShadersWGSL/default.fragment.js.map +1 -1
- package/ShadersWGSL/geometry.fragment.js +3 -3
- package/ShadersWGSL/geometry.fragment.js.map +1 -1
- package/ShadersWGSL/openpbr.fragment.d.ts +1 -0
- package/ShadersWGSL/openpbr.fragment.js +5 -3
- package/ShadersWGSL/openpbr.fragment.js.map +1 -1
- package/ShadersWGSL/openpbr.vertex.js +1 -1
- package/ShadersWGSL/openpbr.vertex.js.map +1 -1
- package/ShadersWGSL/pbr.fragment.d.ts +1 -0
- package/ShadersWGSL/pbr.fragment.js +24 -22
- package/ShadersWGSL/pbr.fragment.js.map +1 -1
- package/ShadersWGSL/textureProcessor.fragment.d.ts +5 -0
- package/ShadersWGSL/textureProcessor.fragment.js +161 -0
- package/ShadersWGSL/textureProcessor.fragment.js.map +1 -0
- package/SmartAssets/index.d.ts +2 -0
- package/SmartAssets/index.js +2 -0
- package/SmartAssets/index.js.map +1 -0
- package/SmartAssets/smartAssetManager.d.ts +156 -0
- package/SmartAssets/smartAssetManager.js +531 -0
- package/SmartAssets/smartAssetManager.js.map +1 -0
- package/SmartAssets/smartAssetSerializer.d.ts +61 -0
- package/SmartAssets/smartAssetSerializer.js +97 -0
- package/SmartAssets/smartAssetSerializer.js.map +1 -0
- package/index.d.ts +1 -0
- package/index.js +1 -0
- package/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -173,6 +173,8 @@ export declare class AnimatorAvatar {
|
|
|
173
173
|
private _checkParentHierarchy;
|
|
174
174
|
private _getRootNodeName;
|
|
175
175
|
private _findVerticalAxis;
|
|
176
|
+
private _captureAvatarSkeletonStates;
|
|
177
|
+
private _restoreAvatarSkeletonStates;
|
|
176
178
|
private _resetStates;
|
|
177
179
|
private _fixRootPosition;
|
|
178
180
|
private _fixGroundReference;
|
|
@@ -123,115 +123,133 @@ export class AnimatorAvatar {
|
|
|
123
123
|
fixRootPosition: true,
|
|
124
124
|
...options,
|
|
125
125
|
};
|
|
126
|
-
//
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
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
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
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
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
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
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
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
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
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) => {
|