diff --git a/Makefile b/Makefile index b1be310..5654148 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ # By: gbrochar +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2020/12/17 19:47:03 by gbrochar #+# #+# # -# Updated: 2020/12/23 10:49:53 by gbrochar ### ########.fr # +# Updated: 2020/12/23 17:05:36 by gbrochar ### ########.fr # # # # **************************************************************************** # @@ -18,6 +18,8 @@ SRC_FILE = main.c \ env.c \ mat4_transpose.c \ mat4_multiply.c \ + mat4_perspective.c \ + mat4_lookat.c \ OBJ_FILE = $(SRC_FILE:.c=.o) @@ -31,7 +33,7 @@ SRC = $(addprefix $(SRC_DIR), $(SRC_FILE)) OBJ = $(addprefix $(OBJ_DIR), $(OBJ_FILE)) INC = $(addprefix $(INC_DIR), $(INC_FILE)) -LIB = +LIB = -lm CC = gcc diff --git a/inc/mat4.h b/inc/mat4.h index 726aa28..c66d424 100644 --- a/inc/mat4.h +++ b/inc/mat4.h @@ -6,7 +6,7 @@ /* By: gbrochar +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/12/22 20:35:00 by gbrochar #+# #+# */ -/* Updated: 2020/12/23 16:12:55 by gbrochar ### ########.fr */ +/* Updated: 2020/12/23 17:04:47 by gbrochar ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,6 +14,7 @@ # define MAT4_H # include "vec4.h" +# include typedef struct s_mat4 t_mat4; typedef struct s_persp_tool t_persp_tool; diff --git a/inc/scop.h b/inc/scop.h index 17f4436..d79a2b6 100644 --- a/inc/scop.h +++ b/inc/scop.h @@ -6,7 +6,7 @@ /* By: gbrochar +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/12/22 12:08:22 by gbrochar #+# #+# */ -/* Updated: 2020/12/22 20:15:56 by gbrochar ### ########.fr */ +/* Updated: 2020/12/23 16:23:16 by gbrochar ### ########.fr */ /* */ /* ************************************************************************** */ @@ -25,6 +25,8 @@ # define BUFFER_SIZE 4096 +# define EPSILON 0.000001 + typedef enum e_gl_buf_type t_gl_buf_type; enum e_gl_buf_type diff --git a/inc/vec3.h b/inc/vec3.h new file mode 100644 index 0000000..58ad3c4 --- /dev/null +++ b/inc/vec3.h @@ -0,0 +1,25 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* vec3.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: gbrochar +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/12/23 16:14:13 by gbrochar #+# #+# */ +/* Updated: 2020/12/23 16:14:28 by gbrochar ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef VEC3_H +# define VEC3_H + +typedef struct s_vec3 t_vec3; + +struct s_vec3 +{ + double x; + double y; + double z; +}; + +#endif diff --git a/src/mat4_lookat.c b/src/mat4_lookat.c new file mode 100644 index 0000000..c02f6c3 --- /dev/null +++ b/src/mat4_lookat.c @@ -0,0 +1,125 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* mat4_lookat.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: gbrochar +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/12/23 16:14:47 by gbrochar #+# #+# */ +/* Updated: 2020/12/23 17:05:21 by gbrochar ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "mat4.h" +#include "vec3.h" +#include "scop.h" + +t_mat4 mat4_lookat_make_mat(t_vec3 x, t_vec3 y, t_vec3 z, t_vec3 eye) +{ + t_mat4 ret; + + ret.data[0] = x.x; + ret.data[1] = x.y; + ret.data[2] = x.z; + ret.data[3] = 0; + ret.data[4] = y.x; + ret.data[5] = y.y; + ret.data[6] = y.z; + ret.data[7] = 0; + ret.data[8] = z.x; + ret.data[9] = z.y; + ret.data[10] = z.z; + ret.data[11] = 0; + ret.data[12] = -(x.x * eye.x + x.y * eye.y + x.z * eye.z); + ret.data[13] = -(y.x * eye.x + y.y * eye.y + y.z * eye.z); + ret.data[14] = -(z.x * eye.x + z.y * eye.y + z.z * eye.z); + ret.data[15] = 1; + return (ret); +} + +t_vec3 mat4_lookat_make_y(t_vec3 x, t_vec3 z) +{ + t_vec3 y; + double len; + + y.x = z.y * x.z - z.z * x.y; + y.y = z.z * x.x - z.x * x.z; + y.z = z.x * x.y - z.y * x.x; + len = y.x * y.x + y.y * y.y + y.z * y.z; + if (len - EPSILON < 0 && len + EPSILON > 0) + { + y.x = 0; + y.y = 0; + y.z = 0; + } + else + { + len = 1.0 / sqrt(len); + y.x *= len; + y.y *= len; + y.z *= len; + } + return (y); +} + +t_vec3 mat4_lookat_make_x(t_vec3 z, t_vec3 up) +{ + t_vec3 x; + double len; + + x.x = up.y * z.z - up.z * z.y; + x.y = up.z * z.x - up.x * z.z; + x.z = up.x * z.y - up.y * z.x; + len = x.x * x.x + x.y * x.y + x.z * x.z; + if (len - EPSILON < 0 && len + EPSILON > 0) + { + x.x = 0; + x.y = 0; + x.z = 0; + } + else + { + len = 1.0 / sqrt(len); + x.x *= len; + x.y *= len; + x.z *= len; + } + return (x); +} + +t_vec3 mat4_lookat_make_z(t_vec3 eye, t_vec3 target) +{ + t_vec3 z; + double len; + + z.x = eye.x - target.x; + z.y = eye.y - target.y; + z.z = eye.z - target.z; + len = z.x * z.x + z.y * z.y + z.z * z.z; + if (len - EPSILON < 0 && len + EPSILON > 0) + { + z.x = 0; + z.y = 0; + z.z = 1; + } + else + { + len = 1.0 / sqrt(len); + z.x *= len; + z.y *= len; + z.z *= len; + } + return (z); +} + +t_mat4 mat4_lookat(t_vec3 eye, t_vec3 up, t_vec3 target) +{ + t_vec3 z; + t_vec3 x; + t_vec3 y; + + z = mat4_lookat_make_z(eye, target); + x = mat4_lookat_make_x(z, up); + y = mat4_lookat_make_y(x, z); + return (mat4_lookat_make_mat(x, y, z, eye)); +}