Guest User

Untitled

a guest
Jan 24th, 2018
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 16.71 KB | None | 0 0
  1. // Ćwiczenie oparte o:
  2.  
  3. // SphereWorld.cpp
  4. // OpenGL SuperBible
  5. // Demonstrates an immersive 3D environment using actors
  6. // and a camera. This version adds lights and material properties
  7. // and shadows.
  8. // Program by Richard S. Wright Jr.
  9.  
  10. #include <stdio.h>
  11. #include "../shared/gltools.h" // OpenGL toolkit
  12. #include "../shared/math3d.h" // 3D Math Library
  13. #include "../shared/glframe.h" // Frame class
  14. #include "../shared/stopwatch.h" // Timer class
  15. #include <math.h>
  16.  
  17. // 3. Dodaj swoje imię i nazwisko do belki tytułowej
  18. // ...
  19. const char *appTitle = "Display lists & flat shadow. Autor: Paweł Płotka";
  20.  
  21. bool displayListOn = false; // wyświetlanie przy pomocy list wyświetlania
  22.  
  23. #define NUM_SPHERES 50
  24. GLFrame spheres[ NUM_SPHERES ];
  25. GLFrame frameCamera;
  26.  
  27. // parametry świateł i materiałów
  28. GLfloat fLightPos[ 4 ] = { -100.0f, 100.0f, 50.0f, 1.0f }; // źródło światła punktowego
  29. GLfloat fNoLight[] = { 0.0f, 0.0f, 0.0f, 0.0f };
  30. GLfloat fLowLight[] = { 0.25f, 0.25f, 0.25f, 1.0f };
  31. GLfloat fBrightLight[] = { 1.0f, 1.0f, 1.0f, 1.0f };
  32.  
  33. M3DMatrix44f mShadowMatrix;
  34.  
  35. GLuint sphereList, groundList, torusList; // identyfikatory list wyświetlania
  36.  
  37. void DrawGround( void ); // rysowanie terenu
  38.  
  39. //////////////////////////////////////////////////////////////////
  40. // This function does any needed initialization on the rendering
  41. // context.
  42. // tekstury
  43. const int GROUND_TEXTURE = 0;
  44. const int TORUS_TEXTURE = 1;
  45. const int SPHERE_TEXTURE = 2;
  46. const int TEXTURES_NUM = 3; // liczba wykorzystywanych tekstu
  47. GLuint textures[ TEXTURES_NUM ]; // identyfikatory tekstur
  48. void SetupRC()
  49. {
  50. const char *textureNames[ TEXTURES_NUM ] =
  51. {
  52. "..\\Media\\grass.tga", "..\\Media\\wood.tga", "..\\Media\\orb.tga"
  53. };
  54. int iSphere;
  55. int i;
  56.  
  57. glStencilOp( GL_INCR, GL_INCR, GL_INCR ); // zwiększenie zawartości w przypadku nieudanego testu
  58. glClearStencil( 0 ); // wyczyszczenie bufora szablonu
  59. glStencilFunc( GL_EQUAL, 0x0, 0x01 ); // ustawienie funkcji porównującej bufora szablonu
  60.  
  61.  
  62. // 5b. Ustawienie parametrów rysowania sceny
  63. // - ustawienie koloru tła na szary (fLowLight) funkcją glClearColor()
  64. // - ustawienie nierysowania wewnętrznych ścianek (GL_BACK) funkcją glCullFace()
  65. // - ustawienie funkcją glFrontFace() przednich ścianek jako podawanych w kierunku
  66. // przeciwnym do ruchu wskazówek zegara (GL_CCW)
  67. // - włączenie nierysowania ścianek (GL_CULL_FACE)
  68. // - włączenie testu głębokości (GL_DEPTH_TEST)
  69. // - włączenie wieloprzebiegowych tekstur (GL_MULTISAMPLE_ARB)
  70. // ...
  71. glClearColor(0.25f, 0.25f, 0.25f, 1.0f);
  72. glCullFace(GL_BACK);
  73. glFrontFace(GL_CCW);
  74. glCullFace(GL_CULL_FACE);
  75. glEnable(GL_DEPTH_TEST);
  76. glEnable(GL_MULTISAMPLE_ARB);
  77.  
  78.  
  79.  
  80.  
  81. // 5c. Ustawienie parametrów oświetlenia
  82. // - Włączenie oświetlenia (GL_LIGHTING)
  83. // - Ustawienie parametrów dla światła GL_LIGHT0 funkcją glLightfv().
  84. // Składowe GL_AMBIENT, GL_DIFFUSE, GL_SPECULAR ustawiamy odpowiednio
  85. // na podstawie wektorów: fLowLight, fBrightLight i fBrightLight
  86. // - Włączenia światła GL_LIGHT0
  87. // ...
  88. glEnable(GL_LIGHTING);
  89. glLightfv(GL_LIGHT0, GL_AMBIENT, fLowLight);
  90. glLightfv(GL_LIGHT0, GL_DIFFUSE, fBrightLight);
  91. glLightfv(GL_LIGHT0, GL_SPECULAR, fBrightLight);
  92. glEnable(GL_LIGHT0);
  93.  
  94. glLightModelfv( GL_LIGHT_MODEL_AMBIENT, fNoLight ); // brak światła ambient sceny
  95. glLightModeli( GL_LIGHT_MODEL_COLOR_CONTROL, GL_SEPARATE_SPECULAR_COLOR );
  96.  
  97. // - Włączenie obsługi materiałów (GL_COLOR_MATERIAL)
  98. // - Ustawianie funkcją glColorMaterial() materiału koloru (GL_AMBIENT_AND_DIFFUSE)
  99. // ścianek przednich (GL_FRONT) na podstawie bieżącego koloru
  100. // - Ustawienie przednich (GL_FRONT) parametrów odbłyskowych materiału
  101. // (GL_SPECULAR, GL_SHININESS) na fBrightLight i 128 funkcjami odpowiednio:
  102. // glMaterialfv() oraz glMateriali
  103. // ...
  104. glEnable(GL_COLOR_MATERIAL);
  105. glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
  106. glMaterialfv(GL_FRONT, GL_SPECULAR, fBrightLight);
  107. glMateriali(GL_FRONT, GL_SHININESS, 128);
  108.  
  109.  
  110. // Obliczenie macierzy cienia mShadowMatrix
  111. M3DVector3f vPoints[ 3 ] =
  112. { // płaszczyzna y = -0.4f
  113. { 0.0f, -0.4f, 0.0f }, { 10.0f, -0.4f, 0.0f }, { 5.0f, -0.4f, -5.0f }
  114. };
  115. M3DVector4f pPlane;
  116. // 40. Wyznaczenie równania płaszczyzny pPlane na podstawie jej 3 punktów (vPoints[])
  117. // Użyj funkcji bibliotecznej m3dGetPlaneEquation( plane, point1, point2, point3 )
  118. // ...
  119.  
  120.  
  121. // 41. Obliczenie w mCubeTransform macierzy rzutowania cienia na płaszczyźnie
  122. // Użyj funkcji m3dMakePlanarShadowMatrix() podając jako parametry macierz
  123. // cienia, równanie płaszczyzny oraz pozycję światła fLightPos
  124. // ...
  125.  
  126.  
  127. // 18. Ustawienie losowych współrzędnych X oraz Z dla wszystkich
  128. // NUM_SPHERES sfer (spheres[]). Współrzędne X i Z mają mieć wartość losową
  129. // z zakresu -20 do 20 z krokiem 0.1, a współrzędna y ma mieć stałą wartość 0.0
  130. // Do ustawienia współrzędnych należy użyć metody SetOrigin( x, y, z )
  131. // ...
  132. for ( iSphere = 0; iSphere < NUM_SPHERES; iSphere++ )
  133. {
  134. spheres[ iSphere ].SetOrigin( ( (float)( ( rand() % 400 ) - 200) * 0.1f ), 0.0, (float)( ( rand() % 400 ) - 200 ) * 0.1f );
  135. }
  136.  
  137. // 23. Włączenie przetwarzania tektur dwuwymiarowych (GL_TEXTURE_2D)
  138. // ...
  139.  
  140.  
  141. // 24. Ustawienie dla tekstur (GL_TEXTURE_ENV) trybu 'funkcji tekstury' (GL_TEXTURE_ENV_MODE)
  142. // na mnożenie kolorów (GL_MODULATE). Użyj funkcji glTexEnvi()
  143. // ...
  144.  
  145.  
  146. // 25. Przydzielenie identyfikatorów dla TEXTURES_NUM tekstur
  147. // Użyj funkcji glGenTextures() zapisując identyfikatory w tabeli textures
  148. // ...
  149.  
  150.  
  151. // 26. W PĘTLI dla KAŻDEJ tekstury
  152. // ...
  153.  
  154.  
  155. {
  156. GLbyte *pBytes;
  157. GLint iWidth, iHeight, iComponents;
  158. GLenum eFormat;
  159.  
  160. // 27. Załaduj teksturę funkcją gltLoadTGA( textureNames[ i ], &nWidth, &nHeight, &iComponents, &eformat );
  161. // PODSTAWIAJĄC wynik do pBytes
  162. // ...
  163.  
  164.  
  165. // 28. Powiąż teksturę (GL_TEXTURE_2D) z odpowiednim identyfikatorem
  166. // funkcją glBindTexture()
  167. // ...
  168.  
  169.  
  170. // 29. Zbudowanie mipmap 2D (GL_TEXTURE_2D) funkcją gluBuild2DMipmaps( rodzaj tesktury, iComponents,
  171. // iWidth, iHeight, eFormat, GL_UNSIGNED_BYTE, pBytes )
  172. // ...
  173.  
  174.  
  175. // 30. Zwolnij pamięć tekstur free( pBytes );
  176. // ...
  177.  
  178.  
  179. // 50. Ustaw parametry filtrowania (GL_TEXTURE_MIN_FILTER, GL_TEXTURE_MAG_FILTER)
  180. // i kafelkowania (GL_TEXTURE_WRAP_S, GL_TEXTURE_WRAP_T) dla tekstur dwuwymiarowych (GL_TEXTURE_2D)
  181. // kolejnymi wywołaniami fukcji glTexParameteri()
  182. // filtrowanie liniowe przy powiększeniu (GL_LINEAR) i zmniejszeniu (GL_LINEAR_MIPMAP_LINEAR)
  183. // zawijania (GL_CLAMP_TO_EDGE)
  184. // ..
  185.  
  186. }
  187.  
  188. // 33. Przydzielenie funkcją glGenLists() identyfikatorów dla list:
  189. // groundList, sphereList, torusList
  190. // ...
  191.  
  192.  
  193. // 34. Zdefiniowanie listy wyświetlania dla sfery
  194. // - rozpoczęcie funkcją glNewList() dla sphereList z parametrem kompilacji (GL_COMPILE)
  195. // - narysowanie sfery funkcją gltDrawSphere() - parametry jak w DrawInhabitants()
  196. // - zakończenie funkcją glEndList()
  197. // ...
  198.  
  199.  
  200. // 35. Zdefiniowanie listy wyświetlania dla torusa - parametry jak w DrawInhabitants()
  201. // ...
  202.  
  203.  
  204. // 36. Zdefiniowanie listy wyświetlania dla 'podłoża' - funkcja DrawGround()
  205. // ...
  206.  
  207. }
  208.  
  209. ////////////////////////////////////////////////////////////////////////
  210. void ShutdownRC( void )
  211. { // zwolnienie zaalokowanych zasobów
  212. // 32. Zwolnienie TEXTURES_NUM tekstur funkcją glDeleteTextures()
  213. // ...
  214.  
  215.  
  216. // 37. Zwolnienie 3 list wyświetlania funkcją glDeleteLists()
  217. // ...
  218.  
  219. }
  220.  
  221.  
  222. ///////////////////////////////////////////////////////////
  223. // Draw the ground as a series of triangle strips
  224. void DrawGround( void )
  225. { // rysuje kwadratowy teren wykorzystując paski trójkątów
  226. GLfloat fExtent = 20.0f; // połowa boku kwadratu podłoża (odległość od środka do jego boków)
  227. GLfloat fStep = 1.0f; // krok wyznaczający wielkość trójkątów
  228. GLfloat y = -0.4f; // wysokość terenu
  229. GLint iStrip; // zmienna iterująca w poziomie
  230. GLint iRun; // zmienna iterująca w pionie
  231. GLfloat s = 0.0f; // pozioma współrzędna tekstury
  232. GLfloat t = 0.0f; // pionowa współrzędna tekstury
  233. GLfloat texStep = 1.0f / ( fExtent * 0.075f ); // krok tekstury
  234.  
  235. // 32b. Ustawienie tektury SPHERE_TEXTURE jako aktualnej tekstury dwuwymiarowej
  236. // (GL_TEXTURE_2D) funkcją glBindTexture()
  237. // Ustawienie kafelkowania GL_TEXTURE_WRAP_S i GL_TEXTURE_WRAP_T na powtarzanie
  238. // wzoru (GL_REPEAT) funkcją glTexParameterf()
  239. // ...
  240.  
  241.  
  242.  
  243. // 16. Narysowanie poziomego, kwadratowego podłoża o rozciągłości:
  244. // - w kierunku X (iStrip) od -fExtent do fExtent z krokiem fStep
  245. // - w kierunku Z (iRun) od -fExtent do fExtent z krokiem fStep
  246. // Krok dla tekstury wynosi texStep
  247. // Paski podajemy po DWA (2) wierzchołki na raz (sąsiadujące wzdłuż osi X)
  248. // Dla każdego wierzchołka podajemy:
  249. // - normalną zwróconą do góry (glNormal3f())
  250. // - współrzędne tekstury glTexCoord2f())
  251. // - współrzędne glVertex3f()
  252. // ...
  253. s = 0.0f;
  254. for (iStrip = - fExtent; iStrip<= fExtent; iStrip=iStrip+fStep)
  255. {
  256. t = 0.0f;
  257. glBegin(GL_TRIANGLE_STRIP);
  258. for (iRun=-fExtent;iRun<=fExtent;iRun+=fStep)
  259. {
  260. glNormal3f(0.0f,1.0f,0.0f);
  261. glTexCoord2f( s,t);
  262. glVertex3f(iStrip,y,iRun);
  263.  
  264. glNormal3f(0.0f,1.0f,0.0f);
  265. glTexCoord2f(s+texStep,t);
  266. glVertex3f(iStrip+fStep,y,iRun);
  267.  
  268. t+=texStep;
  269. }
  270. glEnd();
  271. s+=texStep;
  272. }
  273.  
  274. }
  275.  
  276. ///////////////////////////////////////////////////////////////////////
  277. // Draw random inhabitants and the rotating torus/sphere duo
  278. void DrawInhabitants( GLint nShadow )
  279. { // nShadow == 1 - rysowanie cieni, nShadow == 0 - rysowanie obieków
  280. static GLfloat yRot = 0.0f; // kąt obrotu
  281. GLint i;
  282.  
  283. if ( nShadow == 0 )
  284. {
  285. yRot += 0.5f; // zwiększenie kąta obrotu kuli i torusa
  286. glColor4f( 1.0f, 1.0f, 1.0f, 1.0f ); // biały 'podkład' pod teksturę obiektów
  287. }
  288. // 43. ustawienie czarnego koloru rysowania jeżeli nShadow == 1
  289. // ...
  290.  
  291.  
  292. // 32b. Ustawienie tektury SPHERE_TEXTURE jako aktualnej tekstury dwuwymiarowej
  293. // (GL_TEXTURE_2D) funkcją glBindTexture()
  294. // ...
  295. glBindTexture( GL_TEXTURE_2D, textures[ SPHERE_TEXTURE ] );
  296.  
  297. // 19. Narysowanie losowych NUM_SPHERES sfer
  298. // Przed narysowaniem sfery należy zachować aktualną wartość macierzy widoku modelu
  299. // oraz wykonać przesunięcie współrzędnych metodą ApplyActorTransform()
  300. // Do narysowania sfery o promieniu 0.1 należy użyć funkcji gltDrawSphere() z dokładnością 40
  301. // Po narysowaniu sfery należy odtworzyć aktualną wartość macierzy widoku modelu
  302. // ...
  303. for(int i = 0; i < NUM_SPHERES; i++)
  304. {
  305.  
  306. sphereList[i].ApplyActorTransform();
  307. }
  308.  
  309. glPushMatrix();
  310. glTranslatef( 0.0f, 0.1f, -2.5f );
  311.  
  312. // 20. Narysowanie sfery obracającej się wokół torusa
  313. // - zachowanie macierzy widoku modelu
  314. // - obrót wokół osi Y o kąt równy 2*yRots
  315. // - przesunięcie o 1 wzdłuż osi X
  316. // - odtworzenie macierzy widoku modelu
  317. // ...
  318.  
  319.  
  320. // 32b. Ustawienie tektury TORUS_TEXTURE jako aktualnej tekstury dwuwymiarowej
  321. // (GL_TEXTURE_2D) funkcją glBindTexture()
  322. // ...
  323.  
  324.  
  325. // 21. Narysowanie obracającego się torusa
  326. // - ustawienie odbłyskowych własności (GL_SPECULAR) materiału dla
  327. // przedniej ścianki (GL_FRONT)na kolor fBrightLight[] funkcją
  328. // glMaterialfv
  329. // - obrót wokół osi Y o kąt yRot
  330. // - narysowanie torusa funkcją gltDrawTorus() z promieniami
  331. // 0.35 i 0.15 oraz z dokładnością 40
  332. // - odtworzenie macierzy widoku modelu
  333. // - usunięcie odbłyskowych własności materiału używając koloru fNoLight
  334. // ...
  335.  
  336. }
  337.  
  338.  
  339. void RenderScene( void )
  340. { // rysowanie sceny
  341. static int iFrames = 0; // licznik ramek
  342. static CStopWatch frameTimer; // timer
  343.  
  344. // 5. Wyczyszczenie okna bieżącym kolorem czyszczenia
  345. // używamy funkcji glClear czyszcząc bufor obrazu (GL_COLOR_BUFFER_BIT),
  346. // bufor głębokości (GL_DEPTH_BUFFER_BIT) oraz bufor szablonu
  347. // ...
  348. glClear(GL_COLOR_BUFFER_BIT);
  349. glClear(GL_DEPTH_BUFFER_BIT);
  350. glClear(GL_STENCIL_BUFFER_BIT);
  351.  
  352. glPushMatrix();
  353. frameCamera.ApplyCameraTransform();
  354.  
  355. // 14. Ustawienie pozycji (GL_POSITION) światła GL_LIGHT0 na
  356. // wektor vLightPos funkcją glLightfv()
  357. // ...
  358. glLightfv(GL_LIGHT0, GL_POSITION, fLightPos);
  359.  
  360.  
  361. glColor3f( 1.0f, 1.0f, 1.0f );
  362. // 17. Narysowanie terenu
  363. // ...
  364. DrawGround();
  365.  
  366.  
  367. // 42. Narysowanie cieni
  368. // -wyłączenie testu głębokości (GL_DEPTH_TEST), oświetlenia (GL_LIGHTING),
  369. // teksturowania (GL_TEXTURE_2D)
  370. // - włączenie obsługi przezroczystości (GL_BLEND) i bufora szablonu (GL_STENCIL_TEST)
  371. // - ustawienie funkcji przezroczystości glBlendFunc() na GL_SRC_ALPHA i GL_ONE_MINUS_SRC_ALPHA
  372. // - zapamiętanie bieżacej macierzy przekształceń
  373. // - przemnożenie aktualnej macierzy przekształceń przez macierz cienia mShadowMatrix
  374. // funkcją glMultMatrixf()
  375. // - narysowanie sfer i torusa. UWAGA na parametr!
  376. // odtworzenie macierzy przekształceń
  377. // odtworzenie parametrów stanu
  378. // ...
  379.  
  380.  
  381. // 22. Narysowanie kul i torusa (bez cieni)
  382. // ...
  383.  
  384.  
  385. glPopMatrix(); // odtworzenie macierzy przekształceń
  386.  
  387. glutSwapBuffers(); // wysłanie komend renderowania i przełączenie buforów
  388.  
  389. iFrames++; // zwiększenie licznika ramek
  390.  
  391. if ( iFrames == 100 )
  392. { // obliczenie częstotliwości wyświetlania
  393. float fps;
  394. char cBuffer[ 200 ];
  395. fps = 100.0f / frameTimer.GetElapsedSeconds();
  396. if ( displayListOn )
  397. sprintf( cBuffer, "%s [Display Lists] %.1f fps", appTitle, fps );
  398. else
  399. sprintf( cBuffer, "%s [Tryb bezpośredni] %.1f fps", appTitle, fps );
  400. glutSetWindowTitle( cBuffer );
  401. frameTimer.Reset();
  402. iFrames = 0;
  403. }
  404. }
  405.  
  406. void KeyPressFunc( unsigned char key, int x, int y )
  407. { // obsługa przycisków
  408. switch ( key )
  409. {
  410. case ' ': // spacja
  411. // Naprzemienne włączenie użycia displayList po naciśnięciu spacji
  412. displayListOn = !displayListOn;
  413. break;
  414. case 27: // ESC
  415. // 4. Zamknięcie okna funkcją: void glutDestroyWindow( int window )
  416. // id okna należy pobrać funkcją: int glutGetWindow( void )
  417. // ...
  418. int w = glutGetWindow();
  419. glutDestroyWindow(w);
  420. break;
  421. }
  422. glutPostRedisplay(); // odświeżenie okna
  423. }
  424.  
  425. void SpecialKeys( int key, int x, int y )
  426. { // obsługa klawiszy specjalnych
  427. switch ( key )
  428. {
  429. case GLUT_KEY_UP:
  430. frameCamera.MoveForward( 0.1f );
  431. break;
  432. case GLUT_KEY_DOWN:
  433. frameCamera.MoveForward( -0.1f );
  434. break;
  435. case GLUT_KEY_LEFT:
  436. frameCamera.RotateLocalY( 0.01f );
  437. break;
  438. case GLUT_KEY_RIGHT:
  439. frameCamera.RotateLocalY( -0.01f );
  440. break;
  441. }
  442. glutPostRedisplay(); // odświeżenie okna
  443. }
  444.  
  445. ///////////////////////////////////////////////////////////
  446. void TimerFunction( int value )
  447. { // wywoływana przez GLUT w trybie idle
  448. glutPostRedisplay();
  449. glutTimerFunc( 3, TimerFunction, 1 );
  450. }
  451.  
  452. void ChangeSize( int w, int h )
  453. {
  454. // 6. Zabezpieczenie, aby rozmiary okna Viewport nie spadły poniżej 1
  455. // ...
  456. if(w < 1) w = 1;
  457. if(h < 1) h = 1;
  458.  
  459.  
  460. // 7. Ustawienie okna Viewport na całą szerokość okna Window
  461. // Należy skorzystać z funkcji glViewport( .. )
  462. // ...
  463. glViewport(0, 0, w, h);
  464.  
  465.  
  466. GLfloat fAspect; // proporcje okna
  467. // 8. Wyznaczenie proporcji okna (w/h).
  468. // !!! UWAGA na ograniczenia dzielenia całkowitoliczbowego !!!
  469. // ...
  470. fAspect = (float)w/h;
  471.  
  472.  
  473. // 9. Ustawienie macierzy rzutowania (GL_PROJECTION) jako aktualnej macierzy
  474. // funkcją glMatrixMode()
  475. // ...
  476. glMatrixMode(GL_PROJECTION);
  477.  
  478. // 10. Ustawienie macierzy rzutowania jako macierzy jednostkowej funkcją
  479. // glLoadIdentity()
  480. // ...
  481. glLoadIdentity();
  482.  
  483.  
  484. // 11. Ustawienie rzutowania perspektywicznego funkcją gluPerspective()
  485. // kąt widzenia = 35 stopni, odległość od bliższej płaszczyzny obcinania = 1
  486. // odległość od dalszej płaszczyzny obcinania = 50
  487. // ...
  488. gluPerspective(35, fAspect, 1, 50);
  489.  
  490.  
  491. // 12. Ustawienie macierzy widoku modelu (GL_MODELVIEW) jako aktualnej macierzy
  492. // ...
  493. glMatrixMode(GL_MODELVIEW);
  494.  
  495. // 13. Ustawienie macierzy widoku modelu jako macierzy jednostkowej
  496. // ...
  497. glLoadIdentity();
  498.  
  499. }
  500.  
  501. int main( int argc, char* argv[] )
  502. {
  503. glutInit( &argc, argv );
  504. glutInitDisplayMode( GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH | GLUT_STENCIL );
  505. glutInitWindowSize( 800, 600 );
  506. glutCreateWindow( appTitle ); // utworzenie okna
  507. glutReshapeFunc( ChangeSize );
  508. glutDisplayFunc( RenderScene );
  509. glutKeyboardFunc( KeyPressFunc ); // funkcja obsługi klawiatury
  510. glutSpecialFunc( SpecialKeys );
  511.  
  512. SetupRC();
  513. glutTimerFunc( 33, TimerFunction, 1 );
  514.  
  515. glutMainLoop();
  516.  
  517. ShutdownRC();
  518. return 0;
  519. }
Add Comment
Please, Sign In to add comment