O3dSchema.cpp

Go to the documentation of this file.
00001 /*
00002 SagaEngine library
00003 Copyright (c) 2002-2006 Skalden Studio AS
00004 
00005 This software is provided 'as-is', without any express or implied 
00006 warranty. In no event will the authors be held liable for any 
00007 damages arising from the use of this software.
00008 
00009 Permission is granted to distribute the library under the terms of the 
00010 Q Public License version 1.0. Be sure to read and understand the license
00011 before using the library. It should be included here, or you may read it
00012 at http://www.trolltech.com/products/qt/licenses/licensing/qpl
00013 
00014 The original version of this library can be located at:
00015 http://www.sagaengine.com/
00016 
00017 Rune Myrland
00018 rune@skalden.com
00019 */
00020 
00021 
00022 #include "O3dPre.hpp"
00023 #include "O3dSchema.hpp"
00024 #include "o3d/system/O3dClock.hpp"
00025 #include "o3d/RenderEngine.hpp"
00026 #include "o3d/area/O3dManager.hpp"
00027 #include "o3d/event/RenderEventListeners.hpp"
00028 #include "o3d/thing/ThingMOManager.hpp"
00029 #include "o3d/widget/SpeechBubble.hpp"
00030 #include "o3d/io/all.hpp"
00031 #include "o3d/input/InputManager.hpp"
00032 #include "o3d/input/Console.hpp"
00033 #include "o3d/area/O3dAreaComponentFactory.hpp"
00034 #include "o3d/area/O3dAreaComponent.hpp"
00035 #include "o3d/input/Console.hpp"
00036 #include "io/schema/IoSchema.hpp"
00037 #include "sim/InitListener.hpp"
00038 #include "sim/InitListeners.hpp"
00039 #include "sim/SimEngine.hpp"
00040 #include "sim/SimListeners.hpp"
00041 #include "util/task/TaskList.hpp"
00042 #include "io/stream/FileManager.hpp"
00043 #include "sim/area/AreaManager.hpp"
00044 #include "sim/area/Area.hpp"
00045 #include "sim/zone/ZoneAreaComponent.hpp"
00046 #include "sim/pos/PosComponent.hpp"
00047 #include "sim/pos/Pos.hpp"
00048 #include <OgreRoot.h>
00049 #include <OgreOverlayManager.h>
00050 #include <OgreRenderWindow.h>
00051 
00052 using namespace Ogre;
00053 using namespace se_client;
00054 using namespace se_core;
00055 
00056 namespace se_ogre {
00057     namespace O3dSchema {
00058         ThingMOManager thingMOManager;
00059 
00060         RaySceneQuery* raySceneQuery = 0;
00061         se_core::TaskList taskList;
00062 
00063         Ogre::Root* root = 0;
00064         Ogre::SceneManager* sceneManager = 0;
00065         O3dManager* worldManager = 0;
00066         Ogre::Root* ogreRoot = 0;
00067         Ogre::Camera* playerCamera = 0;
00068         Ogre::RenderWindow* window = 0;
00069 
00070         SpeechBubble* speechBubble = 0;
00071         RenderEngine* renderEngine = 0;
00072 
00073         InputManager& inputManager() {
00074             static InputManager im;
00075             return im;
00076         }
00077         Console* console = 0;
00078 
00079         RenderEventListeners& renderEventListeners() {
00080             static RenderEventListeners rel;
00081             return rel;
00082         }
00083 
00084         float gameClock = 0;
00085         struct _SeOgreExport AutoInit : public se_core::InitListener {
00086             AutoInit() {
00087                 // Auto create and register instance of this parsers
00088                 static O3dThingParser o3dThingPM(se_core::IoSchema::parser());
00089                 static O3dConfigParser o3dConfigPM(se_core::IoSchema::parser());
00090                 static O3dAreaParser o3dAreaPM(se_core::IoSchema::parser());
00091                 static O3dAreaComponentFactory o3dAreaCF;
00092 
00093                 SimSchema::initListeners().addListener(*this);
00094                 LogDetail("Registered Ogre add-on");
00095             }
00096 
00097             ~AutoInit() {
00098                 SimSchema::initListeners().removeListener(*this);
00099                 LogDetail("Cleaned up Ogre add-on");
00100             }
00101 
00102             bool initEngineEvent() {
00103                 //
00104                 SimSchema::realClock = new O3dClock();
00105 
00106                 // Create RenderEngine object
00107                 O3dSchema::renderEngine = new RenderEngine();
00108 
00109                 // Setup scene
00110                 if(!O3dSchema::renderEngine->setup()) {
00111                     LogWarning("RenderEngine setup failed");
00112                     // Failure
00113                     delete O3dSchema::renderEngine;
00114                     delete SimSchema::realClock;
00115                     return false;
00116                 }
00117 
00118                 // Create world manager
00119                 O3dSchema::worldManager = new O3dManager();
00120                 O3dSchema::console->updateConsole();
00121                 LogDetail("Created world manager");
00122 
00123 
00124                 // Make WorldManager listen to sagaengine core events
00125                 //ClientSchema::clientListeners.addListener(*O3dSchema::worldManager);
00126                 LogDetail("Added world manager as SagaEngine client listener");
00127 
00128                 LogDetail("Cast init event to render event listeners");
00129                 O3dSchema::renderEventListeners().castInitEngine();
00130 
00131                 return true;
00132             }
00133 
00134             void cleanupEngineEvent() {
00135 
00136                 LogDetail("Cast init cleanup to render event listeners");
00137                 O3dSchema::renderEventListeners().castCleanupEngine();
00138 
00139                 // Make WorldManager listen to sagaengine core events
00140                 //ClientSchema::clientListeners.removeListener(*O3dSchema::worldManager);
00141                 LogDetail("Removed SagaEngine client listener");
00142 
00143                 // Cleanup render engine
00144                 O3dSchema::renderEngine->cleanup();
00145 
00146                 delete O3dSchema::worldManager;
00147                 O3dSchema::worldManager = 0;
00148 
00149                 delete O3dSchema::renderEngine;
00150                 O3dSchema::renderEngine = 0;
00151 
00152                 delete SimSchema::realClock;
00153                 SimSchema::realClock = 0;
00154             }
00155 
00156             bool initGameEvent() {
00157                 Ogre::Overlay* overlay = 0;
00158                 try {
00159                     overlay = Ogre::OverlayManager::getSingleton().getByName("Core/Loading");
00160                     if(overlay) {
00161                         wchar_t buffer[512];
00162                         if(SpeechBubble::translate("Info.LOADING", buffer)) {
00163                             Ogre::OverlayElement* txt = Ogre::OverlayManager::getSingleton().getOverlayElement("Core/LoadingText");
00164                             txt->setCaption(buffer);
00165                         }
00166                         overlay->show();
00167                         Ogre::Root::getSingleton().renderOneFrame();
00168                         overlay->hide();
00169                     }
00170                     else {
00171                         LogWarning("No loading overlay");
00172                     }
00173                 }
00174                 catch(...) {
00175                 }
00176 
00177                 Assert(O3dSchema::renderEngine);
00178                 O3dSchema::renderEngine->skipNext();
00179 
00180                 // Make WorldManager listen to Ogre render events
00181                 LogDetail("Add world manager as Ogre frame listener");
00182                 Ogre::Root::getSingleton().addFrameListener(O3dSchema::worldManager);
00183 
00184                 LogDetail("Register ogre add-on as sim engine listener");
00185                 SimSchema::engineListeners().addListener(*O3dSchema::renderEngine);
00186 
00187                 LogDetail("Cast init event to render event listeners");
00188                 O3dSchema::renderEventListeners().castInitGame();
00189 
00190                 return true;
00191             }
00192 
00193             void cleanupGameEvent() {
00194                 //
00195                 O3dSchema::renderEngine->resetSkip();
00196                 O3dSchema::renderEngine->resetLevelResources();
00197 
00198                 // Make WorldManager listen to Ogre render events
00199                 LogDetail("Remove Ogre frame listener");
00200                 Ogre::Root::getSingleton().removeFrameListener(O3dSchema::worldManager);
00201 
00202                 LogDetail("Cast init cleanup to render event listeners");
00203                 O3dSchema::renderEventListeners().castCleanupGame();
00204 
00205                 Assert(O3dSchema::renderEngine);
00206                 LogDetail("Remove ogre add-on as sim engine listener");
00207                 SimSchema::engineListeners().removeListener(*O3dSchema::renderEngine);
00208 
00209                 O3dSchema::thingMOManager.reset();
00210 
00211                 // Cleared world
00212                 O3dSchema::worldManager->clear();
00213                 LogDetail("Cleared world");
00214         
00215                 /*
00216                 // Clear scene graph
00217                 O3dSchema::sceneManager->clearScene();
00218                 LogDetail("Cleared scene");
00219 
00220 
00221                 if(O3dSchema::playerCamera) {
00222                     O3dSchema::sceneManager->destroyCamera(O3dSchema::playerCamera);
00223                     O3dSchema::playerCamera = 0;
00224                     O3dSchema::window->removeAllViewports();
00225                     LogDetail("Destroyed camera");
00226                 }
00227 
00228                 O3dSchema::root->destroySceneManager(O3dSchema::sceneManager);
00229                 O3dSchema::sceneManager = 0;
00230                 */
00231             }
00232 
00233             bool initLevelEvent() {
00234                 // Load ogre configuration
00235                 O3dSchema::renderEngine->skipNext();
00236                 const char* global = "logic/config/global.ogre.txt";
00237                 if(!IoSchema::fileManager->exists(global)) {
00238                     IoSchema::fileManager->addFileIfExists(global);
00239                 }
00240                 if(IoSchema::fileManager->exists(global)) {
00241                     IoSchema::fileManager->load(global);
00242                 }
00243                 char buffer[256];
00244                 sprintf(buffer, "logic/config/%s.ogre.txt", SimSchema::simEngine.nextLevel());
00245                 if(!IoSchema::fileManager->exists(buffer)) {
00246                     IoSchema::fileManager->addFileIfExists(buffer);
00247                 }
00248                 if(IoSchema::fileManager->exists(buffer)) {
00249                     IoSchema::fileManager->load(buffer);
00250                 }
00251 
00252 
00253                 ZoneAreaComponent::Ptr cZone(*ClientSchema::camera->nextPos().area());
00254                 int c = SimSchema::areaManager.areaCount();
00255                 for(int i = 0; i < c; ++i) {
00256                     Area* a = SimSchema::areaManager.area(i);
00257                     ZoneAreaComponent::Ptr aZone(*a);
00258 
00259                     O3dAreaComponent::Ptr aO3d(*a);
00260                     if(aZone->page().w_ == cZone->page().w_) {
00261                         aO3d->initStaticGeometry();
00262                     }
00263                 }
00264 
00265                 speechBubble->init();
00266 
00267                 O3dSchema::taskList.performAll();
00268                 O3dSchema::renderEventListeners().castInitLevel();
00269 
00270 
00271                 return true;
00272             }
00273 
00274 
00275             void cleanupLevelEvent() {
00276                 O3dSchema::renderEventListeners().castCleanupLevel();
00277 
00278                 Ogre::Overlay* overlay = 0;
00279                 try {
00280                     overlay = Ogre::OverlayManager::getSingleton().getByName("Core/Loading");
00281                     if(overlay) {
00282                         overlay->show();
00283                         Ogre::Root::getSingleton().renderOneFrame();
00284                         overlay->hide();
00285                     }
00286                     else {
00287                         LogWarning("No loading overlay");
00288                     }
00289                 }
00290                 catch(...) {
00291                 }
00292 
00293                 speechBubble->cleanup();
00294 
00295                 ZoneAreaComponent::Ptr cZone(*ClientSchema::camera->nextPos().area());
00296                 int c = SimSchema::areaManager.areaCount();
00297                 for(int i = 0; i < c; ++i) {
00298                     Area* a = SimSchema::areaManager.area(i);
00299                     ZoneAreaComponent::Ptr aZone(*a);
00300 
00301                     O3dAreaComponent::Ptr aO3d(*a);
00302                     aO3d->cleanupStaticGeometry();
00303                     aO3d->cleanup();
00304                 }
00305 
00306                 // Clear scene graph
00307                 O3dSchema::sceneManager->clearScene();
00308                 LogDetail("Cleared scene");
00309 
00310                 if(O3dSchema::playerCamera) {
00311                     O3dSchema::sceneManager->destroyCamera(O3dSchema::playerCamera);
00312                     O3dSchema::playerCamera = 0;
00313                     O3dSchema::window->removeAllViewports();
00314                     LogDetail("Destroyed camera");
00315                 }
00316 
00317                 O3dSchema::root->destroySceneManager(O3dSchema::sceneManager);
00318                 O3dSchema::sceneManager = 0;
00319 
00320             }
00321 
00322         } autoInit;
00323 
00324         void touch() {
00325             se_core::SimSchema::touch();
00326             se_core::IoSchema::touch();
00327             autoInit;
00328         }
00329     }
00330 }
00331 

Home Page | SagaEngine trunk (updated nightly) reference generated Sun Dec 2 20:06:07 2007 by Doxygen version 1.3.9.1.

SourceForge.net Logo