/*
         *      public void AddStruct(char structType, IntPtr data, int len, IntPtr oldPtr, int code)
         *      {
         *              btBulletFile_addStruct(_native, structType._native, data, len, oldPtr, code);
         *      }
         */
        public override void Parse(FileVerboseMode verboseMode)
        {
            ParseInternal(verboseMode);

            //the parsing will convert to cpu endian
            Flags &= ~FileFlags.EndianSwap;

            _fileBuffer[8] = (byte)(BitConverter.IsLittleEndian ? 'v' : 'V');
        }
Beispiel #2
0
        protected void ParseInternal(FileVerboseMode verboseMode)
        {
            if (OK)
            {
                LoadDna(verboseMode);
            }

            if (OK)
            {
                ParseData();
                //ResolvePointers(verboseMode);
            }
        }
Beispiel #3
0
        /*
         *      public void AddStruct(char structType, IntPtr data, int len, IntPtr oldPtr, int code)
         *      {
         *              btBulletFile_addStruct(_native, structType._native, data, len, oldPtr, code);
         *      }
         */
        public override void Parse(FileVerboseMode verboseMode)
        {
            byte[] dna = (IntPtr.Size == 8) ? Serializer.GetBulletDna64() : Serializer.GetBulletDna();

            _dnaCopy = new byte[dna.Length];
            Buffer.BlockCopy(dna, 0, _dnaCopy, 0, _dnaCopy.Length);

            ParseInternal(verboseMode, _dnaCopy);

            //the parsing will convert to cpu endian
            _flags &= ~FileFlags.EndianSwap;

            _fileBuffer[8] = BitConverter.IsLittleEndian ? (byte)'v' : (byte)'V';
        }
Beispiel #4
0
        protected void ParseInternal(FileVerboseMode verboseMode)
        {
            if (!OK)
            {
                return;
            }

            LoadDna(verboseMode);
            if (!OK)
            {
                return;
            }

            ParseData();
            //ResolvePointers(verboseMode);
        }
Beispiel #5
0
        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>");
            }
        }
Beispiel #6
0
        protected void ResolvePointersChunk(ChunkInd dataChunk, FileVerboseMode verboseMode)
        {
            Dna fileDna = (_fileDna != null) ? _fileDna : _memoryDna;

            Dna.StructDecl oldStruct = fileDna.GetStruct(dataChunk.DnaNR);
            int            oldLen    = oldStruct.Type.Length;

            byte[] cur = FindLibPointer(dataChunk.OldPtr);
            using (MemoryStream stream = new MemoryStream(cur, false))
            {
                using (BinaryReader reader = new BinaryReader(stream))
                {
                    for (int block = 0; block < dataChunk.NR; block++)
                    {
                        long streamPosition = stream.Position;
                        ResolvePointersStructRecursive(reader, dataChunk.DnaNR, verboseMode, 1);
                        System.Diagnostics.Debug.Assert(stream.Position == streamPosition + oldLen);
                    }
                }
            }
        }
