void UnwrapMod::ApplyGizmo() { if ((fnGetMapMode() == PLANARMAP) || (fnGetMapMode() == PELTMAP) || (fnGetMapMode() == SPHERICALMAP) || (fnGetMapMode() == CYLINDRICALMAP)) { ApplyGizmoPrivate(); } else { theHold.Begin(); //compute the center //get our normal list for (int ldID = 0; ldID < mMeshTopoData.Count(); ldID++) { MeshTopoData *ld = mMeshTopoData[ldID]; ld->HoldFaceSel(); } for (int ldID = 0; ldID < mMeshTopoData.Count(); ldID++) { MeshTopoData *ld = mMeshTopoData[ldID]; ld->HoldFaceSel(); Tab<Point3> fnorms; fnorms.SetCount(ld->GetNumberFaces()); for (int k=0; k< fnorms.Count(); k++) fnorms[k] = Point3(0.0f,0.0f,0.0f); //get our projection normal Point3 projectionNorm(0.0f,0.0f,0.0f); //build normals for (int k = 0; k < fnorms.Count(); k++) { if (ld->GetFaceSelected(k)) { // Grap the three points, xformed int pcount = 3; // if (gfaces[k].flags & FLAG_QUAD) pcount = 4; pcount = ld->GetFaceDegree(k);//gfaces[k]->count; Point3 temp_point[4]; for (int j=0; j<pcount; j++) { int index = ld->GetFaceGeomVert(k,j);//gfaces[k]->t[j]; if (j < 4) temp_point[j] = ld->GetGeomVert(index);//gverts.d[index].p; } fnorms[k] = Normalize(temp_point[1]-temp_point[0]^temp_point[2]-temp_point[1]); } } BitArray front,back,left,right,top,bottom; front.SetSize(ld->GetNumberFaces()); front.ClearAll(); back = front; left = front; right = front; top = front; bottom = front; Tab<Point3> norms; Matrix3 gtm(1); TimeValue t = 0; if (ip) t = ip->GetTime(); if (tmControl) tmControl->GetValue(t,>m,FOREVER,CTRL_RELATIVE); norms.SetCount(6); for (int i = 0; i < 3; i++) { Point3 v = gtm.GetRow(i); norms[i*2] = Normalize(v); norms[i*2+1] = norms[i*2] * -1.0f; } for (int k=0; k< ld->GetNumberFaces(); k++) { if (ld->GetFaceSelected(k)) { int closestFace = -1; float closestAngle = -10.0f; for (int j = 0; j < 6; j++) { float dot = DotProd(norms[j],fnorms[k]); if (dot > closestAngle) { closestAngle = dot; closestFace = j; } } if (closestFace == 0) front.Set(k,TRUE); else if (closestFace == 1) back.Set(k,TRUE); else if (closestFace == 2) left.Set(k,TRUE); else if (closestFace == 3) right.Set(k,TRUE); else if (closestFace == 4) top.Set(k,TRUE); else if (closestFace == 5) bottom.Set(k,TRUE); } } gtm.IdentityMatrix(); if (tmControl) tmControl->GetValue(t,>m,FOREVER,CTRL_RELATIVE); Point3 xvec,yvec,zvec; xvec = gtm.GetRow(0); yvec = gtm.GetRow(1); zvec = gtm.GetRow(2); Point3 center = gtm.GetRow(3); for (int k = 0; k < 6; k++) { Matrix3 tm(1); if (k == 0) { tm.SetRow(0,yvec); tm.SetRow(1,zvec); tm.SetRow(2,xvec); ld->SetFaceSelection(front); } else if (k == 1) { tm.SetRow(0,yvec); tm.SetRow(1,zvec); tm.SetRow(2,(xvec*-1.0f)); ld->SetFaceSelection(back); } else if (k == 2) { tm.SetRow(0,xvec); tm.SetRow(1,zvec); tm.SetRow(2,yvec); ld->SetFaceSelection(left); } else if (k == 3) { tm.SetRow(0,xvec); tm.SetRow(1,zvec); tm.SetRow(2,(yvec *-1.0f)); ld->SetFaceSelection(right); } else if (k == 4) { tm.SetRow(0,xvec); tm.SetRow(1,yvec); tm.SetRow(2,zvec); ld->SetFaceSelection(top); } else if (k == 5) { tm.SetRow(0,xvec); tm.SetRow(1,yvec); tm.SetRow(2,(zvec*-1.0f)); ld->SetFaceSelection(bottom); } tm.SetRow(3,center); if (!fnGetNormalizeMap()) { for (int i = 0; i < 3; i++) { Point3 vec = tm.GetRow(i); vec = Normalize(vec); tm.SetRow(i,vec); } } tm = mMeshTopoData.GetNodeTM(t,ldID) * Inverse(tm); ld->ApplyMap(fnGetMapMode(), fnGetNormalizeMap(), tm, this); } ld->RestoreFaceSel(); } theHold.Accept(GetString(IDS_PW_PLANARMAP)); } }
void UnwrapMod::fnPaste(BOOL rotate) { //check for type TimeValue t = GetCOREInterface()->GetTime(); theHold.Begin(); HoldPointsAndFaces(); for (int ldID = 0; ldID < mMeshTopoData.Count(); ldID++) { MeshTopoData *ld = mMeshTopoData[ldID]; //check faces if just one selected normal paste with rotates //or if all faces where selected //or if first paste //hold the points and faces BitArray holdFaceSel(ld->GetFaceSelection()); BitArray subFaceSel; if ( ip && (ip->GetSubObjectLevel() == 0) ) { //convert our current selection into faces if (fnGetTVSubMode() == TVVERTMODE) ld->GetFaceSelFromVert(subFaceSel,FALSE); else if (fnGetTVSubMode() == TVEDGEMODE) { BitArray tempVSel; ld->GetVertSelFromEdge(tempVSel); BitArray vsel = ld->GetTVVertSelection(); BitArray holdVSel(vsel); ld->SetTVVertSelection(tempVSel);//vsel = tempVSel; ld->GetFaceSelFromVert(subFaceSel,FALSE); ld->SetTVVertSelection(holdVSel);//vsel = holdVSel; } else if (fnGetTVSubMode() == TVFACEMODE) { subFaceSel = ld->GetFaceSelection();//.SetSize(fsel.GetSize()); //subFaceSel = fsel; } } else { if (fnGetTVSubMode() == TVFACEMODE) { subFaceSel = ld->GetFaceSelection();//.SetSize(fsel.GetSize()); //subFaceSel = fsel; } } if ( (copyPasteBuffer.copyType == 0) || (copyPasteBuffer.copyType == 1) || (copyPasteBuffer.iRotate==0)) { int copyIndex = 0; Tab<int> vertexLookUpList; vertexLookUpList.SetCount(copyPasteBuffer.tVertData.Count()); BitArray faceSel = ld->GetFaceSelection(); for (int i =0; i < vertexLookUpList.Count(); i++) vertexLookUpList[i] = -1; if (copyPasteBuffer.copyType == 1) copyPasteBuffer.iRotate = 0; else { if (copyPasteBuffer.lastSel.GetSize() == faceSel.GetSize()) { if (copyPasteBuffer.lastSel == faceSel) { if (rotate) { copyPasteBuffer.iRotate++; } else copyPasteBuffer.iRotate = 0; } } } if (copyPasteBuffer.copyType == 2) copyPasteBuffer.iRotate = 0; copyPasteBuffer.lastSel = faceSel; //loop through selected faces for (int i =0; i < faceSel.GetSize(); i++) { if (faceSel[i]) { //make sure selected faces count = buffer face if (( i < ld->GetNumberFaces()/*TVMaps.f.Count()*/) && (copyIndex < copyPasteBuffer.faceData.Count())) { int degree = ld->GetFaceDegree(i); if (/*TVMaps.f[i]->count*/ degree == copyPasteBuffer.faceData[copyIndex]->count) { //if so set the face data indices as the same for (int j = 0; j < degree/*TVMaps.f[i]->count*/; j++) { //index into the texture vertlist int vid = (j + copyPasteBuffer.iRotate)%degree;//TVMaps.f[i]->count; int vertexIndex = copyPasteBuffer.faceData[copyIndex]->t[vid]; if (vertexLookUpList[vertexIndex] == -1) { Point3 p = copyPasteBuffer.tVertData[vertexIndex]; ld->AddTVVert(t, p, i, j, this,FALSE);//ld->AddPoint(p, i, j,FALSE); vertexLookUpList[vertexIndex] = ld->GetFaceTVVert(i,j);//TVMaps.f[i]->t[j]; } else ld->SetFaceTVVert(i,j,vertexLookUpList[vertexIndex]);//TVMaps.f[i]->t[j] = vertexLookUpList[vertexIndex]; if ((ld->GetFaceHasVectors(i)/*TVMaps.f[i]->vecs*/) && (copyPasteBuffer.faceData[copyIndex]->vecs) && (j < 4)) { int hid = (j*2 + (copyPasteBuffer.iRotate*2))%(/*TVMaps.f[i]->count*/degree*2); int handleIndex = copyPasteBuffer.faceData[copyIndex]->vecs->handles[hid]; if ((handleIndex >= 0) && (vertexLookUpList[handleIndex] == -1)) { Point3 p = copyPasteBuffer.tVertData[handleIndex]; ld->AddTVHandle(t,p, i, j*2,this,FALSE); vertexLookUpList[handleIndex] = ld->GetFaceTVHandle(i,j*2);// TVMaps.f[i]->vecs->handles[j*2]; } else ld->SetFaceTVHandle(i,j*2,vertexLookUpList[handleIndex]);//TVMaps.f[i]->vecs->handles[j*2] = vertexLookUpList[handleIndex]; hid = (j*2 + (copyPasteBuffer.iRotate*2))%(degree/*TVMaps.f[i]->count*/*2)+1; handleIndex = copyPasteBuffer.faceData[copyIndex]->vecs->handles[hid]; if ((handleIndex >= 0) && (vertexLookUpList[handleIndex] == -1)) { Point3 p = copyPasteBuffer.tVertData[handleIndex]; ld->AddTVHandle(t,p, i, j*2+1,this,FALSE); vertexLookUpList[handleIndex] = ld->GetFaceTVHandle(i,j*2+1);//TVMaps.f[i]->vecs->handles[j*2+1]; } else ld->SetFaceTVHandle(i,j*2+1,vertexLookUpList[handleIndex]);//TVMaps.f[i]->vecs->handles[j*2+1] = vertexLookUpList[handleIndex]; int iid = (j + (copyPasteBuffer.iRotate))%degree;//(TVMaps.f[i]->count); int interiorIndex = copyPasteBuffer.faceData[copyIndex]->vecs->interiors[iid]; if ((interiorIndex >= 0) && (vertexLookUpList[interiorIndex] == -1)) { Point3 p = copyPasteBuffer.tVertData[interiorIndex]; ld->AddTVInterior(t,p, i, j,this,FALSE); vertexLookUpList[interiorIndex] = ld->GetFaceTVInterior(i,j);//TVMaps.f[i]->vecs->handles[j]; } else ld->SetFaceTVInterior(i,j,vertexLookUpList[interiorIndex]);//TVMaps.f[i]->vecs->interiors[j] = vertexLookUpList[interiorIndex]; } } copyIndex++; if (copyIndex >= copyPasteBuffer.faceData.Count()) copyIndex = 0; } } } } } ld->SetTVEdgeInvalid();//RebuildEdges(); if ( ip && (ip->GetSubObjectLevel() == 0) ) { if (fnGetTVSubMode() == TVVERTMODE) { BitArray fsel = ld->GetFaceSelection(); BitArray vsel = ld->GetTVVertSelection(); BitArray holdFSel(fsel); fsel = subFaceSel; ld->GetVertSelFromFace(vsel); ld->SetTVVertSelection(vsel); ld->SetFaceSelection(holdFSel);//fsel = holdFSel; } else if (fnGetTVSubMode() == TVEDGEMODE) { BitArray fsel = ld->GetFaceSelection(); BitArray esel = ld->GetTVEdgeSelection(); BitArray holdFSel(fsel); fsel = subFaceSel; ld->GetVertSelFromFace(fsel); ld->SetFaceSelection(fsel);// ld->GetEdgeSelFromVert(esel,FALSE); ld->SetTVEdgeSelection(esel); ld->SetFaceSelection(holdFSel);//fsel = holdFSel; } else if (fnGetTVSubMode() == TVFACEMODE) { ld->SetFaceSelection(subFaceSel);//fsel = subFaceSel; } } else { // md->faceSel = holdFaceSel; ld->SetFaceSelection(subFaceSel); /* if (fnGetTVSubMode() == TVFACEMODE) { ld->SetFaceSelection(subFaceSel);//fsel = subFaceSel; } */ } } CleanUpDeadVertices(); theHold.Accept(GetString(IDS_PW_PASTE)); NotifyDependents(FOREVER,PART_ALL,REFMSG_CHANGE); InvalidateView(); GetCOREInterface()->RedrawViews(GetCOREInterface()->GetTime()); }