00001 #include "Application.h"
00002
00003 #include "Track.h"
00004 #include "Craft.h"
00005 #include "Visitor.h"
00006
00007
00008
00009 Application* Application::s_self = 0;
00010
00011 Application::Application()
00012 {
00013 m_frameListener = 0;
00014 m_root = 0;
00015 m_appState = STARTUP;
00016
00017
00018
00019
00020 #if OGRE_PLATFORM == OGRE_PLATFORM_APPLE
00021 m_resourcePath = ogre::macBundlePath() + "/Contents/Resources/";
00022 m_configPath = m_resourcePath;
00023 #elif OGRE_PLATFORM == OGRE_PLATFORM_IPHONE
00024 m_resourcePath = ogre::macBundlePath() + "/";
00025 m_configPath = m_resourcePath;
00026 #else
00027 m_resourcePath = "";
00028 m_configPath = m_resourcePath;
00029 #endif
00030
00031 m_craftPositionPtr = 0;
00032
00033 m_colourValue = Ogre::ColourValue(1,1,1,1);
00034 }
00035
00036 Application* Application::getSingleton()
00037 {
00038 if (s_self == 0)
00039 {
00040 s_self = new Application;
00041 }
00042 return s_self;
00043 }
00044
00045 Application::~Application()
00046 {
00047 if (m_frameListener) delete m_frameListener;
00048 if (m_root) OGRE_DELETE m_root;
00049 }
00050
00051 bool Application::run()
00052 {
00053 if (getAppState() == STARTUP && !setup())
00054 {
00055 return false;
00056 }
00057 else if (getAppState() == RUNNING)
00058 {
00059 Ogre::WindowEventUtilities::messagePump();
00060 m_root->renderOneFrame();
00061 return true;
00062 }
00063 else if (getAppState() == SHUTDOWN)
00064 {
00065 return false;
00066 }
00067 else
00068 {
00069 return false;
00070 }
00071 }
00072
00073 appState Application::getAppState() {
00074 return m_appState;
00075 }
00076
00077
00078 bool Application::setAppState(appState _val) {
00079 if (m_appState == STARTUP) {
00080 m_appState = _val;
00081 return true;
00082 }
00083
00084 if (m_appState == SHUTDOWN) {
00085 return false;
00086 }
00087
00088
00089 if (m_appState == RUNNING && (_val != STARTUP) && (_val != m_appState)) {
00090 m_appState = _val;
00091 return true;
00092 }
00093 else
00094 {
00095 return false;
00096 }
00097 }
00098
00099 gameState Application::getGameState() {
00100 return m_gameState;
00101 }
00102
00103
00104 bool Application::setGameState(gameState _val) {
00105 m_gameState = _val;
00106 m_GUI->updateGameState(_val);
00107
00108 if (_val == TRACK_EDITING)
00109 {
00110
00111 }
00112
00113 if (_val == RACING || _val == RACE_START)
00114 {
00115 getInputHandler()->forceSelectCraft();
00116 }
00117 return true;
00118 }
00119
00120 Ogre::SceneManager* Application::getOverlayManager()
00121 {
00122 return m_sceneManagerOverlay;
00123 }
00124
00125 Ogre::SceneManager* Application::getViewerManager()
00126 {
00127 return m_sceneManagerViewer;
00128 }
00129
00130
00131 bool Application::setup()
00132 {
00133
00134 Ogre::String pluginsPath;
00135 pluginsPath = m_resourcePath + "plugins.cfg";
00136
00137 m_root = OGRE_NEW Ogre::Root(pluginsPath, m_configPath + "ogre.cfg", m_resourcePath + "Ogre.log");
00138
00139 setupResources();
00140
00141 if (!configure()) return false;
00142
00143 chooseSceneManager();
00144 createCameraManager();
00145 createViewports();
00146
00147
00148 Ogre::TextureManager::getSingleton().setDefaultNumMipmaps(5);
00149
00150
00151 createResourceListener();
00152
00153 loadResources();
00154
00155 createObjectManager();
00156
00157 createPhysicsManager();
00158
00159
00160 m_GUI = new GUI();
00161
00162
00163
00164 createInputHandler();
00165
00166 createFrameListener();
00167
00168
00169 createScene();
00170
00171 setAppState(RUNNING);
00172 setGameState(MENU_IDLE);
00173
00174
00175 return true;
00176 }
00177
00178 bool Application::configure()
00179 {
00180 if(m_root->restoreConfig())
00181 {
00182
00183
00184 m_window = m_root->initialise(true);
00185 return true;
00186 }
00187 else
00188 {
00189 return false;
00190 }
00191 }
00192
00193 void Application::chooseSceneManager()
00194 {
00195
00196 m_sceneManagerViewer = m_root->createSceneManager(Ogre::ST_GENERIC, "ViewportSM");
00197 m_sceneManagerOverlay = m_root->createSceneManager(Ogre::ST_GENERIC, "OverlaySM");
00198 }
00199
00200 void Application::createCameraManager()
00201 {
00202 m_cameraManager = new CameraManager();
00203 }
00204
00205 void Application::createObjectManager()
00206 {
00207 m_objectManager = new ObjectManager();
00208 }
00209
00210 void Application::createPhysicsManager()
00211 {
00212 m_physicsManager = new PhysicsManager();
00213 }
00214
00215 void Application::createFrameListener()
00216 {
00217 m_frameListener= new FrameListener(m_window);
00218 m_root->addFrameListener(m_frameListener);
00219 }
00220
00221 void Application::destroyScene()
00222 {
00223
00224 }
00225
00226 void Application::createViewports()
00227 {
00228
00229
00230 Ogre::Camera* _cam = m_cameraManager->getCamera("ViewportCam")->getCamera();
00231 Ogre::Viewport* vp = m_window->addViewport(_cam,0,0,0,1.0,1.0);
00232 vp->setBackgroundColour(Ogre::ColourValue(0.4f,0.4f,0.4f));
00233 getViewerManager()->setFog(Ogre::FOG_LINEAR, Ogre::ColourValue(0.4f,0.4f,0.4f), 0.0, 100, 700);
00234
00235
00236 _cam->setAspectRatio(Ogre::Real(vp->getActualWidth()) / Ogre::Real(vp->getActualHeight()));
00237
00241 _cam = m_cameraManager->getCamera("OverlayCam")->getCamera();
00242 Ogre::Viewport* vp2 = m_window->addViewport(_cam,1,0,0,1.0,1.0);
00245 vp2->setClearEveryFrame(true, Ogre::FBT_DEPTH);
00246 _cam->setAspectRatio(Ogre::Real(vp->getActualWidth()) / Ogre::Real(vp->getActualHeight()));
00247
00248 }
00249
00250 void Application::setupResources()
00251 {
00252
00253 Ogre::ConfigFile cf;
00254 cf.load(m_resourcePath + "resources.cfg");
00255
00256
00257 Ogre::ConfigFile::SectionIterator seci = cf.getSectionIterator();
00258
00259 Ogre::String secName, typeName, archName;
00260 while (seci.hasMoreElements())
00261 {
00262 secName = seci.peekNextKey();
00263 Ogre::ConfigFile::SettingsMultiMap *settings = seci.getNext();
00264 Ogre::ConfigFile::SettingsMultiMap::iterator i;
00265 for (i = settings->begin(); i != settings->end(); ++i)
00266 {
00267 typeName = i->first;
00268 archName = i->second;
00269 #if OGRE_PLATFORM == OGRE_PLATFORM_APPLE || OGRE_PLATFORM == OGRE_PLATFORM_IPHONE
00270
00271
00272
00273 if (!StringUtil::startsWith(archName, "/", false))
00274 archName = String(macBundlePath() + "/" + archName);
00275 #endif
00276 Ogre::ResourceGroupManager::getSingleton().addResourceLocation(archName, typeName, secName);
00277 }
00278 }
00279 }
00280
00281
00282 void Application::createResourceListener()
00283 {
00284
00285 }
00286
00288 void Application::loadResources()
00289 {
00290
00291 Ogre::ResourceGroupManager::getSingleton().initialiseAllResourceGroups();
00292 }
00293
00294 void Application::createInputHandler()
00295 {
00296 m_inputHandler= new InputHandler(m_window);
00297 }
00298
00299 void Application::createScene()
00300 {
00301 m_sceneManagerViewer->setAmbientLight(Ogre::ColourValue(0.75, 0.75, 0.75));
00302
00303 m_light = m_sceneManagerViewer->createLight("generalLight");
00304 m_light->setType(Ogre::Light::LT_POINT);
00305 m_light->setPosition(0, 500, 0);
00306 m_light->setDiffuseColour(0.8, 0.8, 0.8);
00307 m_light->setSpecularColour(1, 1, 1);
00308
00309 setGameState(MENU_IDLE);
00310
00311 GameObject* gameObject = new GameObject();
00312
00313 Ogre::SceneNode* sceneNode = getViewerManager()->getRootSceneNode()->createChildSceneNode("finishObjNode");
00314
00315 gameObject->setSceneNode(sceneNode);
00316
00317 Ogre::Entity* sceneryEntity = getViewerManager()->createEntity("finishObjEntity","finishLine.mesh");
00318
00319
00320 gameObject->setEntity(sceneryEntity);
00321 sceneryEntity->setMaterialName("finishLine");
00322 Visitor* visitor = new Visitor();
00323 sceneryEntity->visitRenderables(visitor);
00324 delete visitor;
00325 gameObject->getSceneNode()->setDirection(Ogre::Vector3::UNIT_X);
00326 gameObject->setFriction(50.0f);
00327 gameObject->setName("createdfinishObjGameObject");
00328 gameObject->makePhysicalConcave();
00329
00330
00331 Craft* craft = new Craft();
00332 Application::getSingleton()->getObjectManager()->addObject(craft);
00333 Application::getSingleton()->getObjectManager()->setCraftPtr(dynamic_cast<SelectableObject*>(craft));
00334
00335
00336
00337 }
00338
00339 Ogre::Real Application::getTimeSinceLastFrame() const
00340 {
00341 return m_frameListener->getTimeSinceLastFrame();
00342 }
00343
00344 InputHandler* Application::getInputHandler()
00345 {
00346 return m_inputHandler;
00347 }
00348
00349 CameraManager* Application::getCameraManager()
00350 {
00351 return m_cameraManager;
00352 }
00353
00354 ObjectManager* Application::getObjectManager()
00355 {
00356 return m_objectManager;
00357 }
00358
00359 PhysicsManager* Application::getPhysicsManager()
00360 {
00361 return m_physicsManager;
00362 }
00363
00364 GUI* Application::getGUI()
00365 {
00366 return m_GUI;
00367 }
00368
00369 const Ogre::Vector3* Application::getCraftPositionPtr()
00370 {
00371 return m_craftPositionPtr;
00372 }
00373
00374 void Application::setCraftPositionPtr(const Ogre::Vector3* _val)
00375 {
00376 m_craftPositionPtr = _val;
00377 }
00378
00379 Ogre::ColourValue Application::getColourValue()
00380 {
00381 return m_colourValue;
00382 }
00383
00384 void Application::setColourValue(Ogre::ColourValue& _val)
00385 {
00386 m_colourValue = _val;
00387 }