#include #include #include // Define a constant for the value of PI #define GL_PI 3.1415f static float orbitDegreeZ = 0.0f; static float orbitDegreeX = 0.0f; static float zoom = 1.0f; static float alfa_fold = 1.0f; static float alfa_hold = 3.0f; static float alfa_merkur = 3.0f; static float alfa_saturnus = 0.5; static float slant_x_saturnus = 20.0; static float slant_x_fold = 18.0; static GLfloat diffusePos[] = {0.0f, 0.0f, 0.0f, 1.0f}; //static GLfloat diffusePos[] = {0.0f, 0.0f, 0.0f, 1.0f}; static GLfloat diffuseLight[] = { 0.8f, 0.8f, 0.2f, 1.0f}; static GLfloat solarLight[] = { 0.0f, 1.0f, 0.0f, 1.0f}; static GLfloat moonLight[] = { 0.2f, 0.2f, 0.0f, 0.2f}; static GLfloat earthSpecular[] = { 0.5f, 0.5f, 0.5f, 1.0f}; GLint i = 0; void nap() { glPushMatrix(); glPushAttrib(GL_LIGHTING_BIT); //glDisable( GL_LIGHTING ); glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, solarLight); glLightfv(GL_LIGHT2, GL_POSITION, diffusePos); //glColor3f( 1.0f, 1.0f, 0.8f ); glutSolidSphere( 50, 30, 30 ); glPopAttrib(); glPopMatrix(); } void fold_hold() { glPushMatrix(); glRotatef(alfa_fold, 0.0f, 0.0f, 1.0f); // Fold glTranslatef( 300, 0.0f, 0.0f ); glRotatef( slant_x_fold, 1.0f, 0.0f, 0.0f ); glColor3f(0.3f, 0.3f, 1.0f); //glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 1.0f); //glMaterialf(GL_FRONT_AND_BACK, GL_SPECULAR, 1.0f); glPushMatrix(); glRotatef( 60.0f, 0.0f, 1.0f, 0.0f); glRotatef( alfa_hold, 0.0f, 0.0f, 1.0f ); glTranslatef( 45.0f, 0.0f, 0.0f ); glLightfv(GL_LIGHT2, GL_POSITION, diffusePos); glPopMatrix(); glutSolidSphere( 30, 30,30 ); glRotatef( 60.0f, 0.0f, 1.0f, 0.0f); glRotatef( alfa_hold, 0.0f, 0.0f, 1.0f ); glTranslatef( 45.0f, 0.0f, 0.0f ); glPushAttrib(GL_LIGHTING_BIT); //glDisable( GL_LIGHTING ); glMaterialfv(GL_FRONT, GL_EMISSION, moonLight); //glColor3f( 1.0f, 1.0f, 0.8f ); glColor3f( 0.4f, 0.4f, 0.4f ); glutSolidSphere( 10.0f, 30, 30 ); glPopAttrib(); glPopMatrix(); glPopMatrix(); } void merkur() { glPushMatrix(); glRotatef( alfa_merkur, 0.0f, 0.0f, 1.0f ); // Merkur glTranslatef(30.0f*cos(80*3.14/180), 30.0f*sin(80*3.14/180), 0.0f ); glColor3f( 8.0f, 0.1f, 0.0f ); glutSolidSphere( 15, 30,30 ); glPopMatrix(); } // Called to draw scene void RenderScene(void) { int j = 0; // Clear the window with current clearing color glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glEnable(GL_LIGHTING); glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuseLight); glLightfv(GL_LIGHT1, GL_POSITION, diffusePos); glEnable(GL_LIGHT1); glLightfv(GL_LIGHT2, GL_DIFFUSE, diffuseLight); glEnable(GL_LIGHT2); glEnable(GL_COLOR_MATERIAL); // Front material ambient and diffuse colors track glColor glEnable(GL_NORMALIZE); glPushMatrix(); glRotatef(-50.0 + orbitDegreeX, 1.0f, 0.0f, 0.0f); glRotatef(orbitDegreeZ, 0.0f,0.0f,1.0f); nap(); fold_hold(); glPopMatrix(); // Flush drawing commands glutSwapBuffers(); } // This function does any needed initialization on the rendering // context. void SetupRC() { glClearColor(0.0f, 0.0f, 0.0f, 1.0f ); glEnable(GL_DEPTH_TEST); glFrontFace(GL_CCW); glEnable(GL_CULL_FACE); glEnable(GL_COLOR_MATERIAL); glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE); } void Timer(int value) { alfa_fold += 1.0f; if ( alfa_fold == 360.0f ) alfa_fold = 0.0f; alfa_hold += 3.0f; if ( alfa_hold == 360.0f ) alfa_hold = 0.0f; glutPostRedisplay(); glutTimerFunc(50, Timer, value + 1); } void Idle() { glutPostRedisplay(); } void ChangeSizeOrtho(int w, int h) { //GLfloat nRange = 25.0f; //GLfloat nRange = 30.0f; GLfloat nRange = 380.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 SpecialKeys(int key, int x, int y) { if (key == GLUT_KEY_UP ) { orbitDegreeX += 1.0f; } if (key == GLUT_KEY_DOWN ) { orbitDegreeX -= 1.0f; } if (key == GLUT_KEY_LEFT ) { orbitDegreeZ -= 1.0f; } if (key == GLUT_KEY_RIGHT) { orbitDegreeZ += 1.0f; } if ( orbitDegreeX > 80.0f ) orbitDegreeX = 80.0f; if ( orbitDegreeX < -50.0f ) orbitDegreeX = -50.0f; if (orbitDegreeZ <= 360.0f) orbitDegreeZ -= 360.0f; if (orbitDegreeZ < 0.0f) orbitDegreeZ = 360.0f - orbitDegreeZ; 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); //glutKeyboardFunc(Keyboard); //glutKeyboardFunc(Keyboard); glutDisplayFunc(RenderScene); glutTimerFunc(1000, Timer, 1); // 1 mp mulva meghivodik a Timer() fuggveny glutIdleFunc(Idle); // Idle(), ha nem tortenik semmi // << Callback fuggvenyek SetupRC(); glutMainLoop(); return 0; }