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; | ||
| + | } | ||
| + | |||
| + | /////////////////////////////////////////////////////////////////////////////// | ||
| + | /////////////////////////////////////////////////////////////////////////////// | ||
| + | </ | ||