Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

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

some cleanup in the eventsystem. not sure if everything still works, but there are more changes to come.

  • Property svn:eol-style set to native
File size: 10.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 *      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, uint32_t sceneID) { this->scene_ = scene; this->sceneID_=sceneID; }
138            inline const SmartPtr<Scene>& getScene() const { return this->scene_; }
139            inline virtual uint32_t getSceneID() const { return this->sceneID_; }
140
141            inline void setGametype(const SmartPtr<Gametype>& gametype)
142            {
143                if (gametype != this->gametype_)
144                {
145                    this->oldGametype_ = this->gametype_;
146                    this->gametype_ = gametype;
147                    this->changedGametype();
148                }
149            }
150            inline const SmartPtr<Gametype>& getGametype() const { return this->gametype_; }
151            inline Gametype* getOldGametype() const { return this->oldGametype_; }
152            virtual void changedGametype() {}
153
154            void addEventSource(BaseObject* source, const std::string& state);
155            void removeEventSource(BaseObject* source);
156            BaseObject* getEventSource(unsigned int index, const std::string& state) const;
157
158            void fireEvent();
159            void fireEvent(bool activate);
160            void fireEvent(bool activate, BaseObject* originator);
161            void fireEvent(Event& event);
162
163            virtual void processEvent(Event& event);
164
165            /** @brief Sets the indentation of the debug output in the Loader. @param indentation The indentation */
166            inline void setLoaderIndentation(const std::string& indentation) { this->loaderIndentation_ = indentation; }
167            /** @brief Returns the indentation of the debug output in the Loader. @return The indentation */
168            inline const std::string& getLoaderIndentation() const { return this->loaderIndentation_; }
169
170        protected:
171            /** @brief Adds an object which listens to the events of this object. */
172            inline void registerEventListener(BaseObject* object)
173                { this->eventListeners_.insert(object); }
174            /** @brief Removes an event listener from this object. */
175            inline void unregisterEventListener(BaseObject* object)
176                { this->eventListeners_.erase(object); }
177
178            void addEventContainer(const std::string& sectionname, EventContainer* container);
179            EventContainer* getEventContainer(const std::string& sectionname) const;
180
181            std::string name_;                                 //!< The name of the object
182            std::string oldName_;                              //!< The old name of the object
183            mbool       bActive_;                              //!< True = the object is active
184            mbool       bVisible_;                             //!< True = the object is visible
185            std::string mainStateName_;
186            Functor*    functorSetMainState_;
187            Functor*    functorGetMainState_;
188
189        private:
190            void setXMLName(const std::string& name);
191            Template* getTemplate(unsigned int index) const;
192
193            bool                   bInitialized_;              //!< True if the object was initialized (passed the object registration)
194            const XMLFile*         file_;                      //!< The XMLFile that loaded this object
195            Element*               lastLoadedXMLElement_;      //!< Non 0 if the TinyXML attributes have already been copied to our own lowercase map
196            std::map<std::string, std::string> xmlAttributes_; //!< Lowercase XML attributes
197            std::string            loaderIndentation_;         //!< Indentation of the debug output in the Loader
198            Namespace*             namespace_;
199            BaseObject*            creator_;
200            SmartPtr<Scene>        scene_;
201            uint32_t               sceneID_;
202            SmartPtr<Gametype>     gametype_;
203            Gametype*              oldGametype_;
204            std::set<Template*>    templates_;
205           
206            std::map<BaseObject*, std::string>      eventSources_;      //!< List of objects which send events to this object, mapped to the state which they affect
207            std::set<BaseObject*>                   eventListeners_;    //!< List of objects which listen to the events of this object
208            std::map<std::string, EventContainer*>  eventContainers_;
209    };
210
211    SUPER_FUNCTION(0, BaseObject, XMLPort, false);
212    SUPER_FUNCTION(2, BaseObject, changedActivity, false);
213    SUPER_FUNCTION(3, BaseObject, changedVisibility, false);
214    SUPER_FUNCTION(4, BaseObject, processEvent, false);
215    SUPER_FUNCTION(6, BaseObject, changedMainState, false);
216    SUPER_FUNCTION(9, BaseObject, changedName, false);
217    SUPER_FUNCTION(10, BaseObject, changedGametype, false);
218}
219
220#endif /* _BaseObject_H__ */
Note: See TracBrowser for help on using the repository browser.