X-Git-Url: https://git.rohieb.name/MicroTrace.git/blobdiff_plain/13c3b8d1e2ecf7f1dbd02f9d4bfeb813b36fd40a..df8007c9ec4440ac2388c7a4971e708c2b697832:/MicroTrace.cxx diff --git a/MicroTrace.cxx b/MicroTrace.cxx index 3a27182..6bb474c 100644 --- a/MicroTrace.cxx +++ b/MicroTrace.cxx @@ -1,182 +1,48 @@ +#ifdef _OPENMP +#include +#endif + #include #include "Vec3f.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) +void RenderFrameCone(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) -{ - /* 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); - - + + scene.ParseOBJ("cone.obj", 1.0f); + + // alter the camera definition appropriately to see the cow + // you may need to implement some set/get routines for the scene class + scene.setCamera(new PerspectiveCamera(Vec3f(0,0,0.5), + Vec3f(0,0,-1), + Vec3f(0,1,0), + 60, + 640, + 480)); + + Image img(scene.camera()->resX(),scene.camera()->resY()); // image array - Ray ray; // primary ray - + // primary ray +#pragma omp parallel for 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; - } + for (int x = 0; x < scene.camera()->resX(); x++) + { + + /* Initialize your ray here */ + Ray ray; + scene.camera()->InitRay(x+0.5,y+0.5,ray); // initialize ray + + Vec3f col = scene.RayTrace(ray); + + img(x,y) = col; // store pixel color + } } img.WritePPM(fileName); // write final image } @@ -188,7 +54,5 @@ void RenderFrameReflectiveEyeLight(const std::string& fileName) int main(int, char**) { - //RenderFrameFlat("flatshaded.ppm"); - //RenderFrameEyeLight("eyelight.ppm"); - RenderFrameReflectiveEyeLight("reflective.ppm"); + RenderFrameCone("cone.ppm"); }