From 52e5ace4e16bb961b03f97934e156cc541ef6469 Mon Sep 17 00:00:00 2001 From: tTh Date: Mon, 3 Apr 2023 00:52:09 +0200 Subject: [PATCH] not ready for prime time --- tools/.gitignore | 3 ++ tools/Makefile | 3 ++ tools/cube.obj | 49 +++++++++++++++++++ tools/importobj.c | 119 ++++++++++++++++++++++++++++++++-------------- tools/minimal.obj | 6 +-- tools/read_obj.c | 6 ++- 6 files changed, 146 insertions(+), 40 deletions(-) create mode 100644 tools/cube.obj diff --git a/tools/.gitignore b/tools/.gitignore index a86509e..55564ac 100644 --- a/tools/.gitignore +++ b/tools/.gitignore @@ -1,4 +1,7 @@ +essai_faces +read_obj + *.vertices *.edges diff --git a/tools/Makefile b/tools/Makefile index 3d4a4b6..d3c47c4 100644 --- a/tools/Makefile +++ b/tools/Makefile @@ -8,3 +8,6 @@ read_obj: read_obj.c Makefile importobj.o $(BBFUNCS) importobj.o: importobj.c ../bubulles.h Makefile $(CC) $(OPT) -c $< + +essai_faces: essai_faces.c Makefile + $(CC) $(OPT) $< -o $@ diff --git a/tools/cube.obj b/tools/cube.obj new file mode 100644 index 0000000..d70bc38 --- /dev/null +++ b/tools/cube.obj @@ -0,0 +1,49 @@ +# cube.obj +# + +o cube + +v 0.0 0.0 0.0 +v 0.0 0.0 1.0 +v 0.0 1.0 0.0 +v 0.0 1.0 1.0 +v 1.0 0.0 0.0 +v 1.0 0.0 1.0 +v 1.0 1.0 0.0 +v 1.0 1.0 1.0 + +vt 0.25 0.0 +vt 0.5 0.0 +vt 0 0.25 +vt 0.25 0.25 +vt 0.5 0.25 +vt 0.75 0.25 +vt 0.0 0.5 +vt 0.25 0.5 +vt 0.5 0.5 +vt 0.75 0.5 +vt 0.25 0.75 +vt 0.5 0.75 +vt 0.25 1.0 +vt 0.5 1.0 + +vn 0.0 0.0 1.0 +vn 0.0 0.0 -1.0 +vn 0.0 1.0 0.0 +vn 0.0 -1.0 0.0 +vn 1.0 0.0 0.0 +vn -1.0 0.0 0.0 + +f 1/11/2 7/14/2 5/12/2 +f 1/11/2 3/13/2 7/14/2 +f 1/7/6 4/4/6 3/3/6 +f 1/7/6 2/8/6 4/4/6 +f 3/1/3 8/5/3 7/2/3 +f 3/1/3 4/4/3 8/5/3 +f 5/10/5 7/6/5 8/5/5 +f 5/10/5 8/5/5 6/9/5 +f 1/11/4 5/12/4 6/9/4 +f 1/11/4 6/9/4 2/8/4 +f 2/8/1 6/9/1 8/5/1 +f 2/8/1 8/5/1 4/4/1 + diff --git a/tools/importobj.c b/tools/importobj.c index 99e0b1b..3eb084e 100644 --- a/tools/importobj.c +++ b/tools/importobj.c @@ -7,6 +7,7 @@ #include #include #include +#include #include "../bubulles.h" #include "../edges.h" @@ -27,7 +28,8 @@ typedef struct { int id; } Tokens; -enum token_id { T_comment=1, T_vertice, T_group, T_face, T_vt }; +enum token_id { T_comment=1, T_vertice, T_group, T_face, T_vt, T_vn, + T_line, T_object, T_smoothing, T_usemtl, T_mtllib }; Tokens TokenList[] = { { "#", T_comment }, @@ -35,6 +37,12 @@ Tokens TokenList[] = { { "g", T_group }, // to be verified ! { "f", T_face }, { "vt", T_vt }, // c'est quoi ce truc ? + { "vn", T_vt }, // c'est quoi ce truc ? + { "l", T_line }, + { "o", T_object }, + { "s", T_smoothing }, + { "usemtl", T_usemtl }, + { "mtllib", T_mtllib }, { NULL, 0 } }; @@ -76,45 +84,62 @@ if (3 == foo) { return foo; } /* --------------------------------------------------------------------- */ -/* new Mon 27 Mar 2023 12:08:18 AM CEST */ +/* new Mon 27 Mar 2023 12:08:18 AM CEST + * + * mmmm... complex thing to do... + * + */ int parse_face(char *cptr, int phy) { int ix, foo; -int fa, fb; +int pts[3]; #if DEBUG_LEVEL fprintf(stderr, ">>> %s ( '%s' %d )\n", __func__, cptr, phy); #endif +#if (0) +fprintf(stderr, "parse_face"); +for (foo=0; foo<16; foo++) { + fprintf(stderr, " %02X", ((unsigned char *)cptr)[foo]); + } +fprintf(stderr, "\n"); +#endif + for (ix=0; ix<3; ix++) { cptr = strtok(NULL, " "); if (NULL == cptr) { fprintf(stderr, "incomplete face in %s\n", __func__); return -4; } - if (2 != sscanf(cptr, "%d/%d", &fa, &fb)) { + if (1 != sscanf(cptr, "%d", &pts[ix])) { fprintf(stderr, "%s: err sscanf\n", __func__); exit(1); return -3; } - // XXX fprintf(stderr, " %d got %d %d\n", ix, fa, fb); + } - /* - * yes, i've found 0-lenght edges, wtf ? - */ - if (fa == fb) { - // fprintf(stderr, "'%s' dublicate\n", cptr); - continue; - } +/** check the freshly read datas **/ +if ( pts[0]==pts[1] || pts[0]==pts[2] || pts[2]==pts[1] ) { + fprintf(stderr, "%s: degerated face ( %d %d %d )\n", __func__, + pts[0], pts[1], pts[2]); + sleep(5); + } - foo = push_a_missing_edge(edges, fa, fb); - if (foo) { - fprintf(stderr, "%s: disaster #%d\n", __func__, foo); -#if MUST_ABORT - fflush(stderr), abort(); -#endif - return -2; - } +foo = push_a_missing_edge(edges, pts[0], pts[1]); +if (foo) { + fprintf(stderr, "%s: disaster #%d\n", __func__, foo); + return -2; + } +foo = push_a_missing_edge(edges, pts[1], pts[2]); +if (foo) { + fprintf(stderr, "%s: disaster #%d\n", __func__, foo); + return -2; + } +foo = push_a_missing_edge(edges, pts[2], pts[0]); +if (foo) { + fprintf(stderr, "%s: disaster #%d\n", __func__, foo); + return -2; } #if DEBUG_LEVEL @@ -128,7 +153,7 @@ int try_to_read_an_OBJ_file(char *infname, char *file_vert, char *file_edges, int notused) { FILE *fpin; -char line[LINE_SZ+1], *cptr; +char line[LINE_SZ+1], *cptr, *token; float x, y, z; int foo, nbre, tokenid; Bubulle bubulle; @@ -143,14 +168,14 @@ if (NULL==(fpin=fopen(infname, "r"))) { exit(1); } -bublist = alloc_bubulles(infname, 500000, 0); +bublist = alloc_bubulles(infname, 200000, 0); if (NULL==bublist) { fprintf(stderr, "in %s, no mem for bubls, aborting...\n", __func__); abort(); } print_bublist_desc(bublist, 0); -edges = alloc_edgelist("krkrkr", 200000, 0); +edges = alloc_edgelist("krkrkr", 400000, 0); if (NULL==edges) { fprintf(stderr, "no mem for edges in %s, aborting...\n", __func__); abort(); @@ -173,9 +198,11 @@ while(NULL!=(cptr=fgets(line, LINE_SZ, fpin))) { cptr = strtok(line, " "); if (NULL == cptr) { - fprintf(stderr, "no token ?\n"); + /* this is an empty line */ + // fprintf(stderr, "no token ?\n"); continue; } + token = cptr; tokenid = type_of_the_line(cptr); if (verbosity > 1) fprintf(stderr, "token '%s' --> %d\n", cptr, tokenid); @@ -202,21 +229,43 @@ while(NULL!=(cptr=fgets(line, LINE_SZ, fpin))) { abort(); } break; - - case T_group: - cptr = strtok(NULL, " "); - fprintf(stderr, "\tGroup: %s\n", cptr); + case T_face: + /* experimental code here */ + foo = parse_face(cptr, 0); + if (foo) { + fprintf(stderr, " '%s' parse face -> %d\n", + cptr, foo); + exit(1); + } break; - case T_face: - foo = parse_face(cptr, 0); - if (foo) fprintf(stderr, " '%s' parse face -> %d\n", - cptr, foo); + case T_object: + cptr = strtok(NULL, " "); + fprintf(stderr, "\tObject: %s\n", cptr); + break; + case T_group: + cptr = strtok(NULL, " "); + fprintf(stderr, "\tGroup: %s\n", cptr); + break; + case T_usemtl: + cptr = strtok(NULL, " "); + fprintf(stderr, "\tUsemtl: %s\n", cptr); + break; + case T_mtllib: + cptr = strtok(NULL, " "); + fprintf(stderr, "\tMtllib: %s\n", cptr); + break; + + case T_line: + break; + case T_smoothing: + break; + case T_vt: break; default: - // fprintf(stderr, "\ttoken %d ?\n", tokenid); - continue; /* wtf ? */ + fprintf(stderr, "token %s -> %d ?\n", token, tokenid); + break; } nbre++; @@ -234,7 +283,7 @@ bubulles_to_data(file_vert, NULL, bublist, 0); free_bubulles(bublist, 0); print_edgelist_desc(edges, 0); -print_the_edges(stdout, edges, 0); +edges_to_data(file_edges, edges, 0); free_edgelist(edges, 0); return 0; diff --git a/tools/minimal.obj b/tools/minimal.obj index 94932b7..29c3e9e 100644 --- a/tools/minimal.obj +++ b/tools/minimal.obj @@ -1,7 +1,7 @@ -g minimal +o minimal v 0 0 0 v 1 0 0 v 0 1 0 v 0 0 1 -f 1/2, 2/3, 3/1 -f 0/1, 0/1, 0/2 +f 1/2 2/3 3/1 +f 0/1 0/1 0/2 diff --git a/tools/read_obj.c b/tools/read_obj.c index 836670b..aded814 100644 --- a/tools/read_obj.c +++ b/tools/read_obj.c @@ -20,15 +20,17 @@ int main(int argc, char *argv[]) int foo; char *fname; /* see manpage basename(3) */ +fprintf(stderr, "\n### READ_OBJ %s %s\n\n", __DATE__, __TIME__); + if (2 != argc) { bubulles_version(1); exit(0); } -verbosity = 0; +verbosity = 1; fname = basename(argv[1]); -fprintf (stderr, "input fname is '%s'\n", fname); +fprintf (stderr, "input file name is '%s'\n", fname); foo = try_to_read_an_OBJ_file(argv[1], "bulles.vertices", "bulles.edges", 0); fprintf(stderr, "try to read '%s' -> %d\n", argv [1], foo);