Exemplo n.º 1
0
Arquivo: Fbx.cs Projeto: kkdevs/sb3u
            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);
            }
Exemplo n.º 2
0
Arquivo: Fbx.cs Projeto: kkdevs/sb3u
            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);
            }
Exemplo n.º 3
0
Arquivo: Fbx.cs Projeto: kkdevs/sb3u
            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);
            }
Exemplo n.º 4
0
Arquivo: Fbx.cs Projeto: kkdevs/sb3u
            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);
            }
Exemplo n.º 5
0
        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);
            }
        }