40 static void writeRegionOBJ
57 forAll(collapseRegion, faceI)
59 if (collapseRegion[faceI] == regionI)
61 include[faceI] =
true;
76 fileName pointsName(dir /
"regionPoints_" +
name(regionI) +
".obj");
78 Pout<<
"Dumping region " << regionI <<
" points to file " << pointsName
100 label oldNTris = tris.
size();
103 label fp1 = (fp+1)%3;
104 label fp2 = (fp1+1)%3;
111 for (label i = 1; i < splitPoints.
size(); i++)
130 splitPoints[splitPoints.
size()-1],
136 else if (f[fp2] == e[1])
146 splitPoints[splitPoints.
size()-1],
151 for (label i = splitPoints.
size()-1; i > 0; --i)
179 <<
"Edge " << e <<
" not part of triangle " << f
186 Pout<<
"Split face " << f <<
" along edge " << e
187 <<
" into triangles:" <<
endl;
189 for (label i = oldNTris; i < tris.
size(); i++)
191 Pout<<
" " << tris[i] <<
nl;
198 static bool insertSorted
209 FatalErrorIn(
"insertSorted") <<
"Trying to insert vertex " << vertI
210 <<
" which is already in list of sorted vertices "
214 if (weight <= 0 || weight >= 1)
216 FatalErrorIn(
"insertSorted") <<
"Trying to insert vertex " << vertI
217 <<
" with illegal weight " << weight
218 <<
" into list of sorted vertices "
223 label insertI = sortedVerts.
size();
225 forAll(sortedVerts, sortedI)
227 scalar w = sortedWeights[sortedI];
229 if (
mag(w - weight) < SMALL)
232 <<
"Trying to insert weight " << weight <<
" which is close to"
233 <<
" existing weight " << w <<
" in " << sortedWeights
246 label sz = sortedWeights.
size();
254 for (label i = sz-1; i >= insertI; --i)
256 sortedWeights[i+1] = sortedWeights[i];
257 sortedVerts[i+1] = sortedVerts[i];
259 sortedWeights[insertI] = weight;
260 sortedVerts[insertI] = vertI;
268 static void markCollapsedFaces
289 label faceI = eFaces[i];
303 localPoints[opposite0]
311 Pout<<
"Splitting face " << faceI <<
" since distance "
313 <<
" from vertex " << opposite0
314 <<
" to edge " << edgeI
318 <<
" is too small" <<
endl;
321 if (faceToEdge[faceI] != -1)
324 <<
"Cannot collapse face " << faceI <<
" since "
325 <<
" is marked to be collapsed both to edge "
326 << faceToEdge[faceI] <<
" and " << edgeI
330 faceToEdge[faceI] = edgeI;
339 static void markRegion
348 if (faceToEdge[faceI] == -1 || collapseRegion[faceI] != -1)
351 <<
"Problem : crossed into uncollapsed/regionized face"
355 collapseRegion[faceI] = regionI;
363 label edgeI = fEdges[fEdgeI];
369 label nbrFaceI = eFaces[i];
371 if (faceToEdge[nbrFaceI] != -1)
373 if (collapseRegion[nbrFaceI] == -1)
384 else if (collapseRegion[nbrFaceI] != regionI)
387 <<
"Edge:" << edgeI <<
" between face " << faceI
388 <<
" with region " << regionI
389 <<
" and face " << nbrFaceI
390 <<
" with region " << collapseRegion[nbrFaceI]
401 static label markRegions
412 if (collapseRegion[faceI] == -1 && faceToEdge[faceI] != -1)
414 Pout<<
"markRegions : Marking region:" << regionI
415 <<
" starting from face " << faceI <<
endl;
418 markRegion(surf, faceToEdge, regionI++, faceI, collapseRegion);
429 static label edgeType
439 bool usesUncollapsed =
false;
440 label usesRegion = -1;
444 label faceI = eFaces[i];
446 label region = collapseRegion[faceI];
450 usesUncollapsed =
true;
452 else if (usesRegion == -1)
456 else if (usesRegion != region)
468 if (usesRegion == -1)
481 if (usesRegion == -1)
510 label regionI = edgeType(surf, collapseRegion, edgeI);
519 labelList& regionVerts = outsideVerts[regionI];
528 label sz = regionVerts.
size();
549 scalar maxDist = -GREAT;
554 label v0 = outsideVerts[i];
556 for (label j = i+1; j < outsideVerts.
size(); j++)
558 label
v1 = outsideVerts[j];
560 scalar
d =
mag(localPoints[v0] - localPoints[v1]);
576 static void projectNonSpanPoints
590 label v = outsideVerts[i];
592 if (v != spanPair[0] && v != spanPair[1])
610 insertSorted(v, w, sortedVertices, sortedWeights);
617 static void getSplitVerts
631 const label sz = orderedVerts.
size();
633 if (e[0] == spanPoints[0])
637 if (e[1] == spanPoints[1])
640 splitVerts = orderedVerts;
641 splitWeights = orderedWeights;
646 label i1 =
findIndex(orderedVerts, e[1]);
651 else if (e[0] == spanPoints[1])
655 if (e[1] == spanPoints[0])
658 splitVerts = orderedVerts;
660 splitWeights = orderedWeights;
667 label i1 =
findIndex(orderedVerts, e[1]);
674 else if (e[1] == spanPoints[0])
680 label i0 =
findIndex(orderedVerts, e[0]);
686 else if (e[1] == spanPoints[1])
690 label i0 =
findIndex(orderedVerts, e[0]);
696 label i0 =
findIndex(orderedVerts, e[0]);
697 label i1 =
findIndex(orderedVerts, e[1]);
699 if (i0 == -1 || i1 == -1)
702 <<
"Did not find edge in projected vertices." <<
nl
703 <<
"region:" << regionI <<
nl
704 <<
"spanPoints:" << spanPoints
711 <<
"orderedVerts:" << orderedVerts <<
nl
733 label nTotalSplit = 0;
746 markCollapsedFaces(surf, minLen, faceToEdge);
755 label nRegions = markRegions(surf, faceToEdge, collapseRegion);
757 Pout<<
"Detected " << nRegions <<
" regions of faces to be collapsed"
763 getOutsideVerts(surf, collapseRegion, nRegions)
771 forAll(spanPoints, regionI)
773 spanPoints[regionI] = getSpanPoints(surf, outsideVerts[regionI]);
775 Pout<<
"For region " << regionI <<
" found extrema at points "
784 outsideVerts[regionI],
786 orderedVertices[regionI],
787 orderedWeights[regionI]
790 Pout<<
"For region:" << regionI
791 <<
" span:" << spanPoints[regionI]
792 <<
" orderedVerts:" << orderedVertices[regionI]
793 <<
" orderedWeights:" << orderedWeights[regionI]
801 outsideVerts[regionI]
827 const edge& e = edges[edgeI];
830 label regionI = edgeType(surf, collapseRegion, edgeI);
836 else if (regionI == -1)
854 orderedVertices[regionI],
855 orderedWeights[regionI],
862 if (splitVerts.
size())
870 Pout<<
"edge " << edgeI <<
' ' << e
872 << localPoints[e[0]] <<
' ' << localPoints[e[1]]
873 <<
" split into edges with extra points:"
877 Pout<<
" " << splitVerts[i] <<
" weight "
878 << splitWeights[i] <<
nl;
886 label faceI = eFaces[i];
888 if (!faceHandled[faceI] && faceToEdge[faceI] == -1)
899 faceHandled[faceI] =
true;
909 forAll(faceHandled, faceI)
911 if (!faceHandled[faceI] && faceToEdge[faceI] == -1)
913 newTris.append(localFaces[faceI]);
917 Pout<<
"collapseBase : splitting " << nSplit <<
" triangles"
920 nTotalSplit += nSplit;
930 Pout<<
"Resetting surface from " << surf.
size() <<
" to "
931 << newTris.size() <<
" triangles" <<
endl;
936 Pout<<
"Writing surf to " << fName <<
endl;