Advertisement
Guest User

Mat_lav

a guest
Aug 25th, 2019
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 8.71 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<GL/glut.h>
  4. #include<math.h>
  5. #include "image.h"
  6. #include"labyrinth.h"
  7.  
  8. #define FILENAME0 "Tileable_marble_floor_tile_texture(16).bmp"
  9. #define FILENAME1 "prvo.bmp"
  10. #define STOP 1
  11. #define MOVE 0
  12.  
  13. //matrica rotacije
  14. static float matrix[16];
  15. //imena tekstura
  16. static GLuint names[2];
  17. // angle of rotation for the camera direction
  18. float angle=0.0;
  19. // actual vector representing the camera’s direction
  20. float lx=0.0f,lz=-1.0f;
  21. // XZ position of the camera
  22. float x=0.0f,z=5.0f;
  23. char move_trigger = MOVE;
  24. char q_counter = 0;
  25.  
  26. void on_display(void);
  27. void changeSize(int w, int h);
  28. void processNormalKeys(unsigned char key, int x, int y);
  29. void processSpecialKeys(int key, int xx, int yy);
  30. static void initialize(void);
  31. void draw_labyrinth();
  32. void wall1();
  33. void wall2();
  34.  
  35.  
  36. int main(int argc, char **argv)
  37. {
  38. // Pravljenje prozora.
  39.     glutInit(&argc, argv);
  40.     glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
  41.     glutInitWindowPosition(100,100);
  42.     glutInitWindowSize(320,320);
  43.     glutCreateWindow("MAT-LAV");
  44.  
  45. // Callback funkcije.
  46.     glutDisplayFunc(on_display);
  47.     glutReshapeFunc(changeSize);
  48.     glutIdleFunc(on_display);
  49.     glutKeyboardFunc(processNormalKeys);
  50.     glutSpecialFunc(processSpecialKeys);
  51.  
  52.     glEnable(GL_DEPTH_TEST);
  53.    
  54. //inicijalizacija
  55.     initialize();
  56.  
  57.     glutMainLoop();
  58.  
  59.     return 0;
  60. }
  61.  
  62. void processNormalKeys(unsigned char key, int x, int y)
  63. {
  64.  
  65.     if (key == 27)
  66.     {
  67.         glDeleteTextures(2, names);
  68.         exit(0);
  69.     }
  70.    
  71.     if (key == 'z')
  72.     {
  73.         printf("%f\n",z+lz);
  74.     }
  75.     if (key == 'x')
  76.     {
  77.         printf("%i\n",x);
  78.     }
  79.    
  80.     if (key == 'r')
  81.     {
  82.         if (q_counter == 1 || q_counter == 3 || q_counter == 4)
  83.         {
  84.             printf("Wrong answer! You're now dead! :( Good luck in resurrection.");
  85.             exit(EXIT_SUCCESS);
  86.         }
  87.        
  88.         if (q_counter == 2)
  89.         {
  90.             move_trigger = MOVE;
  91.             z -= 0.6;
  92.         }
  93.     }
  94.    
  95.     if (key == 'f')
  96.     {
  97.         if (q_counter == 1 || q_counter == 3)
  98.         {
  99.             move_trigger = MOVE;
  100.             z -= 0.6;
  101.         }
  102.        
  103.         if (q_counter == 2 || q_counter == 4)
  104.         {
  105.             printf("Wrong answer! You're now dead! :( Good luck in resurrection.");
  106.             exit(EXIT_SUCCESS);
  107.         }
  108.     }
  109.    
  110.     if (key == 'l')
  111.     {
  112.         if (q_counter == 1 || q_counter == 2 || q_counter == 3)
  113.         {
  114.             printf("Wrong answer! You're now dead! :( Good luck in resurrection.");
  115.             exit(EXIT_SUCCESS);
  116.         }
  117.         if (q_counter == 4)
  118.         {
  119.             move_trigger = MOVE;
  120.             x -= 0.6;
  121.         }
  122.  
  123.     }
  124. }
  125.  
  126. void processSpecialKeys(int key, int xx, int yy)
  127. {
  128.  
  129.     float fraction = 0.5f; //bilo je 0.1f
  130.  
  131.     switch (key)
  132.     {
  133.         case GLUT_KEY_LEFT :
  134.             if (move_trigger != STOP)
  135.             {
  136.                 angle -= 0.01f;
  137.                 lx = sin(angle);
  138.                 lz = -cos(angle);
  139.             }
  140.            
  141.             break;
  142.         case GLUT_KEY_RIGHT :
  143.             if (move_trigger != STOP)
  144.             {
  145.                 angle += 0.01f;
  146.                 lx = sin(angle);
  147.                 lz = -cos(angle);
  148.             }
  149.             break;
  150.         case GLUT_KEY_UP :
  151.             if (move_trigger != STOP)
  152.             {
  153.                 x += lx * fraction;
  154.                 z += lz * fraction;
  155.             }
  156.             break; 
  157.         case GLUT_KEY_DOWN :
  158.             if (move_trigger != STOP)
  159.             {
  160.                 x -= lx * fraction;
  161.                 z -= lz * fraction;
  162.             }
  163.             break;
  164.     }
  165. }
  166.  
  167. static void initialize(void)
  168. {
  169.     // Objekat koji predstavlja teskturu ucitanu iz fajla.
  170.     Image * image;
  171.  
  172.     glClearColor(0, 0, 0, 0);
  173.  
  174.     /* Ukljucuje se testiranje z-koordinate piksela. */
  175.     glEnable(GL_DEPTH_TEST);
  176.  
  177.     /* Ukljucuju se teksture. */
  178.     glEnable(GL_TEXTURE_2D);
  179.  
  180.     glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_REPLACE);
  181.  
  182.     //Inicijalizuja objekta koji sadrzi teksture ucitane iz fajla.
  183.     image = image_init(0, 0);
  184.  
  185.     // Kreiranje prve teksture.
  186.     image_read(image, FILENAME0);
  187.  
  188.     // Generisanje identifikatora tekstura.
  189.     glGenTextures(2, names);
  190.  
  191.     glBindTexture(GL_TEXTURE_2D, names[0]);
  192.     glTexParameteri(GL_TEXTURE_2D,
  193.                     GL_TEXTURE_WRAP_S, GL_REPEAT);
  194.     glTexParameteri(GL_TEXTURE_2D,
  195.                     GL_TEXTURE_WRAP_T, GL_REPEAT);
  196.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  197.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  198.     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB,
  199.                  image->width, image->height, 0,
  200.                  GL_RGB, GL_UNSIGNED_BYTE, image->pixels);
  201.  
  202.     // Kreira se druga tekstura.
  203.     image_read(image, FILENAME1);
  204.  
  205.     glBindTexture(GL_TEXTURE_2D, names[1]);
  206.     glTexParameteri(GL_TEXTURE_2D,
  207.                     GL_TEXTURE_WRAP_S, GL_CLAMP);
  208.     glTexParameteri(GL_TEXTURE_2D,
  209.                     GL_TEXTURE_WRAP_T, GL_CLAMP);
  210.     glTexParameteri(GL_TEXTURE_2D,
  211.                     GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  212.     glTexParameteri(GL_TEXTURE_2D,
  213.                     GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  214.     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB,
  215.                  image->width, image->height, 0,
  216.                  GL_RGB, GL_UNSIGNED_BYTE, image->pixels);
  217.  
  218.     // Iskljucuje se aktivna tekstura.
  219.     glBindTexture(GL_TEXTURE_2D, 0);
  220.  
  221.     // Unistava se objekat za citanje tekstura iz fajla.
  222.     image_done(image);
  223.  
  224.     // Inicijalizacija matrice rotacije.
  225.     glMatrixMode(GL_MODELVIEW);
  226.     glLoadIdentity();
  227.     glGetFloatv(GL_MODELVIEW_MATRIX, matrix);
  228. }
  229.  
  230. void question()
  231. {
  232.     if (z<= -52.0 && z> -52.5)
  233.     {
  234.         move_trigger = STOP;
  235.        
  236.         glPushMatrix();
  237.     // Postavljanje pitanja.
  238.    
  239.         glBindTexture(GL_TEXTURE_2D, names[1]);
  240.             glBegin(GL_QUADS);
  241.                            
  242.                 glTexCoord2f(0.0f, 0.0f);
  243.                 glVertex3f(x+lx-1.5, 3.0f, z+lz-3.0);
  244.            
  245.                 glTexCoord2f(1.0f, 0.0f);
  246.                 glVertex3f(x+lx+1.5, 3.0f, z+lz-3.2);
  247.            
  248.                 glTexCoord2f(1.0f, 1.0f);
  249.                 glVertex3f(x+lx+1.5, 0.0f, z+lz-3.2);
  250.            
  251.                 glTexCoord2f(0.0f, 1.0f);
  252.                 glVertex3f(x+lx-1.5, 0.0f, z+lz-3.0);
  253.            
  254.             glEnd();
  255.         glBindTexture(GL_TEXTURE_2D, 0);       
  256.     glPopMatrix();
  257.    
  258.     q_counter = 1;     
  259.     }
  260.    
  261.     if(q_counter == 1 && x >=320.0 && x <=378.5 && z<=-86.0 && x >= -86.5)
  262.     {
  263.         move_trigger = STOP;
  264.        
  265.         glPushMatrix();
  266.     // Postavljanje pitanja.
  267.    
  268.         glBindTexture(GL_TEXTURE_2D, names[1]);
  269.             glBegin(GL_QUADS);
  270.                            
  271.                 glTexCoord2f(0.0f, 0.0f);
  272.                 glVertex3f(x+lx-1.5, 3.0f, z+lz-3.0);
  273.            
  274.                 glTexCoord2f(1.0f, 0.0f);
  275.                 glVertex3f(x+lx+1.5, 3.0f, z+lz-3.2);
  276.            
  277.                 glTexCoord2f(1.0f, 1.0f);
  278.                 glVertex3f(x+lx+1.5, 0.0f, z+lz-3.2);
  279.            
  280.                 glTexCoord2f(0.0f, 1.0f);
  281.                 glVertex3f(x+lx-1.5, 0.0f, z+lz-3.0);
  282.            
  283.             glEnd();
  284.         glBindTexture(GL_TEXTURE_2D, 0);       
  285.         glPopMatrix();
  286.         q_counter = 2;
  287.    
  288.     }
  289.    
  290. }
  291.  
  292. void on_display(void)
  293. {
  294.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  295.     glLoadIdentity();
  296. // Postavljanje kamere.
  297.     gluLookAt(x, 1.0f, z,x+lx, 1.0f, z+lz,0.0f, 1.0f, 0.0f);
  298.    
  299. // Primenjuje se matrica rotacije.
  300.     glMultMatrixf(matrix);
  301.     glClearColor(0.7,0.5,0.0,0);
  302.    
  303.    
  304.     GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };
  305.     GLfloat light_ambient[] = { 0.0, 0.0, 0.0, 1 };
  306.     GLfloat light_diffuse[] = { 0.7, 0.7, 0.7, 1 };
  307.     GLfloat light_specular[] = { 0.9, 0.9, 0.9, 1 };
  308.     glEnable(GL_LIGHTING);
  309.     glEnable(GL_LIGHT0);
  310.     glLightfv(GL_LIGHT0, GL_POSITION, light_position);
  311.     glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
  312.     glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
  313.     glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
  314.    
  315.     // Nulti koeficijenti refleksije materijala.
  316.     GLfloat no_material[] = { 0, 0, 0, 1 };
  317.     // Koeficijenti difuzne refleksije materijala.
  318.     GLfloat material_diffuse[] = { 0.1, 0.5, 0.8, 1 };
  319.     // Koeficijenti spekularne refleksije materijala.
  320.     GLfloat material_specular[] = { 1, 1, 1, 1 };
  321.     // Koeficijent spekularne refleksije za slucaj male vrednosti koeficijenta.
  322.     GLfloat low_shininess[] = { 5 };
  323.    
  324.     glMaterialfv(GL_FRONT, GL_AMBIENT, no_material);
  325.     glMaterialfv(GL_FRONT, GL_DIFFUSE, material_diffuse);
  326.     glMaterialfv(GL_FRONT, GL_SPECULAR, material_specular);
  327.     glMaterialfv(GL_FRONT, GL_SHININESS, low_shininess);
  328.     glMaterialfv(GL_FRONT, GL_EMISSION, no_material);
  329.  
  330.    
  331.    
  332. //Iscrtavanje lavirinta.
  333.     draw_labyrinth();
  334.    
  335. // Iscrtavanje poda.
  336.  
  337.     glPushMatrix();
  338.  
  339.     // Postavljanje teksture poda.
  340.     glBindTexture(GL_TEXTURE_2D, names[0]);
  341.         glBegin(GL_QUADS);
  342.             //glNormal3f(0, 0, 1);
  343.            
  344.             glTexCoord2f(-50, -50);
  345.             glVertex3f(-200.0f, 0.0f, -200.0f);
  346.            
  347.             glTexCoord2f(-50, 50);
  348.             glVertex3f(-200.0f, 0.0f, 200.0f);
  349.            
  350.             glTexCoord2f(50, 50);
  351.             glVertex3f( 200.0f, 0.0f, 200.0f);
  352.            
  353.             glTexCoord2f(50, -50);
  354.             glVertex3f( 200.0f, 0.0f, -200.0f);
  355.         glEnd();
  356.     glBindTexture(GL_TEXTURE_2D, 0);
  357.    
  358.     glPopMatrix();
  359.    
  360.     question();
  361.    
  362.     glutSwapBuffers();
  363. }
  364.  
  365. void changeSize(int w, int h)
  366. {
  367. // Sprecava se deljenje nulom.
  368.     if (h == 0)
  369.     h = 1;
  370.     float ratio = w * 1.0 / h;
  371.  
  372. // Matrica projekcije.
  373.     glMatrixMode(GL_PROJECTION);
  374.     glLoadIdentity();
  375.     glViewport(0, 0, w, h);
  376.  
  377. // Postavljanje perspektive.
  378.     gluPerspective(45.0f, ratio, 0.1f, 100.0f);
  379.     glMatrixMode(GL_MODELVIEW);
  380. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement