void BuildTestingGrid()
    {
        gameObject.GetComponent<MeshFilter>().mesh = mesh = new Mesh();
        mesh.name = "Variable Mesh";

        vertices = new List<Vector3>();
        triangles = new List<int>();
        uvs = new List<Vector2>();

        gridPoints = new List<GridPoint03>();

        for (int y = 0; y < depthHeight; y += gridStep)
        {
            for (int x = 0; x < depthWidth; x += gridStep)
            {
                int depthIndex = x + (y * depthWidth);
                GridPoint03 gp = new GridPoint03(x, y, depthIndex);
                gp.Reset();
                gridPoints.Add(gp);
            }
        }
        gridWidth = (int)Mathf.Floor(depthWidth / gridStep);
        gridHeight = (int)Mathf.Floor(depthHeight / gridStep);
    }
    void GenerateMeshPerFrame()
    {
        mesh.Clear();

        vertices.Clear();
        triangles.Clear();
        uvs.Clear();

        int halfDepthWidth = depthWidth / 2;
        int halfDepthHeight = depthHeight / 2;

        // FIRST RESET ANY EXISTING GRID VERTEX DATA
        foreach ( GridPoint03 gp in gridPoints)
        {
            gp.Reset();
        }

        GridPoint03[] testingSquare = new GridPoint03[4];

        // NOW REEVALUATE THE GRID, CALCULATING EACH SQUARE TO FIND ACCEPTABLE TRIANGLES
        for (int gridIndex = 0, y = 0; y < gridHeight; y++, gridIndex++)
        {
            for (int x = 0; x < gridWidth; x++, gridIndex++)
            {

                GridPoint03 a = testingSquare[0] = gridPoints[gridIndex];
                GridPoint03 b = testingSquare[1] = gridPoints[gridIndex + 1];
                GridPoint03 c = testingSquare[2] = gridPoints[gridIndex + gridWidth + 1];
                GridPoint03 d = testingSquare[3] = gridPoints[gridIndex + gridWidth + 2];

                // EVALUATE THE TESTING SQUARE FOR GridPoints THAT SHOULD BE CONVERTED TO VERTICES
                foreach ( GridPoint03 gp in testingSquare)
                {
                    // IF THE GRIDPOINT IS IN THE BODY SILHOUETTE...
                    if (bodyIndexData[gp.DepthIndex] != 255)
                    {
                        // CALUCATE THE WORLD POSITION
                        CameraSpacePoint csp = cameraSpacePoints[gp.DepthIndex];
                        gp.CameraPosition = new Vector3(csp.X, csp.Y, csp.Z);

                        if (float.IsInfinity(gp.CameraPosition.x) ||
                             float.IsInfinity(gp.CameraPosition.y) ||
                            float.IsInfinity(gp.CameraPosition.z))
                        {
                            // THE VERTEX WOULD BE OUT OF BOUNDS SO SKIP
                            continue;
                        }
                        else
                        {
                            // IF IT IS NOT ALREADY A CALCULATED VERTEX FROM A PREVIOUS TESTINGSQUARE
                            if (!gp.IsVertex())
                            {
                                // AND IT LIES WITHIN THE USER DEFINED DEPTH RANGE
                                if (gp.CameraPosition.z > DepthMinimum && gp.CameraPosition.z < DepthMaximum)
                                {
                                    // ADD IT TO OUR VERTEX COLLECTION AND RECORD IT'S VERTEX INDEX
                                    gp.VertexID = vertices.Count;
                                    vertices.Add(gp.CameraPosition);
                                    uvs.Add(new Vector2(gp.DepthX / (float)depthWidth, gp.DepthY / (float)depthHeight));
                                }
                            }
                        }
                    }
                }

                // CALCULATE THE BIT KEY FOR ALL ACCEPTABLE VERTICES IN OUR TESTING SQUARE
                int SquareKey = 0;

                if (a.IsVertex()) SquareKey |= 1;
                if (b.IsVertex()) SquareKey |= 2;
                if (c.IsVertex()) SquareKey |= 4;
                if (d.IsVertex()) SquareKey |= 8;

                switch ( SquareKey)
                {
                    case 0:
                        // NO VERTICES WERE FOUND. DO NOTHING.
                        break;

                    case 7:
                        // A, B, C ARE GOOD
                        addTriangle(a.VertexID, b.VertexID, c.VertexID);
                        break;

                    case 11:
                        // A, B, D ARE GOOD
                        addTriangle(a.VertexID, b.VertexID, d.VertexID);
                        break;

                    case 13:
                        addTriangle(a.VertexID, d.VertexID, c.VertexID);
                        break;

                    case 14:
                        // B, C, D ARE GOOD
                        addTriangle(b.VertexID, d.VertexID, c.VertexID);
                        break;

                    case 15:
                        // ALL GRID POINTS ARE VALID, BUILD TWO TRIANGLES
                        addTriangle(a.VertexID, b.VertexID, c.VertexID);
                        addTriangle(b.VertexID, d.VertexID, c.VertexID);
                        break;

                }
            }
        }

        mesh.vertices = vertices.ToArray();
        mesh.triangles = triangles.ToArray();
        mesh.uv = uvs.ToArray();

        mesh.RecalculateNormals();
    }