Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/CampaignMap_HS17/src/modules/overlays/hud/StoryModeHUD.cc @ 11629

Last change on this file since 11629 was 11605, checked in by fanconic, 7 years ago

Beschriftung Funktioniert nun. Zusaetzlich ist das Levelfile mit neuem HUD Template funktionsfaehig. Erste Schritte zur Kameraeinstellung.

File size: 6.2 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 *   
23 *   This HUD is used for the implementation of the campaign map.
24 *   So far it can only be used to give names to an object planet.
25 *
26 *   Author:
27 *      Nikola Bolt
28 *   Co-authors:
29 *      Claudio Fanconi
30 */
31
32
33// Header file of this cc file
34#include "StoryModeHUD.h"
35
36// Ogre stuff
37#include <OgreCamera.h>
38#include <OgreFontManager.h>
39#include <OgreOverlayManager.h>
40#include <OgreTextAreaOverlayElement.h>
41#include <OgrePanelOverlayElement.h>
42
43// Other stuff
44#include <typeinfo>
45
46#include "util/Convert.h"
47#include "core/command/ConsoleCommandIncludes.h"
48#include "core/CoreIncludes.h"
49#include "core/XMLPort.h"
50#include "CameraManager.h"
51#include "graphics/Camera.h"
52#include "worldentities/pawns/Pawn.h"
53#include "worldentities/WorldEntity.h"
54#include "core/config/ConfigValueIncludes.h"
55#include "tools/TextureGenerator.h"
56
57#include "worldentities/StoryModePlanet.h"
58
59namespace orxonox
60{
61    RegisterClass ( StoryModeHUD );
62
63    // Constructor of the StoryMode HUD
64    StoryModeHUD::StoryModeHUD(Context* context) : OrxonoxOverlay(context)
65    {
66        RegisterObject(StoryModeHUD);
67    }
68
69    // Destructor of the StoryMode HUD
70    StoryModeHUD::~StoryModeHUD()
71    {
72        for(Ogre::TextAreaOverlayElement* text : texts)
73          delete text;
74    }
75
76    // Functions of the StoryMode HUD
77
78    // XML Port for Level construction.
79    void StoryModeHUD::XMLPort(Element& xmlelement, XMLPort::Mode mode)
80    {
81        SUPER(StoryModeHUD, XMLPort, xmlelement, mode);
82
83        XMLPortParam(StoryModeHUD, "font", setFont, getFont, xmlelement, mode);
84        XMLPortParam(StoryModeHUD, "textSize", setTextSize, getTextSize, xmlelement, mode);
85    }
86
87    void StoryModeHUD::initialize(){
88        firstTick = false;
89        // Scales used for dimensions and text size
90        float xScale = this->getActualSize().x;
91        float yScale = this->getActualSize().y;
92
93       
94        int i = 0;
95        for(StoryModePlanet* planet : ObjectList<StoryModePlanet>()){
96
97
98            Ogre::TextAreaOverlayElement* text = static_cast<Ogre::TextAreaOverlayElement*>( Ogre::OverlayManager::getSingleton()
99                    .createOverlayElement("TextArea", "StoryModeHUD_navText_" + getUniqueNumberString()));
100
101            texts.push_back(text);
102            texts[i]->setDimensions(xScale, yScale);
103
104            //PROBLEM: function doesn't get called automatically by the xml macro,
105            //which is why we need to call it manually here. works with storymodeplanet.h...
106            //this->setFont("Monofur");
107            //this->setTextSize(0.05f);
108
109            //font name of the text needs to be set here, not in the xml setter function
110            texts[i]->setFontName(this->fontName_);
111            texts[i]->setCharHeight(this->textSize_ * yScale);
112
113            //set text
114            texts[i]->setCaption(planet->getLevelName());
115
116            texts[i]->hide();
117       
118            this->background_->addChild(texts[i]);
119            i++;
120        }
121    }
122
123    // Set the Font of this HUD.
124    void StoryModeHUD::setFont(const std::string& font)
125    {
126        const Ogre::ResourcePtr& fontPtr = Ogre::FontManager::getSingleton().getByName(font);
127        if (fontPtr.isNull())
128        {
129            this->fontName_ = "Monofur";
130            orxout(internal_warning) << "StoryModeHUD: Font '" << font << "' not found. Font has been set to Monofur." << endl;
131            return;
132        }
133        this->fontName_ = font;
134    }
135   
136    // Gets the Font of this HUD   
137    const std::string& StoryModeHUD::getFont() const
138    {
139        return this->fontName_;
140    }
141
142    // Set the size of the Text
143    void StoryModeHUD::setTextSize(float size)
144    {
145        if (size <= 0.0f)
146        {
147            this->textSize_ = 0.05f;
148            orxout(internal_warning) << "StoryModeHUD: Non positive font size not allowed. Font size has been set to 0.05" << endl;
149            return;
150        }
151        this->textSize_ = size;
152       
153    }
154
155    // returns the Size of the Text
156    float StoryModeHUD::getTextSize() const
157    {
158        return this->textSize_;
159    }
160
161    // Tick: this is the most important function. It's recalled every frame and makes sure things happen on the screen.
162    void StoryModeHUD::tick(float dt)
163    {
164        SUPER(StoryModeHUD, tick, dt);
165
166        if(firstTick)
167            this->initialize();
168
169        // cam is the pointer which represents your camera
170        Camera* cam = CameraManager::getInstance().getActiveCamera();
171        if (cam == nullptr)
172            return;
173
174        // camTransform is a Matrix, which converts 3D world of the game into 2D on your screen
175        const Matrix4& camTransform = cam->getOgreCamera()->getProjectionMatrix() * cam->getOgreCamera()->getViewMatrix();
176
177        int i = 0;
178        for(StoryModePlanet* planet : ObjectList<StoryModePlanet>()){
179
180            // Transform to screen coordinates
181            Vector3 pos = camTransform * planet->getWorldPosition();
182
183            // If you fly passed the description, it gets out of sight
184            if (!(pos.z > 1.0)){
185                   
186                // Position text
187                texts[i]->setLeft((pos.x+1)/2); // The (0,0) Coordinate is in the upper left corner.
188                texts[i]->setTop((-pos.y+1)/2);  // With those two calculations we set the desired positions
189
190                // Make sure the overlays are shown
191                texts[i]->show();
192            }
193            i++;
194
195        }
196    }
197}
Note: See TracBrowser for help on using the repository browser.