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