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