// If edgeIndex == -1, this method finds the first matching edge. Otherwise, it finds the edge with the given index public bool TryRemoveOuterEdge(ref Vector3 posv0, ref Vector3 posv1, ref int edgeIndex) { // Careful: This is quadratic in the number of entries in a bin in m_outerEdgePoints, so don't make the bins too large! if (edgeIndex == -1) { var en0 = m_outerEdgePoints.QueryPointsSphere(ref posv0, OUTER_EDGE_EPSILON); while (en0.MoveNext()) { var en1 = m_outerEdgePoints.QueryPointsSphere(ref posv1, OUTER_EDGE_EPSILON); while (en1.MoveNext()) { OuterEdgePoint p0 = en0.Current; OuterEdgePoint p1 = en1.Current; if (p0.EdgeIndex == p1.EdgeIndex && p0.FirstPoint && !p1.FirstPoint) { edgeIndex = p0.EdgeIndex; m_outerEdgePoints.RemoveTwo(ref en0, ref en1); return(true); } } } edgeIndex = -1; } else { int found = 0; var en0 = m_outerEdgePoints.QueryPointsSphere(ref posv0, OUTER_EDGE_EPSILON); while (en0.MoveNext()) { if (en0.Current.EdgeIndex == edgeIndex && en0.Current.FirstPoint) { found++; break; } } var en1 = m_outerEdgePoints.QueryPointsSphere(ref posv1, OUTER_EDGE_EPSILON); while (en1.MoveNext()) { if (en1.Current.EdgeIndex == edgeIndex && !en1.Current.FirstPoint) { found++; break; } } if (found == 2) { m_outerEdgePoints.RemoveTwo(ref en0, ref en1); return(true); } else { edgeIndex = -1; } } return(false); }