From 7cc0265f3f0d421bb09d6c987e89ec2723687bce Mon Sep 17 00:00:00 2001 From: gbrochar Date: Wed, 23 Dec 2020 17:58:47 +0100 Subject: [PATCH] triangulate --- Makefile | 3 +- inc/scop.h | 9 +++++- src/main.c | 2 +- src/parse_line.c | 82 +++++++++++++++++++++-------------------------- src/parse_token.c | 59 ++++++++++++++++++++++++++++++++++ 5 files changed, 107 insertions(+), 48 deletions(-) create mode 100644 src/parse_token.c diff --git a/Makefile b/Makefile index 5654148..9b62690 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ # By: gbrochar +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2020/12/17 19:47:03 by gbrochar #+# #+# # -# Updated: 2020/12/23 17:05:36 by gbrochar ### ########.fr # +# Updated: 2020/12/23 17:36:57 by gbrochar ### ########.fr # # # # **************************************************************************** # @@ -15,6 +15,7 @@ NAME = scop SRC_FILE = main.c \ parse_file.c \ parse_line.c \ + parse_token.c \ env.c \ mat4_transpose.c \ mat4_multiply.c \ diff --git a/inc/scop.h b/inc/scop.h index d79a2b6..80cb127 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/23 16:23:16 by gbrochar ### ########.fr */ +/* Updated: 2020/12/23 17:57:54 by gbrochar ### ########.fr */ /* */ /* ************************************************************************** */ @@ -96,6 +96,13 @@ int parse_file(t_env *e); int parse_line(t_env *e, char *line); t_gl_buf_type parse_gl_buf_type(char *token); +void parse_triangulate( + t_buf_i *indices, int token_count); +void parse_append_data_tmp( + t_buf_i *indices, int vertex_count, int *data_tmp); + +int parse_token( + t_env *e, char *token, t_gl_buf_type gl_buf_type); int parse_append_data_d(t_buf_d *buffer, char *token); int parse_append_data_i(t_buf_i *buffer, char *token); diff --git a/src/main.c b/src/main.c index 332c14c..92c6f80 100644 --- a/src/main.c +++ b/src/main.c @@ -6,7 +6,7 @@ /* By: gbrochar +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/12/22 12:02:14 by gbrochar #+# #+# */ -/* Updated: 2020/12/22 20:48:00 by gbrochar ### ########.fr */ +/* Updated: 2020/12/23 17:57:34 by gbrochar ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/src/parse_line.c b/src/parse_line.c index 2c2b490..7fc20ae 100644 --- a/src/parse_line.c +++ b/src/parse_line.c @@ -6,38 +6,12 @@ /* By: gbrochar +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/12/22 18:41:28 by gbrochar #+# #+# */ -/* Updated: 2020/12/22 20:26:47 by gbrochar ### ########.fr */ +/* Updated: 2020/12/23 17:57:40 by gbrochar ### ########.fr */ /* */ /* ************************************************************************** */ #include "scop.h" -int parse_append_data_d(t_buf_d *buffer, char *token) -{ - if (buffer->ptr == buffer->len) - { - buffer->data = (double *)realloc( - buffer->data, sizeof(double) * (buffer->len + BUFFER_SIZE)); - buffer->len += BUFFER_SIZE; - } - buffer->data[buffer->ptr] = atof(token); - buffer->ptr++; - return (SUCCESS); -} - -int parse_append_data_i(t_buf_i *buffer, char *token) -{ - if (buffer->ptr == buffer->len) - { - buffer->data = (int *)realloc( - buffer->data, sizeof(int) * (buffer->len + BUFFER_SIZE)); - buffer->len += BUFFER_SIZE; - } - buffer->data[buffer->ptr] = atoi(token); - buffer->ptr++; - return (SUCCESS); -} - t_gl_buf_type parse_gl_buf_type(char *token) { if (strcmp(token, "v") == SUCCESS) @@ -51,27 +25,43 @@ t_gl_buf_type parse_gl_buf_type(char *token) return (OTHER); } -int parse_token( - t_env *e, - char *token, - t_gl_buf_type gl_buf_type) +void parse_append_data_tmp( + t_buf_i *indices, int vertex_count, int *data_tmp) { - int ret; + int i; - if (gl_buf_type == OTHER) - ret = BREAK; - if (gl_buf_type == VERTEX) - ret = parse_append_data_d(&(e->object.vertices), token); - if (gl_buf_type == UV) + i = 0; + while (i < 3 * (vertex_count - 2)) { - printf("uv"); - ret = parse_append_data_d(&(e->object.uvs), token); + if (indices->ptr == indices->len) + { + indices->data = (int *)realloc( + indices->data, sizeof(int) * (indices->len + BUFFER_SIZE)); + indices->len += BUFFER_SIZE; + } + indices->data[indices->ptr++] = data_tmp[i++]; } - if (gl_buf_type == NORMAL) - ret = parse_append_data_d(&(e->object.normals), token); - if (gl_buf_type == INDEX) - ret = parse_append_data_i(&(e->object.indices), token); - return (ret); +} + +void parse_triangulate(t_buf_i *indices, int vertex_count) +{ + int *data_tmp; + int i; + + i = 0; + data_tmp = (int *)malloc(sizeof(int) * 3 * (vertex_count - 2)); + indices->ptr -= vertex_count; + while (i < 3 * (vertex_count - 2)) + { + if (i % 3 == 0) + data_tmp[i] = indices->data[indices->ptr]; + else if (i % 3 == 1) + data_tmp[i] = indices->data[indices->ptr + (i - 1) / 3 + 1]; + else if (i % 3 == 2) + data_tmp[i] = indices->data[indices->ptr + (i - 2) / 3 + 2]; + i++; + } + parse_append_data_tmp(indices, vertex_count, data_tmp); } int parse_line(t_env *e, char *line) @@ -83,7 +73,7 @@ int parse_line(t_env *e, char *line) token_count = 0; ret = SUCCESS; - while ((token = strtok_r(line, " ", &line))) + while ((token = strtok_r(line, " \t", &line))) { if (token_count == 0) gl_buf_type = parse_gl_buf_type(token); @@ -93,5 +83,7 @@ int parse_line(t_env *e, char *line) return (FAILURE); token_count++; } + if (gl_buf_type == INDEX && token_count > 4) + parse_triangulate(&(e->object.indices), token_count - 1); return (SUCCESS); } diff --git a/src/parse_token.c b/src/parse_token.c new file mode 100644 index 0000000..c2388fa --- /dev/null +++ b/src/parse_token.c @@ -0,0 +1,59 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* parse_token.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: gbrochar +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/12/23 17:33:33 by gbrochar #+# #+# */ +/* Updated: 2020/12/23 17:38:10 by gbrochar ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "scop.h" + +int parse_append_data_d(t_buf_d *buffer, char *token) +{ + if (buffer->ptr == buffer->len) + { + buffer->data = (double *)realloc( + buffer->data, sizeof(double) * (buffer->len + BUFFER_SIZE)); + buffer->len += BUFFER_SIZE; + } + buffer->data[buffer->ptr] = atof(token); + buffer->ptr++; + return (SUCCESS); +} + +int parse_append_data_i(t_buf_i *buffer, char *token) +{ + if (buffer->ptr == buffer->len) + { + buffer->data = (int *)realloc( + buffer->data, sizeof(int) * (buffer->len + BUFFER_SIZE)); + buffer->len += BUFFER_SIZE; + } + buffer->data[buffer->ptr] = atoi(token); + buffer->ptr++; + return (SUCCESS); +} + +int parse_token( + t_env *e, + char *token, + t_gl_buf_type gl_buf_type) +{ + int ret; + + if (gl_buf_type == OTHER) + ret = BREAK; + if (gl_buf_type == VERTEX) + ret = parse_append_data_d(&(e->object.vertices), token); + if (gl_buf_type == UV) + ret = parse_append_data_d(&(e->object.uvs), token); + if (gl_buf_type == NORMAL) + ret = parse_append_data_d(&(e->object.normals), token); + if (gl_buf_type == INDEX) + ret = parse_append_data_i(&(e->object.indices), token); + return (ret); +}