- Timestamp:
- May 4, 2010, 10:44:13 PM (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
code/trunk/src/modules/objects/triggers/DistanceMultiTrigger.cc
r6807 r6857 27 27 */ 28 28 29 /** 30 @file DistanceMultiTrigger.cc 31 @brief Implementation of the DistanceMultiTrigger class. 32 */ 33 29 34 #include "DistanceMultiTrigger.h" 30 35 … … 36 41 37 42 CreateFactory(DistanceMultiTrigger); 38 43 44 /** 45 @brief 46 Default Constructor. Registers the object and initializes default values. 47 */ 39 48 DistanceMultiTrigger::DistanceMultiTrigger(BaseObject* creator) : MultiTrigger(creator) 40 49 { … … 43 52 this->distance_ = 100.0f; 44 53 } 45 54 55 /** 56 @brief 57 Destructor. 58 */ 46 59 DistanceMultiTrigger::~DistanceMultiTrigger() 47 60 { 48 61 49 62 } 50 63 64 /** 65 @brief 66 Method for creating a DistanceMultiTrigger object through XML. 67 */ 51 68 void DistanceMultiTrigger::XMLPort(Element& xmlelement, XMLPort::Mode mode) 52 69 { 53 70 SUPER(DistanceMultiTrigger, XMLPort, xmlelement, mode); 54 71 55 XMLPortParam(DistanceMultiTrigger, "distance", setDistance, getDistance, xmlelement, mode) .defaultValues(100.0f);72 XMLPortParam(DistanceMultiTrigger, "distance", setDistance, getDistance, xmlelement, mode); 56 73 } 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 */ 58 81 std::queue<MultiTriggerState*>* DistanceMultiTrigger::letTrigger(void) 59 82 { 60 ClassTreeMask targetMask = this->getTargetMask();61 83 ClassTreeMask& targetMask = this->getTargetMask(); 84 62 85 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 63 112 // Check for new objects that are in range 64 113 for(ClassTreeMaskObjectIterator it = targetMask.begin(); it != targetMask.end(); ++it) … … 69 118 70 119 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_) 72 122 { 123 // Add the object to the objects that are in range. 73 124 if(!this->addToRange(entity)) 74 125 continue; 75 126 127 // If no queue has been created, yet. 76 128 if(queue == NULL) 77 {78 129 queue = new std::queue<MultiTriggerState*>(); 79 } 130 131 // Create a state and append it to the queue. 80 132 MultiTriggerState* state = new MultiTriggerState; 81 133 state->bTriggered = true; … … 85 137 } 86 138 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 else106 ++it;107 }108 109 139 return queue; 110 140 }
Note: See TracChangeset
for help on using the changeset viewer.