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 
00027 #include <GraphicsInteractionManager.h>
00028 #include <uiMgr.h>
00029 #include <unitWeapons.h>
00030 #include <map>
00031 
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 GraphicsInteractionManager::~GraphicsInteractionManager(void)
00051 {
00052     
00053     
00054 
00055     
00056     Ogre::WindowEventUtilities::removeWindowEventListener(mWindow, this);
00057     windowClosed(mWindow);
00058     delete mRoot;
00059 }
00060 
00061 
00062 bool GraphicsInteractionManager::configure(void)
00063 {
00064     
00065     
00066     
00067         if (!(mRoot->restoreConfig() || mRoot->showConfigDialog())){
00068                 return false;
00069         }
00070         mWindow = mRoot->initialise(true, "FastEcslent::GraphicsInteractionManager's Render Window");
00071         return true;
00072 
00073 }
00074 
00075 void GraphicsInteractionManager::chooseSceneManager(void)
00076 {
00077     
00078         
00079         mSceneMgr = mRoot->createSceneManager("DefaultSceneManager");
00080 }
00081 
00082 void GraphicsInteractionManager::createCamera(void)
00083 {
00084     
00085     mCamera = mSceneMgr->createCamera("PlayerCam");
00086 
00087     
00088     
00089     
00090     
00091     mCamera->setNearClipDistance(5);
00092 
00093     
00094 }
00095 
00096 
00097 void GraphicsInteractionManager::createUIMgr(void)
00098 {
00099         uiMgr = new OgreGFX::UIMgr(this);
00100 }
00101 
00102 void GraphicsInteractionManager::createWidgetMgr(void)
00103 {
00104         widgetMgr = new OgreGFX::WidgetMgr(this);
00105         mRoot->addFrameListener(widgetMgr);
00106 }
00107 
00108 void GraphicsInteractionManager::createPaticleSystem(void)
00109 {
00110         explosionParticleSystem = mSceneMgr->createParticleSystem("explode", "explosionTemplate");
00111         explosionParticleSystem->setSpeedFactor(50);
00112 }
00113 
00114 
00115 
00116 
00117 
00118 
00119 
00120 
00121 
00122 void GraphicsInteractionManager::loadGameGFX(void) {
00123         setupGame();
00124         mRoot->addFrameListener(this);
00125 }
00126 
00127 
00128 
00129 
00130 void GraphicsInteractionManager::destroyScene(void)
00131 {
00132 }
00133 
00134 void GraphicsInteractionManager::createViewports(void)
00135 {
00136     
00137     Ogre::Viewport* vp = mWindow->addViewport(mCamera);
00138 
00139     vp->setVisibilityMask(OgreGFX::PLAYER_CAMERA_MASK);
00140     
00141     vp->setBackgroundColour(Ogre::ColourValue(0,0,0));
00142 
00143     
00144     mCamera->setAspectRatio(Ogre::Real(vp->getActualWidth()) / Ogre::Real(vp->getActualHeight()));
00145 }
00146 
00147 void GraphicsInteractionManager::setupResources(void)
00148 {
00149     
00150     Ogre::ConfigFile cf;
00151     cf.load(mResourcesCfg);
00152 
00153     
00154     Ogre::ConfigFile::SectionIterator seci = cf.getSectionIterator();
00155 
00156     Ogre::String secName, typeName, archName;
00157     while (seci.hasMoreElements())  {
00158         secName = seci.peekNextKey();
00159         Ogre::ConfigFile::SettingsMultiMap *settings = seci.getNext();
00160         Ogre::ConfigFile::SettingsMultiMap::iterator i;
00161         for (i = settings->begin(); i != settings->end(); ++i){
00162             typeName = i->first;
00163             archName = i->second;
00164             Ogre::ResourceGroupManager::getSingleton().addResourceLocation(
00165                 archName, typeName, secName);
00166         }
00167     }
00168 }
00169 
00170 void GraphicsInteractionManager::createResourceListener(void)
00171 {
00172 
00173 }
00174 
00175 void GraphicsInteractionManager::loadResources(void)
00176 {
00177     Ogre::ResourceGroupManager::getSingleton().initialiseAllResourceGroups();
00178 }
00179 
00180 void GraphicsInteractionManager::go(void)
00181 {
00182 #ifdef _DEBUG
00183     mResourcesCfg = "config/resources_d.cfg";
00184     mPluginsCfg = "config/plugins_d.cfg";
00185 #else
00186     mResourcesCfg = "config/resources.cfg";
00187     mPluginsCfg = "config/plugins.cfg";
00188 #endif
00189 
00190     if (!setup())
00191         return;
00192 
00193     mRoot->startRendering();
00194 
00195     
00196     destroyScene();
00197 }
00198 
00199 void GraphicsInteractionManager::initGFXManagers(void) {
00200         uiMgr->initialize();
00201         widgetMgr->initialize();
00202         mRoot->addFrameListener(uiMgr);
00203 }
00204 
00205 bool GraphicsInteractionManager::setup(void)
00206 {
00207     mRoot = new Ogre::Root(mPluginsCfg);
00208     setupResources();
00209     bool carryOn = configure();
00210     if (!carryOn) return false;
00211     chooseSceneManager();
00212     createCamera();
00213     createViewports();
00214 
00215     
00216     Ogre::TextureManager::getSingleton().setDefaultNumMipmaps(5);
00217     
00218     createResourceListener();
00219     
00220     loadResources();
00221     createUIMgr();
00222 
00223     
00224     createLobbyMgr();
00225 
00226     createPaticleSystem();
00227 
00228     
00229     loadLobbyGFX();
00230 
00231     return true;
00232 };
00233 
00234 bool GraphicsInteractionManager::setupGame(void)
00235 {
00236         createScene();
00237     createWidgetMgr();
00238 
00239     initGFXManagers();
00240 
00241     return true;
00242 };
00243 
00244 
00245 void GraphicsInteractionManager::handleBornEnts(){
00246         if (this->engine->entityMgr->nEnts > this->nGFXNodes) {
00247                 for (int i = nGFXNodes; i < this->engine->entityMgr->nEnts; i++){
00248                                 makeNode(this->engine->entityMgr->ents[i]);
00249                 }
00250                 this->nGFXNodes = engine->entityMgr->nEnts;
00251         }
00252 }
00253 
00254 
00255 void GraphicsInteractionManager::handleDevelopingEnts(){
00256 
00257 }
00258 
00259 
00260 bool GraphicsInteractionManager::frameRenderingQueued(const Ogre::FrameEvent& evt){
00261     if(mWindow->isClosed())
00262         return false;
00263     mShutDown = uiMgr->shutDown;
00264     if(mShutDown){
00265         if(uiMgr) {
00266                 uiMgr->kill();
00267                 delete uiMgr;
00268                 boost::mutex::scoped_lock scoped_lock(engine->quitLock);
00269                 engine->quit = true;
00270         }
00271         return false;
00272     }
00273 
00274     handleDevelopingEnts(); 
00275     handleBornEnts();       
00276     copySimState(); 
00277 
00278     return true;
00279 }
00280 
00281 
00282 void GraphicsInteractionManager::windowResized(Ogre::RenderWindow* rw){
00283            
00284            unsigned int width, height, depth;
00285            int left, top;
00286            rw->getMetrics(width, height, depth, left, top);
00287 
00288            const OIS::MouseState &ms = uiMgr->mouse->getMouseState();
00289            ms.width = width;
00290            ms.height = height;
00291 }
00292 
00293 
00294 void GraphicsInteractionManager::windowClosed(Ogre::RenderWindow* rw){
00295     
00296     if( rw == mWindow ) {
00297         if(uiMgr) {
00298                 uiMgr->kill();
00299         }
00300     }
00301 }
00302 
00303 
00304 
00305 void GraphicsInteractionManager::makeInitialEntityNodes(){
00306         this->nGFXNodes = engine->entityMgr->nEnts;
00307         std::cout << "GFX: Number of ents: " << nGFXNodes << std::endl;
00308         for (int i = 0; i < nGFXNodes; i++){
00309                 makeNode(engine->entityMgr->ents[i]);
00310         }
00311 }
00312 
00313 
00314 void GraphicsInteractionManager::makeNode(FastEcslent::Entity *feEnt){
00315         std::cout << "Name: " << feEnt->uiname << std::endl;
00316         Ogre::Entity* ent = mSceneMgr->createEntity(feEnt->uiname, feEnt->meshName);
00317 
00318         if(feEnt->entityId.side == FastEcslent::RED && feEnt->entityClass == FastEcslent::SURFACE){
00319                 ent->setMaterialName("color2/SOLID/TEX/ecsl.bmp");
00320         }else if(feEnt->entityId.side == FastEcslent::BLUE &&  feEnt->entityClass == FastEcslent::SURFACE){
00321                 ent->setMaterialName("RED/SOLID/TEX/ecslDark.bmp/VertCol");
00322         }
00323 
00324         ent->setVisibilityFlags(OgreGFX::ENT_VISIBILITY_FLAG);
00325 
00326 
00327 
00328         std::cout << "GFX creating: " << feEnt->uiname << std::endl;
00329 
00330         Ogre::SceneNode* sceneNode = mSceneMgr->getRootSceneNode()->createChildSceneNode(feEnt->pos);
00331         std::stringstream ss;
00332         ss << feEnt->uiname << "_mini" ;
00333         Ogre::Entity* minimapEnt = mSceneMgr->createEntity(ss.str(), "cube.mesh" );
00334         minimapEnt->setVisibilityFlags(OgreGFX::MINIMAP_VISIBILITY_FLAG);
00335         Ogre::SceneNode* minimapNode = sceneNode->createChildSceneNode();
00336         minimapNode->attachObject(minimapEnt);
00337         minimapNode->setScale(2.0, 2.0, 2.0);
00338         int id = feEnt->entityId.id;
00339         gfxNodes[id].node = sceneNode;
00340         gfxNodes[id].node->attachObject(ent);
00341         gfxNodes[id].node->resetOrientation();
00342         gfxNodes[id].node->yaw(Ogre::Radian(feEnt->heading));
00343         gfxNodes[id].id = id;
00344         gfxNodes[id].selectable = feEnt->selectable;
00345         sceneNodeToEntIdMap[sceneNode] = id;
00346 }
00347 
00348 
00349 void GraphicsInteractionManager::createScene(){
00350 
00351         
00352         Ogre::Entity*         mOceanSurfaceEnt;
00353         makeInitialEntityNodes();
00354 
00355         
00356         mSceneMgr->setAmbientLight(Ogre::ColourValue(0.8, 0.8, 0.8));
00357         Ogre::Light* l1 = mSceneMgr->createLight("LightOne");
00358         l1->setPosition(20, 80, 50);
00359 
00360         
00361         mSceneMgr->setSkyDome(true, "Examples/CloudySky", 10, 8);
00362         
00363 
00364 
00365     
00366         
00367     oceanSurface.normal = Ogre::Vector3::UNIT_Y;
00368     oceanSurface.d = 0;
00369     Ogre::MeshManager::getSingleton().createPlane("OceanSurface",
00370         Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,
00371         oceanSurface,
00372         10000, 10000, 50, 50, true, 1, 1, 1, Ogre::Vector3::UNIT_Z);
00373 
00374     mOceanSurfaceEnt = mSceneMgr->createEntity( "OceanSurface", "OceanSurface" );
00375     mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(mOceanSurfaceEnt);
00376     mOceanSurfaceEnt->setCastShadows(false);
00377     mOceanSurfaceEnt->setMaterialName("OceanHLSL_GLSL");
00378     
00379     
00380 }
00381 
00382 void GraphicsInteractionManager::explode(Ogre::SceneNode *node){
00383         explosionParticleSystem->getEmitter(0)->setEnabled(true);
00384         node->detachObject(explosionParticleSystem);
00385         node->attachObject(explosionParticleSystem);
00386 }
00387 
00388 void GraphicsInteractionManager::copySimState(){
00389 
00390         for(int i = 0; i < nGFXNodes; i++){
00391                 
00392                 gfxNodes[i].node->setPosition(engine->entityMgr->ents[i]->pos);
00393                 gfxNodes[i].node->resetOrientation();
00394                 gfxNodes[i].node->yaw(Ogre::Radian(engine->entityMgr->ents[i]->heading));
00395 
00396                 
00397                 FastEcslent::Weapon *uw = dynamic_cast<FastEcslent::Weapon *>(engine->entityMgr->ents[i]->getAspect(FastEcslent::WEAPON));
00398                 if(uw->isBeingAttacked()){
00399                         uw->resetBeingAttack();
00400                         this->explode(gfxNodes[i].node);
00401                 }
00402         }
00403 }
00404 
00405 void GraphicsInteractionManager::createLobbyMgr()
00406 {
00407         lobbyMgr = new LobbyMgr(engine, this, uiMgr->mouse, uiMgr->keyboard);
00408 }
00409 
00410 void GraphicsInteractionManager::loadLobbyGFX(void) {
00411         mRoot->addFrameListener(lobbyMgr);
00412 }