[Orxonox-commit 2143] r6859 - in code/trunk/src: libraries/core modules/objects/triggers modules/questsystem

dafrick at orxonox.net dafrick at orxonox.net
Thu May 6 14:56:40 CEST 2010


Author: dafrick
Date: 2010-05-06 14:56:39 +0200 (Thu, 06 May 2010)
New Revision: 6859

Modified:
   code/trunk/src/libraries/core/Event.cc
   code/trunk/src/modules/objects/triggers/MultiTrigger.cc
   code/trunk/src/modules/objects/triggers/MultiTrigger.h
   code/trunk/src/modules/objects/triggers/MultiTriggerContainer.cc
   code/trunk/src/modules/questsystem/QuestEffectBeacon.cc
Log:
Resolved a bug in MultiTriggerContainer that caused the MultiTriggerContainer not to be identified as a BaseObject. Also some performance optimization in MultiTrigger.


Modified: code/trunk/src/libraries/core/Event.cc
===================================================================
--- code/trunk/src/libraries/core/Event.cc	2010-05-06 11:11:43 UTC (rev 6858)
+++ code/trunk/src/libraries/core/Event.cc	2010-05-06 12:56:39 UTC (rev 6859)
@@ -58,7 +58,7 @@
 
         this->bProcessingEvent_ = true;
 
-        COUT(4) << "Processing event (EventState) : originator: " << event.originator_->getIdentifier()->getName() << " (&" << event.originator_ << "), activate: " << event.activate_ << ", name: " << event.name_ << ", statename: " << event.statename_ << ", object: " << object->getIdentifier()->getName() << " (&" << object << ")" << ", subclass: " << this->subclass_->getName() << ", (?): " << event.originator_->isA(this->subclass_) << "." << std::endl;
+        COUT(4) << "Processing event (EventState) : originator: " << event.originator_->getIdentifier()->getName() << " (&" << event.originator_ << "), activate: " << event.activate_ << ", name: " << event.name_ << ", statename: " << event.statename_ << ", object: " << object->getIdentifier()->getName() << " (&" << object << ")" << "." << std::endl;
         
         // check if the originator is an instance of the requested class
         if (event.originator_->isA(this->subclass_))

Modified: code/trunk/src/modules/objects/triggers/MultiTrigger.cc
===================================================================
--- code/trunk/src/modules/objects/triggers/MultiTrigger.cc	2010-05-06 11:11:43 UTC (rev 6858)
+++ code/trunk/src/modules/objects/triggers/MultiTrigger.cc	2010-05-06 12:56:39 UTC (rev 6859)
@@ -70,6 +70,8 @@
 
         this->bInvertMode_ = false;
         this->mode_ = MultiTriggerMode::EventTriggerAND;
+
+        this->parentTrigger_ = NULL;
         
         this->targetMask_.exclude(Class(BaseObject));
 
@@ -164,7 +166,10 @@
                     this->addState(state);
                 }
                 else
+                {
+                    COUT(1) << "BUH" << std::endl;
                     delete state;
+                }
                 
                 queue->pop();
             }
@@ -258,7 +263,11 @@
 
                         // Print some debug output if the state has changed.
                         if(bStateChanged)
+                        {
                             COUT(4) << "MultiTrigger '" << this->getName() << "' (&" << this << ") changed state. originator: " << state->originator->getIdentifier()->getName() << " (&" << state->originator << "), active: " << bActive << ", triggered: " << state->bTriggered << "." << std::endl;
+                            if(this->parentTrigger_ != NULL)
+                                this->parentTrigger_->activityChanged(state->originator);
+                        }
 
                         // If the MultiTrigger has exceeded its amount of activations and it doesn't stay active, it has to be destroyed,
                         if(this->remainingActivations_ == 0 && !bActive)
@@ -385,6 +394,7 @@
     {
         if (this != trigger && trigger != NULL)
             this->subTriggers_.insert(trigger);
+        trigger->addParentTrigger(this);
     }
 
     /**
@@ -422,42 +432,16 @@
     */
     std::queue<MultiTriggerState*>* MultiTrigger::letTrigger(void)
     {
-        // Goes through all sub-triggers and gets the objects triggering them.
-        std::set<BaseObject*>* triggerers = new std::set<BaseObject*>();
-        std::set<BaseObject*>::iterator objIt;
-        for(std::set<MultiTrigger*>::iterator it = this->subTriggers_.begin(); it != this->subTriggers_.end(); it ++)
-        {
-            std::set<BaseObject*> set = (*it)->getActive();
-            for(objIt = set.begin(); objIt != set.end(); objIt++)
-            {
-                triggerers->insert(*objIt);
-            }
-        }
-
-        // Goes through all the triggerers of this trigger.
-        for(objIt = this->active_.begin(); objIt != this->active_.end(); objIt++)
-        {
-            triggerers->insert(*objIt);
-        }
-
-        // If no objects are triggering this MultiTrigger or the sub-triggers.
-        if(triggerers->size() == 0)
-            return NULL;
-
-        // Create a state for each object triggering this MultiTrigger or any of the sub-triggers and append it to the queue.
-        std::queue<MultiTriggerState*>* queue = new std::queue<MultiTriggerState*>();
-        MultiTriggerState* state = NULL;
-        for(std::set<BaseObject*>::iterator it = triggerers->begin(); it != triggerers->end(); it++)
-        {
-            state = new MultiTriggerState;
-            state->bTriggered = true;
-            state->originator = *it;
-            queue->push(state);
-        }
-        delete triggerers;
-
-        return queue;
+        return NULL;
     }
