@@ -59,16 +59,16 @@ bool MutationManager::flipEdge(Edge e) {
5959 return true ;
6060}
6161
62- void MutationManager::splitEdge (Edge e, double tSplit) {
62+ Halfedge MutationManager::splitEdge (Edge e, double tSplit) {
6363 Vector3 newPos{0 ., 0 ., 0 .};
6464 if (geometry) {
6565 VertexData<Vector3>& pos = geometry->vertexPositions ;
6666 newPos = (1 . - tSplit) * pos[e.halfedge ().tailVertex ()] + tSplit * pos[e.halfedge ().tipVertex ()];
6767 }
68- splitEdge (e, tSplit, newPos);
68+ return splitEdge (e, tSplit, newPos);
6969}
7070
71- void MutationManager::splitEdge (Edge e, Vector3 newVertexPosition) {
71+ Halfedge MutationManager::splitEdge (Edge e, Vector3 newVertexPosition) {
7272
7373 double tSplit = -1 ;
7474 GC_SAFETY_ASSERT (geometry, " must have geometry to split by position" );
@@ -80,10 +80,10 @@ void MutationManager::splitEdge(Edge e, Vector3 newVertexPosition) {
8080 tSplit = pointLineSegmentNeaestLocation (newVertexPosition, posTail, posTip);
8181 }
8282
83- splitEdge (e, tSplit, newVertexPosition);
83+ return splitEdge (e, tSplit, newVertexPosition);
8484}
8585
86- void MutationManager::splitEdge (Edge e, double tSplit, Vector3 newVertexPosition) {
86+ Halfedge MutationManager::splitEdge (Edge e, double tSplit, Vector3 newVertexPosition) {
8787
8888 // Invoke before callbacks
8989 for (EdgeSplitPolicy* policy : edgeSplitPolicies) {
@@ -102,11 +102,13 @@ void MutationManager::splitEdge(Edge e, double tSplit, Vector3 newVertexPosition
102102 for (EdgeSplitPolicy* policy : edgeSplitPolicies) {
103103 policy->afterEdgeSplit (newHeFront, newHeBack, tSplit);
104104 }
105+
106+ return newHeFront;
105107}
106108
107109// Collapse an edge.
108- // Returns true if the edge could actually be collapsed.
109- bool MutationManager::collapseEdge (Edge e, double tCollapse) {
110+ // Returns the new vertex if the edge could be collapsed, and Vertex() otherwise
111+ Vertex MutationManager::collapseEdge (Edge e, double tCollapse) {
110112 Vector3 newPos{0 ., 0 ., 0 .};
111113 if (geometry) {
112114 // Find the nearest tCoord
@@ -116,7 +118,7 @@ bool MutationManager::collapseEdge(Edge e, double tCollapse) {
116118 return collapseEdge (e, tCollapse, newPos);
117119}
118120
119- bool MutationManager::collapseEdge (Edge e, Vector3 newVertexPosition) {
121+ Vertex MutationManager::collapseEdge (Edge e, Vector3 newVertexPosition) {
120122
121123 double tCollapse = -1 ;
122124 GC_SAFETY_ASSERT (geometry, " must have geometry to split by position" );
@@ -130,8 +132,7 @@ bool MutationManager::collapseEdge(Edge e, Vector3 newVertexPosition) {
130132
131133 return collapseEdge (e, tCollapse, newVertexPosition);
132134}
133-
134- bool MutationManager::collapseEdge (Edge e, double tCollapse, Vector3 newVertexPosition) {
135+ Vertex MutationManager::collapseEdge (Edge e, double tCollapse, Vector3 newVertexPosition) {
135136
136137 // Invoke before callbacks
137138 // TODO need to handle possiblity that collapse fails -- check before calling
@@ -140,7 +141,7 @@ bool MutationManager::collapseEdge(Edge e, double tCollapse, Vector3 newVertexPo
140141 }
141142
142143 Vertex newV = mesh.collapseEdgeTriangular (e);
143- if (newV == Vertex ()) return false ;
144+ if (newV == Vertex ()) return Vertex () ;
144145
145146 if (geometry) {
146147 VertexData<Vector3>& pos = geometry->vertexPositions ;
@@ -152,11 +153,11 @@ bool MutationManager::collapseEdge(Edge e, double tCollapse, Vector3 newVertexPo
152153 policy->afterEdgeCollapse (newV, tCollapse);
153154 }
154155
155- return true ;
156+ return newV ;
156157}
157158
158159// Split a face (i.e. insert a vertex into the face)
159- void MutationManager::splitFace (Face f, const std::vector<double >& bSplit) {
160+ Vertex MutationManager::splitFace (Face f, const std::vector<double >& bSplit) {
160161 Vector3 newPos = Vector3::zero ();
161162 if (geometry) {
162163 size_t iV = 0 ;
@@ -167,16 +168,17 @@ void MutationManager::splitFace(Face f, const std::vector<double>& bSplit) {
167168 }
168169 }
169170
170- splitFace (f, bSplit, newPos);
171+ return splitFace (f, bSplit, newPos);
171172}
172173
173- void MutationManager::splitFace (Face f, Vector3 newVertexPosition) {
174+ Vertex MutationManager::splitFace (Face f, Vector3 newVertexPosition) {
174175 // TODO
175176 throw std::runtime_error (" Face split based on vertex position not implemented yet" );
177+ return Vertex ();
176178}
177179
178180
179- void MutationManager::splitFace (Face f, const std::vector<double >& bSplit, Vector3 newVertexPosition) {
181+ Vertex MutationManager::splitFace (Face f, const std::vector<double >& bSplit, Vector3 newVertexPosition) {
180182 // Invoke before callbacks
181183 for (FaceSplitPolicy* policy : faceSplitPolicies) {
182184 policy->beforeFaceSplit (f, bSplit);
@@ -192,6 +194,8 @@ void MutationManager::splitFace(Face f, const std::vector<double>& bSplit, Vecto
192194 for (FaceSplitPolicy* policy : faceSplitPolicies) {
193195 policy->afterFaceSplit (newV, bSplit);
194196 }
197+
198+ return newV;
195199}
196200
197201
@@ -290,7 +294,7 @@ MutationPolicyHandle MutationManager::registerPolicy(MutationPolicy* policyObjec
290294}
291295
292296void MutationManager::removePolicy (const MutationPolicyHandle& toRemove) {
293- // Remove from all lists
297+ // Remove from all lists
294298 removeFromVector (vertexRepositionPolicies, toRemove.policy );
295299 removeFromVector (edgeFlipPolicies, toRemove.policy );
296300 removeFromVector (edgeSplitPolicies, toRemove.policy );
0 commit comments