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 #ifndef INC_GRE_3DGMELEM_H
00056 #define INC_GRE_3DGMELEM_H
00057
00058 #ifndef INC_MI32_BITSET_H
00059 #include <mi32/bitset.h>
00060 #endif
00061
00062 #ifndef INC_MI32_SIMPLEAR_H
00063 #include <mi32/simplear.h>
00064 #endif
00065
00066 #ifndef INC_MI32_DOUBLEAR_H
00067 #include <mi32/doublear.h>
00068 #endif
00069
00070 #ifndef INC_MI32_MGD2_H
00071 #include <mi32/mgd2.h>
00072 #endif
00073
00074 #ifndef INC_GRE_3DUTILS_H
00075 #include <gre/3dutils.h>
00076 #endif
00077
00078 #ifndef INC_GRE_3DSCENE_H
00079 #include <gre/3dscene.h>
00080 #endif
00081
00082 #ifndef INC_GRE_3DPNTFLD_H
00083 #include <gre/3dpntfld.h>
00084 #endif
00085
00086 #ifndef INC_MI32_TRIANGUL_H
00087 #include <mi32/triangul.h>
00088 #endif
00089
00090 #ifndef INC_MI32_REGION2D_H
00091 #include <mi32/region2d.h>
00092 #endif
00093
00094 #ifndef INC_RVC_STYLE_H
00095 #include <rvc/style.h>
00096 #endif
00097
00098 #ifndef INC_RVC_VECTOR_H
00099 #include <rvc/vector.h>
00100 #endif
00101
00102 namespace GRE {
00103
00104 #ifndef GENERATING_DOXYGEN_OUT
00105 struct TRIANGULATION;
00106 class TERRAIN;
00107 #endif // GENERATING_DOXYGEN_OUTPUT
00108
00109 class GEOMETRIC3D_BUILDER {
00110 public:
00111
00112 enum ELEMMODE {
00113 ELEMMODE_Standard,
00114 ELEMMODE_Highlighted,
00115 ELEMMODE_Active
00116 };
00117
00118 ERRVALUE DrawPoint2D (
00119 const DPOINT2D& point,
00120 const POINTSTYLE& style
00121 );
00122
00123 ERRVALUE DrawLabel2D (
00124 const RVC::VECTOR::LABEL& label,
00125 const LABELSTYLE& style
00126 );
00127
00128 ERRVALUE DrawPoint3D (
00129 const DPOINT3D& point,
00130 const POINTSTYLE& style
00131 );
00132
00133 ERRVALUE DrawLine2D (
00134 const POLYLINE& polyline,
00135 const LINESTYLE& style,
00136 const RVC::STYLE::LINEPATTERN& pattern
00137 );
00138
00139 ERRVALUE DrawLine3D (
00140 const POLYLINE& polyline,
00141 const LINESTYLE& style
00142 );
00143
00144 ERRVALUE DrawRectangle2D (
00145 const DRECT2D& rect,
00146 const LINESTYLE& style,
00147 const RVC::STYLE::LINEPATTERN& pattern
00148 );
00149
00150 ERRVALUE DrawCircle2D (
00151 const DPOINT2D& center,
00152 const double radius,
00153 const LINESTYLE& style,
00154 const RVC::STYLE::LINEPATTERN& pattern
00155 );
00156
00157 ERRVALUE DrawPolygon2D (
00158 const POLYLINE& polyline,
00159 const POLYSTYLE& style
00160
00161 );
00162
00163 ERRVALUE DrawSubRegion2D (
00164 const SUBREGION2D& subregion,
00165 const POLYSTYLE& style
00166
00167 );
00168
00169 ERRVALUE DrawRegion2D (
00170 const REGION2D& region,
00171 const POLYSTYLE& style
00172
00173 );
00174
00175 ERRVALUE FillPoint2D (
00176 const DPOINT2D& point,
00177 const POINTSTYLE& style,
00178 const RVC::STYLE::SYMBOLPATTERN& pattern
00179 );
00180
00181 ERRVALUE FillLabel2D (
00182 const RVC::VECTOR::LABEL& label,
00183 const LABELSTYLE& style,
00184 const RVC::STYLE& styleobj
00185 );
00186
00187 ERRVALUE FillPoint3D (
00188 const DPOINT3D& point,
00189 const POINTSTYLE& style
00190 );
00191
00192 ERRVALUE FillLine2D (
00193 const POLYLINE& polyline,
00194 const LINESTYLE& style,
00195 const RVC::STYLE::LINEPATTERN& pattern,
00196 const MGD::LINECAP linecap = MGD::LINECAP_Butt
00197 );
00198
00199 ERRVALUE FillLine3D (
00200 const POLYLINE& polyline,
00201 const LINESTYLE& style
00202 );
00203
00204 ERRVALUE FillRectangle2D (
00205 const DRECT2D& rect,
00206 const POLYSTYLE& style,
00207 const RVC::STYLE& styleobj
00208 );
00209
00210 ERRVALUE FillCircle2D (
00211 const DPOINT2D& center,
00212 const double radius,
00213 const POLYSTYLE& style,
00214 const RVC::STYLE& styleobj
00215 );
00216
00217 ERRVALUE FillPolygon2D (
00218 const POLYLINE& polyline,
00219 const POLYSTYLE& style,
00220 const RVC::STYLE& styleobj
00221 );
00222
00223 ERRVALUE FillSubRegion2D (
00224 const SUBREGION2D& subregion,
00225 const POLYSTYLE& style,
00226 const RVC::STYLE& styleobj
00227 );
00228
00229 ERRVALUE FillRegion2D (
00230 const REGION2D& region,
00231 const POLYSTYLE& style,
00232 const RVC::STYLE& styleobj
00233 );
00234
00235 double GetFactor (
00236 ) { return m_SF; };
00237
00238
00239
00240
00241 ERRVALUE Init (
00242 GRE::SCENE3D* scene,
00243 GRE::TERRAIN* terrain,
00244 const double s2d
00245 );
00246
00247 void Clear (
00248 ) {
00249 m_Scene = 0;
00250 m_Terrain = 0;
00251 };
00252
00253 void SetHighlightedColor (
00254 const COLOR color
00255 ) { m_HighlightedColor = color; return; };
00256
00257 void SetActiveColor (
00258 const COLOR color
00259 ) { m_ActiveColor = color; return; };
00260
00261 void SetElementsMode (
00262 const ELEMMODE mode
00263 ) { m_ElementsMode = mode; return; };
00264
00265 protected:
00266
00267 GEOMETRIC3D_BUILDER () {};
00268 virtual ~GEOMETRIC3D_BUILDER () {};
00269
00270 private:
00271
00272 static bool Intersect (
00273 const FPOINT2D& ps,
00274 const FPOINT2D& pe,
00275 const FPOINT2D& qs,
00276 const FPOINT2D& qe,
00277 FPOINT2D& p
00278 );
00279
00280
00281
00282
00283
00284
00285 static const INT32 s_IcosahedronNumVertices = 12;
00286 static const INT32 s_IcosahedronNumTriangles = 20;
00287 static const float s_IcosahedronTriangleArea;
00288
00289 static const FPOINT3D s_IcosahedronVertices[12];
00290 static const GRE::TRIANGLEINDEX s_IcosahedronTriangles[20];
00291
00292 static const double s_FScale;
00293 static const double s_FXOffset;
00294 static const double s_FYOffset;
00295
00296 GRE::SCENE3D* m_Scene;
00297 GRE::TERRAIN* m_Terrain;
00298 DPOINT3D m_Direction;
00299 DPOINT3D m_Viewer;
00300 ELEMMODE m_ElementsMode;
00301 COLOR m_HighlightedColor;
00302 COLOR m_ActiveColor;
00303 FPOINT3D m_SunDirection;
00304
00305 SIMPLE_ARRAY<FPOINT3D> m_Points;
00306 POLYLINE m_Polyline;
00307 POLYLINE m_PolylineE;
00308 SIMPLE_ARRAY<double> m_Offset;
00309 GRE::TRIANGULATION m_Triangulation;
00310 GRE::PIXALIZATION m_Pixalization;
00311 TRIANGULATOR2D m_Triangulator;
00312 SIMPLE_ARRAY<DTRIANGLE2D> m_Triangles;
00313
00314
00315 double m_S2D;
00316 double m_S3D;
00317 double m_SF;
00318
00319 virtual void OnConstruction (
00320 GRE::TRIANGULATION& triangulation
00321 ) = 0;
00322
00323 virtual void OnConstruction (
00324 GRE::PIXALIZATION& pixalization
00325 ) = 0;
00326
00327 ERRVALUE DrawSegment2D (
00328 const FPOINT2D& pt1,
00329 const FPOINT2D& pt2,
00330 const COLOR& color
00331 );
00332
00333 ERRVALUE OutlinePolygon2D (
00334 const POLYLINE& polyline,
00335 const float thickness,
00336 const COLOR& color,
00337 const MGD::LINEJOIN linejoin = MGD::LINEJOIN_Round
00338 );
00339
00340 ERRVALUE OutlineSubRegion2D (
00341 const SUBREGION2D& subregion,
00342 const float thickness,
00343 const COLOR& color,
00344 const MGD::LINEJOIN linejoin = MGD::LINEJOIN_Round
00345 );
00346
00347 ERRVALUE OutlineRegion2D (
00348 const REGION2D& region,
00349 const float thickness,
00350 const COLOR& color,
00351 const MGD::LINEJOIN linejoin = MGD::LINEJOIN_Round
00352 );
00353
00354 ERRVALUE FillPoint2DBuildIn (
00355 const DPOINT2D& point,
00356 const POINTSTYLE& style
00357 );
00358
00359 ERRVALUE FillPoint2DUseSymbol (
00360 const DPOINT2D& point,
00361 const POINTSTYLE& style,
00362 const RVC::STYLE::SYMBOLPATTERN& pattern
00363 );
00364
00365 ERRVALUE FillPoint3DBuildIn (
00366 const DPOINT3D& point,
00367 const POINTSTYLE& style
00368 );
00369
00370 ERRVALUE FillPoint3DUseSymbol (
00371 const DPOINT3D& point,
00372 const POINTSTYLE& style
00373 );
00374
00375 ERRVALUE FillLine2DSolid (
00376 const POLYLINE& polyline,
00377 const LINESTYLE& style,
00378 const MGD::LINECAP linecap = MGD::LINECAP_Round
00379 );
00380
00381 ERRVALUE FillLine2DSolid (
00382 const POLYLINE& polyline,
00383 const float thickness,
00384 const COLOR& color,
00385 const MGD::LINEJOIN linejoin = MGD::LINEJOIN_Round,
00386 const MGD::LINECAP linecap = MGD::LINECAP_Round
00387 );
00388
00389
00390 ERRVALUE FillLine2DUsePattern (
00391 const POLYLINE& polyline,
00392 const LINESTYLE& style,
00393 const RVC::STYLE::LINEPATTERN& pattern
00394 );
00395
00396 ERRVALUE FillLine3DSolid (
00397 const POLYLINE& polyline,
00398 const LINESTYLE& style
00399 );
00400
00401 ERRVALUE FillLine3DUsePattern (
00402 const POLYLINE& polyline,
00403 const LINESTYLE& style
00404 );
00405
00406 ERRVALUE FillTriangle2D (
00407 const FPOINT2D& pt1,
00408 const FPOINT2D& pt2,
00409 const FPOINT2D& pt3,
00410 const COLOR& color
00411 );
00412
00413 ERRVALUE GRE::GEOMETRIC3D_BUILDER::FillTriangle2D (
00414 const FPOINT2D& pt1,
00415 const FPOINT2D& pt2,
00416 const FPOINT2D& pt3,
00417 const COLOR& color,
00418 const RVC::STYLE::BITMAPPATTERN& pattern
00419 );
00420
00421 ERRVALUE FillRectangle2D (
00422 const DRECT2D& rectangle,
00423 const COLOR& color
00424 );
00425
00426 ERRVALUE FillTriangle3D (
00427 const FPOINT3D& pt1,
00428 const FPOINT3D& pt2,
00429 const FPOINT3D& pt3,
00430 const COLOR& color
00431 );
00432
00433 ERRVALUE DrawCircle2D (
00434 const FPOINT2D& point,
00435 const float radius,
00436 const float thickness,
00437 const COLOR& color
00438 );
00439
00440 ERRVALUE DrawArc2D (
00441 const FPOINT2D& point,
00442 const float radius,
00443 const float thickness,
00444 const float start,
00445 const float sweep,
00446 const COLOR& color,
00447 const MGD::SHAPECLOSE shapeclose = MGD::SHAPECLOSE_None
00448 );
00449
00450 ERRVALUE DrawEllipse2D (
00451 const FPOINT2D& point,
00452 const float x,
00453 const float y,
00454 const float thickness,
00455 const float rotation,
00456 const COLOR& color
00457 );
00458
00459 ERRVALUE FillCircle2D (
00460 const FPOINT2D& point,
00461 const float radius,
00462 const COLOR& color
00463 );
00464
00465 ERRVALUE FillArcWedge2D (
00466 const FPOINT2D& point,
00467 const float radius,
00468 const float start,
00469 const float sweep,
00470 const COLOR& color
00471 );
00472
00473 ERRVALUE FillArcChord2D (
00474 const FPOINT2D& point,
00475 const float radius,
00476 const float start,
00477 const float sweep,
00478 const COLOR& color
00479 );
00480
00481 ERRVALUE FillArcChord(
00482 const FPOINT2D& point1,
00483 const FPOINT2D& point2,
00484 const FPOINT2D& center,
00485 const float radius,
00486 const COLOR& color
00487 );
00488
00489 ERRVALUE FillEllipse2D (
00490 const FPOINT2D& point,
00491 const float x,
00492 const float y,
00493 const float rotation,
00494 const COLOR& color
00495 );
00496
00497 ERRVALUE FillSphericalTriangle3D (
00498 const FPOINT3D& center,
00499 const float radius,
00500 const INT32 depth,
00501 const FPOINT3D& pt1,
00502 const FPOINT3D& pt2,
00503 const FPOINT3D& pt3,
00504 const COLOR& color
00505 );
00506
00507 ERRVALUE FillSphere3D (
00508 const FPOINT3D& center,
00509 const float radius,
00510 const COLOR& color
00511 );
00512
00513 ERRVALUE FillCube3D (
00514 const FPOINT3D& center,
00515 const float x,
00516 const float y,
00517 const float z,
00518 const COLOR& color
00519 );
00520
00521 ERRVALUE FillCylindricalRectangle3D (
00522 const FPOINT3D& scenter,
00523 const float sradius,
00524 const FPOINT3D& ecenter,
00525 const float eradius,
00526 const FPOINT3D& n1,
00527 const FPOINT3D& n2,
00528 const INT32 depth,
00529 const COLOR& color
00530 );
00531
00532 ERRVALUE FillCylinder3D (
00533 const FPOINT3D& scenter,
00534 const float sradius,
00535 const FPOINT3D& ecenter,
00536 const float eradius,
00537 const COLOR& color
00538 );
00539
00540 ERRVALUE FillTriangles2DSolid (
00541 const SIMPLE_ARRAY<DTRIANGLE2D>& triangles,
00542 const COLOR& color
00543 );
00544
00545 ERRVALUE FillTriangles2DUseBitmap (
00546 const SIMPLE_ARRAY<DTRIANGLE2D>& triangles,
00547 const POLYSTYLE& style,
00548 const RVC::STYLE::BITMAPPATTERN& pattern
00549 );
00550
00551 DRECT2D ComputeExtents (
00552 const SIMPLE_ARRAY<DTRIANGLE2D>& triangles
00553 );
00554
00555 ERRVALUE FillRectangle2DUseHatch (
00556 const DRECT2D& extents,
00557 const POLYSTYLE& style,
00558 const RVC::STYLE::HATCHPATTERN& pattern
00559 );
00560
00561 ERRVALUE FillBorder2DSolid (
00562 const POLYLINE& polyline,
00563 const POLYSTYLE& style
00564 );
00565
00566 ERRVALUE FillBorder2DSolid (
00567 const POLYLINE& polyline,
00568 const float thickness,
00569 const COLOR& color,
00570 const MGD::LINEJOIN linejoin = MGD::LINEJOIN_Round
00571 );
00572
00573 ERRVALUE FillBorder2DUsePattern (
00574 const POLYLINE& polyline,
00575 const POLYSTYLE& style,
00576 const RVC::STYLE::LINEPATTERN& pattern
00577 );
00578
00579 ERRVALUE FillPolygon2D (
00580 const POLYLINE& polyline,
00581 const bool fill,
00582 const float thickness,
00583 const COLOR& color,
00584 const MGD::LINEJOIN linejoin = MGD::LINEJOIN_Round
00585 );
00586
00587 ERRVALUE FillSubRegion2D (
00588 const SUBREGION2D& subregion,
00589 const bool fill,
00590 const float thickness,
00591 const COLOR& color,
00592 const MGD::LINEJOIN linejoin = MGD::LINEJOIN_Round
00593 );
00594
00595 ERRVALUE FillRegion2D (
00596 const REGION2D& region,
00597 const bool fill,
00598 const float thickness,
00599 const COLOR& color,
00600 const MGD::LINEJOIN linejoin = MGD::LINEJOIN_Round
00601 );
00602
00603 void ApplyAffineForward (
00604 const TRANS2D_AFFINE& affine,
00605 FPOINT2D& point
00606 );
00607
00608 void ApplyAffineInverse (
00609 const TRANS2D_AFFINE& affine,
00610 FPOINT2D& point
00611 );
00612
00613 void SetMask (
00614 const SIMPLE_ARRAY<DTRIANGLE2D> triangles,
00615 GRE::POINTSFIELD& PointsField
00616 );
00617
00618 void ClearMask (
00619 GRE::POINTSFIELD& PointsField
00620 );
00621
00622 ERRVALUE DrawPixels (
00623 SIMPLE_ARRAY<FPOINT3D>& points,
00624 const COLOR& color
00625 );
00626
00627 ERRVALUE GRE::GEOMETRIC3D_BUILDER::DrawPixels (
00628 SIMPLE_ARRAY<FPOINT3D>& points,
00629 const COLOR& color,
00630 const RVC::STYLE::BITMAPPATTERN& pattern
00631 );
00632
00633 ERRVALUE GRE::GEOMETRIC3D_BUILDER::DrawTriangle3D (
00634 const FPOINT3D& pt1,
00635 const FPOINT3D& pt2,
00636 const FPOINT3D& pt3,
00637 const COLOR& color
00638 );
00639
00640 ERRVALUE ConstructScales ();
00641 double GetElevation( const double x, const double y);
00642
00643 };
00644
00645
00646
00647 class GEOMETRIC3D_ELEMENTS {
00648
00649 public:
00650
00651 class ITERATOR_BASE {
00652 public:
00653
00654 virtual ~ITERATOR_BASE (
00655 ) {};
00656
00657
00658 virtual INT32 operator* (
00659 ) const = 0;
00660
00661
00662 virtual ITERATOR_BASE* operator++ (
00663 ) = 0;
00664
00665
00666 virtual bool operator== (
00667 const ITERATOR_BASE* rhs
00668 ) const = 0;
00669
00670
00671 virtual bool operator!= (
00672 const ITERATOR_BASE* rhs
00673 ) const = 0;
00674
00675 protected:
00676
00677 ITERATOR_BASE () {};
00678
00679 };
00680
00681
00682 class BITSET_ITERATOR_BASE : public ITERATOR_BASE {
00683 public:
00684
00685 ~BITSET_ITERATOR_BASE () {};
00686
00687 void Begin();
00688
00689 void End();
00690
00691 INT32 operator* () const;
00692
00693 GRE::GEOMETRIC3D_ELEMENTS::ITERATOR_BASE* operator++ ();
00694
00695 bool operator== (
00696 const GRE::GEOMETRIC3D_ELEMENTS::ITERATOR_BASE* rhs
00697 ) const;
00698
00699 bool operator!= (
00700 const GRE::GEOMETRIC3D_ELEMENTS::ITERATOR_BASE* rhs
00701 ) const;
00702
00703 protected:
00704
00705 BITSET_ITERATOR_BASE (const bool selected) : m_Selected(selected) { End(); };
00706
00707 private:
00708
00709 const bool m_Selected;
00710 BITSET m_Bitset;
00711 BITSET::ITERATOR m_Iterator;
00712
00713 BITSET_ITERATOR_BASE ();
00714
00715 virtual ERRVALUE ComputeSelectedElements (BITSET& bitset) = 0;
00716 virtual ERRVALUE ComputeHighlightedElements (BITSET& bitset) = 0;
00717
00718 };
00719
00720 class ITERATOR;
00721 friend class ITERATOR;
00722
00723 class ITERATOR {
00724 public:
00725
00726 ITERATOR () : m_Base(0) {};
00727 ~ITERATOR () {};
00728
00729
00730 INT32 operator* (
00731 ) const {return m_Base->operator*();};
00732
00733
00734 ITERATOR& operator++ (
00735 ) {m_Base->operator++(); return *this; }
00736
00737
00738 bool operator== (
00739 const ITERATOR& rhs
00740 ) const { return m_Base->operator==(rhs.m_Base); };
00741
00742
00743 bool operator!= (
00744 const ITERATOR& rhs
00745 ) const { return m_Base->operator!=(rhs.m_Base); };
00746
00747 private:
00748
00749 ITERATOR_BASE *m_Base;
00750
00751 ITERATOR (ITERATOR_BASE* base) : m_Base(base) {};
00752
00753 friend class GEOMETRIC3D_ELEMENTS;
00754 };
00755
00756 GEOMETRIC3D_ELEMENTS (
00757 ) {};
00758
00759 virtual ~GEOMETRIC3D_ELEMENTS (
00760 ) {};
00761
00762
00763
00764
00765 bool IsTerrainNeeded (
00766 ) { return v_IsTerrainNeeded(); };
00767
00768
00769
00770
00771 bool IsPointsFieldNeeded (
00772 ) { return v_IsPointsFieldNeeded(); };
00773
00774 void ConstructWireframe (
00775 const INT32 id,
00776 GEOMETRIC3D_BUILDER* builder
00777 ) { v_ConstructWireframe(id, builder); return; };
00778
00779 void ConstructSolid (
00780 const INT32 id,
00781 GEOMETRIC3D_BUILDER* builder
00782 ) { v_ConstructSolid(id, builder); return; };
00783
00784 void OnConstructionBegin (
00785 const bool wireframe
00786 ) { v_OnConstructionBegin(wireframe); return; };
00787
00788 void OnConstructionEnd (
00789 ) { v_OnConstructionEnd(); return; };
00790
00791 ITERATOR BeginSelected (
00792 ) { return ITERATOR(GetSelectedBase(true)); };
00793
00794 ITERATOR EndSelected (
00795 ) { return ITERATOR(GetSelectedBase(false)); };
00796
00797 ITERATOR BeginHighlited (
00798 ) { return ITERATOR(GetHighlightedBase(true)); };
00799
00800 ITERATOR EndHighlited (
00801 ) { return ITERATOR(GetHighlightedBase(false)); };
00802
00803 INT32 GetActiveElement (
00804 ) { return v_GetActiveElement(); };
00805
00806 INT32 GetNumSelectedElements (
00807 ) { return v_GetNumSelectedElements(); };
00808
00809 INT32 GetNumHighlightedElements (
00810 ) { return v_GetNumHighlightedElements(); };
00811
00812 private:
00813
00814 #ifndef GENERATING_DOXYGEN_OUTPUT
00815
00816 virtual ITERATOR_BASE* GetSelectedBase (const bool begin) = 0;
00817 virtual ITERATOR_BASE* GetHighlightedBase (const bool begin) = 0;
00818 virtual INT32 v_GetActiveElement () = 0;
00819 virtual INT32 v_GetNumSelectedElements () = 0;
00820 virtual INT32 v_GetNumHighlightedElements () = 0;
00821 virtual void v_ConstructWireframe (const INT32 id, GEOMETRIC3D_BUILDER* builder) = 0;
00822 virtual void v_ConstructSolid (const INT32 id, GEOMETRIC3D_BUILDER* builder) = 0;
00823 virtual void v_OnConstructionBegin (const bool ) { return; };
00824 virtual void v_OnConstructionEnd () { return; };
00825 virtual bool v_IsTerrainNeeded () = 0;
00826 virtual bool v_IsPointsFieldNeeded () = 0;
00827
00828
00829 #endif
00830 };
00831
00832 typedef SIMPLE_ARRAY<GEOMETRIC3D_ELEMENTS*> GEOMETRIC3D_ELEMENTS_ARRAY;
00833
00834 }
00835
00836 #endif
00837