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.