Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/trunk/src/orxonox/overlays/OrxonoxOverlay.h @ 2890

Last change on this file since 2890 was 2890, checked in by landauf, 15 years ago
  • Added overlay element for the Pong Gametype
  • Changed the type of the overlay's owner to BaseObject (former ControllableEntity) to allow other classes to own an overlay (for example a Gametype)
  • OverlayGroup does now use a std::set instead of a std::map to store it's overlay elements. Therefore a name is not anymore compulsory for an overlay element.
  • Property svn:eol-style set to native
File size: 9.4 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 *      Reto Grieder
24 *   Co-authors:
25 *      ...
26 *
27 */
28
29/**
30@file
31@brief Declaration of the OrxonoxOverlay class.
32*/
33
34#ifndef _OrxonoxOverlay_H__
35#define _OrxonoxOverlay_H__
36
37#include "OrxonoxPrereqs.h"
38
39#include <OgrePrerequisites.h>
40#include "tools/WindowEventListener.h"
41#include "util/Math.h"
42#include "core/BaseObject.h"
43
44namespace orxonox
45{
46    /**
47    @brief
48        Base class to display content directly onto the screen.
49        This is merely a wrapper of the Ogre::Overlay to implement more features and integrate it
50        in our class hierarchy for xml loading and config values.
51        The mentioned features are:
52        - Automatic positioning depending on the scale and the rotation angle.
53          You can specify a "pick point" relative to the overlay itself. This point will always be exactly
54          at the position (position_) of the overlay. That allows for margin/corner aligment.
55          It even works when a rotation angle is applied.
56        - Virtual methods for changedVisibilty() (BaseObject), angleChanged(), sizeCorrectionChanged(),
57          sizeChanged() and positionChanged(), that can be overridden by any derivative. This enables for
58          custom configurability of the size, position and rotation attributes. For intance, the HUDNavigation
59          should behave differently to sizeChanged() than a standard overlay.
60        - Console commands for scale, rotate and scroll (accessed by name)
61        - Standard Ogre::PanelOverlayElement for a background image (class doesn't have to be derived
62          only for displaying a picture).
63        - Reacts to changes of the window aspect
64        - Last but not least: On demand you can tell the overlay to automatically resale to correct for
65          aspect distortion. E.g. if you play 1024x768 you wouldn't want a round object to be oval.
66          Remark: This can (due to the Ogre::Overlay transformation order) only work for angle that are
67                  multiples of 90 degrees. But it's only a small drawback.
68    */
69    class _OrxonoxExport OrxonoxOverlay : public BaseObject, public WindowEventListener
70    {
71    public:
72        /**
73        @brief
74            Describes the rotational state of a an overlay.
75            Horizontal means 0/180 degrees, Vertical is 90/270 degrees
76            and Inbetween is everything else.
77        */
78        enum RotationState
79        {
80            Horizontal,
81            Vertical,
82            Inbetween
83        };
84
85    public:
86        OrxonoxOverlay(BaseObject* creator);
87        virtual ~OrxonoxOverlay();
88
89        virtual void XMLPort(Element& xmlElement, XMLPort::Mode mode);
90
91        virtual void changedName();
92
93        //! Shows the overlay with an detour to BaseObject::visibility_
94        void show() { this->setVisible(true); }
95        //! Hides the overlay with an detour to BaseObject::visibility_
96        void hide() { this->setVisible(false); }
97
98        /** Sets whether the aspect of the overlay is corrected.
99            This is for instance useful for round objects that should stay round no matter
100            what the screen resolution is. */
101        void setAspectCorrection(bool val)        { this->bCorrectAspect_ = val; this->sizeCorrectionChanged(); }
102        //! Returns whether the window aspect is corrected
103        bool getAspectCorrection() const          { return this->bCorrectAspect_; }
104
105        //! Sets the position of this overlay on the screen.
106        void setPosition(Vector2 pos)             { this->position_ = pos; this->positionChanged(); }
107
108        //! Returns the current position on the screen.
109        const Vector2& getPosition() const        { return this->position_; }
110
111        //! Scrolls the overlay. @param offset The offset given.
112        void scroll(const Vector2& offset)        { this->position_ += offset; this->positionChanged(); }
113
114        /** Sets the point in the overlay where to pick it when translating.
115            For instance setting it to (1.0,1.0) means that the lower right corner of the
116            overlay will be put at position_.
117            This primarily helps aligning an overlay to any corner/margin on the screen. */
118        void setPickPoint(const Vector2& position){ this->pickPoint_ = position; this->positionChanged(); }
119
120        //! Gets the pick point of this overlay. @see setPickPoint()
121        const Vector2& getPickPoint() const       { return this->pickPoint_; }
122
123        //! Sets the rotation angle applied to this overlay in degrees.
124        void setRotation(const Degree& angle)     { this->angle_ = angle; this->angleChanged(); }
125
126        //! Gets the rotation angle applied to this overlay in degrees.
127        const Degree& getRotation() const         { return this->angle_; }
128
129        //! Rotates the overlay by angle degrees.
130        void rotate(const Degree& angle)          { this->angle_ += angle; this->angleChanged(); }
131
132        //! Sets the size of this overlay.
133        void setSize(const Vector2& size)         { this->size_ = size; this->sizeChanged(); }
134
135        //! Gets the current size that was set (uncorrected)
136        const Vector2& getSize() const                   { return this->size_; }
137
138        //! Gets the actual size of the overlay on the screen (corrected)
139        Vector2 getActualSize() const      { return this->size_ * this->sizeCorrection_; }
140
141        //! Gets the current size correction (default: 1.0, 1.0)
142        const Vector2& getSizeCorrection() const  { return this->sizeCorrection_; }
143
144        //! Scales the overlay by scale.
145        void scale(const Vector2& scale)          { this->size_ *= scale; this->sizeChanged(); }
146
147        //! ConsoleCommand: Accesses the overlay by its name and scales it.
148        static void scaleOverlay(const std::string& name, float scale);
149        //! ConsoleCommand: Accesses the overlay by its name and scrolls it.
150        static void scrollOverlay(const std::string& name, const Vector2& scroll);
151        //! ConsoleCommand: Accesses the overlay by its name and rotates it.
152        static void rotateOverlay(const std::string& name, const Degree& angle);
153
154        virtual void changedVisibility();
155
156        inline void setOwner(BaseObject* owner)
157        {
158            if (this->owner_ != owner)
159            {
160                this->owner_ = owner;
161                this->changedOwner();
162            }
163        }
164        inline BaseObject* getOwner() const
165            { return this->owner_; }
166        virtual void changedOwner() {}
167
168        inline void setOverlayGroup(OverlayGroup* group)
169        {
170            if (group != this->group_)
171            {
172                this->group_ = group;
173                this->changedOverlayGroup();
174            }
175        }
176        inline OverlayGroup* getOverlayGroup() const
177            { return this->group_; }
178        virtual void changedOverlayGroup() {}
179
180    protected:
181        virtual void angleChanged();
182        virtual void sizeCorrectionChanged();
183        virtual void sizeChanged();
184        virtual void positionChanged();
185
186        void setBackgroundMaterial(const std::string& material);
187        const std::string& getBackgroundMaterial() const;
188
189        Ogre::Overlay* overlay_;                   //!< The overlay the entire class is about.
190        Ogre::PanelOverlayElement* background_;    //!< Background image (blank per default).
191
192        float windowAspectRatio_;                  //!< Screen.width / screen.height
193        bool bCorrectAspect_;                      //!< Whether or not to correct the size. @see setAspectCorrection()
194        Vector2 size_;                             //!< Internal size of the overlay.
195        Vector2 sizeCorrection_;                   //!< Value to correct the size because of the window aspect.
196        Vector2 position_;                         //!< Position of the pickPoint on the screen.
197        Vector2 pickPoint_;                        //!< Point on the overlay to pick when translating
198        Degree angle_;                             //!< Rotation angle of the overlay
199        RotationState rotState_;             //!< horizontal, vertical or inbetween
200
201    private:
202        void windowResized(int newWidth, int newHeight);
203
204        static unsigned int hudOverlayCounter_s;   //!< Static counter for hud elements
205        /** Contains all the overlays in a map for quick access via console commands.
206            We could also use the ObjectList, but that doesn't guarantee XMLPort(.) was called and is slower. */
207        static std::map<std::string, OrxonoxOverlay*> overlays_s;
208        BaseObject* owner_;
209        OverlayGroup* group_;
210  };
211
212  SUPER_FUNCTION(7, OrxonoxOverlay, changedOwner, false);
213  SUPER_FUNCTION(8, OrxonoxOverlay, changedOverlayGroup, false);
214}
215
216#endif /* _OrxonoxOverlay_H__ */
Note: See TracBrowser for help on using the repository browser.