Example #1
0
        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);
                }
            }
        }
Example #2
0
        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);
        }
Example #3
0
            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);
                }
            }