update .bullet format to 2.77, embed DNA inside its own chunk

This commit is contained in:
erwin.coumans
2010-08-24 20:49:41 +00:00
parent d2522aefbb
commit a022c9a555
2 changed files with 40 additions and 9 deletions

View File

@@ -183,7 +183,8 @@ void bFile::parseInternal(bool verboseDumpAllTypes, char* memDna,int memDnaLengt
return;
char *blenderData = mFileBuffer;
int sdnaPos=0;
bChunkInd dna;
dna.oldPtr = 0;
char *tempBuffer = blenderData;
for (int i=0; i<mFileLen; i++)
@@ -193,15 +194,43 @@ void bFile::parseInternal(bool verboseDumpAllTypes, char* memDna,int memDnaLengt
if (!mDataStart && strncmp(tempBuffer, "REND", 4)==0)
mDataStart = i;
if (!sdnaPos && strncmp(tempBuffer, "SDNANAME", 8)==0)
sdnaPos = i;
if (mDataStart && sdnaPos) break;
tempBuffer++;
if (strncmp(tempBuffer, "DNA1", 4)==0)
{
// read the DNA1 block and extract SDNA
if (getNextBlock(&dna, tempBuffer, mFlags) > 0)
{
if (strncmp((tempBuffer + ChunkUtils::getOffset(mFlags)), "SDNANAME", 8) ==0)
dna.oldPtr = (tempBuffer + ChunkUtils::getOffset(mFlags));
else dna.oldPtr = 0;
}
else dna.oldPtr = 0;
}
// Some Bullet files are missing the DNA1 block
// In Blender it's DNA1 + ChunkUtils::getOffset() + SDNA + NAME
// In Bullet tests its SDNA + NAME
else if (strncmp(tempBuffer, "SDNANAME", 8) ==0)
{
dna.oldPtr = blenderData + i;
dna.len = mFileLen-i;
// Also no REND block, so exit now.
if (mVersion==276) break;
}
if (mDataStart && dna.oldPtr) break;
tempBuffer++;
}
if (!dna.oldPtr || !dna.len)
{
printf("Failed to find DNA1+SDNA pair\n");
mFlags &= ~FD_OK;
return;
}
mFileDNA = new bDNA();
mFileDNA->init(blenderData+sdnaPos, mFileLen-sdnaPos, (mFlags & FD_ENDIAN_SWAP)!=0);
mFileDNA->init((char*)dna.oldPtr, dna.len, (mFlags & FD_ENDIAN_SWAP)!=0);
if (mVersion==276)
{

View File

@@ -119,6 +119,8 @@ public:
#define BT_TRIANLGE_INFO_MAP MAKE_ID('T','M','A','P')
#define BT_SHAPE_CODE MAKE_ID('S','H','A','P')
#define BT_ARRAY_CODE MAKE_ID('A','R','A','Y')
#define BT_DNA_CODE MAKE_ID('D','N','A','1')
struct btPointerUid
@@ -176,9 +178,9 @@ protected:
void writeDNA()
{
unsigned char* dnaTarget = m_buffer+m_currentSize;
memcpy(dnaTarget,m_dna,m_dnaLength);
m_currentSize += m_dnaLength;
btChunk* dnaChunk = allocate(m_dnaLength,1);
memcpy(dnaChunk->m_oldPtr,m_dna,m_dnaLength);
finalizeChunk(dnaChunk,"DNA1",BT_DNA_CODE, m_dna);
}
int getReverseType(const char *type) const
@@ -451,7 +453,7 @@ public:
m_buffer[9] = '2';
m_buffer[10] = '7';
m_buffer[11] = '6';
m_buffer[11] = '7';
}