From 5fd08505baf46d363fe948dd3ef169db781febc8 Mon Sep 17 00:00:00 2001 From: "erwin.coumans" Date: Tue, 20 Jul 2010 13:55:12 +0000 Subject: [PATCH] Serialization fix: workaround for conflicting SDNA data -> SDNANAME (needs better fix) Serialization fix imported from gamekit, see http://code.google.com/p/gamekit/source/detail?r=433 --- .../BlenderSerialize/bBlenderFile.cpp | 1 + Extras/Serialize/BulletFileLoader/bFile.cpp | 66 +++++++++---------- Extras/Serialize/BulletFileLoader/bFile.h | 3 +- .../BulletFileLoader/btBulletFile.cpp | 1 + 4 files changed, 37 insertions(+), 34 deletions(-) diff --git a/Extras/Serialize/BlenderSerialize/bBlenderFile.cpp b/Extras/Serialize/BlenderSerialize/bBlenderFile.cpp index 975fac794..7a4da960c 100644 --- a/Extras/Serialize/BlenderSerialize/bBlenderFile.cpp +++ b/Extras/Serialize/BlenderSerialize/bBlenderFile.cpp @@ -96,6 +96,7 @@ void bBlenderFile::parseData() // lookup maps if (id) { + m_chunkPtrPtrMap.insert(dataChunk.oldPtr, dataChunk); mLibPointers.insert(dataChunk.oldPtr, (bStructHandle*)id); m_chunks.push_back(dataChunk); diff --git a/Extras/Serialize/BulletFileLoader/bFile.cpp b/Extras/Serialize/BulletFileLoader/bFile.cpp index d07b6924d..0f5b7bcb0 100644 --- a/Extras/Serialize/BulletFileLoader/bFile.cpp +++ b/Extras/Serialize/BulletFileLoader/bFile.cpp @@ -193,7 +193,7 @@ void bFile::parseInternal(bool verboseDumpAllTypes, char* memDna,int memDnaLengt if (!mDataStart && strncmp(tempBuffer, "REND", 4)==0) mDataStart = i; - if (!sdnaPos && strncmp(tempBuffer, "SDNA", 4)==0) + if (!sdnaPos && strncmp(tempBuffer, "SDNANAME", 8)==0) sdnaPos = i; if (mDataStart && sdnaPos) break; @@ -778,8 +778,6 @@ void bFile::swapStruct(int dna_nr, char *data) } } - - void bFile::resolvePointersMismatch() { // printf("resolvePointersStructMismatch\n"); @@ -801,45 +799,47 @@ void bFile::resolvePointersMismatch() // printf("pointer not found: %x\n",cur); } } - for (i=0;i< m_pointerPtrFixupArray.size();i++) + + for (i=0;i< m_pointerPtrFixupArray.size();i++) { char* cur= m_pointerPtrFixupArray.at(i); void** ptrptr = (void**)cur; - void *ptr = findLibPointer(*ptrptr); - if (ptr) + + bChunkInd *block = m_chunkPtrPtrMap.find(*ptrptr); + if (block) { - (*ptrptr) = ptr; + int ptrMem = mMemoryDNA->getPointerSize(); + int ptrFile = mFileDNA->getPointerSize(); - void **array= (void**)(*(ptrptr)); - //int ptrMem = mMemoryDNA->getPointerSize(); - int ptrFile = mFileDNA->getPointerSize(); - int n=0; - void *lookup = array[n]; + int blockLen = block->len / ptrFile; + int blkAlloc = blockLen * ptrMem; - if (lookup) - { - char *oldPtr = (char*)array; - btAlignedObjectArray pointers; + void *onptr = findLibPointer(*ptrptr); + if (onptr) + { + char *newPtr = new char[blkAlloc * ptrMem]; + addDataBlock(newPtr); + memset(newPtr, 0, blkAlloc * ptrMem); - while(lookup) - { - btPointerUid dp = {0}; - safeSwapPtr((char*)dp.m_uniqueIds, (char*)(oldPtr + (n * ptrFile))); + void **onarray = (void**)onptr; + char *oldPtr = (char*)onarray; - lookup = findLibPointer(dp.m_ptr); - if (!lookup) break; + int p = 0; + while (blkAlloc-- > 0) + { + btPointerUid dp = {0}; + safeSwapPtr((char*)dp.m_uniqueIds, oldPtr); - pointers.push_back(dp); - ++n; - } - - for (int j=0; j\n",oldType); - + resolvePointersChunk(dataChunk, verboseDumpAllBlocks); if (verboseDumpAllBlocks) diff --git a/Extras/Serialize/BulletFileLoader/bFile.h b/Extras/Serialize/BulletFileLoader/bFile.h index 84c011dc7..35e923ffd 100644 --- a/Extras/Serialize/BulletFileLoader/bFile.h +++ b/Extras/Serialize/BulletFileLoader/bFile.h @@ -60,8 +60,9 @@ namespace bParse { btAlignedObjectArray m_pointerPtrFixupArray; btAlignedObjectArray m_chunks; + btHashMap m_chunkPtrPtrMap; - // + // bPtrMap mDataPointers; diff --git a/Extras/Serialize/BulletFileLoader/btBulletFile.cpp b/Extras/Serialize/BulletFileLoader/btBulletFile.cpp index 1379229b9..154dc983c 100644 --- a/Extras/Serialize/BulletFileLoader/btBulletFile.cpp +++ b/Extras/Serialize/BulletFileLoader/btBulletFile.cpp @@ -144,6 +144,7 @@ void btBulletFile::parseData() // lookup maps if (id) { + m_chunkPtrPtrMap.insert(dataChunk.oldPtr, dataChunk); mLibPointers.insert(dataChunk.oldPtr, (bStructHandle*)id); m_chunks.push_back(dataChunk);