public static MeshEdge FindMeshEdge(Vector3 direction, Bounds tileBounds, Mesh mesh)
        {
            var vertices = GetBoundryVertices(direction, tileBounds, mesh);

            vertices = RemoveDubles(vertices);

            MeshEdge edge = FindEdge(vertices, direction);

            return(edge);
        }
        private static MeshEdge FindEdge(List <Vertex> vertices, Vector3 direction)
        {
            var edgeVertices = new List <Vector3>();
            var edges        = new List <int>();

            for (int i = 0; i < vertices.Count; i++)
            {
                for (int j = i + 1; j < vertices.Count; j++)
                {
                    HashSet <int> common = new HashSet <int>(vertices[i].triangles);
                    common.IntersectWith(vertices[j].triangles);
                    if (common.Count == 1)
                    {
                        Vector3 v1 = vertices[i].position;
                        Vector3 v2 = vertices[j].position;

                        if (edgeVertices.Contains(v1) == false)
                        {
                            edgeVertices.Add(v1);
                        }
                        if (edgeVertices.Contains(v2) == false)
                        {
                            edgeVertices.Add(v2);
                        }

                        int indexV1 = edgeVertices.IndexOf(v1);
                        int indexV2 = edgeVertices.IndexOf(v2);

                        edges.Add(indexV1);
                        edges.Add(indexV2);
                    }
                }
            }

            var meshEdge = new MeshEdge(edgeVertices.ToArray(), edges.ToArray(), direction);

            return(meshEdge);
        }