示例#1
0
        private static void ReadBoneAnimations(RAnimation renderAnimation, SsbhAnimTrackDecoder decoder, AnimGroup animGroup)
        {
            foreach (AnimNode animNode in animGroup.Nodes)
            {
                RTransformAnimation tfrmAnim = new RTransformAnimation()
                {
                    Name = animNode.Name
                };
                foreach (AnimTrack track in animNode.Tracks)
                {
                    object[] transform = decoder.ReadTrack(track);

                    if (track.Name.Equals("Transform"))
                    {
                        for (int i = 0; i < transform.Length; i++)
                        {
                            AnimTrackTransform t = (AnimTrackTransform)transform[i];
                            tfrmAnim.Transform.Keys.Add(new RKey <Matrix4>()
                            {
                                Frame         = i,
                                Value         = GetMatrix((AnimTrackTransform)transform[i]),
                                AbsoluteScale = t.CompensateScale
                            });
                        }
                    }
                }
                renderAnimation.TransformNodes.Add(tfrmAnim);
            }
        }
示例#2
0
        private void ReadTransformAnimations(ANIM animFile, AnimGroup animGroup, SBAnimation animation)
        {
            var decoder = new SSBHAnimTrackDecoder(animFile);

            foreach (AnimNode animNode in animGroup.Nodes)
            {
                SBTransformAnimation tfrmAnim = new SBTransformAnimation()
                {
                    Name = animNode.Name
                };
                foreach (AnimTrack track in animNode.Tracks)
                {
                    object[] Transform = decoder.ReadTrack(track);

                    if (track.Name.Equals("Transform"))
                    {
                        for (int i = 0; i < Transform.Length; i++)
                        {
                            AnimTrackTransform t = (AnimTrackTransform)Transform[i];
                            tfrmAnim.Transform.Keys.Add(new SBAnimKey <Matrix4>()
                            {
                                Frame = i,
                                Value = GetMatrix((AnimTrackTransform)Transform[i]),
                            });
                        }
                    }
                }
                animation.TransformNodes.Add(tfrmAnim);
            }
        }
示例#3
0
        private void ReadTransformAnimations(Anim animFile, AnimGroup animGroup, SBAnimation animation)
        {
            var decoder = new SsbhAnimTrackDecoder(animFile);

            foreach (AnimNode animNode in animGroup.Nodes)
            {
                SBTransformAnimation tfrmAnim = new SBTransformAnimation()
                {
                    Name = animNode.Name
                };
                SBTransformTrack X  = new SBTransformTrack(SBTrackType.TranslateX);
                SBTransformTrack Y  = new SBTransformTrack(SBTrackType.TranslateY);
                SBTransformTrack Z  = new SBTransformTrack(SBTrackType.TranslateZ);
                SBTransformTrack RX = new SBTransformTrack(SBTrackType.RotateX);
                SBTransformTrack RY = new SBTransformTrack(SBTrackType.RotateY);
                SBTransformTrack RZ = new SBTransformTrack(SBTrackType.RotateZ);
                SBTransformTrack SX = new SBTransformTrack(SBTrackType.ScaleX);
                SBTransformTrack SY = new SBTransformTrack(SBTrackType.ScaleY);
                SBTransformTrack SZ = new SBTransformTrack(SBTrackType.ScaleZ);
                SBTransformTrack CompensateScale = new SBTransformTrack(SBTrackType.CompensateScale);
                tfrmAnim.Tracks.AddRange(new SBTransformTrack[] { X, Y, Z, RX, RY, RZ, SX, SY, SZ, CompensateScale });

                foreach (AnimTrack track in animNode.Tracks)
                {
                    object[] Transform = decoder.ReadTrack(track);

                    if (track.Name.Equals("Transform"))
                    {
                        for (int i = 0; i < Transform.Length; i++)
                        {
                            AnimTrackTransform t = (AnimTrackTransform)Transform[i];

                            SBBone transform = new SBBone();
                            transform.Transform = GetMatrix((AnimTrackTransform)Transform[i]);
                            X.AddKey(i, transform.X);
                            Y.AddKey(i, transform.Y);
                            Z.AddKey(i, transform.Z);
                            RX.AddKey(i, transform.RX);
                            RY.AddKey(i, transform.RY);
                            RZ.AddKey(i, transform.RZ);
                            SX.AddKey(i, transform.SX);
                            SY.AddKey(i, transform.SY);
                            SZ.AddKey(i, transform.SZ);
                            CompensateScale.AddKey(i, t.CompensateScale);
                        }
                    }
                }
                animation.TransformNodes.Add(tfrmAnim);
            }
        }
