Beispiel #1
0
        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;
                }
            }
        }
Beispiel #2
0
        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);
        }