public static HIE Load(string path) { FileInfo fi = new FileInfo(path); Logger.LogToFile(Logger.LogLevel.Info, "{0}", path); HIE hie = new HIE(); H h = new H(); ; var f = fi.Directory.GetFiles(Path.GetFileNameWithoutExtension(path) + ".h"); if (f.Length == 0) { f = fi.Directory.Parent.GetFiles(Path.GetFileNameWithoutExtension(path) + ".h"); } if (f.Length > 0) { h = H.Load(f[0].FullName); } string[] lines; using (var sr = new StreamReader(fi.OpenRead())) { lines = sr.ReadToEnd().Split("\r\n".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); } lines = lines.Select(l => l.Trim()).ToArray(); for (int i = 0; i < lines.Length; i++) { switch (lines[i].ToLower()) { case "//version number": hie.version = int.Parse(lines[i + 2]); i += 2; break; case "// number of cull nodes": hie.cullNodeCount = int.Parse(lines[++i]); break; case "// cull node list": for (int j = 0; j < hie.cullNodeCount; j++) { var cullNode = lines[++i]; } break; case "// number of collision data meshes": hie.collisionDataMeshCount = int.Parse(lines[++i]); break; case "// collision data list": for (int j = 0; j < hie.collisionDataMeshCount; j++) { var collisionDataMesh = lines[++i]; } break; case "// number of lines": hie.lineCount = int.Parse(lines[++i]); break; case "// line name list": for (int j = 0; j < hie.lineCount; j++) { var line = lines[++i]; } break; case "// number of textures": hie.textureCount = int.Parse(lines[++i]); break; case "// texture name list": for (int j = 0; j < hie.textureCount; j++) { hie.textures.Add(lines[++i].Replace("\"", "").Trim()); } break; case "// number of materials": hie.materialCount = int.Parse(lines[++i]); break; case "// material name list": for (int j = 0; j < hie.materialCount; j++) { var material = lines[++i]; } break; case "// number of matrices": hie.matrixCount = int.Parse(lines[++i]); break; case "// matrix name list": for (int j = 0; j < hie.matrixCount; j++) { string[] parts; var matrix = new TDRMatrix(); parts = lines[++i].Trim().Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); matrix.Matrix.M11 = Convert.ToSingle(parts[0], HIE.Culture); matrix.Matrix.M12 = Convert.ToSingle(parts[1], HIE.Culture); matrix.Matrix.M13 = Convert.ToSingle(parts[2], HIE.Culture); parts = lines[++i].Trim().Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); matrix.Matrix.M21 = Convert.ToSingle(parts[0], HIE.Culture); matrix.Matrix.M22 = Convert.ToSingle(parts[1], HIE.Culture); matrix.Matrix.M23 = Convert.ToSingle(parts[2], HIE.Culture); parts = lines[++i].Trim().Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); matrix.Matrix.M31 = Convert.ToSingle(parts[0], HIE.Culture); matrix.Matrix.M32 = Convert.ToSingle(parts[1], HIE.Culture); matrix.Matrix.M33 = Convert.ToSingle(parts[2], HIE.Culture); parts = lines[++i].Trim().Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); matrix.Matrix.M41 = Convert.ToSingle(parts[0], HIE.Culture); matrix.Matrix.M42 = Convert.ToSingle(parts[1], HIE.Culture); matrix.Matrix.M43 = Convert.ToSingle(parts[2], HIE.Culture); matrix.Name = lines[++i].Trim().Replace("\"", ""); hie.matrixes.Add(matrix); } break; case "// number of meshes": hie.meshCount = int.Parse(lines[++i]); break; case "// mesh name list": while (!lines[++i].StartsWith("//")) { hie.meshes.Add(lines[i].Trim().Replace("\"", "")); } i--; break; case "// number of expressions": hie.expressionCount = int.Parse(lines[++i]); break; case "// expression list :": if (lines[i + 1].ToLower() == "// high_val low_val") { i++; } for (int j = 0; j < hie.expressionCount; j++) { var expression = lines[++i]; } break; case "// number of nodes": hie.nodeCount = int.Parse(lines[++i]); break; case "// node list :": if (lines[i + 1].ToLower() == "// type index child sibling") { i++; } for (int j = 0; j < hie.nodeCount; j++) { hie.nodes.Add(new TDRNode((h.Definitions.ContainsKey(j) ? h.Definitions[j] : "DEFAULT"), j, lines[++i])); } break; default: Console.WriteLine(i + "] " + lines[i]); break; } } // If iLineCount > 0 Then lSplines = ProcessLins(sFile.Replace(".hie", ".lins")) // For i As Integer = 0 To iTexCount - 1 // TextureFlags.Add(0) // Next // For i As Integer = 0 To iMeshCount - 1 // MatrixList.Add(New List(Of Matrix3D)) // MeshTexture.Add(0) // Next // Dim tree As New Node(0, lNodes, 0) // Dim stack As New Stack(Of Node) // Dim tID, mID, matFlags As Integer hie.root = hie.nodes[0]; hie.root.Name = (h.Definitions.ContainsKey(0) ? h.Definitions[0] : "DEFAULT"); hie.root.Transform = hie.matrixes[hie.root.Index].Matrix; walkHierarchy(hie.root, 1, hie); // stack.Push(tree) // While stack.Count > 0 // Dim current As Node = stack.Pop() // Console.WriteLine(Repeat(Chr(32), current.Depth * 2) & current.iNode & " - " & current.Type.ToString() & "[" & current.Index & "]") // Select Case current.Type // Case Node.NodeType.Matrix // mID = current.Index // Case Node.NodeType.Material // matFlags = lMaterials(current.Index) // Case Node.NodeType.Texture // tID = current.Index // If tID < 0 Then tID = 0 // TextureFlags(tID) = matFlags // Case Node.NodeType.Mesh // MatrixList(current.Index) = Node.BuildMatrix(current, lMatrix) // MeshTexture(current.Index) = tID // Case Node.NodeType.Spline // Lines.Add(New tdrSpline(lMatrixFile(mID), Node.BuildSingleMatrix(current, lMatrix), lSplines(current.Index))) // End Select // For Each child As Node In current.Children // stack.Push(child) // Next // End While // End Sub return hie; }
public static HIE Load(string path) { void walkHierarchy(TDRNode parent, int index, HIE hierarchy) { TDRNode node = hierarchy.Nodes[index]; switch (node.Type) { case TDRNode.NodeType.Matrix: node.Transform = hierarchy.Matrixes[node.Index].Matrix; break; } if (node.Parent != null) { parent.Children.Remove(node); } node.Parent = parent; parent.Children.Add(node); if (node.Child > -1) { walkHierarchy(node, node.Child, hierarchy); } if (node.Sibling > -1) { walkHierarchy(parent, node.Sibling, hierarchy); } } FileInfo fi = new FileInfo(path); Logger.LogToFile(Logger.LogLevel.Info, "{0}", path); HIE hie = new HIE(); H h = new H(); FileInfo[] f = fi.Directory.GetFiles($"{Path.GetFileNameWithoutExtension(path)}.h"); if (f.Length == 0) { f = fi.Directory.Parent.GetFiles($"{Path.GetFileNameWithoutExtension(path)}.h"); } if (f.Length > 0) { h = H.Load(f[0].FullName); } string[] lines; using (StreamReader sr = new StreamReader(fi.OpenRead())) { lines = sr.ReadToEnd().Split("\r\n".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); } lines = lines.Select(l => l.Trim()).ToArray(); for (int i = 0; i < lines.Length; i++) { switch (lines[i].ToLower()) { case "//version number": hie.Version = int.Parse(lines[i + 2]); i += 2; break; case "// number of cull nodes": hie.CullNodeCount = int.Parse(lines[++i]); break; case "// cull node list": for (int j = 0; j < hie.CullNodeCount; j++) { string cullNode = lines[++i]; } break; case "// number of collision data meshes": hie.CollisionDataMeshCount = int.Parse(lines[++i]); break; case "// collision data list": for (int j = 0; j < hie.CollisionDataMeshCount; j++) { hie.CollisionDataMeshes.Add(lines[++i]); } break; case "// number of lines": hie.LineCount = int.Parse(lines[++i]); break; case "// line name list": while (!lines[++i].StartsWith("//")) { hie.LineNames.Add(lines[i].Trim().Replace("\"", "")); } i--; break; case "// number of textures": hie.TextureCount = int.Parse(lines[++i]); break; case "// texture name list": for (int j = 0; j < hie.TextureCount; j++) { hie.Textures.Add(lines[++i].Replace("\"", "").Trim()); } break; case "// number of materials": hie.MaterialCount = int.Parse(lines[++i]); break; case "// material name list": for (int j = 0; j < hie.MaterialCount; j++) { hie.Materials.Add(new TDRMaterial(lines[++i])); } break; case "// number of matrices": hie.MatrixCount = int.Parse(lines[++i]); break; case "// matrix name list": for (int j = 0; j < hie.MatrixCount; j++) { string[] parts; TDRMatrix matrix = new TDRMatrix(); parts = lines[++i].Trim().Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); matrix.Matrix.M11 = Convert.ToSingle(parts[0], Culture); matrix.Matrix.M12 = Convert.ToSingle(parts[1], Culture); matrix.Matrix.M13 = Convert.ToSingle(parts[2], Culture); parts = lines[++i].Trim().Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); matrix.Matrix.M21 = Convert.ToSingle(parts[0], Culture); matrix.Matrix.M22 = Convert.ToSingle(parts[1], Culture); matrix.Matrix.M23 = Convert.ToSingle(parts[2], Culture); parts = lines[++i].Trim().Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); matrix.Matrix.M31 = Convert.ToSingle(parts[0], Culture); matrix.Matrix.M32 = Convert.ToSingle(parts[1], Culture); matrix.Matrix.M33 = Convert.ToSingle(parts[2], Culture); parts = lines[++i].Trim().Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); matrix.Matrix.M41 = Convert.ToSingle(parts[0], Culture); matrix.Matrix.M42 = Convert.ToSingle(parts[1], Culture); matrix.Matrix.M43 = Convert.ToSingle(parts[2], Culture); matrix.Name = lines[++i].Trim().Replace("\"", ""); hie.Matrixes.Add(matrix); } break; case "// number of meshes": hie.MeshCount = int.Parse(lines[++i]); break; case "// mesh name list": while (!lines[++i].StartsWith("//")) { hie.Meshes.Add(lines[i].Trim().Replace("\"", "")); } i--; break; case "// number of expressions": hie.ExpressionCount = int.Parse(lines[++i]); break; case "// expression list :": if (lines[i + 1].ToLower() == "// high_val low_val") { i++; } for (int j = 0; j < hie.ExpressionCount; j++) { string[] p = lines[++i].Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); hie.Expressions.Add(new Vector2(p[0].ToSingle(), p[1].ToSingle())); } break; case "// number of nodes": hie.NodeCount = int.Parse(lines[++i]); break; case "// node list :": if (lines[i + 1].ToLower() == "// type index child sibling") { i++; } for (int j = 0; j < hie.NodeCount; j++) { hie.Nodes.Add(new TDRNode((h.Definitions.ContainsKey(j) ? h.Definitions[j] : "DEFAULT"), j, lines[++i])); } break; default: Console.WriteLine(i + "] " + lines[i]); break; } } hie.Root.Name = h.Definitions.ContainsKey(0) ? h.Definitions[0] : "DEFAULT"; hie.Root.Transform = hie.Matrixes[hie.Root.Index].Matrix; walkHierarchy(hie.Root, 1, hie); return(hie); }
private static void walkHierarchy(TDRNode parent, int index, HIE hie) { TDRNode node = hie.nodes[index]; //Console.WriteLine("{0} > {1} : {2}", parent.ID, node.ID, node.Type); switch (node.Type) { case TDRNode.NodeType.Matrix: node.Transform = hie.matrixes[node.Index].Matrix; break; } if (node.Parent != null) { parent.Children.Remove(node); } node.Parent = parent; parent.Children.Add(node); if (node.Child > -1) { walkHierarchy(node, node.Child, hie); } if (node.Sibling > -1) { walkHierarchy(parent, node.Sibling, hie); } }
static void ProcessNode(TDRNode node, Model model, Model mshses, HIE hie, int ParentBoneIndex = 0) { int boneIndex = ParentBoneIndex; if (exit) { return; } switch (node.Type) { case TDRNode.NodeType.Matrix: boneIndex = model.AddMesh(null, boneIndex); model.SetName(node.Name, boneIndex); model.SetTransform( new Matrix4 ( node.Transform.M11, node.Transform.M12, node.Transform.M13, 0, node.Transform.M21, node.Transform.M22, node.Transform.M23, 0, node.Transform.M31, node.Transform.M32, node.Transform.M33, 0, node.Transform.M41, node.Transform.M42, node.Transform.M43, 1 ), boneIndex); break; case TDRNode.NodeType.Mesh: int index = node.Index; mshses.Meshes[index].MeshParts[0].Material = material; if (model.Bones[ParentBoneIndex].Mesh == null) { model.SetMesh(mshses.Meshes[index], boneIndex); //exit = true; //Console.WriteLine("Adding mesh #{0} \"{1}\" to bone #{2} \"{3}\"", index, mshses.Meshes[index].Name, boneIndex, model.Bones[boneIndex].Name); } else { boneIndex = model.AddMesh(mshses.Meshes[index], ParentBoneIndex); model.SetName(mshses.Meshes[index].Name, boneIndex); //model.SetName(mshses.Meshes[index].Name, model.AddMesh(mshses.Meshes[index], ParentBoneIndex)); //Console.WriteLine("Adding mesh #{0} \"{1}\" to brand new bone", index, mshses.Meshes[index].Name); } break; case TDRNode.NodeType.Texture: if (node.Index > -1) { material = SceneManager.Current.Content.Load<Material, TXImporter>(hie.Textures[node.Index]); } else { material = null; } break; } foreach (var child in node.Children) { ProcessNode(child, model, mshses, hie, boneIndex); } }