diff --git a/Extras/Serialize/BulletFileLoader/bFile.cpp b/Extras/Serialize/BulletFileLoader/bFile.cpp index 849c98f31..ff7c4fe92 100644 --- a/Extras/Serialize/BulletFileLoader/bFile.cpp +++ b/Extras/Serialize/BulletFileLoader/bFile.cpp @@ -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 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) { diff --git a/src/LinearMath/btSerializer.h b/src/LinearMath/btSerializer.h index 57f4c1e9e..855313830 100644 --- a/src/LinearMath/btSerializer.h +++ b/src/LinearMath/btSerializer.h @@ -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'; }