00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044 #ifndef INC_GRE_3DTERRA_H
00045 #define INC_GRE_3DTERRA_H
00046
00047 #ifndef INC_GRE_3DDC_H
00048 #include <gre/3ddc.h>
00049 #endif
00050
00051 #ifndef INC_GRE_3DPNTFLD_H
00052 #include <gre/3dpntfld.h>
00053 #endif
00054
00055 #ifndef INC_MI32_REGION2D_H
00056 #include <mi32/region2d.h>
00057 #endif
00058
00059 #ifndef INC_RVC_OBJTYPE_H
00060 #include <rvc/objtype.h>
00061 #endif
00062
00063
00064 #ifndef GENERATING_DOXYGEN_OUTPUT
00065
00066 namespace GRE {
00067 class TEXTUREFILTER;
00068 class TEXTURE;
00069 class GEOMETRIC3D;
00070 class CONTROLLER;
00071 }
00072 #endif
00073
00074
00075 namespace GRE {
00076
00078 class TERRAIN {
00079 public:
00080
00081 enum MODEL {
00082 MODEL_Default = 0,
00083 MODEL_TIN = 0,
00084 MODEL_VariableTriangulation = 1,
00085 MODEL_PiecewiseTIN = 2,
00086 MODEL_FlatTriangulation = 3,
00087 MODEL_Count = 4
00088 };
00089
00090 class IMPL_FACTORY {
00091 public:
00092 virtual TERRAIN *v_ConstructImpl () = 0;
00093 };
00094
00095 static void Register (
00096 IMPL_FACTORY* factory,
00097 const MODEL model
00098 );
00099
00103 static const char* GetName (
00104 const MODEL model
00105 );
00106
00110 static const char* GetDescription (
00111 const MODEL model
00112 );
00113
00117 static TERRAIN* GetInstance (
00118 const MODEL model
00119 );
00120
00121 virtual ~TERRAIN (
00122 );
00123
00127 const char* GetName (
00128 ) const { return m_Name; }
00129
00133 const char* GetDescription (
00134 ) const {return m_Description; }
00135
00139 const MODEL GetModel (
00140 ) const {return m_Model; }
00141
00145 TERRAIN* CreateInstance () { return v_CreateInstance(); }
00146
00150 ERRVALUE Build (
00151 const GRE::LAYER *layer
00152 ) { return v_Build(layer); }
00153
00157 bool IsBuilt (
00158 ) const { return m_Built; }
00159
00163 bool IsObjectTypeSupported (
00164 const RVC::OBJTYPE objtype
00165 ) const { return v_IsObjectTypeSupported(objtype); }
00166
00168 void Free () {v_Free(); }
00169
00173 ERRVALUE GetDefaultScene (
00174 SCENE3D& scene
00175 ) { return v_GetDefaultScene(scene); }
00176
00180 ERRVALUE SetScene (
00181 const SCENE3D& scene,
00182 const SIMPLE_ARRAY<TEXTURE*> &textures
00183 ) { return v_SetScene(scene, textures); }
00184
00188 ERRVALUE DrawScene (
00189 CONTROLLER &controller,
00190 DRAWINGCONTEXT3D& drawing,
00191 TEXTURE* texture,
00192 TEXTUREFILTER* texturefilter
00193 ) { return v_DrawScene(controller, drawing, texture, texturefilter); }
00194
00198 ERRVALUE SetScene (
00199 const SCENE3D& scene,
00200 const SIMPLE_ARRAY<GEOMETRIC3D*> &geometrics,
00201 const bool wireframe
00202 ) { return v_SetScene(scene, geometrics, wireframe); }
00203
00207 const DRECT3D& GetExtents (
00208 ) {return v_GetExtents(); }
00209
00213 ERRVALUE ComputeProfile (
00214 const POLYLINE& polyline,
00215 POLYLINE& profile,
00216 SIMPLE_ARRAY<INT32>& index
00217 ) {return v_ComputeProfile(polyline, profile, index); }
00218
00219
00223 float GetElevation (
00224 const float x,
00225 const float y
00226 ) {return v_GetElevation(x,y); }
00227
00231 float GetAngleToNorth (
00232 const float x,
00233 const float y
00234 ) const { return v_GetAngleToNorth(x, y); }
00235
00239 bool HasNull (
00240 ) const { return v_HasNull(); }
00241
00242
00246 bool IsNull (
00247 const float x,
00248 const float y
00249 ) const { return v_IsNull(x,y); }
00250
00252 void SetCoordRefSys (
00253 const SPATREF::COORDREFSYS& CoordRefSys
00254 ) { v_SetCoordRefSys(CoordRefSys); }
00255
00257 const SPATREF::COORDREFSYS GetCoordRefSys (
00258 ) const { return v_GetCoordRefSys(); }
00259
00260 void ClearBoundary (
00261 ) {
00262 m_Boundary.Clear();
00263 };
00264
00265 const REGION2D& GetBoundary (
00266 ) {
00267 if (m_Boundary.IsEmpty()) v_CreateBoundary(m_Boundary);
00268 return m_Boundary;
00269 };
00270
00271 bool IsBoundaryChanged (
00272 ) const {
00273 return m_Boundary.IsEmpty();
00274 };
00275
00276 bool IsTerrainDynamic (
00277 ) const {
00278 return false;
00279 };
00280
00281 POINTSFIELD& GetPointsField (
00282 ) {
00283 return m_PointsField;
00284 };
00285
00286 protected:
00287
00288 TERRAIN (
00289 const char* name,
00290 const char* desc,
00291 const MODEL model
00292 );
00293
00295 void SetBuilt (
00296 const bool built
00297 ) { m_Built = built; }
00298
00299 private:
00300 #ifndef GENERATING_DOXYGEN_OUTPUT
00301
00302 static IMPL_FACTORY* s_ImplFactories[MODEL_Count];
00303
00304 const char* m_Name;
00305 const char* m_Description;
00306 const MODEL m_Model;
00307 bool m_Built;
00308 GRE::POINTSFIELD m_PointsField;
00309 REGION2D m_Boundary;
00310
00311 TERRAIN ();
00312
00313
00314 TERRAIN (const TERRAIN &rhs);
00315 TERRAIN& operator= (const TERRAIN& rhs);
00316
00317 #endif // GENERATING_DOXYGEN_OUTPUT
00318
00319 virtual TERRAIN* v_CreateInstance (
00320 ) = 0;
00321
00322 virtual ERRVALUE v_Build (
00323 const GRE::LAYER *layer
00324 ) = 0;
00325
00326 virtual bool v_IsObjectTypeSupported (
00327 const RVC::OBJTYPE objtype
00328 ) const = 0;
00329
00330 virtual void v_Free (
00331 ) = 0;
00332
00333 virtual ERRVALUE v_GetDefaultScene (
00334 SCENE3D& scene
00335 ) const = 0;
00336
00337 virtual ERRVALUE v_SetScene (
00338 const SCENE3D& scene,
00339 const SIMPLE_ARRAY<TEXTURE*> &textures
00340 ) = 0;
00341
00342 virtual ERRVALUE v_DrawScene (
00343 CONTROLLER &controller,
00344 DRAWINGCONTEXT3D& drawing,
00345 TEXTURE* texture,
00346 TEXTUREFILTER* texturefilter
00347 ) = 0;
00348
00349 virtual ERRVALUE v_SetScene (
00350 const SCENE3D& scene,
00351 const SIMPLE_ARRAY<GEOMETRIC3D*> &geometrics,
00352 const bool wireframe
00353 ) = 0;
00354
00355 virtual const DRECT3D& v_GetExtents (
00356 ) = 0;
00357
00358 virtual void v_CreateBoundary (
00359 REGION2D& boundary
00360 ) = 0;
00361
00362 virtual float v_GetElevation (
00363 const float x,
00364 const float y
00365 ) const = 0;
00366
00367 virtual ERRVALUE v_ComputeProfile (
00368 const POLYLINE& polyline,
00369 POLYLINE& profile,
00370 SIMPLE_ARRAY<INT32>& index
00371 ) = 0;
00372
00373 virtual float v_GetAngleToNorth (
00374 const float x,
00375 const float y
00376 ) const = 0;
00377
00378 virtual bool v_HasNull (
00379 ) const = 0;
00380
00381 virtual bool v_IsNull (
00382 const float x,
00383 const float y
00384 ) const = 0;
00385
00386 virtual void v_SetCoordRefSys (
00387 const SPATREF::COORDREFSYS& CoordRefSys
00388 ) = 0;
00389
00390 virtual const SPATREF::COORDREFSYS v_GetCoordRefSys (
00391 ) const = 0;
00392 };
00393
00394
00397 class CONTROLLER {
00398 public:
00399
00401 void OnBegin () { v_OnBegin(); }
00402
00404 void OnEnd () { v_OnEnd(); }
00405
00407 void OnTriangulation (
00408 DRAWINGCONTEXT3D& drawing,
00409 const TRIANGULATION& triangulation
00410 ) { v_OnTriangulation(drawing, triangulation); }
00411
00413 void OnPixalization (
00414 DRAWINGCONTEXT3D& drawing,
00415 const PIXALIZATION& pixalization
00416 ) { v_OnPixalization(drawing, pixalization); }
00417
00418 protected:
00419
00420 CONTROLLER () {}
00421
00422 virtual ~CONTROLLER () {}
00423
00424 private:
00425
00426 virtual void v_OnBegin () = 0;
00427
00428 virtual void v_OnEnd (
00429 ) { }
00430
00431 virtual void v_OnTriangulation (
00432 DRAWINGCONTEXT3D& drawing,
00433 const TRIANGULATION& triangulation
00434 ) = 0;
00435
00436 virtual void v_OnPixalization (
00437 DRAWINGCONTEXT3D& drawing,
00438 const PIXALIZATION& pixalization
00439 ) = 0;
00440
00441 };
00442
00443
00445 class SIMPLECONTROLLER : public GRE::CONTROLLER {
00446 public:
00447 virtual ~SIMPLECONTROLLER () {}
00448
00449 private:
00450 #ifndef GENERATING_DOXYGEN_OUTPUT
00451
00452 GRE::TRIANGULATIONVECTOR m_Triangulations;
00453 GRE::PIXALIZATIONVECTOR m_Pixalizations;
00454
00455 void v_OnBegin ();
00456
00457 void v_OnEnd ();
00458
00459 void v_OnTriangulation (
00460 DRAWINGCONTEXT3D& drawing,
00461 const GRE::TRIANGULATION& triangulation
00462 );
00463
00464 void v_OnPixalization (
00465 DRAWINGCONTEXT3D& drawing,
00466 const GRE::PIXALIZATION& pixalization
00467 );
00468
00469 #endif // GENERATING_DOXYGEN_OUTPUT
00470 };
00471
00472
00473 }
00474
00475 #endif
00476