Beispiel #7
0
        private void LoadDna(FileVerboseMode verboseMode)
        {
            bool swap = (Flags & FileFlags.EndianSwap) != 0;

            using (var stream = new MemoryStream(_fileBuffer, false))
            {
                using (var reader = new BulletReader(stream))
                {
                    long dnaStart = FindDnaChunk(reader);
                    OK = dnaStart != -1;
                    if (!OK)
                    {
                        return;
                    }

                    stream.Position = dnaStart;
                    _fileDna        = Dna.Load(reader, swap);
                }
            }

            if (_fileDna.IsBroken(_version))
            {
                Console.WriteLine("Warning: broken DNA version");
                Flags |= FileFlags.BrokenDna;
            }

            //if ((verboseMode & FileVerboseMode.DumpDnaTypeDefinitions) != 0)
            //    _fileDna.DumpTypeDefinitions();

            byte[] memoryDnaData = IntPtr.Size == 8
                ? Serializer.GetBulletDna64()
                : Serializer.GetBulletDna();
            _memoryDna = Dna.Load(memoryDnaData, !BitConverter.IsLittleEndian);

            _structChanged = _fileDna.Compare(_memoryDna);
        }
        protected void ParseInternal(FileVerboseMode verboseMode)
        {
            if (OK)
            {
                LoadDna(verboseMode);
            }

            if (OK)
            {
                ParseData();
                //ResolvePointers(verboseMode);
            }
        }
        protected int ResolvePointersStructRecursive(BinaryReader reader, int dnaNr, FileVerboseMode verboseMode, int recursion)
        {
            Dna fileDna = (_fileDna != null) ? _fileDna : _memoryDna;
            Dna.StructDecl oldStruct = fileDna.GetStruct(dnaNr);

            int totalSize = 0;

            foreach (Dna.ElementDecl element in oldStruct.Elements)
            {
                int size = fileDna.GetElementSize(element);
                int arrayLen = element.Name.ArraySizeNew;

                if (element.Name.Name[0] == '*')
                {
                    if (arrayLen > 1)
                    {
                        throw new NotImplementedException();
                    }
                    else
                    {
                        long ptr = (IntPtr.Size == 8) ? reader.ReadInt64() : reader.ReadInt32();
                        if ((verboseMode & FileVerboseMode.ExportXml) != 0)
                        {
                            for (int i = 0; i < recursion; i++)
                            {
                                Console.Write("  ");
                            }
                            Console.WriteLine("<{0} type=\"pointer\"> {1} </{0}>", element.Name.Name.Substring(1), ptr);
                        }
                        byte[] ptrChunk = FindLibPointer(ptr);
                        if (ptrChunk != null)
                        {
                            //throw new NotImplementedException();
                        }
                        else
                        {
                            //Console.WriteLine("Cannot fixup pointer at {0} from {1} to {2}!", ptrptr, *ptrptr, ptr);
                        }
                    }
                }
                else
                {
                    if (element.Type.Struct != null)
                    {
                        if ((verboseMode & FileVerboseMode.ExportXml) != 0)
                        {
                            for (int i = 0; i < recursion; i++)
                            {
                                Console.Write("  ");
                            }

                            if (arrayLen > 1)
                            {
                                Console.WriteLine("<{0} type=\"{1}\" count={2}>", element.Name.CleanName, element.Type.Name, arrayLen);
                            }
                            else
                            {
                                Console.WriteLine("<{0} type=\"{1}\">", element.Name.CleanName, element.Type.Name);
                            }
                        }

                        for (int i = 0; i < arrayLen; i++)
                        {
                            int revType = _fileDna.GetReverseType(element.Type.Name);
                            ResolvePointersStructRecursive(reader, revType, verboseMode, recursion + 1);
                            //throw new NotImplementedException();
                        }

                        if ((verboseMode & FileVerboseMode.ExportXml) != 0)
                        {
                            for (int i = 0; i < recursion; i++)
                            {
                                Console.Write("  ");
                            }
                            Console.WriteLine("</{0}>", element.Name.CleanName);
                        }
                    }
                    else
                    {
                        // export a simple type
                        if ((verboseMode & FileVerboseMode.ExportXml) != 0)
                        {
                            if (arrayLen > MaxArrayLength)
                            {
                                Console.WriteLine("too long");
                            }
                            else
                            {
                                bool isIntegerType;
                                switch (element.Type.Name)
                                {
                                    case "char":
                                    case "short":
                                    case "int":
                                        isIntegerType = true;
                                        break;
                                    default:
                                        isIntegerType = false;
                                        break;
                                }

                                if (isIntegerType)
                                {
                                    throw new NotImplementedException();
                                    /*
                                    const char* newtype="int";
                                    int dbarray[MAX_ARRAY_LENGTH];
                                    int* dbPtr = 0;
                                    char* tmp = elemPtr;
                                    dbPtr = &dbarray[0];
                                    if (dbPtr)
                                    {
                                        char cleanName[MAX_STRLEN];
                                        getCleanName(memName,cleanName);

                                        int i;
                                        getElement(arrayLen, newtype,memType, tmp, (char*)dbPtr);
                                        for (i=0;i<recursion;i++)
                                            printf("  ");
                                        if (arrayLen==1)
                                            printf("<%s type=\"%s\">",cleanName,memType);
                                        else
                                            printf("<%s type=\"%s\" count=%d>",cleanName,memType,arrayLen);
                                        for (i=0;i<arrayLen;i++)
                                            printf(" %d ",dbPtr[i]);
                                        printf("</%s>\n",cleanName);
                                    }*/
                                }
                                else
                                {
                                    double[] dbArray = new double[arrayLen];
                                    GetElement(reader, arrayLen, element.Type, dbArray);
                                    for (int i = 0; i < recursion; i++)
                                    {
                                        Console.Write("  ");
                                    }
                                    if (arrayLen == 1)
                                    {
                                        Console.Write("<{0} type=\"{1}\">", element.Name.Name, element.Type.Name);
                                    }
                                    else
                                    {
                                        Console.Write("<{0} type=\"{1}\" count=\"{2}\">", element.Name.CleanName, element.Type.Name, arrayLen);
                                    }
                                    for (int i = 0; i < arrayLen; i++)
                                    {
                                        Console.Write(" {0} ", dbArray[i].ToString(CultureInfo.InvariantCulture));
                                    }
                                    Console.WriteLine("</{0}>", element.Name.CleanName);
                                }
                            }
                        }
                        reader.BaseStream.Position += size;
                    }
                }
                totalSize += size;
            }

            return totalSize;
        }
