dgCollision::dgCollision (dgWorld* const world, dgDeserialize deserialization, void* const userData) { dgInt32 signature[4]; deserialization (userData, &signature, sizeof (signature)); deserialization (userData, &m_offset, sizeof (dgMatrix)); m_rtti = 0; m_refCount = 1; m_signature = dgUnsigned32 (signature[0]); m_userDataID = dgUnsigned32 (signature[2]); m_allocator = world->GetAllocator(); m_collsionId = dgCollisionID (signature[1]); }
dgCollisionInstance::dgCollisionInstance(const dgWorld* const constWorld, dgDeserialize serialize, void* const userData, dgInt32 revisionNumber) :m_globalMatrix(dgGetIdentityMatrix()) ,m_localMatrix (dgGetIdentityMatrix()) ,m_aligmentMatrix (dgGetIdentityMatrix()) ,m_scale(dgFloat32 (1.0f), dgFloat32 (1.0f), dgFloat32 (1.0f), dgFloat32 (0.0f)) ,m_invScale(dgFloat32 (1.0f), dgFloat32 (1.0f), dgFloat32 (1.0f), dgFloat32 (0.0f)) ,m_maxScale(dgFloat32 (1.0f), dgFloat32 (1.0f), dgFloat32 (1.0f), dgFloat32 (0.0f)) ,m_material() ,m_world(constWorld) ,m_childShape (NULL) ,m_subCollisionHandle(NULL) ,m_parent(NULL) ,m_skinThickness(dgFloat32 (0.0f)) ,m_collisionMode(1) ,m_refCount(1) ,m_scaleType(m_unit) { dgInt32 saved; dgInt32 signature; dgInt32 primitive; dgInt32 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, &primitive, sizeof (primitive)); serialize (userData, &signature, sizeof (signature)); serialize (userData, &saved, sizeof (saved)); m_scaleType = dgScaleType(scaleType); dgWorld* const world = (dgWorld*) constWorld; if (saved) { const dgCollision* collision = NULL; dgBodyCollisionList::dgTreeNode* node = world->dgBodyCollisionList::Find (dgUnsigned32 (signature)); if (node) { collision = node->GetInfo(); collision->AddRef(); } else { dgCollisionID primitiveType = dgCollisionID(primitive); dgMemoryAllocator* const allocator = world->GetAllocator(); switch (primitiveType) { case m_heightField: { collision = new (allocator) dgCollisionHeightField (world, serialize, userData, revisionNumber); break; } case m_boundingBoxHierachy: { collision = new (allocator) dgCollisionBVH (world, serialize, userData, revisionNumber); break; } case m_compoundCollision: { collision = new (allocator) dgCollisionCompound (world, serialize, userData, this, revisionNumber); break; } case m_compoundFracturedCollision: { collision = new (allocator) dgCollisionCompoundFractured (world, serialize, userData, this, revisionNumber); break; } case m_sceneCollision: { collision = new (allocator) dgCollisionScene (world, serialize, userData, this, revisionNumber); break; } case m_sphereCollision: { collision = new (allocator) dgCollisionSphere (world, serialize, userData, revisionNumber); node = world->dgBodyCollisionList::Insert (collision, collision->GetSignature()); collision->AddRef(); break; } case m_boxCollision: { collision = new (allocator) dgCollisionBox (world, serialize, userData, revisionNumber); node = world->dgBodyCollisionList::Insert (collision, collision->GetSignature()); collision->AddRef(); break; } case m_coneCollision: { collision = new (allocator) dgCollisionCone (world, serialize, userData, revisionNumber); node = world->dgBodyCollisionList::Insert (collision, collision->GetSignature()); collision->AddRef(); break; } case m_capsuleCollision: { collision = new (allocator) dgCollisionCapsule (world, serialize, userData, revisionNumber); node = world->dgBodyCollisionList::Insert (collision, collision->GetSignature()); collision->AddRef(); break; } case m_cylinderCollision: { collision = new (allocator) dgCollisionCylinder (world, serialize, userData, revisionNumber); node = world->dgBodyCollisionList::Insert (collision, collision->GetSignature()); collision->AddRef(); break; } case m_chamferCylinderCollision: { collision = new (allocator) dgCollisionChamferCylinder (world, serialize, userData, revisionNumber); node = world->dgBodyCollisionList::Insert (collision, collision->GetSignature()); collision->AddRef(); break; } case m_convexHullCollision: { collision = new (allocator) dgCollisionConvexHull (world, serialize, userData, revisionNumber); node = world->dgBodyCollisionList::Insert (collision, collision->GetSignature()); collision->AddRef(); break; } case m_nullCollision: { collision = new (allocator) dgCollisionNull (world, serialize, userData, revisionNumber); node = world->dgBodyCollisionList::Insert (collision, collision->GetSignature()); collision->AddRef(); break; } // case m_deformableMesh: // { // dgAssert (0); // return NULL; // } default: dgAssert (0); } } m_childShape = collision; } dgDeserializeMarker (serialize, userData); }