//--------------------------------------------------------------------- // Ukazkovy priklad cislo 57 // Autor: Pavel Tisnovsky // // Program, ktery zobrazi ctverec s nanesenou texturou. Pomoci leveho // tlacitka mysi lze menit souradnice s,t v jednotlivych vrcholech // ctverce. //--------------------------------------------------------------------- #include // hlavickovy soubor funkci GLUTu a OpenGL #define TEXTURE_WIDTH 64 // sirka textury zadana v texelech #define TEXTURE_HEIGHT 64 // vyska textury zadana v texelech #define CTRL_MINX 300 // mezni hodnoty pro ridici body na obrazovce #define CTRL_MAXX 500 #define CTRL_MINY 100 #define CTRL_MAXY 300 #define DELTA_X (CTRL_MAXX-CTRL_MINX) // sirka ctverce s ridicimi body #define DELTA_Y (CTRL_MAXY-CTRL_MINY) // vyska ctverce s ridicimi body unsigned int points[4][2]={ // souradnice s,t v texture {CTRL_MINX, CTRL_MINY}, // prevedene na souradnice v okne {CTRL_MAXX, CTRL_MINY}, {CTRL_MAXX, CTRL_MAXY}, {CTRL_MINX, CTRL_MAXY}, }; unsigned char texture[TEXTURE_HEIGHT][TEXTURE_WIDTH][4];// pole pro ulozeni pixmapy textury int activePoint=-1; // vybrany ridici bod int height; // vyska okna //--------------------------------------------------------------------- // Vytvoreni rastroveho vzorku pro texturu //--------------------------------------------------------------------- void makeRasterTexture(void) { int i,j,c; // pocitadla smycek unsigned char * P; // ukazatel na zapisovany subtexel for (j=0; j='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; } } //--------------------------------------------------------------------- // Tato funkce je volana pri stisku ci pusteni tlacitka mysi //--------------------------------------------------------------------- void onMouseButton(int button, int state, int x, int y) { int i; if (button==GLUT_LEFT_BUTTON) { // pri zmene stavu leveho tlacitka if (state==GLUT_DOWN) { // pri stlaceni tlacitka activePoint=-1; for (i=0; i<=3; i++) { // najit ridici bod pod kurzorem if ((abs(x-points[i][0])<9) && (abs(height-y-points[i][1]<9))) { activePoint=i; // bod jsme nasli glutPostRedisplay(); return; } } } else { // pri pusteni tlacitka mysi activePoint=-1; // zrusit aktivni bod glutPostRedisplay(); } } } //--------------------------------------------------------------------- // Tato funkce je volana pri pohybu mysi se stlacenym tlacitkem. //--------------------------------------------------------------------- void onMouseMotion(int x, int y) { if (activePoint==-1) return; // neni vybran zadny ridici bod y=height-y; if (x>=CTRL_MINX && x<=CTRL_MAXX) // kurzor mysi je v zadanem ctverci points[activePoint][0]=x; // posunout ridici bod if (y>=CTRL_MINY && y<=CTRL_MAXY) points[activePoint][1]=y; glutPostRedisplay(); } //--------------------------------------------------------------------- // Hlavni funkce konzolove aplikace //--------------------------------------------------------------------- int main(int argc, char **argv) { glutInit(&argc, argv); // inicializace knihovny GLUT glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);// nastaveni dvou barvovych bufferu a pameti hloubky glutInitWindowPosition(30, 30); // pocatecni pozice leveho horniho rohu okna glutInitWindowSize(550, 400); // pocatecni velikost okna glutCreateWindow("Priklad na OpenGL cislo 57");// 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 glutMouseFunc(onMouseButton); // registrace funkce volane pri stlaceni ci pusteni tlacitka glutMotionFunc(onMouseMotion); // registrace funkce volane pri pohybu mysi se stlacenym tlacitkem onInit(); // inicializace vykreslovani glutMainLoop(); // nekonecna smycka, kde se volaji zaregistrovane funkce return 0; // navratova hodnota vracena operacnimu systemu } //--------------------------------------------------------------------- // Konec zdrojoveho souboru //---------------------------------------------------------------------