void ShowViewport() { glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH ); if (glutGet(GLUT_SCREEN_WIDTH) > 0 && glutGet(GLUT_SCREEN_HEIGHT) > 0){ glutInitWindowPosition( (glutGet(GLUT_SCREEN_WIDTH) - camera.imgWidth)/2, (glutGet(GLUT_SCREEN_HEIGHT) - camera.imgHeight)/2 ); } else glutInitWindowPosition( 50, 50 ); glutInitWindowSize(camera.imgWidth, camera.imgHeight); glutCreateWindow("Ray Tracer - CS 6620"); glutDisplayFunc(GlutDisplay); glutReshapeFunc(GlutReshape); glutIdleFunc(GlutIdle); glutKeyboardFunc(GlutKeyboard); glutMouseFunc(GlutMouse); glutMotionFunc(GlutMotion); Color bg = background.GetColor(); glClearColor(bg.r,bg.g,bg.b,0); glPointSize(3.0); glEnable( GL_CULL_FACE ); float zero[] = {0,0,0,0}; glLightModelfv( GL_LIGHT_MODEL_AMBIENT, zero ); glEnable(GL_NORMALIZE); glLineWidth(2); if ( camera.dof > 0 ) { dofBuffer = new Color24[ camera.imgWidth * camera.imgHeight ]; dofImage = new Color[ camera.imgWidth * camera.imgHeight ]; memset( dofImage, 0, camera.imgWidth * camera.imgHeight * sizeof(Color) ); } glutMainLoop(); }
void DrawScene() { glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT ); const TextureMap *bgMap = background.GetTexture(); if ( bgMap ) { glDepthMask(GL_FALSE); glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); glMatrixMode(GL_MODELVIEW); Color c = background.GetColor(); glColor3f(c.r,c.g,c.b); if ( bgMap->SetViewportTexture() ) { glEnable( GL_TEXTURE_2D ); glMatrixMode( GL_TEXTURE ); Matrix3 tm = bgMap->GetInverseTransform(); Point3 p = tm * bgMap->GetPosition(); float m[16] = { tm[0],tm[1],tm[2],0, tm[3],tm[4],tm[5],0, tm[6],tm[7],tm[8],0, -p.x,-p.y,-p.z,1 }; glLoadMatrixf( m ); glMatrixMode( GL_MODELVIEW ); } else { glDisable( GL_TEXTURE_2D ); } glBegin(GL_QUADS); glTexCoord2f(0,1); glVertex2f(-1,-1); glTexCoord2f(1,1); glVertex2f( 1,-1); glTexCoord2f(1,0); glVertex2f( 1, 1); glTexCoord2f(0,0); glVertex2f(-1, 1); glEnd(); glMatrixMode(GL_PROJECTION); glPopMatrix(); glMatrixMode(GL_MODELVIEW); glDepthMask(GL_TRUE); glDisable( GL_TEXTURE_2D ); } glEnable( GL_LIGHTING ); glEnable( GL_DEPTH_TEST ); glPushMatrix(); Point3 p = camera.pos; Point3 t = camera.pos + camera.dir*camera.focaldist; Point3 u = camera.up; if ( camera.dof > 0 ) { Point3 v = camera.dir ^ camera.up; float r = sqrtf(float(rand())/RAND_MAX)*camera.dof; float a = M_PI * 2.0f * float(rand())/RAND_MAX; p += r*cosf(a)*v + r*sinf(a)*u; } gluLookAt( p.x, p.y, p.z, t.x, t.y, t.z, u.x, u.y, u.z ); glRotatef( viewAngle1, 1, 0, 0 ); glRotatef( viewAngle2, 0, 0, 1 ); if ( lights.size() > 0 ) { for ( unsigned int i=0; i<lights.size(); i++ ) { lights[i]->SetViewportLight(i); } } else { float white[] = {1,1,1,1}; float black[] = {0,0,0,0}; Point4 p(camera.pos, 1); glEnable ( GL_LIGHT0 ); glLightfv( GL_LIGHT0, GL_AMBIENT, black ); glLightfv( GL_LIGHT0, GL_DIFFUSE, white ); glLightfv( GL_LIGHT0, GL_SPECULAR, white ); glLightfv( GL_LIGHT0, GL_POSITION, &p.x ); } DrawNode(&rootNode); glPopMatrix(); glDisable( GL_DEPTH_TEST ); glDisable( GL_LIGHTING ); glDisable( GL_TEXTURE_2D ); }