Facebook
From Chocolate Pudu, 9 Years ago, written in C.
Embed
Download Paste or View Raw
Hits: 602
  1. /*
  2. gcc -o szesciany.exe -Wall szesciany.c glut32.lib -lopengl32 -lglu32 -std=c99
  3. */
  4.  
  5. #include <stdio.h>
  6. #include <GL/gl.h>
  7. #include <GL/glut.h>
  8. #include <time.h>
  9. #include <windows.h>
  10. #include <stdbool.h>
  11.  
  12. #define UP 0
  13. #define DOWN 1
  14. #define COLOR1_UP true
  15. #define COLOR1_DOWN false
  16. #define COLOR2_UP true
  17. #define COLOR2_DOWN false
  18. #define COLOR3_UP true
  19. #define COLOR3_DOWN false
  20.  
  21. int i,j,k;
  22. int przycisk = 0.0;
  23. float katGlownejOsi = 0.0;
  24. float katPobocznychOsi = 0.0;
  25. float odlegloscOdSrodka = 1.0;
  26. float distance = 0;
  27. int direction = 0;
  28. float color1R = 0.0;
  29. float color1G = 0.0;
  30. float color1B = 1.0;
  31. float color2R = 0.0;
  32. float color2G = 0.0;
  33. float color2B = 1.0;
  34. float color3R = 0.0;
  35. float color3G = 0.0;
  36. float color3B = 1.0;
  37. float colorChange = 0.001f;
  38. int changedColor = 0;
  39. bool color1Direction = COLOR1_UP;
  40. bool color2Direction = COLOR2_UP;
  41. bool color3Direction = COLOR3_UP;
  42.  
  43. void Rysuj()
  44. {
  45. glEnable(GL_DEPTH_TEST);
  46. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  47. glMatrixMode(GL_MODELVIEW);
  48.  
  49.         glColor3f(0.0,0.0,1.0);
  50.         glTranslatef(0.0,0.0,0.0);
  51.         switch(przycisk)
  52.         {
  53.                 case 0:
  54.                         glRotatef(katGlownejOsi,0,1,0);
  55.                         for(i=-1;i<2;i++)
  56.                         {
  57.                                 for(j=-1;j<2;j++)
  58.                                 {
  59.                                         for(k=-1;k<2;k++)
  60.                                         {
  61.                                                 glPushMatrix();
  62.                                                 glTranslatef(i,j,k);
  63.                                                 switch(i)
  64.                                                 {
  65.                                                         case -1: glTranslatef(distance, 0, 0); break;
  66.                                                         case 0: glTranslatef(0, 0, 0); break;
  67.                                                         case 1: glTranslatef(-distance, 0, 0); break;
  68.                                                 }
  69.                                                 switch(j)
  70.                                                 {
  71.                                                         case -1: glTranslatef(0, distance, 0); break;
  72.                                                         case 0: glTranslatef(0, 0, 0); break;
  73.                                                         case 1: glTranslatef(0, -distance, 0); break;
  74.                                                 }
  75.                                                 switch(k)
  76.                                                 {
  77.                                                         case -1: glTranslatef(0, 0, distance); break;
  78.                                                         case 0: glTranslatef(0, 0, 0); break;
  79.                                                         case 1: glTranslatef(0, 0, -distance); break;
  80.                                                 }
  81.                                                 if(changedColor==1)
  82.                                                 {
  83.                                                         if(i==-1 && j==1 && k==-1) glColor3f(color1R, color1G, color1B);
  84.                                                         if(i==0 && j==1 && k==0) glColor3f(color2R, color2G, color2B);
  85.                                                         if(i==1 && j==1 && k==1) glColor3f(color3R, color3G, color3B);
  86.                                                 }
  87.                                                 glRotatef(-katPobocznychOsi,0,1,0);
  88.                                                 glutSolidCube(0.55);
  89.                                                 glPopMatrix();
  90.                                                 glColor3f(0.0,0.0,1.0);
  91.                                         }
  92.                                 }
  93.                         }
  94.                         break;
  95.                 /* Obracanie wzgledem osi srodkowej */
  96.                 case 1:
  97.                         katGlownejOsi += -0.05;
  98.                        
  99.                         glRotatef(katGlownejOsi,0,1,0);
  100.                         for(i=-1;i<2;i++)
  101.                         {
  102.                                 for(j=-1;j<2;j++)
  103.                                 {
  104.                                         for(k=-1;k<2;k++)
  105.                                         {
  106.                                                 glPushMatrix();
  107.                                                 glTranslatef(i,j,k);
  108.                                                 switch(i)
  109.                                                 {
  110.                                                         case -1: glTranslatef(distance, 0, 0); break;
  111.                                                         case 0: glTranslatef(0, 0, 0); break;
  112.                                                         case 1: glTranslatef(-distance, 0, 0); break;
  113.                                                 }
  114.                                                 switch(j)
  115.                                                 {
  116.                                                         case -1: glTranslatef(0, distance, 0); break;
  117.                                                         case 0: glTranslatef(0, 0, 0); break;
  118.                                                         case 1: glTranslatef(0, -distance, 0); break;
  119.                                                 }
  120.                                                 switch(k)
  121.                                                 {
  122.                                                         case -1: glTranslatef(0, 0, distance); break;
  123.                                                         case 0: glTranslatef(0, 0, 0); break;
  124.                                                         case 1: glTranslatef(0, 0, -distance); break;
  125.                                                 }
  126.                                                 if(changedColor==1)
  127.                                                 {
  128.                                                         if(i==-1 && j==1 && k==-1) glColor3f(color1R, color1G, color1B);
  129.                                                         if(i==0 && j==1 && k==0) glColor3f(color2R, color2G, color2B);
  130.                                                         if(i==1 && j==1 && k==1) glColor3f(color3R, color3G, color3B);
  131.                                                 }
  132.                                                 glRotatef(-katPobocznychOsi,0,1,0);
  133.                                                 glutSolidCube(0.55);
  134.                                                 glPopMatrix();
  135.                                                 glColor3f(0.0,0.0,1.0);
  136.                                         }
  137.                                 }
  138.                         }
  139.                         break;
  140.                 /* Obracanie wzgledem osi Z dla 3*3 elementow */
  141.                 case 2:
  142.                         katPobocznychOsi += 0.05;
  143.                        
  144.                         glPushMatrix();
  145.                         glRotatef(katGlownejOsi,0,1,0);
  146.                         for(i=-1;i<2;i++)
  147.                         {
  148.                                 for(j=-1;j<2;j++)
  149.                                 {
  150.                                         for(k=-1;k<2;k++)
  151.                                         {
  152.                                                 glPushMatrix();
  153.                                                 glTranslatef(i,k,j);
  154.                                                 if(changedColor==1)
  155.                                                 {
  156.                                                         if(i==-1 && k==1 && j==-1) glColor3f(color1R, color1G, color1B);
  157.                                                         if(i==0 && k==1 && j==0) glColor3f(color2R, color2G, color2B);
  158.                                                         if(i==1 && k==1 && j==1) glColor3f(color3R, color3G, color3B);
  159.                                                 }
  160.                                                 switch(i)
  161.                                                 {
  162.                                                         case -1: glTranslatef(distance, 0, 0); break;
  163.                                                         case 0: glTranslatef(0, 0, 0); break;
  164.                                                         case 1: glTranslatef(-distance, 0, 0); break;
  165.                                                 }
  166.                                                 switch(j)
  167.                                                 {
  168.                                                         case -1: glTranslatef(0, 0, distance); break;
  169.                                                         case 0: glTranslatef(0, 0, 0); break;
  170.                                                         case 1: glTranslatef(0, 0, -distance); break;
  171.                                                 }
  172.                                                 switch(k)
  173.                                                 {
  174.                                                         case -1: glTranslatef(0, distance, 0); break;
  175.                                                         case 0: glTranslatef(0, 0, 0); break;
  176.                                                         case 1: glTranslatef(0, -distance, 0); break;
  177.                                                 }
  178.                                                 glRotatef(-katPobocznychOsi,0,1,0);
  179.                                                 glutSolidCube(0.55);
  180.                                                 glPopMatrix();
  181.                                                 glColor3f(0.0,0.0,1.0);
  182.                                         }
  183.                                 }
  184.                         }
  185.                         glPopMatrix();
  186.                         break;
  187.                 /* Rozciaganie od srodka */
  188.                 case 3:
  189.                         if(distance >= 0.2f) direction = UP;
  190.                         if(distance <= -0.2f) direction = DOWN;
  191.                         if(direction == UP) { distance -= 0.0004f; }
  192.                         else { distance += 0.0004f; }
  193.                        
  194.                         glRotatef(katGlownejOsi,0,1,0);
  195.                         for(i=-1;i<2;i++)
  196.                         {
  197.                                 for(j=-1;j<2;j++)
  198.                                 {
  199.                                         for(k=-1;k<2;k++)
  200.                                         {
  201.                                                 glPushMatrix();
  202.                                                 glTranslatef(i,j,k);
  203.                                                 switch(i)
  204.                                                 {
  205.                                                         case -1: glTranslatef(distance, 0, 0); break;
  206.                                                         case 0: glTranslatef(0, 0, 0); break;
  207.                                                         case 1: glTranslatef(-distance, 0, 0); break;
  208.                                                 }
  209.                                                 switch(j)
  210.                                                 {
  211.                                                         case -1: glTranslatef(0, distance, 0); break;
  212.                                                         case 0: glTranslatef(0, 0, 0); break;
  213.                                                         case 1: glTranslatef(0, -distance, 0); break;
  214.                                                 }
  215.                                                 switch(k)
  216.                                                 {
  217.                                                         case -1: glTranslatef(0, 0, distance); break;
  218.                                                         case 0: glTranslatef(0, 0, 0); break;
  219.                                                         case 1: glTranslatef(0, 0, -distance); break;
  220.                                                 }
  221.                                                 if(changedColor==1)
  222.                                                 {
  223.                                                         if(i==-1 && j==1 && k==-1) glColor3f(color1R, color1G, color1B);
  224.                                                         if(i==0 && j==1 && k==0) glColor3f(color2R, color2G, color2B);
  225.                                                         if(i==1 && j==1 && k==1) glColor3f(color3R, color3G, color3B);
  226.                                                 }
  227.                                                 glRotatef(-katPobocznychOsi,0,1,0);
  228.                                                 glutSolidCube(0.55);
  229.                                                 glPopMatrix();
  230.                                                 glColor3f(0.0,0.0,1.0);
  231.                                         }
  232.                                 }
  233.                         }
  234.                         break;
  235.                 /* Zmiany kolorow */
  236.                 case 4:
  237.                 changedColor = 1;
  238.                         glRotatef(katGlownejOsi,0,1,0);
  239.                         for(i=-1;i<2;i++)
  240.                         {
  241.                                 for(j=-1;j<2;j++)
  242.                                 {
  243.                                         for(k=-1;k<2;k++)
  244.                                         {
  245.                                                 glPushMatrix();
  246.                                                 glTranslatef(i,j,k);
  247.                                                 switch(i)
  248.                                                 {
  249.                                                         case -1: glTranslatef(distance, 0, 0); break;
  250.                                                         case 0: glTranslatef(0, 0, 0); break;
  251.                                                         case 1: glTranslatef(-distance, 0, 0); break;
  252.                                                 }
  253.                                                 switch(j)
  254.                                                 {
  255.                                                         case -1: glTranslatef(0, distance, 0); break;
  256.                                                         case 0: glTranslatef(0, 0, 0); break;
  257.                                                         case 1: glTranslatef(0, -distance, 0); break;
  258.                                                 }
  259.                                                 switch(k)
  260.                                                 {
  261.                                                         case -1: glTranslatef(0, 0, distance); break;
  262.                                                         case 0: glTranslatef(0, 0, 0); break;
  263.                                                         case 1: glTranslatef(0, 0, -distance); break;
  264.                                                 }
  265.                                                 if(i==-1 && j==1 && k==-1)      //ZIELONY
  266.                                                 {
  267.                                                         if(color1Direction == COLOR1_UP)
  268.                                                         {
  269.                                                                 glColor3f(color1R, color1G+=colorChange, color1B-=colorChange);
  270.                                                                 if(color1G >= 1.0f) color1Direction = COLOR1_DOWN;
  271.                                                         }
  272.                                                         if(color1Direction == COLOR1_DOWN)
  273.                                                         {
  274.                                                                 glColor3f(color1R, color1G-=colorChange, color1B+=colorChange);
  275.                                                                 if(color1G <= 0.0f) color1Direction = COLOR1_UP;
  276.                                                         }
  277.                                                 }              
  278.                                                 //glColor3f(color1R+=0.0001f, color1G+=0.0003f, color1B+=0.0006f);                                             
  279.                                                 if(i==0 && j==1 && k==0)        //CZERWONY
  280.                                                 {
  281.                                                         if(color2Direction == COLOR2_UP)
  282.                                                         {
  283.                                                                 glColor3f(color2R+=colorChange, color2G, color2B);
  284.                                                                 printf("COLOR2_UP      ->    ");
  285.                                                                 printf("%f\n", color2G);
  286.                                                                 if(color2R >= 1.0f) color2Direction = COLOR2_DOWN;
  287.                                                         }
  288.                                                         if(color2Direction == COLOR2_DOWN)
  289.                                                         {
  290.                                                                 glColor3f(color2R-=colorChange, color2G, color2B);
  291.                                                                 if(color2R <= 0.0f) color2Direction = COLOR2_UP;
  292.                                                         }
  293.                                                 }                                                      
  294.                                                 if(i==1 && j==1 && k==1)        //ŻÓŁTY
  295.                                                 {
  296.                                                         if(color3Direction == COLOR3_UP)
  297.                                                         {
  298.                                                                 glColor3f(color3R+=colorChange, color3G+=colorChange, color3B-=colorChange);
  299.                                                                 if(color3G >= 1.0f) color3Direction = COLOR3_DOWN;
  300.                                                         }
  301.                                                         if(color3Direction == COLOR3_DOWN)
  302.                                                         {
  303.                                                                 glColor3f(color3R-=colorChange, color3G-=colorChange, color3B+=colorChange);
  304.                                                                 if(color3G <= 0.0f) color3Direction = COLOR3_UP;
  305.                                                         }
  306.                                                 }                                                      
  307.                                                 glRotatef(-katPobocznychOsi,0,1,0);
  308.                                                 glutSolidCube(0.55);
  309.                                                 glPopMatrix();
  310.                                                 glColor3f(0.0,0.0,1.0);
  311.                                         }
  312.                                 }
  313.                         }
  314.                         break;
  315.         }
  316.  
  317. /* Sprzatamy */
  318.         glPopMatrix();
  319. }
  320.  
  321. /* Funkcja generujaca pojedyncza klatke animacji */
  322. void WyswietlObraz(void)
  323. {
  324.         /* Wyczyszczenie bufora ramki i bufora glebokosci */
  325.         glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
  326.        
  327.         /* Powielenie macierzy na wierzcholku stosu */
  328.         glPushMatrix();
  329.        
  330.         /* Wyznaczenie polozenia obserwatora (przeksztalcenie uladu wspolrzednych, sceny do ukladu wspolrzednych obserwatora). */
  331.         glTranslatef(0, 0, -7);
  332.         glRotatef(20, 1, 0, 0);
  333.         glRotatef(25,0,1,0);
  334.        
  335.         /* Generacja obrazu sceny w niewidocznym buforze ramki */
  336.         Rysuj();
  337.  
  338.         /* Usuniecie macierzy lezacej na  wierzcholku stosu (powrot do stanu sprzed wywolania funkcji) */
  339.         glPopMatrix();
  340.  
  341.         /* Przelaczenie buforow ramki */
  342.         glutSwapBuffers();
  343. }
  344.  
  345. /* Funkcja ustawiajaca parametry rzutu perspektywicznego i rozmiary viewportu */
  346. void UstawParametryWidoku(int szerokosc, int wysokosc)
  347. {
  348.         /* Ustawienie parametrow viewportu */
  349.         glViewport(0, 0, szerokosc, wysokosc);
  350.  
  351.         /* Przejscie w tryb modyfikacji macierzy rzutowania */
  352.         glShadeModel(GL_SMOOTH);
  353.         glClearColor(0, 0, 0, 0);
  354.        
  355.         glMatrixMode(GL_PROJECTION);
  356.         glLoadIdentity();
  357.         gluPerspective(40.0, (float)szerokosc/(float)wysokosc, 1.0, 1000.0);
  358.  
  359.         /* Przejscie w tryb modyfikacji macierzy przeksztalcen geometrycznych */
  360.         glMatrixMode(GL_MODELVIEW);
  361.  
  362.         /* Zmiana macierzy znajdujacej sie na wierzcholku stosu na macierz jednostkowa */
  363.         glLoadIdentity();
  364. }
  365. /* Funkcja obslugi klawiatury */
  366. void ObslugaKlawiatury(unsigned char klawisz, int x, int y)
  367. {
  368.        
  369.         switch(klawisz)
  370.                 {
  371.                         case '1': przycisk = 1; break;
  372.                         case '2': przycisk = 2; break;
  373.                         case '3': przycisk = 3; break;
  374.                         case '4': przycisk = 4; break;
  375.                 }
  376.  
  377.         if(klawisz == 27)
  378.                         exit(0);
  379. }
  380.  
  381. /* Glowna funkcja programu */
  382. int  main(int argc, char **argv)
  383. {      
  384.         /* Zainicjowanie biblioteki GLUT */
  385.         glutInit(&argc, argv);
  386.  
  387.         /* Ustawienie trybu wyswietlania */
  388.         glutInitDisplayMode (GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);
  389.  
  390.         /* Ustawienie polozenia dolenego lewego rogu okna */
  391.         glutInitWindowPosition(100, 100);
  392.  
  393.         /* Ustawienie rozmiarow okna */
  394.         glutInitWindowSize(600, 400);
  395.  
  396.         /* Utworzenie okna */
  397.         glutCreateWindow("Cubes");
  398.  
  399.         /* Odblokowanie bufora glebokosci */
  400.         glEnable(GL_DEPTH_TEST);
  401.         glEnable(GL_LIGHTING);
  402.         glEnable(GL_LIGHT0);
  403.         glEnable(GL_COLOR_MATERIAL);
  404.  
  405.         /* Ustawienie wartosci czyszczacej zawartosc bufora glebokosci */
  406.         glClearDepth(1000.0);
  407.  
  408.         /* Ustawienie koloru czyszczenia bufora ramki */
  409.         glClearColor (0.0, 0.0, 0.0, 0.0);
  410.  
  411.         /* Zarejestrowanie funkcji (callback) wyswietlajacej */
  412.         glutDisplayFunc(WyswietlObraz);
  413.  
  414.         /* Zarejestrowanie funkcji (callback) wywolywanej za kazdym razem kiedy zmieniane sa rozmiary okna */
  415.         glutReshapeFunc(UstawParametryWidoku);
  416.  
  417.         /* Zarejestrowanie funkcji wykonywanej gdy okno nie obsluguje zadnych zadan */
  418.         glutIdleFunc(WyswietlObraz);
  419.  
  420.         /* Zarejestrowanie funkcji obslugi klawiatury */
  421.         glutKeyboardFunc(ObslugaKlawiatury);
  422.  
  423.         /* Obsluga glownej petli programu (wywolywanie zarejestrowanych callbackow w odpowiedzi na odbierane zdarzenia lub obsluga stanu bezczynnosci) */
  424.         glutMainLoop();
  425.  
  426.         return 0;
  427. }