public static void TriangulateBarMegaQuad(MeshGenerator mesh, Vector3 workingZero, float height, float offset, int cornerIndexA, int cornerIndexB)
    {
        offset -= 0.1f;
        float scale = 0.25f;

        vertexA = (workingZero + (Metrics.CornerFromIndex[cornerIndexA] * scale)) + (Vector3.up * offset);
        vertexB = (workingZero + (Metrics.CornerFromIndex[cornerIndexB] * scale)) + (Vector3.up * offset);
        vertexC = new Vector3(vertexA.x, height, vertexA.z) + (Vector3.up * offset);
        vertexD = new Vector3(vertexB.x, height, vertexB.z) + (Vector3.up * offset);

        uvA = new Vector2(0.5f + (scale / 2f), height);
        uvB = new Vector2(0.5f - (scale / 2f), height);
        uvC = new Vector2(0.5f + (scale / 2f), 0.5f - (scale / 2f));
        uvD = new Vector2(0.5f - (scale / 2f), 0.5f - (scale / 2f));

        mesh.AddTriangle(vertexC, vertexB, vertexA);
        mesh.AddTriangle(vertexD, vertexB, vertexC);

        mesh.AddTriangleUV(uvC, uvB, uvA);
        mesh.AddTriangleUV(uvD, uvB, uvC);

        mesh.AddTriangleTextureProperties(Metrics.megaSurface.properties[(int)MatI.Boards]);
        mesh.AddTriangleTextureProperties(Metrics.megaSurface.properties[(int)MatI.Boards]);

        mesh.AddTriangleColor(Metrics.megaSurface.colors[(int)ColI.Black]);
        mesh.AddTriangleColor(Metrics.megaSurface.colors[(int)ColI.Black]);
    }
    public static void TriangulateHorizontalMegaQuad(MeshGenerator mesh, Vector3 workingZero, int materialIndex, int colorIndex, bool flat = false)
    {
        vertexA = workingZero + Metrics.CornerFromIndex[0];
        vertexB = workingZero + Metrics.CornerFromIndex[1];
        vertexC = workingZero + Metrics.CornerFromIndex[2];
        vertexD = workingZero + Metrics.CornerFromIndex[3];

        uvA = new Vector2(1, 1);
        uvB = new Vector2(1, 0);
        uvC = new Vector2(0, 0);
        uvD = new Vector2(0, 1);

        if (flat == true)
        {
            mesh.AddTriangleUnperturbed(Metrics.PerturbFlat(vertexA), Metrics.PerturbFlat(vertexB), Metrics.PerturbFlat(vertexC));
            mesh.AddTriangleUnperturbed(Metrics.PerturbFlat(vertexC), Metrics.PerturbFlat(vertexD), Metrics.PerturbFlat(vertexA));
        }
        else
        {
            mesh.AddTriangle(vertexA, vertexB, vertexC);
            mesh.AddTriangle(vertexC, vertexD, vertexA);
        }


        mesh.AddTriangleUV(uvA, uvB, uvC);
        mesh.AddTriangleUV(uvC, uvD, uvA);

        mesh.AddTriangleTextureProperties(Metrics.megaSurface.properties[materialIndex]);
        mesh.AddTriangleTextureProperties(Metrics.megaSurface.properties[materialIndex]);

        mesh.AddTriangleColor(Metrics.megaSurface.colors[colorIndex]);
        mesh.AddTriangleColor(Metrics.megaSurface.colors[colorIndex]);
    }
    public static void TriangulateGrateMegaQuad(MeshGenerator mesh, Vector3 workingZero, int materialIndex, int colorIndex, int cornerIndexA, int cornerIndexB)
    {
        float horizontalScale = 0.5f;
        float verticalScale   = 0.5f;
        float height          = Metrics.trimHeight * verticalScale;
        float offset          = -height;

        #region TriangulateHorizontalMegaQuad

        vertexA = (workingZero + Metrics.CornerFromIndex[cornerIndexA]);
        vertexB = (workingZero + (Metrics.CornerFromIndex[cornerIndexA] * horizontalScale));
        vertexC = (workingZero + (Metrics.CornerFromIndex[cornerIndexB] * horizontalScale));
        vertexD = (workingZero + Metrics.CornerFromIndex[cornerIndexB]);

        uvA = new Vector2(1, 1);
        uvB = new Vector2(0.75f, 0.25f);
        uvC = new Vector2(0.25f, 0.25f);
        uvD = new Vector2(0, 1);

        mesh.AddTriangle(vertexA, vertexB, vertexC);
        mesh.AddTriangle(vertexC, vertexD, vertexA);

        mesh.AddTriangleUV(uvA, uvB, uvC);
        mesh.AddTriangleUV(uvC, uvD, uvA);

        mesh.AddTriangleTextureProperties(Metrics.megaSurface.properties[materialIndex]);
        mesh.AddTriangleTextureProperties(Metrics.megaSurface.properties[materialIndex]);

        mesh.AddTriangleColor(Metrics.megaSurface.colors[colorIndex]);
        mesh.AddTriangleColor(Metrics.megaSurface.colors[colorIndex]);

        #endregion

        #region TriangulateReverseVerticalMegaQuad

        vertexA = (workingZero + (Metrics.CornerFromIndex[cornerIndexA] * horizontalScale)) + (Vector3.up * offset);
        vertexB = (workingZero + (Metrics.CornerFromIndex[cornerIndexB] * horizontalScale)) + (Vector3.up * offset);
        vertexC = new Vector3(vertexA.x, height, vertexA.z) + (Vector3.up * offset);
        vertexD = new Vector3(vertexB.x, height, vertexB.z) + (Vector3.up * offset);

        uvA = new Vector2(1, height - offset);
        uvB = new Vector2(verticalScale, height - offset);
        uvC = new Vector2(1, verticalScale);
        uvD = new Vector2(verticalScale, verticalScale);

        mesh.AddTriangle(vertexC, vertexB, vertexD);
        mesh.AddTriangle(vertexA, vertexB, vertexC);

        mesh.AddTriangleUV(uvC, uvB, uvD);
        mesh.AddTriangleUV(uvA, uvB, uvC);

        mesh.AddTriangleTextureProperties(Metrics.megaSurface.properties[materialIndex]);
        mesh.AddTriangleTextureProperties(Metrics.megaSurface.properties[materialIndex]);

        mesh.AddTriangleColor(Metrics.megaSurface.colors[colorIndex]);
        mesh.AddTriangleColor(Metrics.megaSurface.colors[colorIndex]);

        #endregion
    }
    public static void TriangulateHorizontalQuadFlat(MeshGenerator mesh, Vector3 workingZero, int colorIndex)
    {
        vertexA = workingZero + Metrics.CornerFromIndex[0];
        vertexB = workingZero + Metrics.CornerFromIndex[1];
        vertexC = workingZero + Metrics.CornerFromIndex[2];
        vertexD = workingZero + Metrics.CornerFromIndex[3];

        uvA = new Vector2(1, 1);
        uvB = new Vector2(1, 0);
        uvC = new Vector2(0, 0);
        uvD = new Vector2(0, 1);

        mesh.AddTriangleUnperturbed(Metrics.PerturbFlat(vertexA), Metrics.PerturbFlat(vertexB), Metrics.PerturbFlat(vertexC));
        mesh.AddTriangleUnperturbed(Metrics.PerturbFlat(vertexC), Metrics.PerturbFlat(vertexD), Metrics.PerturbFlat(vertexA));

        mesh.AddTriangleUV(uvA, uvB, uvC);
        mesh.AddTriangleUV(uvC, uvD, uvA);

        mesh.AddTriangleColor(Metrics.megaSurface.colors[colorIndex]);
        mesh.AddTriangleColor(Metrics.megaSurface.colors[colorIndex]);
    }
    public static void TriangulateReverseVerticalMegaQuad(MeshGenerator mesh, Vector3 workingZero, float height, float offset, int materialIndex, int colorIndex, int cornerIndexA, int cornerIndexB)
    {
        vertexA = (workingZero + Metrics.CornerFromIndex[cornerIndexA]) + (Vector3.up * offset);
        vertexB = (workingZero + Metrics.CornerFromIndex[cornerIndexB]) + (Vector3.up * offset);
        vertexC = new Vector3(vertexA.x, height, vertexA.z) + (Vector3.up * offset);
        vertexD = new Vector3(vertexB.x, height, vertexB.z) + (Vector3.up * offset);

        uvA = new Vector2(1, height - offset);
        uvB = new Vector2(0, height - offset);
        uvC = new Vector2(1, 0);
        uvD = new Vector2(0, 0);

        mesh.AddTriangle(vertexC, vertexB, vertexD);
        mesh.AddTriangle(vertexA, vertexB, vertexC);

        mesh.AddTriangleUV(uvC, uvB, uvD);
        mesh.AddTriangleUV(uvA, uvB, uvC);

        mesh.AddTriangleTextureProperties(Metrics.megaSurface.properties[materialIndex]);
        mesh.AddTriangleTextureProperties(Metrics.megaSurface.properties[materialIndex]);

        mesh.AddTriangleColor(Metrics.megaSurface.colors[colorIndex]);
        mesh.AddTriangleColor(Metrics.megaSurface.colors[colorIndex]);
    }
    public static void TriangulateReverseHorizontalMegaQuad(MeshGenerator mesh, Vector3 workingZero, int materialIndex, int colorIndex)
    {
        vertexA = workingZero + Metrics.CornerFromIndex[0];
        vertexB = workingZero + Metrics.CornerFromIndex[1];
        vertexC = workingZero + Metrics.CornerFromIndex[2];
        vertexD = workingZero + Metrics.CornerFromIndex[3];

        uvA = new Vector2(1, 1);
        uvB = new Vector2(1, 0);
        uvC = new Vector2(0, 0);
        uvD = new Vector2(0, 1);

        mesh.AddTriangle(vertexA, vertexD, vertexC);
        mesh.AddTriangle(vertexC, vertexB, vertexA);

        mesh.AddTriangleUV(uvA, uvD, uvC);
        mesh.AddTriangleUV(uvC, uvB, uvA);

        mesh.AddTriangleTextureProperties(Metrics.megaSurface.properties[materialIndex]);
        mesh.AddTriangleTextureProperties(Metrics.megaSurface.properties[materialIndex]);

        mesh.AddTriangleColor(Metrics.megaSurface.colors[colorIndex]);
        mesh.AddTriangleColor(Metrics.megaSurface.colors[colorIndex]);
    }