view engine/core/model/metamodel/grids/cellgrid.h @ 621:356634098bd9

* Removed the image chunking size variable from engine settings. * Replaced the existing define of PI and added some math related static const variables
author prock@33b003aa-7bff-0310-803a-e67f0ece8222
date Fri, 01 Oct 2010 14:09:47 +0000
parents 90005975cdbb
children
line wrap: on
line source

/***************************************************************************
 *   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 Lesser General Public            *
 *   License as published by the Free Software Foundation; either          *
 *   version 2.1 of the License, or (at your option) any later version.    *
 *                                                                         *
 *   This library 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     *
 *   Lesser General Public License for more details.                       *
 *                                                                         *
 *   You should have received a copy of the GNU Lesser General Public      *
 *   License along with this library; if not, write to the                 *
 *   Free Software Foundation, Inc.,                                       *
 *   51 Franklin Street, 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; }

		/** Returns clone of this cellgrid
		 */
		virtual CellGrid* clone() = 0;

	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