X-Git-Url: https://git.rohieb.name/MicroTrace.git/blobdiff_plain/dfcd78f3f458d8c4bfbc27b08ced5aae0f2e57d4..7dc19699bd3ae76b3802dfb43854fd88fea3ffc3:/MicroTrace.cxx diff --git a/MicroTrace.cxx b/MicroTrace.cxx index e0fd688..6bb474c 100644 --- a/MicroTrace.cxx +++ b/MicroTrace.cxx @@ -1,156 +1,58 @@ +#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 "PhongShader.hxx" -#include "PointLight.hxx" -#include "SpotLight.hxx" #include "Scene.hxx" -void RenderFramePhongPointLight(const std::string& fileName) +void RenderFrameCone(const std::string& fileName) { /* Scene definition */ Scene scene; - /* Flat shaders */ - PhongShader shd1(&scene, Vec3f(1,0,0),Vec3f(1,0,0),Vec3f(1,1,1), 0.1, 0.5, 0.5, 40); // red surface - PhongShader shd2(&scene, Vec3f(0,1,0),Vec3f(0,1,0),Vec3f(1,1,1), 0.1, 0.5, 0.5, 40); // green surface - PhongShader shd3(&scene, Vec3f(0,0,1),Vec3f(0,0,1),Vec3f(1,1,1), 0.1, 0.5, 0.5, 40); // blue surface - PhongShader shd4(&scene, Vec3f(1,1,0),Vec3f(1,1,0),Vec3f(1,1,1), 0.1, 0.5, 0.5, 40); // yellow surface - PhongShader shd5(&scene, Vec3f(0,1,1),Vec3f(0,1,1),Vec3f(1,1,1), 0.1, 0.5, 0.5, 40); // cyan surface - PhongShader shd6(&scene, Vec3f(1,1,1),Vec3f(1,1,1),Vec3f(1,1,1), 0.1, 0.5, 0.5, 40); // 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); + 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)); - /* light sources */ - Vec3f lightPosition1(4,5,6); - Vec3f lightPosition2(-3,5,4); - Vec3f pointLightSourceIntensity(50,50,50); - PointLight pointLight1(&scene, lightPosition1, pointLightSourceIntensity); - PointLight pointLight2(&scene, lightPosition2, pointLightSourceIntensity); - - scene.Add(&pointLight1); - scene.Add(&pointLight2); - - 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 */ - + 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 - //std::cerr << "Main: Image color = " << img(x,y) << std::endl; } } img.WritePPM(fileName); // write final image } -void RenderFramePhongSpotLight(const std::string& fileName) -{ - /* Scene definition */ - Scene scene; - - /* Flat shaders */ - PhongShader shd1(&scene, Vec3f(1,0,0),Vec3f(1,0,0),Vec3f(1,1,1), 0.1, 0.5, 0.5, 40); // red surface - PhongShader shd2(&scene, Vec3f(0,1,0),Vec3f(0,1,0),Vec3f(1,1,1), 0.1, 0.5, 0.5, 40); // green surface - PhongShader shd3(&scene, Vec3f(0,0,1),Vec3f(0,0,1),Vec3f(1,1,1), 0.1, 0.5, 0.5, 40); // blue surface - PhongShader shd4(&scene, Vec3f(1,1,0),Vec3f(1,1,0),Vec3f(1,1,1), 0.1, 0.5, 0.5, 40); // yellow surface - PhongShader shd5(&scene, Vec3f(0,1,1),Vec3f(0,1,1),Vec3f(1,1,1), 0.1, 0.5, 0.5, 40); // cyan surface - PhongShader shd6(&scene, Vec3f(1,1,1),Vec3f(1,1,1),Vec3f(1,1,1), 0.1, 0.5, 0.5, 40); // 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); - - /* light sources */ - Vec3f lightPosition1(4,5,6); - Vec3f lightPosition2(-3,5,4); - Vec3f spotLightSourceIntensity(50,50,50); - Vec3f lightDir1 = lightPosition1 * (-1.0f); - lightDir1.normalize(); - Vec3f lightDir2 = lightPosition2 *(-1.0f); - lightDir2.normalize(); - float alpha_min = 15.0f; - float alpha_max = 30.0f; - - SpotLight spotLight1(&scene, lightPosition1, lightDir1, spotLightSourceIntensity, alpha_min, alpha_max); - SpotLight spotLight2(&scene, lightPosition2, lightDir2, spotLightSourceIntensity, alpha_min, alpha_max); - - scene.Add(&spotLight1); - scene.Add(&spotLight2); - - 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 */ - - scene.camera()->InitRay(x+0.5,y+0.5,ray); // initialize ray - - Vec3f col = scene.RayTrace(ray); - - img(x,y) = col; // 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**) { - RenderFramePhongPointLight("phong_point.ppm"); - RenderFramePhongSpotLight("phong_spot.ppm"); + RenderFrameCone("cone.ppm"); }