Compare commits

...

8 Commits

Author SHA1 Message Date
tTh b861e8c86b more work done on .OBJ import 2023-03-30 05:39:36 +02:00
tTh 9577f1da1f workin on edgelists... 2023-03-30 05:16:19 +02:00
tTh 9e81fa8319 add filters 2023-03-30 05:06:30 +02:00
tTh a1e5058d97 fix a bad api 2023-03-30 05:05:32 +02:00
tTh 3d93b66b00 fix a bad use of MUST_ABORT 2023-03-30 05:04:17 +02:00
tTh 26f6421653 better messages 2023-03-28 17:15:12 +02:00
tTh d1a5a5b5c9 maybe we can read eges ? 2023-03-28 14:50:40 +02:00
tTh 329223d195 drop a possible mistake 2023-03-27 01:49:17 +02:00
13 changed files with 182 additions and 74 deletions

5
.gitignore vendored
View File

@ -5,9 +5,12 @@ libbubulles.a
tbb tbb
gmon.out gmon.out
dummy-file dummy-file
toto
tools/*.obj tools/*.obj
! tools/minimal.obj
tools/read_obj tools/read_obj
tools/*.xyz tools/*.xyz
tools/*.asc tools/*.asc
tools/toto
tools/core

View File

@ -10,7 +10,7 @@
CC = gcc CC = gcc
OPT = -Wall -g -pg -O3 -DDEBUG_LEVEL=0 -DMUST_ABORT=0 OPT = -Wall -g -pg -DDEBUG_LEVEL=0 -DMUST_ABORT=0
libbubulles.a: bubulles.o edges.o libbubulles.a: bubulles.o edges.o
ar r $@ $? ar r $@ $?

View File

@ -84,7 +84,7 @@ fprintf(stderr, ">>> %s ( %p %d )\n", __func__, bbl, k);
if (NULL == bbl->bbs) { if (NULL == bbl->bbs) {
fprintf(stderr, "%s : array ptr is null\n", __func__); fprintf(stderr, "%s : array ptr is null\n", __func__);
#ifdef MUST_ABORT #if MUST_ABORT
abort(); abort();
#endif #endif
return 1; return 1;
@ -108,7 +108,7 @@ fprintf(stderr, ">>> %s ( %p %d )\n", __func__, where, idx);
if ( (idx < 0) || (idx > where->fidx) ) { if ( (idx < 0) || (idx > where->fidx) ) {
fprintf(stderr, "%s : idx %d out of range on %p\n", fprintf(stderr, "%s : idx %d out of range on %p\n",
__func__, idx, where); __func__, idx, where);
#ifdef MUST_ABORT #if MUST_ABORT
abort(); abort();
#endif #endif
return NULL; return NULL;
@ -186,7 +186,7 @@ int peek_bubulle(BBList *from, Bubulle *to, int idx)
if (NULL==from) { if (NULL==from) {
fprintf(stderr, "in %s, *from is null\n", __func__); fprintf(stderr, "in %s, *from is null\n", __func__);
#ifdef MUST_ABORT #if MUST_ABORT
abort(); abort();
#endif #endif
return -5; return -5;
@ -216,7 +216,7 @@ Bubulle *ar;
if (NULL == bbl) { if (NULL == bbl) {
fprintf(stderr, "in %s, *bbl is NULL\n", __func__); fprintf(stderr, "in %s, *bbl is NULL\n", __func__);
#ifdef MUST_ABORT #if MUST_ABORT
abort(); abort();
#endif #endif
return -5; return -5;
@ -261,7 +261,7 @@ int idx;
if (NULL == what) { if (NULL == what) {
fprintf(stderr, "SHIT HAPPEN IN %s\n", __func__); fprintf(stderr, "SHIT HAPPEN IN %s\n", __func__);
#ifdef MUST_ABORT #if MUST_ABORT
abort(); abort();
#endif #endif
return -5; return -5;
@ -337,7 +337,7 @@ int print_bbox(BBox *bbox, int k)
if (NULL==bbox) { if (NULL==bbox) {
fprintf(stderr, "in %s, *bbox is NULL\n", __func__); fprintf(stderr, "in %s, *bbox is NULL\n", __func__);
#ifdef MUST_ABORT #if MUST_ABORT
abort(); abort();
#endif #endif
return -5; return -5;

View File

@ -4,7 +4,7 @@
/* --------------------------------------------------------------------- */ /* --------------------------------------------------------------------- */
#define LIBBB_VERSION 61 #define LIBBB_VERSION 63
#define SZ_BUBULLE_TEXT 81 /* arbitrary value */ #define SZ_BUBULLE_TEXT 81 /* arbitrary value */

