[brlcad-commits] CVS: brlcad/src/librt g_extrude.c,14.11,14.12
Open Source Solid Modeling CAD
Brought to you by:
brlcad
From: Sean M. <br...@us...> - 2006-07-05 21:24:33
|
Update of /cvsroot/brlcad/brlcad/src/librt In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv10312 Modified Files: g_extrude.c Log Message: prevent crashing when trying to draw extrude primitives that use empty sketch primitives. simple statements like 'make x extrude' could cause this as well as using any (default) empty sketch. the wireframe drawing routing was getting stuck in an infinite loop allocating memory adding empty vlist items to the mged display list due to the comparison against a negative decrementing index. the code now checks for the empty sketch condition and informs the user. clean up the code a bit in the process, e.g. do something about a couple always-true if statements.. thanks ValarQ for finding this bug. Index: g_extrude.c =================================================================== RCS file: /cvsroot/brlcad/brlcad/src/librt/g_extrude.c,v retrieving revision 14.11 retrieving revision 14.12 diff -w -u -r14.11 -r14.12 --- g_extrude.c 24 Mar 2006 23:21:34 -0000 14.11 +++ g_extrude.c 5 Jul 2006 21:24:29 -0000 14.12 @@ -1240,8 +1240,7 @@ if( !extrude_ip->skt ) { - bu_log( "rt_extrude_plot: ERROR: no sketch for extrusion!!!!\n" ); - + bu_log( "ERROR: no sketch to extrude!\n" ); RT_ADD_VLIST( vhead, extrude_ip->V, BN_VLIST_LINE_MOVE ); RT_ADD_VLIST( vhead, extrude_ip->V, BN_VLIST_LINE_DRAW ); return( 0 ); @@ -1252,12 +1251,25 @@ crv = &sketch_ip->skt_curve; + /* empty sketch, nothing to do */ + if (crv->seg_count == 0) + { + if (extrude_ip->sketch_name) { + bu_log("Sketch [%s] is empty, nothing to draw\n", extrude_ip->sketch_name); + } else { + bu_log("Unnamed sketch is empty, nothing to draw\n"); + } + RT_ADD_VLIST( vhead, extrude_ip->V, BN_VLIST_LINE_MOVE ); + RT_ADD_VLIST( vhead, extrude_ip->V, BN_VLIST_LINE_DRAW ); + return( 0 ); + } + /* plot bottom curve */ vp1 = BU_LIST_LAST( bn_vlist, vhead ); nused1 = vp1->nused; if( curve_to_vlist( vhead, ttol, extrude_ip->V, extrude_ip->u_vec, extrude_ip->v_vec, sketch_ip, crv ) ) { - bu_log( "Error: sketch (%s) references non-existent vertices!!!\n", + bu_log( "ERROR: sketch (%s) references non-existent vertices!\n", extrude_ip->sketch_name ); return( -1 ); } @@ -1270,20 +1282,13 @@ /* plot connecting lines */ vp2_start = vp2; - i1 = nused1; - if( i1 >= vp1->nused ) - { i1 = 0; vp1 = BU_LIST_NEXT( bn_vlist, &vp1->l ); - } - i2 = nused2; - if( i2 >= vp2->nused ) - { i2 = 0; vp2 = BU_LIST_NEXT( bn_vlist, &vp2->l ); nused2--; - } - while( vp1 != vp2_start || i1 != nused2 ) + + while( vp1 != vp2_start || (nused2 >= 0 && i1 != nused2) ) { RT_ADD_VLIST( vhead, vp1->pt[i1], BN_VLIST_LINE_MOVE ); RT_ADD_VLIST( vhead, vp2->pt[i2], BN_VLIST_LINE_DRAW ); |