dariahinz

open gl

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