dgCollisionScene::dgCollisionScene(dgWorld* const world, dgDeserialize deserialization, void* const userData) : dgCollision(world, deserialization, userData), m_lock(0), m_list( world->GetAllocator()), m_fitnessList(world->GetAllocator()) { dgInt32 data[4]; m_world = world; m_rtti |= dgCollisionScene_RTTI; deserialization(userData, &data, sizeof(data)); for (dgInt32 i = 0; i < data[0]; i++) { dgMatrix matrix; void* data; deserialization(userData, &matrix, sizeof(dgMatrix)); deserialization(userData, &data, sizeof(void*)); dgCollision* const collision = m_world->CreateFromSerialization( deserialization, userData); dgList<dgProxy*>::dgListNode* const proxyNode = (dgList<dgProxy*>::dgListNode*) AddProxy(collision, matrix); dgProxy* const proxy = proxyNode->GetInfo(); proxy->m_userData = data; collision->Release(); } ImproveTotalFitness(); }
dgCollisionDeformableMesh::dgCollisionDeformableMesh(dgWorld* const world, dgMeshEffect* const mesh, dgCollisionID collsionID) :dgCollisionConvex (mesh->GetAllocator(), 0, collsionID) ,m_particles (mesh->GetVertexCount ()) ,m_visualSegments(mesh->GetAllocator()) ,m_skinThickness(DG_DEFORMABLE_DEFAULT_SKIN_THICKNESS) ,m_nodesCount(0) ,m_trianglesCount(0) ,m_visualVertexCount(0) ,m_world (world) ,m_myBody(NULL) ,m_indexList(NULL) ,m_faceNormals(NULL) ,m_rootNode(NULL) ,m_nodesMemory(NULL) ,m_visualVertexData(NULL) ,m_onDebugDisplay(NULL) ,m_isdoubleSided(false) { m_rtti |= dgCollisionDeformableMesh_RTTI; dgDeformableBodiesUpdate& softBodyList = *m_world; softBodyList.AddShape (this); dgMeshEffect meshCopy (*mesh); meshCopy.Triangulate(); m_trianglesCount = meshCopy.GetTotalFaceCount (); m_nodesMemory = (dgDeformableNode*) dgMallocStack((m_trianglesCount * 2 - 1) * sizeof (dgDeformableNode)); m_indexList = (dgInt32*) dgMallocStack (3 * m_trianglesCount * sizeof (dgInt32)); m_faceNormals = (dgVector*) dgMallocStack (m_trianglesCount * sizeof (dgVector)); dgInt32 stride = meshCopy.GetVertexStrideInByte() / sizeof (dgFloat64); dgFloat64* const vertex = meshCopy.GetVertexPool(); for (dgInt32 i = 0; i < m_particles.m_count; i ++) { m_particles.m_unitMass[i] = dgFloat32 (1.0f); m_particles.m_veloc[i] = dgVector (dgFloat32 (0.0f)); m_particles.m_posit[i] = dgVector (&vertex[i * stride]) & dgVector::m_triplexMask; } dgInt32 indexCount = meshCopy.GetTotalIndexCount (); dgStack<dgInt32> faceArray (m_trianglesCount); dgStack<dgInt32> materials (m_trianglesCount); dgStack<void*>indexArray (indexCount); meshCopy.GetFaces (&faceArray[0], &materials[0], &indexArray[0]); for (dgInt32 i = 0; i < m_trianglesCount; i ++) { dgInt32 count = faceArray[i]; dgAssert (faceArray[i]); for (dgInt32 j = 0; j < count; j ++) { dgInt32 k = meshCopy.GetVertexIndex(indexArray[i * 3 + j]); m_indexList[i * 3 + j] = k; } //dgTrace (("%d %d %d\n", m_indexList[i * 3 + 0], m_indexList[i * 3 + 1], m_indexList[i * 3 + 2])); dgDeformableNode& node = m_nodesMemory[i]; node.m_left = NULL; node.m_right = NULL; node.m_parent = NULL; node.m_indexStart = i * 3; node.CalculateBox(m_particles.m_posit, &m_indexList[i * 3]); } m_nodesCount = m_trianglesCount; m_rootNode = BuildTopDown (m_nodesCount, m_nodesMemory, NULL); ImproveTotalFitness(); SetCollisionBBox (m_rootNode->m_minBox, m_rootNode->m_maxBox); // create visual vertex data m_visualVertexCount = meshCopy.GetPropertiesCount(); m_visualVertexData = (dgVisualVertexData*) dgMallocStack(m_visualVertexCount * sizeof (dgVisualVertexData)); for (dgInt32 i = 0; i < m_visualVertexCount; i ++) { dgMeshEffect::dgVertexAtribute& attribute = meshCopy.GetAttribute (i); m_visualVertexData[i].m_uv0[0] = dgFloat32 (attribute.m_u0); m_visualVertexData[i].m_uv0[1] = dgFloat32 (attribute.m_v0); } for (void* point = meshCopy.GetFirstPoint(); point; point = meshCopy.GetNextPoint(point)) { dgInt32 pointIndex = meshCopy.GetPointIndex (point); dgInt32 vertexIndex = meshCopy.GetVertexIndexFromPoint (point); m_visualVertexData[pointIndex].m_vertexIndex = vertexIndex; } for (dgInt32 i = 0; i < m_trianglesCount; i ++) { dgInt32 mat = materials[i]; if (mat != -1) { dgInt32 count = 0; for (dgInt32 j = i; j < m_trianglesCount; j ++) { dgInt32 mat1 = materials[j]; if (mat == mat1) { materials[j] = -1; count ++; } } dgMeshSegment& segment = m_visualSegments.Append()->GetInfo(); segment.m_material = mat; segment.m_indexCount = count * 3; segment.m_indexList = (dgInt32*) dgMallocStack( 2 * segment.m_indexCount * sizeof (dgInt32)); dgInt32 index0 = 0; dgInt32 index1 = m_trianglesCount * 3; for (dgInt32 j = i; j < m_trianglesCount; j ++) { if (materials[j] == -1) { dgInt32 m0 = meshCopy.GetPointIndex(indexArray[j * 3 + 0]); dgInt32 m1 = meshCopy.GetPointIndex(indexArray[j * 3 + 1]); dgInt32 m2 = meshCopy.GetPointIndex(indexArray[j * 3 + 2]); segment.m_indexList[index0 + 0] = dgInt16 (m0); segment.m_indexList[index0 + 1] = dgInt16 (m1); segment.m_indexList[index0 + 2] = dgInt16 (m2); index0 += 3; segment.m_indexList[index1 + 0] = dgInt16 (m0); segment.m_indexList[index1 + 1] = dgInt16 (m2); segment.m_indexList[index1 + 2] = dgInt16 (m1); index1 += 3; } } } } // SetVolumeAndCG (); }