aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCharles <sircharlesaze@gmail.com>2020-05-09 21:31:30 +0200
committerCharles <sircharlesaze@gmail.com>2020-05-09 21:33:14 +0200
commit0ae5be6c6697f5f5f578a27c5ad9ba845aec43c9 (patch)
tree4cda3590f185cb485bf57e2dbd3d9b8b81dba6d7
parent6618fed5933f26d9bee8a42f049115146d4a1113 (diff)
downloadscop-0ae5be6c6697f5f5f578a27c5ad9ba845aec43c9.tar.gz
scop-0ae5be6c6697f5f5f578a27c5ad9ba845aec43c9.tar.bz2
scop-0ae5be6c6697f5f5f578a27c5ad9ba845aec43c9.zip
Added basic vector and matrix library
-rw-r--r--Makefile6
-rw-r--r--inc/scop.h35
-rw-r--r--res/basic_cube.obj14
-rw-r--r--res/cube.mtl12
-rw-r--r--res/cube.obj40
-rw-r--r--src/main.c47
-rw-r--r--src/parse.c83
m---------vendor/libft0
-rw-r--r--vendor/libftm/Makefile49
-rw-r--r--vendor/libftm/README.md3
-rw-r--r--vendor/libftm/inc/libftm_vec3.h31
-rw-r--r--vendor/libftm/inc/libftm_vec4.h30
-rw-r--r--vendor/libftm/libft.abin0 -> 12818 bytes
-rw-r--r--vendor/libftm/src/vec3/ftm_vec3add.c21
-rw-r--r--vendor/libftm/src/vec3/ftm_vec3cross.c26
-rw-r--r--vendor/libftm/src/vec3/ftm_vec3dot.c20
-rw-r--r--vendor/libftm/src/vec3/ftm_vec3scale.c21
-rw-r--r--vendor/libftm/src/vec3/ftm_vec3sub.c21
-rw-r--r--vendor/libftm/src/vec4/ftm_vec4add.c22
-rw-r--r--vendor/libftm/src/vec4/ftm_vec4dot.c21
-rw-r--r--vendor/libftm/src/vec4/ftm_vec4scale.c22
-rw-r--r--vendor/libftm/src/vec4/ftm_vec4sub.c22
22 files changed, 524 insertions, 22 deletions
diff --git a/Makefile b/Makefile
index 1945278..ac009ed 100644
--- a/Makefile
+++ b/Makefile
@@ -6,7 +6,7 @@
# By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ #
# +#+#+#+#+#+ +#+ #
# Created: 2020/05/09 10:24:52 by charles #+# #+# #
-# Updated: 2020/05/09 10:38:27 by charles ### ########.fr #
+# Updated: 2020/05/09 10:42:39 by charles ### ########.fr #
# #
# **************************************************************************** #
@@ -21,7 +21,7 @@ INC_DIR = inc
OBJ_DIR = obj
CC = gcc
-CCFLAGS = -I$(LIBFT_DIR)/include -I$(INCLUDE_DIR) \
+CCFLAGS = -I$(LIBFT_DIR)/include -I$(INC_DIR) \
-Wall -Wextra #-Werror
LDFLAGS = -L$(LIBFT_DIR) -lft
@@ -42,7 +42,7 @@ prebuild:
$(NAME): $(OBJ)
$(CC) -o $@ $^ $(LDFLAGS)
-$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c
+$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c $(INC)
$(CC) $(CCFLAGS) -c -o $@ $<
cleanloc:
diff --git a/inc/scop.h b/inc/scop.h
new file mode 100644
index 0000000..8ae9864
--- /dev/null
+++ b/inc/scop.h
@@ -0,0 +1,35 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* scop.h :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2020/05/09 10:41:44 by charles #+# #+# */
+/* Updated: 2020/05/09 11:41:48 by charles ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#ifndef SCOP_H
+# define SCOP_H
+
+# include <unistd.h>
+# include <fcntl.h>
+# include <GL/glew.h>
+# include <GLFW/glfw3.h>
+# include "libft.h"
+# include "libft_vec.h"
+
+typedef struct
+{
+ float *vertices;
+ unsigned int indices;
+} t_object;
+
+/*
+** parse.c
+*/
+
+int parse(char *filepath, t_object *object);
+
+#endif
diff --git a/res/basic_cube.obj b/res/basic_cube.obj
new file mode 100644
index 0000000..9884f37
--- /dev/null
+++ b/res/basic_cube.obj
@@ -0,0 +1,14 @@
+v 1.000000 1.000000 -1.000000
+v 1.000000 -1.000000 -1.000000
+v 1.000000 1.000000 1.000000
+v 1.000000 -1.000000 1.000000
+v -1.000000 1.000000 -1.000000
+v -1.000000 -1.000000 -1.000000
+v -1.000000 1.000000 1.000000
+v -1.000000 -1.000000 1.000000
+f 1 5 7 3
+f 4 3 7 8
+f 8 7 5 6
+f 6 2 4 8
+f 2 1 3 4
+f 6 5 1 2
diff --git a/res/cube.mtl b/res/cube.mtl
new file mode 100644
index 0000000..e8374a5
--- /dev/null
+++ b/res/cube.mtl
@@ -0,0 +1,12 @@
+# Blender MTL File: 'None'
+# Material Count: 1
+
+newmtl Material
+Ns 323.999994
+Ka 1.000000 1.000000 1.000000
+Kd 0.800000 0.800000 0.800000
+Ks 0.500000 0.500000 0.500000
+Ke 0.000000 0.000000 0.000000
+Ni 1.450000
+d 1.000000
+illum 2
diff --git a/res/cube.obj b/res/cube.obj
new file mode 100644
index 0000000..fbcb334
--- /dev/null
+++ b/res/cube.obj
@@ -0,0 +1,40 @@
+# Blender v2.82 (sub 7) OBJ File: ''
+# www.blender.org
+mtllib cube.mtl
+o Cube
+v 1.000000 1.000000 -1.000000
+v 1.000000 -1.000000 -1.000000
+v 1.000000 1.000000 1.000000
+v 1.000000 -1.000000 1.000000
+v -1.000000 1.000000 -1.000000
+v -1.000000 -1.000000 -1.000000
+v -1.000000 1.000000 1.000000
+v -1.000000 -1.000000 1.000000
+vt 0.625000 0.500000
+vt 0.875000 0.500000
+vt 0.875000 0.750000
+vt 0.625000 0.750000
+vt 0.375000 0.750000
+vt 0.625000 1.000000
+vt 0.375000 1.000000
+vt 0.375000 0.000000
+vt 0.625000 0.000000
+vt 0.625000 0.250000
+vt 0.375000 0.250000
+vt 0.125000 0.500000
+vt 0.375000 0.500000
+vt 0.125000 0.750000
+vn 0.0000 1.0000 0.0000
+vn 0.0000 0.0000 1.0000
+vn -1.0000 0.0000 0.0000
+vn 0.0000 -1.0000 0.0000
+vn 1.0000 0.0000 0.0000
+vn 0.0000 0.0000 -1.0000
+usemtl Material
+s off
+f 1/1/1 5/2/1 7/3/1 3/4/1
+f 4/5/2 3/4/2 7/6/2 8/7/2
+f 8/8/3 7/9/3 5/10/3 6/11/3
+f 6/12/4 2/13/4 4/5/4 8/14/4
+f 2/13/5 1/1/5 3/4/5 4/5/5
+f 6/11/6 5/10/6 1/1/6 2/13/6
diff --git a/src/main.c b/src/main.c
index fc50f41..3eb0acc 100644
--- a/src/main.c
+++ b/src/main.c
@@ -6,33 +6,42 @@
/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/05/09 10:20:09 by charles #+# #+# */
-/* Updated: 2020/05/09 10:39:09 by charles ### ########.fr */
+/* Updated: 2020/05/09 11:08:59 by charles ### ########.fr */
/* */
/* ************************************************************************** */
-#include "libft.h"
-#include <GL/glew.h>
-#include <GLFW/glfw3.h>
+#include "scop.h"
int main(int argc, char **argv)
{
- GLFWwindow* window;
+ /* GLFWwindow *window; */
+ float *buffer;
- if (!glfwInit())
- return -1;
- window = glfwCreateWindow(640, 480, "Hello World", NULL, NULL);
- if (!window)
+ if (argc != 2)
{
- glfwTerminate();
- return -1;
+ ft_putstr("Usage: ");
+ ft_putstr(argv[0]);
+ ft_putendl(" [obj file]");
+ return (1);
}
- glfwMakeContextCurrent(window);
- while (!glfwWindowShouldClose(window))
- {
- glClear(GL_COLOR_BUFFER_BIT);
- glfwSwapBuffers(window);
- glfwPollEvents();
- }
- glfwTerminate();
+ if ((buffer = parse(argv[1])) == NULL)
+ return 1;
+
+ /* if (!glfwInit()) */
+ /* return 1; */
+ /* window = glfwCreateWindow(640, 480, "Hello World", NULL, NULL); */
+ /* if (window == NULL) */
+ /* { */
+ /* glfwTerminate(); */
+ /* return 1; */
+ /* } */
+ /* glfwMakeContextCurrent(window); */
+ /* while (!glfwWindowShouldClose(window)) */
+ /* { */
+ /* glClear(GL_COLOR_BUFFER_BIT); */
+ /* glfwSwapBuffers(window); */
+ /* glfwPollEvents(); */
+ /* } */
+ /* glfwTerminate(); */
return 0;
}
diff --git a/src/parse.c b/src/parse.c
new file mode 100644
index 0000000..4add0b3
--- /dev/null
+++ b/src/parse.c
@@ -0,0 +1,83 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* parse.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2020/05/09 11:02:00 by charles #+# #+# */
+/* Updated: 2020/05/09 12:07:36 by charles ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "scop.h"
+
+#define SCOP_VEC_DEFAULT_SIZE 32
+
+static int st_parse_line(char *line, t_ftvec *vertices, t_ftvec *indices)
+{
+ unsigned int tmp;
+ float tmpf;
+
+ if (*line == 'v')
+ {
+ tmpf = ft_strtof(line, &line);
+ ft_vecpush(indices, *((void**)&tmp));
+ tmpf = ft_strtof(line, &line);
+ ft_vecpush(indices, *((void**)&tmp));
+ tmpf = ft_strtof(line, &line);
+ ft_vecpush(indices, *((void**)&tmp));
+ }
+ if (*line == 'f')
+ {
+ tmp = ft_strtol(line, &line, 10);
+ ft_vecpush(indices, *((void**)&tmp));
+ tmp = ft_strtol(line, &line, 10);
+ ft_vecpush(indices, *((void**)&tmp));
+ tmp = ft_strtol(line, &line, 10);
+ ft_vecpush(indices, *((void**)&tmp));
+ }
+
+
+ return (0);
+}
+
+static int st_parse_file(int fd, t_ftvec *vertices, t_ftvec *indices)
+{
+ char *line;
+ int ret;
+
+ while ((ret = ft_getline(fd, &line)) == FT_LINE)
+ {
+ ret = st_parse_line(line, vertices, indices);
+ free(line);
+ if (ret == -1)
+ break ;
+ }
+ if (ret == FT_ERROR)
+ return (-1);
+ if (*line != '\0')
+ {
+ free(line);
+ return (-1);
+ }
+ return (0);
+}
+
+int parse(char *filepath, t_object *object)
+{
+ int fd;
+ t_ftvec *vertices;
+ t_ftvec *indices;
+
+ if ((fd = open(filepath, O_RDONLY)) == -1)
+ return (-1);
+ if ((vertices = ft_vecnew(SCOP_VEC_DEFAULT_SIZE)) == NULL)
+ return (-1);
+ if ((indices = ft_vecnew(SCOP_VEC_DEFAULT_SIZE)) == NULL)
+ return (-1);
+ st_parse_file(fd, vertices, indices);
+ object->vertices = (float*)ft_vectobuf32(vertices);
+ object->indices = (unsigned int*)ft_vectobuf32(indices);
+ return (0);
+}
diff --git a/vendor/libft b/vendor/libft
-Subproject b5124347359833fcde33452978c62133879c6c9
+Subproject 02abc030a68cb2fdd2f21c96db830ec8cb9176a
diff --git a/vendor/libftm/Makefile b/vendor/libftm/Makefile
new file mode 100644
index 0000000..2348458
--- /dev/null
+++ b/vendor/libftm/Makefile
@@ -0,0 +1,49 @@
+# **************************************************************************** #
+# #
+# ::: :::::::: #
+# Makefile :+: :+: :+: #
+# +:+ +:+ +:+ #
+# By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ #
+# +#+#+#+#+#+ +#+ #
+# Created: 2020/05/09 20:44:53 by charles #+# #+# #
+# Updated: 2020/05/09 21:20:08 by charles ### ########.fr #
+# #
+# **************************************************************************** #
+
+LIB = ar rcs
+RM = rm -f
+
+SRC_DIR = src
+INC_DIR = inc
+OBJ_DIR = obj
+
+CC = gcc
+OFLAG ?= -O0
+CCFLAGS = $(OFLAG) -I$(INC_DIR) -Wall -Wextra -Werror
+
+NAME = libft.a
+
+SRC = $(shell find $(SRC_DIR) -type f -name '*.c')
+INC = $(shell find $(INC_DIR) -type f -name '*.h')
+OBJ = $(SRC:$(SRC_DIR)/%.c=$(OBJ_DIR)/%.o)
+
+OBJ_SUB_DIR = $(shell find $(SRC_DIR) -type d | sed 's/$(SRC_DIR)/$(OBJ_DIR)/')
+
+all: prebuild $(NAME)
+
+prebuild:
+ mkdir -p $(OBJ_DIR) $(OBJ_SUB_DIR)
+
+$(NAME): $(OBJ) $(INC)
+ $(LIB) $@ $(OBJ)
+
+$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c
+ $(CC) $(CCFLAGS) -c -o $@ $<
+
+clean:
+ $(RM) $(OBJ)
+
+fclean: clean
+ $(RM) $(NAME)
+
+re: fclean all
diff --git a/vendor/libftm/README.md b/vendor/libftm/README.md
new file mode 100644
index 0000000..0d0fbb0
--- /dev/null
+++ b/vendor/libftm/README.md
@@ -0,0 +1,3 @@
+# libftm
+
+Matrix and vector extension of the libft
diff --git a/vendor/libftm/inc/libftm_vec3.h b/vendor/libftm/inc/libftm_vec3.h
new file mode 100644
index 0000000..fc86dcb
--- /dev/null
+++ b/vendor/libftm/inc/libftm_vec3.h
@@ -0,0 +1,31 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* libftm_vec3.h :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2020/05/09 20:38:30 by charles #+# #+# */
+/* Updated: 2020/05/09 21:12:05 by charles ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#ifndef LIBFTM_VEC3_H
+# define LIBFTM_VEC3_H
+
+/*
+** \brief 3 component vector [x, y, z]
+*/
+
+typedef struct
+{
+ float v[3];
+} t_ftmvec3;
+
+t_ftmvec3 *ftm_vec3add(t_ftmvec3 *dst, t_ftmvec3 *other);
+t_ftmvec3 *ftm_vec3sub(t_ftmvec3 *dst, t_ftmvec3 *other);
+float ftm_vec3dot(t_ftmvec3 *a, t_ftmvec3 *b);
+void ftm_vec3cross(t_ftmvec3 *dst, t_ftmvec3 *a, t_ftmvec3 *b);
+t_ftmvec3 *ftm_vec3scale(t_ftmvec3 *dst, float scalar);
+
+#endif
diff --git a/vendor/libftm/inc/libftm_vec4.h b/vendor/libftm/inc/libftm_vec4.h
new file mode 100644
index 0000000..e89bd89
--- /dev/null
+++ b/vendor/libftm/inc/libftm_vec4.h
@@ -0,0 +1,30 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* libftm.h :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2020/05/09 20:48:30 by charles #+# #+# */
+/* Updated: 2020/05/09 21:11:12 by charles ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#ifndef LIBFTM_VEC4_H
+# define LIBFTM_VEC4_H
+
+/*
+** \brief 4 component vector [x, y, z, w]
+*/
+
+typedef struct
+{
+ float v[4];
+} t_ftmvec4;
+
+t_ftmvec4 *ftm_vec4add(t_ftmvec4 *dst, t_ftmvec4 *other);
+t_ftmvec4 *ftm_vec4sub(t_ftmvec4 *dst, t_ftmvec4 *other);
+float ftm_vec4dot(t_ftmvec4 *a, t_ftmvec4 *b);
+t_ftmvec4 *ftm_vec4scale(t_ftmvec4 *dst, float scalar);
+
+#endif
diff --git a/vendor/libftm/libft.a b/vendor/libftm/libft.a
new file mode 100644
index 0000000..dc5b185
--- /dev/null
+++ b/vendor/libftm/libft.a
Binary files differ
diff --git a/vendor/libftm/src/vec3/ftm_vec3add.c b/vendor/libftm/src/vec3/ftm_vec3add.c
new file mode 100644
index 0000000..9b5bd09
--- /dev/null
+++ b/vendor/libftm/src/vec3/ftm_vec3add.c
@@ -0,0 +1,21 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ftm_vec3add.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2020/05/09 20:35:59 by charles #+# #+# */
+/* Updated: 2020/05/09 21:14:12 by charles ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libftm_vec3.h"
+
+t_ftmvec3 *ftm_vec3add(t_ftmvec3 *dst, t_ftmvec3 *other)
+{
+ dst->v[0] += other->v[0];
+ dst->v[1] += other->v[1];
+ dst->v[2] += other->v[2];
+ return (dst);
+}
diff --git a/vendor/libftm/src/vec3/ftm_vec3cross.c b/vendor/libftm/src/vec3/ftm_vec3cross.c
new file mode 100644
index 0000000..c27534e
--- /dev/null
+++ b/vendor/libftm/src/vec3/ftm_vec3cross.c
@@ -0,0 +1,26 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ftm_vec3cross.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2020/05/09 21:20:41 by charles #+# #+# */
+/* Updated: 2020/05/09 21:25:44 by charles ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libftm_vec3.h"
+
+/*
+** s1 = a2 * b3 - a3 * b2
+** s2 = a3 * b1 - a1 * b3
+** s3 = a1 * b2 - a2 * b1
+*/
+
+void ftm_vec3cross(t_ftmvec3 *dst, t_ftmvec3 *a, t_ftmvec3 *b)
+{
+ dst->v[0] = a->v[1] * b->v[2] - a->v[2] * b->v[1];
+ dst->v[1] = a->v[2] * b->v[0] - a->v[0] * b->v[2];
+ dst->v[2] = a->v[0] * b->v[1] - a->v[1] * b->v[0];
+}
diff --git a/vendor/libftm/src/vec3/ftm_vec3dot.c b/vendor/libftm/src/vec3/ftm_vec3dot.c
new file mode 100644
index 0000000..5d67ce6
--- /dev/null
+++ b/vendor/libftm/src/vec3/ftm_vec3dot.c
@@ -0,0 +1,20 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ftm_vec3dot.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2020/05/09 21:06:09 by charles #+# #+# */
+/* Updated: 2020/05/09 21:14:44 by charles ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libftm_vec3.h"
+
+float ftm_vec3dot(t_ftmvec3 *a, t_ftmvec3 *b)
+{
+ return (a->v[0] * b->v[0] +
+ a->v[1] * b->v[1] +
+ a->v[2] * b->v[2]);
+}
diff --git a/vendor/libftm/src/vec3/ftm_vec3scale.c b/vendor/libftm/src/vec3/ftm_vec3scale.c
new file mode 100644
index 0000000..8782675
--- /dev/null
+++ b/vendor/libftm/src/vec3/ftm_vec3scale.c
@@ -0,0 +1,21 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ftm_vec3scale.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2020/05/09 21:00:32 by charles #+# #+# */
+/* Updated: 2020/05/09 21:14:10 by charles ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libftm_vec3.h"
+
+t_ftmvec3 *ftm_vec3scale(t_ftmvec3 *dst, float scalar)
+{
+ dst->v[0] *= scalar;
+ dst->v[1] *= scalar;
+ dst->v[2] *= scalar;
+ return (dst);
+}
diff --git a/vendor/libftm/src/vec3/ftm_vec3sub.c b/vendor/libftm/src/vec3/ftm_vec3sub.c
new file mode 100644
index 0000000..880acbc
--- /dev/null
+++ b/vendor/libftm/src/vec3/ftm_vec3sub.c
@@ -0,0 +1,21 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ftm_vec3sub.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2020/05/09 20:57:33 by charles #+# #+# */
+/* Updated: 2020/05/09 21:14:20 by charles ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libftm_vec3.h"
+
+t_ftmvec3 *ftm_vec3sub(t_ftmvec3 *dst, t_ftmvec3 *other)
+{
+ dst->v[0] -= other->v[0];
+ dst->v[1] -= other->v[1];
+ dst->v[2] -= other->v[2];
+ return (dst);
+}
diff --git a/vendor/libftm/src/vec4/ftm_vec4add.c b/vendor/libftm/src/vec4/ftm_vec4add.c
new file mode 100644
index 0000000..bf8ef1d
--- /dev/null
+++ b/vendor/libftm/src/vec4/ftm_vec4add.c
@@ -0,0 +1,22 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ftm_vec4add.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2020/05/09 20:45:59 by charles #+# #+# */
+/* Updated: 2020/05/09 21:15:07 by charles ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libftm_vec4.h"
+
+t_ftmvec4 *ftm_vec4add(t_ftmvec4 *dst, t_ftmvec4 *other)
+{
+ dst->v[0] += other->v[0];
+ dst->v[1] += other->v[1];
+ dst->v[2] += other->v[2];
+ dst->v[3] += other->v[3];
+ return (dst);
+}
diff --git a/vendor/libftm/src/vec4/ftm_vec4dot.c b/vendor/libftm/src/vec4/ftm_vec4dot.c
new file mode 100644
index 0000000..dc8864a
--- /dev/null
+++ b/vendor/libftm/src/vec4/ftm_vec4dot.c
@@ -0,0 +1,21 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ftm_vec4dot.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2020/05/09 21:06:09 by charles #+# #+# */
+/* Updated: 2020/05/09 21:15:32 by charles ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libftm_vec4.h"
+
+float ftm_vec4dot(t_ftmvec4 *a, t_ftmvec4 *b)
+{
+ return (a->v[0] * b->v[0] +
+ a->v[1] * b->v[1] +
+ a->v[2] * b->v[2] +
+ a->v[3] * b->v[3]);
+}
diff --git a/vendor/libftm/src/vec4/ftm_vec4scale.c b/vendor/libftm/src/vec4/ftm_vec4scale.c
new file mode 100644
index 0000000..ddff937
--- /dev/null
+++ b/vendor/libftm/src/vec4/ftm_vec4scale.c
@@ -0,0 +1,22 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ftm_vec4scale.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2020/05/09 21:00:42 by charles #+# #+# */
+/* Updated: 2020/05/09 21:15:21 by charles ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libftm_vec4.h"
+
+t_ftmvec4 *ftm_vec4scale(t_ftmvec4 *dst, float scalar)
+{
+ dst->v[0] *= scalar;
+ dst->v[1] *= scalar;
+ dst->v[2] *= scalar;
+ dst->v[3] *= scalar;
+ return (dst);
+}
diff --git a/vendor/libftm/src/vec4/ftm_vec4sub.c b/vendor/libftm/src/vec4/ftm_vec4sub.c
new file mode 100644
index 0000000..8082ddd
--- /dev/null
+++ b/vendor/libftm/src/vec4/ftm_vec4sub.c
@@ -0,0 +1,22 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ftm_vec4sub.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2020/05/09 20:57:43 by charles #+# #+# */
+/* Updated: 2020/05/09 21:15:13 by charles ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libftm_vec4.h"
+
+t_ftmvec4 *ftm_vec4sub(t_ftmvec4 *dst, t_ftmvec4 *other)
+{
+ dst->v[0] -= other->v[0];
+ dst->v[1] -= other->v[1];
+ dst->v[2] -= other->v[2];
+ dst->v[3] -= other->v[3];
+ return (dst);
+}