#define GLUT_DISABLE_ATEXIT_HACK
#if defined(__APPLE__)
#include <GLUT/glut.h>
#else
#include <gl/glaux.h>
#include "GL/glut.h"
#endif
const int width = 800;
const int height = 600;
GLfloat cubic_size = 1.0f;
GLfloat xRotation = 0.0f, yRotation = 0.0f;
const GLfloat rotSpeed = 64.0;
bool bLButtonDown = false;
GLint lastLx, lastLy;
GLuint iTexture[]={0,0,0,0,0,0};
const GLfloat lightAmbient[] = {0.5f, 0.5f, 0.5f, 1.0f};
const GLfloat lightDiffuse[] = {1.0f, 1.0f, 1.0f, 1.0f};
const GLfloat lightSpecular[] = {1.0f, 1.0f, 1.0f, 1.0f};
const GLfloat lightPosition[] = {1.0f, 1.0f, 2.0f, 1.0f};
const GLfloat MatAmbient[] = {0.192250, 0.192250, 0.192250, 1.000000};//环境反射
const GLfloat MatDiffuse[] = {0.507540, 0.507540, 0.507540, 1.000000};//漫反射
const GLfloat MatSpecular[] = {0.508273, 0.508273, 0.508273, 1.000000};//镜面反射
const GLfloat MatShineness = 21.200001;
// need to define if gl.h version < 1.2.
#ifndef GL_LIGHT_MODEL_COLOR_CONTROL
#define GL_LIGHT_MODEL_COLOR_CONTROL 0x81F8
#endif
#ifndef GL_SEPARATE_SPECULAR_COLOR
#define GL_SEPARATE_SPECULAR_COLOR 0x81FA
#endif
void init()
{
glEnable(GL_DEPTH_TEST); // Enables Depth Testing
glDepthFunc(GL_LEQUAL); // The Type Of Depth Testing To Do
// set the texture
AUX_RGBImageRec *image[6];
image[0] = auxDIBImageLoad("woodbox.bmp");
image[1] = auxDIBImageLoad("pattern.bmp");
image[2] = auxDIBImageLoad("hrt-stone.bmp");
image[3] = auxDIBImageLoad("stone.bmp");
image[4] = auxDIBImageLoad("diamond_plate_texture.bmp");
image[5] = auxDIBImageLoad("gray.bmp");
for(int i=0; i<6;i++)
{
if (image[6] != NULL) {
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glGenTextures(6, &iTexture[i]);
glBindTexture(GL_TEXTURE_2D, iTexture[i]);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, image[i]->sizeX, image[i]->sizeY, 0,
GL_RGB, GL_UNSIGNED_BYTE, image[i]->data);
//glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
glEnable(GL_TEXTURE_2D);
free(image[i]->data);
free(image[i]);
}
}
glEnable(GL_LIGHT0);
glLightfv(GL_LIGHT0, GL_AMBIENT, lightAmbient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, lightDiffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, lightSpecular);
glLightfv(GL_LIGHT0, GL_POSITION, lightPosition);
glMaterialfv(GL_FRONT, GL_AMBIENT, MatAmbient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, MatDiffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, MatSpecular);
glMaterialf(GL_FRONT, GL_SHININESS, MatShineness);
glEnable(GL_LIGHTING);
glEnable(GL_NORMALIZE);
glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SEPARATE_SPECULAR_COLOR);
}
/* Draw the window - this is where all the GL actions are */
void
display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glRotatef(xRotation, 1.0f, 0.0f, 0.0f);
glRotatef(yRotation, 0.0f, 1.0f, 0.0f);
glBindTexture(GL_TEXTURE_2D, iTexture[0]);
glBegin(GL_QUADS);
// 1st quad (front)
glColor3ub(255, 255, 0);
glNormal3f(0.0f, 0.0f, 1.0f);
glTexCoord2f(0.0f, 1.0f);
glVertex3f(-cubic_size, cubic_size, cubic_size);
glTexCoord2f(0.0f, 0.0f);
glVertex3f(-cubic_size, -cubic_size, cubic_size);
glTexCoord2f(1.0f, 0.0f);
glVertex3f(cubic_size, -cubic_size, cubic_size);
glTexCoord2f(1.0f, 1.0f);
glVertex3f(cubic_size, cubic_size, cubic_size);
glEnd();
glBindTexture(GL_TEXTURE_2D, iTexture[1]);
glBegin(GL_QUADS);
// 2nd quad (right)
glColor3ub(0, 255, 255);
glNormal3f(1.0f, 0.0f, 0.0f);
glTexCoord2f(0.0f, 0.0f);
glVertex3f(cubic_size, cubic_size, cubic_size);
glTexCoord2f(0.0f, 1.0f);
glVertex3f(cubic_size, -cubic_size, cubic_size);
glTexCoord2f(1.0f, 1.0f);
glVertex3f(cubic_size, -cubic_size, -cubic_size);
glTexCoord2f(1.0f, 0.0f);
glVertex3f(cubic_size, cubic_size, -cubic_size);
glEnd();
glBindTexture(GL_TEXTURE_2D, iTexture[2]);
glBegin(GL_QUADS);
// 3rd quad (back)
glColor3ub(255, 0, 255);
glNormal3f(0.0f, 0.0f, -1.0f);
glTexCoord2f(0.0f, 0.0f);
glVertex3f(cubic_size, cubic_size, -cubic_size);
glTexCoord2f(0.0f, 1.0f);
glVertex3f(cubic_size, -cubic_size, -cubic_size);
glTexCoord2f(1.0f, 1.0f);
glVertex3f(-cubic_size, -cubic_size, -cubic_size);
glTexCoord2f(1.0f, 0.0f);
glVertex3f(-cubic_size, cubic_size, -cubic_size);
glEnd();
glBindTexture(GL_TEXTURE_2D, iTexture[3]);
glBegin(GL_QUADS);
// 4th quad (left)
glColor3ub(0, 0, 255);
glNormal3f(-1.0f, 0.0f, 0.0f);
glTexCoord2f(0.0f, 0.0f);
glVertex3f(-cubic_size, cubic_size, -cubic_size);
glTexCoord2f(0.0f, 1.0f);
glVertex3f(-cubic_size, -cubic_size, -cubic_size);
glTexCoord2f(1.0f, 1.0f);
glVertex3f(-cubic_size, -cubic_size, cubic_size);
glTexCoord2f(1.0f, 0.0f);
glVertex3f(-cubic_size, cubic_size, cubic_size);
glEnd();
glBindTexture(GL_TEXTURE_2D, iTexture[4]);
glBegin(GL_QUADS);
// 5th quad (bottom)
glColor3ub(0, 255, 0);
glNormal3f(0.0f, -1.0f, 0.0f);
glTexCoord2f(0.0f, 0.0f);
glVertex3f(-cubic_size, -cubic_size, cubic_size);
glTexCoord2f(0.0f, 1.0f);
glVertex3f(-cubic_size, -cubic_size, -cubic_size);
glTexCoord2f(1.0f, 1.0f);
glVertex3f(cubic_size, -cubic_size, -cubic_size);
glTexCoord2f(1.0f, 0.0f);
glVertex3f(cubic_size, -cubic_size, cubic_size);
glEnd();
glBindTexture(GL_TEXTURE_2D, iTexture[5]);
glBegin(GL_QUADS);
// 6th quad (top)
glColor3ub(255, 0, 0);
glNormal3f(0.0f, 1.0f, 0.0f);
glTexCoord2f(0.0f, 0.0f);
glVertex3f(cubic_size, cubic_size, cubic_size);
glTexCoord2f(0.0f, 1.0f);
glVertex3f(cubic_size, cubic_size, -cubic_size);
glTexCoord2f(1.0f, 1.0f);
glVertex3f(-cubic_size, cubic_size, -cubic_size);
glTexCoord2f(1.0f, 0.0f);
glVertex3f(-cubic_size, cubic_size, cubic_size);
glEnd();
glPopMatrix();
glFlush();
}
void
reshape(int w, int h)
{
glViewport(0, 0, w, h);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0.0, 0.0, 10.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
GLdouble aspect = (GLdouble) w / (GLdouble) h;
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(22.5, aspect, 0.1, 100.0);
}
void mouse(int button, int state, int x, int y)
{
switch (button) {
case GLUT_LEFT_BUTTON:
lastLx = x;
lastLy = y;
bLButtonDown = state == GLUT_DOWN;
break;
case GLUT_MIDDLE_BUTTON:
break;
case GLUT_RIGHT_BUTTON:
break;
default:
break;
}
}
void motion(int x, int y)
{
if (bLButtonDown) {
yRotation -= (GLfloat) (lastLx - x) / rotSpeed;
xRotation -= (GLfloat) (lastLy - y) / rotSpeed;
}
glutPostRedisplay();
}
int
main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA);
glutInitWindowSize((int) width, (int) height);
glutCreateWindow(argv[0]);
init();
glutReshapeFunc(reshape);
glutDisplayFunc(display);
glutMouseFunc(mouse);
glutMotionFunc(motion);
glutMainLoop();
return 0;
}