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

OpenGL

开发平台:

Windows_Unix

  1. #include "Base.h"
  2. CBaseApp::CBaseApp()
  3. {
  4.     // null me!
  5.     m_hInstance     = NULL;
  6.     m_hWnd          = NULL;
  7.     // standard window parameters
  8.     m_iWindowWidth   = 640;
  9.     m_iWindowHeight  = 480;
  10.     m_iWindowDepth   = 32;
  11.     m_bWindowed      = true;
  12.     m_strWindowTitle = "Unnamed";
  13.     m_bReady = false;
  14. }
  15. CBaseApp::~CBaseApp()
  16. {
  17. }
  18. bool CBaseApp::Initialize( HINSTANCE hInst, std::string strTitle, 
  19.                            int iWidth, int iHeight, int iDepth, bool bWindowed )
  20. {
  21.     // return error if instance is null
  22.     if (!hInst)
  23.         return false;
  24.     m_hInstance = hInst;
  25.     Log::Initialize( "log.txt" );
  26.     // window parameters
  27.     m_iWindowWidth   = iWidth;
  28.     m_iWindowHeight  = iHeight;
  29.     m_iWindowDepth   = iDepth;
  30.     m_bWindowed      = bWindowed;
  31.     m_strWindowTitle = strTitle;
  32.     // create main window
  33.     if (!MyCreateWindow())
  34.         return false;
  35.     // setup our opengl viewport
  36.     OpenGL* ogl = OpenGL::GetInstance();
  37.     if (!ogl->Initialize( m_hWnd, m_iWindowWidth, m_iWindowHeight, 
  38.                           m_iWindowDepth, m_bWindowed ))
  39.         return false;
  40.     // setup timer
  41.     if (!Timer::Initialize())
  42.         return false;
  43.     Timer::OncePerFrameQuery( m_hWnd );
  44.     // let the app do some custom initialization
  45.     if (!AppInitialize())
  46.         return false;
  47.     // we're ready!
  48.     m_bReady = true;
  49.     return true;
  50. }
  51. bool CBaseApp::Cleanup()
  52. {
  53.     // let the app cleanup its stuff
  54.     AppCleanup();
  55.     // destroy the textures
  56.     Texture::ReleaseInstance();
  57.     // cleanup opengl
  58.     OpenGL* ogl = OpenGL::GetInstance();
  59.     ogl->Cleanup();
  60.     OpenGL::ReleaseInstance();
  61.     // destroy main window
  62.     if (m_hWnd)
  63.     {
  64.         if (!DestroyWindow(m_hWnd))
  65.             return false;
  66.         m_hWnd = NULL;
  67.     }
  68.     // unregister windowclass
  69.     if (!UnregisterClass( "BaseClass", m_hInstance ))
  70.         return false;
  71.     m_hInstance = NULL;
  72.     Log::Cleanup();
  73.     return true;
  74. }
  75. bool CBaseApp::MyCreateWindow()
  76. {
  77.     // fill and register window class
  78.     WNDCLASS wc;
  79.     wc.style         = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
  80.     wc.lpfnWndProc   = (WNDPROC)WndProc;
  81.     wc.cbClsExtra    = 0;
  82.     wc.cbWndExtra    = 0;
  83.     wc.hInstance     = m_hInstance;
  84.     wc.hIcon         = NULL;
  85.     wc.hCursor       = NULL;
  86.     wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH),
  87.     wc.lpszMenuName  = NULL;
  88.     wc.lpszClassName = "BaseClass";
  89.     if (!RegisterClass(&wc))
  90.     {
  91.         Log::Print( "Error registering window class" );
  92.         return false;
  93.     }
  94.     // desired window size
  95.     RECT rcClient;
  96.     rcClient.left   = 0;
  97.     rcClient.right  = m_iWindowWidth;
  98.     rcClient.top    = 0;
  99.     rcClient.bottom = m_iWindowHeight;
  100.     unsigned long dwExtendedWindowStyle;
  101.     unsigned long dwWindowStyle;
  102.     if (m_bWindowed)
  103.     {
  104.         dwExtendedWindowStyle = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;
  105.         dwWindowStyle         = WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|/*WS_THICKFRAME|*/WS_MINIMIZEBOX|WS_VISIBLE;
  106.     } else
  107.     {
  108.         dwExtendedWindowStyle = WS_EX_APPWINDOW;
  109.         dwWindowStyle         = WS_POPUP;
  110.     }
  111.     // adjust windowrect to make room for borders, caption, etc
  112.     AdjustWindowRectEx( &rcClient, dwWindowStyle, false, dwExtendedWindowStyle );
  113.     m_hWnd = CreateWindowEx( dwExtendedWindowStyle,
  114.                            "BaseClass",
  115.                            m_strWindowTitle.c_str(),
  116.                            WS_CLIPSIBLINGS | WS_CLIPCHILDREN | dwWindowStyle,
  117.                            CW_USEDEFAULT, CW_USEDEFAULT,
  118.                            (rcClient.right-rcClient.left),
  119.                            (rcClient.bottom-rcClient.top),
  120.                            NULL,
  121.                            NULL,
  122.                            m_hInstance,
  123.                            NULL );
  124.     if (m_hWnd==NULL)
  125.     {
  126.         Log::Print( "Error creating window" );
  127.         return false;
  128.     }
  129.     // this is usually done at window creation, but you can never be too sure
  130.     ShowWindow( m_hWnd, SW_SHOW );
  131.     SetFocus( m_hWnd );
  132.     Log::Print( "Window created (%dx%d)", m_iWindowWidth, m_iWindowHeight );
  133.     return true;
  134. }
  135. LRESULT CALLBACK CBaseApp::WndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
  136. {
  137.     switch( uMsg )
  138.     {
  139.         case WM_SYSCOMMAND:
  140.         {
  141.             switch( wParam )
  142.             {
  143.                 case SC_SCREENSAVE:
  144.                 case SC_MONITORPOWER:
  145.                     return 0;
  146.             }
  147.             break;
  148.         }
  149.         case WM_PAINT:
  150.         {
  151.             PAINTSTRUCT ps;
  152.             BeginPaint( hWnd, &ps );
  153.             EndPaint( hWnd, &ps );
  154.             return 0;
  155.         }
  156.         case WM_CLOSE:
  157.             // send WM_QUIT to main loop
  158.             PostQuitMessage( 0 );
  159.             return 0;
  160.         case WM_KEYDOWN:
  161.             if (wParam==VK_ESCAPE)
  162.                 PostQuitMessage( 0 );
  163.             return 0;
  164.     };
  165.     // do standard window message handling stuff
  166.     return DefWindowProc( hWnd, uMsg, wParam, lParam );
  167. }
  168. int CBaseApp::Run()
  169. {
  170.     MSG msg;
  171.     bool bDone = false;
  172.     while (!bDone)
  173.     {
  174.         if (PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ))
  175.         {
  176.             if (msg.message == WM_QUIT)
  177.             {
  178.                 // WM_QUIT; exit the while-loop
  179.                 bDone = true;
  180.             } else
  181.             {
  182.                 // any other message needs to be handled correctly
  183.                 TranslateMessage( &msg );
  184.                 DispatchMessage( &msg );
  185.             }
  186.         } else
  187.         {
  188.             // no message to handle, so render a new frame
  189.             if (m_bReady)
  190.             {
  191.                 if (!Render())
  192.                     bDone = true;
  193.             }
  194.         }
  195.     };
  196.     return msg.wParam;
  197. }
  198. bool CBaseApp::Render()
  199. {
  200.     // get current time/fps/etc/whatever
  201.     if (!Timer::OncePerFrameQuery( m_hWnd ))
  202.         return false;
  203.     if (!AppRender())
  204.         return false;
  205.     OpenGL* ogl = OpenGL::GetInstance();
  206.     SwapBuffers( ogl->RetrieveHDC() );
  207.     return true;
  208. }