//--------------------------------------------------------------------- // Priklad cislo 10 // Autor: Pavel Tisnovsky // // Jednoducha animace - reakce na udalost Idle //--------------------------------------------------------------------- #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; //--------------------------------------------------------------------- // 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; default: break; } } //--------------------------------------------------------------------- // Tato funkce je volana pri volnem casovem slotu pro aplikaci //--------------------------------------------------------------------- void onIdle(void) { rotAngle+=0.010; // zvetsit uhel rotace glutPostRedisplay(); // a prekreslit scenu } //--------------------------------------------------------------------- // 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 10");// 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 glutIdleFunc(onIdle); // registrace funkce volane pri volnem casovem slotu glutMainLoop(); // nekonecna smycka, kde se volaji zaregistrovane fce return 0; // navratova hodnota vracena operacnimu systemu } //--------------------------------------------------------------------- // Konec zdrojoveho souboru //---------------------------------------------------------------------