/* NAME: Kirill Vasil'evich Timofeev, 322
 * ASGN: N3
 */

#ifndef SCENE3D_H
#define SCENE3D_H

#include <QtOpenGL\QGLWidget> // подключаем класс QGLWidget

class Scene3D : public QGLWidget // класс Scene3D наследует встроенный класс QGLWidget
{
   private:
      GLfloat xRot; // переменная хранит угол поворота вокруг оси X
      GLfloat yRot; // переменная хранит угол поворота вокруг оси Y
      GLfloat zRot; // переменная хранит угол поворота вокруг оси Z
      GLfloat xTra; // переменная хранит величину трансляции оси X
      GLfloat yTra; // переменная хранит величину трансляции оси Y
      GLfloat zTra; // переменная хранит величину трансляции оси Z
      GLfloat nSca; // переменная отвечает за масштабирование объекта
      GLfloat nAni; // переменная отвечает за анимацию объекта
      int sec; // секунды
      int min; // минуты
      int min12; // 12-тиминутные промежутки
      int hou; // часы
      bool antiAliasing; // переменная отвечает за мой антиалиасинг
      bool antiAliasingSM; // переменная отвечает за SMOOTH антиалиасинг
      bool makean; // переменная отвечает семплирование
      GLuint texture; // переменная текстуру


      QPoint ptrMousePosition; // координата указателя мыши

      void scale_plus();     // приблизить сцену
      void scale_minus();    // удалиться от сцены
      void rotate_up();      // повернуть сцену вверх
      void rotate_down();    // повернуть сцену вниз
      void rotate_left();    // повернуть сцену влево
      void rotate_right();   // повернуть сцену вправо
      void translate_down(); // транслировать сцену вниз
      void translate_up();   // транслировать сцену вверх
      void endisAntiAliasing1();   // включить\выключить антиалиасинг1
      void endisAntiAliasing2();   // включить\выключить антиалиасинг2
      void translate_left(); // транслировать сцену влево
      void translate_right();   // транслировать сцену вправо
      void openroof_down(); // закрывает крышку
      void openroof_up(); // открывает крышку
      void openroof_auto_up(); //открывает автоматически крышку за 3 секунды
      void openroof_auto_down();// закрывает автоматически крышку за 3 секунды
      void drawNumb(const int ,const int, const int);      // построить часы
      void switchNumb(int, GLubyte, int); // выбрать цифру
      void draw0(GLubyte ,int); // рисует 0 на цифровых часах
      void draw1(GLubyte ,int); // рисует 1 на цифровых часах
      void draw2(GLubyte ,int); // рисует 2 на цифровых часах
      void draw3(GLubyte ,int); // рисует 3 на цифровых часах
      void draw4(GLubyte ,int); // рисует 4 на цифровых часах
      void draw5(GLubyte ,int); // рисует 5 на цифровых часах
      void draw6(GLubyte ,int); // рисует 6 на цифровых часах
      void draw7(GLubyte ,int); // рисует 7 на цифровых часах
      void draw8(GLubyte ,int); // рисует 8 на цифровых часах
      void draw9(GLubyte ,int); // рисует 9 на цифровых часах
      void defaultScene();   // наблюдение сцены по умолчанию

      void genTextures();
      void getVertexArray(); // определить массив вершин
      void getColorArray(const float);  // определить массив цветов вершин
      void getIndexArray();  // определить массив индексов вершин
      void drawFigure();     // построить фигуру

   protected:
      // метод для проведения инициализаций, связанных с OpenGL
      /*virtual*/ void initializeGL();

      // метод вызывается при изменении размеров окна виджета
      /*virtual*/ void resizeGL(int nWidth, int nHeight);
      // метод, чтобы заново перерисовать содержимое виджета
      /*virtual*/ void paintGL();

      // метод обработки события мыши при нажатии клавиши мыши
      /*virtual*/ void mousePressEvent(QMouseEvent* pe);
      // метод обработки события мыши при перемещении мыши
      /*virtual*/ void mouseMoveEvent(QMouseEvent* pe);
      // метод обработки событий колесика мыши
      /*virtual*/ void wheelEvent(QWheelEvent* pe);
      // методы обработки события при нажатии определенной клавиши
      /*virtual*/ void keyPressEvent(QKeyEvent* pe);
      // метод обработки времени
    protected slots:
      /*virtual*/ void updateTime();

   public:
      Scene3D(QWidget* parent = 0); // конструктор класса
};
#endif
