Exemplo n.º 1
0
        private void ReadVisibilityAnimations(ANIM animFile, AnimGroup animGroup, SBAnimation animation)
        {
            var decoder = new SSBHAnimTrackDecoder(animFile);

            foreach (AnimNode animNode in animGroup.Nodes)
            {
                SBVisibilityAnimation visAnim = new SBVisibilityAnimation()
                {
                    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.AddKey(i, (bool)Visibility[i]);
                        }
                    }
                }
                animation.VisibilityNodes.Add(visAnim);
            }
        }
Exemplo n.º 2
0
        private static void ReadMaterialAnimations(RAnimation renderAnimation, SSBHAnimTrackDecoder decoder, AnimGroup animGroup)
        {
            foreach (AnimNode animNode in animGroup.Nodes)
            {
                foreach (AnimTrack track in animNode.Tracks)
                {
                    RMaterialAnimation matAnim = new RMaterialAnimation()
                    {
                        MaterialName  = animNode.Name,
                        AttributeName = track.Name
                    };
                    object[] MaterialAnim = decoder.ReadTrack(track);

                    // only get vectors for now
                    if (MaterialAnim == null || MaterialAnim.Length == 0 || MaterialAnim[0] == null || MaterialAnim[0].GetType() != typeof(AnimTrackCustomVector4))
                    {
                        continue;
                    }
                    renderAnimation.MaterialNodes.Add(matAnim);
                    for (int i = 0; i < MaterialAnim.Length; i++)
                    {
                        var vec = (AnimTrackCustomVector4)MaterialAnim[i];
                        matAnim.Keys.Keys.Add(new RKey <Vector4>()
                        {
                            Frame = i,
                            Value = new Vector4(vec.X, vec.Y, vec.Z, vec.W)
                        });
                    }
                }
            }
        }
Exemplo n.º 3
0
        private void ReadMaterialAnimations(ANIM animFile, AnimGroup animGroup, SBAnimation animation)
        {
            var decoder = new SSBHAnimTrackDecoder(animFile);

            foreach (AnimNode animNode in animGroup.Nodes)
            {
                foreach (AnimTrack track in animNode.Tracks)
                {
                    SBMaterialAnimation matAnim = new SBMaterialAnimation()
                    {
                        MaterialName  = animNode.Name,
                        AttributeName = track.Name
                    };
                    object[] MaterialAnim = decoder.ReadTrack(track);

                    // only get vectors for now
                    if (MaterialAnim == null || MaterialAnim.Length == 0 || MaterialAnim[0] == null || MaterialAnim[0].GetType() != typeof(AnimTrackCustomVector4))
                    {
                        continue;
                    }
                    animation.MaterialNodes.Add(matAnim);
                    for (int i = 0; i < MaterialAnim.Length; i++)
                    {
                        var vec = (AnimTrackCustomVector4)MaterialAnim[i];
                        matAnim.Keys.AddKey(i, new Vector4(vec.X, vec.Y, vec.Z, vec.W));
                    }
                }
            }
        }
Exemplo n.º 4
0
        private static void ReadVisAnimations(RAnimation renderAnimation, SSBHAnimTrackDecoder decoder, AnimGroup animGroup)
        {
            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 = (bool)Visibility[i]
                            });
                        }
                    }
                }
                renderAnimation.VisibilityNodes.Add(visAnim);
            }
        }
Exemplo n.º 5
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)
            {
                if (animGroup.Type == ANIM_TYPE.Material)
                {
                    ReadMaterialAnimations(renderAnimation, decoder, animGroup);
                }
                else if (animGroup.Type == ANIM_TYPE.Visibilty)
                {
                    ReadVisAnimations(renderAnimation, decoder, animGroup);
                }
                else if (animGroup.Type == ANIM_TYPE.Transform)
                {
                    ReadBoneAnimations(renderAnimation, decoder, animGroup);
                }
            }

            return(renderAnimation);
        }
Exemplo n.º 6
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);
            }
        }
Exemplo n.º 7
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);
            }
        }
Exemplo n.º 8
0
        public void UpdateUniqueLightValues(Dictionary <string, HashSet <string> > valuesByName)
        {
            SSBHAnimTrackDecoder decoder = new SSBHAnimTrackDecoder(animation);

            foreach (AnimGroup animGroup in animation.Animations)
            {
                AddLightValues(valuesByName, decoder, animGroup);
            }
        }
Exemplo n.º 9
0
        public string GetLightInformation()
        {
            SSBHAnimTrackDecoder decoder = new SSBHAnimTrackDecoder(animation);

            var output = new System.Text.StringBuilder();

            foreach (AnimGroup animGroup in animation.Animations)
            {
                AddLightSetInfo(output, decoder, animGroup);
            }

            return(output.ToString());
        }
Exemplo n.º 10
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);
            }
        }
Exemplo n.º 11
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 == 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);
        }
Exemplo n.º 12
0
        private static void AddLightSetInfo(System.Text.StringBuilder output, SSBHAnimTrackDecoder decoder, AnimGroup animGroup)
        {
            foreach (AnimNode animNode in animGroup.Nodes)
            {
                output.AppendLine(animNode.Name);

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

                    output.AppendLine($"\t{track.Name}");
                    foreach (var value in values)
                    {
                        output.AppendLine($"\t\t{value}");
                    }
                }
            }
        }
