// Cağlar Parıltı tarafından kodlanmıştır
// kendisine teşekkür ederiz

#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
#include <stdio.h>
#include <math.h>
float x,y,z;
int theta=0;
bool f=false,p=false,o=false;
static GLint fogMode;

void init(void)
{
   glClearColor (0.0, 0.0, 0.0, 0.0);
   glShadeModel (GL_FLAT);
   x=0;y=0;z=5.0;
}

void display(void)
{
   glClear (GL_COLOR_BUFFER_BIT);
   glColor3f (1.0, 1.0, 1.0);
   glLoadIdentity ();             /* clear the matrix */
           /* viewing transformation  */
   float newx = sin ((float)theta/180.0f*3.14);
   float newy = cos ((float)theta/180.0f*3.14);
   gluLookAt (x, y, z, x, 0.0, 0.0, newx, newy, 0.0);
   glScalef (1.0, 2.0, 1.0);      /* modeling transformation */

   if(f)
   {
        glEnable(GL_FOG);
   {
      GLfloat fogColor[4] = {0.5, 0.5, 0.5, 1.0};

      fogMode = GL_EXP;
      glFogi (GL_FOG_MODE, fogMode);
      glFogfv (GL_FOG_COLOR, fogColor);
      glFogf (GL_FOG_DENSITY, 0.35);
      glHint (GL_FOG_HINT, GL_DONT_CARE);
      glFogf (GL_FOG_START, 1.0);
      glFogf (GL_FOG_END, 5.0);
   }
   glClearColor(0.5, 0.5, 0.5, 1.0);  /* fog color */
   }
   else
   {
       glDisable(GL_FOG);
   }



   if(p){
         if(o){
         glEnable(GL_CULL_FACE);
              glPolygonMode(GL_FRONT,GL_FILL);
        }else
             glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
   }
   else{
        if(o){
         glEnable(GL_CULL_FACE);
             glPolygonMode(GL_FRONT,GL_LINE);
        }else
        glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);

   }
   glutSolidCube(1.0);
    glDisable(GL_CULL_FACE);
   glFlush ();
}

void reshape (int w, int h)
{
   glViewport (0, 0, (GLsizei) w, (GLsizei) h); //gluPerspective(60.0, 1.0, near, far); //glViewport (x, y, 400, 200);
   glMatrixMode (GL_PROJECTION);
   glLoadIdentity ();
   //gluPerspective(60.0, 1.0, 1.5, 20.0);
   glFrustum (-0.5, 0.5, -1.0, 1.0, 1.5, 5.0);
   glMatrixMode (GL_MODELVIEW);
}
void keyboard(unsigned char key, int r, int t) {

switch (key) {

case 'w':
z+=0.1;      glutPostRedisplay();
break;
case 's':
z-=1.1; glutPostRedisplay();
break;
case 'a':
x+=0.4;      glutPostRedisplay();
break;
case 'd':
x-=0.4; glutPostRedisplay();
break;

case 'x':
theta-=1; glutPostRedisplay();
break;

case 'z':
theta+=1; glutPostRedisplay();
break;

case'f': f=true; glutPostRedisplay();
break;

case'F': f=false; glutPostRedisplay();
break;
case'p': p=true; glutPostRedisplay();
break;

case'P': p=false; glutPostRedisplay();
break;
case'o': o=true; glutPostRedisplay();
break;

case'O': o=false; glutPostRedisplay();
break;
case 27:
break;

default:
break;
}
}
int main(int argc, char** argv)
{
   glutInit(&argc, argv);
   glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
   glutInitWindowSize (200, 200);
   glutInitWindowPosition (100, 100);
   glutCreateWindow (argv[0]);

   init ();
   glutDisplayFunc(display);
   glutReshapeFunc(reshape);
    glutKeyboardFunc(keyboard);
   glutMainLoop();
   return 0;
}