Beispiel #10
0
        protected void ResolvePointersChunk(ChunkInd dataChunk, FileVerboseMode verboseMode)
        {
            Dna fileDna = (_fileDna != null) ? _fileDna : _memoryDna;

            Dna.StructDecl oldStruct = fileDna.GetStruct(dataChunk.DnaNR);
            int oldLen = oldStruct.Type.Length;

            byte[] cur = FindLibPointer(dataChunk.OldPtr);
            using (MemoryStream stream = new MemoryStream(cur, false))
            {
                using (BinaryReader reader = new BinaryReader(stream))
                {
                    for (int block = 0; block < dataChunk.NR; block++)
                    {
                        long streamPosition = stream.Position;
                        ResolvePointersStructRecursive(reader, dataChunk.DnaNR, verboseMode, 1);
                        System.Diagnostics.Debug.Assert(stream.Position == streamPosition + oldLen);
                    }
                }
            }
        }
Beispiel #11
0
        protected void ParseInternal(FileVerboseMode verboseMode, byte[] memDna)
        {
            if ((_flags & FileFlags.OK) != FileFlags.OK)
            {
                return;
            }

            ChunkInd dna = new ChunkInd();
            dna.OldPtr = 0;

            MemoryStream memory = new MemoryStream(_fileBuffer, false);
            BinaryReader reader = new BinaryReader(memory);

            int i = 0;
            while (memory.Position < memory.Length)
            {
                // looking for the data's starting position
                // and the start of SDNA decls

                byte[] code = reader.ReadBytes(4);
                string codes = ASCIIEncoding.ASCII.GetString(code);

                if (_dataStart == 0 && codes.Equals("REND"))
                {
                    _dataStart = memory.Position;
                }

                if (codes.Equals("DNA1"))
                {
                    // read the DNA1 block and extract SDNA
                    reader.BaseStream.Position = i;
                    if (GetNextBlock(out dna, reader, _flags) > 0)
                    {
                        string sdnaname = ASCIIEncoding.ASCII.GetString(reader.ReadBytes(8));
                        if (sdnaname.Equals("SDNANAME"))
                        {
                            dna.OldPtr = i + ChunkUtils.GetOffset(_flags);
                        }
                        else
                        {
                            dna.OldPtr = 0;
                        }
                    }
                    else
                    {
                        dna.OldPtr = 0;
                    }
                }
                else if (codes.Equals("SDNA"))
                {
                    // Some Bullet files are missing the DNA1 block
                    // In Blender it's DNA1 + ChunkUtils::getOffset() + SDNA + NAME
                    // In Bullet tests its SDNA + NAME

                    dna.OldPtr = i;
                    dna.Length = (int)memory.Length - i;

                    // Also no REND block, so exit now.
                    if (_version == 276)
                    {
                        break;
                    }
                }

                if (_dataStart != 0 && dna.OldPtr != 0)
                {
                    break;
                }

                i++;
                memory.Position = i;
            }

            if (dna.OldPtr == 0 || dna.Length == 0)
            {
                //Console.WriteLine("Failed to find DNA1+SDNA pair");
                _flags &= ~FileFlags.OK;
                reader.Dispose();
                memory.Dispose();
                return;
            }

            _fileDna = new Dna();

            // _fileDna.Init will convert part of DNA file endianness to current CPU endianness if necessary
            memory.Position = dna.OldPtr;
            _fileDna.Init(reader, (_flags & FileFlags.EndianSwap) != 0);

            if (_version == 276)
            {
                for (i = 0; i < _fileDna.NumNames; i++)
                {
                    if (_fileDna.GetName(i).Equals("int"))
                    {
                        _flags |= FileFlags.BrokenDna;
                    }
                }
                if ((_flags & FileFlags.BrokenDna) == FileFlags.BrokenDna)
                {
                    //Console.WriteLine("warning: fixing some broken DNA version");
                }
            }

            //if ((verboseMode & FileVerboseMode.DumpDnaTypeDefinitions) == FileVerboseMode.DumpDnaTypeDefinitions)
            //    _fileDna.DumpTypeDefinitions();

            _memoryDna = new Dna();
            using (MemoryStream memory2 = new MemoryStream(memDna, false))
            {
                using (BinaryReader reader2 = new BinaryReader(memory2))
                {
                    _memoryDna.Init(reader2, !BitConverter.IsLittleEndian);
                }
            }

            if (_memoryDna.NumNames != _fileDna.NumNames)
            {
                _flags |= FileFlags.VersionVaries;
                //Console.WriteLine ("Warning, file DNA is different than built in, performance is reduced. Best to re-export file with a matching version/platform");
            }

            if (_memoryDna.LessThan(_fileDna))
            {
                //Console.WriteLine ("Warning, file DNA is newer than built in.");
            }

            _fileDna.InitCmpFlags(_memoryDna);

            ParseData();

            ResolvePointers(verboseMode);

            UpdateOldPointers();

            reader.Dispose();
            memory.Dispose();
        }
