Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/trunk/src/modules/objects/triggers/Trigger.cc @ 7601

Last change on this file since 7601 was 7601, checked in by dafrick, 14 years ago

Adding all classes in modules/objects to Objects module (in doxygen).
Created TriggerBase which is the base class of Trigger and MultiTrigger and now provides the shared functionality and data.
Updated some of the documentation in MultiTrigger and Script.

  • Property svn:eol-style set to native
File size: 7.0 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 *      Benjamin Knecht
24 *   Co-authors:
25 *      ...
26 *
27 */
28
29/**
30    @file Trigger.cc
31    @brief Implementation of the Trigger class.
32    @ingroup NormalTrigger
33*/
34
35#include "Trigger.h"
36
37#include "core/CoreIncludes.h"
38#include "core/GameMode.h"
39#include "core/XMLPort.h"
40#include "core/command/ConsoleCommand.h"
41#include "Scene.h"
42
43namespace orxonox
44{
45
46  SetConsoleCommand("Trigger", "debugFlares", &Trigger::debugFlares).defaultValues(false);
47
48  CreateFactory(Trigger);
49
50  Trigger::Trigger(BaseObject* creator) : TriggerBase(creator)
51  {
52    RegisterObject(Trigger);
53
54    this->bActive_ = false;
55    this->bTriggered_ = false;
56    this->latestState_ = 0x0;
57
58    this->remainingTime_ = 0.0f;
59    this->timeSinceLastEvent_ = 0.0f;
60
61//    this->bUpdating_ = false;
62
63    if (this->getScene() && GameMode::showsGraphics())
64    {
65      this->debugBillboard_.setBillboardSet(this->getScene()->getSceneManager(), "Examples/Flare", ColourValue(1.0, 0.0, 0.0), 1);
66      this->debugBillboard_.setVisible(false);
67
68      if (this->debugBillboard_.getBillboardSet())
69          this->attachOgreObject(this->debugBillboard_.getBillboardSet());
70    }
71
72    this->setSyncMode(0x0);
73  }
74
75  Trigger::~Trigger()
76  {
77  }
78
79  void Trigger::XMLPort(Element& xmlelement, XMLPort::Mode mode)
80  {
81    SUPER(Trigger, XMLPort, xmlelement, mode);
82  }
83
84  void Trigger::tick(float dt)
85  {
86    if(this->bFirstTick_)
87    {
88      this->bFirstTick_ = false;
89      this->triggered(false);
90    }
91
92    // Check if the object is active (this is NOT Trigger::isActive()!)
93    if (!this->BaseObject::isActive())
94        return;
95
96    SUPER(Trigger, tick, dt);
97
98    bool newTriggered = this->isTriggered() ^ this->getInvert();
99
100    // check if new triggering event is really new
101    if ((this->latestState_ & 0x1) != newTriggered)
102    {
103      // create new state
104      if (newTriggered)
105      {
106        this->latestState_ |= 1; // set trigger bit to 1
107        this->switchState();
108      }
109      else
110      {
111        this->latestState_ &= 0xFE; // set trigger bit to 0
112        if (!this->getSwitch())
113          this->switchState();
114      }
115    }
116
117    if (this->remainingTime_ > 0.0)
118    {
119      this->remainingTime_ -= dt;
120      // only increase when acctually waiting for a state in the queue
121      if (this->timeSinceLastEvent_ >= 0.0)
122        this->timeSinceLastEvent_ += dt;
123    }
124
125    while (this->remainingTime_ <= 0.0 && this->stateChanges_.size() > 0)
126    {
127      // time ran out, change state to new one
128      char newState = this->stateChanges_.front().second;
129      this->bTriggered_ = (newState & 0x1);
130      this->bActive_ = newState & 2;
131      this->triggered(this->bActive_);
132      this->stateChanges_.pop();
133      if (this->stateChanges_.size() != 0)
134        this->remainingTime_ = this->stateChanges_.front().first;
135      else
136        this->timeSinceLastEvent_ = this->getDelay();
137    }
138
139    if (this->bTriggered_ && this->bActive_)
140      this->setBillboardColour(ColourValue(0.5, 1.0, 0.0));
141    else if (!this->bTriggered_ && this->bActive_)
142      this->setBillboardColour(ColourValue(0.0, 1.0, 0.0));
143    else if (this->bTriggered_ && !this->bActive_)
144      this->setBillboardColour(ColourValue(1.0, 0.5, 0.0));
145    else
146      this->setBillboardColour(ColourValue(1.0, 0.0, 0.0));
147  }
148
149  void Trigger::triggered(bool bIsTriggered)
150  {
151    this->fireEvent(bIsTriggered);
152  }
153
154  bool Trigger::isTriggered(TriggerMode::Value mode)
155  {
156//    if (this->bUpdating_)
157//      return this->bTriggered_;
158
159//    this->bUpdating_ = true;
160    if (this->children_.size() != 0)
161    {
162      bool returnval = false;
163
164      switch (mode)
165      {
166        case TriggerMode::EventTriggerAND:
167          returnval = checkAnd();
168          break;
169        case TriggerMode::EventTriggerOR:
170          returnval = checkOr();
171          break;
172        case TriggerMode::EventTriggerXOR:
173          returnval = checkXor();
174          break;
175        default:
176          returnval = false;
177          break;
178      }
179//      this->bUpdating_ = false;
180
181      return returnval;
182    }
183    return true;
184  }
185
186  bool Trigger::checkAnd()
187  {
188    std::set<TriggerBase*>::iterator it;
189    for(it = this->children_.begin(); it != this->children_.end(); ++it)
190    {
191      if (!(*it)->isActive())
192        return false;
193    }
194    return true;
195  }
196
197  bool Trigger::checkOr()
198  {
199    std::set<TriggerBase*>::iterator it;
200    for(it = this->children_.begin(); it != this->children_.end(); ++it)
201    {
202      if ((*it)->isActive())
203        return true;
204    }
205    return false;
206  }
207
208  bool Trigger::checkXor()
209  {
210    std::set<TriggerBase*>::iterator it;
211    bool test = false;
212    for(it = this->children_.begin(); it != this->children_.end(); ++it)
213    {
214      if (test && (*it)->isActive())
215        return false;
216      if ((*it)->isActive())
217        test = true;
218    }
219    return test;
220  }
221
222  bool Trigger::switchState()
223  {
224    if (( (this->latestState_ & 2) && this->getStayActive() && (this->remainingActivations_ <= 0))
225     || (!(this->latestState_ & 2)                          && (this->remainingActivations_ == 0)))
226      return false;
227    else
228    {
229      this->latestState_ ^= 2; // toggle state bit
230
231      // increase activation count
232      if (this->latestState_ & 2 && this->remainingActivations_ > 0)
233        this->remainingActivations_--;
234
235      this->storeState();
236
237      return true;
238    }
239  }
240
241  void Trigger::storeState()
242  {
243    // put state change into queue
244    this->stateChanges_.push(std::pair<float, char>(this->timeSinceLastEvent_, this->latestState_));
245    // reset time since last event
246    this->timeSinceLastEvent_ = 0.0;
247
248    if (this->stateChanges_.size() == 1)
249      this->remainingTime_ = this->stateChanges_.front().first;
250  }
251
252  void Trigger::delayChanged(void)
253  {
254    this->timeSinceLastEvent_ = this->getDelay();
255  }
256
257  void Trigger::debugFlares(bool bVisible)
258  {
259    for (ObjectList<Trigger>::iterator it = ObjectList<Trigger>::begin(); it != ObjectList<Trigger>::end(); ++it)
260      it->setVisible(bVisible);
261  }
262
263  void Trigger::setBillboardColour(const ColourValue& colour)
264  {
265    this->debugBillboard_.setColour(colour);
266  }
267
268  void Trigger::changedVisibility()
269  {
270    SUPER(Trigger, changedVisibility);
271
272    this->debugBillboard_.setVisible(this->isVisible());
273  }
274}
Note: See TracBrowser for help on using the repository browser.