void ocpnDC::DrawPolygon( int n, wxPoint points[], wxCoord xoffset, wxCoord yoffset, float scale ) { if( dc ) dc->DrawPolygon( n, points, xoffset, yoffset ); #ifdef ocpnUSE_GL else { #ifdef __WXQT__ SetGLAttrs( false ); // Some QT platforms (Android) have trouble with GL_BLEND / GL_LINE_SMOOTH #else SetGLAttrs( true ); #endif if( ConfigureBrush() ) { glBegin( GL_POLYGON ); for( int i = 0; i < n; i++ ) glVertex2f( (points[i].x * scale) + xoffset, (points[i].y * scale) + yoffset ); glEnd(); } if( ConfigurePen() ) { glBegin( GL_LINE_LOOP ); for( int i = 0; i < n; i++ ) glVertex2f( (points[i].x * scale) + xoffset, (points[i].y * scale) + yoffset ); glEnd(); } SetGLAttrs( false ); } #endif }
void ODDC::DrawPolygon( int n, wxPoint points[], wxCoord xoffset, wxCoord yoffset, float scale ) { if( dc ) dc->DrawPolygon( n, points, xoffset, yoffset ); #ifdef ocpnUSE_GL else { SetGLAttrs( true ); if( ConfigureBrush() ) { glBegin( GL_POLYGON ); for( int i = 0; i < n; i++ ) glVertex2f( (points[i].x * scale) + xoffset, (points[i].y * scale) + yoffset ); glEnd(); } if( ConfigurePen() ) { glBegin( GL_LINE_LOOP ); for( int i = 0; i < n; i++ ) glVertex2f( (points[i].x * scale) + xoffset, (points[i].y * scale) + yoffset ); glEnd(); } SetGLAttrs( false ); } #endif }
void ODDC::DrawLines( int n, wxPoint points[], wxCoord xoffset, wxCoord yoffset, bool b_hiqual ) { if( dc ) dc->DrawLines( n, points, xoffset, yoffset ); #ifdef ocpnUSE_GL else if( ConfigurePen() ) { SetGLAttrs( b_hiqual ); bool b_draw_thick = false; glDisable( GL_LINE_STIPPLE ); SetGLStipple(); // Enable anti-aliased lines, at best quality if( b_hiqual ) { glEnable( GL_BLEND ); if( m_pen.GetWidth() > 1 ) { GLint parms[2]; glGetIntegerv( GL_SMOOTH_LINE_WIDTH_RANGE, &parms[0] ); if( m_pen.GetWidth() > parms[1] ) b_draw_thick = true; else glLineWidth( wxMax(g_GLMinSymbolLineWidth, m_pen.GetWidth()) ); } else glLineWidth( wxMax(g_GLMinSymbolLineWidth, 1) ); } else { if( m_pen.GetWidth() > 1 ) { GLint parms[2]; glGetIntegerv( GL_ALIASED_LINE_WIDTH_RANGE, &parms[0] ); if( m_pen.GetWidth() > parms[1] ) b_draw_thick = true; else glLineWidth( wxMax(g_GLMinSymbolLineWidth, m_pen.GetWidth()) ); } else glLineWidth( wxMax(g_GLMinSymbolLineWidth, 1) ); } if( b_draw_thick) { DrawGLThickLines( n, points, xoffset, yoffset, m_pen, b_hiqual ); } else { if( b_hiqual ) { glEnable( GL_LINE_SMOOTH ); } glBegin( GL_LINE_STRIP ); for( int i = 0; i < n; i++ ) glVertex2i( points[i].x + xoffset, points[i].y + yoffset ); glEnd(); } glDisable( GL_LINE_STIPPLE ); SetGLAttrs( false ); } #endif }
void ocpnDC::DrawPolygon( int n, wxPoint points[], wxCoord xoffset, wxCoord yoffset ) { if( dc ) dc->DrawPolygon( n, points, xoffset, yoffset ); #ifdef ocpnUSE_GL else { glPushAttrib( GL_ENABLE_BIT | GL_COLOR_BUFFER_BIT | GL_LINE_BIT | GL_HINT_BIT | GL_POLYGON_BIT ); //Save state SetGLAttrs( true ); if( ConfigureBrush() ) { glBegin( GL_POLYGON ); for( int i = 0; i < n; i++ ) glVertex2i( points[i].x + xoffset, points[i].y + yoffset ); glEnd(); } if( ConfigurePen() ) { glBegin( GL_LINE_LOOP ); for( int i = 0; i < n; i++ ) glVertex2i( points[i].x + xoffset, points[i].y + yoffset ); glEnd(); } glPopAttrib(); } #endif }
void ocpnDC::DrawPolygonTessellated( int n, wxPoint points[], wxCoord xoffset, wxCoord yoffset ) { if( dc ) dc->DrawPolygon( n, points, xoffset, yoffset ); #ifdef ocpnUSE_GL else { # ifndef ocpnUSE_GLES // tessalator in glues is broken if( n < 5 ) # endif { DrawPolygon( n, points, xoffset, yoffset ); return; } glPushAttrib( GL_ENABLE_BIT | GL_COLOR_BUFFER_BIT | GL_LINE_BIT | GL_HINT_BIT | GL_POLYGON_BIT ); //Save state SetGLAttrs( false ); static GLUtesselator *tobj = NULL; if( ! tobj ) tobj = gluNewTess(); gluTessCallback( tobj, GLU_TESS_VERTEX, (_GLUfuncptr) &ocpnDCvertexCallback ); gluTessCallback( tobj, GLU_TESS_BEGIN, (_GLUfuncptr) &ocpnDCbeginCallback ); gluTessCallback( tobj, GLU_TESS_END, (_GLUfuncptr) &ocpnDCendCallback ); gluTessCallback( tobj, GLU_TESS_COMBINE, (_GLUfuncptr) &ocpnDCcombineCallback ); gluTessCallback( tobj, GLU_TESS_ERROR, (_GLUfuncptr) &ocpnDCerrorCallback ); gluTessNormal( tobj, 0, 0, 1); gluTessProperty( tobj, GLU_TESS_WINDING_RULE, GLU_TESS_WINDING_NONZERO ); if( ConfigureBrush() ) { gluTessBeginPolygon( tobj, NULL ); gluTessBeginContour( tobj ); for( int i = 0; i < n; i++ ) { GLvertex* vertex = new GLvertex(); gTesselatorVertices.Add( vertex ); vertex->info.x = (GLdouble) points[i].x; vertex->info.y = (GLdouble) points[i].y; vertex->info.z = (GLdouble) 0.0; vertex->info.r = (GLdouble) 0.0; vertex->info.g = (GLdouble) 0.0; vertex->info.b = (GLdouble) 0.0; gluTessVertex( tobj, (GLdouble*)vertex, (GLdouble*)vertex ); } gluTessEndContour( tobj ); gluTessEndPolygon( tobj ); } glPopAttrib(); for( unsigned int i=0; i<gTesselatorVertices.Count(); i++ ) delete (GLvertex*)gTesselatorVertices.Item(i); gTesselatorVertices.Clear(); } #endif }
void ocpnDC::DrawLines( int n, wxPoint points[], wxCoord xoffset, wxCoord yoffset, bool b_hiqual ) { if( dc ) dc->DrawLines( n, points, xoffset, yoffset ); else if( ConfigurePen() ) { glPushAttrib( GL_COLOR_BUFFER_BIT | GL_LINE_BIT | GL_HINT_BIT ); //Save state SetGLAttrs( b_hiqual ); bool b_draw_thick = false; SetGLStipple(); // Enable anti-aliased lines, at best quality if( b_hiqual ) { if( m_pen.GetWidth() > 1 ) { GLint parms[2]; glGetIntegerv( GL_SMOOTH_LINE_WIDTH_RANGE, &parms[0] ); if( m_pen.GetWidth() > parms[1] ) b_draw_thick = true; else glLineWidth( wxMax(g_GLMinLineWidth, m_pen.GetWidth()) ); } else glLineWidth( wxMax(g_GLMinLineWidth, 1) ); } else { if( m_pen.GetWidth() > 1 ) { GLint parms[2]; glGetIntegerv( GL_ALIASED_LINE_WIDTH_RANGE, &parms[0] ); if( m_pen.GetWidth() > parms[1] ) b_draw_thick = true; else glLineWidth( wxMax(g_GLMinLineWidth, m_pen.GetWidth()) ); } else glLineWidth( wxMax(g_GLMinLineWidth, 1) ); } if( b_draw_thick/*m_pen.GetWidth() > 1*/) { wxPoint p0 = points[0]; for( int i = 1; i < n; i++ ) { DrawThickLine( p0.x + xoffset, p0.y + yoffset, points[i].x + xoffset, points[i].y + yoffset, m_pen, b_hiqual ); p0 = points[i]; } } else { glBegin( GL_LINE_STRIP ); for( int i = 0; i < n; i++ ) glVertex2i( points[i].x + xoffset, points[i].y + yoffset ); glEnd(); } glPopAttrib(); // restore state } }