Beispiel #12
0
        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>");
            }
        }
Beispiel #13
0
 public abstract void Parse(FileVerboseMode verboseMode);
        /*
        public void AddStruct(char structType, IntPtr data, int len, IntPtr oldPtr, int code)
        {
            btBulletFile_addStruct(_native, structType._native, data, len, oldPtr, code);
        }
        */
        public override void Parse(FileVerboseMode verboseMode)
        {
            byte[] dna = (IntPtr.Size == 8) ? Serializer.GetBulletDna64() : Serializer.GetBulletDna();

            _dnaCopy = new byte[dna.Length];
            Buffer.BlockCopy(dna, 0, _dnaCopy, 0, _dnaCopy.Length);

            ParseInternal(verboseMode, _dnaCopy);

            //the parsing will convert to cpu endian
            _flags &= ~FileFlags.EndianSwap;

            _fileBuffer[8] = BitConverter.IsLittleEndian ? (byte)'v' : (byte)'V';
        }
        /*
        public void AddStruct(char structType, IntPtr data, int len, IntPtr oldPtr, int code)
        {
            btBulletFile_addStruct(_native, structType._native, data, len, oldPtr, code);
        }
        */
        public override void Parse(FileVerboseMode verboseMode)
        {
            ParseInternal(verboseMode);

            //the parsing will convert to cpu endian
            Flags &= ~FileFlags.EndianSwap;

            _fileBuffer[8] = (byte)(BitConverter.IsLittleEndian ? 'v' : 'V');
        }
