still broken ReflectiveEyeLightShader, saving it for later
[MicroTrace.git] / MicroTrace.cxx
index d0b1d6e..3a27182 100644 (file)
 #include <string>
 
 #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 RenderFrame(Camera &camera,
-                const std::string& fileName)
+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);
+
 
-  /*
-    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
+  Image img(scene.camera()->resX(),scene.camera()->resY()); // image array
   Ray ray;                            // primary ray
-  
-  for(int y=0;y<camera.resY();y++)
-    for (int x=0;x<camera.resX();x++) 
+
+  for(int y = 0; y < scene.camera()->resY(); y++)
+    {
+      for (int x = 0; x < scene.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
-       */
+
+        /* 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
 }
 
-#define RESX 640 // image x-resolution
-#define RESY 480 // image y-resolution
 
-int main(int, char**)
+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
+
+  /* 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)
 {
-  /* render three images with different camera settings */
+  /* Scene definition */
+
+  Scene scene;
+
+  /* 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);
+
 
-  PerspectiveCamera c1(Vec3f(0,0,10),Vec3f(0,0,-1),Vec3f(0,1,0),60,RESX,RESY);
-  RenderFrame(c1,"perspective1.ppm");
+  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
+}
 
-  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");
+
+#define RESX 640 // image x-resolution
+#define RESY 480 // image y-resolution
+
+int main(int, char**)
+{
+  //RenderFrameFlat("flatshaded.ppm");
+  //RenderFrameEyeLight("eyelight.ppm");
+  RenderFrameReflectiveEyeLight("reflective.ppm");
 }
This page took 0.026075 seconds and 4 git commands to generate.