//---------------------------------------------------------------------
// Ukazkovy priklad cislo 29 Autor: Pavel Tisnovsky
//
// V tomto prikladu se do aplikacniho okna vypise pocet dostupnych
// orezavacich rovin a jejich parametry, tj. smer normal a vzdalenost od
// pocatku. Klavesou ESC nebo [Q] lze aplikaci ukoncit.
//---------------------------------------------------------------------

#include <GL/glut.h>                            // hlavickovy soubor funkci GLUTu a OpenGL
#include <stdio.h>
#include <stdlib.h>



//---------------------------------------------------------------------
// Funkce volana pro inicializaci aplikace
//---------------------------------------------------------------------
void onInit(void)
{
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);       // barva pozadi obrazku
    glClearDepth(1.0f);                         // implicitni hloubka ulozena v pameti hloubky
}



//---------------------------------------------------------------------
// Nastaveni souradneho systemu v zavislosti na velikosti okna
//---------------------------------------------------------------------
void onResize(int w, int h)                     // argumenty w a h reprezentuji novou velikost okna
{
    glViewport(0, 0, w, h);                     // viditelna oblast pres cele okno
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0, w, 0, h, -1, 1);                 // rovnobezne promitani
    glScalef(1.0f, -1.0f, 1.0f);                // obraceni y-ove souradnice pro jednodussi vypis retezcu
    glTranslatef(0.0f, -h, 0.0f);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}



//---------------------------------------------------------------------
// Vypsani retezce do okna na pozici [x,y]
//---------------------------------------------------------------------
void printString(int x, int y, char *text)
{
    glRasterPos2i(x, y);                        // pozice prvniho znaku retezce
    for (; *text; text++)                       // pruchod retezcem
        glutBitmapCharacter(GLUT_BITMAP_9_BY_15, *text);// vykresleni jednoho znaku
}



//--------------------------------------------------------------------
// Tato funkce je volana pri kazdem prekresleni okna
//---------------------------------------------------------------------
void onDisplay(void)
{
    char str[100];
    int i, j;
    GLdouble params[4];                         // parametry orezavaci roviny

    glClear(GL_COLOR_BUFFER_BIT);               // vymazani vsech bitovych rovin barvoveho bufferu
    glColor3f(1.0f, 1.0f, 0.0f);
    glGetIntegerv(GL_MAX_CLIP_PLANES, &i);      // zjistit maximalni pocet orezavacich rovin
    sprintf(str, "Maximalni pocet orezavacich rovin: %d", i);
    printString(10, 20, str);

    glColor3f(1.0f, 0.0f, 1.0f);
    for (j=0; j<i; j++) {                       // vypsat vlastnosti vsech orezavacich rovin
        glGetClipPlane(GL_CLIP_PLANE0+j, params);
        sprintf(str, "Rovina: %d  povolena: %s  parametry: %5.2f %5.2f %5.2f %5.2f",
                j,
                glIsEnabled(GL_CLIP_PLANE0+j) ? "ano":"ne ",
                (float)params[0],
                (float)params[1],
                (float)params[2],
                (float)params[3]);
        printString(10, 40+17*j, str);
    }
    glFlush();                                  // provedeni a vykresleni vsech zmen
}



//---------------------------------------------------------------------
// Tato funkce je volana pri stlaceni ASCII klavesy
//---------------------------------------------------------------------
void onKeyboard(unsigned char key, int x, int y)
{
    if (key>='A' && key<='Z')                   // uprava velkych pismen na mala
        key+='a'-'A';                           // pro zjednoduseni prikazu switch

    switch (key) {
        case 27:    exit(0);  break;            // ukonceni aplikace
        case 'q':   exit(0);  break;            // ukonceni aplikace
        default:              break;
    }
}



//---------------------------------------------------------------------
// Hlavni funkce konzolove aplikace
//---------------------------------------------------------------------
int main(int argc, char **argv)
{
    glutInit(&argc, argv);                      // inicializace knihovny GLUT
    glutInitDisplayMode(GLUT_RGB);              // nastaveni barvoveho bufferu
    glutInitWindowPosition(30, 30);             // pocatecni pozice leveho horniho rohu okna
    glutInitWindowSize(600, 500);               // pocatecni velikost okna
    glutCreateWindow("Priklad na OpenGL cislo 29");// vytvoreni okna pro kresleni
    glutDisplayFunc(onDisplay);                 // registrace funkce volane pri prekreslovani okna
    glutReshapeFunc(onResize);                  // registrace funkce volane pri zmene velikosti okna
    glutKeyboardFunc(onKeyboard);               // registrace funkce volane pri stlaceni klavesy
    onInit();                                   // inicializace vykreslovani
    glutMainLoop();                             // nekonecna smycka, kde se volaji zaregistrovane funkce
    return 0;                                   // navratova hodnota vracena operacnimu systemu
}



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