void setupScene() { raytracer = new Raytracer(); cam = new Camera(); cam->MoveTo(Vector(0.0f, 0.5f, 5.0f)); cam->LookAt(Vector(0.0f, -1.0f, 0.5f)); raytracer->SetCamera(cam); target = new RenderSurface(SCREEN_WIDTH, SCREEN_HEIGHT); raytracer->SetTarget(target); raytracer->SetProgressUpdater(new PercentMonitor()); scene = new Scene(8); SDFScene *sdf = new SDFScene(); sdf->GetMaterial().SetColor(Color::white); sdf->GetMaterial().SetDiffuse(1.0f); sdf->GetMaterial().SetSpecular(0.0f); scene->AddObject(sdf); Sphere *light = new Sphere(Vector(-4.0f, 4.0f, 3.0f), 1.0f); light->SetLight(true); light->SetLightIntensity(1.0f); light->GetMaterial().SetColor(Color::white); scene->AddObject(light); Sphere *ball = new Sphere(Vector(0.0f, 0.5f, 0.0f), 1.5f); ball->GetMaterial().SetColor(Color::white); ball->GetMaterial().SetDiffuse(0.0f); ball->GetMaterial().SetReflectivity(1.0f); scene->AddObject(ball); Sphere *r = new Sphere(Vector(-2.0f, -1.5f, 2.0f), 0.5f); r->GetMaterial().SetColor(Color::red); r->GetMaterial().SetDiffuse(1.0f); r->GetMaterial().SetSpecular(1.0f); scene->AddObject(r); Sphere *g = new Sphere(Vector(0.0f, -1.5f, 2.0f), 0.5f); g->GetMaterial().SetColor(Color::green); g->GetMaterial().SetDiffuse(1.0f); g->GetMaterial().SetSpecular(1.0f); scene->AddObject(g); Sphere *b = new Sphere(Vector(2.0f, -1.5f, 2.0f), 0.5f); b->GetMaterial().SetColor(Color::blue); b->GetMaterial().SetDiffuse(1.0f); b->GetMaterial().SetSpecular(1.0f); scene->AddObject(b); Plane *floor = new Plane(Vector(0.0f, 1.0f, 0.0f), 2.0f); floor->GetMaterial().SetColor(Color::white); floor->GetMaterial().SetDiffuse(1.0f); //scene->AddObject(floor); raytracer->SetScene(scene); //unthinkable without multithreading raytracer->SetShadowQuality(32); raytracer->SetMultisampling(8); raytracer->SetReflectionBlur(1); raytracer->SetOcclusion(0); }
void test2() { Vector o(0, 0, 5); Vector d(0, 0, -1); Ray r(o, d); Vector dx(1.0f / 6.0f, 0, 0); Vector dy(1.0f / 6.0f, 0, 0); raytracer = new Raytracer(); cam = new Camera(); cam->MoveTo(Vector(0.0f, 0.0f, 5.0f)); cam->LookAt(Vector(0.0f, 0.0f, 0.0f)); raytracer->SetCamera(cam); target = new RenderSurface(SCREEN_WIDTH, SCREEN_HEIGHT); raytracer->SetTarget(target); scene = new Scene(8); //Sphere *sphere = new Sphere(Vector(0, 0, 0), 2.0f); SDFScene *sdf = new SDFScene(); sdf->GetMaterial().SetColor(Color::white); sdf->GetMaterial().SetDiffuse(1.0f); sdf->GetMaterial().SetSpecular(0.0f); scene->AddObject(sdf); Sphere *light = new Sphere(Vector(0.0f, 0.0f, 7.0f), 1.0f); light->SetLight(true); light->SetLightIntensity(1.0f); light->GetMaterial().SetColor(Color::white); scene->AddObject(light); raytracer->SetScene(scene); //unthinkable without multithreading raytracer->SetShadowQuality(1); raytracer->SetMultisampling(1); raytracer->SetReflectionBlur(1); raytracer->SetOcclusion(0); for(int i = 0; i < 10000000; ++i) { Color pixel = Color::black; float mindist = MAX_DIST; float u = (lrflti(rand()) * MAX_RAND_DIVIDER) - 0.5f; float v = (lrflti(rand()) * MAX_RAND_DIVIDER) - 0.5f; Vector dir = d + (dx * u) + (dy * v); dir.Normalize(); r.direction = dir; Geometry *geom = raytracer->Raytrace(r, pixel, 0, mindist); if(geom != sdf) { printf("No hit! d = <%0.1f, %0.1f, %0.1f> mindist = %0.1f\n", r.direction.xv(), r.direction.yv(), r.direction.zv(), mindist); break; } if((pixel.rv() < 0.05f) && (pixel.gv() < 0.05f) && (pixel.bv() < 0.05f)) { printf("Black! c = <%0.1f, %0.1f, %0.1f> d = <%0.1f, %0.1f, %0.1f> mindist = %0.1f\n", pixel.rv(), pixel.gv(), pixel.bv(), r.direction.xv(), r.direction.yv(), r.direction.zv(), mindist); break; } } }