Advertisement
Guest User

Untitled

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