
**********************************************************************************************
************** JUGGLING **********************************************************************
**********************************************************************************************

	PROJET openGL

Auteurs: Karine Olszowy, Christophe Renault
Enseignants: M.Buffa, C.Devernay

*************** Sujet: ***********************************************************************

Ce projet consiste  raliser une application ludique prsentant les possibilits de
la bibliothque openGl.
Dans ce cadre, l'application prsente consiste en une scne simple o volue un oursee 
dou d'un talent certain pour le jongglage.


******** Structure du programme **************************************************************

La structure s'organise en 4 parties distinctes:

-1- (Decor.h, Decor.cpp) La dfinition de la scne ou voluent les objets (ourse, balles).
-2- (character.h, character.cpp) La dfinition des "acteurs" de la scne. 
-3- (Tex.cpp, tex.h) Dfinition de fonctionnalits pour le chargements de textures au 
    format raw.
-4- (Scene.c) La partie principale, o sont dfinis le comportement des acteurs et de 
    l'application.

(global.h) Runi les variables globales communes  chaque partie.


*1* 'Decor':

Dans ce module sont dfinis les textures de type paramtr, les textures importes,
les types de lumires de la scne, la dfinition du sol et des ombres qui s'y projettent.

- Textures paramtres:
  
Il s'agit d'un tableau de caractres reprsentant chacun une valeur de pixel.

	static char *carres[] = {
	  "vbvbvbvb",			// v:pixel vert
	  "bbb.b.bb",			// b:pixel bleu
	  "v.bbvbbb",			// .:pixel par dfaut
	  "bbvbbbvv",			// dans cet example
	  "bbvbbbvv",
	  "v.bbvbbb",
	  "bbb.b.bb",
	  "vbvbvbvb",
	};   

A l'initialisation des textures le tableau est converti en tableau de pixels et mapp 
sur le sol grce  la fonction:
	 glTexImage2D(...........).

- Textures importes:

Ces textures appliques sur le sol sont importes  partir de fichiers raw situs dans
le rpertoire 'textures'. Elles sont chargs  l'aide des fonctions dfinies dans le 
module 'Tex'.

- Les Lumires:

La scne comporte 3 lumires( rouge, verte, bleue). 
Elles sont toutes du type suivant:

	glLightfv(GL_LIGHT1, GL_DIFFUSE, lightColor[1]);
	glLightf(GL_LIGHT1, GL_CONSTANT_ATTENUATION, 0.1);
	glLightf(GL_LIGHT1, GL_LINEAR_ATTENUATION, 0.05);

La lumire ambiante est spcifie sur la 1ere lampe. Les lampes de la scne ont deux 
modes de fonctionnement: lumire multidirectionnel et cone de lumire. Ces derniers modes 
ainsi que l'affichage des lampes sont grs dans le module Scene.


- La dfinition du sol:

Le sol est un simple rectangle sur lequel sont appliques les textures paramtres ou
importes  partir de fichiers *.raw. La taille du quadrillage peut tre spcifi de la
faon suivante:

	glBegin(GL_QUAD_STRIP);
	...
	glTexCoord2f((i+1)/(float)(10)*t, j/(float)(10)*t);
	...
	glEnd();

o t correspond au nombre de cases prsente sur le sol.

- Les ombres:

Pour le calcul des ombres est dfinie une matrice de projection  partir de la position 
des lumires et de l'quation du plan (sol). Le rendu des ombres est par la suite trait 
dans le module Scne.

*2* 'character':

Ce module dfinit sous forme de listes les objets prsents dans la scne (ourse + balles).

	glNewList(OBJET1, GL_COMPILE);
	...
	// dfinition de l'apparence, la forme, 
	// la position par dfaut,
	// la prcision du rendu.
	glEndList();

Chaque lment est dfini de tel faon qu'il n'est pas ncessaire par la suite d'effectuer
des transformations supplmentaires lors de leur appel  l'initialisation. La gestion des 
mouvements est faite dans le module 'Scene' en effectuant les transformations adquates 
pour crer le mouvement des acteurs de la scne.

*3* 'Tex'

Le module contient la fonction de chargement des textures  partir de fichiers 
*.raw (24-bits):
Ce module a t crit par Scott Franke (sfranke@scf.usc.edu). La fonction de chargement
(texGLLoadRAW()) permet de permet de mapper des textures selon 2 modes:

	mip = 1, uses gluBuild2DMipmaps
	mip = 0, uses glTexImage2d

