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
This commit is contained in:
erwin.coumans
2010-07-20 13:55:12 +00:00
parent 745b3d4e05
commit 5fd08505ba
4 changed files with 37 additions and 34 deletions

View File

@@ -96,6 +96,7 @@ void bBlenderFile::parseData()
// lookup maps // lookup maps
if (id) if (id)
{ {
m_chunkPtrPtrMap.insert(dataChunk.oldPtr, dataChunk);
mLibPointers.insert(dataChunk.oldPtr, (bStructHandle*)id); mLibPointers.insert(dataChunk.oldPtr, (bStructHandle*)id);
m_chunks.push_back(dataChunk); m_chunks.push_back(dataChunk);

View File

@@ -193,7 +193,7 @@ void bFile::parseInternal(bool verboseDumpAllTypes, char* memDna,int memDnaLengt
if (!mDataStart && strncmp(tempBuffer, "REND", 4)==0) if (!mDataStart && strncmp(tempBuffer, "REND", 4)==0)
mDataStart = i; mDataStart = i;
if (!sdnaPos && strncmp(tempBuffer, "SDNA", 4)==0) if (!sdnaPos && strncmp(tempBuffer, "SDNANAME", 8)==0)
sdnaPos = i; sdnaPos = i;
if (mDataStart && sdnaPos) break; if (mDataStart && sdnaPos) break;
@@ -778,8 +778,6 @@ void bFile::swapStruct(int dna_nr, char *data)
} }
} }
void bFile::resolvePointersMismatch() void bFile::resolvePointersMismatch()
{ {
// printf("resolvePointersStructMismatch\n"); // printf("resolvePointersStructMismatch\n");
@@ -801,45 +799,47 @@ void bFile::resolvePointersMismatch()
// printf("pointer not found: %x\n",cur); // 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); char* cur= m_pointerPtrFixupArray.at(i);
void** ptrptr = (void**)cur; 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; int blockLen = block->len / ptrFile;
void *lookup = array[n]; int blkAlloc = blockLen * ptrMem;
if (lookup) void *onptr = findLibPointer(*ptrptr);
{ if (onptr)
char *oldPtr = (char*)array; {
btAlignedObjectArray<btPointerUid> pointers; char *newPtr = new char[blkAlloc * ptrMem];
addDataBlock(newPtr);
memset(newPtr, 0, blkAlloc * ptrMem);
while(lookup) void **onarray = (void**)onptr;
{ char *oldPtr = (char*)onarray;
btPointerUid dp = {0};
safeSwapPtr((char*)dp.m_uniqueIds, (char*)(oldPtr + (n * ptrFile)));
lookup = findLibPointer(dp.m_ptr); int p = 0;
if (!lookup) break; while (blkAlloc-- > 0)
{
btPointerUid dp = {0};
safeSwapPtr((char*)dp.m_uniqueIds, oldPtr);
pointers.push_back(dp); void **tptr = (void**)(newPtr + p * ptrMem);
++n; *tptr = findLibPointer(dp.m_ptr);
}
for (int j=0; j<n; ++j) oldPtr += ptrFile;
{ ++p;
array[j] = findLibPointer(pointers[j].m_ptr); }
assert(array[j]);
} *ptrptr = newPtr;
} }
} }
} }
} }

View File

@@ -60,8 +60,9 @@ namespace bParse {
btAlignedObjectArray<char*> m_pointerPtrFixupArray; btAlignedObjectArray<char*> m_pointerPtrFixupArray;
btAlignedObjectArray<bChunkInd> m_chunks; btAlignedObjectArray<bChunkInd> m_chunks;
btHashMap<btHashPtr, bChunkInd> m_chunkPtrPtrMap;
// //
bPtrMap mDataPointers; bPtrMap mDataPointers;

View File

@@ -144,6 +144,7 @@ void btBulletFile::parseData()
// lookup maps // lookup maps
if (id) if (id)
{ {
m_chunkPtrPtrMap.insert(dataChunk.oldPtr, dataChunk);
mLibPointers.insert(dataChunk.oldPtr, (bStructHandle*)id); mLibPointers.insert(dataChunk.oldPtr, (bStructHandle*)id);
m_chunks.push_back(dataChunk); m_chunks.push_back(dataChunk);