1 // File: OpenGl_MarkerSet.cxx
2 // Created: 13 July 2011
3 // Author: Sergey ZERCHANINOV
4 // Copyright: OPEN CASCADE 2011
6 #include <OpenGl_GlCore11.hxx>
8 #include <OpenGl_MarkerSet.hxx>
10 #include <OpenGl_AspectMarker.hxx>
11 #include <OpenGl_Structure.hxx>
12 #include <OpenGl_Display.hxx>
14 /*----------------------------------------------------------------------*/
16 OpenGl_MarkerSet::OpenGl_MarkerSet (const Standard_Integer ANbPoints, const Graphic3d_Vertex *APoints)
17 : myNbPoints(ANbPoints),
18 myPoints(new TEL_POINT[ANbPoints])
20 memcpy( myPoints, APoints, ANbPoints*sizeof(TEL_POINT) );
23 /*----------------------------------------------------------------------*/
25 OpenGl_MarkerSet::~OpenGl_MarkerSet ()
31 /*----------------------------------------------------------------------*/
33 void OpenGl_MarkerSet::Render (const Handle(OpenGl_Workspace) &AWorkspace) const
35 const OpenGl_AspectMarker *aspect_marker = AWorkspace->AspectMarker( Standard_True );
37 // Use highlight colors
38 glColor3fv( (AWorkspace->NamedStatus & OPENGL_NS_HIGHLIGHT)? AWorkspace->HighlightColor->rgb : aspect_marker->Color().rgb );
43 switch ( aspect_marker->Type() )
45 case Aspect_TOM_O_POINT :
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++ )
51 glRasterPos3fv( ptr->xyz );
52 glCallLists( strlen( str ), GL_UNSIGNED_BYTE, (const GLubyte *) str );
55 case Aspect_TOM_POINT :
57 glPointSize( aspect_marker->Scale() );
59 for( i = 0, ptr = myPoints; i < myNbPoints; i++, ptr++ )
60 glVertex3fv( ptr->xyz );
66 switch ( aspect_marker->Type() )
68 case Aspect_TOM_RING1 :
69 case Aspect_TOM_RING2 :
70 case Aspect_TOM_RING3 :
72 const float ADelta = 0.1f;
73 float AScale = aspect_marker->Scale();
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;
80 ALimit = AScale * 0.8f;
81 AWorkspace->GetDisplay()->SetBaseForMarker();
82 for( i = 0, ptr = myPoints; i < myNbPoints; i++, ptr++ )
84 glRasterPos3fv( ptr->xyz );
85 AScale = aspect_marker->Scale();
86 while (AScale > ALimit && AScale >= 1.f)
88 const char *str = AWorkspace->GetDisplay()->GetStringForMarker( Aspect_TOM_O, AScale );
89 glCallLists( strlen( str ), GL_UNSIGNED_BYTE, (const GLubyte *) str );
95 case Aspect_TOM_USERDEFINED :
97 for( i = 0, ptr = myPoints; i < myNbPoints; i++, ptr++ )
99 glRasterPos3fv( ptr->xyz );
100 glCallList( openglDisplay->GetUserMarkerListIndex( (int)aspect_marker->Scale() ) );
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++ )
110 glRasterPos3fv( ptr->xyz );
111 glCallLists( strlen( str ), GL_UNSIGNED_BYTE, (const GLubyte *) str );
116 glGetIntegerv( GL_RENDER_MODE, &mode );
117 if( mode==GL_FEEDBACK )
119 glBegin( GL_POINTS );
120 for( i = 0, ptr = myPoints; i < myNbPoints; i++, ptr++ )
121 glVertex3fv( ptr->xyz );
128 /*----------------------------------------------------------------------*/