Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Ignore:
Timestamp:
Oct 30, 2010, 1:54:49 PM (14 years ago)
Author:
dafrick
Message:

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.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • code/trunk/src/modules/objects/triggers/MultiTrigger.cc

    r7301 r7601  
    3030    @file MultiTrigger.cc
    3131    @brief Implementation of the MultiTrigger class.
     32    @ingroup MultiTrigger
    3233*/
    3334
     
    4142namespace orxonox
    4243{
    43 
    44     // Initialization of some static (magic) variables.
    45     /*static*/ const int MultiTrigger::INF_s = -1;
    46     /*static*/ const std::string MultiTrigger::and_s = "and";
    47     /*static*/ const std::string MultiTrigger::or_s = "or";
    48     /*static*/ const std::string MultiTrigger::xor_s = "xor";
    4944
    5045    CreateFactory(MultiTrigger);
     
    5651        The creator.
    5752    */
    58     MultiTrigger::MultiTrigger(BaseObject* creator) : StaticEntity(creator)
     53    MultiTrigger::MultiTrigger(BaseObject* creator) : TriggerBase(creator)
    5954    {
    6055        RegisterObject(MultiTrigger);
    6156
    62         this->bFirstTick_ = true;
    63 
    64         this->delay_ = 0.0f;
    65         this->bSwitch_ = false;
    66         this->bStayActive_ = false;
    67 
    68         this->remainingActivations_ = INF_s;
    6957        this->maxNumSimultaneousTriggerers_ = INF_s;
    7058
    71         this->bInvertMode_ = false;
    72         this->mode_ = MultiTriggerMode::EventTriggerAND;
    73 
    7459        this->bBroadcast_ = false;
    7560
    76         this->parentTrigger_ = NULL;
    77 
    7861        this->targetMask_.exclude(Class(BaseObject));
     62
     63        this->bMultiTrigger_ = true;
    7964
    8065        this->setSyncMode(0x0);
     
    10590        SUPER(MultiTrigger, XMLPort, xmlelement, mode);
    10691
    107         XMLPortParam(MultiTrigger, "delay", setDelay, getDelay, xmlelement, mode);
    108         XMLPortParam(MultiTrigger, "switch", setSwitch, getSwitch, xmlelement, mode);
    109         XMLPortParam(MultiTrigger, "stayactive", setStayActive, getStayActive, xmlelement, mode);
    110         XMLPortParam(MultiTrigger, "activations", setActivations, getActivations, xmlelement, mode);
    11192        XMLPortParam(MultiTrigger, "simultaneousTriggerers", setSimultaneousTriggerers, getSimultaneousTriggerers, xmlelement, mode);
    112         XMLPortParam(MultiTrigger, "invert", setInvert, getInvert, xmlelement, mode);
    113         XMLPortParamTemplate(MultiTrigger, "mode", setMode, getModeString, xmlelement, mode, const std::string&);
    11493        XMLPortParam(MultiTrigger, "broadcast", setBroadcast, getBroadcast, xmlelement, mode);
    11594        XMLPortParamLoadOnly(MultiTrigger, "target", addTargets, xmlelement, mode).defaultValues("Pawn"); //TODO: Remove load only
    11695
    117         XMLPortObject(MultiTrigger, MultiTrigger, "", addTrigger, getTrigger, xmlelement, mode);
    118 
    11996        COUT(4) << "MultiTrigger '" << this->getName() << "' (&" << this << ") created." << std::endl;
    12097    }
     
    124101    @brief
    125102        A method that is executed each tick.
     103        Most of the magic of MultiTriggers happens here.
    126104    @param dt
    127105        The duration of the last tick.
    128106    */
     107    //TODO: Segment into some helper methods?
    129108    void MultiTrigger::tick(float dt)
    130109    {
     
    159138
    160139                // The new triggered state dependent on the requested state, the mode and the invert-mode.
    161                 bool bTriggered = (state->bTriggered & this->isModeTriggered(state->originator)) ^ this->bInvertMode_;
     140                bool bTriggered = (state->bTriggered & this->isModeTriggered(state->originator)) ^ this->getInvert();
    162141
    163142                // If the 'triggered' state has changed or the MultiTrigger has delay and thus we don't know whether this state will actually change the 'triggered' state, a new state is added to the state queue.
    164                 if(this->delay_ > 0.0f || bTriggered ^ this->isTriggered(state->originator))
     143                if(this->getDelay() > 0.0f || bTriggered ^ this->isTriggered(state->originator))
    165144                {
    166145                    state->bTriggered = bTriggered;
     
    192171                {
    193172                    // If the maximum number of objects simultaneously triggering this MultiTrigger is not exceeded.
    194                     if(this->maxNumSimultaneousTriggerers_ == INF_s || this->triggered_.size() < (unsigned int)this->maxNumSimultaneousTriggerers_)
     173                    if(this->getSimultaneousTriggerers() == TriggerBase::INF_s || this->triggered_.size() < (unsigned int)this->getSimultaneousTriggerers())
    195174                    {
    196175                        bool bStateChanged = false;
     
    211190                        bool bActive;
    212191                        // If the MultiTrigger is in switch mode the 'active'-state only changes of the state changed to triggered.
    213                         if(this->bSwitch_ && !state->bTriggered)
     192                        if(this->getSwitch() && !state->bTriggered)
    214193                            bActive = this->isActive(state->originator);
    215194                        else
     
    239218                            {
    240219                                // If the MultiTrigger doesn't stay active or hasn't' exceeded its remaining activations.
    241                                 if(!this->bStayActive_ || this->remainingActivations_ > 0)
     220                                if(!this->getStayActive() || this->remainingActivations_ > 0)
    242221                                    this->active_.erase(state->originator);
    243222                                else
     
    249228                            {
    250229                                // If the MultiTrigger is set to broadcast and has no originator a boradcast is fired.
    251                                 if(this->bBroadcast_ && state->originator == NULL)
     230                                if(this->getBroadcast() && state->originator == NULL)
    252231                                    this->broadcast(bActive);
    253232                                // Else a normal event is fired.
     
    267246                                COUT(4) << "MultiTrigger '" << this->getName() << "' (&" << this << ") changed state. originator: NULL, active: " << bActive << ", triggered: " << state->bTriggered << "." << std::endl;
    268247
    269                             // If the MultiTrigger has a parent trigger it needs to call a method to notify him, that its activity has changed.
    270                             if(this->parentTrigger_ != NULL)
    271                                 this->parentTrigger_->subTriggerActivityChanged(state->originator);
     248                            // If the MultiTrigger has a parent trigger, that is itself a MultiTrigger, it needs to call a method to notify him, that its activity has changed.
     249                            if(this->parent_ != NULL && this->parent_->isMultiTrigger())
     250                                static_cast<MultiTrigger*>(this->parent_)->childActivityChanged(state->originator);
    272251                        }
    273252
     
    302281        Returns true if the MultiTrigger is active, false if not.
    303282    */
    304     bool MultiTrigger::isActive(BaseObject* triggerer)
    305     {
    306         std::set<BaseObject*>::iterator it = this->active_.find(triggerer);
     283    bool MultiTrigger::isActive(BaseObject* triggerer) const
     284    {
     285        std::set<BaseObject*>::const_iterator it = this->active_.find(triggerer);
    307286        if(it == this->active_.end())
    308287            return false;
    309288        return true;
    310     }
    311 
    312     /**
    313     @brief
    314         Set the mode of the MultiTrigger.
    315     @param modeName
    316         The name of the mode as a string.
    317     */
    318     void MultiTrigger::setMode(const std::string& modeName)
    319     {
    320         if (modeName == MultiTrigger::and_s)
    321             this->setMode(MultiTriggerMode::EventTriggerAND);
    322         else if (modeName == MultiTrigger::or_s)
    323             this->setMode(MultiTriggerMode::EventTriggerOR);
    324         else if (modeName == MultiTrigger::xor_s)
    325             this->setMode(MultiTriggerMode::EventTriggerXOR);
    326         else
    327             COUT(2) << "Invalid mode '" << modeName << "' in MultiTrigger " << this->getName() << " &(" << this << "). Leaving mode at '" << this->getModeString() << "'." << std::endl;
    328     }
    329 
    330     /**
    331     @brief
    332         Get the mode of the MultiTrigger.
    333     @return
    334         Returns the mode as a string.
    335     */
    336     const std::string& MultiTrigger::getModeString() const
    337     {
    338         if (this->mode_ == MultiTriggerMode::EventTriggerAND)
    339             return MultiTrigger::and_s;
    340         else if (this->mode_ == MultiTriggerMode::EventTriggerOR)
    341             return MultiTrigger::or_s;
    342         else if (this->mode_ == MultiTriggerMode::EventTriggerXOR)
    343             return MultiTrigger::xor_s;
    344         else // This can never happen, but the compiler needs it to feel secure.
    345             return MultiTrigger::and_s;
    346289    }
    347290
     
    397340    /**
    398341    @brief
    399         Adds a MultiTrigger as a sub-trigger to the trigger.
    400         Beware: Loops are not prevented and potentially very bad, so just don't create any loops.
    401     @param trigger
    402         The MultiTrigger to be added.
    403     */
    404     void MultiTrigger::addTrigger(MultiTrigger* trigger)
    405     {
    406         if (this != trigger && trigger != NULL)
    407             this->subTriggers_.insert(trigger);
    408         trigger->addParentTrigger(this);
    409     }
    410 
    411     /**
    412     @brief
    413         Get the sub-trigger of this MultiTrigger at the given index.
    414     @param index
    415         The index.
    416     @return
    417         Returns a pointer ot the MultiTrigger. NULL if no such trigger exists.
    418     */
    419     const MultiTrigger* MultiTrigger::getTrigger(unsigned int index) const
    420     {
    421         // If the index is greater than the number of sub-triggers.
    422         if (this->subTriggers_.size() <= index)
    423             return NULL;
    424 
    425         std::set<MultiTrigger*>::const_iterator it;
    426         it = this->subTriggers_.begin();
    427 
    428         for (unsigned int i = 0; i != index; ++i)
    429             ++it;
    430 
    431         return (*it);
    432     }
    433 
    434     /**
    435     @brief
    436342        This method is called by the MultiTrigger to get information about new trigger events that need to be looked at.
    437343        This method is the device for the behavior (the conditions under which the MultiTrigger triggers) of any derived class of MultiTrigger.
     
    456362    {
    457363        MultiTriggerState* state = new MultiTriggerState;
    458         state->bTriggered = (!this->isTriggered(originator) & this->isModeTriggered(originator)) ^ this->bInvertMode_;
     364        state->bTriggered = (!this->isTriggered(originator) & this->isModeTriggered(originator)) ^ this->getInvert();
    459365        state->originator = originator;
    460366        this->addState(state);
     
    463369    /**
    464370    @brief
    465         This method is called by any sub-trigger to advertise changes in its state to its parent-trigger.
     371        This method is called by any child to advertise changes in its state to its parent.
    466372    @param originator
    467373        The object that caused the change in activity.
    468374    */
    469     void MultiTrigger::subTriggerActivityChanged(BaseObject* originator)
     375    void MultiTrigger::childActivityChanged(BaseObject* originator)
    470376    {
    471377        MultiTriggerState* state = new MultiTriggerState;
    472         state->bTriggered = (this->isTriggered(originator) & this->isModeTriggered(originator)) ^ this->bInvertMode_;
     378        state->bTriggered = (this->isTriggered(originator) & this->isModeTriggered(originator)) ^ this->getInvert();
    473379        state->originator = originator;
    474380        this->addState(state);
     
    477383    /**
    478384    @brief
    479         Checks whether the sub-triggers are in such a way that, according to the mode of the MultiTrigger, the MultiTrigger is triggered (only considering the sub-triggers, not the state of MultiTrigger itself), for a given object.
    480         To make an example: When the mode is 'and', then this would be true or a given object if all the sub-triggers were triggered for the given object.
     385        Checks whether the children are in such a way that, according to the mode of the MultiTrigger, the MultiTrigger is triggered (only considering the children, not the state of MultiTrigger itself), for a given object.
     386        To make an example: When the mode is <em>and</em>, then this would be true or a given object if all the children were triggered for the given object.
    481387    @param triggerer
    482388        The object.
    483389    @return
    484         Returns true if the MultiTrigger is triggered concerning it's sub-triggers.
     390        Returns true if the MultiTrigger is triggered concerning it's children.
    485391    */
    486392    bool MultiTrigger::isModeTriggered(BaseObject* triggerer)
    487393    {
    488         if(this->subTriggers_.size() != 0)
    489         {
    490             bool returnVal = false;
     394        if(this->children_.size() != 0)
     395        {
     396            bool triggered = false;
    491397
    492398            switch(this->mode_)
    493399            {
    494                 case MultiTriggerMode::EventTriggerAND:
    495                     returnVal = checkAnd(triggerer);
     400                case TriggerMode::EventTriggerAND:
     401                    triggered = checkAnd(triggerer);
    496402                    break;
    497                 case MultiTriggerMode::EventTriggerOR:
    498                     returnVal = checkOr(triggerer);
     403                case TriggerMode::EventTriggerOR:
     404                    triggered = checkOr(triggerer);
    499405                    break;
    500                 case MultiTriggerMode::EventTriggerXOR:
    501                     returnVal = checkXor(triggerer);
     406                case TriggerMode::EventTriggerXOR:
     407                    triggered = checkXor(triggerer);
    502408                    break;
    503409                default: // This will never happen.
    504                     returnVal = false;
     410                    triggered = false;
    505411                    break;
    506412            }
    507413
    508             return returnVal;
     414            return triggered;
    509415        }
    510416
     
    585491
    586492        // Add it ot the state queue with the delay specified for the MultiTrigger.
    587         this->stateQueue_.push_back(std::pair<float, MultiTriggerState*>(this->delay_, state));
     493        this->stateQueue_.push_back(std::pair<float, MultiTriggerState*>(this->getDelay(), state));
    588494
    589495        return true;
     
    592498    /**
    593499    @brief
    594         Checks whether the sub-triggers amount to true for the 'and' mode for a given object.
     500        Checks whether the children amount to true for the <em>and</em> mode for a given object.
    595501    @param triggerer
    596502        The object.
     
    600506    bool MultiTrigger::checkAnd(BaseObject* triggerer)
    601507    {
    602         for(std::set<MultiTrigger*>::iterator it = this->subTriggers_.begin(); it != this->subTriggers_.end(); ++it)
    603         {
    604             if(!(*it)->isActive(triggerer))
    605                 return false;
     508        for(std::set<TriggerBase*>::iterator it = this->children_.begin(); it != this->children_.end(); ++it)
     509        {
     510            TriggerBase* trigger = *it;
     511            if(trigger->isMultiTrigger())
     512            {
     513                if(!static_cast<MultiTrigger*>(trigger)->isActive(triggerer))
     514                    return false;
     515            }
     516            else
     517            {
     518                if(!trigger->isActive())
     519                    return false;
     520            }
    606521        }
    607522        return true;
     
    610525    /**
    611526    @brief
    612         Checks whether the sub-triggers amount to true for the 'or' mode for a given object.
     527        Checks whether the children amount to true for the <em>or</em> mode for a given object.
    613528    @param triggerer
    614529        The object.
     
    618533    bool MultiTrigger::checkOr(BaseObject* triggerer)
    619534    {
    620         for(std::set<MultiTrigger*>::iterator it = this->subTriggers_.begin(); it != this->subTriggers_.end(); ++it)
    621         {
    622             if((*it)->isActive(triggerer))
    623                 return true;
     535        for(std::set<TriggerBase*>::iterator it = this->children_.begin(); it != this->children_.end(); ++it)
     536        {
     537            TriggerBase* trigger = *it;
     538            if(trigger->isMultiTrigger())
     539            {
     540                if(static_cast<MultiTrigger*>(trigger)->isActive(triggerer))
     541                    return true;
     542            }
     543            else
     544            {
     545                if(trigger->isActive())
     546                    return true;
     547            }
    624548        }
    625549        return false;
     
    628552    /**
    629553    @brief
    630         Checks whether the sub-triggers amount to true for the 'xor' mode for a given object.
     554        Checks whether the children amount to true for the <em>xor</em> mode for a given object.
    631555    @param triggerer
    632556        The object.
     
    636560    bool MultiTrigger::checkXor(BaseObject* triggerer)
    637561    {
    638         bool test = false;
    639         for(std::set<MultiTrigger*>::iterator it = this->subTriggers_.begin(); it != this->subTriggers_.end(); ++it)
    640         {
    641             if(test && (*it)->isActive(triggerer))
    642                 return false;
    643 
    644             if((*it)->isActive(triggerer))
    645                 test = true;
    646         }
    647         return test;
     562        bool triggered = false;
     563        for(std::set<TriggerBase*>::iterator it = this->children_.begin(); it != this->children_.end(); ++it)
     564        {
     565            TriggerBase* trigger = *it;
     566            if(triggered)
     567            {
     568                if(trigger->isMultiTrigger())
     569                {
     570                    if(static_cast<MultiTrigger*>(trigger)->isActive(triggerer))
     571                        return false;
     572                }
     573                else
     574                {
     575                    if(trigger->isActive())
     576                        return false;
     577                }
     578            }
     579
     580            if(trigger->isMultiTrigger())
     581            {
     582                if(static_cast<MultiTrigger*>(trigger)->isActive(triggerer))
     583                    triggered = true;
     584            }
     585            else
     586            {
     587                if(trigger->isActive())
     588                    triggered = true;
     589            }
     590        }
     591        return triggered;
    648592    }
    649593
Note: See TracChangeset for help on using the changeset viewer.