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
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088 #ifndef INC_GRE_3DTERRA_H
00089 #define INC_GRE_3DTERRA_H
00090
00091 #ifndef INC_GRE_3DDC_H
00092 #include <gre/3ddc.h>
00093 #endif
00094
00095 #ifndef INC_GRE_3DDC_H
00096 #include <gre/3ddc.h>
00097 #endif
00098
00099 #ifndef INC_GRE_3DPNTFLD_H
00100 #include <gre/3dpntfld.h>
00101 #endif
00102
00103
00104 #ifndef INC_MI32_ASURFACE_H
00105 #include <mi32/asurface.h>
00106 #endif
00107
00108 #ifndef INC_MI32_SIMPLEAR_H
00109 #include <mi32/simplear.h>
00110 #endif
00111
00112 #ifndef INC_RVC_GEOREFER_H
00113 #include <rvc/georefer.h>
00114 #endif
00115
00116 namespace GRE {
00117
00118 #ifndef GENERATING_DOXYGEN_OUTPUT
00119 class TEXTUREFILTER;
00120 class TEXTURE;
00121 class GEOMETRIC3D;
00122 class CONTROLLER;
00123 #endif // GENERATING_DOXYGEN_OUTPUT
00124
00125
00126 class TERRAIN {
00127 public:
00128
00129 class IMPL_FACTORY {
00130 public:
00131 virtual TERRAIN *v_ConstructImpl () = 0;
00132 };
00133
00134 #define DECLARE_TERRAIN_IMPL_FACTORY(name,model) \
00135 class TERRAIN_IMPL_FACTORY_##name : public GRE::TERRAIN::IMPL_FACTORY { \
00136 public: \
00137 TERRAIN_IMPL_FACTORY_##name ( \
00138 ) { GRE::TERRAIN::Register(this,model); } \
00139 virtual GRE::TERRAIN *v_ConstructImpl () { \
00140 return (new GRE::name); \
00141 } \
00142 }; \
00143 static TERRAIN_IMPL_FACTORY_##name s_TerrainImplFactory_##name;
00144
00145 enum MODEL {
00146 MODEL_Default = 0,
00147 MODEL_TIN = 0,
00148 MODEL_VariableTriangulation = 1,
00149 MODEL_PiecewiseTIN = 2,
00150 MODEL_FlatTriangulation = 3,
00151 MODEL_Count = 4
00152 };
00153
00154 static void Register (
00155 IMPL_FACTORY* factory,
00156 const MODEL model
00157 );
00158
00159
00160
00161
00162 static const char* GetName (
00163 const MODEL model
00164 );
00165
00166
00167
00168
00169 static const char* GetDescription (
00170 const MODEL model
00171 );
00172
00173
00174
00175
00176 static TERRAIN* GetInstance (
00177 const MODEL model
00178 );
00179
00180 virtual ~TERRAIN (
00181 );
00182
00183
00184
00185
00186 const char* GetName (
00187 ) const { return m_Name; }
00188
00189
00190
00191
00192 const char* GetDescription (
00193 ) const {return m_Description; }
00194
00195
00196
00197
00198 const MODEL GetModel (
00199 ) const {return m_Model; }
00200
00201
00202
00203
00204 TERRAIN* CreateInstance () { return v_CreateInstance(); }
00205
00206
00207
00208
00209 ERRVALUE Build (
00210 const GRE::LAYER *layer
00211 ) { return v_Build(layer); }
00212
00213
00214
00215
00216 bool IsBuilt (
00217 ) const { return m_Built; }
00218
00219
00220
00221
00222 bool IsObjectTypeSupported (
00223 const RVC::OBJTYPE objtype
00224 ) const { return v_IsObjectTypeSupported(objtype); }
00225
00226
00227 void Free () {v_Free(); }
00228
00229
00230
00231
00232 ERRVALUE GetDefaultScene (
00233 SCENE3D& scene
00234 ) { return v_GetDefaultScene(scene); }
00235
00236
00237
00238
00239 ERRVALUE SetScene (
00240 const SCENE3D& scene,
00241 const SIMPLE_ARRAY<TEXTURE*> &textures
00242 ) { return v_SetScene(scene, textures); }
00243
00244
00245
00246
00247 ERRVALUE DrawScene (
00248 CONTROLLER &controller,
00249 DRAWINGCONTEXT3D& drawing,
00250 TEXTURE* texture,
00251 TEXTUREFILTER* texturefilter
00252 ) { return v_DrawScene(controller, drawing, texture, texturefilter); }
00253
00254
00255
00256
00257 ERRVALUE SetScene (
00258 const SCENE3D& scene,
00259 const SIMPLE_ARRAY<GEOMETRIC3D*> &geometrics,
00260 const bool wireframe
00261 ) { return v_SetScene(scene, geometrics, wireframe); }
00262
00263
00264
00265
00266 const DRECT3D& GetExtents (
00267 ) {return v_GetExtents(); }
00268
00269
00270
00271
00272 ERRVALUE ComputeProfile (
00273 const POLYLINE& polyline,
00274 POLYLINE& profile,
00275 SIMPLE_ARRAY<INT32>& index
00276 ) {return v_ComputeProfile(polyline, profile, index); }
00277
00278
00279
00280
00281
00282 float GetElevation (
00283 const float x,
00284 const float y
00285 ) {return v_GetElevation(x,y); }
00286
00287
00288
00289
00290 float GetAngleToNorth (
00291 const float x,
00292 const float y
00293 ) const { return v_GetAngleToNorth(x, y); }
00294
00295
00296
00297
00298 const ABSTRACT_SURFACE* GetAbstractSurface (
00299 ) { return v_GetAbstractSurface(); }
00300
00301
00302
00303
00304 bool HasNull (
00305 ) const { return v_HasNull(); }
00306
00307
00308
00309
00310
00311 bool IsNull (
00312 const float x,
00313 const float y
00314 ) const { return v_IsNull(x,y); }
00315
00316
00317 void SetCoordRefSys (
00318 const SPATREF::COORDREFSYS& CoordRefSys
00319 ) { v_SetCoordRefSys(CoordRefSys); }
00320
00321
00322 const SPATREF::COORDREFSYS GetCoordRefSys (
00323 ) const { return v_GetCoordRefSys(); }
00324
00325 void ClearBoundary (
00326 ) {
00327 m_Boundary.Clear();
00328 return;
00329 };
00330
00331 const REGION2D& GetBoundary (
00332 ) {
00333 if (m_Boundary.IsEmpty()) v_CreateBoundary(m_Boundary);
00334 return m_Boundary;
00335 };
00336
00337 bool IsBoundaryChanged (
00338 ) const {
00339 return m_Boundary.IsEmpty();
00340 };
00341
00342 bool IsTerrainDynamic (
00343 ) const {
00344 return false;
00345 };
00346
00347 POINTSFIELD& GetPointsField (
00348 ) {
00349 return m_PointsField;
00350 };
00351
00352 protected:
00353
00354 TERRAIN (
00355 const char* name,
00356 const char* desc,
00357 const MODEL model
00358 );
00359
00360
00361 void SetBuilt (
00362 const bool built
00363 ) {m_Built = built; }
00364
00365 private:
00366
00367 #ifndef GENERATING_DOXYGEN_OUTPUT
00368
00369 static IMPL_FACTORY* s_ImplFactories[MODEL_Count];
00370
00371 const char* m_Name;
00372 const char* m_Description;
00373 const MODEL m_Model;
00374 bool m_Built;
00375
00376 GRE::POINTSFIELD m_PointsField;
00377 REGION2D m_Boundary;
00378
00379 TERRAIN (
00380 );
00381
00382 TERRAIN (
00383 const TERRAIN &rhs
00384 );
00385
00386 TERRAIN& operator= (
00387 const TERRAIN& rhs
00388 );
00389
00390 #endif
00391
00392 virtual TERRAIN* v_CreateInstance (
00393 ) = 0;
00394
00395 virtual ERRVALUE v_Build (
00396 const GRE::LAYER *layer
00397 ) = 0;
00398
00399 virtual bool v_IsObjectTypeSupported (
00400 const RVC::OBJTYPE objtype
00401 ) const = 0;
00402
00403 virtual void v_Free (
00404 ) = 0;
00405
00406 virtual ERRVALUE v_GetDefaultScene (
00407 SCENE3D& scene
00408 ) const = 0;
00409
00410 virtual ERRVALUE v_SetScene (
00411 const SCENE3D& scene,
00412 const SIMPLE_ARRAY<TEXTURE*> &textures
00413 ) = 0;
00414
00415 virtual ERRVALUE v_DrawScene (
00416 CONTROLLER &controller,
00417 DRAWINGCONTEXT3D& drawing,
00418 TEXTURE* texture,
00419 TEXTUREFILTER* texturefilter
00420 ) = 0;
00421
00422 virtual ERRVALUE v_SetScene (
00423 const SCENE3D& scene,
00424 const SIMPLE_ARRAY<GEOMETRIC3D*> &geometrics,
00425 const bool wireframe
00426 ) = 0;
00427
00428 virtual const DRECT3D& v_GetExtents (
00429 ) = 0;
00430
00431 virtual void v_CreateBoundary (
00432 REGION2D& boundary
00433 ) = 0;
00434
00435 virtual float v_GetElevation (
00436 const float x,
00437 const float y
00438 ) const = 0;
00439
00440 virtual ERRVALUE v_ComputeProfile (
00441 const POLYLINE& polyline,
00442 POLYLINE& profile,
00443 SIMPLE_ARRAY<INT32>& index
00444 ) = 0;
00445
00446 virtual float v_GetAngleToNorth (
00447 const float x,
00448 const float y
00449 ) const = 0;
00450
00451 virtual const ABSTRACT_SURFACE* v_GetAbstractSurface (
00452 ) = 0;
00453
00454 virtual bool v_HasNull (
00455 ) const = 0;
00456
00457 virtual bool v_IsNull (
00458 const float x,
00459 const float y
00460 ) const = 0;
00461
00462 virtual void v_SetCoordRefSys (
00463 const SPATREF::COORDREFSYS& CoordRefSys
00464 ) = 0;
00465
00466 virtual const SPATREF::COORDREFSYS v_GetCoordRefSys (
00467 ) const = 0;
00468 };
00469
00470
00471
00472
00473 class CONTROLLER {
00474 public:
00475
00476
00477 void OnBegin () { v_OnBegin(); }
00478
00479
00480 void OnEnd () { v_OnEnd(); }
00481
00482
00483 void OnTriangulation (
00484 DRAWINGCONTEXT3D& drawing,
00485 const TRIANGULATION& triangulation
00486 ) { v_OnTriangulation(drawing, triangulation); }
00487
00488
00489 void OnPixalization (
00490 DRAWINGCONTEXT3D& drawing,
00491 const PIXALIZATION& pixalization
00492 ) { v_OnPixalization(drawing, pixalization); }
00493
00494 protected:
00495
00496 CONTROLLER () {}
00497
00498 virtual ~CONTROLLER () {}
00499
00500 private:
00501
00502 virtual void v_OnBegin (
00503 ) = 0;
00504
00505 virtual void v_OnEnd (
00506 ) { }
00507
00508 virtual void v_OnTriangulation (
00509 DRAWINGCONTEXT3D& drawing,
00510 const TRIANGULATION& triangulation
00511 ) = 0;
00512
00513 virtual void v_OnPixalization (
00514 DRAWINGCONTEXT3D& drawing,
00515 const PIXALIZATION& pixalization
00516 ) = 0;
00517
00518 };
00519
00520
00521
00522 class SIMPLECONTROLLER : public GRE::CONTROLLER {
00523 public:
00524 virtual ~SIMPLECONTROLLER () {}
00525
00526 private:
00527 #ifndef GENERATING_DOXYGEN_OUTPUT
00528
00529 GRE::TRIANGULATIONVECTOR m_Triangulations;
00530 GRE::PIXALIZATIONVECTOR m_Pixalizations;
00531
00532 void v_OnBegin (
00533 );
00534
00535 void v_OnEnd (
00536 );
00537
00538 void v_OnTriangulation (
00539 DRAWINGCONTEXT3D& drawing,
00540 const GRE::TRIANGULATION& triangulation
00541 );
00542
00543 void v_OnPixalization (
00544 DRAWINGCONTEXT3D& drawing,
00545 const GRE::PIXALIZATION& pixalization
00546 );
00547
00548 #endif
00549 };
00550
00551 }
00552
00553 #endif
00554