#include #include // A vertex has 3D coordinates vertex.x, vertex.y, and vertex.z, // normal vertex.nx, vertex.ny, and vertex.nz, and color // vertex.R, vertex.G, vertex.B typedef struct { float x, y, z; float nx, ny, nz; float R, G, B; } vertex; typedef struct{ vertex* v1; vertex* v2; vertex* v3; } triangle; int numtriangles=0; triangle* tri; int numvertices=0; vertex* vert; int lastx,lasty; int xchange,ychange; float spin=0.0; float spinup = 0.0; void YourCode(void); // Note: bluelevel should be between 0 and 1. It tells how far toward // the blue end of the red->blue range it should be. bluelevel=1.0 means // totally blue, bluelevel=0.0 means totally red. void set(vertex& V, const float x, const float y, const float z, const float nx, const float ny, const float nz, const float bluelevel) { V.x = x; V.y = y; V.z = z; V.nx = nx; V.ny = ny; V.nz = nz; V.R = 1.0-bluelevel; V.G = 0.0; V.B = bluelevel; } void setposition(vertex& V, const float x, const float y, const float z) { V.x = x; V.y = y; V.z = z; } void setnormal(vertex& V, const float nx, const float ny, const float nz) { V.nx = nx; V.ny = ny; V.nz = nz; } void setcolor (vertex& V, const float bluelevel) { V.R = 1.0-bluelevel; V.G = 0.0; V.B = bluelevel; } void display(void) { int i; glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glPushMatrix(); glRotatef(spinup, 1.0, 0.0, 0.0); glRotatef(spin, 0.0, 1.0, 0.0); glEnable(GL_COLOR_MATERIAL); glColorMaterial(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE); glBegin(GL_TRIANGLES); for(i=0;iR,tri[i].v1->G,tri[i].v1->B); glVertex3f(tri[i].v1->x,tri[i].v1->y,tri[i].v1->z); glNormal3f(tri[i].v1->nx,tri[i].v1->ny,tri[i].v1->z); glColor3f(tri[i].v2->R,tri[i].v2->G,tri[i].v2->B); glVertex3f(tri[i].v2->x,tri[i].v2->y,tri[i].v2->z); glNormal3f(tri[i].v2->nx,tri[i].v2->ny,tri[i].v2->z); glColor3f(tri[i].v3->R,tri[i].v3->G,tri[i].v3->B); glVertex3f(tri[i].v3->x,tri[i].v3->y,tri[i].v3->z); glNormal3f(tri[i].v3->nx,tri[i].v3->ny,tri[i].v3->z); } glEnd(); // Draw Axes glColor3f(1.0, 1.0, 1.0); glBegin(GL_LINES); // X-axis glVertex3f(0.0,0.0,0.0); glVertex3f(0.2,0.0,0.0); glVertex3f(0.22,0.0,0.0); glVertex3f(0.32,0.1,0.0); glVertex3f(0.22,0.1,0.0); glVertex3f(0.32,0.0,0.0); // Y-axis glVertex3f(0.0,0.0,0.0); glVertex3f(0.0,0.2,0.0); glVertex3f(0.0,0.22,0.0); glVertex3f(0.0,0.27,0.0); glVertex3f(0.0,0.27,0.0); glVertex3f(0.05,0.32,0.0); glVertex3f(0.0,0.27,0.0); glVertex3f(-0.05,0.32,0.0); // Z-axis glVertex3f(0.0,0.0,0.0); glVertex3f(0.0,0.0,0.2); glVertex3f(0.0,0.1,0.32); glVertex3f(0.0,0.1,0.22); glVertex3f(0.0,0.1,0.22); glVertex3f(0.0,0.0,0.32); glVertex3f(0.0,0.0,0.32); glVertex3f(0.0,0.0,0.22); glEnd(); glPopMatrix(); glutSwapBuffers(); } void init(void) { glClearColor(0.0, 0.0, 0.0, 0.0); glShadeModel(GL_SMOOTH); glEnable(GL_DEPTH_TEST); glEnable(GL_NORMALIZE); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-1.75, 1.75, -1.75, 1.75, -0.2, 4.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0.0, 0.0, 2.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); glEnable(GL_LIGHTING); glLightf(GL_LIGHT0, GL_POSITION, (2.0, 2.0, 1.0)); glLightf(GL_LIGHT0, GL_DIFFUSE, (0.5, 0.5, 0.5, 1.0)); glLightf(GL_LIGHT0, GL_AMBIENT, (0.5, 0.5, 0.5, 1.0)); glLightf(GL_LIGHT1, GL_POSITION, (-2.0, 2.0, 2.0)); glLightf(GL_LIGHT1, GL_DIFFUSE, (0.5, 0.5, 0.5, 1.0)); glLightf(GL_LIGHT2, GL_POSITION, (2.0, -2.0, 2.0)); glLightf(GL_LIGHT2, GL_DIFFUSE, (0.5, 0.5, 0.5, 1.0)); glLightf(GL_LIGHT3, GL_POSITION, (-2.0, -2.0, 2.0)); glLightf(GL_LIGHT3, GL_DIFFUSE, (0.5, 0.5, 0.5, 1.0)); glEnable(GL_LIGHT0); glEnable(GL_LIGHT1); glEnable(GL_LIGHT2); glEnable(GL_LIGHT3); glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE); } void rotateview(void) { spin += xchange/80.0; if (spin >= 360.0) spin -= 360.0; if (spin < 0.0) spin += 360.0; spinup -= ychange/80.0; if (spinup > 89.0) spinup = 89.0; if (spinup < -89.0) spinup = -89.0; glutPostRedisplay(); } void mouse(int button, int state, int x, int y) { switch(button) { case GLUT_LEFT_BUTTON: if (state==GLUT_DOWN) { lastx = x; lasty = y; xchange = 0; ychange = 0; glutIdleFunc(rotateview); } else if (state==GLUT_UP) { xchange = 0; ychange = 0; glutIdleFunc(NULL); } break; default: break; } } void motion(int x, int y) { xchange = x-lastx; ychange = y-lasty; } void YourCode(void) { // Your Code Here. Some sample code is given. tri = new triangle[3]; numtriangles=3; numvertices=9; vert = new vertex[9]; tri[0].v1 = &vert[0]; tri[0].v2 = &vert[1]; tri[0].v3 = &vert[2]; tri[1].v1 = &vert[3]; tri[1].v2 = &vert[4]; tri[1].v3 = &vert[5]; tri[2].v1 = &vert[6]; tri[2].v2 = &vert[7]; tri[2].v3 = &vert[8]; set(vert[0], 0.0,0.0,0.0, 0.0,1.0,0.0, 1.0); set(vert[1], 0.5,0.0,0.0, 0.0,1.0,0.0, 0.0); set(vert[2], 0.25,0.0,0.5, 0.0,1.0,0.0, 0.5); set(vert[3], 0.0,0.0,0.0, 0.0,1.0,-1.0, 1.0); set(vert[4], -0.5,0.0,0.0, 0.0,1.0,-1.0, 1.0); set(vert[5], -0.25,0.0,0.5, 0.0,1.0,1.0, 1.0); set(vert[6], 0.0,0.0,0.0, 0.0,1.0,1.0, 0.0); set(vert[7], 0.5,-0.5,0.0, 0.0,-1.0,1.0, 1.0); set(vert[8], -0.5,-0.5,0.0, 0.0,-1.0,1.0, 1.0); } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH); glutInitWindowSize(500, 500); glutInitWindowPosition(100, 100); glutCreateWindow("CPSC 645 HW2 - "); init(); glutDisplayFunc(display); glutMouseFunc(mouse); glutMotionFunc(motion); glutIdleFunc(NULL); YourCode(); glutMainLoop(); return 0; }