00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 #include <minimap.h>
00011 #include <GraphicsInteractionManager.h>
00012 #include <OgreHardwarePixelBuffer.h>
00013 #include <OgreRectangle2D.h>
00014 
00015 
00016 OgreGFX::Minimap::Minimap(GraphicsInteractionManager *gim): DEFAULT_MINIMAP_UPDATE_PERIOD(0.2) {
00017         gfx = gim;
00018         init();
00019 
00020 }
00021 
00022 OgreGFX::Minimap::~Minimap(void){
00023 
00024 }
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 
00034 
00035 
00036 
00037 void OgreGFX::Minimap::init(void) {
00038 
00039         rttt = Ogre::TextureManager::getSingleton().createManual("MinimapTex",
00040                         Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,
00041                         Ogre::TEX_TYPE_2D, gfx->mWindow->getWidth(), gfx->mWindow->getHeight(), 0, Ogre::PF_R8G8B8, Ogre::TU_RENDERTARGET);
00042         renderTexture = rttt->getBuffer()->getRenderTarget();
00043 
00044         minimapCamera = gfx->mSceneMgr->createCamera("MinimapCamera");
00045         minimapCamera->setNearClipDistance(5);
00046         minimapCamera->setAspectRatio((double)gfx->mWindow->getViewport(0)->getActualWidth()/(double)gfx->mWindow->getViewport(0)->getActualHeight());
00047         Ogre::Vector3 cpos = gfx->mCamera->getPosition();
00048         minimapCamera->setPosition(0, 10000, 0);
00049 
00050         minimapCamera->pitch(Ogre::Radian(-1.5708));;
00051         renderTexture->addViewport(minimapCamera);
00052         renderTexture->getViewport(0)->setClearEveryFrame(true);
00053         renderTexture->getViewport(0)->setBackgroundColour(Ogre::ColourValue::Black);
00054         renderTexture->getViewport(0)->setOverlaysEnabled(false);
00055         renderTexture->getViewport(0)->setVisibilityMask(OgreGFX::MINIMAP_CAMERA_MASK);
00056         renderTexture->setAutoUpdated(false);
00057 
00058         minimap = new Ogre::Rectangle2D(true);
00059         minimap->setCorners(-1.0, -0.6, -0.5, -1.0);
00060 
00061         minimap->setBoundingBox(Ogre::AxisAlignedBox(-100000.0f * Ogre::Vector3::UNIT_SCALE, 100000.0f * Ogre::Vector3::UNIT_SCALE));
00062         minimapSceneNode = gfx->mSceneMgr->getRootSceneNode()->createChildSceneNode("MinimapSceneNode");
00063         minimapSceneNode->attachObject(minimap);
00064 
00065         renderMaterial = Ogre::MaterialManager::getSingleton().create("MinimapMaterial", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);
00066         renderMaterial->getTechnique(0)->getPass(0)->setLightingEnabled(false);
00067         renderMaterial->getTechnique(0)->getPass(0)->createTextureUnitState("MinimapTex");
00068 
00069         minimap->setMaterial("MinimapMaterial");
00070 
00071         renderTexture->addListener(this);
00072         gfx->mRoot->addFrameListener(this);
00073         renderTexture->update();
00074         updatePeriod = DEFAULT_MINIMAP_UPDATE_PERIOD;
00075 
00076 }
00077 
00078 bool OgreGFX::Minimap::frameRenderingQueued(const Ogre::FrameEvent& evt){
00079         updatePeriod -= evt.timeSinceLastFrame;
00080         if(updatePeriod < 0){
00081                 renderTexture->update();
00082                 updatePeriod = DEFAULT_MINIMAP_UPDATE_PERIOD;
00083         }
00084         Ogre::Vector3 cpos = gfx->mCamera->getPosition();
00085         minimapCamera->setPosition(cpos.x, 10000, cpos.z);
00086 
00087 
00088         return true;
00089 }
00090 
00091 
00092 
00093 
00094 void OgreGFX::Minimap::preRenderTargetUpdate(const Ogre::RenderTargetEvent& evt){
00095         minimap->setVisible(false);
00096 
00097 
00098 }
00099 
00100 
00101 void OgreGFX::Minimap::postRenderTargetUpdate(const Ogre::RenderTargetEvent& evt){
00102         minimap->setVisible(true);
00103 }
00104