Advertisement
Guest User

Untitled

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