+    
+    void MultiTrigger::activityChanged(BaseObject* originator)
+    {
+        MultiTriggerState* state = new MultiTriggerState;
+        state->bTriggered = (this->isTriggered(originator) & this->isModeTriggered(originator)) ^ this->bInvertMode_;
+        state->originator = originator;
+        this->addState(state);
+    }
 
     /**
     @brief

Modified: code/trunk/src/modules/objects/triggers/MultiTrigger.h
===================================================================
--- code/trunk/src/modules/objects/triggers/MultiTrigger.h	2010-05-06 11:11:43 UTC (rev 6858)
+++ code/trunk/src/modules/objects/triggers/MultiTrigger.h	2010-05-06 12:56:39 UTC (rev 6859)
@@ -206,6 +206,8 @@
             
         protected:
             virtual std::queue<MultiTriggerState*>* letTrigger(void); //!< This method is called by the MultiTrigger to get information about new trigger events that need to be looked at.
+
+            void activityChanged(BaseObject* originator);
             
             bool isModeTriggered(BaseObject* triggerer = NULL); //!< Checks whetherx the MultiTrigger is triggered concerning it's sub-triggers.
             bool isTriggered(BaseObject* triggerer = NULL); //!< Get whether the MultiTrigger is triggered for a given object.
@@ -213,6 +215,13 @@
             void fire(bool status, BaseObject* originator = NULL);  //!< Helper method. Creates an event for the given status and originator and fires it.
 
             /**
+            @brief Adds the parent of a MultiTrigger.
+            @param parent A pointer to the parent MultiTrigger.
+            */
+            inline void addParentTrigger(MultiTrigger* parent)
+                { this->parentTrigger_ = parent; }
+            
+            /**
             @brief Get the target mask used to identify the targets of this MultiTrigger.
             @return Returns the target mask.
             */
@@ -256,6 +265,7 @@
             bool bInvertMode_; //!< Bool for the invert-mode, if true the MultiTrigger is inverted.
             MultiTriggerMode::Value mode_; //!< The mode of the MultiTrigger.
 
+            MultiTrigger* parentTrigger_;
             std::set<MultiTrigger*> subTriggers_; //!< The sub-triggers of this MultiTrigger.
             
             std::set<BaseObject*> active_; //!< The set of all objects the MultiTrigger is active for.

Modified: code/trunk/src/modules/objects/triggers/MultiTriggerContainer.cc
===================================================================
--- code/trunk/src/modules/objects/triggers/MultiTriggerContainer.cc	2010-05-06 11:11:43 UTC (rev 6858)
+++ code/trunk/src/modules/objects/triggers/MultiTriggerContainer.cc	2010-05-06 12:56:39 UTC (rev 6859)
@@ -37,6 +37,8 @@
 
 namespace orxonox
 {
+
+    CreateUnloadableFactory(MultiTriggerContainer);
     
     /**
     @brief

Modified: code/trunk/src/modules/questsystem/QuestEffectBeacon.cc
===================================================================
--- code/trunk/src/modules/questsystem/QuestEffectBeacon.cc	2010-05-06 11:11:43 UTC (rev 6858)
+++ code/trunk/src/modules/questsystem/QuestEffectBeacon.cc	2010-05-06 12:56:39 UTC (rev 6859)
@@ -75,7 +75,7 @@
         XMLPortParam(QuestEffectBeacon, "times", setTimes, getTimes, xmlelement, mode);
         XMLPortObject(QuestEffectBeacon, QuestEffect, "effects", addEffect, getEffect, xmlelement, mode);
 
-        XMLPortEventState(QuestEffectBeacon, BaseObject, "execute", execute, xmlelement, mode); //TODO: Change BaseObject to MultiTrigger as soon as MultiTrigger is the base of all triggers.
+        XMLPortEventSink(QuestEffectBeacon, BaseObject, "execute", execute, xmlelement, mode); //TODO: Change BaseObject to MultiTrigger as soon as MultiTrigger is the base of all triggers.
 
         COUT(3) << "New QuestEffectBeacon created." << std::endl;
     }




More information about the Orxonox-commit mailing list