OpenGL.cpp
上传用户:sz83729876
上传日期:2013-03-07
资源大小:4140k
文件大小:4k
源码类别:

OpenGL

开发平台:

Windows_Unix

  1. #include "OpenGL.h"
  2. OpenGL::OpenGL()
  3. {
  4.     m_hDC = NULL;
  5.     m_hRC = NULL;
  6.     m_hAppWindowHandle = NULL;
  7. }
  8. OpenGL::~OpenGL()
  9.     if ( (m_hDC) || (m_hRC) )
  10.         Cleanup();
  11. }
  12. bool OpenGL::Initialize( HWND hWnd, int iWidth, int iHeight, 
  13.                          int iDepth, bool bWindowed )
  14. {
  15.     m_dwDesiredWidth  = iWidth;
  16.     m_dwDesiredHeight = iHeight;
  17.     m_dwDesiredDepth  = iDepth;
  18.     m_bWindowed       = bWindowed;
  19.     m_hAppWindowHandle = hWnd;
  20.     m_hDC = GetDC( m_hAppWindowHandle );
  21.     if (!SetupPixelFormat( m_hDC ))
  22.         return false;
  23.     m_hRC = wglCreateContext( m_hDC );
  24.     wglMakeCurrent( m_hDC, m_hRC );
  25. SizeViewport( 45.0f, m_dwDesiredWidth, m_dwDesiredHeight );
  26.     if (!m_bWindowed)
  27.     {
  28.         // Set fullscreen
  29.         ShowCursor( false );
  30.         SetFullscreen( true );
  31.     } 
  32.     SetDefaults();
  33.     return true;
  34. }
  35. bool OpenGL::Cleanup()
  36. {
  37.     if ( m_hRC )
  38.     {
  39.         if (!wglMakeCurrent( NULL, NULL ))
  40.             return false;
  41.         if (!wglDeleteContext( m_hRC ))
  42.             return false;
  43.         m_hRC = NULL;
  44. }
  45. if ( m_hDC )
  46.     {
  47.         if (!ReleaseDC( m_hAppWindowHandle, m_hDC ))
  48.             return false;
  49.         m_hDC = NULL;
  50.     }
  51.     if( !m_bWindowed )
  52.     {
  53.         SetFullscreen( false );
  54.         ShowCursor( true );
  55.     }
  56.     return true;
  57. }
  58. bool OpenGL::SetFullscreen( bool bFlag )
  59. {
  60.     if (bFlag)
  61.     {
  62.         DEVMODE dmScreenSettings;
  63.         memset( &dmScreenSettings, 0, sizeof(dmScreenSettings) );
  64.         dmScreenSettings.dmSize       = sizeof( dmScreenSettings );
  65.         dmScreenSettings.dmPelsWidth  = m_dwDesiredWidth;
  66.         dmScreenSettings.dmPelsHeight = m_dwDesiredHeight;
  67.         dmScreenSettings.dmBitsPerPel = m_dwDesiredDepth;
  68.         dmScreenSettings.dmFields     = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
  69.         ChangeDisplaySettings( &dmScreenSettings, CDS_FULLSCREEN );
  70.         Log::Print( "OpenGL: Switched to fullscreen (%dx%d)", m_dwDesiredWidth, m_dwDesiredHeight );
  71.     } else
  72.     {
  73.         ChangeDisplaySettings( NULL, 0 );
  74.         Log::Print( "OpenGL: Switched to desktop" );
  75.     }
  76.     return true; 
  77. }
  78. bool OpenGL::SetupPixelFormat( HDC hdc )
  79. {
  80.     PIXELFORMATDESCRIPTOR pfd; 
  81.     int pixelformat; 
  82.  
  83.     ZeroMemory( &pfd, sizeof(PIXELFORMATDESCRIPTOR) );
  84.     pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);
  85.     pfd.nVersion = 1;
  86.     pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
  87.     pfd.dwLayerMask = PFD_MAIN_PLANE;
  88.     pfd.iPixelType = PFD_TYPE_RGBA;
  89.     pfd.cColorBits = m_dwDesiredDepth;
  90.     pfd.cDepthBits = m_dwDesiredDepth;
  91.     pfd.cAccumBits = 0;
  92.     pfd.cStencilBits = 8;
  93.     pixelformat = ChoosePixelFormat( hdc, &pfd );
  94.     if (pixelformat == 0)
  95.     {
  96.         Log::Print( "OpenGL: Error choosing pixelformat" );
  97.         return false; 
  98.     }
  99.  
  100.     if (!SetPixelFormat( hdc, pixelformat, &pfd ))
  101.     {
  102.         Log::Print( "OpenGL: Error setting pixelformat" );
  103.         return false; 
  104.     }
  105.     Log::Print( "OpenGL: Successfully set pixelformat" );
  106.     return true;
  107. }
  108. bool OpenGL::SizeViewport( float fFOV, int iWidth, int iHeight )
  109. {
  110.     glViewport( 0, 0, iWidth, iHeight );
  111.     glMatrixMode( GL_PROJECTION );
  112.     glLoadIdentity();
  113.     gluPerspective( fFOV, (float)iWidth/(float)iHeight, 1, 5000.0f );
  114.     glMatrixMode( GL_MODELVIEW );
  115.     glLoadIdentity();
  116.     return true;
  117. }
  118. bool OpenGL::SetFOV( float fAngle )
  119. {
  120. return SizeViewport( fAngle, m_dwDesiredWidth, m_dwDesiredHeight );
  121. }
  122. void OpenGL::SetDefaults()
  123. {
  124.     // gouraud shading
  125. glShadeModel( GL_SMOOTH );
  126.     // clear stuff
  127. glClearColor( 0.0f, 0.0f, 0.0f, 1.0f );
  128. glClearDepth( 1.0f );
  129.     // enable some stuff
  130. glEnable( GL_COLOR_MATERIAL );
  131.     // z-buffer stuff
  132. glDepthFunc( GL_LEQUAL );
  133. glEnable( GL_DEPTH_TEST );
  134.     // backface culling
  135.     glEnable( GL_CULL_FACE );
  136. glCullFace( GL_BACK );
  137.     glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST );
  138. }
  139. //----------------------------------------------
  140. //----------------------------------------------
  141. // Utility functions
  142. //----------------------------------------------
  143. //----------------------------------------------
  144. HDC OpenGL::RetrieveHDC()
  145. {
  146.     return m_hDC;
  147. }