#include #include #include #include "Renderer.hpp" #include "trimodel.hpp" // MOUSE INTERFACE STUFF int LeftButtonDown=0; int RightButtonDown=0; int OldX,OldY,NewX,NewY; float Elevation=0; float Azimuth=0; float Dist=3; // Renderer GLOBALS int WW=640, WH=480; int numRenderStates = 1; Renderer NPR; TriModel *TM=NULL; int UseNPR = 1; int BackfaceCullingOn=0; int UseSmoothInterpolation=0; int TestPlaneOn=0; int ModelOn=1; void myDisplay_NPR() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(30,(float)WW/WH,0.5f,10); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0,0,Dist, 0,0,0, 0,1,0); glRotatef(Elevation,1,0,0); glRotatef(Azimuth,0,1,0); if (TM && ModelOn) { NPR.Begin(); for (int i=0; iNumTris; i++) { NPR.RenderTriangle(TM->Tris[i]); } NPR.End(); } if (TestPlaneOn) { glNormal3f(0,0,1); glBegin(GL_POLYGON); glColor3f(1,0,0); glVertex3f(1,1,0); glColor3f(0,1,0); glVertex3f(-1,1,0); glColor3f(0,0,1); glVertex3f(-1,-1,0); glColor3f(1,1,1); glVertex3f(1,-1,0); glEnd(); } glutSwapBuffers(); } void myDisplay_OpenGL() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(30,(float)WW/WH,0.5f,10); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0,0,Dist, 0,0,0, 0,1,0); glRotatef(Elevation,1,0,0); glRotatef(Azimuth,0,1,0); if (TM && ModelOn) { glBegin(GL_TRIANGLES); for (int i=0; iNumTris; i++) { glColor3ubv(TM->Tris[i].Color); glNormal3fv(TM->Tris[i].N); glVertex3fv(TM->Tris[i].A); glVertex3fv(TM->Tris[i].B); glVertex3fv(TM->Tris[i].C); } glEnd(); } if (TestPlaneOn) { glNormal3f(0,0,1); glBegin(GL_POLYGON); glColor3f(1,0,0); glVertex3f(1,1,0); glColor3f(0,1,0); glVertex3f(-1,1,0); glColor3f(0,0,1); glVertex3f(-1,-1,0); glColor3f(1,1,1); glVertex3f(1,-1,0); glEnd(); } glutSwapBuffers(); } void myReshape(int w, int h) { glutReshapeWindow(WW,WH); } void myIdle() { glutPostRedisplay(); } void myMouseFunc(int button, int state, int x, int y) { NewX=x; NewY=y; if (button==GLUT_LEFT_BUTTON) LeftButtonDown=!LeftButtonDown; } void myMotionFunc(int x, int y) { OldX=NewX; OldY=NewY; NewX=x; NewY=y; float RelX = (NewX-OldX) / (float)glutGet((GLenum)GLUT_WINDOW_WIDTH); float RelY = (NewY-OldY) / (float)glutGet((GLenum)GLUT_WINDOW_HEIGHT); if (LeftButtonDown) { Azimuth += (RelX*180); Elevation += (RelY*180); } } void myKeyboard(unsigned char Key, int x, int y) { switch(Key) { case 27: exit(0); case ' ': UseNPR=!UseNPR; if (UseNPR) { glutDisplayFunc(myDisplay_NPR); printf("Non-Photorealistic\n"); } else { glutDisplayFunc(myDisplay_OpenGL); printf("OpenGL\n"); } break; case ',': Dist-=0.1f; break; case '.': Dist+=0.1f; break; case 'b': BackfaceCullingOn=!BackfaceCullingOn; if (BackfaceCullingOn) { glEnable(GL_CULL_FACE);} else { glDisable(GL_CULL_FACE);} break; case 's': UseSmoothInterpolation=!UseSmoothInterpolation; if (UseSmoothInterpolation) { glShadeModel(GL_SMOOTH);} else { glShadeModel(GL_FLAT);} break; case 'p': TestPlaneOn=!TestPlaneOn; break; case 'm': ModelOn=!ModelOn; break; }; } void main(void) { // TM = new TriModel("teapot.tri",255,128,128); TM = new TriModel("tie.tri"); // TM = new TriModel("onetri.tri"); if (TM) TM->Normalize(); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowSize(WW,WH); glutInitWindowPosition(180,100); glutCreateWindow("SoftGL"); NPR.Initialize("grey.npr"); if (UseSmoothInterpolation) { glShadeModel(GL_SMOOTH); } else { glShadeModel(GL_FLAT);} glutDisplayFunc(myDisplay_NPR); glutReshapeFunc(myReshape); glutIdleFunc(myIdle); glutMouseFunc(myMouseFunc); glutMotionFunc(myMotionFunc); glutKeyboardFunc(myKeyboard); glViewport(0,0,WW,WH); glEnable(GL_DEPTH_TEST); glutMainLoop(); }