FIFE  2008.0
searchspace.cpp
1 /***************************************************************************
2  * Copyright (C) 2005-2008 by the FIFE team *
3  * http://www.fifengine.de *
4  * This file is part of FIFE. *
5  * *
6  * FIFE is free software; you can redistribute it and/or *
7  * modify it under the terms of the GNU Lesser General Public *
8  * License as published by the Free Software Foundation; either *
9  * version 2.1 of the License, or (at your option) any later version. *
10  * *
11  * This library is distributed in the hope that it will be useful, *
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of *
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
14  * Lesser General Public License for more details. *
15  * *
16  * You should have received a copy of the GNU Lesser General Public *
17  * License along with this library; if not, write to the *
18  * Free Software Foundation, Inc., *
19  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
20  ***************************************************************************/
21 
22 // Standard C++ library includes
23 #include <limits>
24 
25 // 3rd party library includes
26 
27 // FIFE includes
28 // These includes are split up in two parts, separated by one empty line
29 // First block: files included from the FIFE root src directory
30 // Second block: files included from the same folder
31 #include "model/structures/instance.h"
32 #include "model/structures/layer.h"
33 #include "model/structures/map.h"
34 
35 #include "searchspace.h"
36 
37 namespace FIFE {
38 
39  SearchSpace::SearchSpace(Layer* layer)
40  : m_upperX(0), m_upperY(0), m_lowerX(0), m_lowerY(0), m_layer(layer) {
41 
42  Map* map = layer->getMap();
43  const std::list<Layer*>& layers = map->getLayers();
44  ModelCoordinate min, max;
45 
46  for(std::list<Layer*>::const_iterator i = layers.begin();
47  i != layers.end();
48  ++i) {
49 
50  ModelCoordinate newMin, newMax;
51  (*i)->getMinMaxCoordinates(newMin, newMax, layer);
52 
53  if(newMin.x < min.x) {
54  min.x = newMin.x;
55  }
56 
57  if(newMax.x > max.x) {
58  max.x = newMax.x;
59  }
60 
61  if(newMin.y < min.y) {
62  min.y = newMin.y;
63  }
64 
65  if(newMax.y > max.y) {
66  max.y = newMax.y;
67  }
68  }
69 
70  m_upperX = max.x;
71  m_upperY = max.y;
72  m_lowerX = min.x;
73  m_lowerY = min.y;
74  }
75 
76  bool SearchSpace::isInSearchSpace(const Location& location) const {
77  if(location.getLayer() != m_layer) {
78  return false;
79  }
80  ModelCoordinate coordinates = location.getLayerCoordinates();
81  if(coordinates.x >= m_lowerX && coordinates.x <= m_upperX
82  && coordinates.y >= m_lowerY && coordinates.y <= m_upperY) {
83  return true;
84  }
85  return false;
86  }
87 
88  ModelCoordinate SearchSpace::translateCoordsToSearchSpace(const ModelCoordinate& coords) const {
89  ModelCoordinate newcoords;
90  newcoords.x = coords.x - m_lowerX;
91  newcoords.y = coords.y - m_lowerY;
92  return newcoords;
93  }
94 
95  int32_t SearchSpace::convertCoordToInt(const ModelCoordinate& coord) const {
96  ModelCoordinate newcoords = translateCoordsToSearchSpace(coord);
97  return newcoords.x + (newcoords.y * getWidth());
98  }
99 
100  ModelCoordinate SearchSpace::convertIntToCoord(const int32_t cell) const {
101  ModelCoordinate coord;
102  int32_t width = getWidth();
103  coord.x = (cell % width) + m_lowerX;
104  coord.y = (cell / width) + m_lowerY;
105  return coord;
106  }
107 
108  int32_t SearchSpace::getMaxIndex() const {
109 
110  //max index = w * h.
111  int32_t max_index = getWidth() + (getWidth() * getHeight());
112  return max_index;
113  }
114 }
credit to phoku for his NodeDisplay example which the visitor code is adapted from ( he coded the qua...
Definition: soundclip.cpp:39