protected void ParseStruct(BinaryWriter strc, BinaryReader data, Dna.StructDecl fileStruct, Dna.StructDecl memoryStruct, bool fixupPointers) { if (fileStruct == null) { return; } if (memoryStruct == null) { return; } long dataPtr = data.BaseStream.Position; long strcPtr = strc.BaseStream.Position; foreach (Dna.ElementDecl element in memoryStruct.Elements) { int memorySize = _memoryDna.GetElementSize(element); if (element.Type.Struct != null && element.Name.Name[0] != '*') { Dna.ElementDecl elementOld; long elementOffset = GetFileElement(fileStruct, element, dataPtr, out elementOld); if (elementOffset != 0) { Dna.StructDecl oldStruct = _fileDna.GetStruct(_fileDna.GetReverseType(element.Type.Name)); data.BaseStream.Position = elementOffset; int arrayLen = elementOld.Name.ArraySizeNew; if (arrayLen == 1) { strc.BaseStream.Position = strcPtr; ParseStruct(strc, data, oldStruct, element.Type.Struct, fixupPointers); strcPtr += memorySize; } else { int fileSize = _fileDna.GetElementSize(elementOld) / arrayLen; memorySize /= arrayLen; for (int i = 0; i < arrayLen; i++) { strc.BaseStream.Position = strcPtr; ParseStruct(strc, data, oldStruct, element.Type.Struct, fixupPointers); data.BaseStream.Position += fileSize; strcPtr += memorySize; } } } } else { strc.BaseStream.Position = strcPtr; GetMatchingFileDna(fileStruct, element, strc, dataPtr, fixupPointers); strcPtr += memorySize; } } }
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); }