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