#include #include /* Pi konstans kozelito erteke. */ #define GL_PI 3.1415926535f /* Logikai igaz/hamis ertekek */ #define TRUE 1 #define FALSE 0 /* Tengelyek koruli forgatasi szogek */ static GLfloat xRot = 0.0f; static GLfloat yRot = 0.0f; /* Effektek kapcsoloi */ static int bCull = FALSE; static int bOutline = FALSE; static int bDepth = FALSE; static int shadeModel = 1; //static int displayMode = 1; /* Menuelemek kivalasztasanak kezelese */ void ProcessMenu(int value) { switch(value) { case 1: /* Melysegellenorzes kapcsolasa */ bDepth = !bDepth; break; case 2: /* Hatlap kirajzolas */ bCull = !bCull; break; case 3: /* Hatlap kitoltott vagy korvonalas */ bOutline = !bOutline; break; case 4: /* Egyszinu vagy szinatmenetes kitoltes */ shadeModel = 3 - shadeModel; default: break; } glutPostRedisplay(); } void RenderCone() { GLfloat x, y, angle; int iPivot = 1; /* Valtozo szinu haromszogek */ int i; /* Kuppalas modellezese haromszog legyezovel */ glBegin( GL_TRIANGLE_FAN ); /* Kup csucsnak kiemelese a síkból Z-tengely menten */ glColor3f(1.0f, 0.0f, 0.0f); glVertex3f( 0.0f, 0.0f, 75.0f ); /* Alapkor 16 korvonalpontjanak modellezese */ for( i = 0, angle = 0.0f; i <= 16; i++, angle += ( GL_PI / 8.0f ) ) { x = 50.0f * cos( angle ); y = 50.0f * sin( angle ); /* Felvaltva zold es voros modellezo szin */ if( ( iPivot % 2 ) == 0) glColor3f( 0.0f, 1.0f, 0.0f ); else glColor3f( 1.0f, 0.0f, 0.0f ); /* Kovetkezo haromszog szine mas legyen */ iPivot++; glVertex2f( x, y ); } glEnd(); /* Kup alapkorenek modellezese */ glBegin( GL_TRIANGLE_FAN ); /* Kozepso csucs az alapkor sikjaban */ glColor3f(0.0f, 0.0f, 1.0f); glVertex2f( 0.0f, 0.0f ); /* alapkor korvonalpontjai */ for( i = 0, angle = 0.0f; i <= 16; i++, angle += ( GL_PI / 8.0f ) ) { x = 50.0f * cos( angle ); y = 50.0f * sin( angle ); /* Felvaltva kek es sarga modellezo szin */ if( ( iPivot % 2 ) == 0 ) glColor3f( 0.0f, 0.0f, 1.0f ); else glColor3f( 1.0f, 1.0f, 0.0f ); iPivot++; glVertex2f( x, y ); } glEnd(); } /* Modellezes */ void RenderScene( void ) { /* Ablak es melysegpuffer torlese */ glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); /* Poligon hatlapok rajzolasanak ki/be kapcsolasa */ if( bCull ) glEnable( GL_CULL_FACE ); else glDisable( GL_CULL_FACE ); /* Melysegellenorzes ki/be kapcsolasa */ if( bDepth ) glEnable( GL_DEPTH_TEST ); else glDisable( GL_DEPTH_TEST ); /* Poligon hatlapok korvonallal vagy kitoltve */ if( bOutline ) glPolygonMode( GL_BACK,GL_LINE ); else glPolygonMode( GL_BACK,GL_FILL ); /* Egyszinu vagy szinatmenetes kitoltes */ if( shadeModel == 1 ) glShadeModel( GL_FLAT ); else glShadeModel( GL_SMOOTH ); /* Matrixallapot mentese es forgatas a tengelyek korul */ glPushMatrix(); glRotatef( xRot, 1.0f, 0.0f, 0.0f ); glRotatef( yRot, 0.0f, 1.0f, 0.0f ); /* Kup modellezese */ RenderCone(); /* Elmentett transzformacio visszaallitasa */ glPopMatrix(); /* Modellezo parancsok vegrehajtasa */ glutSwapBuffers(); } /* Kezdeti megjelenitesi beallitasok */ void SetupRC() { /* Fekete hatterszin */ glClearColor( 0.0f, 0.0f, 0.0f, 1.0f ); /* Egyszinu kitoltesi mod */ glShadeModel(GL_FLAT); /* Poligon elolapok az oramutato jarasaval ellentetes iranyban */ glFrontFace(GL_CCW); } void SpecialKeys( int key, int x, int y ) { if( key == GLUT_KEY_UP ) xRot -= 5.0f; if( key == GLUT_KEY_DOWN ) xRot += 5.0f; if( key == GLUT_KEY_LEFT ) yRot -= 5.0f; if( key == GLUT_KEY_RIGHT ) yRot += 5.0f; if( xRot > 356.0f ) xRot = 0.0f; if( xRot < -1.0f ) xRot = 355.0f; if( yRot > 356.0f ) yRot = 0.0f; if( yRot < -1.0f ) yRot = 355.0f; /* Ablak tartalmanak frissitese */ glutPostRedisplay(); } void ChangeSize( int w, int h ) { GLfloat nRange = 100.0f; /* Nullaval osztas elkerulese */ if( h == 0 ) h = 1; // Viewport beallitasa az ablak mereteihez */ glViewport( 0, 0, w, h ); // Reset projection matrix stack glMatrixMode( GL_PROJECTION ); glLoadIdentity(); /* Vagasi terresz beallitasa (bal, jobb, also, felso, kozeli, tavoli) */ if ( w <= h ) glOrtho ( -nRange, nRange, -nRange*h/w, nRange*h/w, -nRange, nRange ); else glOrtho ( -nRange * w / h, nRange * w / h, -nRange, nRange, -nRange, nRange ); /* ModelView matrix inicializalasa */ glMatrixMode( GL_MODELVIEW ); glLoadIdentity(); } int main( int argc, char* argv[] ) { glutInit( &argc, argv ); glutInitDisplayMode( GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH ); glutCreateWindow( "Kup modellezese" ); /* Menu keszitese es jobb egergombhoz rendelese */ glutCreateMenu( ProcessMenu ); glutAddMenuEntry( "Melysegteszt kapcsolasa", 1 ); glutAddMenuEntry( "Hatlap kirajzolas kapcsolasa", 2 ); glutAddMenuEntry( "Korvonalas hatlap kapcsolasa", 3 ); glutAddMenuEntry( "Kitoltesi mod kapcsolasa", 4 ); glutAttachMenu( GLUT_RIGHT_BUTTON ); /* Esemenykezelo fuggvenyek megadasa */ glutReshapeFunc( ChangeSize ); glutSpecialFunc( SpecialKeys ); glutDisplayFunc( RenderScene ); /* Kezdeti beallitasok */ SetupRC(); /* Vezerles a GLUT-nak */ glutMainLoop(); return 0; }