public void ReadObjectSection(SRBinaryReader binaryReader, UInt32 cpu_size, long sectionDataStart) { binaryReader.WriteLine(""); binaryReader.WriteLine(" OBJECT SECTION HEADER:"); Int32 signature = binaryReader.ReadInt32(); binaryReader.WriteLine1(" Header Signature: 0x{0:X8}", signature); Int32 version = binaryReader.ReadInt32(); binaryReader.WriteLine1(" Version: {0}", version); Int32 num_objects = binaryReader.ReadInt32(); binaryReader.WriteLine1(" Number of Objects: {0}", num_objects); Int32 num_handles = binaryReader.ReadInt32(); binaryReader.WriteLine1(" Number of Handles: {0}", num_handles); Int32 flags = binaryReader.ReadInt32(); binaryReader.WriteLine1(" Flags: 0x{0:X8}", flags); Int32 handle_list_ptr = binaryReader.ReadInt32(); binaryReader.WriteLine1(" Handle List Pointer: 0x{0:X8} (run-time)", handle_list_ptr); Int32 object_data_ptr = binaryReader.ReadInt32(); binaryReader.WriteLine1(" Object Data Pointer: 0x{0:X8} (run-time)", object_data_ptr); Int32 object_data_size = binaryReader.ReadInt32(); binaryReader.WriteLine1(" Object Data Size: {0,-10} (run-time)", object_data_size); binaryReader.WriteLine(""); binaryReader.WriteLine(" HANDLE LIST:"); for (int i = 1; i <= num_handles; i++) { UInt64 handle = binaryReader.ReadUInt64(); // if (i > 10 && i < num_handles - 10) continue; binaryReader.WriteLineT("UInt64", " {0,3}. 0x{1:X16}", i, handle); } int block = 1; while (block <= num_handles && binaryReader.BaseStream.Position < sectionDataStart + cpu_size) { // Align on a dword boundry while ((binaryReader.BaseStream.Position & 0x00000003) != 0) binaryReader.ReadByte(); if (binaryReader.BaseStream.Position >= sectionDataStart + cpu_size) break; binaryReader.WriteLine(""); binaryReader.WriteLine(" OBJECT #{0}:", block++); UInt64 handle_offset = binaryReader.ReadUInt64(); binaryReader.WriteLine1(" Handle Offset: 0x{0:X16}", handle_offset); UInt64 parent_handle_offset = binaryReader.ReadUInt64(); binaryReader.WriteLine1(" Parent Handle Offset: 0x{0:X16}", parent_handle_offset); Int32 object_type_hash = binaryReader.ReadInt32(); binaryReader.WriteLine1(" Object Type Hash: 0x{0:X8}", object_type_hash); Int16 number_of_properties = binaryReader.ReadInt16(); binaryReader.WriteLine1(" Number of Properties: {0}", number_of_properties); Int16 buffer_size = binaryReader.ReadInt16(); binaryReader.WriteLine1(" Buffer Size: {0}", buffer_size); UInt16 name_offset = binaryReader.ReadUInt16(); binaryReader.WriteLine1(" Name Offset: {0}", name_offset); Int16 padding = binaryReader.ReadInt16(); binaryReader.WriteLine1(" Padding: {0}", padding); long savePosition = binaryReader.BaseStream.Position; binaryReader.BaseStream.Seek(name_offset, SeekOrigin.Current); string objectName = binaryReader.ReadStringZ(); binaryReader.WriteLineX(" Object Name: " + objectName); binaryReader.BaseStream.Seek(savePosition, SeekOrigin.Begin); for (int i = 1; i <= number_of_properties; i++) { // Align on a dword boundry while ((binaryReader.BaseStream.Position & 0x00000003) != 0) binaryReader.ReadByte(); binaryReader.WriteLine(""); binaryReader.WriteLine(" PROPERTY #{0}:", i); uint type = binaryReader.ReadUInt16(); string typeName = (type < propertyTypeNames.Length) ? propertyTypeNames[type] : "unknown"; binaryReader.WriteLineT("UInt16", " Type: {0} ({1})", type, typeName); Int16 size = binaryReader.ReadInt16(); binaryReader.WriteLine1(" Size: {0} bytes", size); Int32 name_crc = binaryReader.ReadInt32(); binaryReader.WriteLine1(" Name CRC: 0x{0:X8} ({0})", name_crc, name_crc); long dataBegin = binaryReader.BaseStream.Position; switch (type) { case 0: binaryReader.WriteLineT("StringZ", " Value: \"" + binaryReader.ReadStringZ() + "\""); break; case 2: binaryReader.WriteLineT("float[3]", " Value: Position (x,y,z): {0}, {1}, {2}", binaryReader.ReadSingle(), binaryReader.ReadSingle(), binaryReader.ReadSingle()); break; case 3: binaryReader.WriteLineT("float[3]", " Value: 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()); break; default: if (size > 16) { binaryReader.WriteLine(" Value: ???"); } else { byte[] buffer = new byte[size]; binaryReader.Read(buffer, 0, size); string hexBuffer = ""; for (int j = 0; j < size; j++) { hexBuffer += buffer[j].ToString("X2") + ' '; } binaryReader.WriteLine(" Value: {1}", i, hexBuffer); } break; } binaryReader.BaseStream.Seek(dataBegin + size, SeekOrigin.Begin); } } }
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(" ???"); }