//generates the ends of the platform
        Mesh GenerateEndCaps(Vert[] vertices, bool isStart)
        {
            var vertices2D = new Vector2[vertices.Length];

            if (isStart)
            {
                vertices2D = Array.ConvertAll(vertices, x => new Vector2(x.Vector.x, x.Vector.y));
            }
            else
            {
                vertices2D = Array.ConvertAll(vertices, x => new Vector2(x.Vector.y, x.Vector.x));
            }

            // Use the triangulator to get indices for creating triangles
            var tr = new PlatformHelper.Triangulator(vertices2D);

            int[] indices = tr.Triangulate();

            // Create the mesh
            Mesh msh = new Mesh();

            msh.vertices  = vertices.Select(x => x.Vector).ToArray();;
            msh.triangles = indices;
            return(msh);
        }
        //generates a rectangular mesh with verts, tris, and uvs.
        Mesh GenerateMeshFromPoints(Vector3[] vertices, float uvLengthDistance, float uvWidthDistance, Vector2[] previousUvs, Vector2[] previousWidthUvs)
        {
            var vertices2D = new Vector2[vertices.Length];
            var cross      = Vector3.Cross(vertices[1] - vertices[0], vertices[2] - vertices[1]);

            if (cross.x != 0)
            {
                if (cross.x < 0)
                {
                    vertices2D = Array.ConvertAll(vertices, x => new Vector2(x.z, x.y));
                }
                else
                {
                    vertices2D = Array.ConvertAll(vertices, x => new Vector2(x.y, x.z));
                }
            }
            else if (cross.y != 0)
            {
                if (cross.y < 0)
                {
                    vertices2D = Array.ConvertAll(vertices, x => new Vector2(x.x, x.z));
                }
                else
                {
                    vertices2D = Array.ConvertAll(vertices, x => new Vector2(x.z, x.x));
                }
            }
            else if (cross.z != 0)
            {
                if (cross.z < 0)
                {
                    vertices2D = Array.ConvertAll(vertices, x => new Vector2(x.x, x.y));
                }
                else
                {
                    vertices2D = Array.ConvertAll(vertices, x => new Vector2(x.y, x.x));
                }
            }

            // Use the triangulator to get indices for creating triangles
            var tr = new PlatformHelper.Triangulator(vertices2D);

            int[] indices = tr.Triangulate();

            //uvs
            var currentUvLengthDistance = (Mathf.Abs(Vector3.Distance(vertices[0], vertices[3])) / uvLengthDistance);
            var currentUvWidthDistance  = (Mathf.Abs(Vector3.Distance(vertices[0], vertices[1])) / uvWidthDistance);
            var uvs = new Vector2[4];

            uvs[3] = new Vector2(previousUvs[0].x, previousWidthUvs[2].y);
            uvs[2] = new Vector2(previousUvs[1].x, previousWidthUvs[1].y + currentUvWidthDistance);
            uvs[1] = new Vector2(previousUvs[0].x + currentUvLengthDistance, previousWidthUvs[2].y + currentUvWidthDistance);
            uvs[0] = new Vector2(previousUvs[1].x + currentUvLengthDistance, previousWidthUvs[1].y);

            // Create the mesh
            Mesh msh = new Mesh();

            msh.vertices  = vertices;
            msh.triangles = indices;
            msh.uv        = uvs;
            return(msh);
        }