1 // File: OpenGl_MarkerSet.cxx
2 // Created: 13 July 2011
3 // Author: Sergey ZERCHANINOV
4 // Copyright: OPEN CASCADE 2011
6 #include <OpenGl_MarkerSet.hxx>
8 #include <OpenGl_tgl_all.hxx>
11 #include <OpenGl_AspectMarker.hxx>
12 #include <OpenGl_Structure.hxx>
13 #include <OpenGl_Display.hxx>
15 /*----------------------------------------------------------------------*/
17 OpenGl_MarkerSet::OpenGl_MarkerSet (const Standard_Integer ANbPoints, const Graphic3d_Vertex *APoints)
18 : myNbPoints(ANbPoints),
19 myPoints(new TEL_POINT[ANbPoints])
21 memcpy( myPoints, APoints, ANbPoints*sizeof(TEL_POINT) );
24 /*----------------------------------------------------------------------*/
26 OpenGl_MarkerSet::~OpenGl_MarkerSet ()
32 /*----------------------------------------------------------------------*/
34 void OpenGl_MarkerSet::Render (const Handle(OpenGl_Workspace) &AWorkspace) const
36 const OpenGl_AspectMarker *aspect_marker = AWorkspace->AspectMarker( Standard_True );
38 // Use highlight colors
39 glColor3fv( (AWorkspace->NamedStatus & OPENGL_NS_HIGHLIGHT)? AWorkspace->HighlightColor->rgb : aspect_marker->Color().rgb );
44 switch ( aspect_marker->Type() )
46 case Aspect_TOM_O_POINT :
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++ )
52 glRasterPos3fv( ptr->xyz );
53 glCallLists( strlen( str ), GL_UNSIGNED_BYTE, (const GLubyte *) str );
56 case Aspect_TOM_POINT :
58 glPointSize( aspect_marker->Scale() );
60 for( i = 0, ptr = myPoints; i < myNbPoints; i++, ptr++ )
61 glVertex3fv( ptr->xyz );
67 switch ( aspect_marker->Type() )
69 case Aspect_TOM_RING1 :
70 case Aspect_TOM_RING2 :
71 case Aspect_TOM_RING3 :
73 const float ADelta = 0.1f;
74 float AScale = aspect_marker->Scale();
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;
81 ALimit = AScale * 0.8f;
82 AWorkspace->GetDisplay()->SetBaseForMarker();
83 for( i = 0, ptr = myPoints; i < myNbPoints; i++, ptr++ )
85 glRasterPos3fv( ptr->xyz );
86 AScale = aspect_marker->Scale();
87 while (AScale > ALimit && AScale >= 1.f)
89 const char *str = AWorkspace->GetDisplay()->GetStringForMarker( Aspect_TOM_O, AScale );
90 glCallLists( strlen( str ), GL_UNSIGNED_BYTE, (const GLubyte *) str );
96 case Aspect_TOM_USERDEFINED :
98 for( i = 0, ptr = myPoints; i < myNbPoints; i++, ptr++ )
100 glRasterPos3fv( ptr->xyz );
101 glCallList( openglDisplay->GetUserMarkerListIndex( (int)aspect_marker->Scale() ) );
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++ )
111 glRasterPos3fv( ptr->xyz );
112 glCallLists( strlen( str ), GL_UNSIGNED_BYTE, (const GLubyte *) str );
117 glGetIntegerv( GL_RENDER_MODE, &mode );
118 if( mode==GL_FEEDBACK )
120 glBegin( GL_POINTS );
121 for( i = 0, ptr = myPoints; i < myNbPoints; i++, ptr++ )
122 glVertex3fv( ptr->xyz );
129 /*----------------------------------------------------------------------*/