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(" ???"); }
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(); } }