#include <string>
-#include <iostream>
#include "Vec3f.hxx"
-//#include "Sphere.hxx"
-//#include "Triangle.hxx"
-//#include "InfinitePlane.hxx"
+#include "Sphere.hxx"
+#include "Triangle.hxx"
+#include "InfinitePlane.hxx"
#include "Image.hxx"
#include "PerspectiveCamera.hxx"
+#include "FlatShader.hxx"
+#include "EyeLightShader.hxx"
+#include "ReflectiveEyeLightShader.hxx"
+#include "Scene.hxx"
+
+void RenderFrameFlat(const std::string& fileName)
+{
+ /* Scene definition */
+
+ Scene scene;
+
+ /* Flat shaders */
+ FlatShader shd1(&scene, Vec3f(1,0,0)); // red surface
+ FlatShader shd2(&scene, Vec3f(0,1,0)); // green surface
+ FlatShader shd3(&scene, Vec3f(0,0,1)); // blue surface
+ FlatShader shd4(&scene, Vec3f(1,1,0)); // yellow surface
+ FlatShader shd5(&scene, Vec3f(0,1,1)); // cyan surface
+ FlatShader shd6(&scene, Vec3f(1,1,1)); // white surface
+
+ /* scene objects */
+ Sphere s1(Vec3f(-2,1.7,0), 2, &shd1);
+ Sphere s2(Vec3f(1,-1,1), 2.2, &shd2);
+ Sphere s3(Vec3f(3,0.8,-2), 2, &shd3);
+ InfinitePlane p1(Vec3f(0,-1,0),Vec3f(0,1,0), &shd4);
+
+
+ Triangle t1(Vec3f(-2,3,1),Vec3f(1,2,1),Vec3f(3,2.8,3), &shd5);
+
+ /* add to scene */
+ scene.Add(&s1);
+ scene.Add(&s2);
+ scene.Add(&s3);
+ scene.Add(&p1);
+ scene.Add(&t1);
+
+
+ Image img(scene.camera()->resX(),scene.camera()->resY()); // image array
+ Ray ray; // primary ray
+
+ for(int y = 0; y < scene.camera()->resY(); y++)
+ {
+ for (int x = 0; x < scene.camera()->resX(); x++)
+ {
+
+ /* Initialize your ray here */
+ // shoot four rays for antialiasing
+ scene.camera()->InitRay(x+0.5,y+0.5, ray); // initialize ray
+ Vec3f col1 = scene.RayTrace(ray);
+ scene.camera()->InitRay(x-0.5,y+0.5, ray); // initialize ray
+ Vec3f col2 = scene.RayTrace(ray);
+ scene.camera()->InitRay(x-0.5,y-0.5, ray); // initialize ray
+ Vec3f col3 = scene.RayTrace(ray);
+ scene.camera()->InitRay(x-0.5,y-0.5, ray); // initialize ray
+ Vec3f col4 = scene.RayTrace(ray);
+
+ img(x,y) = (col1 + col2 + col3 + col4) / 4.0; // store pixel color
+ //std::cerr << "Main: Image color = " << img(x,y) << std::endl;
+ }
+ }
+ img.WritePPM(fileName); // write final image
+}
+
+
+void RenderFrameEyeLight(const std::string& fileName)
+{
+ /* Scene definition */
+
+ Scene scene;
+
+ /* Flat shaders */
+ EyeLightShader shd1(&scene, Vec3f(1,0,0)); // red surface
+ EyeLightShader shd2(&scene, Vec3f(0,1,0)); // green surface
+ EyeLightShader shd3(&scene, Vec3f(0,0,1)); // blue surface
+ EyeLightShader shd4(&scene, Vec3f(1,1,0)); // yellow surface
+ EyeLightShader shd5(&scene, Vec3f(0,1,1)); // cyan surface
+ EyeLightShader shd6(&scene, Vec3f(1,1,1)); // white surface
-void RenderFrame(Camera &camera, const std::string& fileName) {
/* scene objects */
+ Sphere s1(Vec3f(-2,1.7,0), 2, &shd1);
+ Sphere s2(Vec3f(1,-1,1), 2.2, &shd2);
+ Sphere s3(Vec3f(3,0.8,-2), 2, &shd3);
+ InfinitePlane p1(Vec3f(0,-1,0),Vec3f(0,1,0), &shd4);
+
+
+ Triangle t1(Vec3f(-2,3,1),Vec3f(1,2,1),Vec3f(3,2.8,3), &shd5);
+
+ /* add to scene */
+ scene.Add(&s1);
+ scene.Add(&s2);
+ scene.Add(&s3);
+ scene.Add(&p1);
+ scene.Add(&t1);
+
+ Image img(scene.camera()->resX(),scene.camera()->resY()); // image array
+ Ray ray; // primary ray
+
+ for(int y = 0; y < scene.camera()->resY(); y++)
+ {
+ for (int x = 0; x < scene.camera()->resX(); x++)
+ {
+
+ /* Initialize your ray here */
+ // shoot four rays for antialiasing
+ scene.camera()->InitRay(x+0.5,y+0.5, ray); // initialize ray
+ Vec3f col1 = scene.RayTrace(ray);
+ scene.camera()->InitRay(x-0.5,y+0.5, ray); // initialize ray
+ Vec3f col2 = scene.RayTrace(ray);
+ scene.camera()->InitRay(x-0.5,y-0.5, ray); // initialize ray
+ Vec3f col3 = scene.RayTrace(ray);
+ scene.camera()->InitRay(x-0.5,y-0.5, ray); // initialize ray
+ Vec3f col4 = scene.RayTrace(ray);
+
+ img(x,y) = (col1 + col2 + col3 + col4) / 4.0; // store pixel color
+ }
+ }
+ img.WritePPM(fileName); // write final image
+}
+
+void RenderFrameReflectiveEyeLight(const std::string& fileName)
+{
+ /* Scene definition */
+
+ Scene scene;
- /*
- Sphere s1(Vec3f(-2,1.7,0),2);
- Sphere s2(Vec3f(1,-1,1),2.2);
- Sphere s3(Vec3f(3,0.8,-2),2);*/
- //InfinitePlane p1(Vec3f(0,-1,0),Vec3f(0,1,0));
-
- /*
- Triangle t1(Vec3f(-2,3.7,0),Vec3f(1,2,1),Vec3f(3,2.8,-2));
- Triangle t2(Vec3f(3,2,3),Vec3f(3,2,-3),Vec3f(-3,2,-3));
- */
- Image img(camera.resX(), camera.resY()); // image array
- Ray ray; // primary ray
-
- for(int y = 0; y < camera.resY(); y++)
- for(int x = 0; x < camera.resX(); x++) {
-
- /* Initialize your ray here */
-
- camera.InitRay(x + 0.5, y + 0.5, ray); // initialize ray
-
- Vec3f col = Vec3f(0, 0, 0); // background color
-
- /*
- if (s1.Intersect(ray))
- col = Vec3f(1,0,0);
- if (s2.Intersect(ray))
- col = Vec3f(0,1,0);
- if (s3.Intersect(ray))
- col = Vec3f(0,0,1);
- if (p1.Intersect(ray))
- col = Vec3f(1,1,0);
- if (t1.Intersect(ray))
- col = Vec3f(0,1,1);
- if (t2.Intersect(ray))
- col = Vec3f(1,1,1);
-
- img(x,y) = col; // store pixel color
- */
+ /* Flat shaders */
+ ReflectiveEyeLightShader shd1(&scene, 1.0, Vec3f(1,0,0)); // red surface
+ ReflectiveEyeLightShader shd2(&scene, 1.0, Vec3f(0.0,1.0,0.0)); // green surface
+ ReflectiveEyeLightShader shd3(&scene, 1.0, Vec3f(0,0,1)); // blue surface
+ ReflectiveEyeLightShader shd4(&scene, 0.8, Vec3f(1,1,0)); // yellow surface
+ ReflectiveEyeLightShader shd5(&scene, 1.0, Vec3f(0,1,1)); // cyan surface
+ ReflectiveEyeLightShader shd6(&scene, 0.0, Vec3f(1,1,1)); // white surface
+
+ /* scene objects */
+ Sphere s1(Vec3f(-2,1.7,0), 2, &shd1);
+ Sphere s2(Vec3f(0.4,-1,1), 2.0, &shd2);
+ Sphere s3(Vec3f(3,0.8,-2), 2, &shd3);
+ InfinitePlane p1(Vec3f(0,-1,0),Vec3f(0,1,0), &shd4);
+
+
+ Triangle t1(Vec3f(-2,3,1),Vec3f(1,2,1),Vec3f(3,2.8,3), &shd5);
+
+ /* add to scene */
+ scene.Add(&s1);
+ scene.Add(&s2);
+ scene.Add(&s3);
+ scene.Add(&p1);
+ scene.Add(&t1);
+
+
+ Image img(scene.camera()->resX(),scene.camera()->resY()); // image array
+ Ray ray; // primary ray
+
+ for(int y = 0; y < scene.camera()->resY(); y++)
+ {
+ for (int x = 0; x < scene.camera()->resX(); x++)
+ {
+ /* Initialize your ray here */ //int x = 319, y = 59;
+ // shoot four rays for antialiasing
+ scene.camera()->InitRay(x+0.5,y+0.5, ray); // initialize ray
+ Vec3f col1 = scene.RayTrace(ray);
+ scene.camera()->InitRay(x-0.5,y+0.5, ray); // initialize ray
+ Vec3f col2 = scene.RayTrace(ray);
+ scene.camera()->InitRay(x-0.5,y-0.5, ray); // initialize ray
+ Vec3f col3 = scene.RayTrace(ray);
+ scene.camera()->InitRay(x-0.5,y-0.5, ray); // initialize ray
+ Vec3f col4 = scene.RayTrace(ray);
+
+ img(x,y) = (col1 /*+ col2 + col3 + col4) / 4.0*/ ); // store pixel color
+ //std::cerr << "Main: Image color = " << img(x,y) << std::endl;
+ }
}
img.WritePPM(fileName); // write final image
}
+
+
#define RESX 640 // image x-resolution
#define RESY 480 // image y-resolution
-using namespace std;
-
-int main(int, char**) {
- // test vector implementation
-
- Vec3f bar(1, 4, 5), foo(3, 2, 1);
- cout << "Using example vector bar=" << bar << ", foo=" << foo << endl;
- cout << "bar | foo = " << (bar | foo) << ", should be 16" << endl;
- cout << "bar | bar = " << (bar | bar) << ", should be 42" << endl;
- cout << "foo | foo = " << (foo | foo) << ", should be 14" << endl;
- cout << "bar % foo = " << (bar % foo) << ", should be (-6,14,-10)" << endl;
- cout << "bar % bar = " << (bar % bar) << ", should be (0,0,0)" << endl;
- cout << "foo % foo = " << (foo % foo) << ", should be (0,0,0)" << endl;
- cout << "bar.norm() = " << bar.norm() << ", should be 6.48" << endl;
- cout << "foo.norm() = " << foo.norm() << ", should be 3.74" << endl;
- cout << "bar*5 = " << (bar * 5) << ", should be (5,20,25)" << endl;
- cout << "bar/5 = " << (bar / 5) << ", should be (0.2,0.8,1)" << endl;
- cout << "bar + foo = " << (bar + foo) << ", should be (4,6,6)" << endl;
- cout << "bar - foo = " << (bar - foo) << ", should be (-2,2,4)" << endl;
- cout << "foo - bar = " << (foo - bar) << ", should be (2,-2,-4)" << endl;
- cout << "bar * foo = " << (bar * foo) << ", should be (3,8,5)" << endl;
- cout << "bar / foo = " << (bar / foo) << ", should be (0.33,2,5)" << endl;
- cout << "foo / bar = " << (foo / bar) << ", should be (3,0.5,0.2)" << endl;
-
- cout << "bar *= 4: " << (bar *= 4) << ", should be (4,16,20)" << endl;
- cout << "bar /= 2: " << (bar /= 2) << ", should be (2,8,10)" << endl;
- cout << "bar += foo: " << (bar += foo) << ", should be (5,10,11)" << endl;
- cout << "bar -= Vec3f(5,6,3): " << (bar -= Vec3f(5, 6, 3))
- << ", should be (0,4,8)" << endl;
-
- cout << "bar[0] = " << bar[0] << ", should be 0" << endl;
- cout << "bar[1] = " << bar[1] << ", should be 4" << endl;
- cout << "bar[2] = " << bar[2] << ", should be 8" << endl;
- cout << "foo[0] = " << foo[0] << ", should be 3" << endl;
- cout << "foo[1] = " << foo[1] << ", should be 2" << endl;
- cout << "foo[2] = " << foo[2] << ", should be 1" << endl;
-
- bar.normalize();
- cout << "bar.normalize(): " << bar << ", should be (0,0.44,0.89)" << endl;
- foo.normalize();
- cout << "foo.normalize(): " << foo << ", should be (0.80,0.53,0.26)" << endl;
- bar = foo;
- cout << "bar := foo: bar = " << bar << ", should be (0.80,0.53,0.26)" << endl;
-
- /* render three images with different camera settings */
- /*
- PerspectiveCamera c1(Vec3f(0, 0, 10), Vec3f(0, 0, -1), Vec3f(0, 1, 0), 60,
- RESX, RESY);
- RenderFrame(c1, "perspective1.ppm");
-
- PerspectiveCamera c2(Vec3f(-8, 3, 8), Vec3f(1, -.1, -1), Vec3f(0, 1, 0), 45,
- RESX, RESY);
- RenderFrame(c2, "perspective2.ppm");
-
- PerspectiveCamera c3(Vec3f(-8, 3, 8), Vec3f(1, -.1, -1), Vec3f(1, 1, 0), 45,
- RESX, RESY);
- RenderFrame(c3, "perspective3.ppm");*/
+
+int main(int, char**)
+{
+ //RenderFrameFlat("flatshaded.ppm");
+ //RenderFrameEyeLight("eyelight.ppm");
+ RenderFrameReflectiveEyeLight("reflective.ppm");
}