示例#4
0
        public IOAnimation GetIOAnimation()
        {
            IOAnimation anim = new IOAnimation
            {
                Name         = Text,
                FrameCount   = animation.FrameCount,
                RotationType = IORotationType.Quaternion
            };

            SsbhAnimTrackDecoder decoder = new SsbhAnimTrackDecoder(animation);

            foreach (AnimGroup animGroup in animation.Animations)
            {
                // Bone Animations
                if (animGroup.Type == AnimType.Transform)
                {
                    foreach (AnimNode animNode in animGroup.Nodes)
                    {
                        foreach (AnimTrack track in animNode.Tracks)
                        {
                            if (track.Name.Equals("Transform"))
                            {
                                object[] transform = decoder.ReadTrack(track);
                                for (int i = 0; i < transform.Length; i++)
                                {
                                    AnimTrackTransform t = (AnimTrackTransform)transform[i];
                                    anim.AddKey(animNode.Name, IOTrackType.POSX, i, t.X);
                                    anim.AddKey(animNode.Name, IOTrackType.POSY, i, t.Y);
                                    anim.AddKey(animNode.Name, IOTrackType.POSZ, i, t.Z);
                                    anim.AddKey(animNode.Name, IOTrackType.ROTX, i, t.Rx);
                                    anim.AddKey(animNode.Name, IOTrackType.ROTY, i, t.Ry);
                                    anim.AddKey(animNode.Name, IOTrackType.ROTZ, i, t.Rz);
                                    anim.AddKey(animNode.Name, IOTrackType.ROTW, i, t.Rw);
                                    anim.AddKey(animNode.Name, IOTrackType.SCAX, i, t.Sx);
                                    anim.AddKey(animNode.Name, IOTrackType.SCAY, i, t.Sy);
                                    anim.AddKey(animNode.Name, IOTrackType.SCAZ, i, t.Sz);
                                }
                            }
                        }
                    }
                }
            }

            return(anim);
        }
示例#5
0
        public IOAnimation GetIOAnimation()
        {
            IOAnimation Anim = new IOAnimation();

            Anim.Name         = Text;
            Anim.FrameCount   = animation.FrameCount;
            Anim.RotationType = IORotationType.Quaternion;

            SSBHAnimTrackDecoder decoder = new SSBHAnimTrackDecoder(animation);

            foreach (AnimGroup animGroup in animation.Animations)
            {
                // Bone Animations
                if (animGroup.Type == ANIM_TYPE.Transform)
                {
                    foreach (AnimNode animNode in animGroup.Nodes)
                    {
                        foreach (AnimTrack track in animNode.Tracks)
                        {
                            if (track.Name.Equals("Transform"))
                            {
                                object[] Transform = decoder.ReadTrack(track);
                                for (int i = 0; i < Transform.Length; i++)
                                {
                                    AnimTrackTransform t = (AnimTrackTransform)Transform[i];
                                    Anim.AddKey(animNode.Name, IOTrackType.POSX, i, t.X);
                                    Anim.AddKey(animNode.Name, IOTrackType.POSY, i, t.Y);
                                    Anim.AddKey(animNode.Name, IOTrackType.POSZ, i, t.Z);
                                    Anim.AddKey(animNode.Name, IOTrackType.ROTX, i, t.RX);
                                    Anim.AddKey(animNode.Name, IOTrackType.ROTY, i, t.RY);
                                    Anim.AddKey(animNode.Name, IOTrackType.ROTZ, i, t.RZ);
                                    Anim.AddKey(animNode.Name, IOTrackType.ROTW, i, t.RW);
                                    Anim.AddKey(animNode.Name, IOTrackType.SCAX, i, t.SX);
                                    Anim.AddKey(animNode.Name, IOTrackType.SCAY, i, t.SY);
                                    Anim.AddKey(animNode.Name, IOTrackType.SCAZ, i, t.SZ);
                                }
                            }
                        }
                    }
                }
            }

            return(Anim);
        }
