123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401 |
- /*
- bParse
- Copyright (c) 2006-2010 Erwin Coumans http://gamekit.googlecode.com
- This software is provided 'as-is', without any express or implied warranty.
- In no event will the authors be held liable for any damages arising from the use of this software.
- Permission is granted to anyone to use this software for any purpose,
- including commercial applications, and to alter it and redistribute it freely,
- subject to the following restrictions:
- 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
- 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
- 3. This notice may not be removed or altered from any source distribution.
- */
- #include "b3BulletFile.h"
- #include "b3Defines.h"
- #include "b3DNA.h"
- #if !defined(__CELLOS_LV2__) && !defined(__MWERKS__)
- #include <memory.h>
- #endif
- #include <string.h>
- // 32 && 64 bit versions
- #ifdef B3_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES
- #ifdef _WIN64
- extern char b3s_bulletDNAstr64[];
- extern int b3s_bulletDNAlen64;
- #else
- extern char b3s_bulletDNAstr[];
- extern int b3s_bulletDNAlen;
- #endif //_WIN64
- #else //B3_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES
- extern char b3s_bulletDNAstr64[];
- extern int b3s_bulletDNAlen64;
- extern char b3s_bulletDNAstr[];
- extern int b3s_bulletDNAlen;
- #endif //B3_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES
- using namespace bParse;
- b3BulletFile::b3BulletFile()
- : bFile("", "BULLET ")
- {
- mMemoryDNA = new bDNA(); //this memory gets released in the bFile::~bFile destructor,@todo not consistent with the rule 'who allocates it, has to deallocate it"
- m_DnaCopy = 0;
- #ifdef B3_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES
- #ifdef _WIN64
- m_DnaCopy = (char*)b3AlignedAlloc(b3s_bulletDNAlen64, 16);
- memcpy(m_DnaCopy, b3s_bulletDNAstr64, b3s_bulletDNAlen64);
- mMemoryDNA->init(m_DnaCopy, b3s_bulletDNAlen64);
- #else //_WIN64
- m_DnaCopy = (char*)b3AlignedAlloc(b3s_bulletDNAlen, 16);
- memcpy(m_DnaCopy, b3s_bulletDNAstr, b3s_bulletDNAlen);
- mMemoryDNA->init(m_DnaCopy, b3s_bulletDNAlen);
- #endif //_WIN64
- #else //B3_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES
- if (VOID_IS_8)
- {
- m_DnaCopy = (char*)b3AlignedAlloc(b3s_bulletDNAlen64, 16);
- memcpy(m_DnaCopy, b3s_bulletDNAstr64, b3s_bulletDNAlen64);
- mMemoryDNA->init(m_DnaCopy, b3s_bulletDNAlen64);
- }
- else
- {
- m_DnaCopy = (char*)b3AlignedAlloc(b3s_bulletDNAlen, 16);
- memcpy(m_DnaCopy, b3s_bulletDNAstr, b3s_bulletDNAlen);
- mMemoryDNA->init(m_DnaCopy, b3s_bulletDNAlen);
- }
- #endif //B3_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES
- }
- b3BulletFile::b3BulletFile(const char* fileName)
- : bFile(fileName, "BULLET ")
- {
- m_DnaCopy = 0;
- }
- b3BulletFile::b3BulletFile(char* memoryBuffer, int len)
- : bFile(memoryBuffer, len, "BULLET ")
- {
- m_DnaCopy = 0;
- }
- b3BulletFile::~b3BulletFile()
- {
- if (m_DnaCopy)
- b3AlignedFree(m_DnaCopy);
- while (m_dataBlocks.size())
- {
- char* dataBlock = m_dataBlocks[m_dataBlocks.size() - 1];
- delete[] dataBlock;
- m_dataBlocks.pop_back();
- }
- }
- // ----------------------------------------------------- //
- void b3BulletFile::parseData()
- {
- // printf ("Building datablocks");
- // printf ("Chunk size = %d",CHUNK_HEADER_LEN);
- // printf ("File chunk size = %d",ChunkUtils::getOffset(mFlags));
- const bool brokenDNA = (mFlags & FD_BROKEN_DNA) != 0;
- //const bool swap = (mFlags&FD_ENDIAN_SWAP)!=0;
- mDataStart = 12;
- char* dataPtr = mFileBuffer + mDataStart;
- bChunkInd dataChunk;
- dataChunk.code = 0;
- //dataPtr += ChunkUtils::getNextBlock(&dataChunk, dataPtr, mFlags);
- int seek = getNextBlock(&dataChunk, dataPtr, mFlags);
- if (mFlags & FD_ENDIAN_SWAP)
- swapLen(dataPtr);
- //dataPtr += ChunkUtils::getOffset(mFlags);
- char* dataPtrHead = 0;
- while (dataChunk.code != B3_DNA1)
- {
- if (!brokenDNA || (dataChunk.code != B3_QUANTIZED_BVH_CODE))
- {
- // one behind
- if (dataChunk.code == B3_SDNA) break;
- //if (dataChunk.code == DNA1) break;
- // same as (BHEAD+DATA dependency)
- dataPtrHead = dataPtr + ChunkUtils::getOffset(mFlags);
- if (dataChunk.dna_nr >= 0)
- {
- char* id = readStruct(dataPtrHead, dataChunk);
- // lookup maps
- if (id)
- {
- m_chunkPtrPtrMap.insert(dataChunk.oldPtr, dataChunk);
- mLibPointers.insert(dataChunk.oldPtr, (bStructHandle*)id);
- m_chunks.push_back(dataChunk);
- // block it
- //bListBasePtr *listID = mMain->getListBasePtr(dataChunk.code);
- //if (listID)
- // listID->push_back((bStructHandle*)id);
- }
- if (dataChunk.code == B3_SOFTBODY_CODE)
- {
- m_softBodies.push_back((bStructHandle*)id);
- }
- if (dataChunk.code == B3_RIGIDBODY_CODE)
- {
- m_rigidBodies.push_back((bStructHandle*)id);
- }
- if (dataChunk.code == B3_DYNAMICSWORLD_CODE)
- {
- m_dynamicsWorldInfo.push_back((bStructHandle*)id);
- }
- if (dataChunk.code == B3_CONSTRAINT_CODE)
- {
- m_constraints.push_back((bStructHandle*)id);
- }
- if (dataChunk.code == B3_QUANTIZED_BVH_CODE)
- {
- m_bvhs.push_back((bStructHandle*)id);
- }
- if (dataChunk.code == B3_TRIANLGE_INFO_MAP)
- {
- m_triangleInfoMaps.push_back((bStructHandle*)id);
- }
- if (dataChunk.code == B3_COLLISIONOBJECT_CODE)
- {
- m_collisionObjects.push_back((bStructHandle*)id);
- }
- if (dataChunk.code == B3_SHAPE_CODE)
- {
- m_collisionShapes.push_back((bStructHandle*)id);
- }
- // if (dataChunk.code == GLOB)
- // {
- // m_glob = (bStructHandle*) id;
- // }
- }
- else
- {
- //printf("unknown chunk\n");
- mLibPointers.insert(dataChunk.oldPtr, (bStructHandle*)dataPtrHead);
- }
- }
- else
- {
- printf("skipping B3_QUANTIZED_BVH_CODE due to broken DNA\n");
- }
- dataPtr += seek;
- seek = getNextBlock(&dataChunk, dataPtr, mFlags);
- if (mFlags & FD_ENDIAN_SWAP)
- swapLen(dataPtr);
- if (seek < 0)
- break;
- }
- }
- void b3BulletFile::addDataBlock(char* dataBlock)
- {
- m_dataBlocks.push_back(dataBlock);
- }
- void b3BulletFile::writeDNA(FILE* fp)
- {
- bChunkInd dataChunk;
- dataChunk.code = B3_DNA1;
- dataChunk.dna_nr = 0;
- dataChunk.nr = 1;
- #ifdef B3_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES
- if (VOID_IS_8)
- {
- #ifdef _WIN64
- dataChunk.len = b3s_bulletDNAlen64;
- dataChunk.oldPtr = b3s_bulletDNAstr64;
- fwrite(&dataChunk, sizeof(bChunkInd), 1, fp);
- fwrite(b3s_bulletDNAstr64, b3s_bulletDNAlen64, 1, fp);
- #else
- b3Assert(0);
- #endif
- }
- else
- {
- #ifndef _WIN64
- dataChunk.len = b3s_bulletDNAlen;
- dataChunk.oldPtr = b3s_bulletDNAstr;
- fwrite(&dataChunk, sizeof(bChunkInd), 1, fp);
- fwrite(b3s_bulletDNAstr, b3s_bulletDNAlen, 1, fp);
- #else //_WIN64
- b3Assert(0);
- #endif //_WIN64
- }
- #else //B3_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES
- if (VOID_IS_8)
- {
- dataChunk.len = b3s_bulletDNAlen64;
- dataChunk.oldPtr = b3s_bulletDNAstr64;
- fwrite(&dataChunk, sizeof(bChunkInd), 1, fp);
- fwrite(b3s_bulletDNAstr64, b3s_bulletDNAlen64, 1, fp);
- }
- else
- {
- dataChunk.len = b3s_bulletDNAlen;
- dataChunk.oldPtr = b3s_bulletDNAstr;
- fwrite(&dataChunk, sizeof(bChunkInd), 1, fp);
- fwrite(b3s_bulletDNAstr, b3s_bulletDNAlen, 1, fp);
- }
- #endif //B3_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES
- }
- void b3BulletFile::parse(int verboseMode)
- {
- #ifdef B3_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES
- if (VOID_IS_8)
- {
- #ifdef _WIN64
- if (m_DnaCopy)
- delete m_DnaCopy;
- m_DnaCopy = (char*)b3AlignedAlloc(b3s_bulletDNAlen64, 16);
- memcpy(m_DnaCopy, b3s_bulletDNAstr64, b3s_bulletDNAlen64);
- parseInternal(verboseMode, (char*)b3s_bulletDNAstr64, b3s_bulletDNAlen64);
- #else
- b3Assert(0);
- #endif
- }
- else
- {
- #ifndef _WIN64
- if (m_DnaCopy)
- delete m_DnaCopy;
- m_DnaCopy = (char*)b3AlignedAlloc(b3s_bulletDNAlen, 16);
- memcpy(m_DnaCopy, b3s_bulletDNAstr, b3s_bulletDNAlen);
- parseInternal(verboseMode, m_DnaCopy, b3s_bulletDNAlen);
- #else
- b3Assert(0);
- #endif
- }
- #else //B3_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES
- if (VOID_IS_8)
- {
- if (m_DnaCopy)
- delete m_DnaCopy;
- m_DnaCopy = (char*)b3AlignedAlloc(b3s_bulletDNAlen64, 16);
- memcpy(m_DnaCopy, b3s_bulletDNAstr64, b3s_bulletDNAlen64);
- parseInternal(verboseMode, m_DnaCopy, b3s_bulletDNAlen64);
- }
- else
- {
- if (m_DnaCopy)
- delete m_DnaCopy;
- m_DnaCopy = (char*)b3AlignedAlloc(b3s_bulletDNAlen, 16);
- memcpy(m_DnaCopy, b3s_bulletDNAstr, b3s_bulletDNAlen);
- parseInternal(verboseMode, m_DnaCopy, b3s_bulletDNAlen);
- }
- #endif //B3_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES
- //the parsing will convert to cpu endian
- mFlags &= ~FD_ENDIAN_SWAP;
- int littleEndian = 1;
- littleEndian = ((char*)&littleEndian)[0];
- mFileBuffer[8] = littleEndian ? 'v' : 'V';
- }
- // experimental
- int b3BulletFile::write(const char* fileName, bool fixupPointers)
- {
- FILE* fp = fopen(fileName, "wb");
- if (fp)
- {
- char header[B3_SIZEOFBLENDERHEADER];
- memcpy(header, m_headerString, 7);
- int endian = 1;
- endian = ((char*)&endian)[0];
- if (endian)
- {
- header[7] = '_';
- }
- else
- {
- header[7] = '-';
- }
- if (VOID_IS_8)
- {
- header[8] = 'V';
- }
- else
- {
- header[8] = 'v';
- }
- header[9] = '2';
- header[10] = '7';
- header[11] = '5';
- fwrite(header, B3_SIZEOFBLENDERHEADER, 1, fp);
- writeChunks(fp, fixupPointers);
- writeDNA(fp);
- fclose(fp);
- }
- else
- {
- printf("Error: cannot open file %s for writing\n", fileName);
- return 0;
- }
- return 1;
- }
- void b3BulletFile::addStruct(const char* structType, void* data, int len, void* oldPtr, int code)
- {
- bParse::bChunkInd dataChunk;
- dataChunk.code = code;
- dataChunk.nr = 1;
- dataChunk.len = len;
- dataChunk.dna_nr = mMemoryDNA->getReverseType(structType);
- dataChunk.oldPtr = oldPtr;
- ///Perform structure size validation
- short* structInfo = mMemoryDNA->getStruct(dataChunk.dna_nr);
- int elemBytes;
- elemBytes = mMemoryDNA->getLength(structInfo[0]);
- // int elemBytes = mMemoryDNA->getElementSize(structInfo[0],structInfo[1]);
- assert(len == elemBytes);
- mLibPointers.insert(dataChunk.oldPtr, (bStructHandle*)data);
- m_chunks.push_back(dataChunk);
- }
|