FIFE  2008.0
layer.h
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 #ifndef FIFE_LAYER_H
23 #define FIFE_LAYER_H
24 
25 // Standard C++ library includes
26 #include <algorithm>
27 #include <string>
28 #include <vector>
29 #include <set>
30 
31 // 3rd party library includes
32 
33 // FIFE includes
34 // These includes are split up in two parts, separated by one empty line
35 // First block: files included from the FIFE root src directory
36 // Second block: files included from the same folder
37 #include "util/base/fifeclass.h"
38 #include "util/structures/rect.h"
39 #include "model/metamodel/modelcoords.h"
40 #include "model/metamodel/object.h"
41 
42 #include "instance.h"
43 
44 namespace FIFE {
45 
46  class Map;
47  class Selection;
48  class CellGrid;
49  class Object;
50  class InstanceTree;
51 
59  CELL_EDGES_ONLY,
60  CELL_EDGES_AND_DIAGONALS,
61  FREEFORM
62  };
63 
67  public:
68  virtual ~LayerChangeListener() {};
69 
75  virtual void onLayerChanged(Layer* layer, std::vector<Instance*>& changedInstances) = 0;
76 
81  virtual void onInstanceCreate(Layer* layer, Instance* instance) = 0;
82 
88  virtual void onInstanceDelete(Layer* layer, Instance* instance) = 0;
89  };
90 
91 
94  class Layer : public FifeClass {
95  public:
100  Layer(const std::string& identifier, Map* map, CellGrid* grid);
101 
104  ~Layer();
105 
108  const std::string& getId() const { return m_id; }
109 
112  void setId(const std::string& id) { m_id = id; }
113 
116  Map* getMap() const { return m_map; }
117 
121  CellGrid* getCellGrid() const { return m_grid; }
122 
125  void setCellGrid(CellGrid* grid) { m_grid = grid; }
126 
130  InstanceTree* getInstanceTree(void) const { return m_instanceTree; }
131 
135  bool hasInstances() const;
136 
139  Instance* createInstance(Object* object, const ModelCoordinate& p, const std::string& id="");
140 
143  Instance* createInstance(Object* object, const ExactModelCoordinate& p, const std::string& id="");
144 
148  bool addInstance(Instance* instance, const ExactModelCoordinate& p);
149 
152  void deleteInstance(Instance* object);
153 
156  const std::vector<Instance*>& getInstances() const { return m_instances; }
157 
160  std::vector<Instance*> getInstances(const std::string& id);
161 
166  std::vector<Instance*> getInstancesAt(Location& loc, bool use_exactcoordinates=false);
167 
171  std::list<Instance*> getInstancesIn(Rect& rec);
172 
175  Instance* getInstance(const std::string& identifier);
176 
179  void setInstancesVisible(bool vis);
180 
184  void setLayerTransparency(uint8_t transparency);
185 
188  uint8_t getLayerTransparency();
189 
195  void getMinMaxCoordinates(ModelCoordinate& min, ModelCoordinate& max, const Layer* layer = 0) const;
196 
202  bool cellContainsBlockingInstance(const ModelCoordinate& cellCoordinate);
203 
207  void toggleInstancesVisible();
208 
212  bool areInstancesVisible() const { return m_instances_visibility; }
213 
217  bool update();
218 
222  void setPathingStrategy(PathingStrategy strategy) { m_pathingstrategy = strategy; }
223 
227  PathingStrategy getPathingStrategy() const { return m_pathingstrategy; }
228 
232  void addChangeListener(LayerChangeListener* listener);
233 
238 
241  bool isChanged() { return m_changed; }
242 
246  std::vector<Instance*>& getChangedInstances() { return m_changedinstances; }
247 
248  void setInstanceActivityStatus(Instance* instance, bool active);
249 
250  protected:
251  std::string m_id;
252 
253  Map* m_map;
254 
255  bool m_instances_visibility;
256 
257  uint8_t m_transparency;
258 
259  // all the instances on this layer
260  std::vector<Instance*> m_instances;
261 
262  // all the active instances on this layer
263  std::set<Instance*> m_active_instances;
264 
265  //The instance tree
266  InstanceTree* m_instanceTree;
267 
268  // layer's cellgrid
269  CellGrid* m_grid;
270 
271  // pathing strategy for the layer
272  PathingStrategy m_pathingstrategy;
273 
274  // listeners for layer changes
275  std::vector<LayerChangeListener*> m_changelisteners;
276 
277  // holds changed instances after each update
278  std::vector<Instance*> m_changedinstances;
279 
280  // true if layer (or it's instance) information was changed during previous update round
281  bool m_changed;
282  };
283 
284 } // FIFE
285 
286 #endif
void setInstancesVisible(bool vis)
Definition: layer.cpp:225
bool isChanged()
Definition: layer.h:241
std::vector< Instance * > getInstancesAt(Location &loc, bool use_exactcoordinates=false)
Definition: layer.cpp:163
const std::string & getId() const
Definition: layer.h:108
void setId(const std::string &id)
Definition: layer.h:112
void toggleInstancesVisible()
Definition: layer.cpp:237
bool hasInstances() const
Definition: layer.cpp:60
std::list< Instance * > getInstancesIn(Rect &rec)
Definition: layer.cpp:182
const std::vector< Instance * > & getInstances() const
Definition: layer.h:156
Instance * createInstance(Object *object, const ModelCoordinate &p, const std::string &id="")
Definition: layer.cpp:64
Layer(const std::string &identifier, Map *map, CellGrid *grid)
Definition: layer.cpp:42
bool areInstancesVisible() const
Definition: layer.h:212
virtual void onInstanceDelete(Layer *layer, Instance *instance)=0
std::vector< Instance * > & getChangedInstances()
Definition: layer.h:246
void setCellGrid(CellGrid *grid)
Definition: layer.h:125
bool update()
Definition: layer.cpp:254
void setPathingStrategy(PathingStrategy strategy)
Definition: layer.h:222
void getMinMaxCoordinates(ModelCoordinate &min, ModelCoordinate &max, const Layer *layer=0) const
Definition: layer.cpp:190
void removeChangeListener(LayerChangeListener *listener)
Definition: layer.cpp:292
virtual void onLayerChanged(Layer *layer, std::vector< Instance * > &changedInstances)=0
bool addInstance(Instance *instance, const ExactModelCoordinate &p)
Definition: layer.cpp:90
CellGrid * getCellGrid() const
Definition: layer.h:121
Instance * getInstance(const std::string &identifier)
Definition: layer.cpp:143
void addChangeListener(LayerChangeListener *listener)
Definition: layer.cpp:288
void deleteInstance(Instance *object)
Definition: layer.cpp:116
void setLayerTransparency(uint8_t transparency)
Definition: layer.cpp:229
PathingStrategy getPathingStrategy() const
Definition: layer.h:227
PathingStrategy
Definition: layer.h:58
InstanceTree * getInstanceTree(void) const
Definition: layer.h:130
bool cellContainsBlockingInstance(const ModelCoordinate &cellCoordinate)
Definition: layer.cpp:241
Definition: map.h:86
virtual void onInstanceCreate(Layer *layer, Instance *instance)=0
uint8_t getLayerTransparency()
Definition: layer.cpp:233
credit to phoku for his NodeDisplay example which the visitor code is adapted from ( he coded the qua...
Definition: soundclip.cpp:39
Map * getMap() const
Definition: layer.h:116