public static reaAnimationTrack ConvertTrack(ImportedAnimationSampledTrack wsTrack, bool isTopFrame) { reaAnimationTrack track = new reaAnimationTrack(); track.boneFrame = new remId(wsTrack.Name); List <reaIndexVector> scalings = new List <reaIndexVector>(); for (int i = 0; i < wsTrack.Scalings.Length; i++) { Vector3?scale = wsTrack.Scalings[i]; if (scale == null) { continue; } reaIndexVector scaleKey = new reaIndexVector(); scaleKey.index = i; scaleKey.value = new Vector3(scale.Value.X, isTopFrame ? -scale.Value.Z : scale.Value.Z, scale.Value.Y); scalings.Add(scaleKey); } track.scalings = scalings.ToArray(); List <reaIndexQuaternion> rotations = new List <reaIndexQuaternion>(); for (int i = 0; i < wsTrack.Rotations.Length; i++) { Quaternion?rotate = wsTrack.Rotations[i]; if (rotate == null) { continue; } reaIndexQuaternion rotateKey = new reaIndexQuaternion(); rotateKey.index = i; rotateKey.value = Quaternion.Invert(rotate.Value); rotations.Add(rotateKey); } track.rotations = rotations.ToArray(); List <reaIndexVector> translations = new List <reaIndexVector>(); for (int i = 0; i < wsTrack.Scalings.Length; i++) { Vector3?translate = wsTrack.Translations[i]; if (translate == null) { continue; } reaIndexVector translateKey = new reaIndexVector(); translateKey.index = i; translateKey.value = translate.Value; translations.Add(translateKey); } track.translations = translations.ToArray(); return(track); }
public void ConvertAnimation(reaANICsection animSection, remParser parser) { ImportedSampledAnimation anim = new ImportedSampledAnimation(); anim.TrackList = new List <ImportedAnimationSampledTrack>(animSection.Count); foreach (reaAnimationTrack track in animSection) { remBone boneFrame = rem.FindFrame(track.boneFrame, parser.BONC.rootFrame); bool isTopFrame = boneFrame != null && boneFrame.Parent == parser.BONC.rootFrame; ImportedAnimationSampledTrack iTrack = ConvertTrack(track, isTopFrame); anim.TrackList.Add(iTrack); } AnimationList.Add(anim); }
public static ImportedAnimationSampledTrack ConvertTrack(reaAnimationTrack track, bool isTopFrame) { ImportedAnimationSampledTrack iTrack = new ImportedAnimationSampledTrack(); iTrack.Name = track.boneFrame; int animLen = track.scalings[track.scalings.Length - 1].index + 1; iTrack.Scalings = new Vector3?[animLen]; if (isTopFrame) { for (int i = 0; i < track.scalings.Length; i++) { Vector3 scale = new Vector3(track.scalings[i].value.X, track.scalings[i].value.Z, -track.scalings[i].value.Y); iTrack.Scalings[track.scalings[i].index] = scale; } } else { for (int i = 0; i < track.scalings.Length; i++) { Vector3 scale = new Vector3(track.scalings[i].value.X, track.scalings[i].value.Z, track.scalings[i].value.Y); iTrack.Scalings[track.scalings[i].index] = scale; } } animLen = track.rotations[track.rotations.Length - 1].index + 1; iTrack.Rotations = new Quaternion?[animLen]; for (int i = 0; i < track.rotations.Length; i++) { iTrack.Rotations[track.rotations[i].index] = Quaternion.Invert(track.rotations[i].value); } animLen = track.translations[track.translations.Length - 1].index + 1; iTrack.Translations = new Vector3?[animLen]; for (int i = 0; i < track.translations.Length; i++) { iTrack.Translations[track.translations[i].index] = track.translations[i].value; } return(iTrack); }
public static ImportedSampledAnimation ConvertAnimation(ImportedKeyframedAnimation keyframedAnim) { ImportedSampledAnimation destAnim = new ImportedSampledAnimation(); destAnim.TrackList = new List <ImportedAnimationSampledTrack>(keyframedAnim.TrackList.Count); foreach (ImportedAnimationKeyframedTrack keyframedTrack in keyframedAnim.TrackList) { ImportedAnimationSampledTrack sampledTrack = new ImportedAnimationSampledTrack(); sampledTrack.Name = keyframedTrack.Name; sampledTrack.Scalings = new Vector3?[keyframedTrack.Keyframes.Length]; sampledTrack.Rotations = new Quaternion?[keyframedTrack.Keyframes.Length]; sampledTrack.Translations = new Vector3?[keyframedTrack.Keyframes.Length]; for (int i = 0; i < keyframedTrack.Keyframes.Length; i++) { sampledTrack.Scalings[i] = keyframedTrack.Keyframes[i].Scaling; sampledTrack.Rotations[i] = keyframedTrack.Keyframes[i].Rotation; sampledTrack.Translations[i] = keyframedTrack.Keyframes[i].Translation; } destAnim.TrackList.Add(sampledTrack); } return(destAnim); }
public static void ReplaceAnimation(WorkspaceAnimation wsAnimation, List <ImportedFrame> wsSkeleton, reaParser parser, int resampleCount, bool linear, ReplaceAnimationMethod replaceMethod, int insertPos, bool negateQuaternionFlips) { Report.ReportLog("Replacing animation ..."); List <KeyValuePair <string, ImportedAnimationSampledTrack> > newTrackList = FbxUtility.CopySampledAnimation(wsAnimation, resampleCount, linear); reaANICsection animationNodeList = parser.ANIC; ImportedSampledAnimation iAnim = new ImportedSampledAnimation(); iAnim.TrackList = new List <ImportedAnimationSampledTrack>(animationNodeList.Count); Dictionary <string, ImportedAnimationSampledTrack> animationNodeDic = null; if (replaceMethod != ReplaceAnimationMethod.Replace) { animationNodeDic = new Dictionary <string, ImportedAnimationSampledTrack>(); foreach (reaAnimationTrack animationNode in animationNodeList) { ImportedFrame boneFrame = ImportedHelpers.FindFrame(animationNode.boneFrame, wsSkeleton[0]); bool isTopFrame = boneFrame != null && boneFrame.Parent == wsSkeleton[0]; ImportedAnimationSampledTrack iTrack = Plugins.REMConverter.ConvertTrack(animationNode, isTopFrame); iTrack.Name = animationNode.boneFrame; animationNodeDic.Add(animationNode.boneFrame, iTrack); iAnim.TrackList.Add(iTrack); } } FbxUtility.ReplaceAnimation(replaceMethod, insertPos, newTrackList, iAnim, animationNodeDic, negateQuaternionFlips); animationNodeList.ChildList.Clear(); foreach (var newTrack in iAnim.TrackList) { ImportedFrame boneFrame = ImportedHelpers.FindFrame(newTrack.Name, wsSkeleton[0]); bool isTopFrame = boneFrame != null && boneFrame.Parent == wsSkeleton[0]; reaAnimationTrack animationNode = Plugins.REMConverter.ConvertTrack(newTrack, isTopFrame); animationNodeList.AddChild(animationNode); } }