Advertisement
BlueBear

gl_init_winapi.cpp

Sep 30th, 2014
346
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.13 KB | None | 0 0
  1. #include <windows.h>
  2. #include <gl/gl.h>  //toto mozes mozna mat ako GL/gl.h keby daco
  3.  
  4. //forward deklaracie
  5. LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
  6. void EnableOpenGL(HWND hWnd, HDC * hDC, HGLRC * hRC);
  7. void DisableOpenGL(HWND hWnd, HDC hDC, HGLRC hRC);
  8.  
  9. //main funkcia
  10. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
  11.                    LPSTR lpCmdLine, int iCmdShow)
  12. {
  13.     WNDCLASS wc;    //window class
  14.     HWND hWnd;  //handle na window
  15.     HDC hDC;    //handle na device context
  16.     HGLRC hRC;  //handle na GL rendering context
  17.     MSG msg;    //WinApi je message based paradigma, troska sa zda byt za vlasy pritiahnuta, ale je to okej
  18.     BOOL quit = FALSE;
  19.     float theta = 0.0f; //premenna na zmenu stavu
  20.    
  21.     //zaregistrujeme window clasu
  22.     wc.style = CS_OWNDC;
  23.     wc.lpfnWndProc = WndProc;   //window procedura, ktoru sme zadefinovali nizsie
  24.     wc.cbClsExtra = 0;
  25.     wc.cbWndExtra = 0;
  26.     wc.hInstance = hInstance;   //handle instancu programu, ktoru namapujeme na samotny window
  27.     wc.hCursor = LoadCursor( NULL, IDC_ARROW );
  28.     wc.hbrBackground = (HBRUSH)GetStockObject( BLACK_BRUSH );
  29.     wc.lpszMenuName = NULL;
  30.     wc.lpszClassName = "OpenGL";    //class name windowu co spravime
  31.     RegisterClass( &wc );       //zaregistrujeme na dalsie pouzivanie
  32.    
  33.     // vytvorime samotne okno
  34.     hWnd = CreateWindow(
  35.         "OpenGL", "Opengl is great but DirectX rocks!!!",   //class name a window title v tomto poradi to je
  36.                                     //definovane
  37.         WS_CAPTION | WS_POPUPWINDOW | WS_VISIBLE,
  38.         0, 0, 256, 256,     //sirka a vyska windowu tych 256, 256
  39.         NULL, NULL, hInstance, NULL ); 
  40.    
  41.     //namapujeme OpenGL na okno a na render/device context
  42.     EnableOpenGL( hWnd, &hDC, &hRC );
  43.    
  44.     //tu prebieha hlavny uzol programu
  45.     while ( !quit )
  46.     {
  47.         //zistime, ci su nejake messages v message loope, ak su, tak handle them, if not tak vykreslujeme
  48.         if ( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE )  )
  49.         {
  50.             //ak doslo quit message, tak vypne aplikaciu, ak nie, posunie message dalej
  51.             if ( msg.message == WM_QUIT )
  52.             {
  53.                 quit = TRUE;
  54.             }
  55.             else
  56.             {
  57.                 TranslateMessage( &msg );
  58.                 DispatchMessage( &msg );
  59.             }
  60.         }
  61.         else
  62.         {
  63.             //
  64.             //sem ide veskery rendrovaci loop, toto vsetko z else mozes aj vymazat ak chces
  65.             //a nahradit vlastnym :) (az na glClearColor a glClear, tie treba hocijak...a SwapBuffers)
  66.             //
  67.             glClearColor( 0.0f, 0.0f, 0.0f, 0.0f ); //vymaz celeho framebufferu na nejaku solid farbu
  68.                                 //vo formate RGBA...nemusi byt cierne, odporucam
  69.                                 //vyskusat aj cornflower blue na debugovacie ucely
  70.                                 //R: 0.258824f G: 0.258824f B: 0.435294f A: 1.0f
  71.             glClear( GL_COLOR_BUFFER_BIT ); //vymazeme color buffer (cize vsetko co sme nakreslili vo frame
  72.                             //neskor sa ti tu objavia aj ine parametre ako depth a stencil buffer
  73.                             //az budes robit normal a shadow mapping
  74.            
  75.             glPushMatrix(); //ulozime stav projekcnej matice
  76.             glRotatef( theta, 0.0f, 0.0f, 1.0f );   //pootocime po X ovej osi o theta obrazec
  77.             glBegin( GL_TRIANGLES );    //tymto prikazom povies OpenGL ze chces zacat vykreslovanie
  78.             {               //trojuholnikov...existuje viacero typov, ako GL_LINES alebo
  79.                             //GL_POINTS alebo GL_TRIANDGLE_STRIP/GL_TRIANGLE_FAN
  80.                             //ale v ziadnom pripade nepouzi GL_QUAD...je to uz deprecated davno
  81.                 glColor3f( 1.0f, 0.0f, 0.0f );  //v OpenGL nastavujes vzdy dany stav, nez sa to vykona
  82.                                 //cize tu mas nastavenu farbu pre dany vertex, ak robis
  83.                                 //per vertex lighting ako v tomto pripade
  84.                 glVertex2f( 0.0f, 1.0f );   //tu si das vykreslit dany vertex s poziciami udanymi X a Y
  85.                 glColor3f( 0.0f, 1.0f, 0.0f );
  86.                 glVertex2f( 0.87f, -0.5f );
  87.                 glColor3f( 0.0f, 0.0f, 1.0f );
  88.                 glVertex2f( -0.87f, -0.5f );
  89.             }
  90.             glEnd();    //touto funkciou povies OpenGL ze si dokoncila vykreslovanie pre dany utvar
  91.             glPopMatrix();  //obnovis stav projekcnej matice
  92.            
  93.             SwapBuffers( hDC ); //zamenis frontbuffer za backbuffer, kde sa ti zatial vsetko vykreslilo v pozadi
  94.            
  95.             theta += 1.0f;  //inkrementujes tetu :D
  96.         }
  97.     }
  98.    
  99.     //vycistis OpenGL a vypnes
  100.     DisableOpenGL( hWnd, hDC, hRC );
  101.    
  102.     //explicitne zavres okno
  103.     DestroyWindow( hWnd );
  104.    
  105.     return msg.wParam;
  106.    
  107. }
  108.  
  109. //window procedura
  110. LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  111. {
  112.    
  113.     switch (message)
  114.     {
  115.        
  116.     case WM_CREATE:
  117.         return 0;
  118.        
  119.     case WM_CLOSE:
  120.         PostQuitMessage( 0 );
  121.         return 0;
  122.        
  123.     case WM_DESTROY:
  124.         return 0;
  125.        
  126.     case WM_KEYDOWN:
  127.         switch ( wParam )
  128.         {
  129.             //tu mozes definovat vstupy z klavesnice, napr VK_ENTER tusim na stlacenie entra
  130.         case VK_ESCAPE:
  131.             PostQuitMessage(0); //tu sa posle message na vypnutie okna
  132.             return 0;
  133.            
  134.         }
  135.         return 0;
  136.    
  137.     default:
  138.         return DefWindowProc( hWnd, message, wParam, lParam );
  139.            
  140.     }
  141.    
  142. }
  143.  
  144. //funkcia na nastavenie opengl
  145. void EnableOpenGL(HWND hWnd, HDC * hDC, HGLRC * hRC)
  146. {
  147.     PIXELFORMATDESCRIPTOR pfd;  //pixel format descriptor nam udava hlbku farieb a udava paletu
  148.     int format;
  149.    
  150.     //ziskame device context z handlu na window
  151.     *hDC = GetDC( hWnd );
  152.    
  153.     //tu sa nastavuje pixel format pre OpenGL
  154.     ZeroMemory( &pfd, sizeof( pfd ) );
  155.     pfd.nSize = sizeof( pfd );
  156.     pfd.nVersion = 1;
  157.     pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;   //doublebuffered pre znizenie flickeringu
  158.                                             //support pre opengl
  159.                                             //support pre priame kreslenie na window
  160.     pfd.iPixelType = PFD_TYPE_RGBA;     //RGBA format farby, tusim tu si mozes dat aj ARGB32 a ine formaty, ako HSV a tak
  161.     pfd.cColorBits = 24;        //kolko bitov chces na uchovavanie farieb...24 bity mas dost na zopar milionov farieb
  162.     pfd.cDepthBits = 16;        //hlbka farby v bitoch per pixel
  163.     pfd.iLayerType = PFD_MAIN_PLANE;    //netusim popravde co to robi, ale treba to
  164.     format = ChoosePixelFormat( *hDC, &pfd );   //tu nam priradi system potrebny pixel format
  165.     SetPixelFormat( *hDC, format, &pfd );       //ktory potom nastavime na ten window
  166.    
  167.     *hRC = wglCreateContext( *hDC ); //tu sa nam vytvori render context
  168.     wglMakeCurrent( *hDC, *hRC );   //ktory hned priradime a zapneme
  169.    
  170. }
  171.  
  172. //Funkcia na uvolnenie contextu, a vypnutie okna
  173. void DisableOpenGL(HWND hWnd, HDC hDC, HGLRC hRC)
  174. {
  175.     wglMakeCurrent( NULL, NULL );
  176.     wglDeleteContext( hRC );
  177.     ReleaseDC( hWnd, hDC );
  178. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement