Advertisement
rvn182

Untitled

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