Ejemplo n.º 1
0
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();
}
Ejemplo n.º 2
0
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 );
}