From 5bd6e409e5aef2b1a2b97f5490f7e0ea19275790 Mon Sep 17 00:00:00 2001 From: opfez Date: Sat, 13 Nov 2021 15:50:00 +0100 Subject: [PATCH] forgot to add the obj->mod converter --- serialize.c | 187 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 187 insertions(+) create mode 100644 serialize.c diff --git a/serialize.c b/serialize.c new file mode 100644 index 0000000..259c605 --- /dev/null +++ b/serialize.c @@ -0,0 +1,187 @@ +#include +#include +#include +#include +#include "types.h" + +/* Returns EOF on when reading end of file. */ +int +read_line(FILE *f, char *buf, size_t n) +{ + char c; + size_t byte_count = 0; + while ((c = fgetc(f)) != '\n') { + if (c == EOF) { + buf++; + *buf = '\0'; + return EOF; + } + else if (byte_count == n) { + break; + } + else { + *buf = c; + buf++; + byte_count++; + } + } + *buf = '\0'; + return 0; +} + +vec3 * +read_vertices(char *path, uint32_t *vertex_num_out) +{ + FILE *in = fopen(path, "r"); + + vec3 *vertex_out = malloc(sizeof(vec3)); + *vertex_num_out = 0; + + #define BUFSIZE 256 + char buf[BUFSIZE]; + + int status; + do { + memset(buf, 0, BUFSIZE); + status = read_line(in, buf, BUFSIZE); + if (buf[0] == 'v' && buf[1] == ' ') { + /* ugly imperative garbage, look away */ + vec3 v; + + #define VERTBUFSIZE 32 + char vertbuf[VERTBUFSIZE]; + size_t i, start = 2; + for (i = start; buf[i] != ' '; i++) { + vertbuf[i-start] = buf[i]; + } + vertbuf[i] = '\0'; + v.x = atof(vertbuf); + + memset(vertbuf, 0, VERTBUFSIZE); + + i++; + start = i; + for (; buf[i] != ' '; i++) { + vertbuf[i-start] = buf[i]; + } + vertbuf[i] = '\0'; + v.y = atof(vertbuf); + + memset(vertbuf, 0, VERTBUFSIZE); + + i++; + start = i; + for (; buf[i] != '\0'; i++) { + vertbuf[i-start] = buf[i]; + } + vertbuf[i] = '\0'; + v.z = atof(vertbuf); + + /* put the new vertex into the array */ + *vertex_num_out += 1; + vertex_out = realloc(vertex_out, sizeof(vec3) * (*vertex_num_out)); + vertex_out[*vertex_num_out - 1] = v; + } + } while(status != EOF); + + fclose(in); + + return vertex_out; +} + +uint32_t * +read_indices(char *path, uint32_t *index_num_out) +{ + FILE *in = fopen(path, "r"); + + uint32_t *index_out = malloc(sizeof(uint32_t)); + *index_num_out = 0; + +#define BUFSIZE 256 + char buf[BUFSIZE]; + + int status; + do { + memset(buf, 0, BUFSIZE); + status = read_line(in, buf, BUFSIZE); + if (buf[0] == 'f' && buf[1] == ' ') { +#define INDEXBUFSIZE 32 + char indexbuf[INDEXBUFSIZE] = {0}; + size_t i, start = 2; + + for (i = start; buf[i] != '/'; i++) { + indexbuf[i-start] = buf[i]; + } + indexbuf[i] = '\0'; + uint32_t a = atoi(indexbuf); + for (; buf[i] != ' '; i++); + i++; + memset(indexbuf, 0, INDEXBUFSIZE); + + start = i; + for (; buf[i] != '/'; i++) { + indexbuf[i-start] = buf[i]; + } + indexbuf[i] = '\0'; + uint32_t b = atoi(indexbuf); + for (; buf[i] != ' '; i++); + i++; + memset(indexbuf, 0, INDEXBUFSIZE); + + start = i; + for (; buf[i] != '/'; i++) { + indexbuf[i-start] = buf[i]; + } + indexbuf[i] = '\0'; + uint32_t c = atoi(indexbuf); + + /* put the new index into the array */ + *index_num_out += 3; + index_out = realloc(index_out, sizeof(uint32_t) * (*index_num_out)); + index_out[*index_num_out - 3] = a-1; + index_out[*index_num_out - 2] = b-1; + index_out[*index_num_out - 1] = c-1; + } + } while(status != EOF); + + fclose(in); + + return index_out; +} + +int +main(int argc, char *argv[]) +{ + if (argc != 3) { + fprintf(stderr, "usage: serialize in.obj out.mod"); + exit(1); + } + + /* convert obj to mod */ + uint32_t vertices_num; + uint32_t indices_num; + vec3 *vertices = read_vertices(argv[1], &vertices_num); + uint32_t *indices = read_indices(argv[1], &indices_num); + + /* serialize the data */ + FILE *f = fopen(argv[2], "w"); + + fwrite(&vertices_num, 4, 1, f); + + for (size_t i = 0; i < vertices_num; i++) { + fwrite(&vertices[i].x, 8, 1, f); + fwrite(&vertices[i].y, 8, 1, f); + fwrite(&vertices[i].z, 8, 1, f); + } + + fwrite(&indices_num, 4, 1, f); + + for (size_t i = 0; i < indices_num; i++) { + fwrite(&indices[i], 4, 1, f); + } + + fclose(f); + + free(vertices); + free(indices); +}