// example file for glut-gl
// author: Matteo Lucarelli

#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
#include <math.h>

#define TIME_MS 50

int ang=0;
int solid=0;

void display_cb()
{
	glClear(GL_COLOR_BUFFER_BIT);
	glColor3d( 1.0, 1.0, 1.0 ); 
	glLoadIdentity();
	
	// x,y,z (posizione) 
	// x1,y1,z1 (direzione sguardo) 
	// vx,vy,vz (direzione alto)
	gluLookAt(4*sin(ang/180.0*M_PI),0,4*cos(ang/180.0*M_PI),0,0,0,0,1,0);
	
	switch (solid){
		case 0: glutWireTetrahedron();break;
		case 1:	glutWireCube(1);break;
		case 2: glutWireOctahedron();break;
		case 3: glutWireDodecahedron();break;
		case 4:	glutWireIcosahedron();break;
	}
	
	glutSwapBuffers( );
}

void reshape_cb(int w,int h)
{
	glViewport(0,0,(GLsizei)w,(GLsizei)h);
	
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	// view-angle-y,x-y-ratio,clip-near,clip-far
	gluPerspective(60,1,0,20);
	glMatrixMode(GL_MODELVIEW);
}

void timer_cb(int val)
{
	// set next timer
	glutTimerFunc(TIME_MS,timer_cb,0);

	ang=(ang+5)%360;
	glutPostRedisplay( );
}

void mouse_cb( int button, int updown, int x, int y )
{
	if(updown == GLUT_DOWN) solid=++solid%5;
}

int main(int argc, char** argv)
{
	glutInit( &argc, argv );
	glutInitDisplayMode( GLUT_DOUBLE );
	glutInitWindowSize( 200, 200 );
	glutCreateWindow("click me");
		
	glutDisplayFunc(display_cb);
	glutReshapeFunc(reshape_cb);
        glutTimerFunc(TIME_MS,timer_cb,0);
        glutMouseFunc( mouse_cb );

	glutMainLoop();
	return 0;
}