示例#6
0
        private static AnimTrackTransform MatrixToTransform(Matrix4 matrix)
        {
            SBBone temp = new SBBone();

            temp.Transform = matrix;

            var t = new AnimTrackTransform()
            {
                X  = temp.X,
                Y  = temp.Y,
                Z  = temp.Z,
                Rx = temp.RotationQuaternion.X,
                Ry = temp.RotationQuaternion.Y,
                Rz = temp.RotationQuaternion.Z,
                Rw = temp.RotationQuaternion.W,
                Sx = temp.SX,
                Sy = temp.SY,
                Sz = temp.SZ
            };

            return(t);
        }
示例#7
0
 private static Matrix4 GetMatrix(AnimTrackTransform Transform)
 {
     return(Matrix4.CreateScale(Transform.Sx, Transform.Sy, Transform.Sz) *
            Matrix4.CreateFromQuaternion(new Quaternion(Transform.Rx, Transform.Ry, Transform.Rz, Transform.Rw)) *
            Matrix4.CreateTranslation(Transform.X, Transform.Y, Transform.Z));
 }
示例#8
0
        public IRenderable GetRenderableNode()
        {
            if (animation == null)
            {
                return(null);
            }
            RAnimation renderAnimation = new RAnimation()
            {
                FrameCount = (int)animation.FrameCount
            };

            SSBHAnimTrackDecoder decoder = new SSBHAnimTrackDecoder(animation);

            foreach (AnimGroup animGroup in animation.Animations)
            {
                // Material Animations
                if (animGroup.Type == ANIM_TYPE.Material)
                {
                    foreach (AnimNode animNode in animGroup.Nodes)
                    {
                        foreach (AnimTrack track in animNode.Tracks)
                        {
                            object[] MaterialAnim = decoder.ReadTrack(track);
                        }
                    }
                }
                // Visibility Animations
                if (animGroup.Type == ANIM_TYPE.Visibilty)
                {
                    foreach (AnimNode animNode in animGroup.Nodes)
                    {
                        RVisibilityAnimation visAnim = new RVisibilityAnimation()
                        {
                            MeshName = animNode.Name
                        };
                        foreach (AnimTrack track in animNode.Tracks)
                        {
                            if (track.Name.Equals("Visibility"))
                            {
                                object[] Visibility = decoder.ReadTrack(track);

                                for (int i = 0; i < Visibility.Length; i++)
                                {
                                    visAnim.Visibility.Keys.Add(new RKey <bool>()
                                    {
                                        Frame = i,
                                        Value = ((AnimTrackBool)Visibility[i]).Value
                                    });
                                }
                            }
                        }
                        renderAnimation.VisibilityNodes.Add(visAnim);
                    }
                }
                // Bone Animations
                if (animGroup.Type == ANIM_TYPE.Transform)
                {
                    foreach (AnimNode animNode in animGroup.Nodes)
                    {
                        RTransformAnimation tfrmAnim = new RTransformAnimation()
                        {
                            Name = animNode.Name
                        };
                        foreach (AnimTrack track in animNode.Tracks)
                        {
                            if (track.Name.Equals("Transform"))
                            {
                                object[] Transform = decoder.ReadTrack(track);
                                for (int i = 0; i < Transform.Length; i++)
                                {
                                    AnimTrackTransform t = (AnimTrackTransform)Transform[i];
                                    tfrmAnim.Transform.Keys.Add(new RKey <Matrix4>()
                                    {
                                        Frame = i,
                                        Value = GetMatrix((AnimTrackTransform)Transform[i])
                                    });
                                }
                            }
                        }
                        renderAnimation.TransformNodes.Add(tfrmAnim);
                    }
                }
            }



            return(renderAnimation);
        }
示例#9
0
 private static Matrix4 GetMatrix(AnimTrackTransform Transform)
 {
     return(Matrix4.CreateScale(Transform.SX, Transform.SY, Transform.SZ) *
            Matrix4.CreateFromQuaternion(new Quaternion(Transform.RX, Transform.RY, Transform.RZ, Transform.RW)) *
            Matrix4.CreateTranslation(Transform.X, Transform.Y, Transform.Z));
 }