Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/trunk/src/libraries/core/Event.cc @ 10071

Last change on this file since 10071 was 9667, checked in by landauf, 11 years ago

merged core6 back to trunk

  • Property svn:eol-style set to native
File size: 4.4 KB
RevLine 
[2063]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
[7401]29/**
30    @file
31    @brief Implementation of the classes Event and EventState.
32*/
33
[2063]34#include "Event.h"
[3196]35
[2063]36#include "BaseObject.h"
[9667]37#include "class/Identifier.h"
[2063]38
39namespace orxonox
[2072]40{
[5929]41    /**
42        @brief Processes an event (calls the set-function if the necessary conditions are met).
[6417]43
[5929]44        @param event     The fired event
45        @param object    The object whose state is affected by the event (only needed for debug output)
46    */
47    void EventState::process(const Event& event, BaseObject* object)
[2072]48    {
[5929]49        if (this->bProcessingEvent_)
[2082]50        {
[8858]51            orxout(internal_warning, context::events) << "Detected Event loop in section \"" << event.statename_ << "\" of object \"" << object->getName() << "\" and fired by \"" << event.originator_->getName() << '"' << endl;
[2082]52            return;
53        }
54
[5929]55        this->bProcessingEvent_ = true;
[2082]56
[8858]57        orxout(verbose, context::events) << "Processing event (EventState) : originator: " << event.originator_->getIdentifier()->getName() << " (&" << event.originator_ << "), activate: " << event.activate_ << ", name: " << event.name_ << ", statename: " << event.statename_ << ", object: " << object->getIdentifier()->getName() << " (&" << object << ")" << "." << endl;
[7163]58
[5929]59        // check if the originator is an instance of the requested class
60        if (event.originator_->isA(this->subclass_))
[2063]61        {
[6800]62            // If the EventState doesn't act as an EventSink.
[5929]63            // actualize the activationcounter
[6800]64            if(!this->bSink_)
[2063]65            {
[6800]66                if (event.activate_)
67                    ++this->activeEvents_;
68                else
69                {
70                    --this->activeEvents_;
[2072]71
[6800]72                    if (this->activeEvents_ < 0)
73                        this->activeEvents_ = 0;
74                }
[5929]75            }
[2063]76
[5929]77            if (this->statefunction_->getParamCount() == 0 && event.activate_)
78            {
79                // if the eventfunction doesn't have a state, just call it whenever an activation-event comes in
80                (*this->statefunction_)();
81            }
[6800]82            else if (this->bSink_ || (!this->bSink_ && ((this->activeEvents_ == 1 && event.activate_) || (this->activeEvents_ == 0 && !event.activate_)) ) )
[5929]83            {
84                // if the eventfunction needs a state, we just call the function if the state changed from 0 to 1 (state = true) or from 1 to 0 (state = false) [but not if activeEvents_ is > 1]
85                if (this->statefunction_->getParamCount() == 1)
[2063]86                {
[5929]87                    // one argument: just the eventstate
[6800]88                    (*this->statefunction_)(event.activate_);
[2063]89                }
[5929]90                else if (this->statefunction_->getParamCount() >= 2)
91                {
92                    // two arguments: the eventstate and the originator
93                    if (this->subclass_->isExactlyA(ClassIdentifier<BaseObject>::getIdentifier()))
94                    {
95                        // if the subclass is BaseObject, we don't have to cast the pointer
[6800]96                        (*this->statefunction_)(event.activate_, event.originator_);
[5929]97                    }
98                    else
99                    {
100                        // else cast the pointer to the desired class
[7271]101                        void* castOriginator = event.originator_->getDerivedPointer(this->subclass_->getClassID());
102                        (*this->statefunction_)(event.activate_, castOriginator);
[5929]103                    }
104                }
[2063]105            }
106        }
[2082]107
[5929]108        this->bProcessingEvent_ = false;
[2063]109    }
110}
Note: See TracBrowser for help on using the repository browser.