SHARE
TWEET

Untitled

a guest Nov 22nd, 2019 84 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /****************************************************
  2.  Grafika komputerowa, OpenGL w środowisku MS Windows
  3.  ****************************************************/
  4.  
  5.  
  6. #include <windows.h>
  7. #include <math.h>
  8.  
  9. #include <gl\gl.h>
  10. #include <gl\glu.h>
  11.  
  12. #define PI 3.1415926
  13.  
  14. //deklaracja funkcji obslugi okna
  15. LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
  16.  
  17. BOOL SetWindowPixelFormat(HDC hDC);
  18. BOOL CreateViewGLContext(HDC hDC);
  19. void RenderScene();
  20. void CreateMaze();
  21.  
  22. int g_GLPixelIndex = 0;
  23. HGLRC g_hGLContext = NULL;
  24. HDC g_context = NULL;
  25.  
  26. double g_counter = 0.0;
  27.  
  28. enum GLDisplayListNames
  29. {
  30.     Wall1=1,
  31.     Wall2=2,
  32.     Wall3=3,
  33.     Wall4=4,
  34.     Wall5=5,
  35.     Wall6=6,
  36.     Wall7=7,
  37.     Wall8=8,
  38.  
  39.     Floor=39,
  40. };
  41.  
  42. //funkcja Main - dla Windows
  43. int WINAPI WinMain(HINSTANCE hInstance,
  44.                HINSTANCE hPrevInstance,
  45.                LPSTR     lpCmdLine,
  46.                int       nCmdShow)
  47. {
  48.     MSG meldunek;         //innymi slowy "komunikat"
  49.     WNDCLASS nasza_klasa; //klasa głównego okna aplikacji
  50.     HWND okno;
  51.     static char nazwa_klasy[] = "Podstawowa";
  52.  
  53.     //Definiujemy klase głównego okna aplikacji
  54.     //Okreslamy tu wlasciwosci okna, szczegoly wygladu oraz
  55.     //adres funkcji przetwarzajacej komunikaty
  56.     nasza_klasa.style         = CS_HREDRAW | CS_VREDRAW;
  57.     nasza_klasa.lpfnWndProc   = WndProc; //adres funkcji realizującej przetwarzanie meldunków
  58.     nasza_klasa.cbClsExtra    = 0 ;
  59.     nasza_klasa.cbWndExtra    = 0 ;
  60.     nasza_klasa.hInstance     = hInstance; //identyfikator procesu przekazany przez MS Windows podczas uruchamiania programu
  61.     nasza_klasa.hIcon         = 0;
  62.     nasza_klasa.hCursor       = LoadCursor(0, IDC_ARROW);
  63.     nasza_klasa.hbrBackground = (HBRUSH) GetStockObject(GRAY_BRUSH);
  64.     nasza_klasa.lpszMenuName  = "Menu" ;
  65.     nasza_klasa.lpszClassName = nazwa_klasy;
  66.  
  67.     //teraz rejestrujemy klasę okna głównego
  68.     RegisterClass (&nasza_klasa);
  69.    
  70.     /*tworzymy okno główne
  71.     okno będzie miało zmienne rozmiary, listwę z tytułem, menu systemowym
  72.     i przyciskami do zwijania do ikony i rozwijania na cały ekran, po utworzeniu
  73.     będzie widoczne na ekranie */
  74.     okno = CreateWindow(nazwa_klasy, "Grafika komputerowa", WS_OVERLAPPEDWINDOW | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
  75.                         100, 50, 700, 700, NULL, NULL, hInstance, NULL);
  76.    
  77.    
  78.     ShowWindow (okno, nCmdShow) ;
  79.    
  80.     //odswiezamy zawartosc okna
  81.     UpdateWindow (okno) ;
  82.  
  83.     // GŁÓWNA PĘTLA PROGRAMU
  84.     while (GetMessage(&meldunek, NULL, 0, 0))
  85.      /* pobranie komunikatu z kolejki; funkcja GetMessage zwraca FALSE tylko dla
  86.      komunikatu wm_Quit; dla wszystkich pozostałych komunikatów zwraca wartość TRUE */
  87.     {
  88.         TranslateMessage(&meldunek); // wstępna obróbka komunikatu
  89.         DispatchMessage(&meldunek);  // przekazanie komunikatu właściwemu adresatowi (czyli funkcji obslugujacej odpowiednie okno)
  90.     }
  91.     return (int)meldunek.wParam;
  92. }
  93.  
  94. /********************************************************************
  95. FUNKCJA OKNA realizujaca przetwarzanie meldunków kierowanych do okna aplikacji*/
  96. LRESULT CALLBACK WndProc (HWND okno, UINT kod_meldunku, WPARAM wParam, LPARAM lParam)
  97. {
  98.     HMENU mPlik, mInfo, mGlowne;
  99.            
  100. /* PONIŻSZA INSTRUKCJA DEFINIUJE REAKCJE APLIKACJI NA POSZCZEGÓLNE MELDUNKI */
  101.     switch (kod_meldunku)
  102.     {
  103.     case WM_CREATE:  //meldunek wysyłany w momencie tworzenia okna
  104.         {
  105.             mPlik = CreateMenu();
  106.             AppendMenu(mPlik, MF_STRING, 101, "&Koniec");
  107.             mInfo = CreateMenu();
  108.             AppendMenu(mInfo, MF_STRING, 200, "&Autor...");
  109.             mGlowne = CreateMenu();
  110.             AppendMenu(mGlowne, MF_POPUP, (UINT_PTR) mPlik, "&Plik");
  111.             AppendMenu(mGlowne, MF_POPUP, (UINT_PTR) mInfo, "&Informacja");
  112.             SetMenu(okno, mGlowne);
  113.             DrawMenuBar(okno);
  114.  
  115.             g_context = GetDC(okno);
  116.  
  117.             if (SetWindowPixelFormat(g_context)==FALSE)
  118.                 return FALSE;
  119.  
  120.             if (CreateViewGLContext(g_context)==FALSE)
  121.                 return 0;
  122.  
  123.             CreateMaze();       // definiujemy listy tworzące labirynt
  124.  
  125.             SetTimer(okno, 1, 33, NULL);
  126.                        
  127.             return 0;
  128.         }
  129.  
  130.     case WM_COMMAND: //reakcje na wybór opcji z menu
  131.         switch (wParam)
  132.         {
  133.             case 101: DestroyWindow(okno); //wysylamy meldunek WM_DESTROY
  134.                       break;
  135.             case 200: MessageBox(okno, "Imię i nazwisko:\nNumer indeksu: ", "Autor", MB_OK);
  136.         }
  137.         return 0;
  138.    
  139.     case WM_LBUTTONDOWN: //reakcja na lewy przycisk myszki
  140.         {
  141.             int x = LOWORD(lParam);
  142.             int y = HIWORD(lParam);
  143.            
  144.             return 0;
  145.         }
  146.  
  147.     case WM_PAINT:
  148.         {
  149.             PAINTSTRUCT paint;
  150.             HDC kontekst;
  151.             kontekst = BeginPaint(okno, &paint);
  152.        
  153.             RenderScene();         
  154.             SwapBuffers(kontekst);
  155.  
  156.             EndPaint(okno, &paint);
  157.  
  158.             return 0;
  159.         }
  160.  
  161.     case WM_TIMER:
  162.         InvalidateRect(okno, NULL, FALSE);
  163.         g_counter += 0.5;
  164.         if (g_counter > 359)
  165.             g_counter = 0;
  166.  
  167.         return 0;
  168.  
  169.     case WM_SIZE:
  170.         {
  171.             int cx = LOWORD(lParam);
  172.             int cy = HIWORD(lParam);
  173.  
  174.             GLsizei width, height;
  175.             GLdouble aspect;
  176.             width = cx;
  177.             height = cy;
  178.            
  179.             if (cy==0)
  180.                 aspect = (GLdouble)width;
  181.             else
  182.                 aspect = (GLdouble)width/(GLdouble)height;
  183.            
  184.             glViewport(0, 0, width, height);
  185.            
  186.             glMatrixMode(GL_PROJECTION);
  187.             glLoadIdentity();
  188.             gluPerspective(55, aspect, 1, 50.0);
  189.  
  190.             glMatrixMode(GL_MODELVIEW);
  191.             glLoadIdentity();
  192.  
  193.             glDrawBuffer(GL_BACK);
  194.  
  195.             glEnable(GL_LIGHTING);
  196.  
  197.             glEnable(GL_DEPTH_TEST);
  198.  
  199.             return 0;
  200.         }
  201.    
  202.     case WM_DESTROY: //obowiązkowa obsługa meldunku o zamknięciu okna
  203.         if(wglGetCurrentContext()!=NULL)
  204.         {
  205.             // dezaktualizacja kontekstu renderującego
  206.             wglMakeCurrent(NULL, NULL) ;
  207.         }
  208.         if (g_hGLContext!=NULL)
  209.         {
  210.             wglDeleteContext(g_hGLContext);
  211.             g_hGLContext = NULL;
  212.         }
  213.  
  214.         ReleaseDC(okno, g_context);
  215.         KillTimer(okno, 1);
  216.  
  217.         PostQuitMessage (0) ;
  218.         return 0;
  219.    
  220.     default: //standardowa obsługa pozostałych meldunków
  221.         return DefWindowProc(okno, kod_meldunku, wParam, lParam);
  222.     }
  223. }
  224.  
  225. BOOL SetWindowPixelFormat(HDC hDC)
  226. {
  227.     PIXELFORMATDESCRIPTOR pixelDesc;
  228.  
  229.     pixelDesc.nSize = sizeof(PIXELFORMATDESCRIPTOR);
  230.     pixelDesc.nVersion = 1;
  231.     pixelDesc.dwFlags = PFD_DRAW_TO_WINDOW |PFD_SUPPORT_OPENGL |PFD_DOUBLEBUFFER |PFD_STEREO_DONTCARE;
  232.     pixelDesc.iPixelType = PFD_TYPE_RGBA;
  233.     pixelDesc.cColorBits = 32;
  234.     pixelDesc.cRedBits = 8;
  235.     pixelDesc.cRedShift = 16;
  236.     pixelDesc.cGreenBits = 8;
  237.     pixelDesc.cGreenShift = 8;
  238.     pixelDesc.cBlueBits = 8;
  239.     pixelDesc.cBlueShift = 0;
  240.     pixelDesc.cAlphaBits = 0;
  241.     pixelDesc.cAlphaShift = 0;
  242.     pixelDesc.cAccumBits = 64;
  243.     pixelDesc.cAccumRedBits = 16;
  244.     pixelDesc.cAccumGreenBits = 16;
  245.     pixelDesc.cAccumBlueBits = 16;
  246.     pixelDesc.cAccumAlphaBits = 0;
  247.     pixelDesc.cDepthBits = 32;
  248.     pixelDesc.cStencilBits = 8;
  249.     pixelDesc.cAuxBuffers = 0;
  250.     pixelDesc.iLayerType = PFD_MAIN_PLANE;
  251.     pixelDesc.bReserved = 0;
  252.     pixelDesc.dwLayerMask = 0;
  253.     pixelDesc.dwVisibleMask = 0;
  254.     pixelDesc.dwDamageMask = 0;
  255.     g_GLPixelIndex = ChoosePixelFormat( hDC, &pixelDesc);
  256.    
  257.     if (g_GLPixelIndex==0)
  258.     {
  259.         g_GLPixelIndex = 1;
  260.        
  261.         if (DescribePixelFormat(hDC, g_GLPixelIndex, sizeof(PIXELFORMATDESCRIPTOR), &pixelDesc)==0)
  262.         {
  263.             return FALSE;
  264.         }
  265.     }
  266.    
  267.     if (SetPixelFormat( hDC, g_GLPixelIndex, &pixelDesc)==FALSE)
  268.     {
  269.         return FALSE;
  270.     }
  271.    
  272.     return TRUE;
  273. }
  274. BOOL CreateViewGLContext(HDC hDC)
  275. {
  276.     g_hGLContext = wglCreateContext(hDC);
  277.  
  278.     if (g_hGLContext == NULL)
  279.     {
  280.         return FALSE;
  281.     }
  282.    
  283.     if (wglMakeCurrent(hDC, g_hGLContext)==FALSE)
  284.     {
  285.         return FALSE;
  286.     }
  287.    
  288.     return TRUE;
  289. }
  290.  
  291. void RenderScene()
  292. {
  293.     GLfloat BlueSurface[] = { 0.0f, 0.0f, 0.4f, 1.0f};
  294.     GLfloat GreySurface[] = { 0.7f, 0.7f, 0.7f, 1.0f};
  295.  
  296.     GLfloat LightAmbient[] = { 0.1f, 0.1f, 0.1f, 0.1f };
  297.     GLfloat LightDiffuse[] = { 0.8f, 0.8f, 0.8f, 0.8f };
  298.     GLfloat LightPosition[] = { 0.0f, 1.0f, 1.0f, 0.0f };  
  299.  
  300.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  301.  
  302.     glLightfv(GL_LIGHT0, GL_AMBIENT, LightAmbient);     //1 składowa: światło otaczające (bezkierunkowe)
  303.     glLightfv(GL_LIGHT0, GL_DIFFUSE, LightDiffuse);     //2 składowa: światło rozproszone (kierunkowe)
  304.     glLightfv(GL_LIGHT0, GL_POSITION, LightPosition);
  305.     glEnable(GL_LIGHT0);
  306.  
  307.     glPushMatrix();
  308.        
  309.         gluLookAt(0, 3, 12 , 0, 0, 0 , 0, 1, 0);
  310.  
  311.         glRotated(g_counter, 0, 1, 0);
  312.        
  313.         glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE,  GreySurface  );
  314.         glCallList(Wall1);
  315.         glCallList(Wall2);
  316.         glCallList(Wall3);
  317.         glCallList(Wall4);
  318.         glCallList(Wall5);
  319.         glCallList(Wall6);
  320.         glCallList(Wall7);
  321.         glCallList(Wall8);
  322.        
  323.         glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, BlueSurface);
  324.         glCallList(Floor);
  325.  
  326.    
  327.     glPopMatrix();
  328.    
  329.     glFlush();
  330.  
  331. }
  332.  
  333. void CreateMaze()
  334. {
  335. glNewList(Wall1, GL_COMPILE);  // GL_COMPILE - lista jest kompilowana, ale nie wykonywana
  336. glBegin(GL_TRIANGLES);      // inne opcje: GL_POINTS, GL_LINES, GL_LINE_STRIP, GL_LINE_LOOP
  337.     // GL_TRIANGLES, GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN, GL_QUAD_STRIP, GL_POLYGON
  338.     glNormal3d(0.0, 0.0, 1.0);
  339.     glVertex3d(0.0f, 0.0f, 0.0f );
  340.     glVertex3d(0.0f, 4.0f, 0.0f);
  341.     glVertex3d(1.0f, 4.0f, 0.0f));
  342.     glEnd();
  343.     glEndList();
  344.  
  345.     glNewList(Wall2, GL_COMPILE);  // GL_COMPILE - lista jest kompilowana, ale nie wykonywana
  346. glBegin(GL_TRIANGLES);      // inne opcje: GL_POINTS, GL_LINES, GL_LINE_STRIP, GL_LINE_LOOP
  347.     // GL_TRIANGLES, GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN, GL_QUAD_STRIP, GL_POLYGON
  348.     glNormal3d(0.0, 0.0, 1.0);
  349.     glVertex3d(0.0f, 0.0f, 0.0f );
  350.     glVertex3d(1.0f, 0.0f, 0.0f);
  351.     glVertex3d(1.0f, 4.0f, 0.0f));
  352.     glEnd();
  353.     glEndList();
  354.  
  355.     glNewList(Wall3, GL_COMPILE);  // GL_COMPILE - lista jest kompilowana, ale nie wykonywana
  356. glBegin(GL_TRIANGLES);      // inne opcje: GL_POINTS, GL_LINES, GL_LINE_STRIP, GL_LINE_LOOP
  357.     // GL_TRIANGLES, GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN, GL_QUAD_STRIP, GL_POLYGON
  358.     glNormal3d(0.0, 0.0, 1.0);
  359.     glVertex3d(1.0f, 4.0f, 0.0f );
  360.     glVertex3d(3.0f, 4.0f, 0.0f);
  361.     glVertex3d(1.0f, 3.0f, 0.0f));
  362.     glEnd();
  363.     glEndList();
  364.  
  365.         glNewList(Wall4, GL_COMPILE);  // GL_COMPILE - lista jest kompilowana, ale nie wykonywana
  366. glBegin(GL_TRIANGLES);      // inne opcje: GL_POINTS, GL_LINES, GL_LINE_STRIP, GL_LINE_LOOP
  367.     // GL_TRIANGLES, GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN, GL_QUAD_STRIP, GL_POLYGON
  368.     glNormal3d(0.0, 0.0, 1.0);
  369.     glVertex3d(1.0f, 3.0f, 0.0f );
  370.     glVertex3d(3.0f, 3.0f, 0.0f);
  371.     glVertex3d(3.0f, 4.0f, 0.0f));
  372.     glEnd();
  373.     glEndList();
  374.  
  375.         glNewList(Wall5, GL_COMPILE);  // GL_COMPILE - lista jest kompilowana, ale nie wykonywana
  376. glBegin(GL_TRIANGLES);      // inne opcje: GL_POINTS, GL_LINES, GL_LINE_STRIP, GL_LINE_LOOP
  377.     // GL_TRIANGLES, GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN, GL_QUAD_STRIP, GL_POLYGON
  378.     glNormal3d(0.0, 0.0, 1.0);
  379.     glVertex3d(2.0f, 3.0f, 0.0f );
  380.     glVertex3d(3.0f, 3.0f, 0.0f);
  381.     glVertex3d(3.0f, 2.0f, 0.0f));
  382.     glEnd();
  383.     glEndList();
  384.  
  385.             glNewList(Wall6, GL_COMPILE);  // GL_COMPILE - lista jest kompilowana, ale nie wykonywana
  386. glBegin(GL_TRIANGLES);      // inne opcje: GL_POINTS, GL_LINES, GL_LINE_STRIP, GL_LINE_LOOP
  387.     // GL_TRIANGLES, GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN, GL_QUAD_STRIP, GL_POLYGON
  388.     glNormal3d(0.0, 0.0, 1.0);
  389.     glVertex3d(2.0f, 3.0f, 0.0f );
  390.     glVertex3d(2.0f, 2.0f, 0.0f);
  391.     glVertex3d(3.0f, 2.0f, 0.0f));
  392.     glEnd();
  393.     glEndList();
  394.  
  395.                 glNewList(Wall7, GL_COMPILE);  // GL_COMPILE - lista jest kompilowana, ale nie wykonywana
  396. glBegin(GL_TRIANGLES);      // inne opcje: GL_POINTS, GL_LINES, GL_LINE_STRIP, GL_LINE_LOOP
  397.     // GL_TRIANGLES, GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN, GL_QUAD_STRIP, GL_POLYGON
  398.     glNormal3d(0.0, 0.0, 1.0);
  399.     glVertex3d(1.0f, 2.0f, 0.0f );
  400.     glVertex3d(3.0f, 2.0f, 0.0f);
  401.     glVertex3d(3.0f, 1.0f, 0.0f));
  402.     glEnd();
  403.     glEndList();
  404.  
  405.                     glNewList(Wall8, GL_COMPILE);  // GL_COMPILE - lista jest kompilowana, ale nie wykonywana
  406. glBegin(GL_TRIANGLES);      // inne opcje: GL_POINTS, GL_LINES, GL_LINE_STRIP, GL_LINE_LOOP
  407.     // GL_TRIANGLES, GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN, GL_QUAD_STRIP, GL_POLYGON
  408.     glNormal3d(0.0, 0.0, 1.0);
  409.     glVertex3d(1.0f, 2.0f, 0.0f );
  410.     glVertex3d(1.0f, 1.0f, 0.0f);
  411.     glVertex3d(3.0f, 1.0f, 0.0f));
  412.     glEnd();
  413.     glEndList();
  414.  
  415.  
  416.    
  417.  
  418.  
  419. // podłoga
  420.     glNewList(Floor,GL_COMPILE);
  421.         glBegin(GL_POLYGON);
  422.             glNormal3d( 0.0, 1.0, 0.0);
  423.             glVertex3d( -20, -1, -30.0);
  424.             glVertex3d( -20, -1, 10.0);
  425.             glVertex3d( 20, -1, 10.0);
  426.             glVertex3d( 20, -1, -30.0);
  427.         glEnd();
  428.     glEndList();
  429.    
  430. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
Not a member of Pastebin yet?
Sign Up, it unlocks many cool features!
 
Top