void setupScene() { camera.pos.set(45, 120, -300); camera.yaw = 5; camera.pitch = -5; camera.fov = 80; camera.beginFrame(); // create the floor: Plane* plane = new Plane(-0.01); plane->limit = 200; CheckerTexture* checker = new CheckerTexture(Color(0xdfb786), Color(0xd1a372)); nodes.push_back(Node{ plane, new Lambert(Color(1, 1, 1), checker)}); // create the window "frame": Phong* red = new Phong(Color(0.9, 0.3, 0.1), Color(1, 1, 1), 15.0f); Cube* cube = new Cube(Vector(0, 0, 0), 3.0); cube->beginFrame(); auto makeWindowNode = [red, cube] (Vector scale, Vector translate, double rotyaw = 0) -> Node { Node n{cube, red}; n.T.scale(scale.x, scale.y, scale.z); if (rotyaw != 0) n.T.rotate(rotyaw, 0, 0); n.T.translate(translate); return n; }; nodes.push_back(makeWindowNode(Vector(1, 60, 1), Vector(-89, 95, 7.84))); nodes.push_back(makeWindowNode(Vector(1, 60, 1), Vector( 0, 95, 0))); nodes.push_back(makeWindowNode(Vector(1, 60, 1), Vector(+89, 95,-7.84))); nodes.push_back(makeWindowNode(Vector(60, 1, 1), Vector( 0,185, 0), -5)); nodes.push_back(makeWindowNode(Vector(60, 1, 1), Vector( 0, 95, 0), -5)); nodes.push_back(makeWindowNode(Vector(60, 1, 1), Vector( 0, 5, 0), -5)); // a glass shader: Layered* glass = new Layered; Refraction* refr = new Refraction(); refr->refrColor = Color(1, 1, 1) * 0.95; refr->ior = 1.45; glass->addLayer(refr); Fresnel* fresnel = new Fresnel; fresnel->ior = refr->ior; glass->addLayer(new Reflection(1.0, Color(1, 1, 1) * 0.85), Color(1, 1, 1), fresnel); // the window itself: nodes.push_back(Node{cube, glass}); nodes.back().T.scale(59, 59, 0.75); nodes.back().T.rotate(-5, 0, 0); nodes.back().T.translate(Vector(0, 95, 0)); //nodes.back().shadowTransparency = 0.80; /* (*) */ // two translucent spheres: Sphere* sphere = new Sphere(Vector(0, 0, 0), 20); auto makeSphereNode = [sphere, glass] (Vector translate, double shadowTransparency) -> Node { Node n{sphere, glass}; n.T.translate(translate); //n.shadowTransparency = shadowTransparency; /* (*) */ return n; }; nodes.push_back(makeSphereNode(Vector(55, 15, -30), 0.66)); nodes.push_back(makeSphereNode(Vector(105, 15, -30), 0.83)); lightPos.set(-90, +1500, +750); lightColor.setColor(1, 1, 1); lightIntensity = 3000000.0; // environment = new CubemapEnvironment("data/env/forest"); }