void ft_init_trans(t_ray *ray, t_ray *tran, t_obj *obj) { float k; float n; float scal; float *tmp; float *tmp2; tmp2 = ft_intxvect(-1, ray->norm); ft_li_pos(tmp2, tran); free(tmp2); ray->tran = tran; n = ft_get_inds(ray, obj); scal = ft_prod_scal(ray->v, ray->norm); if (1 + n * n * (scal * scal - 1) > 0) k = n * scal - sqrt((1 + n * n * (scal * scal - 1))); else k = n * scal; tmp = ft_intxvect(k, ray->norm); tmp[0] = n * ray->v[0] + tmp[0]; tmp[1] = n * ray->v[1] + tmp[1]; tmp[2] = n * ray->v[2] + tmp[2]; tmp = ft_norm_vect(tmp); tran->v[0] = tmp[0]; tran->v[1] = tmp[1]; tran->v[2] = tmp[2]; free(tmp); }
static void ft_get_vector(t_dt *dt, t_ray *ray) { float X; float Y; float **tmp; float del; float *tmp2; tmp = (float **)malloc(sizeof(float *) * 3); del = 2 / (float)X_MAX; tmp[0] = ft_intxvect(dt->foc, dt->axes[0]); X = del * ((float)X_MAX / 2 - ((float)ray->pix[0] + 0.5)); Y = del * ((float)Y_MAX / 2 - ((float)ray->pix[1] + 0.5)); tmp[1] = ft_intxvect(X, dt->axes[1]); tmp[2] = ft_intxvect(Y, dt->axes[2]); tmp2 = ft_calc_vect(tmp); tmp2 = ft_norm_vect(tmp2); ray->v[0] = tmp2[0]; ray->v[1] = tmp2[1]; ray->v[2] = tmp2[2]; free(tmp[0]); free(tmp[1]); free(tmp[2]); free(tmp); free(tmp2); }
void ft_set_param(t_dt *dt) { float *tmp; dt->foc = 1 / tan(PHI / 2); tmp = ft_intxvect(-1, dt->cam_pos); tmp = ft_norm_vect(tmp); dt->dir[0] = tmp[0]; dt->dir[1] = tmp[1]; dt->dir[2] = tmp[2]; free(tmp); ft_get_axes(dt); }
void ft_set_param(t_dt *dt) { float *tmp; tmp = ft_intxvect(-1, dt->cam_pos); tmp = ft_norm_vect(tmp); dt->dir[0] = tmp[0]; dt->dir[1] = tmp[1]; dt->dir[2] = tmp[2]; free(tmp); ft_get_w(dt); ft_get_v(dt); }
float *ft_refl(float v[3], float n[3]) { float *refl; float prod; prod = ft_prod_scal(n, v); refl = ft_intxvect(2 * prod, n); refl[0] = refl[0] - v[0]; refl[1] = refl[1] - v[1]; refl[2] = refl[2] - v[2]; refl = ft_norm_vect(refl); return (refl); }
static void ft_get_w(t_dt *dt) { float *tmp; float scal; scal = ft_prod_scal(dt->dir, dt->axes[2]); tmp = ft_intxvect(scal, dt->dir); tmp[0] = dt->axes[2][0] - tmp[0]; tmp[1] = dt->axes[2][1] - tmp[1]; tmp[2] = dt->axes[2][2] - tmp[2]; tmp = ft_norm_vect(tmp); dt->mat_w[0] = tmp[0]; dt->mat_w[1] = tmp[1]; dt->mat_w[2] = tmp[2]; free(tmp); }
static float *ft_mat_z(float v[3], float axes[3][3]) { float *mat_z; float scal; scal = ft_prod_scal(v, axes[2]); mat_z = ft_intxvect(scal, v); mat_z[0] = axes[2][0] - mat_z[0]; mat_z[1] = axes[2][1] - mat_z[1]; mat_z[2] = axes[2][2] - mat_z[2]; if (mat_z[0] == 0 && mat_z[1] == 0 && mat_z[2] == 0) { mat_z[0] = axes[0][0]; mat_z[1] = axes[0][1]; mat_z[2] = axes[0][2]; } mat_z = ft_norm_vect(mat_z); return (mat_z); }