diff --git a/src/BulletCollision/CollisionShapes/btBvhTriangleMeshShape.h b/src/BulletCollision/CollisionShapes/btBvhTriangleMeshShape.h index 8458a7ebc..e9aceccec 100644 --- a/src/BulletCollision/CollisionShapes/btBvhTriangleMeshShape.h +++ b/src/BulletCollision/CollisionShapes/btBvhTriangleMeshShape.h @@ -80,7 +80,33 @@ public: { return m_useQuantizedAabbCompression; } + + //virtual int calculateSerializeBufferSize(); + + ///fills the dataBuffer and returns the struct name (and 0 on failure) + //virtual const char* serialize(void* dataBuffer, btSerializer* serializer) const; + + +}; + +#if 0 +struct btBvhTriangleMeshShapeData +{ + + btTriangleMeshShapeData m_trimeshData; + + //btOptimizedBvhData m_bvh; + + char m_useQuantizedAabbCompression; + char m_ownsBvh; + +}; + +SIMD_FORCE_INLINE int btBvhTriangleMeshShape::calculateSerializeBufferSize() +{ + return sizeof(btBvhTriangleMeshShapeData); } -; + +#endif #endif //BVH_TRIANGLE_MESH_SHAPE_H diff --git a/src/BulletCollision/CollisionShapes/btStridingMeshInterface.cpp b/src/BulletCollision/CollisionShapes/btStridingMeshInterface.cpp index 34389f7c5..8e0bef07b 100644 --- a/src/BulletCollision/CollisionShapes/btStridingMeshInterface.cpp +++ b/src/BulletCollision/CollisionShapes/btStridingMeshInterface.cpp @@ -14,6 +14,7 @@ subject to the following restrictions: */ #include "btStridingMeshInterface.h" +#include "LinearMath/btSerializer.h" btStridingMeshInterface::~btStridingMeshInterface() { @@ -179,3 +180,141 @@ void btStridingMeshInterface::calculateAabbBruteForce(btVector3& aabbMin,btVecto aabbMin = aabbCallback.m_aabbMin; aabbMax = aabbCallback.m_aabbMax; } + + + +///fills the dataBuffer and returns the struct name (and 0 on failure) +const char* btStridingMeshInterface::serialize(void* dataBuffer, btSerializer* serializer) const +{ + btStridingMeshInterfaceData* trimeshData = (btStridingMeshInterfaceData*) dataBuffer; + + trimeshData->m_numMeshParts = getNumSubParts(); + + void* uniquePtr = 0; + + trimeshData->m_meshPartsPtr = trimeshData->m_numMeshParts ? (btMeshPartData*) uniquePtr : 0; + + if (trimeshData->m_numMeshParts) + { + btChunk* chunk = serializer->allocate(sizeof(btMeshPartData),trimeshData->m_numMeshParts); + btMeshPartData* memPtr = (btMeshPartData*)chunk->m_oldPtr; + + + + int numtotalphysicsverts = 0; + int part,graphicssubparts = getNumSubParts(); + const unsigned char * vertexbase; + const unsigned char * indexbase; + int indexstride; + PHY_ScalarType type; + PHY_ScalarType gfxindextype; + int stride,numverts,numtriangles; + int gfxindex; + btVector3 triangle[3]; + + btVector3 meshScaling = getScaling(); + + ///if the number of parts is big, the performance might drop due to the innerloop switch on indextype + for (part=0;partm_numTriangles = numtriangles;//indices = 3*numtriangles + memPtr->m_numVertices = numverts; + + switch (type) + { + case PHY_FLOAT: + { + float* graphicsbase; + switch (gfxindextype) + { + case PHY_INTEGER: + { + for (gfxindex=0;gfxindexfinalizeChunk(chunk,"btMeshPartData",BT_ARRAY_CODE,uniquePtr); + } + + + m_scaling.serialize(trimeshData->m_scaling); + return "btStridingMeshInterfaceData"; +} diff --git a/src/BulletCollision/CollisionShapes/btStridingMeshInterface.h b/src/BulletCollision/CollisionShapes/btStridingMeshInterface.h index 09641cf53..164a5c362 100644 --- a/src/BulletCollision/CollisionShapes/btStridingMeshInterface.h +++ b/src/BulletCollision/CollisionShapes/btStridingMeshInterface.h @@ -89,8 +89,43 @@ class btStridingMeshInterface m_scaling = scaling; } - + virtual int calculateSerializeBufferSize(); + + ///fills the dataBuffer and returns the struct name (and 0 on failure) + virtual const char* serialize(void* dataBuffer, btSerializer* serializer) const; + }; +struct btIntIndexData +{ + int m_value; +}; + +struct btMeshPartData +{ + btVector3Data *m_vertices; + btIntIndexData *m_indices; + int m_numTriangles; + int m_numVertices; +}; + +struct btStridingMeshInterfaceData +{ + btMeshPartData *m_meshPartsPtr; + + int m_numMeshParts; + + btVector3Data m_scaling; + +}; + + +SIMD_FORCE_INLINE int btStridingMeshInterface::calculateSerializeBufferSize() +{ + return sizeof(btStridingMeshInterfaceData); +} + + + #endif //STRIDING_MESHINTERFACE_H diff --git a/src/BulletCollision/CollisionShapes/btTriangleMeshShape.cpp b/src/BulletCollision/CollisionShapes/btTriangleMeshShape.cpp index 774fd4e76..892f85afb 100644 --- a/src/BulletCollision/CollisionShapes/btTriangleMeshShape.cpp +++ b/src/BulletCollision/CollisionShapes/btTriangleMeshShape.cpp @@ -207,3 +207,18 @@ btVector3 btTriangleMeshShape::localGetSupportingVertex(const btVector3& vec) co return supportVertex; } + + +///fills the dataBuffer and returns the struct name (and 0 on failure) +const char* btTriangleMeshShape::serialize(void* dataBuffer, btSerializer* serializer) const +{ + btTriangleMeshShapeData* trimeshData = (btTriangleMeshShapeData*) dataBuffer; + + btCollisionShape::serialize(&trimeshData->m_collisionShapeData,serializer); + + m_meshInterface->serialize(&trimeshData->m_meshInterface, serializer); + + trimeshData->m_collisionMargin = m_collisionMargin; + + return "btTriangleMeshShapeData"; +} diff --git a/src/BulletCollision/CollisionShapes/btTriangleMeshShape.h b/src/BulletCollision/CollisionShapes/btTriangleMeshShape.h index 4bb14841f..cd81057fa 100644 --- a/src/BulletCollision/CollisionShapes/btTriangleMeshShape.h +++ b/src/BulletCollision/CollisionShapes/btTriangleMeshShape.h @@ -79,7 +79,30 @@ public: //debugging virtual const char* getName()const {return "TRIANGLEMESH";} + virtual int calculateSerializeBufferSize(); + + ///fills the dataBuffer and returns the struct name (and 0 on failure) + virtual const char* serialize(void* dataBuffer, btSerializer* serializer) const; + }; + +struct btTriangleMeshShapeData +{ + //btConcaveShapeData m_concaveShapeData; + btCollisionShapeData m_collisionShapeData; + + btStridingMeshInterfaceData m_meshInterface; + + btScalar m_collisionMargin; +}; + +SIMD_FORCE_INLINE int btTriangleMeshShape::calculateSerializeBufferSize() +{ + return sizeof(btTriangleMeshShapeData); +} + + + #endif //TRIANGLE_MESH_SHAPE_H