DLA-Fire-Prediction-Thesis 1.0
|
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 }