public void ResolvePointers(FileVerboseMode verboseMode) { Dna fileDna = (_fileDna != null) ? _fileDna : _memoryDna; if (true) // && ((_flags & FileFlags.BitsVaries | FileFlags.VersionVaries) != 0)) { //ResolvePointersMismatch(); } if ((verboseMode & FileVerboseMode.ExportXml) != 0) { Console.WriteLine("<?xml version=\"1.0\" encoding=\"utf-8\"?>"); Console.WriteLine("<bullet_physics version=\"{0}\" itemcount=\"{1}\">", Version, _chunks.Count); } foreach (ChunkInd dataChunk in _chunks) { if (_fileDna == null || fileDna.FlagEqual(dataChunk.DnaNR)) { Dna.StructDecl oldStruct = fileDna.GetStruct(dataChunk.DnaNR); if ((verboseMode & FileVerboseMode.ExportXml) != 0) { Console.WriteLine(" <{0} pointer=\"{1}\">", oldStruct.Type.Name, dataChunk.OldPtr); } ResolvePointersChunk(dataChunk, verboseMode); if ((verboseMode & FileVerboseMode.ExportXml) != 0) { Console.WriteLine(" </{0}>", oldStruct.Type.Name); } } else { //Console.WriteLine("skipping struct"); } } if ((verboseMode & FileVerboseMode.ExportXml) != 0) { Console.WriteLine("</bullet_physics>"); } }
protected byte[] ReadStruct(BinaryReader head, ChunkInd dataChunk) { bool ignoreEndianFlag = false; if ((_flags & FileFlags.EndianSwap) == FileFlags.EndianSwap) { //swap(head, dataChunk, ignoreEndianFlag); } if (!_fileDna.FlagEqual(dataChunk.DnaNR)) { // Ouch! need to rebuild the struct Dna.StructDecl oldStruct = _fileDna.GetStruct(dataChunk.DnaNR); if ((_flags & FileFlags.BrokenDna) != 0) { if (oldStruct.Type.Name.Equals("btQuantizedBvhNodeData") && oldStruct.Type.Length == 28) { throw new NotImplementedException(); } if (oldStruct.Type.Name.Equals("btShortIntIndexData")) { throw new NotImplementedException(); } } // Don't try to convert Link block data, just memcpy it. Other data can be converted. if (oldStruct.Type.Name.Equals("Link")) { //Console.WriteLine("Link found"); } else { int reverseOld = _memoryDna.GetReverseType(oldStruct.Type.Name); if (reverseOld != -1) { Dna.StructDecl curStruct = _memoryDna.GetStruct(reverseOld); byte[] structAlloc = new byte[dataChunk.NR * curStruct.Type.Length]; AddDataBlock(structAlloc); using (MemoryStream stream = new MemoryStream(structAlloc)) { using (BinaryWriter writer = new BinaryWriter(stream)) { long headerPtr = head.BaseStream.Position; for (int block = 0; block < dataChunk.NR; block++) { head.BaseStream.Position = headerPtr; ParseStruct(writer, head, oldStruct, curStruct, true); headerPtr += oldStruct.Type.Length; //_libPointers.Add(old, cur); } } } return(structAlloc); } } } else { #if DEBUG_EQUAL_STRUCTS #endif } byte[] dataAlloc = new byte[dataChunk.Length]; head.Read(dataAlloc, 0, dataAlloc.Length); return(dataAlloc); }