Mercator

TerrainMod.h

00001 // This file may be redistributed and modified only under the terms of
00002 // the GNU General Public License (See COPYING for details).
00003 // Copyright (C) 2003 Damien McGinnes, Alistair Riddoch
00004 
00005 #ifndef MERCATOR_TERRAIN_MOD_H
00006 #define MERCATOR_TERRAIN_MOD_H
00007 
00008 #include <wfmath/intersect.h>
00009 #include <wfmath/axisbox.h>
00010 #include <wfmath/ball.h>
00011 
00012 namespace Mercator {
00013 
00017 class TerrainMod
00018 {
00019 public:
00020     virtual ~TerrainMod();
00021 
00026     virtual void apply(float &point, int x, int y) const = 0;
00027 
00029     virtual WFMath::AxisBox<2> bbox() const = 0;
00030 
00032     virtual TerrainMod *clone() const = 0;
00033 };
00034 
00039 template <typename Shape>
00040 class ShapeTerrainMod : public TerrainMod
00041 {
00042 public:
00046     ShapeTerrainMod(const Shape &s) : m_shape(s) {}
00047     virtual ~ShapeTerrainMod(); // {}
00048 
00049     virtual WFMath::AxisBox<2> bbox() const; // { return m_shape.boundingBox(); }
00050 
00051 protected:
00053     Shape m_shape;
00054 };
00055 
00056 
00060 template <typename Shape>
00061 class LevelTerrainMod : public ShapeTerrainMod<Shape>
00062 {
00063 public:
00068     LevelTerrainMod(float level, const Shape &s)
00069         : ShapeTerrainMod<Shape>(s), m_level(level) {}
00070 
00071     virtual ~LevelTerrainMod();
00072 
00073     virtual void apply(float &point, int x, int y) const;
00074     virtual TerrainMod *clone() const;
00075 
00076 private:
00078     LevelTerrainMod(LevelTerrainMod&); // {}
00079 
00080 protected:
00082     float m_level;
00083 };
00084 
00089 template <typename Shape>
00090 class AdjustTerrainMod : public ShapeTerrainMod<Shape>
00091 {
00092 public:
00093 
00098     AdjustTerrainMod(float dist, const Shape &s)
00099         : ShapeTerrainMod<Shape>(s), m_dist(dist) {}
00100 
00101     virtual ~AdjustTerrainMod();
00102 
00103     virtual void apply(float &point, int x, int y) const;
00104     virtual TerrainMod *clone() const;
00105 
00106 private:
00108     AdjustTerrainMod(AdjustTerrainMod&) {}
00109 
00110 protected:
00112     float m_dist;
00113 };
00114 
00119 template <typename Shape>
00120 class SlopeTerrainMod : public ShapeTerrainMod<Shape>
00121 {
00122 public:
00123 
00130     SlopeTerrainMod(float level, float dx, float dy, const Shape &s)
00131         : ShapeTerrainMod<Shape>(s), m_level(level), m_dx(dx), m_dy(dy) {}
00132 
00133     virtual ~SlopeTerrainMod();
00134 
00135     virtual void apply(float &point, int x, int y) const;
00136     virtual TerrainMod *clone() const;
00137 
00138 private:
00140     SlopeTerrainMod(SlopeTerrainMod&) {}
00141 
00142 protected:
00144     float m_level;
00146     float m_dx;
00148     float m_dy;
00149 };
00150 
00155 class CraterTerrainMod : public TerrainMod
00156 {
00157 public:
00161     CraterTerrainMod(const WFMath::Ball<3> &s) : m_shape(s) {
00162         WFMath::AxisBox<3> bb=m_shape.boundingBox();
00163         ab = WFMath::AxisBox<2> (
00164                     WFMath::Point<2>(bb.lowerBound(0), bb.lowerBound(1)),
00165                     WFMath::Point<2>(bb.upperBound(0), bb.upperBound(1))
00166                );
00167     }
00168 
00169     virtual ~CraterTerrainMod(); // {}
00170 
00171     virtual WFMath::AxisBox<2> bbox() const;
00172     virtual void apply(float &point, int x, int y) const;
00173     virtual TerrainMod *clone() const;
00174 
00175 private:
00177     CraterTerrainMod(CraterTerrainMod&) {}
00178 
00180     WFMath::Ball<3> m_shape;
00182     WFMath::AxisBox<2> ab;
00183 
00184 };
00185 
00186 } //namespace Mercator
00187 
00188 #endif // MERCATOR_TERRAIN_MOD_H