//---------------------------------------------------------------------
// Priklad cislo 11
// Autor: Pavel Tisnovsky
//
// Jednoducha animace - reakce na casovac
//---------------------------------------------------------------------

#include <GL/glut.h>                    // hlavickovy soubor funkci GLUTu


float rotAngle=0.0;                     // uhel rotace sipky okolo sveho stredu
int   width=0;                          // rozmer okna
int   height=0;
int   pause=0;                          // ma-byt animace zastavena?
int   timerInterval=100;                // interval casovace v milisekundach



//---------------------------------------------------------------------
// Nastaveni souradneho systemu v zavislosti na velikosti okna
//---------------------------------------------------------------------
void onResize(int w, int h)             // w a h reprezentuje novou velikost okna
{
    glViewport(0, 0, w, h);             // viditelna oblast pres cele okno
    glMatrixMode(GL_PROJECTION);        // zacatek modifikace projekcni matice
    glLoadIdentity();                   // vymazani projekcni matice (=identita)
    glOrtho(0, w, 0, h, -1, 1);         // mapovani abstraktnich souradnic do souradnic okna
    glScalef(1, -1, 1);                 // inverze y-ove osy, aby se y zvetsovalo smerem dolu
    glTranslatef(0, -h, 0);             // posun pocatku do leveho horniho rohu
    width=w; height=h;                  // zapamatovat rozmery okna
}



//---------------------------------------------------------------------
// Tato funkce je volana pri kazdem prekresleni okna
//---------------------------------------------------------------------
void onDisplay(void)
{
    glClear(GL_COLOR_BUFFER_BIT);       // vymazani bitovych rovin barvoveho bufferu
    glMatrixMode(GL_MODELVIEW);         // bude se menit matice modelview
    glLoadIdentity();                   // vynulovani predchozi transformace
    glTranslatef(width>>1, height>>1,0.0); // posun sipky do stredu okna
    glRotatef(rotAngle*180.0/3.14, 0, 0, 1.0);// rotace sipky

    glBegin(GL_TRIANGLES);              // zacatek vykreslovani trojuhelniku
        glColor3f(0.0, 0.0, 1.0);       // barva prvniho vertexu
        glVertex2i(0, -70);             // poloha prvniho vertexu
        glColor3f(0.0, 1.0, 0.0);       // barva druheho vertexu
        glVertex2i(-50, 100);           // poloha druheho vertexu
        glColor3f(1.0, 0.0, 0.0);       // barva tretiho vertexu
        glVertex2i(50, 100);            // poloha tretiho vertexu
    glEnd();
    glFlush();                          // provedeni a vykresleni zmen
}



//---------------------------------------------------------------------
// Tato funkce je volana pri stlaceni ASCII klavesy
//---------------------------------------------------------------------
void onKeyboard(unsigned char key, int x, int y)
{
    key=(key>'A' && key<='Z') ? key+'a'-'A':key; // prevod na mala pismena
    switch (key) {
        case 27:                        //  Escape
            exit(0);
            break;
        case 'f':
            glutFullScreen();           // prepnuti na celou obrazovku
            break;
        case 'w':
            glutReshapeWindow(400, 400);// prepnuti zpet do okna
            glutPositionWindow(50, 50);
            break;
        case 'p':
            pause=1;                    // zastavit animaci
            break;
        case 's':
            pause=0;                    // pustit animaci
        default:
            break;
    }
    if (key>'0' && key<='9')            // ciselne klavesy nastavuji interval
        timerInterval=(key-'0')*100;
}



//---------------------------------------------------------------------
// Tato funkce je volana pri volnem casovem slotu pro aplikaci
//---------------------------------------------------------------------
void onTimer(int value)
{
    if (!pause) {
        rotAngle+=0.010;                // zvetsit uhel rotace
        glutPostRedisplay();            // a prekreslit scenu
    }
    glutTimerFunc(timerInterval, onTimer, value); // znovu pustit casovac
}



//---------------------------------------------------------------------
// Hlavni funkce konzolove aplikace
//---------------------------------------------------------------------
int main (int argc, char **argv)
{
    glutInit(&argc,argv);               // inicializace knihovny GLUT
    glutInitDisplayMode(GLUT_RGBA|GLUT_SINGLE);// graficky mod okna
    glutInitWindowSize(400, 400);       // pocatecni velikost okna
    glutInitWindowPosition(10, 10);     // pocatecni pozice okna
    glutCreateWindow("Priklad cislo 11");// vytvoreni okna pro kresleni
    glutDisplayFunc(onDisplay);         // registrace funkce volane pri prekreslovani
    glutReshapeFunc(onResize);          // registrace funkce volane pri zmene velikosti
    glutKeyboardFunc(onKeyboard);       // registrace funkce volane pri stisku klavesy
    glutTimerFunc(timerInterval, onTimer, 1234);  // registrace funkce volane pri jednom tiku casovace
    glutMainLoop();                     // nekonecna smycka, kde se volaji zaregistrovane fce
    return 0;                           // navratova hodnota vracena operacnimu systemu
}



//---------------------------------------------------------------------
// Konec zdrojoveho souboru
//---------------------------------------------------------------------