Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/map/src/orxonox/overlays/map/Map.cc @ 2913

Last change on this file since 2913 was 2913, checked in by Naaduun, 15 years ago

Added own scenemanager to map, added 2 pointer to contain mapentity and mapscenenod to radarviewable

File size: 9.1 KB
Line 
1/*
2 *   ORXONOX - the hottest 3D action shooter ever to exist
3 *                    > www.orxonox.net <
4 *
5 *
6 *   License notice:
7 *
8 *   This program is free software; you can redistribute it and/or
9 *   modify it under the terms of the GNU General Public License
10 *   as published by the Free Software Foundation; either version 2
11 *   of the License, or (at your option) any later version.
12 *
13 *   This program is distributed in the hope that it will be useful,
14 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
15 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 *   GNU General Public License for more details.
17 *
18 *   You should have received a copy of the GNU General Public License
19 *   along with this program; if not, write to the Free Software
20 *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
21 *
22 *   Author:
23 *      Si Sun
24 *
25 */
26#include "OrxonoxStableHeaders.h"
27#include "Map.h"
28 
29#include <string>
30#include <OgreSceneManager.h>
31#include <OgreSceneNode.h>
32#include <OgreEntity.h>
33#include <OgreNode.h>
34
35#include <OgreRenderWindow.h>
36#include <OgreRenderTexture.h>
37#include <OgreTexture.h>
38#include <OgreViewport.h>
39#include <OgreMaterial.h>
40#include <OgreMaterialManager.h>
41#include <OgreRoot.h>
42#include <OgreHardwarePixelBuffer.h>
43#include "objects/worldentities/ControllableEntity.h"
44#include "objects/worldentities/CameraPosition.h"
45
46#include <OgreOverlay.h>
47#include <OgreOverlayElement.h>
48#include <OgreOverlayManager.h>
49#include <OgreOverlayContainer.h>
50#include "core/CoreIncludes.h"
51#include "core/ConfigValueIncludes.h"
52#include "core/ConsoleCommand.h"
53#include "objects/Scene.h"
54#include "objects/RadarViewable.h"
55 
56 namespace orxonox
57 {
58    CreateFactory(Map);
59     SetConsoleCommand(Map, openMap, true);
60   
61    Map::Map(BaseObject* creator) : OrxonoxOverlay(creator)
62    {
63        RegisterObject(Map);
64       
65        //Getting Scene Manager (Hack)
66        ObjectList<Scene>::iterator it = ObjectList<Scene>::begin();
67        this->sManager_ = it->getSceneManager();
68
69        this->mapSceneM_ = Ogre::Root::getSingletonPtr()->createSceneManager( Ogre::ST_GENERIC,"MapScene" );
70        rootNode_ = mapSceneM_->getRootSceneNode();
71       
72        //this->sNode_ = new Ogre::SceneNode(sManager_);
73        //oManager_ = Ogre::OverlayManager::getSingletonPtr();
74        //overlay_ = oManager_->create("Map");
75        //overlay_ is member of OrxonoxOverlay
76       
77        //Not Showing the map as default
78        //this->isVisible_=false;
79        //overlay_->hide();
80       
81
82        //TestEntity
83        //Ogre::Entity * ent = mapSceneM_->createEntity("ent", "drone.mesh");
84       
85        //rootNode_->attachObject( ent );
86        /*sNode_->setPosition(0,0,-50);
87        overlay_->add3D(sNode_);
88        */
89       
90       
91       
92
93       
94        // Alter the camera aspect ratio to match the viewport
95        //mCamera->setAspectRatio(Real(vp->getActualWidth()) / Real(vp->getActualHeight()));
96        mReflectCam_ = mapSceneM_->createCamera("ReflectCam");
97        mReflectCam_->setPosition(200,170, -160);
98        mReflectCam_->lookAt(0,0,0);
99        mReflectCam_->setAspectRatio(1);
100
101        std::string camMat_id = "RttMat";
102        Ogre::MaterialPtr material = this->createRenderCamera(mReflectCam_, camMat_id);
103/*
104        Ogre::TexturePtr rttTex = Ogre::TextureManager::getSingleton().createManual("RttTex", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, Ogre::TEX_TYPE_2D, 512, 512, 0, Ogre::PF_R8G8B8, Ogre::TU_RENDERTARGET);
105
106        Ogre::RenderTexture *renderTexture = rttTex->getBuffer()->getRenderTarget();
107
108        renderTexture->addViewport(mReflectCam_);
109        renderTexture->getViewport(0)->setClearEveryFrame(true);
110        renderTexture->getViewport(0)->setBackgroundColour(ColourValue::Black);
111        renderTexture->getViewport(0)->setOverlaysEnabled(false);
112
113        Ogre::MaterialPtr material = Ogre::MaterialManager::getSingleton().create("RttMat", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);
114        Ogre::Technique *technique = material->createTechnique();
115        technique->createPass();
116        material->getTechnique(0)->getPass(0)->setLightingEnabled(false);
117        material->getTechnique(0)->getPass(0)->createTextureUnitState("RttTex");
118*/
119
120
121        // create overlay
122/*
123        Ogre::Overlay* pOverlay = Ogre::OverlayManager::getSingleton().create("Overlay1");
124       
125        // Create a panel with RenderToTexture texture
126        Ogre::OverlayContainer* m_pOverlayPanel = static_cast<Ogre::OverlayContainer*>(Ogre::OverlayManager::getSingleton().createOverlayElement("Panel","OverlayPanelName%d"));
127        m_pOverlayPanel->setMetricsMode(Ogre::GMM_PIXELS);
128        m_pOverlayPanel->setPosition(10, 10);
129        m_pOverlayPanel->setDimensions(500, 300);
130        // Give overlay a texture
131        m_pOverlayPanel->setMaterialName(camMat_id);
132        pOverlay->add2D(m_pOverlayPanel);
133        pOverlay->show();
134*/
135        overlay_ = Ogre::OverlayManager::getSingleton().create("MapOverlay");
136        Ogre::OverlayContainer* m_pOverlayPanel = static_cast<Ogre::OverlayContainer*>(Ogre::OverlayManager::getSingleton().createOverlayElement("Panel","OverlayPanelName%d"));
137        m_pOverlayPanel->setMetricsMode(Ogre::GMM_PIXELS);
138        m_pOverlayPanel->setPosition(10, 10);
139        m_pOverlayPanel->setDimensions(500, 300);
140        // Give overlay a texture
141        m_pOverlayPanel->setMaterialName(camMat_id); 
142        overlay_->add2D(m_pOverlayPanel);
143        //Not Showing the map as default
144        this->isVisible_=false;
145        overlay_->hide();
146
147    }
148   
149    Ogre::MaterialPtr Map::createRenderCamera(Ogre::Camera * cam, std::string matName)
150    {
151        Ogre::TexturePtr rttTex = Ogre::TextureManager::getSingleton().createManual(matName+"_tex", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, Ogre::TEX_TYPE_2D, 512, 512, 0, Ogre::PF_R8G8B8, Ogre::TU_RENDERTARGET);
152
153        Ogre::RenderTexture *renderTexture = rttTex->getBuffer()->getRenderTarget();
154
155        renderTexture->addViewport(cam);
156        renderTexture->getViewport(0)->setClearEveryFrame(true);
157        renderTexture->getViewport(0)->setBackgroundColour(ColourValue::Black);
158        renderTexture->getViewport(0)->setOverlaysEnabled(false);
159
160        Ogre::MaterialPtr material = Ogre::MaterialManager::getSingleton().create(matName, Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);
161        Ogre::Technique *technique = material->createTechnique();
162        technique->createPass();
163        material->getTechnique(0)->getPass(0)->setLightingEnabled(false);
164        material->getTechnique(0)->getPass(0)->createTextureUnitState(matName+"_tex");
165        return material;
166    }
167
168    void Map::updatePositions()
169    {
170//Ogre::Entity * ent;// = mapSceneM_->createEntity("ent1", "drone.mesh");
171       int i=0; 
172       for(ObjectList<orxonox::RadarViewable>::iterator it = ObjectList<orxonox::RadarViewable>::begin();
173            it!=ObjectList<orxonox::RadarViewable>::end();
174            it++)
175        {
176            i++;
177            //COUT(0) << "Radar_Position: " << it->getRVWorldPosition() << std::endl;
178            //Ogre::SceneNode node = it->getMapNode();
179            //Ogre::Entity ent = it->getMapEntity();
180            if( !(it->MapNode_) )
181            {
182                it->MapNode_ = rootNode_->createChildSceneNode( it->getRVWorldPosition() );
183                //it->MapNode_->translate( it->getRVOrientedVelocity(), Ogre::TS_WORLD );
184            }
185            it->MapNode_->setPosition( it->getRVWorldPosition() );
186            it->MapNode_->translate( it->getRVOrientedVelocity(), (Ogre::Node::TransformSpace)3 );
187            if( !(it->MapEntity_) )
188            {
189                it->MapEntity_ = mapSceneM_->createEntity( "MapEnt"+i, "drone.mesh");
190                it->MapNode_->attachObject( it->MapEntity_ );
191            }
192           
193       
194           
195        }
196    }
197
198    void Map::XMLPort(Element& xmlElement, XMLPort::Mode mode)
199    {
200        SUPER(Map, XMLPort, xmlElement, mode);
201    }   
202
203    void Map::changedOwner()
204    {
205        //COUT(0) << "shipptr" << this->getOwner()->getReverseCamera() << std::endl;
206        if(this->getOwner()->getReverseCamera())
207        {
208            //COUT(0) << "foo";
209            this->getOwner()->getReverseCamera()->attachCamera(this->mReflectCam_);
210        }
211    }
212
213
214    void Map::toggleVisibility()
215    {
216        if (!(this->isVisible_))
217        {
218            this->overlay_->show();
219            this->isVisible_=1;
220            //updatePositions();
221        }
222        else
223        {
224            this->overlay_->hide();
225            this->isVisible_=0;
226        }
227    }
228   
229    //Static function to toggle visibility of the map
230    void Map::openMap()
231    {
232        for(ObjectList<orxonox::Map>::iterator it = ObjectList<orxonox::Map>::begin();
233            it!=ObjectList<orxonox::Map>::end();
234            it++)
235        {
236        //Map * m = it->getMap();
237        COUT(0) << it->isVisible_ << std::endl;
238        it->toggleVisibility();
239        //it->updatePositions();
240        }
241    }
242   
243    void Map::tick(float dt)
244    {
245        //sNode_->lookAt(Vector3::NEGATIVE_UNIT_Z, Ogre::Node::TS_WORLD, Vector3::NEGATIVE_UNIT_Z);
246        updatePositions();
247       
248    }
249   
250 }
Note: See TracBrowser for help on using the repository browser.