Ejemplo n.º 1
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);
        }
Ejemplo n.º 2
0
        public void ExportSBAnimation(string FileName, SBAnimation animation, SBSkeleton skeleton)
        {
            SMD file = new SMD();

            var bonelist = new List <SBBone>(skeleton.Bones);

            foreach (var bone in bonelist)
            {
                file.nodes.Add(new SMDNode()
                {
                    Name = bone.Name, ID = bonelist.IndexOf(bone), ParentID = bonelist.IndexOf(bone.Parent)
                });
            }

            for (int i = 0; i < animation.FrameCount; i++)
            {
                var group = new SMDSkeletonFrame();
                group.time = i;
                file.skeleton.Add(group);

                foreach (var bone in bonelist)
                {
                    bool found = false;
                    foreach (var animbone in animation.TransformNodes)
                    {
                        if (animbone.Name.Equals(bone.Name))
                        {
                            var tempBone = new SBBone();
                            tempBone.Transform = animbone.GetTransformAt(i, skeleton);
                            group.skeletons.Add(new SMDSkeleton()
                            {
                                BoneID = bonelist.IndexOf(bone), Position = tempBone.Translation, Rotation = tempBone.RotationEuler
                            });
                            found = true;
                            break;
                        }
                    }
                    if (!found)
                    {
                        group.skeletons.Add(new SMDSkeleton()
                        {
                            BoneID = bonelist.IndexOf(bone), Position = bone.Translation, Rotation = bone.RotationEuler
                        });
                    }
                }
            }

            file.Save(FileName);
        }
Ejemplo n.º 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);
                }
            }