aboutsummaryrefslogtreecommitdiff
path: root/src/parse.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/parse.c')
-rw-r--r--src/parse.c63
1 files changed, 44 insertions, 19 deletions
diff --git a/src/parse.c b/src/parse.c
index 4add0b3..fa9f2b5 100644
--- a/src/parse.c
+++ b/src/parse.c
@@ -6,7 +6,7 @@
/* 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 */
+/* Updated: 2020/05/10 22:04:05 by charles ### ########.fr */
/* */
/* ************************************************************************** */
@@ -14,34 +14,54 @@
#define SCOP_VEC_DEFAULT_SIZE 32
-static int st_parse_line(char *line, t_ftvec *vertices, t_ftvec *indices)
+static int st_parse_face(char **indexes_strs, t_ftvec *indices)
{
+ size_t i;
+ size_t len;
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')
+ len = ft_split_len(indexes_strs);
+ i = -1;
+ while (++i < len)
{
- 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));
+ tmp = ft_atoi(indexes_strs[i]);
+ if (ft_vecpush(indices, *(void**)&tmp) == NULL)
+ return (-1);
}
+ return (0);
+}
+static int st_parse_vertex(char **positions_strs, t_ftvec *vertices)
+{
+ float tmp;
+ tmp = ft_atof(positions_strs[0]);
+ ft_vecpush(vertices, *((void**)&tmp));
+ tmp = ft_atof(positions_strs[1]);
+ ft_vecpush(vertices, *((void**)&tmp));
+ tmp = ft_atof(positions_strs[2]);
+ ft_vecpush(vertices, *((void**)&tmp));
return (0);
}
+static int st_parse_line(char *line, t_ftvec *vertices, t_ftvec *indices)
+{
+ int ret;
+ char **split;
+
+ if (*line != 'v' && *line != 'f')
+ return (0);
+ if ((split = ft_split(line + 1, ' ')) == NULL)
+ return (-1);
+ ret = -1;
+ if (*line == 'v' && ft_split_len(split) == 3)
+ ret = st_parse_vertex(split, vertices);
+ if (*line == 'f' && ft_split_len(split) >= 3)
+ ret = st_parse_face(split, indices);
+ ft_split_destroy(split);
+ return (ret);
+}
+
static int st_parse_file(int fd, t_ftvec *vertices, t_ftvec *indices)
{
char *line;
@@ -61,6 +81,7 @@ static int st_parse_file(int fd, t_ftvec *vertices, t_ftvec *indices)
free(line);
return (-1);
}
+ free(line);
return (0);
}
@@ -79,5 +100,9 @@ int parse(char *filepath, t_object *object)
st_parse_file(fd, vertices, indices);
object->vertices = (float*)ft_vectobuf32(vertices);
object->indices = (unsigned int*)ft_vectobuf32(indices);
+ object->vertices_len = vertices->size;
+ object->indices_len = indices->size;
+ ft_vecdestroy(vertices, NULL);
+ ft_vecdestroy(indices, NULL);
return (0);
}