*4* 'Scene'

Deux fonctions dessinent les 'personnages' prsents dans la scne:
	drawbear(...)
	drawball(...)
Ces fonctions appellent les diffrents lments qui constitue les acteurs en fonction
des paramtres de mouvements spcifis dans la fonction idle(). A chaque affichage de 
la scne, qui s'effectue dans redraw(), les fonctions drawbear(...) et drawball(...) 
redessine les acteurs.
La cadence de l'animation est dtermine dans le idle  partir du temps coul depuis
le lancement du programmme.

Deux fonctions permettent la gestion de la souris:
mouse(...)
motion(...)

La gestion du clavier est effectu de plusieurs faons:

Pour les touches "normales":

glutKeyboardFunc(key);

et

key(char c,....); 		Cette fonction dtermine les variables globales  
				modifier en fonction de la touche.

Pour les touches "spciales": GLUT_KEY_UP, GLUT_F4, ...

glutSpecialFunc(specialKey);

specialKey(int state,...);	Cette fonction fonctionne de la mme faon 
				quela prcdente.

Pour l'vnement "touche relche" (touches spciales): 

glutSpecialUpFunc(specialKeyUp);

specialKey(int state,...);	Permet d'arreter le dplacement lorsque la touche 
				de controle est	relache.


*********** Fonctionalits *******************************************************************

-1- Controle souris:

Bouton gauche: 		Dplacement de la vue autour du centre de la scne.
Bouton droit:  		Accs au menu (cf -2- Menu).
Shift + Bouton gauche: 	Dplacement des lampes  2(verte) et 3(bleue).

-2- Menus:

Toggle lightmotion:	Dmarre ou arrte la rotation des deux lampes mobiles.
Toggle textures:	Valide ou invalide l'application des textures.
Toggle shadows:		Affichage des ombres.
Toggle reflection:	Affichage des rflections.
Toggle bear:		Affichage de l'ourse.
Toggle ball:		Affichage des balles.
Draw light sources:	Affichage des lampes.

-3- Clavier:

Rendu video et textures:

'W':	Mode fil de fer.
'S':	Mode plein.
'r':	Changement de mode de lissage de la texture au sol:
	- GL_NEAREST (par defaut)
	- GL_LINEAR
	- GL_LINEAR_MIPMAP_LINEAR

'/':	Diminution du nombre de facettes des objets de la scne. (slice, stack)
'*':	Diminution du nombre de facettes des objets de la scne. 

Paramtres de jonglage:

'q':	Diminution de la hauteur de balle.
'a':	Augmentation de la hauteur de balle.
'z':	Diminution de la largeur de balle.
'e':	Augmentation de la largeur de balle.

(touches de tests)
'Q':	Diminution de la hauteur absolue de balle.
'A':	Augmentation de la hauteur absolue de balle.
'Z':	Diminution de la largeur de absolue balle.
'E':	Augmentation de la largeur de absolue balle.
'o': 	Ralentissement du mouvement des bras (independemment des balles).
'o': 	Acceleration du mouvement des bras.

Gestion des mouvements:

'+':	Acceleration de l'animation.
'-':	Ralentissement de l'animation.
'j':	Commutation entre les modes de jongglage.
	-0- (par dfaut pas de jonglage).
	-1- Cascade.
	-2- Carambole.

Gestion des dplacements du personnage.

'KEY_UP':	Avancer.
'KEY_DOWN':	Reculer.
'KEY_LEFT':	Tourner  gauche.
'KEY_RIGHT':	Tourner  droite. (Les dplacements ne peuvent malheureusement simultans.)
	
Decor:

't':	Changement de texture.
	-0- texture paramtre.
	-1- texture psychedelique d'un gout douteux.(par dfaut)
	-2- texture ciel.
	-3- texture sol rose.
	-4- texture lave en fusion.
'1':	Changement d'tat de la lampe 1.
	-0- spotlight.
	-1- lumire omnidirectionnelle.
	-2- lumire teinte.
'2':	Changement d'tat de la lampe 2.
	-- idem lampe 1.
'3':	Changement d'tat de la lampe 3.
	-- idem lampe 2.

'ESCAPE' Sortie du programme.