28
edges.c
View File

@ -1,5 +1,6 @@
/* /*
* edges.c * edges.c
* a part of libbubulle from tTh
*/ */
#include <stdio.h> #include <stdio.h>
@ -15,7 +16,9 @@ EdgeList * alloc_edgelist(char *name, int sz, int flags)
EdgeList *elptr; EdgeList *elptr;
AnEdge *array; AnEdge *array;
#if DEBUG_LEVEL
fprintf(stderr, ">>> %s ( '%s' %d 0x%X )\n", __func__, name, sz, flags); fprintf(stderr, ">>> %s ( '%s' %d 0x%X )\n", __func__, name, sz, flags);
#endif
if (NULL==(elptr = calloc(1, sizeof(EdgeList)))) { if (NULL==(elptr = calloc(1, sizeof(EdgeList)))) {
fprintf(stderr, "no mem available in %s\n", __func__); fprintf(stderr, "no mem available in %s\n", __func__);
@ -44,8 +47,9 @@ return elptr;
/* --------------------------------------------------------------------- */ /* --------------------------------------------------------------------- */
int free_edgelist(EdgeList *list, int k) int free_edgelist(EdgeList *list, int k)
{ {
#if DEBUG_LEVEL
fprintf(stderr, ">>> %s ( %p 0x%X )\n", __func__, list, k); fprintf(stderr, ">>> %s ( %p 0x%X )\n", __func__, list, k);
#endif
if (k) { if (k) {
fprintf(stderr, "%s: k must be 0, was %d\n", __func__, k); fprintf(stderr, "%s: k must be 0, was %d\n", __func__, k);
@ -131,31 +135,39 @@ return 0; /* NOT FOUND */
int print_edgelist_desc(EdgeList *list, int k) int print_edgelist_desc(EdgeList *list, int k)
{ {
fprintf(stderr, "--- edgelist '%s' at %p\n", list->name, list); fprintf(stderr, "------- edgelist '%s' at %p\n", list->name, list);
if (k) { if (k) {
fprintf(stderr, "%s: k must be 0, was %d\n", __func__, k); fprintf(stderr, "%s: k must be 0, was %d\n", __func__, k);
return k; return k;
} }
fprintf(stderr, " array @ %p\n", list->edges); fprintf(stderr, "\tarray @ %p\n", list->edges);
fprintf(stderr, " size %8d\n", list->size); fprintf(stderr, "\tsize %8d\n", list->size);
fprintf(stderr, " next free %8d\n", list->fidx); fprintf(stderr, "\tnext free %8d\n", list->fidx);
// fprintf(stderr, " magic 0x%08X\n", list->magic); fprintf(stderr, "\tmagic 0x%08lX\n", list->magic);
return 0; return 0;
} }
/* --------------------------------------------------------------------- */ /* --------------------------------------------------------------------- */
int print_the_edges(EdgeList *list, int k) int print_the_edges(FILE *fp, EdgeList *list, int k)
{ {
int foo; int foo;
#if DEBUG_LEVEL
fprintf(stderr, ">>> %s ( %p %d )\n", __func__, list, k);
#endif
if (k) { if (k) {
fprintf(stderr, "In %s, k must be 0, was %d\n", __func__, k); fprintf(stderr, "In %s, k must be 0, was %d\n", __func__, k);
return k; return k;
} }
fprintf(stderr, " list.fidx = %d\n", list->fidx);
for (foo=0; foo<list->fidx; foo++) { for (foo=0; foo<list->fidx; foo++) {
printf("%d\t\t%5d %5d\n", foo, list->edges[foo].A, list->edges[foo].B); fprintf(fp, "%6d\t\t%5d %5d\n", foo,
list->edges[foo].A, list->edges[foo].B);
} }
return -1; return -1;

18
edges.h
View File

@ -1,11 +1,13 @@
/* /*
* edges.h * edges.h
* a part of libbubulle from tTh
*/ */
/* --------------------------------------------------------------------- */ /* --------------------------------------------------------------------- */
typedef struct { typedef struct {
int A, B; int A, B;
short burz;
} AnEdge; } AnEdge;
typedef struct { typedef struct {
@ -19,14 +21,14 @@ typedef struct {
/* --------------------------------------------------------------------- */ /* --------------------------------------------------------------------- */
EdgeList * alloc_edgelist(char *name, int sz, int flags); EdgeList * alloc_edgelist(char *name, int sz, int flags);
int free_edgelist(EdgeList *list, int k); int free_edgelist(EdgeList *list, int k);
int push_an_edge(EdgeList *list, int p0, int p1); int push_an_edge(EdgeList *list, int p0, int p1);
int push_a_missing_edge(EdgeList *list, int p0, int p1); int push_a_missing_edge(EdgeList *list, int p0, int p1);
int is_edge_in_list(EdgeList *list, int p0, int p1); int is_edge_in_list(EdgeList *list, int p0, int p1);
int print_edgelist_desc(EdgeList *list, int k); int print_edgelist_desc(EdgeList *list, int k);
int print_the_edges(EdgeList *list, int k); int print_the_edges(FILE *file, EdgeList *list, int k);
/* --------------------------------------------------------------------- */ /* --------------------------------------------------------------------- */

21
tbb.c
View File

@ -6,7 +6,7 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <unistd.h>
#include "bubulles.h" #include "bubulles.h"
#include "edges.h" #include "edges.h"
@ -27,19 +27,20 @@ print_edgelist_desc(list, 0);
foo = push_an_edge(list, 13, 37); foo = push_an_edge(list, 13, 37);
fprintf(stderr, " push edge -> %d\n", foo); fprintf(stderr, " push edge -> %d\n", foo);
foo = push_an_edge(list, 24, 36); foo = push_an_edge(list, 24, 36);
fprintf(stderr, " push edge -> %d\n", foo);
foo = print_the_edges(list, 0); foo = print_the_edges(stdout, list, 0);
for (idx=0; idx<k; idx++) { for (idx=0; idx<k; idx++) {
e0 = idx*7; e1 = 5-idx; e0 = idx*7; e1 = 5-idx;
foo = push_an_edge(list, e0, e1); foo = push_an_edge(list, e0, e1);
if (foo) { if (foo) {
fprintf(stderr, "push (%d, %d) -> %d\n", e0, e1, foo); fprintf(stderr, "push %d (%d, %d) -> %d\n", idx, e0, e1, foo);
break; break;
} }
} }
foo = print_the_edges(list, 0); foo = print_the_edges(stdout, list, 0); puts("");
foo = free_edgelist(list, 0); foo = free_edgelist(list, 0);
fprintf(stderr, " free list -> %d\n", foo); fprintf(stderr, " free list -> %d\n", foo);
@ -59,7 +60,7 @@ int e0, e1;
fprintf(stderr, "============== %s %7d ===========\n", __func__, k); fprintf(stderr, "============== %s %7d ===========\n", __func__, k);
list = alloc_edgelist("BIG!", k, 0); list = alloc_edgelist("gloubigoulba", k, 0);
if (NULL == list) { if (NULL == list) {
fprintf(stderr, "%s: epic fail\n", __func__); fprintf(stderr, "%s: epic fail\n", __func__);
abort(); abort();
@ -75,7 +76,7 @@ for (idx=0; idx<k; idx++) {
print_edgelist_desc(list, 0); print_edgelist_desc(list, 0);
foo = print_the_edges(list, 0); foo = print_the_edges(stdout, list, 0); puts("");
foo = free_edgelist(list, 0); foo = free_edgelist(list, 0);
fprintf(stderr, " %s: free list -> %d\n", __func__, foo); fprintf(stderr, " %s: free list -> %d\n", __func__, foo);
@ -189,6 +190,8 @@ fprintf(stderr, "*** Bubulles Testing %s %s\n\n", __DATE__, __TIME__);
bubulles_version(0); bubulles_version(0);
srand(getpid()); /* INIT RANDOM */
#if (0) #if (0)
test_alloc_free(5); test_alloc_free(5);
test_push_pop(20000); test_push_pop(20000);
@ -197,9 +200,9 @@ foo = test_peek_poke(5000);
fprintf(stderr, "test peek/poke -> %d\n", foo); fprintf(stderr, "test peek/poke -> %d\n", foo);
#endif #endif
foo = essai_des_edges_A(25); // XXX foo = essai_des_edges_A(25);
fprintf(stderr, "test A des edges -> %d\n", foo); // XXX fprintf(stderr, "test A des edges -> %d\n", foo);
foo = essai_des_edges_B(10000); foo = essai_des_edges_B(5000);
fprintf(stderr, "test B des edges -> %d\n", foo); fprintf(stderr, "test B des edges -> %d\n", foo);
return 0; return 0;

4
tools/.gitignore vendored Normal file
View File

@ -0,0 +1,4 @@
*.vertices
*.edges

View File

@ -1,7 +1,7 @@
BBFUNCS = ../libbubulles.a BBFUNCS = ../libbubulles.a
OPT = -Wall -g -DDEBUG_LEVEL=1 -DMUST_ABORT OPT = -Wall -g -pg -DDEBUG_LEVEL=0 -DMUST_ABORT=0
read_obj: read_obj.c Makefile importobj.o $(BBFUNCS) read_obj: read_obj.c Makefile importobj.o $(BBFUNCS)
gcc $(OPT) $< importobj.o $(BBFUNCS) -o $@ gcc $(OPT) $< importobj.o $(BBFUNCS) -o $@

View File

@ -1,6 +1,7 @@
# Importer des fichiers .OBJ # Importer des fichiers .OBJ
``` ```
v -1.177934647 -6.833468914 -73.19773865 v -1.177934647 -6.833468914 -73.19773865
vn -0.1279897094 -0.4501263499 -0.8837448359 vn -0.1279897094 -0.4501263499 -0.8837448359
@ -11,10 +12,10 @@ vn -0.05844723806 -0.09480132163 -0.993778944
Première étape : en lisant les vertices, nous saurons positionner Première étape : en lisant les vertices, nous saurons positionner
nos bubulles. nos bubulles.
Seconde étape : bien comprendre à quoi correspondent les Attention, mon parser EXIGE des fichiers Unix bien conformés :
lignes `vn` ? Des normales ? c'est-à-dire que la dernière ligne du .obj DOIT être terminée
par un newline !
Et troisème étape, que faire des vertices ?
Quatrième étape : aller vivre à la campagne ? Quatrième étape : aller vivre à la campagne ?

View File

@ -15,7 +15,11 @@ extern int verbosity;
/* --------------------------------------------------------------------- */ /* --------------------------------------------------------------------- */
#define LINE_SZ 666 #define LINE_SZ 666
static BBList *bublist;
static EdgeList *edges;
/* --------------------------------------------------------------------- */ /* --------------------------------------------------------------------- */
typedef struct { typedef struct {
@ -23,13 +27,14 @@ typedef struct {
int id; int id;
} Tokens; } Tokens;
enum token_id { T_comment=1, T_vertice, T_group, T_face }; enum token_id { T_comment=1, T_vertice, T_group, T_face, T_vt };
Tokens TokenList[] = { Tokens TokenList[] = {
{ "#", T_comment }, { "#", T_comment },
{ "v", T_vertice }, { "v", T_vertice },
{ "g", T_group }, // to be verified { "g", T_group }, // to be verified !
{ "f", T_face }, { "f", T_face },
{ "vt", T_vt }, // c'est quoi ce truc ?
{ NULL, 0 } { NULL, 0 }
}; };
@ -37,8 +42,8 @@ static int type_of_the_line(char *text)
{ {
Tokens *token; Tokens *token;
#if DEBUG_LEVEL #if DEBUG_LEVEL > 1
fprintf(stderr, "%s is searching '%s'\n", __func__, text); fprintf(stderr, "%s is searching for '%s'\n", __func__, text);
#endif #endif
for (token=TokenList; token->token; token++) { for (token=TokenList; token->token; token++) {
@ -51,7 +56,7 @@ for (token=TokenList; token->token; token++) {
return -1; return -1;
} }
/* --------------------------------------------------------------------- */ /* --------------------------------------------------------------------- */
static int parse_vertice(char *cptr, float *px, float *py, float *pz) int parse_vertice(char *cptr, float *px, float *py, float *pz)
{ {
float x, y, z; float x, y, z;
int foo; int foo;
@ -71,17 +76,66 @@ if (3 == foo) {
return foo; return foo;
} }
/* --------------------------------------------------------------------- */ /* --------------------------------------------------------------------- */
int try_to_read_an_OBJ_file(char *infname, char *outfname, int notused) /* new Mon 27 Mar 2023 12:08:18 AM CEST */
int parse_face(char *cptr, int phy)
{
int ix, foo;
int fa, fb;
#if DEBUG_LEVEL
fprintf(stderr, ">>> %s ( '%s' %d )\n", __func__, cptr, phy);
#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)) {
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;
}
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;
}
}
#if DEBUG_LEVEL
fprintf(stderr, "<<< %s\n", __func__);
#endif
return 0;
}
/* --------------------------------------------------------------------- */
int try_to_read_an_OBJ_file(char *infname, char *file_vert, char *file_edges,
int notused)
{ {
FILE *fpin; FILE *fpin;
char line[LINE_SZ+1], *cptr; char line[LINE_SZ+1], *cptr;
float x, y, z; float x, y, z;
int foo, nbre, tokenid, fa, fb, ix; int foo, nbre, tokenid;
BBList *bublist;
Bubulle bubulle; Bubulle bubulle;
#if DEBUG_LEVEL #if DEBUG_LEVEL
fprintf(stderr, ">>> %s ( '%s' %d )\n", __func__, infname, notused); fprintf(stderr, ">>> %s ( '%s' %d )\n\n", __func__, infname, notused);
#endif #endif
if (NULL==(fpin=fopen(infname, "r"))) { if (NULL==(fpin=fopen(infname, "r"))) {
@ -89,13 +143,22 @@ if (NULL==(fpin=fopen(infname, "r"))) {
exit(1); exit(1);
} }
bublist = alloc_bubulles(infname, 800000, 0); bublist = alloc_bubulles(infname, 500000, 0);
if (NULL==bublist) { if (NULL==bublist) {
fprintf(stderr, "err in %s, aborting...\n", __func__); fprintf(stderr, "in %s, no mem for bubls, aborting...\n", __func__);
abort(); abort();
} }
print_bublist_desc(bublist, 0); print_bublist_desc(bublist, 0);
edges = alloc_edgelist("krkrkr", 200000, 0);
if (NULL==edges) {
fprintf(stderr, "no mem for edges in %s, aborting...\n", __func__);
abort();
}
print_edgelist_desc(edges, 0);
fprintf(stderr, "\n***********************************\n");
nbre = 0; nbre = 0;
while(NULL!=(cptr=fgets(line, LINE_SZ, fpin))) { while(NULL!=(cptr=fgets(line, LINE_SZ, fpin))) {
@ -106,7 +169,7 @@ while(NULL!=(cptr=fgets(line, LINE_SZ, fpin))) {
break; break;
} }
line[strlen(line)-1] = '\0'; /* kill the newline */ line[strlen(line)-1] = '\0'; /* kill the newline */
if (verbosity>1) fprintf(stderr, "line read ===%s===\n", line); if (verbosity>1) fprintf(stderr, "line read ==|%s|==\n", line);
cptr = strtok(line, " "); cptr = strtok(line, " ");
if (NULL == cptr) { if (NULL == cptr) {
@ -127,49 +190,52 @@ while(NULL!=(cptr=fgets(line, LINE_SZ, fpin))) {
case T_vertice: case T_vertice:
x = y = z = 0.0; x = y = z = 0.0;
foo = parse_vertice(cptr, &x, &y, &z); foo = parse_vertice(cptr, &x, &y, &z);
if (3!=foo) {
abort();
}
bubulle.p.x = x; bubulle.p.x = x;
bubulle.p.y = y; bubulle.p.y = y;
bubulle.p.z = z; bubulle.p.z = z;
if (verbosity > 1) niceprint_bubulle(&bubulle, 0); if (verbosity > 1) niceprint_bubulle(&bubulle, 0);
foo = push_bubulle(bublist, &bubulle);
if (foo) {
abort();
}
break; break;
case T_group: case T_group:
cptr = strtok(NULL, " "); cptr = strtok(NULL, " ");
fprintf(stderr, "Group: %s\n", cptr); fprintf(stderr, "\tGroup: %s\n", cptr);
break; break;
case T_face: case T_face:
fprintf(stderr, "Face A: %s\n", cptr); foo = parse_face(cptr, 0);
for (ix=0; ix<3; ix++) { if (foo) fprintf(stderr, " '%s' parse face -> %d\n",
cptr = strtok(NULL, " "); cptr, foo);
fprintf(stderr, "Piste %d: %s\n", ix, cptr);
if (2==sscanf(cptr, "%d/%d", &fa, &fb))
fprintf(stderr, " %d %d %d\n", foo, fa, fb);
else
return -3;
}
break; break;
default: default:
// fprintf(stderr, "token %d ?\n", tokenid); // fprintf(stderr, "\ttoken %d ?\n", tokenid);
continue; /* wtf ? */ continue; /* wtf ? */
} }
foo = push_bubulle(bublist, &bubulle);
if (foo) {
fprintf(stderr, "*** %s: error %d on push\n", __func__, foo);
exit(1);
break;
}
nbre++; nbre++;
} }
fclose(fpin); fclose(fpin);
fprintf(stderr, "\n***********************************\n");
if(verbosity) { if(verbosity) {
fprintf(stderr, "%s : %d vertices loaded\n", __func__, nbre); fprintf(stderr, "in %s, %d vertices loaded\n", __func__, bublist->fidx);
} }
bubulles_to_data(outfname, NULL, bublist, 0); print_bublist_desc(bublist, 0);
bubulles_to_data(file_vert, NULL, bublist, 0);
free_bubulles(bublist, 0);
print_edgelist_desc(edges, 0);
print_the_edges(stdout, edges, 0);
free_edgelist(edges, 0);
return 0; return 0;
} }

7
tools/minimal.obj Normal file
View File

@ -0,0 +1,7 @@
g 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

View File

@ -4,23 +4,33 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <libgen.h> // for basename(3)
#include "../bubulles.h" #include "../bubulles.h"
int try_to_read_an_OBJ_file(char *fname, char *outfname, int notused); int try_to_read_an_OBJ_file(char *fname,
int verbosity; char *outfname, char *file_edges,
int notused);
int verbosity = 0;
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
int foo; int foo;
char *fname; /* see manpage basename(3) */
if (2 != argc) { if (2 != argc) {
bubulles_version(1); bubulles_version(1);
exit(0); exit(0);
} }
verbosity = 1; verbosity = 0;
foo = try_to_read_an_OBJ_file(argv[1], "bubulles.asc", 0); fname = basename(argv[1]);
fprintf (stderr, "input fname 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); fprintf(stderr, "try to read '%s' -> %d\n", argv [1], foo);
return 0; return 0;