tstOGLSample.cpp revision 4604ab7d38c2bd2dfc255aa1facffdf81c1c9153
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync//
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync// GLSAMPLE.CPP
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync// by Blaine Hodge
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync//
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync// Includes
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync
c58f1213e628a545081c70e26c6b67a841cff880vboxsync#include <windows.h>
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync#include <gl/gl.h>
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync#include <stdio.h>
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync// Function Declarations
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsyncLRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsyncvoid EnableOpenGL(HWND hWnd, HDC * hDC, HGLRC * hRC);
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsyncvoid DisableOpenGL(HWND hWnd, HDC hDC, HGLRC hRC);
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync// WinMain
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsyncint WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync LPSTR lpCmdLine, int iCmdShow)
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync{
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync WNDCLASS wc;
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync HWND hWnd;
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync HDC hDC;
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync HGLRC hRC;
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync MSG msg;
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync BOOL quit = FALSE;
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync float theta = 0.0f;
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync // register window class
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync wc.style = CS_OWNDC;
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync wc.lpfnWndProc = WndProc;
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync wc.cbClsExtra = 0;
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync wc.cbWndExtra = 0;
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync wc.hInstance = hInstance;
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync wc.hIcon = LoadIcon( NULL, IDI_APPLICATION );
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync wc.hCursor = LoadCursor( NULL, IDC_ARROW );
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync wc.hbrBackground = (HBRUSH)GetStockObject( BLACK_BRUSH );
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync wc.lpszMenuName = NULL;
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync wc.lpszClassName = "GLSample";
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync RegisterClass( &wc );
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync // create main window
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync hWnd = CreateWindow(
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync "GLSample", "OpenGL Sample",
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync WS_CAPTION | WS_POPUPWINDOW | WS_VISIBLE,
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync 0, 0, 300, 300,
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync NULL, NULL, hInstance, NULL );
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync // enable OpenGL for the window
d9b086bc8f68cd04745f397f8db45fca87c14365vboxsync EnableOpenGL( hWnd, &hDC, &hRC );
d9b086bc8f68cd04745f397f8db45fca87c14365vboxsync
d9b086bc8f68cd04745f397f8db45fca87c14365vboxsync // program main loop
d9b086bc8f68cd04745f397f8db45fca87c14365vboxsync while ( !quit )
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync {
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync // check for messages
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync if ( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) )
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync {
ae5fc6ddd3d2ccdb941b1aacd23f6791fecc3354vboxsync
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync // handle or dispatch messages
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync if ( msg.message == WM_QUIT )
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync {
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync quit = TRUE;
d9b086bc8f68cd04745f397f8db45fca87c14365vboxsync }
d9b086bc8f68cd04745f397f8db45fca87c14365vboxsync else
d9b086bc8f68cd04745f397f8db45fca87c14365vboxsync {
d9b086bc8f68cd04745f397f8db45fca87c14365vboxsync TranslateMessage( &msg );
d9b086bc8f68cd04745f397f8db45fca87c14365vboxsync DispatchMessage( &msg );
d9b086bc8f68cd04745f397f8db45fca87c14365vboxsync }
d9b086bc8f68cd04745f397f8db45fca87c14365vboxsync
d9b086bc8f68cd04745f397f8db45fca87c14365vboxsync }
b27ea9ec24c539f55433c8c33d0219f14fb354d5vboxsync else
b27ea9ec24c539f55433c8c33d0219f14fb354d5vboxsync {
b27ea9ec24c539f55433c8c33d0219f14fb354d5vboxsync
b27ea9ec24c539f55433c8c33d0219f14fb354d5vboxsync // OpenGL animation code goes here
b27ea9ec24c539f55433c8c33d0219f14fb354d5vboxsync
b27ea9ec24c539f55433c8c33d0219f14fb354d5vboxsync glClearColor( 0.0f, 0.0f, 0.0f, 0.0f );
b27ea9ec24c539f55433c8c33d0219f14fb354d5vboxsync glClear( GL_COLOR_BUFFER_BIT );
b27ea9ec24c539f55433c8c33d0219f14fb354d5vboxsync
b27ea9ec24c539f55433c8c33d0219f14fb354d5vboxsync glPushMatrix();
b27ea9ec24c539f55433c8c33d0219f14fb354d5vboxsync glRotatef( theta, 0.0f, 0.0f, 1.0f );
b27ea9ec24c539f55433c8c33d0219f14fb354d5vboxsync glBegin( GL_TRIANGLES );
b27ea9ec24c539f55433c8c33d0219f14fb354d5vboxsync glColor3f( 1.0f, 0.0f, 0.0f ); glVertex2f( 0.0f, 1.0f );
b27ea9ec24c539f55433c8c33d0219f14fb354d5vboxsync glColor3f( 0.0f, 1.0f, 0.0f ); glVertex2f( 0.87f, -0.5f );
b27ea9ec24c539f55433c8c33d0219f14fb354d5vboxsync glColor3f( 0.0f, 0.0f, 1.0f ); glVertex2f( -0.87f, -0.5f );
b27ea9ec24c539f55433c8c33d0219f14fb354d5vboxsync glEnd();
b27ea9ec24c539f55433c8c33d0219f14fb354d5vboxsync glPopMatrix();
b27ea9ec24c539f55433c8c33d0219f14fb354d5vboxsync
b27ea9ec24c539f55433c8c33d0219f14fb354d5vboxsync SwapBuffers( hDC );
b27ea9ec24c539f55433c8c33d0219f14fb354d5vboxsync
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync theta += 1.0f;
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync }
a5d4a2a6365cbfa15e179bc79d291133c4a0ff1evboxsync
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync }
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync
a5d4a2a6365cbfa15e179bc79d291133c4a0ff1evboxsync printf("GL_VENDOR %s\n", glGetString(GL_VENDOR));
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync printf("GL_RENDERER %s\n", glGetString(GL_RENDERER));
a5d4a2a6365cbfa15e179bc79d291133c4a0ff1evboxsync printf("GL_VERSION %s\n", glGetString(GL_VERSION));
a5d4a2a6365cbfa15e179bc79d291133c4a0ff1evboxsync printf("GL_EXTENSIONS %s\n", glGetString(GL_EXTENSIONS));
a5d4a2a6365cbfa15e179bc79d291133c4a0ff1evboxsync
a5d4a2a6365cbfa15e179bc79d291133c4a0ff1evboxsync // shutdown OpenGL
a5d4a2a6365cbfa15e179bc79d291133c4a0ff1evboxsync DisableOpenGL( hWnd, hDC, hRC );
a5d4a2a6365cbfa15e179bc79d291133c4a0ff1evboxsync
a5d4a2a6365cbfa15e179bc79d291133c4a0ff1evboxsync // destroy the window explicitly
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync DestroyWindow( hWnd );
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync
10028648143893a0291db53b6a5f7d061f8b0fa8vboxsync return msg.wParam;
10028648143893a0291db53b6a5f7d061f8b0fa8vboxsync
10028648143893a0291db53b6a5f7d061f8b0fa8vboxsync}
10028648143893a0291db53b6a5f7d061f8b0fa8vboxsync
10028648143893a0291db53b6a5f7d061f8b0fa8vboxsync// Window Procedure
10028648143893a0291db53b6a5f7d061f8b0fa8vboxsync
10028648143893a0291db53b6a5f7d061f8b0fa8vboxsyncLRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
10028648143893a0291db53b6a5f7d061f8b0fa8vboxsync{
10028648143893a0291db53b6a5f7d061f8b0fa8vboxsync
10028648143893a0291db53b6a5f7d061f8b0fa8vboxsync switch (message)
10028648143893a0291db53b6a5f7d061f8b0fa8vboxsync {
10028648143893a0291db53b6a5f7d061f8b0fa8vboxsync
10028648143893a0291db53b6a5f7d061f8b0fa8vboxsync case WM_CREATE:
10028648143893a0291db53b6a5f7d061f8b0fa8vboxsync return 0;
10028648143893a0291db53b6a5f7d061f8b0fa8vboxsync
10028648143893a0291db53b6a5f7d061f8b0fa8vboxsync case WM_CLOSE:
10028648143893a0291db53b6a5f7d061f8b0fa8vboxsync PostQuitMessage( 0 );
10028648143893a0291db53b6a5f7d061f8b0fa8vboxsync return 0;
10028648143893a0291db53b6a5f7d061f8b0fa8vboxsync
10028648143893a0291db53b6a5f7d061f8b0fa8vboxsync case WM_DESTROY:
10028648143893a0291db53b6a5f7d061f8b0fa8vboxsync return 0;
10028648143893a0291db53b6a5f7d061f8b0fa8vboxsync
10028648143893a0291db53b6a5f7d061f8b0fa8vboxsync case WM_KEYDOWN:
10028648143893a0291db53b6a5f7d061f8b0fa8vboxsync switch ( wParam )
10028648143893a0291db53b6a5f7d061f8b0fa8vboxsync {
10028648143893a0291db53b6a5f7d061f8b0fa8vboxsync
10028648143893a0291db53b6a5f7d061f8b0fa8vboxsync case VK_ESCAPE:
10028648143893a0291db53b6a5f7d061f8b0fa8vboxsync PostQuitMessage(0);
10028648143893a0291db53b6a5f7d061f8b0fa8vboxsync return 0;
10028648143893a0291db53b6a5f7d061f8b0fa8vboxsync
10028648143893a0291db53b6a5f7d061f8b0fa8vboxsync }
10028648143893a0291db53b6a5f7d061f8b0fa8vboxsync return 0;
10028648143893a0291db53b6a5f7d061f8b0fa8vboxsync
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync default:
a5d4a2a6365cbfa15e179bc79d291133c4a0ff1evboxsync return DefWindowProc( hWnd, message, wParam, lParam );
a5d4a2a6365cbfa15e179bc79d291133c4a0ff1evboxsync
a5d4a2a6365cbfa15e179bc79d291133c4a0ff1evboxsync }
a5d4a2a6365cbfa15e179bc79d291133c4a0ff1evboxsync
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync}
a5d4a2a6365cbfa15e179bc79d291133c4a0ff1evboxsync
a5d4a2a6365cbfa15e179bc79d291133c4a0ff1evboxsync// Enable OpenGL
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsyncvoid EnableOpenGL(HWND hWnd, HDC * hDC, HGLRC * hRC)
a5d4a2a6365cbfa15e179bc79d291133c4a0ff1evboxsync{
a5d4a2a6365cbfa15e179bc79d291133c4a0ff1evboxsync PIXELFORMATDESCRIPTOR pfd;
6dc780c3e9adb5f3a0ef93c8f34ba38ac2213776vboxsync int format;
c87c6e10b608762972b76bfc734daaec9070b50bvboxsync
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync // get the device context (DC)
a5d4a2a6365cbfa15e179bc79d291133c4a0ff1evboxsync *hDC = GetDC( hWnd );
a5d4a2a6365cbfa15e179bc79d291133c4a0ff1evboxsync
a5d4a2a6365cbfa15e179bc79d291133c4a0ff1evboxsync // set the pixel format for the DC
a5d4a2a6365cbfa15e179bc79d291133c4a0ff1evboxsync ZeroMemory( &pfd, sizeof( pfd ) );
a5d4a2a6365cbfa15e179bc79d291133c4a0ff1evboxsync pfd.nSize = sizeof( pfd );
a5d4a2a6365cbfa15e179bc79d291133c4a0ff1evboxsync pfd.nVersion = 1;
a5d4a2a6365cbfa15e179bc79d291133c4a0ff1evboxsync pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
a5d4a2a6365cbfa15e179bc79d291133c4a0ff1evboxsync pfd.iPixelType = PFD_TYPE_RGBA;
a5d4a2a6365cbfa15e179bc79d291133c4a0ff1evboxsync pfd.cColorBits = 24;
a5d4a2a6365cbfa15e179bc79d291133c4a0ff1evboxsync pfd.cDepthBits = 16;
a5d4a2a6365cbfa15e179bc79d291133c4a0ff1evboxsync pfd.iLayerType = PFD_MAIN_PLANE;
a5d4a2a6365cbfa15e179bc79d291133c4a0ff1evboxsync format = ChoosePixelFormat( *hDC, &pfd );
a5d4a2a6365cbfa15e179bc79d291133c4a0ff1evboxsync SetPixelFormat( *hDC, format, &pfd );
a5d4a2a6365cbfa15e179bc79d291133c4a0ff1evboxsync
a5d4a2a6365cbfa15e179bc79d291133c4a0ff1evboxsync // create and enable the render context (RC)
a5d4a2a6365cbfa15e179bc79d291133c4a0ff1evboxsync *hRC = wglCreateContext( *hDC );
a5d4a2a6365cbfa15e179bc79d291133c4a0ff1evboxsync wglMakeCurrent( *hDC, *hRC );
a5d4a2a6365cbfa15e179bc79d291133c4a0ff1evboxsync
a5d4a2a6365cbfa15e179bc79d291133c4a0ff1evboxsync}
a5d4a2a6365cbfa15e179bc79d291133c4a0ff1evboxsync
a5d4a2a6365cbfa15e179bc79d291133c4a0ff1evboxsync// Disable OpenGL
a5d4a2a6365cbfa15e179bc79d291133c4a0ff1evboxsync
a5d4a2a6365cbfa15e179bc79d291133c4a0ff1evboxsyncvoid DisableOpenGL(HWND hWnd, HDC hDC, HGLRC hRC)
6dc780c3e9adb5f3a0ef93c8f34ba38ac2213776vboxsync{
a5d4a2a6365cbfa15e179bc79d291133c4a0ff1evboxsync wglMakeCurrent( NULL, NULL );
a5d4a2a6365cbfa15e179bc79d291133c4a0ff1evboxsync wglDeleteContext( hRC );
a5d4a2a6365cbfa15e179bc79d291133c4a0ff1evboxsync ReleaseDC( hWnd, hDC );
a5d4a2a6365cbfa15e179bc79d291133c4a0ff1evboxsync}
a5d4a2a6365cbfa15e179bc79d291133c4a0ff1evboxsync