diff engine/core/model/metamodel/grids/cellgrid.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/metamodel/grids/cellgrid.h	Sun Jun 29 18:44:17 2008 +0000
@@ -0,0 +1,195 @@
+/***************************************************************************
+ *   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_MODEL_GRIDS_CELLGRID_H
+#define FIFE_MODEL_GRIDS_CELLGRID_H
+
+// Standard C++ library includes
+#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 "model/metamodel/modelcoords.h"
+#include "util/math/matrix.h"
+#include "util/base/fifeclass.h"
+
+namespace FIFE {
+	class CellGrid: public FifeClass {
+	public:
+		/** Constructor
+		 *  @param allow_diagonals if true, cellgrid allows diagonal access
+		 */
+ 		CellGrid(bool allow_diagonals=false);
+
+		/** Destructor
+		 */
+		virtual ~CellGrid();
+
+		/** Gets the coordinates that are accesible from given point
+		 *  only cells adjacent to given cell are considered in the evaluation
+		 *  @param curpos position (coordinates) to evaluate
+		 *  @param coordinate accessible coordinates
+		 */
+		void getAccessibleCoordinates(const ModelCoordinate& curpos, std::vector<ModelCoordinate>& coordinates);
+
+		/** Type of cellgrid
+		 */
+		virtual const std::string& getType() const = 0;
+
+		/** Name of the cellgrid (DEPRECATED? -jwt)
+		 */
+		virtual const std::string& getName() const = 0;
+
+		/** Tells if given target point is accessible from curpos
+		 *  only cells adjacent to curpos are considered in the evaluation
+		 *  @param curpos position (coordinates) to evaluate
+		 *  @param target target coordinate to check
+		 *  @return true, if target is accessible from curpos, false otherwise
+		 */
+		virtual bool isAccessible(const ModelCoordinate& curpos, const ModelCoordinate& target) = 0;
+
+		/** Returns *distance* const from curpos to target point
+		 *  only cells adjacent to curpos are considered in the evaluation
+		 *  @param curpos position (coordinates) to evaluate
+		 *  @param target target coordinate to check
+		 *  @return distance cost from curpos to target
+		 */
+		virtual float getAdjacentCost(const ModelCoordinate& curpos, const ModelCoordinate& target) = 0;
+
+		/** Gets the count of sides for a single cell
+		 *  @return count of sides for a single cell
+		 */
+		virtual unsigned int getCellSideCount() const = 0;
+
+		/** Transforms given point from layer coordinates to map coordinates
+		 *  @return point in map coordinates
+		 */
+		ExactModelCoordinate toMapCoordinates(const ModelCoordinate& layer_coords);
+
+		/** Transforms given point from layer coordinates to map coordinates
+		 *  @return point in map coordinates
+		 */
+		virtual ExactModelCoordinate toMapCoordinates(const ExactModelCoordinate& layer_coords) = 0;
+		
+		/** Transforms given point from map coordinates to layer coordinates
+		 *  @return point in layer coordinates
+		 */
+		virtual ModelCoordinate toLayerCoordinates(const ExactModelCoordinate& map_coord) = 0;
+
+		/** Transforms given point from map coordinates to layer coordinates
+		 *  @return point in layer coordinates
+		 */
+		virtual ExactModelCoordinate toExactLayerCoordinates(const ExactModelCoordinate& map_coord) = 0;
+
+		/** Fills given point vector with vertices from selected cell
+		 *  @param vtx vertices for given cell
+		 *  @param cell cell to get vertices from
+		 */
+		virtual void getVertices(std::vector<ExactModelCoordinate>& vtx, const ModelCoordinate& cell) = 0;
+
+		/** Set the cellgrid x shift 
+		 *  @param shift The shift in map coords
+		 */
+		void setXShift(const double& xshift) { 
+			m_xshift = xshift; 
+			updateMatrices();
+		}
+
+		/** Get the cellgrid x shift 
+		 *  @return The x shift
+		 */
+		const double getXShift() const { return m_xshift; }
+
+		/** Set the cellgrid y shift 
+		 *  @param shift The shift in map coords
+		 */
+		void setYShift(const double yshift) {
+			m_yshift = yshift; 
+			updateMatrices();
+		}
+
+		/** Get the cellgrid x shift 
+		 *  @return The x shift in map coords
+		 */
+		const double getYShift() const { return m_yshift; }
+
+		/** Set the cellgrid x-scaling
+		 *  @param scale The x-scale of cellgrid
+		 */
+		void setXScale(const double scale) { 
+			m_xscale = scale;
+			updateMatrices();
+		}
+
+		/** Set the cellgrid y-scaling
+		 *  @param scale The y-scale of cellgrid
+		 */
+		void setYScale(const double scale) { 
+			m_yscale = scale;
+			updateMatrices();
+		}
+		
+		/** Get the cellgrid x-scaling
+		 *  @return The x-scale of cellgrid
+		 */
+		const double getXScale() const { return m_xscale; }
+
+		/** Get the cellgrid y-scaling
+		 *  @return The y-scale of cellgrid
+		 */
+		const double getYScale() const { return m_yscale; }
+		
+		/** Set the cellgrid rotation
+		 *  @param rotation The rotation of the cellgrid
+		 */
+		void setRotation(const double rotation) { 
+			m_rotation = rotation; 
+			updateMatrices();
+		}
+
+		/** Get the cellgrid rotation
+		 *  @return rotation The rotation of the cellgrid
+		 */
+		const double getRotation() const { return m_rotation; }
+
+	protected:
+		void updateMatrices();
+		bool ptInTriangle(const ExactModelCoordinate& pt, const ExactModelCoordinate& pt1, const ExactModelCoordinate& pt2, const ExactModelCoordinate& pt3);
+
+		DoubleMatrix m_matrix;
+		DoubleMatrix m_inverse_matrix;
+		double m_xshift;
+		double m_yshift;
+		double m_xscale;
+		double m_yscale;
+		double m_rotation;
+		bool m_allow_diagonals;
+		
+	private:
+		int orientation(const ExactModelCoordinate& pt, const ExactModelCoordinate& pt1, const ExactModelCoordinate& pt2);	
+	};
+}
+
+#endif