From 92736963a6f1fa17b6dad6e21c8713f9ce6d0cac Mon Sep 17 00:00:00 2001 From: Gregory Date: Fri, 3 Mar 2017 21:51:09 +0200 Subject: [PATCH] reading map --- CMakeLists.txt | 6 +- Makefile | 7 +- inc/fdf.h | 19 ++- libft/ft_read_file.c | 4 +- src/free_tab.c | 8 ++ src/main.c | 286 ++++++++++++++++++++++++++++--------------- src/map_init.c | 74 +++++++++++ src/pnt_init.c | 17 +++ 8 files changed, 319 insertions(+), 102 deletions(-) create mode 100644 src/free_tab.c create mode 100644 src/map_init.c create mode 100644 src/pnt_init.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 5db04c4..9bc2478 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,7 +7,11 @@ include_directories(inc libft/includes minilibx) # headers link_directories(libft minilibx) # libraries set(SOURCE_FILES - src/main.c src/line.c libft/ft_lst_len.c) # sources + src/main.c + src/line.c + src/map_init.c + src/pnt_init.c + src/free_tab.c) # sources add_executable(fdf ${SOURCE_FILES}) # compilation diff --git a/Makefile b/Makefile index aeee9b8..f9102a7 100644 --- a/Makefile +++ b/Makefile @@ -18,8 +18,11 @@ SRCDIR = ./src/ OBJDIR = ./obj/ -SRC_FILES = main.c \ - line.c +SRC_FILES = main.c \ + line.c \ + map_init.c \ + pnt_init.c \ + free_tab.c OBJ_FILES = $(SRC_FILES:.c=.o) diff --git a/inc/fdf.h b/inc/fdf.h index b5ebc21..2b1cfca 100644 --- a/inc/fdf.h +++ b/inc/fdf.h @@ -13,16 +13,30 @@ #include "mlx.h" #include #include +#include + +typedef struct s_map +{ + t_list *lst_map; + t_list *lst_pnt; + int width; + int height; +} t_map; typedef struct s_vec { double x; double y; double z; - int pos; int color; } t_vec; +typedef struct s_pnt +{ + int x; + int y; +} t_pnt; + typedef struct s_edg { int p1; @@ -47,5 +61,8 @@ typedef struct s_swap } t_swap; void line(t_vec p1, t_vec p2, t_mlx *m); +t_map *map_init(char *path); +t_list *pnt_init(t_list *lst_map); +void free_tab(char **tab); #endif diff --git a/libft/ft_read_file.c b/libft/ft_read_file.c index 1f8f83f..0f8e7a2 100644 --- a/libft/ft_read_file.c +++ b/libft/ft_read_file.c @@ -12,7 +12,7 @@ #include "libft.h" -char *read_file(const int fd) +char *ft_read_file(const int fd) { long readed; long old_size; @@ -24,7 +24,7 @@ char *read_file(const int fd) { buf[readed] = '\0'; old_size = ft_strlen(string); - string = ft_realloc(string, old_size + readed, old_size); + string = ft_realloc(string, old_size + readed + 1, old_size); ft_strcat(string, buf); } return (string); diff --git a/src/free_tab.c b/src/free_tab.c new file mode 100644 index 0000000..c5e29bc --- /dev/null +++ b/src/free_tab.c @@ -0,0 +1,8 @@ +#include "fdf.h" + +void free_tab(char **tab) +{ + while (*tab) + free(*tab++); + free(*tab); +} \ No newline at end of file diff --git a/src/main.c b/src/main.c index e9c689b..841611b 100644 --- a/src/main.c +++ b/src/main.c @@ -7,6 +7,7 @@ #include "fdf.h" #include +#include t_mat4 *mat4_init(void) @@ -16,10 +17,22 @@ t_mat4 *mat4_init(void) mat = NULL; if ((mat = (t_mat4 *)malloc(sizeof(t_mat4)))) { - mat->mx[0][0] = 1.f; - mat->mx[1][1] = 1.f; - mat->mx[2][2] = 1.f; - mat->mx[3][3] = 1.f; + mat->mx[0][0] = 1; + mat->mx[0][1] = 0; + mat->mx[0][2] = 0; + mat->mx[0][3] = 0; + mat->mx[1][0] = 0; + mat->mx[1][1] = 1; + mat->mx[1][2] = 0; + mat->mx[1][3] = 0; + mat->mx[2][0] = 0; + mat->mx[2][1] = 0; + mat->mx[2][2] = 1; + mat->mx[2][3] = 0; + mat->mx[3][0] = 0; + mat->mx[3][1] = 0; + mat->mx[3][2] = 0; + mat->mx[3][3] = 1; } return (mat); } @@ -51,9 +64,20 @@ t_mat4 *mat4_mult(t_mat4 *m1, t_mat4 *m2) return (m3); } +void mat4_translate(t_mat4 *m, double x, double y, double z) +{ + m->mx[0][0] = 1.f; + m->mx[1][1] = 1.f; + m->mx[2][2] = 1.f; + m->mx[3][3] = 1.f; + m->mx[3][0] = x; + m->mx[3][1] = y; + m->mx[3][2] = z; +} + void mat4_z_rot(t_mat4 *m, double angle) { - angle = angle * M_1_PI / 180; + angle = angle * M_PI / 180; m->mx[0][0] = cos(angle); m->mx[0][1] = sin(angle); m->mx[0][2] = 0; @@ -67,7 +91,7 @@ void mat4_z_rot(t_mat4 *m, double angle) void mat4_x_rot(t_mat4 *m, double angle) { - angle = angle * M_1_PI / 180; + angle = angle * M_PI / 180; m->mx[0][0] = 1; m->mx[0][1] = 0; m->mx[0][2] = 0; @@ -81,7 +105,7 @@ void mat4_x_rot(t_mat4 *m, double angle) void mat4_y_rot(t_mat4 *m, double angle) { - angle = angle * M_1_PI / 180; + angle = angle * M_PI / 180; m->mx[0][0] = cos(angle); m->mx[0][1] = 0; m->mx[0][2] = -(sin(angle)); @@ -185,12 +209,11 @@ void circle(t_mlx m) } } -void fill_vec3(double x, double y, double z, t_vec *new, int pos) +void fill_vec3(double x, double y, double z, t_vec *new) { new->x = x; new->y = y; new->z = z; - new->pos = pos; new->color = 0xFFFFFFFF; } @@ -224,24 +247,25 @@ void perspective_transform(t_list *vec_list, t_mlx *mlx, t_vec **points) points[i] = point; points[i]->x = 500 * (1 - (x - xmin) / (xmax - xmin)); points[i]->y = 500 * (1 - (y - ymin) / (ymax - ymin)); - points[i]->color = 0xFFFFFFFF; - mlx_pixel_put(mlx->mlx, mlx->win, (int)points[i]->x, (int)points[i]->y, 0xFFFFFFFF); + points[i]->color = 0xFFFFFF; + mlx_pixel_put(mlx->mlx, mlx->win, (int)points[i]->x, (int)points[i]->y, 0xFFFFFF); vec_list = vec_list->next; i++; } + points[i] = 0; } void edges(t_vec **points, t_list *edg, t_mlx *m) { int p1; int p2; - int i; +// int i; - i = 0; - while (points[i]) { - printf("point x - %f, y - %f\n", points[i]->x, points[i]->y); - i++; - } +// i = 0; +// while (points[i]) { +// printf("point x - %f, y - %f\n", points[i]->x, points[i]->y); +// i++; +// } while (edg) { p1 = ((t_edg *)edg->content)->p1; @@ -268,89 +292,159 @@ void transform(t_mat4 *mat, t_list *v_list) } } +//void cube(t_mlx *m) +//{ +// t_list *vec_list; +// t_list *edg_list; +// t_vec vec; +// t_vec **points; +// t_edg edg; +// int vec_list_length; +// t_mat4 *temp; +// t_mat4 *temp1; +// t_mat4 *temp2; +// t_mat4 *temp3; +// t_mat4 *final_mat; +// int deg; +// +//// struct timespec tw = {0,125000000}; +//// struct timespec tr; +// +// +// vec_list = NULL; +// edg_list = NULL; +// fill_vec3(-0.5, -0.5, 2.5, &vec, 0); +// ft_lstadd_back(&vec_list, &vec, sizeof(t_vec)); +// fill_vec3(-0.5, 0.5, 2.5, &vec, 1); +// ft_lstadd_back(&vec_list, &vec, sizeof(t_vec)); +// fill_vec3(0.5, 0.5, 2.5, &vec, 2); +// ft_lstadd_back(&vec_list, &vec, sizeof(t_vec)); +// fill_vec3(0.5, -0.5, 2.5, &vec, 3); +// ft_lstadd_back(&vec_list, &vec, sizeof(t_vec)); +// fill_vec3(-0.5, -0.5, 3.5, &vec, 4); +// ft_lstadd_back(&vec_list, &vec, sizeof(t_vec)); +// fill_vec3(-0.5, 0.5, 3.5, &vec, 5); +// ft_lstadd_back(&vec_list, &vec, sizeof(t_vec)); +// fill_vec3(0.5, 0.5, 3.5, &vec, 6); +// ft_lstadd_back(&vec_list, &vec, sizeof(t_vec)); +// fill_vec3(0.5, -0.5, 3.5, &vec, 7); +// ft_lstadd_back(&vec_list, &vec, sizeof(t_vec)); +// +// vec_list_length = ft_lst_len(vec_list); +// points = (t_vec **)malloc(sizeof(t_vec *) * (vec_list_length + 1)); +// fill_edg(0, 1, &edg); +// ft_lstadd_back(&edg_list, &edg, sizeof(int[2])); +// fill_edg(1, 2, &edg); +// ft_lstadd_back(&edg_list, &edg, sizeof(int[2])); +// fill_edg(2, 3, &edg); +// ft_lstadd_back(&edg_list, &edg, sizeof(int[2])); +// fill_edg(3, 0, &edg); +// ft_lstadd_back(&edg_list, &edg, sizeof(int[2])); +// fill_edg(0, 4, &edg); +// ft_lstadd_back(&edg_list, &edg, sizeof(int[2])); +// fill_edg(1, 5, &edg); +// ft_lstadd_back(&edg_list, &edg, sizeof(int[2])); +// fill_edg(2, 6, &edg); +// ft_lstadd_back(&edg_list, &edg, sizeof(int[2])); +// fill_edg(3, 7, &edg); +// ft_lstadd_back(&edg_list, &edg, sizeof(int[2])); +// fill_edg(4, 5, &edg); +// ft_lstadd_back(&edg_list, &edg, sizeof(int[2])); +// fill_edg(5, 6, &edg); +// ft_lstadd_back(&edg_list, &edg, sizeof(int[2])); +// fill_edg(6, 7, &edg); +// ft_lstadd_back(&edg_list, &edg, sizeof(int[2])); +// fill_edg(7, 4, &edg); +// ft_lstadd_back(&edg_list, &edg, sizeof(int[2])); +// +// final_mat = mat4_init(); +// temp = mat4_init(); +// temp1 = mat4_init(); +// temp2 = mat4_init(); +// temp3 = mat4_init(); +// +// deg = 0; +// +// mat4_translate(temp, 0, 0, -3.5); +// final_mat = mat4_mult(final_mat, temp); +// mat4_x_rot(temp1, deg); +// final_mat = mat4_mult(final_mat, temp1); +// mat4_y_rot(temp2, deg); +// final_mat = mat4_mult(final_mat, temp2); +// mat4_translate(temp3, 0, 0, 3.5); +// final_mat = mat4_mult(final_mat, temp3); +// transform(final_mat, vec_list); +// perspective_transform(vec_list, m, points); +// edges(points, edg_list, m); +//} + +void quit(t_mlx *m) +{ + mlx_destroy_window(m->mlx, m->win); + exit(0); +} + +int key_hook(int keycode, void *m) +{ + printf("%d\n", keycode); + if (keycode == 65307) + quit(m); +// if (keycode == 123) +// left(mlx); +// if (keycode == 126) +// up(mlx); +// if (keycode == 125) +// down(mlx); + return (0); +} + int main(int argc, char **argv) { - t_mlx m; - t_list *vec_list; - t_list *edg_list; - t_vec vec; - t_vec **points; - t_edg edg; - int vec_list_length; - t_mat4 *mat; +// t_mlx m; + t_map *map; + int i = 0; -// int fd; -// char *line; -// -// if (argc != 2) -// return (0); -// fd = open(argv[1], O_RDONLY); -// // add new get_next_line -// while (get_next_line(fd, &line)) + if (argc != 2) + return (0); + map = map_init(argv[1]); +// while (map->lst_map) // { -// ft_putstr(line); -// ft_putstr("\n"); +// printf("x=%d, y=%d, z=%d", +// (int)(((t_vec *)(map->lst_map->content))->x), +// (int)(((t_vec *)(map->lst_map->content))->y), +// (int)(((t_vec *)(map->lst_map->content))->z)); +// if ((int)(((t_vec *)(map->lst_map->content))->z) == 0) +// printf(" "); +// else +// printf(" "); +// i++; +// if (i == map->width) +// { +// printf("\n"); +// i = 0; +// } +// map->lst_map = map->lst_map->next; // } - - m.mlx = mlx_init(); - m.win = mlx_new_window(m.mlx, 500, 500, "fdf"); - //test_line(m); - //circle(m); - - argc = argc; - argv = argv; - vec_list = NULL; - edg_list = NULL; - fill_vec3(-0.5, -0.5, 2.5, &vec, 0); - ft_lstadd_back(&vec_list, &vec, sizeof(t_vec)); - fill_vec3(-0.5, 0.5, 2.5, &vec, 1); - ft_lstadd_back(&vec_list, &vec, sizeof(t_vec)); - fill_vec3(0.5, 0.5, 2.5, &vec, 2); - ft_lstadd_back(&vec_list, &vec, sizeof(t_vec)); - fill_vec3(0.5, -0.5, 2.5, &vec, 3); - ft_lstadd_back(&vec_list, &vec, sizeof(t_vec)); - fill_vec3(-0.5, -0.5, 3.5, &vec, 4); - ft_lstadd_back(&vec_list, &vec, sizeof(t_vec)); - fill_vec3(-0.5, 0.5, 3.5, &vec, 5); - ft_lstadd_back(&vec_list, &vec, sizeof(t_vec)); - fill_vec3(0.5, 0.5, 3.5, &vec, 6); - ft_lstadd_back(&vec_list, &vec, sizeof(t_vec)); - fill_vec3(0.5, -0.5, 3.5, &vec, 7); - ft_lstadd_back(&vec_list, &vec, sizeof(t_vec)); - - vec_list_length = ft_lst_len(vec_list); - points = (t_vec **)malloc(sizeof(t_vec *) * (vec_list_length + 1)); - fill_edg(0, 1, &edg); - ft_lstadd_back(&edg_list, &edg, sizeof(int[2])); - fill_edg(1, 2, &edg); - ft_lstadd_back(&edg_list, &edg, sizeof(int[2])); - fill_edg(2, 3, &edg); - ft_lstadd_back(&edg_list, &edg, sizeof(int[2])); - fill_edg(3, 0, &edg); - ft_lstadd_back(&edg_list, &edg, sizeof(int[2])); - fill_edg(0, 4, &edg); - ft_lstadd_back(&edg_list, &edg, sizeof(int[2])); - fill_edg(1, 5, &edg); - ft_lstadd_back(&edg_list, &edg, sizeof(int[2])); - fill_edg(2, 6, &edg); - ft_lstadd_back(&edg_list, &edg, sizeof(int[2])); - fill_edg(3, 7, &edg); - ft_lstadd_back(&edg_list, &edg, sizeof(int[2])); - fill_edg(4, 5, &edg); - ft_lstadd_back(&edg_list, &edg, sizeof(int[2])); - fill_edg(5, 6, &edg); - ft_lstadd_back(&edg_list, &edg, sizeof(int[2])); - fill_edg(6, 7, &edg); - ft_lstadd_back(&edg_list, &edg, sizeof(int[2])); - fill_edg(7, 4, &edg); - ft_lstadd_back(&edg_list, &edg, sizeof(int[2])); - - mat = mat4_init(); - - mat4_z_rot(mat, 360); - transform(mat, vec_list); - perspective_transform(vec_list, &m, points); - edges(points, edg_list, &m); - mlx_loop(m.mlx); + map->lst_pnt = pnt_init(map->lst_map); + while (map->lst_map) + { + i++; + map->lst_map = map->lst_map->next; + } + printf("%d\n", i); + i = 0; + while (map->lst_pnt) + { + i++; + map->lst_pnt = map->lst_pnt->next; + } + printf("%d\n", i); +// m.mlx = mlx_init(); +// m.win = mlx_new_window(m.mlx, 1000, 1000, "fdf"); +// test_line(m); +// circle(m); +// cube(&m); +// mlx_key_hook(m.win, key_hook, &m); +// mlx_loop(m.mlx); return (0); } diff --git a/src/map_init.c b/src/map_init.c new file mode 100644 index 0000000..e90fc1b --- /dev/null +++ b/src/map_init.c @@ -0,0 +1,74 @@ +#include "fdf.h" + +void fill_row(t_list **list, int i, char *row, t_map *map) +{ + int j; + char **row_numbers; + t_vec vec3; + + j = 0; + vec3.y = i; + row_numbers = ft_strsplit(row, ' '); + while (row_numbers[j]) + { + vec3.x = j; + vec3.z = ft_atoi(row_numbers[j]); + ft_lstadd_back(list, &vec3, sizeof(t_vec)); + j++; + } + free(row_numbers); + map->width = j; +} + +t_list *to_lst_map(char **tab_map, t_map *map) +{ + int i; + t_list *lst_map; + + lst_map = NULL; + i = 0; + while (tab_map[i]) + { + fill_row(&lst_map, i, tab_map[i], map); + i++; + } + return (lst_map); +} + +char *to_str_map(char *path) +{ + int fd; + + fd = open(path, O_RDONLY); + if (fd != -1) + return (ft_read_file(fd)); + return (0); +} + +int map_heigth(char *str_map) +{ + int h; + + h = 0; + while (*str_map++) + if (*str_map == '\n') + h++; + return (h); +} + +t_map *map_init(char *path) +{ + char *str_map; + char **tab_map; + t_map *map; + + map = malloc(sizeof(t_map)); + str_map = to_str_map(path); + printf("%s\n", str_map); + map->height = map_heigth(str_map); + tab_map = ft_strsplit(str_map, '\n'); + map->lst_map = to_lst_map(tab_map, map); + free(str_map); + free_tab(tab_map); + return (map); +} \ No newline at end of file diff --git a/src/pnt_init.c b/src/pnt_init.c new file mode 100644 index 0000000..b410720 --- /dev/null +++ b/src/pnt_init.c @@ -0,0 +1,17 @@ +#include "fdf.h" + +t_list *pnt_init(t_list *lst_map) +{ + t_list *lst_pnt; + t_pnt *pnt; + + lst_pnt = NULL; + + pnt = malloc(sizeof(t_pnt)); + while (lst_map) + { + ft_lstadd_back(&lst_pnt, pnt, sizeof(t_pnt)); + lst_map = lst_map->next; + } + return (lst_pnt); +}