Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

Last change on this file since 11676 was 11676, checked in by fanconic, 6 years ago

resolved segfault by simply not deleting the newly created textoverlay elements on our own in the destructor of the storymodehud, because they are deleted 'automatically' when the game is quit

File size: 6.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 *   
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#include "controllers/NewHumanController.h"
57
58#include "worldentities/NameableStaticEntity.h"
59
60namespace orxonox
61{
62    RegisterClass ( StoryModeHUD );
63
64    // Constructor of the StoryMode HUD
65    StoryModeHUD::StoryModeHUD(Context* context) : OrxonoxOverlay(context)
66    {
67        RegisterObject(StoryModeHUD);
68    }
69
70    // Destructor of the StoryMode HUD
71    StoryModeHUD::~StoryModeHUD()
72    {}
73
74    // Functions of the StoryMode HUD
75
76    // XML Port for Level construction.
77    void StoryModeHUD::XMLPort(Element& xmlelement, XMLPort::Mode mode)
78    {
79        SUPER(StoryModeHUD, XMLPort, xmlelement, mode);
80
81        XMLPortParam(StoryModeHUD, "font", setFont, getFont, xmlelement, mode);
82        XMLPortParam(StoryModeHUD, "textSize", setTextSize, getTextSize, xmlelement, mode);
83    }
84
85    void StoryModeHUD::initialize(){
86        firstTick = false;
87        // Scales used for dimensions and text size
88        float xScale = this->getActualSize().x;
89        float yScale = this->getActualSize().y;
90
91        //Sets the Camera angle at 30 degrees above it, so levels can be seen better   
92        CameraManager::getInstance().getActiveCamera()->setOrientation(Vector3::UNIT_X, Degree(-30));
93
94        int i = 0;
95        for(NameableStaticEntity* planet : ObjectList<NameableStaticEntity>()){
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            //font name of the text needs to be set here, not in the xml setter function
105            texts[i]->setFontName(this->fontName_);
106            texts[i]->setCharHeight(this->textSize_ * yScale);
107
108            //set text
109            texts[i]->setCaption(planet->getLevelName());
110
111            texts[i]->hide();
112       
113            this->background_->addChild(texts[i]);
114            i++;
115        }
116    }
117
118    // Set the Font of this HUD.
119    void StoryModeHUD::setFont(const std::string& font)
120    {
121        const Ogre::ResourcePtr& fontPtr = Ogre::FontManager::getSingleton().getByName(font);
122        if (fontPtr.isNull())
123        {
124            this->fontName_ = "Monofur";
125            orxout(internal_warning) << "StoryModeHUD: Font '" << font << "' not found. Font has been set to Monofur." << endl;
126            return;
127        }
128        this->fontName_ = font;
129    }
130   
131    // Gets the Font of this HUD   
132    const std::string& StoryModeHUD::getFont() const
133    {
134        return this->fontName_;
135    }
136
137    // Set the size of the Text
138    void StoryModeHUD::setTextSize(float size)
139    {
140        if (size <= 0.0f)
141        {
142            this->textSize_ = 0.05f;
143            orxout(internal_warning) << "StoryModeHUD: Non positive font size not allowed. Font size has been set to 0.05" << endl;
144            return;
145        }
146        this->textSize_ = size;
147       
148    }
149
150    // returns the Size of the Text
151    float StoryModeHUD::getTextSize() const
152    {
153        return this->textSize_;
154    }
155
156    // Tick: this is the most important function. It's recalled every frame and makes sure things happen on the screen.
157    void StoryModeHUD::tick(float dt)
158    {
159        SUPER(StoryModeHUD, tick, dt);
160
161        if(firstTick)
162            this->initialize();
163
164        // cam is the pointer which represents your camera
165        Camera* cam = CameraManager::getInstance().getActiveCamera();
166        if (cam == nullptr)
167            return;
168
169        // camTransform is a Matrix, which converts 3D world of the game into 2D on your screen
170        const Matrix4& camTransform = cam->getOgreCamera()->getProjectionMatrix() * cam->getOgreCamera()->getViewMatrix();
171
172        int i = 0;
173        for(NameableStaticEntity* planet : ObjectList<NameableStaticEntity>()){
174
175            // Transform to screen coordinates
176            Vector3 pos = camTransform * planet->getWorldPosition();
177
178            // If you fly passed the description, it gets out of sight
179            if (!(pos.z > 1.0)){
180                   
181                // Position text
182                texts[i]->setLeft((pos.x+1)/2); // The (0,0) Coordinate is in the upper left corner.
183                texts[i]->setTop((-pos.y+1)/2);  // With those two calculations we set the desired positions
184
185                // Make sure the overlays are shown
186                texts[i]->show();
187            }
188            i++;
189
190        }
191    }
192}
Note: See TracBrowser for help on using the repository browser.