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); } }
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) }); } } } }
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)); } } } }
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); } }
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); }
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); } }
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); } }
public void UpdateUniqueLightValues(Dictionary <string, HashSet <string> > valuesByName) { SSBHAnimTrackDecoder decoder = new SSBHAnimTrackDecoder(animation); foreach (AnimGroup animGroup in animation.Animations) { AddLightValues(valuesByName, decoder, animGroup); } }
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()); }
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); } }
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); }
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}"); } } } }
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(); }
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); }
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()); } } } } }