worked a bit more on the serialization, and added a preliminary SerializeDemo.

This commit is contained in:
erwin.coumans
2010-01-21 00:17:18 +00:00
parent 901ff7a4f8
commit 6af9f9434f
28 changed files with 3364 additions and 40 deletions

View File

@@ -43,7 +43,7 @@ subject to the following restrictions:
#include "LinearMath/btQuickprof.h"
#include "LinearMath/btMotionState.h"
#include "LinearMath/btSerializer.h"
@@ -1078,3 +1078,47 @@ const btTypedConstraint* btDiscreteDynamicsWorld::getConstraint(int index) const
}
void btDiscreteDynamicsWorld::serializeRigidBodies(btDefaultSerializer* serializer)
{
int i;
//serialize all collision objects
for (i=0;i<m_collisionObjects.size();i++)
{
btCollisionObject* colObj = m_collisionObjects[i];
if (colObj->getInternalType() == btCollisionObject::CO_RIGID_BODY)
{
int len = colObj->calculateSerializeBufferSize();
btChunk* chunk = serializer->allocate(len,1);
const char* structType = colObj->serialize(chunk->m_oldPtr);
chunk->m_dna_nr = serializer->getReverseType(structType);
chunk->m_chunkCode = BT_RIGIDBODY_CODE;
chunk->m_oldPtr = colObj;
}
}
}
void btDiscreteDynamicsWorld::serialize(btDefaultSerializer* serializer)
{
const bool VOID_IS_8 = ((sizeof(void*)==8));
if (VOID_IS_8)
{
//64bit not yet supported (soon)
btAssert(0);
return;
} else
{
serializer->initDNA((const char*)sBulletDNAstr,sBulletDNAlen);
}
serializeRigidBodies(serializer);
serializeCollisionObjects(serializer);
serializer->writeDNA();
}

View File

@@ -77,7 +77,7 @@ protected:
virtual void saveKinematicState(btScalar timeStep);
void serializeRigidBodies(btDefaultSerializer* serializer);
public:
@@ -190,6 +190,9 @@ public:
return m_synchronizeAllMotionStates;
}
///Preliminary serialization test for Bullet 2.76. Loading those files requires a separate parser (see Bullet/Demos/SerializeDemo)
virtual void serialize(btDefaultSerializer* serializer);
};
#endif //BT_DISCRETE_DYNAMICS_WORLD_H

View File

@@ -326,6 +326,9 @@ int btRigidBody::calculateSerializeBufferSize() const
const char* btRigidBody::serialize(void* dataBuffer) const
{
btRigidBodyData* rbd = (btRigidBodyData*) dataBuffer;
btCollisionObject::serialize(&rbd->m_collisionObjectData);
m_invInertiaTensorWorld.serialize(rbd->m_invInertiaTensorWorld);
m_linearVelocity.serialize(rbd->m_linearVelocity);
m_angularVelocity.serialize(rbd->m_angularVelocity);
@@ -347,8 +350,6 @@ const char* btRigidBody::serialize(void* dataBuffer) const
rbd->m_linearSleepingThreshold=m_linearSleepingThreshold;
rbd->m_angularSleepingThreshold = m_angularSleepingThreshold;
btCollisionObject::serialize(&rbd->m_collisionObjectData);
return "btRigidBodyData";
}

View File

@@ -506,6 +506,8 @@ public:
///btRigidBodyData is used for btRigidBody serialization
struct btRigidBodyData
{
btCollisionObjectData m_collisionObjectData;
btMatrix3x3Data m_invInertiaTensorWorld;
btVector3Data m_linearVelocity;
btVector3Data m_angularVelocity;
@@ -531,8 +533,6 @@ struct btRigidBodyData
btScalar m_linearSleepingThreshold;
btScalar m_angularSleepingThreshold;
btCollisionObjectData m_collisionObjectData;
};