Mercurial > fife-parpg
diff engine/core/model/structures/layer.h @ 0:4a0efb7baf70
* Datasets becomes the new trunk and retires after that :-)
author | mvbarracuda@33b003aa-7bff-0310-803a-e67f0ece8222 |
---|---|
date | Sun, 29 Jun 2008 18:44:17 +0000 |
parents | |
children | 112fc4af772d |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/engine/core/model/structures/layer.h Sun Jun 29 18:44:17 2008 +0000 @@ -0,0 +1,240 @@ +/*************************************************************************** + * Copyright (C) 2005-2008 by the FIFE team * + * http://www.fifengine.de * + * This file is part of FIFE. * + * * + * FIFE is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * + ***************************************************************************/ + +#ifndef FIFE_LAYER_H +#define FIFE_LAYER_H + +// Standard C++ library includes +#include <algorithm> +#include <string> +#include <vector> + +// 3rd party library includes + +// FIFE includes +// These includes are split up in two parts, separated by one empty line +// First block: files included from the FIFE root src directory +// Second block: files included from the same folder +#include "util/base/resourceclass.h" +#include "model/metamodel/modelcoords.h" +#include "model/metamodel/object.h" + +#include "instance.h" + +namespace FIFE { + + class Map; + class Selection; + class CellGrid; + class Object; + class InstanceTree; + + /** Defines how pathing can be performed on this layer + * + * CELL_EDGES_ONLY allows pather to use only cell edges when moving instances from cell to cell on map + * CELL_EDGES_AND_DIAGONALS allows pather to use both cell edges and diagonals when moving instances from cell to cell on map + * FREEFORM allows pather to find shortest route regardless of cellgrid used on the layer + */ + enum PathingStrategy { + CELL_EDGES_ONLY, + CELL_EDGES_AND_DIAGONALS, + FREEFORM + }; + + /** Listener interface for changes happening on a layer + */ + class LayerChangeListener { + public: + virtual ~LayerChangeListener() {}; + + /** Called when some instance is changed on layer. @see InstanceChangeType + * @param layer where change occurred + * @param changedInstances list of instances containing some changes + * @note Does not report creations and deletions + */ + virtual void onLayerChanged(Layer* layer, std::vector<Instance*>& changedInstances) = 0; + + /** Called when some instance gets created on layer + * @param layer where change occurred + * @param instance which got created + */ + virtual void onInstanceCreate(Layer* layer, Instance* instance) = 0; + + /** Called when some instance gets deleted on layer + * @param layer where change occurred + * @param instance which will be deleted + * @note right after this call, instance actually gets deleted! + */ + virtual void onInstanceDelete(Layer* layer, Instance* instance) = 0; + }; + + + /** A basic layer on a map + */ + class Layer : public ResourceClass { + public: + /** Constructor + * Layers are created by calling addLayer from map, thus + * this method should really be called only by elevation or test code + */ + Layer(const std::string& identifier, Map* map, CellGrid* grid); + + /** Destructs a Layer instance + */ + ~Layer(); + + /** Get the id of this layer. + */ + const std::string& getId() { return m_id; } + + /** Get the map this layer is contained in + */ + Map* getMap() const { return m_map; } + + /** Get the Cellgrid as set in the constructor + * @return a valid cellgrid + */ + CellGrid* getCellGrid() const { return m_grid; } + + /** Get the instance tree. + * @return this layers instance tree. + */ + InstanceTree* getInstanceTree(void) const { return m_instanceTree; } + + /** Check existance of objects on this layer + * @return True, if objects exist. + */ + bool hasInstances() const; + + /** Add an instance of an object at a specific position + */ + Instance* createInstance(Object* object, const ModelCoordinate& p, const std::string& id=""); + + /** Add an instance of an object at a specific position + */ + Instance* createInstance(Object* object, const ExactModelCoordinate& p, const std::string& id=""); + + /** Remove an instance from the layer + */ + void deleteInstance(Instance* object); + + /** Get the list of instances on this layer + */ + const std::vector<Instance*>& getInstances() const { return m_instances; } + + /** Get the instance on this layer with the given identifier. + */ + Instance* getInstance(const std::string& id); + + /** Set object visibility + */ + void setInstancesVisible(bool vis); + + /** Retrieves the minimum/maximum coordinates of instances on the layer. + * @param min A reference to a ModelCoordinate that will hold the minimum coordinate. + * @param max A reference to a ModelCoordinate that will hold the maximum coordinate. + * @param layer A pointer to another layer that can be used to cast coordinates bettween layers. + */ + void getMinMaxCoordinates(ModelCoordinate& min, ModelCoordinate& max, const Layer* layer = 0) const; + + /** Determines if a given cell on the layer contains a blocking instance + * + * @param cellCoordinate A const reference to a model coordinate of the cell in question. + * @return A boolean, true if it is blocked false otherwise. + */ + bool cellContainsBlockingInstance(const ModelCoordinate& cellCoordinate); + + /** Toggle object visibility + * @see setObjectsVisible + */ + void toggleInstancesVisible(); + + /** Check object visibility + * @see setObjectsVisible + */ + bool areInstancesVisible() const { return m_instances_visibility; } + + /** Called periodically to update events on layer + * @returns true if layer was changed since the last update, false otherwise + */ + bool update(); + + /** Sets pathing strategy for the layer + * @see PathingStrategy + */ + void setPathingStrategy(PathingStrategy strategy) { m_pathingstrategy = strategy; } + + /** Gets pathing strategy for the layer + * @see PathingStrategy + */ + PathingStrategy getPathingStrategy() const { return m_pathingstrategy; } + + /** Adds new change listener + * @param listener to add + */ + void addChangeListener(LayerChangeListener* listener); + + /** Removes associated change listener + * @param listener to remove + */ + void removeChangeListener(LayerChangeListener* listener); + + /** Returns true, if layer information was changed during previous update round + */ + bool isChanged() { return m_changed; } + + /** Returns instances that were changed during previous update round. + * @note does not contain created or deleted instances + */ + std::vector<Instance*>& getChangedInstances() { return m_changedinstances; } + + protected: + std::string m_id; + + Map* m_map; + + bool m_instances_visibility; + + // all the instances on this layer + std::vector<Instance*> m_instances; + + //The instance tree + InstanceTree* m_instanceTree; + + // layer's cellgrid + CellGrid* m_grid; + + // pathing strategy for the layer + PathingStrategy m_pathingstrategy; + + // listeners for layer changes + std::vector<LayerChangeListener*> m_changelisteners; + + // holds changed instances after each update + std::vector<Instance*> m_changedinstances; + + // true if layer (or it's instance) information was changed during previous update round + bool m_changed; + }; + +} // FIFE + +#endif