00001 #include "GUI.h"
00002 #include "Application.h"
00003 #include "Craft.h"
00004
00005 GUI::GUI()
00006 {
00007
00008 m_mainLogo = 0;
00009 m_start = 0;
00010 m_speedo = 0;
00011 m_speedoContainer = 0;
00012 m_speedoText = 0;
00013
00014 m_numLapsLeftArrow = 0;
00015 m_numLaps = 0;
00016 m_numLapsText = 0;
00017 m_numLapsRightArrow = 0;
00018
00019 m_numNodesLeftArrow = 0;
00020 m_numNodes = 0;
00021 m_numNodesText = 0;
00022 m_numNodesRightArrow = 0;
00023
00024
00025 m_numLapsOverlayContainer= 0;
00026 m_numLapsOverlay= 0;
00027 m_numLapsOverlayText= 0;
00028
00029 m_numNodesOverlayContainer= 0;
00030 m_numNodesOverlay= 0;
00031 m_numNodesOverlayText= 0;
00032
00033 m_fakeTrack = 0;
00034
00035 m_timerContainer= 0;
00036 m_timer= 0;
00037 m_timerText= 0;
00038
00039 m_lapContainer= 0;
00040 m_lap= 0;
00041 m_lapText= 0;
00042
00043 m_cancel = 0;
00044 m_edit = 0;
00045 m_build = 0;
00046
00047 m_numLapsVal = 3;
00048 m_numNodesVal = 5;
00049
00050 m_mainLogo = new GameObject();
00051
00052 createNonSelectable("VectracerLogo","mainLogo",m_mainLogo,1024,512,0.01);
00053 m_mainLogo->getSceneNode()->setPosition(Ogre::Vector3::ZERO);
00054
00055 m_numLapsText = new GameObject();
00056 createNonSelectable("NumLaps","laps",m_numLapsText,512,256,0.01);
00057
00058 m_numNodesText = new GameObject();
00059 createNonSelectable("NumNodes","nodes",m_numNodesText,512,256,0.01);
00060
00061 m_numLapsLeftArrow = new SelectableObject();
00062 createSelectable("lapsLeftArrow","leftarrow",m_numLapsLeftArrow,512,256,0.01,Ogre::Vector3(0.01f,0.01f,0.01f));
00063
00064 m_numLapsRightArrow = new SelectableObject();
00065 createSelectable("lapsRightArrow","rightarrow",m_numLapsRightArrow,512,256,0.01,Ogre::Vector3(0.01f,0.01f,0.01f));
00066
00067 m_numNodesLeftArrow = new SelectableObject();
00068 createSelectable("nodesLeftArrow","leftarrow",m_numNodesLeftArrow,512,256,0.01,Ogre::Vector3(0.01f,0.01f,0.01f));
00069
00070 m_numNodesRightArrow = new SelectableObject();
00071 createSelectable("nodesRightArrow","rightarrow",m_numNodesRightArrow,512,256,0.01,Ogre::Vector3(0.01f,0.01f,0.01f));
00072
00073 m_cancel = new SelectableObject();
00074 createSelectable("cancel","cancel",m_cancel,512,256,0.01,Ogre::Vector3(0.05f,0.01f,0.01f));
00075
00076 m_edit = new SelectableObject();
00077 createSelectable("edit","edit",m_edit,512,256,0.01,Ogre::Vector3(0.05f,0.01f,0.01f));
00078
00079 m_build = new SelectableObject();
00080 createSelectable("build","build",m_build,512,256,0.01,Ogre::Vector3(0.05f,0.01f,0.01f));
00081
00082 m_start = new SelectableObject();
00083 createSelectable("start","start",m_start,512,256,0.01,Ogre::Vector3(0.05f,0.01f,0.01f));
00084 m_start->getSceneNode()->setPosition(Ogre::Vector3(0,-5,0));
00085
00086 m_finish = new GameObject();
00087 createNonSelectable("finish","finish",m_finish,512,256,0.01);
00088 if (m_numLapsOverlay == 0)
00089 {
00090
00091 m_numLapsOverlay = Ogre::OverlayManager::getSingleton().create("numLapsTextOverlay");
00092
00093 m_numLapsOverlayText = Ogre::OverlayManager::getSingleton().createOverlayElement("TextArea", "numLapsText");
00094 m_numLapsOverlayText->setDimensions(1.0,1.0);
00095 m_numLapsOverlayText->setMetricsMode(Ogre::GMM_PIXELS);
00096 m_numLapsOverlayText->setPosition(0,0);
00097
00098 m_numLapsOverlayText->setParameter("font_name", "OCR");
00099 m_numLapsOverlayText->setParameter("char_height", "64");
00100 m_numLapsOverlayText->setParameter("horz_align", "left");
00101 m_numLapsOverlayText->setColour(Ogre::ColourValue(0.0, 0.0, 0.0));
00102
00103 m_numLapsOverlayContainer = static_cast<Ogre::OverlayContainer*>(Ogre::OverlayManager::getSingleton().createOverlayElement("Panel", "numLapsTextOverlayContainer"));
00104 m_numLapsOverlayContainer->addChild(m_numLapsOverlayText);
00105
00106 m_numLapsOverlayContainer->setPosition(0.3,0.25);
00107 m_numLapsOverlayContainer->setDimensions(0.1, 0.1f);
00108 m_numLapsOverlay->add2D(m_numLapsOverlayContainer);
00109
00110 }
00111
00112 if (m_speedo == 0)
00113 {
00114
00115 m_speedo = Ogre::OverlayManager::getSingleton().create("speedoTextOverlay");
00116
00117 m_speedoText = Ogre::OverlayManager::getSingleton().createOverlayElement("TextArea", "speedoText");
00118 m_speedoText->setDimensions(1.0,1.0);
00119 m_speedoText->setMetricsMode(Ogre::GMM_PIXELS);
00120 m_speedoText->setPosition(0,0);
00121
00122 m_speedoText->setParameter("font_name", "OCR");
00123 m_speedoText->setParameter("char_height", "64");
00124 m_speedoText->setParameter("horz_align", "left");
00125 m_speedoText->setColour(Ogre::ColourValue(0.0, 0.0, 0.0));
00126
00127 m_speedoContainer = static_cast<Ogre::OverlayContainer*>(Ogre::OverlayManager::getSingleton().createOverlayElement("Panel", "speedoTextOverlayContainer"));
00128 m_speedoContainer->addChild(m_speedoText);
00129
00130 m_speedoContainer->setPosition(0.67,0.92);
00131 m_speedoContainer->setDimensions(0.1, 0.1f);
00132 m_speedo->add2D(m_speedoContainer);
00133
00134 }
00135
00136 if (m_numNodesOverlay == 0)
00137 {
00138
00139 m_numNodesOverlay = Ogre::OverlayManager::getSingleton().create("numNodesTextOverlay");
00140
00141 m_numNodesOverlayText = Ogre::OverlayManager::getSingleton().createOverlayElement("TextArea", "numNodesText");
00142 m_numNodesOverlayText->setDimensions(1.0,1.0);
00143 m_numNodesOverlayText->setMetricsMode(Ogre::GMM_PIXELS);
00144 m_numNodesOverlayText->setPosition(0,0);
00145
00146 m_numNodesOverlayText->setParameter("font_name", "OCR");
00147 m_numNodesOverlayText->setParameter("char_height", "64");
00148 m_numNodesOverlayText->setParameter("horz_align", "left");
00149 m_numNodesOverlayText->setColour(Ogre::ColourValue(0.0, 0.0, 0.0));
00150
00151 m_numNodesOverlayContainer = static_cast<Ogre::OverlayContainer*>(Ogre::OverlayManager::getSingleton().createOverlayElement("Panel", "numNodesTextOverlayContainer"));
00152 m_numNodesOverlayContainer->addChild(m_numNodesOverlayText);
00153
00154 m_numNodesOverlayContainer->setPosition(0.67,0.25);
00155 m_numNodesOverlayContainer->setDimensions(0.1, 0.1f);
00156 m_numNodesOverlay->add2D(m_numNodesOverlayContainer);
00157
00158 }
00159
00160 if (m_fakeTrack == 0)
00161 {
00162 m_fakeTrack = new Track(Application::getSingleton()->getOverlayManager());
00163 Ogre::SceneNode* node = Application::getSingleton()->getOverlayManager()->getRootSceneNode()->createChildSceneNode("FakeTrackNode");
00164 m_fakeTrack->setSceneNode(node);
00165 m_fakeTrack->getSceneNode()->setPosition(Ogre::Vector3(0,3,0));
00166 m_fakeTrack->regenerateFakeTrack(m_numNodesVal);
00167 m_fakeTrack->getSceneNode()->setVisible(false);
00168 }
00169
00170 m_numLapsText->getSceneNode()->setPosition(Ogre::Vector3(-6,7,0));
00171 m_numLapsText->getSceneNode()->setVisible(false);
00172 m_numNodesText->getSceneNode()->setPosition(Ogre::Vector3(6,7,0));
00173 m_numNodesText->getSceneNode()->setVisible(false);
00174 m_numLapsLeftArrow->getSceneNode()->setPosition(Ogre::Vector3(-8,6,0));
00175 m_numLapsLeftArrow->getSceneNode()->setVisible(false);
00176 m_numLapsRightArrow->getSceneNode()->setPosition(Ogre::Vector3(-4,6,0));
00177 m_numLapsRightArrow->getSceneNode()->setVisible(false);
00178 m_numNodesLeftArrow->getSceneNode()->setPosition(Ogre::Vector3(4,6,0));
00179 m_numNodesLeftArrow->getSceneNode()->setVisible(false);
00180 m_numNodesRightArrow->getSceneNode()->setPosition(Ogre::Vector3(8,6,0));
00181 m_numNodesRightArrow->getSceneNode()->setVisible(false);
00182
00183 m_cancel->getSceneNode()->setPosition(Ogre::Vector3(-6,-9,0));
00184 m_cancel->getSceneNode()->setVisible(false);
00185 m_build->getSceneNode()->setPosition(Ogre::Vector3(6,-9,0));
00186 m_build->getSceneNode()->setVisible(false);
00187 }
00188
00189 GUI::~GUI()
00190 {
00191
00192 }
00193
00194 void GUI::createNonSelectable(Ogre::String _name, Ogre::String _materialName, GameObject* _object, Ogre::Real _width, Ogre::Real _height, Ogre::Real _scaleFactor)
00195 {
00196
00197 Ogre::SceneNode* node = Application::getSingleton()->getOverlayManager()->getRootSceneNode()->createChildSceneNode(_name + "Node");
00198 _object->setSceneNode(node);
00199 _object->setName(_name + "GameObject");
00200
00201 Ogre::BillboardSet* billboardSet = Application::getSingleton()->getOverlayManager()->createBillboardSet(_name + "Billboard");
00202 billboardSet->setMaterialName(_materialName);
00203
00204 billboardSet->setDefaultWidth(_width * _scaleFactor);
00205 billboardSet->setDefaultHeight(_height * _scaleFactor);
00206 billboardSet->createBillboard(Ogre::Vector3::ZERO,Ogre::ColourValue::White);
00207
00208 _object->setBillboardSet(billboardSet);
00209 node->setPosition(Ogre::Vector3::UNIT_X * 500);
00210 }
00211
00212 void GUI::createSelectable(Ogre::String _name, Ogre::String _materialName, SelectableObject* _object, Ogre::Real _width, Ogre::Real _height, Ogre::Real _scaleFactor, Ogre::Vector3 _selectorScale)
00213 {
00214
00215 Ogre::SceneNode* node = Application::getSingleton()->getOverlayManager()->getRootSceneNode()->createChildSceneNode(_name + "Node");
00216 _object->setSceneNode(node);
00217 _object->setName(_name + "GameObject");
00218
00219 Ogre::BillboardSet* billboardSet = Application::getSingleton()->getOverlayManager()->createBillboardSet(_name + "Billboard");
00220 billboardSet->setMaterialName(_materialName);
00221
00222 billboardSet->setDefaultWidth(_width * _scaleFactor);
00223 billboardSet->setDefaultHeight(_height * _scaleFactor);
00224 billboardSet->createBillboard(Ogre::Vector3::ZERO,Ogre::ColourValue::White);
00225
00226 _object->setBillboardSet(billboardSet);
00227 node->setPosition(Ogre::Vector3::UNIT_X * 500);
00228
00229
00230
00231 Ogre::Entity* selector = Application::getSingleton()->getOverlayManager()->createEntity(_name + "Selector", Application::getSingleton()->getOverlayManager()->PT_CUBE);
00232 selector->setMaterialName("blank");
00233
00234 Ogre::SceneNode* childNode = node->createChildSceneNode(_name + "ChildNode");
00235
00236 childNode->attachObject(selector);
00237 selector->setVisible(true);
00238
00239 selector->setUserAny(Ogre::Any(_object));
00240
00241 childNode->showBoundingBox(false);
00242 childNode->setScale(_selectorScale);
00243 }
00244
00245 void GUI::updateKPH(int _val)
00246 {
00247
00248 Ogre::String speed = Ogre::StringConverter::toString(_val);
00249
00250 m_speedoText->setCaption(speed + " km/h");
00251
00252 }
00253
00254 void GUI::updateGameState(gameState _val)
00255 {
00256 if (_val == MENU_IDLE)
00257 {
00258
00259 Ogre::Real width = 1024;
00260 Ogre::Real height = 512;
00261 Ogre::Real scaleFactor = 0.025;
00262 m_mainLogo->getBillboardSet()->setDefaultWidth(width * scaleFactor);
00263 m_mainLogo->getBillboardSet()->setDefaultHeight(height * scaleFactor);
00264 m_mainLogo->getSceneNode()->setPosition(Ogre::Vector3(0,6,0));
00265 m_start->getSceneNode()->setPosition(Ogre::Vector3(0,-5,0));
00266 m_start->getSceneNode()->setVisible(true);
00267 m_finish->getSceneNode()->setPosition(Ogre::Vector3(0,-5,0));
00268 m_finish->getSceneNode()->setVisible(false);
00269 m_numLapsOverlay->hide();
00270
00271 m_numNodesOverlay->hide();
00272
00273 m_numLapsText->getSceneNode()->setVisible(false);
00274 m_numNodesText->getSceneNode()->setVisible(false);
00275 m_numLapsLeftArrow->getSceneNode()->setVisible(false);
00276 m_numLapsRightArrow->getSceneNode()->setVisible(false);
00277 m_numNodesLeftArrow->getSceneNode()->setVisible(false);
00278 m_numNodesRightArrow->getSceneNode()->setVisible(false);
00279
00280 m_cancel->getSceneNode()->setVisible(false);
00281 m_build->getSceneNode()->setVisible(false);
00282 m_fakeTrack->getSceneNode()->setVisible(false);
00283 }
00284 else
00285 {
00286 Ogre::Real width = 1024;
00287 Ogre::Real height = 512;
00288 Ogre::Real scaleFactor = 0.01;
00289 m_mainLogo->getBillboardSet()->setDefaultWidth(width * scaleFactor);
00290 m_mainLogo->getBillboardSet()->setDefaultHeight(height * scaleFactor);
00291 m_mainLogo->getSceneNode()->setPosition(Ogre::Vector3(0,10,0));
00292 m_start->getSceneNode()->setVisible(false);
00293 }
00294
00295 if (_val == TRACK_EDITING)
00296 {
00297
00298
00299 m_numLapsOverlay->show();
00300 m_numLapsOverlayText->setCaption(Ogre::StringConverter::toString(m_numLapsVal));
00301
00302 m_numNodesOverlay->show();
00303 m_numNodesOverlayText->setCaption(Ogre::StringConverter::toString(m_numNodesVal));
00304
00305 m_fakeTrack->getSceneNode()->setVisible(true);
00306 m_build->getSceneNode()->setVisible(true);
00307 m_cancel->getSceneNode()->setVisible(true);
00308 m_numLapsLeftArrow->getSceneNode()->setVisible(true);
00309 m_numLapsRightArrow->getSceneNode()->setVisible(true);
00310 m_numNodesLeftArrow->getSceneNode()->setVisible(true);
00311 m_numNodesRightArrow->getSceneNode()->setVisible(true);
00312 m_numLapsText->getSceneNode()->setVisible(true);
00313 m_numNodesText->getSceneNode()->setVisible(true);
00314 }
00315
00316 if (_val == RACE_START)
00317 {
00318
00319
00320 m_numLapsOverlay->hide();
00321 m_numNodesOverlay->hide();
00322
00323 m_fakeTrack->getSceneNode()->setVisible(false);
00324 m_build->getSceneNode()->setVisible(false);
00325 m_cancel->getSceneNode()->setVisible(false);
00326 m_numLapsLeftArrow->getSceneNode()->setVisible(false);
00327 m_numLapsRightArrow->getSceneNode()->setVisible(false);
00328 m_numNodesLeftArrow->getSceneNode()->setVisible(false);
00329 m_numNodesRightArrow->getSceneNode()->setVisible(false);
00330 m_numLapsText->getSceneNode()->setVisible(false);
00331 m_numNodesText->getSceneNode()->setVisible(false);
00332
00333 m_speedo->show();
00334 }
00335
00336 if (_val == RACE_FINISH)
00337 {
00338 m_finish->getSceneNode()->setVisible(true);
00339 }
00340 }
00341
00342
00343 bool GUI::handleClick(SelectableObject* _val)
00344 {
00345 if (_val == m_start) return handleStartClick();
00346 if (_val == m_build) return handleBuildClick();
00347 if (_val == m_cancel) return handleCancelClick();
00348 if (_val == m_numLapsRightArrow) return handleLapsRightClick();
00349 if (_val == m_numLapsLeftArrow) return handleLapsLeftClick();
00350 if (_val == m_numNodesRightArrow) return handleNodesRightClick();
00351 if (_val == m_numNodesLeftArrow) return handleNodesLeftClick();
00352
00353 return false;
00354 }
00355
00356 bool GUI::handleStartClick()
00357 {
00358 if (Application::getSingleton()->getGameState() == MENU_IDLE)
00359 {
00360 Application::getSingleton()->setGameState(TRACK_EDITING);
00361 return true;
00362 }
00363 return false;
00364 }
00365
00367 void GUI::updateLapCount(int _current, int _remaining)
00368 {
00369
00370 Ogre::String current = Ogre::StringConverter::toString(_current);
00371 Ogre::String total = Ogre::StringConverter::toString(_remaining);
00372
00373 if (m_lap == 0)
00374 {
00375
00376 m_lap = Ogre::OverlayManager::getSingleton().create("lapTextOverlay");
00377
00378 m_lapText = Ogre::OverlayManager::getSingleton().createOverlayElement("TextArea", "lapText");
00379 m_lapText->setDimensions(1.0,1.0);
00380 m_lapText->setMetricsMode(Ogre::GMM_PIXELS);
00381 m_lapText->setPosition(0,0);
00382
00383 m_lapText->setParameter("font_name", "OCR");
00384 m_lapText->setParameter("char_height", "64");
00385 m_lapText->setParameter("horz_align", "left");
00386 m_lapText->setColour(Ogre::ColourValue(0.0, 0.0, 0.0));
00387
00388 m_lapContainer = static_cast<Ogre::OverlayContainer*>(Ogre::OverlayManager::getSingleton().createOverlayElement("Panel", "lapTextOverlayContainer"));
00389 m_lapContainer->addChild(m_lapText);
00390
00391 m_lapContainer->setPosition(0.67,0.02);
00392 m_lapContainer->setDimensions(0.1, 0.1f);
00393 m_lap->add2D(m_lapContainer);
00394 m_lap->show();
00395
00396 }
00397
00398 m_lapText->setCaption("Lap: " + current + "/" + total);
00399 }
00400
00402 void GUI::updateTimer(Ogre::Real _best, Ogre::Real _current, Ogre::Real _overall)
00403 {
00404
00405 Ogre::String best = Ogre::StringConverter::toString(_best);
00406 Ogre::String current = Ogre::StringConverter::toString(_current);
00407 Ogre::String overall = Ogre::StringConverter::toString(_overall);
00408
00409
00410
00411 if (m_timer == 0)
00412 {
00413
00414 m_timer = Ogre::OverlayManager::getSingleton().create("timerTextOverlay");
00415
00416 m_timerText = Ogre::OverlayManager::getSingleton().createOverlayElement("TextArea", "timerText");
00417 m_timerText->setDimensions(1.0,1.0);
00418 m_timerText->setMetricsMode(Ogre::GMM_PIXELS);
00419 m_timerText->setPosition(0,0);
00420
00421 m_timerText->setParameter("font_name", "OCR");
00422 m_timerText->setParameter("char_height", "32");
00423 m_timerText->setParameter("horz_align", "left");
00424 m_timerText->setColour(Ogre::ColourValue(0.0, 0.0, 0.0));
00425
00426 m_timerContainer = static_cast<Ogre::OverlayContainer*>(Ogre::OverlayManager::getSingleton().createOverlayElement("Panel", "timerTextOverlayContainer"));
00427 m_timerContainer->addChild(m_timerText);
00428
00429 m_timerContainer->setPosition(0.67,0.22);
00430 m_timerContainer->setDimensions(0.1, 0.1f);
00431 m_timer->add2D(m_timerContainer);
00432 m_timer->show();
00433
00434 }
00435
00436 m_timerText->setCaption("Current: " + current + "\nBest: " + best + "\nOverall: " + overall);
00437 }
00438
00440 bool GUI::handleCancelClick()
00441 {
00442 Application::getSingleton()->setGameState(MENU_IDLE);
00443 return true;
00444 }
00445
00446 bool GUI::handleLapsLeftClick()
00447 {
00448 if (m_numLapsVal > 1)
00449 {
00450 m_numLapsVal--;
00451 }
00452 m_numLapsOverlayText->setCaption(Ogre::StringConverter::toString(m_numLapsVal));
00453 return false;
00454 }
00455
00456 bool GUI::handleLapsRightClick()
00457 {
00458 if (m_numLapsVal < 9)
00459 {
00460 m_numLapsVal++;
00461 }
00462 m_numLapsOverlayText->setCaption(Ogre::StringConverter::toString(m_numLapsVal));
00463 return false;
00464 }
00465
00466 bool GUI::handleNodesLeftClick()
00467 {
00468 if (m_numNodesVal > 1)
00469 {
00470 m_numNodesVal--;
00471 }
00472 m_numNodesOverlayText->setCaption(Ogre::StringConverter::toString(m_numNodesVal));
00473 m_fakeTrack->regenerateFakeTrack(m_numNodesVal);
00474
00475 return false;
00476 }
00477
00478 bool GUI::handleNodesRightClick()
00479 {
00480 if (m_numNodesVal < 9)
00481 {
00482 m_numNodesVal++;
00483 }
00484 m_numNodesOverlayText->setCaption(Ogre::StringConverter::toString(m_numNodesVal));
00485 m_fakeTrack->regenerateFakeTrack(m_numNodesVal);
00486
00487 return false;
00488 }
00489
00490 bool GUI::handleBuildClick()
00491 {
00492
00493
00494 Ogre::Vector3 startPos = Ogre::Vector3::ZERO;
00495
00496
00497 Application::getSingleton()->getObjectManager()->getTrack()->createFromFakeTrack(startPos,m_fakeTrack);
00498
00499 Application::getSingleton()->setGameState(RACE_START);
00500 Application::getSingleton()->getObjectManager()->getTrack()->setTotalLaps(m_numLapsVal);
00501 Application::getSingleton()->getObjectManager()->getTrack()->startRace();
00502
00503
00504
00505
00506
00507 return false;
00508 }
00509