00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 #include <OgreMeshManager.h>
00023 #include <OgreEntity.h>
00024 #include <OgreSceneNode.h>
00025 
00026 #include <engine.h>
00027 #include <GraphicsInteractionManager.h>
00028 #include <uiMgr.h>
00029 
00030 #include <map>
00031 #include "DEBUG.h"
00032 
00033 using namespace OgreGFX;
00034 
00035 
00036 GraphicsInteractionManager::GraphicsInteractionManager(FastEcslent::Engine* eng):
00037         mRoot(0),
00038         mSceneMgr(0),
00039         mWindow(0),
00040         mCamera(0),
00041         mResourcesCfg(Ogre::StringUtil::BLANK),
00042         mPluginsCfg(Ogre::StringUtil::BLANK),
00043         mCursorWasVisible(false),
00044         mShutDown(false)
00045 {
00046         this->engine = eng;
00047 
00048 }
00049 
00050 
00051 GraphicsInteractionManager::~GraphicsInteractionManager(void)
00052 {
00053     
00054     
00055 
00056     
00057     Ogre::WindowEventUtilities::removeWindowEventListener(mWindow, this);
00058     windowClosed(mWindow);
00059     delete mRoot;
00060 }
00061 
00062 
00063 bool GraphicsInteractionManager::configure(void)
00064 {
00065     
00066     
00067     
00068         if (!(mRoot->restoreConfig() || mRoot->showConfigDialog())){
00069                 return false;
00070         }
00071         mWindow = mRoot->initialise(true, "FastEcslent::GraphicsInteractionManager's Render Window");
00072         return true;
00073 
00074 }
00075 
00076 void GraphicsInteractionManager::chooseSceneManager(void)
00077 {
00078     
00079         
00080         mSceneMgr = mRoot->createSceneManager("DefaultSceneManager");
00081 }
00082 
00083 void GraphicsInteractionManager::createCamera(void)
00084 {
00085     
00086     mCamera = mSceneMgr->createCamera("PlayerCam");
00087 
00088     
00089     
00090     
00091     
00092     mCamera->setNearClipDistance(5);
00093 
00094     
00095 }
00096 
00097 
00098 void GraphicsInteractionManager::createUIMgr(void)
00099 {
00100         uiMgr = new OgreGFX::UIMgr(this);
00101         mRoot->addFrameListener(uiMgr);
00102 }
00103 
00104 void GraphicsInteractionManager::createWidgetMgr(void)
00105 {
00106         widgetMgr = new OgreGFX::WidgetMgr(this);
00107         mRoot->addFrameListener(widgetMgr);
00108 }
00109 
00110 
00111 
00112 
00113 
00114 
00115 
00116 
00117 void GraphicsInteractionManager::createFrameListener(void) {
00118         mRoot->addFrameListener(this);
00119 }
00120 
00121 
00122 
00123 void GraphicsInteractionManager::destroyScene(void)
00124 {
00125 }
00126 
00127 void GraphicsInteractionManager::createViewports(void)
00128 {
00129     
00130     Ogre::Viewport* vp = mWindow->addViewport(mCamera);
00131 
00132     vp->setVisibilityMask(OgreGFX::PLAYER_CAMERA_MASK);
00133     
00134     vp->setBackgroundColour(Ogre::ColourValue(0,0,0));
00135 
00136     
00137     mCamera->setAspectRatio(Ogre::Real(vp->getActualWidth()) / Ogre::Real(vp->getActualHeight()));
00138 }
00139 
00140 void GraphicsInteractionManager::setupResources(void)
00141 {
00142     
00143     Ogre::ConfigFile cf;
00144     cf.load(mResourcesCfg);
00145 
00146     
00147     Ogre::ConfigFile::SectionIterator seci = cf.getSectionIterator();
00148 
00149     Ogre::String secName, typeName, archName;
00150     while (seci.hasMoreElements())  {
00151         secName = seci.peekNextKey();
00152         Ogre::ConfigFile::SettingsMultiMap *settings = seci.getNext();
00153         Ogre::ConfigFile::SettingsMultiMap::iterator i;
00154         for (i = settings->begin(); i != settings->end(); ++i){
00155             typeName = i->first;
00156             archName = i->second;
00157             Ogre::ResourceGroupManager::getSingleton().addResourceLocation(
00158                 archName, typeName, secName);
00159         }
00160     }
00161 }
00162 
00163 void GraphicsInteractionManager::createResourceListener(void)
00164 {
00165 
00166 }
00167 
00168 void GraphicsInteractionManager::loadResources(void)
00169 {
00170     Ogre::ResourceGroupManager::getSingleton().initialiseAllResourceGroups();
00171 }
00172 
00173 void GraphicsInteractionManager::go(void)
00174 {
00175 #ifdef _DEBUG
00176     mResourcesCfg = "config/resources_d.cfg";
00177     mPluginsCfg = "config/plugins_d.cfg";
00178 #else
00179     mResourcesCfg = "config/resources.cfg";
00180     mPluginsCfg = "config/plugins.cfg";
00181 #endif
00182 
00183     if (!setup())
00184         return;
00185 
00186     mRoot->startRendering();
00187 
00188     
00189     destroyScene();
00190 }
00191 
00192 void GraphicsInteractionManager::initManagers(void) {
00193 
00194                 uiMgr->initialize();
00195                 widgetMgr->initialize();
00196 }
00197 
00198 bool GraphicsInteractionManager::setup(void)
00199 {
00200     mRoot = new Ogre::Root(mPluginsCfg);
00201     setupResources();
00202     bool carryOn = configure();
00203     if (!carryOn) return false;
00204     chooseSceneManager();
00205     createCamera();
00206     createViewports();
00207 
00208     
00209     Ogre::TextureManager::getSingleton().setDefaultNumMipmaps(5);
00210     
00211     createResourceListener();
00212     
00213     loadResources();
00214     
00215     createScene();
00216     createUIMgr();
00217     createWidgetMgr();
00218 
00219     createFrameListener();
00220     initManagers();
00221 
00222     return true;
00223 };
00224 
00225 
00226 void GraphicsInteractionManager::handleBornEnts(){
00227         if (this->engine->entityMgr->nEnts > this->nGFXNodes) {
00228                 for (int i = nGFXNodes; i < this->engine->entityMgr->nEnts; i++){
00229                                 makeNode(this->engine->entityMgr->ents[i]);
00230                 }
00231                 this->nGFXNodes = engine->entityMgr->nEnts;
00232         }
00233 
00234 }
00235 
00236 
00237 void GraphicsInteractionManager::handleDevelopingEnts(){
00238 
00239 }
00240 
00241 
00242 bool GraphicsInteractionManager::frameRenderingQueued(const Ogre::FrameEvent& evt){
00243     if(mWindow->isClosed())
00244         return false;
00245     mShutDown = uiMgr->shutDown;
00246     if(mShutDown){
00247         if(uiMgr) {
00248                 uiMgr->kill();
00249                 delete uiMgr;
00250                 boost::mutex::scoped_lock scoped_lock(engine->quitLock);
00251                 engine->quit = true;
00252         }
00253         return false;
00254     }
00255     handleDevelopingEnts(); 
00256     handleBornEnts();       
00257     copySimState(); 
00258 
00259 
00260     return true;
00261 }
00262 
00263 
00264 void GraphicsInteractionManager::windowResized(Ogre::RenderWindow* rw){
00265 }
00266 
00267 
00268 void GraphicsInteractionManager::windowClosed(Ogre::RenderWindow* rw){
00269     
00270     if( rw == mWindow ) {
00271         if(uiMgr) {
00272                 uiMgr->kill();
00273         }
00274     }
00275 }
00276 
00277 
00278 
00279 void GraphicsInteractionManager::makeInitialEntityNodes(){
00280         this->nGFXNodes = engine->entityMgr->nEnts;
00281         DEBUG(std::cout << "GFX: Number of ents: " << nGFXNodes << std::endl;)
00282         for (int i = 0; i < nGFXNodes; i++){
00283                 makeNode(engine->entityMgr->ents[i]);
00284         }
00285 
00286 }
00287 
00288 
00289 void GraphicsInteractionManager::makeNode(FastEcslent::Entity *feEnt){
00290         DEBUG(std::cout << "Name: " << feEnt->uiname << std::endl;)
00291         Ogre::Entity* ent = mSceneMgr->createEntity(feEnt->uiname, feEnt->meshName);
00292 
00293         ent->setVisibilityFlags(OgreGFX::ENT_VISIBILITY_FLAG);
00294 
00295 
00296 
00297         DEBUG(std::cout << "GFX creating: " << feEnt->uiname << std::endl;)
00298 
00299         Ogre::SceneNode* sceneNode = mSceneMgr->getRootSceneNode()->createChildSceneNode(feEnt->pos);
00300         std::stringstream ss;
00301         ss << feEnt->uiname << "_mini" ;
00302         Ogre::Entity* minimapEnt = mSceneMgr->createEntity(ss.str(), "cube.mesh" );
00303         minimapEnt->setVisibilityFlags(OgreGFX::MINIMAP_VISIBILITY_FLAG);
00304         Ogre::SceneNode* minimapNode = sceneNode->createChildSceneNode();
00305         minimapNode->attachObject(minimapEnt);
00306         minimapNode->setScale(2.0, 2.0, 2.0);
00307         int id = feEnt->entityId.id;
00308         gfxNodes[id].node = sceneNode;
00309         gfxNodes[id].node->attachObject(ent);
00310         gfxNodes[id].node->resetOrientation();
00311         gfxNodes[id].node->yaw(Ogre::Radian(feEnt->heading));
00312         gfxNodes[id].id = id;
00313         gfxNodes[id].selectable = feEnt->selectable;
00314         sceneNodeToEntIdMap[sceneNode] = id;
00315 }
00316 
00317 
00318 void GraphicsInteractionManager::createScene(){
00319 
00320         
00321         Ogre::Entity*         mOceanSurfaceEnt;
00322         makeInitialEntityNodes();
00323 
00324         
00325         mSceneMgr->setAmbientLight(Ogre::ColourValue(0.8, 0.8, 0.8));
00326         Ogre::Light* l1 = mSceneMgr->createLight("LightOne");
00327         l1->setPosition(20, 80, 50);
00328 
00329         
00330         mSceneMgr->setSkyDome(true, "Examples/CloudySky", 10, 8);
00331         
00332 
00333 
00334     
00335         
00336     oceanSurface.normal = Ogre::Vector3::UNIT_Y;
00337     oceanSurface.d = 0;
00338     Ogre::MeshManager::getSingleton().createPlane("OceanSurface",
00339         Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,
00340         oceanSurface,
00341         10000, 10000, 50, 50, true, 1, 1, 1, Ogre::Vector3::UNIT_Z);
00342 
00343     mOceanSurfaceEnt = mSceneMgr->createEntity( "OceanSurface", "OceanSurface" );
00344     mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(mOceanSurfaceEnt);
00345     mOceanSurfaceEnt->setCastShadows(false);
00346     mOceanSurfaceEnt->setMaterialName("OceanHLSL_GLSL");
00347     
00348     
00349 }
00350 
00351 
00352 
00353 void GraphicsInteractionManager::copySimState(){
00354 
00355         for(int i = 0; i < nGFXNodes; i++){
00356                 DEBUG(std::cout << engine->entityMgr->ents[i]->pos.x << ", " << engine->entityMgr->ents[0]->pos.y << ", " <<  engine->entityMgr->ents[0]->pos.z << std::endl;)
00357                 gfxNodes[i].node->setPosition(engine->entityMgr->ents[i]->pos);
00358                 gfxNodes[i].node->resetOrientation();
00359                 gfxNodes[i].node->yaw(Ogre::Radian(engine->entityMgr->ents[i]->heading));
00360         }
00361 }
00362 
00363