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