void CalculateMeshContour () {
if (mesh == null) return;
edges.Clear();
pointers.Clear();
Vector3[] verts = mesh.vertices;
int[] tris = mesh.triangles;
for (int i=0;i<tris.Length;i+=3) {
// Make sure it is clockwise
if ( Polygon.IsClockwise ( verts[tris[i+0]], verts[tris[i+1]], verts[tris[i+2]] ) ) {
int tmp = tris[i+0];
tris[i+0] = tris[i+2];
tris[i+2] = tmp;
}
edges[new Pathfinding.Int2(tris[i+0],tris[i+1])] = i;
edges[new Pathfinding.Int2(tris[i+1],tris[i+2])] = i;
edges[new Pathfinding.Int2(tris[i+2],tris[i+0])] = i;
}
for (int i=0;i<tris.Length;i+=3) {
for (int j=0;j<3;j++) {
if (!edges.ContainsKey(new Pathfinding.Int2(tris[i+((j+1)%3)], tris[i+((j+0)%3)]))) {
pointers[tris[i+((j+0)%3)]] = tris[i+((j+1)%3)];
}
}
}
List<Vector3[]> contourBuffer = new List<Vector3[]>();
List<Vector3> buffer = Pathfinding.Util.ListPool<Vector3>.Claim();
for (int i=0;i<verts.Length;i++) {
if (pointers.ContainsKey(i)) {
buffer.Clear();
int s = i;
do {
int tmp = pointers[s];
//This path has been taken before
if (tmp == -1) break;
pointers[s] = -1;
buffer.Add (verts[s]);
//Debug.Log ("From " + s + " to " + tmp);
s = tmp;
if (s == -1) {
Debug.LogError ("Invalid Mesh '" + mesh.name + " in " + gameObject.name);
break;
}
} while (s != i);
if (buffer.Count > 0) contourBuffer.Add (buffer.ToArray());
}
}
Pathfinding.Util.ListPool<Vector3>.Release(buffer);
contours = contourBuffer.ToArray();
}