/* * GLUT Shapes Demo * * Written by Nigel Stewart November 2003 * * This program is test harness for the sphere, cone * and torus shapes in GLUT. * * Spinning wireframe and smooth shaded shapes are * displayed until the ESC or q key is pressed. The * number of geometry stacks and slices can be adjusted * using the + and - keys. */ #include #include #define GL_PI 3.1415f #ifdef __APPLE__ #include #else #include #endif #include static int slices = 16; static int stacks = 16; int obrot1 = 0; int obrot2 = 0; int obrot3 = 0; //znaczniki efektów int iCull =0; int iOutline =0; int iDepth =0; int iClock =0; int iFill =0; enum { EXIT, FULL_WINDOW, ASPECT_1_1, ORTO, FRUST, PERSP }; // ustawienie wartości startowych GLint skala=FULL_WINDOW; GLint rzut=ORTO; GLdouble fovy = 90; // ustawienie parametrów zakresu rzutni GLdouble aspect = 1; GLfloat zakres = 200.0f; GLfloat blisko = 1.0f; GLfloat daleko = 150.0f; /* GLUT callback Handlers */ static void resize(int width, int height) { const float ar = (float) width / (float) height; glViewport(0, 0, width, height); glMatrixMode(GL_PROJECTION); glLoadIdentity();if (rzut==ORTO) { if (skala==ASPECT_1_1) { if (width < height && width > 0)glOrtho (-zakres,zakres,-zakres*height/width,zakres*height/width,-zakres,zakres); else if (width >= height && height > 0)glOrtho (-zakres*width/height,zakres*width/height,-zakres,zakres,-zakres,zakres); } else glOrtho (-zakres,zakres,-zakres,zakres,-zakres,zakres); } if (rzut==FRUST) { if (skala==ASPECT_1_1) { if (width < height && width > 0)glFrustum (-zakres,zakres,-zakres*height/width,zakres*height/width,blisko,daleko); else if (width >= height && height > 0)glFrustum (-zakres*width/height,zakres*width/height,-zakres,zakres,blisko,daleko); } else glFrustum (-zakres,zakres,-zakres,zakres,blisko,daleko); } if (rzut==PERSP) { if (height > 0) aspect = width/(GLdouble)height; gluPerspective (fovy,aspect,blisko,daleko); } glMatrixMode(GL_MODELVIEW); glLoadIdentity() ; } static void display(void) { const double t = glutGet(GLUT_ELAPSED_TIME) / 1000.0; const double a = t*90.0; GLfloat xs,ys,angle; // Przechowują wartości współrzędnych i kąta int iPivot = 1; // Do oznaczania zamiennych kolorów glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glColor3d(1,0,0); glLineWidth(4); if(iCull) glEnable(GL_CULL_FACE); else glDisable(GL_CULL_FACE); if(iDepth) glEnable(GL_DEPTH_TEST); else glDisable(GL_DEPTH_TEST); if(iOutline) glPolygonMode(GL_BACK,GL_LINE); else glPolygonMode(GL_BACK,GL_FILL); if(iFill) glShadeModel(GL_FLAT); else glShadeModel(GL_SMOOTH); if(iClock) glFrontFace(GL_CW); else glFrontFace(GL_CCW); glPushMatrix(); glRotated(obrot1,1,0,0); glRotated(obrot2,0,1,0); glRotated(obrot3,0,0,1); glTranslated(0,0,-100); glBegin(GL_TRIANGLE_FAN); // Rysowanie ściany bocznej stożka glVertex3f(0.0f, 0.0f, 75.0f); // Czubek stożka jest wspólnym wierzchołkiem wszystkich trójkątów z wachlarza. for(angle = 0.0f; angle < (2.0f*GL_PI); angle += (GL_PI/8.0f)) { xs = 50.0f*sin(angle); // Wyliczenie współrzędnych x i y kolejnego wierzchołka ys = 50.0f*cos(angle); if((iPivot %2) == 0) // Wybieranie koloru - zielony lub czerwony glColor3f(0.0f, 1.0f, 0.0f); else glColor3f(1.0f, 0.0f, 0.0f); iPivot++; // Inkrementacja zmiennej określającej rodzaj koloru // Definiowanie kolejnego wierzchołka w wachlarzu trójkątów glVertex2f(xs, ys); } glEnd(); // Zakończenie rysowania trójkątów stożka glBegin(GL_TRIANGLE_FAN); // Rozpoczęcie rysowania kolejnego wachlarza trójkątów zakrywającego podstawę stożka glVertex2f(0.0f, 0.0f); // Środek wachlarza znajduje się na początku układu współrzędnych for(angle = 0.0f; angle < (2.0f*GL_PI); angle += (GL_PI/8.0f)) { xs = 50.0f*sin(angle); // Wyliczenie współrzędnych x i y kolejnego wierzchołka ys = 50.0f*cos(angle); if((iPivot %2) == 0) // Wybieranie koloru - zielony lub czerwony glColor3f(0.0f, 1.0f, 0.0f); else glColor3f(1.0f, 0.0f, 0.0f); iPivot++; // Inkrementacja zmiennej określającej rodzaj koloru glVertex2f(xs, ys); // Definiowanie kolejnego wierzchołka w wachlarzu trójkątów } glEnd(); //walec glBegin(GL_TRIANGLE_STRIP); // Rysowanie ściany bocznej stożka //glVertex3f(0.0f, 0.0f, 75.0f); // Czubek stożka jest wspólnym wierzchołkiem wszystkich trójkątów z wachlarza. for(angle = 0.0f; angle < (2.0f*GL_PI); angle += (GL_PI/8.0f)) { xs = 50.0f*sin(angle); // Wyliczenie współrzędnych x i y kolejnego wierzchołka ys = 50.0f*cos(angle); if((iPivot %2) == 0) // Wybieranie koloru - zielony lub czerwony glColor3f(0.0f, 1.0f, 0.0f); else glColor3f(1.0f, 0.0f, 0.0f); iPivot++; // Inkrementacja zmiennej określającej rodzaj koloru // Definiowanie kolejnego wierzchołka w wachlarzu trójkątów glVertex3f(xs, ys,0); glVertex3f(xs, ys,50); } glEnd(); glPopMatrix(); glutSwapBuffers(); } static void key(unsigned char key, int x, int y) { switch (key) { case 27 : case 'q': exit(0); break; case '+': slices++; stacks++; break; case 'z': obrot3 +=5; break; case 'a': obrot3 -=5; break; case 'x': obrot1 +=5; break; case 's': obrot1 -=5; break; case 'c': obrot2 +=5; break; case 'd': obrot2 -=5; break; case '-': if (slices>3 && stacks>3) { slices--; stacks--; } break; case 10: iDepth = !iDepth; break; case 20: iCull = !iCull; break; case 30: iClock = !iClock; break; case 40: iFill = !iFill; break; case 50: iOutline = !iOutline; break; } glutPostRedisplay(); } static void idle(void) { glutPostRedisplay(); } const GLfloat light_ambient[] = { 0.0f, 0.0f, 0.0f, 1.0f }; const GLfloat light_diffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f }; const GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f }; const GLfloat light_position[] = { 2.0f, 5.0f, 5.0f, 0.0f }; const GLfloat mat_ambient[] = { 0.7f, 0.7f, 0.7f, 1.0f }; const GLfloat mat_diffuse[] = { 0.8f, 0.8f, 0.8f, 1.0f }; const GLfloat mat_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f }; const GLfloat high_shininess[] = { 100.0f }; /* Program entry point */ void Menu (int value) { switch (value) { // wyjście case EXIT: exit (0); case FULL_WINDOW: skala=FULL_WINDOW; resize (glutGet (GLUT_WINDOW_WIDTH),glutGet (GLUT_WINDOW_HEIGHT)); break; case ASPECT_1_1: skala=ASPECT_1_1; resize (glutGet (GLUT_WINDOW_WIDTH),glutGet (GLUT_WINDOW_HEIGHT)); break; case ORTO: rzut=ORTO; resize (glutGet (GLUT_WINDOW_WIDTH),glutGet (GLUT_WINDOW_HEIGHT)); break; case FRUST: rzut=FRUST; resize (glutGet (GLUT_WINDOW_WIDTH),glutGet (GLUT_WINDOW_HEIGHT)); break; case PERSP: rzut=PERSP; resize (glutGet (GLUT_WINDOW_WIDTH),glutGet (GLUT_WINDOW_HEIGHT)); break; } } int main(int argc, char *argv[]) { glutInit(&argc, argv); glutInitWindowSize(640,480); glutInitWindowPosition(10,10); glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); glutCreateWindow("GLUT Shapes"); glutReshapeFunc(resize); glutDisplayFunc(display); glutKeyboardFunc(key); glutIdleFunc(idle); glClearColor(1,1,1,1); glEnable(GL_CULL_FACE); glCullFace(GL_BACK); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LESS); glEnable(GL_LIGHT0); glEnable(GL_NORMALIZE); glEnable(GL_COLOR_MATERIAL); glEnable(GL_LIGHTING); glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient); glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse); glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular); glLightfv(GL_LIGHT0, GL_POSITION, light_position); glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient); glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse); glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular); glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess); glutCreateMenu (Menu); // utworzenie menu podręcznego // dodadnie pozycji do menu podręcznego glutAddMenuEntry ("Rodzaj skalowania - całe okno", FULL_WINDOW); glutAddMenuEntry ("Rodzaj skalowania - skala 1:1", ASPECT_1_1); glutAddMenuEntry ("Rzutowanie ortogonalne", ORTO); glutAddMenuEntry ("Rzutowanie frustum", FRUST); glutAddMenuEntry ("Rzutowanie perspective", PERSP); glutAddMenuEntry ("Wyjście",EXIT); glutAddMenuEntry ("Testowanie glebi",10); glutAddMenuEntry ("Ukrywanie powierzchni niewidocznych",20); glutAddMenuEntry ("Sposob rysowania obiektow",30); glutAddMenuEntry ("Wypelnianie obiektow",40); glutAddMenuEntry ("Wywyiniecie wielokatow",50); glutAttachMenu (GLUT_RIGHT_BUTTON); // określenie przycisku myszki obsługującej menu podręczne glutMainLoop(); return EXIT_SUCCESS; }