00001
00002
00003
00004
00005 #ifndef MERCATOR_SEGMENT_H
00006 #define MERCATOR_SEGMENT_H
00007
00008 #include <Mercator/Mercator.h>
00009 #include <Mercator/Matrix.h>
00010 #include <Mercator/BasePoint.h>
00011
00012 #include <wfmath/vector.h>
00013 #include <wfmath/axisbox.h>
00014
00015 #include <set>
00016 #include <map>
00017
00018 namespace Mercator {
00019
00020 class Terrain;
00021 class Surface;
00022 class TerrainMod;
00023 typedef std::set<TerrainMod *> ModList;
00024 class Area;
00025
00026
00027
00028
00029
00032 class Segment {
00033 public:
00035 typedef std::map<int, Surface *> Surfacestore;
00036
00038 typedef std::multimap<int, Area *> Areastore;
00039 private:
00041 const int m_res;
00043 const int m_size;
00045 const int m_xRef;
00047 const int m_yRef;
00049 Matrix<2, 2, BasePoint> m_controlPoints;
00051 float * m_points;
00053 float * m_normals;
00055 float m_max;
00057 float m_min;
00058
00060 Surfacestore m_surfaces;
00061
00063 Areastore m_areas;
00064 public:
00065 explicit Segment(int x, int y, unsigned int resolution);
00066 ~Segment();
00067
00069 const int getResolution() const {
00070 return m_res;
00071 }
00072
00074 const int getSize() const {
00075 return m_size;
00076 }
00077
00079 const int getXRef() const {
00080 return m_xRef;
00081 }
00082
00084 const int getYRef() const {
00085 return m_yRef;
00086 }
00087
00091 const bool isValid() const {
00092 return (m_points != 0);
00093 }
00094
00099 void setMinMax(float min, float max) {
00100 m_min = min;
00101 m_max = max;
00102 }
00103
00104 void invalidate(bool points = true);
00105
00112 void setCornerPoint(unsigned int x, unsigned int y, const BasePoint & bp) {
00113 m_controlPoints(x, y) = bp;
00114 invalidate();
00115 }
00116
00118 const Matrix<2, 2, BasePoint> & getControlPoints() const {
00119 return m_controlPoints;
00120 }
00121
00123 Matrix<2, 2, BasePoint> & getControlPoints() {
00124 return m_controlPoints;
00125 }
00126
00128 const Surfacestore & getSurfaces() const {
00129 return m_surfaces;
00130 }
00131
00133 Surfacestore & getSurfaces() {
00134 return m_surfaces;
00135 }
00136
00138 const float * getPoints() const {
00139 return m_points;
00140 }
00141
00143 float * getPoints() {
00144 return m_points;
00145 }
00146
00148 const float * getNormals() const {
00149 return m_normals;
00150 }
00151
00153 float * getNormals() {
00154 return m_normals;
00155 }
00156
00158 float get(int x, int y) const {
00159 return m_points[y * (m_res + 1) + x];
00160 }
00161
00162 void getHeightAndNormal(float x, float y, float &h,
00163 WFMath::Vector<3> &normal) const;
00164 bool clipToSegment(const WFMath::AxisBox<2> &bbox, int &lx, int &hx, int &ly, int &hy) const;
00165
00166
00167 void populate();
00168 void populateNormals();
00169 void populateSurfaces();
00170
00172 float getMax() const { return m_max; }
00174 float getMin() const { return m_min; }
00175
00177 WFMath::AxisBox<2> getRect() const;
00178
00180 WFMath::AxisBox<3> getBox() const;
00181
00182 void addMod(TerrainMod *t);
00183 void removeMod(TerrainMod *t);
00184 void clearMods();
00185
00187 const Areastore& getAreas() const
00188 { return m_areas; }
00189
00190 void addArea(Area* a);
00191 void removeArea(Area* a);
00192 private:
00197 void checkMaxMin(float h) {
00198 if (h<m_min) {
00199 m_min=h;
00200 }
00201 if (h>m_max) {
00202 m_max=h;
00203 }
00204 }
00205
00206 void fill1d(const BasePoint& l, const BasePoint &h, float *array) const;
00207
00208 void fill2d(const BasePoint& p1, const BasePoint& p2,
00209 const BasePoint& p3, const BasePoint& p4);
00210
00211 float qRMD(float nn, float fn, float ff, float nf,
00212 float roughness, float falloff, int depth) const;
00213
00214 void applyMod(TerrainMod *t);
00215
00216 void invalidateSurfaces();
00217
00219 ModList m_modList;
00220
00221 };
00222
00223 }
00224
00225 #endif // MERCATOR_SEGMENT_H