Beispiel #16
0
        protected int ResolvePointersStructRecursive(BinaryReader reader, int dnaNr, FileVerboseMode verboseMode, int recursion)
        {
            Dna fileDna = (_fileDna != null) ? _fileDna : _memoryDna;

            Dna.StructDecl oldStruct = fileDna.GetStruct(dnaNr);

            int totalSize = 0;

            foreach (Dna.ElementDecl element in oldStruct.Elements)
            {
                int size     = fileDna.GetElementSize(element);
                int arrayLen = element.Name.ArraySizeNew;

                if (element.Name.Name[0] == '*')
                {
                    if (arrayLen > 1)
                    {
                        throw new NotImplementedException();
                    }
                    else
                    {
                        long ptr = (IntPtr.Size == 8) ? reader.ReadInt64() : reader.ReadInt32();
                        if ((verboseMode & FileVerboseMode.ExportXml) != 0)
                        {
                            for (int i = 0; i < recursion; i++)
                            {
                                Console.Write("  ");
                            }
                            Console.WriteLine("<{0} type=\"pointer\"> {1} </{0}>", element.Name.Name.Substring(1), ptr);
                        }
                        byte[] ptrChunk = FindLibPointer(ptr);
                        if (ptrChunk != null)
                        {
                            //throw new NotImplementedException();
                        }
                        else
                        {
                            //Console.WriteLine("Cannot fixup pointer at {0} from {1} to {2}!", ptrptr, *ptrptr, ptr);
                        }
                    }
                }
                else
                {
                    if (element.Type.Struct != null)
                    {
                        if ((verboseMode & FileVerboseMode.ExportXml) != 0)
                        {
                            for (int i = 0; i < recursion; i++)
                            {
                                Console.Write("  ");
                            }

                            if (arrayLen > 1)
                            {
                                Console.WriteLine("<{0} type=\"{1}\" count={2}>", element.Name.CleanName, element.Type.Name, arrayLen);
                            }
                            else
                            {
                                Console.WriteLine("<{0} type=\"{1}\">", element.Name.CleanName, element.Type.Name);
                            }
                        }

                        for (int i = 0; i < arrayLen; i++)
                        {
                            int revType = _fileDna.GetReverseType(element.Type.Name);
                            ResolvePointersStructRecursive(reader, revType, verboseMode, recursion + 1);
                            //throw new NotImplementedException();
                        }

                        if ((verboseMode & FileVerboseMode.ExportXml) != 0)
                        {
                            for (int i = 0; i < recursion; i++)
                            {
                                Console.Write("  ");
                            }
                            Console.WriteLine("</{0}>", element.Name.CleanName);
                        }
                    }
                    else
                    {
                        // export a simple type
                        if ((verboseMode & FileVerboseMode.ExportXml) != 0)
                        {
                            if (arrayLen > MaxArrayLength)
                            {
                                Console.WriteLine("too long");
                            }
                            else
                            {
                                bool isIntegerType;
                                switch (element.Type.Name)
                                {
                                case "char":
                                case "short":
                                case "int":
                                    isIntegerType = true;
                                    break;

                                default:
                                    isIntegerType = false;
                                    break;
                                }

                                if (isIntegerType)
                                {
                                    throw new NotImplementedException();

                                    /*
                                     * const char* newtype="int";
                                     *                          int dbarray[MAX_ARRAY_LENGTH];
                                     *                          int* dbPtr = 0;
                                     *                          char* tmp = elemPtr;
                                     *                          dbPtr = &dbarray[0];
                                     *                          if (dbPtr)
                                     *                          {
                                     *                                  char cleanName[MAX_STRLEN];
                                     *                                  getCleanName(memName,cleanName);
                                     *
                                     *                                  int i;
                                     *                                  getElement(arrayLen, newtype,memType, tmp, (char*)dbPtr);
                                     *                                  for (i=0;i<recursion;i++)
                                     *                                          printf("  ");
                                     *                                  if (arrayLen==1)
                                     *                                          printf("<%s type=\"%s\">",cleanName,memType);
                                     *                                  else
                                     *                                          printf("<%s type=\"%s\" count=%d>",cleanName,memType,arrayLen);
                                     *                                  for (i=0;i<arrayLen;i++)
                                     *                                          printf(" %d ",dbPtr[i]);
                                     *                                  printf("</%s>\n",cleanName);
                                     *                          }*/
                                }
                                else
                                {
                                    double[] dbArray = new double[arrayLen];
                                    GetElement(reader, arrayLen, element.Type, dbArray);
                                    for (int i = 0; i < recursion; i++)
                                    {
                                        Console.Write("  ");
                                    }
                                    if (arrayLen == 1)
                                    {
                                        Console.Write("<{0} type=\"{1}\">", element.Name.Name, element.Type.Name);
                                    }
                                    else
                                    {
                                        Console.Write("<{0} type=\"{1}\" count=\"{2}\">", element.Name.CleanName, element.Type.Name, arrayLen);
                                    }
                                    for (int i = 0; i < arrayLen; i++)
                                    {
                                        Console.Write(" {0} ", dbArray[i].ToString(CultureInfo.InvariantCulture));
                                    }
                                    Console.WriteLine("</{0}>", element.Name.CleanName);
                                }
                            }
                        }
                        reader.BaseStream.Position += size;
                    }
                }
                totalSize += size;
            }

            return(totalSize);
        }
