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