DLA-Fire-Prediction-Thesis 1.0
|
00001 //---------------------------------------------------------------------------------------------------------------------- 00004 //---------------------------------------------------------------------------------------------------------------------- 00005 00006 #include "GLWindow.h" 00007 #include <iostream> 00008 00009 #include "ngl/BBox.h" 00010 #include "ngl/Camera.h" 00011 #include "ngl/Colour.h" 00012 #include "ngl/Light.h" 00013 #include "ngl/Material.h" 00014 #include "ngl/Matrix.h" 00015 #include "ngl/NGLInit.h" 00016 #include "ngl/Obj.h" 00017 #include "ngl/VBOPrimitives.h" 00018 #include "ngl/Transformation.h" 00019 #include "ngl/TransformStack.h" 00020 #include "ngl/ShaderManager.h" 00021 00022 //---------------------------------------------------------------------------------------------------------------------- 00024 GLWindow::GLWindow( 00025 QWidget *_parent 00026 ) : 00027 QGLWidget(_parent) 00028 { 00029 00030 // set this widget to have the initial keyboard focus 00031 setFocus(); 00032 // re-size the widget to that of the parent (in this case the GLFrame passed in on construction) 00033 this->resize(_parent->size()); 00034 // Now set the initial GLWindow attributes to default values 00035 // Roate is false 00036 m_rotate=false; 00037 // mouse rotation values set to 0 00038 m_spinXFace=0; 00039 m_spinYFace=0; 00040 00041 // flag of showing help 00042 m_drawHelp=0; 00043 00044 m_wireframe=false; 00045 m_enableMountain=true; 00046 m_mountainIterations=15; 00047 00048 // now set the inital camera values 00049 m_cameraIndex=0; 00050 m_fov=65.0; 00051 m_aspect=972.0/656.0; 00052 m_projection=ngl::PERSPECTIVE; 00053 00054 m_fpsTimer =startTimer(0); 00055 m_fps=0; 00056 m_frames=0; 00057 m_timer.start(); 00058 00059 // now set size of scene 00060 m_sceneWidth=50; 00061 m_sceneHeight=50; 00062 00063 // set non-flammbale object size 00064 m_objectRadius = 0.3; 00065 m_objectHeight = 0.2; 00066 00067 m_newIndexOfOrigin = 0; 00068 00069 m_windDirectionRot = 90; 00070 m_showWindDir = false; 00071 m_temperature = 23.0; 00072 m_sceneMoisture = 15.0; 00073 } 00075 00076 //---------------------------------------------------------------------------------------------------------------------- 00078 GLWindow::~GLWindow() 00079 { 00080 ngl::NGLInit *Init = ngl::NGLInit::instance(); 00081 std::cout<<"Shutting down NGL, removing VBO's and Shaders\n"; 00082 Init->NGLQuit(); 00083 } 00085 00086 //---------------------------------------------------------------------------------------------------------------------- 00088 void GLWindow::createCameras() 00089 { 00090 // create a load of cameras 00091 ngl::Camera cam; 00092 ngl::Camera Tcam; 00093 ngl::Camera Scam; 00094 ngl::Camera Fcam; 00095 // set the different vectors for the camera positions 00096 ngl::Vector EYE(0,5,8); 00097 ngl::Vector LOOK=0.0; 00098 ngl::Vector UP(0,1,0); 00099 00100 ngl::Vector TEYE(0,8,0); 00101 ngl::Vector TLOOK=0.0; 00102 ngl::Vector TUP(0,0,1); 00103 00104 ngl::Vector SEYE(2,2,2); 00105 ngl::Vector SLOOK=0.0; 00106 ngl::Vector SUP(0,1,0); 00107 00108 ngl::Vector FEYE(5,2,8); 00109 ngl::Vector FLOOK(0.0,0.0,0.0); 00110 ngl::Vector FUP(0,1,0); 00111 00112 // finally set the cameras shape and position 00113 cam.set(EYE,LOOK,UP); 00114 cam.setShape(m_fov,m_aspect, 0.2f,150.0f,m_projection); 00115 cam.setOrthoParams(-1,1,-1,1,0.1,10.0); 00116 m_cameras.push_back(cam); 00117 00118 Tcam.set(TEYE,TLOOK,TUP); 00119 Tcam.setShape(m_fov,m_aspect, 0.2f,150.0f,m_projection); 00120 Tcam.setOrthoParams(-0.1,0.1,-0.1,0.1,0.1,10.0); 00121 m_cameras.push_back(Tcam); 00122 Scam.set(SEYE,SLOOK,SUP); 00123 Scam.setShape(m_fov,m_aspect, 0.2f,150.0f,m_projection); 00124 Scam.setOrthoParams(-0.1,0.1,-0.1,0.1,0.1,10.0); 00125 m_cameras.push_back(Scam); 00126 Fcam.set(FEYE,FLOOK,FUP); 00127 Fcam.setShape(m_fov,m_aspect, 0.2f,150.0f,m_projection); 00128 Fcam.setOrthoParams(-0.1,0.1,-0.1,0.1,0.1,10.0); 00129 m_cameras.push_back(Fcam); 00130 00131 } 00133 00134 //---------------------------------------------------------------------------------------------------------------------- 00136 void GLWindow::setCameraShape() 00137 { 00138 ngl::ShaderManager *shader=ngl::ShaderManager::instance(); 00139 int cameraSize=m_cameras.size(); 00140 for(int i=0; i<cameraSize; ++i) 00141 { 00142 m_cameras[i].setShape(m_fov,m_aspect, 0.2f,150.0f,m_projection); 00143 m_cameras[i].setOrthoParams(-1,1,-1,1,1,10.0); 00144 } 00145 00146 (*shader)["Colour"]->use(); 00147 shader->setShaderParamFromMatrix("Colour","projectionMatrix",m_cameras[m_cameraIndex].getProjection()); 00148 (*shader)["Blinn"]->use(); 00149 shader->setShaderParamFromMatrix("Blinn","projectionMatrix",m_cameras[m_cameraIndex].getProjection()); 00150 } 00152 00153 //---------------------------------------------------------------------------------------------------------------------- 00155 // This virtual function is called once before the first call to paintGL() or resizeGL(), 00156 //and then once whenever the widget has been assigned a new QGLContext. 00157 // This function should set up any required OpenGL context rendering flags, defining display lists, etc. 00158 void GLWindow::initializeGL() 00159 { 00160 // set up light 00161 glEnable(GL_LIGHTING); 00162 00163 // enable depth testing for drawing 00164 glEnable(GL_DEPTH_TEST); 00165 00166 glClearColor(0.3f, 0.3f, 0.3f, 1.0f); // Grey Background 00167 ngl::NGLInit *Init = ngl::NGLInit::instance(); 00168 #ifdef WIN32 00169 glewInit(); 00170 #endif 00171 Init->initGlew(); 00172 00173 createCameras(); 00174 00175 // now to load the shader and set the values 00176 // grab an instance of shader manager 00177 ngl::ShaderManager *shader=ngl::ShaderManager::instance(); 00178 m_light = new ngl::Light(ngl::Vector(1,1,1,1),ngl::Colour(1,1,1,1),ngl::LIGHTREMOTE); 00179 00180 // ----- Colour Shader 00181 // create shader program 00182 shader->createShaderProgram("Colour"); 00183 // load shader sources 00184 shader->attachShader("cvertex",ngl::VERTEX); 00185 shader->attachShader("cfragment",ngl::FRAGMENT); 00186 shader->loadShaderSource("cvertex","shaders/Colour.vs"); 00187 shader->loadShaderSource("cfragment","shaders/Colour.fs"); 00188 // compile 00189 shader->compileShader("cvertex"); 00190 shader->compileShader("cfragment"); 00191 // link 00192 shader->attachShaderToProgram("Colour","cvertex"); 00193 shader->attachShaderToProgram("Colour","cfragment"); 00194 shader->linkProgramObject("Colour"); 00195 // use 00196 (*shader)["Colour"]->use(); 00197 00198 // ----- Blinn Shader 00199 // create shader program 00200 shader->createShaderProgram("Blinn"); 00201 // load shader sources 00202 shader->attachShader("overtex",ngl::VERTEX); 00203 shader->attachShader("ofragment",ngl::FRAGMENT); 00204 shader->loadShaderSource("overtex","shaders/Vertex_obj.vs"); 00205 shader->loadShaderSource("ofragment","shaders/Fragment_obj.fs"); 00206 // compile 00207 shader->compileShader("overtex"); 00208 shader->compileShader("ofragment"); 00209 // link 00210 shader->attachShaderToProgram("Blinn","overtex"); 00211 shader->attachShaderToProgram("Blinn","ofragment"); 00212 shader->linkProgramObject("Blinn"); 00213 // use 00214 (*shader)["Blinn"]->use(); 00215 00216 // create an instance of the VBO primitive 00217 ngl::VBOPrimitives *prim=ngl::VBOPrimitives::instance(); 00218 00219 // create sphere 00220 prim->createVBOSphere("sphere",1.0,20); 00221 00222 // create cylinder 00223 prim->createVBOCylinder("cylinder", m_objectRadius, m_objectHeight, 50, 10); 00224 00225 // create disk 00226 prim->createVBODisk("disk", m_objectRadius, 50); 00227 00228 // create cone 00229 prim->createVBOCone("cone", 0.9, 2.0, 50, 50); 00230 00231 // primitive for wind axis 00232 prim->createVBOCylinder("nglAXISCylinder",0.03,0.4,60,60); 00233 prim->createVBOCone("nglAXISCone",0.07,0.2,30,30); 00234 00235 m_light->enable(); 00236 // --- assign texture to Blinn Shader 00237 // load and set a texture 00242 ngl::Texture t("resources/textures/Grass.bmp"); 00245 00246 t.setTextureGL(); 00247 glGenerateMipmap(GL_TEXTURE_2D); 00248 glEnable(GL_MULTISAMPLE); 00249 00250 // the shader will use the currently active material and light0 so set them 00251 ngl::Material m(ngl::GOLD); 00252 m.use(); 00253 ngl::Light *L1 = new ngl::Light(ngl::Vector(0,5,4,1),ngl::Colour(1,1,1,1),ngl::LIGHTLOCAL); 00254 L1->enable(); 00255 00256 // ----- create fire scene object 00257 fireScene = new FireArea(m_sceneWidth, m_sceneHeight, m_objectRadius, m_objectHeight, m_enableMountain, m_mountainIterations); 00258 } 00260 00261 //---------------------------------------------------------------------------------------------------------------------- 00263 //This virtual function is called whenever the widget has been resized. 00264 // The new size is passed in width and height. 00265 void GLWindow::resizeGL( 00266 int _w, 00267 int _h 00268 ) 00269 { 00270 glViewport(0,0,_w,_h); 00271 00272 // calculate the aspect ratio 00273 m_aspect=(float)_w/_h; 00274 00275 // now set the camera values 00276 setCameraShape(); 00277 00278 } 00280 00281 //---------------------------------------------------------------------------------------------------------------------- 00283 //This virtual function is called whenever the widget needs to be painted. 00284 // this is our main drawing routine 00285 void GLWindow::paintGL() 00286 { 00287 // create an instance of the VBO primitive 00288 //ngl::VBOPrimitives *prim=ngl::VBOPrimitives::instance(); 00289 // grab an instance of the shader manager 00290 ngl::ShaderManager *shader=ngl::ShaderManager::instance(); 00291 // clear the screen and depth buffer 00292 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 00293 // Rotation based on the mouse position for our global 00294 // transform 00295 ngl::Transformation trans; 00296 trans.setRotation(m_spinXFace,m_spinYFace,0); 00297 // set this in the TX stack 00298 m_transformStack.setGlobal(trans); 00299 00300 m_light->enable(); 00301 00302 // now set this value in the shader for the current Camera, we do all 3 elements as they 00303 // can all change per frame 00304 (*shader)["Blinn"]->use(); 00305 shader->setShaderParamFromMatrix("Blinn","ViewMatrix",m_cameras[m_cameraIndex].getModelView()); 00306 shader->setShaderParamFromMatrix("Blinn","projectionMatrix",m_cameras[m_cameraIndex].getProjection()); 00307 00308 // now set this value in the shader for the current ModelMatrix 00309 shader->setShaderParamFromMatrix("Blinn","ModelMatrix",m_transformStack.getCurrAndGlobal().getMatrix()); 00310 00311 (*shader)["Colour"]->use(); 00312 shader->setShaderParamFromMatrix("Colour","ViewMatrix",m_cameras[m_cameraIndex].getModelView()); 00313 shader->setShaderParamFromMatrix("Colour","projectionMatrix",m_cameras[m_cameraIndex].getProjection()); 00314 shader->setShaderParam4f("Colour","Colour",0,0,0,1); 00315 00316 // now go back to solid drawing 00317 glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); 00318 00319 // ----- draw scene 00320 m_transformStack.pushTransform(); 00321 { 00322 (*shader)["Colour"]->use(); 00323 00324 fireScene->drawArea("Colour", m_transformStack); 00325 00326 // set colour back to black for the base grid colour 00327 shader->setShaderParam4f("Colour","Colour",0.0,0.0,0.0,1.0); 00328 } 00329 m_transformStack.popTransform(); 00330 00331 // ----- draw dla path 00332 m_transformStack.pushTransform(); 00333 { 00334 (*shader)["Colour"]->use(); 00335 shader->setShaderParamFromMatrix("Colour","ModelMatrix",m_transformStack.getCurrAndGlobal().getMatrix()); 00336 shader->setShaderParam4f("Colour","Colour",1.0,0.5,0.8,1.0); 00337 00338 fireScene->timestep("Colour", m_transformStack); 00339 } 00340 m_transformStack.popTransform(); 00341 00342 // ----- draw grid 00343 m_transformStack.pushTransform(); 00344 { 00345 if(m_wireframe==false) 00346 { 00347 (*shader)["Blinn"]->use(); 00348 fireScene->drawGrid(m_wireframe); 00349 fireScene->drawBase(); 00350 } 00351 else 00352 { 00353 (*shader)["Colour"]->use(); 00354 shader->setShaderParamFromMatrix("Colour","ModelMatrix",m_transformStack.getCurrAndGlobal().getMatrix()); 00355 shader->setShaderParam4f("Colour","Colour",0.0,0.0,0.0,1.0); 00356 fireScene->drawGrid(m_wireframe); 00357 } 00358 } 00359 m_transformStack.popTransform(); 00360 00361 // ----- draw fuel object 00362 m_transformStack.pushTransform(); 00363 { 00364 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 00365 glEnable(GL_BLEND); 00366 00367 //glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); 00368 00369 fireScene->drawRandomobject("Colour", m_transformStack); 00370 00371 // glDisable(GL_BLEND); 00372 } 00373 m_transformStack.popTransform(); 00374 00375 // ----- draw AXIS for wind direction 00376 m_transformStack.pushTransform(); 00377 { 00378 if(m_showWindDir==true) 00379 { 00380 m_transformStack.loadGlobalMatrixToShader("Colour","ModelMatrix"); 00381 drawAxis("Colour",m_transformStack, 2.0, m_spinXFace, m_spinYFace); 00382 } 00383 } 00384 m_transformStack.popTransform(); 00385 00386 00387 00388 // ----- calculate and draw FPS 00389 ++m_frames; 00390 glUseProgramObjectARB(0); 00391 00392 // ----- showing text 00393 glUseProgram(0); 00394 glColor3f(0.9,0.85,0.8); 00395 QFont font; 00396 font.setPointSize(10); 00397 00398 // now we are going to construct a string to draw the mode information 00399 /* QString text; 00400 switch ( m_moveMode) 00401 { 00402 case MOVEEYE : mode=QString("Move Eye"); break; 00403 case MOVELOOK : mode=QString("Move Look"); break; 00404 case MOVEBOTH : mode=QString("Move Both"); break; 00405 case MOVESLIDE : mode=QString("Move Slide"); break; 00406 } 00407 QString text=QString("Active Camera : %1 ,Current mode = %2").arg(m_cameraIndex).arg(mode); 00408 renderText(10,18,text,font); 00409 text=QString("FOV = %1 ").arg(m_fov); 00410 renderText(10,18*2,text,font); 00411 00412 font.setPointSize(8); 00413 00414 renderText(10,18*3,"ModelView Matrix",font); 00415 // now we use the QString sprintf 00416 ngl::Matrix m=m_cameras[m_cameraIndex].getModelView(); 00417 text.sprintf("[ %+0.4f %+0.4f %+0.4f %+0.4f]",m.openGL()[0],m.openGL()[1],m.openGL()[2],m.openGL()[3]); 00418 renderText(10,16*4,text,font); 00419 text.sprintf("[ %+0.4f %+0.4f %+0.4f %+0.4f]",m.openGL()[4],m.openGL()[5],m.openGL()[6],m.openGL()[7]); 00420 renderText(10,16*5,text,font); 00421 text.sprintf("[ %+0.4f %+0.4f %+0.4f %+0.4f]",m.openGL()[8],m.openGL()[9],m.openGL()[10],m.openGL()[11]); 00422 renderText(10,16*6,text,font); 00423 text.sprintf("[ %+0.4f %+0.4f %+0.4f %+0.4f]",m.openGL()[12],m.openGL()[13],m.openGL()[14],m.openGL()[15]); 00424 renderText(10,16*7,text,font); 00425 00426 renderText(10,16*8,"Projection Matrix",font); 00427 // now we use the QString sprintf 00428 m=m_cameras[m_cameraIndex].getProjection(); 00429 text.sprintf("[ %+0.4f %+0.4f %+0.4f %+0.4f]",m.openGL()[0],m.openGL()[1],m.openGL()[2],m.openGL()[3]); 00430 renderText(10,16*9,text,font); 00431 text.sprintf("[ %+0.4f %+0.4f %+0.4f %+0.4f]",m.openGL()[4],m.openGL()[5],m.openGL()[6],m.openGL()[7]); 00432 renderText(10,16*10,text,font); 00433 text.sprintf("[ %+0.4f %+0.4f %+0.4f %+0.4f]",m.openGL()[8],m.openGL()[9],m.openGL()[10],m.openGL()[11]); 00434 renderText(10,16*11,text,font); 00435 text.sprintf("[ %+0.4f %+0.4f %+0.4f %+0.4f]",m.openGL()[12],m.openGL()[13],m.openGL()[14],m.openGL()[15]); 00436 renderText(10,16*12,text,font); 00437 00438 font.setPointSize(10); 00439 font.setBold(true); 00440 renderText(10,16*14,"Press 'h' to display Help",font); 00441 00442 // ----- draw help 00443 int m_showHelp = m_drawHelp%2; 00444 if (m_showHelp==1) 00445 { 00446 font.setPointSize(9); 00447 font.setBold(false); 00448 00449 // now render the text using the QT renderText helper function 00450 renderText(10,18*14,"Arrow Keys : move Camera",font); 00451 renderText(10,18*15,"0-4 : switch cameras",font); 00452 renderText(10,18*16,"z/x : decrease/increase terrain height",font); 00453 renderText(10,18*17,"xxxx",font); 00454 renderText(10,18*18,"c : d",font); 00455 renderText(10,18*19,"v : increase terrain size",font); 00456 renderText(10,18*20,"+/- : change fov of Camera",font); 00457 renderText(10,18*21,"5/6 : ortho/perspective projection",font); 00458 renderText(10,18*22,"i/o : move camera in/out",font); 00459 } 00460 */ 00461 } 00463 00464 //---------------------------------------------------------------------------------------------------------------------- 00466 void GLWindow::mouseMoveEvent ( 00467 QMouseEvent * _event 00468 ) 00469 { 00470 // note the method buttons() is the button state when event was called 00471 // this is different from button() which is used to check which button was 00472 // pressed when the mousePress/Release event is generated 00473 if(m_rotate && _event->buttons() == Qt::LeftButton) 00474 { 00475 m_spinYFace = ( m_spinYFace + (_event->x() - m_origX) ) % 360 ; 00476 m_spinXFace = ( m_spinXFace + (_event->y() - m_origY) ) % 360 ; 00477 m_origX = _event->x(); 00478 m_origY = _event->y(); 00479 } 00480 // re-draw GL 00481 updateGL(); 00482 } 00484 00485 //---------------------------------------------------------------------------------------------------------------------- 00487 void GLWindow::mousePressEvent ( 00488 QMouseEvent * _event 00489 ) 00490 { 00491 // this method is called when the mouse button is pressed in this case we 00492 // store the value where the maouse was clicked (x,y) and set the Rotate flag to true 00493 if(_event->button() == Qt::LeftButton) 00494 { 00495 m_origX = _event->x(); 00496 m_origY = _event->y(); 00497 m_rotate =true; 00498 } 00499 } 00501 00502 //---------------------------------------------------------------------------------------------------------------------- 00504 void GLWindow::mouseReleaseEvent ( 00505 QMouseEvent * _event 00506 ) 00507 { 00508 // this event is called when the mouse button is released 00509 // we then set Rotate to false 00510 if (_event->button() == Qt::LeftButton) 00511 { 00512 m_rotate=false; 00513 } 00514 } 00516 00517 //---------------------------------------------------------------------------------------------------------------------- 00519 void GLWindow::timerEvent( 00520 QTimerEvent *_event 00521 ) 00522 { 00523 if(_event->timerId() == m_fpsTimer) 00524 { 00525 if( m_timer.elapsed() > 1000.0) 00526 { 00527 m_fps=m_frames; 00528 m_frames=0; 00529 m_timer.restart(); 00530 } 00531 } 00532 updateGL(); 00533 } 00535 00536 //---------------------------------------------------------------------------------------------------------------------- 00538 void GLWindow::toggleWireframe( 00539 bool _mode 00540 ) 00541 { 00542 m_wireframe=_mode; 00543 00544 fireScene->drawGrid(m_wireframe); 00545 updateGL(); 00546 } 00548 00549 //---------------------------------------------------------------------------------------------------------------------- 00550 void GLWindow::toggleShowLine( 00551 bool _mode 00552 ) 00553 { 00554 fireScene->showLine(_mode); 00555 } 00556 00557 //---------------------------------------------------------------------------------------------------------------------- 00558 void GLWindow::toggleTerrain( 00559 bool _mode 00560 ) 00561 { 00562 m_enableMountain = _mode; 00563 fireScene->toggleMountainDraw(m_enableMountain, m_mountainIterations); 00564 fireScene->updateGridPoint(); 00565 fireScene->seperateList(); 00566 } 00567 00568 //---------------------------------------------------------------------------------------------------------------------- 00569 void GLWindow::increaseTerrainHeight() 00570 { 00571 fireScene->adjustMountainHeight(0.01, 2); 00572 fireScene->updateGridPoint(); 00573 fireScene->seperateList(); 00574 } 00575 00576 //---------------------------------------------------------------------------------------------------------------------- 00577 void GLWindow::decreaseTerrainHeight() 00578 { 00579 fireScene->adjustMountainHeight(0.01, 1); 00580 fireScene->updateGridPoint(); 00581 fireScene->seperateList(); 00582 } 00583 00584 //---------------------------------------------------------------------------------------------------------------------- 00585 void GLWindow::zoomIn() 00586 { 00587 --m_fov; 00588 setCameraShape(); 00589 } 00590 00591 //---------------------------------------------------------------------------------------------------------------------- 00592 void GLWindow::zoomOut() 00593 { 00594 ++m_fov; 00595 setCameraShape(); 00596 } 00597 00598 //---------------------------------------------------------------------------------------------------------------------- 00599 void GLWindow::pickCamera( 00600 int _i 00601 ) 00602 { 00603 m_cameraIndex = _i; 00604 updateGL(); 00605 } 00606 00607 //---------------------------------------------------------------------------------------------------------------------- 00609 void GLWindow::setColour() 00610 { 00611 QColor colour = QColorDialog::getColor(); 00612 if( colour.isValid()) 00613 { 00614 ngl::ShaderManager *shader=ngl::ShaderManager::instance(); 00615 (*shader)["Colour"]->use(); 00616 shader->setShaderParam4f("Colour","Colour",colour.redF(),colour.greenF(),colour.blueF(),1.0); 00617 updateGL(); 00618 } 00619 } 00621 00622 //---------------------------------------------------------------------------------------------------------------------- 00623 void GLWindow::resetMountain() 00624 { 00625 fireScene->buildMountain(); 00626 fireScene->updateGridPoint(); 00627 fireScene->seperateList(); 00628 } 00629 00630 //---------------------------------------------------------------------------------------------------------------------- 00631 void GLWindow::setNewMountainIterations( 00632 int _newIterations 00633 ) 00634 { 00635 m_mountainIterations = _newIterations; 00636 fireScene->toggleMountainDraw(m_enableMountain,m_mountainIterations); 00637 fireScene->updateGridPoint(); 00638 fireScene->seperateList(); 00639 } 00640 00641 //---------------------------------------------------------------------------------------------------------------------- 00642 void GLWindow::moveOriginDown() 00643 { 00644 fireScene->adjustOrigin(4); 00645 } 00646 00647 //---------------------------------------------------------------------------------------------------------------------- 00648 void GLWindow::moveOriginLeft() 00649 { 00650 fireScene->adjustOrigin(1); 00651 } 00652 00653 //---------------------------------------------------------------------------------------------------------------------- 00654 void GLWindow::moveOriginRight() 00655 { 00656 fireScene->adjustOrigin(2); 00657 } 00658 00659 //---------------------------------------------------------------------------------------------------------------------- 00660 void GLWindow::moveOriginUp() 00661 { 00662 fireScene->adjustOrigin(3); 00663 } 00664 00665 //---------------------------------------------------------------------------------------------------------------------- 00666 void GLWindow::adjustObstacleAmount( 00667 int _newNumber 00668 ) 00669 { 00670 fireScene->pickObjectPosition(_newNumber); 00671 fireScene->updateGridPoint(); 00672 fireScene->seperateList(); 00673 } 00674 00675 //---------------------------------------------------------------------------------------------------------------------- 00676 void GLWindow::adjustFuelAmount(int _newAmount) 00677 { 00678 fireScene->pickFlammableObjectPosition(_newAmount); 00679 fireScene->updateGridPoint(); 00680 fireScene->seperateList(); 00681 } 00682 00683 //---------------------------------------------------------------------------------------------------------------------- 00684 void GLWindow::generateNewFirePath() 00685 { 00686 fireScene->generateNewDLA(); 00687 } 00688 00689 //---------------------------------------------------------------------------------------------------------------------- 00690 void GLWindow::editDLA() 00691 { 00692 fireScene->pauseTime(true, true); 00693 } 00694 00695 //---------------------------------------------------------------------------------------------------------------------- 00696 void GLWindow::pauseAnimation() 00697 { 00698 fireScene->pauseTime(true, false); 00699 } 00700 00701 //---------------------------------------------------------------------------------------------------------------------- 00702 void GLWindow::playAnimation() 00703 { 00704 fireScene->pauseTime(false, false); 00705 } 00706 00707 //---------------------------------------------------------------------------------------------------------------------- 00708 void GLWindow::assignNewOrigin( 00709 int _newOriginAmount 00710 ) 00711 { 00712 fireScene->adjustOriginAmount(_newOriginAmount); 00713 } 00714 00715 //---------------------------------------------------------------------------------------------------------------------- 00716 void GLWindow::selectMovingOrigin( 00717 int _indexOfOrigin 00718 ) 00719 { 00720 m_newIndexOfOrigin = _indexOfOrigin-1; 00721 fireScene->changeMovingOriginIndex(m_newIndexOfOrigin); 00722 } 00723 00724 //---------------------------------------------------------------------------------------------------------------------- 00725 void GLWindow::toggleShowMark( 00726 bool _mode 00727 ) 00728 { 00729 fireScene->showMark(_mode); 00730 } 00731 00732 //---------------------------------------------------------------------------------------------------------------------- 00733 void GLWindow::enableWind( 00734 bool _mode 00735 ) 00736 { 00737 fireScene->assignWind(_mode); 00738 00739 if(_mode==false) 00740 { 00741 m_showWindDir = false; 00742 } 00743 } 00744 00745 //---------------------------------------------------------------------------------------------------------------------- 00746 void GLWindow::showWindDir( 00747 bool _mode 00748 ) 00749 { 00750 m_showWindDir = _mode; 00751 } 00752 00753 //---------------------------------------------------------------------------------------------------------------------- 00754 void GLWindow::assignWindSpeed( 00755 int _newWindSpeed 00756 ) 00757 { 00758 if(_newWindSpeed<4) 00759 _newWindSpeed = 4; 00760 00761 fireScene->assignWindSpeed(_newWindSpeed); 00762 } 00763 00764 //---------------------------------------------------------------------------------------------------------------------- 00765 void GLWindow::changeWindDirection( 00766 int _newDir 00767 ) 00768 { 00769 m_windDirectionRot = _newDir; 00770 fireScene->assignWindDirection(ngl::Vector(m_windDirectionRot,0.0,m_windDirectionRot)); 00771 } 00772 00773 //---------------------------------------------------------------------------------------------------------------------- 00774 void GLWindow::changeTemperature( 00775 double _newTemp 00776 ) 00777 { 00778 m_temperature = _newTemp; 00779 fireScene->assignNewMoisture(_newTemp, 1); 00780 } 00781 00782 //---------------------------------------------------------------------------------------------------------------------- 00783 void GLWindow::changeMoistureOfTheScene( 00784 double _newSceneMoisture 00785 ) 00786 { 00787 m_sceneMoisture = _newSceneMoisture; 00788 fireScene->assignNewMoisture(_newSceneMoisture, 2); 00789 } 00790 00791 //---------------------------------------------------------------------------------------------------------------------- 00792 void GLWindow::changeObjMoisture( 00793 double _newObjMoisture 00794 ) 00795 { 00796 fireScene->assignNewObjMoisture(_newObjMoisture); 00797 fireScene->updateGridPoint(); 00798 fireScene->seperateList(); 00799 } 00800 00801 //---------------------------------------------------------------------------------------------------------------------- 00802 void GLWindow::adjustFuelSize( 00803 int _side, 00804 int _type 00805 ) 00806 { 00807 fireScene->adjustObjSize(_side, _type); 00808 fireScene->updateGridPoint(); 00809 fireScene->seperateList(); 00810 } 00811 00812 //---------------------------------------------------------------------------------------------------------------------- 00813 void GLWindow::selectObjIndexToAdjustSize( 00814 int _objIndex 00815 ) 00816 { 00817 int m_objIndex = _objIndex-1; 00818 fireScene->changeIndexOfObj(m_objIndex); 00819 } 00820 00821 //---------------------------------------------------------------------------------------------------------------------- 00823 void GLWindow::drawAxis( 00824 const std::string &m_shaderName, 00825 ngl::TransformStack &m_axisTransformStack, 00826 float m_scale, 00827 int m_xRot, 00828 int m_yRot 00829 ) 00830 { 00831 ngl::VBOPrimitives *prim=ngl::VBOPrimitives::instance(); 00832 // grab an instance of the shader manager 00833 ngl::ShaderManager *shader=ngl::ShaderManager::instance(); 00834 00835 ngl::Transformation tx; 00836 00837 ngl::Vector m_colour = ngl::Vector(0.8,0.6,1.0); 00838 00839 m_axisTransformStack.pushTransform(); 00840 { 00841 (*shader)[m_shaderName]->use(); 00842 shader->setShaderParamFromMatrix(m_shaderName,"ModelMatrix",m_axisTransformStack.getCurrAndGlobal().getMatrix()); 00843 00844 // ----- set colour to each point 00845 shader->setShaderParam4f(m_shaderName,m_shaderName,m_colour.m_x,m_colour.m_y,m_colour.m_z,1.0); 00846 00847 // set the global rotation 00848 tx.setRotation(m_xRot,m_yRot,0.0); 00849 m_axisTransformStack.setCurrent(tx); 00850 00851 // set the global rotation 00852 m_axisTransformStack.pushTransform(); 00853 { 00854 float m_rot = m_windDirectionRot - 180; 00855 m_axisTransformStack.getCurrentTransform().setScale(m_scale,m_scale,m_scale); 00856 m_axisTransformStack.getCurrentTransform().setPosition(ngl::Vector(0,5,0)); 00857 m_axisTransformStack.getCurrentTransform().setRotation(0,m_rot,0); 00858 m_axisTransformStack.loadGlobalMatrixToShader(m_shaderName,"ModelMatrix"); 00859 prim->draw("nglAXISCylinder"); 00860 00861 m_axisTransformStack.getCurrentTransform().setPosition(ngl::Vector(0,5,0)); 00862 m_axisTransformStack.getCurrentTransform().setRotation(0, m_windDirectionRot,0); 00863 m_axisTransformStack.loadGlobalMatrixToShader(m_shaderName,"ModelMatrix"); 00864 prim->draw("nglAXISCone"); 00865 00866 } 00867 m_axisTransformStack.popTransform(); 00868 00869 } 00870 m_axisTransformStack.popTransform(); 00871 }