Beispiel #17
0
        protected void ParseInternal(FileVerboseMode verboseMode, byte[] memDna)
        {
            if ((_flags & FileFlags.OK) != FileFlags.OK)
            {
                return;
            }

            ChunkInd dna = new ChunkInd();

            dna.OldPtr = 0;

            MemoryStream memory = new MemoryStream(_fileBuffer, false);
            BinaryReader reader = new BinaryReader(memory);

            int i = 0;

            while (memory.Position < memory.Length)
            {
                // looking for the data's starting position
                // and the start of SDNA decls

                byte[] code  = reader.ReadBytes(4);
                string codes = ASCIIEncoding.ASCII.GetString(code);

                if (_dataStart == 0 && codes.Equals("REND"))
                {
                    _dataStart = memory.Position;
                }

                if (codes.Equals("DNA1"))
                {
                    // read the DNA1 block and extract SDNA
                    reader.BaseStream.Position = i;
                    if (GetNextBlock(out dna, reader, _flags) > 0)
                    {
                        string sdnaname = ASCIIEncoding.ASCII.GetString(reader.ReadBytes(8));
                        if (sdnaname.Equals("SDNANAME"))
                        {
                            dna.OldPtr = i + ChunkUtils.GetOffset(_flags);
                        }
                        else
                        {
                            dna.OldPtr = 0;
                        }
                    }
                    else
                    {
                        dna.OldPtr = 0;
                    }
                }
                else if (codes.Equals("SDNA"))
                {
                    // Some Bullet files are missing the DNA1 block
                    // In Blender it's DNA1 + ChunkUtils::getOffset() + SDNA + NAME
                    // In Bullet tests its SDNA + NAME

                    dna.OldPtr = i;
                    dna.Length = (int)memory.Length - i;

                    // Also no REND block, so exit now.
                    if (_version == 276)
                    {
                        break;
                    }
                }

                if (_dataStart != 0 && dna.OldPtr != 0)
                {
                    break;
                }

                i++;
                memory.Position = i;
            }

            if (dna.OldPtr == 0 || dna.Length == 0)
            {
                //Console.WriteLine("Failed to find DNA1+SDNA pair");
                _flags &= ~FileFlags.OK;
                reader.Dispose();
                memory.Dispose();
                return;
            }

            _fileDna = new Dna();

            // _fileDna.Init will convert part of DNA file endianness to current CPU endianness if necessary
            memory.Position = dna.OldPtr;
            _fileDna.Init(reader, (_flags & FileFlags.EndianSwap) != 0);

            if (_version == 276)
            {
                for (i = 0; i < _fileDna.NumNames; i++)
                {
                    if (_fileDna.GetName(i).Equals("int"))
                    {
                        _flags |= FileFlags.BrokenDna;
                    }
                }
                if ((_flags & FileFlags.BrokenDna) == FileFlags.BrokenDna)
                {
                    //Console.WriteLine("warning: fixing some broken DNA version");
                }
            }

            //if ((verboseMode & FileVerboseMode.DumpDnaTypeDefinitions) == FileVerboseMode.DumpDnaTypeDefinitions)
            //    _fileDna.DumpTypeDefinitions();

            _memoryDna = new Dna();
            using (MemoryStream memory2 = new MemoryStream(memDna, false))
            {
                using (BinaryReader reader2 = new BinaryReader(memory2))
                {
                    _memoryDna.Init(reader2, !BitConverter.IsLittleEndian);
                }
            }

            if (_memoryDna.NumNames != _fileDna.NumNames)
            {
                _flags |= FileFlags.VersionVaries;
                //Console.WriteLine ("Warning, file DNA is different than built in, performance is reduced. Best to re-export file with a matching version/platform");
            }

            if (_memoryDna.LessThan(_fileDna))
            {
                //Console.WriteLine ("Warning, file DNA is newer than built in.");
            }

            _fileDna.InitCmpFlags(_memoryDna);

            ParseData();

            ResolvePointers(verboseMode);

            UpdateOldPointers();

            reader.Dispose();
            memory.Dispose();
        }
Beispiel #18
0
 public abstract void Parse(FileVerboseMode verboseMode);