00001
00038 #ifndef INC_GRE_3DLPTER_H
00039 #define INC_GRE_3DLPTER_H
00040
00041 #ifndef INC_GRE_3DTERRA_H
00042 #include <gre/3dterra.h>
00043 #endif
00044
00045 #ifndef INC_RVC_NULLMASK_H
00046 #include <rvc/nullmask.h>
00047 #endif
00048
00049 #ifndef INC_MAP
00050 #include <map>
00051 #define INC_MAP
00052 #endif
00053
00054
00055 namespace GRE {
00056
00057 class VARIABLETRIANGULATION : public TERRAIN {
00058 public:
00059
00060 VARIABLETRIANGULATION ();
00061
00062 virtual ~VARIABLETRIANGULATION ();
00063
00064 bool CanSaveSurfaceProperties () const;
00065
00066 double GetErrorTolerance () const
00067 { return m_ErrorTolerance; };
00068
00069 bool HasSurfaceProperties () const
00070 { return (IsBuilt() && m_AreSurfacePropertiesCreated && m_IsCreatedInside); }
00071
00072 ERRVALUE SaveSurfaceProperties ();
00073
00074 void SetErrorTolerance (
00075 double tolerance
00076 ) { m_ErrorTolerance = bound(tolerance, 0.5, 10.0); return; };
00077
00078 private:
00079
00080 #ifndef GENERATING_DOXYGEN_OUTPUT
00081
00082 enum DIRECTION {
00083 DIRECTION_N = 0,
00084 DIRECTION_NE = 1,
00085 DIRECTION_E = 2,
00086 DIRECTION_SE = 3,
00087 DIRECTION_S = 4,
00088 DIRECTION_SW = 5,
00089 DIRECTION_W = 6,
00090 DIRECTION_NW = 7,
00091 DIRECTION_Count = 8
00092 };
00093
00094 typedef std::map<INT32, DPOINT3D> VERTEXMAP;
00095
00096 struct PROPERTY {
00097 float m_Elevation;
00098 float m_Error;
00099 float m_Radius;
00100
00101 PROPERTY () : m_Elevation(-1.0F), m_Error(-1.0F), m_Radius(-1.0F) {};
00102 PROPERTY (const float elevation, const float error, const float radius) :
00103 m_Elevation(elevation), m_Error(error), m_Radius(radius) {};
00104 };
00105
00106 static const bool s_Parity[DIRECTION_Count];
00107 static const INT32 s_SX[DIRECTION_Count];
00108 static const INT32 s_SY[DIRECTION_Count];
00109 static const DIRECTION s_DirectionL[DIRECTION_Count];
00110 static const DIRECTION s_DirectionR[DIRECTION_Count];
00111 static const INT32 s_MX[DIRECTION_Count];
00112 static const INT32 s_MY[DIRECTION_Count];
00113
00114 GRE::LAYER_SURFACE* m_Layer;
00115 DRECT3D ALIGN16(m_Extents);
00116 SPATREF::COORDREFSYS m_CoordRefSys;
00117 TRANS2D_MAPGEN m_Transformation;
00118 bool m_AreSurfacePropertiesCreated;
00119 bool m_IsCreatedInside;
00120
00121 RVC::RASTER m_DEM;
00122 SIMPLE_ARRAY<INT32> m_Index;
00123 double ALIGN8(m_ZDefaults[3][3]);
00124
00125 bool m_Parity;
00126 double ALIGN8(m_Value);
00127 double ALIGN8(m_ErrorTolerance);
00128 DPOINT3D ALIGN16(m_Viewer);
00129
00130 INT32 m_BlockSize;
00131 INT32 m_HalfBlockSize;
00132 INT32 m_BlockSizePlus;
00133 INT32 m_BlockCells;
00134 INT32 m_BlockColumn;
00135 INT32 m_BlockLine;
00136 INT32 m_NumBlocks;
00137 INT32 m_XBlocks;
00138 INT32 m_YBlocks;
00139 INT32 m_XSize;
00140 INT32 m_YSize;
00141 BITSET m_BlockBits;
00142 DOUBLE_ARRAY<DRECT3D> m_BlockExtents;
00143
00144 VERTEXMAP m_VertexMap;
00145 TRIANGULATION m_Triangulation;
00146 SCENE3D *m_Scene;
00147 CONTROLLER *m_Controller;
00148 DRAWINGCONTEXT3D *m_Drawing;
00149
00150 double ALIGN8(m_DataScale);
00151 double ALIGN8(m_Scale);
00152 double ALIGN8(m_ScaleSqrt2);
00153 double ALIGN8(m_ZMin);
00154 double ALIGN8(m_ZMax);
00155 double ALIGN8(m_ZDefault);
00156
00157 RVC::OBJECT m_File;
00158 RVC::NULLMASK m_NullMask;
00159 RVC::RASTER m_Corners;
00160 SIMPLE_ARRAY<RVC::RASTER*> m_WhiteH;
00161 SIMPLE_ARRAY<RVC::RASTER*> m_HBlackH;
00162 SIMPLE_ARRAY<RVC::RASTER*> m_VBlackH;
00163 SIMPLE_ARRAY<RVC::RASTER*> m_WhiteE;
00164 SIMPLE_ARRAY<RVC::RASTER*> m_HBlackE;
00165 SIMPLE_ARRAY<RVC::RASTER*> m_VBlackE;
00166 SIMPLE_ARRAY<RVC::RASTER*> m_WhiteR;
00167 SIMPLE_ARRAY<RVC::RASTER*> m_HBlackR;
00168 SIMPLE_ARRAY<RVC::RASTER*> m_VBlackR;
00169 INT32 m_LevelSize;
00170 INT32 m_LevelMask;
00171 SIMPLE_ARRAY<UINT8> m_LevelIndex;
00172 RVC::OBJECT m_ComputedSetFile;
00173 RVC::RASTER m_ComputedSetRaster;
00174
00175 VARIABLETRIANGULATION& operator= (
00176 const VARIABLETRIANGULATION& rhs
00177 );
00178
00179 static void GetCorners (
00180 const DRECT3D& rect,
00181 DPOINT3D points[8]
00182 );
00183
00184
00185
00186
00187 TERRAIN* v_CreateInstance (
00188 );
00189
00190
00191
00192
00193 ERRVALUE v_Build (
00194 const GRE::LAYER *layer
00195 );
00196
00197 bool v_IsObjectTypeSupported (
00198 const RVC::OBJTYPE objtype
00199 ) const;
00200
00201
00202
00203
00204 void v_Free (
00205 );
00206
00207 ERRVALUE Create (
00208 const GRE::LAYER *layer
00209 );
00210
00211 void Delete (
00212 );
00213
00214 ERRVALUE v_GetDefaultScene (
00215 SCENE3D& scene
00216 ) const;
00217
00218
00219
00220
00221 ERRVALUE v_SetScene (
00222 const SCENE3D& scene,
00223 const SIMPLE_ARRAY<TEXTURE*> &textures
00224 );
00225
00226 ERRVALUE v_DrawScene (
00227 CONTROLLER &controller,
00228 DRAWINGCONTEXT3D& drawing,
00229 TEXTURE* texture,
00230 TEXTUREFILTER* texturefilter
00231 );
00232
00233 ERRVALUE v_SetScene (
00234 const SCENE3D& scene,
00235 const SIMPLE_ARRAY<GEOMETRIC3D*> &geometrics,
00236 const bool wireframe
00237 );
00238
00239
00240 float v_GetElevation (
00241 const float x,
00242 const float y
00243 ) const;
00244
00245 ERRVALUE v_ComputeProfile (
00246 const POLYLINE& polyline,
00247 POLYLINE& profile,
00248 SIMPLE_ARRAY<INT32>& index
00249 );
00250
00251
00252 float v_GetAngleToNorth (
00253 const float x,
00254 const float y
00255 ) const;
00256
00257 bool v_HasNull (
00258 ) const { return true; };
00259
00260 bool v_IsNull (
00261 const float x,
00262 const float y
00263 ) const;
00264
00265 void v_SetCoordRefSys (
00266 const SPATREF::COORDREFSYS& CoordRefSys
00267 );
00268
00269 const SPATREF::COORDREFSYS v_GetCoordRefSys (
00270 ) const { return m_CoordRefSys; };
00271
00272 const DRECT3D& v_GetExtents (
00273 ) { return m_Extents; };
00274
00275 void v_CreateBoundary (
00276 REGION2D& boundary
00277 );
00278
00279 ERRVALUE CreateBlocks (
00280 const TRANS2D_MAPGEN& transformation
00281 );
00282
00283 void DeleteBlocks (
00284 );
00285
00286 bool IsBlockValid (
00287 const INT32 column,
00288 const INT32 line
00289 ) {return ((0 <= column) && (column < m_XBlocks) && (0 <= line) && (line < m_YBlocks)); };
00290
00291 ERRVALUE SetSceneForBlocks (
00292 const SCENE3D& scene,
00293 const SIMPLE_ARRAY<TEXTURE*> &textures
00294 );
00295
00296 ERRVALUE SetSceneForBlocks (
00297 const SCENE3D& scene,
00298 const SIMPLE_ARRAY<GEOMETRIC3D*> &geometrics,
00299 const bool wireframe
00300 );
00301
00302 ERRVALUE DrawSceneForBlocks (
00303 CONTROLLER &controller,
00304 DRAWINGCONTEXT3D& drawing,
00305 TEXTURE* texture,
00306 TEXTUREFILTER* texturefilter,
00307 const DRAW3DMODE draw3Dmode = DRAW3DMODE_Texture
00308 );
00309
00310 void TransformBlocks (
00311 const TRANS2D_MAPGEN& transformation
00312 );
00313
00314 ERRVALUE DefineSurfaceProperties (
00315 );
00316
00317 ERRVALUE MakeSurfaceProperties (
00318 RVC::OBJECT& parent
00319 );
00320
00321 ERRVALUE CalculateSurfaceProperties (
00322 );
00323
00324 bool OpenSurfaceProperties (
00325 );
00326
00327 ERRVALUE CloseSurfaceProperties (
00328 );
00329
00330 bool CheckAndOpenSurfaceProperties (
00331 RVC::RASTER& corners
00332 );
00333
00334 ERRVALUE DeleteSurfaceProperties (
00335 );
00336
00337 void CalculateZDefaults (
00338 const INT32 index
00339 );
00340
00341 double GetZDefault (
00342 const INT32 column,
00343 const INT32 line
00344 );
00345
00346 double CalculateZDefault (
00347 const INT32 column,
00348 const INT32 line
00349 );
00350
00351 ERRVALUE CalculateProperty (
00352 const INT32 x,
00353 const INT32 y,
00354 const INT32 length,
00355 const DIRECTION direction,
00356 PROPERTY& property
00357 );
00358
00359 FLOAT CalculateError (
00360 const INT32 x,
00361 const INT32 y,
00362 const INT32 length,
00363 const DIRECTION direction
00364 );
00365
00366 FLOAT CalculateRadius (
00367 const INT32 x,
00368 const INT32 y,
00369 const INT32 length,
00370 const DIRECTION direction
00371 );
00372
00373 ERRVALUE SubMeshRefine (
00374 const INT32 px,
00375 const INT32 py,
00376 const INT32 length,
00377 const DIRECTION direction,
00378 const INT32 level
00379 );
00380
00381 ERRVALUE VertexAppend (
00382 const INT32 x,
00383 const INT32 y,
00384 const bool parity
00385 );
00386
00387 bool IsVertexActive (
00388 const INT32 x,
00389 const INT32 y
00390 );
00391
00392 void MakeVertex (
00393 const INT32 x,
00394 const INT32 y,
00395 const INT32 index,
00396 DPOINT3D& point
00397 );
00398
00399 INT32 CalculateIndex (
00400 const INT32 x,
00401 const INT32 y
00402 );
00403
00404 void SetSurfaceProperty (
00405 const INT32 x,
00406 const INT32 y,
00407 PROPERTY& property
00408 );
00409
00410 void GetSurfaceProperty (
00411 const INT32 x,
00412 const INT32 y,
00413 PROPERTY& property,
00414 const bool geth,
00415 const bool gete,
00416 const bool getr
00417 );
00418
00419 bool IsPropertyComputed (
00420 const INT32 x,
00421 const INT32 y
00422 );
00423
00424 void SetPropertyComputed (
00425 const INT32 x,
00426 const INT32 y
00427 );
00428
00429 ERRVALUE MakeComputedSet (
00430 );
00431
00432 void DestroyComputedSet (
00433 );
00434
00435 double GetSurfaceElevation (
00436 const INT32 x,
00437 const INT32 y
00438 );
00439
00440 #endif // GENERATING_DOXYGEN_OUTPUT
00441 };
00442
00443 }
00444
00445 #endif