public void ExportAs(object sender, EventArgs args) { using (var sfd = new SaveFileDialog()) { sfd.Filter = "Source Model|*.smd|" + "All Files (*.*)|*.*"; sfd.DefaultExt = "smd"; if (sfd.ShowDialog() == DialogResult.OK) { GXVertexDecompressor decom = new GXVertexDecompressor(Root); SMD smd = new SMD(); smd.Bones = RenderBones; foreach (MeleeDataObjectNode n in DataObjects.Nodes) { int[] ind; List <GXVertex> verts; n.GetVerticesAsTriangles(out ind, out verts); for (int i = 0; i < ind.Length; i += 3) { SMDTriangle t = new SMDTriangle(); t.Material = "defaultmaterial"; t.v1 = GXVertexToSMDVertex(verts[ind[i]]); t.v2 = GXVertexToSMDVertex(verts[ind[i + 1]]); t.v3 = GXVertexToSMDVertex(verts[ind[i + 2]]); smd.Triangles.Add(t); } } smd.Save(sfd.FileName); } } }
public static void ExportIOModelAsSMD(string FileName, IOModel Model) { SMD file = new SMD(); if (Model.HasSkeleton) { var bonelist = new List <SBBone>(Model.Skeleton.Bones); var frame = new SMDSkeletonFrame(); file.skeleton.Add(frame); frame.time = 0; foreach (var bone in bonelist) { file.nodes.Add(new SMDNode() { Name = bone.Name, ID = bonelist.IndexOf(bone), ParentID = bonelist.IndexOf(bone.Parent) }); frame.skeletons.Add(new SMDSkeleton() { BoneID = bonelist.IndexOf(bone), Position = bone.Translation, Rotation = bone.RotationEuler }); } } if (Model.HasMeshes) { Dictionary <string, int> UniqueMeshNames = new Dictionary <string, int>(); foreach (var mesh in Model.Meshes) { if (!UniqueMeshNames.ContainsKey(mesh.Name)) { UniqueMeshNames.Add(mesh.Name, 0); } string Name = mesh.Name + (UniqueMeshNames[mesh.Name] == 0 ? "" : "_" + UniqueMeshNames[mesh.Name]); UniqueMeshNames[mesh.Name]++; for (int i = 0; i < mesh.Indices.Count; i += 3) { var triangle = new SMDTriangle(); triangle.Material = Name; triangle.vertex1 = IOVertexToSMDVertex(mesh.Vertices[(int)mesh.Indices[i + 0]]); triangle.vertex2 = IOVertexToSMDVertex(mesh.Vertices[(int)mesh.Indices[i + 1]]); triangle.vertex3 = IOVertexToSMDVertex(mesh.Vertices[(int)mesh.Indices[i + 2]]); file.triangles.Add(triangle); } } } file.Save(FileName); }
public void Open(string FileName) { string[] lines = File.ReadAllLines(FileName); string CurrentSection = ""; SMDSkeletonFrame CurrentSkeleton = null; for (int i = 0; i < lines.Length; i++) { string[] args = Regex.Replace(lines[i].Trim(), @"\s+", " ").Split(' '); if (args[0].Equals("end")) { CurrentSection = ""; } else if (args[0].Equals("time")) { if (CurrentSkeleton != null) { skeleton.Add(CurrentSkeleton); } CurrentSkeleton = new SMDSkeletonFrame(); int.TryParse(args[1], out CurrentSkeleton.time); } else if (args[0].Equals("nodes")) { CurrentSection = args[0]; } else if (args[0].Equals("skeleton")) { CurrentSection = args[0]; } else if (args[0].Equals("triangles")) { CurrentSection = args[0]; } else { switch (CurrentSection) { case "nodes": var node = new SMDNode(); node.Name = args[1].Replace("\"", ""); node.ID = int.Parse(args[0]); node.ParentID = int.Parse(args[0]); nodes.Add(node); break; case "skeleton": var skel = new SMDSkeleton(); skel.BoneID = int.Parse(args[0]); skel.Position = new Vector3(float.Parse(args[1]), float.Parse(args[2]), float.Parse(args[3])); skel.Rotation = new Vector3(float.Parse(args[4]), float.Parse(args[5]), float.Parse(args[6])); CurrentSkeleton.skeletons.Add(skel); break; case "triangles": var triangle = new SMDTriangle(); triangle.Material = args[0]; triangles.Add(triangle); triangle.vertex1.Parse(Regex.Replace(lines[i + 1].Trim(), @"\s+", " ").Split(' ')); triangle.vertex1.Parse(Regex.Replace(lines[i + 2].Trim(), @"\s+", " ").Split(' ')); triangle.vertex1.Parse(Regex.Replace(lines[i + 3].Trim(), @"\s+", " ").Split(' ')); i += 3; break; } } } if (CurrentSkeleton != null) { skeleton.Add(CurrentSkeleton); } }