void InitializeFace(ref Cube newCube, ref Cube oldCube, string face)
        {
            switch (face)
            {
            case "minY":

                newCube.vertices[4]  = oldCube.vertices[0];
                newCube.vertices[16] = oldCube.vertices[8];
                newCube.vertices[5]  = oldCube.vertices[1];
                newCube.vertices[17] = oldCube.vertices[9];
                newCube.vertices[6]  = oldCube.vertices[2];
                newCube.vertices[18] = oldCube.vertices[10];
                newCube.vertices[7]  = oldCube.vertices[3];
                newCube.vertices[19] = oldCube.vertices[11];

                newCube.UpdateFace();

                break;

            case "maxY":

                newCube.vertices[0]  = oldCube.vertices[4];
                newCube.vertices[8]  = oldCube.vertices[16];
                newCube.vertices[1]  = oldCube.vertices[5];
                newCube.vertices[9]  = oldCube.vertices[17];
                newCube.vertices[2]  = oldCube.vertices[6];
                newCube.vertices[10] = oldCube.vertices[18];
                newCube.vertices[3]  = oldCube.vertices[7];
                newCube.vertices[11] = oldCube.vertices[19];
                newCube.UpdateFace();
                break;

            case "minX":

                newCube.vertices[5]  = oldCube.vertices[4];
                newCube.vertices[13] = oldCube.vertices[12];
                newCube.vertices[1]  = oldCube.vertices[0];
                newCube.vertices[9]  = oldCube.vertices[11];
                newCube.vertices[14] = oldCube.vertices[15];
                newCube.vertices[6]  = oldCube.vertices[7];
                newCube.vertices[17] = oldCube.vertices[19];
                newCube.vertices[2]  = oldCube.vertices[3];
                newCube.UpdateFace();
                break;

            case "maxX":

                newCube.vertices[4]  = oldCube.vertices[5];
                newCube.vertices[12] = oldCube.vertices[13];
                newCube.vertices[0]  = oldCube.vertices[1];
                newCube.vertices[11] = oldCube.vertices[9];
                newCube.vertices[15] = oldCube.vertices[14];
                newCube.vertices[7]  = oldCube.vertices[6];
                newCube.vertices[19] = oldCube.vertices[17];
                newCube.vertices[3]  = oldCube.vertices[2];
                newCube.UpdateFace();

                break;

            case "minZ":
                newCube.vertices[0]  = oldCube.vertices[3];
                newCube.vertices[8]  = oldCube.vertices[10];
                newCube.vertices[1]  = oldCube.vertices[2];
                newCube.vertices[13] = oldCube.vertices[14];
                newCube.vertices[5]  = oldCube.vertices[6];
                newCube.vertices[16] = oldCube.vertices[18];
                newCube.vertices[4]  = oldCube.vertices[7];
                newCube.vertices[12] = oldCube.vertices[15];
                newCube.UpdateFace();

                break;

            case "maxZ":

                newCube.vertices[3]  = oldCube.vertices[0];
                newCube.vertices[10] = oldCube.vertices[8];
                newCube.vertices[2]  = oldCube.vertices[1];
                newCube.vertices[14] = oldCube.vertices[13];
                newCube.vertices[6]  = oldCube.vertices[5];
                newCube.vertices[18] = oldCube.vertices[16];
                newCube.vertices[7]  = oldCube.vertices[4];
                newCube.vertices[15] = oldCube.vertices[12];
                newCube.UpdateFace();
                break;
            }
        }
        void UpdateEdges(ref Cube c)
        {
            for (int i = 0; i < Model.Count; i++)
            {
                Cube c1 = Model[i];

                if (c.TransCube.edges[0].Equals(c1.TransCube.edges[1]))
                {
                    c.edges[0].Set(ref c1.edges[1]);
                }
                if (c.TransCube.edges[0].Equals(c1.TransCube.edges[2]))
                {
                    c.edges[0].Set(ref c1.edges[2]);
                }
                if (c.TransCube.edges[0].Equals(c1.TransCube.edges[3]))
                {
                    c.edges[0].Set(ref c1.edges[3]);
                }

                if (c.TransCube.edges[1].Equals(c1.TransCube.edges[2]))
                {
                    c.edges[1].Set(ref c1.edges[2]);
                }
                if (c.TransCube.edges[1].Equals(c1.TransCube.edges[3]))
                {
                    c.edges[1].Set(ref c1.edges[3]);
                }
                if (c.TransCube.edges[1].Equals(c1.TransCube.edges[0]))
                {
                    c.edges[1].Set(ref c1.edges[0]);
                }

                if (c.TransCube.edges[2].Equals(c1.TransCube.edges[3]))
                {
                    c.edges[2].Set(ref c1.edges[3]);
                }
                if (c.TransCube.edges[2].Equals(c1.TransCube.edges[0]))
                {
                    c.edges[2].Set(ref c1.edges[0]);
                }
                if (c.TransCube.edges[2].Equals(c1.TransCube.edges[1]))
                {
                    c.edges[2].Set(ref c1.edges[1]);
                }

                if (c.TransCube.edges[3].Equals(c1.TransCube.edges[0]))
                {
                    c.edges[3].Set(ref c1.edges[0]);
                }
                if (c.TransCube.edges[3].Equals(c1.TransCube.edges[1]))
                {
                    c.edges[3].Set(ref c1.edges[1]);
                }
                if (c.TransCube.edges[3].Equals(c1.TransCube.edges[2]))
                {
                    c.edges[3].Set(ref c1.edges[2]);
                }

                if (c.TransCube.edges[4].Equals(c1.TransCube.edges[8]))
                {
                    c.edges[4].Set(ref c1.edges[8]);
                }
                if (c.TransCube.edges[4].Equals(c1.TransCube.edges[10]))
                {
                    c.edges[4].Set(ref c1.edges[10]);
                }
                if (c.TransCube.edges[4].Equals(c1.TransCube.edges[6]))
                {
                    c.edges[4].Set(ref c1.edges[6]);
                }

                if (c.TransCube.edges[5].Equals(c1.TransCube.edges[9]))
                {
                    c.edges[5].Set(ref c1.edges[9]);
                }
                if (c.TransCube.edges[5].Equals(c1.TransCube.edges[7]))
                {
                    c.edges[5].Set(ref c1.edges[7]);
                }
                if (c.TransCube.edges[5].Equals(c1.TransCube.edges[11]))
                {
                    c.edges[5].Set(ref c1.edges[11]);
                }

                if (c.TransCube.edges[6].Equals(c1.TransCube.edges[4]))
                {
                    c.edges[6].Set(ref c1.edges[4]);
                }
                if (c.TransCube.edges[6].Equals(c1.TransCube.edges[10]))
                {
                    c.edges[6].Set(ref c1.edges[10]);
                }
                if (c.TransCube.edges[6].Equals(c1.TransCube.edges[8]))
                {
                    c.edges[6].Set(ref c1.edges[8]);
                }

                if (c.TransCube.edges[7].Equals(c1.TransCube.edges[9]))
                {
                    c.edges[7].Set(ref c1.edges[9]);
                }
                if (c.TransCube.edges[7].Equals(c1.TransCube.edges[5]))
                {
                    c.edges[7].Set(ref c1.edges[5]);
                }
                if (c.TransCube.edges[7].Equals(c1.TransCube.edges[11]))
                {
                    c.edges[7].Set(ref c1.edges[11]);
                }

                if (c.TransCube.edges[8].Equals(c1.TransCube.edges[4]))
                {
                    c.edges[8].Set(ref c1.edges[4]);
                }
                if (c.TransCube.edges[8].Equals(c1.TransCube.edges[6]))
                {
                    c.edges[8].Set(ref c1.edges[6]);
                }
                if (c.TransCube.edges[8].Equals(c1.TransCube.edges[10]))
                {
                    c.edges[8].Set(ref c1.edges[10]);
                }

                if (c.TransCube.edges[9].Equals(c1.TransCube.edges[11]))
                {
                    c.edges[9].Set(ref c1.edges[11]);
                }
                if (c.TransCube.edges[9].Equals(c1.TransCube.edges[7]))
                {
                    c.edges[9].Set(ref c1.edges[7]);
                }
                if (c.TransCube.edges[9].Equals(c1.TransCube.edges[5]))
                {
                    c.edges[9].Set(ref c1.edges[5]);
                }

                if (c.TransCube.edges[10].Equals(c1.TransCube.edges[6]))
                {
                    c.edges[10].Set(ref c1.edges[6]);
                }
                if (c.TransCube.edges[10].Equals(c1.TransCube.edges[8]))
                {
                    c.edges[10].Set(ref c1.edges[8]);
                }
                if (c.TransCube.edges[10].Equals(c1.TransCube.edges[4]))
                {
                    c.edges[10].Set(ref c1.edges[4]);
                }

                if (c.TransCube.edges[11].Equals(c1.TransCube.edges[7]))
                {
                    c.edges[11].Set(ref c1.edges[7]);
                }
                if (c.TransCube.edges[11].Equals(c1.TransCube.edges[5]))
                {
                    c.edges[11].Set(ref c1.edges[5]);
                }
                if (c.TransCube.edges[11].Equals(c1.TransCube.edges[9]))
                {
                    c.edges[11].Set(ref c1.edges[9]);
                }
            }
            foreach (Cube t in Model)
            {
                t.VertexToEdges();
            }
            c.VertexToEdges();
            c.UpdateFace();
        }
        void InitializeEdge(ref Cube edited, ref Cube c, int edge)
        {
            switch (edge)
            {
            case 1:
                if (((edited.TransCube.vertices[0].Equals(c.TransCube.vertices[7])) && (edited.TransCube.vertices[1].Equals(c.TransCube.vertices[6]))))
                {
                    edited.vertices[0] = c.vertices[7];
                    edited.vertices[1] = c.vertices[6];
                    edited.vertices[8] = c.vertices[18];
                    edited.UpdateFace();
                }

                break;

            case 2:
                if (((edited.TransCube.vertices[1].Equals(c.TransCube.vertices[4])) && (edited.TransCube.vertices[2].Equals(c.TransCube.vertices[7]))))
                {
                    edited.vertices[1] = c.vertices[4];
                    edited.vertices[2] = c.vertices[7];
                    edited.vertices[9] = c.vertices[19];
                    edited.UpdateFace();
                }
                break;


            case 3:
                if (((edited.TransCube.vertices[2].Equals(c.TransCube.vertices[5])) && (edited.TransCube.vertices[3].Equals(c.TransCube.vertices[4]))))
                {
                    edited.vertices[2]  = c.vertices[5];
                    edited.vertices[3]  = c.vertices[4];
                    edited.vertices[10] = c.vertices[16];
                    edited.UpdateFace();
                }
                break;

            case 4:
                if (((edited.TransCube.vertices[0].Equals(c.TransCube.vertices[5])) && (edited.TransCube.vertices[3].Equals(c.TransCube.vertices[6]))))
                {
                    edited.vertices[0]  = c.vertices[5];
                    edited.vertices[3]  = c.vertices[6];
                    edited.vertices[11] = c.vertices[17];
                    edited.UpdateFace();
                }
                break;

            case 5:
                if (((edited.TransCube.vertices[4].Equals(c.TransCube.vertices[3])) && (edited.TransCube.vertices[5].Equals(c.TransCube.vertices[2]))))
                {
                    edited.vertices[4]  = c.vertices[3];
                    edited.vertices[5]  = c.vertices[2];
                    edited.vertices[16] = c.vertices[10];
                    edited.UpdateFace();
                }
                break;

            case 6:
                if (((edited.TransCube.vertices[5].Equals(c.TransCube.vertices[0])) && (edited.TransCube.vertices[6].Equals(c.TransCube.vertices[3]))))
                {
                    edited.vertices[5]  = c.vertices[0];
                    edited.vertices[6]  = c.vertices[3];
                    edited.vertices[17] = c.vertices[11];
                    edited.UpdateFace();
                }
                break;

            case 7:
                if (((edited.TransCube.vertices[7].Equals(c.TransCube.vertices[0])) && (edited.TransCube.vertices[6].Equals(c.TransCube.vertices[1]))))
                {
                    edited.vertices[7]  = c.vertices[0];
                    edited.vertices[6]  = c.vertices[1];
                    edited.vertices[18] = c.vertices[8];
                    edited.UpdateFace();
                }
                break;

            case 8:
                if (((edited.TransCube.vertices[4].Equals(c.TransCube.vertices[1])) && (edited.TransCube.vertices[7].Equals(c.TransCube.vertices[2]))))
                {
                    edited.vertices[4]  = c.vertices[1];
                    edited.vertices[7]  = c.vertices[2];
                    edited.vertices[19] = c.vertices[9];
                    edited.UpdateFace();
                }
                break;

            case 9:
                if (((edited.TransCube.vertices[0].Equals(c.TransCube.vertices[2])) && (edited.TransCube.vertices[4].Equals(c.TransCube.vertices[6]))))
                {
                    edited.vertices[0]  = c.vertices[2];
                    edited.vertices[4]  = c.vertices[6];
                    edited.vertices[12] = c.vertices[14];
                    edited.UpdateFace();
                }
                break;

            case 10:

                if (((edited.TransCube.vertices[5].Equals(c.TransCube.vertices[7])) && (edited.TransCube.vertices[1].Equals(c.TransCube.vertices[3]))))
                {
                    edited.vertices[5]  = c.vertices[7];
                    edited.vertices[1]  = c.vertices[3];
                    edited.vertices[13] = c.vertices[15];
                    edited.UpdateFace();
                }
                break;

            case 11:
                if (((edited.TransCube.vertices[6].Equals(c.TransCube.vertices[4])) && (edited.TransCube.vertices[2].Equals(c.TransCube.vertices[0]))))
                {
                    edited.vertices[6]  = c.vertices[4];
                    edited.vertices[2]  = c.vertices[0];
                    edited.vertices[14] = c.vertices[12];
                    edited.UpdateFace();
                }
                break;

            case 12:
                if (((edited.TransCube.vertices[7].Equals(c.TransCube.vertices[5])) && (edited.TransCube.vertices[3].Equals(c.TransCube.vertices[1]))))
                {
                    edited.vertices[7]  = c.vertices[5];
                    edited.vertices[3]  = c.vertices[1];
                    edited.vertices[15] = c.vertices[13];
                    edited.UpdateFace();
                }

                break;
            }
        }