Color traceRay(Ray pixel_ray, Scene* s, Camera* c, int depth) { Color pixelColor; Ray normal[2]; pixelColor.r = 0; pixelColor.g = 0; pixelColor.b = 0; Sphere *closestSphere = NULL; Plane *closestPlane = NULL; float closestSphereDist = fInfinity; float closestPlaneDist = fInfinity; if (depth <= 0) return {0,0,0}; for (int i = 0; i < s->spheres.size(); i++) { float dist = sphere_intersect(&s->spheres[i], &pixel_ray); if (dist != fInfinity) { if(closestSphereDist == fInfinity || (closestSphereDist > dist && abs(closestSphereDist-dist) > 0.0001)) { closestSphereDist = dist; closestSphere = &s->spheres[i]; Point intersection = add(pixel_ray.p0, mul(pixel_ray.dir, dist)); Ray sphereNorm; sphereNorm.p0 = intersection; sphereNorm.dir = normalize(sub(intersection, closestSphere->center)); normal[0] = sphereNorm; } } } for (int i = 0; i < s->planes.size(); i++) { float dist = plane_intersect(&s->planes[i], &pixel_ray); if (dist != fInfinity) { if(closestPlaneDist == fInfinity || (closestPlaneDist > dist && abs(closestPlaneDist-dist) > 0.0001)) { closestPlaneDist = dist; closestPlane = &s->planes[i]; Point intersection = add(pixel_ray.p0, mul(pixel_ray.dir, dist)); Ray planeNorm; planeNorm.p0 = intersection; planeNorm.dir = normalize(closestPlane->normal); normal[1] = planeNorm; } } } if (closestPlane != NULL && closestSphere != NULL) { if (closestPlaneDist < closestSphereDist) { closestSphere = NULL; } else closestPlane = NULL; } if (closestPlane != NULL) { Color lambert = lambertian(normal[1], s, NULL, closestPlane); pixelColor.r = lambert.r; pixelColor.g = lambert.g; pixelColor.b = lambert.b; if(depth != 0) { if(closestPlane->material.transparency != 0.0) { Ray transRay; transRay.dir = pixel_ray.dir; transRay.p0 = mul(normal[1].p0, 1.01f); Color transparent = traceRay(transRay, s, c, depth-1); pixelColor.r = pixelColor.r * (1 - closestPlane->material.transparency) + transparent.r * closestPlane->material.transparency; pixelColor.g = pixelColor.g * (1 - closestPlane->material.transparency) + transparent.g * closestPlane->material.transparency; pixelColor.b = pixelColor.b * (1 - closestPlane->material.transparency) + transparent.b * closestPlane->material.transparency; } if(closestPlane->material.reflection != 0.0) { Ray reflRay = reflect(pixel_ray, normal[1]); Color reflection = traceRay( reflRay, s, c, depth-1 ); pixelColor.r = pixelColor.r * (1 - closestPlane->material.reflection) + reflection.r * closestPlane->material.reflection; pixelColor.g = pixelColor.g * (1 - closestPlane->material.reflection) + reflection.g * closestPlane->material.reflection; pixelColor.b = pixelColor.b * (1 - closestPlane->material.reflection) + reflection.b * closestPlane->material.reflection; } } } else if (closestSphere != NULL) { Color lambert = lambertian(normal[0], s, closestSphere, NULL); pixelColor.r += lambert.r; pixelColor.g += lambert.g; pixelColor.b += lambert.b; if(depth != 0) { if(closestSphere->material.transparency != 0.0) { Ray transRay; transRay.dir = pixel_ray.dir; transRay.p0 = normal[0].p0; Color transparent = traceRay(transRay, s, c, depth-1); pixelColor.r = pixelColor.r * (1 - closestSphere->material.transparency) + transparent.r * closestSphere->material.transparency; pixelColor.g = pixelColor.g * (1 - closestSphere->material.transparency) + transparent.g * closestSphere->material.transparency; pixelColor.b = pixelColor.b * (1 - closestSphere->material.transparency) + transparent.b * closestSphere->material.transparency; } if(closestSphere->material.reflection != 0.0) { Ray reflRay; reflRay = reflect(pixel_ray, normal[0]); Color reflection = traceRay(reflRay, s, c, depth-1); pixelColor.r = pixelColor.r * (1 - closestSphere->material.reflection) + reflection.r * closestSphere->material.reflection; pixelColor.g = pixelColor.g * (1 - closestSphere->material.reflection) + reflection.g * closestSphere->material.reflection; pixelColor.b = pixelColor.b * (1 - closestSphere->material.reflection) + reflection.b * closestSphere->material.reflection; } } } if(pixelColor.r > 1) { //printf("cut off red\n"); pixelColor.r = 1.0; } if(pixelColor.g > 1) { //printf("cut off green\n"); pixelColor.g = 1.0; } if(pixelColor.b > 1) { //printf("cut off blue\n"); pixelColor.b = 1.0; } return pixelColor; }
double *call_map_model(double la,double lo,double lambda0, double phi0,int brightness_model,double *brightness_params,double **bb_g,int make_grid,double theta1, double theta2, double r1, double r2, double star_bright,double la_cen,double lo_cen, double *lo_2d, double *la_2d, double **T_2d, double **y1_grid, double **y2_grid, double **y12_grid){ double point_T,mu,p_t_bright,point_b; double l1,l2; double *output; double R = 1.0; int n_bb_seg = 10; point_T = 0.0; point_b = 0.0; // printf("bb_g %f\n",bb_g[0][1]); if(brightness_model == 1 || brightness_model == 3 || brightness_model == 4 || brightness_model == 6|| brightness_model == 8|| brightness_model == 10|| brightness_model == 11|| brightness_model == 12) { l1 = brightness_params[1]; l2 = brightness_params[2]; } if(brightness_model == 0){ point_b = Uniform_b(brightness_params[0]); } else if(brightness_model == 1){ point_T = Uniform_T(brightness_params[3]); point_b = bb_interp(point_T, bb_g); } // if(brightness_model == 2){ // double p_day = brightness_params[0]; // double p_night = brightness_params[1]; // point_b = Two_b(la,lo,p_day,p_night); // } // if(brightness_model == 3){ // double p_day = brightness_params[3]; // double p_night = brightness_params[4]; // double point_T = p_night; // point_T = Two_T(la,lo,p_day,p_night); // point_b = bb_interp(point_T, bb_g); // } else if(brightness_model == 4){ double xi =brightness_params[3]; double T_n =brightness_params[4]; double delta_T =brightness_params[5]; point_T = zhang_2016(la,lo,xi,T_n,delta_T); point_b = bb_interp(point_T, bb_g); } else if(brightness_model == 5){ point_b = spherical(la,lo,brightness_params,0); } else if(brightness_model == 14){ point_T = spherical(la,lo,brightness_params,1); point_b = bb_interp(point_T, bb_g); } else if(brightness_model == 6){ double insol = brightness_params[3]; double albedo = brightness_params[4]; double redist = brightness_params[5]; point_T = kreidberg_2016(la, lo, insol, albedo, redist); point_b = bb_interp(point_T, bb_g); } else if(brightness_model == 2 || brightness_model == 7){ double la0 = brightness_params[0]; double lo0 = brightness_params[1]; double p_b = brightness_params[2]; double spot_b = brightness_params[4]; double size = brightness_params[5]; // printf("%f %f %f %f %f\n",la0,lo0,p_b,spot_b,size); point_b = Hotspot_b(la, lo, la0,lo0,p_b,spot_b,size,make_grid ,theta1,theta2,r1,r2,lambda0,phi0,la_cen,lo_cen); } else if(brightness_model == 3 || brightness_model == 8){ double la0 = brightness_params[4]; double lo0 = brightness_params[5]; double p_T = brightness_params[6]; double spot_T = brightness_params[7]; double size = brightness_params[8]; double b1 = bb_interp(p_T, bb_g); double b2 = bb_interp(spot_T, bb_g); point_T = Hotspot_b(la, lo, la0,lo0,p_T,spot_T,size,make_grid ,theta1,theta2,r1,r2,lambda0,phi0,la_cen,lo_cen); point_b = Hotspot_b(la, lo, la0,lo0,b1,b2,size,make_grid ,theta1,theta2,r1,r2,lambda0,phi0,la_cen,lo_cen); } else if(brightness_model == 9){ double albedo = brightness_params[3]; double ars = pow(brightness_params[4],2); double insol = ars*star_bright; // printf("%f \n",insol*M_PI); point_b = lambertian(la,lo,insol,albedo); } else if(brightness_model == 10){ double xi =brightness_params[3]; double T_n =brightness_params[4]; double delta_T =brightness_params[5]; point_T = zhang_2016(la,lo,xi,T_n,delta_T); point_b = bb_interp(point_T, bb_g); double albedo = brightness_params[6]; double ars = pow(brightness_params[7],2); double insol = ars*star_bright; point_b = point_b + lambertian(la,lo,insol,albedo); } else if(brightness_model == 11){ double xi =brightness_params[3]; double T_n =brightness_params[4]; double delta_T =brightness_params[5]; double clouds = brightness_params[6]; point_T = zhang_2016(la,lo,xi,T_n,delta_T); point_b = bb_interp(point_T, bb_g); if(pow(lo,2) > pow(M_PI/2.0,2)){ point_b = point_b - clouds; } } else if(brightness_model == 12 || brightness_model == 13){ /* printf("\n"); printf("%f\n",lo*180.0/M_PI); printf("%i\n",find_minimum(lo_2d, lo*180.0/M_PI, (int) brightness_params[3])); printf("%f\n",lo_2d[find_minimum(lo_2d, lo*180.0/M_PI, (int) brightness_params[3])]); printf("\n");*/ int *out1; out1 = malloc(sizeof(int) * 2); int *out2; out2 = malloc(sizeof(int) * 2); int nlo, nla, nearest; if(brightness_model == 12){ nlo = brightness_params[3]; nla = brightness_params[4]; nearest = brightness_params[5]; } if(brightness_model == 13){ nlo = brightness_params[0]; nla = brightness_params[1]; nearest = brightness_params[2]; } find_top_two(lo_2d, lo*180.0/M_PI, (int) nlo, out1); // printf("before second %i\n",(int) brightness_params[4]); find_top_two(la_2d, la*180.0/M_PI, (int) nla, out2); // printf("positions %i %i %i %i %i %i\n",out1[0],out1[1],out2[0],out2[1],nlo,nla); // printf("positions %f %f %f %f\n",lo_2d[out1[0]],lo_2d[out1[1]],la_2d[out2[0]],la_2d[out2[1]]); float *ansy, *ansy1, *ansy2; ansy = malloc(sizeof(float) * 1); ansy1 = malloc(sizeof(float) * 1); ansy2 = malloc(sizeof(float) * 1); float *y,*y1,*y2,*y12; y = malloc(sizeof(float) * 5); y1 = malloc(sizeof(float) * 5); y2 = malloc(sizeof(float) * 5); y12 = malloc(sizeof(float) * 5); y[1] = T_2d[out1[0]][out2[0]]; y[2] = T_2d[out1[1]][out2[0]]; y[3] = T_2d[out1[1]][out2[1]]; y[4] = T_2d[out1[0]][out2[1]]; y1[1] = y1_grid[out1[0]][out2[0]]; y1[2] = y1_grid[out1[1]][out2[0]]; y1[3] = y1_grid[out1[1]][out2[1]]; y1[4] = y1_grid[out1[0]][out2[1]]; y2[1] = y2_grid[out1[0]][out2[0]]; y2[2] = y2_grid[out1[1]][out2[0]]; y2[3] = y2_grid[out1[1]][out2[1]]; y2[4] = y2_grid[out1[0]][out2[1]]; y12[1] = y12_grid[out1[0]][out2[0]]; y12[2] = y12_grid[out1[1]][out2[0]]; y12[3] = y12_grid[out1[1]][out2[1]]; y12[4] = y12_grid[out1[0]][out2[1]]; // printf("%f %f %f %f %f %f\n",lo_2d[out1[0]],lo_2d[out1[1]], la_2d[out2[0]], la_2d[out2[1]], lo*180.0/M_PI, la*180.0/M_PI); bcuint(y, y1, y2, y12, lo_2d[out1[0]],lo_2d[out1[1]], la_2d[out2[0]], la_2d[out2[1]], lo*180.0/M_PI, la*180.0/M_PI, ansy, ansy1, ansy2); if (nearest == 1) { int c_lo = find_minimum(lo_2d, lo*180.0/M_PI, (int) nlo); int c_la = find_minimum(la_2d, la*180.0/M_PI, (int) nla); *ansy = T_2d[c_lo][c_la]; } if(brightness_model == 12){ point_T = *ansy; point_b = bb_interp(point_T, bb_g); } if(brightness_model == 13){ point_b = *ansy; } free(out1); free(out2); free(y); free(y1); free(y2); free(y12); free(ansy); free(ansy1); free(ansy2); } else{ printf("BRIGHTNESS MODEL NOT RECOGNISED\n"); } // printf("%f %f %f\n",ars, star_bright,insol); output = malloc(sizeof(double) * 2); // dynamic `array (size 2) of pointers to double` output[0] = point_b; output[1] = point_T; return output; }