/* Nev, ETR azonosito: */ #include #include #include #include // Define a constant for the value of PI #define GL_PI 3.1415f static int MenuID, IdleMenu; static int IdlePrint = 0; static GLfloat xRot = 0.0, yRot = 0.0; /* Teendok: - normalvektorok beallitasa - textura koordinatak beallitasa */ void CylinderApprox(int n, double radius, double height) { int i, j; GLfloat angle; GLdouble stack_step, stack_actual; if(n < 3) n = 3; glBegin(GL_QUAD_STRIP); for(i = 0, angle = 0.0; i <= n; i++, angle += 2.0 * GL_PI / n) { glVertex3f(radius * cos(angle), radius * sin(angle), height / 2.0); glVertex3f(radius * cos(angle), radius * sin(angle), -height / 2.0); } glEnd(); } /* Teendok: - normalvektor beallitasa - textura koordinatak beallitasa */ void Tabla() { glPushMatrix(); glTranslatef(0.0, 0.0, 1.0); glBegin(GL_TRIANGLES); glVertex3f(-6.0, -6.0, 0.0); glVertex3f(6.0, -6.0, 0.0); glVertex3f(0.0, 6.0, 0.0); glEnd(); glPopMatrix(); } // Called to draw scene void RenderScene(void) { GLfloat x,y, x2, y2, angle; // Storage for coordinates and angles int iPivot = 1; // Used to flag alternating colors int i; // Clear the window with current clearing color glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // >> Modellezo programresz glColor3f(1.0, 1.0, 1.0); glPushMatrix(); glRotatef(xRot, 1.0f, 0.0f, 0.0f); glRotatef(yRot, 0.0f, 1.0f, 0.0f); /* Tabla - Erre keruljon a korforgalom.bmp minta megfelelo resze kivagva. - Legyen 30%-ban atlatszo, ami ki/bekacsolhato az F1/F2-vel. */ glColor3f(1.0, 1.0, 1.0); glPushMatrix(); glTranslatef(0.0, 5.0, 0.0); Tabla(); glPopMatrix(); /* Tartooszlop Erre keruljon a metal_texture2 minta. */ glPushMatrix(); glTranslatef(0.0, -5.0, 0.0); glRotatef(90.0, 1.0, 0.0, 0.0); CylinderApprox(32, 0.8, 28.0); glPopMatrix(); glPopMatrix(); // << Modellezo programresz // Flush drawing commands glutSwapBuffers(); } // This function does any needed initialization on the rendering // context. void SetupRC() { // Black background glClearColor(0.0f, 0.0f, 0.0f, 1.0f ); glEnable(GL_DEPTH_TEST); } 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; // Refresh the Window glutPostRedisplay(); } void ChangeSizeOrtho(int w, int h) { GLfloat nRange = 25.0f; // Prevent a divide by zero if(h == 0) h = 1; // Set Viewport to window dimensions glViewport(0, 0, w, h); // Reset projection matrix stack glMatrixMode(GL_PROJECTION); glLoadIdentity(); // Establish clipping volume (left, right, bottom, top, near, far) 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); // Reset Model view matrix stack glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void ChangeSizePerspective(GLsizei w, GLsizei h) { GLfloat fAspect; // Prevent a divide by zero if(h == 0) h = 1; // Set Viewport to window dimensions glViewport(0, 0, w, h); fAspect = (GLfloat)w/(GLfloat)h; // Reset coordinate system glMatrixMode(GL_PROJECTION); glLoadIdentity(); // Produce the perspective projection gluPerspective(60.0f, // fovy fAspect, // aspect 10.0, // zNear 100.0 // zFar ); gluLookAt(0.0, 0.0, 50.0, // eye 0.0, 0.0, 0.0, // center 0.0, 1.0, 0.0 // up ); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void ProcessMenu(int value) { switch(value) { case 1: printf("1. menupont kivalasztva.\n"); break; case 2: printf("2. menupont kivalasztva.\n"); break; case 3: printf("Idle kiiratas bekapcsolva.\n"); IdlePrint = 1; break; case 4: printf("Idle kiiratas kikapcsolva.\n"); IdlePrint = 0; break; case 5: exit(0); default: break; } glutPostRedisplay(); } int main(int argc, char* argv[]) { // >> Inicializalas glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); //glutInitWindowSize(300, 300); glutCreateWindow("GLUT Alap"); // << Inicializalas // >> Callback fuggvenyek glutReshapeFunc(ChangeSizeOrtho); // Parhuzamos vetites //glutReshapeFunc(ChangeSizePerspective); // Perspektiv vetites glutSpecialFunc(SpecialKeys); glutDisplayFunc(RenderScene); // << Callback fuggvenyek // >> Menu IdleMenu = glutCreateMenu(ProcessMenu); glutAddMenuEntry("Idle kiiratas bekapcsolasa", 3); glutAddMenuEntry("Idle kiiratas kikapcsolasa", 4); MenuID = glutCreateMenu(ProcessMenu); glutAddMenuEntry("1. menupont", 1); glutAddMenuEntry("2. menupont", 2); glutAddSubMenu("Idle fuggveny", IdleMenu); glutAddMenuEntry("Kilepes", 5); glutAttachMenu(GLUT_RIGHT_BUTTON); // << Menu SetupRC(); glutMainLoop(); return 0; }