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 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); }
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); } }