void ft_ray_cast(t_dt *dt, t_obj *obj) { t_ray *ray; int pix[2]; pix[1] = 0; ft_set_param(dt); while (pix[1] < Y_MAX) { pix[0] = 0; while (pix[0] < X_MAX) { ray = (t_ray *)malloc(sizeof(t_ray)); ray->pix[1] = pix[1]; ray->pix[0] = pix[0]; ft_init_ray(ray, dt); ft_inter(ray, obj); ft_get_color(ray, obj); ft_mlx_add_col(dt, ray); pix[0] = pix[0] + 1; free(ray); } pix[1] = pix[1] + 1; mlx_put_image_to_window(dt->conn, dt->win, dt->img, 0, 0); } }
void ft_rc_th(t_env *env) { pthread_t th[4]; t_dt dt[4]; t_dt *save; ft_set_param(env->dt); save = env->dt; ft_init_th(env->dt, dt); env->dt = &dt[0]; if (pthread_create(&th[0], NULL, ft_rc_th1, env)) write(1, "error thread\n", 13); env->dt = &dt[1]; if (pthread_create(&th[1], NULL, ft_rc_th2, env)) write(1, "error thread\n", 13); env->dt = &dt[2]; if (pthread_create(&th[2], NULL, ft_rc_th3, env)) write(1, "error thread\n", 13); env->dt = &dt[3]; if (pthread_create(&th[3], NULL, ft_rc_th4, env)) write(1, "error thread\n", 13); pthread_join(th[0], NULL); pthread_join(th[1], NULL); pthread_join(th[2], NULL); pthread_join(th[3], NULL); env->dt = save; ft_join_th(env, dt); }
void ft_ray_cast_threads(t_env *env) { int ij[2]; ft_set_param(env->dt); if (env->dt->th_nb <= 0) env->dt->th_nb = 1; if (env->dt->th_nb == 1) ft_ray_cast(env); else { ft_threads(env); if (env->dt->opt_f == 0 && env->dt->opt_aa) ft_antialiase(env); else { ij[0] = -1; while (++ij[0] < env->dt->y_max) { ij[1] = -1; while (++ij[1] < env->dt->x_max) free(env->dt->img_i[ij[0]][ij[1]]); free(env->dt->img_i[ij[0]]); } free(env->dt->img_i); } } }
void ft_init_th(t_dt *dt_i, t_dt dt[4]) { int i; i = -1; while (++i < 4) { dt[i].img_c = (char *)malloc(sizeof(char) * X_MAX * Y_MAX / 4); dt[i].s_line = dt->s_line; dt[i].bpp = dt->bpp; dt[i].cam_pos[0] = dt_i->cam_pos[0]; dt[i].cam_pos[1] = dt_i->cam_pos[1]; dt[i].cam_pos[2] = dt_i->cam_pos[2]; dt[i].opt_f = dt_i->opt_f; dt[i].delta = dt_i->delta; ft_set_param(&dt[i]); } }