/* Simple Solar system An example of attenuation. The light is in the position of viewer (C) Bedrich Benes 2003 */ #include #include #include #define K 0.01 GLfloat c=1,l,q; void Init(void) { GLfloat light_position[] = {0, 0, 1, 1.0}; GLfloat specular[] = {1, 1, 1, 1}; GLfloat diffuse[] = {1, 1, 1, 1}; glClearColor(0.1,0.1,0.1,1.0); glClearDepth(10000000); /* Set up Lighting */ glLightfv(GL_LIGHT0, GL_POSITION, light_position); glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse); glLightfv(GL_LIGHT0, GL_SPECULAR, specular); glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, c); glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, l); glLightf(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, q); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glDepthFunc(GL_LESS); glEnable(GL_DEPTH_TEST); glShadeModel(GL_SMOOTH); printf("Attenuation test. Usage\nc,C constant term\n"); printf("l,L linear term\n"); printf("q,Q quadratic term\n"); } void Display(void) { } void Idle(void) { GLfloat sunSpec[] = {1, 1, 0, 1.0}; GLfloat sunDiff[] = {1, 1, 0, 1.0}; GLfloat sunShi[] = {50.0}; GLfloat earthSpec[] = {0, 0.5, 1, 1.0}; GLfloat earthDiff[] = {0, 0.5, 1, 1.0}; GLfloat earthShi[] = {50.0}; GLfloat moonSpec[] = {1, 1, 1, 1.0}; GLfloat moonDiff[] = {0.5, 0.5, 0.5, 1.0}; GLfloat moonShi[] = {50.0}; static GLfloat time; glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glPushMatrix(); glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, sunSpec); glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, sunDiff); glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, sunShi); glutSolidSphere(0.7,20,20); glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, earthSpec); glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, earthDiff); glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, earthShi); glColor3ub(0,255,0); //Earth glRotatef(time/180, 0, 1, 0); glTranslatef(2,0,0); glRotatef(time/10.f,0.0,1.0,0.0); glutSolidSphere(0.2,10,8); glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, moonSpec); glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, moonDiff); glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, moonShi); glRotatef(-time/10.f,0.0,1.0,0.0); glRotatef(15,1,0.0,0.0); glRotatef(time/28,0.0,1.0,0.0); glTranslatef(1,0,0); //Moon glRotatef(time/28,0.0,1.0,0.0); glColor3ub(0,255,255); glutWireTeapot(0.1); glPopMatrix(); time +=150; glutSwapBuffers(); } void Reshape (int w, int h) { glViewport (0, 0, (GLsizei) w, (GLsizei) h); glMatrixMode (GL_PROJECTION); glLoadIdentity (); gluPerspective(60.0, (GLfloat) w/(GLfloat) h, 1.0, 20.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0.0,0.0,5.0,0.0,0.0,0.0,0.0,1.0,0.0); } void Kbd(unsigned char key, int x, int y) { switch (key){ case 27: exit(0);break; case 'c': c-=K;break; case 'C': c+=K;break; case 'l': l-=K;break; case 'L': l+=K;break; case 'q': q-=K;break; case 'Q': q+=K;break; } if (q<0) q=0; if (l<0) l=0; if (c<0) c=0; glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, c); glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, l); glLightf(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, q); printf("Attenuation c=%f l=%f, q=%f\n",c,l,q); } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH); glutInitWindowSize(500,500); glutInitWindowPosition(100,100); glutCreateWindow("Attenuation"); glutDisplayFunc(Display); glutIdleFunc(Idle); glutReshapeFunc(Reshape); glutKeyboardFunc(Kbd); Init(); glutMainLoop(); return 0; }