Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Ignore:
Timestamp:
May 4, 2010, 10:44:13 PM (14 years ago)
Author:
dafrick
Message:

Documented and simplified DistanceMultiTrigger.

File:
1 edited

Legend:

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

    r6807 r6857  
    2727*/
    2828
     29/**
     30    @file DistanceMultiTrigger.cc
     31    @brief Implementation of the DistanceMultiTrigger class.
     32*/
     33
    2934#include "DistanceMultiTrigger.h"
    3035
     
    3641   
    3742    CreateFactory(DistanceMultiTrigger);
    38    
     43
     44    /**
     45    @brief
     46        Default Constructor. Registers the object and initializes default values.
     47    */
    3948    DistanceMultiTrigger::DistanceMultiTrigger(BaseObject* creator) : MultiTrigger(creator)
    4049    {
     
    4352        this->distance_ = 100.0f;
    4453    }
    45    
     54
     55    /**
     56    @brief
     57        Destructor.
     58    */
    4659    DistanceMultiTrigger::~DistanceMultiTrigger()
    4760    {
    4861       
    4962    }
    50    
     63
     64    /**
     65    @brief
     66        Method for creating a DistanceMultiTrigger object through XML.
     67    */
    5168    void DistanceMultiTrigger::XMLPort(Element& xmlelement, XMLPort::Mode mode)
    5269    {
    5370        SUPER(DistanceMultiTrigger, XMLPort, xmlelement, mode);
    5471
    55         XMLPortParam(DistanceMultiTrigger, "distance", setDistance, getDistance, xmlelement, mode).defaultValues(100.0f);
     72        XMLPortParam(DistanceMultiTrigger, "distance", setDistance, getDistance, xmlelement, mode);
    5673    }
    57    
     74
     75    /**
     76    @brief
     77        This method is called by the MultiTrigger to get information about new trigger events that need to be looked at.
     78
     79        In this implementation we iterate through all possible objects and check whether the fact that they are in range or not has changed and fire and hand a state ofer to the MultiTrigger if so.
     80    */
    5881    std::queue<MultiTriggerState*>* DistanceMultiTrigger::letTrigger(void)
    5982    {
    60         ClassTreeMask targetMask = this->getTargetMask();
    61        
     83        ClassTreeMask& targetMask = this->getTargetMask();
     84
    6285        std::queue<MultiTriggerState*>* queue = NULL;
     86
     87        // Check for objects that were in range but no longer are. Iterate through all objects, that are in range.
     88        for(std::set<WorldEntity*>::iterator it = this->range_.begin(); it != this->range_.end(); )
     89        {
     90            Vector3 distanceVec = (*it)->getWorldPosition() - this->getWorldPosition();
     91            // If the object is no longer in range.
     92            if (distanceVec.length() > this->distance_)
     93            {
     94                WorldEntity* temp = *(it++);
     95                if(!this->removeFromRange(temp))
     96                    continue;
     97
     98                // If no queue has been created, yet.
     99                if(queue == NULL)
     100                    queue = new std::queue<MultiTriggerState*>();
     101
     102                // Create a state and append it to the queue.
     103                MultiTriggerState* state = new MultiTriggerState;
     104                state->bTriggered = false;
     105                state->originator = temp;
     106                queue->push(state);
     107            }
     108            else
     109                ++it;
     110        }
     111
    63112        // Check for new objects that are in range
    64113        for(ClassTreeMaskObjectIterator it = targetMask.begin(); it != targetMask.end(); ++it)
     
    69118
    70119            Vector3 distanceVec = entity->getWorldPosition() - this->getWorldPosition();
    71             if (distanceVec.length() < this->distance_)
     120            // If the object is in range.
     121            if (distanceVec.length() <= this->distance_)
    72122            {
     123                // Add the object to the objects that are in range.
    73124                if(!this->addToRange(entity))
    74125                    continue;
    75                
     126
     127                // If no queue has been created, yet.
    76128                if(queue == NULL)
    77                 {
    78129                    queue = new std::queue<MultiTriggerState*>();
    79                 }
     130
     131                // Create a state and append it to the queue.
    80132                MultiTriggerState* state = new MultiTriggerState;
    81133                state->bTriggered = true;
     
    85137        }
    86138       
    87         for(std::set<WorldEntity*>::iterator it = this->range_.begin(); it != this->range_.end(); )
    88         {
    89             Vector3 distanceVec = (*it)->getWorldPosition() - this->getWorldPosition();
    90             if (distanceVec.length() >= this->distance_)
    91             {
    92                 WorldEntity* temp = *(it++);
    93                 if(!this->removeFromRange(temp))
    94                     continue;
    95                
    96                 if(queue == NULL)
    97                 {
    98                     queue = new std::queue<MultiTriggerState*>();
    99                 }
    100                 MultiTriggerState* state = new MultiTriggerState;
    101                 state->bTriggered = false;
    102                 state->originator = temp;
    103                 queue->push(state);
    104             }
    105             else
    106                 ++it;
    107         }
    108        
    109139        return queue;
    110140    }
Note: See TracChangeset for help on using the changeset viewer.