31 #include "util/log/logger.h"
32 #include "util/structures/purge.h"
37 #include "instancetree.h"
41 static Logger _log(LM_STRUCTURES);
46 m_instances_visibility(true),
48 m_instanceTree(new InstanceTree()),
50 m_pathingstrategy(CELL_EDGES_ONLY),
58 delete m_instanceTree;
62 return !m_instances.empty();
66 ExactModelCoordinate emc(static_cast<double>(p.x), static_cast<double>(p.y), static_cast<double>(p.z));
72 location.setLayer(
this);
73 location.setExactLayerCoordinates(p);
77 setInstanceActivityStatus(instance, instance->
isActive());
79 m_instances.push_back(instance);
80 m_instanceTree->addInstance(instance);
82 std::vector<LayerChangeListener*>::iterator i = m_changelisteners.begin();
83 while (i != m_changelisteners.end()) {
84 (*i)->onInstanceCreate(
this, instance);
93 FL_ERR(_log,
"Tried to add an instance to layer, but given instance is invalid");
98 location.setLayer(
this);
99 location.setExactLayerCoordinates(p);
102 m_instances.push_back(instance);
103 m_instanceTree->addInstance(instance);
105 setInstanceActivityStatus(instance, instance->
isActive());
108 std::vector<LayerChangeListener*>::iterator i = m_changelisteners.begin();
109 while (i != m_changelisteners.end()) {
110 (*i)->onInstanceCreate(
this, instance);
118 std::vector<LayerChangeListener*>::iterator i = m_changelisteners.begin();
119 while (i != m_changelisteners.end()) {
120 (*i)->onInstanceDelete(
this, instance);
123 setInstanceActivityStatus(instance,
false);
124 std::vector<Instance*>::iterator it = m_instances.begin();
125 for(; it != m_instances.end(); ++it) {
126 if(*it == instance) {
127 m_instanceTree->removeInstance(*it);
129 m_instances.erase(it);
136 void Layer::setInstanceActivityStatus(
Instance* instance,
bool active) {
138 m_active_instances.insert(instance);
140 m_active_instances.erase(instance);
145 std::vector<Instance*>::iterator it = m_instances.begin();
146 for(; it != m_instances.end(); ++it) {
147 if((*it)->getId() == id)
155 std::vector<Instance*> matching_instances;
156 std::vector<Instance*>::iterator it = m_instances.begin();
157 for(; it != m_instances.end(); ++it) {
158 if((*it)->getId() == id)
159 matching_instances.push_back(*it);
161 return matching_instances;
165 std::vector<Instance*> matching_instances;
166 std::vector<Instance*>::iterator it = m_instances.begin();
168 for(; it != m_instances.end(); ++it) {
169 if (use_exactcoordinates) {
170 if ((*it)->getLocationRef().getExactLayerCoordinatesRef() == loc.getExactLayerCoordinatesRef()) {
171 matching_instances.push_back(*it);
174 if ((*it)->getLocationRef().getLayerCoordinates() == loc.getLayerCoordinates()) {
175 matching_instances.push_back(*it);
180 return matching_instances;
188 bool first_found =
false;
189 for (std::vector<Instance*>::const_iterator i = m_instances.begin(); i != m_instances.end(); ++i) {
191 min = m_instances.front()->getLocationRef().getLayerCoordinates(layer);
195 ModelCoordinate coord = (*i)->getLocationRef().getLayerCoordinates(layer);
197 if(coord.x < min.x) {
201 if(coord.x > max.x) {
205 if(coord.y < min.y) {
209 if(coord.y > max.y) {
221 m_instances_visibility = vis;
225 m_transparency = transparency;
229 return m_transparency;
233 m_instances_visibility = !m_instances_visibility;
237 std::list<Instance*> adjacentInstances;
238 m_instanceTree->findInstances(cellCoordinate, 0, 0, adjacentInstances);
239 bool blockingInstance =
false;
240 for(std::list<Instance*>::const_iterator j = adjacentInstances.begin(); j != adjacentInstances.end(); ++j) {
241 if((*j)->isBlocking() && (*j)->getLocationRef().getLayerCoordinates() == cellCoordinate) {
242 blockingInstance =
true;
245 return blockingInstance;
249 m_changedinstances.clear();
250 std::set<Instance*>::iterator it = m_active_instances.begin();
251 for(; it != m_active_instances.end(); ++it) {
252 if ((*it)->update() != ICHANGE_NO_CHANGES) {
253 m_changedinstances.push_back(*it);
257 if (!m_changedinstances.empty()) {
258 std::vector<LayerChangeListener*>::iterator i = m_changelisteners.begin();
259 while (i != m_changelisteners.end()) {
260 (*i)->onLayerChanged(
this, m_changedinstances);
266 bool retval = m_changed;
272 m_changelisteners.push_back(listener);
276 std::vector<LayerChangeListener*>::iterator i = m_changelisteners.begin();
277 while (i != m_changelisteners.end()) {
278 if ((*i) == listener) {
279 m_changelisteners.erase(i);