serialize btGeneric6DofSpringConstraint

serialize btSoftBody::Joint
See also Issue 456
This commit is contained in:
erwin.coumans
2010-12-16 02:35:44 +00:00
parent b52eced793
commit dd7ee6919e
12 changed files with 617 additions and 359 deletions

View File

@@ -3353,6 +3353,98 @@ const char* btSoftBody::serialize(void* dataBuffer, class btSerializer* serializ
}
sbd->m_numJoints = m_joints.size();
sbd->m_joints = m_joints.size()? (btSoftBodyJointData*) serializer->getUniquePointer((void*)&m_joints[0]) : 0;
if (sbd->m_joints)
{
int sz = sizeof(btSoftBodyJointData);
int numElem = m_joints.size();
btChunk* chunk = serializer->allocate(sz,numElem);
btSoftBodyJointData* memPtr = (btSoftBodyJointData*)chunk->m_oldPtr;
for (int i=0;i<numElem;i++,memPtr++)
{
memPtr->m_jointType = (int)m_joints[i]->Type();
m_joints[i]->m_massmatrix.serializeFloat(memPtr->m_massmatrix);
m_joints[i]->m_refs[0].serializeFloat(memPtr->m_refs[0]);
m_joints[i]->m_refs[1].serializeFloat(memPtr->m_refs[1]);
m_joints[i]->m_drift.serializeFloat(memPtr->m_drift);
m_joints[i]->m_sdrift.serializeFloat(memPtr->m_sdrift);
memPtr->m_cfm = m_joints[i]->m_cfm;
memPtr->m_erp = m_joints[i]->m_erp;
memPtr->m_split = m_joints[i]->m_split;
memPtr->m_delete = m_joints[i]->m_delete;
for (int j=0;j<4;j++)
{
memPtr->m_relPosition[0].m_floats[j] = 0.f;
memPtr->m_relPosition[1].m_floats[j] = 0.f;
memPtr->m_axis[0].m_floats[j] = 0.f;
memPtr->m_axis[1].m_floats[j] = 0.f;
}
memPtr->m_bodyA = 0;
memPtr->m_bodyB = 0;
if (m_joints[i]->m_bodies[0].m_soft)
{
memPtr->m_bodyAtype = BT_JOINT_SOFT_BODY_CLUSTER;
memPtr->m_bodyA = serializer->getUniquePointer((void*)m_joints[i]->m_bodies[0].m_soft);
}
if (m_joints[i]->m_bodies[0].m_collisionObject)
{
memPtr->m_bodyAtype = BT_JOINT_COLLISION_OBJECT;
memPtr->m_bodyA = serializer->getUniquePointer((void*)m_joints[i]->m_bodies[0].m_collisionObject);
}
if (m_joints[i]->m_bodies[0].m_rigid)
{
memPtr->m_bodyAtype = BT_JOINT_RIGID_BODY;
memPtr->m_bodyA = serializer->getUniquePointer((void*)m_joints[i]->m_bodies[0].m_rigid);
}
if (m_joints[i]->m_bodies[1].m_soft)
{
memPtr->m_bodyBtype = BT_JOINT_SOFT_BODY_CLUSTER;
memPtr->m_bodyB = serializer->getUniquePointer((void*)m_joints[i]->m_bodies[1].m_soft);
}
if (m_joints[i]->m_bodies[1].m_collisionObject)
{
memPtr->m_bodyBtype = BT_JOINT_COLLISION_OBJECT;
memPtr->m_bodyB = serializer->getUniquePointer((void*)m_joints[i]->m_bodies[1].m_collisionObject);
}
if (m_joints[i]->m_bodies[1].m_rigid)
{
memPtr->m_bodyBtype = BT_JOINT_RIGID_BODY;
memPtr->m_bodyB = serializer->getUniquePointer((void*)m_joints[i]->m_bodies[1].m_rigid);
}
switch (m_joints[i]->Type())
{
case btSoftBody::Joint::eType::Linear:
{
btSoftBody::LJoint* lj = (btSoftBody::LJoint*)m_joints[i];
lj->m_rpos[0].serializeFloat(memPtr->m_relPosition[0]);
lj->m_rpos[1].serializeFloat(memPtr->m_relPosition[1]);
break;
}
case btSoftBody::Joint::eType::Angular:
{
btSoftBody::AJoint* aj = (btSoftBody::AJoint*) m_joints[i];
aj->m_axis[0].serializeFloat(memPtr->m_axis[0]);
aj->m_axis[1].serializeFloat(memPtr->m_axis[1]);
break;
}
default:
{
}
};
}
serializer->finalizeChunk(chunk,"btSoftBodyJointData",BT_ARRAY_CODE,(void*) &m_joints[0]);
}
return btSoftBodyDataName;
}

View File

@@ -470,7 +470,7 @@ public:
struct Joint
{
struct eType { enum _ {
Linear,
Linear=0,
Angular,
Contact
};};

View File

@@ -163,6 +163,34 @@ struct SoftBodyClusterData
int m_clusterIndex;
};
enum btSoftJointBodyType
{
BT_JOINT_SOFT_BODY_CLUSTER=1,
BT_JOINT_RIGID_BODY,
BT_JOINT_COLLISION_OBJECT
};
struct btSoftBodyJointData
{
btMatrix3x3FloatData m_massmatrix;
void *m_bodyA;
void *m_bodyB;
btVector3FloatData m_refs[2];
btVector3FloatData m_drift;
btVector3FloatData m_sdrift;
float m_cfm;
float m_erp;
float m_split;
int m_delete;
btVector3FloatData m_relPosition[2];//linear
btVector3FloatData m_axis[2];//angular
int m_bodyAtype;
int m_bodyBtype;
int m_jointType;
int m_pad;
};
///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64
struct btSoftBodyFloatData
{
@@ -176,6 +204,7 @@ struct btSoftBodyFloatData
SoftBodyTetraData *m_tetrahedra;
SoftRigidAnchorData *m_anchors;
SoftBodyClusterData *m_clusters;
btSoftBodyJointData *m_joints;
int m_numMaterials;
int m_numNodes;
@@ -184,9 +213,8 @@ struct btSoftBodyFloatData
int m_numTetrahedra;
int m_numAnchors;
int m_numClusters;
int m_pad;
SoftBodyConfigData m_config;
int m_numJoints;
SoftBodyConfigData m_config;
};
#endif //BT_SOFTBODY_FLOAT_DATA