DLA-Fire-Prediction-Thesis 1.0

FireArea.cpp

Go to the documentation of this file.
00001 //----------------------------------------------------------------------------------------------------------------------
00004 //----------------------------------------------------------------------------------------------------------------------
00005 
00006 #include "FireArea.h"
00007 
00008 #include "ngl/Obj.h"
00009 #include "ngl/ShaderManager.h"
00010 #include "ngl/TransformStack.h"
00011 #include "ngl/Vector.h"
00012 #include "ngl/VBOPrimitives.h"
00013 
00014 #include "DLAStructure.h"
00015 #include "FuelObject.h"
00016 #include "FuelPoint.h"
00017 #include "GLWindow.h"
00018 
00019 //----------------------------------------------------------------------------------------------------------------------
00020 FireArea::FireArea(
00021                   int _sceneWidth,
00022                   int _sceneHeight,
00023                   float _objectRadius,
00024                   float _objectHeight,
00025                   bool _drawMountain,
00026                   int _iterations
00027                   )
00028 {
00029     m_areaWidth = _sceneWidth;
00030     m_areaHeight = _sceneHeight;
00031 
00032     m_objRadius = _objectRadius;
00033     m_objHeight = _objectHeight;
00034 
00035     m_pointRadius = 0.1;
00036 
00037     m_mountainNumber = _iterations;
00038     m_displacement = 0.5;
00039     m_terrainCircleSize = 5.0;
00040 
00041     m_drawMountain = _drawMountain;
00042     m_pauseAnimation = false;
00043 
00044     std::vector<FuelPoint> m_pointZero;
00045     m_gridPointList = m_pointZero;
00046     m_initPointList = m_pointZero;
00047     m_flammableList = m_pointZero;
00048     m_nonflammableList = m_pointZero;
00049     m_originList = m_pointZero;
00050 
00051     std::vector<ngl::Vector> m_posZero;
00052     m_currentNonFlammableList = m_posZero;
00053     m_currentFlammableList = m_posZero;
00054 
00055     // assign non-flammable object to the list by randomly pick it within the fire area
00056     pickObjectPosition(10);
00057     pickFlammableObjectPosition(4);
00058 
00059     // calculate the initial fire area
00060     // value of each point will be first indentified
00061     calculateArea();
00062     seperateList();
00063 
00064     // add terrain
00065     if(m_drawMountain==true)
00066         buildMountain();
00067 
00068     seperateList();
00069 
00070     m_timeStep = 0;
00071     m_showPath = true;
00072     m_markShowing = true;
00073 
00074     // initial amount of origin point
00075     m_numberOfOrigin = 1;
00076 
00077     // initial origin is at the centre of the scene
00078     m_indexOfOrigin = ((m_areaHeight/2)*m_areaWidth) + (m_areaWidth/2);
00079 
00080     m_originIndex = 0;
00081     m_originPosition = ngl::Vector(0.0,0.0,0.0);
00082     m_originPosition.m_w = m_indexOfOrigin;
00083     m_originList.push_back(FuelPoint(m_originPosition, 0));
00084 
00085     m_objIndex = 0;
00086 
00087     FuelPoint m_seed = m_gridPointList[m_indexOfOrigin];
00088     m_seed.setToOrigin();
00089     m_gridPointList[m_indexOfOrigin] = m_seed;
00090 
00091     m_dlaAmount = 1;
00092     m_approxDLASize = 3000;
00093     //m_approxDLASize = 1000;
00094 
00095     m_windDirection = ngl::Vector(5.0,-0.5,0.0);
00096     m_windSpeed = 10;
00097     m_addWind = false;
00098 
00099     if(m_addWind==false)
00100     {
00101         m_windDirection.m_y = 500.0;
00102     }
00103     else
00104     {
00105         m_windDirection.m_y = 0.0;
00106     }
00107 
00108     m_sceneTemperature = 23.0;
00109     m_sceneMoisture = 15.0;
00110     m_approxObjMoisture = 0.5;
00111 
00112  //   m_dlaStructureOne = new DLAStructure();
00113     m_dlaStructureOne = new DLAStructure(m_gridPointList, m_nonflammableObjectList, m_originPosition, m_areaWidth, m_areaHeight, m_pointRadius, m_approxDLASize, m_windDirection, m_windSpeed);
00114     m_currentDLAList = m_dlaStructureOne->getDLAList();
00115     m_currentDLALine = m_dlaStructureOne->getDLALine();
00116 
00117     m_firePathOne = new FirePath(m_currentDLAList, m_currentDLALine, m_gridPointList, m_approxObjMoisture, m_originList, m_addWind, m_windSpeed, m_windDirection);
00118 }
00119 
00120 //----------------------------------------------------------------------------------------------------------------------
00121 void FireArea::assignNewMoisture(double _newMoisture, int _mode)
00122 {
00123     if(_mode == 1)
00124     {
00125         m_firePathOne->assignNewTemp(_newMoisture);
00126         m_sceneTemperature = _newMoisture;
00127     }
00128     else if(_mode == 2)          // moisture
00129     {
00130         m_firePathOne->assignNewMoisture(_newMoisture);
00131         m_sceneMoisture = _newMoisture;
00132     }
00133 }
00134 
00135 //----------------------------------------------------------------------------------------------------------------------
00136 void FireArea::calculateArea()
00137 {
00138     // starter point
00139     // divided by 2 for making the first point to be the outermost point at the corner
00140     // diveded by 10 because the distance between each point is equal to 0.1
00141     ngl::Vector m_startPoint = ngl::Vector(-m_areaWidth/10, -0.5f, -m_areaHeight/10);
00142     //ngl::Vector m_startPoint = ngl::Vector(0.0f, -0.5f, 0.0f);
00143 
00144     // grid value in x-axis
00145     float m_xStartPoint = m_startPoint.m_x;
00146     // grid value in y-axis
00147     float m_yStartPoint = m_startPoint.m_y;
00148     // grid value in z-axis
00149     float m_zStartPoint = m_startPoint.m_z;
00150 
00151     // expanding point to preferred grid area
00152     for(int i=0; i<m_areaHeight; ++i)
00153     {
00154         for(int j=0; j<m_areaWidth; ++j)
00155         {
00156             ngl::Vector m_currentPoint = ngl::Vector(m_xStartPoint,m_yStartPoint,m_zStartPoint);
00157 
00158             int m_fuelArea = identifyArea(m_currentPoint);
00159 
00160             if(m_fuelArea==0)
00161             {
00162                 ngl::Vector m_currentSlope = m_currentPoint;
00163 
00164                 // assign each position to the point list
00165                 m_initPointList.push_back(FuelPoint(m_currentSlope, 0));
00166 
00167                 FuelPoint m_current = m_initPointList[(i*m_areaWidth)+j];
00168                 m_current.setToBeNonBigFuel();
00169                 m_initPointList[(i*m_areaWidth)+j] = m_current;
00170             }
00171             else if(m_fuelArea==1)
00172             {
00173                 // assign each position to the point list
00174                 m_initPointList.push_back(FuelPoint(m_currentPoint, 1));
00175 
00176                 // set random fuel
00177                 FuelPoint m_current = m_initPointList[(i*m_areaWidth)+j];
00178 
00179                 int m_randomFuel = rand()%100 + 50;
00180                 m_current.setFuelAmount(m_randomFuel);
00181                 m_current.setToBeNonBigFuel();
00182 
00183                 m_initPointList[(i*m_areaWidth)+j] = m_current;
00184             }
00185             else
00186             {
00187                 // assign each position to the point list
00188                 m_initPointList.push_back(FuelPoint(m_currentPoint, 2));
00189 
00190                 ngl::Vector m_fuelAmount = getFuelColourInTheArea(m_currentPoint);
00191 
00192                 FuelPoint m_current = m_initPointList[(i*m_areaWidth)+j];
00193 
00194                 m_current.setFuelAmount(m_fuelAmount.m_x*100);
00195                 m_current.changeColour(m_fuelAmount);
00196                 m_current.setToBeBigFuel(m_fuelAmount.m_x*100);
00197 
00198                 // assign index of obj that would identify this point
00199                 ngl::Vector m_currentPos = m_current.getPosition();
00200                 m_currentPos.m_w = m_fuelArea-2;
00201                 m_current.setPosition(m_currentPos);
00202 
00203                 m_initPointList[(i*m_areaWidth)+j] = m_current;
00204             }
00205 
00206             m_xStartPoint=m_xStartPoint+(m_pointRadius*2);
00207         }
00208         m_zStartPoint=m_zStartPoint+(m_pointRadius*2);
00209         m_xStartPoint=m_startPoint.m_x;
00210     }
00211     m_gridPointList = m_initPointList;
00212 }
00213 
00214 //----------------------------------------------------------------------------------------------------------------------
00215 void FireArea::toggleMountainDraw(
00216                                  bool _mountainDraw,
00217                                  int _iterations
00218                                  )
00219 {
00220     m_mountainNumber = _iterations;
00221 
00222     if(_mountainDraw==true)
00223     {
00224         m_drawMountain = true;
00225         buildMountain();
00226     }
00227     else
00228     {
00229         m_drawMountain = false;
00230         m_gridPointList = m_initPointList;
00231     }
00232 }
00233 
00234 //----------------------------------------------------------------------------------------------------------------------
00235 void FireArea::adjustOrigin(
00236                            int _direction
00237                            )
00238 {
00239     // assign current origin value
00240     FuelPoint m_currentOrigin = m_originList[m_originIndex];
00241     m_originPosition = m_currentOrigin.getPosition();
00242     m_indexOfOrigin = m_originPosition.m_w;
00243 
00244     int m_inWidth = m_indexOfOrigin%m_areaWidth;
00245     int m_inHeight = (m_indexOfOrigin-m_inWidth)/m_areaWidth;
00246 
00247     // change status on gridpoint list to be normal first
00248     FuelPoint m_pointOnGridList = m_gridPointList[m_indexOfOrigin];
00249     m_pointOnGridList.setToRegular();
00250     m_gridPointList[m_indexOfOrigin] = m_pointOnGridList;
00251 
00252     if(_direction==1)
00253     {
00254         // left
00255         if(m_inWidth>0)
00256         {
00257             m_indexOfOrigin -= 1;
00258             m_originPosition.m_x -= m_pointRadius*2;
00259 
00260             FuelPoint m_currentPoint = m_gridPointList[m_indexOfOrigin];
00261             bool m_pointType = m_currentPoint.isFlammable();
00262             bool m_seedType = m_currentPoint.isOrigin();
00263             while((m_pointType==false)||(m_seedType==true))
00264             {
00265                 m_indexOfOrigin -= 1;
00266                 m_currentPoint = m_gridPointList[m_indexOfOrigin];
00267                 m_pointType = m_currentPoint.isFlammable();
00268                 m_originPosition.m_x -= m_pointRadius*2;
00269                 m_seedType = m_currentPoint.isOrigin();
00270             }
00271 
00272             m_originPosition.m_w = m_indexOfOrigin;
00273             m_currentOrigin.setPosition(m_originPosition);
00274             m_originList[m_originIndex] = m_currentOrigin;
00275 
00276             // set status on gridlist
00277             FuelPoint m_newPointOnGrid = m_gridPointList[m_indexOfOrigin];
00278             m_newPointOnGrid.setToOrigin();
00279             m_gridPointList[m_indexOfOrigin] = m_newPointOnGrid;
00280         }
00281     }
00282     else if(_direction==2)
00283     {
00284         // right
00285         if(m_inWidth!=m_areaWidth-1)
00286         {
00287             m_indexOfOrigin += 1;
00288             m_originPosition.m_x += m_pointRadius*2;
00289 
00290             FuelPoint m_currentPoint = m_gridPointList[m_indexOfOrigin];
00291             bool m_pointType = m_currentPoint.isFlammable();
00292             bool m_seedType = m_currentPoint.isOrigin();
00293             while((m_pointType==false)||(m_seedType==true))
00294             {
00295                 m_indexOfOrigin += 1;
00296                 m_currentPoint = m_gridPointList[m_indexOfOrigin];
00297                 m_pointType = m_currentPoint.isFlammable();
00298                 m_originPosition.m_x += m_pointRadius*2;
00299                 m_seedType = m_currentPoint.isOrigin();
00300             }
00301 
00302             m_originPosition.m_w = m_indexOfOrigin;
00303             m_currentOrigin.setPosition(m_originPosition);
00304             m_originList[m_originIndex] = m_currentOrigin;
00305 
00306             // set status on gridlist
00307             FuelPoint m_newPointOnGrid = m_gridPointList[m_indexOfOrigin];
00308             m_newPointOnGrid.setToOrigin();
00309             m_gridPointList[m_indexOfOrigin] = m_newPointOnGrid;
00310         }
00311     }
00312     else if(_direction==3)
00313     {
00314         // up
00315         if(m_inHeight>0)
00316         {
00317             m_indexOfOrigin -= m_areaHeight;
00318             m_originPosition.m_z -= m_pointRadius*2;
00319 
00320             FuelPoint m_currentPoint = m_gridPointList[m_indexOfOrigin];
00321             bool m_pointType = m_currentPoint.isFlammable();
00322             bool m_seedType = m_currentPoint.isOrigin();
00323             while((m_pointType==false)||(m_seedType==true))
00324             {
00325                 m_indexOfOrigin -= m_areaHeight;
00326                 m_currentPoint = m_gridPointList[m_indexOfOrigin];
00327                 m_pointType = m_currentPoint.isFlammable();
00328                 m_originPosition.m_z -= m_pointRadius*2;
00329                 m_seedType = m_currentPoint.isOrigin();
00330             }
00331 
00332             m_originPosition.m_w = m_indexOfOrigin;
00333             m_currentOrigin.setPosition(m_originPosition);
00334             m_originList[m_originIndex] = m_currentOrigin;
00335 
00336             // set status on gridlist
00337             FuelPoint m_newPointOnGrid = m_gridPointList[m_indexOfOrigin];
00338             m_newPointOnGrid.setToOrigin();
00339             m_gridPointList[m_indexOfOrigin] = m_newPointOnGrid;
00340         }
00341     }
00342     else
00343     {
00344         // down
00345         if(m_inHeight!=m_areaHeight-1)
00346         {
00347             m_indexOfOrigin += m_areaHeight;
00348             m_originPosition.m_z += m_pointRadius*2;
00349 
00350             FuelPoint m_currentPoint = m_gridPointList[m_indexOfOrigin];
00351             bool m_pointType = m_currentPoint.isFlammable();
00352             bool m_seedType = m_currentPoint.isOrigin();
00353             while((m_pointType==false)||(m_seedType==true))
00354             {
00355                 m_indexOfOrigin += m_areaHeight;
00356                 m_currentPoint = m_gridPointList[m_indexOfOrigin];
00357                 m_pointType = m_currentPoint.isFlammable();
00358                 m_originPosition.m_z += m_pointRadius*2;
00359                 m_seedType = m_currentPoint.isOrigin();
00360             }
00361 
00362             m_originPosition.m_w = m_indexOfOrigin;
00363             m_currentOrigin.setPosition(m_originPosition);
00364             m_originList[m_originIndex] = m_currentOrigin;
00365 
00366             // set status on gridlist
00367             FuelPoint m_newPointOnGrid = m_gridPointList[m_indexOfOrigin];
00368             m_newPointOnGrid.setToOrigin();
00369             m_gridPointList[m_indexOfOrigin] = m_newPointOnGrid;
00370         }
00371     }
00372 
00373     m_firePathOne->setNewOriginList(m_originList);
00374 
00375 }
00376 
00377 //----------------------------------------------------------------------------------------------------------------------
00378 ngl::Vector FireArea::getFuelColourInTheArea(ngl::Vector m_checkingArea)
00379 {
00380     ngl::Vector m_objFuel = ngl::Vector(0.0,1.0,0.0);
00381 
00382     for(unsigned int q=0; q<m_flammableObjectList.size(); ++q)
00383     {
00384         FuelObject m_fuelObject = m_flammableObjectList[q];
00385         ngl::Vector m_fuelObjectPos = m_fuelObject.getPosition();
00386 
00387         ngl::Vector m_distance = m_fuelObjectPos - m_checkingArea;
00388         float m_distanceLength = m_distance.length();
00389         float m_fuelObjectRadius = m_fuelObject.getRadius();
00390 
00391         if(m_distanceLength<0)
00392             m_distanceLength *= -1;
00393 
00394         if((m_fuelObjectPos.m_x>=m_checkingArea.m_x-m_fuelObjectRadius) && (m_fuelObjectPos.m_x<=m_checkingArea.m_x+m_fuelObjectRadius))
00395         {
00396             if((m_fuelObjectPos.m_z>=m_checkingArea.m_z-m_fuelObjectRadius) && (m_fuelObjectPos.m_z<=m_checkingArea.m_z+m_fuelObjectRadius))
00397             {
00398                 m_objFuel = m_fuelObject.getColour();
00399             }
00400         }
00401     }
00402     return m_objFuel;
00403 }
00404 
00405 //----------------------------------------------------------------------------------------------------------------------
00406 void FireArea::updateGridPoint()
00407 {
00408     // update initList
00409     for(unsigned int j=0; j<m_initPointList.size(); ++j)
00410     {
00411         FuelPoint m_initPoint = m_initPointList[j];
00412         ngl::Vector m_initPos = m_initPoint.getPosition();
00413 
00414         int m_fuelArea = identifyArea(m_initPos);
00415 
00416         if(m_fuelArea==0)
00417         {
00418             m_initPoint.makeToBeNonflammable();
00419             m_initPoint.setToBeNonBigFuel();
00420         }
00421         else if(m_fuelArea==1)
00422         {
00423             FuelPoint m_gridPoint = m_gridPointList[j];
00424             int m_randomFuel = m_gridPoint.getCurrentFuelValue();
00425             m_initPoint.makeToBeflammable(m_randomFuel);
00426             m_initPoint.setToBeNonBigFuel();
00427         }
00428         else
00429         {
00430             ngl::Vector m_fuelAmount = getFuelColourInTheArea(m_initPos);
00431             m_initPoint.makeToBeflammable(m_fuelAmount.m_x*100);
00432             m_initPoint.changeColour(m_fuelAmount);
00433             m_initPoint.setToBeBigFuel(m_fuelAmount.m_x*100);
00434 
00435             // assign index of obj that would identify this point
00436             ngl::Vector m_currentPos = m_initPoint.getPosition();
00437             m_currentPos.m_w = m_fuelArea-2;
00438             m_initPoint.setPosition(m_currentPos);
00439         }
00440 
00441         m_initPointList[j] = m_initPoint;
00442         m_initPoint = m_initPointList[j];
00443     }
00444 
00445     std::vector<ngl::Vector> m_posZero;
00446     m_currentNonFlammableList = m_posZero;
00447 
00448     // update gridList
00449     for(unsigned int i=0; i<=m_gridPointList.size(); ++i)
00450     {
00451         FuelPoint m_currentGridPoint = m_gridPointList[i];
00452         ngl::Vector m_currentPoint = m_currentGridPoint.getPosition();
00453 
00454         int m_fuelArea = identifyArea(m_currentPoint);
00455 
00456         if(m_fuelArea==0)
00457         {
00458             m_currentGridPoint.makeToBeNonflammable();
00459             m_currentGridPoint.setToBeNonBigFuel();
00460         }
00461         else if(m_fuelArea==1)
00462         {
00463             int m_randomFuel = m_currentGridPoint.getCurrentFuelValue();
00464             if(m_randomFuel==0)
00465                 m_randomFuel = rand()%100 + 50;
00466             m_currentGridPoint.makeToBeflammable(m_randomFuel);
00467             m_currentGridPoint.setToBeNonBigFuel();
00468         }
00469         else
00470         {
00471             ngl::Vector m_fuelAmount = getFuelColourInTheArea(m_currentPoint);
00472             m_currentGridPoint.makeToBeflammable(m_fuelAmount.m_x*100);
00473             m_currentGridPoint.changeColour(m_fuelAmount);
00474             m_currentGridPoint.setToBeBigFuel(m_fuelAmount.m_x*100);
00475 
00476             // assign index of obj that would identify this point
00477             ngl::Vector m_currentPos = m_currentGridPoint.getPosition();
00478             m_currentPos.m_w = m_fuelArea-2;
00479             m_currentGridPoint.setPosition(m_currentPos);
00480         }
00481 
00482         m_gridPointList[i] = m_currentGridPoint;
00483 
00484         m_currentGridPoint = m_gridPointList[i];
00485     }
00486 
00487     m_firePathOne->updateFuelOnGrid(m_gridPointList);
00488 }
00489 
00490 //----------------------------------------------------------------------------------------------------------------------
00491 void FireArea::buildMountain()
00492 {
00493     m_gridPointList = m_initPointList;
00494 
00495     for(int q=0;q<m_mountainNumber;++q)
00496     {
00497         int m_firstRandom = rand()%m_areaWidth;
00498         int m_secondRandom = rand()%(m_areaWidth*m_areaHeight);
00499 
00500         int m_firstIndex = m_firstRandom;
00501         int m_secondIndex = m_secondRandom;
00502 
00503         int m_selectedIndex = m_firstIndex;
00504 
00505         FuelPoint m_terrainPoint = m_gridPointList[m_firstIndex];
00506         ngl::Vector m_firstTerrainPos = m_terrainPoint.getPosition();
00507 
00508         m_terrainPoint = m_gridPointList[m_secondIndex];
00509         ngl::Vector m_secondTerrainPos = m_terrainPoint.getPosition();
00510 
00511         ngl::Vector m_mountainCentre = m_firstTerrainPos;
00512 
00513         // choose the circle centre
00514         int m_randOne = rand()%2 + 1;
00515         if(m_randOne==1)
00516         {
00517             m_mountainCentre = m_secondTerrainPos;
00518             m_selectedIndex = m_secondIndex;
00519         }
00520         else
00521             m_terrainPoint = m_gridPointList[m_firstIndex];
00522 
00523         // random circle variables
00524         int m_maxCircleSize = m_terrainCircleSize*10;
00525         int m_terrainCircle = rand()%m_maxCircleSize + 10;
00526         float m_circleSize = (float)m_terrainCircle/10;
00527         int m_maxDisp = m_displacement*1000;
00528         int m_randDisp = rand()%m_maxDisp;
00529         while(m_randDisp<100)
00530             m_randDisp = rand()%m_maxDisp;
00531         float m_circleDisp = (float)m_randDisp/1000 ;
00532 
00533         m_terrainPoint.setToBeMountain(m_circleSize, m_circleDisp);
00534         m_gridPointList[m_selectedIndex] = m_terrainPoint;
00535 
00536     }
00537     adjustMountain(2);
00538 }
00539 
00540 //----------------------------------------------------------------------------------------------------------------------
00541 void FireArea::adjustMountainHeight(
00542                                    float _adjustingHeight,
00543                                    int _adjustStatus
00544                                    )
00545 {
00546     for(unsigned int a=0; a<m_gridPointList.size(); ++a)
00547     {
00548         FuelPoint m_adjustingPoint = m_gridPointList[a];
00549 
00550         if(m_adjustingPoint.isMointain()==true)
00551         {
00552             m_adjustingPoint.setCircleHeight(_adjustingHeight);
00553             m_gridPointList[a] = m_adjustingPoint;
00554         }
00555     }
00556     adjustMountain(_adjustStatus);
00557 }
00558 
00559 //----------------------------------------------------------------------------------------------------------------------
00560 void FireArea::adjustMountain(
00561                              int m_adjustStatus
00562                              )
00563 {
00564     for(unsigned int p=0; p<m_gridPointList.size(); ++p)
00565     {
00566         FuelPoint m_checkingPoint = m_gridPointList[p];
00567 
00568         float m_circleSize = m_checkingPoint.getCircleSize();
00569         float m_circleDisp = m_checkingPoint.getCircleHeight();
00570 
00571         ngl::Vector m_mountainCentre = m_checkingPoint.getPosition();
00572 
00573         if(m_checkingPoint.isMointain()==true)
00574         {
00579             for(unsigned int k=0; k<m_gridPointList.size(); ++k)
00580             {
00581                 FuelPoint m_initPoint = m_gridPointList[k];
00582                 ngl::Vector m_initPos = m_initPoint.getPosition();
00583 
00584                 float m_yPos = m_initPos.m_y;
00585 
00586                 ngl::Vector m_deltaSphere = m_initPos - m_mountainCentre;
00587                 float m_distSphere = m_deltaSphere.length();
00588 
00589                 // ----- from pd = distance from circle center * 2 / terrainCircleSize
00590                 float pd = (m_distSphere*2)/m_circleSize;
00591 
00592                 // ----- from y = height(tx,tz) +=  disp/2 + cos(pd*3.14)*disp/2;
00593                 if (fabs(pd) <=1.0)
00594                 {
00595                     if(m_adjustStatus==2)
00596                         m_yPos += (m_circleDisp/2) + cos(pd*3.14)*(m_circleDisp/2);
00597                     else
00598                         m_yPos -= (m_circleDisp/2) + cos(pd*3.14)*(m_circleDisp/2);
00599                 }
00600 
00601                 m_initPos.m_y = m_yPos;
00602 
00603                 m_initPoint.setPosition(m_initPos);
00604 
00605                 m_gridPointList[k] = m_initPoint;
00606             }
00609 
00610         }
00611     }
00612 }
00613 
00614 //----------------------------------------------------------------------------------------------------------------------
00615 int FireArea::identifyArea(
00616                           ngl::Vector m_checkingArea
00617                           )
00618 {
00619     int m_fuelArea = 1;
00620 
00621     // ----- fuel object
00622     for(unsigned int k=0; k<m_flammableObjectList.size(); ++k)
00623     {
00624         FuelObject m_objectArea = m_flammableObjectList[k];
00625         ngl::Vector m_area = m_objectArea.getPosition();
00626 
00627         // plus 0.05 for the over range area, thus, the fire path would not go into the object
00628         float m_objectRadius = m_objectArea.getRadius();
00629 
00630         if((m_area.m_x>=m_checkingArea.m_x-m_objectRadius) && (m_area.m_x<=m_checkingArea.m_x+m_objectRadius))
00631         {
00632             if((m_area.m_z>=m_checkingArea.m_z-m_objectRadius) && (m_area.m_z<=m_checkingArea.m_z+m_objectRadius))
00633             {
00634                 m_fuelArea = k+2;
00635                 m_checkingArea.m_w = k;
00636                 m_currentFlammableList.push_back(m_checkingArea);
00637             }
00638         }
00639     }
00640 
00641     // ----- non-flammable object
00642     for(unsigned int k=0; k<m_nonflammableObjectList.size(); ++k)
00643     {
00644         FuelObject m_objectArea = m_nonflammableObjectList[k];
00645         ngl::Vector m_area = m_objectArea.getPosition();
00646 
00647         // plus 0.05 for the over range area, thus, the fire path would not go into the object
00648         float m_objectRadius = m_objectArea.getRadius() + 0.05;
00649 
00650         if((m_area.m_x>=m_checkingArea.m_x-m_objectRadius) && (m_area.m_x<=m_checkingArea.m_x+m_objectRadius))
00651         {
00652             if((m_area.m_z>=m_checkingArea.m_z-m_objectRadius) && (m_area.m_z<=m_checkingArea.m_z+m_objectRadius))
00653             {
00654                 m_fuelArea = 0;
00655                 m_checkingArea.m_w = k;
00656                 m_currentNonFlammableList.push_back(m_checkingArea);
00657             }
00658         }
00659     }
00660 
00661     return m_fuelArea;
00662 }
00663 
00664 //----------------------------------------------------------------------------------------------------------------------
00665 void FireArea::seperateList()
00666 {
00667     std::vector<FuelPoint> m_pointZero;
00668     m_flammableList = m_pointZero;
00669     m_nonflammableList = m_pointZero;
00670 
00671     for(unsigned int i=0; i<m_gridPointList.size(); ++i)
00672     {
00673         FuelPoint m_point = m_gridPointList[i];
00674 
00675         if(m_point.isFlammable()==true)
00676         {
00677             m_flammableList.push_back(m_point);
00678         }
00679         else
00680         {
00681             m_nonflammableList.push_back(m_point);
00682         }
00683     }
00684 
00685     // ----- non-flammable object
00686     for(unsigned int j=0; j<m_currentNonFlammableList.size(); ++j)
00687     {
00688         ngl::Vector m_initPos = m_currentNonFlammableList[j];
00689         int m_nearIndex = 0;
00690 
00691         for(unsigned int k=0; k<m_gridPointList.size(); ++k)
00692         {
00693             FuelPoint m_point = m_gridPointList[k];
00694             ngl::Vector m_pointPos = m_point.getPosition();
00695 
00696             m_initPos.m_y = 0.0;
00697             m_pointPos.m_y = 0.0;
00698 
00699             ngl::Vector m_distVect = m_pointPos - m_initPos;
00700             float m_distNum = m_distVect.length();
00701 
00702             if(m_distNum==0.0)
00703             {
00704                 m_nearIndex = k;
00705             }
00706         }
00707 
00708         m_initPos = m_currentNonFlammableList[j];
00709 
00710         FuelPoint m_currPoint = m_gridPointList[m_nearIndex];
00711         ngl::Vector m_currentPos = m_currPoint.getPosition();
00712         m_initPos.m_y = m_currentPos.m_y;
00713 
00714         m_currentNonFlammableList[j] = m_initPos;
00715     }
00716 
00717     // ----- Fuel object
00718     for(unsigned int m=0; m<m_currentFlammableList.size(); ++m)
00719     {
00720         ngl::Vector m_initPos = m_currentFlammableList[m];
00721         int m_nearIndex = 0;
00722 
00723         for(unsigned int k=0; k<m_gridPointList.size(); ++k)
00724         {
00725             FuelPoint m_point = m_gridPointList[k];
00726             ngl::Vector m_pointPos = m_point.getPosition();
00727 
00728             m_initPos.m_y = 0.0;
00729             m_pointPos.m_y = 0.0;
00730 
00731             ngl::Vector m_distVect = m_pointPos - m_initPos;
00732             float m_distNum = m_distVect.length();
00733 
00734             if(m_distNum==0.0)
00735             {
00736                 m_nearIndex = k;
00737             }
00738         }
00739 
00740         m_initPos = m_currentFlammableList[m];
00741 
00742         FuelPoint m_currPoint = m_gridPointList[m_nearIndex];
00743         ngl::Vector m_currentPos = m_currPoint.getPosition();
00744         m_initPos.m_y = m_currentPos.m_y;
00745 
00746         m_currentFlammableList[m] = m_initPos;
00747     }
00748 }
00749 
00750 //----------------------------------------------------------------------------------------------------------------------
00751 void FireArea::pickFlammableObjectPosition(
00752                                  int m_amountobject
00753                                  )
00754 {
00755     std::vector<FuelObject> m_zeroList;
00756     m_flammableObjectList = m_zeroList;
00757 
00758     std::vector<ngl::Vector> m_zeroPos;
00759     m_currentFlammableList = m_zeroPos;
00760 
00761     for(int m=0; m<m_amountobject; ++m)
00762     {
00763         int m_objR = m_objRadius*10;
00764 
00765         float m_xValue = rand()% (m_areaWidth-(m_objR*2)) + (m_objR);
00766         float m_yValue = 0.0;
00767         float m_zValue = rand()% (m_areaHeight-(m_objR*2)) + (m_objR);
00768 
00769         int m_randomXsign = rand()%2 +1;
00770         int m_randomZsign = rand()%2 +1;
00771 
00772         if(m_randomXsign == 2)
00773             m_xValue *= -1;
00774 
00775         if(m_randomZsign == 2)
00776             m_zValue *= -1;
00777 
00778         int m_randomRadiusRatio = rand()%10 + 5;
00779         float m_randomRadius = (m_randomRadiusRatio*10)*m_objRadius;
00780 
00781         ngl::Vector m_randomPosition = ngl::Vector(m_xValue/10, m_yValue, m_zValue/10, m_randomRadius/75);
00782 
00783         bool m_finePos = false;
00784 
00785         // ----- check collision with other object
00786         while(m_finePos==false)
00787         {
00788             int m_tooCloseCount = 0;
00789 
00790             for(unsigned int n=0; n<m_nonflammableObjectList.size(); ++n)
00791             {
00792                 FuelObject m_nonFlammableObj = m_nonflammableObjectList[n];
00793                 ngl::Vector m_nonFlammableObjPos = m_nonFlammableObj.getPosition();
00794 
00795                 float m_nonFlammableFuel = m_nonFlammableObjPos.m_w;
00796 
00797                 ngl::Vector m_distance = m_nonFlammableObjPos - m_randomPosition;
00798                 float m_distanceLength = m_distance.length();
00799 
00800                 if(m_distanceLength<0)
00801                     m_distanceLength *= -1;
00802 
00803                 float m_acceptableDistance = m_nonFlammableFuel + m_randomRadius/75 + m_objRadius;
00804 
00805                 if(m_distanceLength<m_acceptableDistance)
00806                     ++m_tooCloseCount;
00807             }
00808 
00809             for(unsigned int p=0; p<m_flammableObjectList.size(); ++p)
00810             {
00811                 FuelObject m_flammableObj = m_flammableObjectList[p];
00812                 ngl::Vector m_flammableObjPos = m_flammableObj.getPosition();
00813 
00814                 ngl::Vector m_distanceFuel = m_flammableObjPos - m_randomPosition;
00815                 float m_distanceFuelLength = m_distanceFuel.length();
00816 
00817                 if(m_distanceFuelLength<0)
00818                     m_distanceFuelLength *= -1;
00819 
00820                 float m_minDistance = m_flammableObjPos.m_w + m_randomPosition.m_w;
00821 
00822                 if(m_distanceFuelLength<m_minDistance)
00823                     ++m_tooCloseCount;
00824             }
00825 
00826             if(m_tooCloseCount>0)
00827             {
00828                 m_finePos = false;
00829                 m_xValue = rand()% (m_areaWidth-(m_objR*2)) + (m_objR);
00830                 m_yValue = 0.0;
00831                 m_zValue = rand()% (m_areaHeight-(m_objR*2)) + (m_objR);
00832 
00833                 m_randomXsign = rand()%2 +1;
00834                 m_randomZsign = rand()%2 +1;
00835 
00836                 if(m_randomXsign == 2)
00837                     m_xValue *= -1;
00838 
00839                 if(m_randomZsign == 2)
00840                     m_zValue *= -1;
00841 
00842                 m_randomPosition = ngl::Vector(m_xValue/10, m_yValue, m_zValue/10, m_randomRadius/75);
00843             }
00844             else
00845             {
00846                 m_finePos = true;
00847             }
00848         } // end while loop
00849 
00850         m_flammableObjectList.push_back(FuelObject(m_randomPosition, 1, 1));
00851 
00852     }
00853 
00854     // assign fuel amount, radius, height and colour
00855     for(unsigned int f=0; f<m_flammableObjectList.size(); ++f)
00856     {
00857         FuelObject m_point = m_flammableObjectList[f];
00858 
00859         ngl::Vector m_pointPos = m_point.getPosition();
00860 
00861         int m_randomFuel = rand()%100 + 50;
00862         m_point.setFuelAmount(m_randomFuel);
00863 
00864         float m_randomHeight = (m_randomFuel*2)/100;
00865 
00866         m_point.setRadius(m_pointPos.m_w);
00867         m_point.setHeight(m_randomHeight);
00868 
00869         m_flammableObjectList[f] = m_point;
00870     }
00871 }
00872 
00873 //----------------------------------------------------------------------------------------------------------------------
00874 void FireArea::pickObjectPosition(
00875                                  int m_amountobject
00876                                  )
00877 {
00878     std::vector<FuelObject> m_zeroList;
00879     m_nonflammableObjectList = m_zeroList;
00880 
00881     std::vector<ngl::Vector> m_zeroPos;
00882     m_currentNonFlammableList = m_zeroPos;
00883 
00884     for(int a=0; a<m_amountobject; ++a)
00885     {
00886         int m_objR = m_objRadius*10;
00887 
00888         float m_xValue = rand()% (m_areaWidth-(m_objR*2)) + (m_objR);
00889         float m_yValue = 0.0;
00890         float m_zValue = rand()% (m_areaHeight-(m_objR*2)) + (m_objR);
00891 
00892         int m_randomXsign = rand()%2 +1;
00893         int m_randomZsign = rand()%2 +1;
00894 
00895         if(m_randomXsign == 2)
00896             m_xValue *= -1;
00897 
00898         if(m_randomZsign == 2)
00899             m_zValue *= -1;
00900 
00901         int m_randomRadiusRatio = rand()%10 + 9;
00902         float m_randomRadius = (m_randomRadiusRatio*10)*m_objRadius;
00903 
00904         ngl::Vector m_randomPosition = ngl::Vector(m_xValue/10, m_yValue, m_zValue/10, m_randomRadius/100);
00905 
00906         // check collision with origin point
00907         for(unsigned int d=0; d<m_originList.size(); ++d)
00908         {
00909             FuelPoint m_checkOrigin = m_originList[d];
00910             ngl::Vector m_checkingPos = m_checkOrigin.getPosition();
00911             ngl::Vector m_deltaOrigin = m_randomPosition - m_checkingPos;
00912             float m_distOrigin = m_deltaOrigin.length();
00913 
00914             while(m_distOrigin<1)
00915             {
00916                 m_xValue = rand()% (m_areaWidth-(m_objR*2)) + (m_objR);
00917                 m_zValue = rand()% (m_areaHeight-(m_objR*2)) + (m_objR);
00918                 m_randomXsign = rand()%2 +1;
00919                 m_randomZsign = rand()%2 +1;
00920 
00921                 if(m_randomXsign == 2)
00922                     m_xValue *= -1;
00923 
00924                 if(m_randomZsign == 2)
00925                     m_zValue *= -1;
00926 
00927                 m_randomPosition = ngl::Vector(m_xValue/10, m_yValue, m_zValue/10, m_objRadius);
00928 
00929                 m_deltaOrigin = m_randomPosition - m_checkingPos;
00930                 m_distOrigin = m_deltaOrigin.length();
00931 
00932                 d=0;
00933             }
00934         }
00935 
00936         // check collision with other object
00937         if(a>0)
00938         {
00939             bool m_putIn = false;
00940 
00941             while(m_putIn==false)
00942             {
00943                 int m_hitCount = 0;
00944 
00945                 for(unsigned int k=1; k<=m_nonflammableObjectList.size(); ++k)
00946                 {
00947                     FuelObject m_previousObject = m_nonflammableObjectList[k-1];
00948                     ngl::Vector m_previousPosition = m_previousObject.getPosition();
00949 
00950                     ngl::Vector m_delta = m_previousPosition - m_randomPosition;
00951                     float m_distance = m_delta.length();
00952 
00953                     float m_previousRadius = m_previousPosition.m_w;
00954                     float m_radiusPoint = m_previousRadius + m_randomPosition.m_w;
00955 
00956                     // if the distance is less than radius of object, it means it's collision
00957                     if(m_distance<m_radiusPoint*2 || m_distance<m_objRadius*2)
00958                     {
00959                         ++m_hitCount;
00960                         m_putIn = false;
00961                     }
00962                 }
00963 
00964                 for(unsigned int l=1; l<=m_flammableObjectList.size(); ++l)
00965                 {
00966                     FuelObject m_previousObject = m_flammableObjectList[l-1];
00967                     ngl::Vector m_previousPosition = m_previousObject.getPosition();
00968 
00969                     ngl::Vector m_delta = m_previousPosition - m_randomPosition;
00970                     float m_distance = m_delta.length();
00971 
00972                     float m_previousRadius = m_previousPosition.m_w;
00973                     float m_radiusPoint = m_previousRadius + m_randomPosition.m_w;
00974 
00975                     // if the distance is less than radius of object, it means it's collision
00976                     if(m_distance<m_radiusPoint*2 || m_distance<m_objRadius*2)
00977                     {
00978                         ++m_hitCount;
00979                         m_putIn = false;
00980                     }
00981                 }
00982 
00983                 if(m_hitCount>0)
00984                 {
00985                     m_xValue = rand()% (m_areaWidth-(m_objR*2)) + (m_objR);
00986                     m_zValue = rand()% (m_areaHeight-(m_objR*2)) + (m_objR);
00987                     m_randomXsign = rand()%2 +1;
00988                     m_randomZsign = rand()%2 +1;
00989 
00990                     if(m_randomXsign == 2)
00991                         m_xValue *= -1;
00992 
00993                     if(m_randomZsign == 2)
00994                         m_zValue *= -1;
00995 
00996                     m_randomPosition = ngl::Vector(m_xValue/10, m_yValue, m_zValue/10, m_objRadius+0.05);
00997 
00998                     // check collision with origin point
00999                     for(unsigned int d=0; d<m_originList.size(); ++d)
01000                     {
01001                         FuelPoint m_checkOrigin = m_originList[d];
01002                         ngl::Vector m_checkingPos = m_checkOrigin.getPosition();
01003                         ngl::Vector m_deltaOrigin = m_randomPosition - m_checkingPos;
01004                         float m_distOrigin = m_deltaOrigin.length();
01005 
01006                         while(m_distOrigin<1)
01007                         {
01008                             m_xValue = rand()% (m_areaWidth-(m_objR*2)) + (m_objR);
01009                             m_zValue = rand()% (m_areaHeight-(m_objR*2)) + (m_objR);
01010                             m_randomXsign = rand()%2 +1;
01011                             m_randomZsign = rand()%2 +1;
01012 
01013                             if(m_randomXsign == 2)
01014                                 m_xValue *= -1;
01015 
01016                             if(m_randomZsign == 2)
01017                                 m_zValue *= -1;
01018 
01019                             m_randomPosition = ngl::Vector(m_xValue/10, m_yValue, m_zValue/10, m_objRadius+0.05);
01020 
01021                             m_deltaOrigin = m_randomPosition - m_checkingPos;
01022                             m_distOrigin = m_deltaOrigin.length();
01023 
01024                             d=0;
01025                         }
01026                     }
01027 
01028                     m_putIn = false;
01029                 }
01030                 else
01031                     m_putIn = true;
01032             }
01033         }
01034 
01035         int m_randShape = rand()%2 + 1;
01036 
01037         m_nonflammableObjectList.push_back(FuelObject(m_randomPosition, 0, m_randShape));
01038     }
01039 
01040     // assign radius and height
01041     for(unsigned int f=0; f<m_nonflammableObjectList.size(); ++f)
01042     {
01043         FuelObject m_point = m_nonflammableObjectList[f];
01044 
01045         ngl::Vector m_pointPos = m_point.getPosition();
01046 
01047         if(m_point.getShape()==1)
01048         {
01049             m_point.setRadius(m_pointPos.m_w);
01050         }
01051         else
01052         {
01053             m_point.setRadius(m_pointPos.m_w);
01054 
01055             int m_randY = rand()%9+5;
01056             float m_yHeight = m_pointPos.m_w*m_randY;
01057 
01058             m_point.setHeight(m_yHeight/10);
01059         }
01060 
01061         m_nonflammableObjectList[f] = m_point;
01062     }
01063 }
01064 
01065 //----------------------------------------------------------------------------------------------------------------------
01066 void FireArea::drawArea(
01067                        const std::string &_shaderName,
01068                        ngl::TransformStack &_transformStack
01069                        )const
01070 {
01071     ngl::ShaderManager *shader=ngl::ShaderManager::instance();
01072     ngl::VBOPrimitives *prim=ngl::VBOPrimitives::instance();
01073 
01074     // ----- draw wind point
01075     _transformStack.pushTransform();
01076     {
01077         ngl::Vector m_currentWindDirection = m_originPosition;
01078 
01079         if(m_addWind==true)
01080         {
01081             ngl::Vector m_newOrigin = m_originPosition;
01082             ngl::Vector m_originAtCentre = ngl::Vector(0.0,0.0,0.0);
01083 
01084             float m_xDiff = m_newOrigin.m_x - m_originAtCentre.m_x;
01085             float m_zDiff = m_newOrigin.m_z - m_originAtCentre.m_z;
01086 
01087             ngl::Vector m_adaptedOrigin = m_windDirection;//(m_windDirection*m_windSpeed)/10;
01088             m_currentWindDirection = ngl::Vector(m_adaptedOrigin.m_x+m_xDiff, m_adaptedOrigin.m_y, m_adaptedOrigin.m_z+m_zDiff);
01089 
01090             float m_windXDiff = m_currentWindDirection.m_x - m_newOrigin.m_x;
01091             float m_windZDiff = m_currentWindDirection.m_z - m_newOrigin.m_z;
01092 
01093             float m_adjustWindXDiff = (m_windSpeed*m_windXDiff)/10;
01094             float m_adjustWindZDiff = (m_windSpeed*m_windZDiff)/10;
01095 
01096             m_currentWindDirection = ngl::Vector(m_newOrigin.m_x+m_adjustWindXDiff, m_currentWindDirection.m_y, m_newOrigin.m_z+m_adjustWindZDiff);
01097 
01098            if(m_currentWindDirection.m_x>m_areaWidth/10)
01099                 m_currentWindDirection.m_x = m_areaWidth/10;
01100             else if(m_currentWindDirection.m_x<-(m_areaWidth/10))
01101                 m_currentWindDirection.m_x = -(m_areaWidth/10);
01102 
01103             if(m_currentWindDirection.m_z>m_areaHeight/10)
01104                 m_currentWindDirection.m_z = m_areaHeight/10;
01105             else if(m_currentWindDirection.m_z<-(m_areaHeight/10))
01106                 m_currentWindDirection.m_z = -(m_areaHeight/10);
01107         }
01108 
01109         _transformStack.getCurrentTransform().setPosition(m_currentWindDirection);
01110         _transformStack.getCurrentTransform().setScale(m_pointRadius,m_pointRadius,m_pointRadius);
01111 
01112         (*shader)[_shaderName]->use();
01113         shader->setShaderParamFromMatrix(_shaderName,"ModelMatrix",_transformStack.getCurrAndGlobal().getMatrix());
01114         shader->setShaderParam4f(_shaderName,_shaderName,0.8,0.6,1.0,1.0);
01115 
01116         if(m_addWind==true)
01117             prim->draw("sphere");
01118 
01119         // ----- draw origin
01120         if(m_markShowing==true)
01121         {
01122             for(unsigned int k=0; k<m_originList.size(); ++k)
01123             {
01124                 FuelPoint m_originPoint = m_originList[k];
01125                 ngl::Vector m_originPos = m_originPoint.getPosition();
01126                 int m_inOrigin = m_originPos.m_w;
01127 
01128                 for(unsigned int j=0; j<m_gridPointList.size(); ++j)
01129                 {
01130                     FuelPoint m_point = m_gridPointList[j];
01131                     ngl::Vector m_pointPosition = m_point.getPosition();
01132 
01133                     float m_adjustY = 0.25;
01134 
01135                     if(m_point.isFuel()==true)
01136                     {
01137                         float m_objFuel = m_point.getCurrentFuelValue();
01138                         m_adjustY = m_objFuel/100;
01139                         m_adjustY *= 0.8;
01140                         m_adjustY += 0.05;
01141                     }
01142 
01143                     if(j==(unsigned)m_inOrigin)
01144                     {
01145                         ngl::Vector m_colour = ngl::Vector(1.0,1.0,1.0);
01146 
01147                         // assign colour of origin
01148                         if(j==(unsigned)m_indexOfOrigin)
01149                         {
01150                             m_colour = ngl::Vector(1.0,0.7,0.0);
01151                         }
01152 
01153                         _transformStack.getCurrentTransform().setRotation(90.0,0.0,0.0);
01154                         _transformStack.getCurrentTransform().setPosition(m_originPos.m_x, m_pointPosition.m_y+m_adjustY-0.01, m_originPos.m_z);
01155                         (*shader)[_shaderName]->use();
01156                         shader->setShaderParamFromMatrix(_shaderName,"ModelMatrix",_transformStack.getCurrAndGlobal().getMatrix());
01157                         shader->setShaderParam4f(_shaderName,_shaderName,m_colour.m_x,m_colour.m_y,m_colour.m_z,1.0);
01158                         prim->draw("disk");
01159 
01160                         _transformStack.getCurrentTransform().setPosition(m_originPos.m_x, m_pointPosition.m_y+m_adjustY, m_originPos.m_z);
01161                         _transformStack.getCurrentTransform().setRotation(-270.0,0.0,0.0);
01162                         _transformStack.getCurrentTransform().setScale(m_pointRadius,m_pointRadius,m_pointRadius);
01163                         shader->setShaderParamFromMatrix(_shaderName,"ModelMatrix",_transformStack.getCurrAndGlobal().getMatrix());
01164                         shader->setShaderParam4f(_shaderName,_shaderName,m_colour.m_x,m_colour.m_y,m_colour.m_z,1.0);
01165                         prim->draw("cone");
01166                     }
01167                 }
01168             } // end for loop
01169         } // end if draw mark is true condition
01170     }
01171     _transformStack.popTransform();
01172 
01173     _transformStack.pushTransform();
01174     {
01175         if(m_showPath)
01176         {
01177             m_firePathOne->controlFirePathColour();
01178         }
01179     }
01180     _transformStack.popTransform();
01181 
01182 }
01183 
01184 //----------------------------------------------------------------------------------------------------------------------
01185 void FireArea::drawRandomobject(
01186                                const std::string &_shaderName,
01187                                ngl::TransformStack &_transformStack
01188                                )const
01189 {
01190     ngl::ShaderManager *shader=ngl::ShaderManager::instance();
01191 
01192     int m_pointRad = m_pointRadius*2*10;
01193 
01194     float m_transparency = 0.6;
01195 
01196     // ----- draw object
01197     _transformStack.pushTransform();
01198     {
01199         for(unsigned int u=0; u<m_nonflammableObjectList.size(); ++u)
01200         {
01201             FuelObject m_currentObj = m_nonflammableObjectList[u];
01202             int m_shapeType = m_currentObj.getShape();
01203 
01204             std::vector<ngl::Vector> m_currentNonFuelList;
01205 
01206             ngl::Vector m_colour = m_currentObj.getColour();
01207 
01208             float m_objHeight = m_currentObj.getHeight()/2;
01209             m_objHeight -= 0.05;
01210 
01211             if(m_objHeight<=0.001)
01212                 m_objHeight = 0.2;
01213 
01214             (*shader)[_shaderName]->use();
01215             shader->setShaderParamFromMatrix(_shaderName,"ModelMatrix",_transformStack.getCurrAndGlobal().getMatrix());
01216 
01217             // ----- set colour to each point
01218             shader->setShaderParam4f(_shaderName,_shaderName,m_colour.m_x,m_colour.m_y,m_colour.m_z,m_transparency);
01219 
01220             for(unsigned int v=0;v<m_currentNonFlammableList.size(); ++v)
01221             {
01222                 ngl::Vector m_currentPoint = m_currentNonFlammableList[v];
01223                 int m_currentObjIndex = m_currentPoint.m_w;
01224 
01225                 if((unsigned)m_currentObjIndex==u)
01226                 {
01227                     m_currentNonFuelList.push_back(m_currentPoint);
01228                 }
01229             }
01230 
01231             // find width and height size of each set of obj points
01232             ngl::Vector m_previousPosition = m_currentNonFuelList[0];
01233             ngl::Vector m_currentPosition = m_currentNonFuelList[m_currentNonFuelList.size()-1];
01234 
01235             float m_distanceX = (m_previousPosition.m_x - m_currentPosition.m_x)*100;
01236             float m_distanceZ = (m_previousPosition.m_z - m_currentPosition.m_z)*100;
01237 
01238             m_distanceX = floor(m_distanceX);
01239             m_distanceZ = floor(m_distanceZ);
01240 
01241             int m_distX = m_distanceX/10;
01242             int m_distZ = m_distanceZ/10;
01243             m_distX = abs(m_distX);
01244             m_distZ = abs(m_distZ);
01245 
01246             // amount of point per column-z and row-x
01247             m_distX = (m_distX/m_pointRad) + 1;
01248             m_distZ = (m_distZ/m_pointRad) + 1;
01249 
01250             // square
01251             if(m_shapeType==2)
01252             {
01253                 // ----- draw plane for non-fuel object
01254                 for(int m_height = 0; m_height<m_distZ-1; ++m_height)
01255                 {
01256                     for(int m_width = 0; m_width<m_distX-1; ++m_width)
01257                     {
01258                         int m_indexWH = m_width + (m_height*m_distX);
01259                         ngl::Vector m_posWH = m_currentNonFuelList[m_indexWH];
01260 
01261                         // base
01262                         glBegin(GL_QUADS);
01263                             glVertex3f(m_posWH.m_x, m_posWH.m_y-0.05, m_posWH.m_z);
01264 
01265                             m_posWH = m_currentNonFuelList[m_indexWH+1];
01266                             glVertex3f(m_posWH.m_x, m_posWH.m_y-0.05, m_posWH.m_z);
01267 
01268                             m_posWH = m_currentNonFuelList[m_indexWH+m_distX+1];
01269                             glVertex3f(m_posWH.m_x, m_posWH.m_y-0.05, m_posWH.m_z);
01270 
01271                             m_posWH = m_currentNonFuelList[m_indexWH+m_distX];
01272                             glVertex3f(m_posWH.m_x, m_posWH.m_y-0.05, m_posWH.m_z);
01273                         glEnd();
01274 
01275                         m_posWH = m_currentNonFuelList[m_indexWH];
01276 
01277                         // top
01278                         glBegin(GL_QUADS);
01279                             glVertex3f(m_posWH.m_x, m_posWH.m_y+m_objHeight, m_posWH.m_z);
01280 
01281                             m_posWH = m_currentNonFuelList[m_indexWH+1];
01282                             glVertex3f(m_posWH.m_x, m_posWH.m_y+m_objHeight, m_posWH.m_z);
01283 
01284                             m_posWH = m_currentNonFuelList[m_indexWH+m_distX+1];
01285                             glVertex3f(m_posWH.m_x, m_posWH.m_y+m_objHeight, m_posWH.m_z);
01286 
01287                             m_posWH = m_currentNonFuelList[m_indexWH+m_distX];
01288                             glVertex3f(m_posWH.m_x, m_posWH.m_y+m_objHeight, m_posWH.m_z);
01289                         glEnd();
01290                     }
01291                 }
01292 
01293                 // draw side LR
01294                 for(int m_height = 0; m_height<m_distZ-1; ++m_height)
01295                 {
01296                     for(int m_width = 0; m_width<m_distX; m_width += m_distX-1)
01297                     {
01298                         int m_indexWH = m_width + (m_height*m_distX);
01299                         ngl::Vector m_posWH = m_currentNonFuelList[m_indexWH];
01300 
01301                         // side
01302                         glBegin(GL_QUADS);
01303 
01304                             glVertex3f(m_posWH.m_x, m_posWH.m_y+m_objHeight, m_posWH.m_z);
01305 
01306                             m_posWH = m_currentNonFuelList[m_indexWH+m_distX];
01307                             glVertex3f(m_posWH.m_x, m_posWH.m_y+m_objHeight, m_posWH.m_z);
01308 
01309                             m_posWH = m_currentNonFuelList[m_indexWH+m_distX];
01310                             glVertex3f(m_posWH.m_x, m_posWH.m_y-0.05, m_posWH.m_z);
01311 
01312                             m_posWH = m_currentNonFuelList[m_indexWH];
01313                             glVertex3f(m_posWH.m_x, m_posWH.m_y-0.05, m_posWH.m_z);
01314 
01315                         glEnd();
01316                     }
01317                 }
01318 
01319                 // draw side TB
01320                 for(int m_height = 0; m_height<m_distZ; m_height += m_distZ-1)
01321                 {
01322                     for(int m_width = 0; m_width<m_distX-1; ++m_width)
01323                     {
01324                         int m_indexWH = m_width + (m_height*m_distX);
01325                         ngl::Vector m_posWH = m_currentNonFuelList[m_indexWH];
01326 
01327                         // side
01328                         glBegin(GL_QUADS);
01329                             glVertex3f(m_posWH.m_x, m_posWH.m_y+m_objHeight, m_posWH.m_z);
01330 
01331                             m_posWH = m_currentNonFuelList[m_indexWH+1];
01332                             glVertex3f(m_posWH.m_x, m_posWH.m_y+m_objHeight, m_posWH.m_z);
01333 
01334                             m_posWH = m_currentNonFuelList[m_indexWH+1];
01335                             glVertex3f(m_posWH.m_x, m_posWH.m_y-0.05, m_posWH.m_z);
01336 
01337                             m_posWH = m_currentNonFuelList[m_indexWH];
01338                             glVertex3f(m_posWH.m_x, m_posWH.m_y-0.05, m_posWH.m_z);
01339                         glEnd();
01340                     }
01341                 }
01342             } // end if shape = cube condition
01343         } // end object list for loop
01344     } // end stack
01345     _transformStack.popTransform();
01346 
01347     m_transparency = 1.0;
01348 
01349     // ----- draw sphere object
01350     _transformStack.pushTransform();
01351     {
01352         for(unsigned int u=0; u<m_nonflammableObjectList.size(); ++u)
01353         {
01354             FuelObject m_currentObj = m_nonflammableObjectList[u];
01355             int m_shapeType = m_currentObj.getShape();
01356 
01357             std::vector<ngl::Vector> m_currentNonFuelList;
01358 
01359             float m_objHeight = m_currentObj.getHeight()/3;
01360             float m_objRad = m_currentObj.getRadius()-0.05;
01361 
01362             if(m_objHeight<=0.001)
01363                 m_objHeight = 0.1;
01364 
01365             ngl::Vector m_colour = m_currentObj.getColour();
01366             m_colour.m_x -= 0.15;
01367             m_colour.m_y -= 0.15;
01368             m_colour.m_z -= 0.2;
01369 
01370             ngl::Vector m_colour2 = ngl::Vector(0.45,0.55,1.0);
01371             //m_colour = m_colour2;
01372             m_colour2.m_z = m_colour.m_z;
01373 
01374             for(unsigned int v=0;v<m_currentNonFlammableList.size(); ++v)
01375             {
01376                 ngl::Vector m_currentPoint = m_currentNonFlammableList[v];
01377                 int m_currentObjIndex = m_currentPoint.m_w;
01378 
01379                 if((unsigned)m_currentObjIndex==u)
01380                 {
01381                     m_currentNonFuelList.push_back(m_currentPoint);
01382                 }
01383             }
01384 
01385             // find width and height size of each set of obj points
01386             ngl::Vector m_previousPosition = m_currentNonFuelList[0];
01387             ngl::Vector m_currentPosition = m_currentNonFuelList[m_currentNonFuelList.size()-1];
01388 
01389             float m_distanceX = (m_previousPosition.m_x - m_currentPosition.m_x)*100;
01390             float m_distanceZ = (m_previousPosition.m_z - m_currentPosition.m_z)*100;
01391             m_distanceX = floor(m_distanceX);
01392             m_distanceZ = floor(m_distanceZ);
01393 
01394             int m_distX = m_distanceX/10;
01395             int m_distZ = m_distanceZ/10;
01396             m_distX = abs(m_distX);
01397             m_distZ = abs(m_distZ);
01398 
01399             // amount of point per column-z and row-x
01400             m_distX = (m_distX/m_pointRad) + 1;
01401             m_distZ = (m_distZ/m_pointRad) + 1;
01402 
01403             ngl::Vector m_topRight = m_currentNonFuelList[m_distX-1];
01404             ngl::Vector m_bottomLeft = m_currentNonFuelList[m_currentNonFuelList.size()-m_distX];
01405 
01406             // sphere
01407             if(m_shapeType==1)
01408             {
01409                 float m_diffX = m_currentPosition.m_x - m_previousPosition.m_x;
01410                 float m_diffY = m_currentPosition.m_y - m_previousPosition.m_y;
01411                 float m_diffZ = m_currentPosition.m_z - m_previousPosition.m_z;
01412 
01413                 if(m_diffX<0)
01414                     m_diffX *= -1;
01415                 if(m_diffZ<0)
01416                     m_diffZ *= -1;
01417 
01418                 float m_centreX = m_diffX/2;
01419                 float m_centreY = m_diffY/2;
01420                 float m_centreZ = m_diffZ/2;
01421 
01422                 ngl::Vector m_adaptedPosition = m_previousPosition;
01423                 m_adaptedPosition.m_x += m_centreX;
01424                 m_adaptedPosition.m_y += m_centreY;
01425                 m_adaptedPosition.m_z += m_centreZ;
01426 
01427                 std::vector<ngl::Vector> m_baseCircleList;
01428                 std::vector<ngl::Vector> m_circleList;
01429                 std::vector<ngl::Vector> m_upperCircleList;
01430                 std::vector<ngl::Vector> m_topCircleList;
01431 
01432                 int m_highestY = 0;
01433 
01434                 if((m_currentPosition.m_y+0.1<m_previousPosition.m_y)&&(m_currentPosition.m_y+0.1<m_topRight.m_y)&&(m_currentPosition.m_y+0.1<m_bottomLeft.m_y))
01435                 {
01436                     m_highestY = 1;
01437                 }
01438                 else if((m_currentPosition.m_y>m_previousPosition.m_y+0.1)&&(m_currentPosition.m_y>m_topRight.m_y+0.1)&&(m_currentPosition.m_y>m_bottomLeft.m_y+0.1))
01439                 {
01440                     m_highestY = -1;
01441                 }
01442                 else if((m_topRight.m_y+0.1<m_previousPosition.m_y)&&(m_topRight.m_y+0.1<m_currentPosition.m_y)&&(m_topRight.m_y+0.1<m_bottomLeft.m_y))
01443                 {
01444                     m_highestY = 2;
01445                 }
01446                 else if((m_topRight.m_y>m_previousPosition.m_y+0.1)&&(m_topRight.m_y>m_currentPosition.m_y+0.1)&&(m_topRight.m_y>m_bottomLeft.m_y+0.1))
01447                 {
01448                     m_highestY = -2;
01449                 }
01450                 else if((m_bottomLeft.m_y+0.1<m_previousPosition.m_y)&&(m_bottomLeft.m_y+0.1<m_topRight.m_y)&&(m_bottomLeft.m_y+0.1<m_currentPosition.m_y))
01451                 {
01452                     m_highestY = 3;
01453                 }
01454                 else if((m_bottomLeft.m_y>m_previousPosition.m_y+0.1)&&(m_bottomLeft.m_y>m_topRight.m_y+0.1)&&(m_bottomLeft.m_y>m_currentPosition.m_y+0.1))
01455                 {
01456                     m_highestY = -3;
01457                 }
01458                 else
01459                 {
01460                     m_highestY = 0;
01461                 }
01462 
01463                 if(m_highestY!=0)
01464                 {
01465                     m_colour = m_colour2;
01466                     m_colour.m_z +=0.4;
01467                     m_colour.m_x +=0.25;
01468                     m_colour.m_y +=0.25;
01469                 }
01470 
01471                 (*shader)[_shaderName]->use();
01472                 shader->setShaderParamFromMatrix(_shaderName,"ModelMatrix",_transformStack.getCurrAndGlobal().getMatrix());
01473 
01474                 // ----- set colour to each point
01475                 shader->setShaderParam4f(_shaderName,_shaderName,m_colour.m_x,m_colour.m_y,m_colour.m_z,m_transparency);
01476 
01477                 // draw circle on the plane
01478                 m_baseCircleList.push_back(ngl::Vector(m_adaptedPosition.m_x, m_adaptedPosition.m_y, m_adaptedPosition.m_z));
01479 
01480                 float m_togglePoint = 0.0;
01481 
01482                 for(int i=0; i<360; ++i)
01483                 {
01484                     float angle = i* 3.14159/180;
01485                     float m_xCircle = m_adaptedPosition.m_x + sin(angle)*m_objRad;
01486                     float m_zCircle = m_adaptedPosition.m_z + cos(angle)*m_objRad;
01487 
01488                     ngl::Vector m_newCirclePos = ngl::Vector(m_xCircle, m_adaptedPosition.m_y, m_zCircle);
01489                     int m_pickedIndex = 0;
01490                     float m_minD = 1000.0;
01491 
01492                     for(unsigned int b=0; b<m_currentNonFuelList.size(); ++b)
01493                     {
01494                         ngl::Vector m_checkedGridPoint = m_currentNonFuelList[b];
01495                         ngl::Vector m_newCPos = m_newCirclePos;
01496                         m_newCPos.m_y = 0.0;
01497                         m_checkedGridPoint.m_y = 0.0;
01498                         ngl::Vector m_diff = m_checkedGridPoint - m_newCPos;
01499                         float m_diffLength = m_diff.length();
01500 
01501                         if(m_diffLength<m_minD)
01502                         {
01503                             m_minD = m_diffLength;
01504                             m_pickedIndex = b;
01505                         }
01506                     }
01507                     m_newCirclePos = m_currentNonFuelList[m_pickedIndex];
01508                     float m_deltaY = m_newCirclePos.m_y - 0.02;
01509                     if(i>0)
01510                     {
01511                         ngl::Vector m_previousCirclePos = m_baseCircleList[i-1];
01512                         float m_previousY = m_previousCirclePos.m_y;
01513                         if(m_previousY!=m_deltaY)
01514                             m_togglePoint += 1.0;
01515                     }
01516                     m_baseCircleList.push_back(ngl::Vector(m_xCircle, m_deltaY, m_zCircle,m_togglePoint));
01517                 }
01518 
01519                 // apply base circle to the circle with the terrain height added
01520                 ngl::Vector m_tempPos = m_baseCircleList[0];
01521                 m_tempPos = m_baseCircleList[m_baseCircleList.size()-1];
01522                 int m_maxIterations = m_tempPos.m_w;
01523 
01524                 for(int d=0; d<m_maxIterations; ++d)
01525                 {
01526                     std::vector<ngl::Vector> m_tempList;
01527                     int m_lastIndex = 0;
01528                     ngl::Vector m_nextStepPos = m_baseCircleList[0];
01529 
01530                     for(unsigned int c=0; c<m_baseCircleList.size(); ++c)
01531                     {
01532                         ngl::Vector m_tempCirclePos = m_baseCircleList[c];
01533                         int m_iterationsNumber = m_tempCirclePos.m_w;
01534 
01535                         if((m_iterationsNumber==d)||(m_iterationsNumber==d+1))
01536                         {
01537                             m_tempList.push_back(m_tempCirclePos);
01538                             m_lastIndex = c;
01539                         }
01540                     }
01541 
01542                     if(d!=m_maxIterations-1)
01543                     {
01544                         m_nextStepPos = m_baseCircleList[m_lastIndex+1];
01545                     }
01546 
01547                     if(m_tempList.size()>0)
01548                     {
01549                         ngl::Vector m_dCircle = m_tempList[1];
01550                         float m_deltaBetStep = m_nextStepPos.m_y - m_dCircle.m_y;
01551                         float m_distStep = m_deltaBetStep/m_tempList.size();
01552 
01553                         // adjust point
01554                         for(unsigned int e=0; e<m_tempList.size(); ++e)
01555                         {
01556                             ngl::Vector m_tCircle = m_tempList[e];
01557                             m_tCircle.m_y = m_dCircle.m_y+ (e*m_distStep);
01558                             m_tempList[e] = m_tCircle;
01559                         }
01560 
01561                         for(unsigned int f=0; f<m_tempList.size(); ++f)
01562                         {
01563                             ngl::Vector m_d = m_tempList[f];
01564                             m_circleList.push_back(m_d);
01565                         }
01566                     } // end if templist > 0 condition
01567                 } // end for loop
01568 
01569                 // more steps
01570                 if(m_circleList.size()<m_baseCircleList.size())
01571                 {
01572                     int m_contIndex = m_maxIterations-1;
01573                     std::vector<ngl::Vector> m_tempList;
01574 
01575                     ngl::Vector m_nextStepPos = m_baseCircleList[m_baseCircleList.size()-1];
01576 
01577                     for(unsigned int n=0; n<m_baseCircleList.size(); ++n)
01578                     {
01579                         ngl::Vector m_moreCirclePos = m_baseCircleList[n];
01580                         int m_lastIterations = m_moreCirclePos.m_w;
01581 
01582                         if((m_lastIterations==m_contIndex)||(m_lastIterations==m_contIndex+1)||(m_lastIterations==m_contIndex+2))
01583                         {
01584                            m_tempList.push_back(m_moreCirclePos);
01585                         }
01586                     }
01587 
01588                     // find nearest point on the exist circle list
01589                     float m_closestPos = 1000.0;
01590                     int m_closestIn = 0;
01591                     for(unsigned int j=0; j<m_circleList.size(); ++j)
01592                     {
01593                         ngl::Vector m_checkPos = m_circleList[j];
01594 
01595                         m_checkPos.m_y = 0.0;
01596                         m_nextStepPos.m_y = 0.0;
01597 
01598                         ngl::Vector m_diffPos = m_checkPos-m_nextStepPos;
01599                         float m_distPos = m_diffPos.length();
01600 
01601                         if(m_distPos<m_closestPos)
01602                         {
01603                             m_closestPos = m_distPos;
01604                             m_closestIn = j;
01605                         }
01606                     }
01607                     ngl::Vector m_closestPoint = m_circleList[m_closestIn];
01608 
01609                     // apply nearest point on the exist circle list
01610                     ngl::Vector m_dCircle = m_tempList[1];
01611                     float m_deltaBetStep = m_closestPoint.m_y - m_dCircle.m_y;
01612                     float m_distStep = m_deltaBetStep/m_tempList.size();
01613 
01614                     // adjust point
01615                     for(unsigned int e=0; e<m_tempList.size(); ++e)
01616                     {
01617                         ngl::Vector m_tCircle = m_tempList[e];
01618                         m_tCircle.m_y = m_dCircle.m_y+ (e*m_distStep);
01619                         m_tempList[e] = m_tCircle;
01620                     }
01621 
01622                     for(unsigned int d=0; d<m_tempList.size(); ++d)
01623                     {
01624                         ngl::Vector m_d = m_tempList[d];
01625                         m_circleList.push_back(m_d);
01626                     }
01627                 }
01628 
01629                 m_objHeight = 0.12;
01630 
01631                 // base circle
01632                 glBegin(GL_TRIANGLE_FAN);
01633                     ngl::Vector m_cPos = m_circleList[0];
01634                     glVertex3f(m_cPos.m_x, m_cPos.m_y, m_cPos.m_z);
01635 
01636                     for(unsigned int z=1; z<m_circleList.size(); ++z)
01637                     {
01638                         m_cPos = m_circleList[z];
01639                         glVertex3f(m_cPos.m_x, m_cPos.m_y, m_cPos.m_z);
01640                     }
01641 
01642                     m_cPos = m_circleList[1];
01643                     glVertex3f(m_cPos.m_x, m_cPos.m_y, m_cPos.m_z);
01644                 glEnd();
01645 
01646                 // upper circle
01647                 if(m_highestY==0)
01648                 {
01649                     glBegin(GL_TRIANGLE_FAN);
01650                     // glBegin(GL_LINE_LOOP);
01651                         for(unsigned int p=0; p<m_circleList.size(); ++p)
01652                         {
01653                             ngl::Vector m_circlePos = m_circleList[p];
01654 
01655                             if(m_highestY==1)
01656                             {
01657                                 m_circlePos.m_x += m_objHeight;
01658                                 m_circlePos.m_y += m_objHeight;
01659                                 m_circlePos.m_z += m_objHeight;
01660                             }
01661                             else if(m_highestY==-1)
01662                             {
01663                                 m_circlePos.m_x -= m_objHeight;
01664                                 m_circlePos.m_y += m_objHeight;
01665                                 m_circlePos.m_z -= m_objHeight;
01666                             }
01667                             else if(m_highestY==2)
01668                             {
01669                                 m_circlePos.m_x += m_objHeight;
01670                                 m_circlePos.m_y += m_objHeight;
01671                                 m_circlePos.m_z -= m_objHeight;
01672                             }
01673                             else if(m_highestY==-2)
01674                             {
01675                                 m_circlePos.m_x -= m_objHeight;
01676                                 m_circlePos.m_y += m_objHeight;
01677                                 m_circlePos.m_z += m_objHeight;
01678                             }
01679                             else if(m_highestY==3)
01680                             {
01681                                 m_circlePos.m_x -= m_objHeight;
01682                                 m_circlePos.m_y += m_objHeight;
01683                                 m_circlePos.m_z += m_objHeight;
01684                             }
01685                             else if(m_highestY==-3)
01686                             {
01687                                 m_circlePos.m_x += m_objHeight;
01688                                 m_circlePos.m_y += m_objHeight;
01689                                 m_circlePos.m_z -= m_objHeight;
01690                             }
01691                             else
01692                             {
01693                                 m_circlePos.m_y += m_objHeight;
01694                             }
01695 
01696                             glVertex3f(m_circlePos.m_x, m_circlePos.m_y, m_circlePos.m_z);
01697 
01698                             m_upperCircleList.push_back(m_circlePos);
01699                         } // end for loop
01700 
01701                         ngl::Vector m_circle2Init = m_upperCircleList[1];
01702                         glVertex3f(m_circle2Init.m_x, m_circle2Init.m_y, m_circle2Init.m_z);
01703 
01704                     glEnd();
01705                 }
01706                 else
01707                 {
01708                     m_upperCircleList = m_circleList;
01709                 }
01710 
01711                 // ----- set colour to each point
01712                 if(m_highestY!=0)
01713                 {
01714                     ngl::Vector m_colour3 = m_colour2;
01715                     m_colour3.m_z +=0.4;
01716                     m_colour3.m_x +=0.25;
01717                     m_colour3.m_y +=0.25;
01718                     m_colour2 = m_colour3;
01719                 }
01720 
01721                 shader->setShaderParam4f(_shaderName,_shaderName,m_colour2.m_x,m_colour2.m_y,m_colour2.m_z,m_transparency);
01722                 m_objHeight = 0.03;
01723 
01724                 // ----- lift up the base sphere
01725                 m_topCircleList = m_upperCircleList;
01726                 float m_maxY = -10000.0;
01727                 int m_highestPointIndex = 0;
01728 
01729                 // ----- find highest Y pos
01730                 for(unsigned int r=0; r<m_upperCircleList.size(); ++r)
01731                 {
01732                     ngl::Vector m_highestPoint = m_upperCircleList[r];
01733                     float m_tempHighestY = m_highestPoint.m_y;
01734 
01735                     if(m_tempHighestY>m_maxY)
01736                     {
01737                         m_maxY = m_tempHighestY;
01738                         m_highestPointIndex = r;
01739                     }
01740                 }
01741                 ngl::Vector m_highestBase = m_upperCircleList[m_highestPointIndex];
01742 
01743                 for(unsigned int q=0; q<m_topCircleList.size(); ++q)
01744                 {
01745                     ngl::Vector m_liftUpPos = m_topCircleList[q];
01746                     m_liftUpPos.m_y = m_highestBase.m_y + m_objHeight;
01747                     m_topCircleList[q] = m_liftUpPos;
01748                 }
01749 
01750                 // upper circle (top)
01751                 glBegin(GL_TRIANGLE_FAN);
01752                     ngl::Vector m_ePos = m_topCircleList[0];
01753                     glVertex3f(m_ePos.m_x, m_ePos.m_y, m_ePos.m_z);
01754 
01755                     for(unsigned int z=1; z<m_topCircleList.size(); ++z)
01756                     {
01757                         m_ePos = m_topCircleList[z];
01758                         glVertex3f(m_ePos.m_x, m_ePos.m_y, m_ePos.m_z);
01759                     }
01760 
01761                     m_ePos = m_topCircleList[1];
01762                     glVertex3f(m_ePos.m_x, m_ePos.m_y, m_ePos.m_z);
01763                 glEnd();
01764 
01765                 glBegin(GL_QUADS);
01766                     for(unsigned int m=0; m<m_upperCircleList.size()-1; ++m)
01767                     {
01768                         ngl::Vector m_circlePosG = m_upperCircleList[m];
01769                         glVertex3f(m_circlePosG.m_x, m_circlePosG.m_y, m_circlePosG.m_z);
01770 
01771                         ngl::Vector m_circlePosT = m_topCircleList[m];
01772                         glVertex3f(m_circlePosT.m_x, m_circlePosT.m_y, m_circlePosT.m_z);
01773 
01774                         m_circlePosT = m_topCircleList[m+1];
01775                         glVertex3f(m_circlePosT.m_x, m_circlePosT.m_y, m_circlePosT.m_z);
01776 
01777                         m_circlePosG = m_upperCircleList[m+1];
01778                         glVertex3f(m_circlePosG.m_x, m_circlePosG.m_y, m_circlePosG.m_z);
01779                     }
01780                 glEnd();
01781 
01782                 // ----- set colour to each point
01783                 shader->setShaderParam4f(_shaderName,_shaderName,m_colour.m_x,m_colour.m_y,m_colour.m_z,m_transparency);
01784 
01785                 glBegin(GL_QUADS);
01786                     for(unsigned int m=0; m<m_circleList.size()-1; ++m)
01787                     {
01788                         ngl::Vector m_circlePosG = m_circleList[m];
01789                         glVertex3f(m_circlePosG.m_x, m_circlePosG.m_y, m_circlePosG.m_z);
01790 
01791                         ngl::Vector m_circlePosT = m_upperCircleList[m];
01792                         glVertex3f(m_circlePosT.m_x, m_circlePosT.m_y, m_circlePosT.m_z);
01793 
01794                         m_circlePosT = m_upperCircleList[m+1];
01795                         glVertex3f(m_circlePosT.m_x, m_circlePosT.m_y, m_circlePosT.m_z);
01796 
01797                         m_circlePosG = m_circleList[m+1];
01798                         glVertex3f(m_circlePosG.m_x, m_circlePosG.m_y, m_circlePosG.m_z);
01799                     }
01800                 glEnd();
01801 
01802             } // end if object is sphere
01803         } // end object list for loop
01804 
01805     } // end stack
01806     _transformStack.popTransform();
01807 
01808     // ------------------------------------------------------- Fuel Object -------------------------------------------------------
01809     // ----- draw sphere object
01810     m_transparency = 1.0;
01811 
01812     ngl::VBOPrimitives *prim=ngl::VBOPrimitives::instance();
01813 
01814     std::vector<FuelPoint> m_gridList = m_firePathOne->getCurrentFuelList();
01815 
01816     _transformStack.pushTransform();
01817     {
01818         for(unsigned int u=0; u<m_gridList.size(); ++u)
01819         {
01820             FuelPoint m_currentPoint = m_gridList[u];
01821             ngl::Vector m_pointPosition = m_currentPoint.getPosition();
01822 
01823             float m_currentObjHeight = m_currentPoint.getCurrentFuelValue();
01824             m_currentObjHeight = (m_currentObjHeight*2)/100;
01825 
01826             float m_objRad =  m_pointRadius*3;
01827 
01828             float m_transObj = m_currentPoint.getMoisture();
01829 
01830             if(m_currentPoint.isFuel()==true)
01831             {
01832                 ngl::Vector m_colourObj = m_currentPoint.getColour();
01833 
01834                 ngl::Vector m_colour = m_colourObj;
01835                 m_colour.m_x = m_colourObj.m_x+0.1;
01836                 m_colour.m_y = m_colourObj.m_y+0.5;
01837                 m_colour.m_z = m_colourObj.m_z+0.1;
01838 
01839                 // change the colour
01840                 //m_colourObj = ngl::Vector(1.0,0.95,0.0);
01841 
01842                 if((m_pauseAnimation==true)&&(m_showPath==false))
01843                 {
01844                     if(m_objIndex==m_pointPosition.m_w)
01845                      {
01846                          m_colourObj = ngl::Vector(1.0,0.95,0.0);
01847                      }
01848                 }
01849 
01850                 _transformStack.getCurrentTransform().setPosition(m_pointPosition);
01851                 _transformStack.getCurrentTransform().setRotation(-90,0,0);
01852                 _transformStack.getCurrentTransform().setScale(m_objRad,m_currentObjHeight,m_objRad);
01853 
01854                 (*shader)[_shaderName]->use();
01855                 shader->setShaderParamFromMatrix(_shaderName,"ModelMatrix",_transformStack.getCurrAndGlobal().getMatrix());
01856 
01857                 // ----- set colour to each point
01858                 shader->setShaderParam4f(_shaderName,_shaderName,m_colourObj.m_x,m_colourObj.m_y,m_colourObj.m_z,m_transObj);
01859 
01860                 prim->draw("cylinder");
01861                 prim->draw("disk");
01862 
01863                 float m_thisHeight = m_currentObjHeight * m_objHeight;
01864 
01865                 _transformStack.getCurrentTransform().setPosition(m_pointPosition.m_x, m_pointPosition.m_y+m_thisHeight, m_pointPosition.m_z);
01866                 shader->setShaderParamFromMatrix(_shaderName,"ModelMatrix",_transformStack.getCurrAndGlobal().getMatrix());
01867 
01868                 // ----- set colour to each point
01869                 shader->setShaderParam4f(_shaderName,_shaderName,m_colourObj.m_x,m_colourObj.m_y,m_colourObj.m_z,m_transparency);
01870                 prim->draw("disk");
01871 
01872             } // end object list for loop
01873         }
01874 
01875     } // end stack
01876     _transformStack.popTransform();
01877 
01878     // top
01879      _transformStack.pushTransform();
01880      {
01881          for(unsigned int u=0; u<m_gridList.size(); ++u)
01882          {
01883              FuelPoint m_currentPoint = m_gridList[u];
01884              ngl::Vector m_pointPosition = m_currentPoint.getPosition();
01885 
01886              float m_currentObjHeight = m_currentPoint.getCurrentFuelValue();
01887              m_currentObjHeight = (m_currentObjHeight*2)/100;
01888 
01889              float m_objRad =  m_pointRadius*3;
01890 
01891              if(m_currentPoint.isFuel()==true)
01892              {
01893                  ngl::Vector m_colourObj = m_currentPoint.getColour();
01894 
01895                  ngl::Vector m_colour = m_colourObj;
01896                  m_colour.m_x = m_colourObj.m_x+0.1;
01897                  m_colour.m_y = m_colourObj.m_y+0.5;
01898                  m_colour.m_z = m_colourObj.m_z+0.1;
01899 
01900                  if((m_pauseAnimation==true)&&(m_showPath==false))
01901                  {
01902                      if(m_objIndex==m_pointPosition.m_w)
01903                          m_colourObj = ngl::Vector(1.0,1.0,0.0);
01904                  }
01905 
01906                 // _transformStack.getCurrentTransform().setPosition(m_pointPosition);
01907                  _transformStack.getCurrentTransform().setRotation(-90,0,0);
01908                 // _transformStack.getCurrentTransform().setScale(m_objRad,m_currentObjHeight,m_objRad);
01909 
01910                  float m_thisHeight = m_currentObjHeight * m_objHeight;
01911 
01912                  _transformStack.getCurrentTransform().setPosition(m_pointPosition.m_x, m_pointPosition.m_y+m_thisHeight, m_pointPosition.m_z);
01913                  _transformStack.getCurrentTransform().setScale(m_objRad,0.6,m_objRad);
01914 
01915                  // ----- set colour to each point
01916                  (*shader)[_shaderName]->use();
01917                  shader->setShaderParamFromMatrix(_shaderName,"ModelMatrix",_transformStack.getCurrAndGlobal().getMatrix());
01918                  shader->setShaderParam4f(_shaderName,_shaderName,m_colourObj.m_x,m_colourObj.m_y,m_colourObj.m_z,m_transparency);
01919                  prim->draw("disk");
01920 
01921                  prim->draw("cylinder");
01922 
01923                  _transformStack.getCurrentTransform().setPosition(m_pointPosition.m_x, m_pointPosition.m_y+m_thisHeight+0.1, m_pointPosition.m_z);
01924 
01925                  shader->setShaderParamFromMatrix(_shaderName,"ModelMatrix",_transformStack.getCurrAndGlobal().getMatrix());
01926                  shader->setShaderParam4f(_shaderName,_shaderName,m_colourObj.m_x,m_colourObj.m_y,m_colourObj.m_z,m_transparency);
01927                  prim->draw("disk");
01928              } // end object list for loop
01929          }
01930 
01931      } // end stack
01932      _transformStack.popTransform();
01933 
01934 }
01935 
01936 //----------------------------------------------------------------------------------------------------------------------
01937 void FireArea::drawGrid(
01938                        bool _wireframe
01939                        )
01940 {
01941     // ----- Grid drawing
01942     // horizontal line
01943     for(int i=0; i<m_areaHeight; ++i)
01944     {
01945        for(int j=0; j<m_areaWidth-1; ++j)
01946        {
01947            int d = j+(m_areaHeight*i);
01948 
01949            FuelPoint m_gridPoint = m_gridPointList[d];
01950            ngl::Vector m_pointPosition = m_gridPoint.getPosition();
01951 
01952            glLineWidth(1.0);
01953            // ----- draw line
01954            glBegin(GL_LINES);
01955                 glVertex3f(m_pointPosition.m_x, m_pointPosition.m_y-0.02, m_pointPosition.m_z);
01956 
01957                 m_gridPoint = m_gridPointList[d+1];
01958                 m_pointPosition = m_gridPoint.getPosition();
01959 
01960                 glVertex3f(m_pointPosition.m_x, m_pointPosition.m_y-0.02, m_pointPosition.m_z);
01961            glEnd();
01962        }
01963     }
01964 
01965     // vertical line
01966     for(int j=0; j<m_areaWidth; ++j)
01967     {
01968        for(int i=0; i<m_areaHeight-1; ++i)
01969        {
01970            int d = j+(m_areaHeight*i);
01971 
01972            FuelPoint m_gridPoint = m_gridPointList[d];
01973            ngl::Vector m_pointPosition = m_gridPoint.getPosition();
01974 
01975            // ----- draw line
01976            glBegin(GL_LINES);
01977                glVertex3f(m_pointPosition.m_x, m_pointPosition.m_y-0.02, m_pointPosition.m_z);
01978                d = d + m_areaHeight;
01979                m_gridPoint = m_gridPointList[d];
01980                m_pointPosition = m_gridPoint.getPosition();
01981 
01982                glVertex3f(m_pointPosition.m_x, m_pointPosition.m_y-0.02, m_pointPosition.m_z);
01983            glEnd();
01984        }
01985     }
01986 
01987     // diagonal line
01988     for(int j=0; j<m_areaWidth-1; ++j)
01989     {
01990        for(int i=0; i<m_areaHeight-1; ++i)
01991        {
01992            int d = j+(m_areaHeight*i);
01993 
01994            FuelPoint m_gridPoint = m_gridPointList[d];
01995            ngl::Vector m_pointPosition = m_gridPoint.getPosition();
01996 
01997            // ----- draw line
01998            glBegin(GL_LINES);
01999                glVertex3f(m_pointPosition.m_x, m_pointPosition.m_y-0.02, m_pointPosition.m_z);
02000                d = d + m_areaHeight;
02001                m_gridPoint = m_gridPointList[d+1];
02002                m_pointPosition = m_gridPoint.getPosition();
02003 
02004                glVertex3f(m_pointPosition.m_x, m_pointPosition.m_y-0.02, m_pointPosition.m_z);
02005            glEnd();
02006 
02007        }
02008     }
02009 
02010     // draw boundary
02011     glBegin(GL_LINES);
02012         glVertex3f(-m_areaWidth/10,-1.5,(m_areaHeight/10)-0.2);
02013         glVertex3f((m_areaWidth/10)-0.2, -1.5,(m_areaHeight/10)-0.2);
02014 
02015         glVertex3f((m_areaWidth/10)-0.2,-1.5,-m_areaHeight/10);
02016         glVertex3f(-m_areaWidth/10,-1.5,-m_areaHeight/10);
02017 
02018         glVertex3f(-m_areaWidth/10,-1.5,-m_areaHeight/10);
02019         glVertex3f(-m_areaWidth/10,-1.5,(m_areaHeight/10)-0.2);
02020 
02021         glVertex3f((m_areaWidth/10)-0.2, -1.5, -m_areaHeight/10);
02022         glVertex3f((m_areaWidth/10)-0.2, -1.5, (m_areaHeight/10)-0.2);
02023 
02024         glVertex3f(-m_areaWidth/10,-1.5,-m_areaHeight/10);
02025         FuelPoint m_gridPoint = m_gridPointList[0];
02026         ngl::Vector m_gridPos = m_gridPoint.getPosition();
02027         glVertex3f( m_gridPos.m_x, m_gridPos.m_y, m_gridPos.m_z);
02028 
02029         glVertex3f((m_areaWidth/10)-0.2,-1.5,-m_areaHeight/10);
02030 
02031         m_gridPoint = m_gridPointList[m_areaWidth-1];
02032         m_gridPos = m_gridPoint.getPosition();
02033         glVertex3f( m_gridPos.m_x, m_gridPos.m_y, m_gridPos.m_z);
02034         glVertex3f((m_areaWidth/10)-0.2, -1.5,(m_areaHeight/10)-0.2);
02035 
02036         m_gridPoint = m_gridPointList[m_gridPointList.size()-1];
02037         m_gridPos = m_gridPoint.getPosition();
02038         glVertex3f( m_gridPos.m_x, m_gridPos.m_y, m_gridPos.m_z);
02039 
02040         glVertex3f(-m_areaWidth/10,-1.5,(m_areaHeight/10)-0.2);
02041         m_gridPoint = m_gridPointList[m_gridPointList.size()-m_areaWidth];
02042         m_gridPos = m_gridPoint.getPosition();
02043         glVertex3f( m_gridPos.m_x, m_gridPos.m_y, m_gridPos.m_z);
02044 
02045     glEnd();
02046 
02051     float float_x;
02052     float float_y;
02053     float float_xb;
02054     float float_yb;
02055 
02056     if(_wireframe==false)
02057     {
02058         glBegin(GL_QUADS);
02059         for( int x=0; x<m_areaHeight-1; x++ )
02060         {
02061                 for( int y=0; y<m_areaWidth-1; y++ )
02062                 {
02063                         float_x = float(x)/m_areaWidth;
02064                         float_y = float(y)/m_areaHeight;
02065                         float_xb = float(x+1)/m_areaWidth;
02066                         float_yb = float(y+1)/m_areaHeight;
02067 
02068                         FuelPoint m_gridPoint = m_gridPointList[y+(x*m_areaWidth)];
02069                         ngl::Vector m_gridPos = m_gridPoint.getPosition();
02070 
02071                         glTexCoord2f( float_x, float_y);
02072                         glVertex3f( m_gridPos.m_x, m_gridPos.m_y, m_gridPos.m_z);
02073 
02074                         int m_lowerIndex = y+(x*m_areaWidth)+m_areaWidth;
02075                         m_gridPoint = m_gridPointList[m_lowerIndex];
02076                         m_gridPos = m_gridPoint.getPosition();
02077 
02078                         glTexCoord2f( float_x, float_yb );
02079                         glVertex3f( m_gridPos.m_x, m_gridPos.m_y, m_gridPos.m_z);
02080 
02081                         int m_lowerNextIndex = y+(x*m_areaWidth)+m_areaWidth+1;
02082                         m_gridPoint = m_gridPointList[m_lowerNextIndex];
02083                         m_gridPos = m_gridPoint.getPosition();
02084 
02085                         glTexCoord2f( float_xb, float_yb );
02086                         glVertex3f( m_gridPos.m_x, m_gridPos.m_y, m_gridPos.m_z);
02087 
02088                         int m_nextIndex = y+(x*m_areaWidth)+1;
02089                         m_gridPoint = m_gridPointList[m_nextIndex];
02090                         m_gridPos = m_gridPoint.getPosition();
02091 
02092                         glTexCoord2f( float_xb, float_y );
02093                         glVertex3f( m_gridPos.m_x, m_gridPos.m_y, m_gridPos.m_z);
02094 
02095                 }
02096         }
02097         glEnd();
02098     }
02101 }
02102 
02103 //----------------------------------------------------------------------------------------------------------------------
02104 void FireArea::drawBase()
02105 {
02106     // draw terrain base
02107     for(int a=0; a<m_areaWidth-1; ++a)
02108     {
02109         int m_index = m_gridPointList.size() - m_areaWidth;
02110 
02111         FuelPoint m_point = m_gridPointList[m_index+a];
02112         ngl::Vector m_pointPos = m_point.getPosition();
02113 
02114         ngl::Vector m_basePos = ngl::Vector(-m_areaWidth/10,-1.5,(m_areaHeight/10)-0.2);
02115 
02116         glBegin(GL_QUADS);
02117             glVertex3f(m_pointPos.m_x, m_pointPos.m_y, m_pointPos.m_z);
02118             glVertex3f(m_basePos.m_x+(a*(m_pointRadius*2)), m_basePos.m_y, m_basePos.m_z);
02119             m_point = m_gridPointList[m_index+1+a];
02120             m_pointPos = m_point.getPosition();
02121             glVertex3f(m_basePos.m_x+((a+1)*(m_pointRadius*2)), m_basePos.m_y, m_basePos.m_z);
02122             glVertex3f(m_pointPos.m_x, m_pointPos.m_y, m_pointPos.m_z);
02123         glEnd();
02124 
02125         m_index = 0;
02126         m_point = m_gridPointList[m_index+a];
02127         m_pointPos = m_point.getPosition();
02128         m_basePos = ngl::Vector(-m_areaWidth/10,-1.5,-m_areaHeight/10);
02129 
02130         glBegin(GL_QUADS);
02131             glVertex3f(m_pointPos.m_x, m_pointPos.m_y, m_pointPos.m_z);
02132             glVertex3f(m_basePos.m_x+(a*(m_pointRadius*2)), m_basePos.m_y, m_basePos.m_z);
02133             m_point = m_gridPointList[m_index+1+a];
02134             m_pointPos = m_point.getPosition();
02135             glVertex3f(m_basePos.m_x+((a+1)*(m_pointRadius*2)), m_basePos.m_y, m_basePos.m_z);
02136             glVertex3f(m_pointPos.m_x, m_pointPos.m_y, m_pointPos.m_z);
02137         glEnd();
02138     }
02139 
02140     for(int b=0; b<m_areaHeight-1; ++b)
02141     {
02142         int m_index = b*m_areaWidth;
02143 
02144         FuelPoint m_point = m_gridPointList[m_index];
02145         ngl::Vector m_pointPos = m_point.getPosition();
02146 
02147         ngl::Vector m_basePos = ngl::Vector(-m_areaWidth/10,-1.5,-m_areaHeight/10);
02148 
02149         glBegin(GL_QUADS);
02150             glVertex3f(m_pointPos.m_x, m_pointPos.m_y, m_pointPos.m_z);
02151             glVertex3f(m_basePos.m_x, m_basePos.m_y, m_basePos.m_z+(b*(m_pointRadius*2)));
02152             m_point = m_gridPointList[m_index+m_areaWidth];
02153             m_pointPos = m_point.getPosition();
02154             glVertex3f(m_basePos.m_x, m_basePos.m_y, m_basePos.m_z+((b+1)*(m_pointRadius*2)));
02155             glVertex3f(m_pointPos.m_x, m_pointPos.m_y, m_pointPos.m_z);
02156         glEnd();
02157 
02158         m_index = m_areaWidth-1 + (b*m_areaWidth);
02159         m_point = m_gridPointList[m_index];
02160         m_pointPos = m_point.getPosition();
02161         m_basePos = ngl::Vector((m_areaWidth/10)-0.2, -1.5, -m_areaHeight/10);
02162 
02163         glBegin(GL_QUADS);
02164             glVertex3f(m_pointPos.m_x, m_pointPos.m_y, m_pointPos.m_z);
02165             glVertex3f(m_basePos.m_x, m_basePos.m_y, m_basePos.m_z+(b*(m_pointRadius*2)));
02166             m_point = m_gridPointList[m_index+m_areaWidth];
02167             m_pointPos = m_point.getPosition();
02168             glVertex3f(m_basePos.m_x, m_basePos.m_y, m_basePos.m_z+((b+1)*(m_pointRadius*2)));
02169             glVertex3f(m_pointPos.m_x, m_pointPos.m_y, m_pointPos.m_z);
02170         glEnd();
02171     }
02172 
02173     // draw base
02174     glBegin(GL_QUADS);
02175 
02176         glVertex3f(-m_areaWidth/10,-1.5,(m_areaHeight/10)-0.2);
02177         glVertex3f((m_areaWidth/10)-0.2, -1.5,(m_areaHeight/10)-0.2);
02178         glVertex3f((m_areaWidth/10)-0.2,-1.5,-m_areaHeight/10);
02179         glVertex3f(-m_areaWidth/10,-1.5,-m_areaHeight/10);
02180 
02181     glEnd();
02182 }
02183 
02184 //----------------------------------------------------------------------------------------------------------------------
02185 void FireArea::timestep(
02186                        const std::string &_shaderName,
02187                        ngl::TransformStack &_transformStack
02188                        )
02189 {
02190     // draw fire path
02191     if(m_showPath==true)
02192         m_firePathOne->drawDLAPath(_shaderName, _transformStack);
02193 
02194     if(m_pauseAnimation==false)
02195     {
02196         m_firePathOne->timeUpdate(m_timeStep);
02197         ++m_timeStep;
02198     }
02199 }
02200 
02201 //----------------------------------------------------------------------------------------------------------------------
02202 void FireArea::pauseTime(
02203                         bool _pauseStatus,
02204                         bool _editFlag
02205                         )
02206 {
02207     m_pauseAnimation = _pauseStatus;
02208     m_firePathOne->pauseTheAnimation(m_pauseAnimation);
02209 
02210     if(_editFlag)
02211     {
02212         std::cout<<"----------------------------------------------------------------------------------------------------------------------"<<std::endl;
02213         m_showPath = false;
02214         m_firePathOne->resetList();
02215         m_firePathOne->resetFuelListToOriginal();
02216     }
02217 }
02218 
02219 //----------------------------------------------------------------------------------------------------------------------
02220 void FireArea::generateNewDLA()
02221 {
02222     FuelPoint m_firstOrigin = m_originList[0];
02223     ngl::Vector m_firstOriginPos = m_firstOrigin.getPosition();
02224 
02225     std::vector<FuelPoint> m_emptyList;
02226     m_currentDLAList = m_emptyList;
02227     m_currentDLALine = m_emptyList;
02228 
02229     if(m_dlaAmount<=1)
02230     {
02231         m_approxDLASize = 3000;
02232 
02233         if(m_addWind==true)
02234         {
02235             if(m_windSpeed<5)
02236                 m_approxDLASize = 2200;
02237             else if((m_windSpeed>=5)&&(m_windSpeed<=7))
02238                 m_approxDLASize = 2000;
02239             else if((m_windSpeed>7)&&(m_windSpeed<10))
02240                 m_approxDLASize = 1800;
02241             else if(m_windSpeed==10)
02242                 m_approxDLASize = 1500;
02243         }
02244 
02245         m_dlaStructureOne = new DLAStructure(m_gridPointList, m_nonflammableObjectList, m_firstOriginPos, m_areaWidth, m_areaHeight, m_pointRadius, m_approxDLASize, m_windDirection, m_windSpeed);
02246 
02247         m_currentDLAList = m_dlaStructureOne->getDLAList();
02248         m_currentDLALine = m_dlaStructureOne->getDLALine();
02249 
02250         m_firstOrigin.setEmittedHeat(m_currentDLAList.size());
02251         m_originList[0] = m_firstOrigin;
02252 
02253         m_firePathOne->updateDLAList(m_currentDLAList, m_currentDLALine);
02254         m_firePathOne->resetGrid(m_gridPointList);
02255         m_firePathOne->setFirePath();
02256         m_firePathOne->setNewOriginList(m_originList);
02257         m_firePathOne->assignNewMoisture(m_sceneMoisture);
02258         m_firePathOne->assignNewTemp(m_sceneTemperature);
02259         m_firePathOne->assignNewObjMoisture(m_approxObjMoisture);
02260     }
02261     else
02262     {
02263         if(m_dlaAmount<3)
02264             m_approxDLASize = 1500;//1300;
02265         else if(m_dlaAmount==3)
02266             m_approxDLASize = 1100;//800;
02267         else if(m_dlaAmount==4)
02268             m_approxDLASize = 900;// 600;
02269         else if(m_dlaAmount==5)
02270             m_approxDLASize = 700;//450;
02271 
02272         if(m_addWind==true)
02273             m_approxDLASize -= 200;
02274 
02275         for(unsigned int k=0; k<m_originList.size(); ++k)
02276         {
02277             FuelPoint m_originPoint = m_originList[k];
02278             ngl::Vector m_originPos = m_originPoint.getPosition();
02279 
02280             std::vector<FuelPoint> m_previousGridList;
02281 
02282             if(k>0)
02283             {
02284                 m_previousGridList = analyzeGridPoint(m_currentDLAList);
02285             }
02286 
02287             m_dlaStructureOne = new DLAStructure(m_gridPointList, m_nonflammableObjectList, m_originPos, m_areaWidth, m_areaHeight, m_pointRadius, m_previousGridList, m_originList, k, m_approxDLASize, m_windDirection, m_windSpeed);
02288 
02289             std::vector<FuelPoint> m_newDLAPointList = m_dlaStructureOne->getDLAList();
02290             std::vector<FuelPoint> m_newDLAPointLine = m_dlaStructureOne->getDLALine();
02291 
02292             for(unsigned int h=0; h<m_newDLAPointList.size(); ++h)
02293             {
02294                 FuelPoint m_newDLAPoint = m_newDLAPointList[h];
02295 
02296                 // assign the number of origin to know which origin this form belong to
02297                 ngl::Vector m_newDLAPos = m_newDLAPoint.getPosition();
02298                 m_newDLAPos.m_w = k;
02299 
02300                 m_newDLAPoint.setPosition(m_newDLAPos);
02301 
02302                 m_currentDLAList.push_back(m_newDLAPoint);
02303             }
02304 
02305             for(unsigned int g=0; g<m_newDLAPointLine.size(); ++g)
02306             {
02307                 FuelPoint m_newDLALine = m_newDLAPointLine[g];
02308 
02309                 // assign the number of origin to know which origin this form belong to
02310                 ngl::Vector m_newDLALinePos = m_newDLALine.getPosition();
02311                 m_newDLALinePos.m_w = g;
02312 
02313                 m_newDLALine.setPosition(m_newDLALinePos);
02314 
02315                 m_currentDLALine.push_back(m_newDLALine);
02316             }
02317 
02318             m_originPoint.setEmittedHeat(m_newDLAPointList.size());
02319             m_originList[k] = m_originPoint;
02320         } // end for loop
02321 
02322         m_firePathOne->updateDLAList(m_currentDLAList, m_currentDLALine);
02323         m_firePathOne->resetGrid(m_gridPointList);
02324         m_firePathOne->setFirePath();
02325         m_firePathOne->setNewOriginList(m_originList);
02326         m_firePathOne->assignNewMoisture(m_sceneMoisture);
02327         m_firePathOne->assignNewTemp(m_sceneTemperature);
02328         m_firePathOne->assignNewObjMoisture(m_approxObjMoisture);
02329     }
02330 
02331     m_pauseAnimation = false;
02332     m_showPath = true;
02333     m_timeStep = 0;
02334     m_firePathOne->pauseTheAnimation(false);
02335 }
02336 
02337 //----------------------------------------------------------------------------------------------------------------------
02338 std::vector<FuelPoint> FireArea::analyzeGridPoint(
02339                                                  std::vector<FuelPoint> m_newDLAForm
02340                                                  )
02341 {
02342     std::vector<FuelPoint> m_takenGridPointList;
02343 
02344     // ----- analyze grid point
02345     for(unsigned int y=0; y<m_newDLAForm.size(); ++y)
02346     {
02347         FuelPoint m_burningPoint = m_newDLAForm[y];
02348         ngl::Vector m_burningPointPos = m_burningPoint.getPosition();
02349 
02350         for(unsigned int z=0; z<m_gridPointList.size(); ++z)
02351         {
02352             FuelPoint m_scenePoint = m_gridPointList[z];
02353 
02354             ngl::Vector m_scenePointPos = m_scenePoint.getPosition();
02355 
02356             ngl::Vector m_distanceVector = m_scenePointPos - m_burningPointPos;
02357             float m_burningDistance = m_distanceVector.length();
02358 
02359             if(m_burningDistance<0.4)
02360             {
02361                 bool m_available = true;
02362                 for(unsigned int j=0; j<m_takenGridPointList.size(); ++j)
02363                 {
02364                     FuelPoint m_takenPoint = m_takenGridPointList[j];
02365                     ngl::Vector m_takenPos = m_takenPoint.getPosition();
02366 
02367                     if(m_scenePointPos==m_takenPos)
02368                         m_available = false;
02369                 }
02370 
02371                 if(m_available==true)
02372                     m_takenGridPointList.push_back(m_scenePoint);
02373             }
02374         } // end for grid point list
02375    } // end for loop of new dla form
02376 
02377    return m_takenGridPointList;
02378 }
02379 
02380 //----------------------------------------------------------------------------------------------------------------------
02381 void FireArea::adjustOriginAmount(
02382                                  int _newAmount
02383                                  )
02384 {
02385     m_firePathOne->resetFuelListToOriginal();
02386     m_firePathOne->assignNewObjMoisture(m_approxObjMoisture);
02387 
02388     m_dlaAmount = _newAmount;
02389     std::vector<FuelPoint> m_emptyList;
02390     m_originList = m_emptyList;
02391     m_originPosition.m_w = m_indexOfOrigin;
02392     float m_yOrigin = m_originPosition.m_y;
02393     m_originList.push_back(FuelPoint(m_originPosition, 0));
02394 
02395     FuelPoint m_firstOrg = m_originList[0];
02396     ngl::Vector m_firstSeedPos = m_firstOrg.getPosition();
02397     int m_firstIndex = m_firstSeedPos.m_w;
02398 
02399     FuelPoint m_firstSeed = m_gridPointList[m_firstIndex];
02400     m_firstSeed.setToOrigin();
02401     m_gridPointList[m_firstIndex] = m_firstSeed;
02402 
02403     // set the closest distance between origin
02404     float m_minDistance = 5.0;
02405 
02406     if((m_dlaAmount>4)&&(m_dlaAmount<=6))
02407         m_minDistance = 4.0;
02408     else if((m_dlaAmount>6)&&(m_dlaAmount<9))
02409         m_minDistance = 3.0;
02410     else if(m_dlaAmount>=9)
02411         m_minDistance = 2.0;
02412 
02413     for(int f=1; f<m_dlaAmount; ++f)
02414     {
02415         int m_randNewPoint = 0;
02416         bool m_farEnough = false;
02417 
02418         while(m_farEnough==false)
02419         {
02420             m_randNewPoint = rand()%m_gridPointList.size();
02421             FuelPoint m_pointOnGrid = m_gridPointList[m_randNewPoint];
02422 
02423             if(m_pointOnGrid.isFlammable()==true)
02424             {
02425                 ngl::Vector m_posOnGrid = m_pointOnGrid.getPosition();
02426                 int m_tooClosedCount = 0;
02427 
02428                 // check with previous origin point
02429                 for(int g=0; g<f; ++g)
02430                 {
02431                     FuelPoint m_previousOrigin = m_originList[g];
02432                     ngl::Vector m_previousOriginPos = m_previousOrigin.getPosition();
02433 
02434                     m_previousOriginPos.m_y = 0.0;
02435                     m_posOnGrid.m_y = 0.0;
02436 
02437                     ngl::Vector m_distanceBetweenOrigin = m_posOnGrid - m_previousOriginPos;
02438                     float m_distanceBetweenOriginLength = m_distanceBetweenOrigin.length();
02439 
02440                     if(m_distanceBetweenOriginLength<0)
02441                         m_distanceBetweenOriginLength *= -1;
02442 
02443                     if(m_distanceBetweenOriginLength<m_minDistance)
02444                         ++m_tooClosedCount;
02445                 }
02446 
02447                 if(m_tooClosedCount==0)
02448                     m_farEnough = true;
02449                 else
02450                     m_farEnough = false;
02451             }
02452             else
02453                 m_farEnough = false;
02454         } // end while loop
02455 
02456         // ----- assign variables to origin list
02457         FuelPoint m_newPoint = m_gridPointList[m_randNewPoint];
02458         ngl::Vector m_newOriginPosition = m_newPoint.getPosition();
02459         m_newOriginPosition.m_w = m_randNewPoint;
02460         m_newOriginPosition.m_y = m_yOrigin;
02461 
02462         m_originList.push_back(FuelPoint(m_newOriginPosition, 0));
02463 
02464         FuelPoint m_seed = m_gridPointList[m_randNewPoint];
02465         m_seed.setToOrigin();
02466         m_gridPointList[m_randNewPoint] = m_seed;
02467     }
02468 }
02469 
02470 //----------------------------------------------------------------------------------------------------------------------
02471 // update the current moving origin point to the assigned point
02472 void FireArea::changeMovingOriginIndex(
02473                                       int _currentIndex
02474                                       )
02475 {
02476     m_originIndex = _currentIndex;
02477 
02478     FuelPoint m_currentMovingOrigin = m_originList[m_originIndex];
02479     ngl::Vector m_currentMovingOriginPos = m_currentMovingOrigin.getPosition();
02480     m_indexOfOrigin = m_currentMovingOriginPos.m_w;
02481 }
02482 
02483 //----------------------------------------------------------------------------------------------------------------------
02484 void FireArea::changeIndexOfObj(
02485                                int _newSelectedIndex
02486                                )
02487 {
02488     m_objIndex = _newSelectedIndex;
02489 }
02490 
02491 //----------------------------------------------------------------------------------------------------------------------
02492 void FireArea::adjustObjSize(
02493                             int _side,
02494                             int _mode
02495                             )
02496 {
02497     if(_side==1)                    // side Length = 1
02498     {
02499         if(_mode==1)                // increase mode = 1
02500         {
02501             FuelObject m_selectedObject = m_flammableObjectList[m_objIndex];
02502             float m_radius = m_selectedObject.getRadius();
02503             float m_increaseStep = 0.15;
02504 
02505             if(m_radius<1.5)
02506             {
02507                 m_selectedObject.setRadius(m_radius+m_increaseStep);
02508                 m_flammableObjectList[m_objIndex] = m_selectedObject;
02509             }
02510         }
02511         else
02512         {
02513             FuelObject m_selectedObject = m_flammableObjectList[m_objIndex];
02514             float m_radius = m_selectedObject.getRadius();
02515             float m_decreaseStep = 0.15;
02516             if(m_radius>0.3)
02517             {
02518                 m_selectedObject.setRadius(m_radius-m_decreaseStep);
02519                 m_flammableObjectList[m_objIndex] = m_selectedObject;
02520             }
02521         } // end if mode
02522     }
02523     else
02524     {
02525         if(_mode==1)                // increase mode = 1
02526         {
02527             FuelObject m_selectedObject = m_flammableObjectList[m_objIndex];
02528             float m_fuel = m_selectedObject.getCurrentFuelValue();
02529             if(m_fuel>150)
02530                 m_fuel = 150;
02531             m_selectedObject.setFuelAmount(m_fuel+2);
02532             m_flammableObjectList[m_objIndex] = m_selectedObject;
02533 
02534         }
02535         else
02536         {
02537             FuelObject m_selectedObject = m_flammableObjectList[m_objIndex];
02538             float m_fuel = m_selectedObject.getCurrentFuelValue();
02539             if(m_fuel<60)
02540                 m_fuel = 60;
02541             m_selectedObject.setFuelAmount(m_fuel-2);
02542             m_flammableObjectList[m_objIndex] = m_selectedObject;
02543         }
02544     } // end if-else side variables
02545 }
02546 
02547 //----------------------------------------------------------------------------------------------------------------------
02548 void FireArea::showMark(
02549                        bool _showingMode
02550                        )
02551 {
02552     m_markShowing = _showingMode;
02553 }
02554 
02555 //----------------------------------------------------------------------------------------------------------------------
02556 void FireArea::showLine(
02557                        bool _showingMode
02558                        )
02559 {
02560     m_firePathOne->showFireLineOnly(_showingMode);
02561 }
02562 
02563 //----------------------------------------------------------------------------------------------------------------------
02564 void FireArea::assignWindDirection(ngl::Vector _windDir)
02565 {
02566     m_windDirection = _windDir;
02567 
02568     float m_markZ = 0.0;
02569     float m_markX = 0.0;
02570 
02571     if((m_windDirection.m_x>=0)&&(m_windDirection.m_x<180))
02572     {
02573         if((m_windDirection.m_x>=45)&&(m_windDirection.m_x<=135))
02574         {
02575             m_markX = 5.0;
02576 
02577             int m_diffZAxis = 90 - m_windDirection.m_x;
02578             m_markZ = m_diffZAxis * 0.11;
02579         }
02580         else if(m_windDirection.m_x<45)
02581         {
02582             m_markZ = 5.0;
02583             int m_diffXAxis = 45 - (45 - m_windDirection.m_x);
02584             m_markX = m_diffXAxis * 0.11;
02585         }
02586         else
02587         {
02588             m_markZ = -5.0;
02589             int m_diffXAxis = 180 - m_windDirection.m_x;
02590             m_markX = m_diffXAxis * 0.11;
02591         }
02592 
02593         ngl::Vector m_newWind = ngl::Vector(m_markX, -0.5, m_markZ);
02594         m_windDirection = m_newWind;
02595     }
02596     else
02597     {
02598         if((m_windDirection.m_z>=225)&&(m_windDirection.m_z<315))
02599         {
02600             m_markX = -5.0;
02601             int m_diffZAxis = m_windDirection.m_z - 270;
02602             m_markZ = m_diffZAxis * 0.11;
02603         }
02604         else if(m_windDirection.m_z<225)
02605         {
02606             m_markZ = -5.0;
02607             int m_diffXAxis = 180 - m_windDirection.m_x;
02608             m_markX = m_diffXAxis * 0.11;
02609         }
02610         else
02611         {
02612             m_markZ = 5.0;
02613             int m_diffXAxis = m_windDirection.m_x - 360;
02614             m_markX = m_diffXAxis * 0.11;
02615         }
02616 
02617         ngl::Vector m_newWind = ngl::Vector(m_markX, -0.5, m_markZ);
02618         m_windDirection = m_newWind;
02619     } // end if-else
02620 
02621 }
02622 
02623 //----------------------------------------------------------------------------------------------------------------------
02624 void FireArea::assignWindSpeed(int _newWindSpeed)
02625 {
02626     m_windSpeed = _newWindSpeed;
02627 }
02628 
02629 //----------------------------------------------------------------------------------------------------------------------
02630 void FireArea::assignWind(bool _mode)
02631 {
02632     m_addWind = _mode;
02633 
02634     if(m_addWind==false)
02635     {
02636         m_windDirection.m_y = 500.0;
02637     }
02638     else
02639     {
02640         m_windDirection.m_y = 0.0;
02641     }
02642 }
02643 
02644 //----------------------------------------------------------------------------------------------------------------------
02645 void FireArea::assignNewObjMoisture(double _newMoisture)
02646 {
02647     m_approxObjMoisture = (_newMoisture + 25)/100;
02648 
02649     if(m_approxObjMoisture>=0.8)
02650         m_approxObjMoisture = 0.8;
02651 
02652     m_firePathOne->assignNewObjMoisture(m_approxObjMoisture);
02653 }
 All Classes Namespaces Files Functions Variables Enumerations Enumerator