Example #1
0
void keyboardCallback(unsigned char key, int x, int y)
{
    if(key == '1')
    {
        cout << "Composing and rendering scene 1..." << endl;

        scene scene1;
        scene1.voidcolor() = fvec("0 0 0 1");

        // Set up the viewport
        viewport view(vec("-15 0 10"),
                  vec("1 0 -0.2"),
                  vec("0 0 1"),
                  math::pi()/3.0,
                  math::pi()/3.0);
        scene1.viewports().insert(&view);
        
        // Insert an ellipsoid

        material_phong ellipse_mat(fvec("0.7 0 0.7"),
                                   fvec("0.7 0 0.7"),
                                   3.0,
                                   0.0,
                                   0.0,
                                   4.0);

        sphere ellipse_base(vec("0 0 0"),
                            1.0);
        set<renderable*> ellipse_children;
        ellipse_children.insert(&ellipse_base);
        affine_renderable ellipse(vec("0 0 1"),
                                  1.0,
                                  vec("1 2 3"),
                                  vec("5 -1 5"),
                                  ellipse_children);

        scene1.renderables().insert(&ellipse);
        scene1.materials()[&ellipse_base] = &ellipse_mat;

        // Insert a sphere
        
        sphere sphere_a(vec("5 2 10"),
                        2.0);
        
        material_phong sphere_a_mat(fvec("0 0.5 0.5"),
                                    fvec("0 0.5 0.5"),
                                    10.0,
                                    0.0,
                                    0.0,
                                    4.0);
        
        scene1.renderables().insert(&sphere_a);
        scene1.materials()[&sphere_a] = &sphere_a_mat;

        // Insert a plane
        
        infinite_plane plane_a(vec("0 0 0"),
                               vec("0 0 1"));

        material_phong plane_a_mat(fvec("0.2 0.7 0.1"),
                                   fvec("0.2 0.7 0.1"),
                                   12.0,
                                   0.0,
                                   0.0,
                                   3.0);
        
        scene1.renderables().insert(&plane_a);
        scene1.materials()[&plane_a] = &plane_a_mat;

        // Insert lights
        pointlight light_a(fvec("1 1 1"),
                           vec("5 3 20"));
        scene1.lights().insert(&light_a);

        pointlight light_b(fvec("1 1 1"),
                           vec("-5 -3 16"));
        scene1.lights().insert(&light_b);

        scene1.render(renderbuffer);
    }
    else if(key == '2')
    {
        cout << "Composing and rendering scene 2..." << endl;

        scene scene2;
        scene2.voidcolor() = fvec("0 0 0 1");

        // Set up the viewport
        viewport view(vec("-20 0 10"),
                  vec("1 0 -0.2"),
                  vec("0 0 1"),
                  math::pi()/3.0,
                  math::pi()/3.0);
        scene2.viewports().insert(&view);

        // Insert a plane
        
        infinite_plane plane_a(vec("0 0 0"),
                               vec("0 0 1"));

        material_phong plane_a_mat(fvec("0.2 0.7 0.1"),
                                   fvec("0.2 0.7 0.1"),
                                   12.0,
                                   0.0,
                                   0.0,
                                   3.0);
        
        scene2.renderables().insert(&plane_a);
        scene2.materials()[&plane_a] = &plane_a_mat;

        // Insert a sphere
        
        sphere sphere_a(vec("0 -5 3"),
                        3.0);

        material_phong mat_sphere_a(fvec("0.7 0.3 0.2"),
                                    fvec("0.7 0.3 0.2"),
                                    35.0,
                                    0.0,
                                    0.0,
                                    4.0);

        scene2.renderables().insert(&sphere_a);
        scene2.materials()[&sphere_a] = &mat_sphere_a;

        // Insert a cylinder

        cylinder cyl_a(vec("0 5 5"),
                       vec("1 1 1"),
                       2.0,
                       -2.0,
                       2.0);

        material_phong mat_cyl_a(fvec("0.3 0.2 0.7"),
                                 fvec("0.3 0.2 0.7"),
                                 10.0,
                                 0.0,
                                 0.0,
                                 3.0);
        
        scene2.renderables().insert(&cyl_a);
        scene2.materials()[&cyl_a] = &mat_cyl_a;

        // Insert lights
        
        pointlight light_a(fvec("1 1 1"),
                           vec("0 0 6"));
        scene2.lights().insert(&light_a);

        pointlight light_b(fvec("1 0.1 0.1"),
                           vec("5 10 10"));
        scene2.lights().insert(&light_b);

        scene2.render(renderbuffer);
        
    }
    else if(key == '3')
    {
        cout << "Composing and rendering scene 3..." << endl;

        scene scene3;
        scene3.voidcolor() = fvec("0 0 0 1");

        // Set up the viewport
        
        viewport view(vec("-20 0 10"),
                  vec("1 0 -0.2"),
                  vec("0 0 1"),
                  math::pi()/3.0,
                  math::pi()/3.0);
        scene3.viewports().insert(&view);

        // Insert a green ground plane
        infinite_plane plane_a(vec("0 0 0"),
                               vec("0 0 1"));

        material_phong plane_a_mat(fvec("0.2 0.7 0.1"),
                                   fvec("0.2 0.7 0.1"),
                                   12.0,
                                   0.0,
                                   0.0,
                                   3.0);
        
        scene3.renderables().insert(&plane_a);
        scene3.materials()[&plane_a] = &plane_a_mat;

        // Insert a reflective cylinder
        
        cylinder cyl_a(vec("5 5 5"),
                       vec("1 1 1"),
                       2.0,
                       -2.0,
                       2.0);

        material_phong mat_cyl_a(fvec("0.3 0.2 0.7"),
                                 fvec("0.3 0.2 0.7"),
                                 10.0,
                                 1.0,
                                 0.0,
                                 3.0);
        
        scene3.renderables().insert(&cyl_a);
        scene3.materials()[&cyl_a] = &mat_cyl_a;

        // Insert a nearby reflective sphere
        sphere sphere_a(vec("5 0 2"),
                        2.0);
        
        material_phong mat_sphere_a(fvec("0.2 0.2 0.2"),
                                    fvec("0.2 0.2 0.2"),
                                    100,
                                    1.0,
                                    0,
                                    2);

        scene3.renderables().insert(&sphere_a);
        scene3.materials()[&sphere_a] = &mat_sphere_a;

        sphere sphere_b(vec("0 0 2"),
                        1.0);
        
        material_phong mat_sphere_b(fvec("1.0 0.5 0.5"),
                                    fvec("1.0 0.5 0.5"),
                                    50,
                                    0.7,
                                    0.0,
                                    1);
        
        scene3.renderables().insert(&sphere_b);
        scene3.materials()[&sphere_b] = &mat_sphere_b;

        // Insert a huge sphere, far away
        sphere sphere_c(vec("40 -10 20"),
                        20);

        material_phong mat_sphere_c(fvec("0.5 0.5 0.5"),
                                    fvec("0.5 0.5 0.5"),
                                    35,
                                    1.0,
                                    0.0,
                                    3.0);
        
        scene3.renderables().insert(&sphere_c);
        scene3.materials()[&sphere_c] = &mat_sphere_c;

        // Insert lights

        pointlight light_a(fvec("1 1 1"),
                            vec("5 -1 10"));
        scene3.lights().insert(&light_a);

        scene3.render(renderbuffer);
        
    }
    else if(key == '4')
    {
        cout << "Composing and rendering scene 4.  This scene has many"
                " reflections, so please be patient..."
             << endl;

        scene scene4;
        scene4.voidcolor() = fvec("0 0 0 1");

        // Set up the viewport
        viewport view(vec("-20 0 10"),
                  vec("1 0 -0.2"),
                  vec("0 0 1"),
                  math::pi()/3.0,
                  math::pi()/3.0);
        scene4.viewports().insert(&view);

        material_phong mat_silver(fvec("0.2 0.2 0.2"),
                                  fvec("0.2 0.2 0.2"),
                                  50.0,
                                  1.0,
                                  0.0,
                                  3.0);

        vec center1(" 2  2 2");
        vec center2("-2  2 2");
        vec center3("-2 -2 2");
        vec center4(" 2 -2 2");
        vec center5(" 0  0 4.828");

        sphere sphere_1(center1, 2.0);
        sphere sphere_2(center2, 2.0);
        sphere sphere_3(center3, 2.0);
        sphere sphere_4(center4, 2.0);
        sphere sphere_5(center5, 2.0);

        scene4.renderables().insert(&sphere_1);
        scene4.renderables().insert(&sphere_2);
        scene4.renderables().insert(&sphere_3);
        scene4.renderables().insert(&sphere_4);
        scene4.renderables().insert(&sphere_5);

        scene4.materials()[&sphere_1] = &mat_silver;
        scene4.materials()[&sphere_2] = &mat_silver;
        scene4.materials()[&sphere_3] = &mat_silver;
        scene4.materials()[&sphere_4] = &mat_silver;
        scene4.materials()[&sphere_5] = &mat_silver;

        vec offset_a("10 10 0");

        sphere sphere_a_1(center1 + offset_a, 2.0);
        sphere sphere_a_2(center2 + offset_a, 2.0);
        sphere sphere_a_3(center3 + offset_a, 2.0);
        sphere sphere_a_4(center4 + offset_a, 2.0);
        sphere sphere_a_5(center5 + offset_a, 2.0);

        scene4.renderables().insert(&sphere_a_1);
        scene4.renderables().insert(&sphere_a_2);
        scene4.renderables().insert(&sphere_a_3);
        scene4.renderables().insert(&sphere_a_4);
        scene4.renderables().insert(&sphere_a_5);

        scene4.materials()[&sphere_a_1] = &mat_silver;
        scene4.materials()[&sphere_a_2] = &mat_silver;
        scene4.materials()[&sphere_a_3] = &mat_silver;
        scene4.materials()[&sphere_a_4] = &mat_silver;
        scene4.materials()[&sphere_a_5] = &mat_silver;

        vec offset_b("10 -10 0");
        
        sphere sphere_b_1(center1 + offset_b, 2.0);
        sphere sphere_b_2(center2 + offset_b, 2.0);
        sphere sphere_b_3(center3 + offset_b, 2.0);
        sphere sphere_b_4(center4 + offset_b, 2.0);
        sphere sphere_b_5(center5 + offset_b, 2.0);

        scene4.renderables().insert(&sphere_b_1);
        scene4.renderables().insert(&sphere_b_2);
        scene4.renderables().insert(&sphere_b_3);
        scene4.renderables().insert(&sphere_b_4);
        scene4.renderables().insert(&sphere_b_5);

        scene4.materials()[&sphere_b_1] = &mat_silver;
        scene4.materials()[&sphere_b_2] = &mat_silver;
        scene4.materials()[&sphere_b_3] = &mat_silver;
        scene4.materials()[&sphere_b_4] = &mat_silver;
        scene4.materials()[&sphere_b_5] = &mat_silver;

        vec offset_c("30 0 0");
        
        sphere sphere_c_1(center1 + offset_c, 2.0);
        sphere sphere_c_2(center2 + offset_c, 2.0);
        sphere sphere_c_3(center3 + offset_c, 2.0);
        sphere sphere_c_4(center4 + offset_c, 2.0);
        sphere sphere_c_5(center5 + offset_c, 2.0);

        scene4.renderables().insert(&sphere_c_1);
        scene4.renderables().insert(&sphere_c_2);
        scene4.renderables().insert(&sphere_c_3);
        scene4.renderables().insert(&sphere_c_4);
        scene4.renderables().insert(&sphere_c_5);

        scene4.materials()[&sphere_c_1] = &mat_silver;
        scene4.materials()[&sphere_c_2] = &mat_silver;
        scene4.materials()[&sphere_c_3] = &mat_silver;
        scene4.materials()[&sphere_c_4] = &mat_silver;
        scene4.materials()[&sphere_c_5] = &mat_silver;

        // Insert a ground plane
        infinite_plane plane_a(vec("0 0 0"),
                               vec("0 0 1"));

        material_phong plane_a_mat(fvec("0.5 0.5 0.5"),
                                   fvec("0.5 0.5 0.5"),
                                   12.0,
                                   0.7,
                                   0.0,
                                   3.0);
        
        scene4.renderables().insert(&plane_a);
        scene4.materials()[&plane_a] = &plane_a_mat;
        
        infinite_plane plane_b(vec("0 0 15"),
                               vec("0 0 -1"));

        material_phong plane_b_mat(fvec("0.5 0.5 0.5"),
                                   fvec("0.5 0.5 0.5"),
                                   12.0,
                                   0.0,
                                   0.0,
                                   3.0);
        
        scene4.renderables().insert(&plane_b);
        scene4.materials()[&plane_b] = &plane_b_mat;


        vec light_up("0 0 7.5");
        
        pointlight light_a(fvec("1 1 1 1"), light_up);
        scene4.lights().insert(&light_a);

        pointlight light_b(fvec("1 0 0 1"), light_up + offset_a);
        scene4.lights().insert(&light_b);

        pointlight light_c(fvec("0 1 0 1"), light_up + offset_b);
        scene4.lights().insert(&light_c);

        pointlight light_d(fvec("0 0 1 1"), light_up + offset_c);
        scene4.lights().insert(&light_d);

        scene4.render(renderbuffer);
    }

    glutPostRedisplay();
}