Advertisement
Guest User

Untitled

a guest
Apr 27th, 2015
197
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 32.00 KB | None | 0 0
  1.  
  2.  
  3. /*
  4. Prosty studencki program graficzny
  5. kodowany w jezyku C z uzyciem OpenGL
  6. */
  7.  
  8. #include "szescian.h"
  9. #include<math.h>
  10. #include <float.h>
  11. #include<stdio.h>
  12.  
  13. LONG WINAPI WndProc( HWND, UINT, WPARAM, LPARAM );
  14. HGLRC SetUpOpenGL( HWND hWnd );
  15.  
  16. //do poruszania
  17.  
  18. GLfloat porusz_y=0;
  19. GLfloat porusz_x=0;
  20. GLfloat porusz_z=0;
  21.  
  22. //dane swietlika
  23. GLfloat swietlik_x;
  24. GLfloat swietlik_z;
  25.  
  26.  
  27. //Kolory
  28. GLfloat red[] = {0.45f, 0.f, 0.f};
  29. GLfloat green[] = {0.f, 1.f, 0.17f};
  30. GLfloat blue[] = {0.f, 0.f, 0.8f};
  31. GLfloat black[] = {0.f, 0.f, 0.f};
  32. GLfloat white[] = {1.f, 1.f, 1.f};
  33. GLfloat grey[] = {0.8f, 0.8f, 0.8f};
  34. GLfloat orange[] = {0.8f, 0.4f, 0.f};
  35. GLfloat yellow[] = {1.f, 1.f, 0.f};
  36. GLfloat brown[] = {0.24f, 0.08f, 0.f};
  37. GLfloat pink[] = {1.f, 0.6f, 0.8f};
  38.  
  39. //takietam
  40.  
  41. char key;
  42.  
  43. // Wartosci poczatkowe
  44. #define DEFAULT_Z_DIST 150
  45. #define DEFAULT_PIVOT_VERT_ANGLE 0
  46. #define DEFAULT_PIVOT_HORIZ_ANGLE 0
  47. #define DEFAULT_PIVOT_X 0
  48. #define DEFAULT_PIVOT_Y 0
  49.  
  50. #define FULL_ANGLE_RADIANS 6.2832
  51. #define M_PI 3.14
  52.  
  53. #define SQRT_3 1.73205080757;
  54.  
  55.  
  56. float z_dist=DEFAULT_Z_DIST; // INSERT, PAGE UP
  57. float pivot_vert_angle=DEFAULT_PIVOT_VERT_ANGLE; // UP, DOWN
  58. float pivot_horiz_angle=DEFAULT_PIVOT_HORIZ_ANGLE; // LEFT, RIGHT
  59. float pivot_x=DEFAULT_PIVOT_X; // DELETE, PAGE DOWN
  60. float pivot_y=DEFAULT_PIVOT_Y; // HOME, END
  61.  
  62.  
  63. // ************ Deklaracje funkcji ************************
  64.  
  65. void DrawOpenGLScene( void ); // glowna funkcja rysujaca
  66.  
  67. // Skladowe funkcje obiektu graficznego
  68.  
  69. void szescian(void);
  70.  
  71. // ..............................
  72.  
  73. //******** Fukcje skladowe ********************************
  74.  
  75.  
  76.  
  77.  
  78.  
  79. void narysujKule(GLfloat r, GLfloat color[3], GLfloat x, GLfloat y, GLfloat z)
  80. {
  81. int i, j,k;
  82. GLfloat kat=0.35;
  83. k=19;
  84. //h=h+r;
  85. //
  86. for (i = 0; i < k; ++i) {
  87. GLfloat dol = (i - 1) * kat;
  88. GLfloat z0 = sin(dol);
  89. GLfloat zr0 = cos(dol);
  90. GLfloat gora = i * kat;
  91. GLfloat z1 = sin(gora);
  92. GLfloat zr1 = cos(gora);
  93. glColor3fv(color);
  94. glBegin(GL_QUAD_STRIP);
  95.  
  96. for (j = 0; j <k ; ++j) {
  97. GLfloat lng = j * kat;
  98. GLfloat x0 = cos(lng);
  99. GLfloat y0 =sin(lng);
  100. glNormal3f(r*x0 * zr0+x, r*y0* zr0+y,r*z0+z);
  101. glVertex3f(r*x0 * zr0+x, r*y0* zr0+y,r*z0+z);
  102. glNormal3f(r*x0 * zr1+x, r*y0 * zr1+y,r*z1+z);
  103. glVertex3f(r*x0 * zr1+x, r*y0 * zr1+y,r*z1+z);
  104. }
  105. glEnd();
  106. }
  107. }
  108.  
  109. void kolko(GLfloat x,GLfloat y, GLfloat z, GLfloat r, GLfloat c[3])
  110. {
  111. int i;
  112. GLfloat srodek[] = {x,y, z};
  113. glColor3fv(c);
  114. //glPointSize(20);
  115. glBegin(GL_TRIANGLE_FAN);
  116.  
  117. glVertex3fv(srodek);
  118. for(i = 0;i<19;i++) {
  119. GLfloat x0= r*cos(i*0.35);
  120. GLfloat z0= r*sin(i*0.35);
  121. GLfloat punkt[]={x+x0,y,z+z0};
  122. glVertex3fv(punkt);
  123. }
  124. glEnd();
  125. }
  126.  
  127.  
  128. //void walec(void)
  129. //{
  130. /*
  131. GLfloat red[] = {0.8f, 0.14f, 0.14f};
  132. GLfloat green[] = {0.f, 1.f, 0.17f};
  133. GLfloat a[3]={0,0,0};
  134. GLfloat b[3]={0,1,0};
  135. GLfloat d[3]={1,0,0};
  136. GLfloat c[3]={1,1,0};
  137. GLfloat e[3]={2,1,0};
  138. GLfloat f[3]={2,0,0};
  139. GLfloat g[3]={2,1,0};
  140. GLfloat h[3]={2,0,0};
  141. kolko(0,2, red);
  142. kolko(2,2, green);
  143. glBegin(GL_QUADS);
  144. glVertex3fv(a);
  145. glVertex3fv(b);
  146. glVertex3fv(c);
  147. glVertex3fv(d);
  148. glVertex3fv(e);
  149. //glVertex3fv();
  150. glEnd();
  151.  
  152.  
  153. //const GLfloat r= 2;
  154. //int i=0;
  155. //GLfloat srodek[] = {.0f,.0f, .0f};
  156. // //GLfloat x1= r*cos(i*0.35);
  157. // //GLfloat z1= r*sin(i*0.35);
  158. // //GLfloat punkt1[3]={x1,0.f,z1};
  159. // //GLfloat x2= r*cos((i+1)*0.35);
  160. // //GLfloat z2= r*sin((i+1)*0.35);
  161. // //GLfloat punkt2[3]={x2,0.f,z2};
  162. // glColor3f(1.0f, 0.0f, 0.0f);
  163. // glBegin(GL_TRIANGLE_FAN);
  164. // glVertex3fv(srodek);
  165. // for(;i<19;i++) {
  166. // GLfloat x= r*cos(i*0.35);
  167. // GLfloat z= r*sin(i*0.35);
  168. // GLfloat punkt[]={x,0.f,z};
  169. // glVertex3fv(punkt);
  170. // }
  171. // glEnd();*/
  172. void walec(GLfloat r, GLfloat x, GLfloat y, GLfloat z, GLfloat h, GLfloat color[3]) // x,y,z wspolrzedne gornej podstawy
  173. {
  174. int i;
  175. kolko(x,y,z,r,color);
  176. kolko(x,y-h,z,r,color);
  177. glBegin(GL_QUAD_STRIP);
  178. for (i = 0; i < 19; i++)
  179. {
  180. GLfloat kat = (i-0.5f)*0.35f;
  181. GLfloat x0 = r * cos(i * 0.35);
  182. GLfloat z0 = r * sin(i * 0.35);
  183. GLfloat dol[] = {x+x0, y, z+z0};
  184. GLfloat gora[] = {x+x0, y-h, z+z0};
  185. glNormal3f(cos(kat), 0, sin(kat));
  186. glVertex3fv(dol);
  187. glVertex3fv(gora);
  188. }
  189. glEnd();
  190. }
  191.  
  192. void szescian(void)
  193. {
  194. glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
  195. {
  196. // Parametry wierzcholkow
  197.  
  198. GLfloat sa[3]={0.0f,0.0f,0.0f};
  199. GLfloat sb[3]={3.0f,0.0f,0.0f};
  200. GLfloat sc[3]={3.0f,1.0f,0.0f};
  201. GLfloat sd[3]={0.0f,1.0f,0.0f};
  202. GLfloat se[3]={0.0f,0.0f,-1.0f};
  203. GLfloat sf[3]={3.0f,0.0f,-1.0f};
  204. GLfloat sg[3]={3.0f,1.0f,-1.0f};
  205. GLfloat sh[3]={0.0f,1.0f,-1.0f};
  206.  
  207. // Sciany skladowe
  208. glColor3f(1.0f, 0.0f, 0.0f);
  209. glBegin(GL_POLYGON);
  210. glVertex3fv(sa);
  211. glVertex3fv(sb);
  212. glVertex3fv(sc);
  213. glVertex3fv(sd);
  214. glEnd();
  215.  
  216. glColor3f(0.0f, 1.0f, 0.0f);
  217. glBegin(GL_POLYGON);
  218. glVertex3fv(sb);
  219. glVertex3fv(sf);
  220. glVertex3fv(sg);
  221. glVertex3fv(sc);
  222. glEnd();
  223.  
  224. glColor3f(0.0f, 0.0f, 1.0f);
  225. glBegin(GL_POLYGON);
  226. glVertex3fv(sf);
  227. glVertex3fv(se);
  228. glVertex3fv(sh);
  229. glVertex3fv(sg);
  230. glEnd();
  231.  
  232. glColor3f(1.0f, 1.0f, 0.0f);
  233. glBegin(GL_POLYGON);
  234. glVertex3fv(se);
  235. glVertex3fv(sa);
  236. glVertex3fv(sd);
  237. glVertex3fv(sh);
  238. glEnd();
  239.  
  240. glColor3f(0.0f, 1.0f, 1.0f);
  241. glBegin(GL_POLYGON);
  242. glVertex3fv(sd);
  243. glVertex3fv(sc);
  244. glVertex3fv(sg);
  245. glVertex3fv(sh);
  246. glEnd();
  247.  
  248. glColor3f(1.0f, 0.0f, 1.0f);
  249. glBegin(GL_POLYGON);
  250. glVertex3fv(sa);
  251. glVertex3fv(sb);
  252. glVertex3fv(sf);
  253. glVertex3fv(se);
  254. glEnd();
  255. }
  256. }
  257.  
  258. void prostopadloscian(GLfloat x, GLfloat y, GLfloat z, GLfloat xl, GLfloat yl, GLfloat zl,GLfloat color [3])
  259. {
  260. glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
  261. {
  262. GLfloat sa[3]={x,y,z};
  263. GLfloat sb[3]={x,y+yl,z};
  264. GLfloat sc[3]={x+xl,y+yl,z};
  265. GLfloat sd[3]={x+xl,y,z};
  266. GLfloat se[3]={x,y,z-zl};
  267. GLfloat sf[3]={x,y+yl,z-zl};
  268. GLfloat sg[3]={x+xl,y+yl,z-zl};
  269. GLfloat sh[3]={x+xl,y,z-zl};
  270.  
  271. glColor3fv(color);
  272. glBegin(GL_POLYGON);
  273. glVertex3fv(sa);
  274. glVertex3fv(sb);
  275. glVertex3fv(sc);
  276. glVertex3fv(sd);
  277. glEnd();
  278.  
  279. glColor3fv(color);
  280. glBegin(GL_POLYGON);
  281. glVertex3fv(sb);
  282. glVertex3fv(sf);
  283. glVertex3fv(sg);
  284. glVertex3fv(sc);
  285. glEnd();
  286.  
  287. glColor3fv(color);
  288. glBegin(GL_POLYGON);
  289. glVertex3fv(sf);
  290. glVertex3fv(se);
  291. glVertex3fv(sh);
  292. glVertex3fv(sg);
  293. glEnd();
  294.  
  295. glColor3fv(color);
  296. glBegin(GL_POLYGON);
  297. glVertex3fv(se);
  298. glVertex3fv(sa);
  299. glVertex3fv(sd);
  300. glVertex3fv(sh);
  301. glEnd();
  302.  
  303. glColor3fv(color);
  304. glBegin(GL_POLYGON);
  305. glVertex3fv(sd);
  306. glVertex3fv(sc);
  307. glVertex3fv(sg);
  308. glVertex3fv(sh);
  309. glEnd();
  310.  
  311. glColor3fv(color);
  312. glBegin(GL_POLYGON);
  313. glVertex3fv(sa);
  314. glVertex3fv(sb);
  315. glVertex3fv(sf);
  316. glVertex3fv(se);
  317. glEnd();
  318. }
  319. }
  320. /*
  321. void litera()
  322. {
  323. szescian2(0,0,0,2,5,1);
  324. szescian2(-1.5,5,0,5,2,1);
  325. }*/
  326.  
  327.  
  328.  
  329.  
  330.  
  331. void skrzydla(GLfloat color[3],GLfloat x, GLfloat y, GLfloat z, GLfloat skala)
  332. {
  333. //prawo gora
  334. glPolygonMode(GL_FRONT,GL_FILL);
  335. {
  336. // Parametry wierzcholkow
  337.  
  338. GLfloat sa[3]={x-10.f*skala,y,z};
  339. GLfloat sb[3]={x,y,z};
  340. GLfloat sc[3]={x-8.0f*skala,y+4.0f*skala,z};
  341. GLfloat sd[3]={x-10.5f*skala,y+0.75f*skala,z};
  342.  
  343.  
  344. // Sciany skladowe
  345. glColor3fv(color);
  346. glBegin(GL_LINE_STRIP);
  347.  
  348. glVertex3fv(sa);
  349. glVertex3fv(sb);
  350. glVertex3fv(sc);
  351. glVertex3fv(sd);
  352. glVertex3fv(sa);
  353. glEnd();
  354. //lewo gora
  355. }
  356. glPolygonMode(GL_FRONT,GL_FILL);
  357. {
  358. // Parametry wierzcholkow
  359.  
  360. GLfloat sa[3]={x+10.f*skala,y,z};
  361. GLfloat sb[3]={x,y,z};
  362. GLfloat sc[3]={x+8.0f*skala,y+4.0f*skala,z};
  363. GLfloat sd[3]={x+10.5f*skala,y+0.75f*skala,z};
  364.  
  365.  
  366. // Sciany skladowe
  367. glColor3fv(color);
  368. glBegin(GL_LINE_STRIP);
  369.  
  370. glVertex3fv(sa);
  371. glVertex3fv(sb);
  372. glVertex3fv(sc);
  373. glVertex3fv(sd);
  374. glVertex3fv(sa);
  375.  
  376. glEnd();
  377.  
  378. }
  379.  
  380. }
  381. /*
  382. void podloze(GLfloat x, GLfloat y, GLfloat z)
  383. {
  384.  
  385. int i, j;
  386. glColor3fv(green);
  387. for(i = z; i < 40; ++i) {
  388. for(j = x; j < 40; ++j)
  389. {
  390. GLfloat one[3]={j * 2,y,i * 2};
  391. GLfloat two[3]={j * 2,y,i * 2 + 2};
  392. GLfloat three[3]={j * 2 + 2,y,i * 2};
  393. GLfloat four[3]={j * 2 + 2,y,i * 2 + 2};
  394. glBegin(GL_QUAD_STRIP);
  395. glVertex3fv(one);
  396. glVertex3fv(two);
  397. glVertex3fv(three);
  398. glVertex3fv(four);
  399. glEnd();
  400.  
  401. }
  402. }
  403. }*/
  404.  
  405. void podloze(GLfloat x, GLfloat y, GLfloat z, GLfloat bok)
  406. {
  407. const GLfloat spec[]= {0.1, 0.1, 0.1};
  408. int i, j, k=0;
  409. glMaterialfv(GL_FRONT, GL_SPECULAR, spec);
  410. glMateriali(GL_FRONT, GL_SHININESS, 10);
  411. for(i = 0; i < 80; ++i) {
  412. for(j = 0; j < 80; ++j)
  413. {
  414.  
  415. GLfloat one[3]={x + j*bok ,y, z + i*bok };
  416. GLfloat two[3]={x + j*bok ,y,z+i*bok + bok};
  417. GLfloat three[3]={x + j*bok +bok,y,z+i*bok };
  418. GLfloat four[3]={x+j*bok +bok,y,z + i* bok +bok};
  419. glColor3fv(green);
  420. if((x+j*bok==swietlik_x)&&(z+i*bok==swietlik_z)) glColor3fv(black);
  421. glBegin(GL_QUAD_STRIP);
  422. glNormal3f(0.f, 1.f, 0.f);
  423. glVertex3fv(one);
  424. glVertex3fv(two);
  425. glVertex3fv(three);
  426. glVertex3fv(four);
  427. glEnd();
  428.  
  429. }
  430. }
  431. }
  432.  
  433. void swietlik(GLfloat x, GLfloat y, GLfloat z, GLfloat rk,GLfloat rw, GLfloat hw) //rk- promien kuli, rw- promien srodkowego walca
  434. {
  435.  
  436. GLfloat ambient[] = {0.2f, 0.2f, 0.8f, .1f};
  437. GLfloat diffuse[]= {0.5f, 0.5f, 0, 0.5f};
  438. //GLfloat sw[]={x,y-(rk+7*hw)+0.1,z};
  439. GLfloat specref[] = {1.f, 1.f, 1.f};
  440. //GLfloat sw[]={x,y-(rk+8.5*hw)+0.1,z};
  441. GLfloat sw[]={-40,-24,-40};
  442. swietlik_x=x;
  443. swietlik_z=z;
  444. glMaterialfv(GL_FRONT, GL_SPECULAR, specref);
  445. glMateriali(GL_FRONT, GL_SHININESS, 0);
  446. narysujKule(rk, brown,x,y,z);
  447. walec(rw-0.4,x,y-rk,z,hw,red);
  448.  
  449. walec(rw-0.3,x,y-(rk+hw)+0.1,z, hw, brown);
  450. walec(rw-0.2,x,y-(rk+2*hw)+0.1,z, hw, brown);
  451. walec(rw-0.1,x,y-(rk+3*hw)+0.1,z, hw, brown);
  452. walec(rw,x,y-(rk+4*hw)+0.1,z, hw, brown);
  453. walec(rw-0.1,x,y-(rk+5*hw)+0.1,z, hw,brown);
  454. walec(rw-0.2,x,y-(rk+6*hw)+0.1,z, hw, brown);
  455.  
  456. glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
  457. glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
  458. glLightfv(GL_LIGHT0, GL_POSITION, sw);
  459. glLightfv(GL_LIGHT0, GL_SPOT_CUTOFF, 60.f);
  460. glLightfv(GL_LIGHT0,
  461. //glEnable(GL_LIGHT0);
  462. //glEnable(GL_LIGHTING);
  463. walec(rw-0.3,x,y-(rk+7*hw)+0.1,z, hw, yellow);
  464. walec(rw-0.4,x,y-(rk+8*hw)+0.1,z, hw, yellow);
  465.  
  466. skrzydla(black,x,y-(rk+hw),z+rw-0.3,0.8);
  467. skrzydla(black,x,y-(rk+3*hw),z+rw-0.1,1);
  468.  
  469.  
  470. }
  471.  
  472.  
  473.  
  474. void scena()
  475. {
  476.  
  477. //glLoadIdentity();
  478.  
  479.  
  480.  
  481. //}
  482. /*swietlik(0,30,30,2.5,2,2);
  483. swietlik(30,30,30,2.5,2,2);
  484. swietlik(-15,45,45,2.5,2,2);
  485. swietlik(15,45,45,2.5,2,2);
  486. swietlik(45,45,45,2.5,2,2);*/
  487.  
  488. //prostopadloscian(-1000,-24,1000,10000,0,100000, green);
  489. podloze(-40, - 24, -40,1);
  490. }
  491.  
  492.  
  493.  
  494.  
  495. //********************************************************
  496. // Glowna funkcja WINDOWS
  497. //********************************************************
  498.  
  499. int WINAPI WinMain (HINSTANCE hInstance,
  500. HINSTANCE hPrevInstance,
  501. LPSTR lpszCmdLine,
  502. int nCmdShow)
  503. {
  504. static char szAppName[] = "OpenGL";
  505. static char szTitle[]= "SZESCIAN"; // Nazwa okna
  506. WNDCLASS wc; // zmienna klasy okna
  507. MSG msg; // zmienna komunikatu
  508. HWND hWnd; // uchwyt okna
  509.  
  510. // wypelnianie klasy okna
  511.  
  512. wc.style =
  513. CS_HREDRAW | CS_VREDRAW;// styl okna
  514. wc.lpfnWndProc =
  515. (WNDPROC)WndProc; // procedura okna
  516. wc.cbClsExtra = 0; // dodatkowe dane
  517. wc.cbWndExtra = 0;
  518. wc.hInstance =
  519. hInstance; // instancja
  520. wc.hIcon = NULL; // nazwa ikony
  521. wc.hCursor =
  522. LoadCursor(NULL, IDC_ARROW);// kursor
  523. wc.hbrBackground =
  524. (HBRUSH)(COLOR_WINDOW+1);// domyslny kolor okna
  525. wc.lpszMenuName = NULL;
  526. wc.lpszClassName =
  527. szAppName; // nazwa klasy
  528.  
  529. // Rejestracja klasy okna
  530.  
  531. RegisterClass( &wc );
  532.  
  533. // Konstrukcja glownego okna
  534.  
  535. hWnd = CreateWindow(
  536. szAppName, // app name
  537. szTitle, // Text for window title bar
  538. WS_OVERLAPPEDWINDOW// Window style
  539. // NEED THESE for OpenGL calls to work!
  540. | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
  541. CW_USEDEFAULT, 0, CW_USEDEFAULT, 0,
  542. NULL, // no parent window
  543. NULL, // Use the window class menu.
  544. hInstance,// This instance owns this window
  545. NULL // We don't use any extra data
  546. );
  547.  
  548. // Jezeli okno nie zostanie utworzone, zwrot 0
  549. if ( !hWnd )
  550. {
  551. return( 0 );
  552. }
  553.  
  554.  
  555. ShowWindow( hWnd, nCmdShow );// Wyswietlanie okna
  556. UpdateWindow( hWnd ); // Aktualizacja okna
  557.  
  558. // Uruchiomienie petli komunikatow
  559. while (GetMessage(&msg, NULL, 0, 0))
  560. {
  561. TranslateMessage( &msg ); // Przetwarzanie wiadomosci
  562. DispatchMessage( &msg ); // Zwolnienie wiadomosci
  563. }
  564.  
  565.  
  566.  
  567. return( msg.wParam );
  568. }
  569.  
  570.  
  571. //********************************************************
  572. // Procedura okna
  573. //********************************************************
  574.  
  575. LONG WINAPI WndProc(HWND hWnd,
  576. UINT msg,
  577. WPARAM wParam,
  578. LPARAM lParam)
  579. {
  580. HDC hDC;
  581.  
  582. static HGLRC hRC; // Note this is STATIC!
  583.  
  584. PAINTSTRUCT ps;
  585.  
  586. GLdouble gldAspect;
  587.  
  588. GLsizei glnWidth, glnHeight;
  589.  
  590. float change;
  591.  
  592.  
  593. // Petla komunikatow
  594.  
  595. switch (msg)
  596. {
  597. case WM_CREATE:
  598. hRC = SetUpOpenGL( hWnd ); // Inicjalizacja OpenGL
  599. return 0;
  600.  
  601. case WM_SIZE:
  602. hDC = GetDC (hWnd); // Kontekst urzadzenia
  603. wglMakeCurrent (hDC, hRC);
  604.  
  605. // Usawienie rozmiarow okna graficznego
  606.  
  607. glnWidth = (GLsizei) LOWORD (lParam);
  608. glnHeight = (GLsizei) HIWORD (lParam);
  609.  
  610. // Aspekt DC
  611. gldAspect = (GLdouble)glnWidth/(GLdouble)glnHeight;
  612.  
  613. glMatrixMode( GL_PROJECTION );// Ustawienie macierzy projekcji
  614.  
  615. glLoadIdentity();
  616.  
  617. // Rodzaj transformacji ekranowej
  618. gluPerspective(
  619. 30.0, // kat
  620. gldAspect, // aspekt
  621. 1.0, // polozenie plaszczyzny blizszej
  622. 1000.0 ); // polozenie plaszczyzny dalszej
  623.  
  624. glViewport( 0, 0, glnWidth, glnHeight );
  625.  
  626. // czyszczenie
  627. glClearColor(0.5f,0.5f,0.5f,1.0f);
  628.  
  629. glEnable(GL_COLOR_MATERIAL);
  630. wglMakeCurrent( NULL, NULL );
  631. ReleaseDC( hWnd, hDC );
  632. return 0;
  633.  
  634. case WM_PAINT:
  635. // rysowanie sceny
  636.  
  637. hDC = BeginPaint( hWnd, &ps );
  638. wglMakeCurrent( hDC, hRC );
  639.  
  640. DrawOpenGLScene();
  641.  
  642. SwapBuffers(hDC);
  643.  
  644. wglMakeCurrent( NULL, NULL );
  645.  
  646. EndPaint( hWnd, &ps );
  647. return 0;
  648.  
  649. case WM_DESTROY:
  650. // zamykanie
  651. wglDeleteContext( hRC );
  652. PostQuitMessage( 0 );
  653. return 0;
  654.  
  655. case WM_KEYDOWN: //************ OBSLUGA KLAWISZY ***********************
  656. if (GetAsyncKeyState(VK_SHIFT) & 0x8000)
  657. change=1.0f;
  658. else
  659. change=0.1f;
  660.  
  661. switch ((int)wParam)
  662. {
  663. // obrot w pionie
  664. case VK_UP:
  665. pivot_vert_angle+=5;
  666. if (pivot_vert_angle>=360)
  667. pivot_vert_angle-=360;
  668. InvalidateRect(hWnd, NULL, FALSE);
  669. break;
  670. case VK_DOWN:
  671. pivot_vert_angle-=5;
  672. if (pivot_vert_angle<0)
  673. pivot_vert_angle+=360;
  674. InvalidateRect(hWnd, NULL, FALSE);
  675. break;
  676.  
  677.  
  678. // obrot w poziomie
  679. case VK_RIGHT:
  680. pivot_horiz_angle+=5;
  681. if (pivot_horiz_angle>=360)
  682. pivot_horiz_angle-=360;
  683. InvalidateRect(hWnd, NULL, FALSE);
  684. break;
  685. case VK_LEFT:
  686. pivot_horiz_angle-=5;
  687. if (pivot_horiz_angle<0)
  688. pivot_horiz_angle+=360;
  689. InvalidateRect(hWnd, NULL, FALSE);
  690. break;
  691.  
  692. // przesuniecia w poziomie
  693. case VK_NEXT:
  694. if ((pivot_x+change)<400)
  695. pivot_x+=change;
  696. InvalidateRect(hWnd, NULL, FALSE);
  697. break;
  698. case VK_DELETE:
  699. if ((pivot_x-change)>-400)
  700. pivot_x-=change;
  701. InvalidateRect(hWnd, NULL, FALSE);
  702. break;
  703.  
  704. // przesuniecia w pionie
  705. case VK_HOME:
  706. if ((pivot_y+change)<400)
  707. pivot_y+=change;
  708. InvalidateRect(hWnd, NULL, FALSE);
  709. break;
  710. case VK_END:
  711. if ((pivot_y-change)>-400)
  712. pivot_y-=change;
  713. InvalidateRect(hWnd, NULL, FALSE);
  714. break;
  715.  
  716. // odleglosc
  717. case VK_INSERT:
  718. if ((z_dist+change)<600)
  719. z_dist+=change;
  720. InvalidateRect(hWnd, NULL, FALSE);
  721. break;
  722. case VK_PRIOR:
  723. if ((z_dist-change)>1)
  724. z_dist-=change;
  725. InvalidateRect(hWnd, NULL, FALSE);
  726. break;
  727.  
  728. // wyjscie z programu
  729. case VK_ESCAPE:
  730. PostMessage(hWnd, WM_CLOSE, 0, 0);
  731. return 0;
  732. // tutaj obsluga wazki g
  733. case VK_NUMPAD8:
  734. porusz_y=porusz_y+1;
  735. InvalidateRect(hWnd, NULL, FALSE);
  736. break;
  737. case VK_NUMPAD2:
  738. porusz_y=porusz_y-1;
  739. InvalidateRect(hWnd, NULL, FALSE);
  740. break;
  741. case VK_NUMPAD6:
  742. porusz_x=porusz_x+1;
  743.  
  744. InvalidateRect(hWnd, NULL, FALSE);
  745.  
  746. break;
  747. case VK_NUMPAD4:
  748. porusz_x=porusz_x-1;
  749.  
  750. InvalidateRect(hWnd, NULL, FALSE);
  751. break;
  752. case VK_NUMPAD7:
  753. porusz_z=porusz_z-1;
  754.  
  755. InvalidateRect(hWnd, NULL, FALSE);
  756. break;
  757. case VK_NUMPAD9:
  758. porusz_z=porusz_z+1;
  759.  
  760. InvalidateRect(hWnd, NULL, FALSE);
  761. break;
  762. }
  763. }
  764.  
  765.  
  766. return DefWindowProc( hWnd, msg, wParam, lParam );
  767. }
  768.  
  769.  
  770.  
  771. //*******************************************************
  772. // Uruchomienie OpenGL w srodowisku Windows wymaga
  773. // wlaczenie trybu pikselowego oraz ustawienia
  774. // kontekstu renderowania
  775. //*******************************************************
  776.  
  777. HGLRC SetUpOpenGL( HWND hWnd )
  778. {
  779. static PIXELFORMATDESCRIPTOR pfd =
  780. {
  781. sizeof (PIXELFORMATDESCRIPTOR), // rozmiar struktury
  782. 1, // numer wersji
  783. PFD_DRAW_TO_WINDOW | // flaga rysowania w oknie,
  784. PFD_SUPPORT_OPENGL | // uzycie OpenGL
  785. PFD_DOUBLEBUFFER, // uzycie podwojnego buforowania
  786. PFD_TYPE_RGBA, // model kolorow - RGBA
  787. 24, // kolor 24-bitowy
  788. 0, 0, 0,
  789. 0, 0, 0, // trezerwa
  790. 0, 0, // brak bufora alpha
  791. 0, 0, 0, 0, 0, // brak bufora akumulacji
  792. 32, // bufor glebokosci 32-bitowy
  793. 0, // brak bufora szablonu
  794. 0, // brak bufora pomocniczego
  795. PFD_MAIN_PLANE, // warstwa
  796. 0, // rezerwa - 0
  797. 0, // maska
  798. 0, // maska widoczna
  799. 0 // maska bledow
  800. };
  801.  
  802. // zmienne
  803. int nMyPixelFormatID;
  804.  
  805. HDC hDC;
  806.  
  807. HGLRC hRC;
  808.  
  809. hDC = GetDC( hWnd );
  810.  
  811. // Inicjalizacja trybu pikselowego
  812.  
  813. nMyPixelFormatID = ChoosePixelFormat( hDC, &pfd );
  814. SetPixelFormat( hDC, nMyPixelFormatID, &pfd );
  815.  
  816. // Inicjalizacja kontekstu renderowania
  817.  
  818. hRC = wglCreateContext( hDC );
  819. ReleaseDC( hWnd, hDC );
  820.  
  821. return hRC;
  822. }
  823.  
  824.  
  825.  
  826. //********************************************************
  827. // Glowna funkcja rysujaca.
  828. //********************************************************
  829.  
  830.  
  831.  
  832. void DrawOpenGLScene( )
  833. {
  834. int i;
  835. //GLfloat position[4]={10.0f, 10.0, 100.0f, 0.0f};
  836. GLfloat position[4]={.1f, .1, .1f, .1f};
  837.  
  838. // flagi czynnosci pomocniczych
  839.  
  840. glEnable( GL_DEPTH_TEST );
  841.  
  842. // czyszczenie buforow
  843. glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
  844.  
  845. //glEnable(GL_CULL_FACE);
  846. glEnable(GL_COLOR_MATERIAL);
  847.  
  848. auxInitDisplayMode(AUX_SINGLE|AUX_RGBA);
  849.  
  850. // wlaczenie oswietlenia
  851.  
  852. //glLightfv(GL_LIGHT0, GL_POSITION, position);
  853. glEnable(GL_LIGHT0);
  854. glEnable(GL_LIGHTING);
  855.  
  856. //tonasze
  857. //glLightModelf(GL_LIGHT_MODEL_AMBIENT, 1.f/*, 1.f, 1.f, 1.f*/);
  858.  
  859. // transformacja obserwacji
  860.  
  861. glMatrixMode( GL_MODELVIEW );
  862. glLoadIdentity();
  863.  
  864. // umiejscowienie kamery w odleglym miejscu
  865. glTranslatef( pivot_x, pivot_y, -z_dist );
  866. glRotatef(pivot_vert_angle, 1, 0, 0);
  867. glRotatef(pivot_horiz_angle, 0, 1, 0);
  868. glPushMatrix();
  869. //hehe
  870. //walec(5,0,0,0,5,red);
  871. //swietlik(15,15,15,2.5,2,2);
  872.  
  873. //RenderScene();
  874. scena();
  875.  
  876. glPopMatrix();
  877.  
  878. glPushMatrix();
  879. glColorMaterial(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE);
  880. glTranslatef(porusz_x,porusz_y,porusz_z);
  881. //glRotatef(-30,1,0,0);
  882. swietlik(0,0,0,2.5,2,2);
  883. swietlik_x=swietlik_x+porusz_x;
  884. swietlik_z=swietlik_z+porusz_z;
  885. glPopMatrix();
  886.  
  887. glFlush ();
  888.  
  889.  
  890.  
  891.  
  892. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement