diff --git a/src/BulletDynamics/Dynamics/btRigidBody.cpp b/src/BulletDynamics/Dynamics/btRigidBody.cpp index a4d8e1d77..10637c6e5 100644 --- a/src/BulletDynamics/Dynamics/btRigidBody.cpp +++ b/src/BulletDynamics/Dynamics/btRigidBody.cpp @@ -315,3 +315,39 @@ void btRigidBody::removeConstraintRef(btTypedConstraint* c) m_constraintRefs.remove(c); m_checkCollideWith = m_constraintRefs.size() > 0; } + +int btRigidBody::calculateSerializeBufferSize() const +{ + int sz = sizeof(btRigidBodyData); + return sz; +} + + ///fills the dataBuffer and returns the struct name (and 0 on failure) +const char* btRigidBody::serialize(void* dataBuffer) const +{ + btRigidBodyData* rbd = (btRigidBodyData*) dataBuffer; + m_invInertiaTensorWorld.serialize(rbd->m_invInertiaTensorWorld); + m_linearVelocity.serialize(rbd->m_linearVelocity); + m_angularVelocity.serialize(rbd->m_angularVelocity); + rbd->m_inverseMass = m_inverseMass; + m_angularFactor.serialize(rbd->m_angularFactor); + m_linearFactor.serialize(rbd->m_linearFactor); + m_gravity.serialize(rbd->m_gravity); + m_gravity_acceleration.serialize(rbd->m_gravity_acceleration); + m_invInertiaLocal.serialize(rbd->m_invInertiaLocal); + m_totalForce.serialize(rbd->m_totalForce); + m_totalTorque.serialize(rbd->m_totalTorque); + rbd->m_linearDamping = m_linearDamping; + rbd->m_angularDamping = m_angularDamping; + rbd->m_additionalDamping = m_additionalDamping; + rbd->m_additionalDampingFactor = m_additionalDampingFactor; + rbd->m_additionalLinearDampingThresholdSqr = m_additionalLinearDampingThresholdSqr; + rbd->m_additionalAngularDampingThresholdSqr = m_additionalAngularDampingThresholdSqr; + rbd->m_additionalAngularDampingFactor = m_additionalAngularDampingFactor; + rbd->m_linearSleepingThreshold=m_linearSleepingThreshold; + rbd->m_angularSleepingThreshold = m_angularSleepingThreshold; + + btCollisionObject::serialize(&rbd->m_collisionObjectData); + + return "btRigidBodyData"; +} \ No newline at end of file diff --git a/src/BulletDynamics/Dynamics/btRigidBody.h b/src/BulletDynamics/Dynamics/btRigidBody.h index da1fcb786..3b05e2096 100644 --- a/src/BulletDynamics/Dynamics/btRigidBody.h +++ b/src/BulletDynamics/Dynamics/btRigidBody.h @@ -75,7 +75,6 @@ class btRigidBody : public btCollisionObject public: - ///The btRigidBodyConstructionInfo structure provides information to create a rigid body. Setting mass to zero creates a fixed (non-dynamic) rigid body. ///For dynamic objects, you can use the collision shape to approximate the local inertia tensor, otherwise use the zero vector (default argument) ///You can use the motion state to synchronize the world transform between physics and graphics objects. @@ -495,6 +494,46 @@ public: } int m_debugBodyId; + + virtual int calculateSerializeBufferSize() const; + + ///fills the dataBuffer and returns the struct name (and 0 on failure) + virtual const char* serialize(void* dataBuffer) const; + +}; + +//@todo add m_optionalMotionState and m_constraintRefs to btRigidBodyData +///btRigidBodyData is used for btRigidBody serialization +struct btRigidBodyData +{ + 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; + + btCollisionObjectData m_collisionObjectData; + };