Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.
Následující verze | Předchozí verze | ||
pitel:izg:lab07 [03. 07. 2012, 11.53:36] – upraveno mimo DokuWiki 127.0.0.1 | pitel:izg:lab07 [30. 12. 2022, 13.43:01] (aktuální) – upraveno mimo DokuWiki 127.0.0.1 | ||
---|---|---|---|
Řádek 1: | Řádek 1: | ||
+ | ====== Základy OpenGL ====== | ||
+ | [[http:// | ||
+ | <file cpp main.cpp> | ||
+ | /////////////////////////////////////////////////////////////////////////////// | ||
+ | // Zaklady pocitacove grafiky | ||
+ | // Cviceni #7 | ||
+ | // | ||
+ | // Autor: Adam Herout, modified by Michal Spanel | ||
+ | // | ||
+ | // Obsah cviceni: " | ||
+ | // | ||
+ | // Demonstrovane jevy: | ||
+ | // - OpenGL + GLUT | ||
+ | // - vykreslovani | ||
+ | // - display-listy | ||
+ | // - barvy | ||
+ | // - osvetleni | ||
+ | // - pruhlednost | ||
+ | // - stencil buffer | ||
+ | // | ||
+ | // *) Ovladani programu: | ||
+ | // mys + leve tl. - rotace cele sceny | ||
+ | // mys + prave tl. - priblizeni sceny | ||
+ | // 1,2,3 - polygony vyplnit, carami, body | ||
+ | // | ||
+ | // Opravy: | ||
+ | // | ||
+ | /////////////////////////////////////////////////////////////////////////////// | ||
+ | |||
+ | |||
+ | /////////////////////////////////////////////////////////////////////////////// | ||
+ | // include | ||
+ | |||
+ | #ifdef _WIN32 | ||
+ | # include < | ||
+ | #endif | ||
+ | |||
+ | #include < | ||
+ | #include < | ||
+ | //#include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | |||
+ | |||
+ | /////////////////////////////////////////////////////////////////////////////// | ||
+ | // globalni konstanty | ||
+ | |||
+ | // titulek hlavniho okna | ||
+ | const char * PROGRAM_TITLE = "IZG Labs #07, Informativni nejzakladnejsi zaklady OpenGL"; | ||
+ | |||
+ | const float fov = 45.0; // zorny uhel - field of view | ||
+ | const float | ||
+ | const float | ||
+ | |||
+ | const int | ||
+ | const int | ||
+ | |||
+ | |||
+ | /////////////////////////////////////////////////////////////////////////////// | ||
+ | // globalni promenne | ||
+ | |||
+ | int | ||
+ | int | ||
+ | int | ||
+ | int time = 0; // virtualni cas [s] | ||
+ | |||
+ | |||
+ | /////////////////////////////////////////////////////////////////////////////// | ||
+ | // zakladni nastaveni OpenGL | ||
+ | // - funkce se vola jednou, pri zacatku programu | ||
+ | // | ||
+ | |||
+ | void Init(void) | ||
+ | { | ||
+ | // nastaveni clear color | ||
+ | glClearColor(0.0, | ||
+ | |||
+ | // parametry svetla | ||
+ | GLfloat light_ambient[] | ||
+ | GLfloat light_specular[] = {0.8, 0.8, 0.8, 1.0}; // barva odlesku | ||
+ | GLfloat light_diffuse[] | ||
+ | GLfloat light_position[] = {15.0, 0.0, 0.0, 1.0}; // definice pozice svetla | ||
+ | |||
+ | // nastaveni svetla | ||
+ | glEnable(GL_LIGHTING); | ||
+ | glEnable(GL_LIGHT0); | ||
+ | glLightfv(GL_LIGHT0, | ||
+ | glLightfv(GL_LIGHT0, | ||
+ | glLightfv(GL_LIGHT0, | ||
+ | glLightfv(GL_LIGHT0, | ||
+ | |||
+ | // nastaveni osvetlovaciho modelu | ||
+ | // glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL_EXT, | ||
+ | |||
+ | // povoleni z-bufferu | ||
+ | glClearDepth(1000.0); | ||
+ | glEnable(GL_DEPTH_TEST); | ||
+ | glDepthFunc(GL_LESS); | ||
+ | |||
+ | // velikost bodu, pokud se nejaky kresli... | ||
+ | glPointSize(5.0); | ||
+ | } | ||
+ | |||
+ | |||
+ | /////////////////////////////////////////////////////////////////////////////// | ||
+ | // vygenerovani display-listu ozubeneho kolecka | ||
+ | // - funkce se vola pri zacatku programu | ||
+ | // - vraci id vytvoreneho display-listu | ||
+ | |||
+ | // zakladni parametry kolecka | ||
+ | #define COG_COUNT | ||
+ | #define RADIUS | ||
+ | |||
+ | // dalsi parametry kolecka | ||
+ | #define COG_HEIGHT | ||
+ | #define RADIUS_AXLE | ||
+ | #define WHEEL_THICKNESS 3.0 // tloustka kola | ||
+ | #define CONST_PI | ||
+ | |||
+ | // identifikator display-listu kolecka | ||
+ | int wheel; | ||
+ | int wheel2; | ||
+ | |||
+ | int InitWheelDisplayList(double radius, int cog_count) | ||
+ | { | ||
+ | double phi = 0; | ||
+ | |||
+ | // vygeneruje identifikator display-listu | ||
+ | int id = glGenLists(1); | ||
+ | | ||
+ | // naplneni display-listu s koleckem | ||
+ | glNewList(id, | ||
+ | { | ||
+ | glBegin(GL_QUADS); | ||
+ | for (int i = 0; i < cog_count; i++) { // pro kazdy zub... | ||
+ | glNormal3f(0, | ||
+ | glVertex3f(RADIUS_AXLE*cos(phi), | ||
+ | glVertex3f((radius+COG_HEIGHT)*cos(phi), | ||
+ | glVertex3f((radius+COG_HEIGHT)*cos(phi + 2/ | ||
+ | | ||
+ | | ||
+ | glVertex3f(RADIUS_AXLE*cos(phi + 2/ | ||
+ | | ||
+ | | ||
+ | | ||
+ | glNormal3f(cos(phi + 2/ | ||
+ | glVertex3f((radius+COG_HEIGHT)*cos(phi), | ||
+ | glVertex3f((radius+COG_HEIGHT)*cos(phi + 2/ | ||
+ | | ||
+ | | ||
+ | ); | ||
+ | glVertex3f((radius+COG_HEIGHT)*cos(phi + 2/ | ||
+ | | ||
+ | | ||
+ | glVertex3f((radius+COG_HEIGHT)*cos(phi), | ||
+ | | ||
+ | glNormal3f(0, | ||
+ | glVertex3f(RADIUS_AXLE*cos(phi), | ||
+ | glVertex3f((radius+COG_HEIGHT)*cos(phi), | ||
+ | glVertex3f((radius+COG_HEIGHT)*cos(phi + 2/ | ||
+ | | ||
+ | | ||
+ | glVertex3f(RADIUS_AXLE*cos(phi + 2/ | ||
+ | | ||
+ | | ||
+ | | ||
+ | glNormal3f(-cos(phi + 2/ | ||
+ | glVertex3f(RADIUS_AXLE*cos(phi), | ||
+ | glVertex3f(RADIUS_AXLE*cos(phi + 2/ | ||
+ | | ||
+ | | ||
+ | glVertex3f(RADIUS_AXLE*cos(phi + 2/ | ||
+ | | ||
+ | | ||
+ | glVertex3f(RADIUS_AXLE*cos(phi), | ||
+ | phi += 2/ | ||
+ | | ||
+ | | ||
+ | glNormal3f(0, | ||
+ | glVertex3f(RADIUS_AXLE*cos(phi), | ||
+ | glVertex3f((radius+COG_HEIGHT)*cos(phi), | ||
+ | glVertex3f(radius*cos(phi + 1/ | ||
+ | | ||
+ | | ||
+ | glVertex3f(RADIUS_AXLE*cos(phi + 1/ | ||
+ | | ||
+ | | ||
+ | | ||
+ | glNormal3f(cos(phi + 1/ | ||
+ | glVertex3f((radius+COG_HEIGHT)*cos(phi), | ||
+ | glVertex3f(radius*cos(phi + 1/ | ||
+ | | ||
+ | | ||
+ | glVertex3f(radius*cos(phi + 1/ | ||
+ | | ||
+ | | ||
+ | glVertex3f((radius+COG_HEIGHT)*cos(phi), | ||
+ | | ||
+ | glNormal3f(0, | ||
+ | glVertex3f(RADIUS_AXLE*cos(phi), | ||
+ | glVertex3f((radius+COG_HEIGHT)*cos(phi), | ||
+ | glVertex3f(radius*cos(phi + 1/ | ||
+ | | ||
+ | | ||
+ | glVertex3f(RADIUS_AXLE*cos(phi + 1/ | ||
+ | | ||
+ | | ||
+ | | ||
+ | glNormal3f(-cos(phi + 1/ | ||
+ | glVertex3f(RADIUS_AXLE*cos(phi), | ||
+ | glVertex3f(RADIUS_AXLE*cos(phi + 1/ | ||
+ | | ||
+ | | ||
+ | glVertex3f(RADIUS_AXLE*cos(phi + 1/ | ||
+ | | ||
+ | | ||
+ | glVertex3f(RADIUS_AXLE*cos(phi), | ||
+ | phi += 1/ | ||
+ | | ||
+ | | ||
+ | glNormal3f(0, | ||
+ | glVertex3f(RADIUS_AXLE*cos(phi), | ||
+ | glVertex3f(radius*cos(phi), | ||
+ | glVertex3f(radius*cos(phi + 3/ | ||
+ | | ||
+ | | ||
+ | glVertex3f(RADIUS_AXLE*cos(phi + 3/ | ||
+ | | ||
+ | | ||
+ | | ||
+ | glNormal3f(cos(phi + 3/ | ||
+ | glVertex3f(radius*cos(phi), | ||
+ | glVertex3f(radius*cos(phi + 3/ | ||
+ | | ||
+ | | ||
+ | glVertex3f(radius*cos(phi + 3/ | ||
+ | | ||
+ | | ||
+ | glVertex3f(radius*cos(phi), | ||
+ | | ||
+ | glNormal3f(0, | ||
+ | glVertex3f(RADIUS_AXLE*cos(phi), | ||
+ | glVertex3f(radius*cos(phi), | ||
+ | glVertex3f(radius*cos(phi + 3/ | ||
+ | | ||
+ | | ||
+ | glVertex3f(RADIUS_AXLE*cos(phi + 3/ | ||
+ | | ||
+ | | ||
+ | | ||
+ | glNormal3f(-cos(phi + 3/ | ||
+ | glVertex3f(RADIUS_AXLE*cos(phi), | ||
+ | glVertex3f(RADIUS_AXLE*cos(phi + 3/ | ||
+ | | ||
+ | | ||
+ | glVertex3f(RADIUS_AXLE*cos(phi + 3/ | ||
+ | | ||
+ | | ||
+ | glVertex3f(RADIUS_AXLE*cos(phi), | ||
+ | phi += 3/ | ||
+ | | ||
+ | | ||
+ | glNormal3f(0, | ||
+ | glVertex3f(RADIUS_AXLE*cos(phi), | ||
+ | glVertex3f(radius*cos(phi), | ||
+ | glVertex3f((radius+COG_HEIGHT)*cos(phi + 1/ | ||
+ | | ||
+ | | ||
+ | glVertex3f(RADIUS_AXLE*cos(phi + 1/ | ||
+ | | ||
+ | | ||
+ | | ||
+ | glNormal3f(cos(phi + 1/ | ||
+ | glVertex3f(radius*cos(phi), | ||
+ | glVertex3f((radius+COG_HEIGHT)*cos(phi + 1/ | ||
+ | | ||
+ | | ||
+ | glVertex3f((radius+COG_HEIGHT)*cos(phi + 1/ | ||
+ | | ||
+ | | ||
+ | glVertex3f(radius*cos(phi), | ||
+ | | ||
+ | glNormal3f(0, | ||
+ | glVertex3f(RADIUS_AXLE*cos(phi), | ||
+ | glVertex3f(radius*cos(phi), | ||
+ | glVertex3f((radius+COG_HEIGHT)*cos(phi + 1/ | ||
+ | | ||
+ | | ||
+ | glVertex3f(RADIUS_AXLE*cos(phi + 1/ | ||
+ | | ||
+ | | ||
+ | | ||
+ | glNormal3f(-cos(phi + 1/ | ||
+ | glVertex3f(RADIUS_AXLE*cos(phi), | ||
+ | glVertex3f(RADIUS_AXLE*cos(phi + 1/ | ||
+ | | ||
+ | | ||
+ | glVertex3f(RADIUS_AXLE*cos(phi + 1/ | ||
+ | | ||
+ | | ||
+ | glVertex3f(RADIUS_AXLE*cos(phi), | ||
+ | phi += 1/ | ||
+ | } // konec cyklu pro kazdy zub | ||
+ | glEnd(); | ||
+ | } | ||
+ | glEndList(); | ||
+ | |||
+ | // vratime identifikator display-listu | ||
+ | return id; | ||
+ | } | ||
+ | |||
+ | |||
+ | /////////////////////////////////////////////////////////////////////////////// | ||
+ | // vygenerovani display-listu pro dva materialy | ||
+ | // - funkce se vola jednou, pri zacatku programu | ||
+ | |||
+ | // identifikatory display-listu pro materialy | ||
+ | int red_mat, blue_mat; | ||
+ | |||
+ | void InitMaterialDisplayLists() | ||
+ | { | ||
+ | // vygenerujeme display listy pro dva dulezite materialy | ||
+ | red_mat = glGenLists(1); | ||
+ | glNewList(red_mat, | ||
+ | { | ||
+ | GLfloat mat_diffuse[] = {0.9, 0.0, 0.0, 1.0}; // difuzni (matna) slozka materialu | ||
+ | GLfloat mat_ambient[] = {0.2, 0.2, 0.2, 1.0}; // ambient (rozptylena) slozka materialu | ||
+ | GLfloat mat_specular[] = {0.5, 0.5, 0.5, 1.0}; // spekularni (odleskova) slozka materialu | ||
+ | |||
+ | glMaterialfv(GL_FRONT_AND_BACK, | ||
+ | glMaterialfv(GL_FRONT_AND_BACK, | ||
+ | glMaterialfv(GL_FRONT_AND_BACK, | ||
+ | glMaterialf(GL_FRONT_AND_BACK, | ||
+ | } | ||
+ | glEndList(); | ||
+ | |||
+ | // vygenerujeme display-list pro modry material | ||
+ | blue_mat = glGenLists(1); | ||
+ | glNewList(blue_mat, | ||
+ | { | ||
+ | GLfloat mat_diffuse[] = {0.0, 0.0, 0.9, 1.0}; // difuzni slozka materialu | ||
+ | GLfloat mat_ambient[] = {0.2, 0.2, 0.2, 1.0}; // ambient (rozptylena) slozka materialu | ||
+ | GLfloat mat_specular[] = {0.5, 0.5, 0.5, 1.0}; // spekularni slozka materialu | ||
+ | |||
+ | glMaterialfv(GL_FRONT_AND_BACK, | ||
+ | glMaterialfv(GL_FRONT_AND_BACK, | ||
+ | glMaterialfv(GL_FRONT_AND_BACK, | ||
+ | glMaterialf(GL_FRONT_AND_BACK, | ||
+ | } | ||
+ | glEndList(); | ||
+ | } | ||
+ | |||
+ | |||
+ | /////////////////////////////////////////////////////////////////////////////// | ||
+ | // vygenerovani textury - bitmapy RGBA o vhodnych rozmerech | ||
+ | // - funkce se vola jednou, pri zacatku programu | ||
+ | |||
+ | // parametry textury | ||
+ | #define TEXTURE_WIDTH | ||
+ | #define TEXTURE_HEIGHT | ||
+ | |||
+ | // pole kde budou data textury | ||
+ | unsigned char texture[TEXTURE_WIDTH * TEXTURE_HEIGHT * 4]; | ||
+ | |||
+ | // identifikator (" | ||
+ | unsigned texid; | ||
+ | |||
+ | void InitTexture() | ||
+ | { | ||
+ | unsigned char *p = texture; | ||
+ | for (int i = 0; i < TEXTURE_HEIGHT; | ||
+ | for (int j = 0; j < TEXTURE_WIDTH; | ||
+ | *p++ = (((int)(i+10*(sin(j/ | ||
+ | *p++ = (((int)(i+10*(sin(j/ | ||
+ | *p++ = (((int)(i+10*(sin(j/ | ||
+ | *p++ = (((int)(i+10*(sin(j/ | ||
+ | } | ||
+ | } | ||
+ | |||
+ | // vygeneruje (prideli) identifikator textury - ulozi do promenne texid | ||
+ | glGenTextures(0, | ||
+ | | ||
+ | // texid bude aktivni textura | ||
+ | glBindTexture(GL_TEXTURE_2D, | ||
+ | | ||
+ | // nastaveni parametru textury | ||
+ | glTexParameteri(GL_TEXTURE_2D, | ||
+ | glTexParameteri(GL_TEXTURE_2D, | ||
+ | glTexParameteri(GL_TEXTURE_2D, | ||
+ | glTexParameteri(GL_TEXTURE_2D, | ||
+ | glTexEnvf(GL_TEXTURE_ENV, | ||
+ | | ||
+ | // vytvoreni textury - podle naseho vygenerovaneho pole v promenne texture | ||
+ | glTexImage2D(GL_TEXTURE_2D, | ||
+ | 0, GL_RGBA, GL_UNSIGNED_BYTE, | ||
+ | } | ||
+ | |||
+ | |||
+ | /////////////////////////////////////////////////////////////////////////////// | ||
+ | // nastaveni souradneho systemu podle velikosti okna | ||
+ | // - funkci zavola GLUT vzdy, kdyz se zmeni rozmery okna | ||
+ | |||
+ | void onReshape(int w, int h) | ||
+ | { | ||
+ | glViewport(0, | ||
+ | glMatrixMode(GL_PROJECTION); | ||
+ | glLoadIdentity(); | ||
+ | gluPerspective(fov, | ||
+ | glMatrixMode(GL_MODELVIEW); | ||
+ | glLoadIdentity(); | ||
+ | } | ||
+ | |||
+ | |||
+ | /////////////////////////////////////////////////////////////////////////////// | ||
+ | // tato funkce je volana pro prekresleni okna | ||
+ | // - vola ji GLUT, kdyz okno vystoupi do popredi, nebo kdyz si to | ||
+ | // | ||
+ | |||
+ | void onDisplay(void) | ||
+ | { | ||
+ | // vymazani bufferu | ||
+ | glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); | ||
+ | |||
+ | glMatrixMode(GL_MODELVIEW); | ||
+ | glLoadIdentity(); | ||
+ | |||
+ | //////////////////////////////////////////////////////////////// | ||
+ | // nastaveni kamery | ||
+ | |||
+ | glTranslatef(0.0f, | ||
+ | glRotatef(scene_rot_x, | ||
+ | glRotatef(scene_rot_y, | ||
+ | | ||
+ | //////////////////////////////////////////////////////////////// | ||
+ | // vykresleni sceny | ||
+ | |||
+ | // kolecka vpredu | ||
+ | #if 1 | ||
+ | glPushMatrix(); | ||
+ | glTranslatef(0.0, | ||
+ | |||
+ | glCallList(red_mat); | ||
+ | glPushMatrix(); | ||
+ | glCallList(wheel); | ||
+ | glPopMatrix(); | ||
+ | |||
+ | glCallList(blue_mat); | ||
+ | glPushMatrix(); | ||
+ | glRotatef(time, | ||
+ | glTranslatef(((2 * RADIUS + COG_HEIGHT) / 2) + 2.5, 0, 0); | ||
+ | glRotatef(2 * time - 14, 0, 0, 1); | ||
+ | glCallList(wheel2); | ||
+ | glPopMatrix(); | ||
+ | glPopMatrix(); | ||
+ | #endif | ||
+ | | ||
+ | // vykresleni POLOHY zrcadla do stencil-bufferu | ||
+ | glColorMask(GL_FALSE, | ||
+ | glDepthMask(GL_FALSE); | ||
+ | glEnable(GL_CULL_FACE); | ||
+ | glEnable(GL_STENCIL_TEST); | ||
+ | glStencilFunc(GL_ALWAYS, | ||
+ | glStencilOp(GL_KEEP, | ||
+ | glBegin(GL_QUADS); | ||
+ | glVertex3f(-16.0, | ||
+ | glVertex3f( 16.0, -11.0, 0.0); | ||
+ | glVertex3f( 16.0, 11.0, 0.0); | ||
+ | glVertex3f(-16.0, | ||
+ | glEnd(); | ||
+ | glDisable(GL_CULL_FACE); | ||
+ | glColorMask(GL_TRUE, | ||
+ | glDepthMask(GL_TRUE); | ||
+ | |||
+ | #if 1 | ||
+ | // kolecka jeste jednou - tentokrate za zrcadlem | ||
+ | glEnable(GL_STENCIL_TEST); | ||
+ | glStencilFunc(GL_EQUAL, | ||
+ | glStencilOp(GL_KEEP, | ||
+ | glPushMatrix(); | ||
+ | glScalef(1.0, | ||
+ | glTranslatef(0, | ||
+ | | ||
+ | glCallList(red_mat); | ||
+ | glPushMatrix(); | ||
+ | glCallList(wheel); | ||
+ | glPopMatrix(); | ||
+ | |||
+ | glCallList(blue_mat); | ||
+ | glPushMatrix(); | ||
+ | glRotatef(time, | ||
+ | glTranslatef(((2 * RADIUS + COG_HEIGHT) / 2) + 2.5, 0, 0); | ||
+ | glRotatef(2 * time - 14, 0, 0, 1); | ||
+ | glCallList(wheel2); | ||
+ | glPopMatrix(); | ||
+ | glPopMatrix(); | ||
+ | glDisable(GL_STENCIL_TEST); | ||
+ | #endif | ||
+ | |||
+ | // mrizka z car dole | ||
+ | glDisable(GL_LIGHTING); | ||
+ | glColor3f(0.5, | ||
+ | glLineWidth(1.0); | ||
+ | glBegin(GL_LINES); | ||
+ | for (int i = -10; i <= 10; i++) { | ||
+ | glColor3f(1, | ||
+ | glColor3f(0, | ||
+ | glColor3f(1, | ||
+ | glColor3f(0, | ||
+ | } | ||
+ | glEnd(); | ||
+ | glEnable(GL_LIGHTING); | ||
+ | |||
+ | #if 1 | ||
+ | // material zrcadla | ||
+ | GLfloat mat_diffuse[] = {0.8, 0.8, 0.0, 1.0}; // difuzni (matna) slozka materialu | ||
+ | GLfloat mat_ambient[] = {0.4, 0.4, 0.0, 1.0}; // ambient (rozptylena) slozka materialu | ||
+ | GLfloat mat_specular[]= {0.6, 0.9, 0.7, 1.0}; // specular (odleskova) slozka materialu | ||
+ | |||
+ | glMaterialfv(GL_FRONT_AND_BACK, | ||
+ | glMaterialfv(GL_FRONT_AND_BACK, | ||
+ | glMaterialfv(GL_FRONT_AND_BACK, | ||
+ | glMaterialf(GL_FRONT_AND_BACK, | ||
+ | |||
+ | // vykresleni zrcadla s texturou, ktera udava barvy a pruhlednost | ||
+ | glEnable(GL_TEXTURE_2D); | ||
+ | glEnable(GL_BLEND); | ||
+ | glBlendFunc(GL_SRC_ALPHA, | ||
+ | glBegin(GL_QUADS); | ||
+ | glNormal3f(0.0, | ||
+ | glTexCoord2f(0.0, | ||
+ | glTexCoord2f(1.0, | ||
+ | glTexCoord2f(1.0, | ||
+ | glTexCoord2f(0.0, | ||
+ | glEnd(); | ||
+ | glDisable(GL_BLEND); | ||
+ | glDisable(GL_TEXTURE_2D); | ||
+ | #endif | ||
+ | |||
+ | // takrka povinne ukonceni | ||
+ | glFlush(); | ||
+ | glutSwapBuffers(); | ||
+ | } | ||
+ | |||
+ | |||
+ | /////////////////////////////////////////////////////////////////////////////// | ||
+ | // funkce volana pri stisku klavesy | ||
+ | // - vola ji GLUT, kdyz uzivatel stiskne klavesu | ||
+ | |||
+ | void onKeyboard(unsigned char key, int x, int y) | ||
+ | { | ||
+ | // uprava velkych pismen na mala | ||
+ | if (key >= ' | ||
+ | key += ' | ||
+ | |||
+ | // rozeskok podle stlacene klavesy | ||
+ | switch (key) | ||
+ | { | ||
+ | // prepnuti na zobrazeni pouze vrcholu | ||
+ | case ' | ||
+ | glPolygonMode(GL_FRONT, | ||
+ | glPolygonMode(GL_BACK, | ||
+ | break; | ||
+ | |||
+ | // prepnuti na zobrazeni dratoveho modelu | ||
+ | case ' | ||
+ | glPolygonMode(GL_FRONT, | ||
+ | glPolygonMode(GL_BACK, | ||
+ | break; | ||
+ | |||
+ | // prepnuti na zobrazeni vyplnenych sten | ||
+ | case ' | ||
+ | glPolygonMode(GL_FRONT, | ||
+ | glPolygonMode(GL_BACK, | ||
+ | break; | ||
+ | | ||
+ | // ukonceni programu | ||
+ | case 27: // klavesa Escape | ||
+ | case ' | ||
+ | case ' | ||
+ | exit(0); | ||
+ | break; | ||
+ | |||
+ | // prepnuti na celou obrazovku | ||
+ | case ' | ||
+ | glutFullScreen(); | ||
+ | break; | ||
+ | |||
+ | // prepnuti zpet do okna | ||
+ | case ' | ||
+ | glutReshapeWindow(default_w, | ||
+ | break; | ||
+ | |||
+ | default: | ||
+ | break; | ||
+ | } | ||
+ | |||
+ | // vyvolani prekresleni OpenGL okna | ||
+ | glutPostRedisplay(); | ||
+ | } | ||
+ | |||
+ | |||
+ | /////////////////////////////////////////////////////////////////////////////// | ||
+ | // funkce volana pri stisku tlacitek mysi | ||
+ | // - vola GLUT, kdyz uzivatel stiskne tlacitko mysi | ||
+ | |||
+ | int old_mouse_x = 0, old_mouse_y = 0; // minula pozice mysi, ze ktere se pocitaji rotace | ||
+ | int stav = 0; // stav tlacitek mysi | ||
+ | |||
+ | void onMouseClick(int button, int state, int x, int y) | ||
+ | { | ||
+ | // zapamatovat pozici kurzoru mysi | ||
+ | old_mouse_x = x; | ||
+ | old_mouse_y = y; | ||
+ | |||
+ | if (button == GLUT_LEFT_BUTTON) { // leve tlacitko aktivuje rotaci | ||
+ | stav = (state == GLUT_DOWN) ? 1 : 0; // otestuj stlaceni | ||
+ | } | ||
+ | else if (button == GLUT_RIGHT_BUTTON) { // prave tlacitko aktivuje posun | ||
+ | stav = (state == GLUT_DOWN) ? 2 : 0; // otestuj stlaceni | ||
+ | } | ||
+ | else { | ||
+ | stav = 0; | ||
+ | } | ||
+ | | ||
+ | // prekresleni sceny | ||
+ | glutPostRedisplay(); | ||
+ | } | ||
+ | |||
+ | |||
+ | /////////////////////////////////////////////////////////////////////////////// | ||
+ | // funkce volana jestlize se mys pohybuje a je stlaceno nektere tlacitko | ||
+ | // - vola GLUT, kdyz uzivatel pohne mysi | ||
+ | |||
+ | void onMouseMotion(int x, int y) | ||
+ | { | ||
+ | if (stav == 1) { // rotace sceny | ||
+ | scene_rot_y += x - old_mouse_x; | ||
+ | scene_rot_x += y - old_mouse_y; | ||
+ | glutPostRedisplay(); | ||
+ | } | ||
+ | else if (stav == 2) { // posuv sceny | ||
+ | scene_move_z += old_mouse_y - y; | ||
+ | glutPostRedisplay(); | ||
+ | } | ||
+ | |||
+ | // zapamatovat novou pozici kurzoru | ||
+ | old_mouse_x = x; | ||
+ | old_mouse_y = y; | ||
+ | } | ||
+ | |||
+ | |||
+ | /////////////////////////////////////////////////////////////////////////////// | ||
+ | // funkce volana 40x za sekundu | ||
+ | // - vola GLUT | ||
+ | |||
+ | void onTimer(int x) | ||
+ | { | ||
+ | time++; | ||
+ | glutPostRedisplay(); | ||
+ | glutTimerFunc(25, | ||
+ | } | ||
+ | |||
+ | |||
+ | /////////////////////////////////////////////////////////////////////////////// | ||
+ | // hlavni funkce koznolove aplikace | ||
+ | // argc - pocet vstupnich parametru | ||
+ | // argv - pole vstupnich parametru | ||
+ | |||
+ | int main(int argc, char **argv) | ||
+ | { | ||
+ | // inicializace knihovny GLUT | ||
+ | glutInit(& | ||
+ | |||
+ | // nastaveni grafickeho modu okna | ||
+ | glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH | GLUT_STENCIL); | ||
+ | // pocatecni velikost okna | ||
+ | glutInitWindowSize(default_w, | ||
+ | // pocatecni pozice okna | ||
+ | // glutInitWindowPosition(200, | ||
+ | // vytvoreni okna pro kresleni | ||
+ | glutCreateWindow(PROGRAM_TITLE); | ||
+ | |||
+ | // registrace funkce volane pri prekreslovani | ||
+ | glutDisplayFunc(onDisplay); | ||
+ | // registrace funkce volane pri zmene velikosti | ||
+ | glutReshapeFunc(onReshape); | ||
+ | // registrace funkce volane pri stisku klavesy | ||
+ | glutKeyboardFunc(onKeyboard); | ||
+ | // registrace funkce volane pri stisku tlacitek mysi | ||
+ | glutMouseFunc(onMouseClick); | ||
+ | // registrace funkce volane pri pohybu mysi | ||
+ | glutMotionFunc(onMouseMotion); | ||
+ | // registrace funkce volane za 25 milisekund | ||
+ | glutTimerFunc(25, | ||
+ | |||
+ | // provest nasi uzivatelskou inicializaci | ||
+ | Init(); | ||
+ | InitMaterialDisplayLists(); | ||
+ | wheel = InitWheelDisplayList(RADIUS, | ||
+ | wheel2 = InitWheelDisplayList(RADIUS/ | ||
+ | InitTexture(); | ||
+ | |||
+ | // nekonecna smycka volajici registrovane funkce | ||
+ | glutMainLoop(); | ||
+ | |||
+ | // ANSI C potrebuje ukoncit fci main prikazem return | ||
+ | return 0; | ||
+ | } | ||
+ | |||
+ | /////////////////////////////////////////////////////////////////////////////// | ||
+ | /////////////////////////////////////////////////////////////////////////////// | ||
+ | </ |