private static void DeserializeXml(string inputPath, string outputPath, XmlSerializer serializer) { Console.WriteLine($"Converting {Path.GetFileName(inputPath)} to {outputPath}_out.numatb..."); using (TextReader reader = new StringReader(File.ReadAllText(inputPath))) { var result = (MaterialLibrary)serializer.Deserialize(reader); MATL newmatl = LibraryToMATL(result); SSBH.TrySaveSSBHFile(outputPath + "_out.numatb", newmatl); } }
public static void Save(string FileName, SBScene Scene) { var Skeleton = Scene.Skeleton; var skelFile = new SKEL(); skelFile.MajorVersion = 1; skelFile.MinorVersion = 0; List <SKEL_BoneEntry> BoneEntries = new List <SKEL_BoneEntry>(); List <SKEL_Matrix> Transforms = new List <SKEL_Matrix>(); List <SKEL_Matrix> InvTransforms = new List <SKEL_Matrix>(); List <SKEL_Matrix> WorldTransforms = new List <SKEL_Matrix>(); List <SKEL_Matrix> InvWorldTransforms = new List <SKEL_Matrix>(); short index = 0; Dictionary <SBBone, short> BoneToIndex = new Dictionary <SBBone, short>(); var OrderedBones = SortBones(Skeleton.Bones); foreach (var bone in OrderedBones) { BoneToIndex.Add(bone, index); var boneentry = new SKEL_BoneEntry(); boneentry.Name = bone.Name; boneentry.Type = bone.Type; boneentry.ID = index++; boneentry.Type = 1; boneentry.ParentID = -1; if (bone.Parent != null)// && BoneToIndex.ContainsKey(bone.Parent)) { boneentry.ParentID = (short)OrderedBones.IndexOf(bone.Parent); } BoneEntries.Add(boneentry); Transforms.Add(TKMatrix_to_Skel(bone.Transform)); InvTransforms.Add(TKMatrix_to_Skel(bone.Transform.Inverted())); WorldTransforms.Add(TKMatrix_to_Skel(bone.WorldTransform)); InvWorldTransforms.Add(TKMatrix_to_Skel(bone.InvWorldTransform)); } skelFile.BoneEntries = BoneEntries.ToArray(); skelFile.Transform = Transforms.ToArray(); skelFile.InvTransform = InvTransforms.ToArray(); skelFile.WorldTransform = WorldTransforms.ToArray(); skelFile.InvWorldTransform = InvWorldTransforms.ToArray(); SSBH.TrySaveSSBHFile(FileName, skelFile); }
/// <summary> /// /// </summary> /// <param name="FileName"></param> public override void ExportSceneToFile(string FileName) { if (Model == null) { return; } string name = Path.GetDirectoryName(FileName) + "/" + Path.GetFileNameWithoutExtension(FileName); string simpleName = Path.GetFileNameWithoutExtension(FileName); SBConsole.WriteLine("Creating MODL..."); var modl = MODL_Loader.CreateMODLFile((SBUltimateModel)Model); modl.ModelFileName = simpleName; modl.SkeletonFileName = $"{simpleName}.nusktb"; modl.MeshString = $"{simpleName}.numshb"; modl.UnknownFileName = ""; modl.MaterialFileNames = new MODL_MaterialName[] { new MODL_MaterialName() { MaterialFileName = $"{simpleName}.numatb" } }; SBConsole.WriteLine("Done"); SSBH.TrySaveSSBHFile(FileName, modl); SBConsole.WriteLine($"Creating MESH... {name}.numshb"); var mesh = MESH_Loader.CreateMESH((SBUltimateModel)Model, (SBSkeleton)Skeleton); SBConsole.WriteLine("Done"); SSBH.TrySaveSSBHFile(name + ".numshb", mesh); SBConsole.WriteLine($"Creating SKEL.. {name}.nusktb"); SKEL_Loader.Save(name + ".nusktb", this); SBConsole.WriteLine("Done"); //SBConsole.WriteLine("Creating MATL..."); }
/// <summary> /// Generates and saves the new ANIM file /// </summary> /// <param name="fname"></param> public void Save(string fname) { // Prep Anim File animFile.Name = Path.GetFileName(fname); animFile.Animations = groups.ToArray(); // Create Buffer MemoryStream buffer = new MemoryStream(); using (BinaryWriter w = new BinaryWriter(buffer)) { foreach (var animation in animFile.Animations) { foreach (var node in animation.Nodes) { foreach (var track in node.Tracks) // TODO: these nodes need to be in ordinal order { var values = trackToValues[track]; track.DataOffset = (uint)buffer.Position; track.FrameCount = (uint)values.Count; if (values.Count > 0) { track.Flags |= (uint)GetTrackTypeFlag(values[0]); } if (values.Count == 1) { if (animation.Type == ANIM_TYPE.Transform) { track.Flags |= (int)ANIM_TRACKFLAGS.ConstTransform; } else { track.Flags |= (int)ANIM_TRACKFLAGS.Constant; } track.FrameCount = 1; WriteValues(w, (int)track.Flags, values); } else { if (WriteValues(w, (int)track.Flags, values)) { track.Flags |= (int)ANIM_TRACKFLAGS.Compressed; } else { track.Flags |= (int)ANIM_TRACKFLAGS.Direct; } } track.DataSize = (uint)(buffer.Position - track.DataOffset); int padding = (int)(0x40 - (w.BaseStream.Position % 0x40)); w.Write(new byte[padding]); //Console.WriteLine(w.BaseStream.Position.ToString("X") + " " + values.Count + " " + track.Flags.ToString("X")); } } } } animFile.Buffer = buffer.ToArray(); buffer.Close(); buffer.Dispose(); SSBH.TrySaveSSBHFile(fname, animFile); }