//--------------------------------------------------------------------- // 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 //---------------------------------------------------------------------