public static void WriteToObj(string ExtractDirectory, ModelInfo Mi, Permutation.LOD LOD) { for (int x = 0; x < Mi.Regions.Count; x++) { Region region = Mi.Regions[x]; for (int y = 0; y < region.Permutations.Count; y++) { Permutation perm = region.Permutations[y]; ModelPart mp = Mi.ModelParts[perm.LODs[(int)LOD]]; FileStream fs = new FileStream(ExtractDirectory + Mi.Name + "_" + region.Name + "_" + perm.Name + ".obj", FileMode.Create); StreamWriter sw = new StreamWriter(fs); sw.WriteLine("# ----- ----------------------------------"); sw.WriteLine("# Halo 3 Model - Extracted with Alteration"); sw.WriteLine("# ----------------------------------------"); WriteModelPart(sw, mp, 0); sw.Close(); } } }
public static void WriteToSingleObj(string ExtractDirectory, ModelInfo Mi, Permutation.LOD LOD) { FileStream fs = new FileStream(ExtractDirectory + LOD.ToString() + ".obj", FileMode.Create); StreamWriter sw = new StreamWriter(fs); sw.WriteLine("# ----- ----------------------------------"); sw.WriteLine("# Halo 3 Model - Extracted with Alteration"); sw.WriteLine("# ----------------------------------------"); //for (int x = 0; x < Mi.Regions.Count; x++) // if (LOD < Mi.Regions[x].Permutations.Count) // { // WriteModelPart(sw, Mi.ModelParts[Mi.Regions[x].PermutationsIndexs[LOD]], 0); // } sw.Close(); }
public static void WriteEMF(string FilePath, ModelInfo Mi, Permutation.LOD LOD, bool ExportNodes, bool ExportMakers, System.Windows.Forms.TreeView treeView) { // Create our file EndianIO io = new EndianIO(FilePath, EndianType.LittleEndian); io.Open(); // Write out our header io.Out.Write(0x21666D65); // emf! io.Out.Write(0x00000001); // version #1 // Write our model name io.Out.Write(Mi.Name.ToCharArray()); io.Out.Write((byte)0x00); // Write our nodes if (ExportNodes) { io.Out.Write(Mi.Nodes.Count); for (int x = 0; x < Mi.Nodes.Count; x++) { io.Out.Write(Mi.Nodes[x].Name.ToCharArray()); io.Out.Write((byte)0x00); io.Out.Write(Mi.Nodes[x].ParentNodeIndex); io.Out.Write(Mi.Nodes[x].DefaultTranslationX); io.Out.Write(Mi.Nodes[x].DefaultTranslationY); io.Out.Write(Mi.Nodes[x].DefaultTranslationZ); io.Out.Write(Mi.Nodes[x].DefaultRotationI); io.Out.Write(Mi.Nodes[x].DefaultRotationJ); io.Out.Write(Mi.Nodes[x].DefaultRotationK); io.Out.Write(Mi.Nodes[x].DefaultRotationW); } } else { io.Out.Write((int)0); } // Write out our marker groups if (ExportMakers) { io.Out.Write(Mi.MarkerGroups.Count); for (int x = 0; x < Mi.MarkerGroups.Count; x++) { // Write our group name io.Out.Write(Mi.MarkerGroups[x].Name.ToCharArray()); io.Out.Write((byte)0x00); // Write out our markers io.Out.Write(Mi.MarkerGroups[x].Markers.Count); for (int y = 0; y < Mi.MarkerGroups[x].Markers.Count; y++) { io.Out.Write(Mi.MarkerGroups[x].Markers[y].RegionIndex); io.Out.Write(Mi.MarkerGroups[x].Markers[y].PermutationIndex); io.Out.Write(Mi.MarkerGroups[x].Markers[y].NodeIndex); io.Out.Write(Mi.MarkerGroups[x].Markers[y].TranslationX); io.Out.Write(Mi.MarkerGroups[x].Markers[y].TranslationY); io.Out.Write(Mi.MarkerGroups[x].Markers[y].TranslationZ); io.Out.Write(Mi.MarkerGroups[x].Markers[y].RotationI); io.Out.Write(Mi.MarkerGroups[x].Markers[y].RotationJ); io.Out.Write(Mi.MarkerGroups[x].Markers[y].RotationK); io.Out.Write(Mi.MarkerGroups[x].Markers[y].RotationW); io.Out.Write(Mi.MarkerGroups[x].Markers[y].Scale); } } } else { io.Out.Write((int)0); } // See how many regions are checked int count = 0; for (int x = 0; x < treeView.Nodes.Count; x++) { if (treeView.Nodes[x].Checked) { count++; } } // Write out our regions io.Out.Write(count); for (int x = 0; x < treeView.Nodes.Count; x++) { // Only if this region is slected if (treeView.Nodes[x].Checked) { // Write our region name io.Out.Write(Mi.Regions[x].Name.ToCharArray()); io.Out.Write((byte)0x00); // Get our perm count int pcount = 0; for (int y = 0; y < treeView.Nodes[x].Nodes.Count; y++) { if (treeView.Nodes[x].Nodes[y].Checked) { pcount++; } } // Write our perms io.Out.Write(pcount); for (int y = 0; y < treeView.Nodes[x].Nodes.Count; y++) { // Only if this perm is slected if (treeView.Nodes[x].Nodes[y].Checked) { // Write our perm name io.Out.Write(Mi.Regions[x].Permutations[y].Name.ToCharArray()); io.Out.Write((byte)0x00); // Get our model part from this perms LOD ModelPart part = Mi.ModelParts[Mi.Regions[x].Permutations[y].LODs[(int)LOD]]; // Write out our vertex format io.Out.Write(part.VertexFormat); #region Old Code /* * // Write out our submeshs * io.Out.Write(part.Submeshes.Count); * for (int z = 0; z < part.Submeshes.Count; z++) * { * // Write our vertex data * io.Out.Write(part.totalVertexCount); * for (int v = 0; v < part.totalVertexCount; v++) * { * io.Out.Write(part.VertexData[v].X); * io.Out.Write(part.VertexData[v].Y); * io.Out.Write(part.VertexData[v].Z); * io.Out.Write(part.VertexData[v].textureU); * io.Out.Write(part.VertexData[v].textureV); * * // If we have bone id's and skin weights * if (part.VertexFormat == 2) * { * io.Out.Write(part.VertexData[v].boneID1); * io.Out.Write(part.VertexData[v].boneID2); * io.Out.Write(part.VertexData[v].boneID3); * io.Out.Write(part.VertexData[v].boneID4); * io.Out.Write(part.VertexData[v].VertWeight1); * io.Out.Write(part.VertexData[v].VertWeight2); * io.Out.Write(part.VertexData[v].VertWeight3); * io.Out.Write(part.VertexData[v].VertWeight4); * } * } * * // Lets create our triangle list first * List<ushort> triangleList = new List<ushort>(); * for (int s = 0; s < part.Submeshes.Count; s++) * { * for (int i = part.Submeshes[s].SubsetIndex; * i < part.Submeshes[s].SubsetIndex + * part.Submeshes[s].SubsetCount; i++) * { * triangleList.AddRange(createTriangleList( * part.triangleStripData, * part.Subsets[i].FaceStart, * part.Subsets[i].FaceLength)); * } * } * * // Write our face data * io.Out.Write(triangleList.Count / 3); * for (int f = 0; f < triangleList.Count; f += 3) * { * io.Out.Write(triangleList[f]); * io.Out.Write(triangleList[f + 1]); * io.Out.Write(triangleList[f + 2]); * } * }*/ #endregion // We only have 1 submeshs io.Out.Write((int)1); // Lets write all our verts // Write our vertex data io.Out.Write(part.totalVertexCount); for (int v = 0; v < part.totalVertexCount; v++) { io.Out.Write(part.VertexData[v].X); io.Out.Write(part.VertexData[v].Y); io.Out.Write(part.VertexData[v].Z); io.Out.Write(part.VertexData[v].textureU); io.Out.Write(part.VertexData[v].textureV); // If we have bone id's and skin weights if (part.VertexFormat == 2) { io.Out.Write(part.VertexData[v].boneID1); io.Out.Write(part.VertexData[v].boneID2); io.Out.Write(part.VertexData[v].boneID3); io.Out.Write(part.VertexData[v].boneID4); io.Out.Write(part.VertexData[v].VertWeight1); io.Out.Write(part.VertexData[v].VertWeight2); io.Out.Write(part.VertexData[v].VertWeight3); io.Out.Write(part.VertexData[v].VertWeight4); } } // Lets create our triangle list first List <ushort> triangleList = new List <ushort>(); /*for (int s = 0; s < part.Submeshes.Count; s++) * { * for (int i = part.Submeshes[s].SubsetIndex; * i < part.Submeshes[s].SubsetIndex + * part.Submeshes[s].SubsetCount; i++) * { * triangleList.AddRange(createTriangleList( * part.triangleStripData, * part.Subsets[i].FaceStart, * part.Subsets[i].FaceLength)); * } * }*/ triangleList.AddRange(createTriangleList( part.triangleStripData, 0, part.totalFaceCount)); // Write our face data io.Out.Write(triangleList.Count / 3); for (int f = 0; f < triangleList.Count; f += 3) { io.Out.Write(triangleList[f]); io.Out.Write(triangleList[f + 1]); io.Out.Write(triangleList[f + 2]); } } } } } // Close our new file io.Close(); }
public static void WriteTxt(string FilePath, ModelInfo Mi, Permutation.LOD LOD) { // Create a stream writer StreamWriter sw = new StreamWriter(FilePath + Mi.Name + ".txt", false, Encoding.ASCII); // Write out our regions sw.WriteLine("Region Count: {0}", Mi.Regions.Count); for (int x = 0; x < Mi.Regions.Count; x++) { // Write our region name sw.WriteLine("Region Name: {0}", Mi.Regions[x].Name); // Write our perms sw.WriteLine("Permutations Count: {0}", Mi.Regions[x].Permutations.Count); for (int y = 0; y < Mi.Regions[x].Permutations.Count; y++) { // Write our perm name sw.WriteLine("Permutation Name: {0}", Mi.Regions[x].Permutations[y].Name); // Get our model part from this perms LOD ModelPart part = Mi.ModelParts[Mi.Regions[x].Permutations[y].LODs[(int)LOD]]; // Write out our vertex format sw.WriteLine("Vertex Format: {0}", part.VertexFormat); // Write out our submeshs sw.WriteLine("Submesh Count: {0}", part.Submeshes.Count); for (int z = 0; z < part.Submeshes.Count; z++) { // Write our vertex data sw.WriteLine("Vertex Count: {0}", part.totalVertexCount); for (int v = 0; v < part.totalVertexCount; v++) { sw.Write("{0} {1} {2} {3} {4}", part.VertexData[v].X, part.VertexData[v].Y, part.VertexData[v].Z, part.VertexData[v].textureU, part.VertexData[v].textureV); // If we have bone id's and skin weights if (part.VertexFormat == 2) { sw.Write(" {0} {1} {2} {3} {4} {5} {6} {7}", part.VertexData[v].boneID1, part.VertexData[v].boneID2, part.VertexData[v].boneID3, part.VertexData[v].boneID4, part.VertexData[v].VertWeight1, part.VertexData[v].VertWeight2, part.VertexData[v].VertWeight3, part.VertexData[v].VertWeight4); } sw.Write("\r\n"); } // Lets create our triangle list first List <ushort> triangleList = new List <ushort>(); for (int s = 0; s < part.Submeshes.Count; s++) { for (int i = part.Submeshes[s].SubsetIndex; i < part.Submeshes[s].SubsetIndex + part.Submeshes[s].SubsetCount; i++) { triangleList.AddRange(createTriangleList( part.triangleStripData, part.Subsets[i].FaceStart, part.Subsets[i].FaceLength)); } } // Write our face data sw.WriteLine("Face Count: {0}", triangleList.Count / 3); for (int f = 0; f < triangleList.Count; f += 3) { sw.WriteLine("{0} {1} {2}", triangleList[f], triangleList[f + 1], triangleList[f + 2]); } sw.WriteLine(); } sw.WriteLine(); } sw.WriteLine(); } sw.Close(); }