/*
	planete.c

	Shpere tournant autour d'un point fixe

	Auteur : Florent Kaisser

	Université de Cergy-Pontoise
*/

#include <stdio.h>
#include <stdlib.h>
#include <SDL/SDL.h>
#include <GL/gl.h>
#include <GL/glu.h>

#define SCREEN_W 800
#define SCREEN_H 600

static int vitesse=2;
static float z=-10.0;


void toggle_fullscreen(void)
{
   SDL_Surface *S; 
   S = SDL_GetVideoSurface(); 

   SDL_WM_ToggleFullScreen(S);
}



/*Dessine la scene*/
void draw_scene(int t){

	GLUquadric *q;

	/*restore la matrice initiale*/
	glPopMatrix();
	glPushMatrix();

	/*efface l'écran*/
	glClear(GL_COLOR_BUFFER_BIT);


	/*On applique un "zoom"*/
	glTranslatef(0.0,0.0,z);
	

	/* Rotation autour du centre de la scéne */
	glRotatef((float)t,0.0,1.0,0.0);
	glTranslatef(0.0,0.0,-5.0);
	
	/*rotation de 90° pour la mettre à l'endroit*/
	glRotatef((float)90.0f,1.0,0.0,0.0);

	/*rotation de la sphere sur elle meme*/
	glRotatef((float)-t*2,0.0,0.0,1.0);

	/*Dessine une sphere de taille 3 avec un maillage de precision 20x20*/
	q=gluNewQuadric();
	gluSphere (q, 3.0,20, 20);

	SDL_GL_SwapBuffers( );


	return;


}

/*adapte la visualisation à la taille de la fenetre*/
void reshape(int screen_w,int screen_h){



	glViewport(0,0, screen_w,screen_h);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluPerspective(60.0,
	                (float)screen_w/ (float)screen_h,
	                1.0,20.0);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
 

	

}

/*Initialise les varaibles d'états d'OpenGL*/
void init_gl(){
	/*fond de la fenetre en noir*/
	glClearColor(0.0, 0.0, 0.0, 1.0);  

	/*Par defaut on se met en mode "fil de fer"*/
	glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);

	/*Sauvegarde la transformation initiale*/
	glPushMatrix();     
}

/*Traite un évenement*/
void process_event(SDL_Event *event){

		switch (event->type) {

		case SDL_VIDEORESIZE:
			SDL_SetVideoMode(event->resize.w,event->resize.h, 24, SDL_OPENGL|SDL_RESIZABLE);
			reshape(event->resize.w,event->resize.h);
			break;		

		case SDL_KEYDOWN:


			switch(event->key.keysym.sym){

// 			//On quite si on appuye sur Echap
			case SDLK_ESCAPE:
				printf("Bye bye...\n");
				exit(0);	
				break;

			case SDLK_SPACE:
				toggle_fullscreen();
				break;

			case SDLK_LEFT:
				vitesse--;
				break;

			case SDLK_RIGHT:
				vitesse++;
				break;


			case SDLK_UP:
				z+=0.2;
				break;

			case SDLK_DOWN:
				z-=0.2;
				break;

			case 'f':
				glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
				SDL_GL_SwapBuffers( );
				break;
			case 'l':
				glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
				SDL_GL_SwapBuffers( );
				break;
			case 'p':
				glPolygonMode(GL_FRONT_AND_BACK,GL_POINT);
				SDL_GL_SwapBuffers( );
				break;
			}

			printf("v=%d z=%f\n",vitesse,z);
		break;


            case SDL_QUIT: {
                printf("Quit requested, quitting.\n");
                exit(0);
            }
            break;
        }
  

}

int main(){

	SDL_Surface *screen;
	SDL_Event event;
	int step=0;

	/* Initialise la libraire SDL */
	if( SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER) < 0 ) {
		fprintf(stderr,
		"Couldn't initialize SDL: %s\n", SDL_GetError());
		exit(1);
	}
	
	/* netoye au moment où le programme quitte*/
	atexit(SDL_Quit);
	
	/* Initialise l'affichage */
	screen = SDL_SetVideoMode(SCREEN_W , SCREEN_H, 24, SDL_OPENGL|SDL_RESIZABLE);

	if ( screen == NULL ) {
		fprintf(stderr, "Couldn't set  video mode: %s\n",
			SDL_GetError());
		exit(1);
	}

	/* Adapte la visualisation à la fenetre*/
	reshape(SCREEN_W,SCREEN_H);
		
	/* Initialisation des parametres OpenGl*/
	init_gl();

	/*Boucle infinie*/
	while ( 1 ) {
		step+=vitesse;
		/*dessine la scene*/
		draw_scene(step);

		/*Recupere les evenements (si y'en a un)*/
		while(SDL_PollEvent( &event ))
			/*Traite l'evenement*/
			process_event(&event);


		/*Attends 50 ms (~20 image/s)*/
		SDL_Delay(50);
	}
	

  	return 0;
}
