/* * 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'); }
protected void ParseInternal(FileVerboseMode verboseMode) { if (OK) { LoadDna(verboseMode); } if (OK) { ParseData(); //ResolvePointers(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'; }
protected void ParseInternal(FileVerboseMode verboseMode) { if (!OK) { return; } LoadDna(verboseMode); if (!OK) { return; } ParseData(); //ResolvePointers(verboseMode); }
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 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); } } } }
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 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; }
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(); }
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'); }
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); }