
/*
 * Java Rubik's Cube
 * -----------------
 *
 * Copyright 1996, Song Li  
 * URL: www.cs.umbc.edu/~sli2
 *
 * 
 * You can use the code for any nonprofittable use. But remember to mention
 * the authors' names in your revised program. You are also encouraged to
 * improve the program or give your comments and bug reports. If there are
 * further questions, please contact me and I'll be glad to help. My E-Mail
 * address is: sli2@gl.umbc.edu.
 *
 */



import java.awt.Color ;




class CubePlane extends Object3D {

    final static int XPlane = 0 ;
    final static int YPlane = 1 ;
    final static int ZPlane = 2 ;

    private final int TransFace [] [] = {
        {0, 1, 2, 3, 4, 5} ,
        {2, 3, 4, 5, 0, 1} ,
        {4, 5, 0, 1, 2, 3} } ;

    private Vertex PlaneVertex [] = new Vertex [8] ;
    private Face   PlaneFace   [] = new Face   [6] ;
        

    private int Plane ;
    private int Axis  ;
    


    CubePlane (int axis, int plane) {
        Plane = plane ;
        Axis  = axis ;
        NewPlane (PlaneVertex, PlaneFace) ;
        Define (PlaneVertex, 8, PlaneFace, 6) ;
    }



    public void Reset () {
        Define (PlaneVertex, 8, PlaneFace, 6) ;
    }



    public void SetMap (Color map [][][]) {
        if (Plane == 0)
            ((CubeFace) Faces[0]).SetMap (map [TransFace[Axis][0]]) ;
        
        if (Plane == 2)
            ((CubeFace) Faces[1]).SetMap (map [TransFace[Axis][1]]) ;

        for (int i=2; i<=3; i++)
            for (int h=0; h<3; h++)
                ((CubeFace) Faces[i]).SetMap (map [TransFace[Axis][i]] [Plane] [h], h, 0) ;

        for (int i=4; i<=5; i++)
            for (int h=0; h<3; h++)
                ((CubeFace) Faces[i]).SetMap (map [TransFace[Axis][i]] [h] [Plane], h, 0) ;
    }




    public void Spin (boolean counterclock) {
        double theta = (counterclock ? 15 : -15) * Math.PI / 180 ;
        switch (Axis) {
            case XPlane: XRotate (theta);  break;
            case YPlane: YRotate (theta);  break;
            case ZPlane: ZRotate (theta);  break;
        }
        Transform () ;
    }




    private void NewPlane (Vertex vertex [], Face face []) {

        switch (Axis) {
            case XPlane: 
                 vertex[0] = new Vertex (-3+Plane*2, -3, -3) ;
                 vertex[1] = new Vertex (-3+Plane*2, -3,  3) ;
                 vertex[2] = new Vertex (-3+Plane*2,  3,  3) ;
                 vertex[3] = new Vertex (-3+Plane*2,  3, -3) ;
                 vertex[4] = new Vertex (-1+Plane*2, -3, -3) ;
                 vertex[5] = new Vertex (-1+Plane*2, -3,  3) ;
                 vertex[6] = new Vertex (-1+Plane*2,  3,  3) ;
                 vertex[7] = new Vertex (-1+Plane*2,  3, -3) ;
                 break ;
             
            case YPlane:
                 vertex[0] = new Vertex (-3, -3+Plane*2, -3) ;
                 vertex[1] = new Vertex ( 3, -3+Plane*2, -3) ;
                 vertex[2] = new Vertex ( 3, -3+Plane*2,  3) ;
                 vertex[3] = new Vertex (-3, -3+Plane*2,  3) ;
                 vertex[4] = new Vertex (-3, -1+Plane*2, -3) ;
                 vertex[5] = new Vertex ( 3, -1+Plane*2, -3) ;
                 vertex[6] = new Vertex ( 3, -1+Plane*2,  3) ;
                 vertex[7] = new Vertex (-3, -1+Plane*2,  3) ;
                 break ;
            
            case ZPlane:
                 vertex[0] = new Vertex (-3, -3, -3+Plane*2) ;
                 vertex[1] = new Vertex (-3,  3, -3+Plane*2) ;
                 vertex[2] = new Vertex ( 3,  3, -3+Plane*2) ;
                 vertex[3] = new Vertex ( 3, -3, -3+Plane*2) ;
                 vertex[4] = new Vertex (-3, -3, -1+Plane*2) ;
                 vertex[5] = new Vertex (-3,  3, -1+Plane*2) ;
                 vertex[6] = new Vertex ( 3,  3, -1+Plane*2) ;
                 vertex[7] = new Vertex ( 3, -3, -1+Plane*2) ;
                 break ;
            }
        

        if (Plane == 0)
            face[0] = new CubeFace (3, 3) ;
        else {
            face[0] = new Face (4) ;
            face[0].FaceColor = Color.black ;
            }
        
        if (Plane == 2)
            face[1] = new CubeFace (3, 3) ;
        else {
            face[1] = new Face (4) ;
            face[1].FaceColor = Color.black ;
            }
        
        for (int i=2; i<6; i++)
            face[i] = new CubeFace (3, 1) ;
        

        face[0].Vertices[0] = vertex[0] ;
        face[0].Vertices[1] = vertex[3] ;
        face[0].Vertices[2] = vertex[2] ;
        face[0].Vertices[3] = vertex[1] ;
        
        face[1].Vertices[0] = vertex[4] ;
        face[1].Vertices[1] = vertex[7] ;
        face[1].Vertices[2] = vertex[6] ;
        face[1].Vertices[3] = vertex[5] ;
        
        face[2].Vertices[0] = vertex[0] ;
        face[2].Vertices[1] = vertex[4] ;
        face[2].Vertices[2] = vertex[5] ;
        face[2].Vertices[3] = vertex[1] ;
        
        face[3].Vertices[0] = vertex[3] ;
        face[3].Vertices[1] = vertex[7] ;
        face[3].Vertices[2] = vertex[6] ;
        face[3].Vertices[3] = vertex[2] ;
        
        face[4].Vertices[0] = vertex[0] ;
        face[4].Vertices[1] = vertex[4] ;
        face[4].Vertices[2] = vertex[7] ;
        face[4].Vertices[3] = vertex[3] ;
        
        face[5].Vertices[0] = vertex[1] ;
        face[5].Vertices[1] = vertex[5] ;
        face[5].Vertices[2] = vertex[6] ;
        face[5].Vertices[3] = vertex[2] ;
    }


}

