DerivedMesh *clothModifier_do(ClothModifierData *clmd, Object *ob, DerivedMesh *dm, int useRenderParams, int isFinalCalc) { int numverts = dm->getNumVerts(dm); int numedges = dm->getNumEdges(dm); int numfaces = dm->getNumFaces(dm); MEdge *medge = CDDM_get_edges(dm); MFace *mface = CDDM_get_faces(dm); int numtris = 0; int numquads = 0; int i =0; DerivedMesh *result = NULL; int tempquads = 0; int countquads=0, countfaces=0; // create new triangle mesh for(i = 0; i < numfaces; i++) { if(mface[i].v4) numquads++; else numtris++; } // error handling if((numquads == numtris)&& numtris==0) return dm; result = CDDM_from_template(dm, numverts, numedges + numquads, (numquads * 2) + numtris); if(!result) return NULL; for(i = 0; i < numverts; i++) { MVert inMV; MVert *mv = CDDM_get_vert(result, i); dm->getVert(dm, i, &inMV); DM_copy_vert_data(dm, result, i, i, 1); *mv = inMV; } for(i = 0; i < numtris + numquads; i++) { MFace inMF; int index4, index1; MFace *mf = CDDM_get_face(result, i); dm->getFace(dm, i, &inMF); DM_copy_face_data(dm, result, i, i, 1); index4 = inMF.v4; inMF.v4 = 0; *mf = inMF; test_index_face(mf, &result->faceData, numtris + numquads + countquads, 3); if(mface[i].v4) { MFace *mf = CDDM_get_face(result, numtris + numquads + countquads); DM_copy_face_data(dm, result, i, numtris + numquads + countquads, 1); index1 = inMF.v1; inMF.v1 = index4; inMF.v2 = index1; inMF.v4 = 0; *mf = inMF; test_index_face(mf, &result->faceData, numtris + numquads + countquads, 3); countquads++; } } CDDM_calc_edges(result); CDDM_lower_num_verts(result, numfaces); CDDM_lower_num_edges(result, numedges+numquads); CDDM_lower_num_faces(result, (numquads * 2) + numtris); return result; }