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:
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user