Announcement

Collapse

Forum Guidelines

This forum is for finished source code that is working properly. If you have questions about this or any other source code, please post it in one of the Discussion Forums, not here.
See more
See less

OpenGL Template (DDT) for PowerBASIC Programmers

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • PBWin OpenGL Template (DDT) for PowerBASIC Programmers

    This source code provides a template for using OpenGL in PowerBASIC applications.
    The template also includes various user-interface features which are not provided by OpenGL.

    I've also put an OpenGL tutorial for PowerBASIC programmers in the forums. That
    posting is an abbreviated version of the full tutorial that I've put online at my web site.

    A discussion thread for the OpenGL template has been started here.

    To run this, you'll the OpenGL include files from Jose Roca's site (part of his Windows API headers download).

    Here's the compilable code for the template:
    Code:
    '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 anglex, angley, anglez, 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,1  '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
             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
                   KillTimer CB.Hndl, %ID_Timer     
                   SpinInWork = 1
                   GetCursorPos pt              'pt has xy screen coordinates
                   ScreenToClient hDC, pt       'pt now has dialog client coordinates
                   XLast = Pt.x
                   YLast = Pt.y
                Case %WM_MouseMove
                   If SpinInWork Then
                      GetCursorPos pt           'pt has xy screen coordinates
                      ScreenToClient hDC, pt    'pt now has dialog client coordinates
                      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
       BuildDisplayList 1
    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)
       glClear %gl_color_buffer_bit Or %gl_depth_buffer_bit  'clear buffers
       glLoadIdentity               'clear the modelview matrix
    
       gluLookAt 0,0,6,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
    
       glCallList 1
    
       SwapBuffers hDC              'display the buffer (image)
    End Sub 
    
    Sub BuildDisplayList(ListNumber As Long)
       glNewList ListNumber, %gl_compile
          glBegin %GL_QUADS
             glColor3f   0.0,  1.0,  0.0         ' Set the color to green
             glVertex3f  1.0,  1.0, -1.0         ' Top right of the quad (Top)
             glVertex3f -1.0,  1.0, -1.0         ' Top left of the quad (Top)
             glVertex3f -1.0,  1.0,  1.0         ' Bottom left of the quad (Top)
             glVertex3f  1.0,  1.0,  1.0         ' Bottom right of the quad (Top)
       
             glColor3f   1.0,  0.5,  0.0         ' Set the color to orange
             glVertex3f  1.0, -1.0,  1.0         ' Top right of the quad (Bottom)
             glVertex3f -1.0, -1.0,  1.0         ' Top left of the quad (Bottom)
             glVertex3f -1.0, -1.0, -1.0         ' Bottom left of the quad (Bottom)
             glVertex3f  1.0, -1.0, -1.0         ' Bottom right of the quad (Bottom)
       
             glColor3f   1.0,  0.0,  0.0         ' Set the color to red
             glVertex3f  1.0,  1.0,  1.0         ' Top right of the quad (Front)
             glVertex3f -1.0,  1.0,  1.0         ' Top left of the quad (Front)
             glVertex3f -1.0, -1.0,  1.0         ' Bottom left of the quad (Front)
             glVertex3f  1.0, -1.0,  1.0         ' Bottom right of the quad (Front)
       
             glColor3f   1.0,  1.0,  0.0         ' Set the color to yellow
             glVertex3f  1.0, -1.0, -1.0         ' Top right of the quad (Back)
             glVertex3f -1.0, -1.0, -1.0         ' Top left of the quad (Back)
             glVertex3f -1.0,  1.0, -1.0         ' Bottom left of the quad (Back)
             glVertex3f  1.0,  1.0, -1.0         ' Bottom right of the quad (Back)
       
             glColor3f   0.0,  0.0,  1.0         ' Set the color to blue
             glVertex3f -1.0,  1.0,  1.0         ' Top right of the quad (Left)
             glVertex3f -1.0,  1.0, -1.0         ' Top left of the quad (Left)
             glVertex3f -1.0, -1.0, -1.0         ' Bottom left of the quad (Left)
             glVertex3f -1.0, -1.0,  1.0         ' Bottom right of the quad (Left)
       
             glColor3f   1.0,  0.0,  1.0         ' Set the color to violet
             glVertex3f  1.0,  1.0, -1.0         ' Top right of the quad (Right)
             glVertex3f  1.0,  1.0,  1.0         ' Top left of the quad (Right)
             glVertex3f  1.0, -1.0,  1.0         ' Bottom left of the quad (Right)
             glVertex3f  1.0, -1.0, -1.0         ' Bottom right of the quad (Right)
          glEnd
       glEndList
    End Sub
    
    'gbs_00589
    Last edited by Gary Beene; 10 Jun 2010, 09:26 PM.

  • #2
    Multiple updates: 9 June 2010
    1. Added ReleaseDC line in %WM_Close
    2. Removed glDepthFunc line (value was set to default, so not needed)
    3. Removed glShadeModel line (value was set to default, so not needed)
    4. Replaced Diamond shape with Cube (more useful)
    5. Now uses display list (preferred strategy for multiple use of drawing code lines)
    6. CBMSG changed to CB.Msg
    7. Auto-Rotation stopped during use of mouse to manually spin display

    Comment

    Working...
    X