Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/core5/src/libraries/core/BaseObject.h @ 5829

Last change on this file since 5829 was 5829, checked in by landauf, 15 years ago

replaced most occurrences of setObject(o) in combination with createFunctor(f) with the more convenient createFunctor(f, o)

  • Property svn:eol-style set to native
File size: 9.6 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 *      Fabian 'x3n' Landau
24 *   Co-authors:
25 *      ...
26 *
27 */
28
29/**
30    @file
31    @brief Definition of the BaseObject class.
32
33    The BaseObject is the parent of all classes representing an instance in the game.
34*/
35
36#ifndef _BaseObject_H__
37#define _BaseObject_H__
38
39#define SetMainState(classname, statename, setfunction, getfunction) \
40    if (this->getMainStateName() == statename) \
41    { \
42        this->functorSetMainState_ = createFunctor(&classname::setfunction, this); \
43        this->functorGetMainState_ = createFunctor(&classname::getfunction, this); \
44    }
45
46
47#include "CorePrereqs.h"
48
49#include <map>
50#include <list>
51
52#include "util/mbool.h"
53#include "OrxonoxClass.h"
54#include "Super.h"
55#include "SmartPtr.h"
56
57namespace orxonox
58{
59    class Scene;
60    class Gametype;
61
62    //! The BaseObject is the parent of all classes representing an instance in the game.
63    class _CoreExport BaseObject : virtual public OrxonoxClass
64    {
65        template <class T> friend class XMLPortClassParamContainer;
66
67        public:
68            BaseObject(BaseObject* creator);
69            virtual ~BaseObject();
70            virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode);
71
72            /** @brief Returns if the object was initialized (passed the object registration). @return True was the object is initialized */
73            inline bool isInitialized() const { return this->bInitialized_; }
74
75            /** @brief Sets the name of the object. @param name The name */
76            inline void setName(const std::string& name) { this->oldName_ = this->name_; this->name_ = name; this->changedName(); }
77            /** @brief Returns the name of the object. */
78            inline const std::string& getName() const { return this->name_; }
79            /** @brief Returns the old name of the object. */
80            inline const std::string& getOldName() const { return this->oldName_; }
81            /** @brief This function gets called if the name of the object changes. */
82            virtual void changedName() {}
83
84            /** @brief Sets the state of the objects activity. @param bActive True = active */
85            inline void setActive(bool bActive)
86            {
87                if (this->bActive_ != bActive)
88                {
89                    this->bActive_ = bActive;
90                    this->changedActivity();
91                }
92            }
93            /** @brief Returns the state of the objects activity. @return The state of the activity */
94            inline const mbool& isActive() const { return this->bActive_; }
95            /** @brief This function gets called if the activity of the object changes. */
96            virtual void changedActivity() {}
97
98            /** @brief Sets the state of the objects visibility. @param bVisible True = visible */
99            inline void setVisible(bool bVisible)
100            {
101                if (this->bVisible_ != bVisible)
102                {
103                    this->bVisible_ = bVisible;
104                    this->changedVisibility();
105                }
106            }
107            /** @brief Returns the state of the objects visibility. @return The state of the visibility */
108            inline const mbool& isVisible() const { return this->bVisible_; }
109            /** @brief This function gets called if the visibility of the object changes. */
110            virtual void changedVisibility() {}
111
112            void setMainState(bool state);
113            bool getMainState() const;
114
115            void setMainStateName(const std::string& name);
116            inline const std::string& getMainStateName() const { return this->mainStateName_; }
117            virtual void changedMainState();
118
119            /** @brief Sets a pointer to the xml file that loaded this object. @param file The pointer to the XMLFile */
120            inline void setFile(const XMLFile* file) { this->file_ = file; }
121            /** @brief Returns a pointer to the XMLFile that loaded this object. @return The XMLFile */
122            inline const XMLFile* getFile() const { return this->file_; }
123            const std::string& getFilename() const;
124
125            void addTemplate(const std::string& name);
126            void addTemplate(Template* temp);
127            /** @brief Returns the set of all aplied templates. */
128            inline const std::set<Template*>& getTemplates() const
129                { return this->templates_; }
130
131            virtual inline void setNamespace(Namespace* ns) { this->namespace_ = ns; }
132            inline Namespace* getNamespace() const { return this->namespace_; }
133
134            inline void setCreator(BaseObject* creator) { this->creator_ = creator; }
135            inline BaseObject* getCreator() const { return this->creator_; }
136
137            inline void setScene(const SmartPtr<Scene>& scene) { this->scene_ = scene; }
138            inline const SmartPtr<Scene>& getScene() const { return this->scene_; }
139
140            inline void setGametype(const SmartPtr<Gametype>& gametype)
141            {
142                if (gametype != this->gametype_)
143                {
144                    this->oldGametype_ = this->gametype_;
145                    this->gametype_ = gametype;
146                    this->changedGametype();
147                }
148            }
149            inline const SmartPtr<Gametype>& getGametype() const { return this->gametype_; }
150            inline Gametype* getOldGametype() const { return this->oldGametype_; }
151            virtual void changedGametype() {}
152
153            void fireEvent();
154            void fireEvent(bool activate);
155            void fireEvent(bool activate, BaseObject* originator);
156            void fireEvent(Event& event);
157
158            virtual void processEvent(Event& event);
159
160            inline void registerEventListener(BaseObject* object, const std::string& sectionname)
161                { this->eventListeners_[object] = sectionname; }
162            inline void unregisterEventListener(BaseObject* object)
163                { this->eventListeners_.erase(object); }
164
165            void addEvent(BaseObject* event, const std::string& sectionname);
166            void removeEvent(BaseObject* event);
167            BaseObject* getEvent(unsigned int index) const;
168
169            void addEventContainer(const std::string& sectionname, EventContainer* container);
170            EventContainer* getEventContainer(const std::string& sectionname) const;
171
172            /** @brief Sets the indentation of the debug output in the Loader. @param indentation The indentation */
173            inline void setLoaderIndentation(const std::string& indentation) { this->loaderIndentation_ = indentation; }
174            /** @brief Returns the indentation of the debug output in the Loader. @return The indentation */
175            inline const std::string& getLoaderIndentation() const { return this->loaderIndentation_; }
176
177        protected:
178            std::string name_;                                 //!< The name of the object
179            std::string oldName_;                              //!< The old name of the object
180            mbool       bActive_;                              //!< True = the object is active
181            mbool       bVisible_;                             //!< True = the object is visible
182            std::string mainStateName_;
183            Functor*    functorSetMainState_;
184            Functor*    functorGetMainState_;
185
186        private:
187            void setXMLName(const std::string& name);
188            Template* getTemplate(unsigned int index) const;
189
190            bool                   bInitialized_;              //!< True if the object was initialized (passed the object registration)
191            const XMLFile*         file_;                      //!< The XMLFile that loaded this object
192            Element*               lastLoadedXMLElement_;      //!< Non 0 if the TinyXML attributes have already been copied to our own lowercase map
193            std::map<std::string, std::string> xmlAttributes_; //!< Lowercase XML attributes
194            std::string            loaderIndentation_;         //!< Indentation of the debug output in the Loader
195            Namespace*             namespace_;
196            BaseObject*            creator_;
197            SmartPtr<Scene>        scene_;
198            SmartPtr<Gametype>     gametype_;
199            Gametype*              oldGametype_;
200            std::set<Template*>    templates_;
201            std::map<BaseObject*,  std::string> eventListeners_;
202            std::list<BaseObject*> events_;
203            std::map<std::string, EventContainer*> eventContainers_;
204    };
205
206    SUPER_FUNCTION(0, BaseObject, XMLPort, false);
207    SUPER_FUNCTION(2, BaseObject, changedActivity, false);
208    SUPER_FUNCTION(3, BaseObject, changedVisibility, false);
209    SUPER_FUNCTION(4, BaseObject, processEvent, false);
210    SUPER_FUNCTION(6, BaseObject, changedMainState, false);
211    SUPER_FUNCTION(9, BaseObject, changedName, false);
212    SUPER_FUNCTION(10, BaseObject, changedGametype, false);
213}
214
215#endif /* _BaseObject_H__ */
Note: See TracBrowser for help on using the repository browser.