update .bullet format to 2.77, embed DNA inside its own chunk
This commit is contained in:
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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';
|
||||
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user