Exemple #1
0
        public void ReadGeometrySection(SRBinaryReader binaryReader, UInt32 cpu_size, long sectionDataStart)
        {
            Dictionary<UInt32, string> meshNamesList = new Dictionary<UInt32, string>();

            binaryReader.WriteLine("");
            binaryReader.WriteLine("  CRUNCHED REFERENCE GEOMETRY:");
            Int32 num_meshes = binaryReader.ReadInt32();
            binaryReader.WriteLine1("    Number of Meshes:     {0}", num_meshes);
            Int32 mesh_names_size = binaryReader.ReadInt32();
            binaryReader.WriteLine1("    Mesh Names Size:      {0}", mesh_names_size);

            // binaryReader.BaseStream.Seek(16, SeekOrigin.Current);
            long refDataOffset = binaryReader.BaseStream.Position;
            long refDataEnd = refDataOffset + mesh_names_size;
            binaryReader.WriteLine("");
            binaryReader.WriteLine("    MESH NAMES LIST:");
            for (int i = 1; binaryReader.BaseStream.Position < refDataEnd; i++)
            {
                long position = binaryReader.BaseStream.Position;
                string name = binaryReader.ReadStringZ();
                binaryReader.ReadByte();
                meshNamesList[(UInt32)(position - refDataOffset)] = name;
                binaryReader.WriteLineT("StringZ", "    {0,4}.  {1}", i, name);
                // Align on a word boundry
                while ((binaryReader.BaseStream.Position & 0x00000001) != 0)
                    binaryReader.ReadByte();
            }
            if (binaryReader.BaseStream.Position != refDataEnd)
                throw new Exception("Mesh Names List not expected size.");
            // Align on a 16-byte boundry
            while ((binaryReader.BaseStream.Position & 0x0000000F) != 0)
                binaryReader.ReadByte();
            binaryReader.WriteLine("");
            binaryReader.WriteLine("    MESHES LIST:");
            binaryReader.WriteLine("           *r_mesh  *material_map  File Name (from *r_mesh)");
            binaryReader.WriteLine("           -------  -------------  ------------------------");
            for (int i = 1; i <= num_meshes; i++)
            {
                uint r_mesh_offset = binaryReader.ReadUInt32();
                uint material_map_offset = binaryReader.ReadUInt32();
                string name = (SRZoneHeader.ReferenceData != null && SRZoneHeader.ReferenceData.ContainsKey(r_mesh_offset)) ?
                               SRZoneHeader.ReferenceData[r_mesh_offset] : "<invalid>";
                binaryReader.WriteLineT("UInt32[2]", "    {0,4}. {1,6}       {2,6}      {3}", i, r_mesh_offset, material_map_offset, name);
            }
            // Align on a 16 byte boundry
            while ((binaryReader.BaseStream.Position & 0x0000000F) != 0)
                binaryReader.ReadByte();
            binaryReader.WriteLine("");
            binaryReader.WriteLine("    FAST OBJECTS LIST:");
            for (int i = 1; i <= num_meshes; i++)
            {
                long start = binaryReader.BaseStream.Position;
                binaryReader.WriteLine("");
                binaryReader.WriteLine("      FAST OBJECT #{0}:", i);
                binaryReader.WriteLine1("        Object Handle:          0x{0:X16}", binaryReader.ReadUInt64());
                binaryReader.WriteLine1("        m_render_update_next:   0x{0:X8}", binaryReader.ReadUInt32());
                UInt32 nameOffset = binaryReader.ReadUInt32();
                binaryReader.WriteLine1("        name_offset:            0x{0:X8}", nameOffset);
                string name = meshNamesList.ContainsKey(nameOffset) ? meshNamesList[nameOffset] : "<invalid>";
                binaryReader.WriteLineX("        Name (from offset):     {0}", name);
                binaryReader.WriteLineT("float[3]", "        Position (x,y,z):       {0}, {1}, {2}", binaryReader.ReadSingle(), binaryReader.ReadSingle(), binaryReader.ReadSingle());
                binaryReader.WriteLineT("float[4]", "        Orientation (x,y,z,w):  {0}, {1}, {2}, {3}", binaryReader.ReadSingle(), binaryReader.ReadSingle(), binaryReader.ReadSingle(), binaryReader.ReadSingle());
                binaryReader.WriteLine("        etc.");
                binaryReader.BaseStream.Seek(start + 112, SeekOrigin.Begin);
            }
            binaryReader.WriteLine("");
            binaryReader.WriteLine("    MESH VARIANT DATA:");
            binaryReader.WriteLine("      ???");
        }
Exemple #2
0
        public void ReadFile(string cznFile)
        {
            FileStream headerFileStream = null;
            try
            {
                headerFileStream = new FileStream(cznFile, FileMode.Open, FileAccess.Read);
                SRBinaryReader binaryReader = new SRBinaryReader(headerFileStream);
                int section = 1;
                while (binaryReader.BaseStream.Position <= binaryReader.BaseStream.Length - 4)
                {
                    binaryReader.WriteLine("");
                    binaryReader.WriteLine("SECTION #{0}:", section++);
                    UInt32 section_id = binaryReader.ReadUInt32();
                    binaryReader.WriteLine1("  Section ID:   0x{0:X8}", section_id);
                    UInt32 id = (section_id & 0x7FFFFFFF);
                    if (id < 0x2233 || id >= 0x2300)
                        throw new Exception("Invalid section ID.  Not a valid zone file.");
                    if (ChrisLaRosa.SaintsRow.ZoneFile.SRZoneSectionIdentifiers.SectionTypes.ContainsKey(id))
                    {
                        binaryReader.WriteLineX("  Name:         " + ChrisLaRosa.SaintsRow.ZoneFile.SRZoneSectionIdentifiers.SectionTypes[id].name);
                        binaryReader.WriteLineX("  Description:  " + ChrisLaRosa.SaintsRow.ZoneFile.SRZoneSectionIdentifiers.SectionTypes[id].description);
                    }
                    UInt32 cpu_size = binaryReader.ReadUInt32();
                    binaryReader.WriteLine1("  CPU Size:     {0} bytes", cpu_size);
                    UInt32 gpu_size = 0;
                    if ((section_id & 0x80000000) != 0)
                    {
                        gpu_size = binaryReader.ReadUInt32();
                        binaryReader.WriteLine1("  GPU Size:     {0} bytes", gpu_size);
                    }
                    long sectionDataStart = binaryReader.BaseStream.Position;
                    if (cpu_size == 0 && gpu_size == 0)
                    {
                        binaryReader.WriteLine("");
                        binaryReader.WriteLine("  EMPTY SECTION = EOF");
                        break;
                    }

                    switch (id)
                    {
                        case 0x2233: ReadGeometrySection(binaryReader, cpu_size, sectionDataStart); break;
                        case 0x2234: ReadObjectSection(binaryReader, cpu_size, sectionDataStart); break;
                    }

                    binaryReader.BaseStream.Seek(sectionDataStart + cpu_size, SeekOrigin.Begin);
                    // Align on a dword boundry
                    while ((binaryReader.BaseStream.Position & 0x00000003) != 0)
                        binaryReader.ReadByte();
                }
            }
            finally
            {
                if (headerFileStream != null)
                    headerFileStream.Close();
            }
        }