MStatus updateTCCDataFty::remapMeshData(MFnMesh &meshFn) { MIntArray o_nFV, o_F; meshFn.getVertices(o_nFV, o_F); size_t o_nF = o_nFV.length(); size_t o_nHE = o_F.length(); size_t o_nV = meshFn.numVertices(); MIntArray o_F2H(o_nF); // maps face index to halfedge index { size_t kS=0; for (size_t k=0; k<o_nF; k++) { o_F2H[k] = kS; kS+=o_nFV[k]; } } size_t nF = fPolyOrder.length(); size_t nHE = compute_nHE(fPolyOrder, o_nFV, fDelta_nFV); size_t nV = fnV; HalfedgeData he(o_nHE, nHE); VertexData v(o_nV, nV); MFloatPointArray V(nV); MIntArray nFV(nF); MIntArray F(nHE); get_vertex_blindData(meshFn, v); get_halfedge_blindData(meshFn, he); // add old/new faces in the order given by fPolyOrder and remap their halfedge data (if exists) size_t delta_kF = 0, delta_kHE=0; size_t kF = 0, kHE = 0; for (size_t k=0; k<fPolyOrder.length(); k++) { if (fPolyOrder[k]>=0) { size_t cF = fPolyOrder[k], cnFV = o_nFV[cF]; size_t o_cF2H = o_F2H[cF]; size_t cShift = fCShift[cF]; for (size_t kFV=0; kFV<cnFV; kFV++) { size_t o_kHE = o_cF2H + ((kFV + cShift) % cnFV); F[kHE] = fVtxRemap[o_F[o_kHE]]; remap_HalfedgeData(he, o_kHE, kHE); kHE++; } nFV[kF] = cnFV; kF++; } else // this is a new face { size_t cnFV = fDelta_nFV[delta_kF]; delta_kF++; for (size_t kFV=0; kFV<cnFV; kFV++) { F[kHE] = fDelta_F[delta_kHE]; kHE++; delta_kHE++; } nFV[kF] = cnFV; kF++; } } // remap vertex data for (size_t k=0; k<o_nV; k++) { if (fVtxRemap[k]>=0) { remap_VertexData(v, k, fVtxRemap[k]); } } MStatus stat = meshFn.createInPlace(nV, nF, V, nFV, F); if (stat != MS::kSuccess) { std::cerr<<"createInPlace failed"<<endl; std::cerr<<stat.errorString()<<endl; } update_tags(nFV, F, v, he); set_vertex_blindData(meshFn, v); set_halfedge_blindData(meshFn, he); return stat; }