public bool GenerateMesh(Globals.MeshData Mesh)
    {
        bool refreshRequired = false;

        State = StateEnum.Meshed;
        for (byte Dir = 0; Dir < 6; Dir++)
        {
            var B0 = (byte)(SubBlock.Occlude & (1 << Dir));
            if (B0 <= 0)
            {
                continue;
            }
            if (!(Neighbor[Globals.DirectionVector[Dir].x + 1, Globals.DirectionVector[Dir].y + 1, Globals.DirectionVector[Dir].z + 1] == null))
            {
                var B1 = (byte)(Neighbor[Globals.DirectionVector[Dir].x + 1, Globals.DirectionVector[Dir].y + 1, Globals.DirectionVector[Dir].z + 1].SubBlock.Occlude & (1 << (5 - Dir)));
                if (B1 == 0)
                {
                    if (addFace(Mesh, Dir))
                    {
                        refreshRequired = true;
                    }
                    else
                    {
                        State = StateEnum.ValidCP;
                        return(false);
                    }
                }
            }
        }
        return(refreshRequired);
    }
    public static bool GenerateMesh(Globals.MeshData Mesh, BlockClass Block)
    {
        bool refreshRequired = false;

        // if (State < StateEnum.ValidCP) {
        //     CalculateControlPoint(this);
        // }
        Block.State = StateEnum.Meshed;
        for (byte Dir = 0; Dir < 6; Dir++)
        {
            var B0 = (byte)(Block.SubBlock.Occlude & (1 << Dir));
            if (B0 <= 0)
            {
                continue;
            }
            if (!(Block.Neighbor[Globals.DirectionVector[Dir].x + 1, Globals.DirectionVector[Dir].y + 1, Globals.DirectionVector[Dir].z + 1] == null))
            {
                var B1 = (byte)(Block.Neighbor[Globals.DirectionVector[Dir].x + 1, Globals.DirectionVector[Dir].y + 1, Globals.DirectionVector[Dir].z + 1].SubBlock.Occlude & (1 << (5 - Dir)));
                if (B1 == 0)
                {
                    if (Block.addFace(Mesh, Dir))
                    {
                        refreshRequired = true;
                    }
                    else
                    {
                        Block.State = StateEnum.ValidCP;
                        return(false);
                    }
                }
            }
        }
        return(refreshRequired);
    }
    private bool addFace(Globals.MeshData Mesh, byte dir)
    {
        for (var i = 0; i < 4; i++)
        {
            var blk = FacePoints[BlockFaces[dir, i]];
            if (Neighbor[blk.x + 1, blk.y + 1, blk.z + 1] == null)
            {
                Mesh.Vertices.RemoveRange(Mesh.Vertices.Count - i, i);
                Mesh.Normals.RemoveRange(Mesh.Normals.Count - i, i);
                return(false);
            }
            if (Neighbor[blk.x + 1, blk.y + 1, blk.z + 1].State < StateEnum.ValidCP)
            {
                Mesh.Vertices.RemoveRange(Mesh.Vertices.Count - i, i);
                Mesh.Normals.RemoveRange(Mesh.Normals.Count - i, i);
                return(false);
            }
            Mesh.Vertices.Add(Position + blk + Neighbor[blk.x + 1, blk.y + 1, blk.z + 1].SubBlock.ControlPoint - Chunk.Position);
            Mesh.Normals.Add(Globals.DirectionVector[dir]);
        }

        var v1 = Mesh.Vertices[Mesh.Vertices.Count - 1] -
                 Mesh.Vertices[Mesh.Vertices.Count - 2];
        var v2 = Mesh.Vertices[Mesh.Vertices.Count - 3] -
                 Mesh.Vertices[Mesh.Vertices.Count - 2];

        var N = Vector3.Cross(v1, v2).normalized;

        if (N.y > .3)
        {
            dir = (byte)Globals.Direction.Up; //Up
        }
        var sc = Mesh.Vertices.Count - 4;     // squareCount << 2;//Multiply by 4

        if ((Mesh.Vertices[Mesh.Vertices.Count - 3] - Mesh.Vertices[Mesh.Vertices.Count - 1]).sqrMagnitude < (Mesh.Vertices[Mesh.Vertices.Count - 4] - Mesh.Vertices[Mesh.Vertices.Count - 2]).sqrMagnitude)
        {
            Mesh.Triangles.Add(sc);
            Mesh.Triangles.Add(sc + 1);
            Mesh.Triangles.Add(sc + 3);
            Mesh.Triangles.Add(sc + 1);
            Mesh.Triangles.Add(sc + 2);
            Mesh.Triangles.Add(sc + 3);
        }
        else
        {
            Mesh.Triangles.Add(sc);
            Mesh.Triangles.Add(sc + 1);
            Mesh.Triangles.Add(sc + 2);
            Mesh.Triangles.Add(sc);
            Mesh.Triangles.Add(sc + 2);
            Mesh.Triangles.Add(sc + 3);
        }

        //var v = blocks[center.x + 1][center.y + 1][center.z + 1].GetTex();
        var v = SubBlock.Texture;

        var uv = new Vector2(v[dir].x / 16f + pixelOffset, (15 - v[dir].y) / 16f + pixelOffset);

        Mesh.UVs.Add(uv);
        Mesh.UVs.Add(new Vector2(uv.x + SubBlock.TexUnit - pixelOffset2, uv.y));
        Mesh.UVs.Add(new Vector2(uv.x + SubBlock.TexUnit - pixelOffset2, uv.y + SubBlock.TexUnit - pixelOffset2));
        Mesh.UVs.Add(new Vector2(uv.x, uv.y + SubBlock.TexUnit - pixelOffset2));
        return(true);
        //squareCount++;
    }