Advertisement
Guest User

Untitled

a guest
Nov 22nd, 2019
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.15 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. 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. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement