16 #ifndef BT_SERIALIZER_H 17 #define BT_SERIALIZER_H 22 #if !defined(__CELLOS_LV2__) && !defined(__MWERKS__) 70 virtual const unsigned char* getBufferPointer()
const = 0;
72 virtual int getCurrentBufferSize()
const = 0;
74 virtual btChunk* allocate(
size_t size,
int numElements) = 0;
76 virtual void finalizeChunk(
btChunk* chunk,
const char* structType,
int chunkCode,
void* oldPtr) = 0;
78 virtual void* findPointer(
void* oldPtr) = 0;
80 virtual void* getUniquePointer(
void* oldPtr) = 0;
82 virtual void startSerialization() = 0;
84 virtual void finishSerialization() = 0;
86 virtual const char* findNameForPointer(
const void* ptr)
const = 0;
88 virtual void registerNameForPointer(
const void* ptr,
const char* name) = 0;
90 virtual void serializeName(
const char* ptr) = 0;
92 virtual int getSerializationFlags()
const = 0;
94 virtual void setSerializationFlags(
int flags) = 0;
96 virtual int getNumChunks()
const = 0;
98 virtual const btChunk* getChunk(
int chunkIndex)
const = 0;
101 #define BT_HEADER_LENGTH 12 102 #if defined(__sgi) || defined(__sparc) || defined(__sparc__) || defined(__PPC__) || defined(__ppc__) || defined(__BIG_ENDIAN__) 103 #define BT_MAKE_ID(a, b, c, d) ((int)(a) << 24 | (int)(b) << 16 | (c) << 8 | (d)) 105 #define BT_MAKE_ID(a, b, c, d) ((int)(d) << 24 | (int)(c) << 16 | (b) << 8 | (a)) 108 #define BT_MULTIBODY_CODE BT_MAKE_ID('M', 'B', 'D', 'Y') 109 #define BT_MB_LINKCOLLIDER_CODE BT_MAKE_ID('M', 'B', 'L', 'C') 110 #define BT_SOFTBODY_CODE BT_MAKE_ID('S', 'B', 'D', 'Y') 111 #define BT_COLLISIONOBJECT_CODE BT_MAKE_ID('C', 'O', 'B', 'J') 112 #define BT_RIGIDBODY_CODE BT_MAKE_ID('R', 'B', 'D', 'Y') 113 #define BT_CONSTRAINT_CODE BT_MAKE_ID('C', 'O', 'N', 'S') 114 #define BT_BOXSHAPE_CODE BT_MAKE_ID('B', 'O', 'X', 'S') 115 #define BT_QUANTIZED_BVH_CODE BT_MAKE_ID('Q', 'B', 'V', 'H') 116 #define BT_TRIANLGE_INFO_MAP BT_MAKE_ID('T', 'M', 'A', 'P') 117 #define BT_SHAPE_CODE BT_MAKE_ID('S', 'H', 'A', 'P') 118 #define BT_ARRAY_CODE BT_MAKE_ID('A', 'R', 'A', 'Y') 119 #define BT_SBMATERIAL_CODE BT_MAKE_ID('S', 'B', 'M', 'T') 120 #define BT_SBNODE_CODE BT_MAKE_ID('S', 'B', 'N', 'D') 121 #define BT_DYNAMICSWORLD_CODE BT_MAKE_ID('D', 'W', 'L', 'D') 122 #define BT_CONTACTMANIFOLD_CODE BT_MAKE_ID('C', 'O', 'N', 'T') 123 #define BT_DNA_CODE BT_MAKE_ID('D', 'N', 'A', '1') 186 void** ptr = m_chunkP.
find(oldPtr);
194 btChunk* dnaChunk = allocate(m_dnaLength, 1);
195 memcpy(dnaChunk->
m_oldPtr, m_dna, m_dnaLength);
196 finalizeChunk(dnaChunk,
"DNA1",
BT_DNA_CODE, m_dna);
202 const int* valuePtr = mTypeLookup.
find(key);
215 int littleEndian = 1;
216 littleEndian = ((
char*)&littleEndian)[0];
219 memcpy(m_dna, bdnaOrg, dnalen);
220 m_dnaLength = dnalen;
226 intPtr = (
int*)m_dna;
236 if (strncmp((
const char*)m_dna,
"SDNA", 4) == 0)
253 for (i = 0; i < dataLen; i++)
268 btAssert(strncmp(cp,
"TYPE", 4) == 0);
278 for (i = 0; i < dataLen; i++)
295 btAssert(strncmp(cp,
"TLEN", 4) == 0);
298 dataLen = (int)mTypes.
size();
300 shtPtr = (
short*)intPtr;
301 for (i = 0; i < dataLen; i++, shtPtr++)
308 if (dataLen & 1) shtPtr++;
321 intPtr = (
int*)shtPtr;
323 btAssert(strncmp(cp,
"STRC", 4) == 0);
331 shtPtr = (
short*)intPtr;
332 for (i = 0; i < dataLen; i++)
344 for (
int a = 0; a < len; a++, shtPtr += 2)
352 shtPtr += (2 * shtPtr[1]) + 2;
357 for (i = 0; i < (int)mStructs.
size(); i++)
359 short* strc = mStructs.
at(i);
360 mStructReverse.
insert(strc[0], i);
369 : m_uniqueIdGenerator(0),
370 m_totalSize(totalSize),
374 m_serializationFlags(0)
378 m_buffer = m_totalSize ? (
unsigned char*)
btAlignedAlloc(totalSize, 16) : 0;
384 m_ownsBuffer =
false;
387 const bool VOID_IS_8 = ((
sizeof(
void*) == 8));
389 #ifdef BT_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES 407 #else //BT_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES 416 #endif //BT_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES 421 if (m_buffer && m_ownsBuffer)
429 const bool VOID_IS_8 = ((
sizeof(
void*) == 8));
439 const bool VOID_IS_8 = ((
sizeof(
void*) == 8));
449 writeHeader(m_buffer);
455 #ifdef BT_USE_DOUBLE_PRECISION 456 memcpy(buffer,
"BULLETd", 7);
458 memcpy(buffer,
"BULLETf", 7);
459 #endif //BT_USE_DOUBLE_PRECISION 461 int littleEndian = 1;
462 littleEndian = ((
char*)&littleEndian)[0];
464 if (
sizeof(
void*) == 8)
489 m_uniqueIdGenerator = 1;
511 unsigned char* currentPtr = m_buffer;
512 writeHeader(m_buffer);
515 for (
int i = 0; i < m_chunkPtrs.
size(); i++)
518 memcpy(currentPtr, m_chunkPtrs[i], curLength);
520 currentPtr += curLength;
528 mStructReverse.
clear();
530 m_skipPointers.
clear();
533 m_uniquePointers.
clear();
549 void** ptr2 = m_skipPointers[oldPtr];
555 m_uniqueIdGenerator++;
560 m_uniquePointers.
insert(oldPtr, uid);
571 return m_currentSize;
581 chunk->
m_dna_nr = getReverseType(structType);
585 void* uniquePtr = getUniquePointer(oldPtr);
587 m_chunkP.
insert(oldPtr, uniquePtr);
593 unsigned char* ptr = 0;
597 ptr = m_buffer + m_currentSize;
598 m_currentSize += int(size);
599 btAssert(m_currentSize < m_totalSize);
604 m_currentSize += int(size);
611 unsigned char* ptr = internalAlloc(
int(size) * numElements +
sizeof(
btChunk));
613 unsigned char* data = ptr +
sizeof(
btChunk);
617 chunk->m_oldPtr = data;
618 chunk->m_length = int(size) * numElements;
619 chunk->m_number = numElements;
628 const char*
const* namePtr = m_nameMap.
find(ptr);
629 if (namePtr && *namePtr)
636 m_nameMap.
insert(ptr, name);
644 if (findPointer((
void*)name))
650 int newLen = len + 1;
651 int padding = ((newLen + 3) & ~3) - newLen;
655 btChunk* chunk = allocate(
sizeof(
char), newLen);
656 char* destinationName = (
char*)chunk->
m_oldPtr;
657 for (
int i = 0; i < len; i++)
659 destinationName[i] = name[i];
661 destinationName[len] = 0;
669 return m_serializationFlags;
674 m_serializationFlags = flags;
678 return m_chunkPtrs.
size();
683 return m_chunkPtrs[chunkIndex];
692 #ifdef ENABLE_INMEMORY_SERIALIZER 702 btInMemorySerializer(
int totalSize = 0,
unsigned char* buffer = 0)
707 virtual void startSerialization()
709 m_uid2ChunkPtr.
clear();
714 btChunk* findChunkFromUniquePointer(
void* uniquePointer)
716 btChunk** chkPtr = m_uid2ChunkPtr[uniquePointer];
724 virtual void registerNameForPointer(
const void* ptr,
const char* name)
727 m_names2Ptr.
insert(name, ptr);
730 virtual void finishSerialization()
734 virtual void* getUniquePointer(
void* oldPtr)
740 btChunk* chunk = findChunkFromUniquePointer(oldPtr);
747 const char* n = (
const char*)oldPtr;
748 const void** ptr = m_names2Ptr[n];
755 void** ptr2 = m_skipPointers[oldPtr];
772 virtual void finalizeChunk(
btChunk* chunk,
const char* structType,
int chunkCode,
void* oldPtr)
779 chunk->
m_dna_nr = getReverseType(structType);
782 m_chunkP.insert(oldPtr, oldPtr);
785 void* uid = findPointer(oldPtr);
786 m_uid2ChunkPtr.
insert(uid, chunk);
792 #ifdef BT_USE_DOUBLE_PRECISION 801 #ifdef BT_USE_DOUBLE_PRECISION 803 #else //BT_USE_DOUBLE_PRECISION 805 #endif //BT_USE_DOUBLE_PRECISION 810 #ifdef BT_USE_DOUBLE_PRECISION 814 #endif //BT_USE_DOUBLE_PRECISION 819 #ifdef BT_USE_DOUBLE_PRECISION 828 #ifdef BT_USE_DOUBLE_PRECISION 857 int getNumChunks()
const 859 return m_uid2ChunkPtr.
size();
862 const btChunk* getChunk(
int chunkIndex)
const 864 return *m_uid2ChunkPtr.
getAtIndex(chunkIndex);
867 #endif //ENABLE_INMEMORY_SERIALIZER 869 #endif //BT_SERIALIZER_H
btAlignedObjectArray< struct btRigidBodyDoubleData * > m_rigidBodyDataDouble
static int getMemoryDnaSizeInBytes()
virtual void serializeName(const char *name)
do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64 ...
btAlignedObjectArray< btChunk * > m_chunkPtrs
void push_back(const T &_Val)
virtual void setSerializationFlags(int flags)
#define BT_CONSTRAINT_CODE
virtual void finalizeChunk(btChunk *chunk, const char *structType, int chunkCode, void *oldPtr)
The btAlignedObjectArray template class uses a subset of the stl::vector interface for its methods It...
virtual void registerNameForPointer(const void *ptr, const char *name)
const Value * find(const Key &key) const
btAlignedObjectArray< struct btDynamicsWorldFloatData * > m_dynamicWorldInfoDataFloat
btAlignedObjectArray< struct btQuantizedBvhFloatData * > m_bvhsFloat
#define BT_QUANTIZED_BVH_CODE
btAlignedObjectArray< struct btQuantizedBvhDoubleData * > m_bvhsDouble
virtual btChunk * allocate(size_t size, int numElements)
btAlignedObjectArray< struct btDynamicsWorldDoubleData * > m_dynamicWorldInfoDataDouble
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
const T & at(int n) const
btHashMap< btHashString, int > mTypeLookup
#define BT_DYNAMICSWORLD_CODE
#define SIMD_FORCE_INLINE
static const char * getMemoryDna()
btAlignedObjectArray< struct btSoftBodyDoubleData * > m_softBodyDoubleData
virtual void finishSerialization()
virtual void * findPointer(void *oldPtr)
virtual void * getUniquePointer(void *oldPtr)
btHashMap< btHashInt, int > mStructReverse
const Value * getAtIndex(int index) const
void clear()
clear the array, deallocated memory. Generally it is better to use array.resize(0), to reduce performance overhead of run-time memory (de)allocations.
The btDefaultSerializer is the main Bullet serialization class.
virtual const char * findNameForPointer(const void *ptr) const
btAlignedObjectArray< struct btTypedConstraintFloatData * > m_constraintDataFloat
do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64 ...
virtual unsigned char * internalAlloc(size_t size)
btAlignedObjectArray< struct btCollisionObjectFloatData * > m_collisionObjectDataFloat
do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64 ...
btAlignedObjectArray< struct btCollisionShapeData * > m_colShapeData
btAlignedObjectArray< struct btTypedConstraintData * > m_constraintData
void initDNA(const char *bdnaOrg, int dnalen)
btAlignedObjectArray< short * > mStructs
#define btAlignedFree(ptr)
void insert(const Key &key, const Value &value)
btBulletSerializedArrays()
btAlignedObjectArray< char * > mTypes
btAlignedObjectArray< struct btSoftBodyFloatData * > m_softBodyFloatData
int btStrLen(const char *str)
do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64 ...
do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64 ...
#define BT_COLLISIONOBJECT_CODE
btDefaultSerializer(int totalSize=0, unsigned char *buffer=0)
virtual const unsigned char * getBufferPointer() const
int size() const
return the number of elements in the array
btAlignedObjectArray< struct btCollisionObjectDoubleData * > m_collisionObjectDataDouble
very basic hashable string implementation, compatible with btHashMap
int getReverseType(const char *type) const
#define BT_SBMATERIAL_CODE
btAlignedObjectArray< struct btRigidBodyFloatData * > m_rigidBodyDataFloat
#define BT_RIGIDBODY_CODE
virtual void startSerialization()
btHashMap< btHashPtr, btPointerUid > m_uniquePointers
void writeHeader(unsigned char *buffer) const
btHashMap< btHashPtr, void * > m_chunkP
btAlignedObjectArray< short > mTlens
unsigned btSwapEndian(unsigned val)
#define btAlignedAlloc(size, alignment)
T * btAlignPointer(T *unalignedPtr, size_t alignment)
align a pointer to the provided alignment, upwards
btHashMap< btHashPtr, void * > m_skipPointers
#define BT_TRIANLGE_INFO_MAP
virtual ~btDefaultSerializer()
virtual int getSerializationFlags() const
do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64 ...
btAlignedObjectArray< struct btTypedConstraintDoubleData * > m_constraintDataDouble
do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64 ...
btHashMap< btHashPtr, const char * > m_nameMap
virtual int getCurrentBufferSize() const
const btChunk * getChunk(int chunkIndex) const