DLA-Fire-Prediction-Thesis 1.0

GLWindow.cpp

Go to the documentation of this file.
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 }
 All Classes Namespaces Files Functions Variables Enumerations Enumerator