/*************************************************************************

PROBLEM STATEMENT - 
IMPLEMENT CUBE ROTATION ABOUT VERTICAL AXIS PASSING THROUGH ITS CENTROID.

*************************************************************************/


#include <GL/glut.h>
#include<stdio.h>

static int flag = 0;

float angle = 0;

void Display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//1.clear
    glLoadIdentity();

    //2.draw whatever you want and change for next frame
    glTranslatef(0,0,-5);//z=0 is at origin, i.e. biggest, z=-50 is farthest

    if(flag == -1)
    glRotatef(angle,1,0,0);

if(flag == 0)
    glRotatef(angle,0,1,0);

if(flag == 1)
    glRotatef(angle,0,0,1);

    glBegin(GL_QUADS);

         //front
        glColor3f(1,0,0);
        glVertex3f(-1,1,1);
        glVertex3f(-1,-1,1);
        glVertex3f(1,-1,1);
        glVertex3f(1,1,1);

        //back
        glColor3f(0,1,0);
        glVertex3f(1,1,-1);
        glVertex3f(1,-1,-1);
        glVertex3f(-1,-1,-1);
        glVertex3f(-1,1,-1);

        //right
        glColor3f(0,0,1);
        glVertex3f(1,1,1);
        glVertex3f(1,-1,1);
        glVertex3f(1,-1,-1);
        glVertex3f(1,1,-1);
        //left
        glColor3f(1,1,0);
        glVertex3f(-1,1,-1);
        glVertex3f(-1,-1,-1);
        glVertex3f(-1,-1,1);
        glVertex3f(-1,1,1);
        //top
        glColor3f(0,1,1);
        glVertex3f(-1,1,-1);
        glVertex3f(-1,1,1);
        glVertex3f(1,1,1);
        glVertex3f(1,1,-1);
        //bottom
        glColor3f(1,0,1);
        glVertex3f(-1,-1,-1);
        glVertex3f(-1,-1,1);
        glVertex3f(1,-1,1);
        glVertex3f(1,-1,-1);

    glEnd();

    glFlush();//3.display finally

    glutSwapBuffers();

}

void Reshape(int w, int h)
{
    glViewport(0,0,w,h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(60,1,1,50);//i.e. user it at origin,
    //then he can view up to -50 on z-axis
    //perspective mode (instead of orthographic mode)
    //parameters: field of view, width:height ratio,
    //near frame dist, far frame dist
 
    glMatrixMode(GL_MODELVIEW);
}

void Mouse(int  button, int state, int x, int y)
{
    if(button == GLUT_LEFT_BUTTON && state == GLUT_DOWN)
    {
        flag = -1;
        printf("\nRotation axis changed to : X-axis\n");
    }

    else if(button == GLUT_MIDDLE_BUTTON && state == GLUT_DOWN)
    {
        flag = 0;
        printf("\nRotation axis changed to : Y-axis\n");
    }

    else if(button == GLUT_RIGHT_BUTTON && state == GLUT_DOWN)
    {
        flag = 1;
        printf("\nRotation axis changed to : Z-axis\n");
    }
}

void timer(int)
{
    glutPostRedisplay();
    glutTimerFunc(300/60,timer,0);

    angle+=0.8;
        if(angle > 360)
       angle -= 360;
}

//-----------------------MAIN----------------//

int main(int argc, char **argv)
{

    printf("\n*Use Mouse to change the axis of rotation:"
        "\n*Left-Click: X-axis"
        "\n*Middle-Click: Y-axis"
        "\n*Right-click: Z-zxis\n");
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);

    glutInitWindowPosition(100,200);
    glutInitWindowSize(500,500);


    glutCreateWindow("CUBE ROTATION");
    glutDisplayFunc(Display);
    glutReshapeFunc(Reshape);
    glutMouseFunc(Mouse);


    glutTimerFunc(0,timer,0);

    glEnable(GL_DEPTH_TEST);

    glutMainLoop();

    return 0;
}