void UnwrapMod::fnCopy() { int ct = 0; int currentLDID = -1; for (int ldID = 0; ldID < mMeshTopoData.Count(); ldID++) { BitArray fsel = mMeshTopoData[ldID]->GetFaceSelection(); if (fsel.NumberSet()) { currentLDID = ldID; ct++; } } if (ct > 1) { //pop warnign message TSTR error,msg; error.printf(_T("%s"),GetString(IDS_PW_ERROR)); msg.printf(_T("%s"),GetString(IDS_PW_COPYERROR)); MessageBox( NULL,msg,error,MB_OK); return; } //check for type if ((ct == 0) || (currentLDID==-1)) return; copyPasteBuffer.iRotate = 0; copyPasteBuffer.copyType = 2; //make sure we only have one faces off of one local data selected MeshTopoData *ld = mMeshTopoData[currentLDID]; copyPasteBuffer.mod = this; //copy the vertex list over copyPasteBuffer.tVertData.SetCount(ld->GetNumberTVVerts());//TVMaps.v.Count()); for (int i =0; i < ld->GetNumberTVVerts(); i++)//TVMaps.v.Count(); i++) { copyPasteBuffer.tVertData[i] = ld->GetTVVert(i);//TVMaps.v[i].p; } // MeshTopoData *md = (MeshTopoData*)mcList[0]->localData;//copy the face data over that is selected copyPasteBuffer.lmd = ld; for (int i = 0; i < copyPasteBuffer.faceData.Count(); i++) { delete copyPasteBuffer.faceData[i]; } BitArray faceSel = ld->GetFaceSelection(); ct = faceSel.NumberSet(); if (faceSel.NumberSet() == ld->GetNumberFaces())//TVMaps.f.Count()) copyPasteBuffer.copyType = 1; if (faceSel.NumberSet() == 1) copyPasteBuffer.copyType = 0; copyPasteBuffer.faceData.SetCount(ct); int faceIndex = 0; for (int i = 0; i < ld->GetNumberFaces(); i++)//TVMaps.f.Count(); i++) { if (faceSel[i]) { UVW_TVFaceClass *f = ld->CloneFace(i);//TVMaps.f[i]->Clone(); copyPasteBuffer.faceData[faceIndex] = f; faceIndex++; } } }
void UnwrapMod::fnFlattenMapByMatID(float angleThreshold, float spacing, BOOL normalize, int layoutType, BOOL rotateClusters, BOOL fillHoles) { int holdSubMode = fnGetTVSubMode(); fnSetTVSubMode(TVVERTMODE); // vsel.SetAll(); Tab<Point3*> normList; normList.SetCount(6); normList[0] = new Point3(1.0f,0.0f,0.0f); normList[1] = new Point3(-1.0f,0.0f,0.0f); normList[2] = new Point3(0.0f,1.0f,0.0f); normList[3] = new Point3(0.0f,-1.0f,0.0f); normList[4] = new Point3(0.0f,0.0f,1.0f); normList[5] = new Point3(0.0f,0.0f,-1.0f); int largestID = -1; for (int ldID = 0; ldID < mMeshTopoData.Count(); ldID++) { MeshTopoData *ld = mMeshTopoData[ldID]; for (int i = 0; i < ld->GetNumberFaces(); i++)//TVMaps.f.Count(); i++) { int matID = ld->GetFaceMatID(i); if (matID > largestID) largestID = matID; } } BitArray usedMats; usedMats.SetSize(largestID+1); usedMats.ClearAll(); for (int ldID = 0; ldID < mMeshTopoData.Count(); ldID++) { MeshTopoData *ld = mMeshTopoData[ldID]; for (int i = 0; i < ld->GetNumberFaces(); i++)//TVMaps.f.Count(); i++) { int matID = ld->GetFaceMatID(i); usedMats.Set(matID,TRUE); } } Tab<int> matIDs; matIDs.SetCount(usedMats.NumberSet()); int ct = 0; for (int i = 0; i < usedMats.GetSize(); i++) { if (usedMats[i]) { matIDs[ct] = i; ct++; } } //loop through our mat ID Tab<ClusterClass*> matIDClusters; for (int ldID = 0; ldID < mMeshTopoData.Count(); ldID++) { MeshTopoData *ld = mMeshTopoData[ldID]; for (int i = 0; i < matIDs.Count(); i++) { int matID = matIDs[i]; FreeClusterList(); for (int ldIDSel = 0; ldIDSel < mMeshTopoData.Count(); ldIDSel++) { mMeshTopoData[ldIDSel]->ClearFaceSelection(); } ld->SelectByMatID(matID); if (ld->GetFaceSelection().NumberSet()) { ClusterClass *mcluster = new ClusterClass(); mcluster->ld = ld; for (int j = 0; j < ld->GetNumberFaces(); j++)//TVMaps.f.Count(); j++) { if (ld->GetFaceSelected(j))//(TVMaps.f[j]->MatID == matIDs[i]) { mcluster->faces.Append(1,&j,100); } } matIDClusters.Append(1,&mcluster,5); fnFlattenMap(flattenAngleThreshold, &normList, flattenSpacing, FALSE, 2, flattenRotate, flattenCollapse); } } } FreeClusterList(); clusterList.SetCount(matIDClusters.Count()); for (int i = 0; i < matIDClusters.Count(); i++) { clusterList[i] = new ClusterClass(); clusterList[i]->ld = matIDClusters[i]->ld; clusterList[i]->faces.SetCount(matIDClusters[i]->faces.Count()); for (int j = 0; j < matIDClusters[i]->faces.Count(); j++) clusterList[i]->faces[j] = matIDClusters[i]->faces[j]; } for (int ldID = 0; ldID < mMeshTopoData.Count(); ldID++) mMeshTopoData[ldID]->UpdateClusterVertices(clusterList); Pack(0, spacing, normalize, rotateClusters, fillHoles,FALSE,FALSE); FreeClusterList(); TimeValue t = GetCOREInterface()->GetTime(); if (normalize) { float per = 1.0f-(spacing*2.0f); float add = spacing; for (int ldID = 0; ldID < mMeshTopoData.Count(); ldID++) { MeshTopoData *ld = mMeshTopoData[ldID]; for (int i = 0; i < ld->GetNumberTVVerts(); i++)//TVMaps.v.Count(); i++) { Point3 p = ld->GetTVVert(i); p *= per; p.x += add; p.y += add; ld->SetTVVert(t,i,p,this); // if (TVMaps.cont[i]) // TVMaps.cont[i]->SetValue(0,&TVMaps.v[i].p,CTRL_ABSOLUTE); } } } for (int i = 0; i < matIDs.Count(); i++) { if (matIDClusters[i]) delete matIDClusters[i]; } for (int i = 0; i < 6; i++) delete normList[i]; fnSetTVSubMode(holdSubMode); }