Page principale | Liste des namespaces | Hiérarchie des classes | Liste par ordre alphabétique | Liste des composants | Liste des fichiers | Composants | Déclarations

pi2d14_maindeclaration.cpp

Aller à la documentation de ce fichier.
00001 
00002 #include "pi2d14/pi2d14_maindeclaration.h"
00003 
00004 MENU::NumberRenderer *numberRenderer=0;                         //classe d'affichage de nombre
00005 GRAPHICSTOOLS::FinalPoint *fPoint=0;                                                    //le point de destination de la molecule
00006 GRAPHICSTOOLS::Texture_2D *texLogo=0;                                                   //texture LOGO
00007 GRAPHICSTOOLS::Texture_2D *texFontNumber=0;                                     //texture de font pour les nombres
00008 GRAPHICSTOOLS::Texture_2D *texParam=0;                                                  //texture pour parametre construction molecule
00009 GRAPHICSTOOLS::Texture_2D *texAlgo=0;                                                   //texture numero d'algorithme courant
00010 GRAPHICSTOOLS::Texture_2D *texMenuMolecul=0;                                    //texture du menu de selection des molecules
00011 MENU::SelectionButton *menuMolecules=0;                 //le menu pour la selection de la molecule
00012 
00013 double elapsedTime;                                                             //temps ecoule depuis la derniere frame
00014 double simulationTime;                                                  //temps ecoule depuis le debut de la simulation
00015 
00016 int numParamConstruction;                                               //le numero de la molecule courante
00017 int numAlgo;                                                                    //le numero de l'algorithme courant
00018 
00019 bool initHasBeenDone=false;                                             //true si l'initialisation a ete effectuer
00020 bool atomSelected;                                                              //true si un atom a ete selectionne
00021 bool simulationLaunched;                                                //true si une simulation est lance(en cour)
00022 bool displayDebug;                                                      //true si on doit afficher le debuggage de l'algo courant
00023 
00024 ALGOATOMD::AbstractMoleculeD *currentMolecule = 0;                      //la molecule a manipuler
00025 
00026 Engine* engine = 0;                                                             //le moteur general de rendu
00027 CollisionGroup* collisionGroup = 0;                             //groupe de collision
00028 
00029 
00030 void orthogonalProjection(bool init)
00031 {
00032         if(init)
00033         {
00034                 glMatrixMode(GL_PROJECTION);    //mode de matrice de projection
00035                 glPushMatrix();                                 //sauvegarde de la matrice
00036                 glLoadIdentity();                               //matrice identite
00037                 gluOrtho2D(0,800,0,600);                //projection 2D
00038 
00039                 glMatrixMode(GL_MODELVIEW);             //mode de matrice de modelisation-visualisation
00040                 glPushMatrix();                                 //sauvegarde de la matrice
00041                 glLoadIdentity();                               //matrice identite
00042                 
00043                 glDepthFunc(GL_ALWAYS);                 //on laissera tout le temp passer les fragment
00044         }
00045         else
00046         {
00047                 glMatrixMode(GL_PROJECTION);    //mode de matrice de projection
00048                 glPopMatrix();                                  //restauration de la matrice precedente
00049                 
00050                 glMatrixMode(GL_MODELVIEW);             //mode de matrice de modelisation-visualisation
00051                 glPopMatrix();                                  //restauration de la matrice precedente
00052                 
00053                 glDepthFunc(GL_LESS);                   //on laissera passer que les fragment plus proche que ceux existant
00054         }
00055 }
00056 
00057 
00058 
00059 
00060 void launchSimulation()
00061 {
00062         simulationLaunched = true;                      //indique que la simulation est lancee
00063         simulationTime = 0;                                     //mise a 0 do chrono
00064 
00065 
00066         engine->setIsPaused (false);            //on enleve la pause
00067         printf("**Simulation lancee**\n");
00068 }
00069 
00070 void stopSimulation()
00071 {
00072         simulationLaunched = false;                     //simulation terminee
00073         engine->setIsPaused (true);                     //mise ne pause du moteur
00074         printf("**Simulation stoppee**\n");
00075 }
00076 
00077 
00078 
00079 
00080 void init()
00081 {
00082         if(!initHasBeenDone)            //on initialise seulement si l'initialisation n'a pas deja �t� faite
00083         {
00084                 //chargement de textures
00085                 texLogo = new GRAPHICSTOOLS::Texture_2D();
00086                 if(texLogo->loadBMP("textures/logo.bmp", false, GL_LINEAR, GL_LINEAR, GL_REPEAT, GL_REPEAT, 0, true, 255, 0, 0, 0, 255))
00087                 {
00088                         std::cout<<"texture LOGO charge\n\n";
00089                 }
00090                 texParam = new GRAPHICSTOOLS::Texture_2D();
00091                 if(texParam->loadBMP("textures/param.bmp", false, GL_LINEAR, GL_LINEAR, GL_REPEAT, GL_REPEAT, 0, true, 255, 255, 255, 0, 255))
00092                 {
00093                         std::cout<<"texture PARAM charge\n\n";
00094                 }
00095                 texAlgo = new GRAPHICSTOOLS::Texture_2D();
00096                 if(texAlgo->loadBMP("textures/algo.bmp", false, GL_LINEAR, GL_LINEAR, GL_REPEAT, GL_REPEAT, 0, true, 255, 255, 255, 0, 255))
00097                 {
00098                         std::cout<<"texture ALGO charge\n\n";
00099                 }
00100                 texFontNumber = new GRAPHICSTOOLS::Texture_2D();
00101                 if(texFontNumber->loadBMP("textures/fontnumber.bmp", false, GL_LINEAR, GL_LINEAR, GL_REPEAT, GL_REPEAT, 0, true, 255, 255, 255, 0, 255))
00102                 {
00103                         std::cout<<"texture FONTNUMBER charge\n\n";
00104                 }
00105                 
00106                 //texture du menu pour molecules
00107                 texMenuMolecul = new GRAPHICSTOOLS::Texture_2D[NB_MOLECULES];
00108                 if(texMenuMolecul[MOLECULE_ATOME_SEUL].loadBMP("textures/atome_seul.bmp", false, GL_LINEAR, GL_LINEAR, GL_REPEAT, GL_REPEAT, 0, true, 255, 255, 255, 0, 255))
00109                 {
00110                         std::cout<<"texture atom_rouleur charge\n\n";
00111                 }
00112                 if(texMenuMolecul[MOLECULE_LIGNE].loadBMP("textures/ligne.bmp", false, GL_LINEAR, GL_LINEAR, GL_REPEAT, GL_REPEAT, 0, true, 255, 255, 255, 0, 255))
00113                 {
00114                         std::cout<<"texture ligne charge\n\n";
00115                 }
00116                 if(texMenuMolecul[MOLECULE_TAPIS].loadBMP("textures/tapis.bmp", false, GL_LINEAR, GL_LINEAR, GL_REPEAT, GL_REPEAT, 0, true, 255, 255, 255, 0, 255))
00117                 {
00118                         std::cout<<"texture tapis charge\n\n";
00119                 }
00120                 if(texMenuMolecul[MOLECULE_CUBE].loadBMP("textures/cube.bmp", false, GL_LINEAR, GL_LINEAR, GL_REPEAT, GL_REPEAT, 0, true, 255, 255, 255, 0, 255))
00121                 {
00122                         std::cout<<"texture cube charge\n\n";
00123                 }
00124                 if(texMenuMolecul[MOLECULE_ROUE].loadBMP("textures/roue.bmp", false, GL_LINEAR, GL_LINEAR, GL_REPEAT, GL_REPEAT, 0, true, 255, 255, 255, 0, 255))
00125                 {
00126                         std::cout<<"texture roue charge\n\n";
00127                 }
00128                 
00129                 //creation et reglage de la vitesse de rotation du point final
00130                 fPoint = new GRAPHICSTOOLS::FinalPoint();
00131                 fPoint->setDeltaRot(10);
00132                 
00133                 //creation renderer de nombre
00134                 numberRenderer = new MENU::NumberRenderer(texFontNumber->getId());
00135                 
00136                 //creation menu molecule
00137                 unsigned int tabid[] = { MOLECULE_ATOME_SEUL, MOLECULE_LIGNE, MOLECULE_TAPIS, MOLECULE_CUBE, MOLECULE_ROUE };
00138                 unsigned int tabtexid[] = { texMenuMolecul[MOLECULE_ATOME_SEUL].getId(), texMenuMolecul[MOLECULE_LIGNE].getId(), texMenuMolecul[MOLECULE_TAPIS].getId(), texMenuMolecul[MOLECULE_CUBE].getId(), texMenuMolecul[MOLECULE_ROUE].getId() };
00139                 menuMolecules = new MENU::SelectionButton( &tabtexid[0], &tabid[0], NB_MOLECULES);
00140                 
00141                 //enegistrement de l'initialisation comme effectuer
00142                 initHasBeenDone = true;
00143                 atomSelected = false;
00144                 simulationLaunched = false;
00145                 displayDebug = false;
00146                 
00147                 //init temp passe a 0
00148                 elapsedTime=0;
00149                 simulationTime=0;
00150                 
00151                 //init variable du menu
00152                 numParamConstruction = 1;
00153                 numAlgo = 1;
00154         }
00155 }
00156 
00157 
00158 void render(int pause)
00159 {
00160         if(initHasBeenDone)
00161         {
00162                 elapsedTime = engine->getDeltaTime();
00163                 if(simulationLaunched)
00164                 {
00165                         simulationTime+=elapsedTime;
00166                 }
00167                 
00168                 engine->frame();                //affichage de base
00169                 
00170 
00171                 if(simulationLaunched)          //on affiche que si la simulation est lancé
00172                 {
00173                         currentMolecule->processMovement();     //calcul du mouvement de l'atome
00174                         
00175                         if(displayDebug)                        //on affiche le debug si l'utilisateur le beut
00176                         {
00177                                 currentMolecule->renderMoleculeInfo();//affichage du debug
00178                         }
00179                 }
00180                 
00181                 //desactivation des option OpenGL inutile
00182                 glDisable(GL_LIGHTING);
00183                 glDisable(GL_TEXTURE_GEN_S);
00184                 glDisable(GL_TEXTURE_GEN_T);
00185                 glDisable(GL_TEXTURE_2D);
00186                 
00187                 
00188                 //dessin du point de rendez-vous
00189                 fPoint->update((float)elapsedTime);
00190                 fPoint->render();
00191                 
00192                 //activation de la projection 2D
00193                 orthogonalProjection(true);
00194 
00195                 //alpha test pour detourage des textures
00196                 glEnable(GL_ALPHA_TEST);
00197                 glAlphaFunc( GL_GREATER, 0.8);
00198                 glColor4f(1, 1, 1, 1);
00199 
00200                 //affichage LOGO
00201                 glEnable(GL_TEXTURE_2D);
00202                 glBindTexture(GL_TEXTURE_2D,texLogo->getId());
00203                 glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
00204                 glBegin(GL_QUADS);
00205                 glTexCoord2f(0,0);
00206                 glVertex2f(650,500);
00207                 glTexCoord2f(1,0);
00208                 glVertex2f(800,500);
00209                 glTexCoord2f(1,1);
00210                 glVertex2f(800,600);
00211                 glTexCoord2f(0,1);
00212                 glVertex2f(650,600);
00213                 glEnd();
00214                 
00215                 glAlphaFunc( GL_GREATER, 0.5);
00216 
00217                 glEnable(GL_TEXTURE_2D);
00218                 glBindTexture(GL_TEXTURE_2D,texParam->getId());
00219                 glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
00220                 glBegin(GL_QUADS);
00221                 glTexCoord2f(0,0);
00222                 glVertex2f(150,550);
00223                 glTexCoord2f(1,0);
00224                 glVertex2f(250,550);
00225                 glTexCoord2f(1,1);
00226                 glVertex2f(250,600);
00227                 glTexCoord2f(0,1);
00228                 glVertex2f(150,600);
00229                 glEnd();
00230 
00231                 glEnable(GL_TEXTURE_2D);
00232                 glBindTexture(GL_TEXTURE_2D,texAlgo->getId());
00233                 glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
00234                 glBegin(GL_QUADS);
00235                 glTexCoord2f(0,0);
00236                 glVertex2f(150,500);
00237                 glTexCoord2f(1,0);
00238                 glVertex2f(250,500);
00239                 glTexCoord2f(1,1);
00240                 glVertex2f(250,550);
00241                 glTexCoord2f(0,1);
00242                 glVertex2f(150,550);
00243                 glEnd();
00244                 
00245                 glDisable(GL_ALPHA_TEST);
00246 
00247                 //affichage du boutton de selection
00248                 menuMolecules->render( 0, 500, 150, 100, 0, 0, 0);
00249                 
00250                 //affichage chrono
00251                 numberRenderer->render( (unsigned int)simulationTime, 720, 10, 20, 20);
00252                 
00253                 //affichage parametre de construction
00254                 numberRenderer->render( (unsigned int)numParamConstruction, 255, 565, 20, 20);
00255                 //affichage numero d'algo
00256                 numberRenderer->render( (unsigned int)numAlgo, 255, 515, 20, 20);
00257 
00258                 //desactivation de la projection2D
00259                 orthogonalProjection(false);
00260         }
00261 }
00262 
00263 
00264 void quit()
00265 {
00266         delete currentMolecule;
00267         delete texLogo;
00268         delete texParam;
00269         delete texAlgo;
00270         delete texFontNumber;
00271         delete [] texMenuMolecul;
00272         delete fPoint;
00273         delete numberRenderer;
00274         delete menuMolecules;
00275 }
00276 
00277 
00278 void setFinalPointToMolecule()
00279 {
00280         if(initHasBeenDone)
00281         {
00282                 // TODO modifier sans new ; memory leak :-((
00283                 currentMolecule->setDestination(new API::CartesianPosition(fPoint->getX(), fPoint->getY(), fPoint->getZ() ));
00284         }
00285 }
00286 
00287 

Généré le Fri Mar 26 13:02:03 2004 pour AlgoAtomD par doxygen 1.3.5