Kwwiker

каруселька

Dec 23rd, 2020
1,451
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <GL/glut.h>
  2. #include <stdlib.h>
  3. #include <Windows.h>
  4. #include <math.h>
  5. #include <stdio.h>
  6.  
  7.  
  8. #define PI 3.14159265
  9. #define numberOfRotationTypes 3
  10.  
  11.  
  12. static GLfloat lpos[] = { 0.0, 6.0, 8.0, 1.0 };
  13. static GLfloat black[] = { 0.0, 0.0, 0.0, 1.0 };
  14. static GLfloat white[] = { 1.0, 1.0, 1.0, 1.0 };
  15. static GLfloat red[] = { 1.0, 0.0, 0.0, 1.0 };
  16. static GLfloat green[] = { 0.0, 1.0, 0.0, 1.0 };
  17. static GLfloat blue[] = { 0.0, 0.0, 1.0, 1.0 };
  18. static GLfloat yellow[] = { 1.0, 1.0, 0.0, 1.0 };
  19. static GLfloat magenta[] = { 1.0, 0.0, 1.0, 1.0 };
  20. static GLfloat cyan[] = { 0.0, 1.0, 1.0, 1.0 };
  21. static GLfloat lightgreen[] = { 0.5, 1.0, 0.5, 1.0 };
  22. static float alpha = 0.0;
  23. static float beta = PI / 6.0;
  24. static float zoom = 25.0;
  25. static bool lightSource = true;
  26.  
  27. float numberOfTriangles = 1;
  28. static GLdouble cpos[3];
  29.  
  30. static double fenceHeight = -0.5;
  31. static int angle = 0;
  32. static int angle__IN_RANGE = 0.0;
  33. static double radian__IN_RANGE = 0.0;
  34. static int arrayOfAnglesInRange[181];
  35. static int id = 0;
  36.  
  37. static int speed = 0;
  38. static int signal = 1;
  39.  
  40. static GLint window[2];
  41. static int rotationType = 0;
  42.  
  43. void init(void)
  44. {
  45.     glClearColor(0.0, 0.0, 0.0, 0.0);
  46.     glEnable(GL_DEPTH_TEST);
  47.     glShadeModel(GL_SMOOTH);
  48.  
  49.     /* since back "face" appears in wireframe mode */
  50.     glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  51.     glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
  52.  
  53.     glEnable(GL_LIGHTING);
  54.     glEnable(GL_LIGHT0);
  55. }
  56.  
  57. void writemessage()
  58. {
  59.  
  60. }
  61.  
  62. void processAngle(){
  63.     angle__IN_RANGE = arrayOfAnglesInRange[abs(angle) % 181];
  64. }
  65.  
  66. void setRadian_IN_RANGE(){
  67.     radian__IN_RANGE = ((float)angle__IN_RANGE / 180) * PI;
  68. }
  69.  
  70. void fillArray(){
  71.     int j = -45;
  72.     for (int i = 0; i < 181; i++)
  73.     {
  74.         if (i < 90)
  75.             arrayOfAnglesInRange[i] = j++;
  76.         else
  77.             arrayOfAnglesInRange[i] = j--;
  78.     }
  79.  
  80.     //for (int i = 0; i < 182; i++)
  81.     //{
  82.     //  printf("%d\n", arrayOfAnglesInRange[i]);
  83.     //}
  84. }
  85.  
  86. void keepTrackOfID(){
  87.     int tempAngle = angle;
  88.  
  89.  
  90.     if (id % 4 == 0)
  91.         angle += 0;
  92.     else if (id % 4 == 1)
  93.         angle += 30;
  94.     else if (id % 4 == 2)
  95.         angle += 60;
  96.     else if (id % 4 == 3)
  97.         angle += 90;
  98.  
  99.  
  100.     processAngle();
  101.     setRadian_IN_RANGE();
  102.     angle = tempAngle;
  103. }
  104.  
  105.  
  106. void reshape(int w, int h)
  107. {
  108.     glViewport(0, 0, (GLsizei)w, (GLsizei)h);
  109.     glMatrixMode(GL_PROJECTION);
  110.     glLoadIdentity();
  111.     gluPerspective(45.0, (GLfloat)w / (GLfloat)h, 0.01, 50.0);
  112.     glMatrixMode(GL_MODELVIEW);
  113. }
  114.  
  115. void DrawSticksArroundYard(){
  116.     glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, red);
  117.     glMaterialfv(GL_BACK, GL_AMBIENT_AND_DIFFUSE, black);
  118.     GLUquadricObj *quadObj;
  119.  
  120.     // Right-Line
  121.     glPushMatrix();
  122.     glTranslatef(6.8, 1.0 + fenceHeight, -7.0);
  123.     quadObj = gluNewQuadric();
  124.     gluCylinder(quadObj, 0.1, 0.1, 14.0, 10, 10);
  125.     glPopMatrix();
  126.  
  127.     // Left-Line
  128.     glPushMatrix();
  129.     glTranslatef(-6.8, 1.0 + fenceHeight, -7.0);
  130.     quadObj = gluNewQuadric();
  131.     gluCylinder(quadObj, 0.1, 0.1, 14.0, 10, 10);
  132.     glPopMatrix();
  133.  
  134.     // Back-Line
  135.     glPushMatrix();
  136.     glTranslatef(-6.8, 1.0 + fenceHeight, -7.0);
  137.     glRotatef(90, 0, 1, 0);
  138.     quadObj = gluNewQuadric();
  139.     gluCylinder(quadObj, 0.1, 0.1, 13.7, 10, 10);
  140.     glRotatef(-90, 0, 1, 0);
  141.     glPopMatrix();
  142.  
  143.     // Front-Line
  144.     glPushMatrix();
  145.     glTranslatef(6.8, 1.0 + fenceHeight, 7.0);
  146.     glRotatef(-90, 0, 1, 0);
  147.     quadObj = gluNewQuadric();
  148.     gluCylinder(quadObj, 0.1, 0.1, 13.7, 10, 10);
  149.     glRotatef(90, 0, 1, 0);
  150.     glPopMatrix();
  151.  
  152.     // Pin-Front-Right
  153.     glPushMatrix();
  154.     glTranslatef(6.8, 0, 7.0);
  155.     glRotatef(-90, 1, 0, 0);
  156.     quadObj = gluNewQuadric();
  157.     gluCylinder(quadObj, 0.2, 0.1, 1.3 + fenceHeight, 10, 10);
  158.     glRotatef(90, 1, 0, 0);
  159.     glPopMatrix();
  160.  
  161.     // Pin-Front-Left
  162.     glPushMatrix();
  163.     glTranslatef(-6.8, 0, 7.0);
  164.     glRotatef(-90, 1, 0, 0);
  165.     quadObj = gluNewQuadric();
  166.     gluCylinder(quadObj, 0.2, 0.1, 1.3 + fenceHeight, 10, 10);
  167.     glRotatef(90, 1, 0, 0);
  168.     glPopMatrix();
  169.  
  170.     // Pin-Back-Left
  171.     glPushMatrix();
  172.     glTranslatef(-6.8, 0, -7.0);
  173.     glRotatef(-90, 1, 0, 0);
  174.     quadObj = gluNewQuadric();
  175.     gluCylinder(quadObj, 0.2, 0.1, 1.3 + fenceHeight, 10, 10);
  176.     glRotatef(90, 1, 0, 0);
  177.     glPopMatrix();
  178.  
  179.     // Pin-Back-Right
  180.     glPushMatrix();
  181.     glTranslatef(6.8, 0, -7.0);
  182.     glRotatef(-90, 1, 0, 0);
  183.     quadObj = gluNewQuadric();
  184.     gluCylinder(quadObj, 0.2, 0.1, 1.3 + fenceHeight, 10, 10);
  185.     glRotatef(90, 1, 0, 0);
  186.     glPopMatrix();
  187.  
  188.     // Pin-Back-Center
  189.     glPushMatrix();
  190.     glTranslatef(0, 0, -7.0);
  191.     glRotatef(-90, 1, 0, 0);
  192.     quadObj = gluNewQuadric();
  193.     gluCylinder(quadObj, 0.2, 0.1, 1.3 + fenceHeight, 10, 10);
  194.     glRotatef(90, 1, 0, 0);
  195.     glPopMatrix();
  196.  
  197.     // Pin-Front-Center
  198.     glPushMatrix();
  199.     glTranslatef(0, 0, 7.0);
  200.     glRotatef(-90, 1, 0, 0);
  201.     quadObj = gluNewQuadric();
  202.     gluCylinder(quadObj, 0.2, 0.1, 1.3 + fenceHeight, 10, 10);
  203.     glRotatef(90, 1, 0, 0);
  204.     glPopMatrix();
  205.  
  206.     // Pin-Right-Center
  207.     glPushMatrix();
  208.     glTranslatef(6.8, 0, 0);
  209.     glRotatef(-90, 1, 0, 0);
  210.     quadObj = gluNewQuadric();
  211.     gluCylinder(quadObj, 0.2, 0.1, 1.3 + fenceHeight, 10, 10);
  212.     glRotatef(90, 1, 0, 0);
  213.     glPopMatrix();
  214.  
  215.     // Pin-Left-Center
  216.     glPushMatrix();
  217.     glTranslatef(-6.8, 0, 0);
  218.     glRotatef(-90, 1, 0, 0);
  219.     quadObj = gluNewQuadric();
  220.     gluCylinder(quadObj, 0.2, 0.1, 1.3 + fenceHeight, 10, 10);
  221.     glRotatef(90, 1, 0, 0);
  222.     glPopMatrix();
  223. }
  224.  
  225. void DrawYardFloor(){
  226.     glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, lightgreen);
  227.     glMaterialfv(GL_BACK, GL_AMBIENT_AND_DIFFUSE, lightgreen);
  228.     glBegin(GL_POLYGON);
  229.     glNormal3f(0, 1, 0);
  230.     glVertex3f(-7.3, -0.005, -7.3);
  231.     glVertex3f(-7.3, -0.005, 7.3);
  232.     glVertex3f(7.3, -0.005, 7.3);
  233.     glVertex3f(7.3, -0.005, -7.3);
  234.     glEnd();
  235. }
  236.  
  237. void DrawCenterPin(){
  238.     glRotatef(-90, 1, 0, 0);
  239.     GLUquadricObj *quadObj = gluNewQuadric();
  240.     gluCylinder(quadObj, 0.2, 0.2, 7, 10, 10);
  241.     glRotatef(90, 1, 0, 0);
  242. }
  243.  
  244. void DrawBase(){
  245.     glRotatef(-90, 1, 0, 0);
  246.     GLUquadricObj *quadObj = gluNewQuadric();
  247.     gluCylinder(quadObj, 0.5, 0.1, 2, 10, 10);
  248.     glRotatef(90, 1, 0, 0);
  249.  
  250. }
  251.  
  252. void DrawTop(){
  253.     glPushMatrix();
  254.     glTranslatef(0, 7, 0);
  255.     glRotatef(-90, 1, 0, 0);
  256.     GLUquadricObj *quadObj = gluNewQuadric();
  257.     gluCylinder(quadObj, 0.2, 0.0, 0.5, 10, 10);
  258.     glRotatef(90, 1, 0, 0);
  259.     glPopMatrix();
  260. }
  261.  
  262.  
  263. void DrawHorizontalStick(){
  264.     glLineWidth(15);
  265.     glColor3f(1.0, 0.0, 0.0);
  266.     glBegin(GL_LINES);
  267.     glVertex3f(0.0, 7.0, 0.0);
  268.     glVertex3f(4.0 * cos(radian__IN_RANGE), 7.0 + 4.0 * sin(radian__IN_RANGE), 0.0);
  269.     glEnd();
  270. }
  271.  
  272. void DrawVerticalStick(){
  273.     glLineWidth(5);
  274.     glColor3f(1.0, 0.0, 0.0);
  275.     glBegin(GL_LINES);
  276.     glVertex3f(4.0 * cos(radian__IN_RANGE), 7.0 + 4.0 * sin(radian__IN_RANGE), 0.0);
  277.     glVertex3f(4.0 * cos(radian__IN_RANGE), 7.0 + 4.0 * sin(radian__IN_RANGE) - 1, 0.0);
  278.     glEnd();
  279. }
  280.  
  281. void DrawCabin(){
  282.  
  283.     // Back
  284.     glNormal3f(0.0, 0.0, -1.0);
  285.     glBegin(GL_POLYGON);
  286.     glVertex3f(0, 0, -1);
  287.     glVertex3f(0, 1, -1);
  288.     glVertex3f(2, 1, -1);
  289.     glVertex3f(2, 0, -1);
  290.     glEnd();
  291.  
  292.     glNormal3f(0.0, 0.0, -1.0);
  293.     glBegin(GL_POLYGON);
  294.     glVertex3f(0, 1.7, -1);
  295.     glVertex3f(0, 2, -1);
  296.     glVertex3f(2, 2, -1);
  297.     glVertex3f(2, 1.7, -1);
  298.     glEnd();
  299.  
  300.     glNormal3f(0.0, 0.0, -1.0);
  301.     glBegin(GL_POLYGON);
  302.     glVertex3f(0, 1, -1);
  303.     glVertex3f(0, 1.7, -1);
  304.     glVertex3f(0.2, 1.7, -1);
  305.     glVertex3f(0.2, 1, -1);
  306.     glEnd();
  307.  
  308.     glNormal3f(0.0, 0.0, -1.0);
  309.     glBegin(GL_POLYGON);
  310.     glVertex3f(1.8, 1, -1);
  311.     glVertex3f(1.8, 1.7, -1);
  312.     glVertex3f(2, 1.7, -1);
  313.     glVertex3f(2, 1, -1);
  314.     glEnd();
  315.  
  316.  
  317.     // Front
  318.     glNormal3f(0.0, 0.0, 1.0);
  319.     glBegin(GL_POLYGON);
  320.     glVertex3f(2, 0, 1);
  321.     glVertex3f(2, 1, 1);
  322.     glVertex3f(0, 1, 1);
  323.     glVertex3f(0, 0, 1);
  324.     glEnd();
  325.  
  326.     glNormal3f(0.0, 0.0, 1.0);
  327.     glBegin(GL_POLYGON);
  328.     glVertex3f(2, 1.7, 1);
  329.     glVertex3f(2, 2, 1);
  330.     glVertex3f(0, 2, 1);
  331.     glVertex3f(0, 1.7, 1);
  332.     glEnd();
  333.  
  334.     glNormal3f(0.0, 0.0, 1.0);
  335.     glBegin(GL_POLYGON);
  336.     glVertex3f(0.2, 1, 1);
  337.     glVertex3f(0.2, 1.7, 1);
  338.     glVertex3f(0, 1.7, 1);
  339.     glVertex3f(0, 1, 1);
  340.     glEnd();
  341.  
  342.     glNormal3f(0.0, 0.0, 1.0);
  343.     glBegin(GL_POLYGON);
  344.     glVertex3f(2, 1, 1);
  345.     glVertex3f(2, 1.7, 1);
  346.     glVertex3f(1.8, 1.7, 1);
  347.     glVertex3f(1.8, 1, 1);
  348.     glEnd();
  349.  
  350.  
  351.     // Floor
  352.     glNormal3f(0.0, -1.0, 0.0);
  353.     glBegin(GL_POLYGON);
  354.     glVertex3f(2, 0, -1);
  355.     glVertex3f(2, 0, 1);
  356.     glVertex3f(0, 0, 1);
  357.     glVertex3f(0, 0, -1);
  358.     glEnd();
  359.  
  360.  
  361.     // Top
  362.     glNormal3f(0.0, 1.0, 0.0);
  363.     glBegin(GL_POLYGON);
  364.     glVertex3f(2, 2, 1);
  365.     glVertex3f(2, 2, -1);
  366.     glVertex3f(0, 2, -1);
  367.     glVertex3f(0, 2, 1);
  368.     glEnd();
  369.  
  370.     // Right
  371.     glNormal3f(1.0, 0.0, 0.0);
  372.     glBegin(GL_POLYGON);
  373.     glVertex3f(2, 0, -1);
  374.     glVertex3f(2, 1, -1);
  375.     glVertex3f(2, 1, 1);
  376.     glVertex3f(2, 0, 1);
  377.     glEnd();
  378.  
  379.     glNormal3f(1.0, 0.0, 0.0);
  380.     glBegin(GL_POLYGON);
  381.     glVertex3f(2, 1.7, -1);
  382.     glVertex3f(2, 2, -1);
  383.     glVertex3f(2, 2, 1);
  384.     glVertex3f(2, 1.7, 1);
  385.     glEnd();
  386.  
  387.     glNormal3f(1.0, 0.0, 0.0);
  388.     glBegin(GL_POLYGON);
  389.     glVertex3f(2, 1, -1);
  390.     glVertex3f(2, 1.7, -1);
  391.     glVertex3f(2, 1.7, -0.8);
  392.     glVertex3f(2, 1, -0.8);
  393.     glEnd();
  394.  
  395.     glNormal3f(1.0, 0.0, 0.0);
  396.     glBegin(GL_POLYGON);
  397.     glVertex3f(2, 1, 0.8);
  398.     glVertex3f(2, 1.7, 0.8);
  399.     glVertex3f(2, 1.7, 1);
  400.     glVertex3f(2, 1, 1);
  401.     glEnd();
  402.  
  403.     // Left
  404.     glNormal3f(-1.0, 0.0, 0.0);
  405.     glBegin(GL_POLYGON);
  406.     glVertex3f(0, 0, -1);
  407.     glVertex3f(0, 0, 1);
  408.     glVertex3f(0, 1, 1);
  409.     glVertex3f(0, 1, -1);
  410.     glEnd();
  411.  
  412.     glNormal3f(-1.0, 0.0, 0.0);
  413.     glBegin(GL_POLYGON);
  414.     glVertex3f(0, 1.7, -1);
  415.     glVertex3f(0, 1.7, 1);
  416.     glVertex3f(0, 2, 1);
  417.     glVertex3f(0, 2, -1);
  418.     glEnd();
  419.  
  420.     glNormal3f(-1.0, 0.0, 0.0);
  421.     glBegin(GL_POLYGON);
  422.     glVertex3f(0, 1, -1);
  423.     glVertex3f(0, 1, -0.8);
  424.     glVertex3f(0, 1.7, -0.8);
  425.     glVertex3f(0, 1.7, -1);
  426.     glEnd();
  427.  
  428.     glNormal3f(-1.0, 0.0, 0.0);
  429.     glBegin(GL_POLYGON);
  430.     glVertex3f(0, 1, 0.8);
  431.     glVertex3f(0, 1, 1);
  432.     glVertex3f(0, 1.7, 1);
  433.     glVertex3f(0, 1.7, 0.8);
  434.     glEnd();
  435. }
  436.  
  437. void darwCabin__FINAL(){
  438.     glPushMatrix();
  439.     glTranslatef(4.0 * cos(radian__IN_RANGE), 7.0 + 4.0 * sin(radian__IN_RANGE) - 3, 0.0);
  440.     glRotatef(angle, 0, 1, 0);
  441.     glPushMatrix();
  442.     glTranslatef(-1, 0, 0);
  443.     DrawCabin();
  444.     glPopMatrix();
  445.     glRotatef(-angle, 0, 1, 0);
  446.     glPopMatrix();
  447. }
  448.  
  449. void display(void)
  450. {
  451.     for (int i = 0; i < 2; i++) {
  452.         glutSetWindow(window[i]); // set the current window to window[i]
  453.  
  454.         glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  455.         glLoadIdentity();
  456.         glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 64);
  457.  
  458.  
  459.  
  460.         if (i == 1) {
  461.             gluLookAt(0.7, 0, 0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
  462.             glRotatef(-angle, 0, 1, 0);
  463.             glTranslatef(-4.0 * cos(radian__IN_RANGE), -5.4 + 4.0 * sin(radian__IN_RANGE), 0);
  464.             glRotatef(-angle, 0, 1, 0);
  465.         }
  466.         else if (i == 0) {
  467.             cpos[0] = zoom * cos(beta) * sin(alpha);
  468.             cpos[1] = zoom * sin(beta);
  469.             cpos[2] = zoom * cos(beta) * cos(alpha);
  470.             gluLookAt(cpos[0], cpos[1], cpos[2], 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
  471.         }
  472.  
  473.  
  474.         if (lightSource == true){
  475.             glLightfv(GL_LIGHT0, GL_POSITION, lpos);
  476.             glMaterialfv(GL_FRONT, GL_EMISSION, white);
  477.             glPushMatrix();
  478.             glTranslatef(lpos[0], lpos[1], lpos[2]);
  479.             glutSolidSphere(0.1, 10, 8);
  480.             glPopMatrix();
  481.             glMaterialfv(GL_FRONT, GL_EMISSION, black);
  482.         }
  483.  
  484.         DrawYardFloor();
  485.         DrawSticksArroundYard();
  486.         DrawCenterPin();
  487.         DrawBase();
  488.         DrawTop();
  489.  
  490.         glRotatef(angle, 0, 1, 0);
  491.         for (int j = 0; j < 4; j++){
  492.  
  493.  
  494.             glMaterialfv(GL_FRONT, GL_SPECULAR, white);
  495.             glMaterialf(GL_FRONT, GL_SHININESS, 64);
  496.  
  497.  
  498.             if (id % 4 == 0)
  499.             {
  500.                 glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, green);
  501.                 glMaterialfv(GL_BACK, GL_AMBIENT_AND_DIFFUSE, black);
  502.             }
  503.             else if (id % 4 == 1)
  504.             {
  505.                 glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, blue);
  506.                 glMaterialfv(GL_BACK, GL_AMBIENT_AND_DIFFUSE, black);
  507.             }
  508.             else if (id % 4 == 2)
  509.             {
  510.                 glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, white);
  511.                 glMaterialfv(GL_BACK, GL_AMBIENT_AND_DIFFUSE, black);
  512.             }
  513.             else if (id % 4 == 3)
  514.             {
  515.                 glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, cyan);
  516.                 glMaterialfv(GL_BACK, GL_AMBIENT_AND_DIFFUSE, black);
  517.             }
  518.             glPushMatrix();
  519.             glRotatef(j * 360 / 4, 0, 1, 0);
  520.             keepTrackOfID();
  521.  
  522.             DrawHorizontalStick();
  523.             DrawVerticalStick();
  524.             darwCabin__FINAL();
  525.  
  526.             id++;
  527.             glPopMatrix();
  528.         }
  529.         glRotatef(-angle, 0, 1, 0);
  530.  
  531.  
  532.         glFlush();
  533.         glutSwapBuffers();
  534.     }
  535. }
  536.  
  537.  
  538. void keyboard(unsigned char key, int x, int y)
  539. {
  540.     static int polygonmode[2];
  541.  
  542.     switch (key) {
  543.     case 27:
  544.         exit(0);
  545.         break;
  546.     case 'x':
  547.         if (lightSource == true)
  548.             lpos[0] = lpos[0] + 0.2;
  549.         glutPostRedisplay();
  550.         break;
  551.     case 'X':
  552.         if (lightSource == true)
  553.             lpos[0] = lpos[0] - 0.2;
  554.         glutPostRedisplay();
  555.         break;
  556.     case 'y':
  557.         if (lightSource == true)
  558.             lpos[1] = lpos[1] + 0.2;
  559.         glutPostRedisplay();
  560.         break;
  561.     case 'Y':
  562.         if (lightSource == true)
  563.             lpos[1] = lpos[1] - 0.2;
  564.         glutPostRedisplay();
  565.         break;
  566.     case 'z':
  567.         if (lightSource == true)
  568.             lpos[2] = lpos[2] + 0.2;
  569.         glutPostRedisplay();
  570.         break;
  571.     case 'Z':
  572.         if (lightSource == true)
  573.             lpos[2] = lpos[2] - 0.2;
  574.         glutPostRedisplay();
  575.         break;
  576.  
  577.     case '+':
  578.         if (zoom != 1.5)zoom = zoom - 0.5;
  579.         glutPostRedisplay();
  580.         break;
  581.     case '-':
  582.         if (zoom != 30)zoom = zoom + 0.5;
  583.         glutPostRedisplay();
  584.         break;
  585.     case '0':
  586.         if (lightSource == true){
  587.             glDisable(GL_LIGHT0);
  588.             lightSource = false;
  589.         }
  590.         else{
  591.             glEnable(GL_LIGHT0);
  592.             lightSource = true;
  593.         }
  594.         glutPostRedisplay();
  595.         break;
  596.  
  597.     case 'e':
  598.         if (fenceHeight < 2)
  599.             fenceHeight += 0.5;
  600.         glutPostRedisplay();
  601.         break;
  602.     case 'd':
  603.         if (fenceHeight > -0.5)
  604.             fenceHeight -= 0.5;
  605.         glutPostRedisplay();
  606.         break;
  607.  
  608.     case 'w':
  609.         glGetIntegerv(GL_POLYGON_MODE, polygonmode);
  610.         if (polygonmode[0] == GL_FILL)
  611.             glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
  612.         else glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  613.         glutPostRedisplay();
  614.         break;
  615.     case 'n':
  616.         angle++;
  617.         processAngle();
  618.         setRadian_IN_RANGE();
  619.         glutPostRedisplay();
  620.         break;
  621.     case 'm':
  622.         angle--;
  623.         processAngle();
  624.         setRadian_IN_RANGE();
  625.         glutPostRedisplay();
  626.         break;
  627.     default:
  628.         break;
  629.     }
  630. }
  631.  
  632. void mouse(int button, int state, int x, int y)
  633. {
  634.     switch (button) {
  635.     case GLUT_LEFT_BUTTON:
  636.         signal = 0;
  637.         if (speed <= 15)
  638.             speed++;
  639.         break;
  640.     case GLUT_MIDDLE_BUTTON:
  641.     case GLUT_RIGHT_BUTTON:
  642.         signal = 1;
  643.         if (speed >= 1)
  644.             speed--;
  645.         break;
  646.     default:
  647.         break;
  648.     }
  649. }
  650.  
  651. void specialkey(GLint key, int x, int y)
  652. {
  653.     switch (key) {
  654.     case GLUT_KEY_RIGHT:
  655.         alpha = alpha + PI / 180;
  656.         if (alpha > 2 * PI) alpha = alpha - 2 * PI;
  657.         glutPostRedisplay();
  658.         break;
  659.     case GLUT_KEY_LEFT:
  660.         alpha = alpha - PI / 180;
  661.         if (alpha < 0) alpha = alpha + 2 * PI;
  662.         glutPostRedisplay();
  663.         break;
  664.     case GLUT_KEY_UP:
  665.         if (beta < 0.45*PI) beta = beta + PI / 180;
  666.         glutPostRedisplay();
  667.         break;
  668.     case GLUT_KEY_DOWN:
  669.         if (beta > -0.05*PI) beta = beta - PI / 180;
  670.         glutPostRedisplay();
  671.         break;
  672.     default:
  673.         break;
  674.     }
  675. }
  676.  
  677. void anim(){
  678.     if (signal == 0){
  679.         angle++;
  680.         glutPostRedisplay();
  681.         Sleep((int)(50 / speed));
  682.     }
  683.     else if (signal == 1){
  684.         if (speed != 0){
  685.             angle++;
  686.             glutPostRedisplay();
  687.             Sleep((int)(50 / speed));
  688.         }
  689.     }
  690. }
  691.  
  692. int main(int argc, char** argv)
  693. {
  694.     writemessage();
  695.     fillArray();
  696.     processAngle();
  697.     setRadian_IN_RANGE();
  698.  
  699.     glutInit(&argc, argv);
  700.     glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
  701.  
  702.     glutInitWindowSize(500, 500);
  703.     glutInitWindowPosition(0, 0);
  704.     window[0] = glutCreateWindow("First");
  705.     init();
  706.  
  707.     glutDisplayFunc(display);
  708.     glutReshapeFunc(reshape);
  709.     glutIdleFunc(anim);
  710.     glutMouseFunc(mouse);
  711.     glutKeyboardFunc(keyboard);
  712.     glutSpecialFunc(specialkey);
  713.  
  714.     glutInitWindowSize(500, 500);
  715.     glutInitWindowPosition(600, 10);
  716.     window[1] = glutCreateWindow("Second");
  717.     init();
  718.  
  719.     glutDisplayFunc(display);
  720.     glutReshapeFunc(reshape);
  721.     glutIdleFunc(anim);
  722.     glutMouseFunc(mouse);
  723.     glutKeyboardFunc(keyboard);
  724.     glutSpecialFunc(specialkey);
  725.  
  726.     glutMainLoop();
  727.     return 0;
  728. }
RAW Paste Data