/* * 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. */ #ifdef __APPLE__ #include #else #include #endif #include #include #define GL_PI 3.1415f static int slices = 16; static int stacks = 16; int obrot1 = 0; int obrot2 = 0; int obrot3 = 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 = 180.0f; GLfloat blisko = 1.0f; GLfloat daleko = 200.0f; //Znaczniki efktow int iCull = 0; int iOutline = 0; int iDepth = 0; int iClock = 0; int iFill = 0; /* 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, xs1, ys1, xw, yw, c2, y2, angle; int iPivot = 1; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glColor3d(1,0,0); // Włączenie lub wyłączenie mechanizmu eliminowania ukrytych powierzchni if(iCull) glEnable(GL_CULL_FACE); else glDisable(GL_CULL_FACE); // Włączenie lub wyłączenie mechanizmu sprawdzania głębi if(iDepth) glEnable(GL_DEPTH_TEST); else glDisable(GL_DEPTH_TEST); // Jeżeli ten znacznik będzie ustawiony, to wielokąty zwrócone // tyłem do widza będą rysowane tylko w postaci szkieletu if(iOutline) glPolygonMode(GL_BACK,GL_LINE); else glPolygonMode(GL_BACK,GL_FILL); // Jeżeli ten znacznik będzie ustawiony, to domyślne nawinięcie zostanie zmienione na zgodne z ruchem wskazówek zegara // dla części przodem do nas, w przeciwnym razie powracamy do domyślnych ustawień. if(iClock) glFrontFace(GL_CW); else glFrontFace(GL_CCW); glPushMatrix(); glTranslated(0,0,-100); glRotated(obrot1,1,0,0); glRotated(obrot2,0,1,0); glRotated(obrot3,0,0,1); 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(); // Zakończenie rysowania trójkątów podstawy stożka //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(); // Zakończenie rysowania trójkątów stożka 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; } 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; case 10: iDepth =!iDepth; break; case 20: iCull =!iCull; break; case 30: iOutline =!iOutline; break; case 40: iClock=!iClock; 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 ("Tesotwanie glebi", 10); glutAddMenuEntry ("Powierzcnie niewidoczne", 20); glutAddMenuEntry ("Sposob rysowania", 30); glutAddMenuEntry ("Nawiniecia", 40); glutAttachMenu (GLUT_RIGHT_BUTTON); // określenie przycisku myszki obsługującej menu podręczne glutMainLoop(); return EXIT_SUCCESS; }