void dgWorld::SerializeJointArray (dgBody** const bodyArray, dgInt32 bodyCount, dgSerialize serializeCallback, void* const userData) const { dgInt32 count = 0; const dgBodyMasterList* me = this; for (dgBodyMasterList::dgListNode* node = me->GetFirst(); node; node = node->GetNext()) { const dgBodyMasterListRow& info = node->GetInfo(); for (dgBodyMasterListRow::dgListNode *jointNode = info.GetFirst(); jointNode; jointNode = jointNode->GetNext()) { const dgBodyMasterListCell& cell = jointNode->GetInfo(); dgConstraint* const joint = cell.m_joint; count += joint->IsBilateral() ? 1 : 0; } } dgTree<int, dgBody*> bodyMap (GetAllocator()); for (dgInt32 i = 0; i < bodyCount; i ++) { bodyMap.Insert (i, bodyArray[i]); } count /= 2; dgSerializeMarker (serializeCallback, userData); serializeCallback(userData, &count, sizeof (count)); dgTree<int, dgConstraint*> map (GetAllocator()); for (dgBodyMasterList::dgListNode* node = me->GetFirst(); node; node = node->GetNext()) { dgBodyMasterListRow& info = node->GetInfo(); for (dgBodyMasterListRow::dgListNode *jointNode = info.GetFirst(); jointNode; jointNode = jointNode->GetNext()) { const dgBodyMasterListCell& cell = jointNode->GetInfo(); dgConstraint* const joint = cell.m_joint; if (joint->IsBilateral()) { if (!map.Find(joint)) { map.Insert (0, joint); dgInt32 body0; dgInt32 body1; dgAssert (joint->GetBody0()); dgAssert (joint->GetBody1()); body0 = (joint->GetBody0() != m_sentinelBody) ? bodyMap.Find (joint->GetBody0())->GetInfo() : -1; body1 = (joint->GetBody1() != m_sentinelBody) ? bodyMap.Find (joint->GetBody1())->GetInfo() : -1; serializeCallback(userData, &body0, sizeof (body0)); serializeCallback(userData, &body1, sizeof (body1)); dgBilateralConstraint* const bilateralJoint = (dgBilateralConstraint*) joint; bilateralJoint->Serialize (serializeCallback, userData); dgSerializeMarker(serializeCallback, userData); } } } } dgSerializeMarker(serializeCallback, userData); }
void dgCollisionInstance::Serialize(dgSerialize serialize, void* const userData, bool saveShape) const { dgInt32 save = saveShape ? 1 : 0; dgInt32 primitiveType = m_childShape->GetCollisionPrimityType(); dgInt32 signature = m_childShape->GetSignature(); dgInt32 scaleType = m_scaleType; serialize (userData, &m_globalMatrix, sizeof (m_globalMatrix)); serialize (userData, &m_localMatrix, sizeof (m_localMatrix)); serialize (userData, &m_aligmentMatrix, sizeof (m_aligmentMatrix)); serialize (userData, &m_scale, sizeof (m_scale)); serialize (userData, &m_invScale, sizeof (m_invScale)); serialize (userData, &m_maxScale, sizeof (m_maxScale)); serialize (userData, &m_skinThickness, sizeof (m_skinThickness)); serialize (userData, &m_material, sizeof (m_material)); serialize (userData, &m_collisionMode, sizeof (m_collisionMode)); serialize (userData, &scaleType, sizeof (scaleType)); serialize (userData, &primitiveType, sizeof (primitiveType)); serialize (userData, &signature, sizeof (signature)); serialize (userData, &save, sizeof (save)); if (saveShape) { m_childShape->Serialize(serialize, userData); } dgSerializeMarker(serialize, userData); }
void dgWorld::SerializeBodyArray(void* const userData, OnBodySerialize bodyCallback, dgBody** const array, dgInt32 count, dgSerialize serializeCallback, void* const fileHandle) const { dgSerializeMarker(serializeCallback, fileHandle); // serialize all collisions dgInt32 uniqueShapes = 0; dgTree<dgInt32, const dgCollision*> shapeMap(GetAllocator()); for (dgInt32 i = 0; i < count; i++) { dgBody* const body = array[i]; dgAssert(body->m_world == this); dgCollisionInstance* const instance = body->GetCollision(); const dgCollision* const collision = instance->GetChildShape(); dgTree<dgInt32, const dgCollision*>::dgTreeNode* const shapeNode = shapeMap.Insert(uniqueShapes, collision); if (shapeNode) { uniqueShapes++; } } serializeCallback(fileHandle, &uniqueShapes, sizeof (uniqueShapes)); dgTree<dgInt32, const dgCollision*>::Iterator iter(shapeMap); for (iter.Begin(); iter; iter++) { dgInt32 id = iter.GetNode()->GetInfo(); const dgCollision* const collision = iter.GetKey(); dgCollisionInstance instance(this, collision, 0, dgMatrix(dgGetIdentityMatrix())); serializeCallback(fileHandle, &id, sizeof (id)); instance.Serialize(serializeCallback, fileHandle); dgSerializeMarker(serializeCallback, fileHandle); } serializeCallback(fileHandle, &count, sizeof (count)); for (dgInt32 i = 0; i < count; i++) { dgBody* const body = array[i]; dgInt32 bodyType = body->GetType(); serializeCallback(fileHandle, &bodyType, sizeof (bodyType)); // serialize the body body->Serialize(shapeMap, serializeCallback, fileHandle); // serialize body custom data bodyCallback(*body, userData, serializeCallback, fileHandle); dgSerializeMarker(serializeCallback, fileHandle); } }