Exemplo n.º 13
0
        static void Main(string[] args)
        {
            /*string[] files = Directory.GetFiles("", "*.numshb*", SearchOption.AllDirectories);
             *
             * List<string> ErrorReading = new List<string>();
             * List<string> VertexAttributes = new List<string>();
             * int Unk8 = 0;
             * int Bid = 0;
             * int VersionM = 0;
             * int Versionm = 0;
             * foreach(string s in files)
             * {
             *  ISSBH_File File;
             *  try
             *  {
             *      if (SSBH.TryParseSSBHFile(s, out File))
             *      {
             *          if (File is MESH)
             *          {
             *              VersionM = Math.Max(VersionM, ((MESH)File).VersionMajor);
             *              Versionm = Math.Max(Versionm, ((MESH)File).VersionMinor);
             *              foreach (MESH_Object o in ((MESH)File).Objects)
             *              {
             *                  Unk8 = Math.Max(Unk8, o.Unk8);
             *                  Bid = Math.Max(Bid, o.BID);
             *                  foreach (MESH_Attribute a in o.Attributes)
             *                  {
             *                      if (!VertexAttributes.Contains(a.AttributeStrings[0].Name))
             *                          VertexAttributes.Add(a.AttributeStrings[0].Name);
             *                  }
             *              }
             *          }
             *      }
             *  }
             *  catch(Exception)
             *  {
             *      ErrorReading.Add(s);
             *  }
             *
             * }
             *
             * StreamWriter w = new StreamWriter(new FileStream("outmsh.txt", FileMode.Create));
             *
             * w.WriteLine("Unk8 " + Unk8.ToString("X"));
             * w.WriteLine("M " + VersionM.ToString("X"));
             * w.WriteLine(", " + Versionm.ToString("X"));
             * w.WriteLine("BID " + Bid.ToString("X"));
             * w.WriteLine("Attributes: ");
             * foreach(string s in VertexAttributes)
             * {
             *  w.WriteLine(s);
             * }
             *
             * w.WriteLine("Errors: ");
             * foreach (string s in ErrorReading)
             * {
             *  w.WriteLine(s);
             * }
             *
             * w.Close();*/

            ISSBH_File File;

            if (SSBH.TryParseSSBHFile(Directory.GetCurrentDirectory() + "//" + args[0], out File))
            {
                if (File is ANIM anim)
                {
                    var decoder = new SSBHAnimTrackDecoder(anim);

                    XmlWriterSettings settings = new XmlWriterSettings
                    {
                        Indent          = true,
                        IndentChars     = "  ",
                        NewLineChars    = "\r\n",
                        NewLineHandling = NewLineHandling.Replace
                    };

                    string FileName = Directory.GetCurrentDirectory() + "//" + Path.GetDirectoryName(args[0]) + "\\" + Path.GetFileNameWithoutExtension(args[0]) + ".xml";

                    XmlWriter o = XmlWriter.Create(new FileStream(FileName, FileMode.Create), settings);
                    o.WriteStartDocument();

                    o.WriteStartElement("NamcoAnimation");

                    foreach (var an in anim.Animations)
                    {
                        o.WriteStartElement("Animation");
                        o.WriteAttributeString("Type", an.Type.ToString());
                        foreach (var node in an.Nodes)
                        {
                            o.WriteStartElement("Node");
                            o.WriteAttributeString("Name", node.Name);
                            foreach (var track in node.Tracks)
                            {
                                o.WriteStartElement("Track");
                                o.WriteAttributeString("Name", track.Name);
                                o.WriteAttributeString("FrameCount", track.FrameCount.ToString());
                                //o.WriteAttributeString("Flags", track.Flags.ToString("X"));

                                var values = decoder.ReadTrack(track);

                                if (values != null && values.Length > 0)
                                {
                                    o.WriteAttributeString("Type", values[0].GetType().Name);
                                }

                                for (int i = 0; i < values.Length; i++)
                                {
                                    o.WriteStartElement("Key");
                                    o.WriteAttributeString("Frame", (i + 1).ToString());
                                    o.WriteString(values[i].ToString());
                                    o.WriteEndElement();
                                }
                                o.WriteEndElement();
                            }
                            o.WriteEndElement();
                        }
                        o.WriteEndElement();
                    }

                    o.WriteEndElement();
                    o.Close();
                }
            }

            /*ISSBH_File File;
             * if(SSBH.TryParseSSBHFile("", out File))
             * {
             *  ExportFileAsXML("Test.xml", File);
             * }*/
            //Console.ReadLine();
        }
Exemplo n.º 14
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);
        }
Exemplo n.º 15
0
        private static void AddLightValues(Dictionary <string, HashSet <string> > valuesByName, SSBHAnimTrackDecoder decoder, AnimGroup animGroup)
        {
            // Store all unique values for each parameter.
            foreach (AnimNode animNode in animGroup.Nodes)
            {
                foreach (AnimTrack track in animNode.Tracks)
                {
                    if (!valuesByName.ContainsKey(track.Name))
                    {
                        valuesByName[track.Name] = new HashSet <string>();
                    }

                    object[] values = decoder.ReadTrack(track);

                    foreach (var value in values)
                    {
                        if (!valuesByName[track.Name].Contains(value.ToString()))
                        {
                            valuesByName[track.Name].Add(value.ToString());
                        }
                    }
                }
            }
        }