t_matrix ft_muli_matrix(t_matrix a, t_matrix b) { int i; int j; int p; t_matrix m; i = 0; j = 0; p = 0; m = ft_init_matrix(); while (j < 4) { while (i < 4) { while (p < 4) { m.n[j][i] += a.n[j][p] * b.n[p][i]; p++; } p = 0; i++; } i = 0; j++; } return (m); }
int raytracer(t_obj *obj, t_cam cam) { int i; int j; t_r r; double **c2w; t_save save; if (!(c2w = ft_init_matrix(&cam.b.vx, &cam.b.vy, &cam.b.vz))) return (-1); ft_init_ray(&r); r.o_w = cam.ro; j = -1; while (++j < HEIGHT) { i = -1; while (++i < WIDTH) { obj->depth = 0; ft_find_pixel_pos_on_screen(&cam.rp, i, j); ft_mult_vect_by_matrix(&r.d_w, c2w, cam.rp); ft_vect_difference(&r.d_w, r.d_w, r.o_w); ft_normalize_vect(&r.d_w); obj->pixel[j][i] = ft_trace(*obj, &r, &save); } } return (0); }
void ft_apply_all_matrix(t_scene *scn) { t_matrix a; t_matrix b; t_matrix m; m = ft_init_matrix(); a = ft_scale_matrix(scn->scale); if (scn->projection == 1) scn->rot = ft_get_vector(-1.1, 0.0, 0.80, 1.0); b = ft_rotation_matrix_z(scn->rot); m = ft_muli_matrix(b, a); b = ft_rotation_matrix_y(scn->rot); m = ft_muli_matrix(b, m); b = ft_rotation_matrix_x(scn->rot); m = ft_muli_matrix(b, m); b = ft_translation_matrix(scn->trans); m = ft_muli_matrix(b, m); ft_apply_all_vector(m, scn); }