X-Git-Url: https://git.rohieb.name/MicroTrace.git/blobdiff_plain/a064dd2f4e7b2a911ed46dd1499199bb4301affd..7dc19699bd3ae76b3802dfb43854fd88fea3ffc3:/MicroTrace.cxx diff --git a/MicroTrace.cxx b/MicroTrace.cxx index feb1eeb..6bb474c 100644 --- a/MicroTrace.cxx +++ b/MicroTrace.cxx @@ -1,116 +1,58 @@ +#ifdef _OPENMP +#include +#endif + #include -#include #include "Vec3f.hxx" -//#include "Sphere.hxx" -//#include "Triangle.hxx" -//#include "InfinitePlane.hxx" - #include "Image.hxx" #include "PerspectiveCamera.hxx" - -void RenderFrame(Camera &camera, const std::string& fileName) { - /* scene objects */ - - /* - 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 - */ +#include "Scene.hxx" + + +void RenderFrameCone(const std::string& fileName) +{ + /* Scene definition */ + Scene scene; + + 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 + // 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 */ + 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 } -#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"); +#define RESX 640 // image x-resolution +#define RESY 480 // image y-resolution - 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**) +{ + RenderFrameCone("cone.ppm"); }