0022819: Redesign of OpenGl driver Additional integration
[occt.git] / src / OpenGl / OpenGl_MarkerSet.cxx
1 // File:      OpenGl_MarkerSet.cxx
2 // Created:   13 July 2011
3 // Author:    Sergey ZERCHANINOV
4 // Copyright: OPEN CASCADE 2011
5
6 #include <OpenGl_MarkerSet.hxx>
7
8 #include <OpenGl_tgl_all.hxx>
9 #include <GL/gl.h>
10
11 #include <OpenGl_AspectMarker.hxx>
12 #include <OpenGl_Structure.hxx>
13 #include <OpenGl_Display.hxx>
14
15 /*----------------------------------------------------------------------*/
16
17 OpenGl_MarkerSet::OpenGl_MarkerSet (const Standard_Integer ANbPoints, const Graphic3d_Vertex *APoints)
18 : myNbPoints(ANbPoints),
19   myPoints(new TEL_POINT[ANbPoints])
20 {
21   memcpy( myPoints, APoints, ANbPoints*sizeof(TEL_POINT) );
22 }
23
24 /*----------------------------------------------------------------------*/
25
26 OpenGl_MarkerSet::~OpenGl_MarkerSet ()
27 {
28   if (myPoints)
29     delete[] myPoints;
30 }
31
32 /*----------------------------------------------------------------------*/
33
34 void OpenGl_MarkerSet::Render (const Handle(OpenGl_Workspace) &AWorkspace) const
35 {
36   const OpenGl_AspectMarker *aspect_marker = AWorkspace->AspectMarker( Standard_True );
37
38   // Use highlight colors
39   glColor3fv( (AWorkspace->NamedStatus & OPENGL_NS_HIGHLIGHT)? AWorkspace->HighlightColor->rgb : aspect_marker->Color().rgb );
40
41   const TEL_POINT *ptr;
42   Tint i;
43
44   switch ( aspect_marker->Type() )
45   {
46     case Aspect_TOM_O_POINT :
47     {
48       const char *str = AWorkspace->GetDisplay()->GetStringForMarker( Aspect_TOM_O, aspect_marker->Scale() );
49       AWorkspace->GetDisplay()->SetBaseForMarker();
50       for( i = 0, ptr = myPoints; i < myNbPoints; i++, ptr++ )
51       {
52         glRasterPos3fv( ptr->xyz );
53         glCallLists( strlen( str ), GL_UNSIGNED_BYTE, (const GLubyte *) str );
54       }
55     }
56     case Aspect_TOM_POINT :
57     {
58       glPointSize( aspect_marker->Scale() );
59       glBegin( GL_POINTS );
60       for( i = 0, ptr = myPoints; i < myNbPoints; i++, ptr++ )
61         glVertex3fv( ptr->xyz );
62       glEnd();
63       break;
64     }
65     default:
66     {
67       switch ( aspect_marker->Type() )
68       {
69         case Aspect_TOM_RING1 :
70         case Aspect_TOM_RING2 :
71         case Aspect_TOM_RING3 :
72         {
73           const float ADelta = 0.1f;
74           float AScale = aspect_marker->Scale();
75           float ALimit = 0.f;
76           if (aspect_marker->Type() == Aspect_TOM_RING1)
77             ALimit = AScale * 0.2f;
78           else if (aspect_marker->Type() == Aspect_TOM_RING2)
79             ALimit = AScale * 0.5f;
80           else
81             ALimit = AScale * 0.8f;
82           AWorkspace->GetDisplay()->SetBaseForMarker();
83           for( i = 0, ptr = myPoints; i < myNbPoints; i++, ptr++ )
84           {
85             glRasterPos3fv( ptr->xyz );
86             AScale = aspect_marker->Scale();
87             while (AScale > ALimit && AScale >= 1.f)
88             {
89               const char *str = AWorkspace->GetDisplay()->GetStringForMarker( Aspect_TOM_O, AScale );
90               glCallLists( strlen( str ), GL_UNSIGNED_BYTE, (const GLubyte *) str );
91               AScale -= ADelta;
92             }
93           }
94           break;
95         }
96         case Aspect_TOM_USERDEFINED :
97         {
98           for( i = 0, ptr = myPoints; i < myNbPoints; i++, ptr++ )
99           {
100             glRasterPos3fv( ptr->xyz );
101             glCallList( openglDisplay->GetUserMarkerListIndex( (int)aspect_marker->Scale() ) );
102           }
103           break;
104         }
105         default :
106         {
107           AWorkspace->GetDisplay()->SetBaseForMarker();
108           const char *str = AWorkspace->GetDisplay()->GetStringForMarker( aspect_marker->Type(), aspect_marker->Scale() );
109           for( i = 0, ptr = myPoints; i < myNbPoints; i++, ptr++ )
110           {
111             glRasterPos3fv( ptr->xyz );
112             glCallLists( strlen( str ), GL_UNSIGNED_BYTE, (const GLubyte *) str );
113           }
114         }
115       }
116       GLint mode;
117       glGetIntegerv( GL_RENDER_MODE, &mode );
118       if( mode==GL_FEEDBACK )
119       {
120         glBegin( GL_POINTS );
121         for( i = 0, ptr = myPoints; i < myNbPoints; i++, ptr++ )
122           glVertex3fv( ptr->xyz );
123         glEnd();
124       }
125     }
126   }
127 }
128
129 /*----------------------------------------------------------------------*/