00001
00002 #include "pi2d14/pi2d14_maindeclaration.h"
00003
00004 MENU::NumberRenderer *numberRenderer=0;
00005 GRAPHICSTOOLS::FinalPoint *fPoint=0;
00006 GRAPHICSTOOLS::Texture_2D *texLogo=0;
00007 GRAPHICSTOOLS::Texture_2D *texFontNumber=0;
00008 GRAPHICSTOOLS::Texture_2D *texParam=0;
00009 GRAPHICSTOOLS::Texture_2D *texAlgo=0;
00010 GRAPHICSTOOLS::Texture_2D *texMenuMolecul=0;
00011 MENU::SelectionButton *menuMolecules=0;
00012
00013 double elapsedTime;
00014 double simulationTime;
00015
00016 int numParamConstruction;
00017 int numAlgo;
00018
00019 bool initHasBeenDone=false;
00020 bool atomSelected;
00021 bool simulationLaunched;
00022 bool displayDebug;
00023
00024 ALGOATOMD::AbstractMoleculeD *currentMolecule = 0;
00025
00026 Engine* engine = 0;
00027 CollisionGroup* collisionGroup = 0;
00028
00029
00030 void orthogonalProjection(bool init)
00031 {
00032 if(init)
00033 {
00034 glMatrixMode(GL_PROJECTION);
00035 glPushMatrix();
00036 glLoadIdentity();
00037 gluOrtho2D(0,800,0,600);
00038
00039 glMatrixMode(GL_MODELVIEW);
00040 glPushMatrix();
00041 glLoadIdentity();
00042
00043 glDepthFunc(GL_ALWAYS);
00044 }
00045 else
00046 {
00047 glMatrixMode(GL_PROJECTION);
00048 glPopMatrix();
00049
00050 glMatrixMode(GL_MODELVIEW);
00051 glPopMatrix();
00052
00053 glDepthFunc(GL_LESS);
00054 }
00055 }
00056
00057
00058
00059
00060 void launchSimulation()
00061 {
00062 simulationLaunched = true;
00063 simulationTime = 0;
00064
00065
00066 engine->setIsPaused (false);
00067 printf("**Simulation lancee**\n");
00068 }
00069
00070 void stopSimulation()
00071 {
00072 simulationLaunched = false;
00073 engine->setIsPaused (true);
00074 printf("**Simulation stoppee**\n");
00075 }
00076
00077
00078
00079
00080 void init()
00081 {
00082 if(!initHasBeenDone)
00083 {
00084
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
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
00130 fPoint = new GRAPHICSTOOLS::FinalPoint();
00131 fPoint->setDeltaRot(10);
00132
00133
00134 numberRenderer = new MENU::NumberRenderer(texFontNumber->getId());
00135
00136
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
00142 initHasBeenDone = true;
00143 atomSelected = false;
00144 simulationLaunched = false;
00145 displayDebug = false;
00146
00147
00148 elapsedTime=0;
00149 simulationTime=0;
00150
00151
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();
00169
00170
00171 if(simulationLaunched)
00172 {
00173 currentMolecule->processMovement();
00174
00175 if(displayDebug)
00176 {
00177 currentMolecule->renderMoleculeInfo();
00178 }
00179 }
00180
00181
00182 glDisable(GL_LIGHTING);
00183 glDisable(GL_TEXTURE_GEN_S);
00184 glDisable(GL_TEXTURE_GEN_T);
00185 glDisable(GL_TEXTURE_2D);
00186
00187
00188
00189 fPoint->update((float)elapsedTime);
00190 fPoint->render();
00191
00192
00193 orthogonalProjection(true);
00194
00195
00196 glEnable(GL_ALPHA_TEST);
00197 glAlphaFunc( GL_GREATER, 0.8);
00198 glColor4f(1, 1, 1, 1);
00199
00200
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
00248 menuMolecules->render( 0, 500, 150, 100, 0, 0, 0);
00249
00250
00251 numberRenderer->render( (unsigned int)simulationTime, 720, 10, 20, 20);
00252
00253
00254 numberRenderer->render( (unsigned int)numParamConstruction, 255, 565, 20, 20);
00255
00256 numberRenderer->render( (unsigned int)numAlgo, 255, 515, 20, 20);
00257
00258
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
00283 currentMolecule->setDestination(new API::CartesianPosition(fPoint->getX(), fPoint->getY(), fPoint->getZ() ));
00284 }
00285 }
00286
00287