rtv1/src/set_camera.c

70 lines
2.3 KiB
C

/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* set_camera.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: gbrochar <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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);
}