#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#include "glut.h"
#include "gl.h"


typedef struct {
  float x;
  float y;
  float z;
} TOCKA;


TOCKA     t[8]= { {-0.5,-0.5,-0.8},
                  { 0.5,-0.5,-0.8},
                  { 0.5, 0.5,-0.8},
                  {-0.5, 0.5,-0.8},
                  {-0.5,-0.5, 0.8},
                  { 0.5,-0.5, 0.8},
                  { 0.5, 0.5, 0.8},
                  {-0.5, 0.5, 0.8} };

int p[5][4] = { {0, 3, 2, 1}, {4, 5, 6, 7}, {5, 1, 2, 6},
                {0, 4, 7, 3}, {0, 1, 5, 4} };

TOCKA n[5] = { { 0.0, 0.0,-1.0},
               { 0.0, 0.0, 1.0},
               { 1.0, 0.0, 0.0},
               {-1.0, 0.0, 0.0},
               { 0.0,-1.0, 0.0} };

float fi_x = 30.0, fi_y = -30.0;
int stari_x = 0, stari_y=0;

/* ===================================== */
void pretvori_geom_model_v_GL_gradnike()
{
  int i, j;

  for (i=0;i<5;i++) {
    glBegin(GL_QUADS);
      for(j=0; j<4; j++) {
        glNormal3f(n[i].x, n[i].y, n[i].z);
        glVertex3f(t[p[i][j]].x, t[p[i][j]].y, t[p[i][j]].z);
      }
    glEnd();
  }
}
/* ===================================== */
void risi()
{
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  glColor3f(1.0, 0.4, 1.0);

  glLoadIdentity();
  glScalef(0.5, 0.5, 0.5);
  glRotatef(fi_x, 1.0, 0.0, 0.0);
  glRotatef(fi_y, 0.0, 1.0, 0.0);

  pretvori_geom_model_v_GL_gradnike();

  glutSwapBuffers();
}
/* ===================================== */
void miska(int x, int y)
{
  if (x > stari_x) fi_y += 1.0;
  if (x < stari_x) fi_y -= 1.0;
  if (y > stari_y) fi_x += 1.0;
  if (y < stari_y) fi_x -= 1.0;

  stari_x = x;
  stari_y = y;

  glutPostRedisplay();

}
/* ===================================== */
void inicializiraj_gl()
{
  glEnable(GL_LIGHTING);
  glEnable(GL_LIGHT0);
  glEnable(GL_DEPTH_TEST);
  glEnable(GL_COLOR_MATERIAL);
  glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  glOrtho(-1.0,1.0, -1.0,1.0, -1.0,1.0);
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();
}
/* ===================================== */


int main(int argn, char **argc)
{
  int moje_okno;

  glutInit(&argn, argc);
  glutInitWindowSize(500, 500);
  glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
  moje_okno = glutCreateWindow("risi_miska");

  inicializiraj_gl();

  glutDisplayFunc (risi);
  glutMotionFunc (miska);

  glutMainLoop();

  return 0;
}
