/* object.c */ /* E. Angel, Interactive Computer Graphics */ /* A Top-Down Approach with OpenGL, Third Edition */ /* Addison-Wesley Longman, 2003 */ /* displays various glu objects */ #include #include #include "bitmap.h" GLUquadricObj *obj; static GLfloat theta[] = {0.0,0.0,0.0}; static GLint axis = 2; static GLfloat trans[] = {0.0,0.0,1}; char *teapot_texture, *floor_texture; int widtht, heightt, widthf, heightf; void makeTexture(char *buffer, int width, int height) { glEnable(GL_TEXTURE_2D); glPixelStorei(GL_UNPACK_ALIGNMENT,1); glTexImage2D(GL_TEXTURE_2D,0,3,width,height,0, GL_RGB,GL_UNSIGNED_BYTE,buffer); glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP); glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP); glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST); glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST); //glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_DECAL); //glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE); glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_BLEND); } void display() { /* display callback, clear frame buffer and z buffer, rotate object and draw, swap buffers */ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glEnable(GL_DEPTH_TEST); glLoadIdentity(); glDisable(GL_TEXTURE_2D); gluLookAt(0, 0, 3.5, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); glTranslatef(trans[0], trans[1], 0); glScalef(trans[2], trans[2], trans[2]); glRotatef(theta[0], 1.0, 0.0, 0.0); glRotatef(theta[1], 0.0, 1.0, 0.0); glRotatef(theta[2], 0.0, 0.0, 1.0); //glScalef(1.2, 1.0, 0.8); /* glutWireIcosahedron();*/ /* glutWireDodecahedron();*/ // gluSphere(obj, 1.0, 12, 12); /* gluCylinder(obj, 1.0, 0.5, 1.0, 12, 12); */ glPushMatrix(); glRotatef(270, 1.0, 0, 0); glTranslatef(0, 0, -0.75); glColor3f(1.0, 1.0, 0.2); //makeTexture(floor_texture, widthf, heightf); gluDisk(obj, 0, 10.0, 20, 20); glPopMatrix(); /* gluPartialDisk( obj, 0.5, 1.0, 10, 10, 0.0, 45.0);*/ glColor3f(1.0, 0.5, 1.0); makeTexture(teapot_texture, widtht, heightt); glutSolidTeapot(1.0); //glutWireTorus(0.5, 1.0, 10, 10); /* glutWireCone(1.0, 1.0, 10, 10);*/ glutSwapBuffers(); } void spinObject() { /* Idle callback, spin cube 2 degrees about selected axis */ theta[axis] += 1.0; if( theta[axis] > 360.0 ) theta[axis] -= 360.0; glutPostRedisplay(); } void mouse(int btn, int state, int x, int y) { /* mouse callback, selects an axis about which to rotate */ if (state == GLUT_DOWN) glutIdleFunc(spinObject); else glutIdleFunc(NULL); switch (btn) { case GLUT_LEFT_BUTTON: axis = 0; break; case GLUT_MIDDLE_BUTTON: axis = 1; break; case GLUT_RIGHT_BUTTON: axis = 2; } } void myReshape(int w, int h) { glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(90.0, w/h, 2.0, 40.0); /* if (w<=h) glFrustum(-10.0, 10.0, -10.0 * (GLfloat) h/ (GLfloat) w, 10.0* (GLfloat) h / (GLfloat) w, -10.0, 20.0); else glFrustum(-10.0, 10.0, -10.0 * (GLfloat) w/ (GLfloat) h, 10.0* (GLfloat) w / (GLfloat) h, -10.0, 20.0); */ glMatrixMode(GL_MODELVIEW); } void key(int key, int x, int y) { switch (key) { case GLUT_KEY_LEFT: trans[0] -= 0.1; break; case GLUT_KEY_RIGHT: trans[0] += 0.1; break; case GLUT_KEY_UP: trans[1] += 0.1; break; case GLUT_KEY_DOWN: trans[1] -= 0.1; break; case GLUT_KEY_PAGE_UP: trans[2] += 0.1; break; case GLUT_KEY_PAGE_DOWN: trans[2] -= 0.1; } display(); } void myinit() { GLfloat mat_specular[]={1.0, 1.0, 1.0, 1.0}; GLfloat mat_diffuse[]={0.0, 0.0, 1.0, 1.0}; GLfloat mat_ambient[]={0.0, 0.5, 1.0, 1.0}; GLfloat mat_shininess={100.0}; GLfloat light_ambient[]={0.5, 0.5, 0.5, 1.0}; GLfloat light_diffuse[]={1.0, 1.0, 1.0, 1.0}; GLfloat light_specular[]={1.0, 1.0, 1.0, 1.0}; /* set up ambient, diffuse, and specular components for light 0 */ glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient); glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse); glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular); /* define material proerties for front face of all polygons */ //glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular); //glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient); //glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse); //glMaterialf(GL_FRONT, GL_SHININESS, mat_shininess); glShadeModel(GL_SMOOTH); /*enable smooth shading */ glEnable(GL_LIGHTING); /* enable lighting */ glEnable(GL_LIGHT0); /* enable light 0 */ glEnable(GL_DEPTH_TEST); /* enable z buffer */ glEnable(GL_COLOR_MATERIAL); glColorMaterial(GL_FRONT,GL_AMBIENT_AND_DIFFUSE); glClearColor (1.0, 1.0, 1.0, 1.0); glColor3f (1, 0.0, 0.0); LoadBitmap("tiles.bmp", teapot_texture, widtht, heightt); LoadBitmap("tiles.bmp", floor_texture, widthf, heightf); } int main(int argc, char **argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowSize(500, 500); glutCreateWindow("object"); myinit(); /* need both double buffering and z buffer */ glutReshapeFunc(myReshape); glutDisplayFunc(display); glutIdleFunc(NULL); glutMouseFunc(mouse); // glutKeyboardFunc(key); glutSpecialFunc(key); glClearColor(1.0, 1.0, 1.0, 1.0); glColor3f(1.0, 0.0, 0.0); obj = gluNewQuadric(); gluQuadricDrawStyle(obj, GLU_FILL); glutMainLoop(); }