private List<Vector2> ExtractOutlineInternal(Edge edge)
{
if (edge == null)
return null;
var firstEdge = edge;
var result = new List<Vector2>(100);
while (edge != null)
{
// follow first border
Border b = edge.B0 ?? edge.B1;
if (b == null)
break;
// null border in edge (and add result)
if (edge.B0 == b)
{
edge.B0 = null;
result.Add(edge.A);
}
else if (edge.B1 == b)
{
edge.B1 = null;
result.Add(edge.B);
}
else
throw new InvalidOperationException("lolnope1");
// null edge in border
if (b.E0 == edge)
{
b.E0 = null;
}
else if (b.E1 == edge)
{
b.E1 = null;
}
else
throw new InvalidOperationException("lolnope2");
// follow next edge
edge = b.E0 ?? b.E1;
if (edge == null)
break;
// null border in edge
if (edge.B0 == b)
{
edge.B0 = null;
if (edge == firstEdge) // closed loop
result.Add(edge.B);
}
else if (edge.B1 == b)
{
edge.B1 = null;
if (edge == firstEdge) // closed loop
result.Add(edge.A);
}
else
throw new InvalidOperationException("lolnope3");
// null edge in border
if (b.E0 == edge)
{
b.E0 = null;
}
else if (b.E1 == edge)
{
b.E1 = null;
}
else
throw new InvalidOperationException("lolnope4");
}
return result;
}