From 4bca017774071cc7ad5488b7a1303b2242254b67 Mon Sep 17 00:00:00 2001 From: tTh Date: Sun, 9 Apr 2023 11:13:56 +0200 Subject: [PATCH] sunday dirty commit --- tools/.gitignore | 1 + tools/Makefile | 15 +++++-- tools/README.md | 18 ++++++++- tools/essai_faces.c | 2 + tools/importobj.c | 99 +++++++++++++++++++++++++++++---------------- tools/objtrucs.h | 14 +++++++ tools/rdwredges.c | 59 +++++++++++++++++++++++++++ 7 files changed, 167 insertions(+), 41 deletions(-) create mode 100644 tools/objtrucs.h create mode 100644 tools/rdwredges.c diff --git a/tools/.gitignore b/tools/.gitignore index 55564ac..73ce709 100644 --- a/tools/.gitignore +++ b/tools/.gitignore @@ -4,4 +4,5 @@ read_obj *.vertices *.edges +*.blob diff --git a/tools/Makefile b/tools/Makefile index d3c47c4..a2d8c5a 100644 --- a/tools/Makefile +++ b/tools/Makefile @@ -1,13 +1,20 @@ BBFUNCS = ../libbubulles.a -OPT = -Wall -g -DDEBUG_LEVEL=0 -DMUST_ABORT=0 +OPT = -Wall -Wextra -g -DDEBUG_LEVEL=0 -DMUST_ABORT=0 -read_obj: read_obj.c Makefile importobj.o $(BBFUNCS) - gcc $(OPT) $< importobj.o $(BBFUNCS) -o $@ +read_obj: read_obj.c Makefile importobj.o rdwredges.o \ + $(BBFUNCS) + gcc $(OPT) $< importobj.o rdwredges.o $(BBFUNCS) -o $@ -importobj.o: importobj.c ../bubulles.h Makefile +importobj.o: importobj.c ../bubulles.h ../edges.h Makefile $(CC) $(OPT) -c $< +rdwredges.o: rdwredges.c objtrucs.h \ + ../bubulles.h ../edges.h Makefile + $(CC) $(OPT) -c $< + +# --------- + essai_faces: essai_faces.c Makefile $(CC) $(OPT) $< -o $@ diff --git a/tools/README.md b/tools/README.md index f44598a..91df204 100644 --- a/tools/README.md +++ b/tools/README.md @@ -1,6 +1,9 @@ # Importer des fichiers .OBJ +* https://en.wikipedia.org/wiki/Wavefront_.obj_file +* http://fegemo.github.io/cefet-cg/attachments/obj-spec.pdf +* https://people.sc.fsu.edu/~jburkardt/data/obj/obj.html ``` v -1.177934647 -6.833468914 -73.19773865 @@ -9,13 +12,24 @@ v -0.8008174896 -6.425453663 -73.32041931 vn -0.05844723806 -0.09480132163 -0.993778944 ``` +## read_obj + Première étape : en lisant les vertices, nous saurons positionner -nos bubulles. +nos bubulles. Ensuite, en explorant les faces, nous pouvons +en déduire les arètes (aka: edges). Attention, mon parser EXIGE des fichiers Unix bien conformés : -c'est-à-dire que la dernière ligne du .obj DOIT être terminée +c'est-à-dire que la dernière ligne du `.obj` DOIT être terminée par un newline ! +## TODO LIST + +* Songer à un système d'auto-scaler et de recentrage +* Import/export en blob du combo "edges & vertices" +* Comment générer un `.obj` à partir d'une image flottante ? +* Gérer les arêtes de longueur nulle (degenerated cylinder) + +## rendu final Quatrième étape : aller vivre à la campagne ? diff --git a/tools/essai_faces.c b/tools/essai_faces.c index f9688a8..96322f9 100644 --- a/tools/essai_faces.c +++ b/tools/essai_faces.c @@ -39,6 +39,8 @@ int foo, bar; foo = essai_lecture_face("3 14 159"); foo = essai_lecture_face("2 4 6 8"); foo = essai_lecture_face("0/10 1/11 2/12"); +foo = essai_lecture_face("3.14159"); +foo = essai_lecture_face("We make porn"); return 0; } diff --git a/tools/importobj.c b/tools/importobj.c index 3eb084e..cd37e4d 100644 --- a/tools/importobj.c +++ b/tools/importobj.c @@ -1,7 +1,10 @@ /* - LIBBUBULLES - + LIBBUBULLES IMPORT_OBJ some functions for importing bubulles from dot-OBJ files. + + https://git.tetalab.org/tTh/libbubulle/src/branch/master/tools/ + http://fegemo.github.io/cefet-cg/attachments/obj-spec.pdf + */ #include @@ -12,6 +15,8 @@ #include "../bubulles.h" #include "../edges.h" +#include "objtrucs.h" + extern int verbosity; /* --------------------------------------------------------------------- */ @@ -20,6 +25,9 @@ extern int verbosity; static BBList *bublist; static EdgeList *edges; +static int dropped; +static int linenumber; +static char obj_filename[LINE_SZ+1]; /* --------------------------------------------------------------------- */ @@ -43,6 +51,7 @@ Tokens TokenList[] = { { "s", T_smoothing }, { "usemtl", T_usemtl }, { "mtllib", T_mtllib }, + /* and more to come... */ { NULL, 0 } }; @@ -64,11 +73,14 @@ for (token=TokenList; token->token; token++) { return -1; } /* --------------------------------------------------------------------- */ -int parse_vertice(char *cptr, float *px, float *py, float *pz) + +static int parse_vertice(char *cptr, float *px, float *py, float *pz) { float x, y, z; int foo; +/* /!\ this function kill the input buffer */ + foo = 0; cptr = strtok(NULL, " "); foo += sscanf(cptr, "%f", &x); @@ -83,15 +95,17 @@ if (3 == foo) { return foo; } +/* --------------------------------------------------------------------- */ + /* --------------------------------------------------------------------- */ /* new Mon 27 Mar 2023 12:08:18 AM CEST * * mmmm... complex thing to do... - * + * and what is this "phy" parameter ? */ -int parse_face(char *cptr, int phy) +static int parse_face(char *cptr, int phy) { -int ix, foo; +int ix, foo, a, b; int pts[3]; #if DEBUG_LEVEL @@ -121,25 +135,30 @@ for (ix=0; ix<3; ix++) { /** 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__, + fprintf(stderr, "%s: degenerated face ( %d %d %d )\n", __func__, pts[0], pts[1], pts[2]); - sleep(5); + dropped++; } -foo = push_a_missing_edge(edges, pts[0], pts[1]); -if (foo) { - fprintf(stderr, "%s: disaster #%d\n", __func__, foo); - return -2; +/* + * may be we can check the "degenerated cylinder" here ? + */ + + +for (ix=0; ix<3; ix++) { + a = ix % 3; + b = (ix+1) % 3; + foo = push_a_missing_edge(edges, pts[a], pts[b]); + if (foo) { + fprintf(stderr, "%s: disaster #%d line %d\n", + __func__, foo, linenumber); + 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 (dropped) { + fprintf(stderr, "%s: %d dropped...\n", __func__, dropped); + exit(1); } #if DEBUG_LEVEL @@ -167,22 +186,23 @@ if (NULL==(fpin=fopen(infname, "r"))) { perror(infname); exit(1); } +linenumber = 0; -bublist = alloc_bubulles(infname, 200000, 0); +bublist = alloc_bubulles(infname, 400000, 0); if (NULL==bublist) { fprintf(stderr, "in %s, no mem for bubls, aborting...\n", __func__); abort(); } -print_bublist_desc(bublist, 0); +if (verbosity > 1) print_bublist_desc(bublist, 0); -edges = alloc_edgelist("krkrkr", 400000, 0); +edges = alloc_edgelist("krkrkr", 600000, 0); if (NULL==edges) { fprintf(stderr, "no mem for edges in %s, aborting...\n", __func__); abort(); } -print_edgelist_desc(edges, 0); +if (verbosity > 1) print_edgelist_desc(edges, 0); -fprintf(stderr, "\n***********************************\n"); +fprintf(stderr, "\n ***********************************\n"); nbre = 0; while(NULL!=(cptr=fgets(line, LINE_SZ, fpin))) { @@ -196,6 +216,8 @@ while(NULL!=(cptr=fgets(line, LINE_SZ, fpin))) { line[strlen(line)-1] = '\0'; /* kill the newline */ if (verbosity>1) fprintf(stderr, "line read ==|%s|==\n", line); + linenumber++; + cptr = strtok(line, " "); if (NULL == cptr) { /* this is an empty line */ @@ -233,8 +255,8 @@ while(NULL!=(cptr=fgets(line, LINE_SZ, fpin))) { /* experimental code here */ foo = parse_face(cptr, 0); if (foo) { - fprintf(stderr, " '%s' parse face -> %d\n", - cptr, foo); + fprintf(stderr, "line %d '%s' parse face -> %d\n", + linenumber, cptr, foo); exit(1); } break; @@ -267,23 +289,30 @@ while(NULL!=(cptr=fgets(line, LINE_SZ, fpin))) { fprintf(stderr, "token %s -> %d ?\n", token, tokenid); break; } - nbre++; } fclose(fpin); -fprintf(stderr, "\n***********************************\n"); +fprintf(stderr, " ***********************************\n"); if(verbosity) { - fprintf(stderr, "in %s, %d vertices loaded\n", __func__, bublist->fidx); + fprintf(stderr, "%s(): %d vertices loaded\n", __func__, bublist->fidx); + fprintf(stderr, "%s(): %d edges loaded\n", __func__, edges->fidx); } -print_bublist_desc(bublist, 0); -bubulles_to_data(file_vert, NULL, bublist, 0); -free_bubulles(bublist, 0); +if (verbosity > 1) { + print_bublist_desc(bublist, 0); + print_edgelist_desc(edges, 0); + } + +bubulles_to_data(file_vert, NULL, bublist, 0); -print_edgelist_desc(edges, 0); edges_to_data(file_edges, edges, 0); + +foo = x_write_vertedges("foo.blob", bublist, edges); + +// Cleanup +free_bubulles(bublist, 0); free_edgelist(edges, 0); return 0; diff --git a/tools/objtrucs.h b/tools/objtrucs.h new file mode 100644 index 0000000..e200a6f --- /dev/null +++ b/tools/objtrucs.h @@ -0,0 +1,14 @@ +/* + * EXPERIMENTAL CODE ! + */ + + +typedef struct { + unsigned long magic; + BBList *Blist; + EdgeList *Elist; + int status; + } EdgeAndVertices; + +int x_write_vertedges(char *filename, BBList *bblist, EdgeList *edges); + diff --git a/tools/rdwredges.c b/tools/rdwredges.c new file mode 100644 index 0000000..ea0162c --- /dev/null +++ b/tools/rdwredges.c @@ -0,0 +1,59 @@ +/* + LIBBUBULLES IMPORT_OBJ + some functions for importing bubulles from dot-OBJ files. + + https://git.tetalab.org/tTh/libbubulle/src/branch/master/tools/ + http://fegemo.github.io/cefet-cg/attachments/obj-spec.pdf + +*/ + +#include +#include +#include +#include + +#include "../bubulles.h" +#include "../edges.h" + +#include "objtrucs.h" + +extern int verbosity; + +/* --------------------------------------------------------------------- */ +/* EXPERIMENTAL GRUIK-CODE !!! */ +int x_write_vertedges(char *filename, BBList *bblist, EdgeList *edges) +{ +FILE *fp; +int idx, edg[2]; +double coo[3]; + +fprintf(stderr, ">>> %s ( '%s' %p %p )\n", __func__, filename, + bblist, edges); + +if (NULL==(fp=fopen(filename, "w"))) { + perror(filename); + return -4; + } + +print_bublist_desc(bblist, 0); +fwrite("VERTICES", 8, 1, fp); +for (idx=0; idxfidx; idx++) { + fprintf(stderr, "vertice %d\n", idx); + coo[0] = bblist->bbs[idx].p.x; + coo[1] = bblist->bbs[idx].p.y; + coo[2] = bblist->bbs[idx].p.z; + fwrite(coo, sizeof(coo), 1, fp); + } + +print_edgelist_desc(edges, 0); +fwrite("EDGES ", 8, 1, fp); +for (idx=0; idxfidx; idx++) { + edg[0] = edges->edges[idx].A; + edg[1] = edges->edges[idx].B; + fwrite(edg, sizeof(edg), 1, fp); + } +fclose(fp); + +return 0; +} +/* --------------------------------------------------------------------- */