From e7ff71d99b8b11397c45fba3e3103a6914873163 Mon Sep 17 00:00:00 2001 From: "erwin.coumans" Date: Mon, 25 Jan 2010 19:42:51 +0000 Subject: [PATCH] add support for double precision and 64bit serialization (and compatibility between all versions) fix some issue in serialization of nested array data add some tesing files --- CMakeLists.txt | 8 + .../ConvexDecompositionDemo.cpp | 9 +- .../testFile32Single.bullet | Bin 0 -> 48704 bytes .../testFile64Double.bullet | Bin 0 -> 85444 bytes .../testFile64Single.bullet | Bin 0 -> 48804 bytes Demos/OpenGL/GL_DialogDynamicsWorld.cpp | 4 +- Extras/CMakeLists.txt | 2 +- .../BulletFileLoader/autogenerated/bullet.h | 13 +- .../autogenerated/bullet_Common.h | 13 +- .../bullet_btCollisionObjectDoubleData.h | 64 +++ .../bullet_btCollisionObjectFloatData.h | 63 +++ .../bullet_btConvexHullShapeData.h | 5 +- .../bullet_btConvexInternalShapeData.h | 10 +- .../bullet_btMatrix3x3DoubleData.h | 40 ++ .../bullet_btMatrix3x3FloatData.h | 40 ++ .../bullet_btPositionAndRadius.h | 6 +- .../bullet_btRigidBodyDoubleData.h | 63 +++ .../bullet_btRigidBodyFloatData.h | 62 +++ .../bullet_btStridingMeshInterfaceData.h | 4 +- .../bullet_btTransformDoubleData.h | 42 ++ .../bullet_btTransformFloatData.h | 42 ++ .../bullet_btTriangleMeshShapeData.h | 7 +- Extras/Serialize/BulletFileLoader/bDNA.cpp | 4 + Extras/Serialize/BulletFileLoader/bFile.cpp | 35 +- Extras/Serialize/BulletFileLoader/bFile.h | 3 +- .../BulletFileLoader/btBulletFile.cpp | 46 ++- .../BulletFileLoader/btBulletFileLoader.cpp | 88 ++-- .../BulletFileLoader/btBulletFileLoader.h | 2 +- Extras/Serialize/makesdna/makesdna.cpp | 19 +- .../CollisionDispatch/btCollisionObject.h | 71 +++- .../CollisionShapes/btConvexHullShape.cpp | 16 +- .../CollisionShapes/btConvexHullShape.h | 7 +- .../CollisionShapes/btConvexInternalShape.h | 17 +- .../CollisionShapes/btMultiSphereShape.cpp | 4 +- .../CollisionShapes/btMultiSphereShape.h | 10 +- .../btStridingMeshInterface.cpp | 2 +- .../CollisionShapes/btStridingMeshInterface.h | 11 +- .../CollisionShapes/btTriangleMeshShape.cpp | 2 +- .../CollisionShapes/btTriangleMeshShape.h | 7 +- .../btKinematicCharacterController.h | 2 +- src/BulletDynamics/Dynamics/btRigidBody.cpp | 2 +- src/BulletDynamics/Dynamics/btRigidBody.h | 85 ++-- src/LinearMath/btConvexHull.cpp | 6 +- src/LinearMath/btMatrix3x3.h | 33 +- src/LinearMath/btSerializer.cpp | 387 +++++++++++++----- src/LinearMath/btSerializer.h | 55 ++- src/LinearMath/btTransform.h | 39 +- src/LinearMath/btVector3.h | 51 ++- 48 files changed, 1207 insertions(+), 294 deletions(-) create mode 100644 Demos/ConvexDecompositionDemo/testFile32Single.bullet create mode 100644 Demos/ConvexDecompositionDemo/testFile64Double.bullet create mode 100644 Demos/ConvexDecompositionDemo/testFile64Single.bullet create mode 100644 Extras/Serialize/BulletFileLoader/autogenerated/bullet_btCollisionObjectDoubleData.h create mode 100644 Extras/Serialize/BulletFileLoader/autogenerated/bullet_btCollisionObjectFloatData.h create mode 100644 Extras/Serialize/BulletFileLoader/autogenerated/bullet_btMatrix3x3DoubleData.h create mode 100644 Extras/Serialize/BulletFileLoader/autogenerated/bullet_btMatrix3x3FloatData.h create mode 100644 Extras/Serialize/BulletFileLoader/autogenerated/bullet_btRigidBodyDoubleData.h create mode 100644 Extras/Serialize/BulletFileLoader/autogenerated/bullet_btRigidBodyFloatData.h create mode 100644 Extras/Serialize/BulletFileLoader/autogenerated/bullet_btTransformDoubleData.h create mode 100644 Extras/Serialize/BulletFileLoader/autogenerated/bullet_btTransformFloatData.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 07e8c8cb8..ba7c42f95 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,6 +9,13 @@ IF (NOT CMAKE_BUILD_TYPE) ENDIF (NOT CMAKE_BUILD_TYPE) +OPTION(USE_DOUBLE_PRECISION "Use double precision" OFF) + +IF (USE_DOUBLE_PRECISION) +ADD_DEFINITIONS( -DBT_USE_DOUBLE_PRECISION) +ENDIF (USE_DOUBLE_PRECISION) + + IF (WIN32) OPTION(USE_GLUT "Use Glut" OFF) @@ -63,6 +70,7 @@ IF (USE_GLUT) IF (MSVC) MESSAGE ("GLUT NOT FOUND, trying to use Bullet/Glut/glut32.lib for MSVC") SET(GLUT_glut_LIBRARY ${BULLET_PHYSICS_SOURCE_DIR}/Glut/glut32.lib) + #SET(GLUT_glut_LIBRARY ${BULLET_PHYSICS_SOURCE_DIR}/Glut/glut64.lib) ENDIF (MSVC) ENDIF (GLUT_FOUND) diff --git a/Demos/ConvexDecompositionDemo/ConvexDecompositionDemo.cpp b/Demos/ConvexDecompositionDemo/ConvexDecompositionDemo.cpp index e919639ef..411176512 100644 --- a/Demos/ConvexDecompositionDemo/ConvexDecompositionDemo.cpp +++ b/Demos/ConvexDecompositionDemo/ConvexDecompositionDemo.cpp @@ -439,6 +439,7 @@ void ConvexDecompositionDemo::initPhysics(const char* filename) cb.process(desc); //now create some bodies + if (1) { btCompoundShape* compound = new btCompoundShape(false); m_collisionShapes.push_back (compound); @@ -456,6 +457,7 @@ void ConvexDecompositionDemo::initPhysics(const char* filename) btRigidBody* body = localCreateRigidBody( 1.0, trans,convexShape); } +#if 1 btScalar mass=10.f; trans.setOrigin(-convexDecompositionObjectOffset); btRigidBody* body = localCreateRigidBody( mass, trans,compound); @@ -470,7 +472,7 @@ void ConvexDecompositionDemo::initPhysics(const char* filename) trans.setOrigin(-convexDecompositionObjectOffset); body = localCreateRigidBody( mass, trans,compound); body->setCollisionFlags(body->getCollisionFlags() | btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK); - +#endif } @@ -499,8 +501,13 @@ void ConvexDecompositionDemo::initPhysics(const char* filename) setupEmptyDynamicsWorld(); btBulletFileLoader* fileLoader = new btBulletFileLoader(m_dynamicsWorld); + fileLoader->setVerboseMode(true); fileLoader->loadFileFromMemory("testFile.bullet"); + //fileLoader->loadFileFromMemory("testFile64Double.bullet"); + //fileLoader->loadFileFromMemory("testFile64Single.bullet"); + //fileLoader->loadFileFromMemory("testFile32Single.bullet"); + diff --git a/Demos/ConvexDecompositionDemo/testFile32Single.bullet b/Demos/ConvexDecompositionDemo/testFile32Single.bullet new file mode 100644 index 0000000000000000000000000000000000000000..75f1104c4e8d11d34e3959df84957139e3a62a37 GIT binary patch literal 48704 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 literal 0 HcmV?d00001 diff --git a/Demos/ConvexDecompositionDemo/testFile64Single.bullet b/Demos/ConvexDecompositionDemo/testFile64Single.bullet new file mode 100644 index 0000000000000000000000000000000000000000..aa028bac481551f711d18965545d574c263d5421 GIT binary patch literal 48804 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 SIE=>xOvJ&MgsQxmTypes[curStruct[0]])!=0) { isSame=false; diff --git a/Extras/Serialize/BulletFileLoader/bFile.cpp b/Extras/Serialize/BulletFileLoader/bFile.cpp index 06ea8c513..0b16573ef 100644 --- a/Extras/Serialize/BulletFileLoader/bFile.cpp +++ b/Extras/Serialize/BulletFileLoader/bFile.cpp @@ -109,20 +109,26 @@ void bFile::parseHeader() memcpy(header, blenderBuf, SIZEOFBLENDERHEADER); header[SIZEOFBLENDERHEADER]='\0'; - if (strncmp(header, m_headerString, 7)!=0) + if (strncmp(header, m_headerString, 6)!=0) { - printf ("Invalid blend file..."); + memcpy(header, m_headerString, SIZEOFBLENDERHEADER); + printf ("Invalid %s file...",header); return; } + if (header[6] == 'd') + { + mFlags |= FD_DOUBLE_PRECISION; + } + char *ver = header+9; mVersion = atoi(ver); if (mVersion <= 241) printf ("Warning, %d not fully tested : <= 242\n", mVersion); - int endian= 1; - endian= ((char*)&endian)[0]; + int littleEndian= 1; + littleEndian= ((char*)&littleEndian)[0]; // swap ptr sizes... if (header[7]=='-') @@ -134,10 +140,10 @@ void bFile::parseHeader() else if (VOID_IS_8) mFlags |= FD_BITS_VARIES; // swap endian... - if (header[8]=='V' && endian ==1) + if (header[8]=='V' && littleEndian ==1) mFlags |= FD_ENDIAN_SWAP; else - if (endian==0) + if (littleEndian==0) mFlags |= FD_ENDIAN_SWAP; @@ -383,12 +389,25 @@ void bFile::parseStruct(char *strcPtr, char *dtPtr, int old_dna, int new_dna, bo cpo = getFileElement(firstStruct, memName, memType, dtPtr, &filePtrOld); if (cpo) { + int arrayLen = mFileDNA->getArraySizeNew(filePtrOld[1]); old_nr = mFileDNA->getReverseType(memType); new_nr = revType; fpLen = mFileDNA->getElementSize(filePtrOld[0], filePtrOld[1]); + if (arrayLen==1) + { + parseStruct(cpc, cpo, old_nr, new_nr,fixupPointers); + } else + { + char* tmpCpc = cpc; + char* tmpCpo = cpo; - - parseStruct(cpc, cpo, old_nr, new_nr,fixupPointers); + for (int i=0;iinit((char*)sBulletDNAstr,sBulletDNAlen); +//#ifdef _WIN64 + if (VOID_IS_8) + mMemoryDNA->init((char*)sBulletDNAstr64,sBulletDNAlen64); + else +//#else + mMemoryDNA->init((char*)sBulletDNAstr,sBulletDNAlen); +//#endif } @@ -128,6 +136,9 @@ void btBulletFile::parseData() // { // m_glob = (bStructHandle*) id; // } + } else + { + printf("unknown chunk\n"); } // next please! @@ -158,17 +169,25 @@ void btBulletFile::writeDNA(FILE* fp) if (VOID_IS_8) { - //dataChunk.len = DNAlen64; - //dataChunk.oldPtr = DNAstr64; - //fwrite(&dataChunk,sizeof(bChunkInd),1,fp); - //fwrite(DNAstr64, DNAlen64,1,fp); +//#ifdef _WIN64 + dataChunk.len = sBulletDNAlen64; + dataChunk.oldPtr = sBulletDNAstr64; + fwrite(&dataChunk,sizeof(bChunkInd),1,fp); + fwrite(sBulletDNAstr64, sBulletDNAlen64,1,fp); +//#else +// btAssert(0); +//#endif } else { +//#ifndef _WIN64 dataChunk.len = sBulletDNAlen; dataChunk.oldPtr = sBulletDNAstr; fwrite(&dataChunk,sizeof(bChunkInd),1,fp); fwrite(sBulletDNAstr, sBulletDNAlen,1,fp); +//#else +// btAssert(0); +//#endif } } @@ -177,12 +196,19 @@ void btBulletFile::parse(bool verboseDumpAllTypes) { if (VOID_IS_8) { - exit(0); - //parseInternal(verboseDumpAllTypes,(char*)DNAstr64,DNAlen64); +//#ifdef _WIN64 + parseInternal(verboseDumpAllTypes,(char*)sBulletDNAstr64,sBulletDNAlen64); +//#else +// btAssert(0); +//#endif } else { +//#ifndef _WIN64 parseInternal(verboseDumpAllTypes,(char*)sBulletDNAstr,sBulletDNAlen); +//#else +// btAssert(0); +//#endif } } diff --git a/Extras/Serialize/BulletFileLoader/btBulletFileLoader.cpp b/Extras/Serialize/BulletFileLoader/btBulletFileLoader.cpp index 1fde7c434..95d8b6cf8 100644 --- a/Extras/Serialize/BulletFileLoader/btBulletFileLoader.cpp +++ b/Extras/Serialize/BulletFileLoader/btBulletFileLoader.cpp @@ -4,6 +4,7 @@ #include "btBulletDynamicsCommon.h" + btBulletFileLoader::btBulletFileLoader(btDynamicsWorld* world) :m_dynamicsWorld(world), m_verboseDumpAllTypes(false) @@ -12,7 +13,7 @@ m_verboseDumpAllTypes(false) bool btBulletFileLoader::loadFileFromMemory( char* fileName) { - bParse::btBulletFile* bulletFile2 = new bParse::btBulletFile("testFile.bullet"); + bParse::btBulletFile* bulletFile2 = new bParse::btBulletFile(fileName); bool result = loadFileFromMemory(bulletFile2); @@ -69,7 +70,7 @@ bool btBulletFileLoader::loadFileFromMemory( bParse::btBulletFile* bulletFile2) { btConvexInternalShapeData* bsd = (btConvexInternalShapeData*)shapeData; btVector3 implicitShapeDimensions; - implicitShapeDimensions.deSerialize(bsd->m_implicitShapeDimensions); + implicitShapeDimensions.deSerializeFloat(bsd->m_implicitShapeDimensions); btVector3 margin(bsd->m_collisionMargin,bsd->m_collisionMargin,bsd->m_collisionMargin); btCollisionShape* shape = 0; switch (shapeData->m_shapeType) @@ -107,7 +108,7 @@ bool btBulletFileLoader::loadFileFromMemory( bParse::btBulletFile* bulletFile2) tmpPos.resize(numSpheres); for (int i=0;im_localPositionArrayPtr[i].m_pos); + tmpPos[i].deSerializeFloat(mss->m_localPositionArrayPtr[i].m_pos); radii[i] = mss->m_localPositionArrayPtr[i].m_radius; } shape = new btMultiSphereShape(&tmpPos[0],&radii[0],numSpheres); @@ -115,6 +116,9 @@ bool btBulletFileLoader::loadFileFromMemory( bParse::btBulletFile* bulletFile2) } case CONVEX_HULL_SHAPE_PROXYTYPE: { + int sz = sizeof(btConvexHullShapeData); + int sz2 = sizeof(btConvexInternalShapeData); + int sz3 = sizeof(btCollisionShapeData); btConvexHullShapeData* convexData = (btConvexHullShapeData*)bsd; int numPoints = convexData->m_numUnscaledPoints; @@ -122,7 +126,17 @@ bool btBulletFileLoader::loadFileFromMemory( bParse::btBulletFile* bulletFile2) tmpPoints.resize(numPoints); for (int i=0;im_unscaledPointsPtr[i]); +#ifdef BT_USE_DOUBLE_PRECISION + if (convexData->m_unscaledPointsDoublePtr) + tmpPoints[i].deSerialize(convexData->m_unscaledPointsDoublePtr[i]); + if (convexData->m_unscaledPointsFloatPtr) + tmpPoints[i].deSerializeFloat(convexData->m_unscaledPointsFloatPtr[i]); +#else + if (convexData->m_unscaledPointsFloatPtr) + tmpPoints[i].deSerialize(convexData->m_unscaledPointsFloatPtr[i]); + if (convexData->m_unscaledPointsDoublePtr) + tmpPoints[i].deSerializeDouble(convexData->m_unscaledPointsDoublePtr[i]); +#endif //BT_USE_DOUBLE_PRECISION } shape = new btConvexHullShape(&tmpPoints[0].getX(),numPoints,sizeof(btVector3)); break; @@ -137,7 +151,7 @@ bool btBulletFileLoader::loadFileFromMemory( bParse::btBulletFile* bulletFile2) { shape->setMargin(bsd->m_collisionMargin); btVector3 localScaling; - localScaling.deSerialize(bsd->m_localScaling); + localScaling.deSerializeFloat(bsd->m_localScaling); shape->setLocalScaling(localScaling); shapeMap.insert(shapeData,shape); @@ -179,7 +193,7 @@ bool btBulletFileLoader::loadFileFromMemory( bParse::btBulletFile* bulletFile2) meshInterface->addIndexedMesh(meshPart); } - btVector3 scaling; scaling.deSerialize(trimesh->m_meshInterface.m_scaling); + btVector3 scaling; scaling.deSerializeFloat(trimesh->m_meshInterface.m_scaling); meshInterface->setScaling(scaling); btBvhTriangleMeshShape* trimeshShape = new btBvhTriangleMeshShape(meshInterface,true); @@ -198,29 +212,53 @@ bool btBulletFileLoader::loadFileFromMemory( bParse::btBulletFile* bulletFile2) } for (i=0;im_rigidBodies.size();i++) { - btRigidBodyData* colObjData = (btRigidBodyData*)bulletFile2->m_rigidBodies[i]; - btScalar mass = colObjData->m_inverseMass? 1.f/colObjData->m_inverseMass : 0.f; - btVector3 localInertia; - localInertia.setZero(); - btCollisionShape** shapePtr = shapeMap.find(colObjData->m_collisionObjectData.m_collisionShape); - if (shapePtr && *shapePtr) + if (bulletFile2->getFlags() & bParse::FD_DOUBLE_PRECISION) { - btTransform startTransform; - startTransform.deSerialize(colObjData->m_collisionObjectData.m_worldTransform); - - btCollisionShape* shape = (btCollisionShape*)*shapePtr; - - if (mass) + btRigidBodyDoubleData* colObjData = (btRigidBodyDoubleData*)bulletFile2->m_rigidBodies[i]; + btScalar mass = btScalar(colObjData->m_inverseMass? 1.f/colObjData->m_inverseMass : 0.f); + btVector3 localInertia; + localInertia.setZero(); + btCollisionShape** shapePtr = shapeMap.find(colObjData->m_collisionObjectData.m_collisionShape); + if (shapePtr && *shapePtr) { - shape->calculateLocalInertia(mass,localInertia); + btTransform startTransform; + startTransform.deSerializeDouble(colObjData->m_collisionObjectData.m_worldTransform); + // startTransform.setBasis(btMatrix3x3::getIdentity()); + btCollisionShape* shape = (btCollisionShape*)*shapePtr; + if (mass) + { + shape->calculateLocalInertia(mass,localInertia); + } + bool isDynamic = mass!=0.f; + createRigidBody(isDynamic,mass,startTransform,shape); + } else + { + printf("error: no shape found\n"); } - - bool isDynamic = mass!=0.f; - createRigidBody(isDynamic,mass,startTransform,shape); - + } else { - printf("error: no shape found\n"); + btRigidBodyFloatData* colObjData = (btRigidBodyFloatData*)bulletFile2->m_rigidBodies[i]; + btScalar mass = btScalar(colObjData->m_inverseMass? 1.f/colObjData->m_inverseMass : 0.f); + btVector3 localInertia; + localInertia.setZero(); + btCollisionShape** shapePtr = shapeMap.find(colObjData->m_collisionObjectData.m_collisionShape); + if (shapePtr && *shapePtr) + { + btTransform startTransform; + startTransform.deSerializeFloat(colObjData->m_collisionObjectData.m_worldTransform); + // startTransform.setBasis(btMatrix3x3::getIdentity()); + btCollisionShape* shape = (btCollisionShape*)*shapePtr; + if (mass) + { + shape->calculateLocalInertia(mass,localInertia); + } + bool isDynamic = mass!=0.f; + createRigidBody(isDynamic,mass,startTransform,shape); + } else + { + printf("error: no shape found\n"); + } } } @@ -244,7 +282,7 @@ btTypedConstraint* btBulletFileLoader::createUniversalD6Constraint(class btRig return 0; } -btRigidBody* btBulletFileLoader::createRigidBody(bool isDynamic, float mass, const btTransform& startTransform,btCollisionShape* shape) +btRigidBody* btBulletFileLoader::createRigidBody(bool isDynamic, btScalar mass, const btTransform& startTransform,btCollisionShape* shape) { btVector3 localInertia; diff --git a/Extras/Serialize/BulletFileLoader/btBulletFileLoader.h b/Extras/Serialize/BulletFileLoader/btBulletFileLoader.h index 5afd51640..a6e31793e 100644 --- a/Extras/Serialize/BulletFileLoader/btBulletFileLoader.h +++ b/Extras/Serialize/BulletFileLoader/btBulletFileLoader.h @@ -75,7 +75,7 @@ public: ); virtual btRigidBody* createRigidBody(bool isDynamic, - float mass, + btScalar mass, const btTransform& startTransform, btCollisionShape* shape); diff --git a/Extras/Serialize/makesdna/makesdna.cpp b/Extras/Serialize/makesdna/makesdna.cpp index f22a546b2..77763627f 100644 --- a/Extras/Serialize/makesdna/makesdna.cpp +++ b/Extras/Serialize/makesdna/makesdna.cpp @@ -810,6 +810,7 @@ static int calculate_structlens(int firststruct) // has_pointer is set or alphalen != len if (has_pointer || alphalen != len) { if (alphalen % 8) { + printf("alphalen = %d len = %d\n",alphalen,len); printf("Sizeerror 8 in struct: %s (add %d bytes)\n", types[structtype], alphalen%8); dna_error = 1; } @@ -945,7 +946,6 @@ int make_structDNA(char *baseDirectory, FILE *file) add_type("float", 4); /* 7 */ add_type("double", 8); /* 8 */ add_type("void", 0); /* 9 */ - add_type("btScalar", 4); /* 10 */ /* 4 bytes in single precision, 8 in double precision */ // the defines above shouldn't be output in the padding file... firststruct = nr_types; @@ -1175,7 +1175,14 @@ int main(int argc, char ** argv) strcpy(baseDirectory, BASE_HEADER); } - fprintf (file, "unsigned char sBulletDNAstr[]= {\n"); + if (sizeof(void*)==8) + { + fprintf (file, "unsigned char sBulletDNAstr64[]= {\n"); + } else + { + fprintf (file, "unsigned char sBulletDNAstr[]= {\n"); + } + if (make_structDNA(baseDirectory, file)) { // error fclose(file); @@ -1183,7 +1190,13 @@ int main(int argc, char ** argv) return_status = 1; } else { fprintf(file, "};\n"); - fprintf(file, "int sBulletDNAlen= sizeof(sBulletDNAstr);\n"); + if (sizeof(void*)==8) + { + fprintf(file, "int sBulletDNAlen64= sizeof(sBulletDNAstr64);\n"); + } else + { + fprintf(file, "int sBulletDNAlen= sizeof(sBulletDNAstr);\n"); + } fclose(file); } diff --git a/src/BulletCollision/CollisionDispatch/btCollisionObject.h b/src/BulletCollision/CollisionDispatch/btCollisionObject.h index 83198606d..569a786c6 100644 --- a/src/BulletCollision/CollisionDispatch/btCollisionObject.h +++ b/src/BulletCollision/CollisionDispatch/btCollisionObject.h @@ -34,6 +34,14 @@ struct btCollisionShapeData; typedef btAlignedObjectArray btCollisionObjectArray; +#ifdef BT_USE_DOUBLE_PRECISION +#define btCollisionObjectData btCollisionObjectDoubleData +#define btCollisionObjectDataName "btCollisionObjectDoubleData" +#else +#define btCollisionObjectData btCollisionObjectFloatData +#define btCollisionObjectDataName "btCollisionObjectFloatData" +#endif + /// btCollisionObject can be used to manage collision detection objects. /// btCollisionObject maintains all information that is needed for a collision detection: Shape, Transform and AABB proxy. @@ -427,34 +435,67 @@ public: ///using offsetof for m_vtablePadding might break some compilers, in that case define m_vtablePadding manually ///for serialization -struct btCollisionObjectData +struct btCollisionObjectDoubleData { - btTransformData m_worldTransform; - btTransformData m_interpolationWorldTransform; - btVector3Data m_interpolationLinearVelocity; - btVector3Data m_interpolationAngularVelocity; - btVector3Data m_anisotropicFriction; - int m_hasAnisotropicFriction; - btScalar m_contactProcessingThreshold; void *m_broadphaseHandle; void *m_collisionShape; btCollisionShapeData *m_rootCollisionShape; + void *m_userObjectPointer; + + btTransformDoubleData m_worldTransform; + btTransformDoubleData m_interpolationWorldTransform; + btVector3DoubleData m_interpolationLinearVelocity; + btVector3DoubleData m_interpolationAngularVelocity; + btVector3DoubleData m_anisotropicFriction; + double m_contactProcessingThreshold; + double m_deactivationTime; + double m_friction; + double m_restitution; + double m_hitFraction; + double m_ccdSweptSphereRadius; + double m_ccdMotionThreshold; + + int m_hasAnisotropicFriction; int m_collisionFlags; int m_islandTag1; int m_companionId; int m_activationState1; - btScalar m_deactivationTime; - btScalar m_friction; - btScalar m_restitution; int m_internalType; + int m_checkCollideWith; + char m_padding[4]; +}; + +struct btCollisionObjectFloatData +{ + void *m_broadphaseHandle; + void *m_collisionShape; + btCollisionShapeData *m_rootCollisionShape; void *m_userObjectPointer; - btScalar m_hitFraction; - btScalar m_ccdSweptSphereRadius; - btScalar m_ccdMotionThreshold; + + btTransformFloatData m_worldTransform; + btTransformFloatData m_interpolationWorldTransform; + btVector3FloatData m_interpolationLinearVelocity; + btVector3FloatData m_interpolationAngularVelocity; + btVector3FloatData m_anisotropicFriction; + float m_contactProcessingThreshold; + float m_deactivationTime; + float m_friction; + float m_restitution; + float m_hitFraction; + float m_ccdSweptSphereRadius; + float m_ccdMotionThreshold; + + int m_hasAnisotropicFriction; + int m_collisionFlags; + int m_islandTag1; + int m_companionId; + int m_activationState1; + int m_internalType; int m_checkCollideWith; }; + SIMD_FORCE_INLINE int btCollisionObject::calculateSerializeBufferSize() const { return sizeof(btCollisionObjectData); @@ -491,7 +532,7 @@ SIMD_FORCE_INLINE const char* btCollisionObject::serialize(void* dataBuffer) con dataOut->m_ccdMotionThreshold = m_ccdMotionThreshold; dataOut->m_checkCollideWith = m_checkCollideWith; - return "btCollisionObjectData"; + return btCollisionObjectDataName; } diff --git a/src/BulletCollision/CollisionShapes/btConvexHullShape.cpp b/src/BulletCollision/CollisionShapes/btConvexHullShape.cpp index 01281f74e..9a93c0a78 100644 --- a/src/BulletCollision/CollisionShapes/btConvexHullShape.cpp +++ b/src/BulletCollision/CollisionShapes/btConvexHullShape.cpp @@ -189,22 +189,32 @@ bool btConvexHullShape::isInside(const btVector3& ,btScalar ) const ///fills the dataBuffer and returns the struct name (and 0 on failure) const char* btConvexHullShape::serialize(void* dataBuffer, btSerializer* serializer) const { + int szc = sizeof(btConvexHullShapeData); btConvexHullShapeData* shapeData = (btConvexHullShapeData*) dataBuffer; btConvexInternalShape::serialize(&shapeData->m_convexInternalShapeData, serializer); int numElem = m_unscaledPoints.size(); shapeData->m_numUnscaledPoints = numElem; - shapeData->m_unscaledPointsPtr = numElem ? (btVector3Data*)&m_unscaledPoints[0]: 0; +#ifdef BT_USE_DOUBLE_PRECISION + shapeData->m_unscaledPointsFloatPtr = 0; + shapeData->m_unscaledPointsDoublePtr = numElem ? (btVector3Data*)&m_unscaledPoints[0]: 0; +#else + shapeData->m_unscaledPointsFloatPtr = numElem ? (btVector3Data*)&m_unscaledPoints[0]: 0; + shapeData->m_unscaledPointsDoublePtr = 0; +#endif if (numElem) { - btChunk* chunk = serializer->allocate(sizeof(btVector3Data),numElem); + int sz = sizeof(btVector3Data); + int sz2 = sizeof(btVector3DoubleData); + int sz3 = sizeof(btVector3FloatData); + btChunk* chunk = serializer->allocate(sz,numElem); btVector3Data* memPtr = (btVector3Data*)chunk->m_oldPtr; for (int i=0;ifinalizeChunk(chunk,"btVector3Data",BT_ARRAY_CODE,(void*)&m_unscaledPoints[0]); + serializer->finalizeChunk(chunk,btVector3DataName,BT_ARRAY_CODE,(void*)&m_unscaledPoints[0]); } return "btConvexHullShapeData"; diff --git a/src/BulletCollision/CollisionShapes/btConvexHullShape.h b/src/BulletCollision/CollisionShapes/btConvexHullShape.h index 68f04a7e0..dcdbbf40c 100644 --- a/src/BulletCollision/CollisionShapes/btConvexHullShape.h +++ b/src/BulletCollision/CollisionShapes/btConvexHullShape.h @@ -101,12 +101,15 @@ struct btConvexHullShapeData { btConvexInternalShapeData m_convexInternalShapeData; - btVector3Data *m_unscaledPointsPtr; + btVector3FloatData *m_unscaledPointsFloatPtr; + btVector3DoubleData *m_unscaledPointsDoublePtr; + int m_numUnscaledPoints; - char m_padding[4]; + char m_padding3[4]; }; + SIMD_FORCE_INLINE int btConvexHullShape::calculateSerializeBufferSize() { return sizeof(btConvexHullShapeData); diff --git a/src/BulletCollision/CollisionShapes/btConvexInternalShape.h b/src/BulletCollision/CollisionShapes/btConvexInternalShape.h index fc99740c4..8e187c6f9 100644 --- a/src/BulletCollision/CollisionShapes/btConvexInternalShape.h +++ b/src/BulletCollision/CollisionShapes/btConvexInternalShape.h @@ -19,6 +19,7 @@ subject to the following restrictions: #include "btConvexShape.h" #include "LinearMath/btAabbUtil2.h" + ///The btConvexInternalShape is an internal base class, shared by most convex shape implementations. class btConvexInternalShape : public btConvexShape { @@ -118,19 +119,17 @@ public: }; - - struct btConvexInternalShapeData { btCollisionShapeData m_collisionShapeData; - btVector3Data m_localScaling; + btVector3FloatData m_localScaling; - btVector3Data m_implicitShapeDimensions; + btVector3FloatData m_implicitShapeDimensions; - btScalar m_collisionMargin; + float m_collisionMargin; - char m_padding[4]; + int m_padding; }; @@ -147,9 +146,9 @@ SIMD_FORCE_INLINE const char* btConvexInternalShape::serialize(void* dataBuffer, btConvexInternalShapeData* shapeData = (btConvexInternalShapeData*) dataBuffer; btCollisionShape::serialize(&shapeData->m_collisionShapeData, serializer); - m_implicitShapeDimensions.serialize(shapeData->m_implicitShapeDimensions); - m_localScaling.serialize(shapeData->m_localScaling); - shapeData->m_collisionMargin = m_collisionMargin; + m_implicitShapeDimensions.serializeFloat(shapeData->m_implicitShapeDimensions); + m_localScaling.serializeFloat(shapeData->m_localScaling); + shapeData->m_collisionMargin = float(m_collisionMargin); return "btConvexInternalShapeData"; } diff --git a/src/BulletCollision/CollisionShapes/btMultiSphereShape.cpp b/src/BulletCollision/CollisionShapes/btMultiSphereShape.cpp index 5c83faea2..892e17433 100644 --- a/src/BulletCollision/CollisionShapes/btMultiSphereShape.cpp +++ b/src/BulletCollision/CollisionShapes/btMultiSphereShape.cpp @@ -155,8 +155,8 @@ const char* btMultiSphereShape::serialize(void* dataBuffer, btSerializer* serial btPositionAndRadius* memPtr = (btPositionAndRadius*)chunk->m_oldPtr; for (int i=0;im_pos); - memPtr->m_radius = m_radiArray[i]; + m_localPositionArray[i].serializeFloat(memPtr->m_pos); + memPtr->m_radius = float(m_radiArray[i]); } serializer->finalizeChunk(chunk,"btPositionAndRadius",BT_ARRAY_CODE,(void*)&m_localPositionArray[0]); } diff --git a/src/BulletCollision/CollisionShapes/btMultiSphereShape.h b/src/BulletCollision/CollisionShapes/btMultiSphereShape.h index bfad948c5..afc92ce86 100644 --- a/src/BulletCollision/CollisionShapes/btMultiSphereShape.h +++ b/src/BulletCollision/CollisionShapes/btMultiSphereShape.h @@ -21,6 +21,8 @@ subject to the following restrictions: #include "LinearMath/btAlignedObjectArray.h" #include "LinearMath/btAabbUtil2.h" + + ///The btMultiSphereShape represents the convex hull of a collection of spheres. You can create special capsules or other smooth volumes. ///It is possible to animate the spheres for deformation, but call 'recalcLocalAabb' after changing any sphere position/radius class btMultiSphereShape : public btConvexInternalAabbCachingShape @@ -69,10 +71,11 @@ public: }; + struct btPositionAndRadius { - btVector3Data m_pos; - btScalar m_radius; + btVector3FloatData m_pos; + float m_radius; }; struct btMultiSphereShapeData @@ -82,9 +85,10 @@ struct btMultiSphereShapeData btPositionAndRadius *m_localPositionArrayPtr; int m_localPositionArraySize; char m_padding[4]; - }; + + SIMD_FORCE_INLINE int btMultiSphereShape::calculateSerializeBufferSize() { return sizeof(btMultiSphereShapeData); diff --git a/src/BulletCollision/CollisionShapes/btStridingMeshInterface.cpp b/src/BulletCollision/CollisionShapes/btStridingMeshInterface.cpp index 9f7295f14..9a012e68c 100644 --- a/src/BulletCollision/CollisionShapes/btStridingMeshInterface.cpp +++ b/src/BulletCollision/CollisionShapes/btStridingMeshInterface.cpp @@ -327,6 +327,6 @@ const char* btStridingMeshInterface::serialize(void* dataBuffer, btSerializer* s } - m_scaling.serialize(trimeshData->m_scaling); + m_scaling.serializeFloat(trimeshData->m_scaling); return "btStridingMeshInterfaceData"; } diff --git a/src/BulletCollision/CollisionShapes/btStridingMeshInterface.h b/src/BulletCollision/CollisionShapes/btStridingMeshInterface.h index 4ae08b748..5b9741cce 100644 --- a/src/BulletCollision/CollisionShapes/btStridingMeshInterface.h +++ b/src/BulletCollision/CollisionShapes/btStridingMeshInterface.h @@ -22,6 +22,8 @@ subject to the following restrictions: + + /// The btStridingMeshInterface is the interface class for high performance generic access to triangle meshes, used in combination with btBvhTriangleMeshShape and some other collision shapes. /// Using index striding of 3*sizeof(integer) it can use triangle arrays, using index striding of 1*sizeof(integer) it can handle triangle strips. /// It allows for sharing graphics and collision meshes. Also it provides locking/unlocking of graphics meshes that are in gpu memory. @@ -118,19 +120,18 @@ struct btMeshPartData int m_numVertices; }; + struct btStridingMeshInterfaceData { btMeshPartData *m_meshPartsPtr; - + btVector3FloatData m_scaling; int m_numMeshParts; - - btVector3Data m_scaling; - char m_padding[4]; - }; + + SIMD_FORCE_INLINE int btStridingMeshInterface::calculateSerializeBufferSize() { return sizeof(btStridingMeshInterfaceData); diff --git a/src/BulletCollision/CollisionShapes/btTriangleMeshShape.cpp b/src/BulletCollision/CollisionShapes/btTriangleMeshShape.cpp index 892f85afb..24df7481d 100644 --- a/src/BulletCollision/CollisionShapes/btTriangleMeshShape.cpp +++ b/src/BulletCollision/CollisionShapes/btTriangleMeshShape.cpp @@ -218,7 +218,7 @@ const char* btTriangleMeshShape::serialize(void* dataBuffer, btSerializer* seria m_meshInterface->serialize(&trimeshData->m_meshInterface, serializer); - trimeshData->m_collisionMargin = m_collisionMargin; + trimeshData->m_collisionMargin = float(m_collisionMargin); return "btTriangleMeshShapeData"; } diff --git a/src/BulletCollision/CollisionShapes/btTriangleMeshShape.h b/src/BulletCollision/CollisionShapes/btTriangleMeshShape.h index cd81057fa..f74915431 100644 --- a/src/BulletCollision/CollisionShapes/btTriangleMeshShape.h +++ b/src/BulletCollision/CollisionShapes/btTriangleMeshShape.h @@ -20,6 +20,7 @@ subject to the following restrictions: #include "btStridingMeshInterface.h" + ///The btTriangleMeshShape is an internal concave triangle mesh interface. Don't use this class directly, use btBvhTriangleMeshShape instead. class btTriangleMeshShape : public btConcaveShape { @@ -90,14 +91,16 @@ public: struct btTriangleMeshShapeData { - //btConcaveShapeData m_concaveShapeData; btCollisionShapeData m_collisionShapeData; btStridingMeshInterfaceData m_meshInterface; - btScalar m_collisionMargin; + float m_collisionMargin; + + char m_padding[4]; }; + SIMD_FORCE_INLINE int btTriangleMeshShape::calculateSerializeBufferSize() { return sizeof(btTriangleMeshShapeData); diff --git a/src/BulletDynamics/Character/btKinematicCharacterController.h b/src/BulletDynamics/Character/btKinematicCharacterController.h index 4fc56c056..10e32754d 100644 --- a/src/BulletDynamics/Character/btKinematicCharacterController.h +++ b/src/BulletDynamics/Character/btKinematicCharacterController.h @@ -67,7 +67,7 @@ protected: bool m_useGhostObjectSweepTest; bool m_useWalkDirection; - float m_velocityTimeInterval; + btScalar m_velocityTimeInterval; int m_upAxis; btVector3 computeReflectionDirection (const btVector3& direction, const btVector3& normal); diff --git a/src/BulletDynamics/Dynamics/btRigidBody.cpp b/src/BulletDynamics/Dynamics/btRigidBody.cpp index e73ac17f9..48c037e50 100644 --- a/src/BulletDynamics/Dynamics/btRigidBody.cpp +++ b/src/BulletDynamics/Dynamics/btRigidBody.cpp @@ -350,6 +350,6 @@ const char* btRigidBody::serialize(void* dataBuffer) const rbd->m_linearSleepingThreshold=m_linearSleepingThreshold; rbd->m_angularSleepingThreshold = m_angularSleepingThreshold; - return "btRigidBodyData"; + return btRigidBodyDataName; } diff --git a/src/BulletDynamics/Dynamics/btRigidBody.h b/src/BulletDynamics/Dynamics/btRigidBody.h index 7028a9bcf..a807ef315 100644 --- a/src/BulletDynamics/Dynamics/btRigidBody.h +++ b/src/BulletDynamics/Dynamics/btRigidBody.h @@ -29,6 +29,16 @@ class btTypedConstraint; extern btScalar gDeactivationTime; extern bool gDisableDeactivation; +#ifdef BT_USE_DOUBLE_PRECISION +#define btRigidBodyData btRigidBodyDoubleData +#define btRigidBodyDataName "btRigidBodyDoubleData" +#else +#define btRigidBodyData btRigidBodyFloatData +#define btRigidBodyDataName "btRigidBodyFloatData" +#endif //BT_USE_DOUBLE_PRECISION + + + ///The btRigidBody is the main class for rigid body objects. It is derived from btCollisionObject, so it keeps a pointer to a btCollisionShape. ///It is recommended for performance and memory use to share btCollisionShape objects whenever possible. @@ -504,36 +514,55 @@ public: //@todo add m_optionalMotionState and m_constraintRefs to btRigidBodyData ///btRigidBodyData is used for btRigidBody serialization -struct btRigidBodyData +struct btRigidBodyFloatData { - btCollisionObjectData m_collisionObjectData; + btCollisionObjectFloatData m_collisionObjectData; + btMatrix3x3FloatData m_invInertiaTensorWorld; + btVector3FloatData m_linearVelocity; + btVector3FloatData m_angularVelocity; + btVector3FloatData m_angularFactor; + btVector3FloatData m_linearFactor; + btVector3FloatData m_gravity; + btVector3FloatData m_gravity_acceleration; + btVector3FloatData m_invInertiaLocal; + btVector3FloatData m_totalForce; + btVector3FloatData m_totalTorque; + float m_inverseMass; + float m_linearDamping; + float m_angularDamping; + float m_additionalDampingFactor; + float m_additionalLinearDampingThresholdSqr; + float m_additionalAngularDampingThresholdSqr; + float m_additionalAngularDampingFactor; + float m_linearSleepingThreshold; + float m_angularSleepingThreshold; + int m_additionalDamping; +}; - btMatrix3x3Data m_invInertiaTensorWorld; - btVector3Data m_linearVelocity; - btVector3Data m_angularVelocity; - btScalar m_inverseMass; - btVector3Data m_angularFactor; - btVector3Data m_linearFactor; - - btVector3Data m_gravity; - btVector3Data m_gravity_acceleration; - btVector3Data m_invInertiaLocal; - btVector3Data m_totalForce; - btVector3Data m_totalTorque; - - btScalar m_linearDamping; - btScalar m_angularDamping; - - int m_additionalDamping; - btScalar m_additionalDampingFactor; - btScalar m_additionalLinearDampingThresholdSqr; - btScalar m_additionalAngularDampingThresholdSqr; - btScalar m_additionalAngularDampingFactor; - - - btScalar m_linearSleepingThreshold; - btScalar m_angularSleepingThreshold; - +struct btRigidBodyDoubleData +{ + btCollisionObjectDoubleData m_collisionObjectData; + btMatrix3x3DoubleData m_invInertiaTensorWorld; + btVector3DoubleData m_linearVelocity; + btVector3DoubleData m_angularVelocity; + btVector3DoubleData m_angularFactor; + btVector3DoubleData m_linearFactor; + btVector3DoubleData m_gravity; + btVector3DoubleData m_gravity_acceleration; + btVector3DoubleData m_invInertiaLocal; + btVector3DoubleData m_totalForce; + btVector3DoubleData m_totalTorque; + double m_inverseMass; + double m_linearDamping; + double m_angularDamping; + double m_additionalDampingFactor; + double m_additionalLinearDampingThresholdSqr; + double m_additionalAngularDampingThresholdSqr; + double m_additionalAngularDampingFactor; + double m_linearSleepingThreshold; + double m_angularSleepingThreshold; + int m_additionalDamping; + char m_padding[4]; }; diff --git a/src/LinearMath/btConvexHull.cpp b/src/LinearMath/btConvexHull.cpp index c1138b797..8ff54288b 100644 --- a/src/LinearMath/btConvexHull.cpp +++ b/src/LinearMath/btConvexHull.cpp @@ -1011,9 +1011,9 @@ bool HullLibrary::CleanupVertices(unsigned int svcount, btScalar y = v[1]; btScalar z = v[2]; - btScalar dx = fabsf(x - px ); - btScalar dy = fabsf(y - py ); - btScalar dz = fabsf(z - pz ); + btScalar dx = btFabs(x - px ); + btScalar dy = btFabs(y - py ); + btScalar dz = btFabs(z - pz ); if ( dx < normalepsilon && dy < normalepsilon && dz < normalepsilon ) { diff --git a/src/LinearMath/btMatrix3x3.h b/src/LinearMath/btMatrix3x3.h index 9ee13f35d..1032e6a5a 100644 --- a/src/LinearMath/btMatrix3x3.h +++ b/src/LinearMath/btMatrix3x3.h @@ -19,6 +19,11 @@ subject to the following restrictions: #include "btVector3.h" #include "btQuaternion.h" +#ifdef BT_USE_DOUBLE_PRECISION +#define btMatrix3x3Data btMatrix3x3DoubleData +#else +#define btMatrix3x3Data btMatrix3x3FloatData +#endif //BT_USE_DOUBLE_PRECISION /**@brief The btMatrix3x3 class implements a 3x3 rotation matrix, to perform linear algebra in combination with btQuaternion, btTransform and btVector3. @@ -500,6 +505,10 @@ public: void deSerialize(const struct btMatrix3x3Data& dataIn); + void deSerializeFloat(const struct btMatrix3x3FloatData& dataIn); + + void deSerializeDouble(const struct btMatrix3x3DoubleData& dataIn); + }; @@ -628,11 +637,18 @@ SIMD_FORCE_INLINE bool operator==(const btMatrix3x3& m1, const btMatrix3x3& m2) } ///for serialization -struct btMatrix3x3Data +struct btMatrix3x3FloatData { - btVector3Data m_el[3]; + btVector3FloatData m_el[3]; }; +///for serialization +struct btMatrix3x3DoubleData +{ + btVector3DoubleData m_el[3]; +}; + + SIMD_FORCE_INLINE void btMatrix3x3::serialize(struct btMatrix3x3Data& dataOut) const { @@ -640,11 +656,24 @@ SIMD_FORCE_INLINE void btMatrix3x3::serialize(struct btMatrix3x3Data& dataOut) c m_el[i].serialize(dataOut.m_el[i]); } + SIMD_FORCE_INLINE void btMatrix3x3::deSerialize(const struct btMatrix3x3Data& dataIn) { for (int i=0;i<3;i++) m_el[i].deSerialize(dataIn.m_el[i]); } +SIMD_FORCE_INLINE void btMatrix3x3::deSerializeFloat(const struct btMatrix3x3FloatData& dataIn) +{ + for (int i=0;i<3;i++) + m_el[i].deSerializeFloat(dataIn.m_el[i]); +} + +SIMD_FORCE_INLINE void btMatrix3x3::deSerializeDouble(const struct btMatrix3x3DoubleData& dataIn) +{ + for (int i=0;i<3;i++) + m_el[i].deSerializeDouble(dataIn.m_el[i]); +} + #endif //BT_MATRIX3x3_H diff --git a/src/LinearMath/btSerializer.cpp b/src/LinearMath/btSerializer.cpp index 162cb3d15..6eb43a8c0 100644 --- a/src/LinearMath/btSerializer.cpp +++ b/src/LinearMath/btSerializer.cpp @@ -1,5 +1,6 @@ -unsigned char sBulletDNAstr[]= { -83,68,78,65,78,65,77,69,83,0,0,0,109,95,115,105,122,101,0,109, + +unsigned char sBulletDNAstr64[]= { +83,68,78,65,78,65,77,69,85,0,0,0,109,95,115,105,122,101,0,109, 95,99,97,112,97,99,105,116,121,0,42,109,95,100,97,116,97,0,109,95, 99,111,108,108,105,115,105,111,110,83,104,97,112,101,115,0,109,95,99,111, 108,108,105,115,105,111,110,79,98,106,101,99,116,115,0,109,95,99,111,110, @@ -12,115 +13,275 @@ unsigned char sBulletDNAstr[]= { 109,95,108,111,99,97,108,83,99,97,108,105,110,103,0,109,95,105,109,112, 108,105,99,105,116,83,104,97,112,101,68,105,109,101,110,115,105,111,110,115, 0,109,95,99,111,108,108,105,115,105,111,110,77,97,114,103,105,110,0,109, -95,112,111,115,0,109,95,114,97,100,105,117,115,0,109,95,99,111,110,118, -101,120,73,110,116,101,114,110,97,108,83,104,97,112,101,68,97,116,97,0, -42,109,95,108,111,99,97,108,80,111,115,105,116,105,111,110,65,114,114,97, -121,80,116,114,0,109,95,108,111,99,97,108,80,111,115,105,116,105,111,110, -65,114,114,97,121,83,105,122,101,0,109,95,118,97,108,117,101,0,105,110, -116,0,42,109,95,118,101,114,116,105,99,101,115,51,102,0,42,109,95,118, -101,114,116,105,99,101,115,51,100,0,42,109,95,105,110,100,105,99,101,115, -51,50,0,42,109,95,105,110,100,105,99,101,115,49,54,0,109,95,110,117, -109,84,114,105,97,110,103,108,101,115,0,109,95,110,117,109,86,101,114,116, -105,99,101,115,0,42,109,95,109,101,115,104,80,97,114,116,115,80,116,114, -0,109,95,110,117,109,77,101,115,104,80,97,114,116,115,0,109,95,115,99, -97,108,105,110,103,0,98,116,67,111,108,108,105,115,105,111,110,83,104,97, -112,101,68,97,116,97,0,109,95,109,101,115,104,73,110,116,101,114,102,97, -99,101,0,42,109,95,117,110,115,99,97,108,101,100,80,111,105,110,116,115, -80,116,114,0,109,95,110,117,109,85,110,115,99,97,108,101,100,80,111,105, -110,116,115,0,109,95,119,111,114,108,100,84,114,97,110,115,102,111,114,109, -0,109,95,105,110,116,101,114,112,111,108,97,116,105,111,110,87,111,114,108, -100,84,114,97,110,115,102,111,114,109,0,109,95,105,110,116,101,114,112,111, -108,97,116,105,111,110,76,105,110,101,97,114,86,101,108,111,99,105,116,121, -0,109,95,105,110,116,101,114,112,111,108,97,116,105,111,110,65,110,103,117, -108,97,114,86,101,108,111,99,105,116,121,0,109,95,97,110,105,115,111,116, -114,111,112,105,99,70,114,105,99,116,105,111,110,0,109,95,104,97,115,65, -110,105,115,111,116,114,111,112,105,99,70,114,105,99,116,105,111,110,0,109, -95,99,111,110,116,97,99,116,80,114,111,99,101,115,115,105,110,103,84,104, -114,101,115,104,111,108,100,0,42,109,95,98,114,111,97,100,112,104,97,115, -101,72,97,110,100,108,101,0,42,109,95,99,111,108,108,105,115,105,111,110, -83,104,97,112,101,0,42,109,95,114,111,111,116,67,111,108,108,105,115,105, -111,110,83,104,97,112,101,0,109,95,99,111,108,108,105,115,105,111,110,70, -108,97,103,115,0,109,95,105,115,108,97,110,100,84,97,103,49,0,109,95, -99,111,109,112,97,110,105,111,110,73,100,0,109,95,97,99,116,105,118,97, -116,105,111,110,83,116,97,116,101,49,0,109,95,100,101,97,99,116,105,118, -97,116,105,111,110,84,105,109,101,0,109,95,102,114,105,99,116,105,111,110, -0,109,95,114,101,115,116,105,116,117,116,105,111,110,0,109,95,105,110,116, -101,114,110,97,108,84,121,112,101,0,42,109,95,117,115,101,114,79,98,106, -101,99,116,80,111,105,110,116,101,114,0,109,95,104,105,116,70,114,97,99, -116,105,111,110,0,109,95,99,99,100,83,119,101,112,116,83,112,104,101,114, -101,82,97,100,105,117,115,0,109,95,99,99,100,77,111,116,105,111,110,84, -104,114,101,115,104,111,108,100,0,109,95,99,104,101,99,107,67,111,108,108, -105,100,101,87,105,116,104,0,109,95,99,111,108,108,105,115,105,111,110,79, -98,106,101,99,116,68,97,116,97,0,109,95,105,110,118,73,110,101,114,116, -105,97,84,101,110,115,111,114,87,111,114,108,100,0,109,95,108,105,110,101, -97,114,86,101,108,111,99,105,116,121,0,109,95,97,110,103,117,108,97,114, -86,101,108,111,99,105,116,121,0,109,95,105,110,118,101,114,115,101,77,97, -115,115,0,109,95,97,110,103,117,108,97,114,70,97,99,116,111,114,0,109, -95,108,105,110,101,97,114,70,97,99,116,111,114,0,109,95,103,114,97,118, -105,116,121,0,109,95,103,114,97,118,105,116,121,95,97,99,99,101,108,101, -114,97,116,105,111,110,0,109,95,105,110,118,73,110,101,114,116,105,97,76, -111,99,97,108,0,109,95,116,111,116,97,108,70,111,114,99,101,0,109,95, -116,111,116,97,108,84,111,114,113,117,101,0,109,95,108,105,110,101,97,114, -68,97,109,112,105,110,103,0,109,95,97,110,103,117,108,97,114,68,97,109, -112,105,110,103,0,109,95,97,100,100,105,116,105,111,110,97,108,68,97,109, -112,105,110,103,0,109,95,97,100,100,105,116,105,111,110,97,108,68,97,109, -112,105,110,103,70,97,99,116,111,114,0,109,95,97,100,100,105,116,105,111, -110,97,108,76,105,110,101,97,114,68,97,109,112,105,110,103,84,104,114,101, -115,104,111,108,100,83,113,114,0,109,95,97,100,100,105,116,105,111,110,97, -108,65,110,103,117,108,97,114,68,97,109,112,105,110,103,84,104,114,101,115, -104,111,108,100,83,113,114,0,109,95,97,100,100,105,116,105,111,110,97,108, -65,110,103,117,108,97,114,68,97,109,112,105,110,103,70,97,99,116,111,114, -0,109,95,108,105,110,101,97,114,83,108,101,101,112,105,110,103,84,104,114, -101,115,104,111,108,100,0,109,95,97,110,103,117,108,97,114,83,108,101,101, -112,105,110,103,84,104,114,101,115,104,111,108,100,0,0,0,84,89,80,69, -32,0,0,0,99,104,97,114,0,117,99,104,97,114,0,115,104,111,114,116, -0,117,115,104,111,114,116,0,105,110,116,0,108,111,110,103,0,117,108,111, -110,103,0,102,108,111,97,116,0,100,111,117,98,108,101,0,118,111,105,100, -0,98,116,83,99,97,108,97,114,0,80,111,105,110,116,101,114,65,114,114, -97,121,0,98,116,80,104,121,115,105,99,115,83,121,115,116,101,109,0,76, -105,115,116,66,97,115,101,0,98,116,86,101,99,116,111,114,51,68,97,116, -97,0,98,116,86,101,99,116,111,114,51,70,108,111,97,116,68,97,116,97, -0,98,116,86,101,99,116,111,114,51,68,111,117,98,108,101,68,97,116,97, -0,98,116,77,97,116,114,105,120,51,120,51,68,97,116,97,0,98,116,84, -114,97,110,115,102,111,114,109,68,97,116,97,0,98,116,67,111,108,108,105, -115,105,111,110,83,104,97,112,101,68,97,116,97,0,98,116,67,111,110,118, -101,120,73,110,116,101,114,110,97,108,83,104,97,112,101,68,97,116,97,0, -98,116,80,111,115,105,116,105,111,110,65,110,100,82,97,100,105,117,115,0, -98,116,77,117,108,116,105,83,112,104,101,114,101,83,104,97,112,101,68,97, -116,97,0,98,116,73,110,116,73,110,100,101,120,68,97,116,97,0,98,116, -83,104,111,114,116,73,110,116,73,110,100,101,120,68,97,116,97,0,98,116, -77,101,115,104,80,97,114,116,68,97,116,97,0,98,116,83,116,114,105,100, -105,110,103,77,101,115,104,73,110,116,101,114,102,97,99,101,68,97,116,97, -0,98,116,84,114,105,97,110,103,108,101,77,101,115,104,83,104,97,112,101, -68,97,116,97,0,109,95,99,111,110,99,97,118,101,83,104,97,112,101,68, -97,116,97,59,0,98,116,67,111,110,118,101,120,72,117,108,108,83,104,97, -112,101,68,97,116,97,0,98,116,67,111,108,108,105,115,105,111,110,79,98, -106,101,99,116,68,97,116,97,0,98,116,82,105,103,105,100,66,111,100,121, -68,97,116,97,0,0,0,0,84,76,69,78,1,0,1,0,2,0,2,0, -4,0,4,0,4,0,4,0,8,0,0,0,4,0,12,0,36,0,8,0, -16,0,16,0,32,0,48,0,64,0,12,0,52,0,20,0,64,0,4,0, -4,0,24,0,28,0,0,0,0,0,64,0,-8,0,-32,1,83,84,82,67, -20,0,0,0,11,0,3,0,4,0,0,0,4,0,1,0,9,0,2,0, -12,0,3,0,11,0,3,0,11,0,4,0,11,0,5,0,13,0,2,0, -9,0,6,0,9,0,7,0,14,0,1,0,10,0,8,0,15,0,1,0, -7,0,8,0,16,0,1,0,8,0,8,0,17,0,1,0,14,0,9,0, -18,0,2,0,17,0,10,0,14,0,11,0,19,0,3,0,9,0,12,0, -4,0,13,0,0,0,14,0,20,0,5,0,19,0,15,0,14,0,16,0, -14,0,17,0,10,0,18,0,0,0,14,0,21,0,2,0,14,0,19,0, -10,0,20,0,22,0,4,0,20,0,21,0,21,0,22,0,4,0,23,0, -0,0,14,0,23,0,1,0,4,0,24,0,24,0,2,0,2,0,25,0, -2,0,24,0,25,0,6,0,15,0,26,0,16,0,27,0,23,0,28,0, -24,0,29,0,4,0,30,0,4,0,31,0,26,0,4,0,25,0,32,0, -4,0,33,0,14,0,34,0,0,0,14,0,27,0,4,0,28,0,35,0, -28,0,15,0,26,0,36,0,10,0,18,0,29,0,4,0,20,0,21,0, -14,0,37,0,4,0,38,0,0,0,14,0,30,0,23,0,18,0,39,0, -18,0,40,0,14,0,41,0,14,0,42,0,14,0,43,0,4,0,44,0, -10,0,45,0,9,0,46,0,9,0,47,0,19,0,48,0,4,0,49,0, -4,0,50,0,4,0,51,0,4,0,52,0,10,0,53,0,10,0,54,0, -10,0,55,0,4,0,56,0,9,0,57,0,10,0,58,0,10,0,59,0, -10,0,60,0,4,0,61,0,31,0,21,0,30,0,62,0,17,0,63,0, -14,0,64,0,14,0,65,0,10,0,66,0,14,0,67,0,14,0,68,0, -14,0,69,0,14,0,70,0,14,0,71,0,14,0,72,0,14,0,73,0, -10,0,74,0,10,0,75,0,4,0,76,0,10,0,77,0,10,0,78,0, -10,0,79,0,10,0,80,0,10,0,81,0,10,0,82,0,}; +95,112,97,100,100,105,110,103,0,109,95,112,111,115,0,109,95,114,97,100, +105,117,115,0,109,95,99,111,110,118,101,120,73,110,116,101,114,110,97,108, +83,104,97,112,101,68,97,116,97,0,42,109,95,108,111,99,97,108,80,111, +115,105,116,105,111,110,65,114,114,97,121,80,116,114,0,109,95,108,111,99, +97,108,80,111,115,105,116,105,111,110,65,114,114,97,121,83,105,122,101,0, +109,95,118,97,108,117,101,0,105,110,116,0,42,109,95,118,101,114,116,105, +99,101,115,51,102,0,42,109,95,118,101,114,116,105,99,101,115,51,100,0, +42,109,95,105,110,100,105,99,101,115,51,50,0,42,109,95,105,110,100,105, +99,101,115,49,54,0,109,95,110,117,109,84,114,105,97,110,103,108,101,115, +0,109,95,110,117,109,86,101,114,116,105,99,101,115,0,42,109,95,109,101, +115,104,80,97,114,116,115,80,116,114,0,109,95,115,99,97,108,105,110,103, +0,109,95,110,117,109,77,101,115,104,80,97,114,116,115,0,109,95,109,101, +115,104,73,110,116,101,114,102,97,99,101,0,42,109,95,117,110,115,99,97, +108,101,100,80,111,105,110,116,115,70,108,111,97,116,80,116,114,0,42,109, +95,117,110,115,99,97,108,101,100,80,111,105,110,116,115,68,111,117,98,108, +101,80,116,114,0,109,95,110,117,109,85,110,115,99,97,108,101,100,80,111, +105,110,116,115,0,109,95,112,97,100,100,105,110,103,51,91,52,93,0,42, +109,95,98,114,111,97,100,112,104,97,115,101,72,97,110,100,108,101,0,42, +109,95,99,111,108,108,105,115,105,111,110,83,104,97,112,101,0,42,109,95, +114,111,111,116,67,111,108,108,105,115,105,111,110,83,104,97,112,101,0,42, +109,95,117,115,101,114,79,98,106,101,99,116,80,111,105,110,116,101,114,0, +109,95,119,111,114,108,100,84,114,97,110,115,102,111,114,109,0,109,95,105, +110,116,101,114,112,111,108,97,116,105,111,110,87,111,114,108,100,84,114,97, +110,115,102,111,114,109,0,109,95,105,110,116,101,114,112,111,108,97,116,105, +111,110,76,105,110,101,97,114,86,101,108,111,99,105,116,121,0,109,95,105, +110,116,101,114,112,111,108,97,116,105,111,110,65,110,103,117,108,97,114,86, +101,108,111,99,105,116,121,0,109,95,97,110,105,115,111,116,114,111,112,105, +99,70,114,105,99,116,105,111,110,0,109,95,99,111,110,116,97,99,116,80, +114,111,99,101,115,115,105,110,103,84,104,114,101,115,104,111,108,100,0,109, +95,100,101,97,99,116,105,118,97,116,105,111,110,84,105,109,101,0,109,95, +102,114,105,99,116,105,111,110,0,109,95,114,101,115,116,105,116,117,116,105, +111,110,0,109,95,104,105,116,70,114,97,99,116,105,111,110,0,109,95,99, +99,100,83,119,101,112,116,83,112,104,101,114,101,82,97,100,105,117,115,0, +109,95,99,99,100,77,111,116,105,111,110,84,104,114,101,115,104,111,108,100, +0,109,95,104,97,115,65,110,105,115,111,116,114,111,112,105,99,70,114,105, +99,116,105,111,110,0,109,95,99,111,108,108,105,115,105,111,110,70,108,97, +103,115,0,109,95,105,115,108,97,110,100,84,97,103,49,0,109,95,99,111, +109,112,97,110,105,111,110,73,100,0,109,95,97,99,116,105,118,97,116,105, +111,110,83,116,97,116,101,49,0,109,95,105,110,116,101,114,110,97,108,84, +121,112,101,0,109,95,99,104,101,99,107,67,111,108,108,105,100,101,87,105, +116,104,0,109,95,99,111,108,108,105,115,105,111,110,79,98,106,101,99,116, +68,97,116,97,0,109,95,105,110,118,73,110,101,114,116,105,97,84,101,110, +115,111,114,87,111,114,108,100,0,109,95,108,105,110,101,97,114,86,101,108, +111,99,105,116,121,0,109,95,97,110,103,117,108,97,114,86,101,108,111,99, +105,116,121,0,109,95,97,110,103,117,108,97,114,70,97,99,116,111,114,0, +109,95,108,105,110,101,97,114,70,97,99,116,111,114,0,109,95,103,114,97, +118,105,116,121,0,109,95,103,114,97,118,105,116,121,95,97,99,99,101,108, +101,114,97,116,105,111,110,0,109,95,105,110,118,73,110,101,114,116,105,97, +76,111,99,97,108,0,109,95,116,111,116,97,108,70,111,114,99,101,0,109, +95,116,111,116,97,108,84,111,114,113,117,101,0,109,95,105,110,118,101,114, +115,101,77,97,115,115,0,109,95,108,105,110,101,97,114,68,97,109,112,105, +110,103,0,109,95,97,110,103,117,108,97,114,68,97,109,112,105,110,103,0, +109,95,97,100,100,105,116,105,111,110,97,108,68,97,109,112,105,110,103,70, +97,99,116,111,114,0,109,95,97,100,100,105,116,105,111,110,97,108,76,105, +110,101,97,114,68,97,109,112,105,110,103,84,104,114,101,115,104,111,108,100, +83,113,114,0,109,95,97,100,100,105,116,105,111,110,97,108,65,110,103,117, +108,97,114,68,97,109,112,105,110,103,84,104,114,101,115,104,111,108,100,83, +113,114,0,109,95,97,100,100,105,116,105,111,110,97,108,65,110,103,117,108, +97,114,68,97,109,112,105,110,103,70,97,99,116,111,114,0,109,95,108,105, +110,101,97,114,83,108,101,101,112,105,110,103,84,104,114,101,115,104,111,108, +100,0,109,95,97,110,103,117,108,97,114,83,108,101,101,112,105,110,103,84, +104,114,101,115,104,111,108,100,0,109,95,97,100,100,105,116,105,111,110,97, +108,68,97,109,112,105,110,103,0,0,0,0,84,89,80,69,33,0,0,0, +99,104,97,114,0,117,99,104,97,114,0,115,104,111,114,116,0,117,115,104, +111,114,116,0,105,110,116,0,108,111,110,103,0,117,108,111,110,103,0,102, +108,111,97,116,0,100,111,117,98,108,101,0,118,111,105,100,0,80,111,105, +110,116,101,114,65,114,114,97,121,0,98,116,80,104,121,115,105,99,115,83, +121,115,116,101,109,0,76,105,115,116,66,97,115,101,0,98,116,86,101,99, +116,111,114,51,70,108,111,97,116,68,97,116,97,0,98,116,86,101,99,116, +111,114,51,68,111,117,98,108,101,68,97,116,97,0,98,116,77,97,116,114, +105,120,51,120,51,70,108,111,97,116,68,97,116,97,0,98,116,77,97,116, +114,105,120,51,120,51,68,111,117,98,108,101,68,97,116,97,0,98,116,84, +114,97,110,115,102,111,114,109,70,108,111,97,116,68,97,116,97,0,98,116, +84,114,97,110,115,102,111,114,109,68,111,117,98,108,101,68,97,116,97,0, +98,116,67,111,108,108,105,115,105,111,110,83,104,97,112,101,68,97,116,97, +0,98,116,67,111,110,118,101,120,73,110,116,101,114,110,97,108,83,104,97, +112,101,68,97,116,97,0,98,116,80,111,115,105,116,105,111,110,65,110,100, +82,97,100,105,117,115,0,98,116,77,117,108,116,105,83,112,104,101,114,101, +83,104,97,112,101,68,97,116,97,0,98,116,73,110,116,73,110,100,101,120, +68,97,116,97,0,98,116,83,104,111,114,116,73,110,116,73,110,100,101,120, +68,97,116,97,0,98,116,77,101,115,104,80,97,114,116,68,97,116,97,0, +98,116,83,116,114,105,100,105,110,103,77,101,115,104,73,110,116,101,114,102, +97,99,101,68,97,116,97,0,98,116,84,114,105,97,110,103,108,101,77,101, +115,104,83,104,97,112,101,68,97,116,97,0,98,116,67,111,110,118,101,120, +72,117,108,108,83,104,97,112,101,68,97,116,97,0,98,116,67,111,108,108, +105,115,105,111,110,79,98,106,101,99,116,68,111,117,98,108,101,68,97,116, +97,0,98,116,67,111,108,108,105,115,105,111,110,79,98,106,101,99,116,70, +108,111,97,116,68,97,116,97,0,98,116,82,105,103,105,100,66,111,100,121, +70,108,111,97,116,68,97,116,97,0,98,116,82,105,103,105,100,66,111,100, +121,68,111,117,98,108,101,68,97,116,97,0,84,76,69,78,1,0,1,0, +2,0,2,0,4,0,4,0,4,0,4,0,8,0,0,0,16,0,48,0, +16,0,16,0,32,0,48,0,96,0,64,0,-128,0,16,0,56,0,20,0, +72,0,4,0,4,0,40,0,32,0,56,0,80,0,-40,1,8,1,-16,1, +-88,3,0,0,83,84,82,67,23,0,0,0,10,0,3,0,4,0,0,0, +4,0,1,0,9,0,2,0,11,0,3,0,10,0,3,0,10,0,4,0, +10,0,5,0,12,0,2,0,9,0,6,0,9,0,7,0,13,0,1,0, +7,0,8,0,14,0,1,0,8,0,8,0,15,0,1,0,13,0,9,0, +16,0,1,0,14,0,9,0,17,0,2,0,15,0,10,0,13,0,11,0, +18,0,2,0,16,0,10,0,14,0,11,0,19,0,3,0,9,0,12,0, +4,0,13,0,0,0,14,0,20,0,5,0,19,0,15,0,13,0,16,0, +13,0,17,0,7,0,18,0,4,0,19,0,21,0,2,0,13,0,20,0, +7,0,21,0,22,0,4,0,20,0,22,0,21,0,23,0,4,0,24,0, +0,0,14,0,23,0,1,0,4,0,25,0,24,0,2,0,2,0,26,0, +2,0,25,0,25,0,6,0,13,0,27,0,14,0,28,0,23,0,29,0, +24,0,30,0,4,0,31,0,4,0,32,0,26,0,4,0,25,0,33,0, +13,0,34,0,4,0,35,0,0,0,14,0,27,0,4,0,19,0,15,0, +26,0,36,0,7,0,18,0,0,0,14,0,28,0,5,0,20,0,22,0, +13,0,37,0,14,0,38,0,4,0,39,0,0,0,40,0,29,0,24,0, +9,0,41,0,9,0,42,0,19,0,43,0,9,0,44,0,18,0,45,0, +18,0,46,0,14,0,47,0,14,0,48,0,14,0,49,0,8,0,50,0, +8,0,51,0,8,0,52,0,8,0,53,0,8,0,54,0,8,0,55,0, +8,0,56,0,4,0,57,0,4,0,58,0,4,0,59,0,4,0,60,0, +4,0,61,0,4,0,62,0,4,0,63,0,0,0,14,0,30,0,23,0, +9,0,41,0,9,0,42,0,19,0,43,0,9,0,44,0,17,0,45,0, +17,0,46,0,13,0,47,0,13,0,48,0,13,0,49,0,7,0,50,0, +7,0,51,0,7,0,52,0,7,0,53,0,7,0,54,0,7,0,55,0, +7,0,56,0,4,0,57,0,4,0,58,0,4,0,59,0,4,0,60,0, +4,0,61,0,4,0,62,0,4,0,63,0,31,0,21,0,30,0,64,0, +15,0,65,0,13,0,66,0,13,0,67,0,13,0,68,0,13,0,69,0, +13,0,70,0,13,0,71,0,13,0,72,0,13,0,73,0,13,0,74,0, +7,0,75,0,7,0,76,0,7,0,77,0,7,0,78,0,7,0,79,0, +7,0,80,0,7,0,81,0,7,0,82,0,7,0,83,0,4,0,84,0, +32,0,22,0,29,0,64,0,16,0,65,0,14,0,66,0,14,0,67,0, +14,0,68,0,14,0,69,0,14,0,70,0,14,0,71,0,14,0,72,0, +14,0,73,0,14,0,74,0,8,0,75,0,8,0,76,0,8,0,77,0, +8,0,78,0,8,0,79,0,8,0,80,0,8,0,81,0,8,0,82,0, +8,0,83,0,4,0,84,0,0,0,14,0,}; +int sBulletDNAlen64= sizeof(sBulletDNAstr64); + + +unsigned char sBulletDNAstr[]= { +83,68,78,65,78,65,77,69,85,0,0,0,109,95,115,105,122,101,0,109, +95,99,97,112,97,99,105,116,121,0,42,109,95,100,97,116,97,0,109,95, +99,111,108,108,105,115,105,111,110,83,104,97,112,101,115,0,109,95,99,111, +108,108,105,115,105,111,110,79,98,106,101,99,116,115,0,109,95,99,111,110, +115,116,114,97,105,110,116,115,0,42,102,105,114,115,116,0,42,108,97,115, +116,0,109,95,102,108,111,97,116,115,91,52,93,0,109,95,101,108,91,51, +93,0,109,95,98,97,115,105,115,0,109,95,111,114,105,103,105,110,0,42, +109,95,117,115,101,114,80,111,105,110,116,101,114,0,109,95,115,104,97,112, +101,84,121,112,101,0,109,95,112,97,100,100,105,110,103,91,52,93,0,109, +95,99,111,108,108,105,115,105,111,110,83,104,97,112,101,68,97,116,97,0, +109,95,108,111,99,97,108,83,99,97,108,105,110,103,0,109,95,105,109,112, +108,105,99,105,116,83,104,97,112,101,68,105,109,101,110,115,105,111,110,115, +0,109,95,99,111,108,108,105,115,105,111,110,77,97,114,103,105,110,0,109, +95,112,97,100,100,105,110,103,0,109,95,112,111,115,0,109,95,114,97,100, +105,117,115,0,109,95,99,111,110,118,101,120,73,110,116,101,114,110,97,108, +83,104,97,112,101,68,97,116,97,0,42,109,95,108,111,99,97,108,80,111, +115,105,116,105,111,110,65,114,114,97,121,80,116,114,0,109,95,108,111,99, +97,108,80,111,115,105,116,105,111,110,65,114,114,97,121,83,105,122,101,0, +109,95,118,97,108,117,101,0,105,110,116,0,42,109,95,118,101,114,116,105, +99,101,115,51,102,0,42,109,95,118,101,114,116,105,99,101,115,51,100,0, +42,109,95,105,110,100,105,99,101,115,51,50,0,42,109,95,105,110,100,105, +99,101,115,49,54,0,109,95,110,117,109,84,114,105,97,110,103,108,101,115, +0,109,95,110,117,109,86,101,114,116,105,99,101,115,0,42,109,95,109,101, +115,104,80,97,114,116,115,80,116,114,0,109,95,115,99,97,108,105,110,103, +0,109,95,110,117,109,77,101,115,104,80,97,114,116,115,0,109,95,109,101, +115,104,73,110,116,101,114,102,97,99,101,0,42,109,95,117,110,115,99,97, +108,101,100,80,111,105,110,116,115,70,108,111,97,116,80,116,114,0,42,109, +95,117,110,115,99,97,108,101,100,80,111,105,110,116,115,68,111,117,98,108, +101,80,116,114,0,109,95,110,117,109,85,110,115,99,97,108,101,100,80,111, +105,110,116,115,0,109,95,112,97,100,100,105,110,103,51,91,52,93,0,42, +109,95,98,114,111,97,100,112,104,97,115,101,72,97,110,100,108,101,0,42, +109,95,99,111,108,108,105,115,105,111,110,83,104,97,112,101,0,42,109,95, +114,111,111,116,67,111,108,108,105,115,105,111,110,83,104,97,112,101,0,42, +109,95,117,115,101,114,79,98,106,101,99,116,80,111,105,110,116,101,114,0, +109,95,119,111,114,108,100,84,114,97,110,115,102,111,114,109,0,109,95,105, +110,116,101,114,112,111,108,97,116,105,111,110,87,111,114,108,100,84,114,97, +110,115,102,111,114,109,0,109,95,105,110,116,101,114,112,111,108,97,116,105, +111,110,76,105,110,101,97,114,86,101,108,111,99,105,116,121,0,109,95,105, +110,116,101,114,112,111,108,97,116,105,111,110,65,110,103,117,108,97,114,86, +101,108,111,99,105,116,121,0,109,95,97,110,105,115,111,116,114,111,112,105, +99,70,114,105,99,116,105,111,110,0,109,95,99,111,110,116,97,99,116,80, +114,111,99,101,115,115,105,110,103,84,104,114,101,115,104,111,108,100,0,109, +95,100,101,97,99,116,105,118,97,116,105,111,110,84,105,109,101,0,109,95, +102,114,105,99,116,105,111,110,0,109,95,114,101,115,116,105,116,117,116,105, +111,110,0,109,95,104,105,116,70,114,97,99,116,105,111,110,0,109,95,99, +99,100,83,119,101,112,116,83,112,104,101,114,101,82,97,100,105,117,115,0, +109,95,99,99,100,77,111,116,105,111,110,84,104,114,101,115,104,111,108,100, +0,109,95,104,97,115,65,110,105,115,111,116,114,111,112,105,99,70,114,105, +99,116,105,111,110,0,109,95,99,111,108,108,105,115,105,111,110,70,108,97, +103,115,0,109,95,105,115,108,97,110,100,84,97,103,49,0,109,95,99,111, +109,112,97,110,105,111,110,73,100,0,109,95,97,99,116,105,118,97,116,105, +111,110,83,116,97,116,101,49,0,109,95,105,110,116,101,114,110,97,108,84, +121,112,101,0,109,95,99,104,101,99,107,67,111,108,108,105,100,101,87,105, +116,104,0,109,95,99,111,108,108,105,115,105,111,110,79,98,106,101,99,116, +68,97,116,97,0,109,95,105,110,118,73,110,101,114,116,105,97,84,101,110, +115,111,114,87,111,114,108,100,0,109,95,108,105,110,101,97,114,86,101,108, +111,99,105,116,121,0,109,95,97,110,103,117,108,97,114,86,101,108,111,99, +105,116,121,0,109,95,97,110,103,117,108,97,114,70,97,99,116,111,114,0, +109,95,108,105,110,101,97,114,70,97,99,116,111,114,0,109,95,103,114,97, +118,105,116,121,0,109,95,103,114,97,118,105,116,121,95,97,99,99,101,108, +101,114,97,116,105,111,110,0,109,95,105,110,118,73,110,101,114,116,105,97, +76,111,99,97,108,0,109,95,116,111,116,97,108,70,111,114,99,101,0,109, +95,116,111,116,97,108,84,111,114,113,117,101,0,109,95,105,110,118,101,114, +115,101,77,97,115,115,0,109,95,108,105,110,101,97,114,68,97,109,112,105, +110,103,0,109,95,97,110,103,117,108,97,114,68,97,109,112,105,110,103,0, +109,95,97,100,100,105,116,105,111,110,97,108,68,97,109,112,105,110,103,70, +97,99,116,111,114,0,109,95,97,100,100,105,116,105,111,110,97,108,76,105, +110,101,97,114,68,97,109,112,105,110,103,84,104,114,101,115,104,111,108,100, +83,113,114,0,109,95,97,100,100,105,116,105,111,110,97,108,65,110,103,117, +108,97,114,68,97,109,112,105,110,103,84,104,114,101,115,104,111,108,100,83, +113,114,0,109,95,97,100,100,105,116,105,111,110,97,108,65,110,103,117,108, +97,114,68,97,109,112,105,110,103,70,97,99,116,111,114,0,109,95,108,105, +110,101,97,114,83,108,101,101,112,105,110,103,84,104,114,101,115,104,111,108, +100,0,109,95,97,110,103,117,108,97,114,83,108,101,101,112,105,110,103,84, +104,114,101,115,104,111,108,100,0,109,95,97,100,100,105,116,105,111,110,97, +108,68,97,109,112,105,110,103,0,0,0,0,84,89,80,69,33,0,0,0, +99,104,97,114,0,117,99,104,97,114,0,115,104,111,114,116,0,117,115,104, +111,114,116,0,105,110,116,0,108,111,110,103,0,117,108,111,110,103,0,102, +108,111,97,116,0,100,111,117,98,108,101,0,118,111,105,100,0,80,111,105, +110,116,101,114,65,114,114,97,121,0,98,116,80,104,121,115,105,99,115,83, +121,115,116,101,109,0,76,105,115,116,66,97,115,101,0,98,116,86,101,99, +116,111,114,51,70,108,111,97,116,68,97,116,97,0,98,116,86,101,99,116, +111,114,51,68,111,117,98,108,101,68,97,116,97,0,98,116,77,97,116,114, +105,120,51,120,51,70,108,111,97,116,68,97,116,97,0,98,116,77,97,116, +114,105,120,51,120,51,68,111,117,98,108,101,68,97,116,97,0,98,116,84, +114,97,110,115,102,111,114,109,70,108,111,97,116,68,97,116,97,0,98,116, +84,114,97,110,115,102,111,114,109,68,111,117,98,108,101,68,97,116,97,0, +98,116,67,111,108,108,105,115,105,111,110,83,104,97,112,101,68,97,116,97, +0,98,116,67,111,110,118,101,120,73,110,116,101,114,110,97,108,83,104,97, +112,101,68,97,116,97,0,98,116,80,111,115,105,116,105,111,110,65,110,100, +82,97,100,105,117,115,0,98,116,77,117,108,116,105,83,112,104,101,114,101, +83,104,97,112,101,68,97,116,97,0,98,116,73,110,116,73,110,100,101,120, +68,97,116,97,0,98,116,83,104,111,114,116,73,110,116,73,110,100,101,120, +68,97,116,97,0,98,116,77,101,115,104,80,97,114,116,68,97,116,97,0, +98,116,83,116,114,105,100,105,110,103,77,101,115,104,73,110,116,101,114,102, +97,99,101,68,97,116,97,0,98,116,84,114,105,97,110,103,108,101,77,101, +115,104,83,104,97,112,101,68,97,116,97,0,98,116,67,111,110,118,101,120, +72,117,108,108,83,104,97,112,101,68,97,116,97,0,98,116,67,111,108,108, +105,115,105,111,110,79,98,106,101,99,116,68,111,117,98,108,101,68,97,116, +97,0,98,116,67,111,108,108,105,115,105,111,110,79,98,106,101,99,116,70, +108,111,97,116,68,97,116,97,0,98,116,82,105,103,105,100,66,111,100,121, +70,108,111,97,116,68,97,116,97,0,98,116,82,105,103,105,100,66,111,100, +121,68,111,117,98,108,101,68,97,116,97,0,84,76,69,78,1,0,1,0, +2,0,2,0,4,0,4,0,4,0,4,0,8,0,0,0,12,0,36,0, +8,0,16,0,32,0,48,0,96,0,64,0,-128,0,12,0,52,0,20,0, +64,0,4,0,4,0,24,0,28,0,48,0,68,0,-56,1,-8,0,-32,1, +-104,3,0,0,83,84,82,67,23,0,0,0,10,0,3,0,4,0,0,0, +4,0,1,0,9,0,2,0,11,0,3,0,10,0,3,0,10,0,4,0, +10,0,5,0,12,0,2,0,9,0,6,0,9,0,7,0,13,0,1,0, +7,0,8,0,14,0,1,0,8,0,8,0,15,0,1,0,13,0,9,0, +16,0,1,0,14,0,9,0,17,0,2,0,15,0,10,0,13,0,11,0, +18,0,2,0,16,0,10,0,14,0,11,0,19,0,3,0,9,0,12,0, +4,0,13,0,0,0,14,0,20,0,5,0,19,0,15,0,13,0,16,0, +13,0,17,0,7,0,18,0,4,0,19,0,21,0,2,0,13,0,20,0, +7,0,21,0,22,0,4,0,20,0,22,0,21,0,23,0,4,0,24,0, +0,0,14,0,23,0,1,0,4,0,25,0,24,0,2,0,2,0,26,0, +2,0,25,0,25,0,6,0,13,0,27,0,14,0,28,0,23,0,29,0, +24,0,30,0,4,0,31,0,4,0,32,0,26,0,4,0,25,0,33,0, +13,0,34,0,4,0,35,0,0,0,14,0,27,0,4,0,19,0,15,0, +26,0,36,0,7,0,18,0,0,0,14,0,28,0,5,0,20,0,22,0, +13,0,37,0,14,0,38,0,4,0,39,0,0,0,40,0,29,0,24,0, +9,0,41,0,9,0,42,0,19,0,43,0,9,0,44,0,18,0,45,0, +18,0,46,0,14,0,47,0,14,0,48,0,14,0,49,0,8,0,50,0, +8,0,51,0,8,0,52,0,8,0,53,0,8,0,54,0,8,0,55,0, +8,0,56,0,4,0,57,0,4,0,58,0,4,0,59,0,4,0,60,0, +4,0,61,0,4,0,62,0,4,0,63,0,0,0,14,0,30,0,23,0, +9,0,41,0,9,0,42,0,19,0,43,0,9,0,44,0,17,0,45,0, +17,0,46,0,13,0,47,0,13,0,48,0,13,0,49,0,7,0,50,0, +7,0,51,0,7,0,52,0,7,0,53,0,7,0,54,0,7,0,55,0, +7,0,56,0,4,0,57,0,4,0,58,0,4,0,59,0,4,0,60,0, +4,0,61,0,4,0,62,0,4,0,63,0,31,0,21,0,30,0,64,0, +15,0,65,0,13,0,66,0,13,0,67,0,13,0,68,0,13,0,69,0, +13,0,70,0,13,0,71,0,13,0,72,0,13,0,73,0,13,0,74,0, +7,0,75,0,7,0,76,0,7,0,77,0,7,0,78,0,7,0,79,0, +7,0,80,0,7,0,81,0,7,0,82,0,7,0,83,0,4,0,84,0, +32,0,22,0,29,0,64,0,16,0,65,0,14,0,66,0,14,0,67,0, +14,0,68,0,14,0,69,0,14,0,70,0,14,0,71,0,14,0,72,0, +14,0,73,0,14,0,74,0,8,0,75,0,8,0,76,0,8,0,77,0, +8,0,78,0,8,0,79,0,8,0,80,0,8,0,81,0,8,0,82,0, +8,0,83,0,4,0,84,0,0,0,14,0,}; int sBulletDNAlen= sizeof(sBulletDNAstr); diff --git a/src/LinearMath/btSerializer.h b/src/LinearMath/btSerializer.h index 1f73b9019..ded3f3898 100644 --- a/src/LinearMath/btSerializer.h +++ b/src/LinearMath/btSerializer.h @@ -23,9 +23,14 @@ subject to the following restrictions: #include + ///only the 32bit versions for now extern unsigned char sBulletDNAstr[]; extern int sBulletDNAlen; +extern unsigned char sBulletDNAstr64[]; +extern int sBulletDNAlen64; + + class btChunk { @@ -263,12 +268,18 @@ public: if (VOID_IS_8) { - //64bit not yet supported (soon) - btAssert(0); - return; +//#if _WIN64 + initDNA((const char*)sBulletDNAstr64,sBulletDNAlen64); +//#else +// btAssert(0); +//#endif } else { +//#ifndef _WIN64 initDNA((const char*)sBulletDNAstr,sBulletDNAlen); +//#else +// btAssert(0); +//#endif } } @@ -282,28 +293,35 @@ public: { m_currentSize = BT_HEADER_LENGTH; - memcpy(m_buffer, "BULLET ", 7); - int endian= 1; - endian= ((char*)&endian)[0]; +#ifdef BT_USE_DOUBLE_PRECISION + memcpy(m_buffer, "BULLETd", 7); +#else + memcpy(m_buffer, "BULLETf", 7); +#endif //BT_USE_DOUBLE_PRECISION + + int littleEndian= 1; + littleEndian= ((char*)&littleEndian)[0]; - if (endian) - { - m_buffer[7] = '_'; - } else - { - m_buffer[7] = '-'; - } if (sizeof(void*)==8) { - m_buffer[8]='V'; + m_buffer[7] = '-'; } else { - m_buffer[8]='v'; + m_buffer[7] = '_'; } + if (littleEndian) + { + m_buffer[8]='v'; + } else + { + m_buffer[8]='V'; + } + + m_buffer[9] = '2'; m_buffer[10] = '7'; - m_buffer[11] = '5'; + m_buffer[11] = '6'; } @@ -327,6 +345,7 @@ public: virtual void finalizeChunk(btChunk* chunk, const char* structType, int chunkCode,void* oldPtr) const { chunk->m_dna_nr = getReverseType(structType); + chunk->m_chunkCode = chunkCode; chunk->m_oldPtr = oldPtr; } @@ -339,14 +358,14 @@ public: { unsigned char* ptr = m_buffer+m_currentSize; - m_currentSize += size*numElements+sizeof(btChunk); + m_currentSize += int(size)*numElements+sizeof(btChunk); unsigned char* data = ptr + sizeof(btChunk); btChunk* chunk = (btChunk*)ptr; chunk->m_chunkCode = 0; chunk->m_oldPtr = data; - chunk->m_length = size*numElements; + chunk->m_length = int(size)*numElements; chunk->m_number = numElements; m_chunkPtrs.push_back(chunk); diff --git a/src/LinearMath/btTransform.h b/src/LinearMath/btTransform.h index 67e4dd2be..916133f0f 100644 --- a/src/LinearMath/btTransform.h +++ b/src/LinearMath/btTransform.h @@ -20,6 +20,13 @@ subject to the following restrictions: #include "btMatrix3x3.h" +#ifdef BT_USE_DOUBLE_PRECISION +#define btTransformData btTransformDoubleData +#else +#define btTransformData btTransformFloatData +#endif + + /**@brief The btTransform class supports rigid transforms with only translation and rotation and no scaling/shear. @@ -205,6 +212,10 @@ public: void deSerialize(const struct btTransformData& dataIn); + void deSerializeDouble(const struct btTransformDoubleData& dataIn); + + void deSerializeFloat(const struct btTransformFloatData& dataIn); + }; @@ -237,13 +248,22 @@ SIMD_FORCE_INLINE bool operator==(const btTransform& t1, const btTransform& t2) t1.getOrigin() == t2.getOrigin() ); } + ///for serialization -struct btTransformData +struct btTransformFloatData { - btMatrix3x3Data m_basis; - btVector3Data m_origin; + btMatrix3x3FloatData m_basis; + btVector3FloatData m_origin; }; +struct btTransformDoubleData +{ + btMatrix3x3DoubleData m_basis; + btVector3DoubleData m_origin; +}; + + + SIMD_FORCE_INLINE void btTransform::serialize(btTransformData& dataOut) const { m_basis.serialize(dataOut.m_basis); @@ -256,6 +276,19 @@ SIMD_FORCE_INLINE void btTransform::deSerialize(const btTransformData& dataIn) m_origin.deSerialize(dataIn.m_origin); } +SIMD_FORCE_INLINE void btTransform::deSerializeFloat(const btTransformFloatData& dataIn) +{ + m_basis.deSerializeFloat(dataIn.m_basis); + m_origin.deSerializeFloat(dataIn.m_origin); +} + +SIMD_FORCE_INLINE void btTransform::deSerializeDouble(const btTransformDoubleData& dataIn) +{ + m_basis.deSerializeDouble(dataIn.m_basis); + m_origin.deSerializeDouble(dataIn.m_origin); +} + + #endif diff --git a/src/LinearMath/btVector3.h b/src/LinearMath/btVector3.h index c1c40aa22..1e144c9d0 100644 --- a/src/LinearMath/btVector3.h +++ b/src/LinearMath/btVector3.h @@ -21,6 +21,14 @@ subject to the following restrictions: #include "btScalar.h" #include "btMinMax.h" +#ifdef BT_USE_DOUBLE_PRECISION +#define btVector3Data btVector3DoubleData +#define btVector3DataName "btVector3DoubleData" +#else +#define btVector3Data btVector3FloatData +#define btVector3DataName "btVector3FloatData" +#endif //BT_USE_DOUBLE_PRECISION + @@ -330,10 +338,18 @@ public: return length2() < SIMD_EPSILON; } - SIMD_FORCE_INLINE void serialize(struct btVector3Data& dataOut) const; SIMD_FORCE_INLINE void deSerialize(const struct btVector3Data& dataIn); + + SIMD_FORCE_INLINE void serializeFloat(struct btVector3FloatData& dataOut) const; + + SIMD_FORCE_INLINE void deSerializeFloat(const struct btVector3FloatData& dataIn); + + SIMD_FORCE_INLINE void serializeDouble(struct btVector3DoubleData& dataOut) const; + + SIMD_FORCE_INLINE void deSerializeDouble(const struct btVector3DoubleData& dataIn); + }; /**@brief Return the sum of two vectors (Point symantics)*/ @@ -671,10 +687,6 @@ SIMD_FORCE_INLINE void btPlaneSpace1 (const btVector3& n, btVector3& p, btVector } } -struct btVector3Data -{ - btScalar m_floats[4]; -}; struct btVector3FloatData { @@ -684,8 +696,37 @@ struct btVector3FloatData struct btVector3DoubleData { double m_floats[4]; + }; +SIMD_FORCE_INLINE void btVector3::serializeFloat(struct btVector3FloatData& dataOut) const +{ + ///could also do a memcpy, check if it is worth it + for (int i=0;i<4;i++) + dataOut.m_floats[i] = float(m_floats[i]); +} + +SIMD_FORCE_INLINE void btVector3::deSerializeFloat(const struct btVector3FloatData& dataIn) +{ + for (int i=0;i<4;i++) + m_floats[i] = btScalar(dataIn.m_floats[i]); +} + + +SIMD_FORCE_INLINE void btVector3::serializeDouble(struct btVector3DoubleData& dataOut) const +{ + ///could also do a memcpy, check if it is worth it + for (int i=0;i<4;i++) + dataOut.m_floats[i] = double(m_floats[i]); +} + +SIMD_FORCE_INLINE void btVector3::deSerializeDouble(const struct btVector3DoubleData& dataIn) +{ + for (int i=0;i<4;i++) + m_floats[i] = btScalar(dataIn.m_floats[i]); +} + + SIMD_FORCE_INLINE void btVector3::serialize(struct btVector3Data& dataOut) const { ///could also do a memcpy, check if it is worth it