int raytracer(t_imgdata *imgdata, t_pov *pov, t_object *objects, t_coordinate *lightsource) { t_pixel pixel; int color; pixel.x = 0; pixel.y = 0; while (pixel.y < WIN_HEIGHT) { while (pixel.x < WIN_WIDTH) { color = calculate_pixel(pov, &pixel, objects, lightsource); my_pixel_put_to_image(imgdata, pixel.x, pixel.y, color); pixel.x++; } pixel.x = 0; pixel.y++; } return (0); }
void *server_work(void *arg) { t_rt *rt; int pixel[WIDTH]; int y; int x; rt = (t_rt *)arg; while (42) { if ((y = ++line - 1) >= HEIGHT) pthread_exit(NULL); my_printf(" %d% \r", ((y + 1) * 100) / HEIGHT); x = -1; while (++x < WIDTH) { calculate_pixel(rt, x, y, pixel); put_pixel_in_img(rt->mlx, x, y, pixel[x]); } } }
int main(int argc, char **argv) { if (argc != 6) { fprintf(stderr, "usage: %s width height centerx centery magnification", argv[0]); return 1; } DoubleDouble temp1; unsigned int width = atoi(argv[1]); unsigned int height = atoi(argv[2]); unsigned char* tmpimage = malloc(width*height*3); unsigned char* finalimage = malloc(width*height*3); unsigned int x, y; DoubleDouble centerx, centery; centerx = dd_new(-0.7436438870371587, -3.628952515063387E-17); centery = dd_new(0.13182590420531198, -1.2892807754956678E-17); logLogBailout = log(log(bailout)); DoubleDouble magn = dd_new(strtod(argv[5], NULL), 0); /*// maxiter = width * sqrt(magn); temp1 = dd_sqrt(magn); unsigned long maxiter = width * dd_get_ui(temp1);*/ // x0d = 4 / magn / width; x0d = dd_ui_div(4, magn); x0d = dd_div_ui(x0d, width); // x2 = -2 / magn + centerx; x2 = dd_si_div(-2, magn); x2 = dd_add(x2, centerx); // y1d = -4 / magn / width; y1d = dd_si_div(-4, magn); y1d = dd_div_ui(y1d, width); // y2 = 2 / magn * height / width + centery; y2 = dd_ui_div(2, magn); temp1 = dd_new(height, 0); temp1 = dd_div_ui(temp1, width); y2 = dd_mul(y2, temp1); y2 = dd_add(y2, centery); unsigned int idx; unsigned int imgidx = 0; unsigned long lastit; double zxd, zyd; bool inside; for (y = 0; y < height; y++) { for (x = 0; x < width; x++) { fprintf(stderr, "\rR: %f %%", (float)imgidx/(width*height*3)*100); calculate_pixel(x, y, &lastit, &zxd, &zyd, &inside); if (inside) { tmpimage[imgidx++] = 0; tmpimage[imgidx++] = 0; tmpimage[imgidx++] = 0; } else { idx = getcoloridx(lastit, zxd, zyd); tmpimage[imgidx++] = colors[idx][0]; tmpimage[imgidx++] = colors[idx][1]; tmpimage[imgidx++] = colors[idx][2]; } } } imgidx = 0; int finalidx = 0; int aafactor = 5; int aareach = aafactor / 2; int aaarea = aafactor * aafactor; double aafactorinv = 1.0/aafactor; int xi, yi; unsigned int val1, val2, val3; double dx, dy; for (y = 0; y < height; y++) { for (x = 0; x < width; x++) { fprintf(stderr, "\rAA: %f %%", (float)imgidx/(width*height*3)*100); val1 = tmpimage[imgidx++]; val2 = tmpimage[imgidx++]; val3 = tmpimage[imgidx++]; // if pixel is neither at the border nor are its four neighbors // different, copy value and continue without antialiasing it if (x != 0 && y != 0 && x != width -1 && y != height -1 && tmpimage[(y+1)*width*3+x*3+0] == val1 && tmpimage[(y+1)*width*3+x*3+1] == val2 && tmpimage[(y+1)*width*3+x*3+2] == val3 && tmpimage[(y-1)*width*3+x*3+0] == val1 && tmpimage[(y-1)*width*3+x*3+1] == val2 && tmpimage[(y-1)*width*3+x*3+2] == val3 && tmpimage[y*width*3+(x+1)*3+0] == val1 && tmpimage[y*width*3+(x+1)*3+1] == val2 && tmpimage[y*width*3+(x+1)*3+2] == val3 && tmpimage[y*width*3+(x-1)*3+0] == val1 && tmpimage[y*width*3+(x-1)*3+1] == val2 && tmpimage[y*width*3+(x-1)*3+2] == val3) { finalimage[finalidx++] = val1; finalimage[finalidx++] = val2; finalimage[finalidx++] = val3; continue; } // otherwise do antialiasing for (xi = -aareach; xi <= aareach; xi++) { dx = xi*aafactorinv; for (yi = -aareach; yi <= aareach; yi++) { dy = yi*aafactorinv; if ((xi | yi) != 0) { calculate_pixel(x+dx, y+dy, &lastit, &zxd, &zyd, &inside); if (!inside) { idx = getcoloridx(lastit, zxd, zyd); val1 += colors[idx][0]; val2 += colors[idx][1]; val3 += colors[idx][2]; } } } } finalimage[finalidx++] = val1/aaarea; finalimage[finalidx++] = val2/aaarea; finalimage[finalidx++] = val3/aaarea; } } // write out image printf("P6 %d %d 255\n", width, height); fwrite(finalimage, 1, width*height*3, stdout); fprintf(stderr, "\n"); return 0; }