[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