void preparation(){ cn2=midPosition-eye; cn2.Normalize(); cn0=cn00.GetNormalized(); cn1=cn0.Cross(cn2); // left hand coordinate iniPosition=midPosition-Sx/2*cn0-Sy/2*cn1; }
void PopulateImageParams() { _f = camera.dir; _f.Normalize(); _s = _f.Cross(camera.up); _s.Normalize(); _u = _s.Cross(_f); cout<<"Populating ImageParams..."<<endl; float alpha = camera.fov; float l = camera.focaldist; float h = l * tan(alpha/2.0 *(M_PI/180.0)); float aspectRatio = (float)camera.imgWidth/camera.imgHeight; float s = aspectRatio * abs(h); float dx = (2 * abs(s))/camera.imgWidth; float dy = -(2 * abs(h))/camera.imgHeight; float dxx = dx/2.0 , dyy=dy/2.0; Point3 K(-s,h,-l); K.x += (dxx ); K.y += (dyy ); for(int i = 0; i< camera.imgHeight ; i++){ for(int j = 0; j< camera.imgWidth; j++){ K.x += dx; Matrix3 RotMat; const float pts[9]={_s.x,_u.x,-_f.x,_s.y,_u.y,-_f.y,_s.z,_u.z,-_f.z}; RotMat.Set(pts); // K = RotMat*K; Cone r = Cone(camera.pos, K); r.dir = r.dir * RotMat; r.dir.Normalize(); r.radius = 0.0; r.tanAngle = tan(abs(dyy)/(float)l); /* Populating the Struct */ Point2 pixLoc = Point2(j,i); imageParams.K.push_back(K); imageParams.rendered.push_back(false); imageParams.PixLocation.push_back(pixLoc); imageParams.PixIndex.push_back( i * camera.imgWidth + j); imageParams.Ray.push_back(r); Point2 pixDimensions = Point2(dx,dy); imageParams.PixParams.push_back(pixDimensions); vector<Point3> ConfCirclePts; float randAng = rand()/ (float) RAND_MAX; randAng *= M_PI * 2.0; for(int i = 1; i<=MAX_N_SAMPLES; i++){ float hx = camera.dof * Halton(i, H_BASE_1); float hy = Halton(i, H_BASE_2); float r = sqrtf(hx); float theta = hy * M_PI * 2.0 + randAng; float x = r * cosf(theta); float y = r * sinf(theta); Point3 newCamPos(x, y, 0); newCamPos = newCamPos * RotMat; newCamPos += camera.pos; ConfCirclePts.push_back(newCamPos); } imageParams.ConfusionCirclePoints.push_back(ConfCirclePts); } K.x = -s; K.x += dxx; K.y += dy; } }
void saveLights(){ nl.Normalize(); light area(1, nl, pl, cl, lsx, lsy, ln0, ln1); alllights.push_back(area); }
void doRender(void* arg){ RenderParams rarg = *((RenderParams *)arg); //cout<<"Do render...."<<endl; bool pixelHit=false; HitInfo hitInfo; hitInfo.Init(); Point2 pixLoc = rarg.pixLocation; Cone r = rarg.ray; int PixIndex = rarg.pixIndex; Color shade(0,0,0); vector<Point2> haltonXY; float dx = rarg.PixParams.x; float dy = rarg.PixParams.y; float x=0; float y=0; _f.Normalize(); _s.Normalize(); const float pts[9]={_s.x,_u.x,-_f.x,_s.y,_u.y,-_f.y,_s.z,_u.z,-_f.z}; Matrix3 RotMat; RotMat.Set(pts); for(int i=0; i < MIN_N_SAMPLES; i++){ x = dx * Halton(i+1, H_BASE_1); y = dy * Halton(i+1, H_BASE_2); if(x > dx * 0.5) { x -= dx; } if(y < dy * 0.5) { y -= dy; } x += rarg.K.x; y += rarg.K.y; Point2 sampleLoc = Point2(x,y); haltonXY.push_back(sampleLoc); } vector<Color> shades; if(rootNode.GetNumChild()>0){ for(int i=0; i< MIN_N_SAMPLES;i++){ Point3 sampleDir = Point3(haltonXY.at(i).x, haltonXY.at(i).y, rarg.K.z); int rindex = rand() % MAX_N_SAMPLES; //rindex = i; Point3 randPos = rarg.ConfCirclePts.at(rindex); Cone sampleRay = Cone(randPos, sampleDir); sampleRay.dir = sampleRay.dir * RotMat; sampleRay.dir -= randPos - camera.pos; sampleRay.dir.Normalize(); sampleRay.radius = r.radius; sampleRay.tanAngle = r.tanAngle; r = sampleRay; if(RayTrace_2(r, hitInfo)) { pixelHit=true; shade = hitInfo.node->GetMaterial()->Shade(r, hitInfo, lights, 8); shades.push_back(shade); } hitInfo.Init(); } if(VarianceOverThreshold(shades)){ renderImage.SetSampleCountPixel(PixIndex, 255); hitInfo.Init(); for(int i=MIN_N_SAMPLES; i < MAX_N_SAMPLES; i++){ x = dx * Halton(i+1, H_BASE_1); y = dy * Halton(i+1, H_BASE_2); if(x > dx * 0.5) { x -= dx;} if(y < dy * 0.5) { y -= dy;} x += rarg.K.x; y += rarg.K.y; Point2 sampleLoc = Point2(x,y); haltonXY.push_back(sampleLoc); Point3 sampleDir = Point3(haltonXY.at(i).x, haltonXY.at(i).y, rarg.K.z); int rindex = rand() % MAX_N_SAMPLES; //rindex = i; Point3 randPos = rarg.ConfCirclePts.at(rindex); Cone sampleRay = Cone(randPos, sampleDir); sampleRay.dir = sampleRay.dir * RotMat; sampleRay.dir -= randPos - camera.pos; sampleRay.dir.Normalize(); sampleRay.radius = r.radius; sampleRay.tanAngle = r.tanAngle; r = sampleRay; if(RayTrace_2(r, hitInfo)) { pixelHit=true; shade = hitInfo.node->GetMaterial()->Shade(r, hitInfo, lights, 5); shades.push_back(shade); } hitInfo.Init(); } shade = AverageShades(shades, (int)shades.size()); } else{ shade = AverageShades(shades, (int)shades.size()); renderImage.SetSampleCountPixel(PixIndex, 0); } renderImage.PutPixel(PixIndex, shade, hitInfo.z); } if(!pixelHit){ Point3 uvw(pixLoc.x/ camera.imgWidth,pixLoc.y/camera.imgHeight,0); shade = background.Sample(uvw); renderImage.PutPixel(PixIndex, shade, BIGFLOAT); } pthread_mutex_lock(&setPix_mutex); renderImage.IncrementNumRenderPixel(1); pthread_mutex_unlock(&setPix_mutex); }