Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <windows.h>
- #include <GL/glu.h>
- #include <GL/glut.h>
- // sta³e do obs³ugi menu podrêcznego
- enum
- {
- /* obiekty */
- SPHERE, // kula
- CYLINDER, // cylinder
- DISK, // dysk
- PARTIAL_DISK, // czêœciowy dysk
- /* wektory normalne */
- NONE,
- FLAT,
- SMOOTH,
- /* orientacja */
- OUTSIDE,
- INSIDE,
- /* styl */
- FILL,
- LINE,
- SILHOUETTE,
- OPOINT,
- EXIT // wyjście
- };
- // rozmiary bryły obcinania
- const GLdouble left = -1.0;
- const GLdouble right = 1.0;
- const GLdouble bottom = -1.0;
- const GLdouble top = 1.0;
- const GLdouble near2 = 3.0;
- const GLdouble far2 = 7.0;
- // kąt obrotu obiektu wzglêdem osi X i Y
- GLfloat rotatexy = 0;
- /* inicjalizacja zmiennych */
- int wybor;
- int slices = 10;
- int segments = 10;
- int style, kek;
- int normalne;
- int orientacja;
- GLUquadricObj *obiekt;
- // funkcja generuj¹ca scenê
- void display ()
- {
- // kolor t³a - zawartoœæ bufora koloru
- glClearColor (1.0,1.0,1.0,1.0);
- // czyszczenie bufora koloru i bufora g³êbokoœci
- glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- // wybór macierzy modelowania
- glMatrixMode (GL_MODELVIEW);
- // macierz modelowania = macierz jednostkowa
- glLoadIdentity ();
- // w³¹czenie testu bufora g³êbokoœci
- glEnable (GL_DEPTH_TEST);
- // w³¹czenie oœwietlenia
- glEnable (GL_LIGHTING);
- // w³¹czenie œwiat³a GL_LIGHT0 z parametrami domyœlnymi
- glEnable (GL_LIGHT0);
- // przesuniêcie uk³adu wspó³rzêdnych obiektu do œrodka bry³y odcinania
- glTranslatef (0,0,-(near2+far2)/2);
- //obrót obiektu wzglêdem osi X i Y
- glRotatef(rotatexy, 1, 1, 0);
- // kolor rysowanego obiektu
- glColor3f(1.0,0.0,0.0);
- /* utworzenie kwadryki */
- obiekt = gluNewQuadric();
- /*ustawienie właściwoœci kwadryki*/
- gluQuadricDrawStyle(obiekt, style);
- gluQuadricNormals(obiekt, normalne);
- gluQuadricOrientation(obiekt,orientacja);
- /*narysowanie wybranego obiektu*/
- switch(wybor)
- {
- case SPHERE:
- gluSphere(obiekt, 0.5, slices, segments);
- break;
- case DISK:
- gluDisk(obiekt, 0.3, 0.5, slices, segments);
- break;
- case CYLINDER:
- gluCylinder(obiekt, 0.2, 0.3, 1, slices, segments);
- break;
- case PARTIAL_DISK:
- gluPartialDisk(obiekt, 0.3, 0.5, slices, segments, 1, 200);
- break;
- }
- /* usuniêcie kwadryki */
- gluDeleteQuadric;
- // skierowanie poleceñ do wykonania
- glFlush ();
- // zamiana buforów koloru
- glutSwapBuffers();
- glutPostRedisplay();
- }
- // zmiana wielkoœci okna
- void reshape (int width, int height)
- {
- // obszar renderingu - ca³e okno
- glViewport (0,0,width,height);
- // wybór macierzy rzutowania
- glMatrixMode (GL_PROJECTION);
- // macierz rzutowania = macierz jednostkowa
- glLoadIdentity ();
- // parametry bry³y obcinania
- glFrustum (left,right,bottom,top,near2,far2);
- // generowanie sceny 3D
- display ();
- }
- // obs³uga klawiatury
- void keyboard (unsigned char key, int x, int y)
- {
- if (key == '+')
- {
- slices++;
- }
- else if (key == '-')
- {
- slices--;
- }
- // narysowanie sceny
- reshape (glutGet (GLUT_WINDOW_WIDTH),glutGet (GLUT_WINDOW_HEIGHT));
- }
- // obs³uga klawiszy funkcyjnych i klawiszy kursora
- void specialKeys (int key, int x, int y)
- {
- switch (key)
- {
- // PageUp
- case GLUT_KEY_PAGE_UP:
- {
- segments ++;
- }
- break;
- // PageDown
- case GLUT_KEY_PAGE_DOWN:
- {
- segments--;
- }
- break;
- }
- // odrysowanie okna
- reshape (glutGet (GLUT_WINDOW_WIDTH),glutGet (GLUT_WINDOW_HEIGHT));
- }
- // obs³uga menu podrêcznego
- void menu (int value)
- {
- switch (value)
- {
- // rysowany obiekt - kula
- case SPHERE:
- wybor = SPHERE;
- display ();
- break;
- // rysowany obiekt - cylinder
- case CYLINDER:
- wybor = CYLINDER;
- display ();
- break;
- // rysowany obiekt - dysk
- case DISK:
- wybor = DISK;
- display ();
- break;
- // rysowany obiekt - czêœciowy dysk
- case PARTIAL_DISK:
- wybor = PARTIAL_DISK;
- display ();
- break;
- /* ustawienie pozosta³ych pozycji w MENU */
- case NONE:
- normalne = GLU_NONE;
- display();
- break;
- case FLAT:
- normalne = GLU_FLAT;
- display();
- break;
- case SMOOTH:
- normalne = GLU_SMOOTH;
- display();
- break;
- case FILL:
- style = GLU_FILL;
- display();
- break;
- case LINE:
- style = GLU_LINE;
- display();
- break;
- case SILHOUETTE:
- style = GLU_SILHOUETTE;
- display();
- break;
- case OPOINT:
- style = GLU_POINT;
- display();
- break;
- case INSIDE:
- orientacja = GLU_INSIDE;
- display();
- break;
- case OUTSIDE:
- orientacja = GLU_OUTSIDE;
- display();
- break;
- // wyjœcie
- case EXIT:
- exit (0);
- }
- reshape (glutGet (GLUT_WINDOW_WIDTH),glutGet (GLUT_WINDOW_HEIGHT));
- }
- //funkcja wywo³ywana podczas bezczynnoœci programu
- void idle()
- {
- // zmiana k¹ta obrotu wzglêdem osi X i Y
- rotatexy+= .05;
- }
- int main (int argc, char *argv[])
- {
- // inicjalizacja biblioteki GLUT
- glutInit (&argc,argv);
- // inicjalizacja bufora ramki
- glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
- // rozmiary g³ównego okna programu
- glutInitWindowSize (500,500);
- // utworzenie g³ównego okna programu
- glutCreateWindow ("Kwadryki");
- // do³¹czenie funkcji generuj¹cej scenê 3D
- glutDisplayFunc (display);
- // do³¹czenie funkcji wywo³ywanej przy zmianie rozmiaru okna
- glutReshapeFunc (reshape);
- // do³¹czenie funkcji obs³ugi klawiatury
- glutKeyboardFunc (keyboard);
- // do³¹czenie funkcji obs³ugi klawiszy funkcyjnych i klawiszy kursora
- glutSpecialFunc (specialKeys);
- //funkcja wywo³ywana podczas bezczynnoœci programu
- glutIdleFunc(idle);
- // utworzenie menu podrêcznego
- glutCreateMenu (menu);
- // utworzenie podmenu - obiekt
- int menuObject = glutCreateMenu (menu);
- glutAddMenuEntry ("Kula",SPHERE);
- glutAddMenuEntry ("Cylinder",CYLINDER);
- glutAddMenuEntry ("Dysk",DISK);
- glutAddMenuEntry ("Czesciowy dysk",PARTIAL_DISK);
- int menuNormal = glutCreateMenu (menu);
- /* utworzenie podmenu - Wektory normalne */
- glutAddMenuEntry ("NONE",NONE);
- glutAddMenuEntry ("FLAT",FLAT);
- glutAddMenuEntry ("SMOOTH",SMOOTH);
- int menuOrient = glutCreateMenu (menu);
- /* utworzenie podmenu - Orientacja */
- glutAddMenuEntry ("OUTSIDE",OUTSIDE);
- glutAddMenuEntry ("INSIDE",INSIDE);
- int menuStyle = glutCreateMenu (menu);
- /* utworzenie podmenu - Styl */
- glutAddMenuEntry ("FILL",FILL);
- glutAddMenuEntry ("LINE",LINE);
- glutAddMenuEntry ("SILHOUETTE",SILHOUETTE);
- glutAddMenuEntry ("POINT",OPOINT);
- // menu g³ówne
- glutCreateMenu (menu);
- glutAddSubMenu ("Obiekt",menuObject);
- glutAddSubMenu ("Normalne",menuNormal);
- glutAddSubMenu ("Orientacja",menuOrient);
- glutAddSubMenu ("Style",menuStyle);
- /* dodanie pozosta³ych podmenu */
- glutAddMenuEntry ("Wyjście",EXIT);
- // okreœlenie przycisku myszki obs³uguj¹cej menu podrêczne
- glutAttachMenu (GLUT_RIGHT_BUTTON);
- // wprowadzenie programu do obs³ugi pêtli komunikatów
- glutMainLoop ();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement