30 #include "util/log/logger.h"
31 #include "util/structures/purge.h"
36 #include "instancetree.h"
40 static Logger _log(LM_STRUCTURES);
45 m_instances_visibility(true),
47 m_instanceTree(new InstanceTree()),
49 m_pathingstrategy(CELL_EDGES_ONLY),
57 delete m_instanceTree;
61 return !m_instances.empty();
65 ExactModelCoordinate emc(static_cast<double>(p.x), static_cast<double>(p.y), static_cast<double>(p.z));
71 location.setLayer(
this);
72 location.setExactLayerCoordinates(p);
76 setInstanceActivityStatus(instance, instance->
isActive());
78 m_instances.push_back(instance);
79 m_instanceTree->addInstance(instance);
81 std::vector<LayerChangeListener*>::iterator i = m_changelisteners.begin();
82 while (i != m_changelisteners.end()) {
83 (*i)->onInstanceCreate(
this, instance);
92 FL_ERR(_log,
"Tried to add an instance to layer, but given instance is invalid");
97 location.setLayer(
this);
98 location.setExactLayerCoordinates(p);
101 m_instances.push_back(instance);
102 m_instanceTree->addInstance(instance);
104 setInstanceActivityStatus(instance, instance->
isActive());
107 std::vector<LayerChangeListener*>::iterator i = m_changelisteners.begin();
108 while (i != m_changelisteners.end()) {
109 (*i)->onInstanceCreate(
this, instance);
117 std::vector<LayerChangeListener*>::iterator i = m_changelisteners.begin();
118 while (i != m_changelisteners.end()) {
119 (*i)->onInstanceDelete(
this, instance);
122 setInstanceActivityStatus(instance,
false);
123 std::vector<Instance*>::iterator it = m_instances.begin();
124 for(; it != m_instances.end(); ++it) {
125 if(*it == instance) {
126 m_instanceTree->removeInstance(*it);
128 m_instances.erase(it);
135 void Layer::setInstanceActivityStatus(
Instance* instance,
bool active) {
137 m_active_instances.insert(instance);
139 m_active_instances.erase(instance);
144 std::vector<Instance*>::iterator it = m_instances.begin();
145 for(; it != m_instances.end(); ++it) {
146 if((*it)->getId() == id)
154 std::vector<Instance*> matching_instances;
155 std::vector<Instance*>::iterator it = m_instances.begin();
156 for(; it != m_instances.end(); ++it) {
157 if((*it)->getId() == id)
158 matching_instances.push_back(*it);
160 return matching_instances;
164 std::vector<Instance*> matching_instances;
165 std::vector<Instance*>::iterator it = m_instances.begin();
167 for(; it != m_instances.end(); ++it) {
168 if (use_exactcoordinates) {
169 if ((*it)->getLocationRef().getExactLayerCoordinatesRef() == loc.getExactLayerCoordinatesRef()) {
170 matching_instances.push_back(*it);
173 if ((*it)->getLocationRef().getLayerCoordinates() == loc.getLayerCoordinates()) {
174 matching_instances.push_back(*it);
179 return matching_instances;
183 std::list<Instance*> matching_instances;
185 m_instanceTree->findInstances(mc, rec.
w, rec.
h, matching_instances);
187 return matching_instances;
195 if (m_instances.empty()) {
199 min = m_instances.front()->getLocationRef().getLayerCoordinates(layer);
202 for (std::vector<Instance*>::const_iterator i = m_instances.begin(); i != m_instances.end(); ++i) {
203 ModelCoordinate coord = (*i)->getLocationRef().getLayerCoordinates(layer);
205 if(coord.x < min.x) {
209 if(coord.x > max.x) {
213 if(coord.y < min.y) {
217 if(coord.y > max.y) {
226 m_instances_visibility = vis;
230 m_transparency = transparency;
234 return m_transparency;
238 m_instances_visibility = !m_instances_visibility;
242 std::list<Instance*> adjacentInstances;
243 m_instanceTree->findInstances(cellCoordinate, 0, 0, adjacentInstances);
244 bool blockingInstance =
false;
245 for(std::list<Instance*>::const_iterator j = adjacentInstances.begin(); j != adjacentInstances.end(); ++j) {
246 if((*j)->isBlocking() && (*j)->getLocationRef().getLayerCoordinates() == cellCoordinate) {
247 blockingInstance =
true;
251 return blockingInstance;
255 m_changedinstances.clear();
256 std::vector<Instance*> inactive_instances;
257 std::set<Instance*>::iterator it = m_active_instances.begin();
258 for(; it != m_active_instances.end(); ++it) {
259 if ((*it)->update() != ICHANGE_NO_CHANGES) {
260 m_changedinstances.push_back(*it);
262 }
else if (!(*it)->isActive()) {
263 inactive_instances.push_back(*it);
266 if (!m_changedinstances.empty()) {
267 std::vector<LayerChangeListener*>::iterator i = m_changelisteners.begin();
268 while (i != m_changelisteners.end()) {
269 (*i)->onLayerChanged(
this, m_changedinstances);
275 if (!inactive_instances.empty()) {
276 std::vector<Instance*>::iterator i = inactive_instances.begin();
277 while (i != inactive_instances.end()) {
278 m_active_instances.erase(*i);
283 bool retval = m_changed;
289 m_changelisteners.push_back(listener);
293 std::vector<LayerChangeListener*>::iterator i = m_changelisteners.begin();
294 while (i != m_changelisteners.end()) {
295 if ((*i) == listener) {
296 m_changelisteners.erase(i);