void MeshTopoData::ApplyMapping(PatchMesh &patch, int mapChannel) { //get from mesh if (!patch.getMapSupport(mapChannel) ) { patch.setNumMaps (mapChannel+1); } TVPatch *tvFace = patch.tvPatches[mapChannel]; int tvFaceCount = patch.numPatches; if (patch.selLevel!=PATCH_PATCH) { //copy into mesh struct if (!tvFace) { // Create tvfaces and init to 0 patch.setNumMapPatches(mapChannel,patch.getNumPatches()); tvFace = patch.tvPatches[mapChannel]; for (int k=0; k<patch.getNumPatches(); k++) { for (int j=0; j<TVMaps.f[k]->count; j++) { tvFace[k].tv[j] = 0; tvFace[k].interiors[j] = 0; tvFace[k].handles[j*2] = 0; tvFace[k].handles[j*2+1] = 0; } } } for (int k=0; k<tvFaceCount; k++) { if (k < TVMaps.f.Count()) { tvFace[k].tv[0] = TVMaps.f[k]->t[0]; tvFace[k].tv[1] = TVMaps.f[k]->t[1]; tvFace[k].tv[2] = TVMaps.f[k]->t[2]; if (TVMaps.f[k]->count == 4) tvFace[k].tv[3] = TVMaps.f[k]->t[3]; if (TVMaps.f[k]->flags & FLAG_CURVEDMAPPING) { patch.patches[k].flags &= ~PATCH_LINEARMAPPING; if (TVMaps.f[k]->vecs) { for (int m = 0;m < TVMaps.f[k]->count;m++) { if (TVMaps.f[k]->flags & FLAG_INTERIOR) { tvFace[k].interiors[m] = TVMaps.f[k]->vecs->interiors[m]; } tvFace[k].handles[m*2] = TVMaps.f[k]->vecs->handles[m*2]; tvFace[k].handles[m*2+1] = TVMaps.f[k]->vecs->handles[m*2+1]; } } } else patch.patches[k].flags |= PATCH_LINEARMAPPING; } else{ tvFace[k].tv[0] = 0; tvFace[k].tv[1] = 0; tvFace[k].tv[2] = 0; if (TVMaps.f[k]->count == 4) tvFace[k].tv[3] = 0; for (int m = 0;m < TVMaps.f[k]->count;m++) { tvFace[k].interiors[m] = 0; tvFace[k].handles[m*2] = 0; tvFace[k].handles[m*2+1] = 0; } } } //match verts patch.setNumMapVerts (mapChannel,TVMaps.v.Count()); PatchTVert *tVerts = patch.tVerts[mapChannel]; for (int k=0; k<TVMaps.v.Count(); k++) tVerts[k].p = GetTVVert(k); } else { //copy into mesh struct if (!tvFace) { // Create tvfaces and init to 0 patch.setNumMapPatches (mapChannel,patch.getNumPatches()); tvFace = patch.tvPatches[mapChannel]; for (int k=0; k<patch.getNumPatches(); k++) { for (int j=0; j<TVMaps.f[k]->count; j++) { tvFace[k].tv[j] = 0; tvFace[k].interiors[j] = 0; tvFace[k].handles[j*2] = 0; tvFace[k].handles[j*2+1] = 0; } } } int offset = patch.getNumMapVerts (mapChannel); for (int k=0; k<tvFaceCount; k++) { //copy if face is selected if (patch.patchSel[k]) { tvFace[k].tv[0] = TVMaps.f[k]->t[0]+offset; tvFace[k].tv[1] = TVMaps.f[k]->t[1]+offset; tvFace[k].tv[2] = TVMaps.f[k]->t[2]+offset; if (TVMaps.f[k]->count == 4) tvFace[k].tv[3] = TVMaps.f[k]->t[3]+offset; if (TVMaps.f[k]->flags & FLAG_CURVEDMAPPING) { patch.patches[k].flags &= ~PATCH_LINEARMAPPING; if (TVMaps.f[k]->vecs) { for (int m = 0;m < TVMaps.f[k]->count;m++) { if (TVMaps.f[k]->flags & FLAG_INTERIOR) { tvFace[k].interiors[m] = TVMaps.f[k]->vecs->interiors[m]+offset; } tvFace[k].handles[m*2] = TVMaps.f[k]->vecs->handles[m*2]+offset; tvFace[k].handles[m*2+1] = TVMaps.f[k]->vecs->handles[m*2+1]+offset; } } } else patch.patches[k].flags |= PATCH_LINEARMAPPING; } } //match verts patch.setNumMapVerts (mapChannel,TVMaps.v.Count()+offset,TRUE); PatchTVert *tVerts = patch.tVerts[mapChannel]; for ( int k=0; k<TVMaps.v.Count(); k++) tVerts[k+offset].p = GetTVVert(k); } RemoveDeadVerts(&patch,mapChannel); }
void MeshTopoData::ApplyMapping(MNMesh &mesh, int mapChannel) { // allocate texture verts. Setup tv faces into a parallel // topology as the regular faces int numMaps = mesh.MNum (); if (mapChannel >= numMaps) { mesh.SetMapNum(mapChannel+1); mesh.InitMap(mapChannel); } MNMapFace *tvFace = mesh.M(mapChannel)->f; if (!tvFace) { mesh.InitMap(mapChannel); tvFace = mesh.M(mapChannel)->f; } int tvFaceCount = mesh.FNum(); if (mesh.selLevel!=MNM_SL_FACE) { //copy into mesh struct for (int k=0; k<tvFaceCount; k++) { if (k < TVMaps.f.Count()) { for (int m = 0; m< TVMaps.f[k]->count; m++) tvFace[k].tv[m] = TVMaps.f[k]->t[m]; } else { for (int m = 0; m< TVMaps.f[k]->count; m++) tvFace[k].tv[m] = 0; } } //match verts mesh.M(mapChannel)->setNumVerts( TVMaps.v.Count()); Point3 *tVerts = mesh.M(mapChannel)->v; for ( int k=0; k<TVMaps.v.Count(); k++) { tVerts[k] = GetTVVert(k); } } else { //copy into mesh struct //check if mesh has existing tv faces int offset = mesh.M(mapChannel)->VNum(); int current = 0; BitArray s; mesh.getFaceSel(s); for (int k=0; k<tvFaceCount; k++) { //copy if face is selected if (s[k]==1) { for (int m = 0; m< TVMaps.f[k]->count; m++) tvFace[k].tv[m] = TVMaps.f[k]->t[m] + offset; } } //add our verts for ( int k=0; k<TVMaps.v.Count(); k++) mesh.M(mapChannel)->NewVert( GetTVVert(k)); } mesh.M(mapChannel)->CollapseDeadVerts(mesh.f); }