/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* set_camera.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: gbrochar +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/02/07 15:12:51 by gbrochar #+# #+# */ /* Updated: 2019/02/22 17:28:43 by gbrochar ### ########.fr */ /* */ /* ************************************************************************** */ #include "rtv1.h" void set_orientation(t_camera *camera) { camera->uv = vec(0, 1, 0); camera->rv = cross_product(camera->uv, camera->d); normalize(&camera->rv); camera->uv = cross_product(camera->d, camera->rv); camera->ul = vec_add(camera->o, vec_add(vec_mul(camera->d, camera->dist), vec_sub(vec_mul(camera->uv, (camera->height / 2)), vec_mul(camera->rv, (camera->width / 2))))); } void init_camera(t_camera *camera) { if (WINX > WINY) { camera->height = 1 / ZOOM; camera->width = WINX / WINY * (1 / ZOOM); } else { camera->width = 1 / ZOOM; camera->height = WINX / WINY * (1 / ZOOM); } camera->dist = VP_DIST; camera->o = vec(0, 0, 0); camera->d = vec(0, 0, -1); set_orientation(camera); } int set_camera(char **data, t_env *e) { int i; i = 0; ft_putendl("Setting camera"); while (data[i] && i < 7) ++i; if (i > 3) e->camera.o = vec(ft_atof(data[1]), ft_atof(data[2]), ft_atof(data[3])); if (i > 6) { e->camera.d = vec(ft_atof(data[4]), ft_atof(data[5]), ft_atof(data[6])); e->camera.d = vec_sub(e->camera.d, e->camera.o); if (FAILURE == check_direction(e->camera.d)) return (FAILURE); normalize(&e->camera.d); if ((e->camera.d.y + E > 1 && e->camera.d.y - E < 1) || (e->camera.d.y + E > -1 && e->camera.d.y - E < -1)) e->camera.d.x = 0.01; normalize(&e->camera.d); set_orientation(&e->camera); } return (SUCCESS); }