/* environment mapping on a teapot */ #include #include #include #include #include struct point { float x; float y; float z; }; void setup_da_viewvol() { struct point eye; struct point view; struct point up; glEnable(GL_DEPTH_TEST); /* specify size and shape of view volume */ glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45.0,1.0,0.1,20.0); /* specify position for view volume */ glMatrixMode(GL_MODELVIEW); glLoadIdentity(); eye.x = 2.0; eye.y = 2.0; eye.z = 2.0; view.x = 0.0; view.y = 0.0; view.z = 0.0; up.x = 0.0; up.y = 1.0; up.z = 0.0; gluLookAt(eye.x,eye.y,eye.z,view.x,view.y,view.z,up.x,up.y,up.z); glClearColor(0.35,0.35,0.35,0.0); } void draw_stuff() { glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glBindTexture(GL_TEXTURE_2D,1); glEnable(GL_TEXTURE_2D); glutSolidTeapot(0.5); glDisable(GL_TEXTURE_2D); } void do_lights() { /* white light */ float light0_ambient[] = { 0.0, 0.0, 0.0, 0.0 }; float light0_diffuse[] = { 1.0, 1.0, 1.0, 0.0 }; float light0_specular[] = { 1.0, 1.0, 1.0, 0.0 }; float light0_position[] = { 1.5, 2.0, 2.0, 1.0 }; float light0_direction[] = { -1.5, -2.0, -2.0, 1.0}; /* turn off scene default ambient */ glLightModelfv(GL_LIGHT_MODEL_AMBIENT,light0_ambient); /* make specular correct for spots */ glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER,1); glLightfv(GL_LIGHT0,GL_AMBIENT,light0_ambient); glLightfv(GL_LIGHT0,GL_DIFFUSE,light0_diffuse); glLightfv(GL_LIGHT0,GL_SPECULAR,light0_specular); glLightf(GL_LIGHT0,GL_SPOT_EXPONENT,1.0); glLightf(GL_LIGHT0,GL_SPOT_CUTOFF,180.0); glLightf(GL_LIGHT0,GL_CONSTANT_ATTENUATION,0.5); glLightf(GL_LIGHT0,GL_LINEAR_ATTENUATION,0.1); glLightf(GL_LIGHT0,GL_QUADRATIC_ATTENUATION,0.01); glLightfv(GL_LIGHT0,GL_POSITION,light0_position); glLightfv(GL_LIGHT0,GL_SPOT_DIRECTION,light0_direction); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); } void do_material() { float mat_ambient[] = {0.0,0.0,0.0,1.0}; float mat_diffuse[] = {0.9,0.9,0.9,1.0}; float mat_specular[] = {1.0,1.0,1.0,1.0}; float mat_shininess[] = {2.0}; 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,mat_shininess); } void load_texture() { FILE *fopen(), *fptr; char buf[512]; int im_size, im_width, im_height, max_color; unsigned char *texture_bytes, *parse; /* load ppm file */ fptr=fopen("rt.ppm","r"); /* fptr=fopen("rtred.ppm","r"); */ fgets(buf,512,fptr); do{ fgets(buf,512,fptr); } while(buf[0]=='#'); parse = strtok(buf," "); im_width = atoi(parse); parse = strtok(NULL,"\n"); im_height = atoi(parse); fgets(buf,512,fptr); parse = strtok(buf," "); max_color = atoi(parse); im_size = im_width*im_height; texture_bytes = (unsigned char *)calloc(3,im_size); fread(texture_bytes,1,3*im_size,fptr); fclose(fptr); glBindTexture(GL_TEXTURE_2D,1); glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,im_width,im_height,0,GL_RGB, GL_UNSIGNED_BYTE,texture_bytes); glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST); glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST); glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE); glTexGeni(GL_S,GL_TEXTURE_GEN_MODE,GL_SPHERE_MAP); glTexGeni(GL_T,GL_TEXTURE_GEN_MODE,GL_SPHERE_MAP); glEnable(GL_TEXTURE_GEN_S); glEnable(GL_TEXTURE_GEN_T); cfree(texture_bytes); } void do_stuff() { load_texture(); setup_da_viewvol(); do_lights(); do_material(); while(1){ glRotatef(2.0,1.0,0.0,0.0); draw_stuff(); glutSwapBuffers(); } } int main() { glutInitDisplayMode(GLUT_RGBA|GLUT_DEPTH|GLUT_DOUBLE); glutInitWindowSize(512,512); glutInitWindowPosition(100,50); glutCreateWindow("my_cool_cube"); glutDisplayFunc(do_stuff); glutMainLoop(); return 0; }