Line, Wide, Antialiasing

Category: OpenGL

Date: 07-23-2010

Return to Index


 
'When a point is drawn, a single pixel is normally used, but can be changed
'with glPointSize.  By default, a large pixel is drawn square, but 
'a pixel is drawn squareWith %gl_point_smooth enabled, the point is drawn circular
'With glHint, the appearance/speed can be adjusted
 
'Primary Code:
'glLineWidth will see the size of the line, whereas glEnable and glHint are
'used to provide the best image
 
   glEnable %gl_line_smooth                'enable antialiasing
   glHint %gl_line_smooth_hint, %gl_nicest 'best quality
   glLineWidth 4                           'change line width to 4 pixels
   glBegin %gl_lines
      glColor3f 1,0,0 : glvertex3f -5,-5,-5
      glColor3f 0,0,1 : glvertex3f  4,4,4
   glEnd
 
'Once changed, the line width remains at the new value until changed by
'another statement.
 
 
 
'Compilable Example:
#Compile Exe
#Dim All
#Include "win32api.inc"
#Include "gl.inc"
#Include "glu.inc"
 
%ID_Timer = 1000
 
Global hDlg, hDC, hRC As DWord
Global scalefactor As Single
 
Function PBMain() As Long
  Dialog New Pixels, 0, "OpenGL Example",,, 320, 240,%WS_OverlappedWindow To hDlg
  Dialog Show Modal hdlg Call dlgproc
End Function
 
CallBack Function dlgproc()
   Local pt As Point
   Local XDelta, YDelta as Single
   Static SpinInWork,XLast,YLast As Long
 
   Select Case CB.Msg
      Case %WM_InitDialog : GetRenderContext
                            InitializeScene
                            SetTimer(hDlg, %ID_Timer, 50, %NULL)
                            ScaleFactor = 1
      Case %WM_Timer      : DrawScene 1,1,0  'redraw with rotation on all 3 axes
      Case %WM_Paint      : DrawScene 0,0,0  'redraw with no rotation
      Case %WM_Size       : ResizeScene Lo(Word, CB.lParam), Hi(Word, CB.lParam)
                            DrawScene 0,0,0  'redraw with no rotation
      Case %WM_Close      : wglmakecurrent %null, %null 'unselect rendering context
                            wgldeletecontext hRC        'delete the rendering context
                            releasedc hDlg, hDC         'release device context      Case %WM_MouseWheel
      Case %WM_MouseWheel
         Select Case Hi(Integer,CB.wParam)
            Case > 0  : ScaleFactor = ScaleFactor + 0.1 : DrawScene 0,0,0
            Case < 0  : ScaleFactor = ScaleFactor - 0.1 : DrawScene 0,0,0
         End Select
      Case %WM_SetCursor
         Select Case Hi(Word, CB.lParam)
            Case %WM_LButtonDown
               GetCursorPos pt              'pt has xy screen coordinates
               ScreenToClient hDlg, pt       'pt now has dialog client coordinates
               If pt.y < 0 Then Exit Select
               KillTimer CB.Hndl, %ID_Timer     
               SpinInWork = 1
               XLast = Pt.x
               YLast = Pt.y
            Case %WM_MouseMove
               If SpinInWork Then
                  GetCursorPos pt           'pt has xy screen coordinates
                  ScreenToClient hDlg, pt    'pt now has dialog client coordinates
                  If pt.y < 0 Then Exit Select
                  XDelta = XLast - Pt.x
                  YDelta = YLast - Pt.y
                  DrawScene -YDelta, -XDelta, 0
                  XLast = pt.x
                  YLast = pt.y
               End If
            Case %WM_LButtonUp
               SetTimer(hDlg, %ID_Timer, 50, %NULL)
               SpinInWork = 0  
         End Select
   End Select
End Function
 
Sub GetRenderContext
   Local pfd As PIXELFORMATDESCRIPTOR   'pixel format properties for device context
   pfd.nSize       =  SizeOf(PIXELFORMATDESCRIPTOR)
   pfd.nVersion    =  1
   pfd.dwFlags     = %pfd_draw_to_window Or %pfd_support_opengl Or %pfd_doublebuffer
   pfd.dwlayermask = %pfd_main_plane
   pfd.iPixelType  = %pfd_type_rgba
   pfd.ccolorbits  = 24
   pfd.cdepthbits  = 24
 
   hDC = GetDC(hDlg)                                      'DC for dialog
   SetPixelFormat(hDC, ChoosePixelFormat(hDC, pfd), pfd)  'set properties of device context
   hRC = wglCreateContext (hDC)                           'get rendering context
   wglMakeCurrent hDC, hRC                                'make the RC current
End Sub
 
Sub InitializeScene
   glClearColor 0,0,0,0     'sets color to be used with glClear
   glClearDepth 1           'sets zvalue to be used with glClear
   glEnable %gl_depth_test                             'enable depth testing   
   glHint %gl_perspective_correction_hint, %gl_nicest  'best quality rendering
End Sub
 
Sub ResizeScene (w As Long, h As Long)
   glViewport 0, 0, w, h                'resize viewport to match window size
   glMatrixMode %gl_projection          'select the projection matrix
      glLoadIdentity                    'reset the projection matrix
      gluPerspective 45, w/h, 0.1, 100  'set frustum using viewport aspect ratio
   glMatrixMode %gl_modelview           'select the modelview matrix
End Sub
 
Sub DrawScene (dx As Single, dy As Single, dz As Single)
   Static anglex, angley, anglez As Single
 
   glClear %gl_color_buffer_bit Or %gl_depth_buffer_bit  'clear buffers
   glLoadIdentity               'clear the modelview matrix
 
   gluLookAt 0,0,20,0,0,0,0,1,0
   glScalef scalefactor, scalefactor, scalefactor
 
   anglex = anglex + dx : glRotatef anglex, 1,0,0
   angley = angley + dy : glRotatef angley, 0,1,0
   anglez = anglez + dz : glRotatef anglez, 0,0,1
 
   glEnable %gl_line_smooth                'enable antialiasing
   glHint %gl_line_smooth_hint, %gl_nicest 'best quality
 
   glLineWidth 1                'change line width to 1 pixels
   glBegin %gl_lines
      glColor3f 1,0,0 : glvertex3f -3,2,4
      glColor3f 0,1,0 : glvertex3f  4,-4,1
   glEnd
 
   glLineWidth 4                'change line width to 4 pixels
   glBegin %gl_lines
      glColor3f 1,0,0 : glvertex3f -5,-5,-5
      glColor3f 0,0,1 : glvertex3f  4,4,4
   glEnd
 
   SwapBuffers hDC              'display the buffer (image)
End Sub 
 
'gbs_00605


created by gbSnippets: http://www.garybeene.com