// Fichier contenant le code pour la partie d'introduction

#include <cmath>
#include <GL/glut.h>
#include <list>
#include <string>
#include <strstream>
#include <vector>

#include "globale.h"
#include "Temps.h"
#include "CVector3.h"
#include "CCamera.h"
#include "CCube.h"
#include "CBloc.h"
#include "CJeu.h"
#include "drawespace.h"
#include "CWinStream.h"

long Temps0;
bool Flag = true;




// Cette fonction déplace la caméra en spirale pour l'animation du début

inline void SetCamPos(long Temps0)
{
	float r = (10 - 8*(GetTemps() - Temps0) / (float) TEMPSINTRO)*sqrt(MAX_X*MAX_X+MAX_Y*MAX_Y);
	float theta = 0.5f + 6.28f * TOURINTRO * (float) (GetTemps() - Temps0) / (float) TEMPSINTRO;

	gCamera.Position.x = MAX_X2 + r*cos(theta);
	gCamera.Position.y = MAX_Y2 + r*sin(theta);
	gCamera.Position.z = 2.5f * MAX_Z2;
}




// Si on appuie sur une touche pendant l'intro, ça amène à la fin de l'intro.
// Si on est déjà à la fin, la partie commence.

void keyboardIntro(unsigned char key, int x, int y)
{
	(gJeu.BlocPreview.*(gJeu.Colorateur)[rand() % NBCOULDIFFERENTE])();
	(gJeu.BlocPreview.*(gJeu.Createur)[rand() % NBBLOCDIFFERENT])();
	gJeu.CreeBloc();

	glViewport(0,0, SCREEN_WIDTH - LARGEURTEXTE, SCREEN_HEIGHT);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluPerspective(50.0, (float) (SCREEN_WIDTH - LARGEURTEXTE) / (float) SCREEN_HEIGHT, 0.1, 10000);
	
	gJeu.SetGameFunc();

	if (GetTemps() - Temps0 < TEMPSINTRO)
		 SetCamPos(GetTemps() - TEMPSINTRO);

	Flag = true;

	glutWarpPointer(CENTRE_X, CENTRE_Y);
}




// Fonction pour l'affichage de l'intro

void IntroDisplay(void)
{
	if (Flag)
	{
		Temps0 = GetTemps();
		Flag = false;
	}
	
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();

	if (GetTemps() - Temps0 < TEMPSINTRO)
	{
		SetCamPos(Temps0);

		gCamera.CamLookAt();

		Plan();
		Boite();
	}
	else
	{
		gCamera.CamLookAt();
		
		Plan();
		Boite();

		unsigned char Chaine0[] = "Appuyez sur une touche pour commencer";
		unsigned char Chaine1[] = "TETRIS 3D";
		wout.Begin();

			glColor4f(0, 0, 0, ASSOMBPAUSE);
			glBegin(GL_QUADS);
				glVertex2i(0, 0);
				glVertex2i(0, SCREEN_HEIGHT);
				glVertex2i(SCREEN_WIDTH, SCREEN_HEIGHT);
				glVertex2i(SCREEN_WIDTH, 0);
			glEnd();
			
			wout.SetCouleur(1,1,1,1);

			wout.SetPos(CENTRE_X - wout.Length(Chaine0) / 2 + LARGEURTEXTE / 2, CENTRE_Y);
			wout << Chaine0;
			wout.flush();

			wout.SetPos(CENTRE_X - wout.Length(Chaine1) / 2 + LARGEURTEXTE / 2, 3*(CENTRE_Y>>1));
			wout << Chaine1;
			wout.flush();

		wout.End();
	}


	glutSwapBuffers();
}




// Fonction qui met les fonctions appropriées

void SetIntroFunc(void)
{
	gCamera.DisplayFunc = IntroDisplay;

	glutIdleFunc(IntroDisplay);
	glutDisplayFunc(IntroDisplay);
	glutKeyboardFunc(keyboardIntro);
	glutMouseFunc(0);
	glutMotionFunc(0);
	glutPassiveMotionFunc(0);
}
